diff --git a/build-tools/ant-gwt/build.xml b/build-tools/ant-gwt/build.xml
deleted file mode 100644
index bec9154..0000000
--- a/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/build-tools/build.xml b/build-tools/build.xml
deleted file mode 100644
index beef5b9..0000000
--- a/build-tools/build.xml
+++ /dev/null
@@ -1,36 +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="doctool" description="Build the doctool">
-    <gwt.ant dir="doctool" />
-  </target>
-
-  <target name="-do" depends="ant-gwt, 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/build-tools/doctool/build.xml b/build-tools/doctool/build.xml
deleted file mode 100644
index bc9cbbd..0000000
--- a/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/build.xml b/build.xml
index 37d6f9c..57903e6 100755
--- a/build.xml
+++ b/build.xml
@@ -107,7 +107,7 @@
   </target>
 
   <target name="buildtools" description="[subdir] Build (or runs ${target} if set) the build tools">
-    <gwt.ant dir="build-tools" />
+    <gwt.ant dir="build_tools" />
   </target>
 
   <target name="build" description="[action] Builds GWT, including samples, but without distro packaging">
@@ -128,6 +128,8 @@
     <call-subproject subproject="user" subtarget="checkstyle" />
     <call-subproject subproject="requestfactory" subtarget="checkstyle" />
     <call-subproject subproject="servlet" subtarget="checkstyle" />
+    <!-- servlet needed for tools/benchmark-viewer -->
+    <call-subproject subproject="servlet" subtarget="build" /> 
     <call-subproject subproject="tools" subtarget="checkstyle" />
     <call-subproject subproject="samples" subtarget="checkstyle" />
   </target>
@@ -158,7 +160,7 @@
   <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}/build_tools/**/src/com/google" />
     <pathelement location="${gwt.root}/tools/**/src/com/google" />
   </path>
 
diff --git a/build_tools/ant_gwt/build.xml b/build_tools/ant_gwt/build.xml
new file mode 100644
index 0000000..cf6d29a
--- /dev/null
+++ b/build_tools/ant_gwt/build.xml
@@ -0,0 +1,55 @@
+<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}" includeantruntime="true">
+      <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/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java b/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
similarity index 100%
rename from build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
rename to build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/CommandRunner.java
diff --git a/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java b/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
similarity index 100%
rename from build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
rename to build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java
diff --git a/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java b/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
similarity index 100%
rename from build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
rename to build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/SvnInfo.java
diff --git a/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/TarCat.java b/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
similarity index 100%
rename from build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
rename to build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/TarCat.java
diff --git a/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/Timer.java b/build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/Timer.java
similarity index 100%
rename from build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/Timer.java
rename to build_tools/ant_gwt/src/com/google/gwt/ant/taskdefs/Timer.java
diff --git a/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java b/build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
similarity index 100%
rename from build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
rename to build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/CommandRunnerTest.java
diff --git a/build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java b/build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
similarity index 100%
rename from build-tools/ant-gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
rename to build_tools/ant_gwt/test/com/google/gwt/ant/taskdefs/SvnInfoTest.java
diff --git a/build_tools/build.xml b/build_tools/build.xml
new file mode 100644
index 0000000..a1f6576
--- /dev/null
+++ b/build_tools/build.xml
@@ -0,0 +1,36 @@
+<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="doctool" description="Build the doctool">
+    <gwt.ant dir="doctool" />
+  </target>
+
+  <target name="-do" depends="ant_gwt, 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/build_tools/doctool/build.xml b/build_tools/doctool/build.xml
new file mode 100644
index 0000000..c8d5d79
--- /dev/null
+++ b/build_tools/doctool/build.xml
@@ -0,0 +1,36 @@
+<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/build-tools/doctool/src/booklet.xsd b/build_tools/doctool/src/booklet.xsd
similarity index 100%
rename from build-tools/doctool/src/booklet.xsd
rename to build_tools/doctool/src/booklet.xsd
diff --git a/build-tools/doctool/src/com/google/doctool/Booklet.java b/build_tools/doctool/src/com/google/doctool/Booklet.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/Booklet.java
rename to build_tools/doctool/src/com/google/doctool/Booklet.java
diff --git a/build-tools/doctool/src/com/google/doctool/DocTool.java b/build_tools/doctool/src/com/google/doctool/DocTool.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/DocTool.java
rename to build_tools/doctool/src/com/google/doctool/DocTool.java
diff --git a/build-tools/doctool/src/com/google/doctool/DocToolFactory.java b/build_tools/doctool/src/com/google/doctool/DocToolFactory.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/DocToolFactory.java
rename to build_tools/doctool/src/com/google/doctool/DocToolFactory.java
diff --git a/build-tools/doctool/src/com/google/doctool/JreDocTool.java b/build_tools/doctool/src/com/google/doctool/JreDocTool.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/JreDocTool.java
rename to build_tools/doctool/src/com/google/doctool/JreDocTool.java
diff --git a/build-tools/doctool/src/com/google/doctool/JreDocToolFactory.java b/build_tools/doctool/src/com/google/doctool/JreDocToolFactory.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/JreDocToolFactory.java
rename to build_tools/doctool/src/com/google/doctool/JreDocToolFactory.java
diff --git a/build-tools/doctool/src/com/google/doctool/LinkResolver.java b/build_tools/doctool/src/com/google/doctool/LinkResolver.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/LinkResolver.java
rename to build_tools/doctool/src/com/google/doctool/LinkResolver.java
diff --git a/build-tools/doctool/src/com/google/doctool/ResourceIncluder.java b/build_tools/doctool/src/com/google/doctool/ResourceIncluder.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/ResourceIncluder.java
rename to build_tools/doctool/src/com/google/doctool/ResourceIncluder.java
diff --git a/build-tools/doctool/src/com/google/doctool/SplitterJoiner.java b/build_tools/doctool/src/com/google/doctool/SplitterJoiner.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/SplitterJoiner.java
rename to build_tools/doctool/src/com/google/doctool/SplitterJoiner.java
diff --git a/build-tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java b/build_tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
rename to build_tools/doctool/src/com/google/doctool/custom/ExampleTaglet.java
diff --git a/build-tools/doctool/src/com/google/doctool/custom/EztDoclet.java b/build_tools/doctool/src/com/google/doctool/custom/EztDoclet.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/custom/EztDoclet.java
rename to build_tools/doctool/src/com/google/doctool/custom/EztDoclet.java
diff --git a/build-tools/doctool/src/com/google/doctool/custom/FindPackages.java b/build_tools/doctool/src/com/google/doctool/custom/FindPackages.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/custom/FindPackages.java
rename to build_tools/doctool/src/com/google/doctool/custom/FindPackages.java
diff --git a/build-tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java b/build_tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
rename to build_tools/doctool/src/com/google/doctool/custom/GWTJavaDoclet.java
diff --git a/build-tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java b/build_tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
rename to build_tools/doctool/src/com/google/doctool/custom/IncludeTaglet.java
diff --git a/build-tools/doctool/src/com/google/doctool/custom/TipTaglet.java b/build_tools/doctool/src/com/google/doctool/custom/TipTaglet.java
similarity index 100%
rename from build-tools/doctool/src/com/google/doctool/custom/TipTaglet.java
rename to build_tools/doctool/src/com/google/doctool/custom/TipTaglet.java
diff --git a/build-tools/doctool/src/doc-topics.xslt b/build_tools/doctool/src/doc-topics.xslt
similarity index 100%
rename from build-tools/doctool/src/doc-topics.xslt
rename to build_tools/doctool/src/doc-topics.xslt
diff --git a/build-tools/doctool/src/doc.css b/build_tools/doctool/src/doc.css
similarity index 100%
rename from build-tools/doctool/src/doc.css
rename to build_tools/doctool/src/doc.css
diff --git a/build-tools/doctool/src/java-topics.xslt b/build_tools/doctool/src/java-topics.xslt
similarity index 100%
rename from build-tools/doctool/src/java-topics.xslt
rename to build_tools/doctool/src/java-topics.xslt
diff --git a/build-tools/doctool/src/javascript-topics.xslt b/build_tools/doctool/src/javascript-topics.xslt
similarity index 100%
rename from build-tools/doctool/src/javascript-topics.xslt
rename to build_tools/doctool/src/javascript-topics.xslt
diff --git a/build-tools/doctool/src/topics-hhc.xslt b/build_tools/doctool/src/topics-hhc.xslt
similarity index 100%
rename from build-tools/doctool/src/topics-hhc.xslt
rename to build_tools/doctool/src/topics-hhc.xslt
diff --git a/build-tools/doctool/src/topics-hhk.xslt b/build_tools/doctool/src/topics-hhk.xslt
similarity index 100%
rename from build-tools/doctool/src/topics-hhk.xslt
rename to build_tools/doctool/src/topics-hhk.xslt
diff --git a/build-tools/doctool/src/topics-hhp.xslt b/build_tools/doctool/src/topics-hhp.xslt
similarity index 100%
rename from build-tools/doctool/src/topics-hhp.xslt
rename to build_tools/doctool/src/topics-hhp.xslt
diff --git a/build-tools/doctool/src/topics-htmls.xslt b/build_tools/doctool/src/topics-htmls.xslt
similarity index 100%
rename from build-tools/doctool/src/topics-htmls.xslt
rename to build_tools/doctool/src/topics-htmls.xslt
diff --git a/build-tools/doctool/src/topics-index.xslt b/build_tools/doctool/src/topics-index.xslt
similarity index 100%
rename from build-tools/doctool/src/topics-index.xslt
rename to build_tools/doctool/src/topics-index.xslt
diff --git a/build-tools/doctool/src/topics-toc.xslt b/build_tools/doctool/src/topics-toc.xslt
similarity index 100%
rename from build-tools/doctool/src/topics-toc.xslt
rename to build_tools/doctool/src/topics-toc.xslt
diff --git a/build-tools/doctool/src/topics.xsd b/build_tools/doctool/src/topics.xsd
similarity index 100%
rename from build-tools/doctool/src/topics.xsd
rename to build_tools/doctool/src/topics.xsd
diff --git a/build-tools/drtool/BuildGlobalTOC.py b/build_tools/drtool/BuildGlobalTOC.py
old mode 100644
new mode 100755
similarity index 100%
rename from build-tools/drtool/BuildGlobalTOC.py
rename to build_tools/drtool/BuildGlobalTOC.py
diff --git a/build-tools/drtool/TOCNode.py b/build_tools/drtool/TOCNode.py
old mode 100644
new mode 100755
similarity index 100%
rename from build-tools/drtool/TOCNode.py
rename to build_tools/drtool/TOCNode.py
diff --git a/build-tools/drtool/drtool.py b/build_tools/drtool/drtool.py
similarity index 100%
rename from build-tools/drtool/drtool.py
rename to build_tools/drtool/drtool.py
diff --git a/dev/build.xml b/dev/build.xml
index 0ea5528..6b10f1c 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -34,7 +34,6 @@
       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" />
@@ -61,35 +60,15 @@
           <include name="guava/guava-10.0.1/guava-10.0.1-rebased.jar" />
           <include name="jscomp/r1649/compiler-rebased.jar" />
           <include name="jetty/jetty-6.1.11.jar" />
-          <include name="icu4j/4.4.2/icu4j.jar" />
+          <include name="icu4j/50.1.1/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" />
+          <!-- dependencies needed for JSP support in DevMode: BEGIN -->
           <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" />
+          <!-- dependencies needed for JSP support in DevMode: END -->
+          <include name="apache/commons/commons-collections-3.2.1.jar" />
           <!-- htmlunit dependencies not already included: BEGIN -->
           <include name="apache/http/httpclient-4.1.2.jar" />
           <include name="apache/http/httpcore-4.1.2.jar" />
@@ -98,6 +77,7 @@
           <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.6.jar" />
+          <include name="apache/commons/commons-logging-1.1.1.jar" />
           <include name="cssparser/cssparser-0.9.5.jar" />
           <include name="htmlunit/htmlunit-2.9/htmlunit-v2.9.jar" />
           <include name="htmlunit/htmlunit-2.9/htmlunit-core-js-v2.9.jar" />
@@ -129,35 +109,15 @@
           <zipfileset src="${gwt.tools.lib}/guava/guava-10.0.1/guava-10.0.1-rebased.jar" />
           <zipfileset src="${gwt.tools.lib}/jscomp/r1649/compiler-rebased.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}/icu4j/50.1.1/icu4j.jar" />
           <zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.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" />
+          <!-- dependencies needed for JSP support in DevMode: BEGIN -->
           <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" />
+          <!-- dependencies needed for JSP support in DevMode: END -->
+          <zipfileset src="${gwt.tools.lib}/apache/commons/commons-collections-3.2.1.jar" />
           <!-- htmlunit dependencies not already included: BEGIN -->
           <zipfileset src="${gwt.tools.lib}/apache/http/httpclient-4.1.2.jar" />
           <zipfileset src="${gwt.tools.lib}/apache/http/httpcore-4.1.2.jar" />
@@ -166,6 +126,7 @@
           <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.6.jar" />
+          <zipfileset src="${gwt.tools.lib}/apache/commons/commons-logging-1.1.1.jar" />
           <zipfileset src="${gwt.tools.lib}/cssparser/cssparser-0.9.5.jar" />
           <zipfileset src="${gwt.tools.lib}/htmlunit/htmlunit-2.9/htmlunit-2.9.jar" />
           <zipfileset src="${gwt.tools.lib}/htmlunit/htmlunit-2.9/htmlunit-core-js-2.9.jar" />
@@ -220,7 +181,7 @@
       <classpath>
           <pathelement location="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
           <pathelement location="${gwt.tools.lib}/eclipse/jdt-3.4.2_r894.jar" />
-          <pathelement location="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
+          <pathelement location="${gwt.tools.lib}/apache/commons/commons-collections-3.2.1.jar" />
           <pathelement location="${gwt.tools.lib}/guava/guava-10.0.1/guava-10.0.1-rebased.jar" />
           <pathelement location="${gwt.tools.lib}/jscomp/r1649/compiler-rebased.jar" />
       </classpath>
diff --git a/dev/codeserver/build.xml b/dev/codeserver/build.xml
index f2c1e8d..52af07f 100755
--- a/dev/codeserver/build.xml
+++ b/dev/codeserver/build.xml
@@ -22,8 +22,8 @@
         <include name="**/*.java"/>
       </fileset>
     </copy>
-    <replace dir="${src}" token="com.google.gwt.thirdparty.org.mortbay.jetty"
-             value="org.mortbay.jetty"/>
+    <replace dir="${src}" token="com.google.gwt.thirdparty.org.mortbay."
+             value="org.mortbay."/>
   </target>
 
   <target name="compile" depends="preprocess">
@@ -41,6 +41,7 @@
       <fileset dir="${javac.out}"/>
       <fileset dir="java">
         <include name="**/*.html"/>
+        <include name="**/*.ico"/>
         <include name="**/*.js"/>
       </fileset>
 
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
index 6419d86..1d826e6 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
@@ -23,7 +23,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.net.InetAddress;
 
 /**
  * <p>This class contains the {@link #main main method} that starts the code server for
@@ -84,8 +83,8 @@
       AppSpace appSpace = AppSpace.create(new File(workDir, moduleName));
 
       Recompiler recompiler = new Recompiler(appSpace, moduleName,
-        options.getSourcePath(), logger);
-      modules.addModuleState(new ModuleState(recompiler, logger));
+          options.getSourcePath(), options.getPreferredHost() + ":" + options.getPort(), logger);
+      modules.addModuleState(new ModuleState(recompiler, logger, options.getNoPrecompile()));
     }
 
     SourceHandler sourceHandler = new SourceHandler(modules, logger);
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
index 2d46607..32a907e 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
@@ -42,16 +42,22 @@
   private final Recompiler recompiler;
   private final TreeLogger logger;
 
-  ModuleState(Recompiler recompiler, TreeLogger logger)
+  ModuleState(Recompiler recompiler, TreeLogger logger, boolean noPrecompile)
       throws UnableToCompleteException {
     this.recompiler = recompiler;
     this.logger = logger;
 
-    Map<String, String> defaultProps = new HashMap<String, String>();
-    defaultProps.put("user.agent", "safari");
-    defaultProps.put("locale", "en");
-    defaultProps.put("compiler.useSourceMaps", "true");
-    current.set(recompiler.compile(defaultProps));
+    CompileDir compileDir;
+    if (noPrecompile) {
+      compileDir = recompiler.noCompile();
+    } else {
+      Map<String, String> defaultProps = new HashMap<String, String>();
+      defaultProps.put("user.agent", "safari");
+      defaultProps.put("locale", "en");
+      defaultProps.put("compiler.useSourceMaps", "true");
+      compileDir = recompiler.compile(defaultProps);
+    }
+    current.set(compileDir);
   }
 
   /**
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
index 2924e44..758f645 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
@@ -20,6 +20,7 @@
 import com.google.gwt.util.tools.ArgHandler;
 import com.google.gwt.util.tools.ArgHandlerDir;
 import com.google.gwt.util.tools.ArgHandlerExtra;
+import com.google.gwt.util.tools.ArgHandlerFlag;
 import com.google.gwt.util.tools.ArgHandlerInt;
 import com.google.gwt.util.tools.ArgHandlerString;
 
@@ -35,6 +36,7 @@
  * <p>These flags are EXPERIMENTAL and subject to change.</p>
  */
 public class Options {
+  private boolean noPrecompile = false;
   private File workDir;
   private List<String> moduleNames = new ArrayList<String>();
   private final List<File> sourcePath = new ArrayList<File>();
@@ -66,6 +68,13 @@
   }
 
   /**
+   * Whether the codeServer should start without precompiling modules.
+   */
+  boolean getNoPrecompile() {
+    return noPrecompile;
+  }
+
+  /**
    * The IP address where the code server should listen.
    */
   String getBindAddress() {
@@ -93,6 +102,7 @@
   private class ArgProcessor extends ArgProcessorBase {
 
     public ArgProcessor() {
+      registerHandler(new NoPrecompileFlag());
       registerHandler(new BindAddressFlag());
       registerHandler(new PortFlag());
       registerHandler(new WorkDirFlag());
@@ -107,6 +117,25 @@
 
   }
 
+  public class NoPrecompileFlag extends ArgHandlerFlag {
+
+    @Override
+    public String getTag() {
+      return "-noprecompile";
+    }
+
+    @Override
+    public String getPurpose() {
+      return "Disables pre-compilation of modules.";
+    }
+
+    @Override
+    public boolean setFlag() {
+      noPrecompile = true;
+      return true;
+    }
+  }
+
   private class BindAddressFlag extends ArgHandlerString {
 
     @Override
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
index 3076afa..8b653d6 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
@@ -20,8 +20,11 @@
 import com.google.gwt.dev.json.JsonObject;
 
 import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -125,7 +128,7 @@
   /**
    * Copies in to out and closes in when done.
    */
-  private static void copyStream(InputStream in, OutputStream out) throws IOException {
+  static void copyStream(InputStream in, OutputStream out) throws IOException {
     try {
       byte[] buffer = new byte[8 * 1024];
       while (true) {
@@ -139,4 +142,27 @@
       in.close();
     }
   }
+
+  /**
+   * Reads a resource into a String.
+   */
+  static String loadResource(Class<?> base, String path) throws IOException {
+    InputStream resourceInputStream = base.getResourceAsStream(path);
+    if (resourceInputStream == null) {
+      throw new IOException("Resource " + path + " not found.");
+    }
+    ByteArrayOutputStream resourceBaos = new ByteArrayOutputStream();
+    copyStream(resourceInputStream, resourceBaos);
+    return resourceBaos.toString("UTF-8");
+  }
+
+  /**
+   * Writes a String to a file.
+   */
+  static void writeFile(String path, String content) throws IOException {
+    InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"));
+    OutputStream out = new FileOutputStream(path);
+    PageUtil.copyStream(in, out);
+  }
+
 }
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
index 73cd65c..f6c8b4a 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -38,6 +38,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
@@ -50,6 +51,7 @@
   private final String originalModuleName;
   private final List<File> sourcePath;
   private final TreeLogger logger;
+  private String serverPrefix;
   private int compilesDone = 0;
 
   // after renaming
@@ -60,11 +62,12 @@
       new AtomicReference<ResourceLoader>();
 
   Recompiler(AppSpace appSpace, String moduleName, List<File> sourcePath,
-      TreeLogger logger) {
+             String serverPrefix, TreeLogger logger) {
     this.appSpace = appSpace;
     this.originalModuleName = moduleName;
     this.sourcePath = sourcePath;
     this.logger = logger;
+    this.serverPrefix = serverPrefix;
   }
 
   synchronized CompileDir compile(Map<String, String> bindingProperties)
@@ -98,6 +101,39 @@
     return compileDir;
   }
 
+  synchronized CompileDir noCompile() throws UnableToCompleteException {
+    long startTime = System.currentTimeMillis();
+    CompileDir compileDir = makeCompileDir(++compilesDone);
+    TreeLogger compileLogger = makeCompileLogger(compileDir);
+
+    ModuleDef module = loadModule(compileLogger, new HashMap<String, String>());
+    String newModuleName = module.getName();  // includes any rename.
+    moduleName.set(newModuleName);
+
+    lastBuild.set(compileDir);
+
+    try {
+      // Prepare directory.
+      File outputDir = new File(
+          compileDir.getWarDir().getCanonicalPath() + "/" + getModuleName());
+      if (!outputDir.exists()) {
+        outputDir.mkdir();
+      }
+
+      // Creates a "module_name.nocache.js" that just forces a recompile.
+      String moduleScript = PageUtil.loadResource(Recompiler.class, "nomodule.nocache.js");
+      moduleScript = moduleScript.replace("__MODULE_NAME__", getModuleName());
+      PageUtil.writeFile(outputDir.getCanonicalPath() + "/" + getModuleName() + ".nocache.js",
+          moduleScript);
+
+    } catch (IOException e) {
+      compileLogger.log(TreeLogger.Type.ERROR, "Error creating uncompiled module.", e);
+    }
+    long elapsedTime = System.currentTimeMillis() - startTime;
+    compileLogger.log(TreeLogger.Type.INFO, "Module setup completed in " + elapsedTime + " ms");
+    return compileDir;
+  }
+
   /**
    * Returns the log from the last compile. (It may be a failed build.)
    */
@@ -137,7 +173,7 @@
     ResourceLoader resources = ResourceLoaders.forClassLoader(Thread.currentThread());
     resources = ResourceLoaders.forPathAndFallback(sourcePath, resources);
     this.resourceLoader.set(resources);
-    
+
     ModuleDef moduleDef =
         ModuleDefLoader.loadFromResources(logger, originalModuleName, resources, true);
 
@@ -175,6 +211,10 @@
     // override computeScriptBase.js to enable the "Compile" button
     overrideConfig(moduleDef, "computeScriptBaseJs",
         "com/google/gwt/dev/codeserver/computeScriptBase.js");
+    // Fix bug with SDM and Chrome 24+ where //@ sourceURL directives cause X-SourceMap header to be ignored
+    // Frustratingly, Chrome won't canonicalize a relative URL
+    overrideConfig(moduleDef, "includeSourceMapUrl", "http://" + serverPrefix +
+        WebServer.sourceMapLocationForModule(moduleDef.getName()));
 
     // If present, set some config properties back to defaults.
     // (Needed for Google's server-side linker.)
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java b/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
index 7250bcd..b3e5653 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
@@ -20,23 +20,31 @@
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.dev.json.JsonArray;
 import com.google.gwt.dev.json.JsonObject;
+import com.google.gwt.thirdparty.org.mortbay.io.Buffer;
 import com.google.gwt.thirdparty.org.mortbay.jetty.HttpConnection;
+import com.google.gwt.thirdparty.org.mortbay.jetty.MimeTypes;
 import com.google.gwt.thirdparty.org.mortbay.jetty.Request;
 import com.google.gwt.thirdparty.org.mortbay.jetty.Server;
 import com.google.gwt.thirdparty.org.mortbay.jetty.handler.AbstractHandler;
 import com.google.gwt.thirdparty.org.mortbay.jetty.nio.SelectChannelConnector;
+import com.google.gwt.thirdparty.org.mortbay.jetty.servlet.FilterHolder;
+import com.google.gwt.thirdparty.org.mortbay.jetty.servlet.ServletHandler;
+import com.google.gwt.thirdparty.org.mortbay.jetty.servlet.ServletHolder;
+import com.google.gwt.thirdparty.org.mortbay.servlet.GzipFilter;
 
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.PrintWriter;
-import java.net.URLConnection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -74,6 +82,8 @@
   private static final Pattern SAFE_CALLBACK =
       Pattern.compile("([a-zA-Z_][a-zA-Z0-9_]*\\.)*[a-zA-Z_][a-zA-Z0-9_]*");
 
+  private static final MimeTypes MIME_TYPES = new MimeTypes();
+
   private final SourceHandler handler;
 
   private final Modules modules;
@@ -102,13 +112,18 @@
 
     Server server = new Server();
     server.addConnector(connector);
-    server.addHandler(new AbstractHandler() {
+
+    ServletHandler servletHandler = new ServletHandler();
+    servletHandler.addServletWithMapping(new ServletHolder(new HttpServlet() {
       @Override
-      public void handle(String target, HttpServletRequest request,
-          HttpServletResponse response, int port) throws IOException {
-        handleRequest(target, request, response);
+      protected void doGet(HttpServletRequest request, HttpServletResponse response)
+          throws ServletException, IOException {
+        handleRequest(request.getPathInfo(), request, response);
       }
-    });
+    }), "/*");
+    servletHandler.addFilterWithMapping(new FilterHolder(GzipFilter.class),
+        "/*", AbstractHandler.DEFAULT);
+    server.addHandler(servletHandler);
     try {
       server.start();
     } catch (Exception e) {
@@ -196,6 +211,13 @@
     }
 
     if (target.equals("/favicon.ico")) {
+      InputStream faviconStream = getClass().getResourceAsStream("favicon.ico");
+      if (faviconStream != null) {
+        setHandled(request);
+        // IE8 will not load the favicon in an img tag with the default MIME type,
+        // so use "image/x-icon" instead.
+        PageUtil.sendStream("image/x-icon", faviconStream, response);
+      }
       return;
     }
 
@@ -248,15 +270,14 @@
         logger.log(TreeLogger.WARN, "client doesn't accept gzip; bailing");
         return;
       }
-      response.addHeader("Content-Encoding", "gzip");
+      response.setHeader("Content-Encoding", "gzip");
     }
 
-    String mimeType = guessMimeType(target);
     if (target.endsWith(".cache.js")) {
-      response.addHeader("X-SourceMap", SourceHandler.SOURCEMAP_PATH + moduleName +
-          "/gwtSourceMap.json");
+      response.setHeader("X-SourceMap", sourceMapLocationForModule(moduleName));
     }
-    response.addHeader("Access-Control-Allow-Origin", "*");
+    response.setHeader("Access-Control-Allow-Origin", "*");
+    String mimeType = guessMimeType(target);
     PageUtil.sendFile(mimeType, file, response);
   }
 
@@ -355,8 +376,10 @@
     }
   }
 
-  private static String guessMimeType(String filename) {
-    return URLConnection.guessContentTypeFromName(filename);
+  /* visible for testing */
+  static String guessMimeType(String filename) {
+    Buffer mimeType = MIME_TYPES.getMimeByExtension(filename);
+    return mimeType != null ? mimeType.toString() : "";
   }
 
   /**
@@ -374,6 +397,11 @@
     return result;
   }
 
+  public static String sourceMapLocationForModule(String moduleName) {
+     return SourceHandler.SOURCEMAP_PATH + moduleName +
+         "/gwtSourceMap.json";
+  }
+
   private static void setHandled(HttpServletRequest request) {
     Request baseRequest = (request instanceof Request) ? (Request) request :
         HttpConnection.getCurrentConnection().getRequest();
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js
index 26a2981..a562f9c 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/dev_mode_on.js
@@ -60,13 +60,18 @@
     if (!params) {
       return null;
     }
-    delete window.__gwt_bookmarklet_params;
+    try {
+      delete window.__gwt_bookmarklet_params;
+    } catch (e) {
+      // Delete window.x throws and exception in IE8.
+      window['__gwt_bookmarklet_params'] = null;
+    }
     return params;
   }
 
   function makeOverlay() {
     var overlay = document.createElement('div');
-    overlay.style.zIndex = 1000;
+    overlay.style.zIndex = 1000000;
     overlay.style.position = 'absolute';
     overlay.style.top = 0;
     overlay.style.left = 0;
@@ -79,7 +84,7 @@
 
   function makeDialog() {
     var dialog = document.createElement('div');
-    dialog.style.zIndex = 1001;
+    dialog.style.zIndex = 1000001;
     dialog.style.position = 'fixed';
     dialog.style.top = '20pt';
     dialog.style.left = '20pt';
@@ -100,7 +105,7 @@
     result.style.borderBottom = '1px solid black';
     result.style.padding = '3pt';
     result.setAttribute('href', 'javascript:' + encodeURIComponent(javascript));
-    result.textContent = name;
+    setTextContent(result, name);
     result.title = 'Tip: drag this button to the bookmark bar';
     return result;
   }
@@ -124,8 +129,7 @@
    *     a recompile will succeed.
    */
   function getCannotCompileError(module_name) {
-    var modules_on_codeserver = window.__gwt_codeserver_config.moduleNames;
-    if (modules_on_codeserver.indexOf(module_name) < 0) {
+    if (!isModuleOnCodeServer(module_name)) {
       return 'The code server isn\'t configured to compile this module';
     }
 
@@ -149,6 +153,22 @@
   }
 
   /**
+   * Determines if the code server is configured to run the given module.
+   * @param module_name {string}
+   * @return {boolean} true if the code server supports the given module.
+   */
+  function isModuleOnCodeServer(module_name) {
+    var modules_on_codeserver = window.__gwt_codeserver_config.moduleNames;
+    // Support browsers without indexOf() (e.g. IE8).
+    for (var i = 0; i < modules_on_codeserver.length; i++) {
+      if (modules_on_codeserver[i] == module_name) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
    * Displays the "Choose module to compile" dialog.
    * @param codeserver_url {string} The URL of the code server that will
    *    compile the chosen module.
@@ -158,7 +178,7 @@
     function makeHeader() {
       var message = document.createElement('div');
       message.style.fontSize = '24pt';
-      message.textContent = 'Choose a module to recompile:';
+      setTextContent(message, 'Choose a module to recompile:');
       return message;
     }
 
@@ -245,7 +265,7 @@
 
     var message = document.createElement('div');
     message.style.fontSize = '24pt';
-    message.textContent = text;
+    setTextContent(message, text);
 
     dialog.appendChild(message);
 
@@ -266,14 +286,14 @@
       var error = document.createElement('a');
       error.setAttribute('href', log_url);
       error.setAttribute('target', 'gwt_dev_mode_log');
-      error.innerText = errorText;
+      setTextContent(error, errorText);
       error.style.color = 'red';
       error.style.textDecoration = 'underline';
       message.appendChild(error);
 
       var button = document.createElement('button');
       button.style.fontSize = '16pt';
-      button.textContent = 'Try Again';
+      setTextContent(button, 'Try Again');
       button.onclick = function() {
         body.removeChild(dialog);
         body.removeChild(overlay);
@@ -286,6 +306,20 @@
   }
 
   /**
+   * Updates the contents of the given element with the provided text.
+   * @param {Node} element The element to update.
+   * @param {String} text The text to display.
+   */
+  function setTextContent(element, text) {
+    if (typeof element.textContent === 'string') {
+      element.textContent = text;
+    } else {
+      // Use innerText when textContent is not supported (e.g. IE8).
+      element.innerText = text;
+    }
+  }
+
+  /**
    * Makes a JSONP call. Assumes that the callback parameter is named
    * "callback". Handles multiple callbacks in flight at once.
    * @param {string} url_prefix A URL prefix that ends with '?' or '&'.
@@ -375,6 +409,7 @@
     }
 
     function onCompileFinished(json) {
+      globals.compiling = false;
       if (json.status != 'ok') {
         var log_url = codeserver_url + 'log/' + module_name;
         dialog.showError(json.status, log_url, onClickTryAgain);
@@ -385,6 +420,7 @@
 
     var url_prefix = codeserver_url + 'recompile/' + module_name + '?' +
     getBindingParameters(module_name, get_prop_map);
+    globals.compiling = true;
     callJsonp(url_prefix, onCompileFinished);
   }
 
@@ -394,6 +430,12 @@
    * @param params {map} Parameters passed in by the bookmarklet.
    */
   function runBookmarklet(params) {
+    if (!!globals.compiling) {
+      // A module is already being compiled.
+      // We ignore the bookmarklet: the page will reload once the compilation
+      // ends.
+      return;
+    }
     if (!params || !params.server_url) {
       window.alert('Need to reinstall the bookmarklets.');
       return;
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
index b7427a1..afe183b 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/directorylist.html
@@ -18,8 +18,8 @@
   <script>
     function updatePage(config) {
       var title = config.moduleName + " Source (GWT Code Server)";
-      document.getElementsByTagName("title")[0].textContent = title;
-      document.getElementById("title").textContent = title;
+      document.title = title;
+      setTextContent(document.getElementById("title"), title);
 
       document.getElementById("logLink").setAttribute("href", "../log/" + config.moduleName);
       updateFileList(config, document.getElementById("files"));
@@ -31,17 +31,37 @@
 
         var anchor = document.createElement("a");
         anchor.setAttribute("href", dir.link);
-        anchor.textContent = dir.name;
+        setTextContent(anchor, dir.name);
 
         var listItem = document.createElement("li");
         listItem.appendChild(anchor);
         resultElement.appendChild(listItem);
       }
     }
+
+    function setTextContent(element, text) {
+      if (typeof element.textContent === 'string') {
+        element.textContent = text;
+      } else {
+        // Use innerText when textContent is not supported (e.g. IE8).
+        element.innerText = text;
+      }
+    }
+
+    function onPageLoad() {
+      updatePage(config);
+    }
+
+    if (window.addEventListener) {
+      window.addEventListener("load", onPageLoad, false);
+    }
+    else if (window.attachEvent) {
+      window.attachEvent("onload", onPageLoad);
+    }
   </script>
 
 </head>
-<body onload="updatePage(config)">
+<body>
 <h1 id="title">Loading...</h1>
 
 <p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/favicon.ico b/dev/codeserver/java/com/google/gwt/dev/codeserver/favicon.ico
new file mode 100644
index 0000000..d7ccc73
--- /dev/null
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/favicon.ico
Binary files differ
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
index 511f39b..82c3b8e 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/filelist.html
@@ -18,8 +18,8 @@
   <script>
     function updatePage(config) {
       var title = config.moduleName + " Source (GWT Code Server)";
-      document.getElementsByTagName("title")[0].textContent = title;
-      document.getElementById("title").textContent = title;
+      document.title = title;
+      setTextContent(document.getElementById("title"), title);
 
       document.getElementById("logLink")
               .setAttribute("href", "/log/" + config.moduleName);
@@ -36,17 +36,37 @@
 
         var anchor = document.createElement("a");
         anchor.setAttribute("href", file.link);
-        anchor.textContent = file.name;
+        setTextContent(anchor, file.name);
 
         var listItem = document.createElement("li");
         listItem.appendChild(anchor);
         resultElement.appendChild(listItem);
       }
     }
+
+    function setTextContent(element, text) {
+      if (typeof element.textContent === 'string') {
+        element.textContent = text;
+      } else {
+        // Use innerText when textContent is not supported (e.g. IE8).
+        element.innerText = text;
+      }
+    }
+
+    function onPageLoad() {
+      updatePage(config);
+    }
+
+    if (window.addEventListener) {
+      window.addEventListener("load", onPageLoad, false);
+    }
+    else if (window.attachEvent) {
+      window.attachEvent("onload", onPageLoad);
+    }
   </script>
 
 </head>
-<body onload="updatePage(config)">
+<body>
 <h1 id="title">Loading...</h1>
 
 <p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html
index 6a27050..c855615 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/frontpage.html
@@ -35,8 +35,8 @@
     var moduleName = moduleNames[i];
 
     var anchor = document.createElement("a");
-    anchor.setAttribute("href", moduleName + "/");
-    anchor.textContent = moduleName;
+    anchor.setAttribute("href", "/" + moduleName + "/");
+    setTextContent(anchor, moduleName);
 
     var item = document.createElement("li");
     item.appendChild(anchor);
@@ -80,11 +80,31 @@
 
 function makeBookmarklet(name, javascript) {
   var result = document.createElement("a");
-  result.setAttribute("class", "bookmarklet");
+  result.setAttribute(document.all ? "className" : "class", "bookmarklet");
   result.setAttribute("href", "javascript:" + encodeURIComponent(javascript));
-  result.textContent = name;
+  setTextContent(result, name);
   return result;
 }
+
+function setTextContent(element, text) {
+  if (typeof element.textContent === 'string') {
+    element.textContent = text;
+  } else {
+    // Use innerText when textContent is not supported (e.g. IE8).
+    element.innerText = text;
+  }
+}
+
+function onPageLoad() {
+  updatePage(config);
+}
+
+if (window.addEventListener) {
+  window.addEventListener("load", onPageLoad, false);
+}
+else if (window.attachEvent) {
+  window.attachEvent("onload", onPageLoad);
+}
   </script>
 
   <style>
@@ -119,7 +139,7 @@
     }
   </style>
 </head>
-<body onload="updatePage(config)">
+<body>
 
 <h1>GWT Code Server</h1>
 
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html b/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
index 239d44e..29a8647 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/modulepage.html
@@ -18,8 +18,8 @@
   <script>
     function updatePage(config) {
       var title = config.moduleName + " (GWT Code Server)";
-      document.getElementsByTagName("title")[0].textContent = title;
-      document.getElementById("title").textContent = title;
+      document.title = title;
+      setTextContent(document.getElementById("title"), title);
 
       document.getElementById("logLink")
               .setAttribute("href", "../log/" + config.moduleName);
@@ -34,17 +34,37 @@
 
         var anchor = document.createElement("a");
         anchor.setAttribute("href", file.link);
-        anchor.textContent = file.name;
+        setTextContent(anchor, file.name);
 
         var listItem = document.createElement("li");
         listItem.appendChild(anchor);
         resultElement.appendChild(listItem);
       }
     }
+
+    function setTextContent(element, text) {
+      if (typeof element.textContent === 'string') {
+        element.textContent = text;
+      } else {
+        // Use innerText when textContent is not supported (e.g. IE8).
+        element.innerText = text;
+      }
+    }
+
+    function onPageLoad() {
+      updatePage(config);
+    }
+
+    if (window.addEventListener) {
+      window.addEventListener("load", onPageLoad, false);
+    }
+    else if (window.attachEvent) {
+      window.attachEvent("onload", onPageLoad);
+    }
   </script>
 
 </head>
-<body onload="updatePage(config)">
+<body>
 <h1 id="title">Loading...</h1>
 
 <p><a id="logLink">Messages</a> from the last time this module was compiled.</p>
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/nomodule.nocache.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/nomodule.nocache.js
new file mode 100644
index 0000000..0b5e8e0
--- /dev/null
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/nomodule.nocache.js
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2012 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.
+ */
+
+/**
+ * @fileoverview Stub for non-compiled modules.
+ *
+ * This script forces the proper reload + compilation in Super Dev Mode.
+ */
+
+(function() {
+  var moduleName = '__MODULE_NAME__';  // Replaced by actual module name.
+
+  // Active Super Dev Mode is assumed.
+  var key = '__gwtDevModeHook:' + moduleName;
+  if (!window.sessionStorage[key]) {
+    alert('Unable to load Super Dev Mode version of ' + moduleName + '.');
+    return;
+  }
+  var scriptLocation = window.sessionStorage[key];
+
+  // Get the Super Dev Mode Server URL: use the HTML a.href parsing.
+  var a = document.createElement('a');
+  a.href = scriptLocation;
+  var devServerUrl = a.protocol + '//' + a.host;
+
+  // Load the bookmarklet.
+  window.__gwt_bookmarklet_params = {
+    'server_url' : devServerUrl + '/',
+    'module_name': moduleName
+  };
+  var script = document.createElement('script');
+  script.src = devServerUrl + '/dev_mode_on.js';
+  document.getElementsByTagName('head')[0].appendChild(script);
+})();
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js
index 8c4896c..35c17a1 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/installLocationIframe.js
@@ -47,6 +47,7 @@
   // of the frame. However, we don't want to do this when runAsync calls
   // installCode, so we do it here when we create the iframe.
   frameDoc.open();
-  frameDoc.write('<html><head></head><body></body></html>');
+  var doctype = (document.compatMode == 'CSS1Compat') ? '<!doctype html>' : '';
+  frameDoc.write(doctype + '<html><head></head><body></body></html>');
   frameDoc.close();
 }
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js
index 297dccb..55db43a 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/properties.js
@@ -52,7 +52,9 @@
   __MODULE_FUNC__.__getPropMap = function() {
     var result = {};
     for (var key in values) {
-      result[key] = computePropValue(key);
+      if (values.hasOwnProperty(key)) {
+        result[key] = computePropValue(key);
+      }
     }
     return result;
   };
diff --git a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
index 556a6d7..8e59403 100644
--- a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
@@ -406,7 +406,20 @@
         + "__gwtModuleFunction.__computePropValue);");
     out.newlineOpt();
     out.print("$sendStats('moduleStartup', 'end');");
-    out.print("\n//@ sourceURL=0.js\n");
+    String includeSourceMapUrl = getStringConfigurationProperty(context, "includeSourceMapUrl", "false");
+    if (!"false".equalsIgnoreCase(includeSourceMapUrl)) {
+      String sourceMapUrl = SymbolMapsLinker.SourceMapArtifact.sourceMapFilenameForFragment(0);
+      if (!"true".equalsIgnoreCase(includeSourceMapUrl)) {
+        sourceMapUrl = includeSourceMapUrl;
+      }
+      // The sourceURL magic comment can cause browsers to ignore the X-SourceMap header
+      // This magic comment ensures that they can still locate them in that case
+      out.print("\n//@ sourceMappingURL=" + sourceMapUrl + " ");
+    }
+    // Magic comment serves several purposes:
+    // 1. renames strongName to a stable name in browser debugger
+    // 2. provides name to scripts installed via eval()
+    out.print("\n//@ sourceURL=0.js \n");
     return out.toString();
   }
 
diff --git a/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js b/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js
index 816e1b1..a5026f2 100644
--- a/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js
+++ b/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js
@@ -42,7 +42,7 @@
 
   // The new script tag must come before the previous one so that
   // computeScriptBase will see it.
-  head.insertBefore(script, head.firstElementChild);
+  head.insertBefore(script, head.firstElementChild || head.children[0]);
 
   return false; // Skip the regular bootstrap.
 }
diff --git a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
index 91a1d43..e4c8eaf 100644
--- a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
@@ -170,7 +170,7 @@
     private byte[] js;
 
     public SourceMapArtifact(int permutationId, int fragment, byte[] js) {
-      super(SymbolMapsLinker.class, permutationId + "/sourceMap" + fragment + ".json", js);
+      super(SymbolMapsLinker.class, permutationId + '/' + sourceMapFilenameForFragment(fragment), js);
       this.permutationId = permutationId;
       this.fragment = fragment;
       this.js = js;
@@ -183,6 +183,10 @@
     public int getPermutationId() {
       return permutationId;
     }
+
+    public static String sourceMapFilenameForFragment(int fragment) {
+             return "sourceMap" + fragment + ".json";
+    }
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/CompileModule.java b/dev/core/src/com/google/gwt/dev/CompileModule.java
index f9df91a..8ba6fb5 100644
--- a/dev/core/src/com/google/gwt/dev/CompileModule.java
+++ b/dev/core/src/com/google/gwt/dev/CompileModule.java
@@ -30,8 +30,6 @@
 import com.google.gwt.dev.util.arg.ArgHandlerModuleName;
 import com.google.gwt.dev.util.arg.ArgHandlerOutDir;
 import com.google.gwt.dev.util.arg.ArgHandlerStrict;
-import com.google.gwt.dev.util.arg.OptionOutDir;
-import com.google.gwt.dev.util.arg.OptionStrict;
 import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
 import com.google.gwt.thirdparty.guava.common.collect.Sets;
@@ -100,9 +98,6 @@
     }
   }
 
-  interface CompileModuleOptions extends CompileTaskOptions, OptionOutDir, OptionStrict {
-  }
-
   static class CompileModuleOptionsImpl extends CompileTaskOptionsImpl implements
       CompileModuleOptions {
 
diff --git a/dev/core/src/com/google/gwt/dev/CompileModuleOptions.java b/dev/core/src/com/google/gwt/dev/CompileModuleOptions.java
new file mode 100644
index 0000000..b3f6ee4
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/CompileModuleOptions.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2012 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;
+
+import com.google.gwt.dev.util.arg.OptionOutDir;
+import com.google.gwt.dev.util.arg.OptionStrict;
+
+/**
+ * The complete set of options for {@link CompileModule}.
+ */
+public interface CompileModuleOptions extends CompileTaskOptions, OptionOutDir, OptionStrict {
+}
diff --git a/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java b/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
index 7c65f6e..914713d 100644
--- a/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
+++ b/dev/core/src/com/google/gwt/dev/CompileTaskRunner.java
@@ -63,7 +63,7 @@
         }
       });
 
-      compilerThread.setName("GWTCompiler Thread");
+      compilerThread.setName("GWT Compiler Thread");
       compilerThread.start();
       // TODO(jat): create an app frame for loggerWindow
       
diff --git a/dev/core/src/com/google/gwt/dev/GWTCompiler.java b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
deleted file mode 100644
index ef2e4ea..0000000
--- a/dev/core/src/com/google/gwt/dev/GWTCompiler.java
+++ /dev/null
@@ -1,239 +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.dev;
-
-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.dev.CompileTaskRunner.CompileTask;
-import com.google.gwt.dev.cfg.ModuleDef;
-import com.google.gwt.dev.cfg.ModuleDefLoader;
-import com.google.gwt.dev.jjs.JJSOptions;
-import com.google.gwt.dev.jjs.PermutationResult;
-import com.google.gwt.dev.shell.CheckForUpdates;
-import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult;
-import com.google.gwt.dev.util.FileBackedObject;
-import com.google.gwt.dev.util.Util;
-import com.google.gwt.dev.util.arg.ArgHandlerLocalWorkers;
-import com.google.gwt.dev.util.arg.ArgHandlerOutDir;
-import com.google.gwt.dev.util.arg.ArgHandlerWorkDirOptional;
-import com.google.gwt.dev.util.log.speedtracer.CompilerEventType;
-import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
-import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
-import com.google.gwt.util.tools.ToolBase;
-import com.google.gwt.util.tools.Utility;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.FutureTask;
-
-/**
- * The main executable entry point for the GWT Java to JavaScript compiler.
- * 
- * @deprecated Use {@link Compiler} instead
- */
-@Deprecated
-public class GWTCompiler {
-
-  static final class ArgProcessor extends PrecompileTaskArgProcessor {
-    public ArgProcessor(LegacyCompilerOptions options) {
-      super(options);
-
-      registerHandler(new ArgHandlerOutDir(options));
-
-      // Override the ArgHandlerWorkDirRequired in the super class.
-      registerHandler(new ArgHandlerWorkDirOptional(options));
-
-      registerHandler(new ArgHandlerLocalWorkers(options));
-    }
-
-    @Override
-    protected String getName() {
-      return GWTCompiler.class.getName();
-    }
-  }
-
-  /**
-   * Simple implementation of {@link LegacyCompilerOptions}.
-   */
-  public static class GWTCompilerOptionsImpl extends PrecompileTaskOptionsImpl
-      implements LegacyCompilerOptions {
-
-    private int localWorkers;
-    private File outDir;
-
-    public GWTCompilerOptionsImpl() {
-    }
-
-    public GWTCompilerOptionsImpl(LegacyCompilerOptions other) {
-      copyFrom(other);
-    }
-
-    public void copyFrom(LegacyCompilerOptions other) {
-      super.copyFrom(other);
-      setLocalWorkers(other.getLocalWorkers());
-      setOutDir(other.getOutDir());
-    }
-
-    @Override
-    public int getLocalWorkers() {
-      return localWorkers;
-    }
-
-    @Override
-    public File getOutDir() {
-      return outDir;
-    }
-
-    @Override
-    public void setLocalWorkers(int localWorkers) {
-      this.localWorkers = localWorkers;
-    }
-
-    @Override
-    public void setOutDir(File outDir) {
-      this.outDir = outDir;
-    }
-  }
-
-  public static void main(String[] args) {
-    ToolBase.legacyWarn(GWTCompiler.class, Compiler.class);
-    SpeedTracerLogger.init();
-    Event compileEvent = SpeedTracerLogger.start(CompilerEventType.COMPILE);
-
-    /*
-     * NOTE: main always exits with a call to System.exit to terminate any
-     * non-daemon threads that were started in Generators. Typically, this is to
-     * shutdown AWT related threads, since the contract for their termination is
-     * still implementation-dependent.
-     */
-    final LegacyCompilerOptions options = new GWTCompilerOptionsImpl();
-    boolean success = false;
-    if (new ArgProcessor(options).processArgs(args)) {
-      CompileTask task = new CompileTask() {
-        @Override
-        public boolean run(TreeLogger logger) throws UnableToCompleteException {
-          FutureTask<UpdateResult> updater = null;
-          if (!options.isUpdateCheckDisabled()) {
-            updater = CheckForUpdates.checkForUpdatesInBackgroundThread(logger,
-                CheckForUpdates.ONE_DAY);
-          }
-          boolean success = new GWTCompiler(options).run(logger);
-          if (success) {
-            CheckForUpdates.logUpdateAvailable(logger, updater);
-          }
-          return success;
-        }
-      };
-      if (CompileTaskRunner.runWithAppropriateLogger(options, task)) {
-        // Exit w/ success code.
-        success = true;
-      }
-    }
-
-    compileEvent.end();
-    // Exit w/ non-success code.
-    System.exit(success ? 0 : 1);
-  }
-
-  private final GWTCompilerOptionsImpl options;
-
-  public GWTCompiler(LegacyCompilerOptions options) {
-    this.options = new GWTCompilerOptionsImpl(options);
-  }
-
-  /**
-   * Compiles the set of modules specified in the options.
-   */
-  public boolean run(TreeLogger logger) throws UnableToCompleteException {
-    ModuleDef[] modules = new ModuleDef[options.getModuleNames().size()];
-    int i = 0;
-    for (String moduleName : options.getModuleNames()) {
-      modules[i++] = ModuleDefLoader.loadFromClassPath(logger, moduleName, true);
-    }
-    return run(logger, modules);
-  }
-
-  /**
-   * Compiles a specific set of modules.
-   */
-  public boolean run(TreeLogger logger, ModuleDef... modules)
-      throws UnableToCompleteException {
-    Event compileEvent = SpeedTracerLogger.start(CompilerEventType.COMPILE);
-    boolean tempWorkDir = false;
-    try {
-      if (options.getWorkDir() == null) {
-        options.setWorkDir(Utility.makeTemporaryDirectory(null, "gwtc"));
-        tempWorkDir = true;
-      }
-
-      for (ModuleDef module : modules) {
-        String moduleName = module.getName();
-
-        if (options.isValidateOnly()) {
-          if (!Precompile.validate(logger, options, module, options.getGenDir())) {
-            return false;
-          }
-        } else {
-          long compileStart = System.currentTimeMillis();
-          logger = logger.branch(TreeLogger.INFO, "Compiling module "
-              + moduleName);
-
-          // Optimize early since permutation compiles will run in process.
-          options.setOptimizePrecompile(true);
-          Precompilation precompilation = Precompile.precompile(logger,
-              options, module, options.getGenDir());
-
-          if (precompilation == null) {
-            return false;
-          }
-          Permutation[] allPerms = precompilation.getPermutations();
-          List<FileBackedObject<PermutationResult>> resultFiles = CompilePerms.makeResultFiles(
-              options.getCompilerWorkDir(moduleName), allPerms);
-          CompilePerms.compile(logger, precompilation, allPerms,
-              options.getLocalWorkers(), resultFiles);
-
-          ArtifactSet generatedArtifacts = precompilation.getGeneratedArtifacts();
-          JJSOptions precompileOptions = precompilation.getUnifiedAst().getOptions();
-
-          precompilation = null; // No longer needed, so save the memory
-
-          Link.legacyLink(logger.branch(TreeLogger.TRACE, "Linking into "
-              + options.getOutDir().getPath()), module, generatedArtifacts,
-              allPerms, resultFiles, options.getOutDir(), precompileOptions);
-
-          long compileDone = System.currentTimeMillis();
-          long delta = compileDone - compileStart;
-          if (logger.isLoggable(TreeLogger.INFO)) {
-            logger.log(TreeLogger.INFO, "Compilation succeeded -- "
-                + String.format("%.3f", delta / 1000d) + "s");
-          }
-        }
-      }
-    } catch (IOException e) {
-      logger.log(TreeLogger.ERROR, "Unable to create compiler work directory",
-          e);
-      return false;
-    } finally {
-      compileEvent.end();
-      if (tempWorkDir) {
-        Util.recursiveDelete(options.getWorkDir(), false);
-      }
-    }
-    return true;
-  }
-}
diff --git a/dev/core/src/com/google/gwt/dev/GWTShell.java b/dev/core/src/com/google/gwt/dev/GWTShell.java
deleted file mode 100644
index 77339ff..0000000
--- a/dev/core/src/com/google/gwt/dev/GWTShell.java
+++ /dev/null
@@ -1,252 +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.dev;
-
-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.EmittedArtifact.Visibility;
-import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
-import com.google.gwt.dev.cfg.ModuleDef;
-import com.google.gwt.dev.shell.WorkDirs;
-import com.google.gwt.dev.shell.tomcat.EmbeddedTomcatServer;
-import com.google.gwt.dev.util.OutputFileSetOnDirectory;
-import com.google.gwt.dev.util.arg.ArgHandlerDisableUpdateCheck;
-import com.google.gwt.dev.util.arg.ArgHandlerOutDir;
-import com.google.gwt.util.tools.ArgHandlerExtra;
-
-import java.io.File;
-import java.util.Locale;
-import java.util.Set;
-
-/**
- * The main executable class for the hosted mode shell.
- */
-@Deprecated
-public class GWTShell extends DevModeBase {
-
-  /**
-   * Handles the list of startup urls that can be passed at the end of the
-   * command line.
-   */
-  protected static class ArgHandlerStartupURLsExtra extends ArgHandlerExtra {
-
-    private final OptionStartupURLs options;
-
-    public ArgHandlerStartupURLsExtra(OptionStartupURLs options) {
-      this.options = options;
-    }
-
-    @Override
-    public boolean addExtraArg(String arg) {
-      options.addStartupURL(arg);
-      return true;
-    }
-
-    @Override
-    public String getPurpose() {
-      return "Automatically launches the specified URL";
-    }
-
-    @Override
-    public String[] getTagArgs() {
-      return new String[] {"url"};
-    }
-  }
-
-  /**
-   * The GWTShell argument processor.
-   */
-  protected static class ArgProcessor extends DevModeBase.ArgProcessor {
-    public ArgProcessor(ShellOptionsImpl options, boolean forceServer,
-        boolean noURLs) {
-      super(options, forceServer);
-      if (!noURLs) {
-        registerHandler(new ArgHandlerStartupURLsExtra(options));
-      }
-      registerHandler(new ArgHandlerOutDir(options));
-      registerHandler(new ArgHandlerDisableUpdateCheck(options));
-    }
-
-    @Override
-    protected String getName() {
-      return GWTShell.class.getName();
-    }
-  }
-
-  /**
-   * Concrete class to implement all shell options.
-   */
-  protected static class ShellOptionsImpl extends HostedModeBaseOptionsImpl
-      implements WorkDirs, LegacyCompilerOptions {
-    private int localWorkers;
-    private File outDir;
-
-    public File getCompilerOutputDir(ModuleDef moduleDef) {
-      return new File(getOutDir(), moduleDef.getName());
-    }
-
-    public int getLocalWorkers() {
-      return localWorkers;
-    }
-
-    public File getOutDir() {
-      return outDir;
-    }
-
-    public File getShellPublicGenDir(ModuleDef moduleDef) {
-      File moduleWorkDir = new File(getWorkDir(), moduleDef.getName());
-      return new File(moduleWorkDir, "public");
-    }
-
-    @Override
-    public File getWorkDir() {
-      return new File(getOutDir(), ".gwt-tmp");
-    }
-
-    public void setLocalWorkers(int localWorkers) {
-      this.localWorkers = localWorkers;
-    }
-
-    public void setOutDir(File outDir) {
-      this.outDir = outDir;
-    }
-  }
-
-  public static String checkHost(String hostUnderConsideration,
-      Set<String> hosts) {
-    hostUnderConsideration = hostUnderConsideration.toLowerCase(Locale.ENGLISH);
-    for (String rule : hosts) {
-      // match on lowercased regex
-      if (hostUnderConsideration.matches(".*" + rule + ".*")) {
-        return rule;
-      }
-    }
-    return null;
-  }
-
-  public static String computeHostRegex(String url) {
-    // the entire URL up to the first slash not prefixed by a slash or colon.
-    String raw = url.split("(?<![:/])/")[0];
-    // escape the dots and put a begin line specifier on the result
-    return "^" + raw.replaceAll("[.]", "[.]");
-  }
-
-  public static String formatRules(Set<String> invalidHttpHosts) {
-    StringBuffer out = new StringBuffer();
-    for (String rule : invalidHttpHosts) {
-      out.append(rule);
-      out.append(" ");
-    }
-    return out.toString();
-  }
-
-  public static void main(String[] args) {
-    /*
-     * NOTE: main always exits with a call to System.exit to terminate any
-     * non-daemon threads that were started in Generators. Typically, this is to
-     * shutdown AWT related threads, since the contract for their termination is
-     * still implementation-dependent.
-     */
-    GWTShell gwtShell = new GWTShell();
-    ArgProcessor argProcessor = new ArgProcessor(gwtShell.options, false, false);
-    if (argProcessor.processArgs(args)) {
-      gwtShell.run();
-      // Exit w/ success code.
-      System.exit(0);
-    }
-    // Exit w/ non-success code.
-    System.exit(-1);
-  }
-
-  /**
-   * Hiding super field because it's actually the same object, just with a
-   * stronger type.
-   */
-  @SuppressWarnings("hiding")
-  protected final ShellOptionsImpl options = (ShellOptionsImpl) super.options;
-
-  protected File outDir;
-
-  @SuppressWarnings("unused")
-  public void restartServer(TreeLogger logger) throws UnableToCompleteException {
-    // Unimplemented.
-  }
-
-  @Override
-  protected HostedModeBaseOptions createOptions() {
-    return new ShellOptionsImpl();
-  }
-
-  @Override
-  protected void doShutDownServer() {
-    // Stop the HTTP server.
-    //
-    EmbeddedTomcatServer.stop();
-  }
-
-  @Override
-  protected boolean doStartup() {
-    File persistentCacheDir = new File(options.getWorkDir(), "gwt-unitCache");
-    return super.doStartup(persistentCacheDir);
-  }
-
-  @Override
-  protected int doStartUpServer() {
-    // TODO(jat): find a safe way to get an icon for Tomcat
-    TreeLogger logger = ui.getWebServerLogger("Tomcat", null);
-    // TODO(bruce): make tomcat work in terms of the modular launcher
-    String whyFailed = EmbeddedTomcatServer.start(isHeadless() ? getTopLogger()
-        : logger, getPort(), options, shouldAutoGenerateResources());
-
-    if (whyFailed != null) {
-      getTopLogger().log(TreeLogger.ERROR, "Starting Tomcat: " + whyFailed);
-      return -1;
-    }
-    return EmbeddedTomcatServer.getPort();
-  }
-
-  @Override
-  protected synchronized void produceOutput(TreeLogger logger,
-      StandardLinkerContext linkerStack, ArtifactSet artifacts,
-      ModuleDef module, boolean isRelink) throws UnableToCompleteException {
-    /*
-     * Legacy: in GWTShell we only copy generated artifacts into the public gen
-     * folder. Public files and "autogen" files have special handling (that
-     * needs to die).
-     */
-    if (isRelink) {
-      File outputDir = options.getShellPublicGenDir(module);
-      outputDir.mkdirs();
-      OutputFileSetOnDirectory outFileSet = new OutputFileSetOnDirectory(
-          outputDir, "");
-      linkerStack.produceOutput(logger, artifacts, Visibility.Public,
-          outFileSet);
-      outFileSet.close();
-    }
-  }
-
-  protected boolean shouldAutoGenerateResources() {
-    return true;
-  }
-
-  @Override
-  protected void warnAboutNoStartupUrls() {
-    getTopLogger().log(TreeLogger.WARN,
-        "No startup URLs were supplied -- add them to the end of the GWTShell"
-        + " command line");
-  }
-}
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
index 8d972e9..378ab1a 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
@@ -466,9 +466,9 @@
   }
 
   /**
-   * For convenience in hosted mode, servlets can be automatically loaded and
-   * delegated to via {@link com.google.gwt.dev.shell.GWTShellServlet}. If a
-   * servlet is already mapped to the specified path, it is replaced.
+   * For convenience in unit tests, servlets can be automatically loaded and
+   * mapped in the embedded web server. If a servlet is already mapped to the
+   * specified path, it is replaced.
    * 
    * @param path the url path at which the servlet resides
    * @param servletClassName the name of the servlet to publish
diff --git a/dev/core/src/com/google/gwt/dev/etc/tomcat/conf/web.xml b/dev/core/src/com/google/gwt/dev/etc/tomcat/conf/web.xml
deleted file mode 100644
index fee85f3..0000000
--- a/dev/core/src/com/google/gwt/dev/etc/tomcat/conf/web.xml
+++ /dev/null
@@ -1,566 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!-- A tweaked version of the default Tomcat web.xml to remove everything except the stuff we want to use -->
-<web-app version="2.4">
-
-    <session-config>
-        <session-timeout>30</session-timeout>
-    </session-config>
-
-    <mime-mapping>
-        <extension>abs</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ai</extension>
-        <mime-type>application/postscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aif</extension>
-        <mime-type>audio/x-aiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aifc</extension>
-        <mime-type>audio/x-aiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aiff</extension>
-        <mime-type>audio/x-aiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aim</extension>
-        <mime-type>application/x-aim</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>art</extension>
-        <mime-type>image/x-jg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>asf</extension>
-        <mime-type>video/x-ms-asf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>asx</extension>
-        <mime-type>video/x-ms-asf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>au</extension>
-        <mime-type>audio/basic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>avi</extension>
-        <mime-type>video/x-msvideo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>avx</extension>
-        <mime-type>video/x-rad-screenplay</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bcpio</extension>
-        <mime-type>application/x-bcpio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bin</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bmp</extension>
-        <mime-type>image/bmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>body</extension>
-        <mime-type>text/html</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdf</extension>
-        <mime-type>application/x-cdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cer</extension>
-        <mime-type>application/x-x509-ca-cert</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>class</extension>
-        <mime-type>application/java</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cpio</extension>
-        <mime-type>application/x-cpio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>csh</extension>
-        <mime-type>application/x-csh</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>css</extension>
-        <mime-type>text/css</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dib</extension>
-        <mime-type>image/bmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>doc</extension>
-        <mime-type>application/msword</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dtd</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dv</extension>
-        <mime-type>video/x-dv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dvi</extension>
-        <mime-type>application/x-dvi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>eps</extension>
-        <mime-type>application/postscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>etx</extension>
-        <mime-type>text/x-setext</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>exe</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gif</extension>
-        <mime-type>image/gif</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gtar</extension>
-        <mime-type>application/x-gtar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gz</extension>
-        <mime-type>application/x-gzip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hdf</extension>
-        <mime-type>application/x-hdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hqx</extension>
-        <mime-type>application/mac-binhex40</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>htc</extension>
-        <mime-type>text/x-component</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>htm</extension>
-        <mime-type>text/html</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>html</extension>
-        <mime-type>text/html</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hqx</extension>
-        <mime-type>application/mac-binhex40</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ief</extension>
-        <mime-type>image/ief</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jad</extension>
-        <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jar</extension>
-        <mime-type>application/java-archive</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>java</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jnlp</extension>
-        <mime-type>application/x-java-jnlp-file</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpe</extension>
-        <mime-type>image/jpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpeg</extension>
-        <mime-type>image/jpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpg</extension>
-        <mime-type>image/jpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>js</extension>
-        <mime-type>text/javascript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jsf</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jspf</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kar</extension>
-        <mime-type>audio/x-midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>latex</extension>
-        <mime-type>application/x-latex</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m3u</extension>
-        <mime-type>audio/x-mpegurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mac</extension>
-        <mime-type>image/x-macpaint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>man</extension>
-        <mime-type>application/x-troff-man</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>me</extension>
-        <mime-type>application/x-troff-me</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mid</extension>
-        <mime-type>audio/x-midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>midi</extension>
-        <mime-type>audio/x-midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mif</extension>
-        <mime-type>application/x-mif</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mov</extension>
-        <mime-type>video/quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>movie</extension>
-        <mime-type>video/x-sgi-movie</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp1</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp2</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp3</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpa</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpe</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpeg</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpega</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpg</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpv2</extension>
-        <mime-type>video/mpeg2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ms</extension>
-        <mime-type>application/x-wais-source</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nc</extension>
-        <mime-type>application/x-netcdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oda</extension>
-        <mime-type>application/oda</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pbm</extension>
-        <mime-type>image/x-portable-bitmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pct</extension>
-        <mime-type>image/pict</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pdf</extension>
-        <mime-type>application/pdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pgm</extension>
-        <mime-type>image/x-portable-graymap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pic</extension>
-        <mime-type>image/pict</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pict</extension>
-        <mime-type>image/pict</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pls</extension>
-        <mime-type>audio/x-scpls</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>png</extension>
-        <mime-type>image/png</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pnm</extension>
-        <mime-type>image/x-portable-anymap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pnt</extension>
-        <mime-type>image/x-macpaint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppm</extension>
-        <mime-type>image/x-portable-pixmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppt</extension>
-        <mime-type>application/powerpoint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ps</extension>
-        <mime-type>application/postscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>psd</extension>
-        <mime-type>image/x-photoshop</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qt</extension>
-        <mime-type>video/quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qti</extension>
-        <mime-type>image/x-quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qtif</extension>
-        <mime-type>image/x-quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ras</extension>
-        <mime-type>image/x-cmu-raster</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rgb</extension>
-        <mime-type>image/x-rgb</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rm</extension>
-        <mime-type>application/vnd.rn-realmedia</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>roff</extension>
-        <mime-type>application/x-troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rtf</extension>
-        <mime-type>application/rtf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rtx</extension>
-        <mime-type>text/richtext</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sh</extension>
-        <mime-type>application/x-sh</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>shar</extension>
-        <mime-type>application/x-shar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>smf</extension>
-        <mime-type>audio/x-midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sit</extension>
-        <mime-type>application/x-stuffit</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>snd</extension>
-        <mime-type>audio/basic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>src</extension>
-        <mime-type>application/x-wais-source</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sv4cpio</extension>
-        <mime-type>application/x-sv4cpio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sv4crc</extension>
-        <mime-type>application/x-sv4crc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>swf</extension>
-        <mime-type>application/x-shockwave-flash</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>t</extension>
-        <mime-type>application/x-troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tar</extension>
-        <mime-type>application/x-tar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tcl</extension>
-        <mime-type>application/x-tcl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tex</extension>
-        <mime-type>application/x-tex</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>texi</extension>
-        <mime-type>application/x-texinfo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>texinfo</extension>
-        <mime-type>application/x-texinfo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tif</extension>
-        <mime-type>image/tiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tiff</extension>
-        <mime-type>image/tiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tr</extension>
-        <mime-type>application/x-troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tsv</extension>
-        <mime-type>text/tab-separated-values</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>txt</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ulw</extension>
-        <mime-type>audio/basic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ustar</extension>
-        <mime-type>application/x-ustar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xbm</extension>
-        <mime-type>image/x-xbitmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xht</extension>
-        <mime-type>application/xhtml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xhtml</extension>
-        <mime-type>application/xhtml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xml</extension>
-        <mime-type>text/xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xpm</extension>
-        <mime-type>image/x-xpixmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xsl</extension>
-        <mime-type>text/xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xwd</extension>
-        <mime-type>image/x-xwindowdump</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wav</extension>
-        <mime-type>audio/x-wav</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>svg</extension>
-        <mime-type>image/svg+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>svgz</extension>
-        <mime-type>image/svg+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vsd</extension>
-        <mime-type>application/x-visio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- Wireless Bitmap -->
-        <extension>wbmp</extension>
-        <mime-type>image/vnd.wap.wbmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- WML Source -->
-        <extension>wml</extension>
-        <mime-type>text/vnd.wap.wml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- Compiled WML -->
-        <extension>wmlc</extension>
-        <mime-type>application/vnd.wap.wmlc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- WML Script Source -->
-        <extension>wmls</extension>
-        <mime-type>text/vnd.wap.wmlscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- Compiled WML Script -->
-        <extension>wmlscriptc</extension>
-        <mime-type>application/vnd.wap.wmlscriptc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wrl</extension>
-        <mime-type>x-world/x-vrml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>Z</extension>
-        <mime-type>application/x-compress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z</extension>
-        <mime-type>application/x-compress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>zip</extension>
-        <mime-type>application/zip</mime-type>
-    </mime-mapping>
-</web-app>
diff --git a/dev/core/src/com/google/gwt/dev/etc/tomcat/webapps/ROOT/WEB-INF/web.xml b/dev/core/src/com/google/gwt/dev/etc/tomcat/webapps/ROOT/WEB-INF/web.xml
deleted file mode 100644
index e600b2f..0000000
--- a/dev/core/src/com/google/gwt/dev/etc/tomcat/webapps/ROOT/WEB-INF/web.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app>
-
-	<servlet>
-		<servlet-name>shell</servlet-name>
-		<servlet-class>com.google.gwt.dev.shell.GWTShellServlet</servlet-class>
-	</servlet>
-	
-	<servlet-mapping>
-		<servlet-name>shell</servlet-name>
-		<url-pattern>/*</url-pattern>
-	</servlet-mapping>
-
-</web-app>
diff --git a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
index 3db7676..53e30a8 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
@@ -60,16 +60,42 @@
        */
       List<String> classNames = new ArrayList<String>();
 
+      int expectCode;
+      int sawCode;
+
       public List<String> getInnerClassNames() {
         return classNames;
       }
 
+      /**
+       * Return whether or not the class file visited was well-formed.
+       * Currently, this only checks that all non-abstract, non-native methods
+       * have a Code attribute.
+       */
+      public boolean isWellFormed() {
+        return expectCode == sawCode;
+      }
+
       @Override
       public void visitInnerClass(String name, String outerName, String innerName, int access) {
         if ((access & Opcodes.ACC_SYNTHETIC) == 0) {
           classNames.add(name);
         }
       }
+
+      @Override
+      public AnonymousClassVisitor visitMethod(int access, String name, String desc, String signature,
+          String[] exceptions) {
+        if ((access & (Opcodes.ACC_ABSTRACT | Opcodes.ACC_NATIVE)) == 0) {
+          ++expectCode;
+        }
+        return this;
+      }
+
+      @Override
+      public void visitCode() {
+        ++sawCode;
+      }
     }
 
     private final List<String> classesToScan;
@@ -101,6 +127,18 @@
           continue;
         }
 
+        AnonymousClassVisitor cv = new AnonymousClassVisitor();
+        new ClassReader(classBytes).accept(cv, 0);
+        if (!cv.isWellFormed()) {
+          /*
+           * Weird case #2: As of OpenJDK 7, javac in the above case now does
+           * generate a class file, but an incomplete one that fails to load
+           * with a ClassFormatError "Absent Code attribute in method that
+           * is not native or abstract in class file" error.
+           */
+          continue;
+        }
+
         /*
          * Add the class to the list only if it can be loaded to get around the
          * javac weirdness issue where javac refers a class but does not
@@ -109,8 +147,6 @@
         if (isClassnameGenerated(lookupName) && !allGeneratedClasses.contains(lookupName)) {
           allGeneratedClasses.add(lookupName);
         }
-        AnonymousClassVisitor cv = new AnonymousClassVisitor();
-        new ClassReader(classBytes).accept(cv, 0);
         List<String> innerClasses = cv.getInnerClassNames();
         for (String innerClass : innerClasses) {
           // The innerClass has to be an inner class of the lookupName
diff --git a/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java b/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java
index 8826981..73333a6 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/AstConstructor.java
@@ -66,8 +66,8 @@
 
     JProgram jprogram = new JProgram();
     JsProgram jsProgram = new JsProgram();
-    UnifyAst unifyAst = new UnifyAst(jprogram, jsProgram, options, rpo);
-    unifyAst.buildEverything(logger);
+    UnifyAst unifyAst = new UnifyAst(logger, jprogram, jsProgram, options, rpo);
+    unifyAst.buildEverything();
 
     // Compute all super type/sub type info
     jprogram.typeOracle.computeBeforeAST();
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index 042e145..e1a6180 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -485,21 +485,32 @@
       PermutationResult toReturn =
           new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable, jsProgram), ranges);
       CompilationMetricsArtifact compilationMetrics = null;
+
       // TODO: enable this when ClosureCompiler is enabled
-      if (!options.isClosureCompilerEnabled() && options.isCompilerMetricsEnabled()) {
-        compilationMetrics = new CompilationMetricsArtifact(permutation.getId());
-        compilationMetrics.setCompileElapsedMilliseconds(System.currentTimeMillis()
-            - startTimeMilliseconds);
-        compilationMetrics.setElapsedMilliseconds(System.currentTimeMillis()
-            - ManagementFactory.getRuntimeMXBean().getStartTime());
-        compilationMetrics.setJsSize(sizeBreakdowns);
-        compilationMetrics.setPermutationDescription(permutation.prettyPrint());
-        toReturn.addArtifacts(Lists.create(unifiedAst.getModuleMetrics(), unifiedAst
-            .getPrecompilationMetrics(), compilationMetrics));
+      if (options.isCompilerMetricsEnabled()) {
+        if (options.isClosureCompilerEnabled()) {
+          logger.log(TreeLogger.WARN, "Incompatible options: -XenableClosureCompiler and "
+              + "-XcompilerMetric; ignoring -XcompilerMetric.");
+        } else {
+          compilationMetrics = new CompilationMetricsArtifact(permutation.getId());
+          compilationMetrics.setCompileElapsedMilliseconds(System.currentTimeMillis()
+              - startTimeMilliseconds);
+          compilationMetrics.setElapsedMilliseconds(System.currentTimeMillis()
+              - ManagementFactory.getRuntimeMXBean().getStartTime());
+          compilationMetrics.setJsSize(sizeBreakdowns);
+          compilationMetrics.setPermutationDescription(permutation.prettyPrint());
+          toReturn.addArtifacts(Lists.create(unifiedAst.getModuleMetrics(), unifiedAst
+              .getPrecompilationMetrics(), compilationMetrics));
+        }
       }
 
       // TODO: enable this when ClosureCompiler is enabled
-      if (!options.isClosureCompilerEnabled()) {
+      if (options.isClosureCompilerEnabled()) {
+        if (options.isSoycEnabled()) {
+          logger.log(TreeLogger.WARN, "Incompatible options: -XenableClosureCompiler and "
+              + "-compileReport; ignoring -compileReport.");
+        }
+      } else {
         toReturn.addArtifacts(makeSoycArtifacts(logger, permutationId, jprogram, js, sizeBreakdowns,
             options.isSoycExtra() ? sourceInfoMaps : null, dependencies, jjsmap, obfuscateMap,
             unifiedAst.getModuleMetrics(), unifiedAst.getPrecompilationMetrics(), compilationMetrics,
@@ -507,10 +518,15 @@
       }
 
       // TODO: enable this when ClosureCompiler is enabled
-      if (!options.isClosureCompilerEnabled() && isSourceMapsEnabled) {
-        logger.log(TreeLogger.INFO, "Source Maps Enabled");
-        toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps,
-            permutationId));
+      if (isSourceMapsEnabled) {
+        if (options.isClosureCompilerEnabled()) {
+          logger.log(TreeLogger.WARN, "Incompatible options: -XenableClosureCompiler and "
+              + "compiler.useSourceMaps=true; ignoring compiler.useSourceMaps=true.");
+        } else {
+          logger.log(TreeLogger.INFO, "Source Maps Enabled");
+          toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps,
+              permutationId));
+        }
       }
 
       logTrackingStats(logger);
@@ -617,11 +633,11 @@
 
     try {
       // (2) Assemble the Java AST.
-      UnifyAst unifyAst = new UnifyAst(jprogram, jsProgram, options, rpo);
+      UnifyAst unifyAst = new UnifyAst(logger, jprogram, jsProgram, options, rpo);
       unifyAst.addRootTypes(allRootTypes);
       // TODO: move this into UnifyAst?
       findEntryPoints(logger, rpo, declEntryPts, jprogram);
-      unifyAst.exec(logger);
+      unifyAst.exec();
 
       List<String> finalTypeOracleTypes = Lists.create();
       if (precompilationMetrics != null) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java
index 6864453..1986666 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JConstructor.java
@@ -74,6 +74,11 @@
     return getEnclosingType().getNonNull();
   }
 
+  @Override
+  public boolean isConstructor() {
+    return true;
+  }
+
   /**
    * Returns <code>true</code> if this constructor does no real work.
    * 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
index 7b127d2..1b9dc03 100755
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
@@ -27,7 +27,22 @@
 import java.util.List;
 
 /**
- * Base class for any reference type.
+ * Base class for any declared type.
+ *
+ * Declared types have fields and methods. Two of the methods are treated specially: the class
+ * initializer method (named <code>$clinit</code>) and the instance initializer method
+ * (named <code>$init</code>).
+ *
+ * The class initializer method is responsible for initializing all class variables as well as
+ * those of the superclasses (by calling the superclass class initializer method).
+ *
+ * The instance initializer is responsible for initializing all instance variables as well as those
+ * of the superclasses (by calling the superclass instance initializer method).
+ *
+ * Optimizations may eliminate class initializers (<code>$clinit</code>) if no static variables need
+ * initialization, and use the private variable <code>clinitTarget</code>to keep track which
+ * initializer in the superclass chain needs to be called.
+ *
  */
 public abstract class JDeclaredType extends JReferenceType {
 
@@ -48,8 +63,8 @@
   protected transient List<JMethod> methods = Lists.create();
 
   /**
-   * Tracks the target static initialization for this class. Default to self
-   * until removed or set to be a superclass.
+   * Tracks the target static initialization for this class. Default to self (if it has a non
+   * empty initializer) or point to a superclass or be null.
    */
   private JDeclaredType clinitTarget = this;
 
@@ -74,6 +89,26 @@
    */
   private List<JInterfaceType> superInterfaces = Lists.create();
 
+  /**
+   * Determines whether a subclass of this type is in the collection <code>types</code>.
+   *
+   * @param types a collections of types.
+   * @return the first subtype found in the collection  if the collection <code>types</code>
+   *             contains a subtype of this type; null otherwise.
+   */
+  public JDeclaredType findSubtype(Iterable<JDeclaredType> types) {
+    for (JDeclaredType type : types) {
+      JDeclaredType tp = type;
+      while (tp != null) {
+        if (this == tp) {
+          return type;
+        }
+        tp = tp.getSuperClass();
+      }
+    }
+    return null;
+  }
+
   public JDeclaredType(SourceInfo info, String name) {
     super(info, name);
   }
@@ -100,8 +135,12 @@
   /**
    * Adds a method to this type.
    */
-  public void addMethod(JMethod method) {
+  public final void addMethod(JMethod method) {
     assert method.getEnclosingType() == this;
+    assert !method.getName().equals("$clinit") || getMethods().size() == 0 : "Attempted adding "
+        + "$clinit method with index != 0";
+    assert !method.getName().equals("$init") || getMethods().size() == 1 : "Attempted adding $init "
+        + "method with index != 1";
     methods = Lists.add(methods, method);
   }
 
@@ -140,10 +179,40 @@
   }
 
   /**
+   * Returns the instance initializer ($init) method.
+   * Can only be called after making sure the class has an instance initializer method.
+   *
+   * @return The instance initializer method.
+   */
+  public final JMethod getInitMethod() {
+    assert getMethods().size() > 1;
+    JMethod init = this.getMethods().get(1);
+
+    assert init != null;
+    assert init.getName().equals("$init");
+    return init;
+  }
+
+  /**
+   * Returns the class initializer method.
+   * Can only be called after making sure the class has a class initializer method.
+   *
+   * @return The class initializer method.
+   */
+   public final JMethod getClinitMethod() {
+     assert getMethods().size() != 0;
+     JMethod clinit = this.getMethods().get(0);
+
+     assert clinit != null;
+     assert clinit.getName().equals("$clinit");
+     return clinit;
+  }
+
+  /**
    * Returns the class that must be initialized to use this class. May be a
    * superclass, or <code>null</code> if this class has no static initializer.
    */
-  public JDeclaredType getClinitTarget() {
+  public final JDeclaredType getClinitTarget() {
     return clinitTarget;
   }
 
@@ -186,7 +255,7 @@
    * Returns this type's declared methods; does not include methods defined in a
    * super type unless they are overridden by this type.
    */
-  public List<JMethod> getMethods() {
+  public final List<JMethod> getMethods() {
     return methods;
   }
 
@@ -218,7 +287,7 @@
    * Removes the field at the specified index.
    */
   public void removeField(int i) {
-    assert !isExternal() : "External types can not be modiified.";
+    assert !isExternal() : "External types can not be modified.";
     fields = Lists.remove(fields, i);
   }
 
@@ -226,11 +295,23 @@
    * Removes the method at the specified index.
    */
   public void removeMethod(int i) {
-    assert !isExternal() : "External types can not be modiified.";
+    assert !isExternal() : "External types can not be modified.";
     methods = Lists.remove(methods, i);
   }
 
   /**
+   * Resets the clinitTarget to the current class. Used by optimizations that move initializers from
+   * superclasses down.
+   *
+   * Prerequisite: the $clinit method must exist and be non empty.
+   */
+  public void resetClinitTarget() {
+    assert !((JMethodBody) getClinitMethod().getBody()).getStatements().isEmpty() : "Attempted to "
+        + "reset the clinitTarget to an empty $clinit";
+    this.clinitTarget = this;
+  }
+
+  /**
    * Resolves external references during AST stitching.
    */
   public void resolve(List<JInterfaceType> resolvedInterfaces, List<JNode> resolvedRescues) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java
index 675fcf0..53c46e3 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JInstanceOf.java
@@ -45,7 +45,7 @@
 
   @Override
   public boolean hasSideEffects() {
-    return false;
+    return expr.hasSideEffects();
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
index 1f23013..dede802 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
@@ -249,7 +249,11 @@
         sb.append(type.getJsniSignatureName());
       }
       sb.append(')');
-      sb.append(getOriginalReturnType().getJsniSignatureName());
+      if (!isConstructor()) {
+        sb.append(getOriginalReturnType().getJsniSignatureName());
+      } else {
+        sb.append(" <init>");
+      }
       signature = sb.toString();
     }
     return signature;
@@ -267,6 +271,10 @@
     return isAbstract;
   }
 
+  public boolean isConstructor() {
+    return false;
+  }
+
   public boolean isDefault() {
     return access == AccessModifier.DEFAULT.ordinal();
   }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
index ad4542f..bcc1331 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
@@ -231,7 +231,7 @@
 
   public static boolean isClinit(JMethod method) {
     JDeclaredType enclosingType = method.getEnclosingType();
-    if ((enclosingType != null) && (method == enclosingType.getMethods().get(0))) {
+    if ((enclosingType != null) && (method == enclosingType.getClinitMethod())) {
       assert (method.getName().equals("$clinit"));
       return true;
     } else {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
index 8850cb6..5963dd1 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
@@ -729,7 +729,7 @@
     // Track that we've been seen.
     alreadySeen.add(type);
 
-    JMethod method = type.getMethods().get(0);
+    JMethod method = type.getClinitMethod();
     assert (JProgram.isClinit(method));
     CheckClinitVisitor v = new CheckClinitVisitor();
     v.accept(method);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java b/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java
index 347088d..2c871f4 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java
@@ -589,8 +589,19 @@
     return union;
   }
 
-  private static <T> void updateReverseMap(int entry, Map<T, Integer> map, Set<?> liveWithoutEntry,
-      Iterable<T> all) {
+  /**
+   * Performs set difference of <code>all - liveWithoutEntry</code> and confirms the result is in
+   * <code>liveFromSplitPoint</code>. Resulting program statements are recorded in a map
+   * that for each statement indicates it's fragment destination.
+   * @param splitPoint splitPoint number
+   * @param map map of statement to splitpoint number
+   * @param liveWithoutEntry everything live except that reachable from split point
+   * @param all everything reachable in the entire program
+   * @param liveFromSplitPoint everything live from the split point, including leftovers
+   * @param <T> the type of node (field, method, etc) in the map
+   */
+  private static <T> void updateReverseMap(int splitPoint, Map<T, Integer> map, Set<?> liveWithoutEntry,
+                                           Iterable<T> all, Set<?> liveFromSplitPoint) {
     for (T each : all) {
       if (!liveWithoutEntry.contains(each)) {
         /*
@@ -600,7 +611,11 @@
          * been reached. Thus, it can be downloaded along with either i's or j's
          * code.
          */
-        map.put(each, entry);
+        if (!liveFromSplitPoint.contains(each)) {
+          // complement says it should be live, but it is not actually live within the splitpoint
+        } else {
+          map.put(each, splitPoint);
+        }
       }
     }
   }
@@ -642,7 +657,7 @@
 
   /**
    * Maps a split-point number to a fragment number.
-   * 
+   *
    * splitPointToFragmmentMap[x] = y implies split point #x is in fragment #y.
    * 
    * TODO(acleung): We could use some better abstraction for this. I feel this
@@ -716,6 +731,27 @@
   }
 
   /**
+   * Compute everything reachable from the set of input split points.
+   * @param liveAfterInitialSequence everything live in initial fragment
+   * @param splitPoints list of split points to start from
+   * @return
+   */
+  private ControlFlowAnalyzer computeAllLiveFromSplitPoints(
+      ControlFlowAnalyzer liveAfterInitialSequence, List<Integer> splitPoints) {
+     ControlFlowAnalyzer cfa = new ControlFlowAnalyzer(liveAfterInitialSequence);
+     for (JRunAsync otherRunAsync : jprogram.getRunAsyncs()) {
+       if (isInitial(otherRunAsync.getSplitPoint())) {
+         continue;
+       }
+       if (!splitPoints.contains(otherRunAsync.getSplitPoint())) {
+         continue;
+       }
+       cfa.traverseFromRunAsync(otherRunAsync);
+     }
+     return cfa;
+   }
+
+  /**
    * Compute a CFA that covers the entire live code of the program.
    */
   private ControlFlowAnalyzer computeCompleteCfa() {
@@ -773,7 +809,21 @@
     // Step #7: Replaces the splitpoint number with the new fragment number.
     replaceFragmentId();
   }
-  
+
+  /**
+   * Given the set of code initially live, and a set of splitpoints grouped into fragments:
+   * The core algorithm to compute exclusive merged fragments is as follows:
+   * For each fragment (grouping of merged splitpoint numbers)
+   * 1) compute the set of live statements of every splitpoint EXCEPT those in the fragment
+   * 2) compute the set of live statements reachable from those in the fragment
+   * 3) calculate a set difference of everything live minus the results of step 1
+   * 4) filter results by checking for membership in the results of step 2
+   * 5) assign resulting live code to this fragment (recorded in a map)
+   *
+   * The results of these steps are then used to extract individual JavaScript chunks
+   * into blocks corresponding to fragments which are ultimately written to disk.
+   * @param initiallyLive the CFA of code live from the entry point (initial fragments)
+   */
   private void extractStatements(ControlFlowAnalyzer initiallyLive) {
     Map<Integer, List<JsStatement>> fragmentStats = new LinkedHashMap<Integer, List<JsStatement>>();
     
@@ -848,14 +898,20 @@
       }
 
       ControlFlowAnalyzer allButOne = computeAllButNCfas(liveAfterInitialSequence, splitPoints);
+      ControlFlowAnalyzer allFromSplitPoints = computeAllLiveFromSplitPoints(liveAfterInitialSequence, splitPoints);
+
       Set<JNode> allLiveNodes =
           union(allButOne.getLiveFieldsAndMethods(), allButOne.getFieldsWritten());
-      updateReverseMap(i, fragmentMap.fields, allLiveNodes, allFields);
-      updateReverseMap(i, fragmentMap.methods, allButOne.getLiveFieldsAndMethods(), allMethods);
+      Set<JNode> allLiveFromSplitPoints = union(allFromSplitPoints.getLiveFieldsAndMethods(),
+          allFromSplitPoints.getFieldsWritten());
+      updateReverseMap(i, fragmentMap.fields, allLiveNodes, allFields, allLiveFromSplitPoints);
+      updateReverseMap(i, fragmentMap.methods, allButOne.getLiveFieldsAndMethods(), allMethods,
+          allFromSplitPoints.getLiveFieldsAndMethods());
       updateReverseMap(i, fragmentMap.strings, allButOne.getLiveStrings(), everything
-          .getLiveStrings());
+          .getLiveStrings(), allFromSplitPoints.getLiveStrings());
       updateReverseMap(i, fragmentMap.types, declaredTypesIn(allButOne.getInstantiatedTypes()),
-          declaredTypesIn(everything.getInstantiatedTypes()));
+          declaredTypesIn(everything.getInstantiatedTypes()),
+          declaredTypesIn(allFromSplitPoints.getInstantiatedTypes()));
 
       // This mean split point [i] has been merged with another split point, ignore it.
       if (splitPointToFragmentMap[i] != i) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
index f9b3aaa..93485dd 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -226,7 +226,7 @@
 
       // Rescue my clinit (it won't ever be explicitly referenced)
       if (type.hasClinit()) {
-        rescue(type.getMethods().get(0));
+        rescue(type.getClinitMethod());
       }
 
       // JLS 12.4.1: don't rescue my super interfaces just because I'm rescued.
@@ -304,7 +304,7 @@
 
       // Rescue my clinit (it won't ever be explicitly referenced)
       if (type.hasClinit()) {
-        rescue(type.getMethods().get(0));
+        rescue(type.getClinitMethod());
       }
 
       // JLS 12.4.1: don't rescue my super interfaces just because I'm rescued.
@@ -671,7 +671,7 @@
             JField field = (JField) var;
             accept(field.getInitializer());
             referencedTypes.add(field.getEnclosingType());
-            liveFieldsAndMethods.add(field.getEnclosingType().getMethods().get(0));
+            liveFieldsAndMethods.add(field.getEnclosingType().getClinitMethod());
           } else if (argsToRescueIfParameterRead != null && var instanceof JParameter) {
             List<JExpression> list = argsToRescueIfParameterRead.remove(var);
             if (list != null) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java b/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
index 7013f53..0907c57 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
@@ -37,6 +37,7 @@
 import com.google.gwt.dev.jjs.ast.JFieldRef;
 import com.google.gwt.dev.jjs.ast.JForStatement;
 import com.google.gwt.dev.jjs.ast.JIfStatement;
+import com.google.gwt.dev.jjs.ast.JInstanceOf;
 import com.google.gwt.dev.jjs.ast.JIntLiteral;
 import com.google.gwt.dev.jjs.ast.JLiteral;
 import com.google.gwt.dev.jjs.ast.JLocalRef;
@@ -144,10 +145,10 @@
       }
       switch (op) {
         case AND:
-          maybeReplaceMe(x, simplifier.shortCircuitAnd(x, null, lhs, rhs), ctx);
+          maybeReplaceMe(x, Simplifier.and(x), ctx);
           break;
         case OR:
-          maybeReplaceMe(x, simplifier.shortCircuitOr(x, null, lhs, rhs), ctx);
+          maybeReplaceMe(x, Simplifier.or(x), ctx);
           break;
         case BIT_XOR:
           simplifyXor(lhs, rhs, ctx);
@@ -264,13 +265,12 @@
 
     @Override
     public void endVisit(JCastOperation x, Context ctx) {
-      maybeReplaceMe(x, simplifier.cast(x, x.getSourceInfo(), x.getCastType(), x.getExpr()), ctx);
+      maybeReplaceMe(x, Simplifier.cast(x), ctx);
     }
 
     @Override
     public void endVisit(JConditional x, Context ctx) {
-      maybeReplaceMe(x, simplifier.conditional(x, x.getSourceInfo(), x.getType(), x.getIfTest(), x
-          .getThenExpr(), x.getElseExpr()), ctx);
+      maybeReplaceMe(x, Simplifier.conditional(x), ctx);
     }
 
     @Override
@@ -365,8 +365,19 @@
      */
     @Override
     public void endVisit(JIfStatement x, Context ctx) {
-      maybeReplaceMe(x, simplifier.ifStatement(x, x.getSourceInfo(), x.getIfExpr(),
-          x.getThenStmt(), x.getElseStmt(), currentMethod), ctx);
+      maybeReplaceMe(x, Simplifier.ifStatement(x, currentMethod), ctx);
+    }
+
+    /**
+     * Simplify JInstanceOf expression whose output is ignored.
+     */
+    @Override
+    public void endVisit(JInstanceOf x, Context ctx) {
+
+      if (ignoringExpressionOutput.contains(x)) {
+        ctx.replaceMe(x.getExpr());
+        ignoringExpressionOutput.remove(x);
+      }
     }
 
     @Override
@@ -439,6 +450,7 @@
         }
       }
 
+      HashSet<JDeclaredType> clinitsCalled = new HashSet<JDeclaredType>();
       for (int i = 0; i < numRemovableExpressions(x); ++i) {
         JExpression expr = x.exprs.get(i);
         if (!expr.hasSideEffects()) {
@@ -456,6 +468,22 @@
           madeChanges();
           continue;
         }
+
+        // Remove redundant clinits
+        if (expr instanceof JMethodCall && JProgram.isClinit(((JMethodCall) expr).getTarget())) {
+          JDeclaredType enclosingType = ((JMethodCall) expr).getTarget().getEnclosingType();
+          // If a clinit of enclosingType or a subclass of enclosingType has already been
+          // called as part of this JMultiExpression then this clinit call is noop at runtime
+          // and can be statically removed.
+          if (enclosingType.findSubtype(clinitsCalled) != null) {
+            x.exprs.remove(i);
+            --i;
+            madeChanges();
+            continue;
+          } else {
+            clinitsCalled.add(enclosingType);
+          }
+        }
       }
 
       if (x.exprs.size() == 1) {
@@ -522,7 +550,7 @@
         }
       }
       if (x.getOp() == JUnaryOperator.NOT) {
-        maybeReplaceMe(x, simplifier.not(x, x.getSourceInfo(), x.getArg()), ctx);
+        maybeReplaceMe(x, Simplifier.not(x), ctx);
         return;
       } else if (x.getOp() == JUnaryOperator.NEG) {
         maybeReplaceMe(x, simplifyNegate(x, x.getArg()), ctx);
@@ -703,7 +731,7 @@
     }
 
     private JMethodCall createClinitCall(SourceInfo sourceInfo, JDeclaredType targetType) {
-      JMethod clinit = targetType.getClinitTarget().getMethods().get(0);
+      JMethod clinit = targetType.getClinitTarget().getClinitMethod();
       assert (JProgram.isClinit(clinit));
       return new JMethodCall(sourceInfo, null, clinit);
     }
@@ -1173,8 +1201,8 @@
 
     private boolean isTypeIntegral(JType type) {
       return ((type == program.getTypePrimitiveInt()) || (type == program.getTypePrimitiveLong())
-          || (type == program.getTypePrimitiveChar()) || (type == program.getTypePrimitiveByte()) || (type == program
-          .getTypePrimitiveShort()));
+          || (type == program.getTypePrimitiveChar()) || (type == program.getTypePrimitiveByte())
+          || (type == program.getTypePrimitiveShort()));
     }
 
     private boolean isTypeLong(JExpression exp) {
@@ -1326,11 +1354,11 @@
 
     private boolean simplifyAdd(JExpression lhs, JExpression rhs, Context ctx, JType type) {
       if (isLiteralZero(rhs)) {
-        ctx.replaceMe(simplifier.cast(type, lhs));
+        ctx.replaceMe(Simplifier.cast(type, lhs));
         return true;
       }
       if (isLiteralZero(lhs)) {
-        ctx.replaceMe(simplifier.cast(type, rhs));
+        ctx.replaceMe(Simplifier.cast(type, rhs));
         return true;
       }
 
@@ -1371,11 +1399,11 @@
 
     private boolean simplifyDiv(JExpression lhs, JExpression rhs, Context ctx, JType type) {
       if (isLiteralOne(rhs)) {
-        ctx.replaceMe(simplifier.cast(type, lhs));
+        ctx.replaceMe(Simplifier.cast(type, lhs));
         return true;
       }
       if (isLiteralNegativeOne(rhs)) {
-        ctx.replaceMe(simplifyNegate(simplifier.cast(type, lhs)));
+        ctx.replaceMe(simplifyNegate(Simplifier.cast(type, lhs)));
         return true;
       }
 
@@ -1395,27 +1423,27 @@
 
     private boolean simplifyMul(JExpression lhs, JExpression rhs, Context ctx, JType type) {
       if (isLiteralOne(rhs)) {
-        ctx.replaceMe(simplifier.cast(type, lhs));
+        ctx.replaceMe(Simplifier.cast(type, lhs));
         return true;
       }
       if (isLiteralOne(lhs)) {
-        ctx.replaceMe(simplifier.cast(type, rhs));
+        ctx.replaceMe(Simplifier.cast(type, rhs));
         return true;
       }
       if (isLiteralNegativeOne(rhs)) {
-        ctx.replaceMe(simplifyNegate(simplifier.cast(type, lhs)));
+        ctx.replaceMe(simplifyNegate(Simplifier.cast(type, lhs)));
         return true;
       }
       if (isLiteralNegativeOne(lhs)) {
-        ctx.replaceMe(simplifyNegate(simplifier.cast(type, rhs)));
+        ctx.replaceMe(simplifyNegate(Simplifier.cast(type, rhs)));
         return true;
       }
       if (isLiteralZero(rhs) && !lhs.hasSideEffects()) {
-        ctx.replaceMe(simplifier.cast(type, rhs));
+        ctx.replaceMe(Simplifier.cast(type, rhs));
         return true;
       }
       if (isLiteralZero(lhs) && !rhs.hasSideEffects()) {
-        ctx.replaceMe(simplifier.cast(type, lhs));
+        ctx.replaceMe(Simplifier.cast(type, lhs));
         return true;
       }
       return false;
@@ -1451,11 +1479,11 @@
 
     private boolean simplifySub(JExpression lhs, JExpression rhs, Context ctx, JType type) {
       if (isLiteralZero(rhs)) {
-        ctx.replaceMe(simplifier.cast(type, lhs));
+        ctx.replaceMe(Simplifier.cast(type, lhs));
         return true;
       }
       if (isLiteralZero(lhs) && !isTypeFloatOrDouble(type)) {
-        ctx.replaceMe(simplifyNegate(simplifier.cast(type, rhs)));
+        ctx.replaceMe(simplifyNegate(Simplifier.cast(type, rhs)));
         return true;
       }
       return false;
@@ -1541,7 +1569,7 @@
            * Upcast the initializer so that the semantics of any arithmetic on
            * this value is not changed.
            */
-          // TODO(spoon): use simplifier.cast to shorten this
+          // TODO(spoon): use Simplifier.cast to shorten this
           if ((x.getType() instanceof JPrimitiveType) && (lit instanceof JValueLiteral)) {
             JPrimitiveType xTypePrim = (JPrimitiveType) x.getType();
             lit = xTypePrim.coerceLiteral((JValueLiteral) lit);
@@ -1763,13 +1791,11 @@
   }
 
   private final JProgram program;
-  private final Simplifier simplifier;
 
   private final Map<JType, Class<?>> typeClassMap = new IdentityHashMap<JType, Class<?>>();
 
   public DeadCodeElimination(JProgram program) {
     this.program = program;
-    simplifier = new Simplifier(program);
     typeClassMap.put(program.getTypeJavaLangObject(), Object.class);
     typeClassMap.put(program.getTypeJavaLangString(), String.class);
     typeClassMap.put(program.getTypePrimitiveBoolean(), boolean.class);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java
index 959abc1..d7ea10c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/EnumOrdinalizer.java
@@ -667,10 +667,9 @@
 
       if (canBeOrdinal(x)) {
         /*
-         * Cleanup clinit method for ordinalizable enums. Note, method 0 is
-         * always the clinit.
+         * Cleanup clinit method for ordinalizable enums.
          */
-        updateClinit(x.getMethods().get(0));
+        updateClinit(x.getClinitMethod());
 
         /*
          * Remove any static impl mappings for any methods in an ordinal enum
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 1616123..6b86885 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -439,6 +439,7 @@
         JsParameter jsParam = jsCatch.getParameter();
         names.put(arg.getTarget(), jsParam.getName());
         catchMap.put(catchBlock, jsCatch);
+        catchParamIdentifiers.add(jsParam.getName());
 
         push(jsCatch.getScope());
         accept(catchBlock);
@@ -1146,7 +1147,9 @@
       for (int i = 0; i < locals.size(); ++i) {
         JsName name = names.get(x.getLocals().get(i));
         String ident = name.getIdent();
-        if (!alreadySeen.contains(ident)) {
+        if (!alreadySeen.contains(ident)
+            // Catch block params don't need var declarations
+            && !catchParamIdentifiers.contains(name)) {
           alreadySeen.add(ident);
           vars.add(new JsVar(x.getSourceInfo(), name));
         }
@@ -1187,7 +1190,7 @@
           return;
         } else if (type != clinitTarget) {
           // replace the method with its retargeted clinit
-          method = clinitTarget.getMethods().get(0);
+          method = clinitTarget.getClinitMethod();
         }
       }
 
@@ -1774,7 +1777,7 @@
        * refs to super classes are preserved.
        */
       JMethodBody clinitBody =
-          (JMethodBody) program.getTypeClassLiteralHolder().getMethods().get(0).getBody();
+          (JMethodBody) program.getTypeClassLiteralHolder().getClinitMethod().getBody();
       for (JStatement stmt : clinitBody.getStatements()) {
         if (stmt instanceof JDeclarationStatement) {
           generateClassLiteral((JDeclarationStatement) stmt, vars);
@@ -2157,7 +2160,7 @@
         return null;
       }
 
-      JMethod clinitMethod = targetType.getMethods().get(0);
+      JMethod clinitMethod = targetType.getClinitMethod();
       SourceInfo sourceInfo = x.getSourceInfo();
       JsInvocation jsInvocation = new JsInvocation(sourceInfo);
       jsInvocation.setQualifier(names.get(clinitMethod).makeRef(sourceInfo));
@@ -2180,7 +2183,7 @@
         return null;
       }
 
-      JMethod clinitMethod = enclosingType.getClinitTarget().getMethods().get(0);
+      JMethod clinitMethod = enclosingType.getClinitTarget().getClinitMethod();
       SourceInfo sourceInfo = x.getSourceInfo();
       JsInvocation jsInvocation = new JsInvocation(sourceInfo);
       jsInvocation.setQualifier(names.get(clinitMethod).makeRef(sourceInfo));
@@ -2337,6 +2340,8 @@
 
   private final Map<JBlock, JsCatch> catchMap = new IdentityHashMap<JBlock, JsCatch>();
 
+  private final Set<JsName> catchParamIdentifiers = new HashSet<JsName>();
+
   private final Map<JClassType, JsScope> classScopes = new IdentityHashMap<JClassType, JsScope>();
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
index 30102bc..9423eeb 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
@@ -686,8 +686,7 @@
          * explicit this constructor call, in which case the callee will.
          */
         if (!hasExplicitThis) {
-          // $init is always in position 1 (clinit is in 0)
-          JMethod initMethod = curClass.type.getMethods().get(1);
+          JMethod initMethod = curClass.type.getInitMethod();
           JMethodCall initCall = new JMethodCall(info, makeThisRef(info), initMethod);
           block.addStmt(initCall.makeStatement());
         }
@@ -1743,11 +1742,11 @@
       JDeclaredType type = curClass.type;
       /*
        * Make clinits chain to super class (JDT doesn't write code to do this).
-       * Call super class $clinit; $clinit is always in position 0.
+       * Call super class $clinit;
        */
       if (type.getSuperClass() != null) {
-        JMethod myClinit = type.getMethods().get(0);
-        JMethod superClinit = type.getSuperClass().getMethods().get(0);
+        JMethod myClinit = type.getClinitMethod();
+        JMethod superClinit = type.getSuperClass().getClinitMethod();
         JMethodCall superClinitCall = new JMethodCall(myClinit.getSourceInfo(), null, superClinit);
         JMethodBody body = (JMethodBody) myClinit.getBody();
         body.getBlock().addStmt(0, superClinitCall.makeStatement());
@@ -2051,7 +2050,7 @@
       JNewArray newExpr = JNewArray.createInitializers(info, enumArrayType, initializers);
       JFieldRef valuesRef = new JFieldRef(info, null, valuesField, type);
       JDeclarationStatement declStmt = new JDeclarationStatement(info, valuesRef, newExpr);
-      JBlock clinitBlock = ((JMethodBody) type.getMethods().get(0).getBody()).getBlock();
+      JBlock clinitBlock = ((JMethodBody) type.getClinitMethod().getBody()).getBlock();
 
       /*
        * HACKY: the $VALUES array must be initialized immediately after all of
@@ -2374,16 +2373,25 @@
       }
     }
 
+    // Only called on nested instances constructors (explicitConstructorCalls) that are of the
+    // form: outer.super(...) or super(...)
+    //
+    // Will set outer (in the first case) or the implicit enclosing object reference to
+    // be the first parameter of super(...)
     private void processSuperCallThisArgs(ReferenceBinding superClass, JMethodCall call,
         JExpression qualifier, Expression qualification) {
+      // Explicit super calls can only happend inside constructors
+      assert curMethod.scope.isInsideConstructor();
       if (superClass.syntheticEnclosingInstanceTypes() != null) {
-        for (ReferenceBinding targetType : superClass.syntheticEnclosingInstanceTypes()) {
-          if (qualification != null && superClass.enclosingType() == targetType) {
-            assert qualification.resolvedType.erasure().isCompatibleWith(targetType);
-            call.addArg(qualifier);
-          } else {
-            call.addArg(makeThisReference(call.getSourceInfo(), targetType, false, curMethod.scope));
-          }
+        // there can only be ONE immediate enclosing instance.
+        assert superClass.syntheticEnclosingInstanceTypes().length == 1;
+        ReferenceBinding targetType = superClass.syntheticEnclosingInstanceTypes()[0];
+        if (qualification != null) {
+          // Outer object is the qualifier.
+          call.addArg(qualifier);
+        } else {
+          // Get implicit outer object.
+          call.addArg(makeThisReference(call.getSourceInfo(), targetType, false, curMethod.scope));
         }
       }
     }
@@ -2433,9 +2441,9 @@
     private void pushInitializerMethodInfo(FieldDeclaration x, MethodScope scope) {
       JMethod initMeth;
       if (x.isStatic()) {
-        initMeth = curClass.type.getMethods().get(0);
+        initMeth = curClass.type.getClinitMethod();
       } else {
-        initMeth = curClass.type.getMethods().get(1);
+        initMeth = curClass.type.getInitMethod();
       }
       pushMethodInfo(new MethodInfo(initMeth, (JMethodBody) initMeth.getBody(), scope));
     }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java
index d13c0fc..868cd93 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java
@@ -113,7 +113,7 @@
     this.program = program;
     this.typeClassLiteralHolder = program.getTypeClassLiteralHolder();
     this.classLiteralHolderClinitBody =
-        (JMethodBody) typeClassLiteralHolder.getMethods().get(0).getBody();
+        (JMethodBody) typeClassLiteralHolder.getClinitMethod().getBody();
     assert program.getDeclaredTypes().contains(typeClassLiteralHolder);
   }
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java
index 52df25c..be68c72 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/LongCastNormalizer.java
@@ -193,7 +193,7 @@
       if (targetType != longType && arg.getType() != longType) {
         return arg;
       }
-      return simplifier.cast(targetType, arg);
+      return Simplifier.cast(targetType, arg);
     }
   }
 
@@ -202,11 +202,9 @@
   }
 
   private final JProgram program;
-  private final Simplifier simplifier;
 
   private LongCastNormalizer(JProgram program) {
     this.program = program;
-    simplifier = new Simplifier(program);
   }
 
   private void execImpl() {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java b/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java
index 92eb2bb..beaf790 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/MethodInliner.java
@@ -110,7 +110,7 @@
         List<JStatement> stmts = body.getStatements();
 
         if (method.getEnclosingType() != null
-            && method.getEnclosingType().getMethods().get(0) == method && !stmts.isEmpty()) {
+            && method.getEnclosingType().getClinitMethod() == method && !stmts.isEmpty()) {
           // clinit() calls cannot be inlined unless they are empty
           possibleToInline = false;
         } else if (!body.getLocals().isEmpty()) {
@@ -177,7 +177,7 @@
         return null;
       }
 
-      JMethod clinit = targetType.getMethods().get(0);
+      JMethod clinit = targetType.getClinitMethod();
 
       // If the clinit is a non-native, empty body we can optimize it out here
       if (!clinit.isNative() && (((JMethodBody) clinit.getBody())).getStatements().size() == 0) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
index 408afaf..5c53646 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
@@ -202,11 +202,9 @@
    * TODO: support polymorphic calls properly.
    */
   private final Set<JMethod> rescuedMethods = new HashSet<JMethod>();
-  private final Simplifier simplifier;
 
   private SameParameterValueOptimizer(JProgram program) {
     this.program = program;
-    simplifier = new Simplifier(program);
   }
 
   private OptimizerStats execImpl(JNode node) {
@@ -221,7 +219,7 @@
       JValueLiteral valueLiteral = parameterValues.get(parameter);
       if (valueLiteral != null) {
         SubstituteParameterVisitor substituteParameterVisitor =
-            new SubstituteParameterVisitor(parameter, simplifier.cast(parameter.getType(),
+            new SubstituteParameterVisitor(parameter, Simplifier.cast(parameter.getType(),
                 valueLiteral));
         substituteParameterVisitor.accept(parameter.getEnclosingMethod());
         stats.recordModified(substituteParameterVisitor.getNumMods());
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java b/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java
index 66a66bf..65bebe3 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/Simplifier.java
@@ -29,7 +29,6 @@
 import com.google.gwt.dev.jjs.ast.JNode;
 import com.google.gwt.dev.jjs.ast.JPrefixOperation;
 import com.google.gwt.dev.jjs.ast.JPrimitiveType;
-import com.google.gwt.dev.jjs.ast.JProgram;
 import com.google.gwt.dev.jjs.ast.JReturnStatement;
 import com.google.gwt.dev.jjs.ast.JStatement;
 import com.google.gwt.dev.jjs.ast.JType;
@@ -61,7 +60,7 @@
    * Negate the supplied expression if negating it makes the expression shorter.
    * Otherwise, return null.
    */
-  static JExpression maybeUnflipBoolean(JExpression expr) {
+  private static JExpression maybeUnflipBoolean(JExpression expr) {
     if (expr instanceof JUnaryOperation) {
       JUnaryOperation unop = (JUnaryOperation) expr;
       if (unop.getOp() == JUnaryOperator.NOT) {
@@ -79,14 +78,57 @@
     return list.get(list.size() - 1);
   }
 
-  private final JProgram program;
-
-  public Simplifier(JProgram program) {
-    this.program = program;
+  /**
+   * This class provides only static methods. No instances will ever be created.
+   */
+  private Simplifier() {
   }
 
-  public JExpression cast(JExpression original, SourceInfo info, JType type, JExpression exp) {
+  /**
+   * Simplify cast operations. Used when creating a cast in DeadCodeElimination. For simplifying
+   * casts that are actually in the AST, cast(JCastOperation) is used instead.
+   *
+   * <pre>
+   * (int) 1 -> 1
+   * (A) (a,b) -> (a, (A) b)
+   * </pre>
+   *
+   * @param type the Type to cast the expression <code>exp</code> to.
+   * @param exp the current JExpression under the cast as it is being simplified.
+   * @return the simplified expression.
+   */
+  public static JExpression cast(JType type, JExpression exp) {
+    return castImpl(null, exp.getSourceInfo(), type, exp);
+  }
+
+  /**
+   * Simplify cast operations.
+   *
+   * <pre>
+   * (int) 1 -> 1
+   * (A) (a,b) -> (a, (A) b)
+   * </pre>
+   *
+   * @param exp a JCastOperation to be simplified.
+   * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
+   */
+  public static JExpression cast(JCastOperation exp) {
+    return castImpl(exp, exp.getSourceInfo(), exp.getCastType(), exp.getExpr());
+  }
+
+  private static JExpression castImpl(JExpression original, SourceInfo info, JType type,
+      JExpression exp) {
     info = getBestSourceInfo(original, info, exp);
+    if (exp instanceof JMultiExpression) {
+      // (T)(a,b,c) -> a,b,(T) c
+      JMultiExpression expMulti = (JMultiExpression) exp;
+      JMultiExpression newMulti = new JMultiExpression(info);
+      newMulti.exprs.addAll(allButLast(expMulti.exprs));
+      newMulti.exprs.add(castImpl(null, info, type, last(expMulti.exprs)));
+      // TODO(rluble): immediately simplify the resulting multi.
+      // TODO(rluble): refactor common outward JMultiExpression movement.
+      return newMulti;
+    }
     if (type == exp.getType()) {
       return exp;
     }
@@ -105,10 +147,10 @@
      * implicit anyway. Cannot coerce char since that would change the semantics
      * of concat.
      */
-    if (type == program.getTypePrimitiveInt()) {
+    if (type == JPrimitiveType.INT) {
       JType expType = exp.getType();
-      if ((expType == program.getTypePrimitiveShort())
-          || (expType == program.getTypePrimitiveByte())) {
+      if ((expType == JPrimitiveType.SHORT)
+          || (expType == JPrimitiveType.BYTE)) {
         return exp;
       }
     }
@@ -120,11 +162,29 @@
     return new JCastOperation(info, type, exp);
   }
 
-  public JExpression cast(JType type, JExpression exp) {
-    return cast(null, exp.getSourceInfo(), type, exp);
+  /**
+   * Simplify conditional expressions.
+   *
+   * <pre>
+   * (a,b,c)?d:e -> a,b,(c?d:e)
+   * true ? then : else -> then
+   * false ? then : else -> else
+   * cond ? true : else) -> cond || else
+   * cond ? false : else -> !cond && else
+   * cond ? then : true -> !cond || then
+   * cond ? then : false -> cond && then
+   * !cond ? then : else -> cond ? else : then
+   * </pre>
+   *
+   * @param exp a JCondintional to be simplified.
+   * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
+   */
+  public static JExpression conditional(JConditional exp) {
+    return conditionalImpl(exp, exp.getSourceInfo(), exp.getType(), exp.getIfTest(),
+        exp.getThenExpr(), exp.getElseExpr());
   }
 
-  public JExpression conditional(JConditional original, SourceInfo info, JType type,
+  private static JExpression conditionalImpl(JConditional original, SourceInfo info, JType type,
       JExpression condExpr, JExpression thenExpr, JExpression elseExpr) {
     info = getBestSourceInfo(original, info, condExpr);
     if (condExpr instanceof JMultiExpression) {
@@ -133,7 +193,8 @@
       JMultiExpression condMulti = (JMultiExpression) condExpr;
       JMultiExpression newMulti = new JMultiExpression(info);
       newMulti.exprs.addAll(allButLast(condMulti.exprs));
-      newMulti.exprs.add(conditional(null, info, type, last(condMulti.exprs), thenExpr, elseExpr));
+      newMulti.exprs.add(conditionalImpl(null, info, type, last(condMulti.exprs), thenExpr,
+          elseExpr));
       // TODO(spoon): immediately simplify the resulting multi
       return newMulti;
     }
@@ -148,20 +209,20 @@
     } else if (thenExpr instanceof JBooleanLiteral) {
       if (((JBooleanLiteral) thenExpr).getValue()) {
         // e.g. (cond ? true : else) -> cond || else
-        return shortCircuitOr(null, info, condExpr, elseExpr);
+        return orImpl(null, info, condExpr, elseExpr);
       } else {
         // e.g. (cond ? false : else) -> !cond && else
-        JExpression notCondExpr = not(null, condExpr.getSourceInfo(), condExpr);
-        return shortCircuitAnd(null, info, notCondExpr, elseExpr);
+        JExpression notCondExpr = notImpl(null, condExpr.getSourceInfo(), condExpr);
+        return andImpl(null, info, notCondExpr, elseExpr);
       }
     } else if (elseExpr instanceof JBooleanLiteral) {
       if (((JBooleanLiteral) elseExpr).getValue()) {
         // e.g. (cond ? then : true) -> !cond || then
-        JExpression notCondExpr = not(null, condExpr.getSourceInfo(), condExpr);
-        return shortCircuitOr(null, info, notCondExpr, thenExpr);
+        JExpression notCondExpr = notImpl(null, condExpr.getSourceInfo(), condExpr);
+        return orImpl(null, info, notCondExpr, thenExpr);
       } else {
         // e.g. (cond ? then : false) -> cond && then
-        return shortCircuitAnd(null, info, condExpr, thenExpr);
+        return andImpl(null, info, condExpr, thenExpr);
       }
     } else {
       // e.g. (!cond ? then : else) -> (cond ? else : then)
@@ -178,8 +239,31 @@
     return new JConditional(info, type, condExpr, thenExpr, elseExpr);
   }
 
-  public JStatement ifStatement(JIfStatement original, SourceInfo info, JExpression condExpr,
-      JStatement thenStmt, JStatement elseStmt, JMethod currentMethod) {
+  /**
+   * Simplifies an ifthenelse statement.
+   *
+   * <pre>
+   * if(a,b,c) d [else e] -> {a; b; if(c) d [else e]; }
+   * if(true) a [else b] -> a
+   * if(false) a else b -> b
+   * if(notImpl(c)) a else b -> if(c) b else a
+   * if(true) ; else b -> true
+   * if(false) a [else ;] -> false
+   * if(c) ; [else ;] -> c
+   *</pre>
+   *
+   * @param stmt the statement to simplify.
+   * @param currentMethod the method where the statement resides
+   * @return the simplified statement if a simplification could be done and <code>stmt</code>
+   *         otherwise.
+   */
+  public static JStatement ifStatement(JIfStatement stmt,  JMethod currentMethod) {
+    return ifStatementImpl(stmt, stmt.getSourceInfo(), stmt.getIfExpr(),
+        stmt.getThenStmt(), stmt.getElseStmt(), currentMethod);
+  }
+
+  private static JStatement ifStatementImpl(JIfStatement original, SourceInfo info,
+      JExpression condExpr, JStatement thenStmt,JStatement elseStmt, JMethod currentMethod) {
     info = getBestSourceInfo(original, info, condExpr);
     if (condExpr instanceof JMultiExpression) {
       // if(a,b,c) d else e -> {a; b; if(c) d else e; }
@@ -188,7 +272,7 @@
       for (JExpression expr : allButLast(condMulti.exprs)) {
         newBlock.addStmt(expr.makeStatement());
       }
-      newBlock.addStmt(ifStatement(null, info, last(condMulti.exprs), thenStmt, elseStmt,
+      newBlock.addStmt(ifStatementImpl(null, info, last(condMulti.exprs), thenStmt, elseStmt,
           currentMethod));
       // TODO(spoon): immediately simplify the resulting block
       return newBlock;
@@ -221,7 +305,7 @@
         // TODO: this goes away when we normalize the Java AST properly.
         thenStmt = ensureBlock(thenStmt);
         elseStmt = ensureBlock(elseStmt);
-        return ifStatement(null, info, unflipped, elseStmt, thenStmt, currentMethod);
+        return ifStatementImpl(null, info, unflipped, elseStmt, thenStmt, currentMethod);
       }
     }
 
@@ -238,14 +322,27 @@
     return new JIfStatement(info, condExpr, thenStmt, elseStmt);
   }
 
-  public JExpression not(JPrefixOperation original, SourceInfo info, JExpression arg) {
+  /**
+   * Simplifies an negation expression.
+   *
+   * if(a,b,c) d else e -> {a; b; if(c) d else e; }
+   *
+   * @param expr the expression to simplify.
+   * @return the simplified expression if a simplification could be done and <code>expr</code>
+   *         otherwise.
+   */
+  public static JExpression not(JPrefixOperation expr) {
+    return notImpl(expr, expr.getSourceInfo(), expr.getArg());
+  }
+
+  private static JExpression notImpl(JPrefixOperation original, SourceInfo info, JExpression arg) {
     info = getBestSourceInfo(original, info, arg);
     if (arg instanceof JMultiExpression) {
       // !(a,b,c) -> (a,b,!c)
       JMultiExpression argMulti = (JMultiExpression) arg;
       JMultiExpression newMulti = new JMultiExpression(info);
       newMulti.exprs.addAll(allButLast(argMulti.exprs));
-      newMulti.exprs.add(not(null, info, last(argMulti.exprs)));
+      newMulti.exprs.add(notImpl(null, info, last(argMulti.exprs)));
       // TODO(spoon): immediately simplify the newMulti
       return newMulti;
     }
@@ -300,18 +397,39 @@
 
   /**
    * Simplify short circuit AND expressions.
-   * 
+   *
    * <pre>
-   * if (true && isWhatever()) -> if (isWhatever())
-   * if (false && isWhatever()) -> if (false)
-   * 
-   * if (isWhatever() && true) -> if (isWhatever())
-   * if (isWhatever() && false) -> if (false), unless side effects
+   * true && isWhatever() -> isWhatever()
+   * false && isWhatever() -> false
+   *
+   * isWhatever() && true -> isWhatever()
+   * isWhatever() && false -> false, unless side effects
+   *
+   * (a, b) && c -> (a, b && c)
    * </pre>
+   *
+   * @param exp an AND JBinaryExpression to be simplified.
+   * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
+   *
    */
-  public JExpression shortCircuitAnd(JBinaryOperation original, SourceInfo info, JExpression lhs,
+  public static JExpression and(JBinaryOperation exp) {
+    assert exp.getOp() == JBinaryOperator.AND : "Simplifier.and was called with " + exp;
+    return andImpl(exp, null, exp.getLhs(), exp.getRhs());
+  }
+
+  private static JExpression andImpl(JBinaryOperation original, SourceInfo info, JExpression lhs,
       JExpression rhs) {
     info = getBestSourceInfo(original, info, lhs);
+    if (lhs instanceof JMultiExpression) {
+      // (a,b,c)&&d -> a,b,(c&&d)
+      JMultiExpression lhsMulti = (JMultiExpression) lhs;
+      JMultiExpression newMulti = new JMultiExpression(info);
+      newMulti.exprs.addAll(allButLast(lhsMulti.exprs));
+      newMulti.exprs.add(andImpl(null, info, last(lhsMulti.exprs), rhs));
+      // TODO(rluble): immediately simplify the resulting multi.
+      // TODO(rluble): refactor common outward JMultiExpression movement.
+      return newMulti;
+    }
     if (lhs instanceof JBooleanLiteral) {
       JBooleanLiteral booleanLiteral = (JBooleanLiteral) lhs;
       if (booleanLiteral.getValue()) {
@@ -337,18 +455,39 @@
 
   /**
    * Simplify short circuit OR expressions.
-   * 
+   *
    * <pre>
-   * if (true || isWhatever()) -> if (true)
-   * if (false || isWhatever()) -> if (isWhatever())
-   * 
-   * if (isWhatever() || false) -> if (isWhatever())
-   * if (isWhatever() || true) -> if (true), unless side effects
+   * true || isWhatever() -> true
+   * false || isWhatever() -> isWhatever()
+   *
+   * isWhatever() || false isWhatever()
+   * isWhatever() || true -> true, unless side effects
+   *
+   * (a, b) || c -> (a, b || c)
    * </pre>
+   *
+   * @param exp an OR JBinaryExpression to be simplified.
+   * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
+   *
    */
-  public JExpression shortCircuitOr(JBinaryOperation original, SourceInfo info, JExpression lhs,
+  public static JExpression or(JBinaryOperation exp) {
+    assert exp.getOp() == JBinaryOperator.OR : "Simplifier.and was called with " + exp;
+    return orImpl(exp, null, exp.getLhs(), exp.getRhs());
+  }
+
+  private static JExpression orImpl(JBinaryOperation original, SourceInfo info, JExpression lhs,
       JExpression rhs) {
     info = getBestSourceInfo(original, info, lhs);
+    if (lhs instanceof JMultiExpression) {
+      // (a,b,c)|| d -> a,b,(c||d)
+      JMultiExpression lhsMulti = (JMultiExpression) lhs;
+      JMultiExpression newMulti = new JMultiExpression(info);
+      newMulti.exprs.addAll(allButLast(lhsMulti.exprs));
+      newMulti.exprs.add(orImpl(null, info, last(lhsMulti.exprs), rhs));
+      // TODO(rluble): immediately simplify the resulting multi.
+      // TODO(rluble): refactor common outward JMultiExpression movement.
+      return newMulti;
+    }
     if (lhs instanceof JBooleanLiteral) {
       JBooleanLiteral booleanLiteral = (JBooleanLiteral) lhs;
       if (booleanLiteral.getValue()) {
@@ -356,7 +495,6 @@
       } else {
         return rhs;
       }
-
     } else if (rhs instanceof JBooleanLiteral) {
       JBooleanLiteral booleanLiteral = (JBooleanLiteral) rhs;
       if (!booleanLiteral.getValue()) {
@@ -372,7 +510,7 @@
     return new JBinaryOperation(info, rhs.getType(), JBinaryOperator.OR, lhs, rhs);
   }
 
-  private JStatement ensureBlock(JStatement stmt) {
+  private static JStatement ensureBlock(JStatement stmt) {
     if (stmt == null) {
       return null;
     }
@@ -384,7 +522,7 @@
     return stmt;
   }
 
-  private JExpression extractExpression(JStatement stmt) {
+  private static JExpression extractExpression(JStatement stmt) {
     if (stmt instanceof JExpressionStatement) {
       JExpressionStatement statement = (JExpressionStatement) stmt;
       return statement.getExpr();
@@ -393,7 +531,7 @@
     return null;
   }
 
-  private JStatement extractSingleStatement(JStatement stmt) {
+  private static JStatement extractSingleStatement(JStatement stmt) {
     if (stmt instanceof JBlock) {
       JBlock block = (JBlock) stmt;
       if (block.getStatements().size() == 1) {
@@ -404,7 +542,15 @@
     return stmt;
   }
 
-  private SourceInfo getBestSourceInfo(JNode original, SourceInfo info, JNode defaultNode) {
+  /**
+   * Determine the best SourceInfo to use in a particular transformation.
+   *
+   * @param original the original node that is being transformed. Can be <code>null</code>.
+   * @param info an explicit SourceInfo that might be used, Can be <code>null</code>.
+   * @param defaultNode a node from where to obtain the SourceInfo.
+   * @return a SourceInfo chosen according to the following priority info>original>default.
+   */
+  private static SourceInfo getBestSourceInfo(JNode original, SourceInfo info, JNode defaultNode) {
     if (info == null) {
       if (original == null) {
         info = defaultNode.getSourceInfo();
@@ -415,7 +561,7 @@
     return info;
   }
 
-  private JStatement rewriteIfIntoBoolean(SourceInfo sourceInfo, JExpression condExpr,
+  private static JStatement rewriteIfIntoBoolean(SourceInfo sourceInfo, JExpression condExpr,
       JStatement thenStmt, JStatement elseStmt, JMethod currentMethod) {
     thenStmt = extractSingleStatement(thenStmt);
     elseStmt = extractSingleStatement(elseStmt);
@@ -466,7 +612,7 @@
         }
 
         JBinaryOperation binaryOperation =
-            new JBinaryOperation(sourceInfo, program.getTypeVoid(), binaryOperator, condExpr,
+            new JBinaryOperation(sourceInfo, JPrimitiveType.VOID, binaryOperator, condExpr,
                 thenExpression);
 
         return binaryOperation.makeStatement();
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
index d93006c..70ec21c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
@@ -870,10 +870,13 @@
       if (!tightener.didChange()) {
         break;
       }
+    }
 
+    if (stats.didChange()) {
       FixDanglingRefsVisitor fixer = new FixDanglingRefsVisitor();
       fixer.accept(program);
     }
+
     return stats;
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java b/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
index b6967c4..5aa134c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
@@ -498,7 +498,7 @@
    */
   private final Set<JNode> liveFieldsAndMethods = new IdentityHashSet<JNode>();
 
-  private TreeLogger logger;
+  private final TreeLogger logger;
   private Set<JMethod> magicMethodCalls = new IdentityHashSet<JMethod>();
   private final Map<String, JMethod> methodMap = new HashMap<String, JMethod>();
   private final JJSOptions options;
@@ -515,8 +515,9 @@
   private final Map<String, List<JMethod>> virtualMethodsPending =
       new java.util.HashMap<String, List<JMethod>>();
 
-  public UnifyAst(JProgram program, JsProgram jsProgram, JJSOptions options,
+  public UnifyAst(TreeLogger logger, JProgram program, JsProgram jsProgram, JJSOptions options,
       RebindPermutationOracle rpo) {
+    this.logger = logger;
     this.program = program;
     this.jsProgram = jsProgram;
     this.options = options;
@@ -538,8 +539,7 @@
    * Special AST construction, useful for tests. Everything is resolved,
    * translated, and unified.
    */
-  public void buildEverything(TreeLogger logger) throws UnableToCompleteException {
-    this.logger = logger;
+  public void buildEverything() throws UnableToCompleteException {
     for (String internalName : classFileMap.keySet()) {
       String typeName = InternalName.toBinaryName(internalName);
       searchForTypeByBinary(typeName);
@@ -568,9 +568,7 @@
    * entry points. This reduces memory and improves compile speed. Any
    * unreachable elements are pruned.
    */
-  public void exec(TreeLogger logger) throws UnableToCompleteException {
-    this.logger = logger;
-
+  public void exec() throws UnableToCompleteException {
     // Trace execution from entry points.
     for (JMethod entryMethod : program.getEntryMethods()) {
       flowInto(entryMethod);
@@ -641,7 +639,7 @@
       }
 
       // Special clinit handling.
-      JMethod clinit = type.getMethods().get(0);
+      JMethod clinit = type.getClinitMethod();
       if (!liveFieldsAndMethods.contains(clinit)) {
         clinit.setBody(new JMethodBody(SourceOrigin.UNKNOWN));
       }
@@ -994,7 +992,7 @@
       assert errorsFound;
       return;
     }
-    JMethod clinit = type.getMethods().get(0);
+    JMethod clinit = type.getClinitMethod();
     if (!liveFieldsAndMethods.contains(clinit)) {
       flowInto(clinit);
       if (type.getSuperClass() != null) {
diff --git a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
deleted file mode 100644
index 9e7ead7..0000000
--- a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
+++ /dev/null
@@ -1,991 +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.dev.shell;
-
-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.impl.HostedModeLinker;
-import com.google.gwt.core.ext.linker.impl.StandardLinkerContext;
-import com.google.gwt.dev.cfg.ModuleDef;
-import com.google.gwt.dev.cfg.ModuleDefLoader;
-import com.google.gwt.dev.jjs.JJSOptionsImpl;
-import com.google.gwt.dev.resource.Resource;
-import com.google.gwt.dev.shell.log.ServletContextTreeLogger;
-import com.google.gwt.dev.util.HttpHeaders;
-import com.google.gwt.dev.util.Util;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
-import com.google.gwt.util.tools.Utility;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Built-in servlet for convenient access to the public path of a specified
- * module.
- */
-public class GWTShellServlet extends HttpServlet {
-
-  private static class RequestParts {
-    public final String moduleName;
-
-    public final String partialPath;
-
-    public RequestParts(HttpServletRequest request)
-        throws UnableToCompleteException {
-      String pathInfo = request.getPathInfo();
-      if (pathInfo != null) {
-        int slash = pathInfo.indexOf('/', 1);
-        if (slash != -1) {
-          moduleName = pathInfo.substring(1, slash);
-          partialPath = pathInfo.substring(slash + 1);
-          return;
-        } else {
-          moduleName = pathInfo.substring(1);
-          partialPath = null;
-          return;
-        }
-      }
-      throw new UnableToCompleteException();
-    }
-  }
-
-  /**
-   * This the default cache time in seconds for files that aren't either
-   * *.cache.*, *.nocache.*.
-   */
-  private static final int DEFAULT_CACHE_SECONDS = 5;
-
-  private static final String XHTML_MIME_TYPE = "application/xhtml+xml";
-
-  /**
-   * Must keep only weak references to ModuleDefs else we permanently pin them.
-   */
-  private final Map<String, ModuleDef> loadedModulesByName = new MapMaker().weakValues().makeMap();
-
-  /**
-   * The lifetime of the module pins the lifetime of the associated servlet;
-   * this is because the loaded servlet has a weak backRef to its live module
-   * through its context. When the module dies, the servlet needs to die also.
-   */
-  private final Map<ModuleDef, Map<String, HttpServlet>> loadedServletsByModuleAndClassName =
-      new MapMaker().weakKeys().makeMap();
-
-  private final Map<String, String> mimeTypes = new HashMap<String, String>();
-
-  /**
-   * Only for backwards compatibility. Shouldn't we remove this now?
-   */
-  private final Map<String, ModuleDef> modulesByServletPath = new MapMaker().weakValues().makeMap();
-
-  private int nextRequestId;
-
-  private final Object requestIdLock = new Object();
-
-  private TreeLogger topLogger;
-
-  private WorkDirs workDirs;
-
-  public GWTShellServlet() {
-    initMimeTypes();
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest request, HttpServletResponse response)
-      throws ServletException, IOException {
-    processFileRequest(request, response);
-  }
-
-  @Override
-  protected void doPost(HttpServletRequest request, HttpServletResponse response)
-      throws ServletException, IOException {
-    processFileRequest(request, response);
-  }
-
-  protected void processFileRequest(HttpServletRequest request,
-      HttpServletResponse response) throws IOException {
-
-    String pathInfo = request.getPathInfo();
-    if (pathInfo.length() == 0 || pathInfo.equals("/")) {
-      response.setContentType("text/html");
-      PrintWriter writer = response.getWriter();
-      writer.println("<html><body><basefont face='arial'>");
-      writer.println("To launch an application, specify a URL of the form <code>/<i>module</i>/<i>file.html</i></code>");
-      writer.println("</body></html>");
-      return;
-    }
-
-    TreeLogger logger = getLogger();
-
-    // Parse the request assuming it is module/resource.
-    //
-    RequestParts parts;
-    try {
-      parts = new RequestParts(request);
-    } catch (UnableToCompleteException e) {
-      sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
-          "Don't know what to do with this URL: '" + pathInfo + "'");
-      return;
-    }
-
-    String partialPath = parts.partialPath;
-    String moduleName = parts.moduleName;
-
-    // If the module is renamed, substitute the renamed module name
-    ModuleDef moduleDef = loadedModulesByName.get(moduleName);
-    if (moduleDef != null) {
-      moduleName = moduleDef.getName();
-    }
-
-    if (partialPath == null) {
-      // Redir back to the same URL but ending with a slash.
-      //
-      response.sendRedirect(moduleName + "/");
-      return;
-    } else if (partialPath.length() > 0) {
-      // Both the module name and a resource.
-      //
-      doGetPublicFile(request, response, logger, partialPath, moduleName);
-      return;
-    } else {
-      // Was just the module name, ending with a slash.
-      //
-      doGetModule(request, response, logger, parts);
-      return;
-    }
-  }
-
-  @Override
-  protected void service(HttpServletRequest request,
-      HttpServletResponse response) throws ServletException, IOException {
-
-    TreeLogger logger = getLogger();
-    int id = allocateRequestId();
-    if (logger.isLoggable(TreeLogger.TRACE)) {
-      StringBuffer url = request.getRequestURL();
-
-      // Branch the logger in case we decide to log more below.
-      logger = logger.branch(TreeLogger.TRACE, "Request " + id + ": " + url,
-          null);
-    }
-
-    String servletClassName = null;
-    ModuleDef moduleDef = null;
-
-    try {
-      // Attempt to split the URL into module/path, which we'll use to see
-      // if we can map the request to a module's servlet.
-      RequestParts parts = new RequestParts(request);
-
-      if ("favicon.ico".equalsIgnoreCase(parts.moduleName)) {
-        sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
-            "Icon not available");
-        return;
-      }
-
-      // See if the request references a module we know.
-      moduleDef = getModuleDef(logger, parts.moduleName);
-      if (moduleDef != null) {
-        // Okay, we know this module. Do we know this servlet path?
-        // It is right to prepend the slash because (1) ModuleDefSchema requires
-        // every servlet path to begin with a slash and (2) RequestParts always
-        // rips off the leading slash.
-        String servletPath = "/" + parts.partialPath;
-        servletClassName = moduleDef.findServletForPath(servletPath);
-
-        // Fall-through below, where we check servletClassName.
-      } else {
-        // Fall-through below, where we check servletClassName.
-      }
-    } catch (UnableToCompleteException e) {
-      // Do nothing, since it was speculative anyway.
-    }
-
-    // BEGIN BACKWARD COMPATIBILITY
-    if (servletClassName == null) {
-      // Try to map a bare path that isn't preceded by the module name.
-      // This is no longer the recommended practice, so we warn.
-      String path = request.getPathInfo();
-      moduleDef = modulesByServletPath.get(path);
-      if (moduleDef != null) {
-        // See if there is a servlet we can delegate to for the given url.
-        servletClassName = moduleDef.findServletForPath(path);
-
-        if (servletClassName != null) {
-          TreeLogger branch = logger.branch(TreeLogger.WARN,
-              "Use of deprecated hosted mode servlet path mapping", null);
-          branch.log(
-              TreeLogger.WARN,
-              "The client code is invoking the servlet with a URL that is not module-relative: "
-                  + path, null);
-          branch.log(
-              TreeLogger.WARN,
-              "Prepend GWT.getModuleBaseURL() to the URL in client code to create a module-relative URL: /"
-                  + moduleDef.getName() + path, null);
-          branch.log(
-              TreeLogger.WARN,
-              "Using module-relative URLs ensures correct URL-independent behavior in external servlet containers",
-              null);
-        }
-
-        // Fall-through below, where we check servletClassName.
-      } else {
-        // Fall-through below, where we check servletClassName.
-      }
-    }
-    // END BACKWARD COMPATIBILITY
-
-    // Load/get the servlet if we found one.
-    if (servletClassName != null) {
-      HttpServlet delegatee = tryGetOrLoadServlet(logger, moduleDef,
-          servletClassName);
-      if (delegatee == null) {
-        logger.log(TreeLogger.ERROR, "Unable to dispatch request", null);
-        sendErrorResponse(response,
-            HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-            "Unable to find/load mapped servlet class '" + servletClassName
-                + "'");
-        return;
-      }
-
-      // Delegate everything to the downstream servlet and we're done.
-      delegatee.service(request, response);
-    } else {
-      // Use normal default processing on this request, since we couldn't
-      // recognize it as anything special.
-      super.service(request, response);
-    }
-  }
-
-  private int allocateRequestId() {
-    synchronized (requestIdLock) {
-      return nextRequestId++;
-    }
-  }
-
-  /**
-   * Handle auto-generated resources.
-   * 
-   * @return <code>true</code> if a resource was generated
-   */
-  private boolean autoGenerateResources(HttpServletRequest request,
-      HttpServletResponse response, TreeLogger logger, String partialPath,
-      String moduleName) throws IOException {
-
-    if (partialPath.equals(moduleName + ".nocache.js")) {
-      if (request.getParameter("compiled") == null) {
-        // Generate the .js file.
-        try {
-          String js = genSelectionScript(logger, moduleName);
-          setResponseCacheHeaders(response, 0); // do not cache selection script
-          response.setStatus(HttpServletResponse.SC_OK);
-          response.setContentType("text/javascript");
-          response.getWriter().println(js);
-          return true;
-        } catch (UnableToCompleteException e) {
-          // The error will have already been logged. Continue, since this could
-          // actually be a request for a static file that happens to have an
-          // unfortunately confusing name.
-        }
-      }
-    } else if (partialPath.equals("hosted.html")) {
-      String html = HostedModeLinker.getHostedHtml();
-      setResponseCacheHeaders(response, DEFAULT_CACHE_SECONDS);
-      response.setStatus(HttpServletResponse.SC_OK);
-      response.setContentType("text/html");
-      response.getWriter().println(html);
-      return true;
-    }
-
-    return false;
-  }
-
-  private void doGetModule(HttpServletRequest request,
-      HttpServletResponse response, TreeLogger logger, RequestParts parts)
-      throws IOException {
-
-    // Generate a generic empty host page.
-    //
-    String msg = "The development shell servlet received a request to generate a host page for module '"
-        + parts.moduleName + "' ";
-
-    logger = logger.branch(TreeLogger.TRACE, msg, null);
-
-    try {
-      // Try to load the module just to make sure it'll work.
-      getModuleDef(logger, parts.moduleName);
-    } catch (UnableToCompleteException e) {
-      sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
-          "Unable to find/load module '" + Util.escapeXml(parts.moduleName)
-              + "' (see server log for details)");
-      return;
-    }
-
-    response.setContentType("text/html");
-    PrintWriter writer = response.getWriter();
-    writer.println("<html><head>");
-    writer.print("<script language='javascript' src='");
-    writer.print(parts.moduleName);
-    writer.println(".nocache.js'></script>");
-
-    // Create a property for each query param.
-    Map<String, String[]> params = getParameterMap(request);
-    for (Map.Entry<String, String[]> entry : params.entrySet()) {
-      String[] values = entry.getValue();
-      if (values.length > 0) {
-        writer.print("<meta name='gwt:property' content='");
-        writer.print(entry.getKey());
-        writer.print("=");
-        writer.print(values[values.length - 1]);
-        writer.println("'>");
-      }
-    }
-
-    writer.println("</head><body>");
-    writer.println("<iframe src=\"javascript:''\" id='__gwt_historyFrame' "
-        + "style='position:absolute;width:0;height:0;border:0'></iframe>");
-    writer.println("<noscript>");
-    writer.println("  <div style=\"width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif\">");
-    writer.println("    Your web browser must have JavaScript enabled");
-    writer.println("    in order for this application to display correctly.");
-    writer.println("  </div>");
-    writer.println("</noscript>");
-    writer.println("</body></html>");
-
-    // Done.
-  }
-
-  /**
-   * Fetch a file and return it as the HTTP response, setting the cache-related
-   * headers according to the name of the file (see
-   * {@link #getCacheTime(String)}). This function honors If-Modified-Since to
-   * minimize the impact of limiting caching of files for development.
-   * 
-   * @param request the HTTP request
-   * @param response the HTTP response
-   * @param logger a TreeLogger to use for debug output
-   * @param partialPath the path within the module
-   * @param moduleName the name of the module
-   * @throws IOException
-   */
-  @SuppressWarnings("deprecation")
-  private void doGetPublicFile(HttpServletRequest request,
-      HttpServletResponse response, TreeLogger logger, String partialPath,
-      String moduleName) throws IOException {
-
-    // Create a logger branch for this request.
-    logger = logger.branch(TreeLogger.TRACE,
-        "The development shell servlet received a request for '"
-        + partialPath + "' in module '" + moduleName + ".gwt.xml' ", null);
-
-    // Handle auto-generation of resources.
-    if (shouldAutoGenerateResources()) {
-      if (autoGenerateResources(request, response, logger, partialPath,
-          moduleName)) {
-        return;
-      }
-    }
-
-    URL foundResource = null;
-    try {
-      // Look for the requested file on the public path.
-      //
-      ModuleDef moduleDef = getModuleDef(logger, moduleName);
-      if (shouldAutoGenerateResources()) {
-        Resource publicResource = moduleDef.findPublicFile(partialPath);
-        if (publicResource != null) {
-          foundResource = publicResource.getURL();
-        }
-
-        if (foundResource == null) {
-          // Look for public generated files
-          File shellDir = getShellWorkDirs().getShellPublicGenDir(moduleDef);
-          File requestedFile = new File(shellDir, partialPath);
-          if (requestedFile.exists()) {
-            try {
-              foundResource = requestedFile.toURI().toURL();
-            } catch (MalformedURLException e) {
-              // ignore since it was speculative anyway
-            }
-          }
-        }
-      }
-
-      /*
-       * If the user is coming from compiled web-mode, check the linker output
-       * directory for the real bootstrap file.
-       */
-      if (foundResource == null) {
-        File moduleDir = getShellWorkDirs().getCompilerOutputDir(moduleDef);
-        File requestedFile = new File(moduleDir, partialPath);
-        if (requestedFile.exists()) {
-          try {
-            foundResource = requestedFile.toURI().toURL();
-          } catch (MalformedURLException e) {
-            // ignore since it was speculative anyway
-          }
-        }
-      }
-
-      if (foundResource == null) {
-        String msg;
-        if ("gwt.js".equals(partialPath)) {
-          msg = "Loading the old 'gwt.js' bootstrap script is no longer supported; please load '"
-              + moduleName + ".nocache.js' directly";
-        } else {
-          msg = "Resource not found: " + partialPath + "; "
-              + "(could a file be missing from the public path or a <servlet> "
-              + "tag misconfigured in module " + moduleName + ".gwt.xml ?)";
-        }
-        logger.log(TreeLogger.WARN, msg, null);
-        throw new UnableToCompleteException();
-      }
-    } catch (UnableToCompleteException e) {
-      sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND,
-          "Cannot find resource '" + partialPath
-              + "' in the public path of module '" + moduleName + "'");
-      return;
-    }
-
-    // Get the MIME type.
-    String path = foundResource.toExternalForm();
-    String mimeType = null;
-    try {
-      mimeType = getServletContext().getMimeType(path);
-    } catch (UnsupportedOperationException e) {
-      // Certain minimalist servlet containers throw this.
-      // Fall through to guess the type.
-    }
-
-    if (mimeType == null) {
-      mimeType = guessMimeType(path);
-      if (logger.isLoggable(TreeLogger.TRACE)) {
-        logger.log(TreeLogger.TRACE, "Guessed MIME type '" + mimeType + "'", null);
-      }
-    }
-
-    maybeIssueXhtmlWarning(logger, mimeType, partialPath);
-
-    long cacheSeconds = getCacheTime(path);
-
-    InputStream is = null;
-    try {
-      // Check for up-to-datedness.
-      URLConnection conn = foundResource.openConnection();
-      long lastModified = conn.getLastModified();
-      if (isNotModified(request, lastModified)) {
-        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-        setResponseCacheHeaders(response, cacheSeconds);
-        return;
-      }
-
-      // Set up headers to really send it.
-      response.setStatus(HttpServletResponse.SC_OK);
-      long now = new Date().getTime();
-      response.setHeader(HttpHeaders.DATE,
-          HttpHeaders.toInternetDateFormat(now));
-      response.setContentType(mimeType);
-      String lastModifiedStr = HttpHeaders.toInternetDateFormat(lastModified);
-      response.setHeader(HttpHeaders.LAST_MODIFIED, lastModifiedStr);
-
-      // Expiration header. Either immediately stale (requiring an
-      // "If-Modified-Since") or infinitely cacheable (not requiring even a
-      // freshness check).
-      setResponseCacheHeaders(response, cacheSeconds);
-
-      // Content length.
-      int contentLength = conn.getContentLength();
-      if (contentLength >= 0) {
-        response.setHeader(HttpHeaders.CONTENT_LENGTH,
-            Integer.toString(contentLength));
-      }
-
-      // Send the bytes.
-      is = conn.getInputStream();
-      streamOut(is, response.getOutputStream(), 1024 * 8);
-    } finally {
-      Utility.close(is);
-    }
-  }
-
-  /**
-   * Generates a module.js file on the fly. Note that the nocache file that is
-   * generated that can only be used for hosted mode. It cannot produce a web
-   * mode version, since this servlet doesn't know strong names, since by
-   * definition of "hosted mode" JavaScript hasn't been compiled at this point.
-   */
-  private String genSelectionScript(TreeLogger logger, String moduleName)
-      throws UnableToCompleteException {
-    if (logger.isLoggable(TreeLogger.TRACE)) {
-      logger.log(TreeLogger.TRACE,
-          "Generating a script selection script for module " + moduleName);
-    }
-    ModuleDef module = getModuleDef(logger, moduleName);
-    StandardLinkerContext context = new StandardLinkerContext(logger, module,
-        new JJSOptionsImpl());
-    ArtifactSet artifacts = context.getArtifactsForPublicResources(logger,
-        module);
-    HostedModeLinker linker = new HostedModeLinker();
-    return linker.generateSelectionScript(logger, context, artifacts);
-  }
-
-  /**
-   * Get the length of time a given file should be cacheable. If the path
-   * contains *.nocache.*, it is never cacheable; if it contains *.cache.*, it
-   * is infinitely cacheable; anything else gets a default time.
-   * 
-   * @return cache time in seconds, or 0 if the file is not cacheable at all
-   */
-  private long getCacheTime(String path) {
-    int lastDot = path.lastIndexOf('.');
-    if (lastDot >= 0) {
-      String prefix = path.substring(0, lastDot);
-      if (prefix.endsWith(".cache")) {
-        // RFC2616 says to never give a cache time of more than a year
-        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21
-        return HttpHeaders.SEC_YR;
-      } else if (prefix.endsWith(".nocache")) {
-        return 0;
-      }
-    }
-    return DEFAULT_CACHE_SECONDS;
-  }
-
-  private synchronized TreeLogger getLogger() {
-    if (topLogger == null) {
-      ServletContext servletContext = getServletContext();
-      final String attr = "com.google.gwt.dev.shell.logger";
-      topLogger = (TreeLogger) servletContext.getAttribute(attr);
-      if (topLogger == null) {
-        // No shell available, so wrap the regular servlet context logger.
-        //
-        topLogger = new ServletContextTreeLogger(servletContext);
-      }
-    }
-    return topLogger;
-  }
-
-  /**
-   * We don't actually log this on purpose since the client does anyway.
-   */
-  private ModuleDef getModuleDef(TreeLogger logger, String moduleName)
-      throws UnableToCompleteException {
-    synchronized (loadedModulesByName) {
-      ModuleDef moduleDef = loadedModulesByName.get(moduleName);
-      if (moduleDef == null) {
-        moduleDef = ModuleDefLoader.loadFromClassPath(logger, moduleName, false);
-        loadedModulesByName.put(moduleName, moduleDef);
-        loadedModulesByName.put(moduleDef.getName(), moduleDef);
-
-        // BEGIN BACKWARD COMPATIBILITY
-        // The following map of servlet path to module is included only
-        // for backward-compatibility. We are going to remove this functionality
-        // when we go out of beta. The new behavior is that the client should
-        // specify the module name as part of the URL and construct it using
-        // getModuleBaseURL().
-        String[] servletPaths = moduleDef.getServletPaths();
-        for (int i = 0; i < servletPaths.length; i++) {
-          modulesByServletPath.put(servletPaths[i], moduleDef);
-        }
-        // END BACKWARD COMPATIBILITY
-      }
-      return moduleDef;
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  private Map<String, String[]> getParameterMap(HttpServletRequest request) {
-    return request.getParameterMap();
-  }
-
-  private synchronized WorkDirs getShellWorkDirs() {
-    if (workDirs == null) {
-      ServletContext servletContext = getServletContext();
-      final String attr = "com.google.gwt.dev.shell.workdirs";
-      workDirs = (WorkDirs) servletContext.getAttribute(attr);
-      assert (workDirs != null);
-    }
-    return workDirs;
-  }
-
-  private String guessMimeType(String fullPath) {
-    int dot = fullPath.lastIndexOf('.');
-    if (dot != -1) {
-      String ext = fullPath.substring(dot + 1);
-      String mimeType = mimeTypes.get(ext);
-      if (mimeType != null) {
-        return mimeType;
-      }
-
-      // Otherwise, fall through.
-      //
-    }
-
-    // Last resort.
-    //
-    return "application/octet-stream";
-  }
-
-  private void initMimeTypes() {
-    mimeTypes.put("abs", "audio/x-mpeg");
-    mimeTypes.put("ai", "application/postscript");
-    mimeTypes.put("aif", "audio/x-aiff");
-    mimeTypes.put("aifc", "audio/x-aiff");
-    mimeTypes.put("aiff", "audio/x-aiff");
-    mimeTypes.put("aim", "application/x-aim");
-    mimeTypes.put("art", "image/x-jg");
-    mimeTypes.put("asf", "video/x-ms-asf");
-    mimeTypes.put("asx", "video/x-ms-asf");
-    mimeTypes.put("au", "audio/basic");
-    mimeTypes.put("avi", "video/x-msvideo");
-    mimeTypes.put("avx", "video/x-rad-screenplay");
-    mimeTypes.put("bcpio", "application/x-bcpio");
-    mimeTypes.put("bin", "application/octet-stream");
-    mimeTypes.put("bmp", "image/bmp");
-    mimeTypes.put("body", "text/html");
-    mimeTypes.put("cdf", "application/x-cdf");
-    mimeTypes.put("cer", "application/x-x509-ca-cert");
-    mimeTypes.put("class", "application/java");
-    mimeTypes.put("cpio", "application/x-cpio");
-    mimeTypes.put("csh", "application/x-csh");
-    mimeTypes.put("css", "text/css");
-    mimeTypes.put("dib", "image/bmp");
-    mimeTypes.put("doc", "application/msword");
-    mimeTypes.put("dtd", "text/plain");
-    mimeTypes.put("dv", "video/x-dv");
-    mimeTypes.put("dvi", "application/x-dvi");
-    mimeTypes.put("eps", "application/postscript");
-    mimeTypes.put("etx", "text/x-setext");
-    mimeTypes.put("exe", "application/octet-stream");
-    mimeTypes.put("gif", "image/gif");
-    mimeTypes.put("gtar", "application/x-gtar");
-    mimeTypes.put("gz", "application/x-gzip");
-    mimeTypes.put("hdf", "application/x-hdf");
-    mimeTypes.put("hqx", "application/mac-binhex40");
-    mimeTypes.put("htc", "text/x-component");
-    mimeTypes.put("htm", "text/html");
-    mimeTypes.put("html", "text/html");
-    mimeTypes.put("hqx", "application/mac-binhex40");
-    mimeTypes.put("ief", "image/ief");
-    mimeTypes.put("jad", "text/vnd.sun.j2me.app-descriptor");
-    mimeTypes.put("jar", "application/java-archive");
-    mimeTypes.put("java", "text/plain");
-    mimeTypes.put("jnlp", "application/x-java-jnlp-file");
-    mimeTypes.put("jpe", "image/jpeg");
-    mimeTypes.put("jpeg", "image/jpeg");
-    mimeTypes.put("jpg", "image/jpeg");
-    mimeTypes.put("js", "text/javascript");
-    mimeTypes.put("jsf", "text/plain");
-    mimeTypes.put("jspf", "text/plain");
-    mimeTypes.put("kar", "audio/x-midi");
-    mimeTypes.put("latex", "application/x-latex");
-    mimeTypes.put("m3u", "audio/x-mpegurl");
-    mimeTypes.put("mac", "image/x-macpaint");
-    mimeTypes.put("man", "application/x-troff-man");
-    mimeTypes.put("me", "application/x-troff-me");
-    mimeTypes.put("mid", "audio/x-midi");
-    mimeTypes.put("midi", "audio/x-midi");
-    mimeTypes.put("mif", "application/x-mif");
-    mimeTypes.put("mov", "video/quicktime");
-    mimeTypes.put("movie", "video/x-sgi-movie");
-    mimeTypes.put("mp1", "audio/x-mpeg");
-    mimeTypes.put("mp2", "audio/x-mpeg");
-    mimeTypes.put("mp3", "audio/x-mpeg");
-    mimeTypes.put("mpa", "audio/x-mpeg");
-    mimeTypes.put("mpe", "video/mpeg");
-    mimeTypes.put("mpeg", "video/mpeg");
-    mimeTypes.put("mpega", "audio/x-mpeg");
-    mimeTypes.put("mpg", "video/mpeg");
-    mimeTypes.put("mpv2", "video/mpeg2");
-    mimeTypes.put("ms", "application/x-wais-source");
-    mimeTypes.put("nc", "application/x-netcdf");
-    mimeTypes.put("oda", "application/oda");
-    mimeTypes.put("pbm", "image/x-portable-bitmap");
-    mimeTypes.put("pct", "image/pict");
-    mimeTypes.put("pdf", "application/pdf");
-    mimeTypes.put("pgm", "image/x-portable-graymap");
-    mimeTypes.put("pic", "image/pict");
-    mimeTypes.put("pict", "image/pict");
-    mimeTypes.put("pls", "audio/x-scpls");
-    mimeTypes.put("png", "image/png");
-    mimeTypes.put("pnm", "image/x-portable-anymap");
-    mimeTypes.put("pnt", "image/x-macpaint");
-    mimeTypes.put("ppm", "image/x-portable-pixmap");
-    mimeTypes.put("ppt", "application/powerpoint");
-    mimeTypes.put("ps", "application/postscript");
-    mimeTypes.put("psd", "image/x-photoshop");
-    mimeTypes.put("qt", "video/quicktime");
-    mimeTypes.put("qti", "image/x-quicktime");
-    mimeTypes.put("qtif", "image/x-quicktime");
-    mimeTypes.put("ras", "image/x-cmu-raster");
-    mimeTypes.put("rgb", "image/x-rgb");
-    mimeTypes.put("rm", "application/vnd.rn-realmedia");
-    mimeTypes.put("roff", "application/x-troff");
-    mimeTypes.put("rtf", "application/rtf");
-    mimeTypes.put("rtx", "text/richtext");
-    mimeTypes.put("sh", "application/x-sh");
-    mimeTypes.put("shar", "application/x-shar");
-    mimeTypes.put("smf", "audio/x-midi");
-    mimeTypes.put("sit", "application/x-stuffit");
-    mimeTypes.put("snd", "audio/basic");
-    mimeTypes.put("src", "application/x-wais-source");
-    mimeTypes.put("sv4cpio", "application/x-sv4cpio");
-    mimeTypes.put("sv4crc", "application/x-sv4crc");
-    mimeTypes.put("swf", "application/x-shockwave-flash");
-    mimeTypes.put("t", "application/x-troff");
-    mimeTypes.put("tar", "application/x-tar");
-    mimeTypes.put("tcl", "application/x-tcl");
-    mimeTypes.put("tex", "application/x-tex");
-    mimeTypes.put("texi", "application/x-texinfo");
-    mimeTypes.put("texinfo", "application/x-texinfo");
-    mimeTypes.put("tif", "image/tiff");
-    mimeTypes.put("tiff", "image/tiff");
-    mimeTypes.put("tr", "application/x-troff");
-    mimeTypes.put("tsv", "text/tab-separated-values");
-    mimeTypes.put("txt", "text/plain");
-    mimeTypes.put("ulw", "audio/basic");
-    mimeTypes.put("ustar", "application/x-ustar");
-    mimeTypes.put("xbm", "image/x-xbitmap");
-    mimeTypes.put("xht", "application/xhtml+xml");
-    mimeTypes.put("xhtml", "application/xhtml+xml");
-    mimeTypes.put("xml", "text/xml");
-    mimeTypes.put("xpm", "image/x-xpixmap");
-    mimeTypes.put("xsl", "text/xml");
-    mimeTypes.put("xwd", "image/x-xwindowdump");
-    mimeTypes.put("wav", "audio/x-wav");
-    mimeTypes.put("svg", "image/svg+xml");
-    mimeTypes.put("svgz", "image/svg+xml");
-    mimeTypes.put("vsd", "application/x-visio");
-    mimeTypes.put("wbmp", "image/vnd.wap.wbmp");
-    mimeTypes.put("wml", "text/vnd.wap.wml");
-    mimeTypes.put("wmlc", "application/vnd.wap.wmlc");
-    mimeTypes.put("wmls", "text/vnd.wap.wmlscript");
-    mimeTypes.put("wmlscriptc", "application/vnd.wap.wmlscriptc");
-    mimeTypes.put("wrl", "x-world/x-vrml");
-    mimeTypes.put("Z", "application/x-compress");
-    mimeTypes.put("z", "application/x-compress");
-    mimeTypes.put("zip", "application/zip");
-  }
-
-  /**
-   * Checks to see whether or not a client's file is out of date relative to the
-   * original.
-   */
-  private boolean isNotModified(HttpServletRequest request, long ageOfServerCopy) {
-    // The age of the server copy *must* have the milliseconds truncated.
-    // Since milliseconds isn't part of the GMT format, failure to truncate
-    // will leave the file in a state where it appears constantly out of date
-    // and yet it can never get in sync because the Last-Modified date keeps
-    // truncating off the milliseconds part on its way out.
-    // 
-    ageOfServerCopy -= (ageOfServerCopy % 1000);
-
-    long ageOfClientCopy = 0;
-    String ifModifiedSince = request.getHeader("If-Modified-Since");
-    if (ifModifiedSince != null) {
-      // Rip off any additional stuff at the end, such as "; length="
-      // (IE does add this).
-      //
-      int lastSemi = ifModifiedSince.lastIndexOf(';');
-      if (lastSemi != -1) {
-        ifModifiedSince = ifModifiedSince.substring(0, lastSemi);
-      }
-      ageOfClientCopy = HttpHeaders.fromInternetDateFormat(ifModifiedSince);
-    }
-
-    if (ageOfClientCopy >= ageOfServerCopy) {
-      // The client already has a good copy.
-      //
-      return true;
-    } else {
-      // The client needs a fresh copy of the requested file.
-      //
-      return false;
-    }
-  }
-
-  private void maybeIssueXhtmlWarning(TreeLogger logger, String mimeType,
-      String path) {
-    if (!XHTML_MIME_TYPE.equals(mimeType)) {
-      return;
-    }
-
-    String msg = "File was returned with content-type of \"" + mimeType
-        + "\". GWT requires browser features that are not available to "
-        + "documents with this content-type.";
-
-    int ix = path.lastIndexOf('.');
-    if (ix >= 0 && ix < path.length()) {
-      String base = path.substring(0, ix);
-      msg += " Consider renaming \"" + path + "\" to \"" + base + ".html\".";
-    }
-
-    logger.log(TreeLogger.WARN, msg, null);
-  }
-
-  private void sendErrorResponse(HttpServletResponse response, int statusCode,
-      String msg) throws IOException {
-    response.setContentType("text/html");
-    response.getWriter().println(msg);
-    response.setStatus(statusCode);
-  }
-
-  /**
-   * Sets the Cache-control and Expires headers in the response based on the
-   * supplied cache time.
-   * 
-   * Expires is used in addition to Cache-control for older clients or proxies
-   * which may not properly understand Cache-control.
-   * 
-   * @param response the HttpServletResponse to update
-   * @param cacheTime non-negative number of seconds to cache the response; 0
-   *          means specifically do not allow caching at all.
-   * @throws IllegalArgumentException if cacheTime is negative
-   */
-  private void setResponseCacheHeaders(HttpServletResponse response,
-      long cacheTime) {
-    long expires;
-    if (cacheTime < 0) {
-      throw new IllegalArgumentException("cacheTime of " + cacheTime
-          + " is negative");
-    }
-    if (cacheTime > 0) {
-      // Expire the specified seconds in the future.
-      expires = new Date().getTime() + cacheTime * HttpHeaders.MS_SEC;
-    } else {
-      // Prevent caching by using a time in the past for cache expiration.
-      // Use January 2, 1970 00:00:00, to account for timezone changes
-      // in case a browser tries to convert to a local timezone first
-      // 0=Jan 1, so add 1 day's worth of milliseconds to get Jan 2
-      expires = HttpHeaders.SEC_DAY * HttpHeaders.MS_SEC;
-    }
-    response.setHeader(HttpHeaders.CACHE_CONTROL,
-        HttpHeaders.CACHE_CONTROL_MAXAGE + cacheTime);
-    String expiresString = HttpHeaders.toInternetDateFormat(expires);
-    response.setHeader(HttpHeaders.EXPIRES, expiresString);
-  }
-
-  private boolean shouldAutoGenerateResources() {
-    ServletContext servletContext = getServletContext();
-    final String attr = "com.google.gwt.dev.shell.shouldAutoGenerateResources";
-    Boolean attrValue = (Boolean) servletContext.getAttribute(attr);
-    if (attrValue == null) {
-      return true;
-    }
-    return attrValue;
-  }
-
-  private void streamOut(InputStream in, OutputStream out, int bufferSize)
-      throws IOException {
-    assert (bufferSize >= 0);
-
-    byte[] buffer = new byte[bufferSize];
-    int bytesRead = 0;
-    while (true) {
-      bytesRead = in.read(buffer);
-      if (bytesRead >= 0) {
-        // Copy the bytes out.
-        out.write(buffer, 0, bytesRead);
-      } else {
-        // End of input stream.
-        out.flush();
-        return;
-      }
-    }
-  }
-
-  private HttpServlet tryGetOrLoadServlet(TreeLogger logger,
-      ModuleDef moduleDef, String className) {
-
-    // Maps className to live servlet for this module.
-    Map<String, HttpServlet> moduleServlets;
-    synchronized (loadedServletsByModuleAndClassName) {
-      moduleServlets = loadedServletsByModuleAndClassName.get(moduleDef);
-      if (moduleServlets == null) {
-        moduleServlets = new HashMap<String, HttpServlet>();
-        loadedServletsByModuleAndClassName.put(moduleDef, moduleServlets);
-      }
-    }
-
-    synchronized (moduleServlets) {
-      HttpServlet servlet = moduleServlets.get(className);
-      if (servlet != null) {
-        // Found it.
-        //
-        return servlet;
-      }
-
-      // Try to load and instantiate it.
-      //
-      Throwable caught = null;
-      try {
-        Class<?> servletClass = Class.forName(className);
-        Object newInstance = servletClass.newInstance();
-        if (!(newInstance instanceof HttpServlet)) {
-          logger.log(TreeLogger.ERROR,
-              "Not compatible with HttpServlet: " + className
-                  + " (does your service extend RemoteServiceServlet?)", null);
-          return null;
-        }
-
-        // Success. Hang onto the instance so we can reuse it.
-        //
-        servlet = (HttpServlet) newInstance;
-
-        // We create proxies for ServletContext and ServletConfig to enable
-        // RemoteServiceServlets to load public and generated resources via
-        // ServletContext.getResourceAsStream()
-        //
-        ServletContext context = new HostedModeServletContextProxy(
-            getServletContext(), moduleDef, getShellWorkDirs());
-        ServletConfig config = new HostedModeServletConfigProxy(
-            getServletConfig(), context);
-
-        servlet.init(config);
-
-        moduleServlets.put(className, servlet);
-        return servlet;
-      } catch (ClassNotFoundException e) {
-        caught = e;
-      } catch (InstantiationException e) {
-        caught = e;
-      } catch (IllegalAccessException e) {
-        caught = e;
-      } catch (ServletException e) {
-        caught = e;
-      }
-      String msg = "Unable to instantiate '" + className + "'";
-      logger.log(TreeLogger.ERROR, msg, caught);
-      return null;
-    }
-  }
-}
diff --git a/dev/core/src/com/google/gwt/dev/shell/HostedModeServletContextProxy.java b/dev/core/src/com/google/gwt/dev/shell/HostedModeServletContextProxy.java
deleted file mode 100644
index d6b321e..0000000
--- a/dev/core/src/com/google/gwt/dev/shell/HostedModeServletContextProxy.java
+++ /dev/null
@@ -1,338 +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.dev.shell;
-
-import com.google.gwt.dev.cfg.ModuleDef;
-import com.google.gwt.dev.resource.Resource;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.ref.WeakReference;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.Set;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-
-/**
- * ServletContext proxy that implements the getResource and getResourceAsStream
- * members so that they can work with the {@link GWTShellServlet}.
- */
-class HostedModeServletContextProxy implements ServletContext {
-  private final ServletContext context;
-  /**
-   * Avoid pinning my moduleDef.
-   */
-  private final WeakReference<ModuleDef> moduleDefRef;
-  private final WorkDirs workDirs;
-
-  HostedModeServletContextProxy(ServletContext context, ModuleDef moduleDef,
-      WorkDirs workDirs) {
-    this.context = context;
-    this.moduleDefRef = new WeakReference<ModuleDef>(moduleDef);
-    this.workDirs = workDirs;
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getAttribute(java.lang.String)
-   */
-  public Object getAttribute(String arg0) {
-    return context.getAttribute(arg0);
-  }
-
-  /**
-   * @return
-   * @see javax.servlet.ServletContext#getAttributeNames()
-   */
-  @SuppressWarnings("unchecked")
-  public Enumeration<String> getAttributeNames() {
-    return context.getAttributeNames();
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getContext(java.lang.String)
-   */
-  public ServletContext getContext(String arg0) {
-    return context.getContext(arg0);
-  }
-
-  public String getContextPath() {
-    return context.getContextPath();
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
-   */
-  public String getInitParameter(String arg0) {
-    return context.getInitParameter(arg0);
-  }
-
-  /**
-   * @return
-   * @see javax.servlet.ServletContext#getInitParameterNames()
-   */
-  public Enumeration<?> getInitParameterNames() {
-    return context.getInitParameterNames();
-  }
-
-  /**
-   * @return
-   * @see javax.servlet.ServletContext#getMajorVersion()
-   */
-  public int getMajorVersion() {
-    return context.getMajorVersion();
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
-   */
-  public String getMimeType(String arg0) {
-    return context.getMimeType(arg0);
-  }
-
-  /**
-   * @return
-   * @see javax.servlet.ServletContext#getMinorVersion()
-   */
-  public int getMinorVersion() {
-    return context.getMinorVersion();
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
-   */
-  public RequestDispatcher getNamedDispatcher(String arg0) {
-    return context.getNamedDispatcher(arg0);
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getRealPath(java.lang.String)
-   */
-  public String getRealPath(String arg0) {
-    return context.getRealPath(arg0);
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
-   */
-  public RequestDispatcher getRequestDispatcher(String arg0) {
-    return context.getRequestDispatcher(arg0);
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @throws MalformedURLException
-   * @see javax.servlet.ServletContext#getResource(java.lang.String)
-   */
-  @SuppressWarnings("deprecation")
-  public URL getResource(String path) throws MalformedURLException {
-    ModuleDef moduleDef = moduleDefRef.get();
-    assert (moduleDef != null) : "GWTShellServlet should have guaranteed that a"
-        + " live servlet will never process a request for a dead module; if you"
-        + " are using this servlet outside the context of processing a call,"
-        + " then don't do that";
-
-    String moduleContext = "/" + moduleDef.getName() + "/";
-    if (!path.startsWith(moduleContext)) {
-      // Check for a renamed module
-      moduleContext = "/" + moduleDef.getCanonicalName() + "/";
-      if (!path.startsWith(moduleContext)) {
-        // This path is in a different context; just return null
-        return null;
-      }
-    }
-
-    String partialPath = path.substring(moduleContext.length());
-
-    // Try to get the resource from the application's public path
-    Resource publicResource = moduleDef.findPublicFile(partialPath);
-    if (publicResource != null) {
-      return publicResource.getURL();
-    }
-
-    // Otherwise try the path in the shell's public generated directory
-    File shellDir = workDirs.getShellPublicGenDir(moduleDef);
-    File requestedFile = new File(shellDir, partialPath);
-    if (requestedFile.exists()) {
-      return requestedFile.toURI().toURL();
-    }
-
-    /*
-     * If the user is coming from compiled web-mode, check the linker output
-     * directory for the file. We'll default to using the output directory of
-     * the first linker defined in the <set-linker> tab.
-     */
-    File linkDir = workDirs.getCompilerOutputDir(moduleDef);
-    requestedFile = new File(linkDir, partialPath);
-    if (requestedFile.exists()) {
-      try {
-        return requestedFile.toURI().toURL();
-      } catch (MalformedURLException e) {
-        // ignore since it was speculative anyway
-      }
-    }
-
-    return null;
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
-   */
-  public InputStream getResourceAsStream(String arg0) {
-    URL url;
-    try {
-      url = getResource(arg0);
-      if (url != null) {
-        return url.openStream();
-      }
-    } catch (MalformedURLException e) {
-      // Ignore the exception; return null
-    } catch (IOException e) {
-      // Ignore the exception; return null
-    }
-
-    return null;
-  }
-
-  /**
-   * 
-   * @param path
-   * @return
-   * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
-   */
-  @SuppressWarnings("unchecked")
-  public Set<String> getResourcePaths(String path) {
-    return context.getResourcePaths(path);
-  }
-
-  /**
-   * @return
-   * @see javax.servlet.ServletContext#getServerInfo()
-   */
-  public String getServerInfo() {
-    return context.getServerInfo();
-  }
-
-  /**
-   * @param arg0
-   * @return
-   * @throws ServletException
-   * @deprecated
-   * @see javax.servlet.ServletContext#getServlet(java.lang.String)
-   */
-  @Deprecated
-  public Servlet getServlet(String arg0) throws ServletException {
-    return context.getServlet(arg0);
-  }
-
-  /**
-   * @return
-   * @see javax.servlet.ServletContext#getServletContextName()
-   */
-  public String getServletContextName() {
-    return context.getServletContextName();
-  }
-
-  /**
-   * @return
-   * @deprecated
-   * @see javax.servlet.ServletContext#getServletNames()
-   */
-  @Deprecated
-  @SuppressWarnings("unchecked")
-  public Enumeration<String> getServletNames() {
-    return context.getServletNames();
-  }
-
-  /**
-   * @return
-   * @deprecated
-   * @see javax.servlet.ServletContext#getServlets()
-   */
-  @Deprecated
-  @SuppressWarnings("unchecked")
-  public Enumeration<Servlet> getServlets() {
-    return context.getServlets();
-  }
-
-  /**
-   * @param arg0
-   * @param arg1
-   * @deprecated
-   * @see javax.servlet.ServletContext#log(java.lang.Exception,
-   *      java.lang.String)
-   */
-  @Deprecated
-  public void log(Exception arg0, String arg1) {
-    context.log(arg0, arg1);
-  }
-
-  /**
-   * @param arg0
-   * @see javax.servlet.ServletContext#log(java.lang.String)
-   */
-  public void log(String arg0) {
-    context.log(arg0);
-  }
-
-  /**
-   * @param arg0
-   * @param arg1
-   * @see javax.servlet.ServletContext#log(java.lang.String,java.lang.Throwable)
-   */
-  public void log(String arg0, Throwable arg1) {
-    context.log(arg0, arg1);
-  }
-
-  /**
-   * @param arg0
-   * @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
-   */
-  public void removeAttribute(String arg0) {
-    context.removeAttribute(arg0);
-  }
-
-  /**
-   * @param arg0
-   * @param arg1
-   * @see javax.servlet.ServletContext#setAttribute(java.lang.String,java.lang.Object)
-   */
-  public void setAttribute(String arg0, Object arg1) {
-    context.setAttribute(arg0, arg1);
-  }
-}
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
index b724854..15e1354 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
@@ -621,7 +621,7 @@
     String details = "<p>Exception while loading module <b>"
         + Util.escapeXml(entryPointTypeName) + "</b>."
         + " See Development Mode for details.</p>"
-        + "<div style='overflow:visisble;white-space:pre;'>" + stackTrace
+        + "<div style='overflow:visible;white-space:pre;'>" + stackTrace
         + "</div>";
 
     invokeNativeVoid("__gwt_displayGlassMessage", null,
diff --git a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
index 01c886a..9bac9bd 100644
--- a/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
+++ b/dev/core/src/com/google/gwt/dev/shell/log/SwingLoggerPanel.java
@@ -50,6 +50,7 @@
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
+import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JEditorPane;
@@ -65,10 +66,12 @@
 import javax.swing.PopupFactory;
 import javax.swing.UIManager;
 import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkEvent.EventType;
 import javax.swing.event.HyperlinkListener;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
-import javax.swing.event.HyperlinkEvent.EventType;
 import javax.swing.text.html.HTMLDocument;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeCellRenderer;
@@ -211,9 +214,6 @@
       searchField.requestFocusInWindow();
     }
 
-    /**
-     * 
-     */
     private void updateSearchResult() {
       int n = matches.size();
       if (n == 0) {
@@ -260,7 +260,7 @@
 
   String regexFilter;
 
-  final JTree tree;
+  private final JTree tree;
 
   DefaultTreeModel treeModel;
 
@@ -286,6 +286,8 @@
   
   private JScrollPane treeView;
 
+  private JCheckBox autoScroll;
+
   /**
    * Create a Swing-based logger panel, with a tree section and a detail
    * section.
@@ -317,6 +319,9 @@
       }
     });
     logButtons.add(collapseButton);
+    autoScroll = new JCheckBox("Auto-scroll", true);
+    autoScroll.setMnemonic(KeyEvent.VK_U);
+    logButtons.add(autoScroll);
     topPanel.add(logButtons, BorderLayout.CENTER);
     // TODO(jat): temporarily avoid showing parts that aren't implemented.
     if (false) {
@@ -369,6 +374,16 @@
     add(topPanel, BorderLayout.NORTH);
     root = new DefaultMutableTreeNode();
     treeModel = new DefaultTreeModel(root);
+    treeModel.addTreeModelListener(new TreeModelListener() {
+      @Override public void treeNodesInserted(TreeModelEvent e) {
+        for (Object treeNode : e.getChildren()) {
+          onTreeNodeAdded((DefaultMutableTreeNode) treeNode);
+        }
+      }
+      @Override public void treeStructureChanged(TreeModelEvent e) { }
+      @Override public void treeNodesRemoved(TreeModelEvent e) { }
+      @Override public void treeNodesChanged(TreeModelEvent e) { }
+    });
     tree = new JTree(treeModel);
     tree.setRootVisible(false);
     tree.setEditable(false);
@@ -516,13 +531,6 @@
     }
   }
 
-  /**
-   * @param node
-   */
-  public void notifyChange(DefaultMutableTreeNode node) {
-    treeModel.nodeChanged(node);
-  }
-
   @Override
   public void removeAll() {
     tree.removeAll();
@@ -716,4 +724,18 @@
       buf.append('\n');
     }
   }
+
+  private void onTreeNodeAdded(DefaultMutableTreeNode treeNode) {
+    TreePath path = new TreePath(treeNode.getPath());
+    if (autoScroll.isSelected()) {
+      tree.scrollPathToVisible(path); // internally will also call makeVisible
+    } else {
+      Object userObject = treeNode.getUserObject();
+      if (userObject instanceof LogEvent) {
+        if (((LogEvent) userObject).type.needsAttention()) {
+          tree.makeVisible(path);
+        }
+      }
+    }
+  }
 }
diff --git a/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java b/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
index ac5d464..67d4804 100644
--- a/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
+++ b/dev/core/src/com/google/gwt/dev/shell/log/SwingTreeLogger.java
@@ -30,7 +30,6 @@
 import javax.swing.Icon;
 import javax.swing.JLabel;
 import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.TreePath;
 
 /**
  * Tree logger built on an Swing tree item.
@@ -355,9 +354,6 @@
         }
         int insertIndex = findInsertionPoint(parentNode, idx);
         panel.treeModel.insertNodeInto(node, parentNode, insertIndex);
-        if (logEvent.type.needsAttention()) {
-          panel.tree.makeVisible(new TreePath(node.getPath()));
-        }
         if (parentNode == panel.treeModel.getRoot()
             && parentNode.getChildCount() == 1) {
           panel.treeModel.reload();
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
deleted file mode 100644
index 9cf2d95..0000000
--- a/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
+++ /dev/null
@@ -1,75 +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.tomcat;
-
-import com.google.gwt.core.ext.TreeLogger;
-
-import org.apache.catalina.logger.LoggerBase;
-
-class CatalinaLoggerAdapter extends LoggerBase {
-
-  private final TreeLogger logger;
-
-  public CatalinaLoggerAdapter(TreeLogger logger) {
-    this.logger = logger;
-  }
-
-  @Override
-  public void log(Exception exception, String msg) {
-    logger.log(TreeLogger.WARN, msg, exception);
-  }
-
-  @Override
-  public void log(String msg) {
-    logger.log(TreeLogger.INFO, msg, null);
-  }
-
-  @Override
-  public void log(String message, int verbosity) {
-    TreeLogger.Type type = mapVerbosityToLogType(verbosity);
-    logger.log(type, message, null);
-  }
-
-  @Override
-  public void log(String msg, Throwable throwable) {
-    logger.log(TreeLogger.WARN, msg, throwable);
-  }
-
-  @Override
-  public void log(String message, Throwable throwable, int verbosity) {
-    TreeLogger.Type type = mapVerbosityToLogType(verbosity);
-    logger.log(type, message, throwable);
-  }
-
-  private TreeLogger.Type mapVerbosityToLogType(int verbosity) {
-    switch (verbosity) {
-      case LoggerBase.FATAL:
-      case LoggerBase.ERROR:
-      case LoggerBase.WARNING:
-        return TreeLogger.WARN;
-
-      case LoggerBase.INFORMATION:
-        return TreeLogger.DEBUG;
-      case LoggerBase.DEBUG:
-        return TreeLogger.SPAM;
-
-      default:
-        // really, this was an unexpected type
-        return TreeLogger.WARN;
-    }
-  }
-
-}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
deleted file mode 100644
index d071d2a..0000000
--- a/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
+++ /dev/null
@@ -1,119 +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.tomcat;
-
-import com.google.gwt.core.ext.TreeLogger;
-
-/**
- * Maps Tomcat's commons logger onto the GWT shell's tree logger.
- */
-public class CommonsLoggerAdapter implements org.apache.commons.logging.Log {
-
-  private TreeLogger log;
-
-  /**
-   * @param name unused
-   */
-  public CommonsLoggerAdapter(String name) {
-    // NOTE: this is ugly, but I don't know of any other way to get a
-    // non-static log to which we can delegate.
-    //
-    log = EmbeddedTomcatServer.sTomcat.getLogger();
-  }
-
-  public void debug(Object message) {
-    doLog(TreeLogger.SPAM, message, null);
-  }
-
-  public void debug(Object message, Throwable t) {
-    doLog(TreeLogger.SPAM, message, t);
-  }
-
-  public void error(Object message) {
-    doLog(TreeLogger.WARN, message, null);
-  }
-
-  public void error(Object message, Throwable t) {
-    doLog(TreeLogger.WARN, message, t);
-  }
-
-  public void fatal(Object message) {
-    doLog(TreeLogger.WARN, message, null);
-  }
-
-  public void fatal(Object message, Throwable t) {
-    doLog(TreeLogger.WARN, message, t);
-  }
-
-  public void info(Object message) {
-    // Intentionally low-level to us.
-    doLog(TreeLogger.TRACE, message, null);
-  }
-
-  public void info(Object message, Throwable t) {
-    // Intentionally low-level to us.
-    doLog(TreeLogger.TRACE, message, t);
-  }
-
-  public boolean isDebugEnabled() {
-    return log.isLoggable(TreeLogger.SPAM);
-  }
-
-  public boolean isErrorEnabled() {
-    return log.isLoggable(TreeLogger.WARN);
-  }
-
-  public boolean isFatalEnabled() {
-    return log.isLoggable(TreeLogger.WARN);
-  }
-
-  public boolean isInfoEnabled() {
-    // Intentionally low-level to us.
-    return log.isLoggable(TreeLogger.TRACE);
-  }
-
-  public boolean isTraceEnabled() {
-    // Intentionally low-level to us.
-    return log.isLoggable(TreeLogger.SPAM);
-  }
-
-  public boolean isWarnEnabled() {
-    return log.isLoggable(TreeLogger.WARN);
-  }
-
-  public void trace(Object message) {
-    // Intentionally low-level to us.
-    doLog(TreeLogger.DEBUG, message, null);
-  }
-
-  public void trace(Object message, Throwable t) {
-    // Intentionally low-level to us.
-    doLog(TreeLogger.DEBUG, message, t);
-  }
-
-  public void warn(Object message) {
-    doLog(TreeLogger.WARN, message, null);
-  }
-
-  public void warn(Object message, Throwable t) {
-    doLog(TreeLogger.WARN, message, t);
-  }
-
-  private void doLog(TreeLogger.Type type, Object message, Throwable t) {
-    String msg = message.toString();
-    log.log(type, msg, t);
-  }
-}
\ No newline at end of file
diff --git a/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java b/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
deleted file mode 100644
index e7d27ac..0000000
--- a/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
+++ /dev/null
@@ -1,436 +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.tomcat;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.dev.resource.Resource;
-import com.google.gwt.dev.resource.impl.ClassPathEntry;
-import com.google.gwt.dev.resource.impl.PathPrefix;
-import com.google.gwt.dev.resource.impl.PathPrefixSet;
-import com.google.gwt.dev.resource.impl.ResourceOracleImpl;
-import com.google.gwt.dev.shell.WorkDirs;
-import com.google.gwt.dev.util.Util;
-
-import org.apache.catalina.Connector;
-import org.apache.catalina.ContainerEvent;
-import org.apache.catalina.ContainerListener;
-import org.apache.catalina.Engine;
-import org.apache.catalina.LifecycleException;
-import org.apache.catalina.Logger;
-import org.apache.catalina.core.StandardContext;
-import org.apache.catalina.core.StandardHost;
-import org.apache.catalina.startup.Embedded;
-import org.apache.catalina.startup.HostConfig;
-import org.apache.coyote.tomcat5.CoyoteConnector;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Wraps an instance of the Tomcat web server used in hosted mode.
- */
-public class EmbeddedTomcatServer {
-
-  static EmbeddedTomcatServer sTomcat;
-
-  public static int getPort() {
-    return sTomcat.port;
-  }
-
-  public static String start(TreeLogger topLogger, int port, WorkDirs workDirs) {
-    return start(topLogger, port, workDirs, true);
-  }
-
-  public static synchronized String start(TreeLogger topLogger, int port,
-      WorkDirs workDirs, boolean shouldAutoGenerateResources) {
-    if (sTomcat != null) {
-      throw new IllegalStateException("Embedded Tomcat is already running");
-    }
-
-    try {
-      new EmbeddedTomcatServer(topLogger, port, workDirs,
-          shouldAutoGenerateResources);
-      return null;
-    } catch (LifecycleException e) {
-      String msg = e.getMessage();
-      if (msg != null && msg.indexOf("already in use") != -1) {
-        msg = "Port "
-            + port
-            + " is already is use; you probably still have another session active";
-      } else {
-        msg = "Unable to start the embedded Tomcat server; double-check that your configuration is valid";
-      }
-      return msg;
-    }
-  }
-
-  // Stop the embedded Tomcat server.
-  //
-  public static synchronized void stop() {
-    if (sTomcat != null) {
-      try {
-        sTomcat.catEmbedded.stop();
-      } catch (LifecycleException e) {
-        // There's nothing we can really do about this and the logger is
-        // gone in many scenarios, so we just ignore it.
-        //
-      } finally {
-        sTomcat = null;
-      }
-    }
-  }
-
-  /**
-   * Returns what local port the Tomcat connector is running on.
-   * 
-   * When starting Tomcat with port 0 (i.e. choose an open port), there is just
-   * no way to figure out what port it actually chose. So we're using pure
-   * hackery to steal the port via reflection. The only works because we bundle
-   * Tomcat with GWT and know exactly what version it is.
-   */
-  private static int computeLocalPort(Connector connector) {
-    Throwable caught = null;
-    try {
-      Field phField = CoyoteConnector.class.getDeclaredField("protocolHandler");
-      phField.setAccessible(true);
-      Object protocolHandler = phField.get(connector);
-
-      Field epField = protocolHandler.getClass().getDeclaredField("ep");
-      epField.setAccessible(true);
-      Object endPoint = epField.get(protocolHandler);
-
-      Field ssField = endPoint.getClass().getDeclaredField("serverSocket");
-      ssField.setAccessible(true);
-      ServerSocket serverSocket = (ServerSocket) ssField.get(endPoint);
-
-      return serverSocket.getLocalPort();
-    } catch (SecurityException e) {
-      caught = e;
-    } catch (NoSuchFieldException e) {
-      caught = e;
-    } catch (IllegalArgumentException e) {
-      caught = e;
-    } catch (IllegalAccessException e) {
-      caught = e;
-    }
-    throw new RuntimeException(
-        "Failed to retrieve the startup port from Embedded Tomcat", caught);
-  }
-
-  private Embedded catEmbedded;
-
-  private Engine catEngine;
-
-  private StandardHost catHost = null;
-
-  private int port;
-
-  private final TreeLogger startupBranchLogger;
-
-  private EmbeddedTomcatServer(final TreeLogger topLogger, int listeningPort,
-      final WorkDirs workDirs, final boolean shouldAutoGenerateResources)
-      throws LifecycleException {
-    if (topLogger == null) {
-      throw new NullPointerException("No logger specified");
-    }
-
-    final TreeLogger logger = topLogger.branch(TreeLogger.INFO,
-        "Starting HTTP on port " + listeningPort, null);
-
-    startupBranchLogger = logger;
-
-    // Make myself the one static instance.
-    // NOTE: there is only one small implementation reason that this has
-    // to be a singleton, which is that the commons logger LogFactory insists
-    // on creating your logger class which must have a constructor with
-    // exactly one String argument, and since we want LoggerAdapter to delegate
-    // to the logger instance available through instance host, there is no
-    // way I can think of to delegate without accessing a static field.
-    // An inner class is almost right, except there's no outer instance.
-    //
-    sTomcat = this;
-
-    // Assume the working directory is simply the user's current directory.
-    //
-    File topWorkDir = new File(System.getProperty("user.dir"));
-
-    // Tell Tomcat its base directory so that it won't complain.
-    //
-    String catBase = System.getProperty("catalina.base");
-    if (catBase == null) {
-      // we (briefly) supported catalina.base.create, so let's not cut support
-      // until the deprecated sunset
-      catBase = System.getProperty("catalina.base.create");
-      if (catBase != null) {
-        logger.log(TreeLogger.WARN, "catalina.base.create is deprecated.  " +
-            "Use catalina.base, and it will be created if necessary.");
-        topWorkDir = new File(catBase);
-      }
-      catBase = generateDefaultCatalinaBase(logger, topWorkDir);
-      System.setProperty("catalina.base", catBase);
-    }
-
-    // Some debug messages for ourselves.
-    //
-    if (logger.isLoggable(TreeLogger.DEBUG)) {
-      logger.log(TreeLogger.DEBUG, "catalina.base = " + catBase, null);
-    }
-
-    // Set up the logger that will be returned by the Commons logging factory.
-    //
-    String adapterClassName = CommonsLoggerAdapter.class.getName();
-    System.setProperty("org.apache.commons.logging.Log", adapterClassName);
-
-    // And set up an adapter that will work with the Catalina logger family.
-    //
-    Logger catalinaLogger = new CatalinaLoggerAdapter(topLogger);
-
-    // Create an embedded server.
-    //
-    catEmbedded = new Embedded();
-    catEmbedded.setDebug(0);
-    catEmbedded.setLogger(catalinaLogger);
-
-    // The embedded engine is called "gwt".
-    //
-    catEngine = catEmbedded.createEngine();
-    catEngine.setName("gwt");
-    catEngine.setDefaultHost("localhost");
-    catEngine.setParentClassLoader(this.getClass().getClassLoader());
-
-    // It answers localhost requests.
-    //
-    // String appBase = fCatalinaBaseDir.getAbsolutePath();
-    String appBase = catBase + "/webapps";
-    catHost = (StandardHost) catEmbedded.createHost("localhost", appBase);
-
-    // Hook up a host config to search for and pull in webapps.
-    //
-    HostConfig hostConfig = new HostConfig();
-    catHost.addLifecycleListener(hostConfig);
-
-    // Hook pre-install events so that we can add attributes to allow loaded
-    // instances to find their development instance host.
-    //
-    catHost.addContainerListener(new ContainerListener() {
-      public void containerEvent(ContainerEvent event) {
-        if (StandardHost.PRE_INSTALL_EVENT.equals(event.getType())) {
-          StandardContext webapp = (StandardContext) event.getData();
-          publishShellLoggerAttribute(logger, topLogger, webapp);
-          publishShellWorkDirsAttribute(logger, workDirs, webapp);
-          publishShouldAutoGenerateResourcesAttribute(logger,
-              shouldAutoGenerateResources, webapp);
-        }
-      }
-    });
-
-    // Tell the engine about the host.
-    //
-    catEngine.addChild(catHost);
-    catEngine.setDefaultHost(catHost.getName());
-
-    // Tell the embedded manager about the engine.
-    //
-    catEmbedded.addEngine(catEngine);
-    InetAddress nullAddr = null;
-    Connector connector = catEmbedded.createConnector(nullAddr, listeningPort,
-        false);
-    catEmbedded.addConnector(connector);
-
-    // start up!
-    catEmbedded.start();
-    port = computeLocalPort(connector);
-
-    if (port != listeningPort) {
-      if (logger.isLoggable(TreeLogger.INFO)) {
-        logger.log(TreeLogger.INFO, "HTTP listening on port " + port, null);
-      }
-    }
-  }
-
-  public TreeLogger getLogger() {
-    return startupBranchLogger;
-  }
-
-  /*
-   * Assumes that the leaf is a file (not a directory).
-   */
-  private void copyFileNoOverwrite(TreeLogger logger, String srcResName,
-      Resource srcRes, File catBase) {
-
-    File dest = new File(catBase, srcResName);
-    try {
-      // Only copy if src is newer than desc.
-      long srcLastModified = srcRes.getLastModified();
-      long dstLastModified = dest.lastModified();
-
-      if (srcLastModified < dstLastModified) {
-        // Don't copy over it.
-        if (logger.isLoggable(TreeLogger.SPAM)) {
-          logger.log(TreeLogger.SPAM, "Source is older than existing: "
-              + dest.getAbsolutePath(), null);
-        }
-        return;
-      } else if (srcLastModified == dstLastModified) {
-        // Exact same time; quietly don't overwrite.
-        return;
-      } else if (dest.exists()) {
-        // Warn about the overwrite
-        logger.log(TreeLogger.WARN, "Overwriting existing file '"
-            + dest.getAbsolutePath() + "' with '" + srcRes.getLocation()
-            + "', which has a newer timestamp");
-      }
-
-      // Make dest directories as required.
-      File destParent = dest.getParentFile();
-      if (destParent != null) {
-        // No need to check mkdirs result because IOException later anyway.
-        destParent.mkdirs();
-      }
-
-      Util.copy(srcRes.openContents(), new FileOutputStream(dest));
-      dest.setLastModified(srcLastModified);
-
-      if (logger.isLoggable(TreeLogger.TRACE)) {
-        logger.log(TreeLogger.TRACE, "Wrote: " + dest.getAbsolutePath(), null);
-      }
-    } catch (IOException e) {
-      logger.log(TreeLogger.WARN, "Failed to write: " + dest.getAbsolutePath(),
-          e);
-    } 
-  }
-
-  /**
-   * Extracts a valid catalina base instance from the classpath. Does not
-   * overwrite any existing files.
-   */
-  private String generateDefaultCatalinaBase(TreeLogger logger, File workDir) {
-    logger = logger.branch(
-        TreeLogger.TRACE,
-        "Property 'catalina.base' not specified; checking for a standard catalina base image instead",
-        null);
-
-    // Recursively copies out files and directories
-    String tomcatEtcDir = "com/google/gwt/dev/etc/tomcat/";
-    Map<String, Resource> resourceMap = null;
-    Throwable caught = null;
-    try {
-      resourceMap = getResourcesFor(logger, tomcatEtcDir);
-    } catch (URISyntaxException e) {
-      caught = e;
-    } catch (IOException e) {
-      caught = e;
-    }
-
-    File catBase = new File(workDir, "tomcat");
-    if (resourceMap == null || resourceMap.isEmpty()) {
-      logger.log(TreeLogger.WARN, "Could not find " + tomcatEtcDir, caught);
-    } else {
-      for (Entry<String, Resource> entry : resourceMap.entrySet()) {
-        copyFileNoOverwrite(logger, entry.getKey(), entry.getValue(), catBase);
-      }
-    }
-
-    return catBase.getAbsolutePath();
-  }
-
-  /**
-   * Hacky, but fast.
-   */
-  private Map<String, Resource> getResourcesFor(TreeLogger logger,
-      String tomcatEtcDir) throws URISyntaxException, IOException {
-    ClassLoader contextClassLoader = this.getClass().getClassLoader();
-    URL url = contextClassLoader.getResource(tomcatEtcDir);
-    if (url == null) {
-      return null;
-    }
-    String prefix = "";
-    String urlString = url.toString();
-    if (urlString.startsWith("jar:")) {
-      assert urlString.toLowerCase(Locale.ENGLISH).contains(".jar!/"
-          + tomcatEtcDir);
-      urlString = urlString.substring(4, urlString.indexOf('!'));
-      url = new URL(urlString);
-      prefix = tomcatEtcDir;
-    } else if (urlString.startsWith("zip:")) {
-      assert urlString.toLowerCase(Locale.ENGLISH).contains(".zip!/"
-          + tomcatEtcDir);
-      urlString = urlString.substring(4, urlString.indexOf('!'));
-      url = new URL(urlString);
-      prefix = tomcatEtcDir;
-    }
-    ClassPathEntry entry = ResourceOracleImpl.createEntryForUrl(logger, url);
-    assert (entry != null);
-    ResourceOracleImpl resourceOracle = new ResourceOracleImpl(
-        Collections.singletonList(entry));
-    PathPrefixSet pathPrefixSet = new PathPrefixSet();
-    PathPrefix pathPrefix = new PathPrefix(prefix, null, true);
-    pathPrefixSet.add(pathPrefix);
-    resourceOracle.setPathPrefixes(pathPrefixSet);
-    ResourceOracleImpl.refresh(logger, resourceOracle);
-    Map<String, Resource> resourceMap = resourceOracle.getResourceMap();
-    return resourceMap;
-  }
-
-  private void publishAttributeToWebApp(TreeLogger logger,
-      StandardContext webapp, String attrName, Object attrValue) {
-    if (logger.isLoggable(TreeLogger.TRACE)) {
-      logger.log(TreeLogger.TRACE, "Adding attribute  '" + attrName
-          + "' to web app '" + webapp.getName() + "'", null);
-    }
-    webapp.getServletContext().setAttribute(attrName, attrValue);
-  }
-
-  /**
-   * Publish the shell's tree logger as an attribute. This attribute is used to
-   * find the logger out of the thin air within the shell servlet.
-   */
-  private void publishShellLoggerAttribute(TreeLogger logger,
-      TreeLogger loggerToPublish, StandardContext webapp) {
-    final String attr = "com.google.gwt.dev.shell.logger";
-    publishAttributeToWebApp(logger, webapp, attr, loggerToPublish);
-  }
-
-  /**
-   * Publish the shell's work dir as an attribute. This attribute is used to
-   * find it out of the thin air within the shell servlet.
-   */
-  private void publishShellWorkDirsAttribute(TreeLogger logger,
-      WorkDirs workDirs, StandardContext webapp) {
-    final String attr = "com.google.gwt.dev.shell.workdirs";
-    publishAttributeToWebApp(logger, webapp, attr, workDirs);
-  }
-
-  /**
-   * Publish to the web app whether it should automatically generate resources.
-   */
-  private void publishShouldAutoGenerateResourcesAttribute(TreeLogger logger,
-      boolean shouldAutoGenerateResources, StandardContext webapp) {
-    publishAttributeToWebApp(logger, webapp,
-        "com.google.gwt.dev.shell.shouldAutoGenerateResources",
-        shouldAutoGenerateResources);
-  }
-}
diff --git a/dev/core/src/com/google/gwt/soyc/GlobalInformation.java b/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
index 4112404..a6eac5d 100644
--- a/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
+++ b/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
@@ -36,12 +36,12 @@
   private SizeBreakdown initialCodeBreakdown = new SizeBreakdown(
       "Initially downloaded code", "initial");
   private SizeBreakdown leftoversBreakdown = new SizeBreakdown(
-      "Leftovers code, code not in any other split point", "leftovers");
-  private int numSplitPoints = 0;
+      "Leftovers code, code not in any other fragment", "leftovers");
   private Map<String, TreeSet<String>> packageToClasses = new TreeMap<String, TreeSet<String>>();
   private final String permutationId;
-  private ArrayList<Integer> splitPointInitialLoadSequence = new ArrayList<Integer>();
-  private HashMap<Integer, String> splitPointToLocation = new HashMap<Integer, String>();
+  private ArrayList<Integer> initialFragmentLoadSequence = new ArrayList<Integer>();
+  private HashMap<Integer, List<String>> fragmentDescriptors =
+      new HashMap<Integer, List<String>>();
   private SizeBreakdown totalCodeBreakdown = new SizeBreakdown("Total program",
       "total");
 
@@ -53,10 +53,10 @@
     List<SizeBreakdown> breakdowns = new ArrayList<SizeBreakdown>();
     breakdowns.add(totalCodeBreakdown);
     breakdowns.add(initialCodeBreakdown);
-    if (numSplitPoints > 0) {
+    if (getNumFragments() > 0) {
       breakdowns.add(leftoversBreakdown);
-      for (int sp = 1; sp <= numSplitPoints; sp++) {
-        breakdowns.add(splitPointCodeBreakdown(sp));
+      for (int fragment = 1; fragment <= getNumFragments(); fragment++) {
+        breakdowns.add(fragmentCodeBreakdown(fragment));
       }
     }
     return breakdowns.toArray(EMPTY_SIZE_BREAKDOWN);
@@ -99,7 +99,7 @@
   }
 
   /**
-   * Gets the initial code breakdown.
+   * Gets the initial fragment size breakdown.
    * 
    * @return initialCodeBreakdown
    */
@@ -108,7 +108,7 @@
   }
 
   /**
-   * Gets the leftovers code breakdown.
+   * Gets the leftovers fragment size breakdown.
    * 
    * @return leftoversCodeBreakdown
    */
@@ -117,12 +117,12 @@
   }
 
   /**
-   * Gets the number of split points.
+   * Gets the number of fragments..
    * 
-   * @return numSplitPoints
+   * @return the number of fragments.
    */
-  public final int getNumSplitPoints() {
-    return numSplitPoints;
+  public final int getNumFragments() {
+    return fragmentDescriptors.size();
   }
 
   /**
@@ -141,19 +141,37 @@
   /**
    * Gets the initial load sequence.
    * 
-   * @return splitPointInitialLoadSequence
+   * @return initialFragmentLoadSequence
    */
-  public final ArrayList<Integer> getSplitPointInitialLoadSequence() {
-    return splitPointInitialLoadSequence;
+  public final ArrayList<Integer> getInitialFragmentLoadSequence() {
+    return initialFragmentLoadSequence;
   }
 
   /**
-   * Gets the mapping from split points to locations where they were set.
-   * 
-   * @return splitPointToLocation
+   * Adds a descriptor (a split point) to a fragment.
+   *
+   * @param fragment the fragment number.
+   * @param desc a string describing a split point for fragment <code>fragment</code>
+   *
    */
-  public final HashMap<Integer, String> getSplitPointToLocation() {
-    return splitPointToLocation;
+  public final void addFragmentDescriptor(int fragment, String desc) {
+    List<String> descriptions = fragmentDescriptors.get(fragment);
+    if (descriptions == null) {
+      descriptions = new ArrayList<String>();
+      fragmentDescriptors.put(fragment, descriptions);
+    }
+    descriptions.add(desc);
+  }
+
+  /**
+   * Gets the the descriptors associated with a
+   * fragment.
+   *
+   * @param fragment the fragment number
+   * @return a list of descriptors (each representing a single split point.
+   */
+  public final List<String> getFragmentDescriptors(int fragment) {
+    return fragmentDescriptors.get(fragment);
   }
 
   /**
@@ -166,25 +184,18 @@
   }
 
   /**
-   * Increments the split point count.
-   */
-  public final void incrementSplitPoints() {
-    numSplitPoints++;
-  }
-
-  /**
-   * Gets an exclusive code breakdown for a split point.
+   * Gets an exclusive code breakdown for a fragment.
    * 
-   * @param sp split point
-   * @return exlusive code breakdown for sp
+   * @param fragment the fragment id
+   * @return exlusive code breakdown for fragment
    */
-  public SizeBreakdown splitPointCodeBreakdown(int sp) {
-    assert sp >= 1 && sp <= numSplitPoints;
-    if (!exclusiveCodeBreakdowns.containsKey(sp)) {
-      exclusiveCodeBreakdowns.put(sp, new SizeBreakdown("split point " + sp
-          + ": " + splitPointToLocation.get(sp), "sp" + sp));
+  public SizeBreakdown fragmentCodeBreakdown(int fragment) {
+    assert fragment >= 1 && fragment <= getNumFragments();
+    if (!exclusiveCodeBreakdowns.containsKey(fragment)) {
+      exclusiveCodeBreakdowns.put(fragment, new SizeBreakdown("split point " + fragment
+          + ": " + fragmentDescriptors.get(fragment), "fragment" + fragment));
     }
-    return exclusiveCodeBreakdowns.get(sp);
+    return exclusiveCodeBreakdowns.get(fragment);
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index f3a70ef..4809e79 100644
--- a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -20,6 +20,7 @@
 import com.google.gwt.core.ext.linker.ModuleMetricsArtifact;
 import com.google.gwt.core.ext.linker.PrecompilationMetricsArtifact;
 import com.google.gwt.core.ext.soyc.impl.SizeMapRecorder;
+import com.google.gwt.dev.util.Strings;
 import com.google.gwt.dev.util.Util;
 import com.google.gwt.dev.util.collect.Lists;
 import com.google.gwt.dev.util.collect.Sets;
@@ -260,9 +261,16 @@
 
       // array of split point descriptions
       outFile.println("  var spl = [");
-      for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
-        outFile.println("        '"
-            + globalInformation.getSplitPointToLocation().get(sp) + "',");
+      for (int fragment = 1; fragment <= globalInformation.getNumFragments(); fragment++) {
+        final List<String> fragmentDescriptors = globalInformation.getFragmentDescriptors(fragment);
+        String[] escapedFragmentDescriptors =
+            new String[fragmentDescriptors.size()];
+        for (int i = 0; i < fragmentDescriptors.size(); i++) {
+          escapedFragmentDescriptors[i] =
+              escapeJSString(fragmentDescriptors.get(i));
+        }
+        outFile.println("        '" + Strings.join(escapedFragmentDescriptors, ",")
+            + "',");
       }
       outFile.println("  ];");
       
@@ -364,7 +372,7 @@
       outFile.println("    document.write(\"<li><a href='\" + d1 + \"#\" + className + \"'>"
           + "See why it's live</a></li>\");");
       outFile.println("    for (var sp = 1; sp <= "
-          + globalInformation.getNumSplitPoints() + "; sp++) {");
+          + globalInformation.getNumFragments() + "; sp++) {");
       outFile.println("      var d2 = 'methodDependencies-sp' + sp + '-" + getPermutationId() + ".html';");
       outFile.println("      document.write(\"<li><a href='\" + d2 + \"#\" + className +\"'>"
           + " See why it's not exclusive to s.p. #\" + sp + \" (\" + spl[sp - 1] + \")"
@@ -619,7 +627,14 @@
     return breakdown.getId() + "_" + permutationId + "_Classes.html";
   }
 
+  private String escapeJSString(String str) {
+    // TODO(rluble): make into a Util routine.
+    return str.replaceAll("/", "\\/");
+  }
+
   private static String escapeXml(String unescaped) {
+    // TODO(rluble): see why SizeMapRecorder.escapeXML is different from Util.escapeXML. If two
+    // different versions are needed at all move SizeMapRecorder.escapeXML to Util.
     return SizeMapRecorder.escapeXml(unescaped);
   }
 
@@ -1265,34 +1280,39 @@
     percentFormatter.setMinimumFractionDigits(1);
     percentFormatter.setMaximumFractionDigits(1);
 
-    if (globalInformation.getSplitPointToLocation().size() >= 1) {
+    if (globalInformation.getNumFragments() >= 1) {
 
-      int numSplitPoints = globalInformation.getSplitPointToLocation().size();
+      int numFragments = globalInformation.getNumFragments();
       int maxSize = globalInformation.getTotalCodeBreakdown().sizeAllCode;
 
-      for (int i = FRAGMENT_NUMBER_TOTAL_PROGRAM; i <= numSplitPoints + 1; i++) {
+      for (int fragment = FRAGMENT_NUMBER_TOTAL_PROGRAM; fragment <= numFragments + 1; fragment++) {
         SizeBreakdown breakdown;
-        if (i == FRAGMENT_NUMBER_TOTAL_PROGRAM) {
+        if (fragment == FRAGMENT_NUMBER_TOTAL_PROGRAM
+            || fragment == numFragments + 1 // leftovers
+            || fragment == FRAGMENT_NUMBER_INITIAL_DOWNLOAD) {
           continue;
-        } else if (i == numSplitPoints + 1) { // leftovers
-          continue;
-        } else if (i == FRAGMENT_NUMBER_INITIAL_DOWNLOAD) {
-          continue;
-        } else {
-          breakdown = globalInformation.splitPointCodeBreakdown(i);
         }
 
+        breakdown = globalInformation.fragmentCodeBreakdown(fragment);
+
         String drillDownFileName = shellFileName(breakdown, getPermutationId());
-        String splitPointDescription = globalInformation.getSplitPointToLocation().get(
-            i);
+        final List<String> fragmentDescriptors = globalInformation.getFragmentDescriptors(fragment);
+        String[] escapedFragmentDescriptors =
+            new String[fragmentDescriptors.size()];
+        for (int i = 0; i < fragmentDescriptors.size(); i++) {
+          escapedFragmentDescriptors[i] =
+              escapeXml(fragmentDescriptors.get(i));
+        }
+
+        String fragmentDescription = Strings.join(escapedFragmentDescriptors, "<BR>");
 
         int size = breakdown.sizeAllCode;
         float perc = (float) size / (float) maxSize;
 
         outFile.println("<tr>");
-        outFile.println("<td>" + i + "</td>");
-        outFile.println("<td><a href=\"" + drillDownFileName + "\">"
-            + splitPointDescription + "</a></td>");
+        outFile.println("<td>" + fragment + "</td>");
+        outFile.print("<td><a href=\"" + drillDownFileName + "\">" + fragmentDescription
+            + "</a></td>");
         outFile.println("<td class=\"soyc-bargraph-col\">");
         outFile.println("<div class=\"soyc-bar-graph goog-inline-block\">");
         // CHECKSTYLE_OFF
@@ -1412,7 +1432,7 @@
    * @returns true of the split point is initial, false otherwise
    */
   private boolean isInitialSplitPoint(int splitPoint) {
-    return globalInformation.getSplitPointInitialLoadSequence().contains(
+    return globalInformation.getInitialFragmentLoadSequence().contains(
         splitPoint);
   }
 
@@ -1824,8 +1844,8 @@
    */
   private Iterable<Integer> splitPointsWithClass(String className) {
     List<Integer> sps = new ArrayList<Integer>();
-    for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
-      Map<String, Integer> classToSize = globalInformation.splitPointCodeBreakdown(sp).classToSize;
+    for (int sp = 1; sp <= globalInformation.getNumFragments(); sp++) {
+      Map<String, Integer> classToSize = globalInformation.fragmentCodeBreakdown(sp).classToSize;
       if (classToSize.containsKey(className)) {
         sps.add(sp);
       }
diff --git a/dev/core/src/com/google/gwt/soyc/SoycDashboard.java b/dev/core/src/com/google/gwt/soyc/SoycDashboard.java
index e2b3409..03d01c4 100644
--- a/dev/core/src/com/google/gwt/soyc/SoycDashboard.java
+++ b/dev/core/src/com/google/gwt/soyc/SoycDashboard.java
@@ -331,7 +331,7 @@
       makeTopLevelHtmlForPerm.makeDependenciesHtml();
     }
 
-    if (globalInformation.getNumSplitPoints() > 0) {
+    if (globalInformation.getNumFragments() > 0) {
       makeTopLevelHtmlForPerm.makeSplitStatusPages();
       makeTopLevelHtmlForPerm.makeLeftoverStatusPages();
     }
@@ -395,11 +395,11 @@
     if (fragment == 0) {
       breakdowns.add(globalInformation.getInitialCodeBreakdown());
     }
-    if (fragment == (globalInformation.getNumSplitPoints() + 1)) {
+    if (fragment == (globalInformation.getNumFragments() + 1)) {
       breakdowns.add(globalInformation.getLeftoversBreakdown());
     }
-    if (fragment >= 1 && fragment <= globalInformation.getNumSplitPoints()) {
-      breakdowns.add(globalInformation.splitPointCodeBreakdown(fragment));
+    if (fragment >= 1 && fragment <= globalInformation.getNumFragments()) {
+      breakdowns.add(globalInformation.fragmentCodeBreakdown(fragment));
     }
     return breakdowns;
   }
@@ -411,7 +411,7 @@
     }
 
     if (breakdown == globalInformation.getTotalCodeBreakdown()) {
-      if (globalInformation.getNumSplitPoints() > 0) {
+      if (globalInformation.getNumFragments() > 0) {
         return makeTopLevelHtmlForPerm.new DependencyLinkerForTotalBreakdown();
       } else {
         return makeTopLevelHtmlForPerm.new DependencyLinkerForInitialCode();
@@ -419,7 +419,7 @@
     } else if (breakdown == globalInformation.getInitialCodeBreakdown()) {
       return makeTopLevelHtmlForPerm.new DependencyLinkerForInitialCode();
     } else if (breakdown == globalInformation.getLeftoversBreakdown()) {
-      assert globalInformation.getNumSplitPoints() > 0;
+      assert globalInformation.getNumFragments() > 0;
       return makeTopLevelHtmlForPerm.new DependencyLinkerForLeftoversFragment();
     } else {
       return new NullDependencyLinker();
@@ -607,13 +607,17 @@
           inInitialLoadSequence = true;
         } else if (inInitialLoadSequence
             && strippedName.compareTo("splitpointref") == 0) {
-          globalInformation.getSplitPointInitialLoadSequence().add(
+          globalInformation.getInitialFragmentLoadSequence().add(
               parseSplitPointReference(attributes));
         }
       }
 
-      /*
-       * parses the split points
+      /**
+       * Parses a split point entry from a splitpoints XML soyc file.
+       * A split point node as in \<splitpoint id=N location=DESC/\>
+       *
+       * @param attributes the attributes of the splitpoint node (provided by the SAX parsing
+       *                   infrastructure)
        */
       private void parseSplitPoint(final Attributes attributes) {
         if (attributes.getValue("id") != null) {
@@ -624,9 +628,8 @@
             curSplitPointLocation = curSplitPointLocation.replaceAll("\\(L.*",
                 "");
 
-            globalInformation.getSplitPointToLocation().put(
+            globalInformation.addFragmentDescriptor(
                 Integer.parseInt(curSplitPoint), curSplitPointLocation);
-            globalInformation.incrementSplitPoints();
           }
         }
       }
diff --git a/dev/core/src/org/apache/COPYING b/dev/core/src/org/apache/COPYING
deleted file mode 100644
index d9a10c0..0000000
--- a/dev/core/src/org/apache/COPYING
+++ /dev/null
@@ -1,176 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
diff --git a/dev/core/src/org/apache/catalina/loader/WebappClassLoader.java b/dev/core/src/org/apache/catalina/loader/WebappClassLoader.java
deleted file mode 100644
index f941fad..0000000
--- a/dev/core/src/org/apache/catalina/loader/WebappClassLoader.java
+++ /dev/null
@@ -1,2169 +0,0 @@
-/*
- * Copyright 1999,2004 The Apache Software Foundation.
- * 
- * 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.
- */
-// Modified by Google.
-
-package org.apache.catalina.loader;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FilePermission;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.security.AccessControlException;
-import java.security.AccessController;
-import java.security.CodeSource;
-import java.security.Permission;
-import java.security.PermissionCollection;
-import java.security.Policy;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Vector;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import java.util.jar.Attributes.Name;
-
-import javax.naming.NameClassPair;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-
-import org.apache.catalina.Lifecycle;
-import org.apache.catalina.LifecycleException;
-import org.apache.catalina.LifecycleListener;
-import org.apache.catalina.util.StringManager;
-import org.apache.naming.JndiPermission;
-import org.apache.naming.resources.Resource;
-import org.apache.naming.resources.ResourceAttributes;
-import org.apache.tomcat.util.compat.JdkCompat;
-
-/**
- * Specialized web application class loader.
- * <p>
- * This class loader is a full reimplementation of the 
- * <code>URLClassLoader</code> from the JDK. It is desinged to be fully
- * compatible with a normal <code>URLClassLoader</code>, although its internal
- * behavior may be completely different.
- * <p>
- * <strong>IMPLEMENTATION NOTE</strong> - This class loader faithfully follows 
- * the delegation model recommended in the specification. The system class 
- * loader will be queried first, then the local repositories, and only then 
- * delegation to the parent class loader will occur. This allows the web 
- * application to override any shared class except the classes from J2SE.
- * Special handling is provided from the JAXP XML parser interfaces, the JNDI
- * interfaces, and the classes from the servlet API, which are never loaded 
- * from the webapp repository.
- * <p>
- * <strong>IMPLEMENTATION NOTE</strong> - Due to limitations in Jasper 
- * compilation technology, any repository which contains classes from 
- * the servlet API will be ignored by the class loader.
- * <p>
- * <strong>IMPLEMENTATION NOTE</strong> - The class loader generates source
- * URLs which include the full JAR URL when a class is loaded from a JAR file,
- * which allows setting security permission at the class level, even when a
- * class is contained inside a JAR.
- * <p>
- * <strong>IMPLEMENTATION NOTE</strong> - Local repositories are searched in
- * the order they are added via the initial constructor and/or any subsequent
- * calls to <code>addRepository()</code> or <code>addJar()</code>.
- * <p>
- * <strong>IMPLEMENTATION NOTE</strong> - No check for sealing violations or
- * security is made unless a security manager is present.
- *
- * @author Remy Maucherat
- * @author Craig R. McClanahan
- * @version $Revision: 1.34 $ $Date: 2004/05/26 15:47:40 $
- */
-public class WebappClassLoader
-    extends URLClassLoader
-    implements Reloader, Lifecycle
- {
-
-    private static org.apache.commons.logging.Log log=
-        org.apache.commons.logging.LogFactory.getLog( WebappClassLoader.class );
-
-    protected class PrivilegedFindResource
-        implements PrivilegedAction {
-
-        private File file;
-        private String path;
-
-        PrivilegedFindResource(File file, String path) {
-            this.file = file;
-            this.path = path;
-        }
-
-        public Object run() {
-            return findResourceInternal(file, path);
-        }
-
-    }
-
-
-    // ------------------------------------------------------- Static Variables
-
-
-    /**
-     * The set of trigger classes that will cause a proposed repository not
-     * to be added if this class is visible to the class loader that loaded
-     * this factory class.  Typically, trigger classes will be listed for
-     * components that have been integrated into the JDK for later versions,
-     * but where the corresponding JAR files are required to run on
-     * earlier versions.
-     */
-    private static final String[] triggers = {
-        "javax.servlet.Servlet"                     // Servlet API
-    };
-
-    /** 
-     * Jdk Compatibility Support.
-     */
-    private static JdkCompat jdkCompat = JdkCompat.getJdkCompat();
-
-    /**
-     * Set of package names which are not allowed to be loaded from a webapp
-     * class loader without delegating first.
-     */
-    private static final String[] packageTriggers = {
-        "javax",                                     // Java extensions
-        "org.xml.sax",                               // SAX 1 & 2
-        "org.w3c.dom",                               // DOM 1 & 2
-        "org.apache.xerces",                         // Xerces 1 & 2
-        "org.apache.xalan"                           // Xalan
-    };
-
-
-    /**
-     * The string manager for this package.
-     */
-    protected static final StringManager sm =
-        StringManager.getManager(Constants.Package);
-
-
-    // ----------------------------------------------------------- Constructors
-
-
-    /**
-     * Construct a new ClassLoader with no defined repositories and no
-     * parent ClassLoader.
-     */
-    public WebappClassLoader() {
-
-        super(new URL[0]);
-        this.parent = getParent();
-        system = getSystemClassLoader();
-        securityManager = System.getSecurityManager();
-
-        if (securityManager != null) {
-            refreshPolicy();
-        }
-
-    }
-
-
-    /**
-     * Construct a new ClassLoader with no defined repositories and no
-     * parent ClassLoader.
-     */
-    public WebappClassLoader(ClassLoader parent) {
-
-        super(new URL[0], parent);
-                
-        this.parent = getParent();
-        
-        system = getSystemClassLoader();
-        securityManager = System.getSecurityManager();
-
-        if (securityManager != null) {
-            refreshPolicy();
-        }
-    }
-
-
-    // ----------------------------------------------------- Instance Variables
-
-
-    /**
-     * Associated directory context giving access to the resources in this
-     * webapp.
-     */
-    protected DirContext resources = null;
-
-
-    /**
-     * The cache of ResourceEntry for classes and resources we have loaded,
-     * keyed by resource name.
-     */
-    protected HashMap resourceEntries = new HashMap();
-
-
-    /**
-     * The list of not found resources.
-     */
-    protected HashMap notFoundResources = new HashMap();
-
-
-    /**
-     * The debugging detail level of this component.
-     */
-    protected int debug = 0;
-
-
-    /**
-     * Should this class loader delegate to the parent class loader
-     * <strong>before</strong> searching its own repositories (i.e. the
-     * usual Java2 delegation model)?  If set to <code>false</code>,
-     * this class loader will search its own repositories first, and
-     * delegate to the parent only if the class or resource is not
-     * found locally.
-     */
-    protected boolean delegate = false;
-
-
-    /**
-     * Last time a JAR was accessed.
-     */
-    protected long lastJarAccessed = 0L;
-
-
-    /**
-     * The list of local repositories, in the order they should be searched
-     * for locally loaded classes or resources.
-     */
-    protected String[] repositories = new String[0];
-
-
-     /**
-      * Repositories URLs, used to cache the result of getURLs.
-      */
-     protected URL[] repositoryURLs = null;
-
-
-    /**
-     * Repositories translated as path in the work directory (for Jasper
-     * originally), but which is used to generate fake URLs should getURLs be
-     * called.
-     */
-    protected File[] files = new File[0];
-
-
-    /**
-     * The list of JARs, in the order they should be searched
-     * for locally loaded classes or resources.
-     */
-    protected JarFile[] jarFiles = new JarFile[0];
-
-
-    /**
-     * The list of JARs, in the order they should be searched
-     * for locally loaded classes or resources.
-     */
-    protected File[] jarRealFiles = new File[0];
-
-
-    /**
-     * The path which will be monitored for added Jar files.
-     */
-    protected String jarPath = null;
-
-
-    /**
-     * The list of JARs, in the order they should be searched
-     * for locally loaded classes or resources.
-     */
-    protected String[] jarNames = new String[0];
-
-
-    /**
-     * The list of JARs last modified dates, in the order they should be
-     * searched for locally loaded classes or resources.
-     */
-    protected long[] lastModifiedDates = new long[0];
-
-
-    /**
-     * The list of resources which should be checked when checking for
-     * modifications.
-     */
-    protected String[] paths = new String[0];
-
-
-    /**
-     * A list of read File and Jndi Permission's required if this loader
-     * is for a web application context.
-     */
-    private ArrayList permissionList = new ArrayList();
-
-
-    /**
-     * Path where resources loaded from JARs will be extracted.
-     */
-    private File loaderDir = null;
-
-
-    /**
-     * The PermissionCollection for each CodeSource for a web
-     * application context.
-     */
-    private HashMap loaderPC = new HashMap();
-
-
-    /**
-     * Instance of the SecurityManager installed.
-     */
-    private SecurityManager securityManager = null;
-
-
-    /**
-     * The parent class loader.
-     */
-    private ClassLoader parent = null;
-
-
-    /**
-     * The system class loader.
-     */
-    private ClassLoader system = null;
-
-
-    /**
-     * Has this component been started?
-     */
-    protected boolean started = false;
-
-
-    /**
-     * Has external repositories.
-     */
-    protected boolean hasExternalRepositories = false;
-
-
-    /**
-     * All permission.
-     */
-    private Permission allPermission = new java.security.AllPermission();
-
-
-    // ------------------------------------------------------------- Properties
-
-
-    /**
-     * Get associated resources.
-     */
-    public DirContext getResources() {
-
-        return this.resources;
-
-    }
-
-
-    /**
-     * Set associated resources.
-     */
-    public void setResources(DirContext resources) {
-
-        this.resources = resources;
-
-    }
-
-
-    /**
-     * Return the debugging detail level for this component.
-     */
-    public int getDebug() {
-
-        return (this.debug);
-
-    }
-
-
-    /**
-     * Set the debugging detail level for this component.
-     *
-     * @param debug The new debugging detail level
-     */
-    public void setDebug(int debug) {
-
-        this.debug = debug;
-
-    }
-
-
-    /**
-     * Return the "delegate first" flag for this class loader.
-     */
-    public boolean getDelegate() {
-
-        return (this.delegate);
-
-    }
-
-
-    /**
-     * Set the "delegate first" flag for this class loader.
-     *
-     * @param delegate The new "delegate first" flag
-     */
-    public void setDelegate(boolean delegate) {
-
-        this.delegate = delegate;
-
-    }
-
-
-    /**
-     * If there is a Java SecurityManager create a read FilePermission
-     * or JndiPermission for the file directory path.
-     *
-     * @param path file directory path
-     */
-    public void addPermission(String path) {
-        if (path == null) {
-            return;
-        }
-
-        if (securityManager != null) {
-            Permission permission = null;
-            if( path.startsWith("jndi:") || path.startsWith("jar:jndi:") ) {
-                if (!path.endsWith("/")) {
-                    path = path + "/";
-                }
-                permission = new JndiPermission(path + "*");
-                addPermission(permission);
-            } else {
-                if (!path.endsWith(File.separator)) {
-                    permission = new FilePermission(path, "read");
-                    addPermission(permission);
-                    path = path + File.separator;
-                }
-                permission = new FilePermission(path + "-", "read");
-                addPermission(permission);
-            }
-        }
-    }
-
-
-    /**
-     * If there is a Java SecurityManager create a read FilePermission
-     * or JndiPermission for URL.
-     *
-     * @param url URL for a file or directory on local system
-     */
-    public void addPermission(URL url) {
-        if (url != null) {
-            addPermission(url.toString());
-        }
-    }
-
-
-    /**
-     * If there is a Java SecurityManager create a Permission.
-     *
-     * @param url URL for a file or directory on local system
-     */
-    public void addPermission(Permission permission) {
-        if ((securityManager != null) && (permission != null)) {
-            permissionList.add(permission);
-        }
-    }
-
-
-    /**
-     * Return the JAR path.
-     */
-    public String getJarPath() {
-
-        return this.jarPath;
-
-    }
-
-
-    /**
-     * Change the Jar path.
-     */
-    public void setJarPath(String jarPath) {
-
-        this.jarPath = jarPath;
-
-    }
-
-
-    /**
-     * Change the work directory.
-     */
-    public void setWorkDir(File workDir) {
-        this.loaderDir = new File(workDir, "loader");
-    }
-
-
-    // ------------------------------------------------------- Reloader Methods
-
-
-    /**
-     * Add a new repository to the set of places this ClassLoader can look for
-     * classes to be loaded.
-     *
-     * @param repository Name of a source of classes to be loaded, such as a
-     *  directory pathname, a JAR file pathname, or a ZIP file pathname
-     *
-     * @exception IllegalArgumentException if the specified repository is
-     *  invalid or does not exist
-     */
-    public void addRepository(String repository) {
-
-        // Ignore any of the standard repositories, as they are set up using
-        // either addJar or addRepository
-        if (repository.startsWith("/WEB-INF/lib")
-            || repository.startsWith("/WEB-INF/classes"))
-            return;
-
-        // Add this repository to our underlying class loader
-        try {
-            URL url = new URL(repository);
-            super.addURL(url);
-            hasExternalRepositories = true;
-            repositoryURLs = null;
-        } catch (MalformedURLException e) {
-            IllegalArgumentException iae = new IllegalArgumentException
-                ("Invalid repository: " + repository); 
-            jdkCompat.chainException(iae, e);
-            throw iae;
-        }
-
-    }
-
-
-    /**
-     * Add a new repository to the set of places this ClassLoader can look for
-     * classes to be loaded.
-     *
-     * @param repository Name of a source of classes to be loaded, such as a
-     *  directory pathname, a JAR file pathname, or a ZIP file pathname
-     *
-     * @exception IllegalArgumentException if the specified repository is
-     *  invalid or does not exist
-     */
-    synchronized void addRepository(String repository, File file) {
-
-        // Note : There should be only one (of course), but I think we should
-        // keep this a bit generic
-
-        if (repository == null)
-            return;
-
-        if (log.isDebugEnabled())
-            log.debug("addRepository(" + repository + ")");
-
-        int i;
-
-        // Add this repository to our internal list
-        String[] result = new String[repositories.length + 1];
-        for (i = 0; i < repositories.length; i++) {
-            result[i] = repositories[i];
-        }
-        result[repositories.length] = repository;
-        repositories = result;
-
-        // Add the file to the list
-        File[] result2 = new File[files.length + 1];
-        for (i = 0; i < files.length; i++) {
-            result2[i] = files[i];
-        }
-        result2[files.length] = file;
-        files = result2;
-
-    }
-
-
-    synchronized void addJar(String jar, JarFile jarFile, File file)
-        throws IOException {
-
-        if (jar == null)
-            return;
-        if (jarFile == null)
-            return;
-        if (file == null)
-            return;
-
-        if (log.isDebugEnabled())
-            log.debug("addJar(" + jar + ")");
-
-        int i;
-
-        if ((jarPath != null) && (jar.startsWith(jarPath))) {
-
-            String jarName = jar.substring(jarPath.length());
-            while (jarName.startsWith("/"))
-                jarName = jarName.substring(1);
-
-            String[] result = new String[jarNames.length + 1];
-            for (i = 0; i < jarNames.length; i++) {
-                result[i] = jarNames[i];
-            }
-            result[jarNames.length] = jarName;
-            jarNames = result;
-
-        }
-
-        try {
-
-            // Register the JAR for tracking
-
-            long lastModified =
-                ((ResourceAttributes) resources.getAttributes(jar))
-                .getLastModified();
-
-            String[] result = new String[paths.length + 1];
-            for (i = 0; i < paths.length; i++) {
-                result[i] = paths[i];
-            }
-            result[paths.length] = jar;
-            paths = result;
-
-            long[] result3 = new long[lastModifiedDates.length + 1];
-            for (i = 0; i < lastModifiedDates.length; i++) {
-                result3[i] = lastModifiedDates[i];
-            }
-            result3[lastModifiedDates.length] = lastModified;
-            lastModifiedDates = result3;
-
-        } catch (NamingException e) {
-            // Ignore
-        }
-
-        // If the JAR currently contains invalid classes, don't actually use it
-        // for classloading
-        if (!validateJarFile(file))
-            return;
-
-        JarFile[] result2 = new JarFile[jarFiles.length + 1];
-        for (i = 0; i < jarFiles.length; i++) {
-            result2[i] = jarFiles[i];
-        }
-        result2[jarFiles.length] = jarFile;
-        jarFiles = result2;
-
-        // Add the file to the list
-        File[] result4 = new File[jarRealFiles.length + 1];
-        for (i = 0; i < jarRealFiles.length; i++) {
-            result4[i] = jarRealFiles[i];
-        }
-        result4[jarRealFiles.length] = file;
-        jarRealFiles = result4;
-    }
-
-
-    /**
-     * Return a String array of the current repositories for this class
-     * loader.  If there are no repositories, a zero-length array is
-     * returned.For security reason, returns a clone of the Array (since 
-     * String are immutable).
-     */
-    public String[] findRepositories() {
-
-        return ((String[])repositories.clone());
-
-    }
-
-
-    /**
-     * Have one or more classes or resources been modified so that a reload
-     * is appropriate?
-     */
-    public boolean modified() {
-
-        if (log.isDebugEnabled())
-            log.debug("modified()");
-
-        // Checking for modified loaded resources
-        int length = paths.length;
-
-        // A rare race condition can occur in the updates of the two arrays
-        // It's totally ok if the latest class added is not checked (it will
-        // be checked the next time
-        int length2 = lastModifiedDates.length;
-        if (length > length2)
-            length = length2;
-
-        for (int i = 0; i < length; i++) {
-            try {
-                long lastModified =
-                    ((ResourceAttributes) resources.getAttributes(paths[i]))
-                    .getLastModified();
-                if (lastModified != lastModifiedDates[i]) {
-                    if( log.isDebugEnabled() ) 
-                        log.debug("  Resource '" + paths[i]
-                                  + "' was modified; Date is now: "
-                                  + new java.util.Date(lastModified) + " Was: "
-                                  + new java.util.Date(lastModifiedDates[i]));
-                    return (true);
-                }
-            } catch (NamingException e) {
-                log.error("    Resource '" + paths[i] + "' is missing");
-                return (true);
-            }
-        }
-
-        length = jarNames.length;
-
-        // Check if JARs have been added or removed
-        if (getJarPath() != null) {
-
-            try {
-                NamingEnumeration enum_ = resources.listBindings(getJarPath());
-                int i = 0;
-                while (enum_.hasMoreElements() && (i < length)) {
-                    NameClassPair ncPair = (NameClassPair) enum_.nextElement();
-                    String name = ncPair.getName();
-                    // Ignore non JARs present in the lib folder
-                    if (!name.endsWith(".jar"))
-                        continue;
-                    if (!name.equals(jarNames[i])) {
-                        // Missing JAR
-                        log.info("    Additional JARs have been added : '" 
-                                 + name + "'");
-                        return (true);
-                    }
-                    i++;
-                }
-                if (enum_.hasMoreElements()) {
-                    while (enum_.hasMoreElements()) {
-                        NameClassPair ncPair = 
-                            (NameClassPair) enum_.nextElement();
-                        String name = ncPair.getName();
-                        // Additional non-JAR files are allowed
-                        if (name.endsWith(".jar")) {
-                            // There was more JARs
-                            log.info("    Additional JARs have been added");
-                            return (true);
-                        }
-                    }
-                } else if (i < jarNames.length) {
-                    // There was less JARs
-                    log.info("    Additional JARs have been added");
-                    return (true);
-                }
-            } catch (NamingException e) {
-                if (log.isDebugEnabled())
-                    log.debug("    Failed tracking modifications of '"
-                        + getJarPath() + "'");
-            } catch (ClassCastException e) {
-                log.error("    Failed tracking modifications of '"
-                          + getJarPath() + "' : " + e.getMessage());
-            }
-
-        }
-
-        // No classes have been modified
-        return (false);
-
-    }
-
-
-    /**
-     * Render a String representation of this object.
-     */
-    public String toString() {
-
-        StringBuffer sb = new StringBuffer("WebappClassLoader\r\n");
-        sb.append("  delegate: ");
-        sb.append(delegate);
-        sb.append("\r\n");
-        sb.append("  repositories:\r\n");
-        if (repositories != null) {
-            for (int i = 0; i < repositories.length; i++) {
-                sb.append("    ");
-                sb.append(repositories[i]);
-                sb.append("\r\n");
-            }
-        }
-        if (this.parent != null) {
-            sb.append("----------> Parent Classloader:\r\n");
-            sb.append(this.parent.toString());
-            sb.append("\r\n");
-        }
-        return (sb.toString());
-
-    }
-
-
-    // ---------------------------------------------------- ClassLoader Methods
-
-
-     /**
-      * Add the specified URL to the classloader.
-      */
-     protected void addURL(URL url) {
-         super.addURL(url);
-         hasExternalRepositories = true;
-         repositoryURLs = null;
-     }
-
-
-    /**
-     * Find the specified class in our local repositories, if possible.  If
-     * not found, throw <code>ClassNotFoundException</code>.
-     *
-     * @param name Name of the class to be loaded
-     *
-     * @exception ClassNotFoundException if the class was not found
-     */
-    public Class findClass(String name) throws ClassNotFoundException {
-
-        if (log.isDebugEnabled())
-            log.debug("    findClass(" + name + ")");
-
-        // (1) Permission to define this class when using a SecurityManager
-        if (securityManager != null) {
-            int i = name.lastIndexOf('.');
-            if (i >= 0) {
-                try {
-                    if (log.isTraceEnabled())
-                        log.trace("      securityManager.checkPackageDefinition");
-                    securityManager.checkPackageDefinition(name.substring(0,i));
-                } catch (Exception se) {
-                    if (log.isTraceEnabled())
-                        log.trace("      -->Exception-->ClassNotFoundException", se);
-                    throw new ClassNotFoundException(name, se);
-                }
-            }
-        }
-
-        // Ask our superclass to locate this class, if possible
-        // (throws ClassNotFoundException if it is not found)
-        Class clazz = null;
-        try {
-            if (log.isTraceEnabled())
-                log.trace("      findClassInternal(" + name + ")");
-            try {
-                clazz = findClassInternal(name);
-            } catch(ClassNotFoundException cnfe) {
-                if (!hasExternalRepositories) {
-                    throw cnfe;
-                }
-            } catch(AccessControlException ace) {
-                throw new ClassNotFoundException(name, ace);
-            } catch (RuntimeException e) {
-                if (log.isTraceEnabled())
-                    log.trace("      -->RuntimeException Rethrown", e);
-                throw e;
-            }
-            if ((clazz == null) && hasExternalRepositories) {
-                try {
-                    clazz = super.findClass(name);
-                } catch(AccessControlException ace) {
-                    throw new ClassNotFoundException(name, ace);
-                } catch (RuntimeException e) {
-                    if (log.isTraceEnabled())
-                        log.trace("      -->RuntimeException Rethrown", e);
-                    throw e;
-                }
-            }
-            if (clazz == null) {
-                if (log.isDebugEnabled())
-                    log.debug("    --> Returning ClassNotFoundException");
-                throw new ClassNotFoundException(name);
-            }
-        } catch (ClassNotFoundException e) {
-            if (log.isTraceEnabled())
-                log.trace("    --> Passing on ClassNotFoundException");
-            throw e;
-        }
-
-        // Return the class we have located
-        if (log.isTraceEnabled())
-            log.debug("      Returning class " + clazz);
-        if ((log.isTraceEnabled()) && (clazz != null))
-            log.debug("      Loaded by " + clazz.getClassLoader());
-        return (clazz);
-
-    }
-
-
-    /**
-     * Find the specified resource in our local repository, and return a
-     * <code>URL</code> refering to it, or <code>null</code> if this resource
-     * cannot be found.
-     *
-     * @param name Name of the resource to be found
-     */
-    public URL findResource(final String name) {
-
-        if (log.isDebugEnabled())
-            log.debug("    findResource(" + name + ")");
-
-        URL url = null;
-
-        ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
-        if (entry == null) {
-            entry = findResourceInternal(name, name);
-        }
-        if (entry != null) {
-            url = entry.source;
-        }
-
-        if ((url == null) && hasExternalRepositories)
-            url = super.findResource(name);
-
-        if (log.isDebugEnabled()) {
-            if (url != null)
-                log.debug("    --> Returning '" + url.toString() + "'");
-            else
-                log.debug("    --> Resource not found, returning null");
-        }
-        return (url);
-
-    }
-
-
-    /**
-     * Return an enumeration of <code>URLs</code> representing all of the
-     * resources with the given name.  If no resources with this name are
-     * found, return an empty enumeration.
-     *
-     * @param name Name of the resources to be found
-     *
-     * @exception IOException if an input/output error occurs
-     */
-    public Enumeration findResources(String name) throws IOException {
-
-        if (log.isDebugEnabled())
-            log.debug("    findResources(" + name + ")");
-
-        Vector result = new Vector();
-
-        int jarFilesLength = jarFiles.length;
-        int repositoriesLength = repositories.length;
-
-        int i;
-
-        // Looking at the repositories
-        for (i = 0; i < repositoriesLength; i++) {
-            try {
-                String fullPath = repositories[i] + name;
-                resources.lookup(fullPath);
-                // Note : Not getting an exception here means the resource was
-                // found
-                try {
-                    result.addElement(getURI(new File(files[i], name)));
-                } catch (MalformedURLException e) {
-                    // Ignore
-                }
-            } catch (NamingException e) {
-            }
-        }
-
-        // Looking at the JAR files
-        synchronized (jarFiles) {
-            openJARs();
-            for (i = 0; i < jarFilesLength; i++) {
-                JarEntry jarEntry = jarFiles[i].getJarEntry(name);
-                if (jarEntry != null) {
-                    try {
-                        String jarFakeUrl = getURI(jarRealFiles[i]).toString();
-                        jarFakeUrl = "jar:" + jarFakeUrl + "!/" + name;
-                        result.addElement(new URL(jarFakeUrl));
-                    } catch (MalformedURLException e) {
-                        // Ignore
-                    }
-                }
-            }
-        }
-
-        // Adding the results of a call to the superclass
-        if (hasExternalRepositories) {
-
-            Enumeration otherResourcePaths = super.findResources(name);
-
-            while (otherResourcePaths.hasMoreElements()) {
-                result.addElement(otherResourcePaths.nextElement());
-            }
-
-        }
-
-        return result.elements();
-
-    }
-
-
-    /**
-     * Find the resource with the given name.  A resource is some data
-     * (images, audio, text, etc.) that can be accessed by class code in a
-     * way that is independent of the location of the code.  The name of a
-     * resource is a "/"-separated path name that identifies the resource.
-     * If the resource cannot be found, return <code>null</code>.
-     * <p>
-     * This method searches according to the following algorithm, returning
-     * as soon as it finds the appropriate URL.  If the resource cannot be
-     * found, returns <code>null</code>.
-     * <ul>
-     * <li>If the <code>delegate</code> property is set to <code>true</code>,
-     *     call the <code>getResource()</code> method of the parent class
-     *     loader, if any.</li>
-     * <li>Call <code>findResource()</code> to find this resource in our
-     *     locally defined repositories.</li>
-     * <li>Call the <code>getResource()</code> method of the parent class
-     *     loader, if any.</li>
-     * </ul>
-     *
-     * @param name Name of the resource to return a URL for
-     */
-    public URL getResource(String name) {
-
-        if (log.isDebugEnabled())
-            log.debug("getResource(" + name + ")");
-        URL url = null;
-
-        // (1) Delegate to parent if requested
-        if (delegate) {
-            if (log.isDebugEnabled())
-                log.debug("  Delegating to parent classloader " + parent);
-            ClassLoader loader = parent;
-            if (loader == null)
-                loader = system;
-            url = loader.getResource(name);
-            if (url != null) {
-                if (log.isDebugEnabled())
-                    log.debug("  --> Returning '" + url.toString() + "'");
-                return (url);
-            }
-        }
-
-        // (2) Search local repositories
-        url = findResource(name);
-        if (url != null) {
-            // Locating the repository for special handling in the case 
-            // of a JAR
-            ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
-            try {
-                String repository = entry.codeBase.toString();
-                if ((repository.endsWith(".jar")) 
-                    && (!(name.endsWith(".class")))) {
-                    // Copy binary content to the work directory if not present
-                    File resourceFile = new File(loaderDir, name);
-                    url = resourceFile.toURL();
-                }
-            } catch (Exception e) {
-                // Ignore
-            }
-            if (log.isDebugEnabled())
-                log.debug("  --> Returning '" + url.toString() + "'");
-            return (url);
-        }
-
-        // (3) Delegate to parent unconditionally if not already attempted
-        if( !delegate ) {
-            ClassLoader loader = parent;
-            if (loader == null)
-                loader = system;
-            url = loader.getResource(name);
-            if (url != null) {
-                if (log.isDebugEnabled())
-                    log.debug("  --> Returning '" + url.toString() + "'");
-                return (url);
-            }
-        }
-
-        // (4) Resource was not found
-        if (log.isDebugEnabled())
-            log.debug("  --> Resource not found, returning null");
-        return (null);
-
-    }
-
-
-    /**
-     * Find the resource with the given name, and return an input stream
-     * that can be used for reading it.  The search order is as described
-     * for <code>getResource()</code>, after checking to see if the resource
-     * data has been previously cached.  If the resource cannot be found,
-     * return <code>null</code>.
-     *
-     * @param name Name of the resource to return an input stream for
-     */
-    public InputStream getResourceAsStream(String name) {
-
-        if (log.isDebugEnabled())
-            log.debug("getResourceAsStream(" + name + ")");
-        InputStream stream = null;
-
-        // (0) Check for a cached copy of this resource
-        stream = findLoadedResource(name);
-        if (stream != null) {
-            if (log.isDebugEnabled())
-                log.debug("  --> Returning stream from cache");
-            return (stream);
-        }
-
-        // (1) Delegate to parent if requested
-        if (delegate) {
-            if (log.isDebugEnabled())
-                log.debug("  Delegating to parent classloader " + parent);
-            ClassLoader loader = parent;
-            if (loader == null)
-                loader = system;
-            stream = loader.getResourceAsStream(name);
-            if (stream != null) {
-                // FIXME - cache???
-                if (log.isDebugEnabled())
-                    log.debug("  --> Returning stream from parent");
-                return (stream);
-            }
-        }
-
-        // (2) Search local repositories
-        if (log.isDebugEnabled())
-            log.debug("  Searching local repositories");
-        URL url = findResource(name);
-        if (url != null) {
-            // FIXME - cache???
-            if (log.isDebugEnabled())
-                log.debug("  --> Returning stream from local");
-            stream = findLoadedResource(name);
-            try {
-                if (hasExternalRepositories && (stream == null))
-                    stream = url.openStream();
-            } catch (IOException e) {
-                ; // Ignore
-            }
-            if (stream != null)
-                return (stream);
-        }
-
-        // (3) Delegate to parent unconditionally
-        if (!delegate) {
-            if (log.isDebugEnabled())
-                log.debug("  Delegating to parent classloader unconditionally " + parent);
-            ClassLoader loader = parent;
-            if (loader == null)
-                loader = system;
-            stream = loader.getResourceAsStream(name);
-            if (stream != null) {
-                // FIXME - cache???
-                if (log.isDebugEnabled())
-                    log.debug("  --> Returning stream from parent");
-                return (stream);
-            }
-        }
-
-        // (4) Resource was not found
-        if (log.isDebugEnabled())
-            log.debug("  --> Resource not found, returning null");
-        return (null);
-
-    }
-
-
-    /**
-     * Load the class with the specified name.  This method searches for
-     * classes in the same manner as <code>loadClass(String, boolean)</code>
-     * with <code>false</code> as the second argument.
-     *
-     * @param name Name of the class to be loaded
-     *
-     * @exception ClassNotFoundException if the class was not found
-     */
-    public Class loadClass(String name) throws ClassNotFoundException {
-
-        return (loadClass(name, false));
-
-    }
-
-
-    /**
-     * Load the class with the specified name, searching using the following
-     * algorithm until it finds and returns the class.  If the class cannot
-     * be found, returns <code>ClassNotFoundException</code>.
-     * <ul>
-     * <li>Call <code>findLoadedClass(String)</code> to check if the
-     *     class has already been loaded.  If it has, the same
-     *     <code>Class</code> object is returned.</li>
-     * <li>If the <code>delegate</code> property is set to <code>true</code>,
-     *     call the <code>loadClass()</code> method of the parent class
-     *     loader, if any.</li>
-     * <li>Call <code>findClass()</code> to find this class in our locally
-     *     defined repositories.</li>
-     * <li>Call the <code>loadClass()</code> method of our parent
-     *     class loader, if any.</li>
-     * </ul>
-     * If the class was found using the above steps, and the
-     * <code>resolve</code> flag is <code>true</code>, this method will then
-     * call <code>resolveClass(Class)</code> on the resulting Class object.
-     *
-     * @param name Name of the class to be loaded
-     * @param resolve If <code>true</code> then resolve the class
-     *
-     * @exception ClassNotFoundException if the class was not found
-     */
-    public Class loadClass(String name, boolean resolve)
-        throws ClassNotFoundException {
-
-        if (log.isDebugEnabled())
-            log.debug("loadClass(" + name + ", " + resolve + ")");
-        Class clazz = null;
-
-        // Don't load classes if class loader is stopped
-        if (!started) {
-            log.info(sm.getString("webappClassLoader.stopped"));
-            throw new ThreadDeath();
-        }
-
-        // (0) Check our previously loaded local class cache
-        clazz = findLoadedClass0(name);
-        if (clazz != null) {
-            if (log.isDebugEnabled())
-                log.debug("  Returning class from cache");
-            if (resolve)
-                resolveClass(clazz);
-            return (clazz);
-        }
-
-        // (0.1) Check our previously loaded class cache
-        clazz = findLoadedClass(name);
-        if (clazz != null) {
-            if (log.isDebugEnabled())
-                log.debug("  Returning class from cache");
-            if (resolve)
-                resolveClass(clazz);
-            return (clazz);
-        }
-
-        // (0.2) Try loading the class with the system class loader, to prevent
-        //       the webapp from overriding J2SE classes
-        // GOOGLE: use the bootstrap loader, not the system loader; it breaks
-        //       embedding.
-        try {
-            // clazz = system.loadClass(name);
-             clazz = Class.forName(name, false, null);
-             if (clazz != null) {
-                 if (resolve)
-                     resolveClass(clazz);
-                 return (clazz);
-             }
-        } catch (ClassNotFoundException e) {
-            // Ignore
-        }
-
-        // (0.5) Permission to access this class when using a SecurityManager
-        if (securityManager != null) {
-            int i = name.lastIndexOf('.');
-            if (i >= 0) {
-                try {
-                    securityManager.checkPackageAccess(name.substring(0,i));
-                } catch (SecurityException se) {
-                    String error = "Security Violation, attempt to use " +
-                        "Restricted Class: " + name;
-                    log.info(error, se);
-                    throw new ClassNotFoundException(error, se);
-                }
-            }
-        }
-
-        boolean delegateLoad = delegate || filter(name);
-
-        // (1) Delegate to our parent if requested
-        if (delegateLoad) {
-            if (log.isDebugEnabled())
-                log.debug("  Delegating to parent classloader1 " + parent);
-            ClassLoader loader = parent;
-            if (loader == null)
-                loader = system;
-            try {
-                clazz = loader.loadClass(name);
-                if (clazz != null) {
-                    if (log.isDebugEnabled())
-                        log.debug("  Loading class from parent");
-                    if (resolve)
-                        resolveClass(clazz);
-                    return (clazz);
-                }
-            } catch (ClassNotFoundException e) {
-                ;
-            }
-        }
-
-        // (2) Search local repositories
-        if (log.isDebugEnabled())
-            log.debug("  Searching local repositories");
-        try {
-            clazz = findClass(name);
-            if (clazz != null) {
-                if (log.isDebugEnabled())
-                    log.debug("  Loading class from local repository");
-                if (resolve)
-                    resolveClass(clazz);
-                return (clazz);
-            }
-        } catch (ClassNotFoundException e) {
-            ;
-        }
-
-        // (3) Delegate to parent unconditionally
-        if (!delegateLoad) {
-            if (log.isDebugEnabled())
-                log.debug("  Delegating to parent classloader at end: " + parent);
-            ClassLoader loader = parent;
-            if (loader == null)
-                loader = system;
-            try {
-                clazz = loader.loadClass(name);
-                if (clazz != null) {
-                    if (log.isDebugEnabled())
-                        log.debug("  Loading class from parent");
-                    if (resolve)
-                        resolveClass(clazz);
-                    return (clazz);
-                }
-            } catch (ClassNotFoundException e) {
-                ;
-            }
-        }
-
-        throw new ClassNotFoundException(name);
-    }
-
-
-    /**
-     * Get the Permissions for a CodeSource.  If this instance
-     * of WebappClassLoader is for a web application context,
-     * add read FilePermission or JndiPermissions for the base
-     * directory (if unpacked),
-     * the context URL, and jar file resources.
-     *
-     * @param codeSource where the code was loaded from
-     * @return PermissionCollection for CodeSource
-     */
-    protected PermissionCollection getPermissions(CodeSource codeSource) {
-
-        String codeUrl = codeSource.getLocation().toString();
-        PermissionCollection pc;
-        if ((pc = (PermissionCollection)loaderPC.get(codeUrl)) == null) {
-            pc = super.getPermissions(codeSource);
-            if (pc != null) {
-                Iterator perms = permissionList.iterator();
-                while (perms.hasNext()) {
-                    Permission p = (Permission)perms.next();
-                    pc.add(p);
-                }
-                loaderPC.put(codeUrl,pc);
-            }
-        }
-        return (pc);
-
-    }
-
-
-    /**
-     * Returns the search path of URLs for loading classes and resources.
-     * This includes the original list of URLs specified to the constructor,
-     * along with any URLs subsequently appended by the addURL() method.
-     * @return the search path of URLs for loading classes and resources.
-     */
-    public URL[] getURLs() {
-
-        if (repositoryURLs != null) {
-            return repositoryURLs;
-        }
-
-        URL[] external = super.getURLs();
-
-        int filesLength = files.length;
-        int jarFilesLength = jarRealFiles.length;
-        int length = filesLength + jarFilesLength + external.length;
-        int i;
-
-        try {
-
-            URL[] urls = new URL[length];
-            for (i = 0; i < length; i++) {
-                if (i < filesLength) {
-                    urls[i] = getURL(files[i]);
-                } else if (i < filesLength + jarFilesLength) {
-                    urls[i] = getURL(jarRealFiles[i - filesLength]);
-                } else {
-                    urls[i] = external[i - filesLength - jarFilesLength];
-                }
-            }
-
-            repositoryURLs = urls;
-
-        } catch (MalformedURLException e) {
-            repositoryURLs = new URL[0];
-        }
-
-        return repositoryURLs;
-
-    }
-
-
-    // ------------------------------------------------------ Lifecycle Methods
-
-
-    /**
-     * Add a lifecycle event listener to this component.
-     *
-     * @param listener The listener to add
-     */
-    public void addLifecycleListener(LifecycleListener listener) {
-    }
-
-
-    /**
-     * Get the lifecycle listeners associated with this lifecycle. If this 
-     * Lifecycle has no listeners registered, a zero-length array is returned.
-     */
-    public LifecycleListener[] findLifecycleListeners() {
-        return new LifecycleListener[0];
-    }
-
-
-    /**
-     * Remove a lifecycle event listener from this component.
-     *
-     * @param listener The listener to remove
-     */
-    public void removeLifecycleListener(LifecycleListener listener) {
-    }
-
-
-    /**
-     * Start the class loader.
-     *
-     * @exception LifecycleException if a lifecycle error occurs
-     */
-    public void start() throws LifecycleException {
-
-        started = true;
-
-    }
-
-
-    /**
-     * Stop the class loader.
-     *
-     * @exception LifecycleException if a lifecycle error occurs
-     */
-    public void stop() throws LifecycleException {
-
-        started = false;
-
-        int length = files.length;
-        for (int i = 0; i < length; i++) {
-            files[i] = null;
-        }
-
-        length = jarFiles.length;
-        for (int i = 0; i < length; i++) {
-            try {
-                if (jarFiles[i] != null) {
-                    jarFiles[i].close();
-                }
-            } catch (IOException e) {
-                // Ignore
-            }
-            jarFiles[i] = null;
-        }
-
-        notFoundResources.clear();
-        resourceEntries.clear();
-        resources = null;
-        repositories = null;
-        repositoryURLs = null;
-        files = null;
-        jarFiles = null;
-        jarRealFiles = null;
-        jarPath = null;
-        jarNames = null;
-        lastModifiedDates = null;
-        paths = null;
-        hasExternalRepositories = false;
-        parent = null;
-
-        permissionList.clear();
-        loaderPC.clear();
-
-        if (loaderDir != null) {
-            deleteDir(loaderDir);
-        }
-
-        org.apache.commons.logging.LogFactory.release(this);
-
-    }
-
-
-    /**
-     * Used to periodically signal to the classloader to release 
-     * JAR resources.
-     */
-    public void closeJARs(boolean force) {
-        if (jarFiles.length > 0) {
-            try {
-                synchronized (jarFiles) {
-                    if (force || (System.currentTimeMillis() 
-                                  > (lastJarAccessed + 90000))) {
-                        for (int i = 0; i < jarFiles.length; i++) {
-                            if (jarFiles[i] != null) {
-                                jarFiles[i].close();
-                                jarFiles[i] = null;
-                            }
-                        }
-                    }
-                }
-            } catch (IOException e) {
-                log("Failed to close JAR", e);
-            }
-        }
-    }
-
-
-    // ------------------------------------------------------ Protected Methods
-
-
-    /**
-     * Used to periodically signal to the classloader to release JAR resources.
-     */
-    protected void openJARs() {
-        if (started && (jarFiles.length > 0)) {
-            lastJarAccessed = System.currentTimeMillis();
-            if (jarFiles[0] == null) {
-                try {
-                    for (int i = 0; i < jarFiles.length; i++) {
-                        jarFiles[i] = new JarFile(jarRealFiles[i]);
-                    }
-                } catch (IOException e) {
-                    log("Failed to open JAR", e);
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Find specified class in local repositories.
-     *
-     * @return the loaded class, or null if the class isn't found
-     */
-    protected Class findClassInternal(String name)
-        throws ClassNotFoundException {
-
-        if (!validate(name))
-            throw new ClassNotFoundException(name);
-
-        String tempPath = name.replace('.', '/');
-        String classPath = tempPath + ".class";
-
-        ResourceEntry entry = null;
-
-        entry = findResourceInternal(name, classPath);
-
-        if ((entry == null) || (entry.binaryContent == null))
-            throw new ClassNotFoundException(name);
-
-        Class clazz = entry.loadedClass;
-        if (clazz != null)
-            return clazz;
-
-        // Looking up the package
-        String packageName = null;
-        int pos = name.lastIndexOf('.');
-        if (pos != -1)
-            packageName = name.substring(0, pos);
-
-        Package pkg = null;
-
-        if (packageName != null) {
-
-            pkg = getPackage(packageName);
-
-            // Define the package (if null)
-            if (pkg == null) {
-                if (entry.manifest == null) {
-                    definePackage(packageName, null, null, null, null, null,
-                                  null, null);
-                } else {
-                    definePackage(packageName, entry.manifest, entry.codeBase);
-                }
-            }
-
-        }
-
-        // Create the code source object
-        CodeSource codeSource =
-            new CodeSource(entry.codeBase, entry.certificates);
-
-        if (securityManager != null) {
-
-            // Checking sealing
-            if (pkg != null) {
-                boolean sealCheck = true;
-                if (pkg.isSealed()) {
-                    sealCheck = pkg.isSealed(entry.codeBase);
-                } else {
-                    sealCheck = (entry.manifest == null)
-                        || !isPackageSealed(packageName, entry.manifest);
-                }
-                if (!sealCheck)
-                    throw new SecurityException
-                        ("Sealing violation loading " + name + " : Package "
-                         + packageName + " is sealed.");
-            }
-
-        }
-
-        if (entry.loadedClass == null) {
-            synchronized (this) {
-                if (entry.loadedClass == null) {
-                    clazz = defineClass(name, entry.binaryContent, 0,
-                                        entry.binaryContent.length, 
-                                        codeSource);
-                    entry.loadedClass = clazz;
-                    entry.binaryContent = null;
-                    entry.source = null;
-                    entry.codeBase = null;
-                    entry.manifest = null;
-                    entry.certificates = null;
-                } else {
-                    clazz = entry.loadedClass;
-                }
-            }
-        } else {
-            clazz = entry.loadedClass;
-        }
-
-        return clazz;
-
-    }
-
-    /**
-     * Find specified resource in local repositories. This block
-     * will execute under an AccessControl.doPrivilege block.
-     *
-     * @return the loaded resource, or null if the resource isn't found
-     */
-    private ResourceEntry findResourceInternal(File file, String path){
-        ResourceEntry entry = new ResourceEntry();
-        try {
-            entry.source = getURI(new File(file, path));
-            entry.codeBase = getURL(new File(file, path));
-        } catch (MalformedURLException e) {
-            return null;
-        }   
-        return entry;
-    }
-    
-
-    /**
-     * Find specified resource in local repositories.
-     *
-     * @return the loaded resource, or null if the resource isn't found
-     */
-    protected ResourceEntry findResourceInternal(String name, String path) {
-
-        if (!started) {
-            log.info(sm.getString("webappClassLoader.stopped"));
-            return null;
-        }
-
-        if ((name == null) || (path == null))
-            return null;
-
-        ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
-        if (entry != null)
-            return entry;
-
-        int contentLength = -1;
-        InputStream binaryStream = null;
-
-        int jarFilesLength = jarFiles.length;
-        int repositoriesLength = repositories.length;
-
-        int i;
-
-        Resource resource = null;
-
-        for (i = 0; (entry == null) && (i < repositoriesLength); i++) {
-            try {
-
-                String fullPath = repositories[i] + path;
-
-                Object lookupResult = resources.lookup(fullPath);
-                if (lookupResult instanceof Resource) {
-                    resource = (Resource) lookupResult;
-                }
-
-                // Note : Not getting an exception here means the resource was
-                // found
-                 if (securityManager != null) {
-                    PrivilegedAction dp =
-                        new PrivilegedFindResource(files[i], path);
-                    entry = (ResourceEntry)AccessController.doPrivileged(dp);
-                 } else {
-                    entry = findResourceInternal(files[i], path);
-                 }
-
-                ResourceAttributes attributes =
-                    (ResourceAttributes) resources.getAttributes(fullPath);
-                contentLength = (int) attributes.getContentLength();
-                entry.lastModified = attributes.getLastModified();
-
-                if (resource != null) {
-
-                    try {
-                        binaryStream = resource.streamContent();
-                    } catch (IOException e) {
-                        return null;
-                    }
-
-                    // Register the full path for modification checking
-                    // Note: Only syncing on a 'constant' object is needed
-                    synchronized (allPermission) {
-
-                        int j;
-
-                        long[] result2 = 
-                            new long[lastModifiedDates.length + 1];
-                        for (j = 0; j < lastModifiedDates.length; j++) {
-                            result2[j] = lastModifiedDates[j];
-                        }
-                        result2[lastModifiedDates.length] = entry.lastModified;
-                        lastModifiedDates = result2;
-
-                        String[] result = new String[paths.length + 1];
-                        for (j = 0; j < paths.length; j++) {
-                            result[j] = paths[j];
-                        }
-                        result[paths.length] = fullPath;
-                        paths = result;
-
-                    }
-
-                }
-
-            } catch (NamingException e) {
-            }
-        }
-
-        if ((entry == null) && (notFoundResources.containsKey(name)))
-            return null;
-
-        JarEntry jarEntry = null;
-
-        synchronized (jarFiles) {
-
-            openJARs();
-            for (i = 0; (entry == null) && (i < jarFilesLength); i++) {
-
-                jarEntry = jarFiles[i].getJarEntry(path);
-
-                if (jarEntry != null) {
-
-                    entry = new ResourceEntry();
-                    try {
-                        entry.codeBase = getURL(jarRealFiles[i]);
-                        String jarFakeUrl = getURI(jarRealFiles[i]).toString();
-                        jarFakeUrl = "jar:" + jarFakeUrl + "!/" + path;
-                        entry.source = new URL(jarFakeUrl);
-                        entry.lastModified = jarRealFiles[i].lastModified();
-                    } catch (MalformedURLException e) {
-                        return null;
-                    }
-                    contentLength = (int) jarEntry.getSize();
-                    try {
-                        entry.manifest = jarFiles[i].getManifest();
-                        binaryStream = jarFiles[i].getInputStream(jarEntry);
-                    } catch (IOException e) {
-                        return null;
-                    }
-
-                    // Extract resources contained in JAR to the workdir
-                    if (!(path.endsWith(".class"))) {
-                        byte[] buf = new byte[1024];
-                        File resourceFile = new File
-                            (loaderDir, jarEntry.getName());
-                        if (!resourceFile.exists()) {
-                            Enumeration entries = jarFiles[i].entries();
-                            while (entries.hasMoreElements()) {
-                                JarEntry jarEntry2 = 
-                                    (JarEntry) entries.nextElement();
-                                if (!(jarEntry2.isDirectory()) 
-                                    && (!jarEntry2.getName().endsWith
-                                        (".class"))) {
-                                    resourceFile = new File
-                                        (loaderDir, jarEntry2.getName());
-                                    // No need to check mkdirs result because an
-                                    // IOException will occur anyway
-                                    resourceFile.getParentFile().mkdirs();
-                                    FileOutputStream os = null;
-                                    InputStream is = null;
-                                    try {
-                                        is = jarFiles[i].getInputStream
-                                            (jarEntry2);
-                                        os = new FileOutputStream
-                                            (resourceFile);
-                                        while (true) {
-                                            int n = is.read(buf);
-                                            if (n <= 0) {
-                                                break;
-                                            }
-                                            os.write(buf, 0, n);
-                                        }
-                                    } catch (IOException e) {
-                                        // Ignore
-                                    } finally {
-                                        try {
-                                            if (is != null) {
-                                                is.close();
-                                            }
-                                        } catch (IOException e) {
-                                        }
-                                        try {
-                                            if (os != null) {
-                                                os.close();
-                                            }
-                                        } catch (IOException e) {
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                }
-
-            }
-
-            if (entry == null) {
-                synchronized (notFoundResources) {
-                    notFoundResources.put(name, name);
-                }
-                return null;
-            }
-
-            if (binaryStream != null) {
-
-                byte[] binaryContent = new byte[contentLength];
-
-                try {
-                    int pos = 0;
-
-                    while (true) {
-                        int n = binaryStream.read(binaryContent, pos,
-                                                  binaryContent.length - pos);
-                        if (n <= 0)
-                            break;
-                        pos += n;
-                    }
-                    binaryStream.close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                    return null;
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    return null;
-                }
-
-                entry.binaryContent = binaryContent;
-
-                // The certificates are only available after the JarEntry 
-                // associated input stream has been fully read
-                if (jarEntry != null) {
-                    entry.certificates = jarEntry.getCertificates();
-                }
-
-            }
-
-        }
-
-        // Add the entry in the local resource repository
-        synchronized (resourceEntries) {
-            // Ensures that all the threads which may be in a race to load
-            // a particular class all end up with the same ResourceEntry
-            // instance
-            ResourceEntry entry2 = (ResourceEntry) resourceEntries.get(name);
-            if (entry2 == null) {
-                resourceEntries.put(name, entry);
-            } else {
-                entry = entry2;
-            }
-        }
-
-        return entry;
-
-    }
-
-
-    /**
-     * Returns true if the specified package name is sealed according to the
-     * given manifest.
-     */
-    protected boolean isPackageSealed(String name, Manifest man) {
-
-        String path = name + "/";
-        Attributes attr = man.getAttributes(path);
-        String sealed = null;
-        if (attr != null) {
-            sealed = attr.getValue(Name.SEALED);
-        }
-        if (sealed == null) {
-            if ((attr = man.getMainAttributes()) != null) {
-                sealed = attr.getValue(Name.SEALED);
-            }
-        }
-        return "true".equalsIgnoreCase(sealed);
-
-    }
-
-
-    /**
-     * Finds the resource with the given name if it has previously been
-     * loaded and cached by this class loader, and return an input stream
-     * to the resource data.  If this resource has not been cached, return
-     * <code>null</code>.
-     *
-     * @param name Name of the resource to return
-     */
-    protected InputStream findLoadedResource(String name) {
-
-        ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
-        if (entry != null) {
-            if (entry.binaryContent != null)
-                return new ByteArrayInputStream(entry.binaryContent);
-        }
-        return (null);
-
-    }
-
-
-    /**
-     * Finds the class with the given name if it has previously been
-     * loaded and cached by this class loader, and return the Class object.
-     * If this class has not been cached, return <code>null</code>.
-     *
-     * @param name Name of the resource to return
-     */
-    protected Class findLoadedClass0(String name) {
-
-        ResourceEntry entry = (ResourceEntry) resourceEntries.get(name);
-        if (entry != null) {
-            return entry.loadedClass;
-        }
-        return (null);  // FIXME - findLoadedResource()
-
-    }
-
-
-    /**
-     * Refresh the system policy file, to pick up eventual changes.
-     */
-    protected void refreshPolicy() {
-
-        try {
-            // The policy file may have been modified to adjust 
-            // permissions, so we're reloading it when loading or 
-            // reloading a Context
-            Policy policy = Policy.getPolicy();
-            policy.refresh();
-        } catch (AccessControlException e) {
-            // Some policy files may restrict this, even for the core,
-            // so this exception is ignored
-        }
-
-    }
-
-
-    /**
-     * Filter classes.
-     * 
-     * @param name class name
-     * @return true if the class should be filtered
-     */
-    protected boolean filter(String name) {
-
-        if (name == null)
-            return false;
-
-        // Looking up the package
-        String packageName = null;
-        int pos = name.lastIndexOf('.');
-        if (pos != -1)
-            packageName = name.substring(0, pos);
-        else
-            return false;
-
-        for (int i = 0; i < packageTriggers.length; i++) {
-            if (packageName.startsWith(packageTriggers[i]))
-                return true;
-        }
-
-        return false;
-
-    }
-
-
-    /**
-     * Validate a classname. As per SRV.9.7.2, we must restict loading of 
-     * classes from J2SE (java.*) and classes of the servlet API 
-     * (javax.servlet.*). That should enhance robustness and prevent a number
-     * of user error (where an older version of servlet.jar would be present
-     * in /WEB-INF/lib).
-     * 
-     * @param name class name
-     * @return true if the name is valid
-     */
-    protected boolean validate(String name) {
-
-        if (name == null)
-            return false;
-        if (name.startsWith("java."))
-            return false;
-
-        return true;
-
-    }
-
-
-    /**
-     * Check the specified JAR file, and return <code>true</code> if it does
-     * not contain any of the trigger classes.
-     *
-     * @param jarfile The JAR file to be checked
-     *
-     * @exception IOException if an input/output error occurs
-     */
-    private boolean validateJarFile(File jarfile)
-        throws IOException {
-
-        if (triggers == null)
-            return (true);
-        JarFile jarFile = new JarFile(jarfile);
-        for (int i = 0; i < triggers.length; i++) {
-            Class clazz = null;
-            try {
-                if (parent != null) {
-                    clazz = parent.loadClass(triggers[i]);
-                } else {
-                    clazz = Class.forName(triggers[i]);
-                }
-            } catch (Throwable t) {
-                clazz = null;
-            }
-            if (clazz == null)
-                continue;
-            String name = triggers[i].replace('.', '/') + ".class";
-            if (log.isDebugEnabled())
-                log.debug(" Checking for " + name);
-            JarEntry jarEntry = jarFile.getJarEntry(name);
-            if (jarEntry != null) {
-                log.info("validateJarFile(" + jarfile + 
-                    ") - jar not loaded. See Servlet Spec 2.3, "
-                    + "section 9.7.2. Offending class: " + name);
-                jarFile.close();
-                return (false);
-            }
-        }
-        jarFile.close();
-        return (true);
-
-    }
-
-
-    /**
-     * Get URL.
-     */
-    protected URL getURL(File file)
-        throws MalformedURLException {
-
-        File realFile = file;
-        try {
-            realFile = realFile.getCanonicalFile();
-        } catch (IOException e) {
-            // Ignore
-        }
-        return realFile.toURL();
-
-    }
-
-
-    /**
-     * Get URL.
-     */
-    protected URL getURI(File file)
-        throws MalformedURLException {
-
-        return jdkCompat.getURI(file);
-
-    }
-
-
-    /**
-     * Delete the specified directory, including all of its contents and
-     * subdirectories recursively.
-     *
-     * @param dir File object representing the directory to be deleted
-     */
-    protected static void deleteDir(File dir) {
-
-        String files[] = dir.list();
-        if (files == null) {
-            files = new String[0];
-        }
-        for (int i = 0; i < files.length; i++) {
-            File file = new File(dir, files[i]);
-            if (file.isDirectory()) {
-                deleteDir(file);
-            } else {
-                file.delete();
-            }
-        }
-        dir.delete();
-
-    }
-
-
-    /**
-     * Log a debugging output message.
-     *
-     * @param message Message to be logged
-     */
-    private void log(String message) {
-
-        System.out.println("WebappClassLoader: " + message);
-
-    }
-
-
-    /**
-     * Log a debugging output message with an exception.
-     *
-     * @param message Message to be logged
-     * @param throwable Exception to be logged
-     */
-    private void log(String message, Throwable throwable) {
-
-        System.out.println("WebappClassLoader: " + message);
-        throwable.printStackTrace(System.out);
-
-    }
-
-}
diff --git a/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java b/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java
index 291dc81..93c0bb7 100644
--- a/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java
+++ b/dev/core/test/com/google/gwt/core/ext/util/UtilSuite.java
@@ -18,7 +18,7 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
-public class UtilSuite extends TestSuite {
+public class UtilSuite {
   public static Test suite() {
     TestSuite suite = new TestSuite("Test suite for Util");
     suite.addTestSuite(UtilTest.class);
diff --git a/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java b/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java
deleted file mode 100644
index 8955714..0000000
--- a/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java
+++ /dev/null
@@ -1,78 +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.dev;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.dev.GWTCompiler.GWTCompilerOptionsImpl;
-import com.google.gwt.dev.jjs.JsOutputOption;
-
-import java.io.File;
-
-/**
- * Test for deprecated {@link GWTShell}.
- */
-@SuppressWarnings("deprecation")
-public class GWTCompilerTest extends ArgProcessorTestBase {
-
-  private final GWTCompiler.ArgProcessor argProcessor;
-  private final GWTCompilerOptionsImpl options = new GWTCompilerOptionsImpl();
-
-  public GWTCompilerTest() {
-    argProcessor = new GWTCompiler.ArgProcessor(options);
-  }
-
-  public void testAllValidArgs() {
-    assertProcessSuccess(argProcessor, "-logLevel", "DEBUG", "-style",
-        "PRETTY", "-ea", "-XdisableAggressiveOptimization", "-out", "myWww",
-        "-gen", "myGen", "c.g.g.h.H", "my.Module");
-
-    assertEquals(new File("myGen").getAbsoluteFile(),
-        options.getGenDir().getAbsoluteFile());
-    assertEquals(new File("myWww"), options.getOutDir());
-
-    assertEquals(TreeLogger.DEBUG, options.getLogLevel());
-    assertEquals(JsOutputOption.PRETTY, options.getOutput());
-    assertTrue(options.isEnableAssertions());
-    assertFalse(options.isAggressivelyOptimize());
-
-    assertEquals(2, options.getModuleNames().size());
-    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
-    assertEquals("my.Module", options.getModuleNames().get(1));
-  }
-
-  public void testDefaultArgs() {
-    assertProcessSuccess(argProcessor, "c.g.g.h.H");
-
-    assertEquals(null, options.getGenDir());
-    assertEquals(new File("").getAbsoluteFile(),
-        options.getOutDir().getAbsoluteFile());
-
-    assertEquals(TreeLogger.INFO, options.getLogLevel());
-    assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
-    assertFalse(options.isEnableAssertions());
-    assertTrue(options.isAggressivelyOptimize());
-
-    assertEquals(1, options.getModuleNames().size());
-    assertEquals("c.g.g.h.H", options.getModuleNames().get(0));
-  }
-
-  public void testForbiddenArgs() {
-    assertProcessFailure(argProcessor, "-localWorkers", "2");
-    assertProcessFailure(argProcessor, "-extra", "extra");
-    assertProcessFailure(argProcessor, "-war", "war");
-    assertProcessFailure(argProcessor, "-work", "work");
-  }
-}
diff --git a/dev/core/test/com/google/gwt/dev/GWTShellTest.java b/dev/core/test/com/google/gwt/dev/GWTShellTest.java
deleted file mode 100644
index 557189e..0000000
--- a/dev/core/test/com/google/gwt/dev/GWTShellTest.java
+++ /dev/null
@@ -1,99 +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.dev;
-
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.dev.GWTShell.ShellOptionsImpl;
-import com.google.gwt.dev.HostedModeTest.MySCL;
-import com.google.gwt.dev.jjs.JsOutputOption;
-import com.google.gwt.dev.shell.BrowserWidgetHostChecker;
-
-import java.io.File;
-
-/**
- * Test for deprecated {@link GWTShell}.
- */
-@SuppressWarnings("deprecation")
-public class GWTShellTest extends ArgProcessorTestBase {
-
-  private final GWTShell.ArgProcessor argProcessor;
-  private final ShellOptionsImpl options = new ShellOptionsImpl();
-
-  public GWTShellTest() {
-    argProcessor = new GWTShell.ArgProcessor(options, false, false);
-  }
-
-  public void testAllValidArgs() {
-    assertProcessSuccess(argProcessor, "-port", "8080", "-whitelist", "white",
-        "-blacklist", "black", "-logLevel", "DEBUG", "-noserver", "-out",
-        "myWww", "-gen", "myGen", "http://www.google.com/", "foo");
-
-    assertNotNull(BrowserWidgetHostChecker.matchWhitelisted("white"));
-    assertNotNull(BrowserWidgetHostChecker.matchBlacklisted("black"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40:88"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40:88/"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1.40:88/foo"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org:88"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org:88/"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org:88/foo"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org/"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://localhost.evildomain.org/foo"));
-    assertFalse(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://www.evildomain.org/foo?http://localhost"));
-    assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1"));
-    assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1:88"));
-    assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1:88/"));
-    assertTrue(BrowserWidgetHostChecker.isAlwaysWhitelisted("http://127.0.0.1:88/foo"));
-
-    assertEquals(new File("myGen").getAbsoluteFile(),
-        options.getGenDir().getAbsoluteFile());
-    assertEquals(new File("myWww"), options.getOutDir());
-
-    assertEquals(TreeLogger.DEBUG, options.getLogLevel());
-
-    assertEquals(8080, options.getPort());
-    assertTrue(options.isNoServer());
-    assertEquals(2, options.getStartupURLs().size());
-    assertEquals("http://www.google.com/", options.getStartupURLs().get(0));
-    assertEquals("foo", options.getStartupURLs().get(1));
-  }
-
-  public void testDefaultArgs() {
-    assertProcessSuccess(argProcessor);
-
-    assertEquals(null, options.getGenDir());
-    assertEquals(new File("").getAbsoluteFile(),
-        options.getOutDir().getAbsoluteFile());
-
-    assertEquals(TreeLogger.INFO, options.getLogLevel());
-    assertEquals(JsOutputOption.OBFUSCATED, options.getOutput());
-    assertFalse(options.isEnableAssertions());
-    assertTrue(options.isAggressivelyOptimize());
-
-    assertEquals(8888, options.getPort());
-    assertFalse(options.isNoServer());
-    assertEquals(0, options.getStartupURLs().size());
-  }
-
-  public void testForbiddenArgs() {
-    assertProcessFailure(argProcessor, "-localWorkers", "2");
-    assertProcessFailure(argProcessor, "-extra", "extra");
-    assertProcessFailure(argProcessor, "-war", "war");
-    assertProcessFailure(argProcessor, "-work", "work");
-    assertProcessFailure(argProcessor, "-server", MySCL.class.getName());
-  }
-}
diff --git a/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java b/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
index 0f428e2..8a988ca 100644
--- a/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
+++ b/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
@@ -89,6 +89,10 @@
         + "$MainClass$NestedClass").getClassNames().size());
   }
 
+  public void testAbstractNative() {
+    assertEquals(2, new AbstractNativeTester().getGeneratedClasses().size());
+  }
+
   public void testAnonymous() {
     assertEquals(1, new AnonymousTester().getGeneratedClasses().size());
   }
@@ -124,6 +128,28 @@
     assertEquals(1, new TopLevelTester().getGeneratedClasses().size());
   }
 
+
+}
+
+/**
+ * For testing a class containing anonymous inner classes with abstract and
+ * native methods.
+ */
+class AbstractNativeTester {
+  void foo() {
+    abstract class Fooer {
+      abstract void foo();
+    }
+    Fooer a = new Fooer() {
+      native void foo();
+    };
+    a.foo();
+  }
+
+  List<String> getGeneratedClasses() {
+    return (new GeneratedClassnameFinder(GeneratedClassnameFinderTest.logger,
+        this.getClass().getName().replace('.', '/'))).getClassNames();
+  }
 }
 
 /**
diff --git a/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java b/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java
index 96b730a..cdd2f1b 100644
--- a/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java
+++ b/dev/core/test/com/google/gwt/dev/javac/typemodel/TypeOracleSuite.java
@@ -18,7 +18,7 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
-public class TypeOracleSuite extends TestSuite {
+public class TypeOracleSuite {
   public static Test suite() {
     TestSuite suite = new TestSuite("Test suite for TypeOracle");
     suite.addTestSuite(AnnotationsTest.class);
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java
index 0913202..878780a 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/DeadCodeEliminationTest.java
@@ -37,6 +37,8 @@
     addSnippetClassDecl("static volatile double d;");
     addSnippetClassDecl("static volatile String s;");
     addSnippetClassDecl("static volatile Object o;");
+
+    runMethodInliner = false;
   }
 
   public void testConditionalOptimizations() throws Exception {
@@ -99,6 +101,27 @@
         "EntryPoint.b && (EntryPoint.i = 1);");
   }
 
+  /**
+   * BUG: JInstance was marked as not having side effects whereas it all depends on the
+   * whether the expression on the left has side effects.
+   *
+   * Reproduces Issue:7818.
+   */
+  public void testInstanceOfOptimization() throws Exception {
+    runMethodInliner = true;
+    addSnippetClassDecl(
+        "static class A  { "
+            + "static int f1;"
+            + "static A createA() { A.f1 = 1; return new A(); } "
+            + "static boolean instanceofMulti() { return (createA() instanceof A); } "
+            + "static boolean inlineable() { instanceofMulti(); return true;}"
+            + "}");
+
+    optimizeExpressions(false, "void", "A.inlineable()")
+        .into("A.f1 = 1; new A();");
+  }
+
+
   public void testDoOptimization() throws Exception {
     optimize("void", "do {} while (b);").intoString(
         "do {", 
@@ -114,8 +137,32 @@
         "} while (false);");
   }
 
+  public void testMultiExpressionOptimization() throws Exception {
+    runMethodInliner = true;
+    addSnippetClassDecl(
+        "static class A  { ",
+        "  static int f;",
+        "  static { if (4-f ==0) f=4; }",
+        "  static boolean t() { return true; }",
+        "  static boolean f() { return false; }",
+        "  static boolean notInlineable() { if (4-f == 0) return true;return false;}",
+        "}");
+
+    addSnippetClassDecl(
+        "static class B  { ",
+        "  static boolean inlineableOr() { return A.t() || A.notInlineable(); }",
+        "  static boolean inlineableAnd() { return A.t() && A.notInlineable(); }",
+        "}");
+
+    optimize("void", "B.inlineableAnd();")
+        .intoString("EntryPoint$A.$clinit();\nEntryPoint$A.notInlineable();");
+    optimize("void", "B.inlineableOr();")
+        .intoString("EntryPoint$A.$clinit();");
+  }
+
   public void testOptimizeStringCalls() throws Exception {
-    // Note: we're limited here by the methods declared in the mock String in JJSTestBase#addBuiltinClasses
+    // Note: we're limited here by the methods declared in the mock String in
+    // JJSTestBase#addBuiltinClasses
 
     // String.length
     optimize("int", "return \"abc\".length();").intoString("return 3;");
@@ -145,10 +192,42 @@
     optimize("double", "return 0.0 - d;").intoString("return 0.0 - EntryPoint.d;");
   }
 
+  public void testMultiExpression_RedundantClinitRemoval() throws Exception {
+    addSnippetClassDecl(
+        "static class A  { "
+            + "static int f1;"
+            + "static int f2;"
+            + "static { f1 = 1; }"
+            + "static void m1() { } "
+            + "}" +
+        "static class B extends A  { "
+            + "static int f3;"
+            + "static int f4;"
+            + "static { f3 = 1; }"
+            + "static void m2() { } "
+            + "}");
+
+    optimizeExpressions(true, "void", "A.m1()", "A.m1()").intoString("EntryPoint$A.$clinit();\n"
+        + "EntryPoint$A.m1();\n"
+        + "EntryPoint$A.m1();");
+    optimizeExpressions(true, "void", "B.m2()", "A.m1()").intoString("EntryPoint$B.$clinit();\n"
+        + "EntryPoint$B.m2();\n"
+        + "EntryPoint$A.m1();");
+    optimizeExpressions(true, "void", "A.m1()", "B.m2()").intoString("EntryPoint$A.$clinit();\n"
+        + "EntryPoint$A.m1();\n"
+        + "EntryPoint$B.$clinit();\n"
+        + "EntryPoint$B.m2();");
+  }
+
+  private boolean runMethodInliner;
+
   @Override
   protected boolean optimizeMethod(JProgram program, JMethod method) {
-    // This is necessary for String calls optimizations
-    MethodCallTightener.exec(program);
+
+    if (runMethodInliner) {
+      MethodInliner.exec(program);
+    }
+
     OptimizerStats result = DeadCodeElimination.exec(program, method);
     if (result.didChange()) {
       // Make sure we converge in one pass.
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java b/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java
index 98a4d13..0d47a3f 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/OptimizerTestBase.java
@@ -16,10 +16,24 @@
 package com.google.gwt.dev.jjs.impl;
 
 import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.jjs.ast.Context;
+import com.google.gwt.dev.jjs.ast.JBinaryOperation;
+import com.google.gwt.dev.jjs.ast.JBinaryOperator;
 import com.google.gwt.dev.jjs.ast.JDeclaredType;
+import com.google.gwt.dev.jjs.ast.JExpression;
+import com.google.gwt.dev.jjs.ast.JExpressionStatement;
 import com.google.gwt.dev.jjs.ast.JField;
+import com.google.gwt.dev.jjs.ast.JFieldRef;
+import com.google.gwt.dev.jjs.ast.JLocal;
+import com.google.gwt.dev.jjs.ast.JLocalRef;
 import com.google.gwt.dev.jjs.ast.JMethod;
+import com.google.gwt.dev.jjs.ast.JMethodBody;
+import com.google.gwt.dev.jjs.ast.JMethodCall;
 import com.google.gwt.dev.jjs.ast.JProgram;
+import com.google.gwt.dev.jjs.ast.JReturnStatement;
+import com.google.gwt.dev.jjs.ast.JStatement;
+import com.google.gwt.dev.jjs.ast.js.JMultiExpression;
 import com.google.gwt.dev.util.Preconditions;
 import com.google.gwt.dev.util.Strings;
 
@@ -94,11 +108,155 @@
     }
   }
 
+  /**
+   * Makes implicit <code>$clinit()</code> calls explicit to mimic the effect of other
+   * optimizations. Otherwise can not test optimizations that involve <code>$clinit</code> calls
+   * as they don't appear when compiling small snippets.
+   *
+   * @param method method to transform to make <code>$clinit</code> calls explicit.
+   */
+  private void insertImplicitClinitCalls(final JMethod method) {
+    // Mimic the method inliner which inserts clinits calls prior to method or field dereference.
+    // The actual clinit() calls might be inserted as a result of optimizations: e,g,
+    // DeadCodeElimination inserts clinit calls when it removes (some) field accesses or method
+    // calls.
+    final JMethodBody body = (JMethodBody) method.getBody();
+
+    new TempLocalVisitor() {
+
+      private JMethodCall createClinitCall(SourceInfo sourceInfo, JDeclaredType targetType) {
+        JMethod clinit = targetType.getClinitTarget().getClinitMethod();
+        assert (JProgram.isClinit(clinit));
+        return new JMethodCall(sourceInfo, null, clinit);
+      }
+
+      private JMultiExpression createMultiExpressionForInstanceAndClinit(JExpression x) {
+        JMultiExpression multi = new JMultiExpression(x.getSourceInfo());
+
+        JMethodCall clinit = null;
+        if (x instanceof JMethodCall) {
+          JExpression instance = ((JMethodCall) x).getInstance();
+
+          // Any instance expression goes first (this can happen even with statics).
+          if (instance != null) {
+
+            multi.exprs.add(instance);
+            JLocal var = createTempLocal(instance.getSourceInfo(), instance.getType());
+
+            JLocalRef localRef = new JLocalRef(var.getSourceInfo(), var);
+            instance = new JBinaryOperation(instance.getSourceInfo(), localRef.getType(),
+                JBinaryOperator.ASG, localRef, instance);
+          }
+          clinit = createClinitCall(x.getSourceInfo(),
+              ((JMethodCall) x).getTarget().getEnclosingType());
+        } else if (x instanceof JFieldRef) {
+          clinit = createClinitCall(x.getSourceInfo(), ((JFieldRef) x).getEnclosingType());
+        }
+        // If we need a clinit call, add it first
+        if (clinit != null) {
+          multi.exprs.add(clinit);
+        }
+        multi.exprs.add(x);
+        return multi;
+      }
+
+      @Override
+      public void endVisit(JMethodCall x, Context ctx) {
+        ctx.replaceMe(createMultiExpressionForInstanceAndClinit(x));
+      }
+
+      @Override
+      public void endVisit(JFieldRef x, Context ctx) {
+        ctx.replaceMe(createMultiExpressionForInstanceAndClinit(x));
+      }
+
+    }.accept(method);
+  }
+
   protected final Result optimize(final String returnType, 
       final String... codeSnippet) throws UnableToCompleteException {
     return optimizeMethod(MAIN_METHOD_NAME, returnType, codeSnippet);
   }
 
+  /**
+   * Test the effect of an optimization on a JMultiExpression.
+   * JMultiExpression can not be constructed from source code at the moment as it is not a valid
+   * java source construct.
+   *
+   * @param addClinitCalls whether to insert the implicit clinit calls. This is necessary because
+   *                       clinit() methods are synthetic can not be inserted explicitly as source
+   *                       code calls.
+   * @param returnType the return type of the JMultiExpression. Must be <code>void</code> or
+   *                   compatible with the last expression.
+   * @param expressionSnippets source code of the expressions.
+   * @return the optimization result.
+   * @throws UnableToCompleteException
+   */
+  protected final Result optimizeExpressions(boolean addClinitCalls, final String returnType,
+                                  final String... expressionSnippets)
+      throws UnableToCompleteException {
+
+    // TODO(rluble): Not very elegant to require that the snippets be statements instead of
+    // expressions.
+
+    assert expressionSnippets.length > 0;
+
+    // Compile as statements
+    if (!returnType.equals("void")) {
+      expressionSnippets[expressionSnippets.length - 1] =
+          "return " + expressionSnippets[expressionSnippets.length - 1];
+    }
+    String snippet = Strings.join(expressionSnippets, ";\n") + ";\n";
+    final JProgram program = compileSnippet(returnType, snippet);
+    JMethod method = findMethod(program, MAIN_METHOD_NAME);
+    JMethodBody body = (JMethodBody) method.getBody();
+    JMultiExpression multi = new JMultiExpression(body.getSourceInfo());
+
+    // Transform statement sequence into a JMultiExpression
+    for (JStatement stmt : body.getStatements()) {
+
+      if (stmt instanceof JExpressionStatement) {
+        JExpressionStatement exprStmt = (JExpressionStatement) stmt;
+        JExpression expr = exprStmt.getExpr();
+        multi.exprs.add(expr);
+      } else if (stmt instanceof JReturnStatement) {
+        JReturnStatement returnStatement = (JReturnStatement) stmt;
+        JExpression expr = returnStatement.getExpr();
+        if (expr != null) {
+            multi.exprs.add(expr);
+        }
+      } else {
+        assert false : "Not a valid multiexpression";
+      }
+    }
+
+    // Take care of the return type
+    JStatement multiStm;
+    if (!returnType.equals("void")) {
+      multiStm = new JReturnStatement(multi.getSourceInfo(), multi);
+    } else {
+      multiStm = multi.makeStatement();
+    }
+
+    // Replace the method body
+    JMethodBody newBody = new JMethodBody(method.getBody().getSourceInfo());
+    newBody.getBlock().addStmt(multiStm);
+    method.setBody(newBody);
+    newBody.setMethod(method);
+    if (addClinitCalls) {
+      insertImplicitClinitCalls(method);
+    }
+
+
+    // Finally optimize.
+    boolean madeChanges = optimizeMethod(program, method);
+    if (madeChanges && runDeadCodeElimination) {
+      DeadCodeElimination.exec(program);
+    }
+
+    return new Result(program, returnType, MAIN_METHOD_NAME, snippet, madeChanges);
+  }
+
   protected final Result optimizeMethod(final String methodName,
       final String mainMethodReturnType, final String... mainMethodSnippet)
       throws UnableToCompleteException {
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
index 9ee6e0d..85e3530 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/gflow/DataflowOptimizerTest.java
@@ -350,9 +350,8 @@
    * despite there being side-effects of the multi-expression.  So, we want to test that inlining
    * proceeds, but not further constant transformation.
    * 
-   * TODO: This test may need to evolve over time, as the specifics of the optimizers change.  One
-   * obvious todo is to allow some form of constant transformation to occur with inlined 
-   * multi-expressions (see comment below).
+   * TODO(rluble): This test may need to evolve over time, as the specifics of the
+   * optimizers change.
    */
   public void testInlinedConstantExpressionWithSideEffects() throws Exception {
     
@@ -374,10 +373,9 @@
               "  fail();",
               "}",
               "return x;")
-        // TODO: Allow the second line below to be transformed to just: "EntryPoint.x = n;"
-        .intoString("Integer n = new Integer(1);",
-                    "((EntryPoint.x = n, true)) || EntryPoint.fail();",
-                    "return EntryPoint.x.intValue();");
+        .into("Integer n = new Integer(1);",
+               "x = n;",
+               "return x;");
     
   }
   
@@ -387,14 +385,21 @@
   @Override
   protected boolean optimizeMethod(JProgram program, JMethod method) {
     boolean didChange = false;
+    boolean optimizeChange = false;
 
-    if (runDCE) {
-      didChange = DeadCodeElimination.exec(program).didChange() || didChange;
-    }
+    // Run optimizations in a loop to make the tests more robusts to unrelated
+    // changes.
+    do {
+      optimizeChange = false;
+      if (runDCE) {
+        optimizeChange = DeadCodeElimination.exec(program).didChange() || optimizeChange;
+      }
 
-    if (runMethodInliner) {
-      didChange = MethodInliner.exec(program).didChange() || didChange;
-    }
+      if (runMethodInliner) {
+        optimizeChange = MethodInliner.exec(program).didChange() || optimizeChange;
+      }
+      didChange = didChange || optimizeChange;
+    } while (optimizeChange);
 
     didChange = DataflowOptimizer.exec(program, method).didChange() || didChange;
     return didChange;
diff --git a/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java b/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
index 2071e3d..a3591db 100644
--- a/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
+++ b/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.collections.collection;
 
+import org.apache.commons.collections.AbstractTestObject;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
@@ -34,8 +36,6 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 
-import org.apache.commons.collections.AbstractTestObject;
-
 /**
  * Abstract test class for {@link java.util.Collection} methods and contracts.
  * <p>
@@ -121,6 +121,7 @@
  * @author Neil O'Toole
  * @author Stephen Colebourne
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestCollection extends AbstractTestObject {
 
     //
diff --git a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java
index d2e6870..a9ce434 100644
--- a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java
+++ b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestIterator.java
@@ -16,11 +16,11 @@
  */
 package org.apache.commons.collections.iterators;
 
+import org.apache.commons.collections.AbstractTestObject;
+
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
-import org.apache.commons.collections.AbstractTestObject;
-
 /**
  * Abstract class for testing the Iterator interface.
  * <p>
@@ -35,6 +35,7 @@
  * @author Morgan Delagrange
  * @author Stephen Colebourne
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestIterator extends AbstractTestObject {
 
     /**
diff --git a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java
index 5bd5191..b5e7e01 100644
--- a/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java
+++ b/dev/core/test/org/apache/commons/collections/iterators/AbstractTestMapIterator.java
@@ -16,14 +16,14 @@
  */
 package org.apache.commons.collections.iterators;
 
+import org.apache.commons.collections.MapIterator;
+
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
-import org.apache.commons.collections.MapIterator;
-
 /**
  * Abstract class for testing the MapIterator interface.
  * <p>
@@ -37,6 +37,7 @@
  * 
  * @author Stephen Colebourne
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestMapIterator extends AbstractTestIterator {
 
     /**
diff --git a/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java b/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java
index 46b0436..a9d1250 100644
--- a/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/AbstractTestIterableMap.java
@@ -16,15 +16,15 @@
  */
 package org.apache.commons.collections.map;
 
+import org.apache.commons.collections.BulkTest;
+import org.apache.commons.collections.IterableMap;
+import org.apache.commons.collections.MapIterator;
+import org.apache.commons.collections.iterators.AbstractTestMapIterator;
+
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.Map;
 
-import org.apache.commons.collections.IterableMap;
-import org.apache.commons.collections.BulkTest;
-import org.apache.commons.collections.MapIterator;
-import org.apache.commons.collections.iterators.AbstractTestMapIterator;
-
 /**
  * Abstract test class for {@link IterableMap} methods and contracts.
  *
@@ -32,6 +32,7 @@
  * 
  * @author Stephen Colebourne
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestIterableMap extends AbstractTestMap {
 
     /**
diff --git a/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java b/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
index 433a665..3d4668f 100644
--- a/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
@@ -16,6 +16,11 @@
  */
 package org.apache.commons.collections.map;
 
+import org.apache.commons.collections.AbstractTestObject;
+import org.apache.commons.collections.BulkTest;
+import org.apache.commons.collections.collection.AbstractTestCollection;
+import org.apache.commons.collections.set.AbstractTestSet;
+
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -25,11 +30,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.commons.collections.AbstractTestObject;
-import org.apache.commons.collections.BulkTest;
-import org.apache.commons.collections.collection.AbstractTestCollection;
-import org.apache.commons.collections.set.AbstractTestSet;
-
 /**
  * Abstract test class for {@link java.util.Map} methods and contracts.
  * <p>
@@ -119,6 +119,7 @@
  * @author Stephen Colebourne
  * @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestMap extends AbstractTestObject {
 
     /**
diff --git a/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java b/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
index 13e042a..532ac95 100644
--- a/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
@@ -16,11 +16,6 @@
  */
 package org.apache.commons.collections.map;
 
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.Map;
-
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import junit.textui.TestRunner;
@@ -28,6 +23,11 @@
 import org.apache.commons.collections.AbstractTestObject;
 import org.apache.commons.collections.IterableMap;
 
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.Map;
+
 /**
  * JUnit tests.
  * 
@@ -35,6 +35,7 @@
  * 
  * @author Stephen Colebourne
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class TestIdentityMap extends AbstractTestObject {
     
     private static final Integer I1A = new Integer(1);
diff --git a/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java b/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java
index 398fa78..dc3a3d4 100644
--- a/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java
+++ b/dev/core/test/org/apache/commons/collections/set/AbstractTestSet.java
@@ -16,14 +16,14 @@
  */
 package org.apache.commons.collections.set;
 
+import org.apache.commons.collections.collection.AbstractTestCollection;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import org.apache.commons.collections.collection.AbstractTestCollection;
-
 /**
  * Abstract test class for {@link Set} methods and contracts.
  * <p>
@@ -43,6 +43,7 @@
  * 
  * @author Paul Jack
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestSet extends AbstractTestCollection {
 
     /**
diff --git a/eclipse/build-tools/ant-gwt/.project b/eclipse/build-tools/ant-gwt/.project
deleted file mode 100644
index 1366e70..0000000
--- a/eclipse/build-tools/ant-gwt/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>ant-gwt</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
-	</natures>
-	<linkedResources>
-		<link>
-			<name>core</name>
-			<type>2</type>
-			<location>GWT_ROOT/build-tools/ant-gwt</location>
-		</link>
-	</linkedResources>
-</projectDescription>
diff --git a/eclipse/build-tools/customchecks/.project b/eclipse/build-tools/customchecks/.project
deleted file mode 100644
index 2895078..0000000
--- a/eclipse/build-tools/customchecks/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>customchecks</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
-	</natures>
-	<linkedResources>
-		<link>
-			<name>core</name>
-			<type>2</type>
-			<location>GWT_ROOT/build-tools/customchecks</location>
-		</link>
-	</linkedResources>
-</projectDescription>
diff --git a/eclipse/build-tools/doctool/.project b/eclipse/build-tools/doctool/.project
deleted file mode 100644
index f998847..0000000
--- a/eclipse/build-tools/doctool/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>DocTool</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
-	</natures>
-	<linkedResources>
-		<link>
-			<name>core</name>
-			<type>2</type>
-			<locationURI>GWT_ROOT/build-tools/doctool</locationURI>
-		</link>
-	</linkedResources>
-</projectDescription>
diff --git a/eclipse/build-tools/ant-gwt/.checkstyle b/eclipse/build_tools/ant_gwt/.checkstyle
similarity index 100%
rename from eclipse/build-tools/ant-gwt/.checkstyle
rename to eclipse/build_tools/ant_gwt/.checkstyle
diff --git a/eclipse/build-tools/ant-gwt/.classpath b/eclipse/build_tools/ant_gwt/.classpath
similarity index 100%
rename from eclipse/build-tools/ant-gwt/.classpath
rename to eclipse/build_tools/ant_gwt/.classpath
diff --git a/eclipse/build_tools/ant_gwt/.project b/eclipse/build_tools/ant_gwt/.project
new file mode 100644
index 0000000..5e11ce7
--- /dev/null
+++ b/eclipse/build_tools/ant_gwt/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ant-gwt</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
+	</natures>
+	<linkedResources>
+		<link>
+			<name>core</name>
+			<type>2</type>
+			<location>GWT_ROOT/build_tools/ant_gwt</location>
+		</link>
+	</linkedResources>
+</projectDescription>
diff --git a/eclipse/build-tools/customchecks/.checkstyle b/eclipse/build_tools/customchecks/.checkstyle
similarity index 100%
rename from eclipse/build-tools/customchecks/.checkstyle
rename to eclipse/build_tools/customchecks/.checkstyle
diff --git a/eclipse/build-tools/customchecks/.classpath b/eclipse/build_tools/customchecks/.classpath
similarity index 100%
rename from eclipse/build-tools/customchecks/.classpath
rename to eclipse/build_tools/customchecks/.classpath
diff --git a/eclipse/build_tools/customchecks/.project b/eclipse/build_tools/customchecks/.project
new file mode 100644
index 0000000..be5e338
--- /dev/null
+++ b/eclipse/build_tools/customchecks/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>customchecks</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
+	</natures>
+	<linkedResources>
+		<link>
+			<name>core</name>
+			<type>2</type>
+			<location>GWT_ROOT/build_tools/customchecks</location>
+		</link>
+	</linkedResources>
+</projectDescription>
diff --git a/eclipse/build-tools/doctool/.checkstyle b/eclipse/build_tools/doctool/.checkstyle
similarity index 100%
rename from eclipse/build-tools/doctool/.checkstyle
rename to eclipse/build_tools/doctool/.checkstyle
diff --git a/eclipse/build-tools/doctool/.classpath b/eclipse/build_tools/doctool/.classpath
similarity index 100%
rename from eclipse/build-tools/doctool/.classpath
rename to eclipse/build_tools/doctool/.classpath
diff --git a/eclipse/build_tools/doctool/.project b/eclipse/build_tools/doctool/.project
new file mode 100644
index 0000000..249e503
--- /dev/null
+++ b/eclipse/build_tools/doctool/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>DocTool</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
+	</natures>
+	<linkedResources>
+		<link>
+			<name>core</name>
+			<type>2</type>
+			<locationURI>GWT_ROOT/build_tools/doctool</locationURI>
+		</link>
+	</linkedResources>
+</projectDescription>
diff --git a/eclipse/dev/.classpath b/eclipse/dev/.classpath
index fa17a0d..4b1f5b4 100644
--- a/eclipse/dev/.classpath
+++ b/eclipse/dev/.classpath
@@ -12,35 +12,16 @@
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/ant-launcher-1.6.5.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/catalina-1.0.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/catalina-optional-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-beanutils-1.6.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-collections-3.1.jar" sourcepath="/GWT_TOOLS/lib/tomcat/commons-collections-3.1-src.zip"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-digester-1.5.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-el-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-logging-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/commons-modeler-1.1.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jakarta-regexp-1.3.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jasper-compiler-1.0.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jasper-runtime-1.0.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/jsp-api-2.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/mx4j-jmx-1.1.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-common-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-factory-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-java-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/naming-resources-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlet-api-2.5.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlet-api-2.4.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlets-common-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlets-default-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/servlets-invoker-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-coyote-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-http11-1.0.jar" sourcepath="/GWT_TOOLS/lib/tomcat/tomcat-http11-1.0.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-jk2-2.1.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/tomcat/tomcat-util-5.1.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-core-js-2.9.jar" sourcepath="/GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-core-js-2.9-sources.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-2.9.jar" sourcepath="/GWT_TOOLS/lib/htmlunit/htmlunit-2.9/htmlunit-2.9-sources.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/guava/guava-10.0.1/guava-10.0.1-rebased.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/sourcemap-rebased.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/jscomp/r1649/compiler-rebased.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/apache/commons/commons-collections-3.2.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/eclipse/external/cldr-tools/.classpath b/eclipse/external/cldr-tools/.classpath
index 60d2da3..a360353 100644
--- a/eclipse/external/cldr-tools/.classpath
+++ b/eclipse/external/cldr-tools/.classpath
@@ -5,7 +5,7 @@
 	<classpathentry kind="var" path="GWT_TOOLS/lib/cup/java-cup-11a.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/xalan/xalan-2.7.1-nocup.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/apache/ant-1.7.1.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/4.4.2/icu4j.jar" sourcepath="/GWT_TOOLS/lib/icu4j/4.4.2/icu4jsrc.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/4.4.2/utilities.jar" sourcepath="/GWT_TOOLS/lib/icu4j/4.4.2/icu4jsrc.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/icu4j.jar" sourcepath="/GWT_TOOLS/lib/icu4j/50.1.1/icu4j-src.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/utilities.jar" sourcepath="/GWT_TOOLS/lib/icu4j/50.1.1/utilities-src.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/eclipse/tools/cldr-import/.classpath b/eclipse/tools/cldr-import/.classpath
index 14514f2..acb1c55 100644
--- a/eclipse/tools/cldr-import/.classpath
+++ b/eclipse/tools/cldr-import/.classpath
@@ -9,7 +9,7 @@
 	<classpathentry combineaccessrules="false" kind="src" path="/cldr-tools"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/gwt-dev"/>
         <classpathentry kind="var" path="GWT_TOOLS/lib/cldr/21/cldr.jar" />
-        <classpathentry kind="var" path="GWT_TOOLS/lib/cldr/21/icu4j.jar" />
-        <classpathentry kind="var" path="GWT_TOOLS/lib/cldr/21/utilities.jar" />
+        <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/icu4j.jar" />
+        <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/utilities.jar" />
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/eclipse/user/.classpath b/eclipse/user/.classpath
index fbbbd48..42172aa 100644
--- a/eclipse/user/.classpath
+++ b/eclipse/user/.classpath
@@ -46,7 +46,7 @@
 	<classpathentry kind="var" path="GWT_TOOLS/lib/slf4j/slf4j-log4j12/slf4j-log4j12-1.6.1.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/guava/guava-10.0.1/guava-10.0.1-rebased.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/streamhtmlparser/streamhtmlparser-jsilver-r10/streamhtmlparser-jsilver-r10-1.5-rebased.jar"/>
-	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/4.4.2/icu4j.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/icu4j.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/javax/activation/activation-1.1.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/javax/xml/bind/jaxb-api-2.1.jar"/>
 	<classpathentry kind="var" path="GWT_TOOLS/lib/hibernate/validator/tck/jsr303-tck-1.0.3.GA-sources.jar"/>
diff --git a/elemental/src/elemental/js/json/JsJsonString.java b/elemental/src/elemental/js/json/JsJsonString.java
index 3ed35bb..2db459b 100644
--- a/elemental/src/elemental/js/json/JsJsonString.java
+++ b/elemental/src/elemental/js/json/JsJsonString.java
@@ -37,7 +37,7 @@
    * MAGIC: String cast to object interface.
    */
   private static native JsJsonString createProd(String string) /*-{
-    return @elemental.js.json.JsJsonValue::box(Lelemental/json/JsonValue;)(value);
+    return @elemental.js.json.JsJsonValue::box(Lelemental/json/JsonValue;)(string);
   }-*/;
 
   protected JsJsonString() {
diff --git a/plugins/Makefile b/plugins/Makefile
deleted file mode 100644
index 28babe1..0000000
--- a/plugins/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-# Placeholder Makefile, to be replaced with ant build file
-
-xpcom::
-	cd xpcom; make
diff --git a/plugins/MissingBrowserPlugin.html b/plugins/MissingBrowserPlugin.html
deleted file mode 100644
index 1ae3dba..0000000
--- a/plugins/MissingBrowserPlugin.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<html>
-<head>
-<title>Missing GWT Browser Plugin</title>
-</head>
-<body>
-<h1>No GWT Browser Plugin Detected</h1>
-GWT Development Mode needs a browser plugin to operate.  Please <a
-  href="http://gwt-dev-plugin-missing.appspot.com/">install</a> the
-appropriate one for your browser.
-</body>
-</html>
diff --git a/plugins/MissingPlugin/assets/Download.psd b/plugins/MissingPlugin/assets/Download.psd
deleted file mode 100644
index da7ca6f..0000000
--- a/plugins/MissingPlugin/assets/Download.psd
+++ /dev/null
Binary files differ
diff --git a/plugins/MissingPlugin/assets/download.png b/plugins/MissingPlugin/assets/download.png
deleted file mode 100644
index 31c080d..0000000
--- a/plugins/MissingPlugin/assets/download.png
+++ /dev/null
Binary files differ
diff --git a/plugins/MissingPlugin/build.xml b/plugins/MissingPlugin/build.xml
deleted file mode 100644
index c3dcf01..0000000
--- a/plugins/MissingPlugin/build.xml
+++ /dev/null
@@ -1,84 +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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<project name="MissingPlugin" default="build" basedir=".">
-  <property name="gwt.root" location="../.." />
-  <property name="project.tail" value="plugins/MissingPlugin" />
-  <import file="${gwt.root}/common.ant.xml" />
-
-  <property.ensure name="gwt.user.jar" location="${gwt.build.lib}/gwt-user.jar" />
-  <property.ensure name="gwt.dev.jar" location="${gwt.build.lib}/gwt-dev.jar" />
-
-  <path id="project.class.path">
-    <pathelement location="war/WEB-INF/classes"/>
-    <pathelement location="${gwt.user.jar}" />
-    <pathelement location="${gwt.dev.jar}" />
-  </path>
-
-  <target name="javac" description="Compile java source">
-    <mkdir dir="war/WEB-INF/classes"/>
-    <javac srcdir="src" includes="**" encoding="utf-8"
-        destdir="war/WEB-INF/classes"
-        source="1.5" target="1.5" nowarn="true"
-        debug="true" debuglevel="lines,vars,source">
-      <classpath refid="project.class.path"/>
-    </javac>
-    <copy todir="war/WEB-INF/classes">
-      <fileset dir="src" excludes="**/*.java"/>
-    </copy>
-  </target>
-
-  <target name="gwtc" depends="javac" description="GWT compile to JavaScript">
-    <gwt.javac destdir="war/WEB-INF/classes">
-      <classpath>
-        <path refid="project.class.path"/>
-      </classpath>
-    </gwt.javac>
-    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
-      <classpath>
-        <pathelement location="src"/>
-        <path refid="project.class.path"/>
-      </classpath>
-      <!-- add jvmarg -Xss16M or similar if you see a StackOverflowError -->
-      <jvmarg value="-Xmx256M"/>
-      <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
-      <arg value="com.google.gwt.missingplugin.MissingPlugin"/>
-    </java>
-  </target>
-
-  <target name="devmode" depends="javac" description="Run development mode">
-    <java failonerror="true" fork="true" classname="com.google.gwt.dev.DevMode">
-      <classpath>
-        <pathelement location="src"/>
-        <path refid="project.class.path"/>
-      </classpath>
-      <jvmarg value="-Xmx256M"/>
-      <arg value="-startupUrl"/>
-      <arg value="MissingPlugin.html"/>
-      <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
-      <arg value="com.google.gwt.missingplugin.MissingPlugin"/>
-    </java>
-  </target>
-
-  <target name="build" depends="gwtc" description="Build this project" />
-
-  <target name="war" depends="build" description="Create a war file">
-    <zip destfile="MissingPlugin.war" basedir="war"/>
-  </target>
-
-  <target name="clean" description="Cleans this project">
-    <delete dir="war/WEB-INF/classes" failonerror="false" />
-    <delete dir="war/missingplugin" failonerror="false" />
-  </target>
-
-</project>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/MissingPlugin.gwt.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/MissingPlugin.gwt.xml
deleted file mode 100644
index 7f3bf7f..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/MissingPlugin.gwt.xml
+++ /dev/null
@@ -1,18 +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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<module rename-to='missingplugin'>
-  <inherits name='com.google.gwt.user.User'/>
-  <entry-point class='com.google.gwt.missingplugin.client.MissingPlugin'/>
-  <source path='client'/>
-</module>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.java
deleted file mode 100644
index b992d77..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.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.missingplugin.client;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.JsArray;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.resources.client.CssResource;
-import com.google.gwt.uibinder.client.UiBinder;
-import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.uibinder.client.UiHandler;
-import com.google.gwt.user.client.ui.Anchor;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.VerticalPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * Shows a download box for each supported download.
- */
-public class AllDownloadsPane extends Composite {
-
-  private static final DownloadListPaneBinder uiBinder = GWT.create(DownloadListPaneBinder.class);
-
-  interface DownloadListPaneBinder extends UiBinder<Widget, AllDownloadsPane> {
-  }
-
-  interface MyStyle extends CssResource {
-    String platforms();
-  }
-  
-  @UiField
-  MyStyle style;
-  
-  @UiField
-  VerticalPanel downloadBoxes;
-
-  @UiField(provided = true)
-  Anchor inferredDownloadLink = new Anchor("");
-
-  private final MissingPluginPane.Controller controller;
-
-  public AllDownloadsPane(MissingPluginPane.Controller controller, DownloadInfo linkInfo) {
-    this.controller = controller;
-    initWidget(uiBinder.createAndBindUi(this));
-
-    JsArray<DownloadEntry> links = linkInfo.getAllDownloads();
-    for (int i = 0, n = links.length(); i < n; ++i) {
-      DownloadEntry link = links.get(i);
-      if (link.isSupported()) {
-        String linkContentHtml = link.getLinkContentHtml();
-        String href = link.getHref();
-        String platforms = link.getPlatforms();
-        if (platforms != null) {
-          linkContentHtml += "<br><span class=\"" + style.platforms() + "\">"
-              + platforms + "</span>";
-        }
-        DownloadBox box = new DownloadBox(linkContentHtml, href, true);
-        downloadBoxes.add(box);
-        downloadBoxes.setCellWidth(box, "100%");
-      }
-    }
-  }
-
-  @UiHandler("inferredDownloadLink")
-  void onInferredDownloadLinkClicked(ClickEvent e) {
-    controller.onInferredDownloadClicked();
-  }
-}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.ui.xml
deleted file mode 100644
index 59e91d0..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.ui.xml
+++ /dev/null
@@ -1,57 +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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
-  <ui:style type='com.google.gwt.missingplugin.client.AllDownloadsPane.MyStyle'>
-    .pane {
-    }
-
-    .actionTable {
-      margin: 10px 0 0 30px;
-      font-size: 100%;
-    }
-
-    .downloadBoxes {
-    }
-
-    .inferredDownloadLink {
-      margin-top: 2px;
-      margin-right: 8px;
-      text-align: right;
-      font-size: 80%;
-      display: block;
-      color: black;
-    }
-    
-    .platforms {
-      font-size: 80%;
-      font-style: italic;
-    }
-  </ui:style>
-  <g:HTMLPanel styleName="{style.pane}">
-
-    <table class="{style.actionTable}" cellspacing="0" cellpadding="0">
-      <tr>
-        <td>
-          <g:VerticalPanel ui:field="downloadBoxes" styleName="{style.downloadBoxes}" width="100%"/>
-        </td>
-      </tr>
-      <tr>
-      <td>
-        <g:Anchor ui:field="inferredDownloadLink" styleName="{style.inferredDownloadLink}">suggested download only</g:Anchor>
-      </td>
-      </tr>
-    </table>
-
-  </g:HTMLPanel>
-</ui:UiBinder>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.java
deleted file mode 100644
index 2235d96..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.java
+++ /dev/null
@@ -1,54 +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.missingplugin.client;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.AnchorElement;
-import com.google.gwt.uibinder.client.UiBinder;
-import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.uibinder.client.UiTemplate;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HTMLPanel;
-
-/**
- * The pretty box used to display a hyperlink for one download (or a link to
- * help for unsupported platforms).
- */
-public class DownloadBox extends Composite {
-
-  private static DownloadBoxUiBinder downloadBoxUiBinder = GWT.create(DownloadBoxUiBinder.class);
-  private static UnsupportedBoxUiBinder unsupportedBoxUiBinder = GWT.create(UnsupportedBoxUiBinder.class);
-
-  interface DownloadBoxUiBinder extends UiBinder<HTMLPanel, DownloadBox> {
-  }
-
-  @UiTemplate("UnsupportedBox.ui.xml")
-  interface UnsupportedBoxUiBinder extends UiBinder<HTMLPanel, DownloadBox> {
-  }
-
-  @UiField
-  AnchorElement downloadLink, downloadLinkIcon;
-
-  public DownloadBox(String linkContentHtml, String url, boolean supported) {
-    if (supported) {
-      initWidget(downloadBoxUiBinder.createAndBindUi(this));
-    } else {
-      initWidget(unsupportedBoxUiBinder.createAndBindUi(this));
-    }
-    downloadLink.setInnerHTML(linkContentHtml);
-    downloadLink.setHref(url);
-    downloadLinkIcon.setHref(url);
-  }
-}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.ui.xml
deleted file mode 100644
index 36e7b39..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.ui.xml
+++ /dev/null
@@ -1,60 +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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
-
-  <ui:image field='downloadIcon' src='download.gif' />
-
-  <ui:style>
-    .downloadBox {
-    	margin-top: 8px;
-      padding: 6px;
-      font-size: 100%;
-      font-weight: bold;
-      background-color: rgb(120, 158, 250);
-      border: 2px solid #5e7aab;
-      \-moz-border-radius: 5px;
-      \-moz-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
-      \-webkit-border-radius: 5px;
-      \-webkit-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
-    }
-    
-    @sprite .downloadIcon {
-      gwt-image: 'downloadIcon';
-      display: block;
-    }
-
-    .downloadLink {
-      white-space: nowrap;
-      display: block;
-      color: white;
-      margin-left: 8px;
-      margin-right: 8px;
-      text-align: right;
-      font-size: 11px;
-    }
-  </ui:style>
-
-  <g:HTMLPanel>
-    <table class="{style.downloadBox}" width="100%">
-      <tr>
-        <td>
-          <a ui:field="downloadLink" style="text-decoration: none" class="{style.downloadLink}"/>
-        </td>
-        <td width="1%">
-          <a ui:field="downloadLinkIcon" class="{style.downloadIcon}"/>
-        </td>
-      </tr>
-    </table>
-  </g:HTMLPanel>
-</ui:UiBinder>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadEntry.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadEntry.java
deleted file mode 100644
index 1915735..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadEntry.java
+++ /dev/null
@@ -1,43 +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.missingplugin.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-/**
- * Overlay type representing one recognized potential download target.
- */
-public final class DownloadEntry extends JavaScriptObject {
-
-  protected DownloadEntry() { }
-
-  public native String getHref()/*-{
-    return this.url;
-  }-*/;
-
-  public native String getLinkContentHtml()/*-{
-    return this.caption;
-  }-*/;
-
-  public native String getPlatforms()/*-{
-    return this.platforms;
-  }-*/;
-
-  public native boolean isSupported() /*-{
-    return this.supported;
-  }-*/;
-
-}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadInfo.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadInfo.java
deleted file mode 100644
index f32238e..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadInfo.java
+++ /dev/null
@@ -1,51 +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.missingplugin.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.core.client.JsArray;
-
-/**
- * Overlay type representing the set of recognized platforms.
- */
-public final class DownloadInfo extends JavaScriptObject {
-
-  protected DownloadInfo() {
-  }
-
-  public native JsArray<DownloadEntry> getAllDownloads() /*-{
-    var a = [];
-    for (var k in this.allDownloads) {
-      a[a.length] = this.allDownloads[k];
-    }
-    return a;
-  }-*/;
-
-  /**
-   * @return the {@link DownloadEntry} that was inferred, or <code>null</code>
-   *         if inference failed
-   */
-  public native DownloadEntry getInferredDownload() /*-{
-    var d = this.allDownloads[this.inferredDownloadId];
-    if (d) return d;
-    return this.allDownloads["unknown"];
-  }-*/;
-
-  public native String getTroubleshootingUrl() /*-{
-    return this.troubleshootingUrl;
-  }-*/;
-
-}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.java
deleted file mode 100644
index 43fb4a7..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.java
+++ /dev/null
@@ -1,66 +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.missingplugin.client;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.uibinder.client.UiBinder;
-import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.uibinder.client.UiHandler;
-import com.google.gwt.user.client.ui.Anchor;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * A subview that shows only the download that is recommended.
- */
-public class InferredDownloadPane extends Composite {
-
-  private static InferredDownloadPaneUiBinder uiBinder = GWT.create(InferredDownloadPaneUiBinder.class);
-
-  @UiField(provided = true)
-  Anchor allDownloadsLink;
-
-  @UiField(provided = true)
-  DownloadBox downloadBox;
-
-  private final MissingPluginPane.Controller controller;
-
-  interface InferredDownloadPaneUiBinder extends UiBinder<Widget, InferredDownloadPane> {
-  }
-
-  public InferredDownloadPane(MissingPluginPane.Controller controller, DownloadInfo linkInfo) {
-    this.controller = controller;
-    this.allDownloadsLink = new Anchor("");
-    DownloadEntry inferredDownload = linkInfo.getInferredDownload();
-    if (inferredDownload != null) {
-      String linkContentHtml = inferredDownload.getLinkContentHtml();
-      String href = inferredDownload.getHref();
-      boolean supported = inferredDownload.isSupported();
-      this.downloadBox = new DownloadBox(linkContentHtml, href, supported);
-    } else {
-      // Unsupported/unknown browser
-      this.downloadBox = new DownloadBox("Unsupported or unrecognized browser", "", false);
-    }
-
-    initWidget(uiBinder.createAndBindUi(this));
-  }
-
-  @UiHandler("allDownloadsLink")
-  void onOtherLinkClicked(ClickEvent e) {
-    controller.onAllDownloadsClicked();
-  }
-}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.ui.xml
deleted file mode 100644
index d602ab1..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.ui.xml
+++ /dev/null
@@ -1,50 +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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
-  xmlns:m="urn:import:com.google.gwt.missingplugin.client">
-
-
-  <ui:style>
-    .actionTable {
-      margin: 10px 0 0 30px;
-      font-size: 100%;
-    }
-
-    .allDownloadsLink {
-      margin-top: 2px;
-      margin-right: 8px;
-      text-align: right; 
-      font-size: 80%; 
-      display: block; 
-      color: black;
-    }
-
-  </ui:style>
-  <g:HTMLPanel>
-    <table class="{style.actionTable}" cellspacing="0" cellpadding="0">
-      <tr>
-        <td>
-         <m:DownloadBox ui:field="downloadBox"/>
-        </td>
-      </tr>
-      <tr>
-      <td>
-        <g:Anchor ui:field="allDownloadsLink" styleName="{style.allDownloadsLink}">plugins for other systems</g:Anchor>
-      </td>
-      </tr>
-    </table>
-  </g:HTMLPanel>
-</ui:UiBinder>
-
- 
\ No newline at end of file
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPlugin.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPlugin.java
deleted file mode 100644
index c7433ee..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPlugin.java
+++ /dev/null
@@ -1,42 +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.missingplugin.client;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.user.client.ui.RootPanel;
-
-/**
- * The entry point that launches the download UI.
- */
-public class MissingPlugin implements EntryPoint {
-
-  public void onModuleLoad() {
-    DownloadInfo linkInfo = getAmbientLinkInfo();
-    MissingPluginPane pane = new MissingPluginPane(linkInfo);
-    RootPanel.get().add(pane);
-  }
-
-  private DownloadInfo getAmbientLinkInfo() {
-    DownloadInfo r = getAmbientLinkInfo0();
-    assert r != null : "expecting $wnd.downloadInfo";
-    return r;
-  }
-  
-  private native DownloadInfo getAmbientLinkInfo0() /*-{
-    return $wnd.downloadInfo;
-  }-*/;
-
-}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.java b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.java
deleted file mode 100644
index e094195..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.java
+++ /dev/null
@@ -1,69 +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.missingplugin.client;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.AnchorElement;
-import com.google.gwt.uibinder.client.UiBinder;
-import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.HTMLPanel;
-
-/**
- * The main UI. Also manages subviews.
- */
-public class MissingPluginPane extends Composite {
-
-  /**
-   * Abstract the relationships between the subviews and this one.
-   */
-  public class Controller {
-    void onAllDownloadsClicked() {
-      allDownloadsPane.setVisible(true);
-      inferredDownloadPane.setVisible(false);
-    }
-
-    void onInferredDownloadClicked() {
-      allDownloadsPane.setVisible(false);
-      inferredDownloadPane.setVisible(true);
-    }
-  }
-
-  interface MissingPluginPaneUiBinder extends UiBinder<HTMLPanel, MissingPluginPane> {
-  }
-
-  @UiField(provided = true)
-  AllDownloadsPane allDownloadsPane;
-
-  @UiField(provided = true)
-  InferredDownloadPane inferredDownloadPane;
-
-  @UiField
-  AnchorElement troubleshootingLink;
-
-  private final Controller controller = new Controller();
-
-  private final MissingPluginPaneUiBinder uiBinder = GWT.create(MissingPluginPaneUiBinder.class);
-
-  public MissingPluginPane(DownloadInfo linkInfo) {
-    inferredDownloadPane = new InferredDownloadPane(controller, linkInfo);
-    allDownloadsPane = new AllDownloadsPane(controller, linkInfo);
-
-    initWidget(uiBinder.createAndBindUi(this));
-    troubleshootingLink.setHref(linkInfo.getTroubleshootingUrl());
-  }
-
-}
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.ui.xml
deleted file mode 100644
index e8a4ecb..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.ui.xml
+++ /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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
-  xmlns:m="urn:import:com.google.gwt.missingplugin.client">
-
-  <ui:style>
-    .pane {
-      background-image: initial;
-      background-attachment: initial;
-      background-origin: initial;
-      background-clip: initial;
-      background-color: #ffff88;
-      padding-top: 5px;
-      padding-right: 10px;
-      padding-bottom: 20px;
-      padding-left: 10px;
-      z-index: 10000;
-      font-size: 9pt;
-      font-family: Verdana;
-      border-bottom-width: 2px;
-      border-bottom-style: solid;
-      border-bottom-color: rgb(221, 221, 153);
-      background-position: initial initial;
-      background-repeat: initial initial;
-    }
-    
-    .title {
-      font-size: 11pt;
-      font-family: Verdana;
-      padding-top: 10px;
-      font-weight: bold;
-    }
-    
-    .text {
-      font-size: 9pt;
-      font-family: Verdana;
-      padding-top: 10px;
-    }
-  </ui:style>
-
-  <g:HTMLPanel styleName='{style.pane}'>
-    <div class="{style.title}">Development Mode requires the Google Web Toolkit Developer Plugin</div>
-
-    <div class="{style.text}">By downloading, you agree to the <a href="http://code.google.com/webtoolkit/terms.html">Terms &amp; Conditions</a> and <a href="http://code.google.com/webtoolkit/privacy.html">Privacy Policy</a>.</div>
-
-    <m:InferredDownloadPane ui:field="inferredDownloadPane" visible="true" />
-    <m:AllDownloadsPane ui:field="allDownloadsPane" visible="false" />
-
-    <div class="{style.text}">
-      For help or troubleshooting, ask questions in the <a ui:field="troubleshootingLink" style="color:#000;">discussion group</a>.
-    </div>
-  </g:HTMLPanel>
-
-</ui:UiBinder> 
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/UnsupportedBox.ui.xml b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/UnsupportedBox.ui.xml
deleted file mode 100644
index bdfeac3..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/UnsupportedBox.ui.xml
+++ /dev/null
@@ -1,60 +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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
-
-  <ui:image field='unsupportedIcon' src='unsupported.gif' />
-
-  <ui:style>
-    .downloadBox {
-    	margin-top: 8px;
-      padding: 6px;
-      font-size: 100%;
-      font-weight: bold;
-      background-color: rgb(120, 158, 250);
-      border: 2px solid #5e7aab;
-      \-moz-border-radius: 5px;
-      \-moz-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
-      \-webkit-border-radius: 5px;
-      \-webkit-box-shadow: rgba(0, 0, 0, 0.199219) 3px 3px 3px;
-    }
-    
-    @sprite .downloadIcon {
-      gwt-image: 'unsupportedIcon';
-      display: block;
-    }
-
-    .downloadLink {
-      white-space: nowrap;
-      display: block;
-      color: white;
-      margin-left: 8px;
-      margin-right: 8px;
-      text-align: left;
-      font-size: 11px;
-    }
-  </ui:style>
-
-  <g:HTMLPanel>
-    <table class="{style.downloadBox}" width="100%">
-      <tr>
-        <td>
-          <a ui:field="downloadLink" style="text-decoration: none" class="{style.downloadLink}"/>
-        </td>
-        <td width="1%">
-          <a ui:field="downloadLinkIcon" class="{style.downloadIcon}" />
-        </td>
-      </tr>
-    </table>
-  </g:HTMLPanel>
-</ui:UiBinder>
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/download.gif b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/download.gif
deleted file mode 100644
index da0d53e..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/download.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/unsupported.gif b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/unsupported.gif
deleted file mode 100644
index 304788d..0000000
--- a/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/unsupported.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/MissingPlugin/war/MissingPlugin.html b/plugins/MissingPlugin/war/MissingPlugin.html
deleted file mode 100644
index 321c5b8..0000000
--- a/plugins/MissingPlugin/war/MissingPlugin.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!-- The HTML 4.01 Transitional DOCTYPE declaration-->
-<!-- above set at the top of the file will set     -->
-<!-- the browser's rendering engine into           -->
-<!-- "Quirks Mode". Replacing this declaration     -->
-<!-- with a "Standards Mode" doctype is supported, -->
-<!-- but may lead to some differences in layout.   -->
-
-<html>
-  <head>
-    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-    <title>Google Web Toolkit Developer Plugin Not Installed</title>
-    <style>
-      body {
-        margin: 0;
-        padding: 0;
-      }
-    </style>
-
-    <script>
-      var troubleshootingUrl = "http://groups.google.com/group/google-web-toolkit";
-
-      // The missing plugin module expects downloadInfo.inferredDownloadId to contain the key to use
-      // in allDownloads field.
-      var downloadInfo = {
-        "inferredDownloadId" : null,
-        "troubleshootingUrl" : troubleshootingUrl,
-        "allDownloads" : {
-          "unknown" :
-          {
-            "caption" : "Regrettably, this browser is currently unsupported :-(",
-            "url" : troubleshootingUrl,
-            "supported" : false
-          },
-
-          "firefox-old" :
-          {
-            "caption" : "Sorry, the GWT Developer Plugin only supports Firefox 3.0 - 15.0 at present",
-            "url" : "http://www.getfirefox.com",
-            "supported" : false
-          },
-
-          "opera" :
-          {
-            "caption" : "Sorry, there is currently no GWT Developer Plugin for Opera",
-            // TODO(you): If you are reading this, maybe you would be interested in contributing an Opera version?
-            "url" : "http://code.google.com/webtoolkit/makinggwtbetter.html#contributingcode",
-            "supported" : false
-          },
-
-          "safari-iphone" :
-          {
-            "caption" : "Sorry, there is currently no GWT Developer Plugin for mobile Safari",
-            "url" : troubleshootingUrl,
-            "supported" : false
-          },
-
-          "webkit-android" :
-          {
-            "caption" : "Sorry, there is currently no GWT Developer Plugin for mobile WebKit",
-            "url" : troubleshootingUrl,
-            "supported" : false
-          },
-
-          "chrome" :
-          {
-            "caption" : "Download the GWT Developer Plugin<br>For Chrome",
-            "url" : "https://chrome.google.com/webstore/detail/gwt-developer-plugin/jpjpnpmbddbjkfaccnmhnkdgjideieim",
-            "platforms" : "Win x86, Linux x86/x86_64, Mac x86",
-            "supported" : true
-          },
-
-          "safari-win" :
-          {
-            "caption" : "Sorry, there is currently no GWT Developer Plugin for Safari on Windows",
-            "url" : troubleshootingUrl,
-            "supported" : false
-          },
-
-          "firefox" :
-          {
-            "caption" : "Download the GWT Developer Plugin<br>For Firefox",
-            "url" : "https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi",
-            "platforms" : "Win x86, Linux x86/x86_64, Mac x86/PPC(3.x only)/x86_64",
-            "supported" : true
-          },
-
-          "ie" :
-          {
-            "caption" : "Download the GWT Developer Plugin<br>For Internet Explorer",
-            "url" : "https://dl-ssl.google.com/tag/s/appguid%3D%7B9a5e649a-ec63-4c7d-99bf-75adb345e7e5%7D%26lang%3Den%26appname%3DGWT%2520Developer%2520Plugin%2520for%2520IE%2520%2528x86%2529%26needsadmin%3Dfalse/gwt/plugins/ie/GwtDevPluginSetup.exe",
-            "platforms" : "Win x86",
-            "supported" : true
-          },
-
-          "ie-x64" :
-          {
-            "caption" : "Download the GWT Developer Plugin<br>For Internet Explorer (64-bit)",
-            "url" : "https://dl-ssl.google.com/tag/s/appguid%3D%7B53dae7d2-8c28-440f-920b-b2d665ce73b2%7D%26lang%3Den%26appname%3DGWT%2520Developer%2520Plugin%2520for%2520IE%2520%2528x64%2529%26needsadmin%3Dfalse/gwt/plugins/ie/GwtDevPluginSetup.exe",
-            "platforms" : "Win x64",
-            "supported" : true
-          },
-
-          "safari-mac" :
-          {
-            "caption" : "Download the GWT Developer Plugin<br>For Safari",
-            "url" : "https://dl-ssl.google.com/gwt/plugins/safari/gwt-dev-plugin.dmg",
-            "platforms" : "Mac x86/x86_64/PPC",
-            "supported" : true
-          },
-
-          "safari-mac-late" :
-          {
-            "caption" : "Sorry, there is currently no GWT Developer Plugin for Safari 5.1<br>"
-              + "or later, due to major changes in the Safari plugin API. <br><br>"
-              + "In the meantime, <a href='http://www.omnigroup.com/products/omniweb/'>OmniWeb 5.11</a> is similar to Safari 5.0 and <br>"
-              + "known to work.",
-            "url" : troubleshootingUrl,
-            "supported" : false
-          }
-        }
-      };
-
-      function leadingDigits(s) {
-         var suffix = s.search(/[^\d]/g);
-         if (suffix != -1) {
-           s = s.substring(0, suffix);
-         }
-         return s;
-      }
-
-      function isSafariLate(ua) {
-        // Distinguish Safari from something "like Safari", e.g. OmniWeb
-        // "Version/" comes after "like"
-        var versionAndBeyond = ua.substring(ua.indexOf("version/"));
-        if (versionAndBeyond.indexOf("safari/") == -1) {
-          return false;
-        }
-
-        var componentsAfterVersion =
-          ua.substring(ua.indexOf("version/") + "version/".length).split(" ");
-        var version = componentsAfterVersion[0].split(".");
-
-        var major = Number(version[0]);
-        // Sometimes minor has a suffix like "dp1"
-        var minor = Number(leadingDigits(version[1]));
-
-        return major > 5 || major == 5 && minor > 0;
-      }
-
-      var ua = navigator.userAgent.toLowerCase();
-      var id = 'unknown';
-      if (ua.indexOf("webkit") != -1) {
-        if ( (ua.indexOf("iphone") != -1) || (ua.indexOf("ipod") != -1) ) {
-          id = 'safari-iphone';
-        } else if (ua.indexOf("android") != -1) {
-          id = 'webkit-android';
-        } else if (ua.indexOf("chrome") != -1) {
-            id = 'chrome';
-        } else if (ua.indexOf("macintosh") != -1) {
-          if (isSafariLate(ua)) {
-            id = 'safari-mac-late';
-          } else {
-            id = 'safari-mac';
-          }
-        } else if (ua.indexOf("windows") != -1) {
-          id = 'safari-win';
-        }
-      } else if (ua.indexOf("msie") != -1) {
-        id = (ua.indexOf("win64") == -1) ? 'ie' : 'ie-x64';
-      } else if (ua.indexOf("opera") != -1) {
-        id = 'opera';
-      } else if (ua.indexOf("gecko") != -1) {
-        // Note: Gecko version != Firefox version before 5.0.
-        // See: https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference
-        var gecko_versions = ["1.9", "2.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0"];
-        id = 'firefox-old';
-        for (var i = 0; i < gecko_versions.length; i++) {
-          if (ua.indexOf("rv:" + gecko_versions[i]) != -1) {
-            id = 'firefox';
-            break;
-          }
-        }
-      }
-      downloadInfo.inferredDownloadId = id;
-    </script>
-
-    <script type="text/javascript" language="javascript" src="missingplugin/missingplugin.nocache.js"></script>
-  </head>
-
-  <noscript>
-    <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
-      The Google Web Toolkit Developer Plugin does not appear to be installed.
-      Also, you also don't seem to have a browser that is willing to run JavaScript.
-      Please enable JavaScript or switch to a browser that supports JavaScript and try again.
-    </div>
-  </noscript>
-  </body>
-</html>
diff --git a/plugins/MissingPlugin/war/WEB-INF/appengine-web.xml b/plugins/MissingPlugin/war/WEB-INF/appengine-web.xml
deleted file mode 100644
index afac8c3..0000000
--- a/plugins/MissingPlugin/war/WEB-INF/appengine-web.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
-	<application>gwt-dev-plugin-missing</application>
-	<version>4</version>
-	<!-- TODO(???) please update threadsafe to true if code is threadsafe -->
-	<threadsafe>false</threadsafe>
-	
-	<!-- Configure java.util.logging -->
-	<system-properties>
-		<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
-	</system-properties>
-	
-</appengine-web-app>
-
diff --git a/plugins/MissingPlugin/war/WEB-INF/logging.properties b/plugins/MissingPlugin/war/WEB-INF/logging.properties
deleted file mode 100644
index ccb3a6f..0000000
--- a/plugins/MissingPlugin/war/WEB-INF/logging.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-# Logging configuration file for Google App Engine tools.
-
-# Specify the handlers to create in the root logger
-# (all loggers are children of the root logger)
-# The following creates the console handler
-handlers = java.util.logging.ConsoleHandler
-
-# Set the default logging level for the root logger
-.level = WARNING
-
-# Set the default logging level for the datanucleus loggers
-DataNucleus.JDO.level=WARNING
-DataNucleus.Persistence.level=WARNING
-DataNucleus.Cache.level=WARNING
-DataNucleus.MetaData.level=WARNING
-DataNucleus.General.level=WARNING
-DataNucleus.Utility.level=WARNING
-DataNucleus.Transaction.level=WARNING
-DataNucleus.Datastore.level=WARNING
-DataNucleus.ClassLoading.level=WARNING
-DataNucleus.Plugin.level=WARNING
-DataNucleus.ValueGeneration.level=WARNING
-DataNucleus.Enhancer.level=WARNING
-DataNucleus.SchemaTool.level=WARNING
diff --git a/plugins/MissingPlugin/war/WEB-INF/web.xml b/plugins/MissingPlugin/war/WEB-INF/web.xml
deleted file mode 100644
index 658aca0..0000000
--- a/plugins/MissingPlugin/war/WEB-INF/web.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE web-app
-    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-    "http://java.sun.com/dtd/web-app_2_3.dtd">
-
-<web-app>
-  
-  <!-- Default page to serve -->
-  <welcome-file-list>
-    <welcome-file>MissingPlugin.html</welcome-file>
-  </welcome-file-list>
-
-</web-app>
diff --git a/plugins/Protocol.txt b/plugins/Protocol.txt
deleted file mode 100644
index 4d980fc..0000000
--- a/plugins/Protocol.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-Startup protocol changes for version 2:
-
-C->S	S->C
-====	====
-{later:
-GetRealPlugin(String pluginType, String platformId)
-
-	FatalError(String message)
-
-	RealPlugin(byte[] plugin)
-}
-
-
-CheckVersions(int minProtoVersion, int maxProtoVersion,
-    String hostedHtmlVersion)
-
-	FatalError(String message)
-
-	ProtocolVersion(int protoVersion)
-
-
-{may be ommitted if no other supported transports:
-ChooseTransport(String[] supportedTransports)
-
-	FatalError(String msg)
-
-	SwitchTransport(String transport, String transportArgs)
-
-	  [If transport is not empty, all further communication should be
-           switched to the selected transport.  transportArgs varies by the
-           transport.]
-}
-
-
-LoadModule(String url, String sessionKey, String userAgent, String moduleName)
-
-  [sessionKey is some arbitrary string to identify one group of modules as
-   being part of the same session of one application.]
-
-... as before
-
-
-
-The v1 protocol LoadModule message is still accepted, though with reduced
-functionality in the OOPHM UI.  After the module is loaded, v1 and v2 are
-exactly the same, which makes supporting both versions easier.
diff --git a/plugins/README.txt b/plugins/README.txt
deleted file mode 100644
index 447c0fc..0000000
--- a/plugins/README.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-This directory contains the source for the OOPHM plugin which resides in
-the browser to allow hosted mode debugging.
-
-Subdirectories:
- - common
-   Code that is shared between all platforms, and mostly deals with the wire
-   protocol and related tables.
-
- - ie
-   Plugin for 32-bit Internet Explorer
-
- - npapi
-   Obsolete NPAPI plugin for Firefox
-
- - webkit
-   plugin for WebKit-based browsers that support its extension mechanism
-   (ie, no Safari/Windows support)
-
- - xpcom
-   XPCOM-based Firefox plugin
-
-To build, see instructions in each directory.
diff --git a/plugins/common/AllowedConnections.cpp b/plugins/common/AllowedConnections.cpp
deleted file mode 100644
index ffe6441..0000000
--- a/plugins/common/AllowedConnections.cpp
+++ /dev/null
@@ -1,183 +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.
- */
-
-#include "Debug.h"
-#include <string>
-#include <cstring>
-#include <vector>
-
-#include "AllowedConnections.h"
-
-
-// TODO(jat): do we need to protect against parallel access to static state?
-//    current browsers only use one thread, but Chrome is multithreaded, though
-//    it isn't clear if plugins see parallel execution.  For now, we will
-//    assume the caller takes responsibility for making sure there are no
-//    concurrent calls into AllowedConnections.
-std::vector<AllowedConnections::Rule> AllowedConnections::rules;
-
-/**
- * Get the host portion of the URL, not including the port.
- *
- * @return the host portion of the URL, or the unmodified URL if it does not appear
- *     to be valid
- */
-std::string AllowedConnections::getHostFromUrl(const std::string& url) {
-  int protoEnd = url.find("://");
-  if (protoEnd == std::string::npos) {
-    Debug::log(Debug::Debugging) << "getHostFromUrl(" << url
-        << ") - no :// in URL" << Debug::flush;
-    return url;
-  }
-  protoEnd += 3; // skip over "://"
-  int hostEnd = url.find('/', protoEnd);
-  if (hostEnd == std::string::npos) {
-    hostEnd = url.length();
-  }
-  //skip over user:passwd@ if it exists
-  int userPassword = url.find( '@', protoEnd );
-  if (userPassword == std::string::npos || userPassword > hostEnd)
-  {
-    userPassword = protoEnd;
-  }
-
-  int colon = url.find(':', userPassword);
-  if (colon == std::string::npos || colon > hostEnd) {
-    colon = hostEnd;
-  }
-  std::string host = url.substr(userPassword, colon - userPassword);
-  return host;
-}
-
-std::string AllowedConnections::getCodeServerFromUrl(const std::string& url) {
-  int queryStart = url.find("?");
-  if (queryStart == std::string::npos) {
-    Debug::log(Debug::Debugging) << "getCodeServerFromUrl(" << url
-        << ") - no ? in URL" << Debug::flush;
-    return "";
-  }
-  ++queryStart; //skip the ?
-
-  int paramStart = url.find("gwt.codesvr=", queryStart);
-  if (paramStart == std::string::npos) {
-    Debug::log(Debug::Debugging) << "getCodeServerFromUrl(" << url
-        << ") - missing gwt.codesvr in URL" << Debug::flush;
-    return "";
-  }
-  paramStart += 12;
-
-  int colon = url.find(':', paramStart);
-  // After navigation, the URL parameter could be encoded.
-  // ex: gwt.codesvr=127.0.0.1:9997 -> gwt.codesvr=127.0.0.1%3A9997.
-  int colonEncoded = url.find("%3A", paramStart);
-  if (colonEncoded != std::string::npos
-      && (colon == std::string::npos || colonEncoded < colon)) {
-    colon = colonEncoded;
-  }
-
-  int variableEnd = url.find('&', paramStart);
-  if ( variableEnd == std::string::npos || colon < variableEnd) {
-    variableEnd = colon; //could be std::string::npos!
-  }
-  Debug::log(Debug::Spam) << "getCodeServerFromUrl(" << url
-      << ") - gwt.codesvr=" <<
-      url.substr(paramStart, variableEnd-paramStart) << " in URL"
-      << Debug::flush;
-
-  return url.substr(paramStart, variableEnd-paramStart);
-}
-
-bool AllowedConnections::matchesRule(const std::string& webHost,
-                                     const std::string& codeServer,
-                                     bool* allowed) {
-  std::string host = webHost;
-  std::string server = codeServer;
-
-  //Remap variants of localhost
-  if (host.find("localhost.") == 0 || host == "127.0.0.1") {
-    host = "localhost";
-  }
-
-  if (server.find("localhost.") == 0 || server == "127.0.0.1" )
-  {
-    server = "localhost";
-  }
-
-  // always allow localhost
-  // TODO(jat): try and get IP addresses of local interfaces?
-  if (host == "localhost" && server == "localhost") {
-    *allowed = true;
-    return true;
-  }
-
-  Debug::log(Debug::Spam) << "Checking webHost(" << webHost
-      << "), codeServer(" << codeServer << ") " << Debug::flush;
-  for (std::vector<AllowedConnections::Rule>::const_iterator it = rules.begin();
-       it != rules.end(); ++it) {
-    Debug::log(Debug::Spam) << "  comparing to webHost=(" << it->getWebHost()
-        << ") codeServer=(" << it->getCodeServer() << ")" << Debug::flush;
-    // TODO(jat): add support for regexes
-  if (webHost == it->getWebHost() && codeServer == it->getCodeServer()) {
-      *allowed = !it->isExcluded();
-      Debug::log(Debug::Spam) << "    found! allowed=" << *allowed
-          << Debug::flush;
-      return true;
-    }
-  }
-  Debug::log(Debug::Info)
-      << "GWT Development Mode connection requested by unknown web server "
-      << webHost << ", code server " << codeServer << Debug::flush;
-  return false;
-}
-
-void AllowedConnections::addRule(const std::string& webHost, 
-                                 const std::string& codeServer, 
-                                 bool exclude) {
-  Debug::log(Debug::Spam) << "AllowedConnections::addRule(webHost=" << webHost
-      << ", codeServer=" << codeServer << ", excl=" << exclude << ")"
-      << Debug::flush;
-  rules.push_back(AllowedConnections::Rule(webHost, codeServer, exclude));
-}
-
-void AllowedConnections::clearRules() {
-  rules.clear();
-}
-
-void AllowedConnections::initFromAccessList(const std::string& accessList) {
-  Debug::log(Debug::Spam) << "initFromAccessList() accessList="
-      << accessList << Debug::flush;
-  clearRules();
-  int n = accessList.length();
-  for (int i = 0; i < n; ) {
-    bool exclude = false;
-    if (accessList[i] == '!') {
-      exclude = true;
-      ++i;
-    }
-    int comma = i - 1; // for pre-increment below
-    while (++comma < n && accessList[comma] != ','); // empty
-    std::string option = accessList.substr(i, comma - i);
-    i = comma + 1;
-
-    //parse the [/codeserver] optional element
-    int slash = option.find( '/');
-    if( slash == std::string::npos ) {
-      addRule(option, "localhost", exclude);
-    } else {
-      addRule(option.substr(0, slash), option.substr(slash+1), exclude);
-    }
-  }
-}
diff --git a/plugins/common/AllowedConnections.h b/plugins/common/AllowedConnections.h
deleted file mode 100644
index 0856aee..0000000
--- a/plugins/common/AllowedConnections.h
+++ /dev/null
@@ -1,125 +0,0 @@
-#ifndef _H_AllowedConnections
-#define _H_AllowedConnections
-/*
- * 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.
- */
-
-#include <string>
-#include <vector>
-#include <utility>
-
-/**
- * Manages rules to control access to other sites from the plugin.  This is
- * important since arbitrary web pages could try and use the plugin to connect
- * to hosts the browser's machine has access to, such as doing port scanning
- * behind a firewall.
- */
-class AllowedConnections {
-public:
-  /**
-   * Add a rule to match new requests against.
-   *
-   * @param pattern pattern to match
-   * @param exclude true if matches should be excluded instead of included
-   */
-  static void addRule(const std::string& webHost,
-      const std::string& codeServer,
-      bool exclude = false);
-
-  /**
-   * Clear all rules.
-   */
-  static void clearRules();
-
-  /**
-   * Get the host portion of the URL, not including the port.
-   *
-   * @return the host portion of the URL, or the unmodified URL if it does not
-   *     appear to be valid
-   */
-  static std::string getHostFromUrl(const std::string& url);
-
-  /**
-   * Get the code server  value from the URL, not including the port
-   *
-   * @return the first found server in the URL, or the unmodified URL if it
-   *     does not appear to be valid
-   */
-  static std::string getCodeServerFromUrl(const std::string& url);
-
-  /**
-   * Clear any existing rules and reinitialize from the supplied access list.
-   *
-   * This access list is of the form:
-   *    [!]pattern,[!]pattern...
-   * where the optional exclamation indicates the following pattern is to be
-   * excluded, and an arbitrary number of patterns may be supplied with the
-   * first match being used.  Each pattern currently is only an exact literal
-   * match against the host name, but will be extended to support simple
-   * wildcard patterns.
-   */
-  static void initFromAccessList(const std::string& accessList);
-
-  /**
-   * Returns true if the server for the requested URL matched any rule in
-   * our access list, and sets a flag based on whether that rule permits or
-   * denies the request.  A host name of localhost or 127.0.0.1 is always
-   * allowed.
-   *
-   * @param hostname host name of webserver or codeserver
-   * @param allowed pointer to return value indiciating that this URL should
-   *     be allowed to initiate GWT development mode connections
-   * @return true if url matched a rule
-   */
-  static bool matchesRule(const std::string& webHost, 
-      const std::string& codeServer,
-      bool* allowed);
-
-private:
-  AllowedConnections() {
-  }
-
-  /**
-   * Internal class used for representing a rule.
-   */
-  class Rule {
-  public:
-    Rule(const std::string& webHost,
-        const std::string& codeServer,
-        bool exclude)
-        : webhost(webHost), codesvr(codeServer), excluded(exclude) {}
-
-    const std::string& getWebHost() const {
-      return webhost;
-    }
-
-    const std::string& getCodeServer() const {
-      return codesvr;
-    }
-
-    bool isExcluded() const {
-      return excluded;
-    }
-
-  private:
-    std::string webhost;
-    std::string codesvr;
-    bool        excluded;
-  };
-
-  static std::vector<Rule> rules;
-};
-
-#endif
diff --git a/plugins/common/BrowserChannel.h b/plugins/common/BrowserChannel.h
deleted file mode 100644
index ac91af5..0000000
--- a/plugins/common/BrowserChannel.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * DO NOT EDIT
- * Generated by com.google.gwt.util.tools.OophmHeaderFileGenerator
- * TODO(jat): update generator to handle modifications
- */
-
-/* from BrowserChannel.BROWSERCHANNEL_PROTOCOL_VERSION */
-#define BROWSERCHANNEL_PROTOCOL_VERSION 2
-
-/* from com.google.gwt.dev.shell.BrowserChannel.SpecialDispatchId */
-#define SPECIAL_HAS_METHOD 0
-#define SPECIAL_HAS_PROPERTY 1
-#define SPECIAL_GET_PROPERTY 2
-#define SPECIAL_SET_PROPERTY 3
-
-/* from com.google.gwt.dev.shell.BrowserChannel.MessageType */
-#define MESSAGE_TYPE_INVOKE 0
-#define MESSAGE_TYPE_RETURN 1
-#define MESSAGE_TYPE_OLD_LOAD_MODULE 2
-#define MESSAGE_TYPE_QUIT 3
-#define MESSAGE_TYPE_LOADJSNI 4
-#define MESSAGE_TYPE_INVOKESPECIAL 5
-#define MESSAGE_TYPE_FREEVALUE 6
-#define MESSAGE_TYPE_FATAL_ERROR 7
-#define MESSAGE_TYPE_CHECK_VERSIONS 8
-#define MESSAGE_TYPE_PROTOCOL_VERSION 9
-#define MESSAGE_TYPE_CHOOSE_TRANSPORT 10
-#define MESSAGE_TYPE_SWITCH_TRANSPORT 11
-#define MESSAGE_TYPE_LOAD_MODULE 12
-
-/* from com.google.gwt.dev.shell.BrowserChannel.Value.ValueType */
-#define VALUE_TYPE_NULL 0
-#define VALUE_TYPE_BOOLEAN 1
-#define VALUE_TYPE_BYTE 2
-#define VALUE_TYPE_CHAR 3
-#define VALUE_TYPE_SHORT 4
-#define VALUE_TYPE_INT 5
-#define VALUE_TYPE_LONG 6
-#define VALUE_TYPE_FLOAT 7
-#define VALUE_TYPE_DOUBLE 8
-#define VALUE_TYPE_STRING 9
-#define VALUE_TYPE_JAVA_OBJECT 10
-#define VALUE_TYPE_JS_OBJECT 11
-#define VALUE_TYPE_UNDEFINED 12
diff --git a/plugins/common/ByteOrder.h b/plugins/common/ByteOrder.h
deleted file mode 100644
index 7e6bd86..0000000
--- a/plugins/common/ByteOrder.h
+++ /dev/null
@@ -1,141 +0,0 @@
-#ifndef __H_ByteOrder
-#define __H_ByteOrder
-/*
- * 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.
- */
-
-#include "Platform.h"
-#include <cstring>
-
-class ByteOrder {
-private:
-  enum FloatByteOrder {
-    FLOAT_BIG_ENDIAN,
-    FLOAT_LITTLE_ENDIAN,
-    // TODO(jat): do we need to consider anything other than straight
-    // big-endian or little-endian?  PDP-11 (irrelevant), ARM (probably
-    // relevant for mobile devices), MIPS (probably not relevant, but maybe)
-    // and others have some intermediate endianess.  Also, FP-endianess is not
-    // necessarily the same as that for integers.
-  };
-#ifdef PLATFORM_FLOAT_ENDIANESS
-  static const FloatByteOrder floatByteOrder = PLATFORM_FLOAT_ENDIANESS;
-#else
-  FloatByteOrder floatByteOrder;
-#endif
-
-  typedef union {
-    float v;
-    char b[sizeof(float)];
-  } FloatUnion;
-
-  typedef union {
-    double v;
-    char b[sizeof(double)];
-  } DoubleUnion;
-
-  /**
-   * Copy src to dest, reversing the order of the bytes.
-   * Assumes src and dest do not overlap.
-   */
-  void memcpyrev(char* dest, const char* src, size_t n) {
-    src += n;
-    while (n-- > 0) {
-      *dest++ = *--src;
-    }
-  }
-public:
-  ByteOrder() {
-#ifndef PLATFORM_FLOAT_ENDIANESS
-    DoubleUnion u;
-    memset(u.b, 0, sizeof(u.b));
-    u.b[0] = (char) 0x80;
-    u.b[7] = (char) 0x02;
-    // TODO(jat): add more tests here if we support other endianess
-    floatByteOrder = u.v > 0 ? FLOAT_LITTLE_ENDIAN : FLOAT_BIG_ENDIAN;
-    if (Debug::level(Debug::Debugging)) {
-      std::string str = "Unknown";
-      switch (floatByteOrder) {
-         case FLOAT_LITTLE_ENDIAN:
-           str = "little-endian";
-           break;
-         case FLOAT_BIG_ENDIAN:
-           str = "big-endian";
-           break;
-      }
-      Debug::log(Debug::Debugging) << "Dynamically detected float byte order: "
-          << str << Debug::flush;
-    }
-#endif
-  }
-
-  void bytesFromDouble(double v, char* bytes) {
-    DoubleUnion u;
-    u.v = v;
-    switch (floatByteOrder) {
-      case FLOAT_LITTLE_ENDIAN:
-        memcpyrev(bytes, u.b, sizeof(u.b));
-        break;
-      case FLOAT_BIG_ENDIAN:
-        memcpy(bytes, u.b, sizeof(u.b));
-        break;
-    }
-  }
-
-  void bytesFromFloat(float v, char* bytes) {
-    FloatUnion u;
-    u.v = v;
-    switch (floatByteOrder) {
-      case FLOAT_LITTLE_ENDIAN:
-        memcpyrev(bytes, u.b, sizeof(u.b));
-        break;
-      case FLOAT_BIG_ENDIAN:
-        memcpy(bytes, u.b, sizeof(u.b));
-        break;
-    }
-  }
-
-  double doubleFromBytes(const char* bytes) {
-    DoubleUnion u;
-    switch (floatByteOrder) {
-      case FLOAT_LITTLE_ENDIAN:
-        memcpyrev(u.b, bytes, sizeof(u.b));
-        break;
-      case FLOAT_BIG_ENDIAN:
-        // TODO(jat): find a way to avoid the extra copy while keeping the
-        // compiler happy.
-        memcpy(u.b, bytes, sizeof(u.b));
-        break;
-    }
-    return u.v;
-  }
-
-  float floatFromBytes(const char* bytes) {
-    FloatUnion u;
-    switch (floatByteOrder) {
-      case FLOAT_LITTLE_ENDIAN:
-        memcpyrev(u.b, bytes, sizeof(u.b));
-        break;
-      case FLOAT_BIG_ENDIAN:
-        // TODO(jat): find a way to avoid the extra copy while keeping the
-        // compiler happy.
-        memcpy(u.b, bytes, sizeof(u.b));
-        break;
-    }
-    return u.v;
-  }
-};
-
-#endif
diff --git a/plugins/common/CheckVersionsMessage.cpp b/plugins/common/CheckVersionsMessage.cpp
deleted file mode 100644
index 911cf38..0000000
--- a/plugins/common/CheckVersionsMessage.cpp
+++ /dev/null
@@ -1,65 +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.
- */
-
-#include "CheckVersionsMessage.h"
-#include "HostChannel.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-CheckVersionsMessage::~CheckVersionsMessage() {
-}
-
-char CheckVersionsMessage::getType() const {
-  return TYPE;
-}
-
-/**
- * Receive a CheckVersions message from the channel (note that the message
- * type has already been read).  Caller is responsible for destroying
- * returned message.  Returns null on error.
- */
-CheckVersionsMessage* CheckVersionsMessage::receive(HostChannel& channel) {
-  int minVersion;
-  if (!channel.readInt(minVersion)) {
-    // TODO(jat): error handling
-    printf("Failed to read minimum version\n");
-    return 0;
-  }
-  int maxVersion;
-  if (!channel.readInt(maxVersion)) {
-    // TODO(jat): error handling
-    printf("Failed to read maximum version\n");
-    return 0;
-  }
-  std::string hostedHtmlVersion;
-  if (!channel.readString(hostedHtmlVersion)) {
-    // TODO(jat): error handling
-    printf("Failed to read hosted.html version\n");
-    return 0;
-  }
-  return new CheckVersionsMessage(minVersion, maxVersion, hostedHtmlVersion);
-}
-
-/**
- * Send a fatal error message on the channel.
- */
-bool CheckVersionsMessage::send(HostChannel& channel, int minVersion,
-    int maxVersion, const std::string& hostedHtmlVersion) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendInt(minVersion)) return false;
-  if (!channel.sendInt(maxVersion)) return false;
-  if (!channel.sendString(hostedHtmlVersion)) return false;
-  return true;
-}
diff --git a/plugins/common/CheckVersionsMessage.h b/plugins/common/CheckVersionsMessage.h
deleted file mode 100644
index 10634ae..0000000
--- a/plugins/common/CheckVersionsMessage.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef __CHECKVERSIONSMESSAGE_H
-#define __CHECKVERSIONSMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing a CheckVersions message sent to the server.
- *
- * This message tells the server the range or protocol versions this plugin
- * understands as well as the hosted.html version (so stale copies of it can
- * be detected).
- */
-class CheckVersionsMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_CHECK_VERSIONS;
-private:
-  int minVersion;
-  int maxVersion;
-  const std::string& hostedHtmlVersion;
-
-protected:
-  CheckVersionsMessage(int minVersion, int maxVersion,
-      const std::string& hostedHtmlVersion) : minVersion(minVersion),
-      maxVersion(maxVersion), hostedHtmlVersion(hostedHtmlVersion) {}
-
-public:
-  ~CheckVersionsMessage();
-  virtual char getType() const;
-
-  const std::string& getHostedHtmlVersion() const { return hostedHtmlVersion; }
-
-  static CheckVersionsMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, int minVersion, int maxVersion,
-      const std::string& hostedHtmlVersion);
-};
-#endif
diff --git a/plugins/common/ChooseTransportMessage.cpp b/plugins/common/ChooseTransportMessage.cpp
deleted file mode 100644
index 08c315f..0000000
--- a/plugins/common/ChooseTransportMessage.cpp
+++ /dev/null
@@ -1,67 +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.
- */
-
-#include <cstdarg>
-#include <vector>
-#include "ChooseTransportMessage.h"
-#include "HostChannel.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-ChooseTransportMessage::~ChooseTransportMessage() {
-}
-
-char ChooseTransportMessage::getType() const {
-  return TYPE;
-}
-
-/**
- * Receive an ChooseTransport message from the channel (note that the message
- * type has already been read).  Caller is responsible for destroying
- * returned message.  Returns null on error.
- */
-ChooseTransportMessage* ChooseTransportMessage::receive(HostChannel& channel) {
-  int length;
-  if (!channel.readInt(length)) {
-    // TODO(jat): error handling
-    printf("Failed to read transport\n");
-    return 0;
-  }
-  std::vector<std::string> transports;
-  for (int i = 0; i < length; ++i) {
-    std::string transport;
-    if (!channel.readString(transport)) {
-      // TODO(jat): error handling
-      printf("Failed to read transport\n");
-      return 0;
-    }
-    transports.push_back(transport);
-  }
-  return new ChooseTransportMessage(transports);
-}
-
-/**
- * Send this ChooseTransport message on the channel.
- */
-bool ChooseTransportMessage::send(HostChannel& channel,
-    const std::vector<std::string>& transports) {
-  if (!channel.sendByte(TYPE)) return false;
-  int n = transports.size();
-  if (!channel.sendInt(n)) return false;
-  for (int i = 0; i < n; ++i) {
-    if (!channel.sendString(transports[i])) return false;
-  }
-  return true;
-}
diff --git a/plugins/common/ChooseTransportMessage.h b/plugins/common/ChooseTransportMessage.h
deleted file mode 100644
index 512185e..0000000
--- a/plugins/common/ChooseTransportMessage.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef __CHOOSETRANSPORTMESSAGE_H
-#define __CHOOSETRANSPORTMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include <vector>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing a ChooseTransport message to send to the server.
- *
- * This message type is a request for the server to choose an alternate
- * transport from a provide list, such as a shared memory transport.  The
- * set of transport names is open-ended and thus requires mutual agreement
- * on the names between the client and server.
- */
-class ChooseTransportMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_CHOOSE_TRANSPORT;
-private:
-  std::vector<std::string> transports;
-
-protected:
-  ChooseTransportMessage(const std::vector<std::string>& transports)
-      : transports(transports) {}
-
-public:
-  ~ChooseTransportMessage();
-  virtual char getType() const;
-
-  const std::vector<std::string>& getTransports() const { return transports; }
-
-  static ChooseTransportMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel,
-      const std::vector<std::string>& transport);
-};
-#endif
diff --git a/plugins/common/Debug.cpp b/plugins/common/Debug.cpp
deleted file mode 100644
index 586c1b6..0000000
--- a/plugins/common/Debug.cpp
+++ /dev/null
@@ -1,84 +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.
- */
-
-#include <cstdio>
-
-#ifdef _WINDOWS
-#include <windows.h>
-#endif
-
-#include "Debug.h"
-
-#ifdef GWT_DEBUGDISABLE
-// Dummy implementations for when debugging has been disabled
-Debug::DebugStream& Debug::flush(Debug::DebugStream& dbg) {
-  return dbg;
-}
-
-void Debug::logFinish() {}
-
-void Debug::logString(const char* str) {}
-
-#else
-// Warning: this function is inlined in the manipulator output operator in DebugStream.
-// It only remains here because some compiler/linker combinations such as MSVC will
-// give unresolved symbol errors if it isn't -- GCC, for example, will completely remove
-// all traces of this method.
-Debug::DebugStream& Debug::flush(Debug::DebugStream& dbg) {
-  Debug::logFinish();
-  return dbg;
-}
-
-// These methods are implemented in an Objective-C++ file on OSX
-#if !defined(__APPLE_CC__) || defined(__mac)
-
-#ifdef _WINDOWS
-#define DEBUG_BUF_SIZE 2048
-
-static char buf[DEBUG_BUF_SIZE + 3]; // room for CR NL Null
-static char *bufPtr = buf;
-#endif
-
-void Debug::logFinish() {
-#ifdef _WINDOWS
-  logString("\r\n");
-  ::OutputDebugStringA(buf);
-  bufPtr = buf;
-#else
-  putchar('\n');
-#endif
-}
-
-// logStart may be called multiple times per logFinish
-void Debug::logStart(LogLevel level) {
-}
-
-void Debug::logString(const char* str) {
-#ifdef _WINDOWS
-  size_t len = strlen(str);
-  size_t buflen = DEBUG_BUF_SIZE - (bufPtr - buf);
-  if (len >= buflen) {
-    len = buflen - 1;
-  }
-  strncpy_s(bufPtr, buflen, str, len);
-  bufPtr += len;
-#else
-  fputs(str, stdout);
-#endif
-}
-#endif
-#endif
-
diff --git a/plugins/common/Debug.h b/plugins/common/Debug.h
deleted file mode 100644
index c44e824..0000000
--- a/plugins/common/Debug.h
+++ /dev/null
@@ -1,214 +0,0 @@
-#ifndef _H_Debug
-#define _H_Debug
-/*
- * 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.
- */
-#ifndef _WINDOWS
-// TODO(jat): remove, for snprintf prototypes which should go away
-#include <stdio.h>
-#endif
-
-#include <ostream>
-#include <string>
-
-#include "Platform.h"
-
-// Get a default debug config if none supplied.
-#ifndef GWT_DEBUGLEVEL
-#include "DebugLevel.h"
-#endif
-
-/**
- * Debugging class to get debugging output to a platform-specific location, with multiple
- * levels supported.
- * 
- * To use:
- *   #define GWT_DEBUGLEVEL level  // where level is in LogLevel
- *   #include "Debug.h"
- *   Debug::log(Debug::Warning) << ...
- * 
- * Zero overhead if GWT_DEBUGDISABLE is defined, other than the effort spent on side
- * effects for stream object construction.  If that is expensive, use something like
- * Debug::level(Debug::Warning) to conditionalize expensive logging computations.
- */
-class Debug {
-public:
-  enum LogLevel {
-    None,
-    Error,
-    Warning,
-    Info,
-    Debugging,
-    Spam
-  };
-
-private:
-  static const LogLevel minLogLevel = GWT_DEBUGLEVEL;
-
-public:
-  /**
-   * Return true if the requested level would be logged.  Use to protect
-   * expensive computations for logging.
-   */
-  static bool level(LogLevel testLevel) {
-#ifdef GWT_DEBUGDISABLE
-    return false;
-#else
-    return testLevel <= minLogLevel;
-#endif
-  }
-
-private:
-  // complete the current log message
-  static void logFinish();
-  
-  // begin a new log message
-  static void logStart(LogLevel level);
-  
-  // add a string to the current log message
-  static void logString(const char* str);
-  static void logString(const std::string& str) {
-    logString(str.c_str());
-  }
-  
-public:
-  // Note that flush is special-cased in the manipulator output operator,
-  // and its implementation is inlined there.  If its implementation is
-  // modified, the implementation of the manipulator output operator will
-  // need to be modified as well.
-  class DebugStream;
-  static DebugStream& flush(DebugStream& dbg);
-
-  class DebugStream {
-
-    const bool shouldLog;
-
-    // TODO(jat): better implementations of output operators
-  public:
-    DebugStream(LogLevel level) : shouldLog(Debug::level(level)) {
-      if (shouldLog) {
-        Debug::logStart(level);
-      }
-    }
-
-    bool isActive() const {
-      return shouldLog;
-    }
-
-    DebugStream& operator<<(long v) {
-      if (shouldLog) {
-        char buf[20];
-        snprintf(buf, sizeof(buf), "%ld", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(unsigned long v) {
-      if (shouldLog) {
-        char buf[20];
-        snprintf(buf, sizeof(buf), "%lu", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(long long v) {
-      if (shouldLog) {
-        char buf[40];
-        snprintf(buf, sizeof(buf), "%lld", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(unsigned long long v) {
-      if (shouldLog) {
-        char buf[40];
-        snprintf(buf, sizeof(buf), "%llu", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(int v) {
-      if (shouldLog) {
-        char buf[20];
-        snprintf(buf, sizeof(buf), "%d", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(unsigned int v) {
-      if (shouldLog) {
-        char buf[20];
-        snprintf(buf, sizeof(buf), "%u", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(double v) {
-      if (shouldLog) {
-        char buf[20];
-        snprintf(buf, sizeof(buf), "%g", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(const std::string& str) {
-      if (shouldLog) {
-        Debug::logString(str);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(const char* str) {
-      if (shouldLog) {
-        Debug::logString(str);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(const void* v) {
-      if (shouldLog) {
-        char buf[20];
-        snprintf(buf, sizeof(buf), "%p", v);
-        Debug::logString(buf);
-      }
-      return *this;
-    }
-
-    DebugStream& operator<<(DebugStream& (*manip)(DebugStream&)) {
-      if (shouldLog) {
-        // Special-case flush for efficiency.
-        if (manip == Debug::flush) {
-          Debug::logFinish();
-        } else {
-          return manip(*this);
-        }
-      }
-      return *this;
-    }
-  };
-
-  static DebugStream log(LogLevel testLevel) {
-    return DebugStream(testLevel);
-  }
-};
-
-#endif
diff --git a/plugins/common/DebugLevel.h b/plugins/common/DebugLevel.h
deleted file mode 100644
index b6f6a27..0000000
--- a/plugins/common/DebugLevel.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef _H_DebugLevel
-#define _H_DebugLevel
-/*
- * 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.
- */
-
-// Defines the default debug level if not defined -- see Debug.h
-// Can also define GWT_DEBUGDISABLE to remove all traces of the debug code.
-//#define GWT_DEBUGLEVEL Debugging
-#define GWT_DEBUGLEVEL Info
-//#define GWT_DEBUGDISABLE
-
-#endif
diff --git a/plugins/common/FatalErrorMessage.cpp b/plugins/common/FatalErrorMessage.cpp
deleted file mode 100644
index 0b4b2d0..0000000
--- a/plugins/common/FatalErrorMessage.cpp
+++ /dev/null
@@ -1,50 +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.
- */
-
-#include "FatalErrorMessage.h"
-#include "HostChannel.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-FatalErrorMessage::~FatalErrorMessage() {
-}
-
-char FatalErrorMessage::getType() const {
-  return TYPE;
-}
-
-/**
- * Receive an FatalError message from the channel (note that the message
- * type has already been read).  Caller is responsible for destroying
- * returned message.  Returns null on error.
- */
-FatalErrorMessage* FatalErrorMessage::receive(HostChannel& channel) {
-  std::string error;
-  if (!channel.readString(error)) {
-    // TODO(jat): error handling
-    printf("Failed to read error message\n");
-    return 0;
-  }
-  return new FatalErrorMessage(error);
-}
-
-/**
- * Send a fatal error message on the channel.
- */
-bool FatalErrorMessage::send(HostChannel& channel, const std::string& error) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendString(error)) return false;
-  return true;
-}
diff --git a/plugins/common/FatalErrorMessage.h b/plugins/common/FatalErrorMessage.h
deleted file mode 100644
index a80b9d1..0000000
--- a/plugins/common/FatalErrorMessage.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __FATALERRORMESSAGE_H
-#define __FATALERRORMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing an FatalError message received from the server.
- *
- * This message indicates that a fatal error occurred during the processing
- * of the previous message from the client and the connection should be
- * aborted.
- */
-class FatalErrorMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_FATAL_ERROR;
-private:
-  std::string error;
-
-protected:
-  /**
-   * @param error error message
-   */
-  FatalErrorMessage(const std::string& error) : error(error) {}
-
-public:
-  ~FatalErrorMessage();
-  virtual char getType() const;
-
-  const std::string& getError() const { return error; }
-
-  static FatalErrorMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, const std::string& error);
-};
-#endif
diff --git a/plugins/common/FreeValueMessage.cpp b/plugins/common/FreeValueMessage.cpp
deleted file mode 100644
index b7f0bab..0000000
--- a/plugins/common/FreeValueMessage.cpp
+++ /dev/null
@@ -1,47 +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.
- */
-
-#include "FreeValueMessage.h"
-#include "HostChannel.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-FreeValueMessage::~FreeValueMessage() {
-  delete[] ids;
-}
-
-FreeValueMessage* FreeValueMessage::receive(HostChannel& channel) {
-  int idCount;
-  if (!channel.readInt(idCount)) {
-    // TODO(jat): error handling
-    return 0;
-  }
-  // TODO: validate idCount
-  scoped_array<int> ids(new int[idCount]);
-
-  for (int i = 0; i < idCount; ++i) {
-    if (!channel.readInt(ids[i])) return 0;
-  }
-  return new FreeValueMessage(idCount, ids.release());
-}
-
-bool FreeValueMessage::send(HostChannel& channel, int idCount, const int* ids) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendInt(idCount)) return false;
-  for (int i = 0; i < idCount; ++i) {
-    if (!channel.sendInt(ids[i])) return false;
-  }
-  return true;
-}
diff --git a/plugins/common/FreeValueMessage.h b/plugins/common/FreeValueMessage.h
deleted file mode 100644
index 3158f40..0000000
--- a/plugins/common/FreeValueMessage.h
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef __H_FreeValueMessage
-#define __H_FreeValueMessage
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "HostChannel.h"
-
-/**
- * Class representing an FreeValue message sent or received from the server.
- *
- * This message gives a list of object IDs which are no longer needed by the
- * sending side.  Note that there is no reply to this message, and it can
- * only be sent when the other side is expecting to receive a return value or
- * another invoke.  Special care must be taken to ensure that any freed values
- * referenced by the succeeding invoke/return are resurrected instead of freed.
- */
-class FreeValueMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_FREEVALUE;
-private:
-  int idCount;
-  const int* ids;
-
-  FreeValueMessage(int idCount, const int* ids) : idCount(idCount), ids(ids) {}
-
-public:
-  ~FreeValueMessage();
-
-  virtual char getType() const {
-    return TYPE;
-  }
-
-  int getIdCount() const {
-    return idCount;
-  }
-
-  const int* const getIds() const {
-    return ids;
-  }
-
-  static FreeValueMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, int idCount, const int* ids);
-};
-#endif
diff --git a/plugins/common/HashMap.h b/plugins/common/HashMap.h
deleted file mode 100644
index ebf634a..0000000
--- a/plugins/common/HashMap.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef _H_HashMap
-#define _H_HashMap
-/*
- * 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.
- */
-
-// Portability wrapper for hash maps, since they aren't part of the standard C++ library
-
-#ifdef __GNUC__
-#ifdef CXX_TR1
-// future support
-#include <unordered_map>
-#define hash_map std::tr1::unordered_map
-
-namespace HashFunctions = std;
-#else
-#include <ext/hash_map>
-using __gnu_cxx::hash_map;
-
-// TODO(jat): surely this exists somewhere already?
-// TODO(jat): portability issues
-namespace __gnu_cxx {
-  using std::size_t;
-
-  template<> struct hash<std::string> {
-    size_t operator()(const std::string& str) const {
-      return hash<const char*>()(str.c_str());
-    }
-  };
-};
-namespace HashFunctions = __gnu_cxx;
-#endif
-#elif sun
-// TODO(jat): find a hash_map implementation for Solaris
-#include <map>
-namespace HashFunctions = std;
-#define hash_map map
-using std::map;
-#else
-// Try something reasonably standard, which works in Windows
-#include <hash_map>
-using stdext::hash_map;
-namespace HashFunctions = stdext;
-#endif
-
-#endif
diff --git a/plugins/common/HostChannel.cpp b/plugins/common/HostChannel.cpp
deleted file mode 100644
index 2cabb01..0000000
--- a/plugins/common/HostChannel.cpp
+++ /dev/null
@@ -1,445 +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.
- */
-
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <cerrno>
-
-#include "Debug.h"
-
-#ifdef _WINDOWS
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
-#include <netdb.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-#include <sys/time.h>
-#endif
-#include <time.h>
-
-#include "Platform.h"
-#include "ByteOrder.h"
-
-#include "CheckVersionsMessage.h"
-#include "ProtocolVersionMessage.h"
-#include "ChooseTransportMessage.h"
-#include "SwitchTransportMessage.h"
-#include "FatalErrorMessage.h"
-#include "FreeValueMessage.h"
-#include "HostChannel.h"
-#include "LoadJsniMessage.h"
-#include "InvokeMessage.h"
-#include "InvokeSpecialMessage.h"
-#include "QuitMessage.h"
-#include "ReturnMessage.h"
-#include "Value.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-using namespace std;
-
-ByteOrder HostChannel::byteOrder;
-
-bool HostChannel::connectToHost(const char* host, unsigned port) {
-  if (!port) {
-    port = 9997;
-  }
-  Debug::log(Debug::Info)
-      << "Initiating GWT Development Mode connection to host " << host
-      << ", port " << port << Debug::flush;
-  return sock.connect(host, port);
-}
-
-bool HostChannel::init(SessionHandler* handler, int minProtoVers,
-    int maxProtoVers, const std::string& hostedHtmlVers) {
-  this->handler = handler;
-  Debug::log(Debug::Debugging)
-      << "  negotiating versions - we support protocol " << minProtoVers
-      << " through " << maxProtoVers << ", hostedHtmlVersion=" << hostedHtmlVers
-      << Debug::flush;
-  // TODO(jat): support transport selection
-  CheckVersionsMessage::send(*this, minProtoVers, maxProtoVers, hostedHtmlVers);
-  flush();
-  char type;
-  if (!readByte(type)) {
-    handler->fatalError(*this, "Failed to receive message type");
-    Debug::log(Debug::Error) << "Failed to receive message type" << Debug::flush;
-    disconnectFromHost();
-    return false;
-  }
-
-  switch (type) {
-    case MESSAGE_TYPE_PROTOCOL_VERSION:
-    {
-      scoped_ptr<ProtocolVersionMessage> imsg(ProtocolVersionMessage
-          ::receive(*this));
-      if (!imsg.get()) {
-        Debug::log(Debug::Error) << "Failed to receive protocol version message"
-            << Debug::flush;
-        return false;
-      }
-      // TODO(jat): save selected protocol version when we support a range
-      break;
-    }
-    case MESSAGE_TYPE_FATAL_ERROR:
-    {
-      scoped_ptr<FatalErrorMessage> imsg(FatalErrorMessage::receive(*this));
-      if (!imsg.get()) {
-        Debug::log(Debug::Error) << "Failed to receive fatal error message"
-            << Debug::flush;
-        return false;
-      }
-      handler->fatalError(*this, imsg.get()->getError());
-      return false;
-    }
-    default:
-      return false;
-  }
-  return true;
-}
-
-bool HostChannel::disconnectFromHost() {
-  Debug::log(Debug::Debugging) << "Disconnecting channel" << Debug::flush;
-  if (!isConnected()) {
-    Debug::log(Debug::Error) << "Disconnecting already disconnected channel" << Debug::flush;
-    return false;
-  }
-  QuitMessage::send(*this);
-  flush();
-  sock.disconnect();
-  return true;
-}
-
-bool HostChannel::readInt(int32_t& data) {
-  int32_t d;
-  if (!readBytes(&d, sizeof(d))) return false;
-  data = ntohl(d);
-  return true;
-}
-
-bool HostChannel::sendInt(int32_t data) {
-  uint32_t d = htonl(data);
-  return sendBytes(&d, sizeof(d));
-}
-
-bool HostChannel::readShort(short& data) {
-  int16_t d;
-  if (!readBytes(&d, sizeof(d))) return false;
-  data = ntohs(d);
-  return true;
-}
-
-bool HostChannel::sendShort(const short data) {
-  uint16_t d = htons(data);
-  return sendBytes(&d, sizeof(d));
-}
-
-bool HostChannel::readLong(int64_t& data) {
-  // network is big-endian
-  int32_t d[2];
-  if (!readInt(d[0])) return false;
-  if (!readInt(d[1])) return false;
-  data = (static_cast<int64_t>(d[0]) << 32) | ntohl(d[1]);
-  return true;
-}
-
-bool HostChannel::sendLong(const int64_t data) {
-  if (!sendInt(static_cast<int32_t>(data >> 32))) {
-    return false;
-  }
-  return sendInt(static_cast<int32_t>(data));
-}
-
-bool HostChannel::readFloat(float& data) {
-  char bytes[sizeof(data)];
-  if (!readBytes(bytes, sizeof(bytes))) {
-    return false;
-  }
-  data = byteOrder.floatFromBytes(bytes);
-  return true;
-}
-
-bool HostChannel::sendFloat(const float data) {
-  char bytes[sizeof(data)];
-  byteOrder.bytesFromFloat(data, bytes);
-  return sendBytes(bytes, sizeof(bytes));
-}
-
-bool HostChannel::readDouble(double& data) {
-  char bytes[sizeof(data)];
-  if (!readBytes(bytes, sizeof(bytes))) {
-    return false;
-  }
-  data = byteOrder.doubleFromBytes(bytes);
-  return true;
-}
-
-bool HostChannel::sendDouble(const double data) {
-  char bytes[sizeof(data)];
-  byteOrder.bytesFromDouble(data, bytes);
-  return sendBytes(bytes, sizeof(bytes));
-}
-
-bool HostChannel::readStringLength(uint32_t& data) {
-  int32_t val;
-  if (!readInt(val)) return false;
-  // TODO: assert positive?
-  data = val;
-  return true;
-}
-
-bool HostChannel::readStringBytes(char* data, const uint32_t len) {
-  return readBytes(data, len);
-}
-
-bool HostChannel::readString(std::string& strRef) {
-  uint32_t len;
-  if (!readStringLength(len)) {
-    Debug::log(Debug::Error) << "readString: failed to read length"
-        << Debug::flush;
-    return false;
-  }
-  // Allocating variable-length arrays on the stack is a GCC feature,
-  // and is vulnerable to stack overflow attacks, so we allocate on the heap.
-  scoped_array<char> buf(new char[len]);
-  if (!readStringBytes(buf.get(), len)) {
-    Debug::log(Debug::Error) << "readString: failed to read " << len
-        << " bytes" << Debug::flush;
-    return false;
-  }
-  strRef.assign(buf.get(), len);
-  return true;
-}
-
-static inline double operator-(const struct timeval& end,
-    const struct timeval& begin) {
-  double us = end.tv_sec * 1000000.0 + end.tv_usec - begin.tv_sec * 1000000.0
-      - begin.tv_usec;
-  return us;
-}
-
-ReturnMessage* HostChannel::reactToMessages(SessionHandler* handler, bool expectReturn) {
-  char type;
-  while (true) {
-    flush();
-    Debug::log(Debug::Debugging) << "Waiting for response, flushed output" << Debug::flush;
-    if (!readByte(type)) {
-      if (isConnected()) {
-        Debug::log(Debug::Debugging) << "Failed to receive message type"
-            << Debug::flush;
-      }
-      return 0;
-    }
-    switch (type) {
-      case MESSAGE_TYPE_INVOKE:
-        {
-          scoped_ptr<InvokeMessage> imsg(InvokeMessage::receive(*this));
-          if (!imsg.get()) {
-            Debug::log(Debug::Error) << "Failed to receive invoke message" << Debug::flush;
-            return 0;
-          }
-          gwt::Value returnValue;
-          bool exception = handler->invoke(*this, imsg->getThis(), imsg->getMethodName(),
-              imsg->getNumArgs(), imsg->getArgs(), &returnValue);
-          handler->sendFreeValues(*this);
-          ReturnMessage::send(*this, exception, returnValue);
-        }
-        break;
-      case MESSAGE_TYPE_INVOKESPECIAL:
-        {
-          // scottb: I think this is never used; I think server never sends invokeSpecial
-          scoped_ptr<InvokeSpecialMessage> imsg(InvokeSpecialMessage::receive(*this));
-          if (!imsg.get()) {
-            Debug::log(Debug::Error) << "Failed to receive invoke special message" << Debug::flush;
-            return 0;
-          }
-          gwt::Value returnValue;
-          bool exception = handler->invokeSpecial(*this, imsg->getDispatchId(),
-              imsg->getNumArgs(), imsg->getArgs(), &returnValue);
-          handler->sendFreeValues(*this);
-          ReturnMessage::send(*this, exception, returnValue);
-        }
-        break;
-      case MESSAGE_TYPE_FREEVALUE:
-        {
-          scoped_ptr<FreeValueMessage> freeMsg(FreeValueMessage::receive(*this));
-          if (!freeMsg.get()) {
-            Debug::log(Debug::Error) << "Failed to receive free value message" << Debug::flush;
-            return 0;
-          }
-          handler->freeValue(*this, freeMsg->getIdCount(), freeMsg->getIds());
-        }
-        // do not send a response
-        break;
-      case MESSAGE_TYPE_LOADJSNI:
-        {
-          scoped_ptr<LoadJsniMessage> loadMsg(LoadJsniMessage::receive(*this));
-          if (!loadMsg.get()) {
-            Debug::log(Debug::Error) << "Failed to receive load JSNI message" << Debug::flush;
-            return 0;
-          }
-          handler->loadJsni(*this, loadMsg->getJs());
-        }
-        // do not send a response
-        break;
-      case MESSAGE_TYPE_RETURN:
-        if (!expectReturn) {
-          Debug::log(Debug::Error) << "Received unexpected RETURN" << Debug::flush;
-        }
-        return ReturnMessage::receive(*this);
-      case MESSAGE_TYPE_QUIT:
-        if (expectReturn) {
-          Debug::log(Debug::Error) << "Received QUIT while waiting for return" << Debug::flush;
-        }
-    	  disconnectFromHost();
-        return 0;
-      default:
-        // TODO(jat): error handling
-        Debug::log(Debug::Error) << "Unexpected message type " << type
-            << ", expectReturn=" << expectReturn << Debug::flush;
-        disconnectFromHost();
-        return 0;
-    }
-  }
-}
-
-bool HostChannel::readValue(gwt::Value& valueRef) {
-  char typeBuf;
-  if (!readByte(typeBuf)) return false;
-  gwt::Value::ValueType type = gwt::Value::ValueType(typeBuf);
-  switch (type) {
-    case gwt::Value::NULL_TYPE:
-      valueRef.setNull();
-      return true;
-    case gwt::Value::UNDEFINED:
-      valueRef.setUndefined();
-      return true;
-    case gwt::Value::BOOLEAN:
-      {
-        char val;
-        if (!readByte(val)) return false;
-        valueRef.setBoolean(val != 0);
-      }
-      return true;
-    case gwt::Value::BYTE:
-      {
-        char val;
-        if (!readByte(val)) return false;
-        valueRef.setByte(val);
-      }
-      return true;
-    case gwt::Value::CHAR:
-      {
-        short val;
-        if (!readShort(val)) return false;
-        valueRef.setChar(val);
-      }
-      return true;
-    case gwt::Value::SHORT:
-      {
-        short val;
-        if (!readShort(val)) return false;
-        valueRef.setShort(val);
-      }
-      return true;
-    case gwt::Value::STRING:
-      {
-        std::string val;
-        if (!readString(val)) return false;
-        valueRef.setString(val);
-      }
-      return true;
-    case gwt::Value::INT:
-      {
-        int val;
-        if (!readInt(val)) return false;
-        valueRef.setInt(val);
-      }
-      return true;
-    case gwt::Value::LONG:
-      {
-        int64_t val;
-        if (!readLong(val)) return false;
-        valueRef.setLong(val);
-      }
-      return true;
-    case gwt::Value::DOUBLE:
-      {
-        double val;
-        if (!readDouble(val)) return false;
-        valueRef.setDouble(val);
-      }
-      return true;
-    case gwt::Value::JAVA_OBJECT:
-      {
-        int objId;
-        if (!readInt(objId)) return false;
-        valueRef.setJavaObject(objId);
-      }
-      return true;
-    case gwt::Value::JS_OBJECT:
-      {
-        int val;
-        if (!readInt(val)) return false;
-        valueRef.setJsObjectId(val);
-      }
-      return true;
-    default:
-      Debug::log(Debug::Error) << "Unhandled value type sent from server: " << type << Debug::flush;
-      break;
-  }
-  return false;
-}
-
-bool HostChannel::sendValue(const gwt::Value& value) {
-  gwt::Value::ValueType type = value.getType();
-  if (!sendByte(type)) return false;
-  switch (type) {
-    case gwt::Value::NULL_TYPE:
-    case gwt::Value::UNDEFINED:
-      // Null and Undefined only have the tag byte, no data
-      return true;
-    case gwt::Value::BOOLEAN:
-      return sendByte(value.getBoolean() ? 1 : 0);
-    case gwt::Value::BYTE:
-      return sendByte(value.getByte());
-    case gwt::Value::CHAR:
-      return sendShort(short(value.getChar()));
-    case gwt::Value::SHORT:
-      return sendShort(value.getShort());
-    case gwt::Value::INT:
-      return sendInt(value.getInt());
-    case gwt::Value::LONG:
-      return sendLong(value.getLong());
-    case gwt::Value::STRING:
-      return sendString(value.getString());
-    case gwt::Value::DOUBLE:
-      return sendDouble(value.getDouble());
-    case gwt::Value::FLOAT:
-      return sendFloat(value.getFloat());
-    case gwt::Value::JS_OBJECT:
-      return sendInt(value.getJsObjectId());
-    case gwt::Value::JAVA_OBJECT:
-      return sendInt(value.getJavaObjectId());
-    default:
-      Debug::log(Debug::Error) << "Unhandled value type sent to server: " << type << Debug::flush;
-      break;
-  }
-  return false;
-}
diff --git a/plugins/common/HostChannel.h b/plugins/common/HostChannel.h
deleted file mode 100644
index e8a53ec..0000000
--- a/plugins/common/HostChannel.h
+++ /dev/null
@@ -1,159 +0,0 @@
-#ifndef __H_HostChannel
-#define __H_HostChannel
-/*
- * 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.
- */
-
-#include "Debug.h"
-
-// Sun's cstdio doesn't define a bunch of stuff
-#include <stdio.h>
-#include <string>
-
-#include "ByteOrder.h"
-#include "Socket.h"
-#include "Platform.h"
-#include "Message.h"
-#include "ReturnMessage.h"
-#include "Value.h"
-#include "SessionHandler.h"
-
-class HostChannel {
-  Socket sock;
-  static ByteOrder byteOrder;
-  SessionHandler* handler;
-
-public:
-  ~HostChannel() {
-    if (isConnected()) {
-      disconnectFromHost();
-    }
-    Debug::log(Debug::Debugging) << "HostChannel destroyed" << Debug::flush;
-  }
-
-  // Connects to the OOPHM server (socket operations only).
-  bool connectToHost(const char* host, unsigned port);
-
-  // Negotiates protocol version and transport selection.
-  bool init(SessionHandler* handler, int minVersion, int maxVersion,
-      const std::string& hostedHtmlVersion);
-
-  bool disconnectFromHost();
-
-  bool isConnected() const {
-    return sock.isConnected();
-  }
-
-  bool readBytes(void* data, size_t dataLen) {
-    char* ptr = static_cast<char*>(data);
-    while(dataLen > 0) {
-      if (!readByte(*ptr++)) {
-        return false;
-      }
-      --dataLen;
-    }
-    return true;
-  }
-
-  bool sendBytes(const void* data, size_t dataLen) {
-    const char* ptr = static_cast<const char*>(data);
-    while(dataLen > 0) {
-      if (!sendByte(*ptr++)) {
-        return false;
-      }
-      --dataLen;
-    }
-    return true;
-  }
-
-  // TODO: don't pass out-params by reference as it makes the call site misleading
-  bool readInt(int32_t& data);
-  bool sendInt(const int32_t data);
-
-  bool readShort(short& data);
-  bool sendShort(const short data);
-
-  bool readLong(int64_t& data);
-  bool sendLong(const int64_t data);
-
-  bool readFloat(float& data);
-  bool sendFloat(const float data);
-
-  bool readDouble(double& doubleRef);
-  bool sendDouble(const double data);
-
-  bool readByte(char& data) {
-    if (!isConnected()) {
-      handler->disconnectDetected();
-      return false;
-    }
-    int c = sock.readByte();
-    if (c < 0) {
-      handler->disconnectDetected();
-      return false;
-    }
-    data = static_cast<char>(c);
-    return true;
-  }
-
-  bool sendByte(const char data) {
-    if (!isConnected()) {
-      handler->disconnectDetected();
-      return false;
-    }
-    if (!sock.writeByte(data)) {
-      handler->disconnectDetected();
-      return false;
-    }
-    return true;
-  }
-
-  bool readStringLength(uint32_t& data);
-  bool readStringBytes(char* data, const uint32_t len);
-  bool readString(std::string& strRef);
-  bool sendString(const char* data, const uint32_t len) {
-    return sendInt(len) && sendBytes(data, len);
-  }
-
-  bool sendString(const std::string& str) {
-    return sendString(str.c_str(), static_cast<uint32_t>(str.length()));
-  }
-
-  bool readValue(gwt::Value& valueRef);
-  bool sendValue(const gwt::Value& value);
-
-  ReturnMessage* reactToMessages(SessionHandler* handler, bool expectReturn);
-
-  bool reactToMessages(SessionHandler* handler) {
-    return !reactToMessages(handler, false);
-  }
-
-  bool flush() {
-    if (!sock.isConnected()) {
-      handler->disconnectDetected();
-      return false;
-    }
-    if (!sock.flush()) {
-      handler->disconnectDetected();
-      return false;
-    }
-    return true;
-  }
-
-  ReturnMessage* reactToMessagesWhileWaitingForReturn(SessionHandler* handler) {
-    return reactToMessages(handler, true);
-  }
-};
-#endif
diff --git a/plugins/common/InvokeMessage.cpp b/plugins/common/InvokeMessage.cpp
deleted file mode 100644
index 9207f81..0000000
--- a/plugins/common/InvokeMessage.cpp
+++ /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.
- */
-
-#include "InvokeMessage.h"
-#include "HostChannel.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-InvokeMessage::~InvokeMessage() {
-  delete[] args;
-}
-
-char InvokeMessage::getType() const {
-  return TYPE;
-}
-
-/**
- * Receive an Invoke message from the channel (note that the message
- * type has already been read).  Caller is responsible for destroying
- * returned message.  Returns null on error.
- */
-InvokeMessage* InvokeMessage::receive(HostChannel& channel) {
-  std::string methodName;
-  if (!channel.readString(methodName)) {
-    // TODO(jat): error handling
-    printf("Failed to read method name\n");
-    return 0;
-  }
-  gwt::Value thisRef;
-  if (!channel.readValue(thisRef)) {
-    // TODO(jat): error handling
-    printf("Failed to read thisRef\n");
-    return 0;
-  }
-  int numArgs;
-  if (!channel.readInt(numArgs)) {
-    // TODO(jat): error handling
-    printf("Failed to read #args\n");
-    return 0;
-  }
-  scoped_array<gwt::Value> args(new gwt::Value[numArgs]);
-  for (int i = 0; i < numArgs; ++i) {
-    if (!channel.readValue(args[i])) {
-      // TODO(jat): error handling
-      printf("Failed to read arg[%d]\n", i);
-      return 0;
-    }
-  }
-  return new InvokeMessage(thisRef, methodName, numArgs, args.release());
-}
-
-/**
- * Request the server invoke a method on an object and return the result.
- * 
- * Note that the method to be invoked is sent as an integer (a dispatch id) to the server.
- */
-bool InvokeMessage::send(HostChannel& channel, const gwt::Value& thisRef, int methodDispatchId,
-    int numArgs, const gwt::Value* args) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendInt(methodDispatchId)) return false;
-  if (!channel.sendValue(thisRef)) return false;
-  if (!channel.sendInt(numArgs)) return false;
-  for (int i = 0; i < numArgs; ++i) {
-    if (!channel.sendValue(args[i])) return false;
-  }
-  return true;
-}
diff --git a/plugins/common/InvokeMessage.h b/plugins/common/InvokeMessage.h
deleted file mode 100644
index 0296d75..0000000
--- a/plugins/common/InvokeMessage.h
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef __INVOKEMESSAGE_H
-#define __INVOKEMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing an InvokeMessage received from the server, and a way
- * to send an invoke message to the server.
- *
- * Note that the wire protocol is different in the two directions, as the
- * server sends a string for the method name and the client send an integer
- * dispatchID.
- */
-class InvokeMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_INVOKE;
-  static const int TOSTRING_DISP_ID = 0;
-private:
-  gwt::Value thisRef;
-  std::string methodName;
-  int methodDispatchId;
-  int numArgs;
-  const gwt::Value* args;
-
-protected:
-  /**
-   * @param args array of arguments -- InvokeMessage takes ownership and will
-   *     destroy when it is destroyed.
-   */
-  InvokeMessage(const gwt::Value& thisRef, const std::string& methodName,
-      int numArgs, const gwt::Value* args) : thisRef(thisRef), methodName(methodName),
-      numArgs(numArgs), args(args) {}
-
-public:
-  ~InvokeMessage();
-  virtual char getType() const;
-
-  gwt::Value getThis() const { return thisRef; }
-  const std::string& getMethodName() const { return methodName; }
-  int getNumArgs() const { return numArgs; }
-  const gwt::Value* const getArgs() const { return args; }
-
-  static InvokeMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, const gwt::Value& thisRef, int methodDispatchId,
-      int numArgs, const gwt::Value* args);
-};
-#endif
diff --git a/plugins/common/InvokeSpecialMessage.cpp b/plugins/common/InvokeSpecialMessage.cpp
deleted file mode 100644
index 0a9f418..0000000
--- a/plugins/common/InvokeSpecialMessage.cpp
+++ /dev/null
@@ -1,74 +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.
- */
-
-#include "InvokeSpecialMessage.h"
-#include "HostChannel.h"
-#include "SessionHandler.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-InvokeSpecialMessage::~InvokeSpecialMessage() {
-  delete[] args;
-}
-
-char InvokeSpecialMessage::getType() const {
-  return TYPE;
-}
-
-/**
- * Receive an InvokeSpecial message from the channel (note that the message
- * type has already been read).  Caller is responsible for destroying
- * returned message.  Returns null on error.
- */
-InvokeSpecialMessage* InvokeSpecialMessage::receive(HostChannel& channel) {
-  char dispatchId;
-  if (!channel.readByte(dispatchId)) {
-    // TODO(jat): error handling
-    printf("Failed to read method name\n");
-    return 0;
-  }
-  int numArgs;
-  if (!channel.readInt(numArgs)) {
-    // TODO(jat): error handling
-    printf("Failed to read #args\n");
-    return 0;
-  }
-  scoped_array<gwt::Value> args(new gwt::Value[numArgs]);
-  for (int i = 0; i < numArgs; ++i) {
-    if (!channel.readValue(args[i])) {
-      // TODO(jat): error handling
-      printf("Failed to read arg[%d]\n", i);
-      return 0;
-    }
-  }
-  
-  SessionHandler::SpecialMethodId id =
-    static_cast<SessionHandler::SpecialMethodId>(dispatchId);
-  return new InvokeSpecialMessage(id, numArgs, args.release());
-}
-
-/**
- * Request the server perform a special method and return the result.
- */
-bool InvokeSpecialMessage::send(HostChannel& channel, int dispatchId,
-    int numArgs, const gwt::Value* args) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendByte(dispatchId)) return false;
-  if (!channel.sendInt(numArgs)) return false;
-  for (int i = 0; i < numArgs; ++i) {
-    if (!channel.sendValue(args[i])) return false;
-  }
-  return true;
-}
diff --git a/plugins/common/InvokeSpecialMessage.h b/plugins/common/InvokeSpecialMessage.h
deleted file mode 100644
index 84c90ff..0000000
--- a/plugins/common/InvokeSpecialMessage.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef __INVOKESPECIALMESSAGE_H
-#define __INVOKESPECIALMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "SessionHandler.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing an InvokeSpecial message received from the server, and a
- * way to send an invoke message to the server.
- */
-class InvokeSpecialMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_INVOKESPECIAL;
-private:
-  SessionHandler::SpecialMethodId dispatchId;
-  int numArgs;
-  const gwt::Value* args;
-
-protected:
-  /**
-   * @param args array of arguments -- InvokeMessage takes ownership and will
-   *     destroy when it is destroyed.
-   */
-  InvokeSpecialMessage(SessionHandler::SpecialMethodId dispatchId, int numArgs,
-      const gwt::Value* args) : dispatchId(dispatchId), numArgs(numArgs), args(args) {}
-
-public:
-  ~InvokeSpecialMessage();
-  virtual char getType() const;
-
-  SessionHandler::SpecialMethodId getDispatchId() const { return dispatchId; }
-  int getNumArgs() const { return numArgs; }
-  const gwt::Value* const getArgs() const { return args; }
-
-  static InvokeSpecialMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, int dispatchId, int numArgs,
-      const gwt::Value* args);
-};
-#endif
diff --git a/plugins/common/LoadJsniMessage.cpp b/plugins/common/LoadJsniMessage.cpp
deleted file mode 100644
index db8b943..0000000
--- a/plugins/common/LoadJsniMessage.cpp
+++ /dev/null
@@ -1,26 +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.
- */
-
-#include "LoadJsniMessage.h"
-
-LoadJsniMessage* LoadJsniMessage::receive(HostChannel& channel) {
-  std::string js;
-  if (!channel.readString(js)) {
-    // TODO(jat): error handling
-    return 0;
-  }
-  return new LoadJsniMessage(js);
-}
diff --git a/plugins/common/LoadJsniMessage.h b/plugins/common/LoadJsniMessage.h
deleted file mode 100644
index 5b1f8d9..0000000
--- a/plugins/common/LoadJsniMessage.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef __H_LoadJsniMessage
-#define __H_LoadJsniMessage
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "HostChannel.h"
-
-class LoadJsniMessage : public Message {
-public:  
-  static const char TYPE = MESSAGE_TYPE_LOADJSNI;
-private:
-  const std::string js;
-  
-  LoadJsniMessage(const std::string& js) : js(js) {}
-  
-public:  
-  virtual char getType() const {
-    return TYPE;
-  }
-  
-  std::string getJs() const {
-    return js;
-  }
-
-  static LoadJsniMessage* receive(HostChannel& channel);
-};
-#endif
diff --git a/plugins/common/LoadModuleMessage.cpp b/plugins/common/LoadModuleMessage.cpp
deleted file mode 100644
index 525383b..0000000
--- a/plugins/common/LoadModuleMessage.cpp
+++ /dev/null
@@ -1,49 +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.
- */
-
-#include "Debug.h"
-
-#include <cstring>
-#include <string>
-
-#include "LoadModuleMessage.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-char LoadModuleMessage::getType() const {
-  return LoadModuleMessage::TYPE;
-}
-
-bool LoadModuleMessage::send(HostChannel& channel, const std::string& url,
-    const std::string& tabKey, const std::string& sessionKey,
-    const std::string& moduleName, const std::string& userAgent,
-    SessionHandler* handler) {
-  Debug::log(Debug::Debugging) << "LoadModule(url=\"" << url << "\", tabKey=\""
-      << "\", sessionKey=\"" << sessionKey << "\", module=\"" << moduleName
-      << "\")" << Debug::flush;
-  if (!channel.sendByte(TYPE) || !channel.sendString(url)
-      || !channel.sendString(tabKey)
-      || !channel.sendString(sessionKey)
-      || !channel.sendString(moduleName)
-      || !channel.sendString(userAgent)) {
-    return false;
-  }
-  scoped_ptr<ReturnMessage> ret(channel.reactToMessagesWhileWaitingForReturn(
-      handler));
-  if (!ret.get()) {
-    return false;
-  }
-  return !ret.get()->isException();
-}
diff --git a/plugins/common/LoadModuleMessage.h b/plugins/common/LoadModuleMessage.h
deleted file mode 100644
index 4a331cb..0000000
--- a/plugins/common/LoadModuleMessage.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef __LOADMODULEMESSAGE_H
-#define __LOADMODULEMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "HostChannel.h"
-#include "SessionHandler.h"
-
-class HostChannel;
-
-/**
- * Class representing a LoadModule message sent to the server.
- *
- * This message requests that the server load the requested module.  A return
- * message is not sent until the module is unloaded or fails to load.
- */
-
-class LoadModuleMessage : public Message {
-  static const char TYPE = MESSAGE_TYPE_LOAD_MODULE;
-
-public:
-  LoadModuleMessage(const std::string& url, const std::string& tabKey,
-      const std::string& sessionKey, const std::string& moduleName,
-      const std::string& userAgent) : url(url), tabKey(tabKey),
-      sessionKey(sessionKey), moduleName(moduleName), userAgent(userAgent) { }
-
-  const std::string& getUrl() const { return url; }
-  const std::string& getTabKey() const { return tabKey; }
-  const std::string& getSessionKey() const { return sessionKey; }
-  const std::string& getModuleName() const { return moduleName; }
-  const std::string& getUserAgent() const { return userAgent; }
-  virtual char getType() const;
-
-  static bool send(HostChannel& channel, const std::string& url,
-      const std::string& tabKey, const std::string& sessionKey,
-      const std::string& moduleName, const std::string& userAgent,
-      SessionHandler* handler);
-private:
-  std::string url;
-  std::string tabKey;
-  std::string sessionKey;
-  std::string moduleName;
-  std::string userAgent;
-};
-#endif
diff --git a/plugins/common/Makefile b/plugins/common/Makefile
deleted file mode 100644
index 4003274..0000000
--- a/plugins/common/Makefile
+++ /dev/null
@@ -1,124 +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.
-
-include ../config.mk
-
-HDRS= HostChannel.h InvokeMessage.h LoadModuleMessage.h Message.h \
-      ReturnMessage.h Value.h BrowserChannel.h Debug.h DebugLevel.h \
-      SessionHandler.h ServerMethods.h Socket.h AllowedConnections.h \
-      LoadJsniMessage.h InvokeSpecialMessage.h FreeValueMessage.h \
-      ByteOrder.h FatalErrorMessage.h CheckVersionsMessage.h \
-      ChooseTransportMessage.h SwitchTransportMessage.h \
-      ProtocolVersionMessage.h
-
-SRCS=	HostChannel.cpp LoadModuleMessage.cpp InvokeMessage.cpp \
-	ReturnMessage.cpp ServerMethods.cpp Debug.cpp Socket.cpp \
-	AllowedConnections.cpp LoadJsniMessage.cpp InvokeSpecialMessage.cpp \
-	FreeValueMessage.cpp FatalErrorMessage.cpp CheckVersionsMessage.cpp \
-      ChooseTransportMessage.cpp SwitchTransportMessage.cpp \
-      ProtocolVersionMessage.cpp
-
-LIBCOMMON= libcommon$(FLAG32BIT).a
-OBJDIR= obj$(FLAG32BIT)
-OBJS= $(patsubst %.cpp,$(OBJDIR)/%.o,$(SRCS))
-
-all:: $(OBJDIR) $(LIBCOMMON)
-
-$(OBJDIR):
-	-mkdir $@
-
-$(LIBCOMMON): $(OBJS)
-	$(AR) $(ARFLAGS) $@ $(OBJS)
-
-$(OBJDIR)/%.o: %.cpp
-	$(CXX) $(BASECFLAGS) $(ALLARCHCFLAGS) -c $< -o $@
-
-$(OBJDIR)/%.o: DebugLevel.h
-
-.PHONY: clean depend testdebug
-
-testdebug:
-	(cd testing; CXX=$(CXX) CXXFLAGS="$(CFLAGS) -m32" ./testdebug)
-	(cd testing; CXX=$(CXX) CXXFLAGS="$(CFLAGS) -m64" ./testdebug)
-
-clean:
-	rm -rf obj32 obj64 libcommon32.a libcommon64.a
-
-depend:
-	g++ -MM $(CFLAGS) $(SRCS) >>Makefile
-#	makedepend -- $(CFLAGS) -- $(SRCS)
-
-# DO NOT DELETE
-HostChannel.o: HostChannel.cpp Debug.h Platform.h DebugLevel.h \
-  ByteOrder.h CheckVersionsMessage.h Message.h BrowserChannel.h Value.h \
-  ProtocolVersionMessage.h ChooseTransportMessage.h \
-  SwitchTransportMessage.h FreeValueMessage.h HostChannel.h Socket.h \
-  AllowedConnections.h ReturnMessage.h SessionHandler.h LoadJsniMessage.h \
-  InvokeMessage.h InvokeSpecialMessage.h QuitMessage.h \
-  scoped_ptr/scoped_ptr.h
-LoadModuleMessage.o: LoadModuleMessage.cpp Debug.h Platform.h \
-  DebugLevel.h LoadModuleMessage.h Message.h BrowserChannel.h \
-  HostChannel.h ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
-  Value.h SessionHandler.h scoped_ptr/scoped_ptr.h
-InvokeMessage.o: InvokeMessage.cpp InvokeMessage.h Message.h \
-  BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h HostChannel.h \
-  ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
-  SessionHandler.h scoped_ptr/scoped_ptr.h
-ReturnMessage.o: ReturnMessage.cpp ReturnMessage.h Message.h \
-  BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h HostChannel.h \
-  ByteOrder.h Socket.h AllowedConnections.h SessionHandler.h
-ServerMethods.o: ServerMethods.cpp Debug.h Platform.h DebugLevel.h \
-  FreeValueMessage.h Message.h BrowserChannel.h HostChannel.h ByteOrder.h \
-  Socket.h AllowedConnections.h ReturnMessage.h Value.h SessionHandler.h \
-  InvokeMessage.h InvokeSpecialMessage.h ServerMethods.h \
-  scoped_ptr/scoped_ptr.h
-Debug.o: Debug.cpp Debug.h Platform.h DebugLevel.h
-Socket.o: Socket.cpp Platform.h Socket.h Debug.h DebugLevel.h
-AllowedConnections.o: AllowedConnections.cpp Debug.h Platform.h \
-  DebugLevel.h AllowedConnections.h
-LoadJsniMessage.o: LoadJsniMessage.cpp LoadJsniMessage.h Message.h \
-  BrowserChannel.h HostChannel.h Debug.h Platform.h DebugLevel.h \
-  ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h Value.h \
-  SessionHandler.h
-InvokeSpecialMessage.o: InvokeSpecialMessage.cpp InvokeSpecialMessage.h \
-  Message.h BrowserChannel.h SessionHandler.h Value.h Debug.h Platform.h \
-  DebugLevel.h HostChannel.h ByteOrder.h Socket.h AllowedConnections.h \
-  ReturnMessage.h scoped_ptr/scoped_ptr.h
-FreeValueMessage.o: FreeValueMessage.cpp FreeValueMessage.h Message.h \
-  BrowserChannel.h HostChannel.h Debug.h Platform.h DebugLevel.h \
-  ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h Value.h \
-  SessionHandler.h scoped_ptr/scoped_ptr.h
-FatalErrorMessage.o: FatalErrorMessage.cpp FatalErrorMessage.h Message.h \
-  BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h HostChannel.h \
-  ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
-  SessionHandler.h scoped_ptr/scoped_ptr.h
-CheckVersionsMessage.o: CheckVersionsMessage.cpp CheckVersionsMessage.h \
-  Message.h BrowserChannel.h Value.h Debug.h Platform.h DebugLevel.h \
-  HostChannel.h ByteOrder.h Socket.h AllowedConnections.h ReturnMessage.h \
-  SessionHandler.h scoped_ptr/scoped_ptr.h
-ChooseTransportMessage.o: ChooseTransportMessage.cpp \
-  ChooseTransportMessage.h Message.h BrowserChannel.h Value.h Debug.h \
-  Platform.h DebugLevel.h HostChannel.h ByteOrder.h Socket.h \
-  AllowedConnections.h ReturnMessage.h SessionHandler.h \
-  scoped_ptr/scoped_ptr.h
-SwitchTransportMessage.o: SwitchTransportMessage.cpp \
-  SwitchTransportMessage.h Message.h BrowserChannel.h Value.h Debug.h \
-  Platform.h DebugLevel.h HostChannel.h ByteOrder.h Socket.h \
-  AllowedConnections.h ReturnMessage.h SessionHandler.h \
-  scoped_ptr/scoped_ptr.h
-ProtocolVersionMessage.o: ProtocolVersionMessage.cpp \
-  ProtocolVersionMessage.h Message.h BrowserChannel.h Value.h Debug.h \
-  Platform.h DebugLevel.h HostChannel.h ByteOrder.h Socket.h \
-  AllowedConnections.h ReturnMessage.h SessionHandler.h \
-  scoped_ptr/scoped_ptr.h
diff --git a/plugins/common/Makefile.sun b/plugins/common/Makefile.sun
deleted file mode 100644
index 2043187..0000000
--- a/plugins/common/Makefile.sun
+++ /dev/null
@@ -1,115 +0,0 @@
-# Set to classpath value to get GWT classes from
-#GWTDEV=../build/staging/gwt-linux-0.0.0/gwt-dev-linux.jar
-GWTDEV=../eclipse/dev/linux/bin
-
-INC=-I..
-#CFLAGS=-fast -g0 -Kpic $(INC) -Bdynamic -noex
-# SunC appears to miscompile Socket::writeByte by not incrementing the
-# buffer pointer, so no optimization for now
-#CFLAGS=-g -Kpic $(INC) -Bdynamic -noex
-CFLAGS=-g0 -Kpic -noex -xO1 -xlibmil -xlibmopt -features=tmplife -xbuiltin=%all -mt $(INC)
-CXXFLAGS=$(CFLAGS)
-CXX=CC
-
-HDRS= HostChannel.h InvokeMessage.h LoadModuleMessage.h Message.h \
-      ReturnMessage.h Value.h BrowserChannel.h Debug.h DebugLevel.h \
-      SessionHandler.h ServerMethods.h Socket.h AllowedConnections.h \
-      LoadJsniMessage.h InvokeSpecialMessage.h FreeValueMessage.h
-
-OBJS=	HostChannel.o LoadModuleMessage.o InvokeMessage.o \
-	ReturnMessage.o ServerMethods.o Debug.o Socket.o \
-	AllowedConnections.o LoadJsniMessage.o InvokeSpecialMessage.o \
-	FreeValueMessage.o
-
-SRCS=	HostChannel.cpp LoadModuleMessage.cpp InvokeMessage.cpp \
-	ReturnMessage.cpp ServerMethods.cpp Debug.cpp Socket.cpp \
-	AllowedConnections.cpp LoadJsniMessage.cpp InvokeSpecialMessage.cpp \
-	FreeValueMessage.cpp
-
-OBJ32= $(patsubst %.cpp,obj32/%.o,$(SRCS))
-OBJ64= $(patsubst %.cpp,obj64/%.o,$(SRCS))
-
-all:: libcommon32.a libcommon64.a
-
-libcommon32.a: $(OBJ32) obj32.dir
-	ar -rv $@ $(OBJ32)
-
-libcommon64.a: $(OBJ64) obj64.dir
-	ar -rv $@ $(OBJ64)
-
-obj32.dir:
-	-mkdir obj32
-	touch obj32.dir
-
-obj64.dir:
-	-mkdir obj64
-	touch obj64.dir
-
-obj32/%.o: %.cpp obj32.dir
-	$(CXX) $(CXXFLAGS) -m32 -c $< -o $@
-
-obj64/%.o: %.cpp obj64.dir
-	$(CXX) $(CXXFLAGS) -m64 -c $< -o $@
-
-.PHONY: all clean depend
-
-clean:
-	-rm $(OBJ32) $(OBJ64) libcommon32.a libcommon64.a
-
-depend:
-	$(CXX) -xMMF $(CFLAGS) $(SRCS) >>Makefile.sun
-#	makedepend -- $(CFLAGS) -- $(SRCS)
-
-# DO NOT DELETE
-obj32/HostChannel.o obj64/HostChannel.o: Makefile.sun \
-  HostChannel.cpp HostChannel.h Platform.h Message.h \
-  ReturnMessage.h BrowserChannel.h Value.h SessionHandler.h \
-  InvokeMessage.h QuitMessage.h scoped_ptr/scoped_ptr.h
-obj32/LoadModuleMessage.o obj64/LoadModuleMessage.o: Makefile.sun \
-  LoadModuleMessage.cpp LoadModuleMessage.h Message.h \
-  BrowserChannel.h HostChannel.h Platform.h ReturnMessage.h Value.h \
-  SessionHandler.h scoped_ptr/scoped_ptr.h
-obj32/InvokeMessage.o obj64/InvokeMessage.o: Makefile.sun \
-  InvokeMessage.cpp InvokeMessage.h Message.h \
-  BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
-  SessionHandler.h
-obj32/ReturnMessage.o obj64/ReturnMessage.o: Makefile.sun \
-  ReturnMessage.cpp ReturnMessage.h Message.h \
-  BrowserChannel.h Value.h HostChannel.h Platform.h SessionHandler.h
-obj32/ServerMethods.o obj64/ServerMethods.o: Makefile.sun \
-  ServerMethods.cpp ServerMethods.h Value.h \
-  BrowserChannel.h HostChannel.h Platform.h Message.h ReturnMessage.h \
-  SessionHandler.h InvokeMessage.h scoped_ptr/scoped_ptr.h
-obj32/HostChannel.o obj64/HostChannel.o: Makefile.sun \
-  HostChannel.cpp HostChannel.h Platform.h Message.h \
-  ReturnMessage.h BrowserChannel.h Value.h SessionHandler.h \
-  InvokeMessage.h QuitMessage.h scoped_ptr/scoped_ptr.h
-obj32/LoadModuleMessage.o obj64/LoadModuleMessage.o: Makefile.sun \
-  LoadModuleMessage.cpp LoadModuleMessage.h Message.h \
-  BrowserChannel.h HostChannel.h Platform.h ReturnMessage.h Value.h \
-  SessionHandler.h scoped_ptr/scoped_ptr.h
-obj32/InvokeMessage.o obj64/InvokeMessage.o: Makefile.sun \
-  InvokeMessage.cpp InvokeMessage.h Message.h \
-  BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
-  SessionHandler.h
-obj32/InvokeSpecialMessage.o obj64/InvokeSpecialMessage.o: Makefile.sun \
-  InvokeSpecialMessage.cpp InvokeSpecialMessage.h Message.h \
-  BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
-  SessionHandler.h
-obj32/FreeValueMesssage.o obj64/FreeValueMesssage.o: Makefile.sun \
-  FreeValueMesssage.cpp FreeValueMesssage.h Message.h \
-  BrowserChannel.h Value.h HostChannel.h Platform.h ReturnMessage.h \
-  SessionHandler.h
-obj32/ReturnMessage.o obj64/ReturnMessage.o: Makefile.sun \
-  ReturnMessage.cpp ReturnMessage.h Message.h \
-  BrowserChannel.h Value.h HostChannel.h Platform.h SessionHandler.h
-obj32/ServerMethods.o obj64/ServerMethods.o: Makefile.sun \
-  ServerMethods.cpp ServerMethods.h Value.h \
-  BrowserChannel.h HostChannel.h Platform.h Message.h ReturnMessage.h \
-  SessionHandler.h InvokeMessage.h scoped_ptr/scoped_ptr.h
-obj32/Debug.o obj64/Debug.o: Makefile.sun \
-  Debug.cpp Debug.h DebugLevel.h
-obj32/Socket.o obj64/Socket.o: Makefile.sun \
-  Socket.cpp Socket.h Debug.h DebugLevel.h
-obj32/AllowedConnections.o obj64/AllowedConnections.o: Makefile.sun \
-  AllowedConnections.cpp AllowedConnections.h Debug.h DebugLevel.h
diff --git a/plugins/common/Message.h b/plugins/common/Message.h
deleted file mode 100644
index a244e0b..0000000
--- a/plugins/common/Message.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __MESSAGE_H
-#define __MESSAGE_H
-/*
- * 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.
- */
-
-class Message {
-public:
-  virtual char getType() const = 0;
-  virtual bool isAsynchronous() const {
-    return false;
-  }
-  virtual ~Message() {}
-};
-
-#endif
diff --git a/plugins/common/Platform.h b/plugins/common/Platform.h
deleted file mode 100644
index bbc0334..0000000
--- a/plugins/common/Platform.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef _H_Platform
-#define _H_Platform
-/*
- * 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.
- */
-
-// Platform-specific hacks to enable more shared code elsewhere
-#ifdef _WINDOWS
-typedef __int32 int32_t;
-typedef unsigned __int32 uint32_t; 
-typedef __int16 int16_t;
-typedef unsigned __int16 uint16_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-typedef long ssize_t;
-
-#define snprintf sprintf_s
-#define SOCKETTYPE SOCKET
-// Bogus conversion from size_t -> unsigned int warnings.
-#pragma warning(disable:4267)
-#else
-#define SOCKETTYPE int
-#endif
-
-// Set the float byte-order if we know it -- see ByteOrder.h FloatByteOrder
-#if defined(i386) || defined(i586) || defined(i686) || defined(_x86)
-#define PLATFORM_FLOAT_ENDIANESS FLOAT_LITTLE_ENDIAN
-#endif
-
-#if defined(__sparc)
-#define PLATFORM_FLOAT_ENDIANESS FLOAT_BIG_ENDIAN
-#endif
-
-#endif
diff --git a/plugins/common/ProtocolVersionMessage.cpp b/plugins/common/ProtocolVersionMessage.cpp
deleted file mode 100644
index e2db3f9..0000000
--- a/plugins/common/ProtocolVersionMessage.cpp
+++ /dev/null
@@ -1,48 +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.
- */
-
-#include "ProtocolVersionMessage.h"
-#include "HostChannel.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-ProtocolVersionMessage::~ProtocolVersionMessage() {
-}
-
-char ProtocolVersionMessage::getType() const {
-  return TYPE;
-}
-
-/**
- * Receive a ProtocolVersion message from the server.
- */
-ProtocolVersionMessage* ProtocolVersionMessage::receive(HostChannel& channel) {
-  int version;
-  if (!channel.readInt(version)) {
-    // TODO(jat): error handling
-    printf("Failed to read version\n");
-    return 0;
-  }
-  return new ProtocolVersionMessage(version);
-}
-
-/**
- * Send a ProtocolVersion message on the channel.
- */
-bool ProtocolVersionMessage::send(HostChannel& channel, int version) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendInt(version)) return false;
-  return true;
-}
diff --git a/plugins/common/ProtocolVersionMessage.h b/plugins/common/ProtocolVersionMessage.h
deleted file mode 100644
index db6f770..0000000
--- a/plugins/common/ProtocolVersionMessage.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef __PROTOCOLVERSIONMESSAGE_H
-#define __PROTOCOLVERSIONMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing a ProtocolVersion message received from the server, and a
- * way to send one.
- *
- * This message indicates which version of the protocol the server has chosen
- * for the remainder of the communication.
- */
-class ProtocolVersionMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_PROTOCOL_VERSION;
-private:
-  int version;
-
-protected:
-  /**
-   * @param version selected protocol version
-   */
-  ProtocolVersionMessage(int version) : version(version) {}
-
-public:
-  ~ProtocolVersionMessage();
-  virtual char getType() const;
-
-  int getVersion() const { return version; }
-
-  static ProtocolVersionMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, int version);
-};
-#endif
diff --git a/plugins/common/QuitMessage.h b/plugins/common/QuitMessage.h
deleted file mode 100644
index f8f9b80..0000000
--- a/plugins/common/QuitMessage.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef __H_QuitMessage
-#define __H_QuitMessage
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-
-/**
- * This class represents a Quit message sent to the server, indicating the
- * channel should be closed down.
- */
-class QuitMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_QUIT;
-private:
-  QuitMessage() {}
-
-public:
-  virtual char getType() const {
-    return TYPE;
-  }
-
-  static bool send(HostChannel& channel) {
-    return channel.sendByte(TYPE);
-  }
-};
-#endif
diff --git a/plugins/common/ReturnMessage.cpp b/plugins/common/ReturnMessage.cpp
deleted file mode 100644
index 159d009..0000000
--- a/plugins/common/ReturnMessage.cpp
+++ /dev/null
@@ -1,42 +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.
- */
-
-#include "ReturnMessage.h"
-#include "HostChannel.h"
-
-char ReturnMessage::getType() const {
-  return TYPE;
-}
-  
-ReturnMessage* ReturnMessage::receive(HostChannel& channel) {
-  char isException;
-  if (!channel.readByte(isException)) {
-    // TODO(jat): error handling
-    return 0;
-  }
-  gwt::Value retval;
-  if (!channel.readValue(retval)) {
-    // TODO(jat): error handling
-    return 0;
-  }
-  return new ReturnMessage(isException != 0, retval);
-}
-
-bool ReturnMessage::send(HostChannel& channel, bool isException, const gwt::Value& retval) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendByte(isException ? 1 : 0)) return false;
-  return channel.sendValue(retval);
-}
diff --git a/plugins/common/ReturnMessage.h b/plugins/common/ReturnMessage.h
deleted file mode 100644
index 29141ec..0000000
--- a/plugins/common/ReturnMessage.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef __RETURNMESSAGE_H
-#define __RETURNMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing a Return message received from the server, and a way
- * to send one.
- *
- * This message gives the return value of a previous Invoke or LoadModule
- * message (for the latter, only the exception state is important).
- */
-class ReturnMessage : public Message {
-  static const char TYPE = MESSAGE_TYPE_RETURN;
-private:
-  bool bisException;
-  gwt::Value retval;
-
-public:
-  ReturnMessage(bool isException, const gwt::Value& retValue) : bisException(isException),
-      retval(retValue) {}
-
-  bool isException() const { return bisException; }
-  const gwt::Value& getReturnValue() const { return retval; }
-  virtual char getType() const;
-
-  static ReturnMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, bool isException, const gwt::Value& retValue);
-};
-#endif
diff --git a/plugins/common/ServerMethods.cpp b/plugins/common/ServerMethods.cpp
deleted file mode 100644
index 672b44a..0000000
--- a/plugins/common/ServerMethods.cpp
+++ /dev/null
@@ -1,149 +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.
- */
-
-#include <string>
-
-#include "Debug.h"
-#include "FreeValueMessage.h"
-#include "HostChannel.h"
-#include "InvokeMessage.h"
-#include "InvokeSpecialMessage.h"
-#include "ReturnMessage.h"
-#include "ServerMethods.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-using std::string;
-
-gwt::Value ServerMethods::getProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
-    int dispatchId) {
-  if (!channel.isConnected()) {
-    Debug::log(Debug::Debugging) << "Ignoring getProperty after disconnect"
-        << Debug::flush;
-    return gwt::Value();
-  }
-  gwt::Value args[2];
-  args[0].setInt(objectRef);
-  args[1].setInt(dispatchId);
-  if (!InvokeSpecialMessage::send(channel, SPECIAL_GET_PROPERTY, 2, args)) {
-    Debug::log(Debug::Error) << "  failed to send invoke of GetProperty(disp=" << dispatchId
-        << ", obj=" << objectRef << ")" << Debug::flush;
-    return gwt::Value();
-  }
-  scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
-  if (!retMsg.get()) {
-    Debug::log(Debug::Error) << "getProperty: get return value failed for GetProperty(disp="
-        << dispatchId << ", obj=" << objectRef << ")" << Debug::flush;
-    return gwt::Value();
-  }
-  return retMsg->getReturnValue();
-}
-
-int ServerMethods::hasMethod(HostChannel& channel, SessionHandler* handler, int classId,
-    const std::string& name) {
-  if (name != "toString" && name.find("::") == string::npos) {
-    // only JSNI-style names and toString are valid
-    return -1;
-  }
-  if (!channel.isConnected()) {
-    Debug::log(Debug::Debugging) << "Ignoring hasMethod after disconnect"
-        << Debug::flush;
-    return -2;
-  }
-  gwt::Value arg;
-  arg.setString(name);
-  if (!InvokeSpecialMessage::send(channel, SPECIAL_HAS_METHOD, 1, &arg)) {
-    Debug::log(Debug::Error) << "hasMethod: invoke(hasMethod) failed" << Debug::flush;
-    return -2;
-  }
-  scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
-  if (!retMsg.get()) {
-    Debug::log(Debug::Error) << "hasMethod: get return value failed" << Debug::flush;
-    return -2;
-  }
-  gwt::Value retval = retMsg->getReturnValue();
-  // TODO(jat): better error handling?
-  return retval.isInt() ? retval.getInt() : -2;
-}
-
-int ServerMethods::hasProperty(HostChannel& channel, SessionHandler* handler, int classId,
-    const std::string& name) {
-  if (name != "toString" && name.find("::") == string::npos) {
-    // only JSNI-style names and toString are valid
-    return -1;
-  }
-  if (!channel.isConnected()) {
-    Debug::log(Debug::Debugging) << "Ignoring hasProperty after disconnect"
-        << Debug::flush;
-    return -2;
-  }
-  gwt::Value arg;
-  arg.setString(name);
-  if (!InvokeSpecialMessage::send(channel, SPECIAL_HAS_PROPERTY, 1, &arg)) {
-    Debug::log(Debug::Error) << "hasProperty: invoke(hasProperty) failed" << Debug::flush;
-    return -2;
-  }
-  scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
-  if (!retMsg.get()) {
-    Debug::log(Debug::Error) << "hasProperty: get return value failed" << Debug::flush;
-    return -2;
-  }
-  gwt::Value retval = retMsg->getReturnValue();
-  // TODO(jat): better error handling?
-  return retval.isInt() ? retval.getInt() : -2;
-}
-
-bool ServerMethods::setProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
-    int dispatchId, const gwt::Value& value) {
-  if (!channel.isConnected()) {
-    Debug::log(Debug::Debugging) << "Ignoring setProperty after disconnect"
-        << Debug::flush;
-    return false;
-  }
-  // TODO(jat): error handling?
-  gwt::Value args[3];
-  args[0].setInt(objectRef);
-  args[1].setInt(dispatchId);
-  args[2] = value;
-  if (!InvokeSpecialMessage::send(channel, SPECIAL_SET_PROPERTY, 3, args)) {
-    Debug::log(Debug::Error) << "  failed to send invoke of SetProperty(disp=" << dispatchId
-        << ", obj=" << objectRef << ")" << Debug::flush;
-    return false;
-  }
-  scoped_ptr<ReturnMessage> retMsg(channel.reactToMessagesWhileWaitingForReturn(handler));
-  if (!retMsg.get()) {
-    Debug::log(Debug::Error) << "setProperty: get return value failed for SetProperty(disp="
-        << dispatchId << ", obj=" << objectRef << ")" << Debug::flush;
-    return false;
-  }
-  // TODO: use the returned exception?
-  return !retMsg.get()->isException();
-}
-
-bool ServerMethods::freeJava(HostChannel& channel, SessionHandler* handler, int idCount,
-      const int* ids) {
-  // If we are disconnected, assume the server will free all of these anyway.
-  // This deals with the problem of getting finalizers called after the channel is dropped.
-  if (!channel.isConnected()) {
-    Debug::log(Debug::Debugging) << "Ignoring freeJava after disconnect"
-        << Debug::flush;
-    return true;
-  }
-  if (!FreeValueMessage::send(channel, idCount, ids)) {
-    Debug::log(Debug::Error) << "  failed to send FreeValues message" << Debug::flush;
-    return false;
-  }
-  return true;
-}
diff --git a/plugins/common/ServerMethods.h b/plugins/common/ServerMethods.h
deleted file mode 100644
index 02bf921..0000000
--- a/plugins/common/ServerMethods.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef _H_ServerMethods
-#define _H_ServerMethods
-/*
- * 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.
- */
-
-#include "Value.h"
-
-class HostChannel;
-class SessionHandler;
-
-/**
- * Encapsulates the methods defined on the special server object.
- */
-class ServerMethods {
-public:
-  /**
-   * Get the value of a property on an object.
-   * 
-   * @param objectRef ID of object to fetch field on
-   * @param dispatchID dispatch ID of field
-   * @return the value of the property, undef if none (or on error)
-   */
-  static gwt::Value getProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
-      int dispatchId);
-  
-  /**
-   * Lookup the named method on the specified class.
-   * 
-   * @return the dispatch ID (non-negative) of the method if present, or -1 if not.
-   * If an error is encountered, -2 is returned.
-   */
-  static int hasMethod(HostChannel& channel, SessionHandler* handler, int classId,
-      const std::string& name);
-  
-  /**
-   * Lookup the named property on the specified class.
-   * 
-   * @return the dispatch ID (non-negative) of the property if present, or -1 if not.
-   * If an error is encountered, -2 is returned.
-   */
-  static int hasProperty(HostChannel& channel, SessionHandler* handler, int classId,
-      const std::string& name);
-
-  /**
-   * Set the value of a property on an object.
-   * 
-   * @param objectRef ID of object to fetch field on
-   * @param dispatchID dispatch ID of field
-   * @param value value to store in the property
-   * @return false if an error occurred
-   */
-  static bool setProperty(HostChannel& channel, SessionHandler* handler, int objectRef,
-      int dispatchId, const gwt::Value& value);
-  
-  /**
-   * Tell the server that the client no longer has any references to the specified
-   * Java object.
-   * 
-   * @param objcetRef ID of object to free
-   * @return false if an error occurred
-   */ 
-  static bool freeJava(HostChannel& channel, SessionHandler* handler, int idCount, const int* ids);
-};
-
-#endif
diff --git a/plugins/common/SessionHandler.h b/plugins/common/SessionHandler.h
deleted file mode 100644
index 159f762..0000000
--- a/plugins/common/SessionHandler.h
+++ /dev/null
@@ -1,111 +0,0 @@
-#ifndef _H_SessionHandler
-#define _H_SessionHandler
-/*
- * 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.
- */
-
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Interface for session-handling needs.
- *
- * Note that if this is being "added" onto a class which extends a C structure, the inheritance
- * chain leading to the plain C object must be first in the inheritance list.
- *
- * For example:
- *
- * extern "C" {
- *   typedef struct PlainCstruct {
- *      ... data only members here
- *   } PlainCstruct;
- * };
- *
- * class MyWrapper: public PlainCstruct, SessionHandler {
- *    ... virtual functions ok here
- * };
- */
-class SessionHandler {
-  friend class HostChannel;
-public:
-  enum SpecialMethodId {
-    HasMethod = SPECIAL_HAS_METHOD,
-    HasProperty = SPECIAL_HAS_PROPERTY,
-    GetProperty = SPECIAL_GET_PROPERTY,
-    SetProperty = SPECIAL_SET_PROPERTY
-  };
-protected:
-  SessionHandler(): alreadyDisconnected(false) {
-  }
-
-  /**
-   * Called by the server socket when it cannot read, write, or flush.
-   */
-  void disconnectDetected() {
-    if (!alreadyDisconnected) {
-      alreadyDisconnected = true;
-      disconnectDetectedImpl();
-    }
-  }
-
-  /**
-   * Implementors should invoke __gwt_disconnected() in the hosted.html window
-   * to "glass" the screen with a disconnect message.
-   */
-  virtual void disconnectDetectedImpl() = 0;
-
-  /**
-   * Report a fatal error -- the channel will be closed after this method
-   * returns.
-   */
-  virtual void fatalError(HostChannel& channel, const std::string& message) = 0;
-
-  virtual void freeValue(HostChannel& channel, int idCount, const int* ids) = 0;
-
-  virtual void loadJsni(HostChannel& channel, const std::string& js) = 0;
-
-  /**
-   * Does not own any of its args -- must copy them if it wants them and should not free the
-   * ones passed in.
-   *
-   * Returns true if an exception occurred.
-   */
-  virtual bool invoke(HostChannel& channel, const gwt::Value& thisObj,
-      const std::string& methodName, int numArgs, const gwt::Value* const args,
-      gwt::Value* returnValue) = 0;
-
-  /**
-   * Invoke a plugin-provided method with the given args.  As above, this method does not own
-   * any of its args.
-   *
-   * Returns true if an exception occurred.
-   */
-  virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
-      const gwt::Value* const args, gwt::Value* returnValue) = 0;
-
-  /**
-   * Send any queued up free values back to the server.
-   */
-  virtual void sendFreeValues(HostChannel& channel) = 0;
-
-  virtual ~SessionHandler() {}
-
-private:
-  bool alreadyDisconnected;
-};
-
-#endif
diff --git a/plugins/common/Socket.cpp b/plugins/common/Socket.cpp
deleted file mode 100644
index fd32461..0000000
--- a/plugins/common/Socket.cpp
+++ /dev/null
@@ -1,174 +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.
- */
-
-#include "Platform.h"
-
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <cerrno>
-
-#include "Socket.h"
-
-void Socket::init() {
-#ifdef _WINDOWS
-  // version 2.2 supported on Win95OSR2/WinNT4 and up
-  WORD winsockVers = MAKEWORD(2, 2);
-  WSADATA wsaData;
-  int err = WSAStartup(winsockVers, &wsaData);
-  if (err) {
-    // TODO(jat): report error
-    Debug::log(Debug::Error) << "WSAStartup(vers=2.2): err=" << err << Debug::flush;
-  }
-#endif
-}
-
-bool Socket::connect(const char* host, int port) {
-  Debug::log(Debug::Debugging) << "Socket::connect(host=" << host << ",port=" << port << ")"
-      << Debug::flush;
-  if (isConnected()) {
-    Debug::log(Debug::Error) << "Socket::connect - already connected" << Debug::flush;
-    return false;
-  }
-
-  SOCKETTYPE fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-  if (fd < 0) {
-    Debug::log(Debug::Error) << "Socket::connect - can't get socket" << Debug::flush;
-    return false;
-  }
-#ifdef SO_NOSIGPIPE
-  // On BSD, we need to suppress the SIGPIPE if the remote end disconnects.
-  int option_value = 1;
-  if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &option_value, sizeof(int))) {
-    Debug::log(Debug::Error) << "Socket::connect - can't set NOSIGPIPE option" << Debug::flush;
-    return false;
-  }
-#endif
-
-  struct sockaddr_in sockAddr;
-  memset(&sockAddr, 0, static_cast<int>(sizeof(sockAddr)));
-  // check for numeric IP4 addresses first
-  // TODO(jat): handle IPv6 addresses
-  unsigned long numericAddr = inet_addr(host);
-  if (numericAddr != 0xFFFFFFFF) {
-    sockAddr.sin_addr.s_addr = numericAddr;
-    sockAddr.sin_family = AF_INET;
-  } else {
-    struct hostent* hent = gethostbyname(host);
-    if (!hent || !hent->h_addr_list[0]) {
-      Debug::log(Debug::Error) << "Unable to get address for " << host << Debug::flush;
-      return false;
-    }
-    memcpy(&(sockAddr.sin_addr), hent->h_addr_list[0], hent->h_length);
-    sockAddr.sin_family = hent->h_addrtype;
-  }
-  sockAddr.sin_port = htons(port);
-
-  if (::connect(fd, (struct sockaddr*) &sockAddr, sizeof(sockAddr)) < 0) {
-#ifdef _WINDOWS
-    char buf[256];
-    DWORD dwLastError = ::GetLastError();
-    strerror_s(buf, sizeof(buf), dwLastError);
-    Debug::log(Debug::Error) << "Failed to connect to " << host << ":" << port << " -- error code "
-        << dwLastError << Debug::flush;
-    closesocket(fd);
-    ::SetLastError(dwLastError);
-#else
-    Debug::log(Debug::Error) << "Can't connect to " << host << ":" << port << " -- "
-        << strerror(errno) << Debug::flush;
-    close(fd);
-#endif
-    return false;
-  }
-  sock = fd;
-  connected = true;
-  readBufPtr = readValid = readBuf;
-  writeBufPtr = writeBuf;
-#ifdef _WINDOWS
-  Debug::log(Debug::Spam) << "  connected" << Debug::flush;
-#else
-  Debug::log(Debug::Spam) << "  connected, fd=" << fd << Debug::flush;
-#endif
-  return true;
-}
-
-bool Socket::disconnect(bool doFlush) {
-  if (connected) {
-    Debug::log(Debug::Debugging) << "Disconnecting socket" << Debug::flush;
-    if (doFlush) {
-      flush();
-    }
-    connected = false;
-#ifdef _WINDOWS
-    closesocket(sock);
-#else
-    shutdown(sock, SHUT_RDWR);
-    close(sock);
-#endif
-  }
-  return true;
-}
-
-bool Socket::emptyWriteBuf() {
-  size_t len = writeBufPtr - writeBuf;
-  Debug::log(Debug::Spam) << "Socket::emptyWriteBuf: len=" << len << Debug::flush;
-  ++numWrites;
-  totWriteBytes += len;
-  if (len > maxWriteBytes) {
-    maxWriteBytes = len;
-  }
-  for (char* ptr = writeBuf; len > 0; ) {
-    ssize_t n = send(sock, ptr, len, 0);
-    if (n <= 0) {
-      if (errno == EPIPE) {
-        Debug::log(Debug::Warning) << "Other end of socket disconnected" << Debug::flush;
-        disconnect(false);
-        return false;
-      }
-      Debug::log(Debug::Error) << "Error " << errno << " writing " << len << " bytes to socket"
-          << Debug::flush;
-      return false;
-    }
-    ptr += n;
-    len -= n;
-  }
-  writeBufPtr = writeBuf;
-  return true;
-}
-
-bool Socket::fillReadBuf() {
-  readBufPtr = readBuf;
-  errno = 0;
-  ssize_t n = recv(sock, readBuf, BUF_SIZE, 0);
-  if (n <= 0) {
-    // EOF results in no error
-    if (!errno || errno == EPIPE) {
-      Debug::log(Debug::Warning) << "Other end of socket disconnected" << Debug::flush;
-      disconnect(false);
-      return false;
-    }
-    Debug::log(Debug::Error) << "Error " << errno << " reading " << BUF_SIZE << " bytes from socket"
-        << Debug::flush;
-    return false;
-  }
-  ++numReads;
-  totReadBytes += n;
-  if (static_cast<size_t>(n) > maxReadBytes) {
-    maxReadBytes = n;
-  }
-  readValid = readBuf + n;
-  return true;
-}
diff --git a/plugins/common/Socket.h b/plugins/common/Socket.h
deleted file mode 100644
index 90298f6..0000000
--- a/plugins/common/Socket.h
+++ /dev/null
@@ -1,170 +0,0 @@
-#ifndef _H_Socket
-#define _H_Socket
-/*
- * 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.
- */
-
-#include "Platform.h"
-#include "Debug.h"
-
-#include <string>
-
-#ifdef _WINDOWS
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
-#include <netdb.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-#include <sys/time.h>
-#endif
-
-/**
- * Encapsulates platform dependencies regarding buffered sockets.
- */
-class Socket {
-private:
-  // Buffer size, chosen to fit in a single packet after TCP/IP overhead.
-  static const int BUF_SIZE = 1400;
-  
-  // Can't rely on a sentinel value for the socket descriptor
-  bool connected;
-  
-  SOCKETTYPE sock;
-  
-  // Read buffer
-  char* readBuf;
-  
-  // One bye past end of valid data in readBuf
-  char* readValid;
-  
-  // Current read pointer
-  char* readBufPtr;
-
-  // Write buffer
-  char* writeBuf;
-  
-  // Current write pointer
-  char* writeBufPtr;
-
-  // Stats
-  unsigned long numReads;
-  unsigned long long totReadBytes;
-  size_t maxReadBytes;
-
-  unsigned long numWrites;
-  unsigned long long totWriteBytes;
-  size_t maxWriteBytes;
-
-private:
-  void init();
-  bool fillReadBuf();
-  bool emptyWriteBuf();
-
-public:
-  Socket() : connected(false), readBuf(new char[BUF_SIZE]), writeBuf(new char[BUF_SIZE]) {
-    readBufPtr = readValid = readBuf;
-    writeBufPtr = writeBuf;
-    numReads = numWrites = 0;
-    maxReadBytes = maxWriteBytes = 0;
-    totReadBytes = totWriteBytes = 0;
-    init();
-  }
-  
-  ~Socket() {
-    disconnect();
-#ifdef _WINDOWS
-    if (0) WSACleanup();
-#endif
-    // TODO(jat): LEAK LEAK LEAK
-    // delete[] readBuf;
-    // delete[] writeBuf;
-    Debug::log(Debug::Debugging) << "Socket: #r=" << numReads << ", bytes/read="
-        << (numReads ? totReadBytes / numReads : 0) << ", maxr=" << maxReadBytes << "; #w="
-        << numWrites << ", bytes/write=" << (numWrites ? totWriteBytes / numWrites : 0) << ", maxw="
-        << maxWriteBytes << Debug::flush;
-  }
-
-  /**
-   * Connects this socket to a specified port on a host.
-   * 
-   * @param host host name or IP address to connect to
-   * @param port TCP port to connect to
-   * @return true if the connection succeeds
-   */ 
-  bool connect(const char* host, int port);
-  
-  /**
-   * Returns true if the socket is connected.
-   */
-  bool isConnected() const {
-    return connected;
-  }
-  
-  /**
-   * Disconnect this socket.
-   * 
-   * @param doFlush true (the default value) if the socket should be flushed.
-   * @return true if disconnect succeeds
-   */
-  bool disconnect(bool doFlush = true);
-  
-  /**
-   * Read a single byte from the socket.
-   *
-   * @return -1 on error, otherwise unsigned byte read.
-   */
-  int readByte() {
-    if (readBufPtr >= readValid) {
-      if (!fillReadBuf()) {
-        return -1;
-      }
-    }
-    return static_cast<unsigned char>(*readBufPtr++);
-  }
-  
-  /**
-   * Write a single byte to the socket.
-   * 
-   * @return true on success.
-   */
-  bool writeByte(char c) {
-    if (writeBufPtr >= writeBuf + BUF_SIZE) {
-      if (!emptyWriteBuf()) {
-        return false;
-      }
-    }
-    *writeBufPtr++ = c;
-    return true;
-  }
-  
-  /**
-   * Flush any pending writes on the socket.
-   *
-   * @return true on success
-   */
-  bool flush() {
-    if (writeBufPtr > writeBuf) {
-      if (!emptyWriteBuf()) {
-        return false;
-      }
-    }
-    return true;
-  }
-};
-
-#endif
diff --git a/plugins/common/SwitchTransportMessage.cpp b/plugins/common/SwitchTransportMessage.cpp
deleted file mode 100644
index ccb5520..0000000
--- a/plugins/common/SwitchTransportMessage.cpp
+++ /dev/null
@@ -1,49 +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.
- */
-
-#include "SwitchTransportMessage.h"
-#include "HostChannel.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-SwitchTransportMessage::~SwitchTransportMessage() {
-}
-
-char SwitchTransportMessage::getType() const {
-  return TYPE;
-}
-
-/**
- * Receive a SwitchTransport message from the server.
- */
-SwitchTransportMessage* SwitchTransportMessage::receive(HostChannel& channel) {
-  std::string transport;
-  if (!channel.readString(transport)) {
-    // TODO(jat): error handling
-    printf("Failed to read transport\n");
-    return 0;
-  }
-  return new SwitchTransportMessage(transport);
-}
-
-/**
- * Send a fatal error message on the channel.
- */
-bool SwitchTransportMessage::send(HostChannel& channel,
-    const std::string& transport) {
-  if (!channel.sendByte(TYPE)) return false;
-  if (!channel.sendString(transport)) return false;
-  return true;
-}
diff --git a/plugins/common/SwitchTransportMessage.h b/plugins/common/SwitchTransportMessage.h
deleted file mode 100644
index 0dad82a..0000000
--- a/plugins/common/SwitchTransportMessage.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef __SWITCHTRANSPORTMESSAGE_H
-#define __SWITCHTRANSPORTMESSAGE_H
-/*
- * 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.
- */
-
-#include <string>
-#include "Message.h"
-#include "BrowserChannel.h"
-#include "Value.h"
-
-class HostChannel;
-
-/**
- * Class representing an SwitchTransport message received from the server, and a
- * way to send one.
- *
- * The SwitchTransport message is sent by the server in response to a
- * ChooseTransport message, and will select one of the available transports
- * advertised by the client.  The empty string represents the in-band channel,
- * and is always an acceptable response.
- */
-class SwitchTransportMessage : public Message {
-public:
-  static const char TYPE = MESSAGE_TYPE_SWITCH_TRANSPORT;
-private:
-  std::string transport;
-
-protected:
-  SwitchTransportMessage(const std::string& transport) : transport(transport) {}
-
-public:
-  ~SwitchTransportMessage();
-  virtual char getType() const;
-
-  const std::string& getTransport() const { return transport; }
-
-  static SwitchTransportMessage* receive(HostChannel& channel);
-  static bool send(HostChannel& channel, const std::string& transport);
-};
-#endif
diff --git a/plugins/common/Value.h b/plugins/common/Value.h
deleted file mode 100644
index ab50f5e..0000000
--- a/plugins/common/Value.h
+++ /dev/null
@@ -1,399 +0,0 @@
-#ifndef _H_Value
-#define _H_Value
-/*
- * 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.
- */
-
-#ifndef _WINDOWS
-// TODO(jat): remove; for abort() which should probably go away
-#include <stdlib.h>
-#endif
-
-#include <string>
-
-#include "Debug.h"
-
-#include "BrowserChannel.h"
-
-namespace gwt {
-class Value {
-public:
-  enum ValueType {
-    NULL_TYPE = VALUE_TYPE_NULL,
-    BOOLEAN = VALUE_TYPE_BOOLEAN,
-    BYTE = VALUE_TYPE_BYTE,
-    CHAR = VALUE_TYPE_CHAR,
-    SHORT = VALUE_TYPE_SHORT,
-    INT = VALUE_TYPE_INT,
-    LONG = VALUE_TYPE_LONG,
-    FLOAT = VALUE_TYPE_FLOAT,
-    DOUBLE = VALUE_TYPE_DOUBLE,
-    STRING = VALUE_TYPE_STRING,
-    JAVA_OBJECT = VALUE_TYPE_JAVA_OBJECT,
-    JS_OBJECT = VALUE_TYPE_JS_OBJECT,
-    UNDEFINED = VALUE_TYPE_UNDEFINED
-  };
-
-private:
-  ValueType type;
-  union {
-    bool  boolValue;
-    unsigned char byteValue;
-    unsigned short charValue;
-    double doubleValue;
-    float floatValue;
-    int32_t intValue;
-    int64_t longValue;
-    short shortValue;
-    std::string* stringValue;
-  } value;
-
-public:
-  Value() {
-    type = UNDEFINED;
-  }
-
-  Value(const Value& other) {
-    copyValue(other);
-  }
-
-  Value& operator=(const Value& other) {
-    clearOldValue();
-    copyValue(other);
-    return *this;
-  }
-
-  ~Value() {
-    clearOldValue();
-  }
-
-  bool getBoolean() const {
-    assertType(BOOLEAN);
-    return value.boolValue;
-  }
-
-  unsigned char getByte() const {
-    assertType(BYTE);
-    return value.byteValue;
-  }
-
-  unsigned short getChar() const {
-    assertType(CHAR);
-    return value.charValue;
-  }
-
-  double getDouble() const {
-    assertType(DOUBLE);
-    return value.doubleValue;
-  }
-
-  float getFloat() const {
-    assertType(FLOAT);
-    return value.floatValue;
-  }
-
-  int getInt() const {
-    assertType(INT);
-    return value.intValue;
-  }
-
-  int getJavaObjectId() const {
-    assertType(JAVA_OBJECT);
-    return value.intValue;
-  }
-
-  int getJsObjectId() const {
-    assertType(JS_OBJECT);
-    return value.intValue;
-  }
-
-  int64_t getLong() const {
-    assertType(LONG);
-    return value.longValue;
-  }
-
-  short getShort() const {
-    assertType(SHORT);
-    return value.shortValue;
-  }
-
-  const std::string getString() const {
-    assertType(STRING);
-    return std::string(*value.stringValue);
-  }
-
-  ValueType getType() const {
-    return type;
-  }
-
-  bool isBoolean() const {
-    return type == BOOLEAN;
-  }
-
-  bool isByte() const {
-    return type == BYTE;
-  }
-
-  bool isChar() const {
-    return type == CHAR;
-  }
-
-  bool isDouble() const {
-    return type == DOUBLE;
-  }
-
-  bool isFloat() const {
-    return type == FLOAT;
-  }
-
-  bool isInt() const {
-    return type == INT;
-  }
-
-  bool isJavaObject() const {
-    return type == JAVA_OBJECT;
-  }
-
-  bool isJsObject() const {
-    return type == JS_OBJECT;
-  }
-
-  bool isLong() const {
-    return type == LONG;
-  }
-
-  bool isNull() const {
-    return type == NULL_TYPE;
-  }
-
-  bool isNumber() const {
-    switch (type) {
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  bool isPrimitive() const {
-    switch (type) {
-      case BOOLEAN:
-      case BYTE:
-      case CHAR:
-      case DOUBLE:
-      case FLOAT:
-      case INT:
-      case LONG:
-      case SHORT:
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  bool isShort() const {
-    return type == SHORT;
-  }
-
-  bool isString() const {
-    return type == STRING;
-  }
-
-  bool isUndefined() const {
-    return type == UNDEFINED;
-  }
-
-  void setBoolean(bool val) {
-    clearOldValue();
-    type = BOOLEAN;
-    value.boolValue = val;
-  }
-
-  void setByte(unsigned char val) {
-    clearOldValue();
-    type = BYTE;
-    value.byteValue = val;
-  }
-
-  void setChar(unsigned short val) {
-    clearOldValue();
-    type = CHAR;
-    value.charValue = val;
-  }
-
-  void setDouble(double val) {
-    clearOldValue();
-    type = DOUBLE;
-    value.doubleValue = val;
-  }
-
-  void setDouble(const double* val) {
-    clearOldValue();
-    type = DOUBLE;
-    value.doubleValue = *val;
-  }
-
-  void setFloat(float val) {
-    clearOldValue();
-    type = FLOAT;
-    value.floatValue = val;
-  }
-
-  void setInt(int val) {
-    clearOldValue();
-    type = INT;
-    value.intValue = val;
-  }
-
-  void setJavaObject(int objectId) {
-    clearOldValue();
-    type = JAVA_OBJECT;
-    value.intValue = objectId;
-  }
-
-  void setJsObjectId(int val) {
-    clearOldValue();
-    type = JS_OBJECT;
-    value.intValue = val;
-  }
-
-  void setLong(int64_t val) {
-    clearOldValue();
-    type = LONG;
-    value.longValue = val;
-  }
-
-  void setNull() {
-    clearOldValue();
-    type = NULL_TYPE;
-  }
-
-  void setShort(short val) {
-    clearOldValue();
-    type = SHORT;
-    value.shortValue = val;
-  }
-
-  void setString(const char* chars, int len) {
-    setString(std::string(chars, len));
-  }
-
-  void setString(const std::string& val) {
-    clearOldValue();
-    type = STRING;
-    value.stringValue = new std::string(val);
-  }
-
-  void setUndefined() {
-    clearOldValue();
-    type = UNDEFINED;
-  }
-
-  std::string toString() const {
-    char buf[64];
-    switch (type) {
-      case NULL_TYPE:
-        return "null";
-      case BOOLEAN:
-        snprintf(buf, sizeof(buf), "boolean(%s)", getBoolean() ? "true"
-            : "false");
-        return std::string(buf);
-      case BYTE:
-        snprintf(buf, sizeof(buf), "byte(%d)", getByte());
-        return std::string(buf);
-      case CHAR:
-        snprintf(buf, sizeof(buf), "char(%d)", getChar());
-        return std::string(buf);
-      case SHORT:
-        snprintf(buf, sizeof(buf), "short(%d)", getShort());
-        return std::string(buf);
-      case INT:
-        snprintf(buf, sizeof(buf), "int(%d)", getInt());
-        return std::string(buf);
-      case LONG:
-        snprintf(buf, sizeof(buf), "long(%lld)",
-            static_cast<long long>(getLong()));
-        return std::string(buf);
-      case FLOAT:
-        snprintf(buf, sizeof(buf), "float(%g)", getFloat());
-        return std::string(buf);
-      case DOUBLE:
-        snprintf(buf, sizeof(buf), "double(%g)", getDouble());
-        return std::string(buf);
-      case STRING:
-        snprintf(buf, sizeof(buf), "string(%.20s)", getString().c_str());
-        return std::string(buf);
-      case JAVA_OBJECT:
-        snprintf(buf, sizeof(buf), "JavaObj(%d)", getJavaObjectId());
-        return std::string(buf);
-      case JS_OBJECT:
-        snprintf(buf, sizeof(buf), "JsObj(%d)", getJsObjectId());
-        return std::string(buf);
-      case UNDEFINED:
-        return "undefined";
-      default:
-        return "Unknown type";
-    }
-  }
-
-private:
-  void assertType(ValueType reqType) const {
-    if (type != reqType) {
-      Debug::log(Debug::Error) << "Value::assertType - expecting type "
-          << int(reqType) << ", was " << int(type) << Debug::flush;
-      // TODO(jat): is this portable?  Should we do something else here?
-      abort();
-    }
-  }
-
-  void clearOldValue() {
-    if (type == STRING) {
-      delete value.stringValue;
-      type = UNDEFINED;
-    }
-  }
-
-  // Precondition: existing value, if any, has been cleared
-  void copyValue(const Value& other) {
-    type = other.type;
-    value = other.value;
-    // handle deep copies of value types that need it
-    switch (type) {
-      case STRING:
-        value.stringValue = new std::string(*value.stringValue);
-        break;
-      default:
-        // no other values need deep copies
-        break;
-    }
-  }
-};
-
-inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const Value& val) {
-  if (dbg.isActive()) {
-    dbg << val.toString();
-  }
-  return dbg;
-}
-
-} // namespace gwt
-
-#endif
diff --git a/plugins/common/scoped_ptr/README.google b/plugins/common/scoped_ptr/README.google
deleted file mode 100644
index d513e21..0000000
--- a/plugins/common/scoped_ptr/README.google
+++ /dev/null
@@ -1,27 +0,0 @@
-Description
-===========
-
-This is the scoped_ptr from Boost with some additions by Google.
-
-Homepage
-========
-
-http://www.boost.org/
-http://www.boost.org/libs/smart_ptr/scoped_ptr.htm
-
-License
-=======
-
-http://boost.org/LICENSE_1_0.txt
-
-Source files and modifications
-==============================
-
-scoped_ptr_malloc added in by Ray Sidney of Google.  When one of these goes
-out of scope, instead of doing a delete or delete[], it calls free().
-scoped_ptr_malloc<char> is likely to see much more use than any other
-specializations.
-
-release() added in by Spencer Kimball of Google. Use this to conditionally
-transfer ownership of a heap-allocated object to the caller, usually on
-method success.
diff --git a/plugins/common/scoped_ptr/scoped_ptr.h b/plugins/common/scoped_ptr/scoped_ptr.h
deleted file mode 100644
index 1ae1b96..0000000
--- a/plugins/common/scoped_ptr/scoped_ptr.h
+++ /dev/null
@@ -1,364 +0,0 @@
-#ifndef SCOPED_PTR_H
-#define SCOPED_PTR_H
-
-// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
-// Copyright (c) 2001, 2002 Peter Dimov
-// 
-// Permission is hereby granted, free of charge, to any person or organization
-// obtaining a copy of the software and accompanying documentation covered by
-// this license (the "Software") to use, reproduce, display, distribute,
-// execute, and transmit the Software, and to prepare derivative works of the
-// Software, and to permit third-parties to whom the Software is furnished to
-// do so, all subject to the following:
-//
-// The copyright notices in the Software and this entire statement, including
-// the above license grant, this restriction and the following disclaimer,
-// must be included in all copies of the Software, in whole or in part, and
-// all derivative works of the Software, unless such copies or derivative
-// works are solely in the form of machine-executable object code generated by
-// a source language processor.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-//
-//  See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation.
-//
-//
-//  scoped_ptr mimics a built-in pointer except that it guarantees deletion
-//  of the object pointed to, either on destruction of the scoped_ptr or via
-//  an explicit reset(). scoped_ptr is a simple solution for simple needs;
-//  use shared_ptr if your needs are more complex.
-//
-//  *** NOTE ***
-//  If your scoped_ptr is a class member of class FOO pointing to a 
-//  forward declared type BAR (as shown below), then at creation (and 
-//  destruction) of an object of type FOO, BAR must be complete.  You can do
-//  this by either:
-//   - Making all FOO constructors and destructors non-inlined to FOO's class
-//     definition, instead placing them in foo.cc below an include of bar.h
-//   - Including bar.h before any creation or destruction of any object of
-//     type FOO
-//  The former is probably the less error-prone method, as shown below.
-//
-//  Example:
-//
-//  -- foo.h --
-//  class BAR;
-//
-//  class FOO {
-//   public:
-//    FOO();   // Required for sources that instantiate class FOO to compile!
-//    ~FOO();  // Required for sources that instantiate class FOO to compile!
-//    
-//   private:
-//    scoped_ptr<BAR> bar_;
-//  };
-//
-//  -- foo.cc --
-//  #include "bar.h"
-//  #include "foo.h"
-//  FOO::FOO() {}  // Empty, but must be non-inlined to FOO's class definition.
-//  FOO::~FOO() {} // Empty, but must be non-inlined to FOO's class definition.
-//
-//  scoped_ptr_malloc added in by Ray Sidney of Google.  When one of
-//  these goes out of scope, instead of doing a delete or delete[], it
-//  calls free().  scoped_ptr_malloc<char> is likely to see much more
-//  use than any other specializations.
-//
-//  release() added in by Spencer Kimball of Google. Use this to conditionally
-//  transfer ownership of a heap-allocated object to the caller, usually on
-//  method success.
-
-#include <cstddef>            // for std::ptrdiff_t
-#include <assert.h>           // for assert
-#include <stdlib.h>           // for free() decl
-
-template <typename T>
-class scoped_ptr;
-
-template <typename T>
-class scoped_ptr {
- private:
-
-  T* ptr;
-
-  // scoped_ptr's must not be copied.  We make sure of that by making the
-  // copy constructor prototype private.  At the same time, there is no body
-  // for this constructor.  Thus, if anything that has access to private
-  // members of scoped_ptr ever (inadvertently) copies a scoped_ptr, the
-  // linker will complain about missing symbols.  This is a good thing!
-  scoped_ptr(scoped_ptr const &);
-  scoped_ptr & operator=(scoped_ptr const &);
-
- public:
-
-  typedef T element_type;
-
-  explicit scoped_ptr(T* p = 0): ptr(p) {}
-
-  ~scoped_ptr() {
-    typedef char type_must_be_complete[sizeof(T)];
-    delete ptr;
-  }
-
-  void reset(T* p = 0) {
-    typedef char type_must_be_complete[sizeof(T)];
-
-    if (ptr != p) {
-      delete ptr;
-      ptr = p;
-    }
-  }
-
-  T& operator*() const {
-    assert(ptr != 0);
-    return *ptr;
-  }
-
-  T* operator->() const  {
-    assert(ptr != 0);
-    return ptr;
-  }
-
-  bool operator==(T* p) const {
-    return ptr == p;
-  }
-
-  bool operator!=(T* p) const {
-    return ptr != p;
-  }
-
-  T* get() const  {
-    return ptr;
-  }
-
-  void swap(scoped_ptr & b) {
-    T* tmp = b.ptr;
-    b.ptr = ptr;
-    ptr = tmp;
-  }
-
-  T* release() {
-    T* tmp = ptr;
-    ptr = 0;
-    return tmp;
-  }
-
- private:
-
-  // no reason to use these: each scoped_ptr should have its own object
-  template <typename U> bool operator==(scoped_ptr<U> const& p) const;
-  template <typename U> bool operator!=(scoped_ptr<U> const& p) const;
-};
-
-template<typename T> inline
-void swap(scoped_ptr<T>& a, scoped_ptr<T>& b) {
-  a.swap(b);
-}
-
-template<typename T> inline
-bool operator==(T* p, const scoped_ptr<T>& b) {
-  return p == b.get();
-}
-
-template<typename T> inline
-bool operator!=(T* p, const scoped_ptr<T>& b) {
-  return p != b.get();
-}
-
-//  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
-//  is guaranteed, either on destruction of the scoped_array or via an explicit
-//  reset(). Use shared_array or std::vector if your needs are more complex.
-
-template<typename T>
-class scoped_array {
- private:
-
-  T* ptr;
-
-  scoped_array(scoped_array const &);
-  scoped_array & operator=(scoped_array const &);
-
- public:
-
-  typedef T element_type;
-
-  explicit scoped_array(T* p = 0) : ptr(p) {}
-
-  ~scoped_array() {
-    typedef char type_must_be_complete[sizeof(T)];
-    delete[] ptr;
-  }
-
-  void reset(T* p = 0) {
-    typedef char type_must_be_complete[sizeof(T)];
-
-    if (ptr != p) {
-      delete [] ptr;
-      ptr = p;
-    }
-  }
-
-  T& operator[](std::ptrdiff_t i) const {
-    assert(ptr != 0);
-    assert(i >= 0);
-    return ptr[i];
-  }
-
-  bool operator==(T* p) const {
-    return ptr == p;
-  }
-
-  bool operator!=(T* p) const {
-    return ptr != p;
-  }
-
-  T* get() const {
-    return ptr;
-  }
-
-  void swap(scoped_array & b) {
-    T* tmp = b.ptr;
-    b.ptr = ptr;
-    ptr = tmp;
-  }
-
-  T* release() {
-    T* tmp = ptr;
-    ptr = 0;
-    return tmp;
-  }
-
- private:
-
-  // no reason to use these: each scoped_array should have its own object
-  template <typename U> bool operator==(scoped_array<U> const& p) const;
-  template <typename U> bool operator!=(scoped_array<U> const& p) const;
-};
-
-template<class T> inline
-void swap(scoped_array<T>& a, scoped_array<T>& b) {
-  a.swap(b);
-}
-
-template<typename T> inline
-bool operator==(T* p, const scoped_array<T>& b) {
-  return p == b.get();
-}
-
-template<typename T> inline
-bool operator!=(T* p, const scoped_array<T>& b) {
-  return p != b.get();
-}
-
-
-// This class wraps the c library function free() in a class that can be
-// passed as a template argument to scoped_ptr_malloc below.
-class ScopedPtrMallocFree {
- public:
-  inline void operator()(void* x) const {
-    free(x);
-  }
-};
-
-// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
-// second template argument, the functor used to free the object.
-
-template<typename T, typename FreeProc = ScopedPtrMallocFree>
-class scoped_ptr_malloc {
- private:
-
-  T* ptr;
-
-  scoped_ptr_malloc(scoped_ptr_malloc const &);
-  scoped_ptr_malloc & operator=(scoped_ptr_malloc const &);
-
- public:
-
-  typedef T element_type;
-
-  explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}
-
-  ~scoped_ptr_malloc() {
-    typedef char type_must_be_complete[sizeof(T)];
-    free_((void*) ptr);
-  }
-
-  void reset(T* p = 0) {
-    typedef char type_must_be_complete[sizeof(T)];
-
-    if (ptr != p) {
-      free_((void*) ptr);
-      ptr = p;
-    }
-  }
-
-  T& operator*() const {
-    assert(ptr != 0);
-    return *ptr;
-  }
-
-  T* operator->() const {
-    assert(ptr != 0);
-    return ptr;
-  }
-
-  bool operator==(T* p) const {
-    return ptr == p;
-  }
-
-  bool operator!=(T* p) const {
-    return ptr != p;
-  }
-
-  T* get() const {
-    return ptr;
-  }
-
-  void swap(scoped_ptr_malloc & b) {
-    T* tmp = b.ptr;
-    b.ptr = ptr;
-    ptr = tmp;
-  }
-
-  T* release() {
-    T* tmp = ptr;
-    ptr = 0;
-    return tmp;
-  }
-
- private:
-
-  // no reason to use these: each scoped_ptr_malloc should have its own object
-  template <typename U, typename GP>
-  bool operator==(scoped_ptr_malloc<U, GP> const& p) const;
-  template <typename U, typename GP>
-  bool operator!=(scoped_ptr_malloc<U, GP> const& p) const;
-
-  static FreeProc const free_;
-};
-
-template<typename T, typename FP>
-FP const scoped_ptr_malloc<T,FP>::free_ = FP();
-
-template<typename T, typename FP> inline
-void swap(scoped_ptr_malloc<T,FP>& a, scoped_ptr_malloc<T,FP>& b) {
-  a.swap(b);
-}
-
-template<typename T, typename FP> inline
-bool operator==(T* p, const scoped_ptr_malloc<T,FP>& b) {
-  return p == b.get();
-}
-
-template<typename T, typename FP> inline
-bool operator!=(T* p, const scoped_ptr_malloc<T,FP>& b) {
-  return p != b.get();
-}
-
-#endif  // #ifndef SCOPED_PTR_H
diff --git a/plugins/common/testing/DebugTest.cpp b/plugins/common/testing/DebugTest.cpp
deleted file mode 100644
index add1357..0000000
--- a/plugins/common/testing/DebugTest.cpp
+++ /dev/null
@@ -1,40 +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.
- */
-
-// This file exists to verify that the debugging code leaves nothing
-// behind when disabled or at an appropriate level.
-//
-// Compile with, for example, g++ -O3 -D* -S DebugTest.cpp and inspect the DebugTest.s file.
-//   where * is GWT_DEBUGDISABLE or GWT_DEBUGLEVEL=Spam (etc)
-//
-// testdebug is a shell script to automate this test
-
-// #define GWT_DEBUGDISABLE
-// #define GWT_DEBUGLEVEL Info
-
-#include "../Debug.h"
-
-void foo(int i) {
-  Debug::log(Debug::Error) << "Error GarbalDeGook" << i << Debug::flush;
-  Debug::log(Debug::Warning) << "Warning GarbalDeGook" << i << Debug::flush;
-  Debug::log(Debug::Info) << "Info GarbalDeGook" << i << Debug::flush;
-  Debug::log(Debug::Debugging) << "Debugging GarbalDeGook" << i << Debug::flush;
-  Debug::log(Debug::Spam) << "Spam GarbalDeGook" << i << Debug::flush;
-  if (Debug::level(Debug::Spam)) {
-    extern int ExpensiveCall();
-    Debug::log(Debug::Spam) << "Filtered spam GarbalDeGook" << ExpensiveCall() << Debug::flush;
-  }
-}
diff --git a/plugins/common/testing/testdebug b/plugins/common/testing/testdebug
deleted file mode 100755
index e2e8ea4..0000000
--- a/plugins/common/testing/testdebug
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/sh
-# 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.
-
-# this verifies that debug code is elided if it is not needed
-
-# The C++ compiler is specified in CXX, and its flags in CXXFLAGS
-# Defaults for GCC are used if not supplied.  Note that CXXFLAGS should
-# include optimizations intended to be used.  It is assumed that the
-# compiler uses -S to produce assembly output and -o - works to get that
-# output on stdout, and -Dsym=val is used to define preprocessor symbols.
-#
-# Note that debugging symbols should not be included as generally the
-# debugging info contains references to elided calls etc.
-if [ "x$CXX" == "x" ]
-then
-  CXX=g++
-fi
-
-if [ "x$CXXFLAGS" == "x" ]
-then
-  CXXFLAGS=-O3
-else
-  # remove -g if supplied
-  CXXFLAGS=`echo $CXXFLAGS | sed 's/-g\S*//'`
-fi
-
-CMD="$CXX $CXXFLAGS -S -o -"
-
-err=0
-$CMD -DGWT_DEBUGDISABLE DebugTest.cpp | egrep '(GarbalDeGook|ExpensiveCall)' >/dev/null
-if [ $? -eq 0 ]
-then
-  echo "Debug disabled leaves debug code around"
-  err=1
-fi
-$CMD -DGWT_DEBUGLEVEL=Error DebugTest.cpp | egrep '(Warning|ExpensiveCall)' >/dev/null
-if [ $? -eq 0 ]
-then
-  echo "Debug level Error leaves lower-level debug code around"
-  err=1
-fi
-$CMD -DGWT_DEBUGLEVEL=Spam DebugTest.cpp | grep 'ExpensiveCall' >/dev/null
-if [ $? -eq 1 ]
-then
-  echo "Debug level Spam does not include code that should be included"
-  err=1
-fi
-
-exit $err
diff --git a/plugins/config.mk b/plugins/config.mk
deleted file mode 100644
index db7ffff..0000000
--- a/plugins/config.mk
+++ /dev/null
@@ -1,113 +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.
-
-# This Makefile fragment sets the following make variables according to the
-# current platform:
-#   ARCH - the Mozilla architecture name, such as x86, x86_64, ppc, etc
-#   FLAG32BIT - 32 or 64
-#   MARCH - the Mac architecture, such as i386 or ppc
-#   OS - linux, mac, or sun
-#   CFLAGS - appropriate C compiler flags for this platform
-#   CXXFLAGS - appropriate C++ compiler flags for this platform
-# Also, various stanard make variables are overridden if necessary, such as AR
-#
-# If ARCH is already set, that is used instead of uname -m to get the
-# architecture to build.  This can be used to build a 32-bit plugin on a 64-bit
-# platform, for example: make ARCH=x86
-
-ARCH ?= $(shell uname -m)
-
-# default is 32 bits
-FLAG32BIT=32
-
-# Figure out 64-bit platforms, canonicalize ARCH and MARCH
-ifeq ($(ARCH),x86_64)
-FLAG32BIT=64
-endif
-ifeq ($(ARCH),sparc)
-FLAG32BIT=64
-endif
-ifeq ($(ARCH),alpha)
-FLAG32BIT=64
-endif
-ifeq ($(ARCH),ia64)
-FLAG32BIT=64
-endif
-ifeq ($(ARCH),athlon)
-ARCH=x86
-endif
-ifeq ($(ARCH),i386)
-ARCH=x86
-endif
-ifeq ($(ARCH),i486)
-ARCH=x86
-endif
-ifeq ($(ARCH),i586)
-ARCH=x86
-endif
-ifeq ($(ARCH),i686)
-ARCH=x86
-endif
-ifeq ($(ARCH),i86pc)
-ARCH=x86
-endif
-ifeq ($(ARCH),Macintosh)
-ARCH=ppc
-endif
-
-MARCH=$(ARCH)
-ifeq ($(ARCH),x86)
-MARCH=i386
-endif
-
-# Default to Debug off
-DEBUG ?=
-ifeq ($(DEBUG),TRUE)
-DEBUGCFLAGS= -g
-else
-DEBUGCFLAGS=
-endif
-
-# Set OS as well as CFLAGS, CXX, and other common make variables
-ifeq ($(shell uname),Linux)
-OS=linux
-BASECFLAGS= $(DEBUGCFLAGS) -O2 -fPIC $(INC) -rdynamic
-ARCHCFLAGS= -m$(FLAG32BIT)
-ALLARCHCFLAGS= -m$(FLAG32BIT)
-#CXX=clang # for better build error messages
-endif
-ifeq ($(shell uname),Darwin)
-OS=mac
-BASECFLAGS= $(DEBUGCFLAGS) -O2 -fPIC $(INC) -D__mac -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
-ARCHCFLAGS=-arch $(MARCH)
-ALLARCHCFLAGS=-arch i386 -arch ppc -arch x86_64
-AR=libtool
-ARFLAGS=-static -o
-endif
-ifeq ($(shell uname),SunOS)
-OS=sun
-ifeq ($(DEBUG),TRUE)
-DEBUGCFLAGS= -g0
-endif
-#CFLAGS=-fast -g0 -Kpic $(INC) -Bdynamic -noex
-# SunC appears to miscompile Socket::writeByte by not incrementing the
-# buffer pointer, so no optimization for now
-#CFLAGS=-g -Kpic $(INC) -Bdynamic -noex
-BASECFLAGS= $(DEBUGCFLAGS) -Kpic -noex -xO1 -xlibmil -xlibmopt -features=tmplife -xbuiltin=%all -mt $(INC)
-ARCHCFLAGS=
-ALLARCHCFLAGS=
-CXX= CC
-endif
-CFLAGS=$(BASECFLAGS) $(ARCHCFLAGS)
-CXXFLAGS = $(CFLAGS) 
diff --git a/plugins/ie/README.txt b/plugins/ie/README.txt
deleted file mode 100644
index f4f030b..0000000
--- a/plugins/ie/README.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-GWT devmode plugin for IE
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-To build the plugin, you will need a windows system with Visual Studio 2008 or newer (WSDK 7.0+)
-
-To build:
-1) make sure devenv.exe is in the path
-2) make sure the binaries under $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie\prebuilt are writable.
-3) open a cmd.exe window, go to $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie
-4) run build.cmd
-
-To create msi installer:
-1) go to folder $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie\installer
-2) make sure the msi installers under $(projectroot)\third_party\java_src\gwt\svn\trunk\plugins\ie\prebuilt are writable.
-3) run build.cmd
-
-
diff --git a/plugins/ie/build.cmd b/plugins/ie/build.cmd
deleted file mode 100755
index e3841a4..0000000
--- a/plugins/ie/build.cmd
+++ /dev/null
@@ -1,18 +0,0 @@
-@echo off
-setlocal
-echo.
-::check if correct folder
-::check if devenv is in the path
-echo.
-echo building 32 bits
-echo ~~~~~~~~~~~~~~~~
-::pushd oophm\oophm
-devenv /rebuild "Release|Win32" %~dp0\oophm\oophm\oophm.vcproj /out build_win32.log
-echo.
-echo building 64 bits
-echo ~~~~~~~~~~~~~~~~
-devenv /rebuild "Release|x64" %~dp0\oophm\oophm\oophm.vcproj /out build_win64.log
-echo.
-echo Done.
-echo.
-endlocal
diff --git a/plugins/ie/installer/README.txt b/plugins/ie/installer/README.txt
deleted file mode 100644
index b783838..0000000
--- a/plugins/ie/installer/README.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This directory contains the source code for the Windows installer. A new 
-installer should be built using the build script every time oophm.dll is 
-replaced.
-
-The build script will only work on a Windows system
-
-
-Workflow:
-~~~~~~~~~
-if you build new binaries, do the following:
-
-1) check out ..\prebuilt\*.msi for editing
-  
-2) run build <version>, as in: build 1.2.123
-   this will generated all the msis. make sure to look at ..\prebuilt\*.msi 
-   to see if they were updated.
-
-4) Test the installation. Yes, make sure it works on x86, x64, it cleans the 
-   registry and folder upon uninstall, etc.
-   
-	
diff --git a/plugins/ie/installer/build.cmd b/plugins/ie/installer/build.cmd
deleted file mode 100755
index 203dc90..0000000
--- a/plugins/ie/installer/build.cmd
+++ /dev/null
@@ -1,79 +0,0 @@
-@echo off
-setlocal
-if .%1==. goto :usage
-echo.
-echo.
-
-echo Checking if output files are writeable...
-SET WRITEABLE_FILE_ERROR=0
-CALL :CheckWritable "%~dp0..\prebuilt\gwt-dev-plugin-x86.msi"
-CALL :CheckWritable "%~dp0..\prebuilt\gwt-dev-plugin-x64.msi"
-CALL :CheckWritable "%~dp0oophm.wxs"
-IF "%WRITEABLE_FILE_ERROR%"=="1" GOTO :DONE
-
-SET BINARY_DIR=%~dp0..\prebuilt\Win32
-SET BINARY_FILE=oophm.dll
-
-IF NOT EXIST %BINARY_DIR%\%BINARY_FILE% (
-    echo.
-	echo ERROR - Could not find oophm binary under %BINARY_DIR%
-	echo         Verify that the build succeeded before trying to create the installer.
-	echo.
-	goto :eof
-)
-
-echo.
-echo 'heating' binary %BINARY_FILE% under %BINARY_DIR% ...
-echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-%~dp0wix\heat.exe file %BINARY_DIR%\%BINARY_FILE% -v -nologo -gg -g1 -dr INSTALLDIR -generate components -directoryid ff -cg oophmDll -out %~dp0oophm.wxs -var var.binDir
-%~dp0wix\sed.exe --in-place=xml "s/Source=\"\$(var\.binDir)\\Win32\\oophm.dll\"/Source=\"\$(var\.binDir)\\oophm.dll\"/g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"Win32\"/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"$(var.platform)\"/g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/<Component /<Component Win64=\"$(var.win64Flag)\" /g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">\n\t<\?if $(var.platform)=x64 \?>\n\t<\?define win64Flag=\"yes\" \?>\n\t<\?else \?>\n\t<\?define win64Flag=\"no\" \?>\n\t<\?endif \?>/g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/Root=\"HKCR\"/Root=\"HKMU\"/g" %~dp0oophm.wxs
-
-echo.
-echo building 32 bit installer...
-echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-echo.
-%~dp0wix\candle -nologo -arch x86 -dversion=%1 -dplatform=Win32 -dbinDir=%~dp0\..\prebuilt\Win32\ -dbinary=oophm.dll %~dp0\installer.wxs.xml %~dp0\oophm.wxs
-%~dp0wix\light.exe -nologo oophm.wixobj installer.wxs.wixobj -o ..\prebuilt\gwt-dev-plugin-x86.msi -spdb
-
-echo.
-echo building 64 bit installer...
-echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-echo.
-%~dp0wix\candle -nologo -arch x64 -dversion=%1 -dplatform=x64 -dbinDir=%~dp0\..\prebuilt\x64\  -dbinary=oophm.dll %~dp0\installer.wxs.xml %~dp0\oophm.wxs
-%~dp0wix\light.exe -nologo oophm.wixobj installer.wxs.wixobj -o ..\prebuilt\gwt-dev-plugin-x64.msi -spdb
-
-echo.
-echo Done.
-echo.
-goto :eof
-
-:CheckWritable
-ECHO Checking if %1 is writable...
-SET RW=
-DIR /A:-R %1 1>NUL 2>NUL
-if %ERRORLEVEL% LEQ 0 GOTO :EOF
-ECHO.
-ECHO     ERROR: file %1 must be writeable before executing this script.
-ECHO            make sure you checked the file for editing.
-ECHO.
-SET WRITEABLE_FILE_ERROR=1
-ECHO %WRITEABLE_FILE_ERROR%
-GOTO :eof
-
-:usage
-echo.
-echo   usage: build ^<version^> 
-echo      where: ^<version^> has the syntax major.minor.build 
-echo.
-echo        example: build 1.1.3123
-
-:done
-echo.
-echo.
-
-endlocal
-
diff --git a/plugins/ie/installer/generate-wxsfile.cmd b/plugins/ie/installer/generate-wxsfile.cmd
deleted file mode 100755
index d2cf48c..0000000
--- a/plugins/ie/installer/generate-wxsfile.cmd
+++ /dev/null
@@ -1,30 +0,0 @@
-@echo OFF
-REM harvest COM settings from COM binary
-setlocal
-echo.
-if .%1==. goto :usage
-echo IMPORTANT: Make sure "%~dp0oophm.wsx" is checked out and writable!
-echo.
-echo 'heating' binary %~nx1 under %~dp1 ...
-echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-pushd %~dp1
-%~dp0wix\heat.exe file .\%~nx1 -v -nologo -gg -g1 -dr INSTALLDIR -generate components -directoryid ff -cg oophmDll -out %~dp0oophm.wxs -var var.binDir
-popd
-%~dp0wix\sed.exe --in-place=xml "s/Source=\"\$(var\.binDir)\\Win32\\oophm.dll\"/Source=\"\$(var\.binDir)\\oophm.dll\"/g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"Win32\"/Directory Id=\"dir315E0C50682DFB472927FE1254A22F6A\" Name=\"$(var.platform)\"/g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/<Component /<Component Win64=\"$(var.win64Flag)\" /g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">/<Wix xmlns=\"http:\/\/schemas.microsoft.com\/wix\/2006\/wi\">\n\t<\?if $(var.platform)=x64 \?>\n\t<\?define win64Flag=\"yes\" \?>\n\t<\?else \?>\n\t<\?define win64Flag=\"no\" \?>\n\t<\?endif \?>/g" %~dp0oophm.wxs
-%~dp0wix\sed.exe --in-place=xml "s/Root=\"HKCR\"/Root=\"HKMU\"/g" %~dp0oophm.wxs
-
-echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-echo Done.
-echo.
-goto :eof
-:usage
-echo.
-echo   usage: generate-wsxfile.cmd ^<binary-file-path^>
-echo.
-echo        example: generate-wsxfile.cmd ..\prebuilt\Win32\oophm.dll
-echo.
-endlocal
-
diff --git a/plugins/ie/installer/gwt.ico b/plugins/ie/installer/gwt.ico
deleted file mode 100644
index 79eb6b8..0000000
--- a/plugins/ie/installer/gwt.ico
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/installer.wxs.xml b/plugins/ie/installer/installer.wxs.xml
deleted file mode 100644
index c7c0c7b..0000000
--- a/plugins/ie/installer/installer.wxs.xml
+++ /dev/null
@@ -1,204 +0,0 @@
-<?xml version='1.0' encoding='windows-1252'?>
-<Wix
-  xmlns='http://schemas.microsoft.com/wix/2006/wi'>
-
-  <!-- Variables. -->
-  <?define appName = "Google Web Toolkit Developer Plugin for IE" ?>
-  <?define gwtRegKey = "SOFTWARE\Google\Google Web Toolkit\Installer" ?>
-  <?if $(var.platform)=x64 ?>
-      <?define upgradeCode = "53dae7d2-8c28-440f-920b-b2d665ce73b2" ?>
-      <?define win64Flag = "yes" ?>
-      <?define platformFriendlyName="x64" ?>
-  <?else ?>
-      <?define upgradeCode = "9a5e649a-ec63-4c7d-99bf-75adb345e7e5" ?>
-      <?define win64Flag = "no" ?>
-      <?define platformFriendlyName="x86" ?>
-  <?endif ?>
-  <?define updateRegKey = "SOFTWARE\Google\Update\Clients\{$(var.upgradeCode)}" ?>
-
-  <!--
-    The main product to install. We generate a new GUID (*) on each
-    compile to ensure that windows installer completely removes the old
-    version and reinstalls the new version without complaining.
-  -->
-
-  <Product
-    Name='$(var.appName) ($(var.platformFriendlyName))'
-    Id='*'
-    UpgradeCode='$(var.upgradeCode)'
-    Language='1033'
-    Codepage='1252'
-    Version='$(var.version)'
-    Manufacturer='Google'>
-
-    <?if $(var.platform)=x64 ?>
-    <Package
-          Id='*'
-          Keywords='Installer'
-          Description='$(var.appName) ($(var.platformFriendlyName))'
-          Manufacturer='Google'
-          InstallPrivileges='limited'
-          InstallerVersion='200'
-          Languages='1033'
-          Compressed='yes'
-          SummaryCodepage='1252'
-          Platform='x64'
-        />
-    <?else ?>
-    <Package
-          Id='*'
-          Keywords='Installer'
-          Description='$(var.appName) ($(var.platformFriendlyName))'
-          Manufacturer='Google'
-          InstallPrivileges='limited'
-          InstallerVersion='200'
-          Languages='1033'
-          Compressed='yes'
-          SummaryCodepage='1252'
-        />
-    <?endif ?>
-
-    <Media Id='1' Cabinet='product.cab' EmbedCab='yes' />
-
-    <Icon Id="gwt.ico" SourceFile=".\gwt.ico"/>
-
-    <!-- Properties -->
-    <Property Id='REBOOT'>ReallySuppress</Property>
-    <Property Id="ALLUSERS" Secure="yes"></Property>
-    <Property Id="ARPPRODUCTICON" Value="gwt.ico" />
-    <Property Id="ARPCOMMENTS" Value="Google Web Toolkit Developer Plugin for IE ($(var.platformFriendlyName))" />
-    <Property Id="ARPNOMODIFY" Value="1" />
-    <Property Id="ARPNOREPAIR" Value="1" />
-    <Property Id="ARPHELPLINK" Value="http://code.google.com/webtoolkit/" />
-    <Property Id="ARPURLINFOABOUT" Value="http://code.google.com/webtoolkit/" />
-
-    <Upgrade Id='$(var.upgradeCode)'>
-        <UpgradeVersion Property='UPGRADING'
-                  OnlyDetect='no'
-                  Minimum='0.0.0.0' IncludeMinimum='yes'
-                  Maximum='$(var.version)' IncludeMaximum='no' />
-        <UpgradeVersion Property='NEWERVERSIONDETECTED'
-                  OnlyDetect='yes'
-                  Minimum='$(var.version)' IncludeMinimum='yes' />
-    </Upgrade>
-
-    <InstallExecuteSequence>
-      <LaunchConditions After='AppSearch' />
-      <RemoveExistingProducts After='InstallValidate' />
-      <Custom Action="NewerVersionError" After="FindRelatedProducts">NEWERVERSIONDETECTED</Custom>
-    </InstallExecuteSequence>
-
-    <UI>
-        <Error Id="4000">A newer version of this product is already installed.</Error>
-    </UI>
-
-    <CustomAction Id="NewerVersionError" Error="4000"/>
-    
-    <!-- Define the install directory. -->
-    <?if $(var.platform)=x64 ?>
-    <Directory Id='TARGETDIR'    Name='SourceDir'>
-      <Directory Id='AppDataFolder' Name='AppData'>
-        <Directory Id='GoogleDir' Name='Google'>
-          <Component Id="RemoveGoogleDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-            <CreateFolder/>
-            <RemoveFolder Id="RemoveGoogleDirFolder" On="uninstall" />
-            <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-              <RegistryValue Name="RemoveGoogleDirFolder" Value="" Type="string" KeyPath="yes"/>
-            </RegistryKey>
-          </Component>
-          <Directory Id='GoogleWebToolkitDir' Name='Google Web Toolkit'>
-            <Component Id="RemoveGoogleWebToolkitDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-              <CreateFolder/>
-              <RemoveFolder Id="RemoveGoogleWebToolkitDirFolder" On="uninstall" />
-              <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-                <RegistryValue Name="RemoveGoogleWebToolkitDirFolder" Value="" Type="string" KeyPath="yes"/>
-              </RegistryKey>
-            </Component>
-            <Directory Id='DeveloperPluginDir' Name='Developer Plugin'>
-              <Component Id="RemoveDeveloperPluginDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-                <CreateFolder/>
-                <RemoveFolder Id="RemoveDeveloperPluginDirFolder" On="uninstall" />
-                <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-                  <RegistryValue Name="RemoveDeveloperPluginDirFolder" Value="" Type="string" KeyPath="yes"/>
-                </RegistryKey>
-              </Component>
-              <Directory Id='INSTALLDIR' Name='IE'>
-                <Component Id="RemoveInstallDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-                  <CreateFolder/>
-                  <RemoveFolder Id="RemoveInstallerDirFolder" On="uninstall" />
-                  <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-                    <RegistryValue Name="RemoveInstallerDirFolder" Value="" Type="string" KeyPath="yes"/>
-                  </RegistryKey>
-                </Component>
-              </Directory>
-            </Directory>
-          </Directory>
-        </Directory>
-      </Directory>
-    </Directory>
-    <?else?>
-    <Directory Id='TARGETDIR'    Name='SourceDir'>
-      <Directory Id='AppDataFolder' Name='AppData'>
-        <Directory Id='GoogleDir' Name='Google'>
-          <Component Id="RemoveGoogleDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-            <CreateFolder/>
-            <RemoveFolder Id="RemoveGoogleDirFolder" On="uninstall" />
-            <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-              <RegistryValue Name="RemoveGoogleDirFolder" Value="" Type="string" KeyPath="yes"/>
-            </RegistryKey>
-          </Component>
-          <Directory Id='GoogleWebToolkitDir' Name='Google Web Toolkit'>
-            <Component Id="RemoveGoogleWebToolkitDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-              <CreateFolder/>
-              <RemoveFolder Id="RemoveGoogleWebToolkitDirFolder" On="uninstall" />
-              <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-                <RegistryValue Name="RemoveGoogleWebToolkitDirFolder" Value="" Type="string" KeyPath="yes"/>
-              </RegistryKey>
-            </Component>
-            <Directory Id='DeveloperPluginDir' Name='Developer Plugin'>
-              <Component Id="RemoveDeveloperPluginDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-                <CreateFolder/>
-                <RemoveFolder Id="RemoveDeveloperPluginDirFolder" On="uninstall" />
-                <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-                  <RegistryValue Name="RemoveDeveloperPluginDirFolder" Value="" Type="string" KeyPath="yes"/>
-                </RegistryKey>
-              </Component>
-              <Directory Id='INSTALLDIR' Name='IE'>
-                <Component Id="RemoveInstallDir" Guid="*" DiskId="1" Win64="$(var.win64Flag)">
-                  <CreateFolder/>
-                  <RemoveFolder Id="RemoveInstallerDirFolder" On="uninstall" />
-                  <RegistryKey Root="HKMU" Key="$(var.gwtRegKey)" Action="createAndRemoveOnUninstall">
-                    <RegistryValue Name="RemoveInstallerDirFolder" Value="" Type="string" KeyPath="yes"/>
-                  </RegistryKey>
-                </Component>
-              </Directory>
-            </Directory>
-          </Directory>
-        </Directory>
-      </Directory>
-    </Directory>
-    <?endif?>
-
-    <Component Id='registryValues' Directory='INSTALLDIR' Guid='*' >
-      <RegistryKey Root='HKCU' Action='createAndRemoveOnUninstall' Key='$(var.updateRegKey)'>
-        <RegistryValue Name='pv' Value='$(var.version)' Type='string' />
-        <RegistryValue Name='name' Value='$(var.appName) ($(var.platformFriendlyName))' Type='string' />
-        <RegistryValue Name='lang' Value='en' Type='string' />
-      </RegistryKey>
-    </Component>
-
-    <!-- Define the features to install. -->
-    <Feature Id='CompleteFeature' Display='expand' Level='1' Absent='disallow'>
-      <!--
-        Loaded from oophm.wxs.xml, which is generated by the build
-        script.
-        -->
-      <ComponentRef Id='RemoveGoogleDir' />
-      <ComponentRef Id='RemoveGoogleWebToolkitDir' />
-      <ComponentRef Id='RemoveDeveloperPluginDir' />
-      <ComponentRef Id='RemoveInstallDir' />
-      <ComponentGroupRef Id='oophmDll' />
-      <ComponentRef Id='registryValues' />
-    </Feature>
-  </Product>
-</Wix>
diff --git a/plugins/ie/installer/oophm.wxs b/plugins/ie/installer/oophm.wxs
deleted file mode 100644
index 4059a54..0000000
--- a/plugins/ie/installer/oophm.wxs
+++ /dev/null
@@ -1,51 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-	<?if $(var.platform)=x64 ?>
-	<?define win64Flag="yes" ?>
-	<?else ?>
-	<?define win64Flag="no" ?>
-	<?endif ?>
-    <Fragment>
-        <DirectoryRef Id="INSTALLDIR">
-            <Directory Id="dir315E0C50682DFB472927FE1254A22F6A" Name="$(var.platform)" />
-        </DirectoryRef>
-    </Fragment>
-    <Fragment>
-        <ComponentGroup Id="oophmDll">
-            <Component Win64="$(var.win64Flag)" Id="cmpC5076456A3EE2DC3FC2683246BE38AD6" Directory="dir315E0C50682DFB472927FE1254A22F6A" Guid="66F951FF-F3CE-4C41-92EC-886F3A985ADF">
-                <File Id="filEF78EFE99C26E3436EC9C8852A85BE88" KeyPath="yes" Source="$(var.binDir)\oophm.dll">
-                    <TypeLib Id="{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}" Description="oophm 1.0 Type Library" HelpDirectory="dir315E0C50682DFB472927FE1254A22F6A" Language="0" MajorVersion="1" MinorVersion="0">
-                        <AppId Description="oophm" Id="{F9365E53-5A14-47F3-BF1D-10CAAB815309}">
-                            <Class Id="{1D6156B6-002B-49E7-B5CA-C138FB843B4E}" Context="InprocServer32" Description="plugin Class" ThreadingModel="apartment" Version="1.0" Programmable="yes" Control="yes">
-                                <ProgId Id="oophm.plugin.1" Description="plugin Class">
-                                    <ProgId Id="oophm.plugin" Description="plugin Class" />
-                                </ProgId>
-                            </Class>
-                        </AppId>
-                        <Class Id="{1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB}" Context="InprocServer32" Description="ExceptionCatcher Class" ThreadingModel="apartment" Programmable="yes">
-                            <ProgId Id="oophm.ExceptionCatcher.1" Description="ExceptionCatcher Class">
-                                <ProgId Id="oophm.ExceptionCatcher" Description="ExceptionCatcher Class" />
-                            </ProgId>
-                        </Class>
-                        <Class Id="{644FD769-8B9D-4AC4-A79E-AAAF5CD751C1}" Context="InprocServer32" Description="JavaObject Class" ThreadingModel="apartment" Programmable="yes">
-                            <ProgId Id="oophm.JavaObject.1" Description="JavaObject Class">
-                                <ProgId Id="oophm.JavaObject" Description="JavaObject Class" />
-                            </ProgId>
-                        </Class>
-                        <Interface Id="{1C3FBB2D-58C2-426C-A461-E6002F9EE294}" Name="IExceptionCatcher" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
-                        <Interface Id="{58276E45-1F24-4B71-88AC-2A7D0C26CDFF}" Name="IJavaObject" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
-                        <Interface Id="{73607C2E-369B-4055-8020-D7643A59F521}" Name="Iplugin" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
-                        <Interface Id="{AB9B16A0-03E9-481E-ADF5-B00B860A8C3A}" Name="IpluginUI" ProxyStubClassId32="{00020424-0000-0000-C000-000000000046}" />
-                    </TypeLib>
-                </File>
-                <RegistryValue Root="HKMU" Key="AppID\oophm.DLL" Name="AppID" Value="{F9365E53-5A14-47F3-BF1D-10CAAB815309}" Type="string" Action="write" />
-                <RegistryValue Root="HKMU" Key="CLSID\{1D6156B6-002B-49E7-B5CA-C138FB843B4E}\MiscStatus\1" Value="131473" Type="string" Action="write" />
-                <RegistryValue Root="HKMU" Key="CLSID\{1D6156B6-002B-49E7-B5CA-C138FB843B4E}\MiscStatus" Value="0" Type="string" Action="write" />
-                <RegistryValue Root="HKMU" Key="CLSID\{1D6156B6-002B-49E7-B5CA-C138FB843B4E}\ToolboxBitmap32" Value="[#filEF78EFE99C26E3436EC9C8852A85BE88], 102" Type="string" Action="write" />
-            </Component>
-        </ComponentGroup>
-    </Fragment>
-    <Fragment>
-        <DirectoryRef Id="dir315E0C50682DFB472927FE1254A22F6A" />
-    </Fragment>
-</Wix>
\ No newline at end of file
diff --git a/plugins/ie/installer/wix/README.txt b/plugins/ie/installer/wix/README.txt
deleted file mode 100644
index 846b7eb..0000000
--- a/plugins/ie/installer/wix/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-
-This folder contains WIX binaries used to build the installer. These files
-were copied as-is from the public website http://wix.codeplex.com/ and are 
-here for convenience and to make sure we have the right toolset version.
-
-for more information, license terms, please refer to:
-    http://wix.sourceforge.net/
-    http://wix.codeplex.com/
-    http://wix.codeplex.com/license
-    
diff --git a/plugins/ie/installer/wix/WixIIsExtension.dll b/plugins/ie/installer/wix/WixIIsExtension.dll
deleted file mode 100755
index 9c3e2a8..0000000
--- a/plugins/ie/installer/wix/WixIIsExtension.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/WixUtilExtension.dll b/plugins/ie/installer/wix/WixUtilExtension.dll
deleted file mode 100755
index 36eac99..0000000
--- a/plugins/ie/installer/wix/WixUtilExtension.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/WixVSExtension.dll b/plugins/ie/installer/wix/WixVSExtension.dll
deleted file mode 100755
index 2fa2a1b..0000000
--- a/plugins/ie/installer/wix/WixVSExtension.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/candle.exe b/plugins/ie/installer/wix/candle.exe
deleted file mode 100755
index a5be152..0000000
--- a/plugins/ie/installer/wix/candle.exe
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/candle.exe.config b/plugins/ie/installer/wix/candle.exe.config
deleted file mode 100644
index bed32a7..0000000
--- a/plugins/ie/installer/wix/candle.exe.config
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (c) Microsoft Corporation.  All rights reserved.
--->
-<configuration>
-    <startup useLegacyV2RuntimeActivationPolicy="true">
-        <supportedRuntime version="v4.0" />
-        <supportedRuntime version="v2.0.50727" />
-    </startup>
-</configuration>
diff --git a/plugins/ie/installer/wix/darice.cub b/plugins/ie/installer/wix/darice.cub
deleted file mode 100644
index dab4567..0000000
--- a/plugins/ie/installer/wix/darice.cub
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/heat.exe b/plugins/ie/installer/wix/heat.exe
deleted file mode 100755
index e5c9336..0000000
--- a/plugins/ie/installer/wix/heat.exe
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/heat.exe.config b/plugins/ie/installer/wix/heat.exe.config
deleted file mode 100644
index 5d5aa30..0000000
--- a/plugins/ie/installer/wix/heat.exe.config
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (c) Microsoft Corporation.  All rights reserved.
--->
-<configuration>
-    <appSettings>
-        <add key="extensions" value="WixIIsExtension;WixUtilExtension;WixVSExtension"/>
-    </appSettings>
-    <startup useLegacyV2RuntimeActivationPolicy="true">
-        <supportedRuntime version="v4.0" />
-        <supportedRuntime version="v2.0.50727" />
-    </startup>
-</configuration>
diff --git a/plugins/ie/installer/wix/libiconv2.dll b/plugins/ie/installer/wix/libiconv2.dll
deleted file mode 100755
index 544dd92..0000000
--- a/plugins/ie/installer/wix/libiconv2.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/libintl3.dll b/plugins/ie/installer/wix/libintl3.dll
deleted file mode 100755
index ec11e6b..0000000
--- a/plugins/ie/installer/wix/libintl3.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/light.exe b/plugins/ie/installer/wix/light.exe
deleted file mode 100755
index d36e01e..0000000
--- a/plugins/ie/installer/wix/light.exe
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/light.exe.config b/plugins/ie/installer/wix/light.exe.config
deleted file mode 100644
index bed32a7..0000000
--- a/plugins/ie/installer/wix/light.exe.config
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (c) Microsoft Corporation.  All rights reserved.
--->
-<configuration>
-    <startup useLegacyV2RuntimeActivationPolicy="true">
-        <supportedRuntime version="v4.0" />
-        <supportedRuntime version="v2.0.50727" />
-    </startup>
-</configuration>
diff --git a/plugins/ie/installer/wix/mspatchc.dll b/plugins/ie/installer/wix/mspatchc.dll
deleted file mode 100755
index 4720f1a..0000000
--- a/plugins/ie/installer/wix/mspatchc.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/regex2.dll b/plugins/ie/installer/wix/regex2.dll
deleted file mode 100755
index f84a847..0000000
--- a/plugins/ie/installer/wix/regex2.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/sed.exe b/plugins/ie/installer/wix/sed.exe
deleted file mode 100755
index 42c2677..0000000
--- a/plugins/ie/installer/wix/sed.exe
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/wconsole.dll b/plugins/ie/installer/wix/wconsole.dll
deleted file mode 100755
index 916b492..0000000
--- a/plugins/ie/installer/wix/wconsole.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/winterop.dll b/plugins/ie/installer/wix/winterop.dll
deleted file mode 100755
index 0385acd..0000000
--- a/plugins/ie/installer/wix/winterop.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/installer/wix/wix.dll b/plugins/ie/installer/wix/wix.dll
deleted file mode 100755
index 5057e35..0000000
--- a/plugins/ie/installer/wix/wix.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/oophm/oophm.sln b/plugins/ie/oophm/oophm.sln
deleted file mode 100644
index 7555624..0000000
--- a/plugins/ie/oophm/oophm.sln
+++ /dev/null
@@ -1,26 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "oophm", "oophm\oophm.vcxproj", "{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Debug|x64 = Debug|x64
-		Release|Win32 = Release|Win32
-		Release|x64 = Release|x64
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|Win32.ActiveCfg = Debug|Win32
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|Win32.Build.0 = Debug|Win32
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|x64.ActiveCfg = Debug|x64
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Debug|x64.Build.0 = Debug|x64
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|Win32.ActiveCfg = Release|Win32
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|Win32.Build.0 = Release|Win32
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|x64.ActiveCfg = Release|x64
-		{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}.Release|x64.Build.0 = Release|x64
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/plugins/ie/oophm/oophm/Constants.h b/plugins/ie/oophm/oophm/Constants.h
deleted file mode 100644
index 17c0b9d..0000000
--- a/plugins/ie/oophm/oophm/Constants.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#pragma once
-
-#include "stdafx.h"
-
-class Constants
-{
-public:
-    const static LPOLESTR __gwt_disconnected;
-    const static LPOLESTR valueOf;
-    const static LPOLESTR Error;
-    const static _bstr_t JavaScript;
-    const static LPOLESTR __gwt_makeResult;
-    const static LPOLESTR __gwt_makeTearOff;
-};
-
-__declspec(selectany) const LPOLESTR Constants::__gwt_disconnected = L"__gwt_disconnected";
-__declspec(selectany) const LPOLESTR Constants::valueOf = L"valueOf";
-__declspec(selectany) const LPOLESTR Constants::Error = L"Error";
-__declspec(selectany) const _bstr_t Constants::JavaScript = _bstr_t(L"JavaScript");
-__declspec(selectany) const LPOLESTR Constants::__gwt_makeResult = L"__gwt_makeResult";
-__declspec(selectany) const LPOLESTR Constants::__gwt_makeTearOff = L"__gwt_makeTearOff";
-
diff --git a/plugins/ie/oophm/oophm/ExceptionCatcher.cpp b/plugins/ie/oophm/oophm/ExceptionCatcher.cpp
deleted file mode 100644
index 44d9ff9..0000000
--- a/plugins/ie/oophm/oophm/ExceptionCatcher.cpp
+++ /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.
- */
-
-// ExceptionCatcher.cpp : Implementation of CExceptionCatcher
-
-#include "stdafx.h"
-#include "Debug.h"
-#include "ExceptionCatcher.h"
-
-// CExceptionCatcher
-
-
-STDMETHODIMP CExceptionCatcher::getException(VARIANT* retVal)
-{
-  *retVal = caughtException.GetVARIANT();
-  return S_OK;
-}
-
-STDMETHODIMP CExceptionCatcher::hasSeenException(BOOL* retVal) {
-  *retVal = hasCaughtException;
-  return S_OK;
-}
-
-STDMETHODIMP CExceptionCatcher::CanHandleException(EXCEPINFO* exInfo, VARIANT* value) {
-  Debug::log(Debug::Debugging) << "Caught an exception from JS function" << Debug::flush;
-  if (hasCaughtException) {
-    Debug::log(Debug::Spam) << "Double-catching exception" << Debug::flush;
-    // We see this if a COM object that called a JavaObject doesn't recognize the
-    // throwing-exception return code; just keep the first exception that we've
-    // seen.
-    return S_OK;
-  }
-  caughtException = value;
-  hasCaughtException = true;
-  return S_OK;
-}
-
-STDMETHODIMP CExceptionCatcher::QueryService(const GUID& guidService, const IID& riid, void** ret) {
-  Debug::log(Debug::Spam) << "QueryService not supported by ExceptionCatcher" << Debug::flush;
-  return E_NOTIMPL;
-}
diff --git a/plugins/ie/oophm/oophm/ExceptionCatcher.h b/plugins/ie/oophm/oophm/ExceptionCatcher.h
deleted file mode 100644
index c1a091c..0000000
--- a/plugins/ie/oophm/oophm/ExceptionCatcher.h
+++ /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.
- */
-
-// ExceptionCatcher.h : Declaration of the CExceptionCatcher
-
-#pragma once
-#include "resource.h"       // main symbols
-#include "comutil.h"
-#include "dispex.h"
-#include "oophm_i.h"
-
-
-#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
-#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
-#endif
-
-
-
-// CExceptionCatcher
-
-class ATL_NO_VTABLE CExceptionCatcher :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<CExceptionCatcher, &CLSID_ExceptionCatcher>,
-  public ICanHandleException,
-  public IServiceProvider,
-	public IDispatchImpl<IExceptionCatcher, &IID_IExceptionCatcher, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
-{
-public:
-	CExceptionCatcher()
-	{
-	}
-
-DECLARE_REGISTRY_RESOURCEID(IDR_EXCEPTIONCATCHER)
-
-
-BEGIN_COM_MAP(CExceptionCatcher)
-  COM_INTERFACE_ENTRY(ICanHandleException)
-  COM_INTERFACE_ENTRY(IServiceProvider)
-	COM_INTERFACE_ENTRY(IExceptionCatcher)
-	COM_INTERFACE_ENTRY(IDispatch)
-END_COM_MAP()
-
-
-
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct()
-	{
-    hasCaughtException = false;
-		return S_OK;
-	}
-
-	void FinalRelease()
-	{
-	}
-
-public:
-  STDMETHOD(getException)(VARIANT* retVal);
-  STDMETHOD(hasSeenException)(BOOL* ret);
-  STDMETHOD(CanHandleException)(EXCEPINFO* exInfo, VARIANT* value);
-  STDMETHOD(QueryService)(const GUID& guidService, const IID& riid, void** ret);
-private:
-  _variant_t caughtException;
-  bool hasCaughtException;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(ExceptionCatcher), CExceptionCatcher)
diff --git a/plugins/ie/oophm/oophm/ExceptionCatcher.rgs b/plugins/ie/oophm/oophm/ExceptionCatcher.rgs
deleted file mode 100644
index ba8960b..0000000
--- a/plugins/ie/oophm/oophm/ExceptionCatcher.rgs
+++ /dev/null
@@ -1,26 +0,0 @@
-HKCR
-{
-	oophm.ExceptionCatcher.1 = s 'ExceptionCatcher Class'
-	{
-		CLSID = s '{1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB}'
-	}
-	oophm.ExceptionCatcher = s 'ExceptionCatcher Class'
-	{
-		CLSID = s '{1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB}'
-		CurVer = s 'oophm.ExceptionCatcher.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB} = s 'ExceptionCatcher Class'
-		{
-			ProgID = s 'oophm.ExceptionCatcher.1'
-			VersionIndependentProgID = s 'oophm.ExceptionCatcher'
-			ForceRemove 'Programmable'
-			InprocServer32 = s '%MODULE%'
-			{
-				val ThreadingModel = s 'Apartment'
-			}
-			'TypeLib' = s '{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}'
-		}
-	}
-}
diff --git a/plugins/ie/oophm/oophm/IESessionHandler.cpp b/plugins/ie/oophm/oophm/IESessionHandler.cpp
deleted file mode 100644
index 6e2a653..0000000
--- a/plugins/ie/oophm/oophm/IESessionHandler.cpp
+++ /dev/null
@@ -1,469 +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.
- */
-
-#include "stdafx.h"
-#include "comutil.h"
-#include "dispex.h"
-#include "ExceptionCatcher.h"
-#include "IESessionHandler.h"
-#include "ServerMethods.h"
-#include "scoped_ptr/scoped_ptr.h"
-#include "IEUtils.h"
-#include "Constants.h"
-
-
-IESessionHandler::IESessionHandler(HostChannel* channel,
-                                   IHTMLWindow2* window) : SessionData(channel, window, this), jsObjectId(1)
-{
-  // window->put_defaultStatus(L"GWT Developer Plugin active");
-  IEUtils::resetResolver();
-}
-
-IESessionHandler::~IESessionHandler(void) {
-  Debug::log(Debug::Debugging) << "Destroying session handler" << Debug::flush;
-  Debug::log(Debug::Spam) << jsObjectsById.size() << " active JS object referances" << Debug::flush;
-  // Put any remaining JavaObject references into zombie-mode in case
-  // of lingering references
-  Debug::log(Debug::Spam) << javaObjectsById.size() << " active Java object references" << Debug::flush;
-
-  IEUtils::resetResolver();
-  std::map<int, IUnknown*>::iterator it = javaObjectsById.begin();
-  while (it != javaObjectsById.end()) {
-    ((CJavaObject*)it->second)->shutdown();
-    it++;
-  }
-  channel->disconnectFromHost();
-}
-
-void IESessionHandler::disconnectDetectedImpl() {
-  DISPID dispId;
-
-  HRESULT hr = IEUtils::resolveName(window, Constants::__gwt_disconnected, &dispId);
-  if(FAILED(hr)) {
-    Debug::log(Debug::Error) << "Unable to get dispId for __gwt_disconnected" << Debug::flush;
-    return;
-  }
-
-  DISPPARAMS dispParams = {NULL, NULL, 0, 0};
-  CComPtr<IDispatchEx> dispEx;
-  hr = IEUtils::Invoke(getWindow(), dispId, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);
-  if (FAILED(hr)) {
-    Debug::log(Debug::Error) << "Unable to invoke __gwt_disconnected" << Debug::flush;
-    SYSLOGERROR(L"failed to invoke __gwt_disconnected", L"hr=0x%08x", hr);
-  }
-}
-
-void IESessionHandler::fatalError(HostChannel& channel,
-    const std::string& message) {
-  SYSLOGERROR(L"IESessionHandler::fatalError()", L"%S", message.c_str());
-  Debug::log(Debug::Error) << "Fatal error: " << message << Debug::flush;
-}
-
-void IESessionHandler::freeJavaObject(unsigned int objId) {
-  // Remove the now-defunct object from the lookup table
-  javaObjectsById.erase(objId);
-
-  // and add it to the set of objects to free on the server
-  javaObjectsToFree.insert(objId);
-}
-
-void IESessionHandler::sendFreeValues(HostChannel& channel) {
-  int idCount = javaObjectsToFree.size();
-  if (idCount == 0) {
-    return;
-  }
-
-  Debug::log(Debug::Debugging) << "Freeing " << idCount << " Java objects on server" << Debug::flush;
-  scoped_array<int> ids(new int[idCount]);
-
-  std::set<int>::iterator it = javaObjectsToFree.begin();
-  for (int i = 0; it != javaObjectsToFree.end(); it++) {
-    ids[i++] = *it;
-  }
-
-  if (!ServerMethods::freeJava(channel, this, idCount, ids.get())) {
-    Debug::log(Debug::Error) << "Unable to free Java ids on server" << Debug::flush;
-  }
-
-  javaObjectsToFree.clear();
-}
-
-void IESessionHandler::freeValue(HostChannel& channel, int idCount, const int* ids) {
-  for (int i = 0; i < idCount; i++) {
-    int jsId = ids[i];
-    std::map<int, CComPtr<IUnknown>>::iterator it = jsObjectsById.find(jsId);
-    if (it == jsObjectsById.end()) {
-      Debug::log(Debug::Error) << "Trying to free unknown js id " << jsId << Debug::flush;
-      continue;
-    }
-    jsIdsByObject.erase(it->second);
-    jsObjectsById.erase(it);
-  }
-  Debug::log(Debug::Debugging) << "Freed " << idCount << " JS objects" << Debug::flush;
-}
-
-bool IESessionHandler::invoke(HostChannel& channel, const Value& thisObj,
-                               const std::string& methodName, int numArgs,
-                               const Value* const args, Value* returnValue)
-{
-  Debug::log(Debug::Debugging) << "Executing method " << methodName <<
-      " on object " << thisObj.toString() << Debug::flush;
-
-  DISPID methodDispId;
-  HRESULT hr = IEUtils::resolveName(window, methodName, &methodDispId);
-  if (FAILED(hr)) {
-    SYSLOGERROR(L"Failed to resolve name to DISPID",
-        L"IESessionHandler::invoke(thisObj=%S, methodName=%S)",
-        thisObj.toString().c_str(), methodName.c_str());
-    Debug::log(Debug::Error) << "Unable to find method " << methodName
-        << " on the window object" <<Debug::flush;
-    makeExceptionValue(*returnValue, "Unable to find named method on window");
-    return true;
-  }
-
-  // Get the JS Function object as an IDispatch
-  // TODO try PROPERTYGET|EXECUTE instead?
-  _variant_t functionObject;
-  DISPPARAMS disparamsNoArgs = {NULL, NULL, 0, 0};
-  hr = IEUtils::Invoke(window, methodDispId, DISPATCH_PROPERTYGET, &disparamsNoArgs,
-      functionObject.GetAddress(), NULL, NULL);
-  if (FAILED(hr)) {
-    Debug::log(Debug::Error) << "Unable to get method " << methodName
-        << Debug::flush;
-    makeExceptionValue(*returnValue, "Unable to get method from window");
-    return true;
-  } else if (functionObject.vt != VT_DISPATCH) {
-    Debug::log(Debug::Error) << "Did not get a VT_DISPATCH, got " <<
-        functionObject.vt << Debug::flush;
-    makeExceptionValue(*returnValue, "Did not get a VT_DISPATCH");
-    return true;
-  }
-
-  // See if it's an IDispatchEx
-  CComPtr<IDispatchEx> ex;
-  if (functionObject.pdispVal->QueryInterface(&ex)) {
-    // Probably not a function
-    Debug::log(Debug::Error) << "Failed to invoke " << methodName <<
-        " which is not an IDispatchEx" << Debug::flush;
-    makeExceptionValue(*returnValue, "Unable to invoke method");
-    return true;
-  }
-
-  // Convert the function arguments
-  // The parameters in the DISPARAMS are backwards
-  // Named parameters are first
-  int jsArgsLen = numArgs + 1;
-  scoped_array<_variant_t> jsargs(new _variant_t[jsArgsLen]);
-  DISPID thisId[] = {DISPID_THIS};
-  makeValueRef(jsargs[0], thisObj);
-  for (int i = 0; i < numArgs; i++) {
-    makeValueRef(jsargs[jsArgsLen - 1 - i], args[i]);
-  }
-  DISPPARAMS callDispParams = {jsargs.get(), thisId, numArgs + 1, 1};
-  EXCEPINFO excepInfo;
-  _variant_t retVal;
-  CComPtr<IExceptionCatcher> catcher;
-  CExceptionCatcher::CreateInstance(&catcher);
-
-  CComPtr<IServiceProvider> serviceProvider;
-  catcher->QueryInterface(&serviceProvider);
-  hr = ex->InvokeEx(DISPID_VALUE, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
-    &callDispParams, retVal.GetAddress(), &excepInfo, serviceProvider);
-
-  // There are cases where an exception was thrown and we've caught it, but
-  // the return value from InvokeEx is still S_OK.  Thus, we check our
-  // ExceptionCatcher before using the res value to determine failure.
-  BOOL exceptionFlag = false;
-  catcher->hasSeenException(&exceptionFlag);
-  if (exceptionFlag) {
-    VARIANT exceptionVariant;
-    catcher->getException(&exceptionVariant);
-    _variant_t exception(exceptionVariant);
-
-    makeValue(*returnValue, exception);
-    exceptionFlag = true;
-
-  } else if (!SUCCEEDED(hr)) {
-    makeExceptionValue(*returnValue, "Unknown failure");
-    exceptionFlag = true;
-
-  } else {
-    // Success
-    makeValue(*returnValue, retVal);
-  }
-  return exceptionFlag != 0;
-}
-
-bool IESessionHandler::invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
-                                     const Value* const args, Value* returnValue)
-{
-  Debug::log(Debug::Error) << "InvokeSpecial is currently unimplemented" << Debug::flush;
-  makeExceptionValue(*returnValue, "InvokeSpecial is currently unimplemented");
-  return true;
-}
-
-
-void IESessionHandler::loadJsni(HostChannel& channel, const std::string& js) {
-    Debug::log(Debug::Spam) << ">>> loadJsni\n" << js << "\n<<< loadJsni" << Debug::flush;
-
-    _variant_t retVal;
-    HRESULT hr = window->execScript(UTF8ToBSTR(js.length(), js.c_str()),
-        Constants::JavaScript, retVal.GetAddress());
-    if (FAILED(hr)) {
-        Debug::log(Debug::Error) << "Unable to evaluate JSNI code" << Debug::flush;
-    }
-}
-
-void IESessionHandler::makeException(_variant_t& in, const char* message) {
-  Debug::log(Debug::Debugging) << "Creating exception variant " <<
-      std::string(message) << Debug::flush;
-
-  SYSLOGERROR(L"IESessionHandler::makeException()", L"exception: %S", message);
-  DISPID dispId;
-  HRESULT hr = IEUtils::resolveName(window, Constants::Error, &dispId);
-  if (FAILED(hr)) {
-      SYSLOGERROR(L"failed to resolve Error object", L"hr=0x%08x", hr);
-      return;
-  }
-
-  DISPPARAMS emptyParams = {NULL, NULL, 0, 0};
-  _variant_t errorConstructor;
-  hr = IEUtils::Invoke(window, dispId, DISPATCH_PROPERTYGET, &emptyParams,
-      errorConstructor.GetAddress(), NULL, NULL);
-  if (FAILED(hr)) {
-    Debug::log(Debug::Error) << "Unable to get Error constructor" << Debug::flush;
-    in.SetString("Unable to get Error constructor");
-  }
-
-  CComPtr<IDispatchEx> ex;
-  hr = errorConstructor.pdispVal->QueryInterface(&ex);
-  if (FAILED(hr)) {
-    Debug::log(Debug::Error) << "Error constructor not IDispatchEx" << Debug::flush;
-    in.SetString("Error constructor not IDispatchEx");
-  }
-
-  _variant_t param = _variant_t(message);
-  DISPPARAMS dispParams = {&param, NULL, 1, 0};
-
-  hr = ex->InvokeEx(DISPID_VALUE, LOCALE_SYSTEM_DEFAULT, DISPATCH_CONSTRUCT,
-    &dispParams, in.GetAddress(), NULL, NULL);
-
-  if (FAILED(hr)) {
-    Debug::log(Debug::Error) << "Unable to invoke Error constructor" << Debug::flush;
-    in.SetString("Unable to invoke Error constructor");
-  }
-}
-
-void IESessionHandler::makeExceptionValue(Value& in, const char* message) {
-  Debug::log(Debug::Debugging) << "Creating exception value " << std::string(message) << Debug::flush;
-  _variant_t exception;
-  makeException(exception, message);
-  makeValue(in, exception);
-}
-
-void IESessionHandler::makeValue(Value& retVal, const _variant_t& value) {
-  CComPtr<IDispatch> dispObj;
-  CComPtr<IJavaObject> javaObject;
-
-  switch (value.vt) {
-    case VT_EMPTY:
-      retVal.setUndefined();
-      break;
-
-    case VT_NULL:
-      retVal.setNull();
-      break;
-
-    case VT_BOOL:
-      retVal.setBoolean(VARIANT_TRUE == value.boolVal);
-      break;
-
-    case VT_BSTR:
-      retVal.setString(BSTRToUTF8(value.bstrVal));
-      break;
-
-    case VT_I4:
-      retVal.setInt(value.lVal);
-      break;
-
-    case VT_I8:
-      retVal.setLong(value.llVal);
-      break;
-
-    case VT_R4:
-      retVal.setFloat(value.fltVal);
-      break;
-
-    case VT_R8:
-      retVal.setDouble(value.dblVal);
-      break;
-
-    case VT_DISPATCH:
-      dispObj = value.pdispVal;
-
-      if (!dispObj) {
-        // XXX Determine if this is normal operation
-        retVal.setUndefined();
-
-      } else if (!dispObj->QueryInterface(&javaObject)) {
-        // It's one of our Java Object proxies
-        // XXX This casting is a hack
-        retVal.setJavaObject(((CJavaObject*)javaObject.p)->getObjectId());
-
-      } else {
-        _variant_t stringValue;
-        DISPPARAMS emptyParams = {NULL, NULL, 0, 0};
-        DISPID valueOfDispId = -1;
-        // See if it's a wrapped String object by invoking valueOf()
-        HRESULT hr = dispObj->GetIDsOfNames(IID_NULL, (LPOLESTR*)&Constants::valueOf, 1,
-            LOCALE_SYSTEM_DEFAULT, &valueOfDispId);
-        if ((valueOfDispId != -1) &&
-            SUCCEEDED(dispObj->Invoke(valueOfDispId, IID_NULL, LOCALE_SYSTEM_DEFAULT,
-              DISPATCH_METHOD, &emptyParams, stringValue.GetAddress(),
-              NULL, NULL)) &&
-            stringValue.vt == VT_BSTR) {
-          retVal.setString(BSTRToUTF8(stringValue.bstrVal));
-
-        } else {
-          // It's a plain-old JavaScript Object
-
-          // We ask for the IUnknown interface since that's the only
-          // COM interface guaranteed to have object-identity semantics
-          CComPtr<IUnknown> asUnknown;
-          dispObj->QueryInterface(&asUnknown);
-
-          // See if we already know about this object
-          std::map<IUnknown*, int>::iterator it = jsIdsByObject.find(asUnknown);
-          if (it != jsIdsByObject.end()) {
-            retVal.setJsObjectId(it->second);
-
-          } else {
-            // Allocate a new id
-            int objId = ++jsObjectId;
-            jsObjectsById[objId] = asUnknown;
-            jsIdsByObject[asUnknown] = objId;
-            retVal.setJsObjectId(objId);
-          }
-        }
-      }
-      break;
-
-    default:
-      Debug::log(Debug::Error) << "Unhandled variant type " << value.vt << Debug::flush;
-      retVal.setString("Unhandled variant type");
-  }
-}
-
-void IESessionHandler::makeValueRef(_variant_t& retVal, const Value& value) {
-  switch (value.getType()) {
-    case Value::NULL_TYPE:
-      retVal.ChangeType(VT_NULL);
-      break;
-
-    case Value::BOOLEAN:
-      retVal = value.getBoolean();
-      break;
-
-    case Value::BYTE:
-      retVal = value.getByte();
-      break;
-
-    case Value::CHAR:
-      retVal = value.getChar();
-      break;
-
-    case Value::SHORT:
-      retVal = value.getShort();
-      break;
-
-    case Value::INT:
-      retVal = value.getInt();
-      break;
-
-    case Value::LONG:
-      retVal = value.getLong();
-      break;
-
-    case Value::FLOAT:
-      retVal = value.getFloat();
-      break;
-
-    case Value::DOUBLE:
-      retVal = value.getDouble();
-      break;
-
-    case Value::STRING:
-      // The copy-constructor does not correctly handle embedded nulls
-      retVal.bstrVal = UTF8ToBSTR(value.getString().length(),
-        value.getString().c_str()).Detach();
-      retVal.vt = VT_BSTR;
-      break;
-
-    case Value::JAVA_OBJECT:
-      {
-        int javaId = value.getJavaObjectId();
-
-        std::map<int, IUnknown*>::iterator i = javaObjectsById.find(javaId);
-        if (i == javaObjectsById.end()) {
-          CComPtr<IUnknown> target;
-
-          // Create a new instance of the Java object proxy type
-          CJavaObject::CreateInstance(&target);
-
-          // Because we used CreateInstance, we can cast it back to the concrete type
-          // which allows us to pass pointers around, since we're guaranteed that
-          // it is in the same process space
-          ((CJavaObject*)target.p)->initialize(javaId, this);
-          target->QueryInterface(&retVal.pdispVal);
-
-          // Don't artificially increase the lifetime of a Java object proxy by
-          // calling Detach; we want Release to be called.
-          javaObjectsById[javaId] = target;
-
-          // We may have previously released the proxy for the same object id,
-          // but have not yet sent a free message back to the server.
-          javaObjectsToFree.erase(javaId);
-
-        } else {
-          i->second->QueryInterface(&retVal.pdispVal);
-        }
-        retVal.vt = VT_DISPATCH;
-      }
-      break;
-
-    case Value::JS_OBJECT:
-      {
-        int jsId = value.getJsObjectId();
-
-        std::map<int, CComPtr<IUnknown>>::iterator i = jsObjectsById.find(jsId);
-        if (i == jsObjectsById.end()) {
-          Debug::log(Debug::Error) << "Missing jsObject with id " << jsId << Debug::flush;
-
-        } else {
-          i->second->QueryInterface(&retVal.pdispVal);
-          retVal.vt = VT_DISPATCH;
-        }
-      }
-      break;
-
-    case Value::UNDEFINED:
-      retVal.ChangeType(VT_EMPTY);
-      break;
-
-    default:
-      Debug::log(Debug::Error) << "Unknown Value type " << value.toString() << Debug::flush;
-  }
-}
diff --git a/plugins/ie/oophm/oophm/IESessionHandler.h b/plugins/ie/oophm/oophm/IESessionHandler.h
deleted file mode 100644
index 2675810..0000000
--- a/plugins/ie/oophm/oophm/IESessionHandler.h
+++ /dev/null
@@ -1,78 +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.
- */
-
-#pragma once
-#include <map>
-#include <set>
-#include "HostChannel.h"
-#include "JavaObject.h"
-#include "mshtml.h"
-#include "oophm_i.h"
-#include "SessionData.h"
-#include "SessionHandler.h"
-
-class IESessionHandler :
-  public SessionData,
-  public SessionHandler
-{
-public:
-  IESessionHandler(HostChannel* channel, IHTMLWindow2* window);
-  ~IESessionHandler(void);
-  virtual void freeJavaObject(unsigned int objId);
-  virtual void makeValue(Value& value, const _variant_t& in);
-  virtual void makeValueRef(_variant_t& value, const Value& in);
-
-protected:
-  virtual void disconnectDetectedImpl();
-  virtual void fatalError(HostChannel& channel, const std::string& messsage);
-  virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
-  virtual void loadJsni(HostChannel& channel, const std::string& js);
-  virtual bool invoke(HostChannel& channel, const Value& thisObj, const std::string& methodName,
-      int numArgs, const Value* const args, Value* returnValue);
-  virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
-      const Value* const args, Value* returnValue);
-  virtual void sendFreeValues(HostChannel& channel);
-
-
-private:
-  int jsObjectId;
-
-  /*
-  * This must be IUnknown and not IDispatch because the IUnknown
-  * interface is the only COM interface guaranteed to be stable for
-  * any particular instance of an object.  It appears as though
-  * Event objects exhibit the multiple-interface behavior.
-  *
-  * Furthermore, this map is not a CComPtr map because we don't
-  * to artificially add to the retain count of the Java objects.
-  */
-  std::map<int, IUnknown*> javaObjectsById;
-  std::set<int> javaObjectsToFree;
-
-  // Same as above; only one map needs to increment reference count.
-  std::map<int, CComPtr<IUnknown>> jsObjectsById;
-  std::map<IUnknown*, int> jsIdsByObject;
-
-  /*
-   * Create a JavaScript Error object with the given message.
-   */
-  void makeException(_variant_t& value, const char* message);
-
-  /*
-   * Create a exception Value that contains the given message.
-   */
-  void makeExceptionValue(Value& value, const char* message);
-};
diff --git a/plugins/ie/oophm/oophm/IEUtils.h b/plugins/ie/oophm/oophm/IEUtils.h
deleted file mode 100644
index 8c5dd28..0000000
--- a/plugins/ie/oophm/oophm/IEUtils.h
+++ /dev/null
@@ -1,178 +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.
-*/
-
-#pragma once
-#include "stdafx.h"
-#include "comutil.h"
-#include "dispex.h"
-#include "SessionData.h"
-
-#define SYSLOGERROR(MSG,FMT,...) \
-    LPCWSTR msgArr[3] = {NULL, NULL, NULL}; \
-    msgArr[0] = MSG; \
-    WCHAR buffer1[512]; \
-    swprintf(buffer1, sizeof(buffer1)/sizeof(WCHAR), FMT, __VA_ARGS__); \
-    msgArr[1] = buffer1; \
-    WCHAR buffer2[512]; \
-    swprintf(buffer2, sizeof(buffer2)/sizeof(WCHAR), L"function: %S, file: %S, line: %d", __FUNCTION__, __FILE__, __LINE__); \
-    msgArr[2] = buffer2; \
-    IEUtils::WriteToLog((LPCWSTR*)msgArr, 3);
-
-
-typedef HRESULT (*PFNRESOLVENAME)(IDispatch*, LPOLESTR, DISPID*);
-
-//
-// This class is a collection of helper methods specific to IE
-// It finds the appropriate implementation that resolves javascript
-// names regardless of the specific documentMode that browser is 
-// running. 
-//
-class IEUtils
-{
-    static HANDLE hEventLog;
-    static LPWSTR logSourceName;
-    static PFNRESOLVENAME pfnResolveName;
-
-    //
-    // finds which IDispatch interface is capable of
-    // of 'resolving' names.
-    //
-    static PFNRESOLVENAME getResolveNameFunction(IDispatch* obj)
-    {
-        _variant_t retVal;
-        std::string probeScript("function _FN3E9738B048214100A6D6B750F2230A34() { return null; }");
-        CComQIPtr<IHTMLWindow2> spWindow2(obj);
-        if (!spWindow2) {
-            return &IEUtils::internalResolveNameEx;
-        }
-        LPOLESTR functionName = L"_FN3E9738B048214100A6D6B750F2230A34";
-        HRESULT hr = spWindow2->execScript(UTF8ToBSTR(probeScript.length(), probeScript.c_str()),
-            UTF8ToBSTR(10, "JavaScript"), retVal.GetAddress());
-        if (SUCCEEDED(hr)) {
-            DISPID dispId;
-            hr = internalResolveName(spWindow2, functionName, &dispId);
-            if (SUCCEEDED(hr)) {
-                return &IEUtils::internalResolveName;
-            } else {
-                hr = internalResolveNameEx(spWindow2, functionName, &dispId);
-                if (SUCCEEDED(hr)) {
-                    return &IEUtils::internalResolveNameEx;
-                } else {
-                    SYSLOGERROR(L"Failed to find a IDispatch Implementation able to resolve names",
-                        L"hr=0x%08x", hr);
-                }
-            }
-        }
-        return &IEUtils::internalResolveNameEx;
-    }
-
-    //
-    // resolves 'name' using default IDispatch interface
-    //
-    static HRESULT internalResolveName(IDispatch* obj, LPOLESTR name, DISPID *dispID)
-    {
-        assert(obj != NULL);
-        return obj->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, dispID);
-    }
-
-    //
-    // resolves 'name' using IDispatchEx interface
-    //
-    static HRESULT internalResolveNameEx(IDispatch* obj, LPOLESTR name, DISPID *dispID)
-    {
-        assert(obj != NULL);
-        CComQIPtr<IDispatchEx> spDispEx(obj);
-        if (!spDispEx) {
-            return E_FAIL;
-        }
-        return spDispEx->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, dispID);
-    }
-
-public:
-
-    static void InitEventLog() {
-        if (NULL == hEventLog) {
-            hEventLog = OpenEventLog(NULL, IEUtils::logSourceName);
-        }
-    }
-
-    static void WriteToLog(LPCWSTR* rgMsg, INT size) {
-        if (NULL != hEventLog) {
-            ReportEvent(hEventLog, EVENTLOG_ERROR_TYPE, 0, 0, NULL, size, 0, rgMsg, NULL);
-        }
-    }
-
-    static void CloseEventLog()
-    {
-        if (NULL != hEventLog) {
-            ::CloseEventLog(hEventLog);
-        }
-    }
-
-    static WCHAR* GetSysErrorMessage(DWORD dwErrorCode)
-    {
-        WCHAR * pMsgBuf = NULL;
-        DWORD dwSize = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
-            FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
-            NULL, dwErrorCode, 0, (LPTSTR) &pMsgBuf, 0, NULL);
-        if (dwSize) {
-            return pMsgBuf;
-        }
-        return NULL;
-    }
-
-    static HRESULT resolveName(IDispatch* obj, LPOLESTR name, DISPID *dispID)
-    {
-        if (NULL == pfnResolveName) {
-            pfnResolveName = getResolveNameFunction(obj);
-        }
-        assert(NULL != pfnResolveName);
-        return pfnResolveName(obj, name, dispID);
-    }
-
-    static HRESULT resolveName(IDispatch* obj, std::string name, DISPID *dispID)
-    {
-        return resolveName(obj, UTF8ToBSTR(name.length(), name.c_str()), dispID);
-    }
-
-    static void resetResolver()
-    {
-        pfnResolveName = NULL;
-    }
-
-    static HRESULT Invoke(IUnknown* obj,
-        DISPID id,
-        WORD wFlags,
-        DISPPARAMS *pdp,
-        VARIANT *pvarRes,
-        EXCEPINFO *pei,
-        UINT *puArgErr)
-    {
-        HRESULT hr = S_OK;
-        CComQIPtr<IDispatchEx> spDispEx(obj);
-        if (!spDispEx) {
-            return E_FAIL;
-        }
-        hr = spDispEx->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pdp, pvarRes, pei, puArgErr);
-        return hr;
-    }
-};
-
-__declspec(selectany) HANDLE IEUtils::hEventLog;
-__declspec(selectany) LPWSTR IEUtils::logSourceName = L"GWT Developer Mode Plugin";
-__declspec(selectany) HRESULT (*IEUtils::pfnResolveName)(IDispatch* object, LPOLESTR name, DISPID *dispID);
-
-
diff --git a/plugins/ie/oophm/oophm/JavaObject.cpp b/plugins/ie/oophm/oophm/JavaObject.cpp
deleted file mode 100644
index fdf87ce..0000000
--- a/plugins/ie/oophm/oophm/JavaObject.cpp
+++ /dev/null
@@ -1,266 +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.
- */
-
-// JavaObject.cpp : Implementation of CJavaObject
-
-#include "stdafx.h"
-#include "InvokeMessage.h"
-#include "JavaObject.h"
-#include "ReturnMessage.h"
-#include "ServerMethods.h"
-#include "scoped_ptr/scoped_ptr.h"
-#include "IEUtils.h"
-#include "Constants.h"
-//#include "activscp.h"
-
-static const DISPID DISPID_TOSTRING = 1;
-
-// CJavaObject
-STDMETHODIMP CJavaObject::GetDispID(BSTR name, DWORD options, DISPID* dispId){
-  std::string nameString = BSTRToUTF8(name);
-
-  // toString is the only non-numeric dispid we recognize
-  if (nameString == "toString") {
-    *dispId = DISPID_TOSTRING;
-    return S_OK;
-  }
-
-  char* lastChar;
-  int d = strtol(nameString.c_str(), &lastChar, 10);
-
-  if (*lastChar != '\0' || d < 0) {
-    Debug::log(Debug::Error) << "Unable to get dispatch id for " << nameString << Debug::flush;
-    // Set to unknown name in the case of an error
-    *dispId = DISPID_UNKNOWN;
-    return DISP_E_UNKNOWNNAME;
-  }
-  *dispId = d;
-  return S_OK;
-}
-
-STDMETHODIMP CJavaObject::DeleteMemberByName(BSTR,DWORD){
-  return S_FALSE;
-}
-
-STDMETHODIMP CJavaObject::DeleteMemberByDispID(DISPID){
-  return S_FALSE;
-}
-
-STDMETHODIMP CJavaObject::GetMemberProperties(DISPID dispId, DWORD options, DWORD* retVal){
-  Debug::log(Debug::Error) << "Hit unimplemented GetMemberProperties" << Debug::flush;
-  return DISP_E_UNKNOWNNAME;
-}
-
-STDMETHODIMP CJavaObject::GetMemberName(DISPID,BSTR *){
-  Debug::log(Debug::Error) << "Hit unimplemented GetMemberName" << Debug::flush;
-  return DISP_E_UNKNOWNNAME;
-}
-
-STDMETHODIMP CJavaObject::GetNextDispID(DWORD,DISPID,DISPID *){
-  Debug::log(Debug::Error) << "Hit unimplemented GetNextDispID" << Debug::flush;
-  return DISP_E_UNKNOWNNAME;
-}
-
-STDMETHODIMP CJavaObject::GetNameSpaceParent(IUnknown **unk){
-  sessionData->getWindow()->QueryInterface(unk);
-  return S_OK;
-}
-
-STDMETHODIMP CJavaObject::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,
-                                        UINT cNames, LCID lcid, DISPID* rgdispid)
-{
-  USES_CONVERSION;
-  // Stack-allocated
-  return GetDispID(OLE2BSTR(*rgszNames), 0, rgdispid);
-}
-
-STDMETHODIMP CJavaObject::Invoke(DISPID dispidMember, REFIID riid,
-                                 LCID lcid, WORD wFlags, DISPPARAMS* pdispparams,
-                                 VARIANT* pvarResult, EXCEPINFO* pexcepinfo,
-                                 UINT* puArgErr)
-{
-  return InvokeEx(dispidMember, lcid, wFlags, pdispparams, pvarResult,
-    pexcepinfo, NULL);
-}
-
-STDMETHODIMP CJavaObject::InvokeEx(DISPID dispidMember, LCID lcid, WORD wFlags,
-                                   DISPPARAMS* pdispparams, VARIANT* pvarResult,
-                                   EXCEPINFO* pexcepinfo,
-                                   IServiceProvider* pspCaller)
-{
-  Debug::log(Debug::Debugging) << "Invoking " << dispidMember << " on Java object " << objId << Debug::flush;
-
-  if (!sessionData) {
-    // Prevent errors if the object is retained post-disconnect
-    Debug::log(Debug::Warning) << "JavaObject retained beyound session shutdown" << Debug::flush;
-    return DISP_E_MEMBERNOTFOUND;
-  }
-
-  HostChannel* channel = sessionData->getHostChannel();
-  Value thisRef = Value();
-  thisRef.setJavaObject(objId);
-
-  if ((wFlags & DISPATCH_PROPERTYGET) && dispidMember == DISPID_VALUE &&
-    pdispparams->cArgs - pdispparams->cNamedArgs == 0) {
-      // This is an expression like ('' + obj)
-      // raw toString();
-      wFlags = DISPATCH_METHOD;
-      dispidMember = DISPID_TOSTRING;
-  }
-
-  if (wFlags & DISPATCH_METHOD) {
-    Debug::log(Debug::Spam) << "Dispatching method " << dispidMember << " on " << objId << Debug::flush;
-
-    if (!(dispidMember == DISPID_VALUE || dispidMember == DISPID_TOSTRING)) {
-      Debug::log(Debug::Error) << "Cannot dispatch for non-default id: " << dispidMember << Debug::flush;
-      return E_FAIL;
-    }
-    scoped_array<Value> args;
-    Value javaDispatchId;
-    int numArgs;
-
-    if (dispidMember == DISPID_VALUE) {
-      numArgs = pdispparams->cArgs - pdispparams->cNamedArgs - 2;
-      if (numArgs < 0) {
-        // Indicates an error in JSNI rewriting or dispatch code
-        Debug::log(Debug::Error) << "Insufficient number of arguments" << Debug::flush;
-        return E_FAIL;
-      }
-      args.reset(new Value[numArgs]);
-      // The dispatch parameters are backwards
-      sessionData->makeValue(javaDispatchId, pdispparams->rgvarg[pdispparams->cArgs - 1]);
-      sessionData->makeValue(thisRef, pdispparams->rgvarg[pdispparams->cArgs - 2]);
-      for (int i = 0; i < numArgs; i++) {
-        int index = pdispparams->cArgs - 3 - i;
-        VARIANTARG element = pdispparams->rgvarg[index];
-        sessionData->makeValue(args[i], element);
-      }
-    } else if (dispidMember == DISPID_TOSTRING) {
-      // raw toString();
-      numArgs = 0;
-      javaDispatchId.setInt(0);
-    }
-
-    bool isException = false;
-    Value returnValue;
-    if (!InvokeMessage::send(*channel, thisRef, javaDispatchId.getInt(), numArgs, args.get())) {
-      Debug::log(Debug::Error) << "Unable to send method invocation" << Debug::flush;
-    } else {
-      scoped_ptr<ReturnMessage> m(channel->reactToMessagesWhileWaitingForReturn(
-      sessionData->getSessionHandler()));
-
-      if (!m.get()) {
-        Debug::log(Debug::Error) << "Did not receive ReturnMessage" << Debug::flush;
-      } else {
-        if (dispidMember == DISPID_TOSTRING) {
-          // raw toString();
-          if (pvarResult) {
-            // This will be NULL when the caller doesn't care about the return value
-            _variant_t returnVariant;
-            sessionData->makeValueRef(returnVariant, m->getReturnValue());
-            *pvarResult = returnVariant.Detach();
-          }
-          return m->isException() ? E_FAIL : S_OK;
-        }
-        isException = m->isException();
-        returnValue = m->getReturnValue();
-      }
-    }
-
-    DISPID dispId;
-
-    HRESULT hr = IEUtils::resolveName(sessionData->getWindow(), Constants::__gwt_makeResult, &dispId);
-    if (FAILED(hr)) {
-        Debug::log(Debug::Error) << "Unable to get dispId for __gwt_makeResult" << Debug::flush;
-        return E_FAIL;
-    }
-
-    // Call __gwt_makeResult(isException, returnValue)
-    scoped_array<_variant_t> varArgs(new _variant_t[2]);
-    // Args go backwards.
-    varArgs[1] = (isException ? 1 : 0);
-    sessionData->makeValueRef(varArgs[0], returnValue);
-    DISPPARAMS dispParams = {varArgs.get(), NULL, 2, 0};
-    CComPtr<IDispatchEx> dispEx;
-    sessionData->getWindow()->QueryInterface(&dispEx);
-    return dispEx->InvokeEx(dispId, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
-      &dispParams, pvarResult, pexcepinfo, pspCaller);
-
-  } else if (wFlags & DISPATCH_PROPERTYGET) {
-    Debug::log(Debug::Spam) << "Getting property " << dispidMember << " on " << objId << Debug::flush;
-
-    if (dispidMember == DISPID_VALUE) {
-      this->QueryInterface(IID_IDispatch, (void**)&pvarResult->pdispVal);
-      pvarResult->vt = VT_DISPATCH;
-
-    } else if (dispidMember == DISPID_TOSTRING) {
-      // Asking for a tear-off of the .toString function
-      Debug::log(Debug::Spam) << "Making .toString tearoff" << Debug::flush;
-
-      // Get a reference to __gwt_makeTearOff
-      DISPID tearOffDispid;
-      HRESULT hr = IEUtils::resolveName(sessionData->getWindow(), Constants::__gwt_makeTearOff, &tearOffDispid);
-      if (FAILED(hr)) {
-        Debug::log(Debug::Error) << "Unable to find __gwt_makeTearOff" << Debug::flush;
-        return E_FAIL;
-      }
-
-      scoped_array<_variant_t> tearOffArgs(new _variant_t[3]);
-      // Parameters are backwards:
-      // __gwt_makeTearOff(proxy, dispId, argCount);
-      tearOffArgs[2] = this; // proxy
-      tearOffArgs[1] = 0; // dispId
-      tearOffArgs[0] = 0; // argCount
-      DISPPARAMS tearOffParams = {tearOffArgs.get(), NULL, 3, 0};
-
-      // Invoke __gwt_makeTearOff
-      hr = IEUtils::Invoke(sessionData->getWindow(), tearOffDispid,DISPATCH_METHOD,
-          &tearOffParams, pvarResult, NULL, 0);
-      if (FAILED(hr)) {
-        Debug::log(Debug::Error) << "Unable to invoke __gwt_makeTearOff" << Debug::flush;
-        return E_FAIL;
-      }
-
-    } else {
-      Value ret = ServerMethods::getProperty(*channel,
-        sessionData->getSessionHandler(), objId, dispidMember);
-
-      if (ret.isUndefined()) {
-        Debug::log(Debug::Error) << "Undefined get from Java object" << Debug::flush;
-        return E_FAIL;
-      }
-
-      _variant_t returnVariant;
-      sessionData->makeValueRef(returnVariant, ret);
-      *pvarResult = returnVariant.Detach();
-    }
-
-  } else if (wFlags & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF)) {
-    Debug::log(Debug::Spam) << "Setting property " << dispidMember << " on " << objId << Debug::flush;
-
-    Value value;
-    sessionData->makeValue(value, pdispparams->rgvarg[0]);
-
-    ServerMethods::setProperty(*channel, sessionData->getSessionHandler(),
-      objId, dispidMember, value);
-
-  } else {
-    Debug::log(Debug::Error) << "Unsupported invocation " << wFlags << Debug::flush;
-    return DISP_E_MEMBERNOTFOUND;
-  }
-
-  return S_OK;
-}
diff --git a/plugins/ie/oophm/oophm/JavaObject.h b/plugins/ie/oophm/oophm/JavaObject.h
deleted file mode 100644
index cf56fa2..0000000
--- a/plugins/ie/oophm/oophm/JavaObject.h
+++ /dev/null
@@ -1,105 +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.
- */
-
-// JavaObject.h : Declaration of the CJavaObject
-
-#pragma once
-#include "resource.h"       // main symbols
-#include "SessionData.h"
-
-#include "oophm_i.h"
-
-
-#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
-#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
-#endif
-
-
-
-// CJavaObject
-
-class ATL_NO_VTABLE CJavaObject :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<CJavaObject, &CLSID_JavaObject>,
-	public IDispatchImpl<IJavaObject, &IID_IJavaObject, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
-{
-public:
-  // TODO How can the default constructor be gotten rid of?
-  CJavaObject() : objId(-1) {
-  }
-
-	STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
-		LCID lcid, DISPID* rgdispid);
-
-	STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
-		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
-		EXCEPINFO* pexcepinfo, UINT* puArgErr);
-
-DECLARE_REGISTRY_RESOURCEID(IDR_JAVAOBJECT)
-
-
-BEGIN_COM_MAP(CJavaObject)
-	COM_INTERFACE_ENTRY(IJavaObject)
-  COM_INTERFACE_ENTRY(IDispatchEx)
-  COM_INTERFACE_ENTRY(IDispatch)
-END_COM_MAP()
-
-
-
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct()
-	{
-		return S_OK;
-	}
-
-	void FinalRelease()
-	{
-    Debug::log(Debug::Debugging) << "JavaObject " << objId << " released" << Debug::flush;
-    if (sessionData) {
-      // After shutdown, the session data will have been torn down
-      sessionData->freeJavaObject(objId);
-    }
-	}
-
-  unsigned int getObjectId() const {
-    return objId;
-  }
-
-  STDMETHOD(GetDispID)(BSTR,DWORD,DISPID *);
-  STDMETHOD(InvokeEx)(DISPID,LCID,WORD,DISPPARAMS *,VARIANT *,EXCEPINFO *,IServiceProvider *);
-  STDMETHOD(DeleteMemberByName)(BSTR,DWORD);
-  STDMETHOD(DeleteMemberByDispID)(DISPID);
-  STDMETHOD(GetMemberProperties)(DISPID,DWORD,DWORD *);
-  STDMETHOD(GetMemberName)(DISPID,BSTR *);
-  STDMETHOD(GetNextDispID)(DWORD,DISPID,DISPID *);
-  STDMETHOD(GetNameSpaceParent)(IUnknown **);
-
-  void initialize(unsigned int objId, SessionDataRef sessionData) {
-    this->objId = objId;
-    this->sessionData = sessionData;
-  }
-
-  void shutdown() {
-    sessionData = NULL;
-  }
-
-private:
-  unsigned int objId;
-  SessionDataRef sessionData;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(JavaObject), CJavaObject)
diff --git a/plugins/ie/oophm/oophm/JavaObject.rgs b/plugins/ie/oophm/oophm/JavaObject.rgs
deleted file mode 100644
index f84f142..0000000
--- a/plugins/ie/oophm/oophm/JavaObject.rgs
+++ /dev/null
@@ -1,26 +0,0 @@
-HKCR
-{
-	oophm.JavaObject.1 = s 'JavaObject Class'
-	{
-		CLSID = s '{644FD769-8B9D-4AC4-A79E-AAAF5CD751C1}'
-	}
-	oophm.JavaObject = s 'JavaObject Class'
-	{
-		CLSID = s '{644FD769-8B9D-4AC4-A79E-AAAF5CD751C1}'
-		CurVer = s 'oophm.JavaObject.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {644FD769-8B9D-4AC4-A79E-AAAF5CD751C1} = s 'JavaObject Class'
-		{
-			ProgID = s 'oophm.JavaObject.1'
-			VersionIndependentProgID = s 'oophm.JavaObject'
-			ForceRemove 'Programmable'
-			InprocServer32 = s '%MODULE%'
-			{
-				val ThreadingModel = s 'Apartment'
-			}
-			'TypeLib' = s '{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}'
-		}
-	}
-}
diff --git a/plugins/ie/oophm/oophm/ReadMe.txt b/plugins/ie/oophm/oophm/ReadMe.txt
deleted file mode 100644
index 2e7a437..0000000
--- a/plugins/ie/oophm/oophm/ReadMe.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-========================================================================
-    ACTIVE TEMPLATE LIBRARY : oophm Project Overview
-========================================================================
-
-AppWizard has created this oophm project for you to use as the starting point for
-writing your Dynamic Link Library (DLL).
-
-This file contains a summary of what you will find in each of the files that
-make up your project.
-
-oophm.vcproj
-    This is the main project file for VC++ projects generated using an Application Wizard.
-    It contains information about the version of Visual C++ that generated the file, and
-    information about the platforms, configurations, and project features selected with the
-    Application Wizard.
-
-oophm.idl
-    This file contains the IDL definitions of the type library, the interfaces
-    and co-classes defined in your project.
-    This file will be processed by the MIDL compiler to generate:
-        C++ interface definitions and GUID declarations (oophm.h)
-        GUID definitions                                (oophm_i.c)
-        A type library                                  (oophm.tlb)
-        Marshaling code                                 (oophm_p.c and dlldata.c)
-
-oophm.h
-    This file contains the C++ interface definitions and GUID declarations of the
-    items defined in oophm.idl. It will be regenerated by MIDL during compilation.
-
-oophm.cpp
-    This file contains the object map and the implementation of your DLL's exports.
-
-oophm.rc
-    This is a listing of all of the Microsoft Windows resources that the
-    program uses.
-
-oophm.def
-    This module-definition file provides the linker with information about the exports
-    required by your DLL. It contains exports for:
-        DllGetClassObject
-        DllCanUnloadNow
-        DllRegisterServer
-        DllUnregisterServer
-
-/////////////////////////////////////////////////////////////////////////////
-Other standard files:
-
-StdAfx.h, StdAfx.cpp
-    These files are used to build a precompiled header (PCH) file
-    named oophm.pch and a precompiled types file named StdAfx.obj.
-
-Resource.h
-    This is the standard header file that defines resource IDs.
-
-
-/////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/ie/oophm/oophm/SessionData.h b/plugins/ie/oophm/oophm/SessionData.h
deleted file mode 100644
index ac8fe67..0000000
--- a/plugins/ie/oophm/oophm/SessionData.h
+++ /dev/null
@@ -1,105 +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.
- */
-
-#pragma once
-#include "stdafx.h"
-#include "comutil.h"
-#include "HostChannel.h"
-#include "Mshtml.h"
-#include "SessionHandler.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-/*
-* Encapsules per-OOPHM-session data.
-*/
-class SessionData {
-public:
-  SessionData(HostChannel* channel,
-    IHTMLWindow2* window,
-    SessionHandler* sessionHandler) : channel(channel),
-    window(window),
-    sessionHandler(sessionHandler) {
-  }
-
-  virtual void freeJavaObject(unsigned int objId)=0;
-
-  HostChannel* getHostChannel() const {
-    return channel.get();
-  }
-
-  SessionHandler* getSessionHandler() const {
-    return sessionHandler;
-  }
-
-  IHTMLWindow2* getWindow() const {
-    return window;
-  }
-
-  /*
-  * Convert a value from the JavaScript into something that can be sent back
-  * to the OOPHM host.
-  */
-  virtual void makeValue(Value& value, const _variant_t& in)=0;
-
-  /*
-  * Convert a value from the OOPHM host into something that can be passed into
-  * the JavaScript execution environment.
-  */
-  virtual void makeValueRef(_variant_t& value, const Value& in)=0;
-
-protected:
-  /*
-  * The communication channel used for the OOPHM session.
-  */
-  scoped_ptr<HostChannel> const channel;
-
-  /*
-  * A reference to the SessionHandler being used in the OOPHM session.
-  */
-  SessionHandler* const sessionHandler;
-
-  CComPtr<IHTMLWindow2> const window;
-};
-typedef SessionData* SessionDataRef;
-
-// TODO move these to a utility header
-
-__inline static std::string BSTRToUTF8(BSTR bstr) {
-  // Need an explict length due to the possibility of embedded nulls
-  int length = SysStringLen(bstr);
-  int numChars = WideCharToMultiByte(CP_UTF8, 0, bstr, length, NULL, 0, NULL, NULL);
-  char* buffer = new char[numChars];
-  int res = WideCharToMultiByte(CP_UTF8, 0, bstr, length, buffer, numChars, NULL, NULL);
-  // TODO assert res == numChars?
-  std::string toReturn = std::string(buffer, res);
-  delete[] buffer;
-  return toReturn;
-}
-
-/*
- * Convert a utf8-encoded string into a BSTR.  The length is explicitly
- * specified because the incoming string may have embedded null charachers.
- */
-__inline static _bstr_t UTF8ToBSTR(int length, const char* utf8) {
-  // We explicitly use MultiByteToWideChar to handle embedded nulls
-  int numChars = MultiByteToWideChar(CP_UTF8, 0, utf8, length, NULL, 0);
-  OLECHAR* buffer = new OLECHAR[numChars];
-  int res = MultiByteToWideChar(CP_UTF8, 0, utf8, length, buffer, numChars);
-  // Manually allocate the BSTR to set the length; _bstr_t assumes C-strings
-  _bstr_t toReturn = _bstr_t(SysAllocStringLen(buffer, res), false);
-  delete[] buffer;
-  return toReturn;
-}
diff --git a/plugins/ie/oophm/oophm/dlldata.c b/plugins/ie/oophm/oophm/dlldata.c
deleted file mode 100644
index 7b86f60..0000000
--- a/plugins/ie/oophm/oophm/dlldata.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*********************************************************
-   DllData file -- generated by MIDL compiler 
-
-        DO NOT ALTER THIS FILE
-
-   This file is regenerated by MIDL on every IDL file compile.
-
-   To completely reconstruct this file, delete it and rerun MIDL
-   on all the IDL files in this DLL, specifying this file for the
-   /dlldata command line option
-
-*********************************************************/
-
-#define PROXY_DELEGATION
-
-#include <rpcproxy.h>
-
-#ifdef __cplusplus
-extern "C"   {
-#endif
-
-EXTERN_PROXY_FILE( oophm )
-
-
-PROXYFILE_LIST_START
-/* Start of list */
-  REFERENCE_PROXY_FILE( oophm ),
-/* End of list */
-PROXYFILE_LIST_END
-
-
-DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
-
-#ifdef __cplusplus
-}  /*extern "C" */
-#endif
-
-/* end of generated dlldata file */
diff --git a/plugins/ie/oophm/oophm/dlldatax.c b/plugins/ie/oophm/oophm/dlldatax.c
deleted file mode 100644
index 8979369..0000000
--- a/plugins/ie/oophm/oophm/dlldatax.c
+++ /dev/null
@@ -1,34 +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.
- */
-
-// wrapper for dlldata.c
-
-#ifdef _MERGE_PROXYSTUB // merge proxy stub DLL
-
-#define REGISTER_PROXY_DLL //DllRegisterServer, etc.
-
-#define _WIN32_WINNT 0x0500	//for WinNT 4.0 or Win95 with DCOM
-#define USE_STUBLESS_PROXY	//defined only with MIDL switch /Oicf
-
-#pragma comment(lib, "rpcns4.lib")
-#pragma comment(lib, "rpcrt4.lib")
-
-#define ENTRY_PREFIX	Prx
-
-#include "dlldata.c"
-#include "oophm_p.c"
-
-#endif //_MERGE_PROXYSTUB
diff --git a/plugins/ie/oophm/oophm/dlldatax.h b/plugins/ie/oophm/oophm/dlldatax.h
deleted file mode 100644
index 4ce5f66..0000000
--- a/plugins/ie/oophm/oophm/dlldatax.h
+++ /dev/null
@@ -1,31 +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.
- */
-
-#pragma once
-
-#ifdef _MERGE_PROXYSTUB
-
-extern "C" 
-{
-BOOL WINAPI PrxDllMain(HINSTANCE hInstance, DWORD dwReason, 
-	LPVOID lpReserved);
-STDAPI PrxDllCanUnloadNow(void);
-STDAPI PrxDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv);
-STDAPI PrxDllRegisterServer(void);
-STDAPI PrxDllUnregisterServer(void);
-}
-
-#endif
diff --git a/plugins/ie/oophm/oophm/dllmain.cpp b/plugins/ie/oophm/oophm/dllmain.cpp
deleted file mode 100644
index eaa3ed9..0000000
--- a/plugins/ie/oophm/oophm/dllmain.cpp
+++ /dev/null
@@ -1,39 +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.
- */
-
-// dllmain.cpp : Implementation of DllMain.
-#include "stdafx.h"
-#include "resource.h"
-#include "oophm_i.h"
-#include "dllmain.h"
-#include "dlldatax.h"
-#include "AllowDialog.h"
-
-CoophmModule _AtlModule;
-
-// DLL Entry Point
-extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
-{
-#ifdef _MERGE_PROXYSTUB
-        if (!PrxDllMain(hInstance, dwReason, lpReserved))
-                return FALSE;
-#endif
-        DisableThreadLibraryCalls(hInstance);
-
-        AllowDialog::setHInstance(hInstance);
-
-        return _AtlModule.DllMain(dwReason, lpReserved); 
-}
diff --git a/plugins/ie/oophm/oophm/dllmain.h b/plugins/ie/oophm/oophm/dllmain.h
deleted file mode 100644
index 6965209..0000000
--- a/plugins/ie/oophm/oophm/dllmain.h
+++ /dev/null
@@ -1,26 +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.
- */
-
-// dllmain.h : Declaration of module class.
-
-class CoophmModule : public CAtlDllModuleT< CoophmModule >
-{
-public :
-	DECLARE_LIBID(LIBID_oophmLib)
-	DECLARE_REGISTRY_APPID_RESOURCEID(IDR_OOPHM, "{F9365E53-5A14-47F3-BF1D-10CAAB815309}")
-};
-
-extern class CoophmModule _AtlModule;
diff --git a/plugins/ie/oophm/oophm/oophm.aps b/plugins/ie/oophm/oophm/oophm.aps
deleted file mode 100644
index 27a7cf6..0000000
--- a/plugins/ie/oophm/oophm/oophm.aps
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/oophm/oophm/oophm.cpp b/plugins/ie/oophm/oophm/oophm.cpp
deleted file mode 100644
index b94b12e..0000000
--- a/plugins/ie/oophm/oophm/oophm.cpp
+++ /dev/null
@@ -1,112 +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.
- */
-
-// oophm.cpp : Implementation of DLL Exports.
-
-
-#include "stdafx.h"
-#include "resource.h"
-#include "oophm_i.h"
-#include "dllmain.h"
-#include "dlldatax.h"
-
-// Used to determine whether the DLL can be unloaded by OLE
-STDAPI DllCanUnloadNow(void)
-{
-#ifdef _MERGE_PROXYSTUB
-    HRESULT hr = PrxDllCanUnloadNow();
-    if (hr != S_OK)
-        return hr;
-#endif
-    return _AtlModule.DllCanUnloadNow();
-}
-
-
-// Returns a class factory to create an object of the requested type
-STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
-{
-#ifdef _MERGE_PROXYSTUB
-    if (PrxDllGetClassObject(rclsid, riid, ppv) == S_OK)
-        return S_OK;
-#endif
-    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
-}
-
-
-// DllRegisterServer - Adds entries to the system registry
-STDAPI DllRegisterServer(void)
-{
-    // registers object, typelib and all interfaces in typelib
-    HRESULT hr = _AtlModule.DllRegisterServer();
-#ifdef _MERGE_PROXYSTUB
-    if (FAILED(hr))
-        return hr;
-    hr = PrxDllRegisterServer();
-#endif
-    return hr;
-}
-
-
-// DllUnregisterServer - Removes entries from the system registry
-STDAPI DllUnregisterServer(void)
-{
-	HRESULT hr = _AtlModule.DllUnregisterServer();
-#ifdef _MERGE_PROXYSTUB
-    if (FAILED(hr))
-        return hr;
-    hr = PrxDllRegisterServer();
-    if (FAILED(hr))
-        return hr;
-    hr = PrxDllUnregisterServer();
-#endif
-    return hr;
-}
-
-// DllInstall - Adds/Removes entries to the system registry per user
-//              per machine.	
-STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine)
-{
-    HRESULT hr = E_FAIL;
-#if 0
-    // TODO(jat): consider adding this back
-    static const wchar_t szUserSwitch[] = _T("user");
-
-    if (pszCmdLine != NULL)
-    {
-    	if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0)
-    	{
-    		AtlSetPerUserRegistration(true);
-    	}
-    }
-#endif
-
-    if (bInstall)
-    {	
-    	hr = DllRegisterServer();
-    	if (FAILED(hr))
-    	{	
-    		DllUnregisterServer();
-    	}
-    }
-    else
-    {
-    	hr = DllUnregisterServer();
-    }
-
-    return hr;
-}
-
-
diff --git a/plugins/ie/oophm/oophm/oophm.def b/plugins/ie/oophm/oophm/oophm.def
deleted file mode 100644
index bbb6f99..0000000
--- a/plugins/ie/oophm/oophm/oophm.def
+++ /dev/null
@@ -1,24 +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.
-
-; oophm.def : Declares the module parameters.
-
-LIBRARY      "oophm.DLL"
-
-EXPORTS
-	DllCanUnloadNow		PRIVATE
-	DllGetClassObject	PRIVATE
-	DllRegisterServer	PRIVATE
-	DllUnregisterServer	PRIVATE
-	DllInstall		PRIVATE
diff --git a/plugins/ie/oophm/oophm/oophm.idl b/plugins/ie/oophm/oophm/oophm.idl
deleted file mode 100644
index 662618b..0000000
--- a/plugins/ie/oophm/oophm/oophm.idl
+++ /dev/null
@@ -1,124 +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.
- */
-
-// oophm.idl : IDL source for oophm
-//
-
-// This file will be processed by the MIDL tool to
-// produce the type library (oophm.tlb) and marshalling code.
-
-#include "olectl.h"
-import "oaidl.idl";
-import "ocidl.idl";
-import "dispex.idl";
-
-// This interface is something of a hack to work around the lack
-// of ICanHandleException being defined by default in the dispex headers
-[
-	object,
-	uuid(c5598e60-b307-11d1-b27d-006008c3fbfb),
-	pointer_default(unique)
-]
-interface ICanHandleException : IUnknown
-{
-	HRESULT CanHandleException([in] EXCEPINFO *pExcepInfo, [in] VARIANT *pvar);
-};
-
-[
-	object,
-	uuid(73607C2E-369B-4055-8020-D7643A59F521),
-	dual,
-	nonextensible,
-	helpstring("Iplugin Interface"),
-	pointer_default(unique)
-]
-interface Iplugin : IDispatch{
-	[id(1), helpstring("OOPHM connect")] HRESULT connect([in] BSTR url, [in] BSTR sessionKey, [in] BSTR hostedServer, [in] BSTR moduleName, [in] BSTR hostedHtmlVersion, [out,retval] VARIANT_BOOL* ret);
-	[id(2), helpstring("method testObject")] HRESULT testObject([out,retval] IDispatch** ret);
-	[id(3), helpstring("OOPHM init")] HRESULT init([in] IDispatch* jsniContext, [out,retval] VARIANT_BOOL* ret);
-};
-
-[
-	object, 
-	dual,
-	nonextensible,
-	uuid(AB9B16A0-03E9-481E-ADF5-B00B860A8C3A),
-	helpstring("IpluginUI Interface"),
-	pointer_default(unique)
-]
-interface IpluginUI : IDispatch
-{
-	// Example method that will be called by the HTML
-	HRESULT OnClick([in]IDispatch* pdispBody, [in]VARIANT varColor);
-};
-[
-	object,
-	uuid(58276E45-1F24-4B71-88AC-2A7D0C26CDFF),
-	dual,
-	nonextensible,
-	helpstring("IJavaObject Interface"),
-	pointer_default(unique)
-]
-interface IJavaObject : IDispatchEx{
-};
-[
-	object,
-	uuid(1C3FBB2D-58C2-426C-A461-E6002F9EE294),
-	dual,
-	nonextensible,
-	helpstring("IExceptionCatcher Interface"),
-	pointer_default(unique)
-]
-interface IExceptionCatcher : IDispatch{
-  [id(1), helpstring("method getException")] HRESULT getException([out,retval] VARIANT* retVal);
-  [id(2), helpstring("method hasSeenException")] HRESULT hasSeenException([out,retval] BOOL* retVal);
-};
-[
-	uuid(9259F105-BE55-4BF6-B7CE-D0AA878C1BA6),
-	version(1.0),
-	helpstring("oophm 1.0 Type Library")
-]
-library oophmLib
-{
-	importlib("stdole2.tlb");
-	[
-		uuid(1D6156B6-002B-49E7-B5CA-C138FB843B4E),
-		control,
-		helpstring("plugin Class")
-	]
-	coclass plugin
-	{
-		[default] interface Iplugin;
-		interface IpluginUI;
-	};
-	[
-		uuid(644FD769-8B9D-4AC4-A79E-AAAF5CD751C1),
-		helpstring("JavaObject Class")
-	]
-	coclass JavaObject
-	{
-		[default] interface IJavaObject;
-	};
-	[
-		uuid(1A2A78F4-B5A4-4208-B520-BDDA0A7EC5CB),
-		helpstring("ExceptionCatcher Class")
-	]
-	coclass ExceptionCatcher
-	{
-		[default] interface IExceptionCatcher;
-    interface ICanHandleException;
-	};
-};
diff --git a/plugins/ie/oophm/oophm/oophm.rc b/plugins/ie/oophm/oophm/oophm.rc
deleted file mode 100644
index 3665d98..0000000
--- a/plugins/ie/oophm/oophm/oophm.rc
+++ /dev/null
@@ -1,174 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#ifndef APSTUDIO_INVOKED
-#include "targetver.h"
-#endif
-#include "winres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#ifndef APSTUDIO_INVOKED\r\n"
-    "#include ""targetver.h""\r\n"
-    "#endif\r\n"
-    "#include ""winres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "1 TYPELIB ""oophm.tlb""\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,2,9570,0
- PRODUCTVERSION 1,2,9570,0
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904e4"
-        BEGIN
-            VALUE "CompanyName", "Google Inc."
-            VALUE "FileDescription", "Google Web Toolkit Developer Plugin"
-            VALUE "FileVersion", "1.2.9570.0"
-            VALUE "InternalName", "oophm.dll"
-            VALUE "LegalCopyright", "Copyright 2008 Google Inc. Licensed under the Apache 2.0 license."
-            VALUE "OriginalFilename", "oophm.dll"
-            VALUE "ProductName", "Google Web Toolkit"
-            VALUE "ProductVersion", "1.2.9570.0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1252
-    END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// REGISTRY
-//
-
-IDR_OOPHM               REGISTRY                "oophm.rgs"
-IDR_PLUGIN              REGISTRY                "plugin.rgs"
-IDR_JAVAOBJECT          REGISTRY                "JavaObject.rgs"
-IDR_EXCEPTIONCATCHER    REGISTRY                "ExceptionCatcher.rgs"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_ALLOW_DIALOG DIALOGEX 0, 0, 188, 73
-STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION
-EXSTYLE WS_EX_TOPMOST
-CAPTION "GWT Plugin Security Alert"
-FONT 10, "Microsoft Sans Serif", 400, 0, 0x0
-BEGIN
-    CONTROL         "Remember this decision for this server",IDC_REMEMBER_CHECKBOX,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,31,129,10
-    LTEXT           "This web server is trying to initiate a GWT Development\r\nMode Connection -- should it be allowed?",IDC_STATIC,10,7,167,19
-    PUSHBUTTON      "Allow",IDC_ALLOW_BUTTON,37,50,50,14
-    DEFPUSHBUTTON   "Deny",IDCANCEL,100,50,50,14
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// DESIGNINFO
-//
-
-#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO 
-BEGIN
-    IDD_ALLOW_DIALOG, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 181
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 66
-    END
-END
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// HTML
-//
-
-IDH_PLUGIN              HTML                    "pluginUI.htm"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE 
-BEGIN
-    IDS_PROJNAME            "oophm"
-END
-
-#endif    // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-1 TYPELIB "oophm.tlb"
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
diff --git a/plugins/ie/oophm/oophm/oophm.rgs b/plugins/ie/oophm/oophm/oophm.rgs
deleted file mode 100644
index b106174..0000000
--- a/plugins/ie/oophm/oophm/oophm.rgs
+++ /dev/null
@@ -1,11 +0,0 @@
-HKCR
-{
-	NoRemove AppID
-	{
-		'%APPID%' = s 'oophm'
-		'oophm.DLL'
-		{
-			val AppID = s '%APPID%'
-		}
-	}
-}
diff --git a/plugins/ie/oophm/oophm/oophm.vcproj b/plugins/ie/oophm/oophm/oophm.vcproj
deleted file mode 100644
index 9014169..0000000
--- a/plugins/ie/oophm/oophm/oophm.vcproj
+++ /dev/null
@@ -1,860 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="oophm"
-	ProjectGUID="{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}"
-	RootNamespace="oophm"
-	Keyword="AtlProj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-		<Platform
-			Name="x64"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(ConfigurationName)32"
-			IntermediateDirectory="$(ConfigurationName)32"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			UseOfATL="1"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="_DEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="1"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/oophm.tlb"
-				HeaderFileName="oophm_i.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="oophm_i.c"
-				ProxyFileName="oophm_p.c"
-				ValidateParameters="true"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)&quot;;../../../platform/Win;../../../common"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Spam"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				DebugInformationFormat="4"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="_DEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="comsuppw.lib ws2_32.lib"
-				OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
-				LinkIncremental="2"
-				ModuleDefinitionFile=".\oophm.def"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Debug|x64"
-			OutputDirectory="$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			UseOfATL="1"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="_DEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="3"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/oophm.tlb"
-				HeaderFileName="oophm_i.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="oophm_i.c"
-				ProxyFileName="oophm_p.c"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)&quot;;../../../platform/Win;../../../common"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Spam"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="_DEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="comsuppw.lib ws2_32.lib"
-				OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
-				LinkIncremental="2"
-				ModuleDefinitionFile=".\oophm.def"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				TargetMachine="17"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(ConfigurationName)32"
-			IntermediateDirectory="$(ConfigurationName)32"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			UseOfATL="1"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="NDEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="1"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/oophm.tlb"
-				HeaderFileName="oophm_i.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="oophm_i.c"
-				ProxyFileName="oophm_p.c"
-				ValidateParameters="true"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				InlineFunctionExpansion="2"
-				EnableIntrinsicFunctions="true"
-				FavorSizeOrSpeed="1"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)&quot;;../../../platform/Win;../../../common"
-				PreprocessorDefinitions="_WINDOWS;GWT_DEBUGDISABLE"
-				RuntimeLibrary="0"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="NDEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				RegisterOutput="true"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="comsuppw.lib ws2_32.lib"
-				OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
-				LinkIncremental="1"
-				ModuleDefinitionFile=".\oophm.def"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|x64"
-			OutputDirectory="$(ConfigurationName)64"
-			IntermediateDirectory="$(ConfigurationName)64"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			UseOfATL="1"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				PreprocessorDefinitions="NDEBUG"
-				MkTypLibCompatible="false"
-				TargetEnvironment="3"
-				GenerateStublessProxies="true"
-				TypeLibraryName="$(IntDir)/oophm.tlb"
-				HeaderFileName="oophm_i.h"
-				DLLDataFileName=""
-				InterfaceIdentifierFileName="oophm_i.c"
-				ProxyFileName="oophm_p.c"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				InlineFunctionExpansion="2"
-				EnableIntrinsicFunctions="true"
-				FavorSizeOrSpeed="1"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)&quot;;../../../platform/Win;../../../common"
-				PreprocessorDefinitions="_WINDOWS;GWT_DEBUGDISABLE"
-				RuntimeLibrary="0"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				PreprocessorDefinitions="NDEBUG"
-				Culture="1033"
-				AdditionalIncludeDirectories="$(IntDir)"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				IgnoreImportLibrary="true"
-				AdditionalDependencies="comsuppw.lib ws2_32.lib"
-				OutputFile="..\..\prebuilt\$(PlatformName)\$(ProjectName).dll"
-				LinkIncremental="1"
-				ModuleDefinitionFile=".\oophm.def"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				TargetMachine="17"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\..\..\platform\Win\AllowDialog.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\dlldatax.c"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Debug|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\dllmain.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Debug|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\ExceptionCatcher.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\IESessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\oophm.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\oophm.def"
-				>
-			</File>
-			<File
-				RelativePath=".\oophm.idl"
-				>
-			</File>
-			<File
-				RelativePath=".\plugin.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\..\..\platform\Win\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\stdafx.cpp"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\..\..\platform\Win\AllowDialog.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Constants.h"
-				>
-			</File>
-			<File
-				RelativePath=".\dlldatax.h"
-				>
-			</File>
-			<File
-				RelativePath=".\dllmain.h"
-				>
-			</File>
-			<File
-				RelativePath=".\ExceptionCatcher.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\..\common\FatalErrorMessage.h"
-				>
-			</File>
-			<File
-				RelativePath=".\IESessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath=".\IEUtils.h"
-				>
-			</File>
-			<File
-				RelativePath=".\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath=".\plugin.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\..\platform\Win\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Resource.h"
-				>
-			</File>
-			<File
-				RelativePath=".\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath=".\stdafx.h"
-				>
-			</File>
-			<File
-				RelativePath=".\targetver.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath=".\ExceptionCatcher.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\JavaObject.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\oophm.rc"
-				>
-			</File>
-			<File
-				RelativePath=".\oophm.rgs"
-				>
-			</File>
-			<File
-				RelativePath=".\plugin.bmp"
-				>
-			</File>
-			<File
-				RelativePath=".\plugin.rgs"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Generated Files"
-			SourceControlFiles="false"
-			>
-			<File
-				RelativePath=".\oophm_i.c"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Debug|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|x64"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="0"
-						CompileAsManaged="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\oophm_i.h"
-				>
-			</File>
-		</Filter>
-		<File
-			RelativePath=".\plugin.htm"
-			DeploymentContent="true"
-			>
-		</File>
-		<File
-			RelativePath=".\pluginUI.htm"
-			DeploymentContent="true"
-			>
-		</File>
-		<File
-			RelativePath=".\ReadMe.txt"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/ie/oophm/oophm/oophm.vcxproj b/plugins/ie/oophm/oophm/oophm.vcxproj
deleted file mode 100644
index f073a5d..0000000
--- a/plugins/ie/oophm/oophm/oophm.vcxproj
+++ /dev/null
@@ -1,397 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{EB69BDFE-9380-4C51-99E8-C3EB25AE36A2}</ProjectGuid>
-    <RootNamespace>oophm</RootNamespace>
-    <Keyword>AtlProj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-    <UseOfAtl>Static</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-    <UseOfAtl>Static</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-    <UseOfAtl>Static</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-    <UseOfAtl>Static</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)32\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)32\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)32\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)32\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Configuration)64\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Configuration)64\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
-      <HeaderFileName>oophm_i.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>oophm_p.c</ProxyFileName>
-      <ValidateAllParameters>true</ValidateAllParameters>
-    </Midl>
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Info;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-    <Link>
-      <RegisterOutput>true</RegisterOutput>
-      <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
-      <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
-      <HeaderFileName>oophm_i.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>oophm_p.c</ProxyFileName>
-    </Midl>
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GWT_DEBUGLEVEL=Spam;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
-      <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
-      <HeaderFileName>oophm_i.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>oophm_p.c</ProxyFileName>
-      <ValidateAllParameters>true</ValidateAllParameters>
-    </Midl>
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
-      <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_WINDOWS;GWT_DEBUGDISABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-    <Link>
-      <RegisterOutput>true</RegisterOutput>
-      <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
-      <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)oophm.tlb</TypeLibraryName>
-      <HeaderFileName>oophm_i.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>oophm_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>oophm_p.c</ProxyFileName>
-    </Midl>
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
-      <AdditionalIncludeDirectories>$(ProjectDir);../../../platform/Win;../../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_WINDOWS;GWT_DEBUGDISABLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>comsuppw.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>..\..\prebuilt\$(Platform)\$(ProjectName).dll</OutputFile>
-      <ModuleDefinitionFile>.\oophm.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="..\..\..\platform\Win\AllowDialog.cpp" />
-    <ClCompile Include="dlldatax.c">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
-    </ClCompile>
-    <ClCompile Include="dllmain.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
-    </ClCompile>
-    <ClCompile Include="ExceptionCatcher.cpp" />
-    <ClCompile Include="IESessionHandler.cpp" />
-    <ClCompile Include="JavaObject.cpp" />
-    <ClCompile Include="oophm.cpp" />
-    <ClCompile Include="plugin.cpp" />
-    <ClCompile Include="..\..\..\platform\Win\Preferences.cpp" />
-    <ClCompile Include="stdafx.cpp" />
-    <ClCompile Include="..\..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\..\common\SwitchTransportMessage.cpp" />
-    <ClCompile Include="oophm_i.c">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-      </PrecompiledHeader>
-      <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="oophm.def" />
-    <None Include="ExceptionCatcher.rgs" />
-    <None Include="JavaObject.rgs" />
-    <None Include="oophm.rgs" />
-    <None Include="plugin.bmp" />
-    <None Include="plugin.rgs" />
-    <None Include="plugin.htm">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="pluginUI.htm">
-      <DeploymentContent>true</DeploymentContent>
-    </None>
-    <None Include="ReadMe.txt" />
-  </ItemGroup>
-  <ItemGroup>
-    <Midl Include="oophm.idl" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\..\..\platform\Win\AllowDialog.h" />
-    <ClInclude Include="Constants.h" />
-    <ClInclude Include="dlldatax.h" />
-    <ClInclude Include="dllmain.h" />
-    <ClInclude Include="ExceptionCatcher.h" />
-    <ClInclude Include="..\..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="IESessionHandler.h" />
-    <ClInclude Include="IEUtils.h" />
-    <ClInclude Include="JavaObject.h" />
-    <ClInclude Include="plugin.h" />
-    <ClInclude Include="..\..\..\platform\Win\Preferences.h" />
-    <ClInclude Include="Resource.h" />
-    <ClInclude Include="SessionData.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="targetver.h" />
-    <ClInclude Include="..\..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\..\common\Debug.h" />
-    <ClInclude Include="..\..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\..\common\Message.h" />
-    <ClInclude Include="..\..\..\common\Platform.h" />
-    <ClInclude Include="..\..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\..\common\Socket.h" />
-    <ClInclude Include="..\..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\..\common\Value.h" />
-    <ClInclude Include="oophm_i.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="oophm.rc" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/ie/oophm/oophm/oophm.vcxproj.filters b/plugins/ie/oophm/oophm/oophm.vcxproj.filters
deleted file mode 100644
index eba06fa..0000000
--- a/plugins/ie/oophm/oophm/oophm.vcxproj.filters
+++ /dev/null
@@ -1,262 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Source Files\common">
-      <UniqueIdentifier>{7de3b311-d305-4b06-9891-48808617edcc}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Header Files\common">
-      <UniqueIdentifier>{bdeb57bf-5bd5-432d-8f9a-8160fc4e9e7f}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
-    </Filter>
-    <Filter Include="Generated Files">
-      <UniqueIdentifier>{619a202a-99fa-4836-9ee8-ef0dfa42d372}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\..\..\platform\Win\AllowDialog.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="dlldatax.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="dllmain.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="ExceptionCatcher.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IESessionHandler.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="JavaObject.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="oophm.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="plugin.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\platform\Win\Preferences.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="stdafx.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\AllowedConnections.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\CheckVersionsMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\ChooseTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\Debug.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\FatalErrorMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\FreeValueMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\HostChannel.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\InvokeMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\InvokeSpecialMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\LoadJsniMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\LoadModuleMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\ProtocolVersionMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\ReturnMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\ServerMethods.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\Socket.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\..\common\SwitchTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="oophm_i.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="oophm.def">
-      <Filter>Source Files</Filter>
-    </None>
-    <None Include="ExceptionCatcher.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="JavaObject.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="oophm.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="plugin.bmp">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="plugin.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="plugin.htm" />
-    <None Include="pluginUI.htm" />
-    <None Include="ReadMe.txt" />
-  </ItemGroup>
-  <ItemGroup>
-    <Midl Include="oophm.idl">
-      <Filter>Source Files</Filter>
-    </Midl>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\..\..\platform\Win\AllowDialog.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Constants.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="dlldatax.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="dllmain.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="ExceptionCatcher.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\FatalErrorMessage.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IESessionHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IEUtils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="JavaObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="plugin.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\platform\Win\Preferences.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Resource.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="SessionData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="stdafx.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="targetver.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\AllowedConnections.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\BrowserChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\CheckVersionsMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\ChooseTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\Debug.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\DebugLevel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\FreeValueMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\HashMap.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\HostChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\InvokeMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\InvokeSpecialMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\LoadJsniMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\LoadModuleMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\Message.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\Platform.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\ProtocolVersionMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\QuitMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\ReturnMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\ServerMethods.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\SessionHandler.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\Socket.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\SwitchTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\common\Value.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="oophm_i.h">
-      <Filter>Generated Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="oophm.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/ie/oophm/oophm/plugin.bmp b/plugins/ie/oophm/oophm/plugin.bmp
deleted file mode 100644
index 1229764..0000000
--- a/plugins/ie/oophm/oophm/plugin.bmp
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/oophm/oophm/plugin.cpp b/plugins/ie/oophm/oophm/plugin.cpp
deleted file mode 100644
index 9bc4184..0000000
--- a/plugins/ie/oophm/oophm/plugin.cpp
+++ /dev/null
@@ -1,140 +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.
- */
-
-// plugin.cpp : Implementation of Cplugin
-#include "stdafx.h"
-#include "comutil.h"
-#include "plugin.h"
-#include "BrowserChannel.h"
-#include "JavaObject.h"
-#include "HostChannel.h"
-#include "IESessionHandler.h"
-#include "LoadModuleMessage.h"
-#include "ServerMethods.h"
-#include "AllowedConnections.h"
-#include "Preferences.h"
-#include "AllowDialog.h"
-#include "IEUtils.h"
-
-// Cplugin
-
-STDMETHODIMP Cplugin::connect(BSTR burl, BSTR bsessionKey, BSTR bhostedServer,
-    BSTR bmoduleName, BSTR bhostedHtmlVersion, VARIANT_BOOL* ret)
-{
-  LPOLECLIENTSITE site;
-  IOleContainer* container = NULL;
-  IHTMLDocument2* doc = NULL;
-  IHTMLWindow2* window = NULL;
-
-  this->GetClientSite(&site);
-  site->GetContainer(&container);
-  container->QueryInterface(IID_IHTMLDocument2, (void**)&doc);
-  container->Release();
-
-  doc->get_parentWindow(&window);
-  doc->Release();
-
-  std::string url = BSTRToUTF8(burl);
-  Debug::log(Debug::Debugging) << "OOPHM connect(url=" << url << ")" << Debug::flush;
-  Preferences::loadAccessList();
-  bool allowed = false;
-  std::string webHost = AllowedConnections::getHostFromUrl(url);
-  std::string codeSvr = AllowedConnections::getCodeServerFromUrl(url);
-  if (!AllowedConnections::matchesRule(webHost, codeSvr, &allowed)) {
-    bool remember;
-    allowed = AllowDialog::askUserToAllow(&remember);
-    if (remember) {
-      Preferences::addNewRule(webHost + "/" + codeSvr, !allowed);
-    }
-  }
-  if (!allowed) {
-    *ret = false;
-    return S_OK;
-  }
-
-  std::string hostedServer = BSTRToUTF8(bhostedServer);
-  size_t index = hostedServer.find(':');
-  if (index == std::string::npos) {
-    *ret = false;
-    return S_OK;
-  }
-  std::string hostPart = hostedServer.substr(0, index);
-  std::string portPart = hostedServer.substr(index + 1);
-
-  HostChannel* channel = new HostChannel();
-
-  if (!channel->connectToHost(
-    hostPart.c_str(),
-    atoi(portPart.c_str()))) {
-      *ret = false;
-      DWORD  errCode = ::GetLastError();
-      PWCHAR errMsg = IEUtils::GetSysErrorMessage(errCode);
-      SYSLOGERROR(L"GWT Developer Mode plugin failed to connect to code server.",
-          L"URL: %S\nERRORMESSAGE: %sERRORCODE: %d (0x%08X)",
-          url.c_str(), errMsg, errCode, errCode);
-      ::LocalFree(errMsg);
-      return S_OK;
-  }
-
-  sessionHandler.reset(new IESessionHandler(channel, window));
-
-  std::string hostedHtmlVersion = BSTRToUTF8(bhostedHtmlVersion);
-
-  // TODO: add support for a range of protocol versions when we add them
-  if (!channel->init(sessionHandler.get(), BROWSERCHANNEL_PROTOCOL_VERSION,
-      BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersion)) {
-    *ret = false;
-    return S_OK;
-  }
-
-  // Use the current thread ID as a proxy for tab ID.
-  DWORD threadId = GetCurrentThreadId();
-  char buf[20];
-  snprintf(buf, sizeof(buf), "%lu", threadId);
-  std::string tabKey = buf;
-
-  std::string sessionKey = BSTRToUTF8(bsessionKey);
-  std::string moduleName = BSTRToUTF8(bmoduleName);
-  IOmNavigator* navigator;
-  _bstr_t userAgent;
-
-  window->get_navigator(&navigator);
-  navigator->get_userAgent(userAgent.GetAddress());
-
-  LoadModuleMessage::send(*channel, url, tabKey, sessionKey, moduleName,
-      BSTRToUTF8(userAgent), sessionHandler.get());
-
-  navigator->Release();
-
-  *ret = true;
-  return S_OK;
-}
-
-STDMETHODIMP Cplugin::init(IDispatch* jsniContext, VARIANT_BOOL* ret) {
-  Debug::log(Debug::Debugging) << "OOPHM init called" << Debug::flush;
-  *ret = true;
-  return S_OK;
-}
-
-STDMETHODIMP Cplugin::testObject(IDispatch** ret)
-{
-  IJavaObject* toRet;
-  CJavaObject::CreateInstance(&toRet);
-  *ret = toRet;
-  // TODO: Add your implementation code here
-
-  return S_OK;
-}
diff --git a/plugins/ie/oophm/oophm/plugin.h b/plugins/ie/oophm/oophm/plugin.h
deleted file mode 100644
index d508558..0000000
--- a/plugins/ie/oophm/oophm/plugin.h
+++ /dev/null
@@ -1,227 +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.
-*/
-
-// plugin.h : Declaration of the Cplugin
-#pragma once
-#include "resource.h"       // main symbols
-#include <atlctl.h>
-#include "oophm_i.h"
-#include "Debug.h"
-#include "IESessionHandler.h"
-#include "IEUtils.h"
-
-#ifdef _WIN32_WCE
-#error "ATL does not support HTML controls for Windows CE."
-#endif
-class ATL_NO_VTABLE CpluginUI :
-    public IDispatchImpl<IpluginUI, &IID_IpluginUI, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
-    public CComObjectRootEx<CComSingleThreadModel>
-{
-    BEGIN_COM_MAP(CpluginUI)
-        COM_INTERFACE_ENTRY(IpluginUI)
-        COM_INTERFACE_ENTRY(IDispatch)
-    END_COM_MAP()
-    // Iplugin
-public:
-    DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-    HRESULT FinalConstruct()
-    {
-        return S_OK;
-    }
-
-    void FinalRelease()
-    {
-    }
-
-    // Example method called by the HTML to change the <BODY> background color
-    STDMETHOD(OnClick)(IDispatch* pdispBody, VARIANT varColor)
-    {
-        CComQIPtr<IHTMLBodyElement> spBody(pdispBody);
-        if (spBody != NULL)
-            spBody->put_bgColor(varColor);
-        return S_OK;
-    }
-};
-
-
-
-// Cplugin
-class ATL_NO_VTABLE Cplugin :
-    public CComObjectRootEx<CComSingleThreadModel>,
-    public IDispatchImpl<Iplugin, &IID_Iplugin, &LIBID_oophmLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
-    public IPersistStreamInitImpl<Cplugin>,
-    public IOleControlImpl<Cplugin>,
-    public IOleObjectImpl<Cplugin>,
-    public IOleInPlaceActiveObjectImpl<Cplugin>,
-    public IViewObjectExImpl<Cplugin>,
-    public IOleInPlaceObjectWindowlessImpl<Cplugin>,
-    public ISupportErrorInfo,
-    public IPersistStorageImpl<Cplugin>,
-    public ISpecifyPropertyPagesImpl<Cplugin>,
-    public IQuickActivateImpl<Cplugin>,
-    public IObjectSafetyImpl<Cplugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
-#ifndef _WIN32_WCE
-    public IDataObjectImpl<Cplugin>,
-#endif
-    public IProvideClassInfo2Impl<&CLSID_plugin, NULL, &LIBID_oophmLib>,
-#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
-    public IObjectSafetyImpl<Cplugin, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
-#endif
-    public CComCoClass<Cplugin, &CLSID_plugin>,
-    public CComControl<Cplugin>
-{
-public:
-
-
-    Cplugin()
-    {
-        m_bWindowOnly = TRUE;
-    }
-
-    DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
-    OLEMISC_CANTLINKINSIDE |
-        OLEMISC_INSIDEOUT |
-        OLEMISC_ACTIVATEWHENVISIBLE |
-        OLEMISC_SETCLIENTSITEFIRST
-        )
-
-        DECLARE_REGISTRY_RESOURCEID(IDR_PLUGIN)
-
-
-    BEGIN_COM_MAP(Cplugin)
-        COM_INTERFACE_ENTRY(Iplugin)
-        COM_INTERFACE_ENTRY(IDispatch)
-        COM_INTERFACE_ENTRY(IViewObjectEx)
-        COM_INTERFACE_ENTRY(IViewObject2)
-        COM_INTERFACE_ENTRY(IViewObject)
-        COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
-        COM_INTERFACE_ENTRY(IOleInPlaceObject)
-        COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
-        COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
-        COM_INTERFACE_ENTRY(IOleControl)
-        COM_INTERFACE_ENTRY(IOleObject)
-        COM_INTERFACE_ENTRY(IPersistStreamInit)
-        COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
-        COM_INTERFACE_ENTRY(ISupportErrorInfo)
-        COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
-        COM_INTERFACE_ENTRY(IQuickActivate)
-        COM_INTERFACE_ENTRY(IPersistStorage)
-        COM_INTERFACE_ENTRY(IObjectSafety)
-#ifndef _WIN32_WCE
-        COM_INTERFACE_ENTRY(IDataObject)
-#endif
-        COM_INTERFACE_ENTRY(IProvideClassInfo)
-        COM_INTERFACE_ENTRY(IProvideClassInfo2)
-#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
-        COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
-#endif
-    END_COM_MAP()
-
-    BEGIN_PROP_MAP(Cplugin)
-        PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
-        PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
-        // Example entries
-        // PROP_ENTRY_TYPE("Property Name", dispid, clsid, vtType)
-        // PROP_PAGE(CLSID_StockColorPage)
-    END_PROP_MAP()
-
-
-    BEGIN_MSG_MAP(Cplugin)
-        MESSAGE_HANDLER(WM_CREATE, OnCreate)
-        CHAIN_MSG_MAP(CComControl<Cplugin>)
-        DEFAULT_REFLECTION_HANDLER()
-    END_MSG_MAP()
-    // Handler prototypes:
-    //  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
-    //  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
-    //  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
-
-    // ISupportsErrorInfo
-    STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
-    {
-        static const IID* arr[] =
-        {
-            &IID_Iplugin,
-        };
-
-        for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
-        {
-            if (InlineIsEqualGUID(*arr[i], riid))
-                return S_OK;
-        }
-        return S_FALSE;
-    }
-
-    // IViewObjectEx
-    DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
-
-    // Iplugin
-
-    LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
-    {
-        CAxWindow wnd(m_hWnd);
-        wnd.ModifyStyle(0, WS_HSCROLL | WS_VSCROLL);
-        HRESULT hr = wnd.CreateControl(IDH_PLUGIN);
-        if (SUCCEEDED(hr))
-        {
-            CComObject<CpluginUI> *pObject = NULL;
-            hr = CComObject<CpluginUI>::CreateInstance(&pObject);
-            if (SUCCEEDED(hr) && pObject != NULL)
-                hr = wnd.SetExternalDispatch(static_cast<IpluginUI*>(pObject));
-        }
-        if (SUCCEEDED(hr))
-            hr = wnd.QueryControl(IID_IWebBrowser2, (void**)&m_spBrowser);
-        return SUCCEEDED(hr) ? 0 : -1;
-    }
-
-    STDMETHOD(TranslateAccelerator)(LPMSG pMsg)
-    {
-        CComPtr<IOleInPlaceActiveObject> spIOleInPlaceActiveObject;
-
-        HRESULT hr = m_spBrowser->QueryInterface(&spIOleInPlaceActiveObject);
-        if (SUCCEEDED(hr))
-            hr = spIOleInPlaceActiveObject->TranslateAccelerator(pMsg);
-        if (hr != S_OK)
-            hr = IOleInPlaceActiveObjectImpl<Cplugin>::TranslateAccelerator(pMsg);
-
-        return hr;
-    }
-    CComPtr<IWebBrowser2> m_spBrowser;
-
-    DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-    HRESULT FinalConstruct()
-    {
-        IEUtils::InitEventLog();
-        return S_OK;
-    }
-
-    void FinalRelease()
-    {
-        IEUtils::CloseEventLog();
-        Debug::log(Debug::Debugging) << "OOPHM plugin FinalRelease" << Debug::flush;
-    }
-
-    STDMETHOD(connect)(BSTR url, BSTR sessionKey, BSTR hostedServer,
-        BSTR moduleName, BSTR hostedHtmlVersion, VARIANT_BOOL* ret);
-    STDMETHOD(init)(IDispatch* jsniContext, VARIANT_BOOL* ret);
-    STDMETHOD(testObject)(IDispatch** ret);
-private:
-    scoped_ptr<IESessionHandler> sessionHandler;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(plugin), Cplugin)
diff --git a/plugins/ie/oophm/oophm/plugin.htm b/plugins/ie/oophm/oophm/plugin.htm
deleted file mode 100644
index 1dac491..0000000
--- a/plugins/ie/oophm/oophm/plugin.htm
+++ /dev/null
@@ -1,82 +0,0 @@
-<HTML>  
-<HEAD>  
-<TITLE>GWT IE Plugin test page.</TITLE>  
-</HEAD>  
-<BODY>      
-<OBJECT ID="plugin" CLASSID="CLSID:1D6156B6-002B-49E7-B5CA-C138FB843B4E" border="2" width="150" height="150" standby="loading gwt plugin...">
-<div style="color:red; font-family:'Times New Roman'; font-size:20px;">
-<H1>Ooops!!! Failed to load gwt oophm plugin!</H1>
-<a><p>This is was you should have seen...<p>
-<img
-src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANQAAADUCAIAAABrvJpPAAAAAXNSR0IArs4c6QAAAARnQU1B
-AACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAx8SURBVHhe7Z1da1NLF8fzkSy0n8Vz
-ZfsRCuJTiQVBibS5sNRceNMj9UrbXgoiBlTQm5aqeBARxZtaMCSttr4heuA8/8xkv85uurXZ
-mVkz/3VRkpk1s95+nd2kyV61/yjMgKUM1CzZpVlm4D/CRwisZYDwWUs9DRM+MmAtA4TPWupp
-mPCRAWsZIHzWUk/DhI8MWMsA4bOWehomfGTAWgaK4atRmIGTZaAM0YTvZDnm6iMycFL4yqyn
-jscZ+PHjx/v37z98+LC/v/8pJQcHB3iGn7EcHh5+/vy52+0iG5rGMmkZdvKVWU8djzNA+Dwu
-ruuhET7XK+Sxf4TP4+K6Hhrhc71CHvtH+DwuruuhHQUfXvz2ej385Ktd10so179C+Pb29kDe
-hQsX0vzxrRa5VXbUcxM+Td7Zs2cvXrx47dq1mD/C52gJ5bqVg0+Td+7cucXFxZs3b66vr9+6
-dUvzR/jkVtlRz3PwgbOlpaXV1dU7d+602+1Hjx49efLk4cOHGCd8jpZQrluFJx9QywlPPrkl
-dtdzvtXibm2894zweV9idwMkfO7WxnvPCJ/3JXY3QMLnbm2894zweV9idwMkfO7WxnvPxMDX
-arXm5uZmxyuwCLveQ2ArQBnwLTaby8vLnU7n3/EKLMIurNsqj992ZcCHfzbjm0s/f/7EV5jG
-KbAIu7DuNwS2opMBHy62OPLGiV1sC3Zh3VZ5/LYrBr5fv37how3jF9glfBX9DhC+Y3gmfBWR
-h20lwZf+Crt+vDFTfDOFmQ1T9/iRZ1emarX8UsJH+GYBQfqOCvrx+nStNtV4mp142gBDtel1
-U/2YEbUwv47wEb7fgO/Tp0KKjmeR8FXHWeHOYi67eNcDn2jNyRpOvsnG9nHj243J+PKcU+/v
-MJDpRl9tei27G+zyBUdFUEqCD18wycntM4Dv8lZ+eOsyKDpzWw/3dWIlNZOdivT0VDwX7Un4
-KiJP0gsOQFASPkVRhGTmSX+DZCCDaDwVsUj4qoMu2lnSyWd+tUSdaoZMXt6MVfXZmDzv9Tb1
-sdjrGVPxTNoQT77qIBQD3/fv398Z8vdftdrE/IPU+IP5CcD419+DIf3UFCxSU7FiX98cwSDs
-8m++ivjzDT7g0icypsrEMybVmCJ8FUF21LaS4HtryMppnHz1dm68P1o7vaJG23Wcb4PHWi2e
-NaZMXajz5KuOSEnwvTGkD9Kpejs/PuBLD7frp1JKaipaktZTagra7G6Ej/DNAoLS8L3JIDbg
-L/rDL0NXhJwicqXPH+GrDrb8zmJOvm/fvr22IbDLFxwV8SgJvlc2hPBVRJ6kN5kBgQ32XhE+
-wjf79evXlzYEdnnZrYg/MZddQPCPDSF8FZEn6bJL+KqDwNbOYk6+L1++vLAhsMvLbkV0yoAP
-X17c2dnBB02ej1dgEXb51cmg4Ws2m7hb7+7uLs6hcQoswi6sV5T9wLeVcfKhSAsLCziBxnu3
-jFlYhN3AEakufDHwVZcC7mwrA4TPVuZpV8j3dlkoLzPAk8/LssoIivDJqJOXXhI+L8sqIyjC
-J6NOXnpJ+Lwsq4ygCJ+MOnnpJeHzsqwygiJ8MurkpZeEz8uyygiK8Mmok5deEj4vyyojKMIn
-o05eekn4vCyrjKAIn4w6eekl4fOyrDKCInwy6uSll4TPy7LKCIrwyaiTl14SPi/LKiMowiej
-Tl56Sfi8LKuMoMTA12q15ubmxvyl8ZGYg9twXgYO4/VSBnyLzeby8nKn00Hfb3ECt+E8Qhhv
-ZQVYkwEfblvR7XbRDMhKp/sTGoXbcJ53GzJ/G2TAh8sfDrwTQmBxOZznfdYEw4emy8c0pHd4
-mh2jC/8IEHPyET4Bf8T9pouS4DsoJRszmT5/U1eelVpWqRJPPvEn37GN6lWf+tpU42miua46
-iU+vH7u2UgXC5zt8irMCzBSSdvEjfLLhwxsW+8Nku4EeztNrRSqpqcHDNX0eam01NpDJxnZ6
-hyOm+suhmZotNhxvxY7R4uEz29ynRnTf8K2hOoMm9/1G45Ge6lUerVON7+PJo6cGDc4zy5It
-C1wgfF7Dp7gZCoBiIqemnqaRTQaGTO3lQT/WOOETD19viGxq+DIagwNKX1EnL29iMqemKepP
-RBIrDJnq5eeKjGc8IXyy4UO/3bhBfdGDIf3sVeP7ifkHWJbtZK+eFQh0h0y9S+2nPcnuWuAd
-O0b7Dd8wAI6Cz6AoxU05mAnfb76vnFEX8yYzDo+3w2XQtN5UUhMT9TZm2nWcdadXIp3cUwzH
-mwyZUkp6Py2mbs4JnnziTz6zzX1uRDetP1VvJ+NxH3s9qp6mO9mrgXiFQi96dvRUXy1txdg1
-7ynh8x8+VXMFUEr6qGHsCPgiIKMFaTAHrJpThO8kF9tkrZjLLjp+vxYrbFcu++Sz1eb+1SiE
-8BG+UXD0R3sQPtnwodP4S7EC5/lJZsGfZLbV5v6fUQjhE3/yjQIDO3sQPtnwocH4C7EC53nZ
-lXrZxfcOd3Z28KmU5wIFbsN5fnVSKnzNZnNpaWl3dxdHiDiB23AeIYzmnVmPdpHxJjMSvrCw
-gMNjJPevGPMmcBvOe8TMyEIRA9/IIuZGzmSA8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY
-8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY
-8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY8DlTivAcIXzh1dyZiAmfM6UIzxHCF17NnYmY
-8DlTivAcIXzh1dyZiAmfM6UIzxEx8LVarbm5uTF/31ubg11YD4+NyiOWAd9is7m8vNzpdNCy
-e/wCu7AOHyqvRmAGZMCHO050u1308bHSqh52YZ13+hn5r4YM+HDtw4FnhTxtFNZ5j7Nw4bPb
-5p4Nc0dOHjYUc/IRvirKb3dPSfAdGLIxY7btm9mI1frTU1eemet+e4QnXxWYSoLvkyH9zvZT
-jaepcdXTPhoyp80tyo0QPsKXJ6WIrtQY4asCmdHtKebkw/sd+4as4eSbbGxnxlNjycO84nYD
-vaGn16KF6ulA8vspHXZrHh1yyU6S4FON6jOS7zc/6GMfNa5Ppoc1plcNyaMlqmM9WpbnDBE+
-wlcEX/4lR4QRdMvAp2hLrdkzBvpGCV/o8PUM0XRtpsc3NUxqLJnOKyqtM7czOtEuyVyyL+EL
-Gj70S041oR88LOxFnzS8T6bzirGOelAgE/MP0ubYrZnw5fErhO9dPFoCvkTZRDs1QvhCh++t
-If2W3xP1dna8XcdhdnoFg8l0XjHRSR5Fu6hW5Wp9IoQvdPhUF/uM5PvNR03rdU971fHefPim
-XT+lLrSDlvbq6UBNr0meRdYIH+Ergs/4g23AVBa+NzFyijoFXKIY4ZhmMmOL8AUNH5p1v7Yn
-bBUeOnx/1GF+NIsIH+EbDUl/sAvhCxo+NOt+aU/YKjx0+Oy0qFdWCR/hs4Yf4QsaPjQYf2FP
-YJ1fIBo5fzI+UoWvLe7s7ODTJc9tCOzCOr86GSh8zWZzaWlpd3cXJ9D4BXZhHT6MPPuBbyjj
-5EORFhYWcPZYuV0G7MJ64KBUEb4Y+KoInnvazQDhs5v/oK0TvqDLbzd4wmc3/0FbJ3xBl99u
-8ITPbv6Dtk74gi6/3eAJn938B22d8AVdfrvBEz67+Q/aOuELuvx2gyd8dvMftHXCF3T57QZP
-+OzmP2jrhC/o8tsNnvDZzX/Q1glf0OW3Gzzhs5v/oK0TvqDLbzd4wmc3/0FbJ3xBl99u8ITP
-bv6Dtk74gi6/3eAJn938B22d8AVdfrvBEz67+Q/aeg4+3BPH7PODEfS+Ozw8RL/3breLfOmb
-cJdJXLFS+fVlbFBHaAZy8IGz+fn5/yk5f/78pUuXrl+/vr6+jnHCJ7TE7rpdePJdvXq11Wqt
-rq7evXv38ePHPPncrZ9oz8y/+fSV98aNG/fu3dva2tLkoS88Tz7RhXbReQ1fp9P5+PEjCNMC
-2sDc/fv3Y/IIn4vFk+6Thg+QoYM8zrZYwCKOQPyMR/BqA/dl5AsO6RV3yH8Nn4YMeA0RfUdQ
-wudQ8aS7ouHDVTWHHTjTR11OCJ/0ijvkv4bP5Az3/gd2+JkTwudQ8aS7ouEzITtqhPBJr7hD
-/mv4gFR5Gdl/OAr7y3OQGSiTgTK/Q8P+vVbGBnWYgcIM/Dl8ZVZShxk4YQZKffrghDa4nBko
-zADhIxjWMkD4rKWehgkfGbCWAcJnLfU0TPjIgLUMED5rqadhwkcGrGXg/6d8mklbFhfvAAAA
-AElFTkSuQmCC" /></a>
-</div>
-</OBJECT>
-<script>  
-var plugin = document.getElementById("plugin");  
-var b = plugin.connect("this", "sucks");  
-var obj = plugin.testObject();  
-obj.doSomething(42);      
-</script>  
-</BODY>  
-</HTML> 
\ No newline at end of file
diff --git a/plugins/ie/oophm/oophm/plugin.rgs b/plugins/ie/oophm/oophm/plugin.rgs
deleted file mode 100644
index e6f868e..0000000
--- a/plugins/ie/oophm/oophm/plugin.rgs
+++ /dev/null
@@ -1,34 +0,0 @@
-HKCR
-{
-	oophm.plugin.1 = s 'plugin Class'
-	{
-		CLSID = s '{1D6156B6-002B-49E7-B5CA-C138FB843B4E}'
-	}
-	oophm.plugin = s 'plugin Class'
-	{
-		CLSID = s '{1D6156B6-002B-49E7-B5CA-C138FB843B4E}'
-		CurVer = s 'oophm.plugin.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {1D6156B6-002B-49E7-B5CA-C138FB843B4E} = s 'plugin Class'
-		{
-			ProgID = s 'oophm.plugin.1'
-			VersionIndependentProgID = s 'oophm.plugin'
-			ForceRemove 'Programmable'
-			InprocServer32 = s '%MODULE%'
-			{
-				val ThreadingModel = s 'Apartment'
-			}
-			val AppID = s '%APPID%'
-			ForceRemove 'Control'
-			ForceRemove 'ToolboxBitmap32' = s '%MODULE%, 102'
-			'MiscStatus' = s '0'
-			{
-			    '1' = s '%OLEMISC%'
-			}
-			'TypeLib' = s '{9259F105-BE55-4BF6-B7CE-D0AA878C1BA6}'
-			'Version' = s '1.0'
-		}
-	}
-}
diff --git a/plugins/ie/oophm/oophm/pluginUI.htm b/plugins/ie/oophm/oophm/pluginUI.htm
deleted file mode 100644
index 7a017d7..0000000
--- a/plugins/ie/oophm/oophm/pluginUI.htm
+++ /dev/null
@@ -1,11 +0,0 @@
-<HTML>
-<BODY id=theBody>
-<BUTTON onclick='window.external.OnClick(theBody, "red");'>Red</BUTTON>
-<BR>
-<BR>
-<BUTTON onclick='window.external.OnClick(theBody, "green");'>Green</BUTTON>
-<BR>
-<BR>
-<BUTTON onclick='window.external.OnClick(theBody, "blue");'>Blue</BUTTON>
-</BODY>
-</HTML>
diff --git a/plugins/ie/oophm/oophm/resource.h b/plugins/ie/oophm/oophm/resource.h
deleted file mode 100644
index e0ef5a4..0000000
--- a/plugins/ie/oophm/oophm/resource.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by oophm.rc
-//
-#define IDS_PROJNAME                    100
-#define IDR_OOPHM                       101
-#define IDR_PLUGIN                      103
-#define IDD_ALLOW_DIALOG                103
-#define IDH_PLUGIN                      103
-#define IDR_JAVAOBJECT                  105
-#define IDR_EXCEPTIONCATCHER            106
-#define IDC_REMEMBER_CHECKBOX           201
-#define IDC_ALLOW_BUTTON                202
-
-// Next default values for new objects
-// 
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        202
-#define _APS_NEXT_COMMAND_VALUE         32768
-#define _APS_NEXT_CONTROL_VALUE         204
-#define _APS_NEXT_SYMED_VALUE           107
-#endif
-#endif
diff --git a/plugins/ie/oophm/oophm/stdafx.cpp b/plugins/ie/oophm/oophm/stdafx.cpp
deleted file mode 100644
index 39ac1a3..0000000
--- a/plugins/ie/oophm/oophm/stdafx.cpp
+++ /dev/null
@@ -1,21 +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.
- */
-
-// stdafx.cpp : source file that includes just the standard includes
-// oophm.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
diff --git a/plugins/ie/oophm/oophm/stdafx.h b/plugins/ie/oophm/oophm/stdafx.h
deleted file mode 100644
index b60571c..0000000
--- a/plugins/ie/oophm/oophm/stdafx.h
+++ /dev/null
@@ -1,46 +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.
- */
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently
-
-#pragma once
-
-#ifndef STRICT
-#define STRICT
-#endif
-
-#include "targetver.h"
-
-#define _ATL_APARTMENT_THREADED
-#define _ATL_NO_AUTOMATIC_NAMESPACE
-
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS	// some CString constructors will be explicit
-
-#include "resource.h"
-#include <atlbase.h>
-#include <atlcom.h>
-#include <atlctl.h>
-
-// We want to bake GUID defs into the app
-#include "initguid.h"
-
-using namespace ATL;
-
-#include <windows.h>
-#include <stdio.h>
-#include <winevt.h>
diff --git a/plugins/ie/oophm/oophm/targetver.h b/plugins/ie/oophm/oophm/targetver.h
deleted file mode 100644
index e33be6a..0000000
--- a/plugins/ie/oophm/oophm/targetver.h
+++ /dev/null
@@ -1,41 +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.
- */
-
-#pragma once
-
-// The following macros define the minimum required platform.  The minimum required platform
-// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run 
-// your application.  The macros work by enabling all features available on platform versions up to and 
-// including the version specified.
-
-// Modify the following defines if you have to target a platform prior to the ones specified below.
-// Refer to MSDN for the latest info on corresponding values for different platforms.
-#ifndef WINVER                          // Specifies that the minimum required platform is Windows Vista.
-#define WINVER 0x0501           // Change this to the appropriate value to target other versions of Windows.
-#endif
-
-#ifndef _WIN32_WINNT            // Specifies that the minimum required platform is Windows Vista.
-#define _WIN32_WINNT 0x0501     // Change this to the appropriate value to target other versions of Windows.
-#endif
-
-#ifndef _WIN32_WINDOWS          // Specifies that the minimum required platform is Windows 98.
-#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
-#endif
-
-#ifndef _WIN32_IE                       // Specifies that the minimum required platform is Internet Explorer 7.0.
-#define _WIN32_IE 0x0600        // Change this to the appropriate value to target other versions of IE.
-#endif
-
diff --git a/plugins/ie/prebuilt/Win32/oophm.dll b/plugins/ie/prebuilt/Win32/oophm.dll
deleted file mode 100755
index 38973b2..0000000
--- a/plugins/ie/prebuilt/Win32/oophm.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi b/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi
deleted file mode 100755
index 205ee1f..0000000
--- a/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi b/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi
deleted file mode 100755
index 3496298..0000000
--- a/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin.msi b/plugins/ie/prebuilt/gwt-dev-plugin.msi
deleted file mode 100644
index b7e928a..0000000
--- a/plugins/ie/prebuilt/gwt-dev-plugin.msi
+++ /dev/null
Binary files differ
diff --git a/plugins/ie/prebuilt/x64/oophm.dll b/plugins/ie/prebuilt/x64/oophm.dll
deleted file mode 100755
index 2b7d6bb..0000000
--- a/plugins/ie/prebuilt/x64/oophm.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/build.xml b/plugins/npapi/DevModeOptions/build.xml
deleted file mode 100644
index d24a181..0000000
--- a/plugins/npapi/DevModeOptions/build.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<project name="DevModeOptions" default="prebuilt" basedir=".">
-  <!-- Arguments to gwtc and devmode targets -->
-  <property name="gwt.args" value="-style PRETTY" />
-
-  <!-- Configure path to GWT SDK -->
-  <property name="gwt.sdk" location="../../../build/staging/gwt-0.0.0" />
-
-  <path id="project.class.path">
-    <pathelement location="war/WEB-INF/classes"/>
-    <pathelement location="${gwt.sdk}/gwt-user.jar"/>
-    <fileset dir="${gwt.sdk}" includes="gwt-dev*.jar"/>
-    <!-- Add any additional non-server libs (such as JUnit) -->
-    <fileset dir="war/WEB-INF/lib" includes="**/*.jar"/>
-  </path>
-
-  <target name="javac" description="Compile java source to bytecode">
-    <mkdir dir="war/WEB-INF/classes"/>
-    <javac srcdir="java" includes="**" encoding="utf-8"
-        destdir="war/WEB-INF/classes"
-        source="1.5" target="1.5" nowarn="true"
-        debug="true" debuglevel="lines,vars,source">
-      <classpath refid="project.class.path"/>
-    </javac>
-    <copy todir="war/WEB-INF/classes">
-      <fileset dir="java" excludes="**/*.java"/>
-    </copy>
-  </target>
-
-  <target name="gwtc" depends="javac" description="GWT compile to JavaScript (production mode)">
-    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
-      <classpath>
-        <pathelement location="java"/>
-        <path refid="project.class.path"/>
-      </classpath>
-      <!-- add jvmarg -Xss16M or similar if you see a StackOverflowError -->
-      <jvmarg value="-Xmx256M"/>
-      <arg line="-war"/>
-      <arg value="war"/>
-      <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
-      <arg line="${gwt.args}"/>
-      <arg value="com.google.gwt.devmodeoptions.DevModeOptions"/>
-    </java>
-  </target>
-
-  <target name="devmode" depends="javac" description="Run development mode">
-    <java failonerror="true" fork="true" classname="com.google.gwt.dev.DevMode">
-      <classpath>
-        <pathelement location="java"/>
-        <path refid="project.class.path"/>
-      </classpath>
-      <jvmarg value="-Xmx256M"/>
-      <arg value="-startupUrl"/>
-      <arg value="DevModeOptions.html"/>
-      <arg line="-war"/>
-      <arg value="war"/>
-      <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
-      <arg line="${gwt.args}"/>
-      <arg value="com.google.devmodeoptions"/>
-    </java>
-  </target>
-
-  <target name="build" depends="gwtc" description="Build this project">
-  </target>
-
-  <target name="war" depends="build" description="Create a war file">
-    <zip destfile="DevModeOptions.war" basedir="war"/>
-  </target>
-
-  <target name="clean" depends="clean-prebuilt" description="Cleans this project">
-    <delete dir="war/WEB-INF/classes" failonerror="false" />
-    <delete dir="war/DevModeOptions" failonerror="false" />
-  </target>
-
-  <target name="clean-prebuilt" description="Clean the prebuilt copy">
-    <delete file="../prebuilt/gwt-dev-plugin/DevModeOptions.html" />
-    <delete dir="../prebuilt/gwt-dev-plugin/DevModeOptions" />
-  </target>
-
-  <target name="prebuilt" depends="build,clean-prebuilt" description="Copy compiled files into
-    the prebuilt crx directory">
-    <copy todir="../prebuilt/gwt-dev-plugin/DevModeOptions">
-      <fileset dir="war/DevModeOptions" excludes="**/*.java"/>
-    </copy>
-    <copy todir="../prebuilt/gwt-dev-plugin/">
-      <fileset dir="war/">
-        <include name="DevModeOptions.html" />
-      </fileset>
-    </copy>
-  </target>
-</project>
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/DevModeOptions.google.xml b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/DevModeOptions.google.xml
deleted file mode 100644
index 547834c..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/DevModeOptions.google.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<!-- A fragment of DevModeOptions.gwt.xml used by the Google build.
-     This should be kept in sync with DevModeOptions.gwt.xml. -->
-<set-property name='user.agent' value='safari' />
-<add-linker name="direct_install" />
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml
deleted file mode 100644
index 6fa77fd..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 0.0.999//EN" "http://google-web-toolkit.googlecode.com/svn/tags/0.0.999/distro-source/core/src/gwt-module.dtd">
-<module rename-to='DevModeOptions'>
-  <!-- Inherit the core Web Toolkit stuff.                        -->
-  <inherits name='com.google.gwt.user.User' />
-
-  <!-- Specify the app entry point class.                         -->
-  <entry-point class='com.google.gwt.devmodeoptions.client.DevModeOptions'/>
-
-  <!-- Specify the paths for translatable code                    -->
-  <source path='client'/>
-
-<!-- The rest should be kept in sync with DevModeOptions.google.xml -->
-  <set-property name='user.agent' value='safari' />
-  <add-linker name="direct_install" />
-</module>
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptions.java b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptions.java
deleted file mode 100644
index 681a173..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptions.java
+++ /dev/null
@@ -1,236 +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.devmodeoptions.client;
-
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.core.client.JsArray;
-import com.google.gwt.dom.client.StyleInjector;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.uibinder.client.UiBinder;
-import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.user.client.Window.Location;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.FlexTable;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.RadioButton;
-import com.google.gwt.user.client.ui.RootLayoutPanel;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.Widget;
-
-/**
- * The options page for configuring the set of hosts permitted to use the GWT
- * Developer Plugin.
- */
-public class DevModeOptions implements EntryPoint {
-
-  interface Binder extends UiBinder<Widget, DevModeOptions> {
-  }
-
-  private static final DevModeOptionsResources bundle = GWT.create(DevModeOptionsResources.class);
-
-  @UiField
-  Button addBtn;
-
-  @UiField
-  Label errorMessage;
-
-  @UiField
-  TextBox hostname;
-
-  @UiField
-  TextBox codeserver;
-
-  JsArray<HostEntry> hosts;
-
-  @UiField
-  RadioButton includeNo;
-
-  @UiField
-  RadioButton includeYes;
-
-  @UiField
-  FlexTable savedHosts;
-
-  public void onModuleLoad() {
-    StyleInjector.inject(bundle.css().getText(), true);
-    RootLayoutPanel.get().add(
-        GWT.<Binder> create(Binder.class).createAndBindUi(this));
-
-    hosts = HostEntryStorage.get().getHostEntries();
-
-    addBtn.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        addHost(HostEntry.create(hostname.getText() + "/"
-            + getCodeServer(codeserver),
-            includeYes.getValue()));
-      }
-    });
-
-    hostname.setFocus(true);
-    String host = Location.getParameter("host");
-    if (host != null) {
-      hostname.setText(host);
-    }
-
-    String code = Location.getParameter("codeserver");
-    if (code != null) {
-      codeserver.setText(code);
-    } else {
-      //default for users entering through options
-      codeserver.setText("localhost");
-    }
-
-    hostname.addKeyPressHandler(new KeyPressHandler() {
-      public void onKeyPress(KeyPressEvent event) {
-        if (event.getCharCode() == KeyCodes.KEY_ENTER) {
-        addHost(HostEntry.create(hostname.getText() + "/"
-            + getCodeServer(codeserver),
-            includeYes.getValue()));
-        }
-      }
-    });
-
-    codeserver.addKeyPressHandler(new KeyPressHandler() {
-      public void onKeyPress(KeyPressEvent event) {
-        if (event.getCharCode() == KeyCodes.KEY_ENTER) {
-        addHost(HostEntry.create(hostname.getText() + "/"
-            + getCodeServer(codeserver),
-            includeYes.getValue()));
-        }
-      }
-    });
-
-    savedHosts.setText(0, 0, "Web server");
-    savedHosts.setText(0, 1, "Code server");
-    savedHosts.setText(0, 2, "Include/Exclude");
-    savedHosts.setText(0, 3, "Remove");
-    savedHosts.getCellFormatter().addStyleName(0, 0,
-        bundle.css().savedHostsHeading());
-    savedHosts.getCellFormatter().addStyleName(0, 0, bundle.css().textCol());
-
-    savedHosts.getCellFormatter().addStyleName(0, 1,
-        bundle.css().savedHostsHeading());
-    savedHosts.getCellFormatter().addStyleName(0, 1, bundle.css().textCol());
-
-    savedHosts.getCellFormatter().addStyleName(0, 2,
-        bundle.css().savedHostsHeading());
-
-    savedHosts.getCellFormatter().addStyleName(0, 3,
-        bundle.css().savedHostsHeading());
-
-    for (int i = 0; i < hosts.length(); i++) {
-      displayHost(hosts.get(i));
-    }
-  }
-
-  private void addHost(final HostEntry newHost) {
-    if (newHost.getUrl().length() == 0) {
-      return;
-    }
-
-    boolean alreadyExists = false;
-    for (int i = 0; i < hosts.length() && !alreadyExists; i++) {
-      if (hosts.get(i).isEqual(newHost)) {
-        alreadyExists = true;
-      }
-    }
-
-    if (alreadyExists) {
-      error("Cannot add duplicate host entry for " + newHost.getUrl());
-      return;
-    } else {
-      hosts.push(newHost);
-      clearError();
-    }
-    HostEntryStorage.get().saveEntries(hosts);
-
-    displayHost(newHost);
-
-    codeserver.setText("");
-    hostname.setText("");
-    hostname.setFocus(true);
-  }
-
-  private void clearError() {
-    errorMessage.setText("");
-  }
-
-  private void displayHost(final HostEntry newHost) {
-    int numRows = savedHosts.getRowCount();
-    int col = 0;
-    
-    String[] names = newHost.getUrl().split("/");
-   
-    savedHosts.insertRow(numRows);
-    savedHosts.setText(numRows, col++, names[0]);
-    savedHosts.setText(numRows, col++, names.length > 1 ? names[1] 
-        : "localhost");
-    savedHosts.setText(numRows, col++, newHost.include() ? "Include"
-        : "Exclude");
-    if (newHost.include()) {
-      savedHosts.getCellFormatter().addStyleName(numRows, 0,
-          bundle.css().include());
-      savedHosts.getCellFormatter().addStyleName(numRows, 1,
-          bundle.css().include());
-      savedHosts.getCellFormatter().addStyleName(numRows, 2,
-          bundle.css().include());
-    } else {
-      savedHosts.getCellFormatter().addStyleName(numRows, 0,
-          bundle.css().exclude());
-      savedHosts.getCellFormatter().addStyleName(numRows, 1,
-          bundle.css().exclude());
-      savedHosts.getCellFormatter().addStyleName(numRows, 2,
-          bundle.css().exclude());
-    }
-
-    Button removeHostButton = new Button("x");
-    removeHostButton.addClickHandler(new ClickHandler() {
-      public void onClick(ClickEvent event) {
-        removeHost(newHost);
-      }
-    });
-    savedHosts.setWidget(numRows, col, removeHostButton);
-  }
-
-  private void error(String text) {
-    errorMessage.setText(text);
-  }
-
-  private void removeHost(HostEntry host) {
-    JsArray<HostEntry> newHosts = JavaScriptObject.createArray().cast();
-    for (int index = 0; index < hosts.length(); index++) {
-      if (hosts.get(index).isEqual(host)) {
-        savedHosts.removeRow(index + 1);
-      } else {
-        newHosts.push(hosts.get(index));
-      }
-    }
-
-    hosts = newHosts;
-    HostEntryStorage.get().saveEntries(hosts);
-  }
-
-  private String getCodeServer(TextBox box) {
-    return (box.getText().length() > 0) ? box.getText() : "localhost";
-  }
-
-}
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml
deleted file mode 100644
index 1833223..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml
+++ /dev/null
@@ -1,75 +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   -->
-<!-- may obtain a copy of the License at                                    -->
-<!--                                                                        -->
-<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
-<!--                                                                        -->
-<!-- Unless required by applicable law or agreed to in writing, software    -->
-<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
-<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
-<!-- implied. License for the specific language governing permissions and   -->
-<!-- limitations under the License.                                         -->
-
-<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
-<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
-	xmlns:g="urn:import:com.google.gwt.user.client.ui">
-	<ui:with field='res'
-		type='com.google.gwt.devmodeoptions.client.DevModeOptionsResources' />
-	<g:HTMLPanel styleName="{res.css.mainPanel}">
-		<div>
-			<g:HorizontalPanel>
-				<g:Image resource='{res.gwt64}' styleName="{res.css.logo}" />
-				<g:HTML>
-					<h1> GWT Developer Plugin Options </h1>
-				</g:HTML>
-			</g:HorizontalPanel>
-
-			<g:Label styleName="{res.css.explanation}">
-				The GWT Developer Plugin will open a TCP/IP connection to an arbitrary
-				host/port at the request of a web page. To minimize security risks,
-				by default it will only connect to the local machine. To allow
-				cross-machine debugging, you can add exceptions here -- include the
-				exact host name of the web and code servers you will use for debugging, 
-				but do not include any you do not trust.</g:Label>
-
-			<g:Label ui:field="errorMessage" styleName="{res.css.errorMessage}"/>
-
-			<g:Grid>
-				<g:row>
-					<g:customCell>
-						<g:Label styleName="{res.css.important}">Web server</g:Label>
-					</g:customCell>
-					<g:customCell>
-						<g:Label styleName="{res.css.important}">Code server</g:Label>
-					</g:customCell>
-				</g:row>
-				<g:row>
-					<g:customCell>
-					<g:TextBox ui:field="hostname" styleName="{res.css.textBox}" />
-					</g:customCell>
-
-					<g:customCell>
-					<g:TextBox ui:field="codeserver" styleName="{res.css.textBox}" />
-					</g:customCell>
-
-					<g:customCell>
-					<g:Button styleName="{res.css.important}" ui:field="addBtn">Add</g:Button>
-					</g:customCell>
-
-					<g:customCell>
-					<g:RadioButton name="include" ui:field="includeYes"
-						checked="true">Include</g:RadioButton>
-					</g:customCell>
-					<g:customCell>
-					<g:RadioButton name="include" ui:field="includeNo">Exclude</g:RadioButton>
-					</g:customCell>
-				</g:row>
-			</g:Grid>
-
-			<g:FlexTable ui:field="savedHosts" styleName="{res.css.savedHosts}">
-			</g:FlexTable>
-		</div>
-	</g:HTMLPanel>
-
-</ui:UiBinder> 
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java
deleted file mode 100644
index 3f17ced..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.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.devmodeoptions.client;
-
-import com.google.gwt.resources.client.ClientBundle;
-import com.google.gwt.resources.client.CssResource;
-import com.google.gwt.resources.client.ImageResource;
-
-public interface DevModeOptionsResources extends ClientBundle {
-  
-  public interface Css extends CssResource {  
-    String errorMessage();
-  
-    String exclude();
-    
-    String explanation();
-    
-    String header();
-    
-    String important();
-    
-    String include();
-    
-    String logo();
-    
-    String mainPanel();
-    
-    String savedHosts();
-    
-    String savedHostsHeading();
-    
-    String textBox();
-    
-    String textCol();
-  }
-  
-  @Source("com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css")
-  Css css();
-
-  @Source("com/google/gwt/devmodeoptions/client/resources/gwt128.png")
-  ImageResource gwt128();
-
-  @Source("com/google/gwt/devmodeoptions/client/resources/gwt16.png")
-  ImageResource gwt16();
-
-  @Source("com/google/gwt/devmodeoptions/client/resources/gwt32.png")
-  ImageResource gwt32();
-
-  @Source("com/google/gwt/devmodeoptions/client/resources/gwt48.png")
-  ImageResource gwt48();
-
-  @Source("com/google/gwt/devmodeoptions/client/resources/gwt64.png")
-  ImageResource gwt64();
-  
-  @Source("com/google/gwt/devmodeoptions/client/resources/warning.png")
-  ImageResource warning();
-}
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/HostEntry.java b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/HostEntry.java
deleted file mode 100644
index 672a783..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/HostEntry.java
+++ /dev/null
@@ -1,51 +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.devmodeoptions.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-
-public class HostEntry extends JavaScriptObject{  
-  
-  protected HostEntry() {}
-  
-  public static HostEntry create(String url, boolean include) {
-    HostEntry entry = JavaScriptObject.createObject().cast();
-    entry.setUrl(url);
-    entry.setInclude(include);
-    return entry;
-  }
-    
-  public final native String getUrl() /*-{
-    return this.url;
-  }-*/;
-  
-  public final native void setUrl(String url) /*-{
-    this.url = url;
-  }-*/;
-  
-  public final native void setInclude(boolean include) /*-{
-    this.include = include;
-  }-*/;
-  
-  public final native boolean include() /*-{
-    return this.include;
-  }-*/;
-
-  public final boolean isEqual(HostEntry host) {
-    return this.getUrl().equals(host.getUrl());
-  }
-}
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/HostEntryStorage.java b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/HostEntryStorage.java
deleted file mode 100644
index 6a7ddc0..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/HostEntryStorage.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.devmodeoptions.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.core.client.JsArray;
-
-public class HostEntryStorage {
-  private static HostEntryStorage singleton = new HostEntryStorage();
-  private static final String HOST_ENTRY_KEY = "GWT_DEV_HOSTENTRY";
-  
-  public static HostEntryStorage get() {
-    return singleton;
-  }
-  
-  private final LocalStorage localStorage;
-  
-  private HostEntryStorage() {
-    localStorage = getLocalStorage();
-  }
-
-  private static native LocalStorage getLocalStorage() /*-{
-    return $wnd.localStorage;
-  }-*/;
-  
-  public JsArray<HostEntry> getHostEntries() {
-    JsArray<HostEntry> entries = localStorage.getItem(HOST_ENTRY_KEY).cast();
-    if (entries == null) {
-      return JavaScriptObject.createArray().cast();
-    } else {
-      return entries;
-    }
-  }
-  
-  public void saveEntries(JsArray<HostEntry> entries) {
-    localStorage.setItem(HOST_ENTRY_KEY, entries.cast());
-  }
-  
-}
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/LocalStorage.java b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/LocalStorage.java
deleted file mode 100644
index 9e6a6c2..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/LocalStorage.java
+++ /dev/null
@@ -1,62 +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.devmodeoptions.client;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-/**
- * Simple wrapper around HTML5 <a
- * href="http://dev.w3.org/html5/webstorage/#the-localstorage-attribute">local
- * storage</a> API.
- */
-public class LocalStorage extends JavaScriptObject {
-  protected LocalStorage() {
-  }
-
-  public final native void clear() /*-{
-    this.clear();
-  }-*/;
-
-  public final native JavaScriptObject getItem(String key) /*-{
-    return JSON.parse(this.getItem(key));
-  }-*/;
-
-  public final native String getKey(int index) /*-{
-    return this.key(index);
-  }-*/;
-
-  public final native int getLength() /*-{
-    return this.length;
-  }-*/;
-
-  public final native String getStringItem(String key) /*-{
-    return this.getItem(key);
-  }-*/;
-
-  public final native void removeItem(String key) /*-{
-    this.removeItem(key);
-  }-*/;
-
-  public final native void setItem(String key, JavaScriptObject dataObject) /*-{
-    // Note, as of FF3.6, gecko does not support storing an object (only strings).
-    this.setItem(key, JSON.stringify(dataObject));
-  }-*/;
-
-  public final native void setStringItem(String key, String dataString) /*-{
-    this.setItem(key, dataString);
-  }-*/;
-}
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css
deleted file mode 100644
index 51d8605..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css
+++ /dev/null
@@ -1,72 +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.
- */
-@def TEXTWIDTH 30em;
-.savedHostsHeading {
-  font-weight: bold;
-}
-
-.savedHosts {
-  border: 2px solid silver;
-  padding: 2px;
-  margin-top: 1.5em;
-}
-
-.include {
-  color: blue;
-}
-
-.exclude {
-  color: IndianRed;
-}
-
-.errorMessage {
-  color: red;
-  font-weight: bold;
-}
-
-.important {
-  font-weight: bold;
-}
-
-.header {
-  font-size: large;
-  font-weight: bold;
-}
-
-.textBox {
-  width: 15em;
-}
-
-.textCol {
-  width: TEXTWIDTH;
-}
-
-.logo {
-  margin-right: 1em;
-}
-
-.mainPanel {
-  margin-left: 2em;
-  margin-top: 2em;
-  font-family: sans-serif;
-  font-size: small;
-  max-width: 50em;
-}
-
-.explanation {
-  margin-top: 1.5em;
-  margin-bottom: 1.5em;
-}
\ No newline at end of file
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt128.png b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt128.png
deleted file mode 100644
index 57e8e01..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt128.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt16.png b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt16.png
deleted file mode 100644
index f26096e..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt16.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt32.png b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt32.png
deleted file mode 100644
index 7ba8270..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt32.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt48.png b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt48.png
deleted file mode 100644
index e8a4172..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt48.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt64.png b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt64.png
deleted file mode 100644
index 922cc88..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/gwt64.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/warning.png b/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/warning.png
deleted file mode 100644
index 55a203b..0000000
--- a/plugins/npapi/DevModeOptions/java/com/google/gwt/devmodeoptions/client/resources/warning.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/war/DevModeOptions.html b/plugins/npapi/DevModeOptions/war/DevModeOptions.html
deleted file mode 100644
index d2132e8..0000000
--- a/plugins/npapi/DevModeOptions/war/DevModeOptions.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!doctype html>
-<html>
-  <head>
-    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-    
-    <title>GWT DevMode Options</title>
-    <script type="text/javascript" language="javascript" src="DevModeOptions/DevModeOptions.nocache.js"></script>
-  </head>
-
-  <body>
-  </body>
-</html>
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/classes/marker b/plugins/npapi/DevModeOptions/war/WEB-INF/classes/marker
deleted file mode 100644
index e69de29..0000000
--- a/plugins/npapi/DevModeOptions/war/WEB-INF/classes/marker
+++ /dev/null
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker b/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker
deleted file mode 100644
index e69de29..0000000
--- a/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker
+++ /dev/null
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml b/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml
deleted file mode 100644
index bd4f348..0000000
--- a/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xmlns="http://java.sun.com/xml/ns/javaee"
-xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
-</web-app>
diff --git a/plugins/npapi/JavaObject.cpp b/plugins/npapi/JavaObject.cpp
deleted file mode 100644
index adbdbc8..0000000
--- a/plugins/npapi/JavaObject.cpp
+++ /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.
- */
-
-#include "Debug.h"
-
-#include "JavaObject.h"
-#include "Plugin.h"
-#include "NPVariantUtil.h"
-#include "NPVariantWrapper.h"
-
-using std::string;
-
-static string IdentifierName(NPIdentifier name) {
-  string iname;
-  if (NPN_IdentifierIsString(name)) {
-    iname = NPN_UTF8FromIdentifier(name);
-  } else {
-    char buf[50];
-    snprintf(buf, sizeof(buf), "%d", NPN_IntFromIdentifier(name));
-    iname = buf;
-  }
-  return iname;
-}
-
-JavaObject* JavaObject::create(ScriptableInstance* plugin, int id) {
-  Debug::log(Debug::Spam) << "Creating Java object id=" << id;
-  NPClass* npClass = GetNPClass<JavaObject>();
-  NPObject* obj = NPN_CreateObject(plugin->getNPP(), npClass);
-  Debug::log(Debug::Spam) << " addr=" << obj << Debug::flush;
-  JavaObject* jObj = static_cast<JavaObject*>(obj);
-  jObj->setObjectId(id);
-  return jObj;
-}
-
-bool JavaObject::isInstance(NPObject* obj) {
-  return obj->_class == GetNPClass<JavaObject>();
-}
-
-JavaObject::~JavaObject() {
-  if (plugin) {
-    plugin->destroyJavaWrapper(this);
-  } else {
-    Debug::log(Debug::Spam) << "Destroying JavaObject " << objectId << " after plugin destroyed"
-        << Debug::flush;
-  }
-}
-
-bool JavaObject::enumeration(NPIdentifier** propReturn, uint32_t* count) {
-  Debug::log(Debug::Debugging) << "JavaObject::enumeration(" << objectId << ")"
-      << Debug::flush;
-  int n = 1;
-  NPIdentifier* props = static_cast<NPIdentifier*>(NPN_MemAlloc(sizeof(NPIdentifier) * n));
-  props[0] = idID;
-  *propReturn = props;
-  *count = n;
-  return true;
-}
-
-bool JavaObject::getProperty(NPIdentifier prop, NPVariant *result) {
-  if (!plugin) {
-    Debug::log(Debug::Spam) << "Ignoring getProperty on " << objectId << " after plugin destroyed"
-        << Debug::flush;
-    VOID_TO_NPVARIANT(*result);
-    return true;
-  }
-  Debug::log(Debug::Spam) << "JavaObject::getProperty(" << objectId << ")" << Debug::flush;
-  if (NPN_IdentifierIsString(prop)) {
-    if (prop == plugin->toStringID) {
-      return plugin->JavaObject_getToStringTearOff(result);
-    }
-    if (prop == idID) {
-      INT32_TO_NPVARIANT(objectId, *result);
-      return true;
-    }
-    // all other properties are numeric dispatchIDs
-    return false;
-  }
-  int dispId = NPN_IntFromIdentifier(prop);
-  // JavaObject_getProperty will retain the return value if needed.
-  return plugin->JavaObject_getProperty(objectId, dispId, result);
-}
-
-bool JavaObject::hasMethod(NPIdentifier method) {
-  if (!plugin) {
-    Debug::log(Debug::Spam) << "Ignoring hasMethod on " << objectId << " after plugin destroyed"
-        << Debug::flush;
-    return true;
-  }
-  Debug::log(Debug::Spam) << "JavaObject::hasMethod(" << objectId << ", method="
-      << IdentifierName(method) << ")" << Debug::flush;
-  return false;
-//  return !NPN_IdentifierIsString(method);
-}
-
-bool JavaObject::hasProperty(NPIdentifier prop) {
-  if (!plugin) {
-    Debug::log(Debug::Spam) << "Ignoring hasProperty on " << objectId << " after plugin destroyed"
-        << Debug::flush;
-    return true;
-  }
-  Debug::log(Debug::Spam) << "JavaObject::hasProperty(" << objectId << ", prop="
-      << IdentifierName(prop) << ")" << Debug::flush;
-  return !NPN_IdentifierIsString(prop) || prop == idID || prop == plugin->toStringID;
-}
-
-bool JavaObject::invokeDefault(const NPVariant *args, uint32_t argCount, NPVariant *result) {
-  if (argCount < 2 || !NPVariantUtil::isInt(args[0])
-      || (!NPVariantUtil::isNull(args[1]) && !NPVariantUtil::isObject(args[1]))) {
-    Debug::log(Debug::Error) << "incorrect arguments to invokeDefault" << Debug::flush;
-    return false;
-  }
-  if (!plugin) {
-    Debug::log(Debug::Spam) << "Ignoring invokeDefault on " << objectId << " after plugin destroyed"
-        << Debug::flush;
-    VOID_TO_NPVARIANT(*result);
-    return true;
-  }
-  Debug::log(Debug::Debugging) << "JavaObject::invokeDefault(" << objectId;
-  for (uint32_t i = 0; i < argCount; ++i) {
-    Debug::log(Debug::Debugging) << ", " << NPVariantProxy::toString(args[i]);
-  }
-  Debug::log(Debug::Debugging) << ")" << Debug::flush;
-  int dispId = NPVariantUtil::getAsInt(args[0]);
-  int objId = objectId;
-  if (!NPVariantUtil::isNull(args[1])) {
-    NPObject* thisObj = NPVariantUtil::getAsObject(args[1]);
-    if (isInstance(thisObj)) {
-      JavaObject* thisJavaObj = static_cast<JavaObject*>(thisObj);
-      objId = thisJavaObj->objectId;
-    }
-  }
-  // JavaObject_invoke will retain the return value if needed.
-  return plugin->JavaObject_invoke(objId, dispId, args + 2, argCount - 2, result);
-}
-
-bool JavaObject::invoke(NPIdentifier name, const NPVariant *args,
-    uint32_t argCount, NPVariant *result) {
-  VOID_TO_NPVARIANT(*result);
-  if (!plugin) {
-    Debug::log(Debug::Spam) << "Ignoring invoke on " << objectId << " after plugin destroyed"
-        << Debug::flush;
-    return true;
-  }
-  string methodName(NPN_UTF8FromIdentifier(name));
-  Debug::log(Debug::Spam) << "JavaObject::invoke(" << objectId << ", method="
-      << methodName << ")" << Debug::flush;
-  if (name == plugin->toStringID) {
-    // -1 is magic and means a raw toString().
-    return plugin->JavaObject_invoke(objectId, -1, args, argCount, result);
-  }
-  // toString is the only method we support invoking directly on a Java wrapper
-  return false;
-}
-
-bool JavaObject::setProperty(NPIdentifier prop, const NPVariant *value) {
-  if (!plugin) {
-    Debug::log(Debug::Spam) << "Ignoring setProperty on " << objectId << " after plugin destroyed"
-        << Debug::flush;
-    return true;
-  }
-  Debug::log(Debug::Spam) << "JavaObject::setProperty(" << objectId << ", val="
-      << NPVariantProxy::toString(*value) << ")" << Debug::flush;
-  if (NPN_IdentifierIsString(prop)) {
-    // any non-numeric properties are read-only
-    return false;
-  }
-  int dispId = NPN_IntFromIdentifier(prop); 
-  return plugin->JavaObject_setProperty(objectId, dispId, value);
-}
diff --git a/plugins/npapi/JavaObject.h b/plugins/npapi/JavaObject.h
deleted file mode 100644
index c5dc310..0000000
--- a/plugins/npapi/JavaObject.h
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef JAVAOBJECT_H_
-#define JAVAOBJECT_H_
-/*
- * 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.
- */
-
-#include <string>
-#include <vector>
-
-#include "mozincludes.h"
-#include "Plugin.h"
-#include "ScriptableInstance.h"
-#include "Debug.h"
-#include "HashMap.h"
-
-class JavaObject : public NPObjectWrapper<JavaObject> {
-  friend class ScriptableInstance;
-private:
-  ScriptableInstance* plugin;
-  int objectId;
-  
-  NPIdentifier idID;
-
-public:
-  JavaObject(NPP npp) : NPObjectWrapper<JavaObject>(npp),
-      plugin(reinterpret_cast<Plugin*>(npp->pdata)->getScriptableInstance()),
-      idID(NPN_GetStringIdentifier("id")) {}
-  virtual ~JavaObject();
-  static JavaObject* create(ScriptableInstance* plugin, int id);
-  static bool isInstance(NPObject* obj);
-  
-  virtual bool enumeration(NPIdentifier** names, uint32_t* count);
-  virtual bool hasMethod(NPIdentifier name);
-  virtual bool invoke(NPIdentifier name, const NPVariant *args, uint32_t num_args,
-      NPVariant *result);
-  virtual bool invokeDefault(const NPVariant *args, uint32_t num_args, NPVariant *result);
-  virtual bool hasProperty(NPIdentifier name);
-  virtual bool getProperty(NPIdentifier name, NPVariant *result);
-  virtual bool setProperty(NPIdentifier name, const NPVariant *value);
-  
-  void setObjectId(int objectId) {
-    this->objectId = objectId;
-  }
-
-  int getObjectId() const {
-    return objectId;
-  }
-private:
-  // Called by a Plugin instance when it is about to be destroyed.
-  void disconnectPlugin() {
-    plugin = 0;
-  }
-};
-
-#endif /*JAVAOBJECT_H_*/
diff --git a/plugins/npapi/LocalObjectTable.cpp b/plugins/npapi/LocalObjectTable.cpp
deleted file mode 100644
index a450381..0000000
--- a/plugins/npapi/LocalObjectTable.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-#include "mozincludes.h"
-#include "LocalObjectTable.h"
-
-LocalObjectTable::~LocalObjectTable() {
-  if (!dontFree) {
-    freeAll();
-  }
-}
diff --git a/plugins/npapi/LocalObjectTable.h b/plugins/npapi/LocalObjectTable.h
deleted file mode 100644
index 57a5887..0000000
--- a/plugins/npapi/LocalObjectTable.h
+++ /dev/null
@@ -1,183 +0,0 @@
-#ifndef H_LocalObjectTable
-#define H_LocalObjectTable
-/*
- * 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.
- */
-
-#include <map>
-
-#include "Debug.h"
-
-#include "mozincludes.h"
-#include "NPVariantUtil.h"
-
-class LocalObjectTable {
-private:
-  /* The host expects Value objects to have int's for JSO id's, hence the
-   * dual mapping.  ObjectMap is for host communication (Value.getJsObjectId)
-   * and the IdMap is for browser communication (NPObject to ID).
-   */
-  typedef std::map<int, NPObject*> ObjectMap;
-  typedef std::map<NPObject*,int> IdMap;
-
-  NPP npp;
-
-  int nextId;
-  ObjectMap objects;
-  IdMap ids;
-  bool dontFree;
-
-  bool jsIdentitySafe;
-
-  const NPIdentifier gwtId;
-
-  void setFree(int id) {
-    NPObject *obj = getById(id);
-    if(!obj) {
-      Debug::log(Debug::Error) << "setFree(id=" << id << "): object not in table"
-        << Debug::flush;
-      return;
-    }
-    ids.erase(obj);
-    objects.erase(id);
-  }
-
-public:
-  LocalObjectTable(NPP npp, bool jsIdentitySafe):
-    nextId(0), dontFree(false), jsIdentitySafe(jsIdentitySafe),
-    gwtId(NPN_GetStringIdentifier("__gwt_ObjectId")) {
-  }
-
-  virtual ~LocalObjectTable();
-
-  /**
-   * Add a new object, which must not be in the table, and return a new id for it.
-   */
-  int add(NPObject* obj) {
-    int id = nextId++;
-    set(id, obj);
-
-    if (!jsIdentitySafe) {
-      NPVariant idVariant;
-      Debug::log(Debug::Debugging) << "LocalObjectTable::set(): setting expando("
-          << id << ")" << Debug::flush;
-      INT32_TO_NPVARIANT(id,idVariant);
-      if (!NPN_SetProperty(npp, obj, gwtId, &idVariant)) {
-        Debug::log(Debug::Error) << "Setting GWT id on object failed" << Debug::flush;
-      }
-    }
-
-    return id;
-  }
-
-  void set(int id, NPObject* obj) {
-    Debug::log(Debug::Debugging) << "LocalObjectTable::set(id=" << id << ",obj=" << (void*)obj
-        << ")" << Debug::flush;
-    if (!jsIdentitySafe) {
-      ObjectMap::iterator it;
-      it = objects.find(id);
-      if( it != objects.end() ) {
-        if (it->second != obj) {
-          //The JSO has changed and we need to update the map, releasing
-          //the old and remembering the new object.
-          ids.erase(it->second);
-          NPN_ReleaseObject(it->second);
-          NPN_RetainObject(obj);
-        } else {
-          //do nothing; object exists and is already mapped
-          return;
-        }
-      } else {
-        //New insertion, retain the object in the table
-        NPN_RetainObject(obj);
-      }
-    } else {
-      //Not dealing with identity hack, retain
-      NPN_RetainObject(obj);
-    }
-    objects[id] = obj;
-    ids[obj] = id;
-
-    // keep track that we hold a reference in the table
-  }
-
-  void free(int id) {
-    Debug::log(Debug::Debugging) << "LocalObjectTable::free(id=" << id << ")" << Debug::flush;
-    ObjectMap::iterator it = objects.find(id);
-    if (it == objects.end()) {
-      Debug::log(Debug::Error) << "Freeing freed object slot " << id << Debug::flush;
-      return;
-    }
-    if (!jsIdentitySafe) {
-      Debug::log(Debug::Debugging) << "removing expando!" << Debug::flush;
-      NPN_RemoveProperty(npp, it->second, gwtId);
-    }
-    setFree(id);
-    if (!dontFree) {
-      NPObject* obj = it->second;
-      NPN_ReleaseObject(obj);
-    }
-  }
-
-  void freeAll() {
-    Debug::log(Debug::Info) << "LocalObjectTable::freeAll()" << Debug::flush;
-    for (ObjectMap::const_iterator it = objects.begin(); it != objects.end(); ++it) {
-      NPObject* obj = it->second;
-      if (!dontFree) {
-        NPN_ReleaseObject(obj);
-      }
-    }
-    objects.clear();
-  }
-
-  NPObject* getById(int id) {
-    ObjectMap::iterator it = objects.find(id);
-    if (it == objects.end()) {
-      Debug::log(Debug::Error) << "LocalObjectTable::get(id=" << id
-          << "): no object found" << Debug::flush;
-    }
-    return it->second;
-  }
-
-  int getObjectId(NPObject* jsObject) {
-    int id = -1;
-    if(!jsIdentitySafe) {
-      NPVariant idVariant;
-      VOID_TO_NPVARIANT(idVariant);
-      Debug::log(Debug::Debugging) << "LocalObjectTable::get(): expando test"
-          << Debug::flush;
-      if (NPN_GetProperty(npp, jsObject, gwtId, &idVariant) &&
-          NPVariantUtil::isInt(idVariant)) {
-        id = NPVariantUtil::getAsInt(idVariant);
-        Debug::log(Debug::Debugging) << "LocalObjectTable::get(): expando: "
-            << id << Debug::flush;
-        set(id, jsObject);
-      }
-      NPN_ReleaseVariantValue(&idVariant);
-    } else {
-      IdMap::iterator it = ids.find(jsObject);
-      if (it != ids.end()) {
-        id = it->second;
-      }
-    }
-    return id;
-  }
-
-  void setDontFree(bool dontFree) {
-    this->dontFree = dontFree;
-  }
-};
-
-#endif
diff --git a/plugins/npapi/Makefile b/plugins/npapi/Makefile
deleted file mode 100644
index d6224b4..0000000
--- a/plugins/npapi/Makefile
+++ /dev/null
@@ -1,204 +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.
-
-ifeq ($(shell uname),Darwin)
-# We seem to be using 32-bit plugins on the Mac, so compile this way even if host is 64-bit.
-ARCH=x86
-endif
-
-include ../config.mk
-
-ifeq ($(OS),mac)
-RUN_PATH_FLAG = -executable_path
-DLL_SUFFIX = .dylib
-DLLFLAGS = -bundle $(ARCHCFLAGS) -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk
-CFLAGS += -DXP_MACOSX $(ARCHCFLAGS)
-CXXFLAGS += -DXP_MACOSX $(ARCHCFLAGS)
-# Mac puts multiple architectures into the same files
-TARGET_PLATFORM = Darwin-gcc3
-CHROME_PATH ?= /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
-PLATFORM_DIR_SUFFIX = gwtDev.plugin/Contents/MacOS/
-else
-ifeq ($(OS),linux)
-RUN_PATH_FLAG = -rpath-link
-DLL_SUFFIX = .so
-DLLFLAGS = -shared -m$(FLAG32BIT)
-TARGET_PLATFORM = Linux_$(ARCH)-gcc3
-CHROME_PATH ?= /opt/google/chrome/chrome
-else
-endif
-endif
-
-
-export FLAG32BIT
-
-CFLAGS += -DBROWSER_NPAPI -DXP_UNIX -fshort-wchar
-CXXFLAGS = $(CXXONLYFLAGS) $(CFLAGS)
-DIR = $(shell pwd)
-
-DEPEND = g++ -MM -MT'$$(OBJ_OUTDIR)/$(patsubst %.cpp,%.o,$(src))' \
-  -I. -I../common $(src)
-
-COMMON            = ../common/libcommon$(FLAG32BIT).a
-
-OBJ_OUTDIR        = build/$(TARGET_PLATFORM)
-EXTENSION_OUTDIR  = prebuilt/gwt-dev-plugin
-EXTENSION_FILES = *.html *.js *.json *.png *.txt \
-  DevModeOptions/*.gif DevModeOptions/*.js DevModeOptions/*.txt \
-  Linux*/*.so WIN*/*.dll Darwin*/*/*/*.plist Darwin*/*/*/*/*.dylib
-PLATFORM_DIR      = $(EXTENSION_OUTDIR)/$(TARGET_PLATFORM)
-PLATFORM_DIR_SUFFIX ?= ""
-
-DLL               = $(OBJ_OUTDIR)/libGwtDevPlugin$(DLL_SUFFIX)
-#DLLFLAGS +=
-
-VERSION ?= 1.0.$(shell ./getversion)
-ifeq ($(VERSION), 1.0.)
-$(error You must specify the version if you are not in an svn checkout)
-endif
-
-.PHONY: default all zip lib common clean depend install install-platform \
-	versioned-files devmodeoptions
-
-default:: lib versioned-files devmodeoptions
-
-all:: common lib install-platform zip
-
-lib:: $(OBJ_OUTDIR) $(EXTENSION_OUTDIR) $(DLL)
-zip:: $(EXTENSION_OUTDIR)
-	(cd $(EXTENSION_OUTDIR); zip ../gwt-dev-plugin.zip $(EXTENSION_FILES))
-
-linuxplatforms:
-	$(MAKE) lib ARCH=x86
-	$(MAKE) lib ARCH=x86_64
-
-macplatforms:
-	$(MAKE) lib
-
-HDRS =	\
-	LocalObjectTable.h \
-	NPVariantWrapper.h \
-	Plugin.h \
-	ScriptableInstance.h \
-	mozincludes.h \
-	JavaObject.h
-
-SRCS =	\
-	main.cpp \
-	Plugin.cpp \
-	LocalObjectTable.cpp \
-	JavaObject.cpp \
-	npn_bindings.cpp \
-	ScriptableInstance.cpp
-
-OBJS = $(patsubst %.cpp,$(OBJ_OUTDIR)/%.o,$(SRCS))
-
-$(OBJS): $(OBJ_OUTDIR)
-
-$(OBJ_OUTDIR)::
-	@mkdir -p $@
-
-versioned-files::
-	sed -e s/GWT_DEV_PLUGIN_VERSION/$(VERSION)/ manifest-template.json >prebuilt/gwt-dev-plugin/manifest.json
-	#sed -e s/GWT_DEV_PLUGIN_VERSION/$(VERSION)/ updates-template.xml >prebuilt/updates.xml
-
-$(DLL): $(OBJS) $(COMMON)
-	$(CXX) -m$(FLAG32BIT) -o $@ $(OBJS) $(COMMON) $(DLLFLAGS) 
-	@mkdir -p $(PLATFORM_DIR)
-	cp $(DLL) $(PLATFORM_DIR)/$(PLATFORM_DIR_SUFFIX)
-
-$(OBJ_OUTDIR)/%.o: %.cpp
-	$(CXX) $(CXXFLAGS) -c -o $@ -I. -I../common $<
-
-common $(COMMON):
-	(cd ../common && ARCH=$(ARCH) $(MAKE))
-
-clean:
-	rm -rf build
-
-devmodeoptions:
-	(ant -f DevModeOptions/build.xml prebuilt)
-
-depend: $(OBJ_OUTDIR)
-	($(foreach src,$(SRCS),$(DEPEND)) true) >>Makefile
-#	makedepend -- $(CFLAGS) -- $(SRCS)
-
-# DO NOT DELETE
-$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
- $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
- $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
- main.cpp ../common/Debug.h ../common/Platform.h ../common/DebugLevel.h \
- mozincludes.h npapi/npapi.h npapi/nphostapi.h npapi/npapi.h \
- npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h Plugin.h \
- ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
- ../common/Socket.h ../common/Message.h ../common/ReturnMessage.h \
- ../common/BrowserChannel.h ../common/Value.h ../common/SessionHandler.h \
- ../common/LoadModuleMessage.h ../common/HostChannel.h LocalObjectTable.h \
- ../common/SessionHandler.h ../common/HashMap.h ScriptableInstance.h \
- ../common/scoped_ptr/scoped_ptr.h
-$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
- $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
- $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
- Plugin.cpp Plugin.h ../common/Debug.h ../common/Platform.h \
- ../common/DebugLevel.h mozincludes.h npapi/npapi.h npapi/nphostapi.h \
- npapi/npapi.h npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h \
- ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
- ../common/Socket.h ../common/Message.h ../common/ReturnMessage.h \
- ../common/BrowserChannel.h ../common/Value.h ../common/SessionHandler.h \
- ../common/LoadModuleMessage.h ../common/HostChannel.h LocalObjectTable.h \
- ../common/SessionHandler.h ../common/HashMap.h ScriptableInstance.h \
- ../common/InvokeMessage.h ../common/ReturnMessage.h \
- ../common/ServerMethods.h ../common/scoped_ptr/scoped_ptr.h \
- NPVariantWrapper.h ../common/Platform.h ../common/Value.h JavaObject.h
-$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
- $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
- $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
- LocalObjectTable.cpp mozincludes.h npapi/npapi.h npapi/nphostapi.h \
- npapi/npapi.h npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h \
- LocalObjectTable.h ../common/Debug.h ../common/Platform.h \
- ../common/DebugLevel.h
-$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
- $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
- $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
- JavaObject.cpp ../common/Debug.h ../common/Platform.h \
- ../common/DebugLevel.h JavaObject.h mozincludes.h npapi/npapi.h \
- npapi/nphostapi.h npapi/npapi.h npapi/npruntime.h npapi/npruntime.h \
- NPObjectWrapper.h Plugin.h ../common/HostChannel.h ../common/Debug.h \
- ../common/ByteOrder.h ../common/Socket.h ../common/Message.h \
- ../common/ReturnMessage.h ../common/BrowserChannel.h ../common/Value.h \
- ../common/SessionHandler.h ../common/LoadModuleMessage.h \
- ../common/HostChannel.h LocalObjectTable.h ../common/SessionHandler.h \
- ../common/HashMap.h ScriptableInstance.h NPVariantWrapper.h \
- ../common/Platform.h ../common/Value.h
-$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
- $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
- $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
- npn_bindings.cpp ../common/Debug.h ../common/Platform.h \
- ../common/DebugLevel.h mozincludes.h npapi/npapi.h npapi/nphostapi.h \
- npapi/npapi.h npapi/npruntime.h npapi/npruntime.h NPObjectWrapper.h
-$(OBJ_OUTDIR)/main.o $(OBJ_OUTDIR)/Plugin.o \
- $(OBJ_OUTDIR)/LocalObjectTable.o $(OBJ_OUTDIR)/JavaObject.o \
- $(OBJ_OUTDIR)/npn_bindings.cpp $(OBJ_OUTDIR)/ScriptableInstance.o: \
- ScriptableInstance.cpp ScriptableInstance.h ../common/Debug.h \
- ../common/Platform.h ../common/DebugLevel.h mozincludes.h npapi/npapi.h \
- npapi/nphostapi.h npapi/npapi.h npapi/npruntime.h npapi/npruntime.h \
- NPObjectWrapper.h ../common/HostChannel.h ../common/Debug.h \
- ../common/ByteOrder.h ../common/Socket.h ../common/Message.h \
- ../common/ReturnMessage.h ../common/BrowserChannel.h ../common/Value.h \
- ../common/SessionHandler.h ../common/LoadModuleMessage.h \
- ../common/HostChannel.h LocalObjectTable.h ../common/SessionHandler.h \
- ../common/HashMap.h ../common/InvokeMessage.h ../common/ReturnMessage.h \
- ../common/ServerMethods.h ../common/AllowedConnections.h \
- ../common/scoped_ptr/scoped_ptr.h NPVariantWrapper.h \
- ../common/Platform.h ../common/Value.h Plugin.h JavaObject.h
diff --git a/plugins/npapi/NPObjectWrapper.h b/plugins/npapi/NPObjectWrapper.h
deleted file mode 100644
index 89280fab..0000000
--- a/plugins/npapi/NPObjectWrapper.h
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2007, Google Inc.
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//     this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright notice,
-//     this list of conditions and the following disclaimer in the documentation
-//     and/or other materials provided with the distribution.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//     used to endorse or promote products derived from this software without
-//     specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Modified from gears/base/npapi/plugin.h
-
-#ifndef _H_NPObjectWrapper
-#define _H_NPObjectWrapper
-
-#include <cstdio>
-#include "mozincludes.h"
-
-// This is a base class for the bridge between the JavaScript engine and the plugin.
-template<class Wrapper>
-class NPObjectWrapper : public NPObject {
- public:
-  // NPClass callbacks.
-  static NPObject* Allocate(NPP npp, NPClass *npclass) {
-    Wrapper* obj = new Wrapper(npp);
-    return obj;
-  }
-
-  static void Deallocate(NPObject *npobj) {
-    delete static_cast<Wrapper*>(npobj);
-  }
-
-  static bool Enumeration(NPObject *npobj, NPIdentifier** value,
-      uint32_t *count) {
-    Wrapper* obj = static_cast<Wrapper*>(npobj);
-    return obj->enumeration(value, count);
-  }
-
-  static bool HasMethod(NPObject *npobj, NPIdentifier name) {
-    Wrapper* obj = static_cast<Wrapper*>(npobj);
-    return obj->hasMethod(name);
-  }
-
-  static bool Invoke(NPObject *npobj, NPIdentifier name, const NPVariant *args,
-      uint32_t num_args, NPVariant *result) {
-    Wrapper* obj = static_cast<Wrapper*>(npobj);
-    return obj->invoke(name, args, num_args, result);
-  }
-
-  static bool InvokeDefault(NPObject *npobj, const NPVariant *args,
-      uint32_t num_args, NPVariant *result) {
-    Wrapper* obj = static_cast<Wrapper*>(npobj);
-    return obj->invokeDefault(args, num_args, result);
-  }
-
-  static bool HasProperty(NPObject *npobj, NPIdentifier name) {
-    Wrapper* obj = static_cast<Wrapper*>(npobj);
-    return obj->hasProperty(name);
-  }
-
-  static bool GetProperty(NPObject *npobj, NPIdentifier name,
-        NPVariant *result) {
-    Wrapper* obj = static_cast<Wrapper*>(npobj);
-    return obj->getProperty(name, result);
-  }
-
-  static bool SetProperty(NPObject *npobj, NPIdentifier name,
-                          const NPVariant *value) {
-    Wrapper* obj = static_cast<Wrapper*>(npobj);
-    return obj->setProperty(name, value);
-  }
-
-  virtual ~NPObjectWrapper() {}
-
-  /**
-   * *value must be memory allocated with NPN_MemAlloc, as the caller will call NPN_MemFree.
-   */
-  virtual bool enumeration(NPIdentifier** value, uint32_t* count) {
-    return false;
-  }
-
-  /**
-   * Caller must release the result value when it no longer needs it,
-   * so implementation must return an extra refcount.
-   */
-  virtual bool getProperty(NPIdentifier name, NPVariant *result) {
-    return false;
-  }
-  
-  virtual bool hasMethod(NPIdentifier name) {
-    return false;
-  }
-
-  virtual bool hasProperty(NPIdentifier name) {
-    return false;
-  }
-  
-  /**
-   * Caller must release the result value when it no longer needs it,
-   * so implementation must return an extra refcount.
-   */
-  virtual bool invoke(NPIdentifier name, const NPVariant *args,
-      uint32_t num_args, NPVariant *result) {
-    return false;
-  }
-
-  /**
-   * Caller must release the result value when it no longer needs it,
-   * so implementation must return an extra refcount.
-   */
-  virtual bool invokeDefault(const NPVariant *args, uint32_t num_args,
-      NPVariant *result) {
-    return false;
-  }
-
-   virtual bool setProperty(NPIdentifier name, const NPVariant *value) {
-     return false;
-   }
-
-  protected:
-    NPObjectWrapper(NPP instance) : npp(instance) {}
-
-  public:
-    const NPP getNPP() const {
-      return npp;
-    }
-
-  private:
-    NPP npp;
-    DISALLOW_EVIL_CONSTRUCTORS(NPObjectWrapper);
-};
-
-// Get the NPClass for a NPObject wrapper (the type must derive from NPObjectWrapper).
-template<class Wrapper>
-NPClass* GetNPClass() {
-  static NPClass plugin_class = {
-    NP_CLASS_STRUCT_VERSION,
-    NPObjectWrapper<Wrapper>::Allocate,
-    NPObjectWrapper<Wrapper>::Deallocate,
-    NULL,  // Invalidate,
-    NPObjectWrapper<Wrapper>::HasMethod,
-    NPObjectWrapper<Wrapper>::Invoke,
-    NPObjectWrapper<Wrapper>::InvokeDefault,
-    NPObjectWrapper<Wrapper>::HasProperty,
-    NPObjectWrapper<Wrapper>::GetProperty,
-    NPObjectWrapper<Wrapper>::SetProperty,
-    NULL,  // RemoveProperty,
-    NPObjectWrapper<Wrapper>::Enumeration,
-  };
-
-  return &plugin_class;
-}
-
-#endif // GEARS_BASE_NPAPI_PLUGIN_H__
diff --git a/plugins/npapi/NPVariantUtil.h b/plugins/npapi/NPVariantUtil.h
deleted file mode 100644
index 2ca7ea5..0000000
--- a/plugins/npapi/NPVariantUtil.h
+++ /dev/null
@@ -1,132 +0,0 @@
-#ifndef _H_NPVariantUtil
-#define _H_NPVariantUtil
-
-#include "Debug.h"
-#include "mozincludes.h"
-
-/**
- * Wraps an NPVariant and provides various helper functions
- */
-class NPVariantUtil {
-public:
-  static int isBoolean(const NPVariant& variant) {
-    return NPVARIANT_IS_BOOLEAN(variant);
-  }
-
-  static bool getAsBoolean(const NPVariant& variant) {
-    return NPVARIANT_TO_BOOLEAN(variant);
-  }
-
-  // Return true if the variant is holding a regular integer or an integral double.
-  static int isInt(const NPVariant& variant) {
-    if (NPVARIANT_IS_INT32(variant)) {
-      return 1;
-    } else if (NPVARIANT_IS_DOUBLE(variant)) {
-      // As of http://trac.webkit.org/changeset/72974 we get doubles for all
-      // numerical variants out of V8.
-      double d = NPVARIANT_TO_DOUBLE(variant);
-      int i = static_cast<int>(d);
-      // Verify that d is an integral value in range.
-      return (d == static_cast<double>(i));
-    } else {
-      return 0;
-    }
-  }
-
-  static int getAsInt(const NPVariant& variant) {
-    if (isInt(variant)) {
-      if (NPVARIANT_IS_INT32(variant)) {
-        return NPVARIANT_TO_INT32(variant);
-      } else if (NPVARIANT_IS_DOUBLE(variant)) {
-        return static_cast<int>(NPVARIANT_TO_DOUBLE(variant));
-      }
-    }
-
-    Debug::log(Debug::Error) << "getAsInt: variant " <<
-      NPVariantUtil::toString(variant) << "not int" << Debug::flush;
-    return 0;
-  }
-
-  static int isNull(const NPVariant& variant) {
-    return NPVARIANT_IS_NULL(variant);
-  }
-
-  static int isObject(const NPVariant& variant) {
-    return NPVARIANT_IS_OBJECT(variant);
-  }
-
-  static NPObject* getAsObject(const NPVariant& variant) {
-    if (NPVARIANT_IS_OBJECT(variant)) {
-      return NPVARIANT_TO_OBJECT(variant);
-    }
-    Debug::log(Debug::Error) << "getAsObject: variant not object" << Debug::flush;
-    return 0;
-  }
-
-  static int isString(const NPVariant& variant) {
-    return NPVARIANT_IS_STRING(variant);
-  }
-
-  static const NPString* getAsNPString(const NPVariant& variant) {
-    if (NPVARIANT_IS_STRING(variant)) {
-      return &NPVARIANT_TO_STRING(variant);
-    }
-    Debug::log(Debug::Error) << "getAsNPString: variant not string" << Debug::flush;
-    return 0;
-  }
-
-  static std::string toString(const NPVariant& variant) {
-    std::string retval;
-    // TODO(jat): remove sprintfs
-    char buf[40];
-    NPObject* npObj;
-    switch (variant.type) {
-      case NPVariantType_Void:
-        retval = "undef";
-        break;
-      case NPVariantType_Null:
-        retval = "null";
-        break;
-      case NPVariantType_Bool:
-        retval = "bool(";
-        retval += (NPVARIANT_TO_BOOLEAN(variant) ? "true" : "false");
-        retval += ')';
-        break;
-      case NPVariantType_Int32:
-        retval = "int(";
-        snprintf(buf, sizeof(buf), "%d)", NPVARIANT_TO_INT32(variant));
-        retval += buf;
-        break;
-      case NPVariantType_Double:
-        retval = "double(";
-        snprintf(buf, sizeof(buf), "%g)", NPVARIANT_TO_DOUBLE(variant));
-        retval += buf;
-        break;
-      case NPVariantType_String:
-        {
-          retval = "string(";
-          NPString str = NPVARIANT_TO_STRING(variant);
-          retval += std::string(str.UTF8Characters, str.UTF8Length);
-          retval += ')';
-        }
-        break;
-      case NPVariantType_Object:
-        npObj = NPVARIANT_TO_OBJECT(variant);
-        snprintf(buf, sizeof(buf), "obj(class=%p, ", npObj->_class);
-        retval = buf;
-        snprintf(buf, sizeof(buf), "count=%d, ", npObj->referenceCount);
-        retval += buf;
-        snprintf(buf, sizeof(buf), "%p)", npObj);
-        retval += buf;
-        break;
-      default:
-        snprintf(buf, sizeof(buf), "Unknown type %d", variant.type);
-        retval = buf;
-        break;
-    }
-    return retval;
-  }
-
-};
-
-#endif
diff --git a/plugins/npapi/NPVariantWrapper.h b/plugins/npapi/NPVariantWrapper.h
deleted file mode 100644
index 0fd18e3..0000000
--- a/plugins/npapi/NPVariantWrapper.h
+++ /dev/null
@@ -1,550 +0,0 @@
-#ifndef _H_NPVariantWrapper
-#define _H_NPVariantWrapper
-
-#include <string>
-#include <ostream>
-
-#ifdef sun
-// Sun's cstring doesn't define strlen/etc
-#include <string.h>
-#endif
-#include <cstring>
-#include <stdio.h>
-
-#include "Debug.h"
-#include "Platform.h"
-
-#include "mozincludes.h"
-#include "NPVariantUtil.h"
-
-#include "Value.h"
-#include "LocalObjectTable.h"
-#include "Plugin.h"
-#include "JavaObject.h"
-
-/**
- * Contains NPVariantProxy, NPVariantWrapper, and NPVariantArray
- */
-
-/**
- * Wraps an NPVariant and provides various conversion functions.  The variant
- * provided retained at create time.
- */
-class NPVariantProxy {
-  friend class NPVariantArray;
-private:
-  ScriptableInstance& plugin;
-  NPVariant& variant;
-public:
-  NPVariantProxy(ScriptableInstance& plugin, NPVariant& variant)
-      : plugin(plugin), variant(variant)
-  {
-    VOID_TO_NPVARIANT(variant);
-  }
-  
-  NPVariantProxy(ScriptableInstance& plugin, NPVariant& variant, bool noinit)
-      : plugin(plugin), variant(variant)
-  {
-  }
-
-  ~NPVariantProxy() {
-  }
-  
-  operator NPVariant() const {
-    return variant;
-  }
-  
-  const NPVariant* operator->() const {
-	return &variant;
-  }
-
-  const NPVariant* address() const {
-    return &variant;
-  }
-
-  int isBoolean() const {
-    return NPVariantUtil::isBoolean(variant);
-  }
-
-  bool getAsBoolean() const {
-    return NPVariantUtil::getAsBoolean(variant);
-  }
-
-  int isInt() const {
-    return NPVariantUtil::isInt(variant);
-  }
-  
-  int getAsInt() const {
-    return NPVariantUtil::getAsInt(variant);
-  }
-
-  int isNull() const {
-    return NPVariantUtil::isNull(variant);
-  }
-  
-  int isObject() const {
-    return NPVariantUtil::isObject(variant);
-  }
-  
-  NPObject* getAsObject() const {
-    return NPVariantUtil::getAsObject(variant);
-  }
-
-  int isString() const {
-    return NPVariantUtil::isString(variant);
-  }
-  
-  const NPString* getAsNPString() const {
-    return NPVariantUtil::getAsNPString(variant);
-  }
-
-  gwt::Value getAsValue(ScriptableInstance& scriptInstance, bool unwrapJava = true) const {
-    return getAsValue(variant, scriptInstance, unwrapJava);
-  }
-
-  static gwt::Value getAsValue(const NPVariant& variant, ScriptableInstance& scriptInstance,
-      bool unwrapJava = true) {
-    gwt::Value val;
-    if (NPVARIANT_IS_VOID(variant)) {
-      val.setUndefined();
-    } else if (NPVARIANT_IS_NULL(variant)) {
-      val.setNull();
-    } else if (NPVARIANT_IS_BOOLEAN(variant)) {
-      val.setBoolean(NPVARIANT_TO_BOOLEAN(variant));
-    } else if (NPVARIANT_IS_INT32(variant)) {
-      val.setInt(NPVARIANT_TO_INT32(variant));      
-    } else if (NPVARIANT_IS_DOUBLE(variant)) {
-      val.setDouble(NPVARIANT_TO_DOUBLE(variant));
-    } else if (NPVARIANT_IS_STRING(variant)) {
-      NPString str = NPVARIANT_TO_STRING(variant);
-      val.setString(GetNPStringUTF8Characters(str), GetNPStringUTF8Length(str));
-    } else if (NPVARIANT_IS_OBJECT(variant)) {
-      NPObject* obj = NPVARIANT_TO_OBJECT(variant);
-      if (unwrapJava && JavaObject::isInstance(obj)) {
-        JavaObject* jObj = static_cast<JavaObject*>(obj);
-        val.setJavaObject(jObj->getObjectId());
-      } else {
-        NPVariant result;
-        VOID_TO_NPVARIANT(result);
-        if (scriptInstance.tryGetStringPrimitive(obj, result)) {
-          NPString str = NPVARIANT_TO_STRING(result);
-          val.setString(GetNPStringUTF8Characters(str), GetNPStringUTF8Length(str));
-          release(result);
-        } else {
-          val.setJsObjectId(scriptInstance.getLocalObjectRef(obj));
-        }
-      }
-    } else {
-      Debug::log(Debug::Error) << "Unsupported NPVariant type " << variant.type << Debug::flush;
-    }
-    return val;
-  }
-  
-  /**
-   * The incoming variant is not altered, and is not even required to have
-   * its contents retained.  Any object will get an extra refcount on it
-   * when copied to this variant, and strings will be copied.
-   */
-  NPVariantProxy& operator=(const NPVariant& newval) {
-    assignFrom(variant, newval);
-    return *this;
-  }
-
-  /**
-   * The incoming variant is not altered, and is not even required to have
-   * its contents retained.  Any object will get an extra refcount on it
-   * when copied to this variant, and strings will be copied.
-   */
-  static void assignFrom(NPVariant& variant, const NPVariant& newval) {
-    release(variant);
-    variant = newval;
-    if (NPVARIANT_IS_STRING(newval)) {
-      int n = variant.value.stringValue.UTF8Length;
-      char* strBytes = reinterpret_cast<char*>(NPN_MemAlloc(n));
-      memcpy(strBytes, variant.value.stringValue.UTF8Characters, n);
-      variant.value.stringValue.UTF8Characters = strBytes;
-    } else {
-      retain(variant);
-    }
-  }
-
-  NPVariantProxy& operator=(NPObject* obj) {
-    assignFrom(variant, obj);
-    return *this;
-  }
-  
-  static void assignFrom(NPVariant& variant, NPObject* obj) {
-    release(variant);
-    OBJECT_TO_NPVARIANT(obj, variant);
-    retain(variant);
-  }
-
-  // Convenience method for C++ code
-  NPVariantProxy& operator=(int intVal) {
-    assignFrom(variant, intVal);
-    return *this;
-  }
-
-  // Convenience method for C++ code
-  static void assignFrom(NPVariant& variant, int intVal) {
-    NPVariant newvar;
-    INT32_TO_NPVARIANT(intVal, newvar);
-    assignFrom(variant, newvar);
-  }
-
-  // Convenience method for C++ code
-  NPVariantProxy& operator=(const std::string& strval) {
-    assignFrom(variant, strval);
-    return *this;
-  }
-
-  // Convenience method for C++ code
-  static void assignFrom(NPVariant& variant, const std::string& strval) {
-    NPVariant newvar;
-    STDSTRING_TO_NPVARIANT(strval, newvar);
-    assignFrom(variant, newvar);
-  }
-  
-  // Convenience method for C++ code
-  NPVariantProxy& operator=(const char* strval) {
-    assignFrom(variant, strval);
-    return *this;
-  }
-
-  // Convenience method for C++ code
-  static void assignFrom(NPVariant& variant, const char* strval) {
-    NPVariant newvar;
-    STRINGZ_TO_NPVARIANT(strval, newvar);
-    assignFrom(variant, newvar);
-  }
-
-  NPVariantProxy& operator=(const gwt::Value& newval) {
-    assignFrom(plugin, variant, newval);
-    return *this;
-  }
-
-  static void assignFrom(ScriptableInstance& plugin, NPVariant& variant, const gwt::Value& newval) {
-    NPVariant newvar;
-    VOID_TO_NPVARIANT(newvar);
-    if (newval.isBoolean()) {
-      BOOLEAN_TO_NPVARIANT(newval.getBoolean(), newvar);
-    } else if (newval.isByte()) {
-      INT32_TO_NPVARIANT(newval.getByte(), newvar);
-    } else if (newval.isChar()) {
-      INT32_TO_NPVARIANT(newval.getChar(), newvar);
-    } else if (newval.isShort()) {
-      INT32_TO_NPVARIANT(newval.getShort(), newvar);
-    } else if (newval.isInt()) {
-      int value = newval.getInt();
-      // Firefox NPAPI bug: 32-bit ints get mapped to int jsvals, regardless of range.
-      // However, int jsvals are 31 bits, so we need to use a double if the value is
-      // not representable in a 31 bit signed 2's-complement value.
-      if (value >= 0x40000000 || value < -0x40000000) {
-        DOUBLE_TO_NPVARIANT(static_cast<double>(value), newvar);
-      } else {
-        INT32_TO_NPVARIANT(value, newvar);
-      }
-    } else if (newval.isFloat()) {
-      DOUBLE_TO_NPVARIANT(newval.getFloat(), newvar);
-    } else if (newval.isDouble()) {
-      DOUBLE_TO_NPVARIANT(newval.getDouble(), newvar);
-    } else if (newval.isNull()) {
-      NULL_TO_NPVARIANT(newvar);
-    } else if (newval.isUndefined()) {
-      VOID_TO_NPVARIANT(newvar);
-    } else if (newval.isString()) {
-      assignFrom(variant, newval.getString());
-      return;
-    } else if (newval.isJavaObject()) {
-      if (1) {
-        JavaObject* jObj = plugin.createJavaWrapper(newval.getJavaObjectId());
-        NPObject* obj = jObj;
-        OBJECT_TO_NPVARIANT(obj, newvar);
-      } else {
-        VOID_TO_NPVARIANT(newvar);
-      }
-    } else if (newval.isJsObject()) {
-      OBJECT_TO_NPVARIANT(plugin.getLocalObject(newval.getJsObjectId()),
-    	  newvar);
-    } else {
-      Debug::log(Debug::Error) << "Unsupported NPVariant type " << newval.getType() << Debug::flush;
-    }
-    assignFrom(variant, newvar);
-  }
-
-  std::string toString() const {
-    return toString(variant);
-  }
-
-  static std::string toString(const NPVariant& variant) {
-    std::string retval;
-    // TODO(jat): remove sprintfs
-    char buf[40];
-    NPObject* npObj;
-    switch (variant.type) {
-      case NPVariantType_Void:
-        retval = "undef";
-        break;
-      case NPVariantType_Null:
-        retval = "null";
-        break;
-      case NPVariantType_Bool:
-        retval = "bool(";
-        retval += (NPVARIANT_TO_BOOLEAN(variant) ? "true" : "false");
-        retval += ')';
-        break;
-      case NPVariantType_Int32:
-        retval = "int(";
-        snprintf(buf, sizeof(buf), "%d)", NPVARIANT_TO_INT32(variant));
-        retval += buf;
-        break;
-      case NPVariantType_Double:
-        retval = "double(";
-        snprintf(buf, sizeof(buf), "%g)", NPVARIANT_TO_DOUBLE(variant));
-        retval += buf;
-        break;
-      case NPVariantType_String:
-        {
-          retval = "string(";
-          NPString str = NPVARIANT_TO_STRING(variant);
-          retval += std::string(str.UTF8Characters, str.UTF8Length);
-          retval += ')';
-        }
-        break;
-      case NPVariantType_Object:
-        npObj = NPVARIANT_TO_OBJECT(variant);
-        if (JavaObject::isInstance(npObj)) {
-          JavaObject* javaObj = static_cast<JavaObject*>(npObj);
-          snprintf(buf, sizeof(buf), "javaObj(id=%d, ", javaObj->getObjectId());
-        } else {
-          snprintf(buf, sizeof(buf), "jsObj(class=%p, ", npObj->_class);
-        }
-        retval = buf;
-        snprintf(buf, sizeof(buf), "%p)", npObj);
-        retval += buf;
-        break;
-      default:
-        snprintf(buf, sizeof(buf), "Unknown type %d", variant.type);
-        retval = buf;
-        break;
-    }
-    return retval;
-  }
-
-public:
-  void release() {
-    release(variant);
-  }
-
-  static void release(NPVariant& variant) {
-    NPN_ReleaseVariantValue(&variant);
-  }
-
-  void retain() {
-    retain(variant);
-  }
-
-  static void retain(NPVariant& variant) {
-    if (NPVARIANT_IS_OBJECT(variant)) {
-      NPN_RetainObject(NPVARIANT_TO_OBJECT(variant));
-    }
-  }
-};
-
-inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariant& var) {
-  return dbg << NPVariantProxy::toString(var);
-}
-
-inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariantProxy& var) {
-  return dbg << var.toString();
-}
-
-/**
- * Variation of NPVariantProxy that provides its own variant and always frees it
- * when the wrapper goes away.
- */
-class NPVariantWrapper  {
-private:
-  ScriptableInstance& plugin;
-  NPVariant variant;
-public:
-  NPVariantWrapper(ScriptableInstance& plugin) : plugin(plugin) {
-    VOID_TO_NPVARIANT(variant);
-  }
-
-  ~NPVariantWrapper() {
-    release();
-  }
-
-  operator NPVariant() const {
-    return variant;
-  }
-
-  const NPVariant* operator->() const {
-  return &variant;
-  }
-
-  const NPVariant* address() const {
-    return &variant;
-  }
-
-  /**
-   * Get the address for use as a return value.  Since the value can be trashed,
-   * we need to release any data we currently hold.
-   */
-  NPVariant* addressForReturn() {
-    NPVariantProxy::release(variant);
-    VOID_TO_NPVARIANT(variant);
-    NPVariantProxy::retain(variant); // does nothing, present for consistency
-    return &variant;
-  }
-  
-  bool isBoolean() const {
-    return NPVariantUtil::isBoolean(variant);
-  }
-
-  int isInt() const {
-    return NPVariantUtil::isInt(variant);
-  }
-  
-  int isObject() const {
-    return NPVariantUtil::isObject(variant);
-  }
-  
-  int isString() const {
-    return NPVariantUtil::isString(variant);
-  }
-  
-  bool getAsBoolean() const {
-    return NPVariantUtil::getAsBoolean(variant);
-  }
-
-  int getAsInt() const {
-    return NPVariantUtil::getAsInt(variant);
-  }
-
-  NPObject* getAsObject() const {
-    return NPVariantUtil::getAsObject(variant);
-  }
-
-  const NPString* getAsNPString() const {
-    return NPVariantUtil::getAsNPString(variant);
-  }
-
-  gwt::Value getAsValue(ScriptableInstance& scriptInstance, bool unwrapJava = true) const {
-    return NPVariantProxy::getAsValue(variant, scriptInstance, unwrapJava);
-  }
-
-  /**
-   * The incoming variant is not altered, and is not even required to have
-   * its contents retained.  Any object will get an extra refcount on it
-   * when copied to this variant, and strings will be copied.
-   */
-  NPVariantWrapper& operator=(const NPVariant& newval) {
-    NPVariantProxy::assignFrom(variant, newval);
-    return *this;
-  }
-
-  NPVariantWrapper& operator=(const gwt::Value& newval) {
-    NPVariantProxy::assignFrom(plugin, variant, newval);
-    return *this;
-  }
-  
-  NPVariantWrapper& operator=(NPObject* obj) {
-    NPVariantProxy::assignFrom(variant, obj);
-    return *this;
-  }
-  
-  // Convenience method for C++ code
-  NPVariantWrapper& operator=(const std::string& strval) {
-    NPVariantProxy::assignFrom(variant, strval);
-    return *this;
-  }
-
-  // Convenience method for C++ code
-  NPVariantWrapper& operator=(const char* strval) {
-    NPVariantProxy::assignFrom(variant, strval);
-    return *this;
-  }
-
-  // Convenience method for C++ code
-  NPVariantWrapper& operator=(int intval) {
-    NPVariantProxy::assignFrom(variant, intval);
-    return *this;
-  }
-
-  void release() {
-    NPVariantProxy::release(variant);
-  }
-
-  void retain() {
-    NPVariantProxy::retain(variant);
-  }
-
-  std::string toString() const {
-    return NPVariantProxy::toString(variant);
-  }
-};
-
-inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariantWrapper& var) {
-  dbg << var.toString();
-  return dbg;
-}
-
-/**
- * Maintains an array of NPVariants and cleans them up when it is destroyed.
- */
-class NPVariantArray {
-private:
-	ScriptableInstance& plugin;
-  int size;
-  NPVariant* args;
-
-public:
-  NPVariantArray(ScriptableInstance& plugin, int size) : plugin(plugin), size(size) {
-    args = new NPVariant[size];
-    for (int i = 0; i < size; ++i) {
-      VOID_TO_NPVARIANT(args[i]);
-    }
-  }
-
-  ~NPVariantArray() {
-    for (int i = 0; i < size; ++i) {
-      NPN_ReleaseVariantValue(&args[i]);
-    }
-    delete [] args;
-  }
-
-  const NPVariant* getArray() const {
-    return args;
-  }
-
-  int getSize() const {
-    return size;
-  }
-
-  const NPVariant& operator[](int idx) const {
-    if (idx >= size) {
-      printf("NPVariantArray[idx=%d] const: size=%d\n", idx, size);
-    }
-    return args[idx];
-  }
-
-  NPVariantProxy operator[](int idx) {
-    if (idx >= size) {
-      printf("NPVariantArray[idx=%d]: size=%d\n", idx, size);
-    }
-    return NPVariantProxy(plugin, args[idx], true);
-  }
-};
-
-inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg, const NPVariantArray& var) {
-  dbg << "[";
-  for (int i = 0; i < var.getSize(); ++i) {
-    dbg << " " << var[i]; 
-  }
-  dbg << " ]";
-  return dbg;
-}
-
-#endif
diff --git a/plugins/npapi/Plugin.cpp b/plugins/npapi/Plugin.cpp
deleted file mode 100644
index 4abe7a4..0000000
--- a/plugins/npapi/Plugin.cpp
+++ /dev/null
@@ -1,47 +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.
- */
-
-#include <cstring>
-
-#include "Plugin.h"
-#include "ScriptableInstance.h"
-#include "InvokeMessage.h"
-#include "ReturnMessage.h"
-#include "ServerMethods.h"
-#include "mozincludes.h"
-#include "scoped_ptr/scoped_ptr.h"
-#include "NPVariantWrapper.h"
-
-using std::string;
-using std::endl;
-
-Plugin::Plugin(NPP npp) : npp(npp) {
-  this->scriptableInstance = static_cast<ScriptableInstance*>(NPN_CreateObject(npp,
-	  GetNPClass<ScriptableInstance>()));
-}
-
-Plugin::Plugin(NPP npp, ScriptableInstance* scriptableInstance) : npp(npp),
-    scriptableInstance(scriptableInstance) {
-}
-
-Plugin::~Plugin() {
-  Debug::log(Debug::Debugging) << "Plugin destroyed" << Debug::flush;
-  if (scriptableInstance) {
-    scriptableInstance->pluginDeath();
-    NPN_ReleaseObject(scriptableInstance);
-    scriptableInstance = 0;
-  }
-}
diff --git a/plugins/npapi/Plugin.h b/plugins/npapi/Plugin.h
deleted file mode 100644
index b5d989a..0000000
--- a/plugins/npapi/Plugin.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef _H_Plugin
-#define _H_Plugin
-/*
- * 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.
- */
-
-#include <vector>
-
-#include "Debug.h"
-
-#include "mozincludes.h"
-#include "HostChannel.h"
-#include "LoadModuleMessage.h"
-#include "LocalObjectTable.h"
-#include "SessionHandler.h"
-#include "HashMap.h"
-
-using std::vector;
-
-class ScriptableInstance;
-
-class Plugin {
-  friend class JavaObject;
-public:
-  Plugin(NPP);
-  Plugin(NPP, ScriptableInstance*);
-  ~Plugin();
-  
-  const NPNetscapeFuncs* getBrowser() { return &GetNPNFuncs(); }
-  ScriptableInstance* getScriptableInstance() { return scriptableInstance; }
-  NPP getNPP() { return npp; }
-
-  static const uint32_t VERSION = 1;
-private:  
-  
-  NPP npp;
-  ScriptableInstance* scriptableInstance;
-  
-  NPObject* window;
-
-};
-
-#endif
diff --git a/plugins/npapi/README.txt b/plugins/npapi/README.txt
deleted file mode 100644
index ca89e98..0000000
--- a/plugins/npapi/README.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This plugin is obsolete and out of date, due to a problem with the NPAPI
-plugin getting reloaded by Firefox when window.enableScrolling is changed.
-
-The code is kept since it will be useful for future NPAPI-based plugins,
-such as for Chrome.
diff --git a/plugins/npapi/ScriptableInstance.cpp b/plugins/npapi/ScriptableInstance.cpp
deleted file mode 100644
index f788a3e..0000000
--- a/plugins/npapi/ScriptableInstance.cpp
+++ /dev/null
@@ -1,793 +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.
- */
-
-#include <cstring>
-
-#include "ScriptableInstance.h"
-#include "InvokeMessage.h"
-#include "ReturnMessage.h"
-#include "ServerMethods.h"
-#include "AllowedConnections.h"
-
-#include "mozincludes.h"
-#include "scoped_ptr/scoped_ptr.h"
-#include "NPVariantWrapper.h"
-
-using std::string;
-using std::endl;
-const static string BACKGROUND_PAGE_STR = "chrome-extension://jpjpnpmbddbjkfaccnmhnkdgjideieim/background.html";
-const static string UNKNOWN_STR = "unknown";
-const static string INCLUDE_STR = "include";
-const static string EXCLUDE_STR = "exclude";
-
-bool ScriptableInstance::jsIdentitySafe = false;
-
-static inline string convertToString(const NPString& str) {
-  return string(GetNPStringUTF8Characters(str), GetNPStringUTF8Length(str));
-}
-
-string ScriptableInstance::computeTabIdentity() {
-  return "";
-}
-
-void ScriptableInstance::dumpObjectBytes(NPObject* obj) {
-  char buf[20];
-  Debug::log(Debug::Debugging) << "   object bytes:\n";
-  const unsigned char* ptr = reinterpret_cast<const unsigned char*>(obj);
-  for (int i = 0; i < 24; ++i) {
-    snprintf(buf, sizeof(buf), " %02x", ptr[i]);
-    Debug::log(Debug::Debugging) << buf;
-  }
-  NPVariant objVar;
-  OBJECT_TO_NPVARIANT(obj, objVar);
-  Debug::log(Debug::Debugging) << " obj.toString()="
-      << NPVariantProxy::toString(objVar) << Debug::flush;
-}
-
-ScriptableInstance::ScriptableInstance(NPP npp) : NPObjectWrapper<ScriptableInstance>(npp),
-    plugin(*reinterpret_cast<Plugin*>(npp->pdata)),
-    _channel(new HostChannel()),
-    localObjects(npp,ScriptableInstance::jsIdentitySafe),
-    _connectId(NPN_GetStringIdentifier("connect")),
-    initID(NPN_GetStringIdentifier("init")),
-    toStringID(NPN_GetStringIdentifier("toString")),
-    loadHostEntriesID(NPN_GetStringIdentifier("loadHostEntries")),
-    locationID(NPN_GetStringIdentifier("location")),
-    hrefID(NPN_GetStringIdentifier("href")),
-    urlID(NPN_GetStringIdentifier("url")),
-    includeID(NPN_GetStringIdentifier("include")),
-    getHostPermissionID(NPN_GetStringIdentifier("getHostPermission")),
-    testJsIdentityID(NPN_GetStringIdentifier("testJsIdentity")),
-    connectedID(NPN_GetStringIdentifier("connected")),
-    statsID(NPN_GetStringIdentifier("stats")),
-    jsDisconnectedID(NPN_GetStringIdentifier("__gwt_disconnected")),
-    jsInvokeID(NPN_GetStringIdentifier("__gwt_jsInvoke")),
-    jsResultID(NPN_GetStringIdentifier("__gwt_makeResult")),
-    jsTearOffID(NPN_GetStringIdentifier("__gwt_makeTearOff")),
-    jsValueOfID(NPN_GetStringIdentifier("valueOf")),
-    idx0(NPN_GetIntIdentifier(0)),
-    idx1(NPN_GetIntIdentifier(1)) {
-  savedValueIdx = -1;
-  if (NPN_GetValue(npp, NPNVWindowNPObject, &window) != NPERR_NO_ERROR) {
-    Debug::log(Debug::Error) << "Error getting window object" << Debug::flush;
-  }
-
-}
-
-ScriptableInstance::~ScriptableInstance() {
-  // TODO(jat): free any remaining Java objects held by JS, then make
-  // the JS wrapper handle that situation gracefully
-  if (window) {
-    NPN_ReleaseObject(window);
-  }
-  for (hash_map<int, JavaObject*>::iterator it = javaObjects.begin(); it != javaObjects.end();
-      ++it) {
-    Debug::log(Debug::Spam) << "  disconnecting Java wrapper " << it->first << Debug::flush;
-    it->second->disconnectPlugin();
-  }
-  if (_channel) {
-    _channel->disconnectFromHost();
-    delete _channel;
-  }
-}
-
-void ScriptableInstance::dumpJSresult(const char* js) {
-  NPString npScript;
-  dupString(js, npScript);
-  NPVariantWrapper wrappedRetVal(*this);
-  if (!NPN_Evaluate(getNPP(), window, &npScript, wrappedRetVal.addressForReturn())) {
-    Debug::log(Debug::Error) << "   *** dumpJSresult failed" << Debug::flush;
-    return;
-  }
-  Debug::log(Debug::Info) << "dumpWindow=" << wrappedRetVal.toString() << Debug::flush;
-}
-
-bool ScriptableInstance::tryGetStringPrimitive(NPObject* obj, NPVariant& result) {
-  if (NPN_HasMethod(getNPP(), obj, jsValueOfID)) {
-    if (NPN_Invoke(getNPP(), obj, jsValueOfID, 0, 0, &result)
-        && NPVariantUtil::isString(result)) {
-      return true;
-    }
-    NPVariantProxy::release(result);
-  }
-  return false;
-}
-
-bool ScriptableInstance::makeResult(bool isException, const gwt::Value& value, NPVariant* result) {
-  Debug::log(Debug::Debugging) << "makeResult(" << isException << ", " << value << ")"
-      << Debug::flush;
-  gwt::Value temp;
-  if (value.getType() == gwt::Value::JAVA_OBJECT) {
-    int javaId = value.getJavaObjectId();
-    // We may have previously released the proxy for the same object id,
-    // but have not yet sent a free message back to the server.
-    javaObjectsToFree.erase(javaId);
-  }
-  NPVariantArray varArgs(*this, 3);
-  varArgs[0] = isException ? 1 : 0;
-  varArgs[1] = value;
-  NPVariantWrapper retVal(*this);
-  return NPN_Invoke(getNPP(), window, jsResultID, varArgs.getArray(), varArgs.getSize(), result);
-}
-
-//=============================================================================
-// NPObject methods
-//=============================================================================
-
-bool ScriptableInstance::hasProperty(NPIdentifier name) {
-  if (!NPN_IdentifierIsString(name)) {
-    // all numeric properties are ok, as we assume only JSNI code is making
-    // the field access via dispatchID
-    return true;
-  }
-  // TODO: special-case toString tear-offs
-  return name == statsID || name == connectedID;
-}
-
-bool ScriptableInstance::getProperty(NPIdentifier name, NPVariant* variant) {
-  Debug::log(Debug::Debugging) << "ScriptableInstance::getProperty(name="
-      << NPN_UTF8FromIdentifier(name) << ")" << Debug::flush;
-  bool retVal = false;
-  VOID_TO_NPVARIANT(*variant);
-  if (name == connectedID) {
-    BOOLEAN_TO_NPVARIANT(_channel->isConnected(), *variant);
-    retVal = true;
-  } else if (name == statsID) {
-    NPVariantProxy::assignFrom(*variant, "<stats data>");
-    retVal = true;
-  }
-  if (retVal) {
-    // TODO: testing
-    Debug::log(Debug::Debugging) << " return value " << *variant
-        << Debug::flush;
-  }
-  return retVal;
-}
-
-bool ScriptableInstance::setProperty(NPIdentifier name, const NPVariant* variant) {
-  Debug::log(Debug::Debugging) << "ScriptableInstance::setProperty(name="
-      << NPN_UTF8FromIdentifier(name) << ", value=" << *variant << ")"
-      << Debug::flush; 
-  return false;
-}
-
-bool ScriptableInstance::hasMethod(NPIdentifier name) {
-  Debug::log(Debug::Debugging) << "ScriptableInstance::hasMethod(name=" << NPN_UTF8FromIdentifier(name) << ")"
-      << Debug::flush; 
-  if (name == _connectId ||
-      name == initID ||
-      name == toStringID ||
-      name == loadHostEntriesID ||
-      name == getHostPermissionID ||
-      name == testJsIdentityID ) {
-    return true;
-  }
-  return false;
-}
-
-bool ScriptableInstance::invoke(NPIdentifier name, const NPVariant* args, unsigned argCount,
-    NPVariant* result) {
-  NPUTF8* uname = NPN_UTF8FromIdentifier(name);
-  Debug::log(Debug::Debugging) << "ScriptableInstance::invoke(name=" << uname << ",#args=" << argCount << ")"
-      << Debug::flush;
-  VOID_TO_NPVARIANT(*result);
-  if (name == _connectId) {
-    connect(args, argCount, result);
-  } else if (name == initID) {
-    init(args, argCount, result);
-  } else if (name == toStringID) {
-    // TODO(jat): figure out why this doesn't show in Firebug
-    string val("[GWT OOPHM Plugin: connected=");
-    val += _channel->isConnected() ? 'Y' : 'N';
-    val += ']';
-    NPVariantProxy::assignFrom(*result, val);
-  } else if (name == loadHostEntriesID) {
-    loadHostEntries(args, argCount, result);
-  } else if (name == getHostPermissionID) {
-    getHostPermission(args, argCount, result);
-  } else if (name == testJsIdentityID) {
-    testJsIdentity(args, argCount, result);
-  }
-  return true;
-}
-
-bool ScriptableInstance::invokeDefault(const NPVariant* args, unsigned argCount,
-      NPVariant* result) {
-  Debug::log(Debug::Debugging) << "ScriptableInstance::invokeDefault(#args=" << argCount << ")"
-      << Debug::flush;
-  VOID_TO_NPVARIANT(*result);
-  return true;
-}
-
-bool ScriptableInstance::enumeration(NPIdentifier** propReturn, uint32_t* count) {
-  Debug::log(Debug::Debugging) << "ScriptableInstance::enumeration()" << Debug::flush;
-  int n = 2;
-  NPIdentifier* props = static_cast<NPIdentifier*>(NPN_MemAlloc(sizeof(NPIdentifier) * n));
-  props[0] = connectedID;
-  props[1] = statsID;
-  *propReturn = props;
-  *count = n;
-  return true;
-}
-
-//=============================================================================
-// internal methods
-//=============================================================================
-
-void ScriptableInstance::init(const NPVariant* args, unsigned argCount, NPVariant* result) {
-  if (argCount != 1 || !NPVariantUtil::isObject(args[0])) {
-    // TODO: better failure?
-    Debug::log(Debug::Error) << "ScriptableInstance::init called with incorrect arguments:\n";
-    for (unsigned i = 0; i < argCount; ++i) {
-      Debug::log(Debug::Error) << " " << i << " " << NPVariantProxy::toString(args[i]) << "\n";
-    }
-    Debug::log(Debug::Error) << Debug::flush;
-    result->type = NPVariantType_Void;
-    return;
-  }
-  if (window) {
-    NPN_ReleaseObject(window);
-  }
-  // replace our window object with that passed by the caller
-  window = NPVariantUtil::getAsObject(args[0]);
-  NPN_RetainObject(window);
-  BOOLEAN_TO_NPVARIANT(true, *result);
-  result->type = NPVariantType_Bool;
-}
-
-string ScriptableInstance::getLocationHref() {
-  NPVariantWrapper locationVariant(*this);
-  NPVariantWrapper hrefVariant(*this);
-
-  // window.location
-  NPN_GetProperty(getNPP(), window, locationID, locationVariant.addressForReturn());
-  //window.location.href
-  NPN_GetProperty(getNPP(), locationVariant.getAsObject(), hrefID, hrefVariant.addressForReturn());
-
-  const NPString* locationHref = NPVariantUtil::getAsNPString(hrefVariant);
-  return convertToString(*locationHref);
-}
-
-
-void ScriptableInstance::loadHostEntries(const NPVariant* args, unsigned argCount, NPVariant* result) {
-  string locationHref = getLocationHref();
-  if (locationHref.compare(BACKGROUND_PAGE_STR) == 0) {
-    AllowedConnections::clearRules();
-    for (unsigned i = 0; i < argCount; ++i) {
-      //Get the host entry object {url: "somehost.net", include: true/false}
-      NPObject* hostEntry = NPVariantUtil::getAsObject(args[i]);
-      if (!hostEntry) {
-        Debug::log(Debug::Error) << "Got a host entry that is not an object.\n";
-        break;
-      }
-
-      //Get the url
-      NPVariantWrapper urlVariant(*this);
-      if (!NPN_GetProperty(getNPP(), hostEntry, urlID, urlVariant.addressForReturn()) ||
-          !urlVariant.isString()) {
-        Debug::log(Debug::Error) << "Got a host.url entry that is not a string.\n";
-        break;
-      }
-      const NPString* urlNPString = urlVariant.getAsNPString();
-      string urlString = convertToString(*urlNPString);
-
-      //Include/Exclude?
-      NPVariantWrapper includeVariant(*this);
-      if (!NPN_GetProperty(getNPP(), hostEntry, includeID, includeVariant.addressForReturn()) || 
-          !includeVariant.isBoolean()) {
-        Debug::log(Debug::Error) << "Got a host.include entry that is not a boolean.\n";
-        break;
-      }
-      bool include = includeVariant.getAsBoolean();
-      Debug::log(Debug::Info) << "Adding " << urlString << "(" << (include ? "include" : "exclude") << ")\n";
-
-      int slash = urlString.find( '/' );
-      if( slash == std::string::npos ) {
-        AllowedConnections::addRule(urlString, "localhost", !include);
-      } else {
-        AllowedConnections::addRule(urlString.substr( 0, slash), urlString.substr(slash+1), !include);
-      }
-    }
-  } else {
-    Debug::log(Debug::Error) << "ScriptableInstance::loadHostEntries called from outside the background page: " <<
-                             locationHref << "\n";
-  }
-}
-
-void ScriptableInstance::getHostPermission(const NPVariant* args, unsigned argCount, NPVariant* result) {
-  if (argCount != 1 || !NPVariantUtil::isString(args[0])) {
-    Debug::log(Debug::Error) << "ScriptableInstance::getHostPermission called with incorrect arguments.\n";
-  }
-
-  const NPString url = args[0].value.stringValue;
-  const string urlStr = convertToString(url);
-  bool allowed = false;
-
-  Debug::log(Debug::Info) << "getHostPermission() url " << urlStr << Debug::flush;
-  bool matches = AllowedConnections::matchesRule(
-      AllowedConnections::getHostFromUrl(urlStr),
-      AllowedConnections::getCodeServerFromUrl(urlStr),
-      &allowed);
-  string retStr;
-  if (!matches) {
-    retStr = UNKNOWN_STR;
-  } else if (allowed) {
-    retStr = INCLUDE_STR;
-  } else {
-    retStr = EXCLUDE_STR;
-  }
-
-  NPVariantProxy(*this, *result) = retStr;
-}
-
-void ScriptableInstance::testJsIdentity(const NPVariant* args, unsigned argCount, NPVariant* result) {
-  if (argCount != 2 || !NPVariantUtil::isObject(args[0]) ||
-      !NPVariantUtil::isObject(args[1]) ) {
-    Debug::log(Debug::Error) << "ScriptableInstance::testJsIdentity called"
-        << " with incorrect arguments.\n";
-  }
-  NPObject* obj1 = NPVariantUtil::getAsObject(args[0]);
-  NPObject* obj2 = NPVariantUtil::getAsObject(args[1]);
-  Debug::log(Debug::Info) << "obj1:" << obj1 << " obj2:" << obj2
-      << Debug::flush;
-  if( obj1 == obj2 ) {
-    Debug::log(Debug::Info) << "Idenity check passed; not using expando!"
-        << Debug::flush;
-    ScriptableInstance::jsIdentitySafe = true;
-  } else {
-    Debug::log(Debug::Info) << "Idenity check failed; using expando"
-        << Debug::flush;
-    ScriptableInstance::jsIdentitySafe = false;
-  }
-}
-
-
-void ScriptableInstance::connect(const NPVariant* args, unsigned argCount, NPVariant* result) {
-  if (argCount != 5 || !NPVariantUtil::isString(args[0])
-      || !NPVariantUtil::isString(args[1])
-      || !NPVariantUtil::isString(args[2])
-      || !NPVariantUtil::isString(args[3])
-      || !NPVariantUtil::isString(args[4])) {
-    // TODO: better failure?
-    Debug::log(Debug::Error) << "ScriptableInstance::connect called with incorrect arguments:\n";
-    for (unsigned i = 0; i < argCount; ++i) {
-      Debug::log(Debug::Error) << " " << i << " " << NPVariantProxy::toString(args[i]) << "\n";
-    }
-    Debug::log(Debug::Error) << Debug::flush;
-    result->type = NPVariantType_Void;
-    return;
-  }
-
-  // application provided URL string used for user facing things like the
-  // devmode tab title
-  const NPString appUrl = args[0].value.stringValue;
-  const string appUrlStr = convertToString(appUrl);
-
-  // window.location.href provided URL. (used for security)
-  const string urlStr = getLocationHref();
-
-  const NPString sessionKey = args[1].value.stringValue;
-  const NPString hostAddr = args[2].value.stringValue;
-  const NPString moduleName = args[3].value.stringValue;
-  const NPString hostedHtmlVersion = args[4].value.stringValue;
-  Debug::log(Debug::Info) << "ScriptableInstance::connect(url=" << NPVariantProxy::toString(args[0])
-      << ",sessionKey=" << NPVariantProxy::toString(args[1]) << ",host=" << NPVariantProxy::toString(args[2])
-      << ",module=" << NPVariantProxy::toString(args[3]) << ",hostedHtmlVers=" << NPVariantProxy::toString(args[4])
-      << ")" << Debug::flush;
-
-  bool allowed = false;
-  AllowedConnections::matchesRule(
-      AllowedConnections::getHostFromUrl(urlStr),
-      AllowedConnections::getCodeServerFromUrl(appUrlStr),
-      &allowed);
-  if (!allowed) {
-    BOOLEAN_TO_NPVARIANT(false, *result);
-    result->type = NPVariantType_Bool;
-    return;
-  }
-
-  bool connected = false;
-  unsigned port = 9997;  // TODO(jat): should there be a default?
-  int n = GetNPStringUTF8Length(hostAddr);
-  scoped_ptr<char> host(new char[n + 1]);
-  const char* s = GetNPStringUTF8Characters(hostAddr);
-  char* d = host.get();
-  while (n > 0 && *s != ':') {
-    n--;
-    *d++ = *s++;
-  }
-  *d = 0;
-  if (n > 0) {
-    port = atoi(s + 1);
-  }
-  Debug::log(Debug::Info) << "  host=" << host.get() << ",port=" << port << Debug::flush;
-
-
-  if (!_channel->connectToHost(host.get(), port)) {
-    BOOLEAN_TO_NPVARIANT(false, *result);
-    result->type = NPVariantType_Bool;
-  }
-
-  string hostedHtmlVersionStr = convertToString(hostedHtmlVersion);
-  if (!_channel->init(this, BROWSERCHANNEL_PROTOCOL_VERSION,
-      BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersionStr)) {
-    BOOLEAN_TO_NPVARIANT(false, *result);
-    result->type = NPVariantType_Bool;
-  }
-
-  string moduleNameStr = convertToString(moduleName);
-  string userAgent(NPN_UserAgent(getNPP()));
-  string tabKeyStr = computeTabIdentity();
-  string sessionKeyStr = convertToString(sessionKey);
-  Debug::log(Debug::Debugging) << "  connected, sending loadModule" << Debug::flush;
-  connected = LoadModuleMessage::send(*_channel, appUrlStr, tabKeyStr, sessionKeyStr,
-      moduleNameStr, userAgent, this);
-  BOOLEAN_TO_NPVARIANT(connected, *result);
-  result->type = NPVariantType_Bool;
-}
-
-int ScriptableInstance::getLocalObjectRef(NPObject* obj) {
-  int id = localObjects.getObjectId(obj);
-  if(id == -1) {
-    id = localObjects.add(obj);
-  }
-  return id;
-}
-
-void ScriptableInstance::fatalError(HostChannel& channel, const string& message) {
-  // TODO(jat): better error handling
-  Debug::log(Debug::Error) << "Fatal error: " << message << Debug::flush;
-}
-
-void ScriptableInstance::dupString(const char* str, NPString& npString) {
-  npString.UTF8Length = static_cast<uint32_t>(strlen(str));
-  NPUTF8* chars = static_cast<NPUTF8*>(NPN_MemAlloc(npString.UTF8Length));
-  memcpy(chars, str, npString.UTF8Length);
-  npString.UTF8Characters = chars;
-}
-
-// SessionHandler methods
-void ScriptableInstance::freeValue(HostChannel& channel, int idCount, const int* const ids) {
-  Debug::log(Debug::Debugging) << "freeValue(#ids=" << idCount << ")" << Debug::flush;
-  for (int i = 0; i < idCount; ++i) {
-    Debug::log(Debug::Spam) << " id=" << ids[i] << Debug::flush;
-    localObjects.free(ids[i]);
-  }
-}
-
-void ScriptableInstance::loadJsni(HostChannel& channel, const string& js) {
-  NPString npScript;
-  dupString(js.c_str(), npScript);
-  NPVariantWrapper npResult(*this);
-  Debug::log(Debug::Spam) << "loadJsni - \n" << js << Debug::flush;
-  if (!NPN_Evaluate(getNPP(), window, &npScript, npResult.addressForReturn())) {
-    Debug::log(Debug::Error) << "loadJsni failed\n" << js << Debug::flush;
-  }
-}
-
-gwt::Value ScriptableInstance::clientMethod_getProperty(HostChannel& channel, int numArgs, const gwt::Value* const args) {
-  if (numArgs != 2 || !args[0].isInt() || (!args[1].isString() && !args[1].isInt())) {
-    Debug::log(Debug::Error) << "Incorrect invocation of getProperty: #args=" << numArgs << ":";
-    for (int i = 0; i < numArgs; ++i) {
-      Debug::log(Debug::Error) << " " << i << "=" << args[i].toString();
-    }
-    Debug::log(Debug::Error) << Debug::flush;
-    return gwt::Value();
-  }
-  int id = args[0].getInt();
-  NPObject* obj = localObjects.getById(id);
-  NPIdentifier propID;
-  if (args[1].isString()) {
-    string propName = args[1].getString();
-    propID = NPN_GetStringIdentifier(propName.c_str());
-  } else {
-    int propNum = args[1].getInt();
-    propID = NPN_GetIntIdentifier(propNum);
-  }
-  NPVariantWrapper npResult(*this);
-  if (!NPN_GetProperty(getNPP(), obj, propID, npResult.addressForReturn())) {
-    Debug::log(Debug::Warning) << "getProperty(id=" << id << ", prop="
-        << NPN_UTF8FromIdentifier(propID) << ") failed" << Debug::flush;
-    return gwt::Value();
-  }
-  return npResult.getAsValue(*this);
-}
-
-gwt::Value ScriptableInstance::clientMethod_setProperty(HostChannel& channel, int numArgs, const gwt::Value* const args) {
-  if (numArgs != 2 || !args[0].isInt() || (!args[1].isString() && !args[1].isInt())) {
-    Debug::log(Debug::Error) << "Incorrect invocation of setProperty: #args="
-        << numArgs << ":";
-    for (int i = 0; i < numArgs; ++i) {
-      Debug::log(Debug::Error) << " " << i << "=" << args[i].toString();
-    }
-    Debug::log(Debug::Error) << Debug::flush;
-    return gwt::Value();
-  }
-  int id = args[0].getInt();
-  NPObject* obj = localObjects.getById(id);
-  NPIdentifier propID;
-  if (args[1].isString()) {
-    string propName = args[1].getString();
-    propID = NPN_GetStringIdentifier(propName.c_str());
-  } else {
-    int propNum = args[1].getInt();
-    propID = NPN_GetIntIdentifier(propNum);
-  }
-  NPVariantWrapper npValue(*this);
-  npValue.operator=(args[2]);
-  if (!NPN_SetProperty(getNPP(), obj, propID, npValue.address())) {
-    Debug::log(Debug::Warning) << "setProperty(id=" << id << ", prop="
-        << NPN_UTF8FromIdentifier(propID) << ", val=" << args[2].toString()
-        << ") failed" << Debug::flush;
-    return gwt::Value();
-  }
-  return gwt::Value();
-}
-
-/**
- * SessionHandler.invoke - used by LoadModule and reactToMessages* to process server-side
- * requests to invoke methods in Javascript or the plugin.
- */
-bool ScriptableInstance::invokeSpecial(HostChannel& channel, SpecialMethodId dispatchId,
-    int numArgs, const gwt::Value* const args, gwt::Value* returnValue) {
-  switch (dispatchId) {
-  case SessionHandler::HasMethod:
-  case SessionHandler::HasProperty:
-    break;
-  case SessionHandler::SetProperty:
-    *returnValue = clientMethod_setProperty(channel, numArgs, args);
-    return false;
-  case SessionHandler::GetProperty:
-    *returnValue = clientMethod_getProperty(channel, numArgs, args);
-    return false;
-  default:
-    break;
-  }
-  Debug::log(Debug::Error) << "Unexpected special method " << dispatchId
-      << " called on plugin; #args=" << numArgs << ":";
-  for (int i = 0; i < numArgs; ++i) {
-    Debug::log(Debug::Error) << " " << i << "=" << args[i].toString();
-  }
-  Debug::log(Debug::Error) << Debug::flush;
-  // TODO(jat): should we create a real exception object?
-  string buf("unexpected invokeSpecial(");
-  buf += static_cast<int>(dispatchId);
-  buf += ")";
-  returnValue->setString(buf);
-  return true;
-}
-
-bool ScriptableInstance::invoke(HostChannel& channel, const gwt::Value& thisRef,
-    const string& methodName, int numArgs, const gwt::Value* const args,
-    gwt::Value* returnValue) {
-  Debug::log(Debug::Debugging) << "invokeJS(" << methodName << ", this=" 
-      << thisRef.toString() << ", numArgs=" << numArgs << ")" << Debug::flush;
-  NPVariantArray varArgs(*this, numArgs + 2);
-  varArgs[0] = thisRef;
-  varArgs[1] = methodName;
-  for (int i = 0; i < numArgs; ++i) {
-    varArgs[i + 2] = args[i];
-  }
-  const NPVariant* argArray = varArgs.getArray();
-  if (Debug::level(Debug::Spam)) {
-    for (int i = 0; i < varArgs.getSize(); ++i) {
-      Debug::log(Debug::Spam) << "  arg " << i << " is "
-          << NPVariantProxy::toString(argArray[i]) << Debug::flush;
-    }
-  }
-  NPVariantWrapper wrappedRetVal(*this);
-  if (!NPN_Invoke(getNPP(), window, jsInvokeID, argArray, varArgs.getSize(),
-      wrappedRetVal.addressForReturn())) {
-    Debug::log(Debug::Error) << "*** invokeJS(" << methodName << ", this="
-        << thisRef.toString() << ", numArgs=" << numArgs << ") failed"
-        << Debug::flush;
-    // TODO(jat): should we create a real exception object?
-    returnValue->setString("invoke of " + methodName + " failed");
-    return true;
-  }
-  Debug::log(Debug::Spam) << "  wrapped return is " << wrappedRetVal.toString() << Debug::flush;
-  NPVariantWrapper exceptFlag(*this);
-  NPVariantWrapper retval(*this);
-  NPObject* wrappedArray = wrappedRetVal.getAsObject();
-  if (!NPN_GetProperty(getNPP(), wrappedArray, idx0, exceptFlag.addressForReturn())) {
-    Debug::log(Debug::Error) << " Error getting element 0 of wrapped return value ("
-        << wrappedRetVal << ") on call to " << methodName << Debug::flush;
-  }
-  if (!NPN_GetProperty(getNPP(), wrappedArray, idx1, retval.addressForReturn())) {
-    Debug::log(Debug::Error) << " Error getting element 1 of wrapped return value ("
-        << wrappedRetVal << ") on call to " << methodName << Debug::flush;
-  }
-  Debug::log(Debug::Debugging) << "  return value " << retval.toString() << Debug::flush;
-  *returnValue = retval.getAsValue(*this);
-  if (exceptFlag.isInt() && exceptFlag.getAsInt() != 0) {
-    Debug::log(Debug::Debugging) << "  exception: " << retval << Debug::flush;
-    return true;
-  }
-  return false;
-}
-
-bool ScriptableInstance::JavaObject_invoke(int objectId, int dispId,
-    const NPVariant* args, uint32_t numArgs, NPVariant* result) {
-  Debug::log(Debug::Debugging) << "JavaObject_invoke(dispId= " << dispId << ", numArgs=" << numArgs << ")" << Debug::flush;
-  if (Debug::level(Debug::Spam)) {
-    for (uint32_t i = 0; i < numArgs; ++i) {
-      Debug::log(Debug::Spam) << "  " << i << " = " << args[i] << Debug::flush;
-    }
-  }
-
-  bool isRawToString = false;
-  if (dispId == -1) {
-    dispId = 0;
-    isRawToString = true;
-  }
-
-  gwt::Value javaThis;
-  javaThis.setJavaObject(objectId);
-  scoped_array<gwt::Value> vargs(new gwt::Value[numArgs]);
-  for (unsigned i = 0; i < numArgs; ++i) {
-    vargs[i] = NPVariantProxy::getAsValue(args[i], *this);
-  }
-  bool isException = false;
-  gwt::Value returnValue;
-  if (!InvokeMessage::send(*_channel, javaThis, dispId, numArgs, vargs.get())) {
-    Debug::log(Debug::Error) << "JavaObject_invoke: failed to send invoke message" << Debug::flush;
-  } else {
-    Debug::log(Debug::Debugging) << " return from invoke" << Debug::flush;
-    scoped_ptr<ReturnMessage> retMsg(_channel->reactToMessagesWhileWaitingForReturn(this));
-    if (!retMsg.get()) {
-      Debug::log(Debug::Error) << "JavaObject_invoke: failed to get return value" << Debug::flush;
-    } else {
-      if (isRawToString) {
-        // toString() needs the raw value
-        NPVariantProxy::assignFrom(*this, *result, retMsg->getReturnValue());
-        return !retMsg->isException();
-      }
-      isException = retMsg->isException();
-      returnValue = retMsg->getReturnValue();
-    }
-  }
-  // Wrap the result
-  return makeResult(isException, returnValue, result);
-}
-
-bool ScriptableInstance::JavaObject_getProperty(int objectId, int dispId,
-    NPVariant* result) {
-  Debug::log(Debug::Debugging) << "JavaObject_getProperty(objectid="
-      << objectId << ", dispId=" << dispId << ")" << Debug::flush;
-  VOID_TO_NPVARIANT(*result);
-  gwt::Value propertyValue = ServerMethods::getProperty(*_channel, this, objectId, dispId);
-  if (propertyValue.isJsObject()) {
-    // TODO(jat): special-case for testing
-    NPObject* npObj = localObjects.getById(propertyValue.getJsObjectId());
-    OBJECT_TO_NPVARIANT(npObj, *result);
-    NPN_RetainObject(npObj);
-  } else {
-    NPVariantProxy::assignFrom(*this, *result, propertyValue);
-  }
-  Debug::log(Debug::Debugging) << " return val=" << propertyValue
-      << ", NPVariant=" << *result << Debug::flush;
-  if (NPVariantUtil::isObject(*result)) {
-    dumpObjectBytes(NPVariantUtil::getAsObject(*result));
-  }
-  if (NPVariantUtil::isObject(*result)) {
-    Debug::log(Debug::Debugging) << "  final return refcount = "
-        << NPVariantUtil::getAsObject(*result)->referenceCount << Debug::flush;
-  }
-  return true;
-}
-
-bool ScriptableInstance::JavaObject_setProperty(int objectId, int dispId,
-    const NPVariant* npValue) {
-  Debug::log(Debug::Debugging) << "JavaObject_setProperty(objectid="
-      << objectId << ", dispId=" << dispId << ", value=" << *npValue << ")" << Debug::flush;
-  if (NPVariantUtil::isObject(*npValue)) {
-    Debug::log(Debug::Debugging) << "  before localObj: refcount = "
-        << NPVariantUtil::getAsObject(*npValue)->referenceCount << Debug::flush;
-  }
-  gwt::Value value = NPVariantProxy::getAsValue(*npValue, *this, true);
-  if (NPVariantUtil::isObject(*npValue)) {
-    Debug::log(Debug::Debugging) << "  after localObj: refcount = "
-        << NPVariantUtil::getAsObject(*npValue)->referenceCount << Debug::flush;
-  }
-  if (NPVariantUtil::isObject(*npValue)) {
-    dumpObjectBytes(NPVariantUtil::getAsObject(*npValue));
-  }
-  Debug::log(Debug::Debugging) << "  as value: " << value << Debug::flush;
-  // TODO: no way to set an actual exception object! (Could ClassCastException on server.)
-  return ServerMethods::setProperty(*_channel, this, objectId, dispId, value);
-}
-
-bool ScriptableInstance::JavaObject_getToStringTearOff(NPVariant* result) {
-  Debug::log(Debug::Debugging) << "JavaObject_getToStringTearOff()" << Debug::flush;
-  VOID_TO_NPVARIANT(*result);
-
-  gwt::Value temp;
-  NPVariantArray varArgs(*this, 3);
-  temp.setNull();  varArgs[0] = temp; // proxy: no proxy needed
-  temp.setInt(0);  varArgs[1] = temp; // dispId: always 0 for toString()
-  temp.setInt(0);  varArgs[2] = temp; // argCount: always 0 for toString()
-
-  if (!NPN_Invoke(getNPP(), window, jsTearOffID, varArgs.getArray(), 3, result)) {
-    Debug::log(Debug::Error) << "*** JavaObject_getToStringTearOff() failed"
-        << Debug::flush;
-    return true;
-  }
-  return true;
-}
-
-JavaObject* ScriptableInstance::createJavaWrapper(int objectId) {
-  Debug::log(Debug::Debugging) << "createJavaWrapper(objectId=" << objectId <<  ")" << Debug::flush;
-  JavaObject* jObj;
-  hash_map<int, JavaObject*>::iterator it = javaObjects.find(objectId);
-  if (it != javaObjects.end()) {
-    jObj = it->second;
-    NPN_RetainObject(jObj);
-    return jObj;
-  }
-  jObj = JavaObject::create(this, objectId);
-  javaObjects[objectId] = jObj;
-  return jObj;
-}
-
-void ScriptableInstance::destroyJavaWrapper(JavaObject* jObj) {
-  int objectId = jObj->getObjectId();
-  if (!javaObjects.erase(objectId)) {
-    Debug::log(Debug::Error) << "destroyJavaWrapper(id=" << objectId
-        << "): trying to free unknown JavaObject" << Debug::flush;
-  }
-  Debug::log(Debug::Debugging) << "destroyJavaWrapper(id=" << objectId << ")" << Debug::flush;
-  javaObjectsToFree.insert(objectId);
-}
-
-void ScriptableInstance::disconnectDetectedImpl() {
-  NPVariantWrapper result(*this);
-  NPN_Invoke(getNPP(), window, jsDisconnectedID, 0, 0, result.addressForReturn());
-}
-
-void ScriptableInstance::sendFreeValues(HostChannel& channel) {
-  unsigned n = javaObjectsToFree.size();
-  if (n) {
-    scoped_array<int> ids(new int[n]);
-    int i = 0;
-    for (std::set<int>::iterator it = javaObjectsToFree.begin();
-        it != javaObjectsToFree.end(); ++it) {
-      ids[i++] = *it;
-    }
-    if (ServerMethods::freeJava(channel, this, n, ids.get())) {
-      javaObjectsToFree.clear();
-    }
-  }
-}
diff --git a/plugins/npapi/ScriptableInstance.h b/plugins/npapi/ScriptableInstance.h
deleted file mode 100644
index df79ffa..0000000
--- a/plugins/npapi/ScriptableInstance.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef _H_ScriptableInstance
-#define _H_ScriptableInstance
-/*
- * 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.
- */
-
-#include <vector>
-#include <set>
-
-#include "Debug.h"
-
-#include "mozincludes.h"
-#include "HostChannel.h"
-#include "LoadModuleMessage.h"
-#include "LocalObjectTable.h"
-#include "SessionHandler.h"
-#include "HashMap.h"
-
-using std::vector;
-
-class JavaObject;
-class JavaClass;
-class Plugin;
-
-class ScriptableInstance : public NPObjectWrapper<ScriptableInstance>, SessionHandler {
-  friend class JavaObject;
-public:
-  ScriptableInstance(NPP npp);
-  ~ScriptableInstance();
-
-  void pluginDeath() {
-    // our local objects will get freed anyway when the plugin dies
-    localObjects.freeAll();
-    localObjects.setDontFree(true);
-    // TODO(jat): leaving this in causes SEGV upon plugin destruction in the
-    // NPN_ReleaseObject call.
-//    if (window) {
-//      NPN_ReleaseObject(window);
-//      window = 0;
-//    }
-  }
-  
-  // NPObjectWrapper methods
-  bool enumeration(NPIdentifier** values, uint32_t* count);
-  bool getProperty(NPIdentifier name, NPVariant* result);
-  bool setProperty(NPIdentifier name, const NPVariant* value);
-  bool invoke(NPIdentifier name, const NPVariant* args, unsigned argCount, NPVariant* result);
-  bool invokeDefault(const NPVariant* args, unsigned argCount, NPVariant* result);
-  bool hasMethod(NPIdentifier name);
-  bool hasProperty(NPIdentifier name);
-  
-  void dumpJSresult(const char* js);
-  
-  int getLocalObjectRef(NPObject* obj);
-
-  NPObject* getLocalObject(int refid) { return localObjects.getById(refid); }
-  
-  bool tryGetStringPrimitive(NPObject* obj, NPVariant& result);
-
-  JavaObject* createJavaWrapper(int objectId);
-  void destroyJavaWrapper(JavaObject*);
-
-  static const uint32_t VERSION = 1;
-
-protected:
-  virtual void disconnectDetectedImpl();
-
-private:  
-  // Map of object ID to JavaObject
-  hash_map<int, JavaObject*> javaObjects;
-  std::set<int> javaObjectsToFree;
-  
-  vector<JavaClass*> classes;
-  
-  Plugin& plugin;
-  HostChannel* _channel;
-  LocalObjectTable localObjects;
-
-  static bool jsIdentitySafe;
-  int savedValueIdx;
-
-  // Identifiers
-  const NPIdentifier _connectId;
-  const NPIdentifier initID;
-  const NPIdentifier toStringID;
-
-  const NPIdentifier loadHostEntriesID;
-  const NPIdentifier locationID;
-  const NPIdentifier hrefID;
-  const NPIdentifier urlID;
-  const NPIdentifier includeID;
-  const NPIdentifier getHostPermissionID;
-  const NPIdentifier testJsIdentityID;
-  
-  const NPIdentifier connectedID;
-  const NPIdentifier statsID;
-
-  const NPIdentifier jsDisconnectedID;
-  const NPIdentifier jsInvokeID;
-  const NPIdentifier jsResultID;
-  const NPIdentifier jsTearOffID;
-  const NPIdentifier jsValueOfID;
-  const NPIdentifier idx0;
-  const NPIdentifier idx1;
-  
-  NPObject* window;
-  void dupString(const char* str, NPString& npString);
-  void dumpObjectBytes(NPObject* obj);
-  bool makeResult(bool isException, const gwt::Value& value, NPVariant* result);
-  
-  // SessionHandler methods
-  virtual bool invoke(HostChannel& channel, const gwt::Value& thisObj,
-      const std::string& methodName, int numArgs, const gwt::Value* const args,
-      gwt::Value* returnValue);
-  virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId dispatchId,
-      int numArgs, const gwt::Value* const args, gwt::Value* returnValue);
-  virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
-  virtual void sendFreeValues(HostChannel& channel);
-  virtual void loadJsni(HostChannel& channel, const std::string& js);
-  virtual void fatalError(HostChannel& channel, const std::string& message);
-
-  void connect(const NPVariant* args, unsigned argCount, NPVariant* result);
-  void init(const NPVariant* args, unsigned argCount, NPVariant* result);
-  void loadHostEntries(const NPVariant* args, unsigned argCount, NPVariant* result);
-  void getHostPermission(const NPVariant* args, unsigned argCount, NPVariant* result);
-  void testJsIdentity(const NPVariant* args, unsigned argCount, NPVariant* result);
-  gwt::Value clientMethod_getProperty(HostChannel& channel, int numArgs, const gwt::Value* const args);
-  gwt::Value clientMethod_setProperty(HostChannel& channel, int numArgs, const gwt::Value* const args);
-  
-  void JavaObject_invalidate(int objectId);
-  bool JavaObject_invoke(int objectId, int dispId, const NPVariant* args,
-      uint32_t numArgs, NPVariant* result);
-  bool JavaObject_getProperty(int objectId, int dispId, NPVariant* result);
-  bool JavaObject_setProperty(int objectId, int dispId, const NPVariant* value);
-  bool JavaObject_getToStringTearOff(NPVariant* result);
-
-private:
-  std::string computeTabIdentity();
-  std::string getLocationHref();
-};
-
-#endif
diff --git a/plugins/npapi/SigningCommands.txt b/plugins/npapi/SigningCommands.txt
deleted file mode 100644
index 67869d4..0000000
--- a/plugins/npapi/SigningCommands.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# Create new certificate database
-certutil -N -d certdb
-
-# Create Object CA certificate
-certutil -d certdb -S -n 'GWT Plugin' -t u,u,Ccu -g 2048 -x -v 24 -5 -s 'CN=GWT Plugin,O=Google Inc,OU=Google Web Toolkit,ST=California,C=US,UID=jat,E=Google-Web-Toolkit-Contributors@googlegroups.com'
-#   add #3 & #7, then specify as critical extension
-
-# Export Object CA certificate in DER format, for import into browser
-certutil -d certdb -L -n 'GWT Plugin' -r >GwtPlugin.der
diff --git a/plugins/npapi/VisualStudio/npapi-plugin.sln b/plugins/npapi/VisualStudio/npapi-plugin.sln
deleted file mode 100755
index 1705f7d..0000000
--- a/plugins/npapi/VisualStudio/npapi-plugin.sln
+++ /dev/null
@@ -1,26 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "npapi-plugin", "npapi-plugin.vcxproj", "{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Debug|Win64 = Debug|Win64
-		Release|Win32 = Release|Win32
-		Release|Win64 = Release|Win64
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win32.ActiveCfg = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win32.Build.0 = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win64.ActiveCfg = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Debug|Win64.Build.0 = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win32.ActiveCfg = Release|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win32.Build.0 = Release|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win64.ActiveCfg = Release|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}.Release|Win64.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/plugins/npapi/VisualStudio/npapi-plugin.vcxproj b/plugins/npapi/VisualStudio/npapi-plugin.vcxproj
deleted file mode 100644
index 35447bd..0000000
--- a/plugins/npapi/VisualStudio/npapi-plugin.vcxproj
+++ /dev/null
@@ -1,174 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}</ProjectGuid>
-    <RootNamespace>npapi-plugin</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-    <TargetName>npGwtDevPlugin</TargetName>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..;$(ProjectDir)\..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\gwt-dev-plugin\WINNT_x86-msvc\npGwtDevPlugin.dll</OutputFile>
-      <ModuleDefinitionFile>$(ProjectDir)\..\npGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>Full</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..;$(ProjectDir)\..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ExceptionHandling>Sync</ExceptionHandling>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <TreatWarningAsError>false</TreatWarningAsError>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\gwt-dev-plugin\WINNT_x86-msvc\npGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>..\npGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\JavaObject.h" />
-    <ClInclude Include="..\LocalObjectTable.h" />
-    <ClInclude Include="..\mozincludes.h" />
-    <ClInclude Include="..\NPObjectWrapper.h" />
-    <ClInclude Include="..\NPVariantWrapper.h" />
-    <ClInclude Include="..\Plugin.h" />
-    <ClInclude Include="..\resource.h" />
-    <ClInclude Include="..\ScriptableInstance.h" />
-    <ClInclude Include="..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\common\Debug.h" />
-    <ClInclude Include="..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\common\Message.h" />
-    <ClInclude Include="..\..\common\Platform.h" />
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
-    <ClInclude Include="..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\common\Socket.h" />
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\common\Value.h" />
-    <ClInclude Include="..\npapi\npapi.h" />
-    <ClInclude Include="..\npapi\nphostapi.h" />
-    <ClInclude Include="..\npapi\npruntime.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\npGwtDevPlugin.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\JavaObject.cpp" />
-    <ClCompile Include="..\LocalObjectTable.cpp" />
-    <ClCompile Include="..\main.cpp" />
-    <ClCompile Include="..\npn_bindings.cpp" />
-    <ClCompile Include="..\Plugin.cpp" />
-    <ClCompile Include="..\ScriptableInstance.cpp" />
-    <ClCompile Include="..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\npGwtDevPlugin.def" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/npapi/arch b/plugins/npapi/arch
deleted file mode 100644
index 027cd25..0000000
--- a/plugins/npapi/arch
+++ /dev/null
@@ -1 +0,0 @@
-Linux_x86-gcc3
diff --git a/plugins/npapi/computearch b/plugins/npapi/computearch
deleted file mode 100755
index 9d7c343..0000000
--- a/plugins/npapi/computearch
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/bin/sh
-#
-# Compute the Firefox XPCOM-ABI string -- see
-#    http://developer.mozilla.org/en/docs/XPCOM_ABI
-# 
-
-# OS_TARGET portion should be one of:
-#   Linux
-#   Darwin - Mac OSX
-#   WINNT - Windows NT, 2000, XP and later
-#   SunOS - all Solaris versions
-#
-OS=`uname -s`
-
-# COMPILER should be one of:
-#    gcc2 - GNU C++ v2.x
-#    gcc3 - GNU C++ v3.x or v4.x
-#    msvc - MS Visual C++
-#    n32 - IRIX 6 C++ Compiler
-#    sunc - Sun C++ Compiler
-#    ibmc - IBM C++ Compiler
-#
-# TODO: figure out how to determine this in a better way
-case $OS in
-  SunOS)
-    COMPILER=sunc
-    ;;
-  WINNT)
-    COMPILER=msvc
-    ;;
-  *)
-    COMPILER=gcc3
-    ;;
-esac
-
-# TARGET_XPCOM_ABI consists of ARCH and COMPILER
-
-# Currently acceptable ARCH values are:
-#    x86 - i386 and up, 32-bit mode
-#    x86_64 - AMD64/EMT64 processors in 64-bit mode
-#    ppc
-#    alpha
-#    sparc
-#    ia64 - Itanium
-#
-ARCH=`uname -m`
-case "$ARCH" in
-  x86_64 | ppc | sparc | alpha | ia64)
-    # these don't need changing
-    ;;
-  athlon | i386 | i486 | i586 | i686 | i86pc)
-    ARCH=x86
-    ;;
-  *Macintosh*)
-    case `uname -p` in
-      powerpc)
-        ARCH=ppc
-        ;;
-      *)
-        echo "Unknown mac architecture '$ARCH'" >&2
-        exit 1
-        ;;
-    esac
-    ;;
-  *)
-    echo "Unknown architecture '$ARCH'" >&2
-    exit 1
-    ;;
-esac
-
-echo ${OS}_$ARCH-$COMPILER >$1
-exit 0
diff --git a/plugins/npapi/get32bitflag b/plugins/npapi/get32bitflag
deleted file mode 100755
index ff62c6a..0000000
--- a/plugins/npapi/get32bitflag
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-if [ ! -r "$1" ]
-then
-  echo "32"
-  exit 0
-fi
-
-read ARCH <$1
-
-case "$ARCH" in
-   *_64* | *sparc*)
-	echo "64"
-	;;
-   *)
-	echo "32"
-	;;
-esac
-exit 0
diff --git a/plugins/npapi/getarch b/plugins/npapi/getarch
deleted file mode 100755
index fc69c11..0000000
--- a/plugins/npapi/getarch
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-if [ -r $1 ]
-then
-  read k <$1
-  echo $k
-else 
-  echo "unknown"
-fi
-exit 0
diff --git a/plugins/npapi/getversion b/plugins/npapi/getversion
deleted file mode 100755
index c5ec58f..0000000
--- a/plugins/npapi/getversion
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-# Wrapper to prevent failure if svnversion isn't available
-
-V=`svnversion ${PWD}/.. 2>/dev/null`
-if [ $? -gt 0 -o -z "$V" ]
-then
-  V='0'
-fi
-echo $V | sed s/[^0-9].*$//
-exit 0
diff --git a/plugins/npapi/main.cpp b/plugins/npapi/main.cpp
deleted file mode 100644
index 0fb5b61..0000000
--- a/plugins/npapi/main.cpp
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- *  main.cpp
- *  gwt-hosted-mode
- *
- *  Created by Kelly Norton on 11/18/07.
- *  Copyright 2007 Google Inc. All rights reserved.
- *
- */
-
-#ifndef _WINDOWS
-#include <unistd.h>
-#endif
-
-#include "Debug.h"
-
-#include "mozincludes.h"
-#include "Plugin.h"
-#include "ScriptableInstance.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-#ifdef _WINDOWS
-#include <windows.h>
-BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) {
-  switch (ulReasonForCall) {
-    case DLL_PROCESS_ATTACH:
-      DisableThreadLibraryCalls(hModule);
-      break;
-    case DLL_THREAD_ATTACH:
-    case DLL_THREAD_DETACH:
-    case DLL_PROCESS_DETACH:
-      break;
-  }
-  return TRUE;
-}
-#endif
-extern "C" {
-
-  static const NPNetscapeFuncs* browser;
-
-  NPError	NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode,
-	  int16 argc, char* argn[], char* argv[], NPSavedData* saved);
-  NPError	NPP_Destroy(NPP instance, NPSavedData** save);
-  NPError	NPP_SetWindow(NPP instance, NPWindow* window);
-  NPError	NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream,
-	  NPBool seekable, uint16* stype);
-  NPError	NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
-  int32		NPP_WriteReady(NPP instance, NPStream* stream);
-  int32		NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len,
-	  void* buffer);
-  void		NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
-  void		NPP_Print(NPP instance, NPPrint* platformPrint);
-  int16		NPP_HandleEvent(NPP instance, void* event);
-  void		NPP_URLNotify(NPP instance, const char* URL, NPReason reason,
-	  void* notifyData);
-  NPError NP_GetValue(void*, NPPVariable variable, void *value);
-  NPError	NPP_GetValue(NPP instance, NPPVariable variable, void *value);
-  NPError	NPP_SetValue(NPP instance, NPNVariable variable, void *value);
-
-  // necessary for Mac
-#ifdef __APPLE_CC__
-  #pragma export on
-  int main(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* shutdownUPP);
-#endif
-  NPError WINAPI NP_Initialize(NPNetscapeFuncs* browserFuncs NPINIT_ARG(pluginFuncs));
-  NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pluginFuncs);
-  const char *NP_GetMIMEDescription();
-  const char *NPP_GetMIMEDescription();
-  NP_SHUTDOWN_RETURN_TYPE WINAPI NP_Shutdown(void);
-#ifdef __APPLE_CC__
-  #pragma export off
-#endif
-
-  // Function pointer variables:
-
-  NPError WINAPI NP_Initialize(NPNetscapeFuncs* browserFuncs NPINIT_ARG(pluginFuncs)) {
-    Debug::log(Debug::Info) << "NP_Initialize (gwt-hosted-mode/c++)";
-#ifndef _WINDOWS
-    Debug::log(Debug::Info) << ", pid=" << (unsigned) getpid();
-#endif
-    Debug::log(Debug::Info) << Debug::flush;
-    SetNPNFuncs(browserFuncs);
-    browser = &GetNPNFuncs();
-#ifdef NPINIT_GETS_ENTRYPOINTS
-    NP_GetEntryPoints(pluginFuncs);
-#endif
-    return NPERR_NO_ERROR;
-  }
-
-#ifdef __APPLE_CC__
-  int main(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* shutdownUPP) {
-    printf("main (gwt-dev-plugin/c++)\n");
-    if (shutdownUPP == NULL) {
-      return NPERR_INVALID_FUNCTABLE_ERROR;
-    }
-    *shutdownUPP = NP_Shutdown;//NewNPP_ShutdownProc(NP_Shutdown);
-    NP_Initialize(browserFuncs);
-    NP_GetEntryPoints(pluginFuncs);
-    return NPERR_NO_ERROR;
-  }
-#endif
-
-  NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pluginFuncs) {
-    Debug::log(Debug::Debugging) << "NP_GetEntryPoints" << Debug::flush;
-#ifdef BROWSER_WEBKIT
-    pluginFuncs->size          = sizeof(NPPluginFuncs);
-#else
-    if (pluginFuncs->size < sizeof(NPPluginFuncs)) {
-      return NPERR_INVALID_FUNCTABLE_ERROR;
-    }
-#endif
-    pluginFuncs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR;
-#if 1
-    pluginFuncs->newp          = NPP_New;
-    pluginFuncs->destroy       = NPP_Destroy;
-    pluginFuncs->setwindow     = NPP_SetWindow;
-    pluginFuncs->newstream     = NPP_NewStream;
-    pluginFuncs->destroystream = NPP_DestroyStream;
-    pluginFuncs->asfile        = NPP_StreamAsFile;
-    pluginFuncs->writeready    = NPP_WriteReady;
-#ifdef BROWSER_WEBKIT
-    pluginFuncs->write         = reinterpret_cast<NPP_WriteProcPtr>(NPP_Write);
-#else
-    pluginFuncs->write         = NPP_Write;
-#endif
-    pluginFuncs->print         = NPP_Print;
-    pluginFuncs->event         = NPP_HandleEvent;
-    pluginFuncs->urlnotify     = NPP_URLNotify;
-    pluginFuncs->getvalue      = NPP_GetValue;
-    pluginFuncs->setvalue      = NPP_SetValue;
-    pluginFuncs->javaClass     = NULL;
-#else
-    pluginFuncs->newp =          NewNPP_NewProc(NPP_New);
-    pluginFuncs->destroy =       NewNPP_DestroyProc(NPP_Destroy);
-    pluginFuncs->setwindow =     NewNPP_SetWindowProc(NPP_SetWindow);
-    pluginFuncs->newstream =     NewNPP_NewStreamProc(NPP_NewStream);
-    pluginFuncs->destroystream = NewNPP_DestroyStreamProc(NPP_DestroyStream);
-    pluginFuncs->asfile =        NewNPP_StreamAsFileProc(NPP_StreamAsFile);
-    pluginFuncs->writeready =    NewNPP_WriteReadyProc(NPP_WriteReady);
-    pluginFuncs->write =         NewNPP_WriteProc(NPP_Write);
-    pluginFuncs->print =         NewNPP_PrintProc(NPP_Print);
-    pluginFuncs->event =         NewNPP_HandleEventProc(NPP_HandleEvent);
-    pluginFuncs->urlnotify =     NewNPP_URLNotifyProc(NPP_URLNotify);
-    pluginFuncs->getvalue =      NewNPP_GetValueProc(NPP_GetValue);
-    pluginFuncs->setvalue =      NewNPP_SetValueProc(NPP_SetValue);
-#endif
-    return NPERR_NO_ERROR;
-  }
-
-  const char *NP_GetMIMEDescription() {
-    Debug::log(Debug::Info) << "NP_GetMIMEDescription: returned mime description" << Debug::flush;
-    return "application/x-gwt-dev-mode::GWT dev-mode plugin;application/x-gwt-hosted-mode::GWT dev-mode plugin";
-  }
-
-  const char *NPP_GetMIMEDescription() {
-    return NP_GetMIMEDescription();
-  }
-
-  NP_SHUTDOWN_RETURN_TYPE WINAPI NP_Shutdown(void) {
-    Debug::log(Debug::Debugging) << "NP_Shutdown" << Debug::flush;
-    return NP_SHUTDOWN_RETURN(NPERR_NO_ERROR);
-  }
-
-  NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[],
-      char* argv[], NPSavedData* saved) {
-    Debug::log(Debug::Info) << "NPP_New(instance=" << instance << ",mode=" << mode << ",argc="
-        << argc << ",args=[";
-    for (int i = 0; i < argc; ++i) {
-      Debug::log(Debug::Info) << (i ? "," : "") << argn[i] << "=" << argv[i];
-    }
-    Debug::log(Debug::Info) << "],saved=" << saved << "): version=" << browser->version
-        << Debug::flush;
-    // Version 14 provides browser->createobject, which we need for npruntime support.
-    if (browser->version < 14) {
-      return NPERR_INVALID_INSTANCE_ERROR;
-    }
-    if (instance == NULL) {
-      return NPERR_INVALID_INSTANCE_ERROR;
-    }
-    Plugin* obj;
-//    if (saved) {
-//      obj = new Plugin(instance, reinterpret_cast<ScriptableInstance*>(saved));
-//    } else {
-      obj = new Plugin(instance);
-//    }
-    instance->pdata = obj;
-
-#ifdef __APPLE_CC__
-    // On the Mac, we need to negotiate CoreGraphics and Cocoa even though
-    // we don't use them.
-    // See: http://code.google.com/p/chromium/issues/detail?id=134761
-
-    // select the right drawing model if necessary
-    NPBool supportsCoreGraphics = false;
-    if (browser->getvalue(instance, NPNVsupportsCoreGraphicsBool,
-      &supportsCoreGraphics) == NPERR_NO_ERROR && supportsCoreGraphics) {
-
-      browser->setvalue(instance, NPPVpluginDrawingModel,
-        (void*)NPDrawingModelCoreGraphics);
-    }
-
-    // select the Cocoa event model
-    NPBool supportsCocoaEvents = false;
-    if (browser->getvalue(instance, NPNVsupportsCocoaBool,
-      &supportsCocoaEvents) == NPERR_NO_ERROR && supportsCocoaEvents) {
-
-      browser->setvalue(instance, NPPVpluginEventModel,
-        (void*)NPEventModelCocoa);
-    }
-
-#endif
-
-    // Make this a windowless plugin.
-    return NPN_SetValue(instance, NPPVpluginWindowBool, NULL);
-  }
-
-  NPError NPP_Destroy(NPP instance, NPSavedData** save) {
-    Debug::log(Debug::Info) << "NPP_Destroy(instance=" << instance << ")" << Debug::flush;
-    if (instance == NULL) {
-      return NPERR_INVALID_INSTANCE_ERROR;
-    }
-    Plugin* plugin = static_cast<Plugin*>(instance->pdata);
-    if (plugin) {
-      delete plugin;
-      instance->pdata = 0;
-    }
-    return NPERR_NO_ERROR;
-  }
-
-  NPError NPP_SetWindow(NPP instance, NPWindow* window) {
-    Debug::log(Debug::Info) << "NPP_SetWindow(instance=" << instance << ",window=" << window
-        << ")" << Debug::flush;
-    return NPERR_NO_ERROR;
-  }
-   
-
-  NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype) {
-    Debug::log(Debug::Info) << "NPP_NewStream(instance=" << instance << ")" << Debug::flush;
-    *stype = NP_ASFILEONLY;
-    return NPERR_NO_ERROR;
-  }
-
-  NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) {
-    Debug::log(Debug::Info) << "NPP_DestroyStream(instance=" << instance << ")" << Debug::flush;
-    return NPERR_NO_ERROR;
-  }
-
-  int32 NPP_WriteReady(NPP instance, NPStream* stream) {
-    Debug::log(Debug::Info) << "NPP_WriteReady(instance=" << instance << ")" << Debug::flush;
-    return 0;
-  }
-
-  int32 NPP_Write(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer) {
-    Debug::log(Debug::Info) << "NPP_Write(instance=" << instance << ")" << Debug::flush;
-    return 0;
-  }
-
-  void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) {
-    Debug::log(Debug::Info) << "NPP_StreamAsFile(instance=" << instance << ")" << Debug::flush;
-  }
-
-  void NPP_Print(NPP instance, NPPrint* platformPrint) {
-    Debug::log(Debug::Info) << "NPP_Print(instance=" << instance << ")" << Debug::flush;
-  }
-
-  int16 NPP_HandleEvent(NPP instance, void* event) {
-    //Debug::log(Debug::Spam) << "NPP_HandleEvent(instance=" << instance << ")" << Debug::flush;
-    return 0 ;
-  }
-
-  void NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) {
-    Debug::log(Debug::Info) << "NPP_URLNotify(instance=" << instance << ")" << Debug::flush;
-  }
-
-  NPObject *NPP_GetScriptableInstance(NPP instance) {
-    Debug::log(Debug::Info) << "NPP_GetScriptableInstance(instance=" << instance << ")" << Debug::flush;
-    if (!instance) {
-      return 0;
-    }
-    Plugin* plugin = static_cast<Plugin*>(instance->pdata);
-    ScriptableInstance* scriptableInstance = plugin->getScriptableInstance();
-    NPN_RetainObject(scriptableInstance);  // caller expects it retained.
-    return scriptableInstance;
-  }
-  
-  NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) {
-    Debug::log(Debug::Info) << "NPP_GetValue(instance=" << instance << ",var=" << variable << ")"
-        << Debug::flush;
-    switch (variable) {
-      case NPPVpluginScriptableNPObject:
-        // here the plugin is asked by Mozilla to tell if it is scriptable
-        // we should return a valid interface id and a pointer to 
-        // nsScriptablePeer interface which we should have implemented
-        // and which should be defined in the corressponding *.xpt file
-        // in the bin/components folder
-        *static_cast<NPObject**>(value) = NPP_GetScriptableInstance(instance);
-        break;
-      default:
-        // pass other ones to the static version of GetValue
-        return NP_GetValue(0, variable, value);
-    }
-    return NPERR_NO_ERROR;
-  }
-
-  NPError NP_GetValue(void*, NPPVariable variable, void *value) {
-    Debug::log(Debug::Info) << "NP_GetValue(var=" << variable << ")" << Debug::flush;
-    switch (variable) {
-      case NPPVpluginNameString:
-        *static_cast<const char **>(value) = "GWT Development-Mode Plugin";
-        break;
-      case NPPVpluginDescriptionString:
-        *static_cast<const char **>(value) = "Plugin to enable debugging of Google Web Toolkit "
-            "applications in development mode.";
-        break;
-      default:
-        Debug::log(Debug::Info) << "NPP_GetValue(var=" << variable
-            << ") -- unexpected variable type" << Debug::flush;
-        return NPERR_GENERIC_ERROR;
-    }
-    return NPERR_NO_ERROR;
-  }
-
-  NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) {
-    Debug::log(Debug::Info) << "NPP_SetValue(instance=" << instance << ",var=" << variable << ")"
-        << Debug::flush;
-    return NPERR_NO_ERROR;
-  }
-}
diff --git a/plugins/npapi/manifest-template.json b/plugins/npapi/manifest-template.json
deleted file mode 100644
index 376cb1b..0000000
--- a/plugins/npapi/manifest-template.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "GWT Developer Plugin",
-  "version": "GWT_DEV_PLUGIN_VERSION",
-  "manifest_version": 2,
-
-  "description": "A plugin to enable debugging with GWT's Development Mode",
-  "icons": {
-    "16": "gwt16.png",
-    "32": "gwt32.png",
-    "48": "gwt48.png",
-    "64": "gwt64.png",
-    "128": "gwt128.png"
-  },
-
-  "background": {
-     "page": "background.html"
-   },
-  "options_page" : "DevModeOptions.html",
-  "page_action" : {
-    "default_icon" : "gwt32.png",
-    "default_title" : "GWT Development Mode",
-    "default_popup" : "page_action.html"
-  },
-  "permissions" : [
-    "tabs"
-  ],
-  "plugins": [
-    { "path": "WINNT_x86-msvc/npGwtDevPlugin.dll", "public": true },
-    { "path": "Linux_x86-gcc3/libGwtDevPlugin.so", "public": true },
-    { "path": "Linux_x86_64-gcc3/libGwtDevPlugin.so", "public": true },
-    { "path": "Darwin-gcc3/gwtDev.plugin", "public": true }
-  ]
-}
diff --git a/plugins/npapi/mozincludes.h b/plugins/npapi/mozincludes.h
deleted file mode 100644
index 302b2eb..0000000
--- a/plugins/npapi/mozincludes.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _H_mozincludes
-#define _H_mozincludes
-
-// Defines private prototypes for copy constructor and assigment operator. Do
-// not implement these methods.
-#define DISALLOW_EVIL_CONSTRUCTORS(CLASS) \
- private:                                 \
-  CLASS(const CLASS&);                    \
-  CLASS& operator=(const CLASS&)
-
-#include "npapi/npapi.h"
-#include "npapi/nphostapi.h"
-#include "npapi/npruntime.h"
-
-void SetNPNFuncs(NPNetscapeFuncs* npnFuncs);
-const NPNetscapeFuncs& GetNPNFuncs();
-
-#include "NPObjectWrapper.h"
-
-inline const NPUTF8 *GetNPStringUTF8Characters(const NPString &npstr) {
-  return npstr.UTF8Characters;
-}
-
-inline uint32 GetNPStringUTF8Length(const NPString &npstr) {
-  return npstr.UTF8Length;
-}
-
-// Convenience wrappers to make an NPVariant from various string types.
-#define STDSTRING_TO_NPVARIANT(str, var) \
-  STRINGN_TO_NPVARIANT(str.data(), static_cast<uint32_t>(str.length()), var)
-
-#define NPSTRING_TO_NPVARIANT(npstr, var) \
-  STRINGN_TO_NPVARIANT(GetNPStringUTF8Characters(npstr), \
-                       GetNPStringUTF8Length(npstr), var)
-
-#ifdef linux
-#define OSCALL /**/
-#define WINAPI /**/
-#define DLLEXP /**/
-#define NPINIT_ARG(argname) , NPPluginFuncs* argname
-#define NPINIT_GETS_ENTRYPOINTS
-#define NP_SHUTDOWN_RETURN_TYPE NPError
-#define NP_SHUTDOWN_RETURN(val) (val)
-#endif
-
-#ifdef _WINDOWS
-#define DLLEXP __declspec(dllexport)
-#define NPINIT_ARG(argname) /**/
-#define NP_SHUTDOWN_RETURN_TYPE NPError
-#define NP_SHUTDOWN_RETURN(val) (val)
-#endif
-
-#ifdef __mac
-#define OSCALL /**/
-#define WINAPI /**/
-#define DLLEXP /**/
-#define NPINIT_ARG(argname) /**/
-#define NP_SHUTDOWN_RETURN_TYPE void
-#define NP_SHUTDOWN_RETURN(val) /**/
-typedef void (* NP_LOADDS NPP_ShutdownUPP)(void); // from npupp.h
-#endif
-
-#endif
diff --git a/plugins/npapi/npGwtDevPlugin.def b/plugins/npapi/npGwtDevPlugin.def
deleted file mode 100644
index 5a7d84b..0000000
--- a/plugins/npapi/npGwtDevPlugin.def
+++ /dev/null
@@ -1,7 +0,0 @@
-LIBRARY npGwtDevPlugin
-
-EXPORTS
-  NP_GetEntryPoints			@1
-  NP_Initialize				@2
-  NP_Shutdown				@3
-  NP_GetMIMEDescription		@4
\ No newline at end of file
diff --git a/plugins/npapi/npGwtDevPlugin.rc b/plugins/npapi/npGwtDevPlugin.rc
deleted file mode 100644
index 913b4ea..0000000
--- a/plugins/npapi/npGwtDevPlugin.rc
+++ /dev/null
@@ -1,111 +0,0 @@
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-#include "windows.h"
-#include "winres.h"
-#undef APSTUDIO_READONLY_SYMBOLS
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif
-
-1 VERSIONINFO
-  FILEVERSION 0,9,0,0
-  PRODUCTVERSION 0,9,0,0
-  FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
-  FILEFLAGS 0x1L
-#else
-  FILEFLAGS 0x0L
-#endif
-  FILEOS 0x40004L
-  FILETYPE 0x2L
-  FILESUBTYPE 0x0L
-BEGIN
-  BLOCK "StringFileInfo"
-  BEGIN
-  	BLOCK "040904e4"
-  	BEGIN
-  	  VALUE "CompanyName", 		"Google Inc"
-  	  VALUE "FileDescription",	"GWT Development Mode Plugin"
-#if 0
-  	  VALUE "FileExtents",		""
-#endif
-  	  VALUE "FileOpenName",		"Plugin to allow debugging of GWT applications in hosted mode."
-  	  VALUE "FileVersion",		"0.9.0"
-  	  VALUE "InternalName",		"GWT DMP"
-  	  VALUE "LegalCopyright",	"Copyright © 2009 Google Inc.  All rights reserved."
-  	  VALUE "MIMEType",			"application/x-gwt-hosted-mode"
-  	  VALUE "OriginalFilename",	"npOOPHM.dll"
-  	  VALUE "ProductName",		"GWT DMP Plugin"
-  	  VALUE "ProductVersion",	"0.9.0"
-  	END
-  END
-  BLOCK "VarFileInfo"
-  BEGIN
-    VALUE "Translation", 0x409, 1252
-  END
-END
-
-#ifdef APSTUDIO_INVOKED
-1 TEXTINCLUDE
-BEGIN
-  "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
-  "#include ""mfc/afxres.h""\r\n"
-  "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
-  "\r\n"
-  "\0"
-END
-
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Dialog
-//
-
-IDD_ALLOW_DIALOG DIALOGEX 0, 0, 188, 73
-STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION
-EXSTYLE WS_EX_TOPMOST
-CAPTION "GWT Plugin Security Alert"
-FONT 10, "Microsoft Sans Serif", 400, 0, 0x0
-BEGIN
-    CONTROL         "Remember this decision for this server",IDC_REMEMBER_CHECKBOX,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,30,31,129,10
-    LTEXT           "This web server is trying to initiate a GWT Development\r\nMode Connection -- should it be allowed?",IDC_STATIC,10,7,167,19
-    PUSHBUTTON      "Allow",IDC_ALLOW_BUTTON,37,50,50,14
-    DEFPUSHBUTTON   "Deny",IDCANCEL,100,50,50,14
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// DESIGNINFO
-//
-
-#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO 
-BEGIN
-    IDD_ALLOW_DIALOG, DIALOG
-    BEGIN
-        LEFTMARGIN, 7
-        RIGHTMARGIN, 181
-        TOPMARGIN, 7
-        BOTTOMMARGIN, 66
-    END
-END
-#endif    // APSTUDIO_INVOKED
-
-#else
-
-#endif
diff --git a/plugins/npapi/npapi/npapi.h b/plugins/npapi/npapi/npapi.h
deleted file mode 100644
index cca69c3..0000000
--- a/plugins/npapi/npapi/npapi.h
+++ /dev/null
@@ -1,827 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (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.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-
-/*
- *  npapi.h $Revision: 3.48 $
- *  Netscape client plug-in API spec
- */
-
-#ifndef _NPAPI_H_
-#define _NPAPI_H_
-
-
-// BEGIN GOOGLE GEARS MODIFICATIONS
-
-//#include "gears/base/common/int_types.h"
-// Signed integer types
-typedef signed char         int8;
-typedef short               int16;
-typedef int                 int32;
-#ifdef _MSC_VER  //_MSC_VER is defined iff the code is compiled by MSVC
-typedef __int64             int64;
-#else
-typedef long long           int64;
-#endif /* _MSC_VER */
-
-// Unsigned integer types
-typedef unsigned char      uint8;
-typedef unsigned short     uint16;
-typedef unsigned int       uint32;
-#ifdef _MSC_VER
-typedef unsigned __int64   uint64;
-#else
-typedef unsigned long long uint64;
-#endif /* _MSC_VER */
-
-// END GOOGLE GEARS MODIFICATIONS
-
-
-#ifdef __OS2__
-#pragma pack(1)
-#endif
-
-//#include "prtypes.h"
-/* Copied from xp_core.h */
-/* removed #ifdef for hpux defined in /usr/include/model.h */
-#ifndef _INT16
-#define _INT16
-#endif
-#ifndef _INT32
-#define _INT32
-#endif
-#ifndef _UINT16
-#define _UINT16
-#endif
-#ifndef _UINT32
-#define _UINT32
-#endif
-
-/* 
- * NO_NSPR_10_SUPPORT disables the inclusion 
- * of obsolete/protypes.h, whose int16, uint16, 
- * int32, and uint32 typedefs conflict with those 
- * in this file. 
- */ 
-#ifndef NO_NSPR_10_SUPPORT
-#define NO_NSPR_10_SUPPORT
-#endif
-#ifdef OJI
-#include "jri.h"                /* Java Runtime Interface */
-#endif
-
-#if defined (__OS2__ ) || defined (OS2)
-#	ifndef XP_OS2
-#		define XP_OS2 1
-#	endif /* XP_OS2 */
-#endif /* __OS2__ */
-
-#ifdef _WINDOWS
-// BEGIN GOOGLE MODIFICATIONS
-//#ifdef XP_WIN
-typedef __int32 int32_t;
-typedef unsigned __int32 uint32_t; 
-//#include <windows.h>
-//#endif // XP_WIN
-// END GOOGLE MODIFICATIONS
-
-#	ifndef XP_WIN
-#		define XP_WIN 1
-#	endif /* XP_WIN */
-#endif /* _WINDOWS */
-
-#ifdef __MWERKS__
-#	define _declspec __declspec
-#	ifdef __INTEL__
-#		undef NULL
-#		ifndef XP_WIN
-#			define XP_WIN 1
-#		endif /* XP_WIN */
-#	endif /* __INTEL__ */
-#endif /* __MWERKS__ */
-
-#ifdef XP_MACOSX
-#include <Carbon/Carbon.h>
-#ifdef __LP64__
-#define NP_NO_QUICKDRAW
-#endif
-#endif
-
-#if defined(XP_UNIX) 
-#	include <stdio.h>
-#	if defined(MOZ_X11)
-#		include <X11/Xlib.h>
-#		include <X11/Xutil.h>
-#	endif
-#endif
-
-/*----------------------------------------------------------------------*/
-/*                        Plugin Version Constants                      */
-/*----------------------------------------------------------------------*/
-
-#define NP_VERSION_MAJOR 0
-#define NP_VERSION_MINOR 19
-
-
-/* The OS/2 version of Netscape uses RC_DATA to define the
-   mime types, file extensions, etc that are required.
-   Use a vertical bar to separate types, end types with \0.
-   FileVersion and ProductVersion are 32bit ints, all other
-   entries are strings the MUST be terminated wwith a \0.
-
-AN EXAMPLE:
-
-RCDATA NP_INFO_ProductVersion { 1,0,0,1,}
-
-RCDATA NP_INFO_MIMEType    { "video/x-video|",
-                             "video/x-flick\0" }
-RCDATA NP_INFO_FileExtents { "avi|",
-                             "flc\0" }
-RCDATA NP_INFO_FileOpenName{ "MMOS2 video player(*.avi)|",
-                             "MMOS2 Flc/Fli player(*.flc)\0" }
-
-RCDATA NP_INFO_FileVersion       { 1,0,0,1 }
-RCDATA NP_INFO_CompanyName       { "Netscape Communications\0" }
-RCDATA NP_INFO_FileDescription   { "NPAVI32 Extension DLL\0"
-RCDATA NP_INFO_InternalName      { "NPAVI32\0" )
-RCDATA NP_INFO_LegalCopyright    { "Copyright Netscape Communications \251 1996\0"
-RCDATA NP_INFO_OriginalFilename  { "NVAPI32.DLL" }
-RCDATA NP_INFO_ProductName       { "NPAVI32 Dynamic Link Library\0" }
-
-*/
-
-
-/* RC_DATA types for version info - required */
-#define NP_INFO_ProductVersion      1
-#define NP_INFO_MIMEType            2
-#define NP_INFO_FileOpenName        3
-#define NP_INFO_FileExtents         4
-
-/* RC_DATA types for version info - used if found */
-#define NP_INFO_FileDescription     5
-#define NP_INFO_ProductName         6
-
-/* RC_DATA types for version info - optional */
-#define NP_INFO_CompanyName         7
-#define NP_INFO_FileVersion         8
-#define NP_INFO_InternalName        9
-#define NP_INFO_LegalCopyright      10
-#define NP_INFO_OriginalFilename    11
-
-#ifndef RC_INVOKED
-
-
-
-/*----------------------------------------------------------------------*/
-/*                       Definition of Basic Types                      */
-/*----------------------------------------------------------------------*/
-
-#ifndef _UINT16
-typedef unsigned short uint16;
-#endif
-
-#ifndef _UINT32
-#    if defined(__alpha) || defined(__amd64__) || defined(__x86_64__)
-typedef unsigned int uint32;
-#    else  /* __alpha */
-typedef unsigned long uint32;
-#    endif /* __alpha */
-#endif
-
-/*
- * AIX defines these in sys/inttypes.h included from sys/types.h
- */
-#ifndef AIX
-#ifndef _INT16
-typedef short int16;
-#endif
-
-#ifndef _INT32
-#    if defined(__alpha) || defined(__amd64__) || defined(__x86_64__)
-typedef int int32;
-#    else  /* __alpha */
-typedef long int32;
-#    endif /* __alpha */
-#endif
-#endif
-
-#ifndef FALSE
-#define FALSE (0)
-#endif
-#ifndef TRUE
-#define TRUE (1)
-#endif
-#ifndef NULL
-#define NULL (0L)
-#endif
-
-#ifdef XP_MACOSX
-typedef enum {
-#ifndef NP_NO_QUICKDRAW
-  NPDrawingModelQuickDraw = 0,
-#endif
-  NPDrawingModelCoreGraphics = 1
-} NPDrawingModel;
-#endif
-
-// copied from newer npapi.h - skybrian
-#ifdef XP_MACOSX
-typedef enum {
-#ifndef NP_NO_CARBON
-  NPEventModelCarbon = 0,
-#endif
-  NPEventModelCocoa = 1
-} NPEventModel;
-#endif
-
-typedef unsigned char	NPBool;
-typedef int16			NPError;
-typedef int16			NPReason;
-typedef char*			NPMIMEType;
-
-
-
-/*----------------------------------------------------------------------*/
-/*                       Structures and definitions                     */
-/*----------------------------------------------------------------------*/
-
-/*
- *  NPP is a plug-in's opaque instance handle
- */
-typedef struct _NPP
-{
-  void*	pdata;      /* plug-in private data */
-  void*	ndata;      /* netscape private data */
-} NPP_t;
-
-typedef NPP_t*  NPP;
-
-
-typedef struct _NPStream
-{
-  void*  pdata; /* plug-in private data */
-  void*  ndata; /* netscape private data */
-  const  char* url;
-  uint32 end;
-  uint32 lastmodified;
-  void*  notifyData;
-  const  char* headers; /* Response headers from host.
-                         * Exists only for >= NPVERS_HAS_RESPONSE_HEADERS.
-                         * Used for HTTP only; NULL for non-HTTP.
-                         * Available from NPP_NewStream onwards.
-                         * Plugin should copy this data before storing it.
-                         * Includes HTTP status line and all headers,
-                         * preferably verbatim as received from server,
-                         * headers formatted as in HTTP ("Header: Value"),
-                         * and newlines (\n, NOT \r\n) separating lines.
-                         * Terminated by \n\0 (NOT \n\n\0). */
-} NPStream;
-
-
-typedef struct _NPByteRange
-{
-  int32  offset; /* negative offset means from the end */
-  uint32 length;
-  struct _NPByteRange* next;
-} NPByteRange;
-
-
-typedef struct _NPSavedData
-{
-  int32	len;
-  void*	buf;
-} NPSavedData;
-
-
-typedef struct _NPRect
-{
-  uint16 top;
-  uint16 left;
-  uint16 bottom;
-  uint16 right;
-} NPRect;
-
-typedef struct _NPSize 
-{ 
-  int32 width; 
-  int32 height; 
-} NPSize; 
-
-#ifdef XP_UNIX
-/*
- * Unix specific structures and definitions
- */
-
-/*
- * Callback Structures.
- *
- * These are used to pass additional platform specific information.
- */
-enum {
-  NP_SETWINDOW = 1,
-  NP_PRINT
-};
-
-typedef struct
-{
-  int32 type;
-} NPAnyCallbackStruct;
-
-typedef struct
-{
-  int32        type;
-#ifdef MOZ_X11
-  Display*     display;
-  Visual*      visual;
-  Colormap     colormap;
-  unsigned int depth;
-#endif
-} NPSetWindowCallbackStruct;
-
-typedef struct
-{
-  int32 type;
-  FILE* fp;
-} NPPrintCallbackStruct;
-
-#endif /* XP_UNIX */
-
-
-/*
- *   The following masks are applied on certain platforms to NPNV and 
- *   NPPV selectors that pass around pointers to COM interfaces. Newer 
- *   compilers on some platforms may generate vtables that are not 
- *   compatible with older compilers. To prevent older plugins from 
- *   not understanding a new browser's ABI, these masks change the 
- *   values of those selectors on those platforms. To remain backwards
- *   compatible with differenet versions of the browser, plugins can 
- *   use these masks to dynamically determine and use the correct C++
- *   ABI that the browser is expecting. This does not apply to Windows 
- *   as Microsoft's COM ABI will likely not change.
- */
-
-#define NP_ABI_GCC3_MASK  0x10000000
-/*
- *   gcc 3.x generated vtables on UNIX and OSX are incompatible with 
- *   previous compilers.
- */
-#if (defined (XP_UNIX) && defined(__GNUC__) && (__GNUC__ >= 3))
-#define _NP_ABI_MIXIN_FOR_GCC3 NP_ABI_GCC3_MASK
-#else
-#define _NP_ABI_MIXIN_FOR_GCC3 0
-#endif
-
-
-#define NP_ABI_MACHO_MASK 0x01000000
-/*
- *   On OSX, the Mach-O executable format is significantly
- *   different than CFM. In addition to having a different
- *   C++ ABI, it also has has different C calling convention.
- *   You must use glue code when calling between CFM and
- *   Mach-O C functions. 
- */
-#if (defined(TARGET_RT_MAC_MACHO))
-#define _NP_ABI_MIXIN_FOR_MACHO NP_ABI_MACHO_MASK
-#else
-#define _NP_ABI_MIXIN_FOR_MACHO 0
-#endif
-
-
-#define NP_ABI_MASK (_NP_ABI_MIXIN_FOR_GCC3 | _NP_ABI_MIXIN_FOR_MACHO)
-
-/*
- * List of variable names for which NPP_GetValue shall be implemented
- */
-typedef enum {
-  NPPVpluginNameString = 1,
-  NPPVpluginDescriptionString,
-  NPPVpluginWindowBool,
-  NPPVpluginTransparentBool,
-  NPPVjavaClass,                /* Not implemented in Mozilla 1.0 */
-  NPPVpluginWindowSize,
-  NPPVpluginTimerInterval,
-
-  NPPVpluginScriptableInstance = (10 | NP_ABI_MASK),
-  NPPVpluginScriptableIID = 11,
-
-  /* Introduced in Mozilla 0.9.9 */
-  NPPVjavascriptPushCallerBool = 12,
-
-  /* Introduced in Mozilla 1.0 */
-  NPPVpluginKeepLibraryInMemory = 13,
-  NPPVpluginNeedsXEmbed         = 14,
-
-  /* Get the NPObject for scripting the plugin. Introduced in Firefox
-   * 1.0 (NPAPI minor version 14).
-   */
-  NPPVpluginScriptableNPObject  = 15,
-
-  /* Get the plugin value (as \0-terminated UTF-8 string data) for
-   * form submission if the plugin is part of a form. Use
-   * NPN_MemAlloc() to allocate memory for the string data. Introduced
-   * in Mozilla 1.8b2 (NPAPI minor version 15).
-   */
-  NPPVformValue = 16
-#ifdef XP_MACOSX
-  /* Used for negotiating drawing models */
-  , NPPVpluginDrawingModel = 1000
-#endif
-
-  // copied from newer npapi.h - skybrian
-#if defined(XP_MACOSX)
-  /* Used for negotiating event models */
-  , NPPVpluginEventModel = 1001
-  /* In the NPDrawingModelCoreAnimation drawing model, the browser asks the plug-in for a Core Animation layer. */
-  , NPPVpluginCoreAnimationLayer = 1003
-#endif
-
-} NPPVariable;
-
-/*
- * List of variable names for which NPN_GetValue is implemented by Mozilla
- */
-typedef enum {
-  NPNVxDisplay = 1,
-  NPNVxtAppContext,
-  NPNVnetscapeWindow,
-  NPNVjavascriptEnabledBool,
-  NPNVasdEnabledBool,
-  NPNVisOfflineBool,
-
-  /* 10 and over are available on Mozilla builds starting with 0.9.4 */
-  NPNVserviceManager = (10 | NP_ABI_MASK),
-  NPNVDOMElement     = (11 | NP_ABI_MASK),   /* available in Mozilla 1.2 */
-  NPNVDOMWindow      = (12 | NP_ABI_MASK),
-  NPNVToolkit        = (13 | NP_ABI_MASK),
-  NPNVSupportsXEmbedBool = 14,
-
-  /* Get the NPObject wrapper for the browser window. */
-  NPNVWindowNPObject = 15,
-
-  /* Get the NPObject wrapper for the plugins DOM element. */
-  NPNVPluginElementNPObject = 16,
-
-  NPNVSupportsWindowless = 17
-
-#ifdef XP_MACOSX
-  /* Used for negotiating drawing models */
-  , NPNVpluginDrawingModel = 1000
-#ifndef NP_NO_QUICKDRAW
-  , NPNVsupportsQuickDrawBool = 2000
-#endif
-  , NPNVsupportsCoreGraphicsBool = 2001
-#endif
-  // Copied from newer npapi - skybrian
-#if defined(XP_MACOSX)
-#ifndef NP_NO_CARBON
-  , NPNVsupportsCarbonBool = 3000 /* TRUE if the browser supports the Carbon event model */
-#endif
-  , NPNVsupportsCocoaBool = 3001 /* TRUE if the browser supports the Cocoa event model */
-#endif
-} NPNVariable;
-
-/*
- * The type of Tookkit the widgets use
- */
-typedef enum {
-  NPNVGtk12 = 1,
-  NPNVGtk2
-} NPNToolkitType;
-
-/*
- * The type of a NPWindow - it specifies the type of the data structure
- * returned in the window field.
- */
-typedef enum {
-  NPWindowTypeWindow = 1,
-  NPWindowTypeDrawable
-} NPWindowType;
-
-typedef struct _NPWindow
-{
-  void* window;  /* Platform specific window handle */
-                 /* OS/2: x - Position of bottom left corner  */
-                 /* OS/2: y - relative to visible netscape window */
-  int32 x;       /* Position of top left corner relative */
-  int32 y;       /* to a netscape page.					*/
-  uint32 width;  /* Maximum window size */
-  uint32 height;
-  NPRect clipRect; /* Clipping rectangle in port coordinates */
-                   /* Used by MAC only.			  */
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-  void * ws_info; /* Platform-dependent additonal data */
-#endif /* XP_UNIX */
-  NPWindowType type; /* Is this a window or a drawable? */
-} NPWindow;
-
-
-typedef struct _NPFullPrint
-{
-  NPBool pluginPrinted;/* Set TRUE if plugin handled fullscreen printing */
-  NPBool printOne;		 /* TRUE if plugin should print one copy to default printer */
-  void* platformPrint; /* Platform-specific printing info */
-} NPFullPrint;
-
-typedef struct _NPEmbedPrint
-{
-  NPWindow window;
-  void* platformPrint; /* Platform-specific printing info */
-} NPEmbedPrint;
-
-typedef struct _NPPrint
-{
-  uint16 mode;               /* NP_FULL or NP_EMBED */
-  union
-  {
-    NPFullPrint fullPrint;   /* if mode is NP_FULL */
-    NPEmbedPrint embedPrint; /* if mode is NP_EMBED */
-  } print;
-} NPPrint;
-
-#ifdef XP_MACOSX
-typedef EventRecord	NPEvent;
-#elif defined(XP_WIN)
-typedef struct _NPEvent
-{
-  uint16 event;
-  uint32 wParam;
-  uint32 lParam;
-} NPEvent;
-#elif defined(XP_OS2)
-typedef struct _NPEvent
-{
-  uint32 event;
-  uint32 wParam;
-  uint32 lParam;
-} NPEvent;
-#elif defined (XP_UNIX) && defined(MOZ_X11)
-typedef XEvent NPEvent;
-#else
-typedef void*			NPEvent;
-#endif /* XP_MACOSX */
-
-#ifdef XP_MACOSX
-typedef void* NPRegion;
-#ifndef NP_NO_QUICKDRAW
-typedef RgnHandle NPQDRegion;
-#endif
-typedef CGPathRef NPCGRegion;
-#elif defined(XP_WIN)
-//typedef HRGN NPRegion;
-typedef int NPRegion;
-#elif defined(XP_UNIX) && defined(MOZ_X11)
-typedef Region NPRegion;
-#else
-typedef void *NPRegion;
-#endif /* XP_MACOSX */
-
-#ifdef XP_MACOSX
-/*
- *  Mac-specific structures and definitions.
- */
-
-typedef struct NP_Port
-{
-  CGrafPtr port; /* Grafport */
-  int32 portx;   /* position inside the topmost window */
-  int32 porty;
-} NP_Port;
-
-typedef struct NP_CGContext
-{
-  CGContextRef context;
-  WindowRef window;
-} NP_CGContext;
-
-/*
- *  Non-standard event types that can be passed to HandleEvent
- */
-
-enum NPEventType {
-  NPEventType_GetFocusEvent = (osEvt + 16),
-  NPEventType_LoseFocusEvent,
-  NPEventType_AdjustCursorEvent,
-  NPEventType_MenuCommandEvent,
-  NPEventType_ClippingChangedEvent,
-  NPEventType_ScrollingBeginsEvent = 1000,
-  NPEventType_ScrollingEndsEvent
-};
-
-#ifdef OBSOLETE
-#define getFocusEvent     (osEvt + 16)
-#define loseFocusEvent    (osEvt + 17)
-#define adjustCursorEvent (osEvt + 18)
-#endif
-#endif /* XP_MACOSX */
-
-/*
- * Values for mode passed to NPP_New:
- */
-#define NP_EMBED 1
-#define NP_FULL  2
-
-/*
- * Values for stream type passed to NPP_NewStream:
- */
-#define NP_NORMAL     1
-#define NP_SEEK       2
-#define NP_ASFILE     3
-#define NP_ASFILEONLY 4
-
-#define NP_MAXREADY	(((unsigned)(~0)<<1)>>1)
-
-
-/*----------------------------------------------------------------------*/
-/*		     Error and Reason Code definitions			*/
-/*----------------------------------------------------------------------*/
-
-/*
- * Values of type NPError:
- */
-#define NPERR_BASE                         0
-#define NPERR_NO_ERROR                    (NPERR_BASE + 0)
-#define NPERR_GENERIC_ERROR               (NPERR_BASE + 1)
-#define NPERR_INVALID_INSTANCE_ERROR      (NPERR_BASE + 2)
-#define NPERR_INVALID_FUNCTABLE_ERROR     (NPERR_BASE + 3)
-#define NPERR_MODULE_LOAD_FAILED_ERROR    (NPERR_BASE + 4)
-#define NPERR_OUT_OF_MEMORY_ERROR         (NPERR_BASE + 5)
-#define NPERR_INVALID_PLUGIN_ERROR        (NPERR_BASE + 6)
-#define NPERR_INVALID_PLUGIN_DIR_ERROR    (NPERR_BASE + 7)
-#define NPERR_INCOMPATIBLE_VERSION_ERROR  (NPERR_BASE + 8)
-#define NPERR_INVALID_PARAM               (NPERR_BASE + 9)
-#define NPERR_INVALID_URL                 (NPERR_BASE + 10)
-#define NPERR_FILE_NOT_FOUND              (NPERR_BASE + 11)
-#define NPERR_NO_DATA                     (NPERR_BASE + 12)
-#define NPERR_STREAM_NOT_SEEKABLE         (NPERR_BASE + 13)
-
-/*
- * Values of type NPReason:
- */
-#define NPRES_BASE          0
-#define NPRES_DONE         (NPRES_BASE + 0)
-#define NPRES_NETWORK_ERR  (NPRES_BASE + 1)
-#define NPRES_USER_BREAK   (NPRES_BASE + 2)
-
-/*
- * Don't use these obsolete error codes any more.
- */
-#define NP_NOERR  NP_NOERR_is_obsolete_use_NPERR_NO_ERROR
-#define NP_EINVAL NP_EINVAL_is_obsolete_use_NPERR_GENERIC_ERROR
-#define NP_EABORT NP_EABORT_is_obsolete_use_NPRES_USER_BREAK
-
-/*
- * Version feature information
- */
-#define NPVERS_HAS_STREAMOUTPUT             8
-#define NPVERS_HAS_NOTIFICATION             9
-#define NPVERS_HAS_LIVECONNECT              9
-#define NPVERS_WIN16_HAS_LIVECONNECT        9
-#define NPVERS_68K_HAS_LIVECONNECT          11
-#define NPVERS_HAS_WINDOWLESS               11
-#define NPVERS_HAS_XPCONNECT_SCRIPTING      13
-#define NPVERS_HAS_NPRUNTIME_SCRIPTING      14
-#define NPVERS_HAS_FORM_VALUES              15
-#define NPVERS_HAS_POPUPS_ENABLED_STATE     16
-#define NPVERS_HAS_RESPONSE_HEADERS         17
-#define NPVERS_HAS_NPOBJECT_ENUM            18
-#define NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL 19
-
-/*----------------------------------------------------------------------*/
-/*                        Function Prototypes                           */
-/*----------------------------------------------------------------------*/
-
-#if defined(_WINDOWS) && !defined(WIN32)
-#define NP_LOADDS  _loadds
-#else
-#if defined(__OS2__)
-#define NP_LOADDS _System
-#else
-#define NP_LOADDS
-#endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * NPP_* functions are provided by the plugin and called by the navigator.
- */
-
-#ifdef XP_UNIX
-const char* NPP_GetMIMEDescription(void);
-#endif /* XP_UNIX */
-
-NPError NP_LOADDS NPP_Initialize(void);
-void    NP_LOADDS NPP_Shutdown(void);
-NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance,
-                          uint16 mode, int16 argc, char* argn[],
-                          char* argv[], NPSavedData* saved);
-NPError NP_LOADDS NPP_Destroy(NPP instance, NPSavedData** save);
-NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* window);
-NPError NP_LOADDS NPP_NewStream(NPP instance, NPMIMEType type,
-                                NPStream* stream, NPBool seekable,
-                                uint16* stype);
-NPError NP_LOADDS NPP_DestroyStream(NPP instance, NPStream* stream,
-                                    NPReason reason);
-int32   NP_LOADDS NPP_WriteReady(NPP instance, NPStream* stream);
-int32   NP_LOADDS NPP_Write(NPP instance, NPStream* stream, int32 offset,
-                            int32 len, void* buffer);
-void    NP_LOADDS NPP_StreamAsFile(NPP instance, NPStream* stream,
-                                   const char* fname);
-void    NP_LOADDS NPP_Print(NPP instance, NPPrint* platformPrint);
-int16   NP_LOADDS NPP_HandleEvent(NPP instance, void* event);
-void    NP_LOADDS NPP_URLNotify(NPP instance, const char* url,
-                                NPReason reason, void* notifyData);
-#ifdef OJI
-jref    NP_LOADDS NPP_GetJavaClass(void);
-#endif
-NPError NP_LOADDS NPP_GetValue(NPP instance, NPPVariable variable, void *value);
-NPError NP_LOADDS NPP_SetValue(NPP instance, NPNVariable variable, void *value);
-
-/*
- * NPN_* functions are provided by the navigator and called by the plugin.
- */
-void    NP_LOADDS NPN_Version(int* plugin_major, int* plugin_minor,
-                              int* netscape_major, int* netscape_minor);
-NPError NP_LOADDS NPN_GetURLNotify(NPP instance, const char* url,
-                                   const char* target, void* notifyData);
-NPError NP_LOADDS NPN_GetURL(NPP instance, const char* url,
-                             const char* target);
-NPError NP_LOADDS NPN_PostURLNotify(NPP instance, const char* url,
-                                    const char* target, uint32 len,
-                                    const char* buf, NPBool file,
-                                    void* notifyData);
-NPError NP_LOADDS NPN_PostURL(NPP instance, const char* url,
-                              const char* target, uint32 len,
-                              const char* buf, NPBool file);
-NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* rangeList);
-NPError NP_LOADDS NPN_NewStream(NPP instance, NPMIMEType type,
-                                const char* target, NPStream** stream);
-int32   NP_LOADDS NPN_Write(NPP instance, NPStream* stream, int32 len, void* buffer);
-NPError NP_LOADDS NPN_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
-void    NP_LOADDS NPN_Status(NPP instance, const char* message);
-const char* NP_LOADDS	NPN_UserAgent(NPP instance);
-void*   NP_LOADDS NPN_MemAlloc(uint32 size);
-void    NP_LOADDS NPN_MemFree(void* ptr);
-uint32  NP_LOADDS NPN_MemFlush(uint32 size);
-void    NP_LOADDS NPN_ReloadPlugins(NPBool reloadPages);
-#ifdef OJI
-JRIEnv* NP_LOADDS NPN_GetJavaEnv(void);
-jref    NP_LOADDS NPN_GetJavaPeer(NPP instance);
-#endif
-NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable, void *value);
-NPError NP_LOADDS NPN_SetValue(NPP instance, NPPVariable variable, void *value);
-void    NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *invalidRect);
-void    NP_LOADDS NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion);
-void    NP_LOADDS NPN_ForceRedraw(NPP instance);
-void    NP_LOADDS NPN_PushPopupsEnabledState(NPP instance, NPBool enabled);
-void    NP_LOADDS NPN_PopPopupsEnabledState(NPP instance);
-void    NP_LOADDS NPN_PluginThreadAsyncCall(NPP instance,
-                                            void (*func) (void *),
-                                            void *userData);
-
-#ifdef __cplusplus
-}  /* end extern "C" */
-#endif
-
-#endif /* RC_INVOKED */
-#ifdef __OS2__
-#pragma pack()
-#endif
-
-#endif /* _NPAPI_H_ */
diff --git a/plugins/npapi/npapi/nphostapi.h b/plugins/npapi/npapi/nphostapi.h
deleted file mode 100644
index 2794dee..0000000
--- a/plugins/npapi/npapi/nphostapi.h
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2006 Google Inc. All Rights Reserved.
-
-#ifndef _NPHOSTAPI_H_
-#define _NPHOSTAPI_H_
-
-#include "npapi.h"
-#include "npruntime.h"
-
-// BEGIN GOOGLE GEARS MODIFICATIONS
-
-#ifndef STDCALL
-#ifdef WIN32
-//#define STDCALL WINAPI
-#define STDCALL __stdcall
-#else
-#define STDCALL
-#endif // WIN32
-#endif // STDCALL
-
-// END GOOGLE GEARS MODIFICATIONS
-
-#ifdef __cplusplus
-extern "C" { 
-#endif
-
-//
-// NPAPI NPP Function Pointers
-//
-typedef NPError      (*NPP_NewProcPtr)(NPMIMEType pluginType,
-                         NPP instance,
-                         uint16 mode,
-                         int16 argc,
-                         char* argn[],
-                         char* argv[],
-                         NPSavedData* saved);
-typedef NPError      (*NPP_DestroyProcPtr)(NPP instance,
-                         NPSavedData** save);
-typedef NPError      (*NPP_SetWindowProcPtr)(NPP instance,
-                         NPWindow* window);
-typedef NPError      (*NPP_NewStreamProcPtr)(NPP instance,
-                         NPMIMEType type, 
-                         NPStream* stream,
-                         NPBool seekable,
-                         uint16* stype);
-typedef NPError      (*NPP_DestroyStreamProcPtr)(NPP instance,
-                         NPStream* stream,
-                         NPReason reason);
-typedef int32        (*NPP_WriteReadyProcPtr)(NPP instance,
-                         NPStream* stream);
-typedef int32        (*NPP_WriteProcPtr)(NPP instance,
-                         NPStream* stream, 
-                         int32 offset,
-                         int32 len,
-                         void* buffer);
-typedef void         (*NPP_StreamAsFileProcPtr)(NPP instance,
-                         NPStream* stream,
-                         const char* fname);
-typedef void         (*NPP_PrintProcPtr)(NPP instance,
-                         NPPrint* platformPrint);
-typedef int16        (*NPP_HandleEventProcPtr)(NPP instance,
-                         void* event);
-typedef void         (*NPP_URLNotifyProcPtr)(NPP instance,
-                         const char* url, 
-                         NPReason reason,
-                         void* notifyData);
-typedef void* JRIGlobalRef; //not using this right now
-typedef NPError      (*NPP_GetValueProcPtr)(NPP instance,
-                         NPPVariable variable,
-                         void *ret_alue);
-typedef NPError      (*NPP_SetValueProcPtr)(NPP instance,
-                         NPNVariable variable,
-                         void *ret_alue);
-
-//
-// NPAPI NPN Function Pointers
-//
-typedef NPError      (*NPN_GetURLProcPtr)(NPP instance,
-                         const char* URL,
-                         const char* window);
-typedef NPError      (*NPN_PostURLProcPtr)(NPP instance,
-                         const char* URL,
-                         const char* window,
-                         uint32 len,
-                         const char* buf,
-                         NPBool file);
-typedef NPError      (*NPN_RequestReadProcPtr)(NPStream* stream,
-                         NPByteRange* rangeList);
-typedef NPError      (*NPN_NewStreamProcPtr)(NPP instance,
-                         NPMIMEType type,
-                         const char* window,
-                         NPStream** stream);
-typedef int32        (*NPN_WriteProcPtr)(NPP instance,
-                         NPStream* stream,
-                         int32 len,
-                         void* buffer);
-typedef NPError      (*NPN_DestroyStreamProcPtr)(NPP instance,
-                         NPStream* stream,
-                         NPReason reason);
-typedef void         (*NPN_StatusProcPtr)(NPP instance,
-                         const char* message);
-typedef const char*  (*NPN_UserAgentProcPtr)(NPP instance);
-typedef void*        (*NPN_MemAllocProcPtr)(uint32 size);
-typedef void         (*NPN_MemFreeProcPtr)(void* ptr);
-typedef uint32       (*NPN_MemFlushProcPtr)(uint32 size);
-typedef void         (*NPN_ReloadPluginsProcPtr)(NPBool reloadPages);
-
-typedef void*        (*NPN_GetJavaEnvProcPtr)(void);
-typedef void*        (*NPN_GetJavaPeerProcPtr)(NPP instance);
-
-typedef NPError      (*NPN_GetURLNotifyProcPtr)(NPP instance,
-                         const char* URL,
-                         const char* window,
-                         void* notifyData);
-typedef NPError      (*NPN_PostURLNotifyProcPtr)(NPP instance,
-                         const char* URL,
-                         const char* window,
-                         uint32 len,
-                         const char* buf,
-                         NPBool file,
-                         void* notifyData);
-typedef NPError      (*NPN_GetValueProcPtr)(NPP instance,
-                         NPNVariable variable,
-                         void *ret_value);
-typedef NPError      (*NPN_SetValueProcPtr)(NPP instance,
-                         NPPVariable variable,
-                         void *value);
-typedef void         (*NPN_InvalidateRectProcPtr)(NPP instance,
-                         NPRect *rect);
-typedef void         (*NPN_InvalidateRegionProcPtr)(NPP instance,
-                         NPRegion region);
-typedef void         (*NPN_ForceRedrawProcPtr)(NPP instance);
-
-typedef void         (*NPN_ReleaseVariantValueProcPtr) (NPVariant *variant);
-
-typedef NPIdentifier (*NPN_GetStringIdentifierProcPtr) (const NPUTF8 *name);
-typedef void         (*NPN_GetStringIdentifiersProcPtr) (const NPUTF8 **names,
-                         int32_t nameCount,
-                         NPIdentifier *identifiers);
-typedef NPIdentifier (*NPN_GetIntIdentifierProcPtr) (int32_t intid);
-typedef int32_t      (*NPN_IntFromIdentifierProcPtr) (NPIdentifier identifier);
-typedef bool         (*NPN_IdentifierIsStringProcPtr) (NPIdentifier identifier);
-typedef NPUTF8 *     (*NPN_UTF8FromIdentifierProcPtr) (NPIdentifier identifier);
-
-typedef NPObject*    (*NPN_CreateObjectProcPtr) (NPP,
-                         NPClass *aClass);
-typedef NPObject*    (*NPN_RetainObjectProcPtr) (NPObject *obj);
-typedef void         (*NPN_ReleaseObjectProcPtr) (NPObject *obj);
-typedef bool         (*NPN_InvokeProcPtr) (NPP npp,
-                         NPObject *obj,
-                         NPIdentifier methodName,
-                         const NPVariant *args,
-                         unsigned argCount,
-                         NPVariant *result);
-typedef bool         (*NPN_InvokeDefaultProcPtr) (NPP npp,
-                         NPObject *obj,
-                         const NPVariant *args,
-                         unsigned argCount,
-                         NPVariant *result);
-typedef bool         (*NPN_EvaluateProcPtr) (NPP npp,
-                         NPObject *obj,
-                         NPString *script,
-                         NPVariant *result);
-typedef bool         (*NPN_GetPropertyProcPtr) (NPP npp,
-                         NPObject *obj,
-                         NPIdentifier propertyName,
-                         NPVariant *result);
-typedef bool         (*NPN_SetPropertyProcPtr) (NPP npp,
-                         NPObject *obj,
-                         NPIdentifier propertyName,
-                         const NPVariant *value);
-typedef bool         (*NPN_HasPropertyProcPtr) (NPP,
-                         NPObject *npobj,
-                         NPIdentifier propertyName);
-typedef bool         (*NPN_HasMethodProcPtr) (NPP npp,
-                         NPObject *npobj,
-                         NPIdentifier methodName);
-typedef bool         (*NPN_RemovePropertyProcPtr) (NPP npp,
-                         NPObject *obj,
-                         NPIdentifier propertyName);
-typedef void         (*NPN_SetExceptionProcPtr) (NPObject *obj,
-                         const NPUTF8 *message);
-typedef void         (*NPN_PushPopupsEnabledStateProcPtr)(NPP npp,
-                         NPBool enabled);
-typedef void         (*NPN_PopPopupsEnabledStateProcPtr)(NPP npp);
-typedef bool         (*NPN_EnumerateProcPtr)(NPP npp,
-                         NPObject *obj,
-                         NPIdentifier **identifier,
-                         uint32_t *count);
-typedef void         (*NPN_PluginThreadAsyncCallProcPtr)(NPP instance, 
-                         void (*func)(void *),
-                         void *userData);
-typedef bool         (*NPN_ConstructProcPtr)(NPP npp,
-                         NPObject* obj,
-                         const NPVariant *args,
-                         uint32_t argCount,
-                         NPVariant *result);
-
-//
-// NPAPI Function table of NPP functions (functions provided by plugin to host)
-//
-typedef struct _NPPluginFuncs {
-    unsigned short size;
-    unsigned short version;
-    NPP_NewProcPtr newp;
-    NPP_DestroyProcPtr destroy;
-    NPP_SetWindowProcPtr setwindow;
-    NPP_NewStreamProcPtr newstream;
-    NPP_DestroyStreamProcPtr destroystream;
-    NPP_StreamAsFileProcPtr asfile;
-    NPP_WriteReadyProcPtr writeready;
-    NPP_WriteProcPtr write;
-    NPP_PrintProcPtr print;
-    NPP_HandleEventProcPtr event;
-    NPP_URLNotifyProcPtr urlnotify;
-    JRIGlobalRef javaClass;
-    NPP_GetValueProcPtr getvalue;
-    NPP_SetValueProcPtr setvalue;
-} NPPluginFuncs;
-
-//
-// NPAPI Function table NPN functions (functions provided by host to plugin)
-//
-typedef struct _NPNetscapeFuncs {
-    uint16 size;
-    uint16 version;
-    NPN_GetURLProcPtr geturl;
-    NPN_PostURLProcPtr posturl;
-    NPN_RequestReadProcPtr requestread;
-    NPN_NewStreamProcPtr newstream;
-    NPN_WriteProcPtr write;
-    NPN_DestroyStreamProcPtr destroystream;
-    NPN_StatusProcPtr status;
-    NPN_UserAgentProcPtr uagent;
-    NPN_MemAllocProcPtr memalloc;
-    NPN_MemFreeProcPtr memfree;
-    NPN_MemFlushProcPtr memflush;
-    NPN_ReloadPluginsProcPtr reloadplugins;
-    NPN_GetJavaEnvProcPtr getJavaEnv;
-    NPN_GetJavaPeerProcPtr getJavaPeer;
-    NPN_GetURLNotifyProcPtr geturlnotify;
-    NPN_PostURLNotifyProcPtr posturlnotify;
-    NPN_GetValueProcPtr getvalue;
-    NPN_SetValueProcPtr setvalue;
-    NPN_InvalidateRectProcPtr invalidaterect;
-    NPN_InvalidateRegionProcPtr invalidateregion;
-    NPN_ForceRedrawProcPtr forceredraw;
-
-    NPN_GetStringIdentifierProcPtr getstringidentifier;
-    NPN_GetStringIdentifiersProcPtr getstringidentifiers;
-    NPN_GetIntIdentifierProcPtr getintidentifier;
-    NPN_IdentifierIsStringProcPtr identifierisstring;
-    NPN_UTF8FromIdentifierProcPtr utf8fromidentifier;
-    NPN_IntFromIdentifierProcPtr intfromidentifier;
-    NPN_CreateObjectProcPtr createobject;
-    NPN_RetainObjectProcPtr retainobject;
-    NPN_ReleaseObjectProcPtr releaseobject;
-    NPN_InvokeProcPtr invoke;
-    NPN_InvokeDefaultProcPtr invokeDefault;
-    NPN_EvaluateProcPtr evaluate;
-    NPN_GetPropertyProcPtr getproperty;
-    NPN_SetPropertyProcPtr setproperty;
-    NPN_RemovePropertyProcPtr removeproperty;
-    NPN_HasPropertyProcPtr hasproperty;
-    NPN_HasMethodProcPtr hasmethod;
-    NPN_ReleaseVariantValueProcPtr releasevariantvalue;
-    NPN_SetExceptionProcPtr setexception;
-    NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate;
-    NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate;
-    // comment these out since they aren't provided by Firefox 1.5 and
-    // we don't currently use them anyway.
-//    NPN_EnumerateProcPtr enumerate;
-//    NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall;
-//    NPN_ConstructProcPtr construct;
-} NPNetscapeFuncs;
-
-//
-// NPAPI DLL entry points
-//
-
-typedef NPError (STDCALL * NP_InitializeFunc)(NPNetscapeFuncs* pFuncs);
-typedef NPError (STDCALL * NP_GetEntryPointsFunc)(NPPluginFuncs* pFuncs);
-typedef NPError (STDCALL * NP_ShutdownFunc)(void);
-
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // _NPHOSTAPI_H_
diff --git a/plugins/npapi/npapi/npruntime.h b/plugins/npapi/npapi/npruntime.h
deleted file mode 100644
index 21b8089..0000000
--- a/plugins/npapi/npapi/npruntime.h
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright (C) 2004, Apple Computer, Inc. and The Mozilla Foundation. 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * 
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
- * Foundation ("Mozilla") nor the names of their contributors may be used
- * to endorse or promote products derived from this software without
- * specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
- * THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Revision 1 (March 4, 2004):
- * Initial proposal.
- *
- * Revision 2 (March 10, 2004):
- * All calls into script were made asynchronous.  Results are
- * provided via the NPScriptResultFunctionPtr callback.
- *
- * Revision 3 (March 10, 2004):
- * Corrected comments to not refer to class retain/release FunctionPtrs.
- *
- * Revision 4 (March 11, 2004):
- * Added additional convenience NPN_SetExceptionWithUTF8().
- * Changed NPHasPropertyFunctionPtr and NPHasMethodFunctionPtr to take NPClass
- * pointers instead of NPObject pointers.
- * Added NPIsValidIdentifier().
- *
- * Revision 5 (March 17, 2004):
- * Added context parameter to result callbacks from ScriptObject functions.
- *
- * Revision 6 (March 29, 2004):
- * Renamed functions implemented by user agent to NPN_*.  Removed _ from
- * type names.
- * Renamed "JavaScript" types to "Script".
- *
- * Revision 7 (April 21, 2004):
- * NPIdentifier becomes a void*, was int32_t
- * Remove NP_IsValidIdentifier, renamed NP_IdentifierFromUTF8 to NP_GetIdentifier
- * Added NPVariant and modified functions to use this new type.
- *
- * Revision 8 (July 9, 2004):
- * Updated to joint Apple-Mozilla license.
- *
- * Revision 9 (August 12, 2004):
- * Changed NPVariantType enum values to form PVariantType_XXX
- * Added NPP arguments to NPObject functions.
- * Replaced NPVariant functions with macros.
- */
-#ifndef _NP_RUNTIME_H_
-#define _NP_RUNTIME_H_
-
-
-// BEGIN GOOGLE GEARS MODIFICATIONS
-
-//#include "gears/base/common/int_types.h"
-#include "npapi.h"
-
-typedef uint32 uint32_t;
-typedef int32 int32_t;
-#ifndef sun
-typedef uint8 uint8_t;
-typedef int8 int8_t;
-typedef uint16 uint16_t;
-typedef int16 int16_t;
-// MODIFIED(jat)
-#ifndef __LP64__ 
-typedef int64 int64_t;
-typedef uint64 uint64_t;
-#endif
-#endif
-
-// END GOOGLE GEARS MODIFICATIONS
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-    This API is used to facilitate binding code written in C to script
-    objects.  The API in this header does not assume the presence of a
-    user agent.  That is, it can be used to bind C code to scripting
-    environments outside of the context of a user agent.
-    
-    However, the normal use of the this API is in the context of a
-    scripting environment running in a browser or other user agent.
-    In particular it is used to support the extended Netscape
-    script-ability API for plugins (NP-SAP).  NP-SAP is an extension
-    of the Netscape plugin API.  As such we have adopted the use of
-    the "NP" prefix for this API.
-
-    The following NP{N|P}Variables were added to the Netscape plugin
-    API (in npapi.h):
-
-    NPNVWindowNPObject
-    NPNVPluginElementNPObject
-    NPPVpluginScriptableNPObject
-
-    These variables are exposed through NPN_GetValue() and
-    NPP_GetValue() (respectively) and are used to establish the
-    initial binding between the user agent and native code.  The DOM
-    objects in the user agent can be examined and manipulated using
-    the NPN_ functions that operate on NPObjects described in this
-    header.
-
-    To the extent possible the assumptions about the scripting
-    language used by the scripting environment have been minimized.
-*/
-
-
-/*
-    Objects (non-primitive data) passed between 'C' and script is
-    always wrapped in an NPObject.  The 'interface' of an NPObject is
-    described by an NPClass.
-*/
-typedef struct NPObject NPObject;
-typedef struct NPClass NPClass;
-
-typedef char NPUTF8;
-typedef struct _NPString {
-    const NPUTF8 *UTF8Characters;
-    uint32_t UTF8Length;
-} NPString;
-  
-typedef enum {
-    NPVariantType_Void,
-    NPVariantType_Null,
-    NPVariantType_Bool,
-    NPVariantType_Int32,
-    NPVariantType_Double,
-    NPVariantType_String,
-    NPVariantType_Object
-} NPVariantType;
-
-typedef struct _NPVariant {
-    NPVariantType type;
-    union {
-        bool boolValue;
-        int32_t intValue;
-        double doubleValue;
-        NPString stringValue;
-        NPObject *objectValue;
-    } value;
-} NPVariant;
-
-/*
-    NPN_ReleaseVariantValue is called on all 'out' parameters references.
-    Specifically it is called on variants that are resultant out parameters
-    in NPGetPropertyFunctionPtr and NPInvokeFunctionPtr.  Resultant variants
-    from these two functions should be initialized using the
-    NPN_InitializeVariantXXX() functions.
-    
-    After calling NPReleaseVariantValue, the type of the variant will
-    be set to NPVariantUndefinedType.
-*/
-void NPN_ReleaseVariantValue (NPVariant *variant);
-
-#define NPVARIANT_IS_VOID(_v)    ((_v).type == NPVariantType_Void)
-#define NPVARIANT_IS_NULL(_v)    ((_v).type == NPVariantType_Null)
-#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
-#define NPVARIANT_IS_INT32(_v)   ((_v).type == NPVariantType_Int32)
-#define NPVARIANT_IS_DOUBLE(_v)  ((_v).type == NPVariantType_Double)
-#define NPVARIANT_IS_STRING(_v)  ((_v).type == NPVariantType_String)
-#define NPVARIANT_IS_OBJECT(_v)  ((_v).type == NPVariantType_Object)
-
-#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
-#define NPVARIANT_TO_INT32(_v)   ((_v).value.intValue)
-#define NPVARIANT_TO_DOUBLE(_v)  ((_v).value.doubleValue)
-#define NPVARIANT_TO_STRING(_v)  ((_v).value.stringValue)
-#define NPVARIANT_TO_OBJECT(_v)  ((_v).value.objectValue)
-
-#define NP_BEGIN_MACRO  do {
-#define NP_END_MACRO    } while (0)
-
-#define VOID_TO_NPVARIANT(_v)                NP_BEGIN_MACRO (_v).type = NPVariantType_Void; (_v).value.objectValue = NULL; NP_END_MACRO
-#define NULL_TO_NPVARIANT(_v)                NP_BEGIN_MACRO (_v).type = NPVariantType_Null; (_v).value.objectValue = NULL; NP_END_MACRO
-#define BOOLEAN_TO_NPVARIANT(_val, _v)       NP_BEGIN_MACRO (_v).type = NPVariantType_Bool; (_v).value.boolValue = !!(_val); NP_END_MACRO
-#define INT32_TO_NPVARIANT(_val, _v)         NP_BEGIN_MACRO (_v).type = NPVariantType_Int32; (_v).value.intValue = _val; NP_END_MACRO
-#define DOUBLE_TO_NPVARIANT(_val, _v)        NP_BEGIN_MACRO (_v).type = NPVariantType_Double; (_v).value.doubleValue = _val; NP_END_MACRO
-#define STRINGZ_TO_NPVARIANT(_val, _v)       NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString _str = { _val, strlen(_val) }; (_v).value.stringValue = _str; NP_END_MACRO
-#define STRINGN_TO_NPVARIANT(_val, _len, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString _str = { _val, _len }; (_v).value.stringValue = _str; NP_END_MACRO
-#define OBJECT_TO_NPVARIANT(_val, _v)        NP_BEGIN_MACRO (_v).type = NPVariantType_Object; (_v).value.objectValue = _val; NP_END_MACRO
-
-/*
-        Type mappings (JavaScript types have been used for illustration
-    purposes):
-
-        JavaScript       to             C (NPVariant with type:)
-        undefined                       NPVariantType_Void
-        null                            NPVariantType_Null
-        Boolean                         NPVariantType_Bool
-        Number                          NPVariantType_Double or NPVariantType_Int32
-        String                          NPVariantType_String
-        Object                          NPVariantType_Object
-
-        C (NPVariant with type:)   to   JavaScript
-        NPVariantType_Void              undefined
-        NPVariantType_Null              null
-        NPVariantType_Bool              Boolean 
-        NPVariantType_Int32             Number
-        NPVariantType_Double            Number
-        NPVariantType_String            String
-        NPVariantType_Object            Object
-*/
-
-typedef void *NPIdentifier;
-
-/*
-    NPObjects have methods and properties.  Methods and properties are
-    identified with NPIdentifiers.  These identifiers may be reflected
-    in script.  NPIdentifiers can be either strings or integers, IOW,
-    methods and properties can be identified by either strings or
-    integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
-    compared using ==.  In case of any errors, the requested
-    NPIdentifier(s) will be NULL.
-*/
-NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name);
-void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers);
-NPIdentifier NPN_GetIntIdentifier(int32_t intid);
-bool NPN_IdentifierIsString(NPIdentifier identifier);
-
-/*
-    The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
-*/
-NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier);
-
-/*
-    Get the integer represented by identifier. If identifier is not an
-    integer identifier, the behaviour is undefined.
-*/
-int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
-
-/*
-    NPObject behavior is implemented using the following set of
-    callback functions.
-
-    The NPVariant *result argument of these functions (where
-    applicable) should be released using NPN_ReleaseVariantValue().
-*/
-typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
-typedef void (*NPDeallocateFunctionPtr)(NPObject *obj);
-typedef void (*NPInvalidateFunctionPtr)(NPObject *obj);
-typedef bool (*NPHasMethodFunctionPtr)(NPObject *obj, NPIdentifier name);
-typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
-typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
-typedef bool (*NPHasPropertyFunctionPtr)(NPObject *obj, NPIdentifier name);
-typedef bool (*NPGetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, NPVariant *result);
-typedef bool (*NPSetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *value);
-typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
-typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value, uint32_t *count);
-
-/*
-    NPObjects returned by create have a reference count of one.  It is the caller's responsibility
-    to release the returned object.
-
-    NPInvokeFunctionPtr function may return false to indicate a the method could not be invoked.
-    
-    NPGetPropertyFunctionPtr and NPSetPropertyFunctionPtr may return false to indicate a property doesn't
-    exist.
-    
-    NPInvalidateFunctionPtr is called by the scripting environment when the native code is
-    shutdown.  Any attempt to message a NPObject instance after the invalidate
-    callback has been called will result in undefined behavior, even if the
-    native code is still retaining those NPObject instances.
-    (The runtime will typically return immediately, with 0 or NULL, from an attempt to
-    dispatch to a NPObject, but this behavior should not be depended upon.)
-    
-    The NPEnumerationFunctionPtr function may pass an array of                  
-    NPIdentifiers back to the caller. The callee allocs the memory of           
-    the array using NPN_MemAlloc(), and it's the caller's responsibility        
-    to release it using NPN_MemFree().           
-*/
-struct NPClass
-{
-    uint32_t structVersion;
-    NPAllocateFunctionPtr allocate;
-    NPDeallocateFunctionPtr deallocate;
-    NPInvalidateFunctionPtr invalidate;
-    NPHasMethodFunctionPtr hasMethod;
-    NPInvokeFunctionPtr invoke;
-    NPInvokeDefaultFunctionPtr invokeDefault;
-    NPHasPropertyFunctionPtr hasProperty;
-    NPGetPropertyFunctionPtr getProperty;
-    NPSetPropertyFunctionPtr setProperty;
-    NPRemovePropertyFunctionPtr removeProperty;
-    NPEnumerationFunctionPtr enumerate;
-};
-
-#define NP_CLASS_STRUCT_VERSION      2
-#define NP_CLASS_STRUCT_VERSION_ENUM 2                           
-#define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass)   \
-    ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM)
-
-struct NPObject {
-    NPClass *_class;
-    uint32_t referenceCount;
-    // Additional space may be allocated here by types of NPObjects
-};
-
-/*
-    If the class has an allocate function, NPN_CreateObject invokes that function,
-    otherwise a NPObject is allocated and returned.  If a class has an allocate
-    function it is the responsibility of that implementation to set the initial retain
-    count to 1.
-*/
-NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);
-
-/*
-    Increment the NPObject's reference count.
-*/
-NPObject *NPN_RetainObject (NPObject *obj);
-
-/*
-    Decremented the NPObject's reference count.  If the reference
-    count goes to zero, the class's destroy function is invoke if
-    specified, otherwise the object is freed directly.
-*/
-void NPN_ReleaseObject (NPObject *obj);
-
-/*
-    Functions to access script objects represented by NPObject.
-
-    Calls to script objects are synchronous.  If a function returns a
-    value, it will be supplied via the result NPVariant
-    argument. Successful calls will return true, false will be
-    returned in case of an error.
-    
-    Calls made from plugin code to script must be made from the thread
-    on which the plugin was initialized.
-*/
-bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
-bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
-bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, NPVariant *result);
-bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, NPVariant *result);
-bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value);
-bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
-bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
-bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName);
-bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier, uint32_t *count);
-
-// BEGIN GOOGLE MODIFICATIONS
-
-void* NPP_GetJavaClass(void);
-void* NPN_GetJavaEnv(void);
-void* NPN_GetJavaPeer(NPP instance);
-void NPN_PluginThreadAsyncCall(NPP id, void (*func)(void *), void *userData);
-bool NPN_Construct(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
-
-// END GOOGLE MODIFICATIONS
-
-/*
-    NPN_SetException may be called to trigger a script exception upon return
-    from entry points into NPObjects.
-*/
-void NPN_SetException (NPObject *obj, const NPUTF8 *message);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/plugins/npapi/npn_bindings.cpp b/plugins/npapi/npn_bindings.cpp
deleted file mode 100644
index b47b7af..0000000
--- a/plugins/npapi/npn_bindings.cpp
+++ /dev/null
@@ -1,381 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (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.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is 
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or 
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-////////////////////////////////////////////////////////////
-//
-// Implementation of Netscape entry points (NPN_*), which are the functions
-// the plugin calls to talk to the browser.
-//
-
-#include "Debug.h"
-
-// Sun's cstring doesn't declare memcpy
-#include <string.h>
-//#include <cstring>
-
-#include "mozincludes.h"
-//#include "gears/base/common/base_class.h"
-//#include "gears/base/common/thread_locals.h"
-//#include "gears/base/npapi/module.h"
-
-#ifndef HIBYTE
-#define HIBYTE(x) ((((uint32)(x)) & 0xff00) >> 8)
-#endif
-
-#ifndef LOBYTE
-#define LOBYTE(W) ((W) & 0xFF)
-#endif
-
-static NPNetscapeFuncs npn_funcs;
-
-void SetNPNFuncs(NPNetscapeFuncs* npnFuncs) {
-  // Since we can't rely on the pointer remaining valid, we need to
-  // copy the function pointers.
-  int size = sizeof(NPNetscapeFuncs);
-  if (size > npnFuncs->size) {
-    Debug::log(Debug::Warning) << "*** Warning: NPNetscapeFuncs supplied by "
-        "browser is smaller than expected: " << npnFuncs->size << " vs " << size
-        << Debug::flush;
-    size = npnFuncs->size;
-  }
-  memcpy(&npn_funcs, npnFuncs, size);
-}
-
-const NPNetscapeFuncs &GetNPNFuncs() {
-  return npn_funcs;
-}
-
-void NPN_Version(int* plugin_major, int* plugin_minor,
-                 int* netscape_major, int* netscape_minor)
-{
-  const NPNetscapeFuncs &funcs = GetNPNFuncs();
-  *plugin_major   = NP_VERSION_MAJOR;
-  *plugin_minor   = NP_VERSION_MINOR;
-  *netscape_major = HIBYTE(funcs.version);
-  *netscape_minor = LOBYTE(funcs.version);
-}
-
-NPError NPN_GetURLNotify(NPP instance, const char *url, const char *target,
-                         void* notifyData)
-{
-  const NPNetscapeFuncs &funcs = GetNPNFuncs();
-  int navMinorVers = funcs.version & 0xFF;
-  NPError rv = NPERR_NO_ERROR;
-
-  if (navMinorVers >= NPVERS_HAS_NOTIFICATION)
-    rv = funcs.geturlnotify(instance, url, target, notifyData);
-  else
-    rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
-
-  return rv;
-}
-
-NPError NPN_GetURL(NPP instance, const char *url, const char *target)
-{
-  NPError rv = GetNPNFuncs().geturl(instance, url, target);
-  return rv;
-}
-
-NPError NPN_PostURLNotify(NPP instance, const char* url, const char* window,
-                          uint32 len, const char* buf, NPBool file,
-                          void* notifyData)
-{
-  const NPNetscapeFuncs &funcs = GetNPNFuncs();
-  int navMinorVers = funcs.version & 0xFF;
-  NPError rv = NPERR_NO_ERROR;
-
-  if (navMinorVers >= NPVERS_HAS_NOTIFICATION) {
-    rv = funcs.posturlnotify(instance, url, window, len, buf, file, notifyData);
-  } else {
-    rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
-  }
-
-  return rv;
-}
-
-NPError NPN_PostURL(NPP instance, const char* url, const char* window,
-                    uint32 len, const char* buf, NPBool file)
-{
-  NPError rv = GetNPNFuncs().posturl(instance, url, window, len, buf, file);
-  return rv;
-} 
-
-NPError NPN_RequestRead(NPStream* stream, NPByteRange* rangeList)
-{
-  NPError rv = GetNPNFuncs().requestread(stream, rangeList);
-  return rv;
-}
-
-NPError NPN_NewStream(NPP instance, NPMIMEType type, const char* target,
-                      NPStream** stream)
-{
-  const NPNetscapeFuncs &funcs = GetNPNFuncs();
-  int navMinorVersion = funcs.version & 0xFF;
-
-  NPError rv = NPERR_NO_ERROR;
-
-  if ( navMinorVersion >= NPVERS_HAS_STREAMOUTPUT )
-    rv = funcs.newstream(instance, type, target, stream);
-  else
-    rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
-
-  return rv;
-}
-
-int32 NPN_Write(NPP instance, NPStream *stream, int32 len, void *buffer)
-{
-  const NPNetscapeFuncs &funcs = GetNPNFuncs();
-  int navMinorVersion = funcs.version & 0xFF;
-  int32 rv = 0;
-
-  if ( navMinorVersion >= NPVERS_HAS_STREAMOUTPUT )
-    rv = funcs.write(instance, stream, len, buffer);
-  else
-    rv = -1;
-
-  return rv;
-}
-
-NPError NPN_DestroyStream(NPP instance, NPStream* stream, NPError reason)
-{
-  const NPNetscapeFuncs &funcs = GetNPNFuncs();
-  int navMinorVersion = funcs.version & 0xFF;
-  NPError rv = NPERR_NO_ERROR;
-
-  if ( navMinorVersion >= NPVERS_HAS_STREAMOUTPUT )
-    rv = funcs.destroystream(instance, stream, reason);
-  else
-    rv = NPERR_INCOMPATIBLE_VERSION_ERROR;
-
-  return rv;
-}
-
-void NPN_Status(NPP instance, const char *message)
-{
-  GetNPNFuncs().status(instance, message);
-}
-
-const char* NPN_UserAgent(NPP instance)
-{
-  const char * rv = NULL;
-  rv = GetNPNFuncs().uagent(instance);
-  return rv;
-}
-
-void* NPN_MemAlloc(uint32 size)
-{
-  void * rv = NULL;
-  rv = GetNPNFuncs().memalloc(size);
-  return rv;
-}
-
-void NPN_MemFree(void* ptr)
-{
-  GetNPNFuncs().memfree(ptr);
-}
-
-uint32 NPN_MemFlush(uint32 size)
-{
-  uint32 rv = GetNPNFuncs().memflush(size);
-  return rv;
-}
-
-void NPN_ReloadPlugins(NPBool reloadPages)
-{
-  GetNPNFuncs().reloadplugins(reloadPages);
-}
-
-NPError NPN_GetValue(NPP instance, NPNVariable variable, void *value)
-{
-  NPError rv = GetNPNFuncs().getvalue(instance, variable, value);
-  return rv;
-}
-
-NPError NPN_SetValue(NPP instance, NPPVariable variable, void *value)
-{
-  NPError rv = GetNPNFuncs().setvalue(instance, variable, value);
-  return rv;
-}
-
-void NPN_InvalidateRect(NPP instance, NPRect *invalidRect)
-{
-  GetNPNFuncs().invalidaterect(instance, invalidRect);
-}
-
-void NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion)
-{
-  GetNPNFuncs().invalidateregion(instance, invalidRegion);
-}
-
-void NPN_ForceRedraw(NPP instance)
-{
-  GetNPNFuncs().forceredraw(instance);
-}
-
-NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name)
-{
-  return GetNPNFuncs().getstringidentifier(name);
-}
-
-void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount,
-                              NPIdentifier *identifiers)
-{
-  return GetNPNFuncs().getstringidentifiers(names, nameCount, identifiers);
-}
-
-NPIdentifier NPN_GetIntIdentifier(int32_t intid)
-{
-  return GetNPNFuncs().getintidentifier(intid);
-}
-
-bool NPN_IdentifierIsString(NPIdentifier identifier)
-{
-  return GetNPNFuncs().identifierisstring(identifier);
-}
-
-NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier)
-{
-  return GetNPNFuncs().utf8fromidentifier(identifier);
-}
-
-// On WebKit under OSX, the intfromidentifier field of the structure isn't
-// filled in (see WebNetscapePluginPackage.m#526 in WebKit source tree).
-// At this time this function isn't called from our code, so for now comment it
-// out.
-//
-int32_t NPN_IntFromIdentifier(NPIdentifier identifier)
-{
-  return GetNPNFuncs().intfromidentifier(identifier);
-}
-
-NPObject *NPN_CreateObject(NPP npp, NPClass *aClass)
-{
-  return GetNPNFuncs().createobject(npp, aClass);
-}
-
-NPObject *NPN_RetainObject(NPObject *obj)
-{
-  return GetNPNFuncs().retainobject(obj);
-}
-
-void NPN_ReleaseObject(NPObject *obj)
-{
-  return GetNPNFuncs().releaseobject(obj);
-}
-
-bool NPN_Invoke(NPP npp, NPObject* obj, NPIdentifier methodName,
-                const NPVariant *args, uint32_t argCount, NPVariant *result)
-{
-  return GetNPNFuncs().invoke(npp, obj, methodName, args, argCount, result);
-}
-
-bool NPN_InvokeDefault(NPP npp, NPObject* obj, const NPVariant *args,
-                       uint32_t argCount, NPVariant *result)
-{
-  return GetNPNFuncs().invokeDefault(npp, obj, args, argCount, result);
-}
-
-bool NPN_Evaluate(NPP npp, NPObject* obj, NPString *script,
-                  NPVariant *result)
-{
-  return GetNPNFuncs().evaluate(npp, obj, script, result);
-}
-
-bool NPN_GetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
-                     NPVariant *result)
-{
-// Workaround for bug in WebKit: GetProperty() fails when attempting to
-// read a null value from an array, however it fills in the variant structure
-// correctly.
-// The workaround is to chek if GetProprety() touches the variant structure,
-// if so, we assume it succeeded.
-#ifdef BROWSER_WEBKIT
-  result->type = static_cast<NPVariantType>(-1);
-  
-  bool ret = GetNPNFuncs().getproperty(npp, obj, propertyName, result);
-  
-  if (result->type != -1 && !ret) {
-    ret = true;
-  }
-  return ret;
-#else
-  return GetNPNFuncs().getproperty(npp, obj, propertyName, result);
-#endif
-}
-
-bool NPN_SetProperty(NPP npp, NPObject* obj, NPIdentifier propertyName,
-                     const NPVariant *value)
-{
-  return GetNPNFuncs().setproperty(npp, obj, propertyName, value);
-}
-
-bool NPN_RemoveProperty(NPP npp, NPObject* obj, NPIdentifier propertyName)
-{
-  return GetNPNFuncs().removeproperty(npp, obj, propertyName);
-}
-
-#ifdef BROWSER_WEBKIT
-// This field of NPN functions isn't filled in by WebKit on OSX.
-#else
-bool NPN_HasProperty(NPP npp, NPObject* obj, NPIdentifier propertyName)
-{
-  return GetNPNFuncs().hasproperty(npp, obj, propertyName);
-}
-#endif
-
-#ifdef BROWSER_WEBKIT
-// This field of NPN functions isn't filled in by WebKit on OSX.
-#else
-bool NPN_HasMethod(NPP npp, NPObject* obj, NPIdentifier methodName)
-{
-  return GetNPNFuncs().hasmethod(npp, obj, methodName);
-}
-#endif
-
-void NPN_ReleaseVariantValue(NPVariant *variant)
-{
-  GetNPNFuncs().releasevariantvalue(variant);
-}
-
-#ifdef BROWSER_WEBKIT
-// This function is buggy in WebKit, see 
-// http://bugs.webkit.org/show_bug.cgi?id=16829
-#else
-void NPN_SetException(NPObject* obj, const NPUTF8 *message)
-{
-  GetNPNFuncs().setexception(obj, message);
-}
-#endif
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin.zip b/plugins/npapi/prebuilt/gwt-dev-plugin.zip
deleted file mode 100644
index fc2e6ec..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin.zip
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/Info.plist b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/Info.plist
deleted file mode 100644
index 4df9097..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/Info.plist
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-  <dict>
-    <key>CFBundleDevelopmentRegion</key>
-    <string>English</string>
-    <key>CFBundleExecutable</key>
-    <string>libGwtDevPlugin.dylib</string>
-    <key>CFBundleGetInfoString</key>
-    <string>Copyright 2010 Google, Inc.</string>
-    <key>CFBundleIdentifier</key>
-    <string>com.google.gwt.devmode-npapi-plugin</string>
-    <key>CFBundleInfoDictionaryVersion</key>
-    <string>6.0</string>
-    <key>CFBundleName</key>
-    <string>GWT Devmode NPAPI Plugin</string>
-    <key>CFBundlePackageType</key>
-    <string>BRPL</string>
-    <key>CFBundleShortVersionString</key>
-    <string>1.0</string>
-    <key>CFBundleSignature</key>
-    <string>????</string>
-    <key>CFBundleVersion</key>
-    <string>1.0</string>
-    <key>CFPlugInDynamicRegisterFunction</key>
-    <string></string>
-    <key>CFPlugInDynamicRegistration</key>
-    <string>NO</string>
-    <key>WebPluginDescription</key>
-    <string>Plugin to allow debugging of GWT applications in DevMode</string>
-    <key>WebPluginMIMETypes</key>
-    <dict>
-      <key>application/x-gwt-hosted-mode</key>
-      <dict>
-        <key>WebPluginTypeDescription</key>
-        <string>GWT DevMode</string>
-      </dict>
-    </dict>
-    <key>WebPluginName</key>
-    <string>GWT DevMode Plugin</string>
-  </dict>
-</plist>
-
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/MacOS/libGwtDevPlugin.dylib b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/MacOS/libGwtDevPlugin.dylib
deleted file mode 100755
index 0ce4079..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/MacOS/libGwtDevPlugin.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt b/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt
deleted file mode 100644
index 326366d..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt
+++ /dev/null
@@ -1,13 +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.
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86-gcc3/libGwtDevPlugin.so b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86-gcc3/libGwtDevPlugin.so
deleted file mode 100755
index 9c39145..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86-gcc3/libGwtDevPlugin.so
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86_64-gcc3/libGwtDevPlugin.so b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86_64-gcc3/libGwtDevPlugin.so
deleted file mode 100755
index 4ec8b6d..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86_64-gcc3/libGwtDevPlugin.so
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/WINNT_x86-msvc/npGwtDevPlugin.dll b/plugins/npapi/prebuilt/gwt-dev-plugin/WINNT_x86-msvc/npGwtDevPlugin.dll
deleted file mode 100755
index 71312af..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/WINNT_x86-msvc/npGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/background.html b/plugins/npapi/prebuilt/gwt-dev-plugin/background.html
deleted file mode 100644
index 4f14a8c..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/background.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<html>
-<head>
-</head>
-
-<embed id="pluginEmbed" type="application/x-gwt-hosted-mode" width="10"
-height="10">
-</embed>
-
-<script src="background.js"></script>
-</html>
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/background.js b/plugins/npapi/prebuilt/gwt-dev-plugin/background.js
deleted file mode 100644
index c9908a3..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/background.js
+++ /dev/null
@@ -1,81 +0,0 @@
-var plugin = document.getElementById('pluginEmbed');
-var disabledIcon = 'gwt32-gray.png';
-var enabledIcon = 'gwt32.png';
-
-
-function getHostFromUrl(url) {
-  var hostname = '';
-  var idx = url.indexOf('://');
-  if (idx >= 0) {
-    idx += 3;
-    hostname = url.substring(idx);
-  }
-  idx = hostname.indexOf('/');
-  if (idx >= 0) {
-    hostname = hostname.substring(0,idx);
-  }
-  idx = hostname.indexOf('@');
-  if( idx >= 0)
-  {
-    hostname = hostname.substring(idx+1);
-  }
-  idx = hostname.indexOf(':');
-  if (idx >= 0) {
-    hostname = hostname.substring(0,idx);
-  }
-  return hostname;
-}
-
-function getCodeServerFromUrl(url) {
-  var idx = url.indexOf('?');
-  if (idx < 0) {
-    return '';
-  }
-  url = url.substring(idx+1);
-  idx = url.indexOf('gwt.codesvr=');
-  if( idx < 0 ) {
-    return '';
-  }
-  url = url.substring(idx+12);
-  var colon = url.indexOf(':');
-  var amp   = url.indexOf('&');
-  if( amp < 0 || colon < amp ) {
-    amp = colon;
-  }
-  return amp < 0 ? url : url.substring(0,amp);
-}
-
-function devModeTabListener(tabId, changeInfo, tab) {
-  var search = tab.url.slice(tab.url.indexOf('?'));
-  if (search.indexOf('gwt.codesvr=') >= 0 || search.indexOf('gwt.hosted=') >= 0) {
-    var permission = plugin.getHostPermission(tab.url);
-    var host = getHostFromUrl(tab.url);
-    var code = getCodeServerFromUrl(tab.url);
-    var popup = 'page_action.html';
-    var icon = null;
-    console.log("got permission " + permission + " for host " + host + '/ code ' + code);
-
-    var idObject = {};
-    plugin.testJsIdentity( idObject, idObject );
-
-    if (permission == 'include') {
-      icon = enabledIcon;
-    } else if (permission == 'exclude') {
-      icon = disabledIcon;
-    } else if (permission == 'unknown') {
-      icon = disabledIcon;
-    }
-    popup += "?permission=" + permission + "&host=" + host + "&codeserver=" + code;
-    chrome.pageAction.setIcon({'tabId' : tabId, 'path' : icon});
-    chrome.pageAction.setPopup({'tabId' : tabId, 'popup' : popup});
-    chrome.pageAction.show(tabId);
-
-    var hostEntries = window.localStorage.getItem('GWT_DEV_HOSTENTRY') || [];
-    console.log("loading hostentries: " + hostEntries);
-    plugin.loadHostEntries.apply(plugin, JSON.parse(hostEntries));
-  } else {
-    chrome.pageAction.hide(tabId);
-  }
-};
-
-chrome.tabs.onUpdated.addListener(devModeTabListener);
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png
deleted file mode 100644
index 57e8e01..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png
deleted file mode 100644
index f26096e..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32-gray.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32-gray.png
deleted file mode 100644
index d02689e..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32-gray.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png
deleted file mode 100644
index 7ba8270..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png
deleted file mode 100644
index e8a4172..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png
deleted file mode 100644
index 922cc88..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json b/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json
deleted file mode 100644
index 8993320..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "GWT Developer Plugin",
-  "version": "1.0.11349",
-  "manifest_version": 2,
-
-  "description": "A plugin to enable debugging with GWT's Development Mode",
-  "icons": {
-    "16": "gwt16.png",
-    "32": "gwt32.png",
-    "48": "gwt48.png",
-    "64": "gwt64.png",
-    "128": "gwt128.png"
-  },
-
-  "background": {
-     "page": "background.html"
-   },
-  "options_page" : "DevModeOptions.html",
-  "page_action" : {
-    "default_icon" : "gwt32.png",
-    "default_title" : "GWT Development Mode",
-    "default_popup" : "page_action.html"
-  },
-  "permissions" : [
-    "tabs"
-  ],
-  "plugins": [
-    { "path": "WINNT_x86-msvc/npGwtDevPlugin.dll", "public": true },
-    { "path": "Linux_x86-gcc3/libGwtDevPlugin.so", "public": true },
-    { "path": "Linux_x86_64-gcc3/libGwtDevPlugin.so", "public": true },
-    { "path": "Darwin-gcc3/gwtDev.plugin", "public": true }
-  ]
-}
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.html b/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.html
deleted file mode 100644
index eeaf556..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<head>
-  <style>
-    body {
-      width: 20em;
-    }
-  </style>
-  <script src="page_action.js"></script>
-</head>
-<body>
-  <h3>GWT Developer Plugin</h3>
-  <div id='message'></div>
-  <br/>
-  <button id="updateConfiguration">Update Your Configuration</button>
-  </p>
-</body>
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.js b/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.js
deleted file mode 100644
index b63e9b7..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.js
+++ /dev/null
@@ -1,35 +0,0 @@
-function getParam(key) {
-  var idx = window.location.search.indexOf(key + "=");
-  var value = '';
-  if (idx >= 0) {
-    idx += key.length + 1;
-    value = window.location.search.substring(idx).split('&')[0];
-  }
-  return value;
-}
-
-function init() {
-  var permission = getParam('permission');
-  var host = getParam('host');
-  var code = getParam('codeserver');
-  var message='';
-
-  if (permission == 'include') {
-    message = 'The web and code server (' + host + '/' + code + ') is allowed to use the plugin';
-  } else if (permission == 'exclude') {
-    message = 'The web and code server (' + host + '/' + code + ') has been been blacklisted.';
-  } else if (permission == 'unknown') {
-    message = 'The web and code server (' + host + '/' + code + ') is unknown to the plugin.';
-  }
-
-  document.getElementById('message').innerText = message;
-  document.getElementById("updateConfiguration").onclick = updateConfiguration
-}
-
-function updateConfiguration() {
-  var url = 'DevModeOptions.html?host=' + getParam('host') + '&codeserver=' + getParam('codeserver');
-  url = chrome.extension.getURL(url);
-  chrome.tabs.create({'url' : url});
-}
-
-window.onload = init;
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png b/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png
deleted file mode 100644
index 55a203b..0000000
--- a/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png
+++ /dev/null
Binary files differ
diff --git a/plugins/npapi/resource.h b/plugins/npapi/resource.h
deleted file mode 100644
index bd2d338..0000000
--- a/plugins/npapi/resource.h
+++ /dev/null
@@ -1,23 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by npOOPHM.rc
-//
-#define IDD_MAIN                        101
-#define IDC_BUTTON_GO                   1002
-#define IDC_STATIC_UA                   1003
-#define IDC_BUTTON1                     1005
-#define IDC_BUTTON_DONT                 1005
-#define IDD_ALLOW_DIALOG                103
-#define IDC_REMEMBER_CHECKBOX           201
-#define IDC_ALLOW_BUTTON                202
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        102
-#define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1006
-#define _APS_NEXT_SYMED_VALUE           101
-#endif
-#endif
diff --git a/plugins/npapi/test.html b/plugins/npapi/test.html
deleted file mode 100644
index e55d25e..0000000
--- a/plugins/npapi/test.html
+++ /dev/null
@@ -1,110 +0,0 @@
-<html>
-<head>
-<title>OOPHM test page</title>
-<script>
-var $wnd = window,$doc = document;
-var $moduleBase = 'file:///home/jat/s/gwt-oophm/plugins/firefox/';
-
-// fake property provider
-function __gwt_getProperty(prop) {
-  return "gecko1_8";
-}
-
-// wrapper to call JS methods, which we need both to be able to supply a
-// different this for method lookup and to get the exception back
-function __gwt_jsWrapper(method, methodlookup, thisref) {
-  try {
-    var args = Array.prototype.slice.call(arguments, 3);
-//    console.log("calling " + method + " on " + methodlookup + " (this=" + thisref + "), args are ",
-//        args);
-    var ret = methodlookup[method].apply(thisref, args);
-//    console.log("successful; returned ", ret);
-    return [0, ret];
-  } catch (e) {
-    try {
-//      console.log("methodlookup[method]=", methodlookup[method] ?
-//          methodlookup[method].toString() : methodlookup[method]);
-//      console.log("failed; exception ", e);
-    } catch (e2) {
-//      console.log("exception " + e2 + " logging original exception");
-    }
-    return [1, e];
-  }
-}
-
-function __gwt_initHandlers(resize, beforeunload, unload) {
-  console.log("initHandlers called", resize, beforeunload, unload);
-  var $wnd = window
-  , oldOnResize = $wnd.onresize
-  , oldOnBeforeUnload = $wnd.onbeforeunload
-  , oldOnUnload = $wnd.onunload
-  ;
-
-  $wnd.onresize = function(evt) {
-    try {
-      resize();
-    } finally {
-      oldOnResize && oldOnResize(evt);
-    }
-  };
-
-  $wnd.onbeforeunload = function(evt) {
-    var ret, oldRet;
-    try {
-      ret = beforeunload();
-    } finally {
-      oldRet = oldOnBeforeUnload && oldOnBeforeUnload(evt);
-    }
-    // Avoid returning null as IE6 will coerce it into a string.
-    // Ensure that "" gets returned properly.
-    if (ret != null) {
-      return ret;
-    }
-    if (oldRet != null) {
-      return oldRet;
-    }
-    // returns undefined.
-  };
-
-  $wnd.onunload = function(evt) {
-    try {
-      unload();
-    } finally {
-      oldOnUnload && oldOnUnload(evt);
-    }
-  };
-};
-
-// fire up plugin
-window.onload = function() {
-  var plugin = document.getElementById('plugin');
-  var connectTo = "localhost:9997";
-  var module = "com.google.gwt.sample.kitchensink.KitchenSink";
-  var idx = location.search.indexOf("gwt.hosted=");
-  if (idx >= 0) {
-    var amp = location.search.indexOf("&", idx);
-    if (amp >= 0) {
-      connectTo = location.search.substring(idx + 11, amp);
-    } else {
-      connectTo = location.search.substring(idx + 11);
-    }
-  }
-  var idx = location.search.indexOf("gwt.module=");
-  if (idx >= 0) {
-    var amp = location.search.indexOf("&", idx);
-    if (amp >= 0) {
-      module = location.search.substring(idx + 11, amp);
-    } else {
-      module = location.search.substring(idx + 11);
-    }
-  }
-  plugin.connect(connectTo, module)
-      || alert("failed to connect");
-};
-</script>
-</head>
-<body>
-<embed id="plugin" type="application/x-gwt-hosted-mode" width="10"
-        height="10"/>
-</body>
-</html>
diff --git a/plugins/npapi/version b/plugins/npapi/version
deleted file mode 100644
index 4c00d4e..0000000
--- a/plugins/npapi/version
+++ /dev/null
@@ -1 +0,0 @@
-0.0.0.20090326025214
diff --git a/plugins/platform/Win/AllowDialog.cpp b/plugins/platform/Win/AllowDialog.cpp
deleted file mode 100644
index 6e5672b..0000000
--- a/plugins/platform/Win/AllowDialog.cpp
+++ /dev/null
@@ -1,54 +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.
- */
-
-#include "AllowDialog.h"
-#include "Debug.h"
-#include "resource.h"
-
-HINSTANCE AllowDialog::hInstance;
-
-static BOOL CALLBACK allowDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) {
-  if (message != WM_COMMAND) {
-    return false;
-  }
-  bool allowed;
-  switch (LOWORD(wParam)) {
-    case IDCANCEL:
-      allowed = false;
-      break;
-    case IDC_ALLOW_BUTTON:
-      allowed = true;
-      break;
-    default:
-      // ignore anything but buttons which close the dialog
-      return false;
-  }
-  bool remember = IsDlgButtonChecked(hwndDlg, IDC_REMEMBER_CHECKBOX) == BST_CHECKED;
-  int returnVal = (allowed ? 1 : 0) + (remember ? 2 : 0);
-  EndDialog(hwndDlg, (INT_PTR) returnVal);
-  return true;
-}
-
-void AllowDialog::setHInstance(HINSTANCE hInstance) {
-  AllowDialog::hInstance = hInstance;
-}
-
-bool AllowDialog::askUserToAllow(bool* remember) {
-  int result = (int) DialogBox(hInstance, MAKEINTRESOURCE(IDD_ALLOW_DIALOG),
-      NULL, (DLGPROC) allowDialogProc);
-  *remember = (result & 2) != 0;
-  return (result & 1) != 0;
-}
diff --git a/plugins/platform/Win/AllowDialog.h b/plugins/platform/Win/AllowDialog.h
deleted file mode 100644
index 93f9438..0000000
--- a/plugins/platform/Win/AllowDialog.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef _H_AllowDialog
-#define _H_AllowDialog
-/*
- * 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.
- */
-
-#ifdef _WINDOWS
-#include <windows.h>
-#include <winnt.h>
-#include <windef.h>
-
-class AllowDialog {
-public:
-  static void setHInstance(HINSTANCE hInstance);
-
-  /**
-   * Ask the user if a connection should be allowed.
-   *
-   * @param remember *remember is set to true if the user asked us to remember this decision,
-   *     false otherwise
-   * @return return true if this connection should be allowed
-   */
-  static bool askUserToAllow(bool* remember);
-
-private:
-  static HINSTANCE hInstance;
-};
-#endif
-
-#endif
diff --git a/plugins/platform/Win/Preferences.cpp b/plugins/platform/Win/Preferences.cpp
deleted file mode 100644
index 7eeb381..0000000
--- a/plugins/platform/Win/Preferences.cpp
+++ /dev/null
@@ -1,100 +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.
- */
-
-#include <windows.h>
-#include <winnt.h>
-#include <winreg.h>
-#include "Debug.h"
-#include "Preferences.h"
-#include "AllowedConnections.h"
-
-#define REG_ACCESS_LIST "SOFTWARE\\Google\\Google Web Toolkit\\gwt-dev-plugin.accessList"
-
-/**
- * Return a null-terminated string containing the access list.
- *
- * @param HKEY registry key for the access list value
- * @return null-terminated string containing the access list (an empty string
- *     if the value does not exist) -- caller is responsible for freeing with
- *     delete[]
- */
-static char* getAccessList(HKEY keyHandle) {
-  char *buf;
-  DWORD len = 512;
-  while(true) {
-    buf = new char[len];
-    int cc = RegQueryValueExA(keyHandle, NULL, 0, NULL, (LPBYTE) buf, &len);
-    if (cc == ERROR_SUCCESS) {
-      break;
-    } else if (cc == ERROR_FILE_NOT_FOUND) {
-      // special handling if the value doesn't exist
-      len = 0;
-      break;
-    } else if (cc != ERROR_MORE_DATA) {
-      // log unexpected errors
-      Debug::log(Debug::Error) << "Unable to load access list from registry: "
-          << cc << Debug::flush;
-      len = 0;
-      break;
-    }
-    // Buffer wasn't big enough, so make it bigger and try again
-    delete [] buf;
-    len *= 2;
-  }
-  buf[len] = 0;
-  return buf;
-}
-
-void Preferences::addNewRule(const std::string& pattern, bool exclude) {
-  HKEY keyHandle;
-  if (RegCreateKeyExA(HKEY_CURRENT_USER, REG_ACCESS_LIST, 0, 0,
-      REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &keyHandle, NULL)
-      != ERROR_SUCCESS) {
-    return;
-  }
-  char *buf = getAccessList(keyHandle);
-  std::string pref(buf);
-  delete [] buf;
-  if (pref.length() > 0) {
-    pref += ',';
-  }
-  if (exclude) {
-    pref += '!';
-  }
-  pref += pattern;
-  int cc = RegSetValueExA(keyHandle, NULL, 0, REG_SZ, (LPBYTE) pref.c_str(),
-      pref.length() + 1);
-  if (cc != ERROR_SUCCESS) {
-      Debug::log(Debug::Error) << "Unable to store access list in registry: "
-          << cc << Debug::flush;
-  }
-  RegCloseKey(keyHandle);
-}
-
-void Preferences::loadAccessList() {
-  // TODO(jat): can Reg* routines throw exceptions?  If so, we need to make
-  // this exception safe about closing the key hendle and freeing the buffer.
-  HKEY keyHandle;
-  if (RegCreateKeyExA(HKEY_CURRENT_USER, REG_ACCESS_LIST, 0, 0,
-      REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &keyHandle, NULL)
-      != ERROR_SUCCESS) {
-    return;
-  }
-  char *buf = getAccessList(keyHandle);
-  AllowedConnections::initFromAccessList(buf);
-  delete [] buf;
-  RegCloseKey(keyHandle);
-}
diff --git a/plugins/platform/Win/Preferences.h b/plugins/platform/Win/Preferences.h
deleted file mode 100644
index f4fc49b..0000000
--- a/plugins/platform/Win/Preferences.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef _H_Preferences
-#define _H_Preferences
-/*
- * 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.
- */
-
-#include <string>
-
-/**
- * Deal with getting/storing/updating preferences in the Windows registry.
- */
-class Preferences {
-private:
-  // prevent instantiation
-  Preferences() {}
-
-public:
-  static void loadAccessList();
-  static void addNewRule(const std::string& pattern, bool exclude);
-};
-
-#endif
diff --git a/plugins/webkit/Browser/AppController.h b/plugins/webkit/Browser/AppController.h
deleted file mode 100644
index 2d4747f..0000000
--- a/plugins/webkit/Browser/AppController.h
+++ /dev/null
@@ -1,25 +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.
- */
-
-#import <Cocoa/Cocoa.h>
-#import <WebKit/WebKit.h>
-
-@interface AppController : NSObject
-{
-    IBOutlet WebView *webview;
-}
-- (IBAction)newWindow:(id)sender;
-@end
diff --git a/plugins/webkit/Browser/AppController.m b/plugins/webkit/Browser/AppController.m
deleted file mode 100644
index 046a507..0000000
--- a/plugins/webkit/Browser/AppController.m
+++ /dev/null
@@ -1,59 +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.
- */
-
-#import "AppController.h"
-#import "BrowserWindow.h"
-
-@implementation AppController
-- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
-  NSLog(@"%s", __PRETTY_FUNCTION__);
-  
-  if (![WebView canShowMIMEType:@"application/x-gwt-hosted-mode"]) {
-    NSLog(@"plugin not available");
-    exit(-1);
-  }
-  NSString* str = @"http://localhost:8888/com.google.gwt.dev.jjs.CompilerSuite.JUnit/junit.html?gwt.hosted=localhost:9997";
-//  NSString* str = @"http://localhost:8888/com.google.gwt.user.RPCSuite.JUnit/junit.html?gwt.hosted=localhost:9997";
-//  NSString* str = @"http://localhost:8888/com.google.gwt.user.User.JUnit/junit.html?gwt.hosted=localhost:9997";
-  [webview setUIDelegate:self];
-  [webview setShouldCloseWithWindow: YES];
-  [[webview mainFrame] loadRequest: [NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
-}
-
-- (IBAction)newWindow:(id)sender {
-  NSLog(@"Action received");
-  NSRect r;
-  r.origin.x = 100;
-  r.origin.y = 100;
-  r.size.height = 500;
-  r.size.width = 500;
-  
-  WebView* webView = [[WebView alloc] initWithFrame:r];
-  NSString* str = @"http://localhost:8888/com.google.gwt.sample.kitchensink.KitchenSink/KitchenSink.html?gwt.hosted=localhost:9997";
-  [webView setUIDelegate:self];
-  [webView setShouldCloseWithWindow: YES];
-  [[webView mainFrame] loadRequest: [NSURLRequest requestWithURL:[NSURL URLWithString:str]]];
-  
-  NSWindow* wnd = [[BrowserWindow alloc] initWithContentRect:r styleMask:NSResizableWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:NO];
-  [wnd setContentView:webView];
-  [wnd makeKeyAndOrderFront:self];
-}
-
-- (void)webView:(WebView *)sender windowScriptObjectAvailable:(WebScriptObject *)windowScriptObject {
-  NSLog(@"%s", __PRETTY_FUNCTION__);
-}
-
-@end
diff --git a/plugins/webkit/Browser/Browser-Info.plist b/plugins/webkit/Browser/Browser-Info.plist
deleted file mode 100644
index c597e30..0000000
--- a/plugins/webkit/Browser/Browser-Info.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>${EXECUTABLE_NAME}</string>
-	<key>CFBundleIconFile</key>
-	<string>gwtlogo</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.google.gwt.oophm.browser</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.0</string>
-	<key>NSMainNibFile</key>
-	<string>browser.nib</string>
-	<key>NSPrincipalClass</key>
-	<string>NSApplication</string>
-</dict>
-</plist>
diff --git a/plugins/webkit/Browser/BrowserWindow.h b/plugins/webkit/Browser/BrowserWindow.h
deleted file mode 100644
index 18664ed..0000000
--- a/plugins/webkit/Browser/BrowserWindow.h
+++ /dev/null
@@ -1,23 +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.
- */
-
-#import <Cocoa/Cocoa.h>
-
-@interface BrowserWindow : NSWindow {
-
-}
-
-@end
diff --git a/plugins/webkit/Browser/BrowserWindow.m b/plugins/webkit/Browser/BrowserWindow.m
deleted file mode 100644
index c822886..0000000
--- a/plugins/webkit/Browser/BrowserWindow.m
+++ /dev/null
@@ -1,21 +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.
- */
-
-#import "BrowserWindow.h"
-
-@implementation BrowserWindow
-
-@end
diff --git a/plugins/webkit/Browser/browser.nib/classes.nib b/plugins/webkit/Browser/browser.nib/classes.nib
deleted file mode 100644
index af71aad..0000000
--- a/plugins/webkit/Browser/browser.nib/classes.nib
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>IBClasses</key>
-	<array>
-		<dict>
-			<key>CLASS</key>
-			<string>BrowserWindow</string>
-			<key>LANGUAGE</key>
-			<string>ObjC</string>
-			<key>SUPERCLASS</key>
-			<string>NSWindow</string>
-		</dict>
-		<dict>
-			<key>ACTIONS</key>
-			<dict>
-				<key>toggleAutomaticLinkDetection</key>
-				<string>id</string>
-				<key>toggleAutomaticQuoteSubstitution</key>
-				<string>id</string>
-				<key>toggleGrammarChecking</key>
-				<string>id</string>
-				<key>toggleSmartInsertDelete</key>
-				<string>id</string>
-			</dict>
-			<key>CLASS</key>
-			<string>FirstResponder</string>
-			<key>LANGUAGE</key>
-			<string>ObjC</string>
-			<key>SUPERCLASS</key>
-			<string>NSObject</string>
-		</dict>
-		<dict>
-			<key>ACTIONS</key>
-			<dict>
-				<key>newWindow</key>
-				<string>id</string>
-			</dict>
-			<key>CLASS</key>
-			<string>AppController</string>
-			<key>LANGUAGE</key>
-			<string>ObjC</string>
-			<key>OUTLETS</key>
-			<dict>
-				<key>webview</key>
-				<string>WebView</string>
-			</dict>
-			<key>SUPERCLASS</key>
-			<string>NSObject</string>
-		</dict>
-	</array>
-	<key>IBVersion</key>
-	<string>1</string>
-</dict>
-</plist>
diff --git a/plugins/webkit/Browser/browser.nib/info.nib b/plugins/webkit/Browser/browser.nib/info.nib
deleted file mode 100644
index 6271e8e..0000000
--- a/plugins/webkit/Browser/browser.nib/info.nib
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>IBFramework Version</key>
-	<string>629</string>
-	<key>IBLastKnownRelativeProjectPath</key>
-	<string>../../oophm.xcodeproj</string>
-	<key>IBOldestOS</key>
-	<integer>5</integer>
-	<key>IBOpenObjects</key>
-	<array/>
-	<key>IBSystem Version</key>
-	<string>9C7010</string>
-	<key>targetFramework</key>
-	<string>IBCocoaFramework</string>
-</dict>
-</plist>
diff --git a/plugins/webkit/Browser/browser.nib/keyedobjects.nib b/plugins/webkit/Browser/browser.nib/keyedobjects.nib
deleted file mode 100644
index 7691b0d..0000000
--- a/plugins/webkit/Browser/browser.nib/keyedobjects.nib
+++ /dev/null
Binary files differ
diff --git a/plugins/webkit/Browser/main.m b/plugins/webkit/Browser/main.m
deleted file mode 100644
index f1a7cba..0000000
--- a/plugins/webkit/Browser/main.m
+++ /dev/null
@@ -1,22 +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.
- */
-
-#import <Cocoa/Cocoa.h>
-
-int main(int argc, char *argv[])
-{
-    return NSApplicationMain(argc,  (const char **) argv);
-}
diff --git a/plugins/webkit/Core/ObjectFunctions.cpp b/plugins/webkit/Core/ObjectFunctions.cpp
deleted file mode 100644
index a0a4a73..0000000
--- a/plugins/webkit/Core/ObjectFunctions.cpp
+++ /dev/null
@@ -1,100 +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.
- */
-
-#include "ObjectFunctions.h"
-#include "WebScriptSessionHandler.h"
-#include "scoped_ptr.h"
-
-JSValueRef JavaObjectCallAsFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
-                                            size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) {
-  TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(function));
-  WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
-  
-  *exception = NULL;
-  int dispatchId = JSValueToNumber(ctx, arguments[0], exception);
-  if (*exception) {
-    return JSValueMakeUndefined(ctx);
-  }
-  
-  bool explicitThis = JSValueToBoolean(ctx, arguments[1]);
-  if (explicitThis) {
-    thisObject = JSValueToObject(ctx, arguments[1], exception);
-    if (*exception) {
-      return JSValueMakeUndefined(ctx);
-    }
-  } else {
-    thisObject = function;
-  }
-  
-  return sessionHandler->javaFunctionCallbackImpl(dispatchId, thisObject,
-                                                  argumentCount - 2, &arguments[2], exception);  
-}
-
-/*
- * Static-dispatch function to clean up a Java object proxy.  This will
- * deallocate the TrackingData as well as remove the objectId mapping.  This
- * function is called from JavaScriptCore as well as ~WebScriptSessionHandler.
- *
- * The JavaScriptCore documentation indicates that finalizers may be called
- * from any thread, so we can't see javaFree messages directly from this
- * method.  Instead, we'll accumulate a list of ids to free. 
- */
-void JavaObjectFinalize (JSObjectRef object) {
-  TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
-  if (!tracker) {
-    // The tracker may have already been deleted in ~WebScriptSessionHandler()
-    return;
-  }
-  Debug::log(Debug::Spam) << "Finalizing Java object " << tracker->getObjectId() << Debug::flush;
-  JSObjectSetPrivate(object, NULL);
-  int id = tracker->getObjectId();  
-  WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
-  delete tracker;
-  sessionHandler->javaObjectFinalizeImpl(id);
-}
-
-/*
- * Static-dispatch function to check for the presence of a property on a Java
- * object proxy.
- */
-bool JavaObjectHasProperty (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) {
-  TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
-  WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
-  return sessionHandler->javaObjectHasPropertyImpl(tracker, object, propertyName);
-}
-
-/*
- * Static-dispatch function to retrieve the value of a property on a Java
- * object proxy.
- */
-JSValueRef JavaObjectGetProperty (JSContextRef ctx, JSObjectRef object,
-                                         JSStringRef propertyName, JSValueRef* exception) {
-  TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
-  WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
-  return sessionHandler->javaObjectGetPropertyImpl(tracker, object, propertyName, exception);
-}
-
-/*
- * Static-dispatch function to set the value of a property an a Java object
- * proxy.
- */
-bool JavaObjectSetProperty (JSContextRef ctx, JSObjectRef object,
-                                   JSStringRef propertyName, JSValueRef value,
-                                   JSValueRef* exception) {
-  TrackingDataRef tracker = static_cast<TrackingDataRef>(JSObjectGetPrivate(object));
-  WebScriptSessionHandler* sessionHandler = static_cast<WebScriptSessionHandler*>(tracker->getSessionData());
-  return sessionHandler->javaObjectSetPropertyImpl(tracker, object, propertyName, value, exception);
-}
diff --git a/plugins/webkit/Core/ObjectFunctions.h b/plugins/webkit/Core/ObjectFunctions.h
deleted file mode 100644
index 176218e..0000000
--- a/plugins/webkit/Core/ObjectFunctions.h
+++ /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.
- */
-
-#include "JavaScriptCore/JavaScriptCore.h"
-
-/*
- * Handle JSNI function invocations.
- */
-JSValueRef JavaObjectCallAsFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject,
-                                    size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception);
-
-/*
- * Static-dispatch function to clean up a Java object proxy.  This will
- * deallocate the TrackingData as well as remove the objectId mapping.  This
- * function is called from JavaScriptCore as well as ~WebScriptSessionHandler.
- *
- * The JavaScriptCore documentation indicates that finalizers may be called
- * from any thread, so we can't see javaFree messages directly from this
- * method.  Instead, we'll accumulate a list of ids to free. 
- */
-void JavaObjectFinalize (JSObjectRef object);
-
-/*
- * Static-dispatch function to check for the presence of a property on a Java
- * object proxy.
- */
-bool JavaObjectHasProperty (JSContextRef ctx, JSObjectRef object, JSStringRef propertyName);
-
-/*
- * Static-dispatch function to retrieve the value of a property on a Java
- * object proxy.
- */
-JSValueRef JavaObjectGetProperty (JSContextRef ctx, JSObjectRef object,
-                                         JSStringRef propertyName, JSValueRef* exception);
-
-/*
- * Static-dispatch function to set the value of a property an a Java object
- * proxy.
- */
-bool JavaObjectSetProperty (JSContextRef ctx, JSObjectRef object,
-                                   JSStringRef propertyName, JSValueRef value,
-                                   JSValueRef* exception);
\ No newline at end of file
diff --git a/plugins/webkit/Core/SessionData.h b/plugins/webkit/Core/SessionData.h
deleted file mode 100644
index 9f60ddf..0000000
--- a/plugins/webkit/Core/SessionData.h
+++ /dev/null
@@ -1,60 +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.
- */
-
-#import "HostChannel.h"
-#import "JavaScriptCore/JavaScriptCore.h"
-#import "SessionHandler.h"
-
-/*
- * Encapsules per-OOPHM-session data.
- */
-class SessionData {
-public:
-  SessionData(HostChannel* channel, JSGlobalContextRef contextRef, 
-              SessionHandler* sessionHandler) : channel(channel),
-                                                contextRef(contextRef),
-                                                sessionHandler(sessionHandler) {
-  }
-  
-  JSGlobalContextRef getContext() const {
-    return contextRef;
-  }
-  
-  HostChannel* getHostChannel() const {
-    return channel;
-  }
-  
-  SessionHandler* getSessionHandler() const {
-    return sessionHandler;
-  }
-
-protected:
-  /*
-   * The communication channel used for the OOPHM session.
-   */
-  HostChannel* const channel;
-  
-  /*
-   * The JavaScriptCore interpreter instance.
-   */
-  JSGlobalContextRef const contextRef;
-  
-  /*
-   * A reference to the SessionHandler being used in the OOPHM session.
-   */
-  SessionHandler* const sessionHandler;
-};
-typedef SessionData* SessionDataRef;
\ No newline at end of file
diff --git a/plugins/webkit/Core/TrackingData.h b/plugins/webkit/Core/TrackingData.h
deleted file mode 100644
index de19f00..0000000
--- a/plugins/webkit/Core/TrackingData.h
+++ /dev/null
@@ -1,53 +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.
- */
-
-#import "SessionData.h"
-
-/*
- * This class encapsulates per-object information to determine how to dispatch
- * a given JSObjectRef that is a Java object proxy. Instances of
- * this class are intended to be stored in the private data area provided
- * by JSObjectRef.
- */
-class TrackingData {
-public:
-  /*
-   * Constructor for Java object proxies.
-   */
-  TrackingData(const SessionDataRef sessionData, const unsigned objId) :
-  objId(objId), sessionData(sessionData) {
-  }
-  
-  const unsigned getObjectId() const {
-    return objId;
-  }
-  
-  SessionDataRef getSessionData() const {
-    return sessionData;
-  }
-  
-private:
-  /*
-   * The tracking number assigned to the object.
-   */
-  const unsigned objId;
-  
-  /*
-   * A reference to the per-OOPHM-session data.
-   */
-  SessionDataRef const sessionData;  
-};
-typedef const TrackingData* TrackingDataRef;
diff --git a/plugins/webkit/Core/WebScriptSessionHandler.cpp b/plugins/webkit/Core/WebScriptSessionHandler.cpp
deleted file mode 100644
index 1a1e972..0000000
--- a/plugins/webkit/Core/WebScriptSessionHandler.cpp
+++ /dev/null
@@ -1,727 +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.
- */
-
-#import "WebScriptSessionHandler.h"
-#import "InvokeMessage.h"
-#import "ObjectFunctions.h"
-#import "ServerMethods.h"
-#import "TrackingData.h"
-#import "scoped_ptr.h"
-
-
-WebScriptSessionHandler::WebScriptSessionHandler(HostChannel* channel,
-                                                 JSGlobalContextRef contextRef,
-                                                 CrashHandlerRef crashHandler) :
-SessionData(channel, contextRef, this), jsObjectId(1), crashHandler(crashHandler) {
-
-  JSClassDefinition def = kJSClassDefinitionEmpty;
-  def.className = "JavaObject";
-  def.hasProperty = JavaObjectHasProperty;
-  def.callAsFunction = JavaObjectCallAsFunction;
-  def.finalize = JavaObjectFinalize;
-  def.getProperty = JavaObjectGetProperty;
-  def.setProperty = JavaObjectSetProperty;
-  javaObjectWrapperClass = JSClassCreate(&def);
-  JSClassRetain(javaObjectWrapperClass);
-
-  // Get the String constructor function to tell Strings from other Objects
-  JSStringRef stringString = JSStringCreateWithUTF8CString("String");
-  JSValueRef stringConstructorValue = JSObjectGetProperty(contextRef,
-                                                          JSContextGetGlobalObject(contextRef),
-                                                          stringString, NULL);
-  stringConstructor = JSValueToObject(contextRef, stringConstructorValue, NULL);
-  JSValueProtect(contextRef, stringConstructor);
-  JSStringRelease(stringString);
-
-  // Call out to the utility __gwt_makeResult function to create the return array
-  JSStringRef makeResultString = JSStringCreateWithUTF8CString("__gwt_makeResult");
-  JSValueRef makeResultValue = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef), makeResultString, NULL);
-  JSStringRelease(makeResultString);
-
-  if (!JSValueIsObject(contextRef, makeResultValue)) {
-    crashHandler->crash(__PRETTY_FUNCTION__, "Could not find __gwt_makeResult");
-  } else {
-    makeResultFunction = JSValueToObject(contextRef, makeResultValue, NULL);
-    JSValueProtect(contextRef, makeResultFunction);
-  }
-
-  pthread_mutexattr_t mutexAttrs;
-  pthread_mutexattr_init(&mutexAttrs);
-  // This behaves basically like the Java synchronized keyword
-  pthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_RECURSIVE);
-  pthread_mutex_init(&javaObjectsLock, &mutexAttrs);
-  pthread_mutexattr_destroy(&mutexAttrs);
-}
-
-WebScriptSessionHandler::~WebScriptSessionHandler() {
-  std::map<int, JSObjectRef>::iterator i;
-
-  pthread_mutex_lock(&javaObjectsLock);
-  while ((i = javaObjectsById.begin()) != javaObjectsById.end()) {
-    JavaObjectFinalize(i->second);
-  }
-  pthread_mutex_unlock(&javaObjectsLock);
-
-  for (i = jsObjectsById.begin(); i != jsObjectsById.end(); i++) {
-    JSObjectRef ref = i->second;
-    delete static_cast<TrackingDataRef>(JSObjectGetPrivate(ref));
-    JSObjectSetPrivate(ref, NULL);
-    JSValueUnprotect(contextRef, i->second);
-  }
-
-  JSClassRelease(javaObjectWrapperClass);
-
-  JSValueUnprotect(contextRef, stringConstructor);
-  JSValueUnprotect(contextRef, makeResultFunction);
-
-  JSGarbageCollect(contextRef);
-  pthread_mutex_destroy(&javaObjectsLock);
-}
-
-void WebScriptSessionHandler::disconnectDetectedImpl() {
-  crashHandler->crash(__PRETTY_FUNCTION__, "Server disconnect detected");
-}
-
-void WebScriptSessionHandler::fatalError(HostChannel& channel,
-    const std::string& message) {
-  // TODO: better way of reporting error?
-  Debug::log(Debug::Error) << "Fatal error: " << message << Debug::flush;
-}
-
-void WebScriptSessionHandler::sendFreeValues(HostChannel& channel) {
-  pthread_mutex_lock(&javaObjectsLock);
-  int idCount = javaObjectsToFree.size();
-  if (idCount == 0) {
-    pthread_mutex_unlock(&javaObjectsLock);
-    return;
-  }
-
-  int ids[idCount];
-  std::set<int>::iterator it = javaObjectsToFree.begin();
-  for (int i = 0; i < idCount; it++) {
-    ids[i++] = *it;
-  }
-  if (!ServerMethods::freeJava(channel, this, idCount, ids)) {
-    Debug::log(Debug::Error) << "Unable to free Java ids" << Debug::flush;
-  } else {
-    Debug::log(Debug::Debugging) << "Freed " << idCount << " Java ids" << Debug::flush;
-  }
-  javaObjectsToFree.clear();
-  pthread_mutex_unlock(&javaObjectsLock);
-}
-
-void WebScriptSessionHandler::freeValue(HostChannel& channel, int idCount, const int* ids) {
-  Debug::log(Debug::Spam) << "freeValue freeing " << idCount << " js objects" << Debug::flush;
-  if (idCount == 0) {
-    return;
-  }
-
-  for (int i = 0; i < idCount; i++) {
-    int objId = ids[i];
-
-    std::map<int, JSObjectRef>::iterator x = jsObjectsById.find(objId);
-    if (x == jsObjectsById.end()) {
-      Debug::log(Debug::Error) << "Unknown object id " << objId << Debug::flush;
-      continue;
-    }
-
-    JSObjectRef ref = x->second;
-    jsObjectsById.erase(objId);
-    jsIdsByObject.erase(ref);
-    JSValueUnprotect(contextRef, ref);
-  }
-  Debug::log(Debug::Debugging) << "Freed " << idCount << " JS objects" << Debug::flush;
-}
-
-void WebScriptSessionHandler::initiateAutodestructSequence(const char* functionName, const char* message) {
-  crashHandler->crash(functionName, message);
-}
-
-bool WebScriptSessionHandler::invoke(HostChannel& channel, const Value& thisObj,
-                                    const std::string& methodName,
-                                    int numArgs, const Value* args, Value* returnValue) {
-  Debug::log(Debug::Spam) << "invoke " << methodName << Debug::flush;
-
-  JSValueRef argsJS[numArgs];
-  JSValueRef localException = NULL;
-  JSStringRef methodNameJS = JSStringCreateWithUTF8CString(methodName.c_str());
-  JSObjectRef thisObjJs;
-
-  if (thisObj.isNull()) {
-    thisObjJs = JSContextGetGlobalObject(contextRef);
-  } else {
-    thisObjJs = (JSObjectRef) makeValueRef(thisObj);
-  }
-
-  JSValueRef functionValueJS = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef),
-                                                   methodNameJS, &localException);
-  JSStringRelease(methodNameJS);
-
-  if (!JSValueIsObject(contextRef, functionValueJS)) {
-    char message[512];
-    snprintf(message, sizeof(message), "Could not find method for property name %s on %s", methodName.c_str(), thisObj.toString().c_str());
-    makeExceptionValue(*returnValue, message);
-    return true;
-  }
-
-  JSObjectRef functionJS = JSValueToObject(contextRef, functionValueJS,
-                                           &localException);
-  if (localException) {
-    makeValue(*returnValue, localException);
-    return true;
-  }
-
-  // Convert the arguments
-  for (int i = 0; i < numArgs; i++) {
-    argsJS[i] = makeValueRef(args[i]);
-  }
-
-  JSValueRef retVal = JSObjectCallAsFunction(contextRef, functionJS,
-                                             thisObjJs, numArgs, argsJS,
-                                             &localException);
-
-  if (localException) {
-    Debug::log(Debug::Spam) << "Returning exception to server" << Debug::flush;
-    makeValue(*returnValue, localException);
-    return true;
-  } else {
-    makeValue(*returnValue, retVal);
-    return false;
-  }
-}
-
-bool WebScriptSessionHandler::invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
-                                            const Value* const args, Value* returnValue) {
-  Debug::log(Debug::Spam) << "invokeSpecial " << method << Debug::flush;
-  switch (method) {
-    case GetProperty:
-    {
-      int objId = args[0].getInt();
-      std::map<int, JSObjectRef>::iterator i = jsObjectsById.find(objId);
-      if (i == jsObjectsById.end()) {
-        char message[50];
-        snprintf(message, sizeof(message), "Unknown object id %i", objId);
-        makeExceptionValue(*returnValue, message);
-        return true;
-      }
-
-      JSObjectRef jsObj = i->second;
-      if (args[1].isString()) {
-        JSStringRef asString = JSValueToStringCopy(contextRef, jsObj, NULL);
-        int maxLength = JSStringGetMaximumUTF8CStringSize(asString);
-        scoped_array<char> asChars(new char[maxLength]);
-        JSStringGetUTF8CString(asString, asChars.get(), maxLength);
-
-        JSValueRef localException = NULL;
-        JSStringRef str = JSStringCreateWithUTF8CString(args[1].getString().c_str());
-        JSValueRef value = JSObjectGetProperty(contextRef, jsObj, str, &localException);
-        JSStringRelease(str);
-        if (localException) {
-          makeValue(*returnValue, localException);
-          return true;
-        } else {
-          makeValue(*returnValue, value);
-          return false;
-        }
-      } else if (args[1].isInt()) {
-        JSValueRef localException = NULL;
-        JSValueRef value = JSObjectGetPropertyAtIndex(contextRef, jsObj, args[1].getInt(), &localException);
-
-        if (localException) {
-          makeValue(*returnValue, localException);
-          return true;
-        } else {
-          makeValue(*returnValue, value);
-          return false;
-        }
-      } else {
-        char message[50];
-        snprintf(message, sizeof(message), "Unhandled argument type %s for getProperty", args[1].toString().c_str());
-        makeExceptionValue(*returnValue, message);
-        return true;
-      }
-    }
-    default:
-      Debug::log(Debug::Error) << "Unhandled invokeSpecial " << method << Debug::flush;
-      makeExceptionValue(*returnValue, "Unhandled invokeSpecial");
-      return true;
-  }
-}
-
-JSValueRef WebScriptSessionHandler::javaFunctionCallbackImpl (int dispatchId,
-                                                              JSObjectRef thisObject,
-                                                              size_t argumentCount,
-                                                              const JSValueRef arguments[],
-                                                              JSValueRef* exception){
-  /*
-   * NB: Because throwing exceptions in JavaScriptCore is trivial, we don't rely
-   * on any special return values to indicate that an exception is thrown, we'll simply
-   * throw the exception.
-   */
-  Debug::log(Debug::Debugging) << "Java method " << dispatchId << " invoked" << Debug::flush;
-
-  JSValueRef toReturn;
-  if (crashHandler->hasCrashed()) {
-    Debug::log(Debug::Debugging) << "Not executing method since we have crashed" << Debug::flush;
-    toReturn =  JSValueMakeUndefined(contextRef);
-  } else {
-    /*
-     * If a JS function is evaluated without an meaningful this object or the global
-     * object is implicitly used as the this object, we'll assume that the
-     * Java-derived method is static, and send a null this object to the server
-     */
-    Value thisValue;
-    if (JSValueIsEqual(contextRef, thisObject, JSContextGetGlobalObject(contextRef), NULL)) {
-      thisValue = Value();
-      thisValue.setNull();
-    } else {
-      makeValue(thisValue, thisObject);
-    }
-
-    // Argument conversion is straightforward
-    Value *args = new Value[argumentCount];
-    for (int i = 0; i < argumentCount; i++) {
-      makeValue(args[i], arguments[i]);
-    }
-      
-    bool status = InvokeMessage::send(*channel, thisValue, dispatchId,
-                                      argumentCount, args);
-    delete[] args;
-    if (!status) {
-      initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to send invocation message");
-      *exception = makeException("Unable to send invocation message");
-      return JSValueMakeUndefined(contextRef);
-    }
-
-    scoped_ptr<ReturnMessage> ret(channel->reactToMessagesWhileWaitingForReturn(sessionHandler));
-
-    if (!ret.get()) {
-      initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to receive return message");
-      *exception = makeException("Unable to receive return message");
-      return JSValueMakeUndefined(contextRef);
-    }
-
-    Value v = ret->getReturnValue();
-
-    if (ret->isException()) {
-      *exception = makeValueRef(v);
-      toReturn = JSValueMakeUndefined(contextRef);
-    } else {
-      toReturn = makeValueRef(v);
-    }
-  }
-
-  JSValueRef makeResultArguments[] = {JSValueMakeBoolean(contextRef, false), toReturn};
-  return JSObjectCallAsFunction(contextRef, makeResultFunction, NULL, 2, makeResultArguments, exception);
-}
-
-void WebScriptSessionHandler::javaObjectFinalizeImpl(int objId) {
-  if (pthread_mutex_lock(&javaObjectsLock)) {
-    Debug::log(Debug::Error) << "Unable to acquire javaObjectsLock in thread " << pthread_self() << " " << __PRETTY_FUNCTION__ << Debug::flush;
-    initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to acquire javaObjectsLock");
-    return;
-  }
-  javaObjectsById.erase(objId);
-  javaObjectsToFree.insert(objId);
-  if (pthread_mutex_unlock(&javaObjectsLock)) {
-    Debug::log(Debug::Error) << "Unable to release javaObjectsLock in thread " << pthread_self() << " " << __PRETTY_FUNCTION__ << Debug::flush;
-    initiateAutodestructSequence(__PRETTY_FUNCTION__, "Unable to release javaObjectsLock");
-  }
-}
-
-JSValueRef WebScriptSessionHandler::javaObjectGetPropertyImpl (TrackingDataRef tracker, JSObjectRef object,
-                                                               JSStringRef propertyName, JSValueRef* exception) {
-  *exception = NULL;
-  
-  if (crashHandler->hasCrashed()) {
-    Debug::log(Debug::Debugging) << "Not executing since we have crashed" << Debug::flush;
-    return JSValueMakeUndefined(contextRef);
-  }
-
-  // Convert the name
-  int maxLength = JSStringGetMaximumUTF8CStringSize(propertyName);
-  scoped_array<char> propertyNameChars(new char[maxLength]);
-  JSStringGetUTF8CString(propertyName, propertyNameChars.get(), maxLength);
-  JSValueRef toReturn;
-
-  if (!strcmp(propertyNameChars.get(), "toString")) {
-    // We'll call out to the JSNI tear-off support function
-    JSStringRef tearOffName =JSStringCreateWithUTF8CString("__gwt_makeTearOff");
-    JSValueRef makeTearOffValue = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef), tearOffName, exception);
-    JSStringRelease(tearOffName);
-    if (*exception) {
-      return JSValueMakeUndefined(contextRef);
-    }
-
-    JSObjectRef makeTearOff = JSValueToObject(contextRef, makeTearOffValue, exception);
-    if (*exception) {
-      return JSValueMakeUndefined(contextRef);
-    }
-
-    JSValueRef arguments[3];
-    arguments[0] = object;
-    arguments[1] = JSValueMakeNumber(contextRef, 0);
-    arguments[2] = JSValueMakeNumber(contextRef, 0);
-    toReturn = JSObjectCallAsFunction(contextRef, makeTearOff, JSContextGetGlobalObject(contextRef), 3, arguments, exception);
-  } else {
-    char* endptr;
-    int dispatchId = strtol(propertyNameChars.get(), &endptr, 10);
-
-    if (*endptr != '\0') {
-      Debug::log(Debug::Error) << "Unable to parse dispatch id " << propertyNameChars.get() << Debug::flush;
-      *exception = makeException("Unable to parse dispatch id");
-    } else if (dispatchId < 0) {
-      Debug::log(Debug::Error) << "Dispatch ids may not be negative" << Debug::flush;
-      *exception = makeException("Dispatch ids may not be negative");
-    } else {
-      Value v = ServerMethods::getProperty(*channel, this, tracker->getObjectId(), dispatchId);
-      toReturn = makeValueRef(v);
-    }
-  }
-
-  return toReturn;
-}
-
-bool WebScriptSessionHandler::javaObjectHasPropertyImpl (TrackingDataRef tracker, JSObjectRef object, JSStringRef propertyName) {
-  // The property name must either be "toString" or a number
-  int maxLength = JSStringGetMaximumUTF8CStringSize(propertyName);
-  scoped_array<char> propertyNameChars(new char[maxLength]);
-  JSStringGetUTF8CString(propertyName, propertyNameChars.get(), maxLength);
-  if (!strcmp(propertyNameChars.get(), "toString")) {
-    return true;
-  }
-
-  char* endptr;
-  int dispatchId = strtol(propertyNameChars.get(), &endptr, 10);
-
-  if (*endptr != '\0') {
-    return false;
-  } else if (dispatchId < 0) {
-    return false;
-  } else {
-    return true;
-  }
-}
-
-bool WebScriptSessionHandler::javaObjectSetPropertyImpl (TrackingDataRef tracker, JSObjectRef object,
-                                                         JSStringRef propertyName, JSValueRef jsValue,
-                                                         JSValueRef* exception) {
-
-  if (crashHandler->hasCrashed()) {
-    Debug::log(Debug::Debugging) << "Not executing since we have crashed" << Debug::flush;
-    return true;
-  }
-
-  int maxLength = JSStringGetMaximumUTF8CStringSize(propertyName);
-  scoped_array<char> propertyNameChars(new char[maxLength]);
-  JSStringGetUTF8CString(propertyName, propertyNameChars.get(), maxLength);
-  Value value;
-
-  char* endptr;
-  int dispatchId = strtol(propertyNameChars.get(), &endptr, 10);
-
-  if (*endptr != '\0') {
-    // TODO Figure out the right policy here; when we throw a Java object, JSCore wants to
-    // add expandos to record stack information.  It would be possible to map the limited
-    // number of properties into a synthetic causal exception in the exception being thrown.
-  } else if (dispatchId < 0) {
-    // Do nothing.
-    Debug::log(Debug::Error) << "Dispatch ids may not be negative" << Debug::flush;
-    *exception = makeException("Dispatch ids may not be negative");
-  } else {
-
-    makeValue(value, jsValue);
-
-    if (!ServerMethods::setProperty(*channel, this, tracker->getObjectId(), dispatchId, value)) {
-      char message[50];
-      snprintf(message, sizeof(message), "Unable to set value object %i dispatchId %i", tracker->getObjectId(), dispatchId);
-      *exception = makeException(message);
-    }
-  }
-
-  // true means to not try to follow the prototype chain; not an indication of success
-  return true;
-}
-
-void WebScriptSessionHandler::loadJsni(HostChannel& channel, const std::string& js) {
-  Debug::log(Debug::Spam) << "loadJsni " << js << Debug::flush;
-  JSValueRef localException = NULL;
-
-  JSStringRef script = JSStringCreateWithUTF8CString(js.c_str());
-  JSEvaluateScript(contextRef, script, NULL, NULL, NULL, &localException);
-  JSStringRelease(script);
-
-  if (localException) {
-    // TODO Exception handling
-    Debug::log(Debug::Error) << "Exception thrown during loadJsni" << Debug::flush;
-  } else {
-    Debug::log(Debug::Spam) << "Success" << Debug::flush;
-  }
-}
-
-JSValueRef WebScriptSessionHandler::makeException(const char* message) {
-  JSValueRef localException = NULL;
-  JSObjectRef global = JSContextGetGlobalObject(contextRef);
-
-  JSStringRef errorName = JSStringCreateWithUTF8CString("Error");
-  JSValueRef errorValue = JSObjectGetProperty(contextRef, global, errorName, &localException);
-  JSStringRelease(errorName);
-
-  if (!JSValueIsObject(contextRef, errorValue)) {
-    initiateAutodestructSequence(__PRETTY_FUNCTION__, "Could not get reference to Error");
-    return JSValueMakeUndefined(contextRef);
-  }
-
-  JSObjectRef errorObject = (JSObjectRef) errorValue;
-
-  if (!JSObjectIsFunction(contextRef, errorObject)) {
-    initiateAutodestructSequence(__PRETTY_FUNCTION__, "Error was not a function");
-    return JSValueMakeUndefined(contextRef);
-  }
-
-  JSValueRef args[1];
-  JSStringRef messageJs = JSStringCreateWithUTF8CString(message);
-  args[0] = JSValueMakeString(contextRef, messageJs);
-  JSStringRelease(messageJs);
-
-  return JSObjectCallAsConstructor(contextRef, errorObject, 1, args, &localException);
-}
-
-void WebScriptSessionHandler::makeExceptionValue(Value& value, const char* message) {
-  makeValue(value, makeException(message));
-}
-
-JSObjectRef WebScriptSessionHandler::makeJavaWrapper(int objId) {
-  Debug::log(Debug::Spam) << "Creating wrapper for Java object " << objId << Debug::flush;
-
-  TrackingDataRef data = new TrackingData(this, objId);
-  return JSObjectMake(contextRef, javaObjectWrapperClass,
-                      const_cast<TrackingData*>(data));
-}
-
-JSValueRef WebScriptSessionHandler::makeValueRef(const Value& v) {
-  std::map<int, JSObjectRef>::iterator i;
-  switch (v.getType()) {
-    case Value::NULL_TYPE:
-      return JSValueMakeNull(contextRef);
-
-    case Value::BOOLEAN:
-      return JSValueMakeBoolean(contextRef, v.getBoolean());
-
-    case Value::BYTE:
-      return JSValueMakeNumber(contextRef, v.getByte());
-
-    case Value::CHAR:
-      return JSValueMakeNumber(contextRef, v.getChar());
-
-    case Value::SHORT:
-      return JSValueMakeNumber(contextRef, v.getShort());
-
-    case Value::INT:
-      return JSValueMakeNumber(contextRef, v.getInt());
-
-    case Value::LONG:
-      return JSValueMakeNumber(contextRef, v.getLong());
-
-    case Value::FLOAT:
-      return JSValueMakeNumber(contextRef, v.getFloat());
-
-    case Value::DOUBLE:
-      return JSValueMakeNumber(contextRef, v.getDouble());
-
-    case Value::STRING:
-    {
-      std::string stringValue = v.getString();
-
-      // We need to handle the conversion ourselves to be able to get both
-      // UTF8 encoding as well as explicit control over the length of the string
-      // due to the possibility of null characters being part of the data
-      CFStringRef cfString = CFStringCreateWithBytesNoCopy(NULL, (UInt8*)stringValue.data(),
-                                                           stringValue.length(), kCFStringEncodingUTF8,
-                                                           false, kCFAllocatorNull);
-      JSStringRef stringRef = JSStringCreateWithCFString(cfString);
-      JSValueRef toReturn = JSValueMakeString(contextRef, stringRef);
-      JSStringRelease(stringRef);
-      CFRelease(cfString);
-      return toReturn;
-    }
-
-    case Value::JAVA_OBJECT:
-    {
-      unsigned javaId = v.getJavaObjectId();
-      JSObjectRef ref;
-
-      pthread_mutex_lock(&javaObjectsLock);
-      i = javaObjectsById.find(javaId);
-
-      /*
-       * It's possible that we've already finalized the JsObjectRef that
-       * represented the object with the given id.  If so, we must remove it
-       * from the list of finalized object ids to avoid prematurely freeing
-       * the object on the server.
-       */
-      javaObjectsToFree.erase(javaId);
-
-      if (i == javaObjectsById.end()) {
-        /*
-         * We don't call JSValueProtect so that the JavaObject peer can be
-         * garbage-collected during the lifetime of the program.  Object
-         * identity is maintained as long as the object hasn't been finalized.
-         * If it had been finalized, then there wouldn't be an object to use
-         * as a basis for identity comparison.
-         *
-         * NB: The act of creating the wrapper may trigger a GC.
-         */
-        ref = makeJavaWrapper(javaId);
-
-        javaObjectsById[javaId] = ref;
-
-      } else {
-        ref = i->second;
-      }
-      pthread_mutex_unlock(&javaObjectsLock);
-
-
-      return ref;
-    }
-
-    case Value::JS_OBJECT:
-    {
-      int jsId = v.getJsObjectId();
-
-      i = jsObjectsById.find(jsId);
-      if (i == jsObjectsById.end()) {
-        char errMsg[50];
-        snprintf(errMsg, sizeof(errMsg), "Missing JsObject with id %i", jsId);
-        return makeException(errMsg);
-
-      } else {
-        return i->second;
-      }
-    }
-
-    case Value::UNDEFINED:
-      return JSValueMakeUndefined(contextRef);
-
-    default:
-    {
-      char message[50];
-      snprintf(message, sizeof(message), "Could not convert %s", v.toString().c_str());
-      initiateAutodestructSequence(__PRETTY_FUNCTION__, message);
-      return makeException(message);
-    }
-  }
-}
-
-bool WebScriptSessionHandler::makeValue(Value& ret, JSValueRef v) {
-  JSValueRef localException = NULL;
-
-  if (JSValueIsNull(contextRef, v)) {
-    ret.setNull();
-
-  } else if (JSValueIsUndefined(contextRef, v)) {
-    ret.setUndefined();
-
-  } else if (JSValueIsBoolean(contextRef, v)) {
-    ret.setBoolean(JSValueToBoolean(contextRef, v));
-
-  } else if (JSValueIsNumber(contextRef, v)) {
-    double d = JSValueToNumber(contextRef, v, &localException);
-    int i = round(d);
-    if (i == d) {
-      ret.setInt(i);
-    } else {
-      ret.setDouble(d);
-    }
-
-  } else if (JSValueIsString(contextRef, v) ||
-             JSValueIsInstanceOfConstructor(contextRef, v, stringConstructor, &localException)) {
-    return makeValueFromString(ret, v);
-
-  } else if (JSValueIsObjectOfClass(contextRef, v, javaObjectWrapperClass)) {
-    // It's one of our Java object proxies
-    JSObjectRef objectRef = JSValueToObject(contextRef, v, &localException);
-
-    if (!localException) {
-      TrackingDataRef tracker = (TrackingDataRef) JSObjectGetPrivate(objectRef);
-      int objId = tracker->getObjectId();
-      ret.setJavaObject(objId);
-      Debug::log(Debug::Spam) << "Made a Java object Value " << objId << Debug::flush;
-    }
-
-  } else if (JSValueIsObject(contextRef, v)) {
-    JSObjectRef objectRef = JSValueToObject(contextRef, v, &localException);
-    if (!localException) {
-      /*
-       * Then this is just a plain-old JavaScript Object.  Because JSCore
-       * doesn't retain private data for objects derived from the built-in
-       * Object type, we'll simply revert to using a pair of maps to provide
-       * a 1:1 mapping of JSObjectRefs and ints.
-       */
-      std::map<JSObjectRef, int>::iterator i = jsIdsByObject.find(objectRef);
-      if (i != jsIdsByObject.end()) {
-        // We've seen the object before
-        ret.setJsObjectId(i->second);
-      } else {
-        // Allocate a new id
-        int objId = ++jsObjectId;
-        JSValueProtect(contextRef, objectRef);
-
-        jsObjectsById[objId] = objectRef;
-        jsIdsByObject[objectRef] = objId;
-
-        ret.setJsObjectId(objId);
-        Debug::log(Debug::Spam) << "Made JS Value " << objId << Debug::flush;
-      }
-    }
-  } else {
-    Debug::log(Debug::Error) << "Unhandled JSValueRef -> Value conversion in plugin" << Debug::flush;
-    ret.setString("Unhandled JSValueRef -> Value conversion in plugin");
-  }
-
-  if (localException) {
-    makeValue(ret, localException);
-    return true;
-  } else {
-    return false;
-  }
-}
-
-bool WebScriptSessionHandler::makeValueFromString(Value& ret, JSValueRef value) {
-  JSValueRef localException = NULL;
-
-  JSStringRef jsString = JSValueToStringCopy(contextRef, value, &localException);
-  if (localException) {
-    makeValue(ret, localException);
-    return true;
-  }
-
-  CFStringRef cfString = JSStringCopyCFString(NULL, jsString);
-  JSStringRelease(jsString);
-
-  CFIndex cfLength = CFStringGetLength(cfString);
-  CFIndex maxLength = CFStringGetMaximumSizeForEncoding(cfLength, kCFStringEncodingUTF8);
-  scoped_array<char> utf8(new char[maxLength]);
-
-  CFIndex numBytes;
-  CFStringGetBytes(cfString, CFRangeMake(0, cfLength), kCFStringEncodingUTF8,
-                   0, false, (UInt8*) utf8.get(), maxLength, &numBytes);
-  CFRelease(cfString);
-
-  ret.setString(utf8.get(), numBytes);
-  Debug::log(Debug::Spam) << "Made a string Value " << ret.getString() << Debug::flush;
-  return false;
-}
diff --git a/plugins/webkit/Core/WebScriptSessionHandler.h b/plugins/webkit/Core/WebScriptSessionHandler.h
deleted file mode 100644
index 5e05385..0000000
--- a/plugins/webkit/Core/WebScriptSessionHandler.h
+++ /dev/null
@@ -1,157 +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.
- */
-
-#include <map>
-#include <set>
-#import "Debug.h"
-#import "HostChannel.h"
-#import "JavaScriptCore/JavaScriptCore.h"
-#import "pthread.h"
-#import "TrackingData.h"
-
-class CrashHandler {
-public:
-  virtual void crash(const char* functionName, const char* message) = 0;
-  virtual bool hasCrashed() = 0;
-};
-typedef CrashHandler* CrashHandlerRef;
-
-/*
- * This comprises the guts of the JavaScriptCore-specific code and is
- * responsible for message dispatch and value conversion.  This class should
- * be portable to any runtime that uses JavaScriptCore.
- */
-class WebScriptSessionHandler : public SessionHandler, public SessionData  {
-public:
-  WebScriptSessionHandler(HostChannel* channel, JSGlobalContextRef contextRef,
-                          CrashHandler* crashHandler);
-
-  /*
-   * Invoking the destructor will perform a clean shutdown of the OOPHM session.
-   */
-  ~WebScriptSessionHandler();
-
-  /*
-   * This is a panic method for shutting down the OOPHM debugging session due
-   * to unrecoverable errors.
-   */
-  void initiateAutodestructSequence(const char* functionName, const char* message);
-
-  /*
-   * Invoke a Java method.
-   */
-  JSValueRef javaFunctionCallbackImpl(int dispatchId,
-                                      JSObjectRef thisObject,
-                                      size_t argumentCount,
-                                      const JSValueRef arguments[],
-                                      JSValueRef* exception);
-
-  /*
-   * Finalize a Javo object proxy.
-   */
-  void javaObjectFinalizeImpl(int objId);
-
-  /*
-   * Determine if a Java class has a named property.
-   */
-  bool javaObjectHasPropertyImpl(TrackingDataRef tracker, JSObjectRef object,
-                                JSStringRef propertyName);
-
-  /*
-   * Obtain the value of named property of an object.
-   */
-  JSValueRef javaObjectGetPropertyImpl(TrackingDataRef tracker, JSObjectRef object,
-                                       JSStringRef propertyName, JSValueRef* exception);
-
-  /*
-   * Set the value of a named property on a Java object.
-   */
-  bool javaObjectSetPropertyImpl(TrackingDataRef tracker, JSObjectRef object,
-                                 JSStringRef propertyName, JSValueRef value,
-                                 JSValueRef* exception);
-
-  /*
-   * Create a JavaScript Error object with the given message.
-   */
-  JSValueRef makeException(const char* message);
-
-protected:
-  virtual void disconnectDetectedImpl();
-  virtual void fatalError(HostChannel& channel, const std::string& message);
-  virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
-  virtual void loadJsni(HostChannel& channel, const std::string& js);
-  virtual bool invoke(HostChannel& channel, const Value& thisObj, const std::string& methodName,
-                      int numArgs, const Value* const args, Value* returnValue);
-  virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
-                             const Value* const args, Value* returnValue);
-  virtual void sendFreeValues(HostChannel& channel);
-
-private:
-  CrashHandlerRef const crashHandler;
-  int jsObjectId;
-  std::map<int, JSObjectRef> javaObjectsById;
-  std::set<int> javaObjectsToFree;
-  pthread_mutex_t javaObjectsLock;
-  std::map<int, JSObjectRef> jsObjectsById;
-  std::map<JSObjectRef, int> jsIdsByObject;
-  JSClassRef javaObjectWrapperClass;
-
-  /* A reference to __gwt_makeResult, which we use constantly */
-  JSObjectRef makeResultFunction;
-
-  /* The String() function */
-  JSObjectRef stringConstructor;
-
-  /*
-   * Free server-side references.
-   */
-  void freeJavaObjects();
-
-  /*
-   * Create a exception Value that contains the given message.
-   */
-  void makeExceptionValue(Value& value, const char* message);
-
-  /*
-   * Create a Java object proxy to be passed into the JavaScript execution
-   * environment.
-   */
-  JSObjectRef makeJavaWrapper(int objId);
-
-  /*
-   * Convert a value from the JavaScript into something that can be sent back
-   * to the OOPHM host.
-   *
-   * Returns true if an exception was encountered.
-   */
-  bool makeValue(Value& ret, JSValueRef value);
-
-  /*
-   * Convert a string-like object to something that can be sent back to the OOPHM
-   * host.
-   *
-   * Returns true if an exception was encountered.
-   */
-  bool makeValueFromString(Value& ret, JSValueRef value);
-
-  /*
-   * Convert a value from the OOPHM host into something that can be passed into
-   * the JavaScript execution environment.
-   */
-  JSValueRef makeValueRef(const Value& value);
-};
-typedef WebScriptSessionHandler* WebScriptSessionHandlerRef;
-
diff --git a/plugins/webkit/English.lproj/InfoPlist.strings b/plugins/webkit/English.lproj/InfoPlist.strings
deleted file mode 100644
index 92beb1a..0000000
--- a/plugins/webkit/English.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Localized versions of Info.plist keys */
-
-NSHumanReadableCopyright = "© Google Inc, 2008";
diff --git a/plugins/webkit/Info.plist b/plugins/webkit/Info.plist
deleted file mode 100644
index 79fa629..0000000
--- a/plugins/webkit/Info.plist
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleExecutable</key>
-	<string>${EXECUTABLE_NAME}</string>
-	<key>CFBundleIconFile</key>
-	<string>gwtlogo</string>
-	<key>CFBundleIdentifier</key>
-	<string>com.google.gwt.plugin</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundlePackageType</key>
-	<string>WBPL</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>0.9</string>
-	<key>NSPrincipalClass</key>
-	<string>OophmPlugin</string>
-	<key>WebPluginDescription</key>
-	<string>Google Web Toolkit Developer Plugin</string>
-	<key>WebPluginMIMETypes</key>
-	<dict>
-		<key>application/x-gwt-dev-mode</key>
-		<dict>
-			<key>WebPluginTypeDescription</key>
-			<string>Google Web Toolkit Development Mode</string>
-		</dict>
-		<key>application/x-gwt-hosted-mode</key>
-		<dict>
-			<key>WebPluginTypeDescription</key>
-			<string>Google Web Toolkit Development Mode (Legacy)</string>
-		</dict>
-	</dict>
-	<key>WebPluginName</key>
-	<string>${PRODUCT_NAME}</string>
-</dict>
-</plist>
diff --git a/plugins/webkit/Plugin/Debug.mm b/plugins/webkit/Plugin/Debug.mm
deleted file mode 100644
index 6cc8edf..0000000
--- a/plugins/webkit/Plugin/Debug.mm
+++ /dev/null
@@ -1,36 +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.
- */
-
-#include <Debug.h>
-
-static NSMutableString* const buffer = [[NSMutableString alloc] initWithCapacity:1024];
-
-Debug::DebugStream& Debug::flush(Debug::DebugStream& dbg) {
-  Debug::logFinish();
-  return dbg;
-}
-
-void Debug::logStart(Debug::LogLevel level) {
-}
-
-void Debug::logFinish() {
-  NSLog(buffer);
-  [buffer setString:@""];
-}
-
-void Debug::logString(const char* str) {
-  [buffer appendString:[NSString stringWithUTF8String:str]];
-}
diff --git a/plugins/webkit/Plugin/English.lproj/crash.html b/plugins/webkit/Plugin/English.lproj/crash.html
deleted file mode 100644
index dbf47e0..0000000
--- a/plugins/webkit/Plugin/English.lproj/crash.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<html>
-<head>
-<title>GWT Development Mode Failure</title>
-<style>
-* { 
-  font-family: sans-serif;
-}
-
-h1 {
-  background: blue;
-  color: white; 
-  padding: 0.25em
-}
-
-#r {
-  width:100%; 
-  white-space: pre-wrap; 
-  font-family: monospace;
-}
-
-</style>
-</head>
-<body>
-
-<h1>GWT Development Mode Failure</h1>
-
-<p>The development mode plugin encountered a fatal error&mdash;did you stop your code server?</p>
-
-<p>You can try to restart your web application by <a href='javascript:window.location.reload()'>reloading this page</a>.</p>
-
-<hr/>
-
-<div id="r" wrap="off">
-__MESSAGE__
-
-System version: __SYSTEM_VERSION__
-
-__USER_AGENT__
-
-Compilation time: __DATE__ __TIME__
-</textarea>
-</body>
-</html>
diff --git a/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.h b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.h
deleted file mode 100644
index 57da6e3..0000000
--- a/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.h
+++ /dev/null
@@ -1,26 +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.
- */
-
-#import <Cocoa/Cocoa.h>
-#import "GTMNSString+HTML.h"
-
-/*
- * This adds a convenience method to add HTML-escaped text to an NSMutableString.
- */
-@interface NSMutableString (NSMutableStringWithHtmlReplacement)
-- (void)replacePattern:(NSString*)pattern
-     withStringLiteral:(NSString*)replacement;
-@end
diff --git a/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.m b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.m
deleted file mode 100644
index ed0f62b..0000000
--- a/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.m
+++ /dev/null
@@ -1,27 +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.
- */
-
-#import "NSMutableString+HtmlReplacement.h"
-
-@implementation NSMutableString (NSMutableStringWithHtmlReplacement)
-- (void)replacePattern:(NSString*)pattern
-     withStringLiteral:(NSString*)replacement {
-  [self replaceOccurrencesOfString:pattern
-                        withString:[replacement gtm_stringByEscapingForHTML]
-                           options:NSLiteralSearch
-                             range:NSMakeRange(0, [self length])];
-}
-@end
diff --git a/plugins/webkit/Plugin/OophmPlugin.h b/plugins/webkit/Plugin/OophmPlugin.h
deleted file mode 100644
index 96d0ed3..0000000
--- a/plugins/webkit/Plugin/OophmPlugin.h
+++ /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.
- */
-
-#import <Cocoa/Cocoa.h>
-#import <WebKit/WebKit.h>
-#import <WebKit/WebPlugin.h>
-#import "Debug.h"
-#import "OophmWebScriptObject.h"
-#import "SlowScriptProxy.h"
-#import "WebFrameNonTigerHeaders.h"
-
-/*
- * This provides the entrypoint for the WebKit plugin.  This class performs
- * any necessary environmental configuration and provides the scripting object
- * that represents the plugin in the JavaScript environment.
- */
-@interface OophmPlugin : NSView <WebPlugInViewFactory> {
-@private
-  OophmWebScriptObject* _scriptObject;
-  id _slowScriptProxy;
-}
-
-/*
- * Defined by the WebPlugInViewFactory protocol to construct an instance of
- * the plugin.
- */
-+ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments;
-- (void)dealloc;
-
-/*
- * Called by plugInViewWithArguments to initialize the instance of the plugin.
- */
-- (id)initWithArguments:(NSDictionary *)arguments;
-
-/*
- * Specified by the WebPlugIn informal protocol to obtain an object whose
- * methods will be exposed to the scripting environment.
- */
-- (id)objectForWebScript;
-
-/*
- * Defined by WebPlugIn and called when the plugin should shut down.
- */
-- (void)webPlugInDestroy;
-@end
diff --git a/plugins/webkit/Plugin/OophmPlugin.mm b/plugins/webkit/Plugin/OophmPlugin.mm
deleted file mode 100644
index b4c3338..0000000
--- a/plugins/webkit/Plugin/OophmPlugin.mm
+++ /dev/null
@@ -1,108 +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.
- */
-
-#import "OophmPlugin.h"
-#import "OophmWebScriptObject.h"
-#import "SlowScriptProxy.h"
-
-@interface OophmPlugin (Private)
-/* Tell GoogleSoftwareUpdate the plugin is being used */
-- (void)recordActive;
-@end
-
-@implementation OophmPlugin
-+ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments {
-  return [[[OophmPlugin alloc] initWithArguments: arguments] autorelease];
-}
-
-- (void)dealloc {
-  Debug::log(Debug::Info) << "Plugin deallocated" << Debug::flush;
-  [super dealloc];
-}
-
-- (id)initWithArguments:(NSDictionary *)arguments {
-  Debug::log(Debug::Info) << "Plugin starting" << Debug::flush;
-  self = [super initWithFrame: NSZeroRect];
-  if (!self) {
-    return nil;
-  }
-
-  id container = [[arguments objectForKey:WebPlugInContainerKey] retain];
-  WebFrame* frame = [container webFrame];
-  JSGlobalContextRef contextRef = [frame globalContext];
-  _scriptObject = [[OophmWebScriptObject scriptObjectWithContext:contextRef withWebView:[frame webView]] retain];
-
-  /*
-   * Install a proxy to prevent slow script warnings from being shown by hijacking
-   * the message sent to the original UIDelegate.  We could also use this to prevent
-   * window.alert and window.prompt from blocking test code.
-   */
-  WebView* view = [frame webView];
-  _slowScriptProxy = [[SlowScriptProxy alloc] initWithWebView: view];
-  if ([_slowScriptProxy respondsToSelector:@selector(webView:setStatusText:)]) {
-    [_slowScriptProxy webView:view setStatusText:@"GWT Developer Plugin Active"];
-  }
-
-  [self recordActive];
-
-  return self;
-}
-
-- (id)objectForWebScript {
-  return _scriptObject;
-}
-
-- (void)webPlugInDestroy {
-  Debug::log(Debug::Info) << "Destroying plugin" << Debug::flush;
-  [_scriptObject release];
-  _scriptObject = nil;
-  
-  if ([_slowScriptProxy respondsToSelector:@selector(webView:setStatusText:)]) {
-    [_slowScriptProxy webView:[_slowScriptProxy webView] 
-                      setStatusText:@"GWT OOPHM Session Ended"];
-  }
-  [_slowScriptProxy release];
-  _slowScriptProxy = nil;
-}
-@end
-
-@implementation OophmPlugin (Private)
-// Touch a file in ~/Library/Google/GoogleSoftwareUpdate/Actives
-- (void)recordActive {
-  NSFileManager* manager = [[NSFileManager alloc] init];
-  [manager autorelease];
-  NSError* error = NULL;
-
-  NSString* activesDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Google/GoogleSoftwareUpdate/Actives"];
-  Debug::log(Debug::Info) << "Ensuring directory " << [activesDirectory UTF8String] << Debug::flush;
-  if (![manager createDirectoryAtPath:activesDirectory withIntermediateDirectories:YES attributes:nil error:&error]) {
-    Debug::log(Debug::Error) << "Unable to create actives directory " << [activesDirectory UTF8String] <<
-        ": " << [[error localizedDescription] UTF8String] << Debug::flush;
-    return;
-  }
-
-  // Add the product id
-  NSString* file = [activesDirectory stringByAppendingPathComponent:@"com.google.gwt.dev.plugin.safari"];
-
-  // Create an empty file using an empty NSData object
-  if (![manager createFileAtPath:file contents:[NSData data] attributes:nil]) {
-    Debug::log(Debug::Error) << "Unable to create actives file" << Debug::flush;
-    return;
-  }
-
-  Debug::log(Debug::Info) << "Created actives file " << [file UTF8String] << Debug::flush;
-}
-@end
\ No newline at end of file
diff --git a/plugins/webkit/Plugin/OophmWebScriptObject.h b/plugins/webkit/Plugin/OophmWebScriptObject.h
deleted file mode 100644
index ee435d5..0000000
--- a/plugins/webkit/Plugin/OophmWebScriptObject.h
+++ /dev/null
@@ -1,45 +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.
- */
-
-#import <JavaScriptCore/JavaScriptCore.h>
-#import "HostChannel.h"
-#import "WebScriptSessionHandler.h"
-
-@interface OophmWebScriptObject : NSObject {
-@private
-  JSGlobalContextRef _contextRef;
-  CrashHandlerRef _crashHandler;
-  BOOL _hasCrashed;
-  HostChannel* _hostChannel;
-  WebScriptSessionHandlerRef _sessionHandler;
-  WebView* _webView;
-}
-+ (void)initialize;
-+ (BOOL)isSelectorExcludedFromWebScript: (SEL)selector;
-+ (OophmWebScriptObject*)scriptObjectWithContext: (JSGlobalContextRef)context
-                                     withWebView: (WebView*) webView;
-+ (NSString*)webScriptNameForSelector: (SEL)selector;
-- (BOOL)initForWebScriptWithJsniContext: (WebScriptObject*) jsniContext;
-- (BOOL)connectWithUrl: (NSString*) url
-        withSessionKey: (NSString*) sessionKey
-              withHost: (NSString*) host
-        withModuleName: (NSString*) moduleName
- withHostedHtmlVersion: (NSString*) hostedHtmlVersion;
-- (void)crashWithMessage: (NSString*)message;
-- (void)dealloc;
-- (void)finalizeForWebScript;
-@end
-
diff --git a/plugins/webkit/Plugin/OophmWebScriptObject.mm b/plugins/webkit/Plugin/OophmWebScriptObject.mm
deleted file mode 100644
index 040b766..0000000
--- a/plugins/webkit/Plugin/OophmWebScriptObject.mm
+++ /dev/null
@@ -1,420 +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.
- */
-
-#include <map>
-#import <JavaScriptCore/JavaScriptCore.h>
-#import <WebKit/WebKit.h>
-#import "BrowserChannel.h"
-#import "Debug.h"
-#import "GTMSystemVersion.h"
-#import "NSMutableString+HtmlReplacement.h"
-#import "LoadModuleMessage.h"
-#import "OophmWebScriptObject.h"
-#import "SessionHandler.h"
-#import "AllowedConnections.h"
-
-/*
- * This is a helper shim to bridge crash events from the core cpp code to the
- * objc plugin and UI layer.
- */
-class PluginCrashHandler : public CrashHandler {
-public:
-  PluginCrashHandler(OophmWebScriptObject* obj) : obj(obj) {
-  }
-  
-  virtual void crash(const char* functionName, const char* message) {
-    Debug::log(Debug::Error) << "Crashing with message: "<< message << Debug::flush;
-    NSString* str = [NSString stringWithFormat:@"%s\n\n%s", message, functionName];
-    [obj crashWithMessage:str];
-  }
-  virtual bool hasCrashed();
-private:
-  OophmWebScriptObject* const obj;
-};
-
-@interface OophmWebScriptObject (Private)
-+ (void)logAndThrowString: (NSString*)message;
-- (void)addAllowedHost: (NSString*)host;
-- (BOOL)hasCrashed;
-- (void)connectAlertDidEnd: (NSAlert*)alert
-                returnCode: (int)returnCode
-               contextInfo: (void*)contextInfo;
-- (BOOL)doConnectWithUrl: (NSString*) url
-          withSessionKey: (NSString*) sessionKey
-                withHost: (NSString*) host
-              withModule: (NSString*) moduleName
-   withHostedHtmlVersion: (NSString*) hostedHtmlVersion;
-	
-@end
-
-// This is declared here so that we can access the category method
-bool PluginCrashHandler::hasCrashed() {
-  return [obj hasCrashed] ? true : false;
-}
-
-@implementation OophmWebScriptObject
-+ (void)initialize {
-  // Add the plugin's bundle name to the user defaults search path
-  NSBundle* pluginBundle = [NSBundle bundleForClass:[OophmWebScriptObject class]];
-  NSString* bundleIdentifier = [pluginBundle bundleIdentifier];
-  NSUserDefaults* shared = [NSUserDefaults standardUserDefaults];
-  [shared addSuiteNamed:bundleIdentifier];
-}
-
-+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector {
-  if (selector == @selector(initForWebScriptWithJsniContext:)) {
-    return NO;
-  } else if (selector == @selector(connectWithUrl:withSessionKey:withHost:withModuleName:withHostedHtmlVersion:)) {
-    return NO;
-  } else if (selector == @selector(crashWithMessage:)) {
-    return NO;
-  }
-
-  return YES;
-}
-
-+ (OophmWebScriptObject*)scriptObjectWithContext: (JSGlobalContextRef) context
-                                     withWebView: (WebView*) webView {
-  JSGlobalContextRetain(context);
-  OophmWebScriptObject* obj = [[[OophmWebScriptObject alloc] init] autorelease];
-  obj->_contextRef = context;
-  obj->_webView = [webView retain];
-  return obj;
-}
-
-+ (NSString*)webScriptNameForSelector: (SEL)selector {
-  if (selector == @selector(initForWebScriptWithJsniContext:)) {
-    return @"init";
-  } else if (selector == @selector(connectWithUrl:withSessionKey:withHost:withModuleName:withHostedHtmlVersion:)) {
-    return @"connect";
-  } else if (selector == @selector(crashWithMessage:)) {
-    return @"crash";
-  }
-  return nil;
-}
-
-// Simply return true to indicate the plugin was successfully loaded and
-// reachable.
-- (BOOL)initForWebScriptWithJsniContext: (WebScriptObject*) jsniContext {
-  return YES;
-}
-
-- (BOOL)connectWithUrl: (NSString*) url
-        withSessionKey: (NSString*) sessionKey
-              withHost: (NSString*) host
-        withModuleName: (NSString*) moduleName
- withHostedHtmlVersion: (NSString*) hostedHtmlVersion {
-
-  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
-
-  // See if authentication has been bypassed
-  if ([defaults boolForKey:@"allowAll"]) {
-    return [self doConnectWithUrl:url withSessionKey:sessionKey withHost:host
-        withModule:moduleName withHostedHtmlVersion:hostedHtmlVersion];
-  }
-  
-  // TODO(jat): do this only once, refactor to a separate method
-  NSArray* allowedHosts = [defaults arrayForKey:@"allowedHosts"];
-  if (allowedHosts != nil) {
-    AllowedConnections::clearRules();
-    int n = [allowedHosts count];
-    for (int i = 0; i < n; ++i) {
-      NSString* entry = [allowedHosts objectAtIndex:i];
-      std::string hostName = [entry UTF8String];
-      std::string codeServer = "localhost";
-      int len = hostName.length();
-      bool exclude = false;
-      if (len > 0) {
-        if (len > 1 && hostName[0] == '!') {
-          exclude = true;
-          hostName = hostName.substr(1);
-        }
-        int slash = hostName.find("/");
-        if( slash > 0 && slash != std::string::npos ) {
-            codeServer = hostName.substr(slash+1);
-            hostName = hostName.substr(0,slash);
-        }
-        AllowedConnections::addRule(hostName, codeServer, exclude);
-      }
-    }
-  }
-
-  const std::string urlStr = [url UTF8String];
-  bool allowed = false;
-
-  if (AllowedConnections::matchesRule(AllowedConnections::getHostFromUrl(urlStr), 
-                                      AllowedConnections::getCodeServerFromUrl(urlStr),
-                                      &allowed) )
-  {
-    if (allowed) {
-      return [self doConnectWithUrl:url withSessionKey:sessionKey withHost:host
-          withModule:moduleName withHostedHtmlVersion:hostedHtmlVersion];
-    } else {
-      return YES;
-    }
-  }
-
-  // Otherwise, bring up an alert dialog
-  // TODO(jat): add an include/exclude option, currently treat as only include
-  NSAlert* alert = [NSAlert alertWithMessageText:@"Initiate development mode session"
-                                   defaultButton:@"Deny"
-                                 alternateButton:nil
-                                     otherButton:@"Allow"
-                       informativeTextWithFormat:@"The current web-page would like to initiate a development-mode connection to %@", host];
-  
-  if ([alert respondsToSelector:@selector(setShowsSuppressionButton:)]) {
-    [alert setShowsSuppressionButton:YES];
-    [[alert suppressionButton] setTitle:@"Remember this decision for this server"];
-  } else {
-    [[alert addButtonWithTitle:@"Always allow"] setTag:NSAlertAlternateReturn];
-  }
-  
-  NSBundle* bundle = [NSBundle bundleForClass:[OophmWebScriptObject class]];
-	NSArray* contextArray = [[NSArray arrayWithObjects:[url retain],
-      [sessionKey retain], [host retain], [moduleName retain],
-      [hostedHtmlVersion retain], nil] retain];
-  NSString* imagePath = [bundle pathForImageResource:@"gwtlogo"];
-  if (imagePath != nil) {
-    NSImage* img = [[[NSImage alloc] initByReferencingFile:imagePath] autorelease];
-    [alert setIcon:img];
-  }
-  
-  [alert beginSheetModalForWindow:[_webView hostWindow]
-                    modalDelegate:self
-                   didEndSelector:@selector(connectAlertDidEnd:returnCode:contextInfo:)
-                      contextInfo:contextArray];
-  return YES;
-}
-
-- (void)crashWithMessage: (NSString*)message {
-  if (self->_hasCrashed) {
-    return;
-  }
-  self->_hasCrashed = YES;
-  
-#ifdef GWT_DEBUGDISABLE
-  // We'll call out to the JS support function
-  JSGlobalContextRef contextRef = self->_contextRef;
-  JSStringRef disconnectedName = JSStringCreateWithUTF8CString("__gwt_disconnected");
-  JSValueRef disconnected = JSObjectGetProperty(contextRef, JSContextGetGlobalObject(contextRef), disconnectedName, NULL);
-  JSStringRelease(disconnectedName);
-  
-  if (JSValueIsObject(contextRef, disconnected)) {
-    // Found hosted.html's crash support
-    JSObjectRef disconnectedFunction = JSValueToObject(contextRef, disconnected, NULL);
-    JSValueRef exception = NULL;
-    JSObjectCallAsFunction(contextRef, disconnectedFunction, JSContextGetGlobalObject(contextRef), 0, NULL, &exception);
-    if (!exception) {
-      // Couldn't invoke the crash handler.
-      return;
-    }
-  }
-#endif //GWT_DEBUGDISABLE
-
-  // Use a simple crash page built into the bundle
-  NSBundle* oophmBundle = [NSBundle bundleForClass:[self class]];
-  NSString* path = [oophmBundle pathForResource:@"crash" ofType:@"html"];
-  NSMutableString* crashPage = [NSMutableString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
-  [crashPage replacePattern:@"__MESSAGE__" withStringLiteral:message];
-  
-  long major, minor, bugFix;
-  [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix];
-  NSString* systemVersion = [NSString stringWithFormat:@"%i.%i.%i", major, minor, bugFix];
-  [crashPage replacePattern:@"__SYSTEM_VERSION__" withStringLiteral:systemVersion];
-  
-  NSString* ua = [_webView userAgentForURL:[NSURL URLWithString:@"about:blank"]];
-  [crashPage replacePattern:@"__USER_AGENT__" withStringLiteral:ua];
-  
-  [crashPage replacePattern:@"__DATE__"
-          withStringLiteral:[NSString stringWithUTF8String:__DATE__]];
-  [crashPage replacePattern:@"__TIME__"
-          withStringLiteral:[NSString stringWithUTF8String:__TIME__]];  
-
-  NSURL* currentUrl = [[[[_webView mainFrame] dataSource] response] URL];
-
-  [[_webView mainFrame] loadAlternateHTMLString:crashPage
-                                        baseURL:[NSURL fileURLWithPath:path]
-                              forUnreachableURL:currentUrl];
-}
-
-- (void)dealloc {
-  [_webView release];  
-  delete _crashHandler;
-  [super dealloc];
-}
-
-- (void)finalizeForWebScript {
-  Debug::log(Debug::Info) << "Finalizing OophmWebScriptObject" << Debug::flush;
-
-  // Disable any lingering JS proxy objects
-  _hasCrashed = true;
-
-  // Free memory
-  delete _sessionHandler;
-  
-  if (_hostChannel) {
-    _hostChannel->disconnectFromHost();
-    delete _hostChannel;
-    _hostChannel = NULL;
-  }
-
-  if (_contextRef) {
-    JSGlobalContextRelease(_contextRef);
-    _contextRef = NULL;
-  }
-}
-@end
-
-@implementation OophmWebScriptObject (Private)
-+ (void)logAndThrowString:(NSString*)message {
-  Debug::log(Debug::Info) << "Throwing exception from WSO: " << message << Debug::flush;
-  [WebScriptObject throwException:message];
-}
-
-- (void)addAllowedHost:(NSString*)host {
-  /*
-   * This is more complicated than usual because we're not using the
-   * application's default persestent domain.  Instead, we use a plugin-specific
-   * domain.
-   */
-  NSBundle* pluginBundle = [NSBundle bundleForClass:[OophmWebScriptObject class]];
-  NSString* bundleIdentifier = [pluginBundle bundleIdentifier];
-  
-  NSUserDefaults* shared = [NSUserDefaults standardUserDefaults];
-  NSDictionary* pluginDict = [shared persistentDomainForName:bundleIdentifier];
-  NSArray* allowedHosts = [pluginDict objectForKey:@"allowedHosts"];
-  
-  //TODO(codefu): don't add duplicates
-
-  NSMutableArray* mutableHosts = [NSMutableArray arrayWithArray:allowedHosts];
-  NSMutableDictionary* mutableDict = [NSMutableDictionary dictionaryWithDictionary:pluginDict];
-  [mutableHosts addObject:host];
-  [mutableDict setObject:mutableHosts forKey:@"allowedHosts"];
-  [shared setPersistentDomain:mutableDict forName:bundleIdentifier];
-  [shared synchronize];
-}
-
-- (BOOL)hasCrashed{
-  return self->_hasCrashed;
-}
-
-- (void)connectAlertDidEnd:(NSAlert *)alert
-                returnCode:(int)returnCode
-               contextInfo:(void *)contextInfo {
-  NSArray* contextArray = (NSArray*) contextInfo;
-  NSString* url = [[contextArray objectAtIndex:0] autorelease];
-  NSString* sessionKey = [[contextArray objectAtIndex:1] autorelease];
-  NSString* host = [[contextArray objectAtIndex:2] autorelease];
-  NSString* moduleName = [[contextArray objectAtIndex:3] autorelease];
-  NSString* hostedHtmlVersion = [[contextArray objectAtIndex:4] autorelease];
-  [contextArray release];
-  
-  if (returnCode == NSAlertDefaultReturn) {
-    //TODO(codefu): save the host/codesvr as excluded ("!host")
-    //              should this require a check to verify that one is
-    //              not already whitelisted?
-    // currently: ignore exclude, re-show the modal popup on webpage reload
-    return;
-  } else if (returnCode == NSAlertAlternateReturn ||
-      [alert respondsToSelector:@selector(suppressionButton)] &&
-      [[alert suppressionButton] state] == NSOnState) {
-    // TODO(jat): simplify, handle errors
-    // Get the host part of the URL and store that
-    NSString* host = [NSString stringWithFormat: @"%@/%@",
-                      [[[[[[url componentsSeparatedByString:@"://"]
-                           objectAtIndex:1] componentsSeparatedByString:@"/"] objectAtIndex:0]
-                           componentsSeparatedByString:@":"] objectAtIndex:0],
-                      [[[[[[url componentsSeparatedByString:@"gwt.codesvr="]
-                           objectAtIndex:1] componentsSeparatedByString:@"&"] objectAtIndex:0]
-                        componentsSeparatedByString:@":"] objectAtIndex:0]];
-    [self addAllowedHost:host];
-  }
-
-  [self doConnectWithUrl:url withSessionKey:sessionKey withHost:host
-      withModule:moduleName withHostedHtmlVersion:hostedHtmlVersion];
-}
-
-- (BOOL)doConnectWithUrl: (NSString*) url
-          withSessionKey: (NSString*) sessionKey
-                withHost: (NSString*) host
-              withModule: (NSString*) moduleName
-   withHostedHtmlVersion: (NSString*) hostedHtmlVersion {
-  Debug::log(Debug::Debugging) << "connect : " << [host UTF8String] << " " <<
-      [moduleName UTF8String] << Debug::flush;
-  
-  if (_hostChannel != NULL) {
-    [OophmWebScriptObject logAndThrowString:@"Already connected"];
-    return NO;
-  }
-  
-  NSArray *parts = [host componentsSeparatedByString:@":"];
-  if ([parts count] != 2) {
-    [OophmWebScriptObject logAndThrowString:
-     [NSString stringWithFormat:@"Incorrect format for host string %i",
-      [parts count]]];
-    return NO;
-  }
-  
-  NSString *hostPart = [parts objectAtIndex:0];
-  NSString *portPart = [parts objectAtIndex:1];
-  
-  Debug::log(Debug::Debugging) << "Extracted host: " << [hostPart UTF8String] <<
-      " and port: " << [portPart UTF8String] << Debug::flush;
-  
-  char *hostAsChars = const_cast<char*>([hostPart UTF8String]);
-  unsigned portAsInt = [portPart intValue];
-  
-  _hostChannel = new HostChannel();
-  if (!_hostChannel->connectToHost(hostAsChars, portAsInt)) {
-    [OophmWebScriptObject logAndThrowString:@"HostChannel failed to connect"];
-    delete _hostChannel;
-    _hostChannel = NULL;
-    return NO;
-  }
-  
-  _crashHandler = new PluginCrashHandler(self);
-  _sessionHandler = new WebScriptSessionHandler(_hostChannel, _contextRef, _crashHandler);
-
-  std::string hostedHtmlVersionStr([hostedHtmlVersion UTF8String]);
-  // TODO: add support for a range of protocol versions when more are added.
-  if (!_hostChannel->init(_sessionHandler, BROWSERCHANNEL_PROTOCOL_VERSION,
-      BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersionStr)) {
-    [OophmWebScriptObject logAndThrowString:@"HostChannel failed to initialize"];
-    _hostChannel->disconnectFromHost();
-    delete _hostChannel;
-    _hostChannel = NULL;
-    return NO;
-  }
-
-  const std::string urlStr = [url UTF8String];
-  // TODO(jat): add support for tab identity
-  const std::string tabKeyStr = "";
-  const std::string sessionKeyStr = [sessionKey UTF8String];
-  const std::string moduleNameStr = [moduleName UTF8String];
-    
-  if (!LoadModuleMessage::send(*_hostChannel, urlStr, tabKeyStr, 
-                               sessionKeyStr, moduleNameStr,
-                               "Safari DMP", _sessionHandler)) {
-    _hostChannel->disconnectFromHost();
-    delete _hostChannel;
-    _hostChannel = NULL;
-    [OophmWebScriptObject logAndThrowString:@"Unable to load module"];
-    return NO;
-  }  
-  
-  return YES;
-}
-@end
diff --git a/plugins/webkit/Plugin/SlowScriptProxy.h b/plugins/webkit/Plugin/SlowScriptProxy.h
deleted file mode 100644
index f46ab94..0000000
--- a/plugins/webkit/Plugin/SlowScriptProxy.h
+++ /dev/null
@@ -1,61 +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.
- */
-
-#import <Cocoa/Cocoa.h>
-#import <WebKit/WebKit.h>
-
-/*
- * This NSProxy is used to prevent slow-script warnings from surfacing in the
- * web browser.  This is something of a hack since the message that we want
- * to override isn't public, but there's no way to directly reset the slow-scipt
- * timer either.
- */
-@interface SlowScriptProxy : NSProxy {
-@private
-  id _target;
-  WebView* _webView;
-}
-
-/*
- * This will restore the original UIDelegate.
- */
-- (void)dealloc;
-
-/*
- * The proxy object will install itself as the UIDelegate on the given webView.
- */
-- (id)initWithWebView: (WebView*)webView;
-
-/*
- * Just delegates the invocation to the original UIDelegate.
- */
-- (void)forwardInvocation:(NSInvocation *)anInvocation;
-
-/*
- * Just delegates the invocation to the original UIDelegate.
- */
-- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
-
-/*
- * The WebView to which the proxy object has attached itself.
- */
-- (WebView*)webView;
-
-/*
- * This is the message that we want to intercept.
- */
-- (BOOL)webViewShouldInterruptJavaScript:(WebView *)sender;
-@end
diff --git a/plugins/webkit/Plugin/SlowScriptProxy.m b/plugins/webkit/Plugin/SlowScriptProxy.m
deleted file mode 100644
index 8798ada..0000000
--- a/plugins/webkit/Plugin/SlowScriptProxy.m
+++ /dev/null
@@ -1,53 +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.
- */
-
-#import "SlowScriptProxy.h"
-
-@implementation SlowScriptProxy
-- (id)initWithWebView:(WebView*)webView {
-  _target = [[webView UIDelegate] retain];
-  _webView = [webView retain];
-  [_webView setUIDelegate:self];
-  return self;
-}
-
-- (void)dealloc {
-  // Restore the original delegate
-  [_webView setUIDelegate:_target];
-  [_webView release];
-  [_target release];
-  [super dealloc];
-}
-
-- (void)forwardInvocation:(NSInvocation *)anInvocation {
-  [anInvocation setTarget:_target];
-  [anInvocation invoke];
-}
-
-- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
-  return [_target methodSignatureForSelector:aSelector];
-}
-
-- (WebView*)webView {
-  return _webView;
-}
-
-- (BOOL)webViewShouldInterruptJavaScript:(WebView *)sender {
-  // TODO: (robertvawter) What do we want to do with repeated invocations?
-  return NO;
-}
-
-@end
diff --git a/plugins/webkit/Plugin/WebFrameNonTigerHeaders.h b/plugins/webkit/Plugin/WebFrameNonTigerHeaders.h
deleted file mode 100644
index 975ea6d..0000000
--- a/plugins/webkit/Plugin/WebFrameNonTigerHeaders.h
+++ /dev/null
@@ -1,24 +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.
- */
-
-#import <JavaScriptCore/JavaScriptCore.h>
-
-/*!
- * The headers in Tiger don't include the globalContext method.
- */
-@interface WebFrame (NonTigerHeaders)
-- (JSGlobalContextRef) globalContext;
-@end
\ No newline at end of file
diff --git a/plugins/webkit/build.xml b/plugins/webkit/build.xml
deleted file mode 100755
index 34fee9e..0000000
--- a/plugins/webkit/build.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<project name="webkit" default="build" basedir=".">
-	<property name="plugin.root" value="webkit" />
-	<import file="../common.ant.xml" />
-
-	<target name="build" description="Copy compiled plugin to the output folder">
-		<mkdir dir="${gwt.build.out}/plugins" />
-		<mkdir dir="${gwt.build.out}/plugins/webkit" />
-		<copy todir="${gwt.build.out}/plugins/webkit">
-			<fileset file="prebuilt/oophm.dmg" />
-		</copy>
-	</target>
-
-	<target name="test" description="Run any tests">
-	</target>
-
-	<target name="checkstyle" description="Static style analysis">
-	</target>
-</project>
diff --git a/plugins/webkit/gwtlogo.icns b/plugins/webkit/gwtlogo.icns
deleted file mode 100644
index 6a593df..0000000
--- a/plugins/webkit/gwtlogo.icns
+++ /dev/null
Binary files differ
diff --git a/plugins/webkit/oophm.xcodeproj/project.pbxproj b/plugins/webkit/oophm.xcodeproj/project.pbxproj
deleted file mode 100644
index 7cc225d..0000000
--- a/plugins/webkit/oophm.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,786 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 45;
-	objects = {
-
-/* Begin PBXAggregateTarget section */
-		48547E030DD882170047AC8A /* symlinks */ = {
-			isa = PBXAggregateTarget;
-			buildConfigurationList = 48547E080DD8823B0047AC8A /* Build configuration list for PBXAggregateTarget "symlinks" */;
-			buildPhases = (
-				48547E020DD882170047AC8A /* Make symlink */,
-			);
-			comments = "This will create a symlink in ~/Library/Internet Plug-Ins to the plugin";
-			dependencies = (
-				48547E070DD8821D0047AC8A /* PBXTargetDependency */,
-			);
-			name = symlinks;
-			productName = oophm.symlink;
-		};
-/* End PBXAggregateTarget section */
-
-/* Begin PBXBuildFile section */
-		45283765103BCCB100153ABF /* CheckVersionsMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45283764103BCCB100153ABF /* CheckVersionsMessage.cpp */; };
-		4528376F103BCCDF00153ABF /* ChooseTransportMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45283767103BCCDF00153ABF /* ChooseTransportMessage.cpp */; };
-		45283770103BCCDF00153ABF /* FatalErrorMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45283769103BCCDF00153ABF /* FatalErrorMessage.cpp */; };
-		45283771103BCCDF00153ABF /* ProtocolVersionMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4528376B103BCCDF00153ABF /* ProtocolVersionMessage.cpp */; };
-		45283772103BCCDF00153ABF /* SwitchTransportMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4528376D103BCCDF00153ABF /* SwitchTransportMessage.cpp */; };
-		480DDCAA0E381E22000711F4 /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 48A23BB50DD0E688004EF5CA /* AppController.m */; };
-		480DDCAB0E381E23000711F4 /* BrowserWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 48A23C770DD0F545004EF5CA /* BrowserWindow.m */; };
-		480DDCAC0E381E28000711F4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 48A23BB60DD0E688004EF5CA /* main.m */; };
-		48108DDF0E2C15BD007FA76C /* AllowedConnections.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48108DDB0E2C15BD007FA76C /* AllowedConnections.cpp */; };
-		48108DE00E2C15BD007FA76C /* Socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48108DDD0E2C15BD007FA76C /* Socket.cpp */; };
-		48338DDF0E4A2CA7008ACF0F /* oophm_bypass.plist in Resources */ = {isa = PBXBuildFile; fileRef = 48338DDB0E4A2C49008ACF0F /* oophm_bypass.plist */; };
-		48420D410DD51A3D001F3839 /* GTMNSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 48420D3E0DD51A3D001F3839 /* GTMNSString+HTML.m */; };
-		4851A9D50DD1198300C577B2 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */; };
-		48547F000DD889DA0047AC8A /* GTMSystemVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 48547EFF0DD889DA0047AC8A /* GTMSystemVersion.m */; };
-		48547F4B0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m in Sources */ = {isa = PBXBuildFile; fileRef = 48547F4A0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m */; };
-		485505ED0DCD475C0009536F /* SlowScriptProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 485505EC0DCD475C0009536F /* SlowScriptProxy.m */; };
-		4856DF890DCF95B8000BF47C /* HostChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF750DCF95B8000BF47C /* HostChannel.cpp */; };
-		4856DF8A0DCF95B8000BF47C /* InvokeMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF770DCF95B8000BF47C /* InvokeMessage.cpp */; };
-		4856DF8B0DCF95B8000BF47C /* LoadModuleMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF790DCF95B8000BF47C /* LoadModuleMessage.cpp */; };
-		4856DF8E0DCF95B8000BF47C /* ReturnMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF7F0DCF95B8000BF47C /* ReturnMessage.cpp */; };
-		4856DF8F0DCF95B8000BF47C /* README.google in Resources */ = {isa = PBXBuildFile; fileRef = 4856DF820DCF95B8000BF47C /* README.google */; };
-		4856DF900DCF95B8000BF47C /* ServerMethods.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4856DF840DCF95B8000BF47C /* ServerMethods.cpp */; };
-		485CCFF00DDDDEA400AEE666 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 485CCFEF0DDDDEA400AEE666 /* CoreFoundation.framework */; };
-		485CD0AA0DDDEAF300AEE666 /* Debug.mm in Sources */ = {isa = PBXBuildFile; fileRef = 485CD0A90DDDEAF300AEE666 /* Debug.mm */; };
-		486DA8F50DD22BD50065980B /* crash.html in Resources */ = {isa = PBXBuildFile; fileRef = 486DA8F40DD22BD50065980B /* crash.html */; };
-		48A237D10DCFB46D004EF5CA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
-		48A23BC60DD0E6EE004EF5CA /* browser.nib in Resources */ = {isa = PBXBuildFile; fileRef = 48A23BC50DD0E6EE004EF5CA /* browser.nib */; };
-		48A23BE00DD0E8B1004EF5CA /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A10DC62FD800E011A2 /* WebKit.framework */; };
-		48A23BE10DD0E8B6004EF5CA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
-		48A23C510DD0F2D6004EF5CA /* Browser-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 48A23C500DD0F2D6004EF5CA /* Browser-Info.plist */; };
-		48A23C530DD0F302004EF5CA /* gwtlogo.icns in Resources */ = {isa = PBXBuildFile; fileRef = 48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */; };
-		48ABDDC50DCBA04800B0159A /* WebScriptSessionHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48ABDDC40DCBA04800B0159A /* WebScriptSessionHandler.cpp */; };
-		48C4D72E0DCA2B6900C34919 /* gwtlogo.icns in Resources */ = {isa = PBXBuildFile; fileRef = 48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */; };
-		48C9EA4A0E37863700E691C6 /* FreeValueMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48C9EA440E37863700E691C6 /* FreeValueMessage.cpp */; };
-		48C9EA4B0E37863700E691C6 /* InvokeSpecialMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48C9EA460E37863700E691C6 /* InvokeSpecialMessage.cpp */; };
-		48C9EA4C0E37863700E691C6 /* LoadJsniMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48C9EA480E37863700E691C6 /* LoadJsniMessage.cpp */; };
-		48EF692D0E318E200050F5D6 /* ObjectFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48EF692C0E318E200050F5D6 /* ObjectFunctions.cpp */; };
-		48FD98900DC62E7400E011A2 /* OophmPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 48FD988F0DC62E7400E011A2 /* OophmPlugin.mm */; };
-		48FD98A20DC62FD800E011A2 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */; };
-		48FD98A30DC62FD800E011A2 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48FD98A10DC62FD800E011A2 /* WebKit.framework */; };
-		48FD99540DC6349F00E011A2 /* OophmWebScriptObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = 48FD99530DC6349F00E011A2 /* OophmWebScriptObject.mm */; };
-		8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
-		48547E060DD8821D0047AC8A /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 089C1669FE841209C02AAC07 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 8D5B49AC048680CD000E48DA;
-			remoteInfo = oophm;
-		};
-		485CD0C40DDDED1700AEE666 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = 089C1669FE841209C02AAC07 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 48547E030DD882170047AC8A;
-			remoteInfo = symlinks;
-		};
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
-		089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
-		089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
-		1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
-		32DBCF630370AF2F00C91783 /* oophm_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = oophm_Prefix.pch; sourceTree = "<group>"; };
-		45283764103BCCB100153ABF /* CheckVersionsMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CheckVersionsMessage.cpp; sourceTree = "<group>"; };
-		45283766103BCCDF00153ABF /* CheckVersionsMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CheckVersionsMessage.h; sourceTree = "<group>"; };
-		45283767103BCCDF00153ABF /* ChooseTransportMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ChooseTransportMessage.cpp; sourceTree = "<group>"; };
-		45283768103BCCDF00153ABF /* ChooseTransportMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ChooseTransportMessage.h; sourceTree = "<group>"; };
-		45283769103BCCDF00153ABF /* FatalErrorMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FatalErrorMessage.cpp; sourceTree = "<group>"; };
-		4528376A103BCCDF00153ABF /* FatalErrorMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FatalErrorMessage.h; sourceTree = "<group>"; };
-		4528376B103BCCDF00153ABF /* ProtocolVersionMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ProtocolVersionMessage.cpp; sourceTree = "<group>"; };
-		4528376C103BCCDF00153ABF /* ProtocolVersionMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ProtocolVersionMessage.h; sourceTree = "<group>"; };
-		4528376D103BCCDF00153ABF /* SwitchTransportMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SwitchTransportMessage.cpp; sourceTree = "<group>"; };
-		4528376E103BCCDF00153ABF /* SwitchTransportMessage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SwitchTransportMessage.h; sourceTree = "<group>"; };
-		48108DDB0E2C15BD007FA76C /* AllowedConnections.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AllowedConnections.cpp; sourceTree = "<group>"; };
-		48108DDC0E2C15BD007FA76C /* AllowedConnections.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AllowedConnections.h; sourceTree = "<group>"; };
-		48108DDD0E2C15BD007FA76C /* Socket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Socket.cpp; sourceTree = "<group>"; };
-		48108DDE0E2C15BD007FA76C /* Socket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Socket.h; sourceTree = "<group>"; };
-		48338DDB0E4A2C49008ACF0F /* oophm_bypass.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = oophm_bypass.plist; sourceTree = "<group>"; };
-		48420D3C0DD51A23001F3839 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMDefines.h; path = GTM/GTMDefines.h; sourceTree = "<group>"; };
-		48420D3D0DD51A3D001F3839 /* GTMNSString+HTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "GTMNSString+HTML.h"; path = "GTM/Foundation/GTMNSString+HTML.h"; sourceTree = "<group>"; };
-		48420D3E0DD51A3D001F3839 /* GTMNSString+HTML.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "GTMNSString+HTML.m"; path = "GTM/Foundation/GTMNSString+HTML.m"; sourceTree = "<group>"; };
-		48547EFE0DD889DA0047AC8A /* GTMSystemVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMSystemVersion.h; path = GTM/Foundation/GTMSystemVersion.h; sourceTree = "<group>"; };
-		48547EFF0DD889DA0047AC8A /* GTMSystemVersion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMSystemVersion.m; path = GTM/Foundation/GTMSystemVersion.m; sourceTree = "<group>"; };
-		48547F490DD88D110047AC8A /* NSMutableString+HtmlReplacement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableString+HtmlReplacement.h"; sourceTree = "<group>"; };
-		48547F4A0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableString+HtmlReplacement.m"; sourceTree = "<group>"; };
-		485505EB0DCD475C0009536F /* SlowScriptProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlowScriptProxy.h; sourceTree = "<group>"; };
-		485505EC0DCD475C0009536F /* SlowScriptProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlowScriptProxy.m; sourceTree = "<group>"; };
-		4856DF740DCF95B8000BF47C /* BrowserChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BrowserChannel.h; path = ../common/BrowserChannel.h; sourceTree = SOURCE_ROOT; };
-		4856DF750DCF95B8000BF47C /* HostChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HostChannel.cpp; path = ../common/HostChannel.cpp; sourceTree = SOURCE_ROOT; };
-		4856DF760DCF95B8000BF47C /* HostChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HostChannel.h; path = ../common/HostChannel.h; sourceTree = SOURCE_ROOT; };
-		4856DF770DCF95B8000BF47C /* InvokeMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InvokeMessage.cpp; path = ../common/InvokeMessage.cpp; sourceTree = SOURCE_ROOT; };
-		4856DF780DCF95B8000BF47C /* InvokeMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InvokeMessage.h; path = ../common/InvokeMessage.h; sourceTree = SOURCE_ROOT; };
-		4856DF790DCF95B8000BF47C /* LoadModuleMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LoadModuleMessage.cpp; path = ../common/LoadModuleMessage.cpp; sourceTree = SOURCE_ROOT; };
-		4856DF7A0DCF95B8000BF47C /* LoadModuleMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LoadModuleMessage.h; path = ../common/LoadModuleMessage.h; sourceTree = SOURCE_ROOT; };
-		4856DF7D0DCF95B8000BF47C /* Message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Message.h; path = ../common/Message.h; sourceTree = SOURCE_ROOT; };
-		4856DF7E0DCF95B8000BF47C /* QuitMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = QuitMessage.h; path = ../common/QuitMessage.h; sourceTree = SOURCE_ROOT; };
-		4856DF7F0DCF95B8000BF47C /* ReturnMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ReturnMessage.cpp; path = ../common/ReturnMessage.cpp; sourceTree = SOURCE_ROOT; };
-		4856DF800DCF95B8000BF47C /* ReturnMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ReturnMessage.h; path = ../common/ReturnMessage.h; sourceTree = SOURCE_ROOT; };
-		4856DF820DCF95B8000BF47C /* README.google */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.google; path = ../common/scoped_ptr/README.google; sourceTree = SOURCE_ROOT; };
-		4856DF830DCF95B8000BF47C /* scoped_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = scoped_ptr.h; path = ../common/scoped_ptr/scoped_ptr.h; sourceTree = SOURCE_ROOT; };
-		4856DF840DCF95B8000BF47C /* ServerMethods.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ServerMethods.cpp; path = ../common/ServerMethods.cpp; sourceTree = SOURCE_ROOT; };
-		4856DF850DCF95B8000BF47C /* ServerMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ServerMethods.h; path = ../common/ServerMethods.h; sourceTree = SOURCE_ROOT; };
-		4856DF860DCF95B8000BF47C /* SessionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SessionHandler.h; path = ../common/SessionHandler.h; sourceTree = SOURCE_ROOT; };
-		4856DF880DCF95B8000BF47C /* Value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Value.h; path = ../common/Value.h; sourceTree = SOURCE_ROOT; };
-		485CCE650DDDC5E900AEE666 /* HashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashMap.h; sourceTree = "<group>"; };
-		485CCFEF0DDDDEA400AEE666 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
-		485CD0A90DDDEAF300AEE666 /* Debug.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Debug.mm; sourceTree = "<group>"; };
-		486DA8ED0DD22B850065980B /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = English; path = English.lproj/crash.html; sourceTree = "<group>"; wrapsLines = 0; };
-		48A23BA20DD0E5B4004EF5CA /* Browser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Browser.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		48A23BB40DD0E688004EF5CA /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppController.h; sourceTree = "<group>"; };
-		48A23BB50DD0E688004EF5CA /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppController.m; sourceTree = "<group>"; };
-		48A23BB60DD0E688004EF5CA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		48A23BC50DD0E6EE004EF5CA /* browser.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = browser.nib; sourceTree = "<group>"; };
-		48A23C500DD0F2D6004EF5CA /* Browser-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Browser-Info.plist"; sourceTree = "<group>"; };
-		48A23C760DD0F545004EF5CA /* BrowserWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowserWindow.h; sourceTree = "<group>"; };
-		48A23C770DD0F545004EF5CA /* BrowserWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BrowserWindow.m; sourceTree = "<group>"; };
-		48ABDDC30DCBA04800B0159A /* WebScriptSessionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebScriptSessionHandler.h; sourceTree = "<group>"; };
-		48ABDDC40DCBA04800B0159A /* WebScriptSessionHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebScriptSessionHandler.cpp; sourceTree = "<group>"; };
-		48ABDDC80DCBA09D00B0159A /* TrackingData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackingData.h; sourceTree = "<group>"; };
-		48ABE1050DCBB67600B0159A /* SessionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionData.h; sourceTree = "<group>"; };
-		48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = gwtlogo.icns; sourceTree = "<group>"; };
-		48C9EA440E37863700E691C6 /* FreeValueMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FreeValueMessage.cpp; sourceTree = "<group>"; };
-		48C9EA450E37863700E691C6 /* FreeValueMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FreeValueMessage.h; sourceTree = "<group>"; };
-		48C9EA460E37863700E691C6 /* InvokeSpecialMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InvokeSpecialMessage.cpp; sourceTree = "<group>"; };
-		48C9EA470E37863700E691C6 /* InvokeSpecialMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InvokeSpecialMessage.h; sourceTree = "<group>"; };
-		48C9EA480E37863700E691C6 /* LoadJsniMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoadJsniMessage.cpp; sourceTree = "<group>"; };
-		48C9EA490E37863700E691C6 /* LoadJsniMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoadJsniMessage.h; sourceTree = "<group>"; };
-		48D5795D0DDB8C03005A3498 /* Debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Debug.h; sourceTree = "<group>"; };
-		48D5795E0DDB8C03005A3498 /* DebugLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugLevel.h; sourceTree = "<group>"; };
-		48EF692B0E318E200050F5D6 /* ObjectFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectFunctions.h; sourceTree = "<group>"; };
-		48EF692C0E318E200050F5D6 /* ObjectFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ObjectFunctions.cpp; sourceTree = "<group>"; };
-		48FD988E0DC62E7400E011A2 /* OophmPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OophmPlugin.h; sourceTree = "<group>"; };
-		48FD988F0DC62E7400E011A2 /* OophmPlugin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OophmPlugin.mm; sourceTree = "<group>"; };
-		48FD989B0DC62F8800E011A2 /* WebFrameNonTigerHeaders.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebFrameNonTigerHeaders.h; sourceTree = "<group>"; };
-		48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = /System/Library/Frameworks/JavaScriptCore.framework; sourceTree = "<absolute>"; };
-		48FD98A10DC62FD800E011A2 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = "<absolute>"; };
-		48FD99520DC6349F00E011A2 /* OophmWebScriptObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OophmWebScriptObject.h; sourceTree = "<group>"; };
-		48FD99530DC6349F00E011A2 /* OophmWebScriptObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OophmWebScriptObject.mm; sourceTree = "<group>"; };
-		48FFCFC80DD35DA900805659 /* Platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Platform.h; sourceTree = "<group>"; };
-		8D5B49B6048680CD000E48DA /* gwt-dev.webplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "gwt-dev.webplugin"; sourceTree = BUILT_PRODUCTS_DIR; };
-		8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
-		48A23BA00DD0E5B4004EF5CA /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				48A23BE00DD0E8B1004EF5CA /* WebKit.framework in Frameworks */,
-				48A23BE10DD0E8B6004EF5CA /* Cocoa.framework in Frameworks */,
-				4851A9D50DD1198300C577B2 /* JavaScriptCore.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		8D5B49B3048680CD000E48DA /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				48FD98A20DC62FD800E011A2 /* JavaScriptCore.framework in Frameworks */,
-				48FD98A30DC62FD800E011A2 /* WebKit.framework in Frameworks */,
-				48A237D10DCFB46D004EF5CA /* Cocoa.framework in Frameworks */,
-				485CCFF00DDDDEA400AEE666 /* CoreFoundation.framework in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
-		089C166AFE841209C02AAC07 /* oophm */ = {
-			isa = PBXGroup;
-			children = (
-				485506C90DCD54180009536F /* Classes */,
-				48420D3B0DD51A0F001F3839 /* GTM */,
-				32C88E010371C26100C91783 /* Other Sources */,
-				089C167CFE841241C02AAC07 /* Resources */,
-				089C1671FE841209C02AAC07 /* Frameworks and Libraries */,
-				19C28FB8FE9D52D311CA2CBB /* Products */,
-			);
-			comments = "/*\n * Copyright 2008 Google Inc.\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n";
-			name = oophm;
-			sourceTree = "<group>";
-		};
-		089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = {
-			isa = PBXGroup;
-			children = (
-				1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */,
-				1058C7AEFEA557BF11CA2CBB /* Other Frameworks */,
-			);
-			name = "Frameworks and Libraries";
-			sourceTree = "<group>";
-		};
-		089C167CFE841241C02AAC07 /* Resources */ = {
-			isa = PBXGroup;
-			children = (
-				48338DDB0E4A2C49008ACF0F /* oophm_bypass.plist */,
-				486DA8F40DD22BD50065980B /* crash.html */,
-				48C4D72D0DCA2B6900C34919 /* gwtlogo.icns */,
-				8D5B49B7048680CD000E48DA /* Info.plist */,
-				089C167DFE841241C02AAC07 /* InfoPlist.strings */,
-			);
-			name = Resources;
-			sourceTree = "<group>";
-		};
-		1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				485CCFEF0DDDDEA400AEE666 /* CoreFoundation.framework */,
-				48FD98A00DC62FD800E011A2 /* JavaScriptCore.framework */,
-				48FD98A10DC62FD800E011A2 /* WebKit.framework */,
-				1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */,
-			);
-			name = "Linked Frameworks";
-			sourceTree = "<group>";
-		};
-		1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				089C167FFE841241C02AAC07 /* AppKit.framework */,
-				D2F7E65807B2D6F200F64583 /* CoreData.framework */,
-				089C1672FE841209C02AAC07 /* Foundation.framework */,
-			);
-			name = "Other Frameworks";
-			sourceTree = "<group>";
-		};
-		19C28FB8FE9D52D311CA2CBB /* Products */ = {
-			isa = PBXGroup;
-			children = (
-				8D5B49B6048680CD000E48DA /* gwt-dev.webplugin */,
-				48A23BA20DD0E5B4004EF5CA /* Browser.app */,
-			);
-			name = Products;
-			sourceTree = "<group>";
-		};
-		32C88E010371C26100C91783 /* Other Sources */ = {
-			isa = PBXGroup;
-			children = (
-				4856DF730DCF95B8000BF47C /* common */,
-				32DBCF630370AF2F00C91783 /* oophm_Prefix.pch */,
-			);
-			name = "Other Sources";
-			sourceTree = "<group>";
-		};
-		48420D3B0DD51A0F001F3839 /* GTM */ = {
-			isa = PBXGroup;
-			children = (
-				48547EFE0DD889DA0047AC8A /* GTMSystemVersion.h */,
-				48547EFF0DD889DA0047AC8A /* GTMSystemVersion.m */,
-				48420D3D0DD51A3D001F3839 /* GTMNSString+HTML.h */,
-				48420D3E0DD51A3D001F3839 /* GTMNSString+HTML.m */,
-				48420D3C0DD51A23001F3839 /* GTMDefines.h */,
-			);
-			comments = "We just need a subset of the functionality available in GTM, so we'll pull in only the files we need as opposed to creating a cross-project dependency and having to package the framework in the plugin.";
-			name = GTM;
-			sourceTree = "<group>";
-		};
-		485506C90DCD54180009536F /* Classes */ = {
-			isa = PBXGroup;
-			children = (
-				48A23B9D0DD0E57E004EF5CA /* Browser */,
-				4856DFFB0DCFAEFD000BF47C /* Plugin */,
-				4856DFFA0DCFAEBC000BF47C /* Core */,
-			);
-			name = Classes;
-			sourceTree = "<group>";
-		};
-		4856DF730DCF95B8000BF47C /* common */ = {
-			isa = PBXGroup;
-			children = (
-				45283766103BCCDF00153ABF /* CheckVersionsMessage.h */,
-				45283767103BCCDF00153ABF /* ChooseTransportMessage.cpp */,
-				45283768103BCCDF00153ABF /* ChooseTransportMessage.h */,
-				45283769103BCCDF00153ABF /* FatalErrorMessage.cpp */,
-				4528376A103BCCDF00153ABF /* FatalErrorMessage.h */,
-				4528376B103BCCDF00153ABF /* ProtocolVersionMessage.cpp */,
-				4528376C103BCCDF00153ABF /* ProtocolVersionMessage.h */,
-				4528376D103BCCDF00153ABF /* SwitchTransportMessage.cpp */,
-				4528376E103BCCDF00153ABF /* SwitchTransportMessage.h */,
-				48C9EA440E37863700E691C6 /* FreeValueMessage.cpp */,
-				48C9EA450E37863700E691C6 /* FreeValueMessage.h */,
-				48C9EA460E37863700E691C6 /* InvokeSpecialMessage.cpp */,
-				48C9EA470E37863700E691C6 /* InvokeSpecialMessage.h */,
-				48C9EA480E37863700E691C6 /* LoadJsniMessage.cpp */,
-				48C9EA490E37863700E691C6 /* LoadJsniMessage.h */,
-				48108DDB0E2C15BD007FA76C /* AllowedConnections.cpp */,
-				48108DDC0E2C15BD007FA76C /* AllowedConnections.h */,
-				48108DDD0E2C15BD007FA76C /* Socket.cpp */,
-				48108DDE0E2C15BD007FA76C /* Socket.h */,
-				485CCE650DDDC5E900AEE666 /* HashMap.h */,
-				48D5795D0DDB8C03005A3498 /* Debug.h */,
-				48D5795E0DDB8C03005A3498 /* DebugLevel.h */,
-				48FFCFC80DD35DA900805659 /* Platform.h */,
-				4856DF740DCF95B8000BF47C /* BrowserChannel.h */,
-				4856DF750DCF95B8000BF47C /* HostChannel.cpp */,
-				4856DF760DCF95B8000BF47C /* HostChannel.h */,
-				4856DF770DCF95B8000BF47C /* InvokeMessage.cpp */,
-				4856DF780DCF95B8000BF47C /* InvokeMessage.h */,
-				4856DF790DCF95B8000BF47C /* LoadModuleMessage.cpp */,
-				4856DF7A0DCF95B8000BF47C /* LoadModuleMessage.h */,
-				4856DF7D0DCF95B8000BF47C /* Message.h */,
-				4856DF7E0DCF95B8000BF47C /* QuitMessage.h */,
-				4856DF7F0DCF95B8000BF47C /* ReturnMessage.cpp */,
-				4856DF800DCF95B8000BF47C /* ReturnMessage.h */,
-				4856DF810DCF95B8000BF47C /* scoped_ptr */,
-				4856DF840DCF95B8000BF47C /* ServerMethods.cpp */,
-				4856DF850DCF95B8000BF47C /* ServerMethods.h */,
-				4856DF860DCF95B8000BF47C /* SessionHandler.h */,
-				4856DF880DCF95B8000BF47C /* Value.h */,
-				45283764103BCCB100153ABF /* CheckVersionsMessage.cpp */,
-			);
-			name = common;
-			path = ../common;
-			sourceTree = SOURCE_ROOT;
-		};
-		4856DF810DCF95B8000BF47C /* scoped_ptr */ = {
-			isa = PBXGroup;
-			children = (
-				4856DF820DCF95B8000BF47C /* README.google */,
-				4856DF830DCF95B8000BF47C /* scoped_ptr.h */,
-			);
-			name = scoped_ptr;
-			path = ../common/scoped_ptr;
-			sourceTree = SOURCE_ROOT;
-		};
-		4856DFFA0DCFAEBC000BF47C /* Core */ = {
-			isa = PBXGroup;
-			children = (
-				48ABDDC30DCBA04800B0159A /* WebScriptSessionHandler.h */,
-				48ABDDC40DCBA04800B0159A /* WebScriptSessionHandler.cpp */,
-				48ABDDC80DCBA09D00B0159A /* TrackingData.h */,
-				48ABE1050DCBB67600B0159A /* SessionData.h */,
-				48EF692B0E318E200050F5D6 /* ObjectFunctions.h */,
-				48EF692C0E318E200050F5D6 /* ObjectFunctions.cpp */,
-			);
-			path = Core;
-			sourceTree = "<group>";
-		};
-		4856DFFB0DCFAEFD000BF47C /* Plugin */ = {
-			isa = PBXGroup;
-			children = (
-				485CD0A90DDDEAF300AEE666 /* Debug.mm */,
-				48FD988E0DC62E7400E011A2 /* OophmPlugin.h */,
-				48FD988F0DC62E7400E011A2 /* OophmPlugin.mm */,
-				48FD99520DC6349F00E011A2 /* OophmWebScriptObject.h */,
-				485505EB0DCD475C0009536F /* SlowScriptProxy.h */,
-				48FD99530DC6349F00E011A2 /* OophmWebScriptObject.mm */,
-				485505EC0DCD475C0009536F /* SlowScriptProxy.m */,
-				48FD989B0DC62F8800E011A2 /* WebFrameNonTigerHeaders.h */,
-				48547F490DD88D110047AC8A /* NSMutableString+HtmlReplacement.h */,
-				48547F4A0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m */,
-			);
-			path = Plugin;
-			sourceTree = "<group>";
-		};
-		48A23B9D0DD0E57E004EF5CA /* Browser */ = {
-			isa = PBXGroup;
-			children = (
-				48A23C760DD0F545004EF5CA /* BrowserWindow.h */,
-				48A23C770DD0F545004EF5CA /* BrowserWindow.m */,
-				48A23C500DD0F2D6004EF5CA /* Browser-Info.plist */,
-				48A23BB40DD0E688004EF5CA /* AppController.h */,
-				48A23BB50DD0E688004EF5CA /* AppController.m */,
-				48A23BB60DD0E688004EF5CA /* main.m */,
-				48A23BC50DD0E6EE004EF5CA /* browser.nib */,
-			);
-			path = Browser;
-			sourceTree = "<group>";
-		};
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
-		48A23BA10DD0E5B4004EF5CA /* Browser */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 48A23BA70DD0E5B5004EF5CA /* Build configuration list for PBXNativeTarget "Browser" */;
-			buildPhases = (
-				48A23B9E0DD0E5B4004EF5CA /* Resources */,
-				48A23B9F0DD0E5B4004EF5CA /* Sources */,
-				48A23BA00DD0E5B4004EF5CA /* Frameworks */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-				485CD0C50DDDED1700AEE666 /* PBXTargetDependency */,
-			);
-			name = Browser;
-			productName = Browser;
-			productReference = 48A23BA20DD0E5B4004EF5CA /* Browser.app */;
-			productType = "com.apple.product-type.application";
-		};
-		8D5B49AC048680CD000E48DA /* gwt-dev */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "gwt-dev" */;
-			buildPhases = (
-				8D5B49AF048680CD000E48DA /* Resources */,
-				8D5B49B1048680CD000E48DA /* Sources */,
-				8D5B49B3048680CD000E48DA /* Frameworks */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = "gwt-dev";
-			productInstallPath = "$(HOME)/Library/Bundles";
-			productName = oophm;
-			productReference = 8D5B49B6048680CD000E48DA /* gwt-dev.webplugin */;
-			productType = "com.apple.product-type.bundle";
-		};
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
-		089C1669FE841209C02AAC07 /* Project object */ = {
-			isa = PBXProject;
-			buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "oophm" */;
-			compatibilityVersion = "Xcode 3.1";
-			developmentRegion = English;
-			hasScannedForEncodings = 1;
-			knownRegions = (
-				en,
-			);
-			mainGroup = 089C166AFE841209C02AAC07 /* oophm */;
-			projectDirPath = "";
-			projectRoot = "";
-			targets = (
-				48A23BA10DD0E5B4004EF5CA /* Browser */,
-				8D5B49AC048680CD000E48DA /* gwt-dev */,
-				48547E030DD882170047AC8A /* symlinks */,
-			);
-		};
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
-		48A23B9E0DD0E5B4004EF5CA /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				48A23BC60DD0E6EE004EF5CA /* browser.nib in Resources */,
-				48A23C510DD0F2D6004EF5CA /* Browser-Info.plist in Resources */,
-				48A23C530DD0F302004EF5CA /* gwtlogo.icns in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		8D5B49AF048680CD000E48DA /* Resources */ = {
-			isa = PBXResourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */,
-				48C4D72E0DCA2B6900C34919 /* gwtlogo.icns in Resources */,
-				4856DF8F0DCF95B8000BF47C /* README.google in Resources */,
-				486DA8F50DD22BD50065980B /* crash.html in Resources */,
-				48338DDF0E4A2CA7008ACF0F /* oophm_bypass.plist in Resources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
-		48547E020DD882170047AC8A /* Make symlink */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-				"$(BUILT_PRODUCTS_DIR)/{$PluginShortName}.webplugin",
-			);
-			name = "Make symlink";
-			outputPaths = (
-				"$(USER_LIBRARY_DIR)/Internet Plug-Ins/${PluginShortName}.webplugin/Contents",
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "set -x\nrm -r \"${USER_LIBRARY_DIR}/Internet Plug-Ins/${PluginShortName}.webplugin\"\nln -sf \"${BUILT_PRODUCTS_DIR}/${PluginShortName}.webplugin\" \"${USER_LIBRARY_DIR}/Internet Plug-Ins/.\"";
-		};
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
-		48A23B9F0DD0E5B4004EF5CA /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				480DDCAA0E381E22000711F4 /* AppController.m in Sources */,
-				480DDCAB0E381E23000711F4 /* BrowserWindow.m in Sources */,
-				480DDCAC0E381E28000711F4 /* main.m in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		8D5B49B1048680CD000E48DA /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				48FD98900DC62E7400E011A2 /* OophmPlugin.mm in Sources */,
-				48FD99540DC6349F00E011A2 /* OophmWebScriptObject.mm in Sources */,
-				48ABDDC50DCBA04800B0159A /* WebScriptSessionHandler.cpp in Sources */,
-				485505ED0DCD475C0009536F /* SlowScriptProxy.m in Sources */,
-				4856DF890DCF95B8000BF47C /* HostChannel.cpp in Sources */,
-				4856DF8A0DCF95B8000BF47C /* InvokeMessage.cpp in Sources */,
-				4856DF8B0DCF95B8000BF47C /* LoadModuleMessage.cpp in Sources */,
-				4856DF8E0DCF95B8000BF47C /* ReturnMessage.cpp in Sources */,
-				4856DF900DCF95B8000BF47C /* ServerMethods.cpp in Sources */,
-				48420D410DD51A3D001F3839 /* GTMNSString+HTML.m in Sources */,
-				48547F000DD889DA0047AC8A /* GTMSystemVersion.m in Sources */,
-				48547F4B0DD88D110047AC8A /* NSMutableString+HtmlReplacement.m in Sources */,
-				485CD0AA0DDDEAF300AEE666 /* Debug.mm in Sources */,
-				48108DDF0E2C15BD007FA76C /* AllowedConnections.cpp in Sources */,
-				48108DE00E2C15BD007FA76C /* Socket.cpp in Sources */,
-				48EF692D0E318E200050F5D6 /* ObjectFunctions.cpp in Sources */,
-				48C9EA4A0E37863700E691C6 /* FreeValueMessage.cpp in Sources */,
-				48C9EA4B0E37863700E691C6 /* InvokeSpecialMessage.cpp in Sources */,
-				48C9EA4C0E37863700E691C6 /* LoadJsniMessage.cpp in Sources */,
-				45283765103BCCB100153ABF /* CheckVersionsMessage.cpp in Sources */,
-				4528376F103BCCDF00153ABF /* ChooseTransportMessage.cpp in Sources */,
-				45283770103BCCDF00153ABF /* FatalErrorMessage.cpp in Sources */,
-				45283771103BCCDF00153ABF /* ProtocolVersionMessage.cpp in Sources */,
-				45283772103BCCDF00153ABF /* SwitchTransportMessage.cpp in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
-		48547E070DD8821D0047AC8A /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 8D5B49AC048680CD000E48DA /* gwt-dev */;
-			targetProxy = 48547E060DD8821D0047AC8A /* PBXContainerItemProxy */;
-		};
-		485CD0C50DDDED1700AEE666 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = 48547E030DD882170047AC8A /* symlinks */;
-			targetProxy = 485CD0C40DDDED1700AEE666 /* PBXContainerItemProxy */;
-		};
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
-		089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {
-			isa = PBXVariantGroup;
-			children = (
-				089C167EFE841241C02AAC07 /* English */,
-			);
-			name = InfoPlist.strings;
-			sourceTree = "<group>";
-		};
-		486DA8F40DD22BD50065980B /* crash.html */ = {
-			isa = PBXVariantGroup;
-			children = (
-				486DA8ED0DD22B850065980B /* English */,
-			);
-			name = crash.html;
-			path = Plugin;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
-		1DEB913B08733D840010E9CD /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/GTM/build/TigerOrLater-Release\"";
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = oophm_Prefix.pch;
-				GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO;
-				GCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO;
-				GCC_WARN_PEDANTIC = NO;
-				INFOPLIST_FILE = Info.plist;
-				INSTALL_PATH = "$(HOME)/Library/Bundles";
-				PRODUCT_NAME = "${PluginShortName}";
-				SDKROOT = macosx10.6;
-				WRAPPER_EXTENSION = webplugin;
-				ZERO_LINK = YES;
-			};
-			name = Debug;
-		};
-		1DEB913C08733D840010E9CD /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/GTM/build/TigerOrLater-Release\"";
-				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = oophm_Prefix.pch;
-				GCC_WARN_EFFECTIVE_CPLUSPLUS_VIOLATIONS = NO;
-				GCC_WARN_NON_VIRTUAL_DESTRUCTOR = NO;
-				GCC_WARN_PEDANTIC = NO;
-				INFOPLIST_FILE = Info.plist;
-				INSTALL_PATH = "$(HOME)/Library/Bundles";
-				PRODUCT_NAME = "${PluginShortName}";
-				SDKROOT = macosx10.6;
-				STRIP_INSTALLED_PRODUCT = YES;
-				STRIP_STYLE = "non-global";
-				WRAPPER_EXTENSION = webplugin;
-			};
-			name = Release;
-		};
-		1DEB913F08733D840010E9CD /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = "GWT_DEBUGLEVEL=Debugging";
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				OTHER_CFLAGS = "-mmacosx-version-min=10.5";
-				PREBINDING = NO;
-				PluginShortName = "gwt-dev";
-				SDKROOT = macosx10.5;
-				STRIP_INSTALLED_PRODUCT = NO;
-				STRIP_STYLE = "non-global";
-				SYMROOT = build;
-			};
-			name = Debug;
-		};
-		1DEB914008733D840010E9CD /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
-				GCC_C_LANGUAGE_STANDARD = gnu99;
-				GCC_OPTIMIZATION_LEVEL = 3;
-				GCC_PREPROCESSOR_DEFINITIONS = GWT_DEBUGDISABLE;
-				GCC_WARN_ABOUT_RETURN_TYPE = YES;
-				GCC_WARN_UNUSED_VARIABLE = YES;
-				OTHER_CFLAGS = "-mmacosx-version-min=10.5";
-				PREBINDING = NO;
-				PluginShortName = "gwt-dev";
-				SDKROOT = macosx10.5;
-				STRIP_STYLE = "non-global";
-				SYMROOT = build;
-			};
-			name = Release;
-		};
-		48547E040DD882170047AC8A /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				PRODUCT_NAME = "${PluginShortName}.symlinks";
-				SDKROOT = macosx10.6;
-			};
-			name = Debug;
-		};
-		48547E050DD882170047AC8A /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				PRODUCT_NAME = "${PluginShortName}.symlinks";
-				SDKROOT = macosx10.6;
-				ZERO_LINK = NO;
-			};
-			name = Release;
-		};
-		48A23BA50DD0E5B5004EF5CA /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_MODEL_TUNING = G5;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = oophm_Prefix.pch;
-				INFOPLIST_FILE = "Browser/Browser-Info.plist";
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
-				PRODUCT_NAME = Browser;
-				SDKROOT = macosx10.6;
-				WRAPPER_EXTENSION = app;
-				ZERO_LINK = YES;
-			};
-			name = Debug;
-		};
-		48A23BA60DD0E5B5004EF5CA /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				ARCHS = (
-					i386,
-					ppc,
-				);
-				COPY_PHASE_STRIP = YES;
-				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				GCC_MODEL_TUNING = G5;
-				GCC_PRECOMPILE_PREFIX_HEADER = YES;
-				GCC_PREFIX_HEADER = oophm_Prefix.pch;
-				INFOPLIST_FILE = "Browser/Browser-Info.plist";
-				INSTALL_PATH = "$(HOME)/Applications";
-				OTHER_LDFLAGS = (
-					"-framework",
-					Foundation,
-					"-framework",
-					AppKit,
-				);
-				PREBINDING = NO;
-				PRODUCT_NAME = Browser;
-				SDKROOT = macosx10.6;
-				STRIP_INSTALLED_PRODUCT = YES;
-				STRIP_STYLE = "non-global";
-				VALID_ARCHS = "ppc64 ppc7400 ppc970 i386 x86_64 ppc";
-				WRAPPER_EXTENSION = app;
-				ZERO_LINK = NO;
-			};
-			name = Release;
-		};
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
-		1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "gwt-dev" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1DEB913B08733D840010E9CD /* Debug */,
-				1DEB913C08733D840010E9CD /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "oophm" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				1DEB913F08733D840010E9CD /* Debug */,
-				1DEB914008733D840010E9CD /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		48547E080DD8823B0047AC8A /* Build configuration list for PBXAggregateTarget "symlinks" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				48547E040DD882170047AC8A /* Debug */,
-				48547E050DD882170047AC8A /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		48A23BA70DD0E5B5004EF5CA /* Build configuration list for PBXNativeTarget "Browser" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				48A23BA50DD0E5B5004EF5CA /* Debug */,
-				48A23BA60DD0E5B5004EF5CA /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-/* End XCConfigurationList section */
-	};
-	rootObject = 089C1669FE841209C02AAC07 /* Project object */;
-}
diff --git a/plugins/webkit/oophm_Prefix.pch b/plugins/webkit/oophm_Prefix.pch
deleted file mode 100644
index e7b7f01..0000000
--- a/plugins/webkit/oophm_Prefix.pch
+++ /dev/null
@@ -1,7 +0,0 @@
-//
-// Prefix header for all source files of the 'oophm' target in the 'oophm' project.
-//
-
-#ifdef __OBJC__
-    #import <Cocoa/Cocoa.h>
-#endif
diff --git a/plugins/webkit/oophm_bypass.plist b/plugins/webkit/oophm_bypass.plist
deleted file mode 100644
index b7af14f..0000000
--- a/plugins/webkit/oophm_bypass.plist
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<!-- Copy this to Library/Preferences/com.google.gwt.oophm.plist -->
-<plist version="1.0">
-<dict>
-	<key>allowAll</key>
-	<true/>
-</dict>
-</plist>
diff --git a/plugins/webkit/prebuilt/gwt-dev-plugin.dmg b/plugins/webkit/prebuilt/gwt-dev-plugin.dmg
deleted file mode 100644
index b96c731..0000000
--- a/plugins/webkit/prebuilt/gwt-dev-plugin.dmg
+++ /dev/null
Binary files differ
diff --git a/plugins/wireshark/Makefile b/plugins/wireshark/Makefile
deleted file mode 100644
index a1be1f9..0000000
--- a/plugins/wireshark/Makefile
+++ /dev/null
@@ -1,51 +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.
-
-# Modify to point to your Wireshark and glib include directories
-INCS = -I/usr/include/wireshark -I/usr/include/glib-2.0 \
-       -I/usr/lib/glib-2.0/include -I../common
-
-CC   = gcc
-
-SRCS = packet-gwtcs.c
-OBJS = obj/packet-gwtcs.o
-
-PLUGIN_NAME = packet-gwtcs
-PLUGIN_DIR  = $(HOME)/.wireshark/plugins
-PLUGIN      = $(PLUGIN_NAME).so
-
-CFLAGS = -DHAVE_CONFIG_H $(INCS) -DINET6 -D_U_=__attribute__\(\(unused\)\) \
-	-Wall -Wpointer-arith -g -DXTHREADS -D_REENTRANT -DXUSE_MTSAFE_API \
-	-fPIC -DPIC -O2
-
-all::		obj/$(PLUGIN)
-
-install::	obj/$(PLUGIN)
-	cp obj/$(PLUGIN) $(PLUGIN_DIR)/$(PLUGIN)
-
-obj/$(PLUGIN) : $(OBJS)
-	mkdir -p $(PLUGIN_DIR)
-	$(CC) -shared $(OBJS) -o $@
-
-$(OBJS): obj
-
-obj:
-	mkdir obj
-
-obj/packet-gwtcs.o : packet-gwtcs.c ../common/BrowserChannel.h
-	$(CC) -c $(CFLAGS) $< -o $@
-
-clean:
-	rm -rf obj
diff --git a/plugins/wireshark/README.txt b/plugins/wireshark/README.txt
deleted file mode 100644
index 1ed9817..0000000
--- a/plugins/wireshark/README.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-This is a quick and dirty Wireshark packet dissector for the GWT Code Server
-protocol.
-
-I have only tested this on Ubuntu Hardy with wireshark 1.0.0 on an x86_64
-machine.  It may require other changes for other platforms, and has only
-light testing.  It is also incomplete but provided enough decoding to be
-useful to me -- YMMV.
-
-The Makefile is very Unix-centric as it installs the library under your home
-directory.
-
-On Linux, you need the wireshark-dev package installed.
diff --git a/plugins/wireshark/packet-gwtcs.c b/plugins/wireshark/packet-gwtcs.c
deleted file mode 100644
index fc12f8c..0000000
--- a/plugins/wireshark/packet-gwtcs.c
+++ /dev/null
@@ -1,975 +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.
- */
-
-/*
- * Note that Wireshark dissectors are pure C, not C++ -- there are also
- * restrictions on various C extensions, including things like all variables
- * must be declared at the beginning of a block, and only initialized to
- * scalar constants.
- */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "BrowserChannel.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <gmodule.h>
-#include <epan/conversation.h>
-#include <epan/prefs.h>
-#include <epan/packet.h>
-
-/*
- * Default port to follow.
- */
-#define DEFAULT_GWTCS_PORT 9997
-
-/*
- * Trim strngs at this length.
- */
-#define MAX_STRING_LENGTH 100
-
-/* forward reference */
-void proto_register_gwtcs();
-void proto_reg_handoff_gwtcs();
-
-/* Define version if we are not building Wireshark statically */
-#ifndef ENABLE_STATIC
-G_MODULE_EXPORT const gchar version[] = "0.1";
-#endif
-
-/*
- * Data stored for a GWT-CS conversation.
- */
-typedef struct _gwtcs_data {
-  address       clientAddress;
-  guint32       clientPort;
-  int           level;
-} gwtcs_data;
-
-/*
- * Names of packet types -- must be in order.
- */
-static const value_string packetTypes[] = {
-  { MESSAGE_TYPE_INVOKE,                  "Invoke" },
-  { MESSAGE_TYPE_RETURN,                  "Return" },
-  { MESSAGE_TYPE_OLD_LOAD_MODULE,         "Old Load Module" },
-  { MESSAGE_TYPE_QUIT,                    "Quit" },
-  { MESSAGE_TYPE_LOADJSNI,                "Load JSNI" },
-  { MESSAGE_TYPE_INVOKESPECIAL,           "Invoke Special" },
-  { MESSAGE_TYPE_FREEVALUE,               "Free Value" },
-  { MESSAGE_TYPE_FATAL_ERROR,             "Fatal Error" },
-  { MESSAGE_TYPE_CHECK_VERSIONS,          "Check Versions" },
-  { MESSAGE_TYPE_PROTOCOL_VERSION,        "Protocol Version" },
-  { MESSAGE_TYPE_CHOOSE_TRANSPORT,        "Choose Transport" },
-  { MESSAGE_TYPE_SWITCH_TRANSPORT,        "Switch Transport" },
-  { MESSAGE_TYPE_LOAD_MODULE,             "Load Module" },
-  { 0,  NULL }
-};
-#define MAX_PACKET_TYPE MESSAGE_TYPE_LOAD_MODULE
-
-
-static const value_string valueTypes[] = {
-  {VALUE_TYPE_NULL,        "null" },
-  {VALUE_TYPE_BOOLEAN,     "boolean" },
-  {VALUE_TYPE_BYTE,        "byte" },
-  {VALUE_TYPE_CHAR,        "char" },
-  {VALUE_TYPE_SHORT,       "short" },
-  {VALUE_TYPE_INT,         "int" },
-  {VALUE_TYPE_LONG,        "long" },
-  {VALUE_TYPE_FLOAT,       "float" },
-  {VALUE_TYPE_DOUBLE,      "double" },
-  {VALUE_TYPE_STRING,      "string" },
-  {VALUE_TYPE_JAVA_OBJECT, "Java object" },
-  {VALUE_TYPE_JS_OBJECT,   "JS object" },
-  {VALUE_TYPE_UNDEFINED,   "undefined" },
-  { 0,  NULL }
-};
-
-/*
- * InvokeSpecial types -- must be in order.
- */
-static const value_string specialTypes[] = {
-  { SPECIAL_HAS_METHOD,   "hasMethod" },
-  { SPECIAL_HAS_PROPERTY, "hasProperty" },
-  { SPECIAL_GET_PROPERTY, "getProperty" },
-  { SPECIAL_SET_PROPERTY, "setProperty" },
-  { 0, NULL }
-};
-
-/*
- * Dynamically assigned protocol ID.
- */
-static int proto_gwtcs = -1;
-
-/*
- * Dynamically assigned subtree IDs.
- */
-static gint ett_gwtcs = -1;
-static gint ett_value = -1;
-static gint ett_args = -1;
-
-/*
- * IDs for displayed values.
- */
-static int hf_gwtcs_pdu_type = -1;
-static int hf_gwtcs_value_tag = -1;
-static int hf_gwtcs_min_vers = -1;
-static int hf_gwtcs_max_vers = -1;
-static int hf_gwtcs_hosted_vers = -1;
-static int hf_gwtcs_sel_vers = -1;
-static int hf_gwtcs_lm_ua = -1;
-static int hf_gwtcs_lm_tabkey = -1;
-static int hf_gwtcs_lm_seskey = -1;
-static int hf_gwtcs_lm_modname = -1;
-static int hf_gwtcs_lm_url = -1;
-static int hf_gwtcs_methname = -1;
-static int hf_gwtcs_isexc = -1;
-static int hf_gwtcs_dispid = -1;
-static int hf_gwtcs_jsni = -1;
-static int hf_gwtcs_val_hdr = -1;
-static int hf_gwtcs_val_bool = -1;
-static int hf_gwtcs_val_byte = -1;
-static int hf_gwtcs_val_char = -1;
-static int hf_gwtcs_val_short = -1;
-static int hf_gwtcs_val_int = -1;
-static int hf_gwtcs_val_long = -1;
-static int hf_gwtcs_val_float = -1;
-static int hf_gwtcs_val_double = -1;
-static int hf_gwtcs_val_string = -1;
-static int hf_gwtcs_val_javaobj = -1;
-static int hf_gwtcs_val_jsobj = -1;
-static int hf_gwtcs_val_null = -1;
-static int hf_gwtcs_val_undef = -1;
-static int hf_gwtcs_numargs = -1;
-static int hf_gwtcs_spectype = -1;
-static int hf_gwtcs_transport = -1;
-static int hf_gwtcs_transargs = -1;
-
-static dissector_handle_t gwtcs_handle;
-
-static GMemChunk* memChunk = 0;
-
-#ifndef ENABLE_STATIC
-G_MODULE_EXPORT void plugin_register(void)
-{
-   /* register the new protocol, protocol fields, and subtrees */
-   if (proto_gwtcs == -1) { /* execute protocol initialization only once */
-      proto_register_gwtcs();
-   }
-}
-
-G_MODULE_EXPORT void plugin_reg_handoff(void){
-   proto_reg_handoff_gwtcs();
-}
-#endif
-
-/*
- * Get a string describing a Value from the packet, and return the total length
- * (including the tag byte).
- *
- * ofs - offset into the buffer of the Value's tag byte
- * buf - buffer to write string into; on return is guaranteed to be null
- *     terminated
- * buflen - length of buf
- *
- * returns the offset after the last byte of this Value
- */
-static int getValue(tvbuff_t* tvb, int ofs, char* buf, int buflen) {
-  guint8 tag;
-  tag = tvb_get_guint8(tvb, ofs++);
-  int len = 0;
-  switch (tag) {
-    case VALUE_TYPE_NULL:
-      strncpy(buf, "null", buflen);
-      break;
-    case VALUE_TYPE_UNDEFINED:
-      strncpy(buf, "undef", buflen);
-      break;
-    case VALUE_TYPE_BOOLEAN:
-      {
-        guint8 val;
-        val = tvb_get_guint8(tvb, ofs);
-        len = 1;
-        strncpy(buf, val ? "true" : "false", buflen);
-      }
-      break;
-    case VALUE_TYPE_BYTE:
-      {
-        int val;
-        val = tvb_get_guint8(tvb, ofs);
-        if (val & 128) {
-          val -= 256;
-        }
-        len = 1;
-        snprintf(buf, buflen, "%d", val);
-      }
-      break;
-    case VALUE_TYPE_SHORT:
-      {
-        int val;
-        val = tvb_get_ntohs(tvb, ofs);
-        if (val & 0x8000) {
-          val -= 0x10000;
-        }
-        len = 2;
-        snprintf(buf, buflen, "%d", val);
-      }
-      break;
-    case VALUE_TYPE_CHAR:
-      {
-        int val;
-        val = tvb_get_ntohs(tvb, ofs);
-        len = 2;
-        /* show printable ASCII */
-        if (val >= 0x20 && val < 0x7f) {
-          snprintf(buf, buflen, "%d - %c", val, val);
-        } else {
-          snprintf(buf, buflen, "%d (U+%04x)", val, val);
-        }
-      }
-      break;
-    case VALUE_TYPE_INT:
-      {
-        int val;
-        val = tvb_get_ntohl(tvb, ofs);
-        len = 4;
-        snprintf(buf, buflen, "%d", val);
-      }
-      break;
-    case VALUE_TYPE_FLOAT:
-      {
-        float val;
-        val = tvb_get_ntohieee_float(tvb, ofs);
-        len = 4;
-        snprintf(buf, buflen, "%g", val);
-      }
-      break;
-    case VALUE_TYPE_JAVA_OBJECT:
-      {
-        int val;
-        val = tvb_get_ntohl(tvb, ofs);
-        len = 4;
-        snprintf(buf, buflen, "Java Object %d", val);
-      }
-      break;
-    case VALUE_TYPE_JS_OBJECT:
-      {
-        int val;
-        val = tvb_get_ntohl(tvb, ofs);
-        len = 4;
-        snprintf(buf, buflen, "JS Object %d", val);
-      }
-      break;
-    case VALUE_TYPE_LONG:
-      {
-        guint64 val;
-        val = tvb_get_ntoh64(tvb, ofs);
-        len = 8;
-        /* no portable way to print guint64, so do it in two pieces */
-        snprintf(buf, buflen, "0x%08x%08x", (int) ((val >> 32) & 0xFFFFFFFF),
-            (int) (val & 0xFFFFFFFF));
-      }
-      break;
-    case VALUE_TYPE_DOUBLE:
-      {
-        double val;
-        val = tvb_get_ntohieee_double(tvb, ofs);
-        len = 8;
-        snprintf(buf, buflen, "%lg", val);
-      }
-      break;
-    case VALUE_TYPE_STRING:
-      {
-        guint8* str;
-        len = tvb_get_ntohl(tvb, ofs);
-        ofs += 4;
-        str = tvb_get_ephemeral_string(tvb, ofs, len);
-        if (len > buflen - 3 && buflen >= 6) {
-          snprintf(buf, buflen, "\"%.*s...\"", buflen - 6, (char*) str);
-        } else {
-          snprintf(buf, buflen, "\"%s\"", (char*) str);
-        }
-      }
-      break;
-  }
-  /* ensure the buffer is null-terminated */;
-  buf[buflen - 1] = 0;
-
-  /* point to byte after this Value */
-  return ofs + len;
-}
-
-/*
- * Show a labelled Value.
- *
- * hdr - name of this Value
- * ofs - offset into buffer where the Value tag byte is located.
- *
- * returns the offset after the last byte of this Value
- */
-static int showValue(proto_tree* tree, char* hdr, tvbuff_t* tvb, int ofs) {
-  proto_tree* subtree;
-  proto_item* ti;
-  guint8 tag;
-  int newOffset;
-  char buf[40];
-  *buf = 0;
-  newOffset = getValue(tvb, ofs, buf, sizeof(buf));
-  tag = tvb_get_guint8(tvb, ofs);
-  ti = proto_tree_add_string_format(tree, hf_gwtcs_val_hdr, tvb, ofs,
-      newOffset - ofs, 0, "%s: %s", hdr, buf);
-  subtree = proto_item_add_subtree(ti, ett_value);
-  proto_tree_add_item(subtree, hf_gwtcs_value_tag, tvb, ofs++, 1, FALSE);
-  switch (tag) {
-    case VALUE_TYPE_NULL:
-      proto_tree_add_item(subtree, hf_gwtcs_val_null, tvb, ofs, 0, FALSE);
-      break;
-    case VALUE_TYPE_UNDEFINED:
-      proto_tree_add_item(subtree, hf_gwtcs_val_undef, tvb, ofs, 0, FALSE);
-      break;
-    case VALUE_TYPE_BOOLEAN:
-      proto_tree_add_item(subtree, hf_gwtcs_val_bool, tvb, ofs, 1, FALSE);
-      break;
-    case VALUE_TYPE_BYTE:
-      proto_tree_add_item(subtree, hf_gwtcs_val_byte, tvb, ofs, 1, FALSE);
-      break;
-    case VALUE_TYPE_CHAR:
-      proto_tree_add_item(subtree, hf_gwtcs_val_char, tvb, ofs, 2, FALSE);
-      break;
-    case VALUE_TYPE_SHORT:
-      proto_tree_add_item(subtree, hf_gwtcs_val_short, tvb, ofs, 2, FALSE);
-      break;
-    case VALUE_TYPE_INT:
-      proto_tree_add_item(subtree, hf_gwtcs_val_int, tvb, ofs, 4, FALSE);
-      break;
-    case VALUE_TYPE_LONG:
-      proto_tree_add_item(subtree, hf_gwtcs_val_long, tvb, ofs, 8, FALSE);
-      break;
-    case VALUE_TYPE_FLOAT:
-      proto_tree_add_item(subtree, hf_gwtcs_val_float, tvb, ofs, 4, FALSE);
-      break;
-    case VALUE_TYPE_DOUBLE:
-      proto_tree_add_item(subtree, hf_gwtcs_val_double, tvb, ofs, 8, FALSE);
-      break;
-    case VALUE_TYPE_STRING:
-      proto_tree_add_item(subtree, hf_gwtcs_val_string, tvb, ofs, 4, FALSE);
-      break;
-    case VALUE_TYPE_JAVA_OBJECT:
-      proto_tree_add_item(subtree, hf_gwtcs_val_javaobj, tvb, ofs, 4, FALSE);
-      break;
-    case VALUE_TYPE_JS_OBJECT:
-      proto_tree_add_item(subtree, hf_gwtcs_val_jsobj, tvb, ofs, 4, FALSE);
-      break;
-  }
-  return newOffset;
-}
-
-/*
- * Initialize memchunk system.
- */
-static void init() {
-  if (memChunk) {
-    g_mem_chunk_destroy(memChunk);
-  }
-  memChunk = g_mem_chunk_new("gwtcs data", sizeof(gwtcs_data),
-                             20 * sizeof(gwtcs_data), G_ALLOC_AND_FREE);
-}
-
-/*
- * Dissect a single packet.
- */
-static int dissect_gwtcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
-{
-  guint8 packetType;
-  conversation_t* conv;
-  gwtcs_data* data = 0;
-  int isClient = 0;
-
-  if (tvb_length(tvb) < 1) {
-    return 0;
-  }
-
-  packetType = tvb_get_guint8(tvb, 0);
-  if (packetType > MAX_PACKET_TYPE) {
-    return 0;
-  }
-
-  if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
-    col_set_str(pinfo->cinfo, COL_PROTOCOL, "GWT-CS");
-  }
-
-  /* Clear the info column */
-  if (check_col(pinfo->cinfo, COL_INFO)) {
-    col_set_str(pinfo->cinfo, COL_INFO, "");
-  }
-
-  /* get the conversation */
-  conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
-                           pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
-  if (!conv) {
-    conv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
-                            pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
-  }
-  data = (gwtcs_data*) conversation_get_proto_data(conv, proto_gwtcs);
-  if (!data) {
-    data = (gwtcs_data*) g_mem_chunk_alloc(memChunk);
-    data->clientPort = -1;
-    data->level = 0;
-    conversation_add_proto_data(conv, proto_gwtcs, data);
-  }
-
-  if (packetType == MESSAGE_TYPE_CHECK_VERSIONS) {
-    data->clientAddress = pinfo->src;
-    data->clientPort = pinfo->srcport;
-  }
-
-  if (data->clientPort == pinfo->srcport) {
-    isClient = 1;
-  }
-
-  /* Set the info column */
-  if (check_col(pinfo->cinfo,COL_INFO)) {
-    gint32 len;
-    guint8* str;
-    int i;
-    gint32 offset = 1;
-    if (data->clientPort != -1) {
-      col_add_str(pinfo->cinfo, COL_INFO, isClient ? "C->S: " : "S->C: ");
-    }
-    for (i = 0; i < data->level; ++i) {
-      col_append_str(pinfo->cinfo, COL_INFO, " ");
-    }
-    col_append_str(pinfo->cinfo, COL_INFO, packetTypes[packetType].strptr);
-    switch (packetType) {
-      case MESSAGE_TYPE_CHECK_VERSIONS:
-        {
-          int minvers, maxvers;
-          minvers = tvb_get_ntohl(tvb, offset);
-          offset += 4;
-          maxvers = tvb_get_ntohl(tvb, offset);
-          col_append_fstr(pinfo->cinfo, COL_INFO, " vers=%d-%d", minvers,
-              maxvers);
-        }
-        break;
-      case MESSAGE_TYPE_PROTOCOL_VERSION:
-        {
-          int vers;
-          vers = tvb_get_ntohl(tvb, offset);
-          col_append_fstr(pinfo->cinfo, COL_INFO, " vers=%d", vers);
-        }
-        break;
-      case MESSAGE_TYPE_LOAD_MODULE:
-        data->level++;
-        // URL
-        len = tvb_get_ntohl(tvb, offset);
-        offset += 4 + len;
-        // tab key
-        len = tvb_get_ntohl(tvb, offset);
-        offset += 4 + len;
-        // session key
-        len = tvb_get_ntohl(tvb, offset);
-        offset += 4 + len;
-        // module name
-        len = tvb_get_ntohl(tvb, offset);
-        offset  += 4;
-        // clip string
-        if (len > MAX_STRING_LENGTH) {
-          len = MAX_STRING_LENGTH;
-        }
-        str = tvb_get_ephemeral_string(tvb, offset, len);
-        col_append_fstr(pinfo->cinfo, COL_INFO, " %s", str);
-        break;
-      case MESSAGE_TYPE_INVOKE:
-        data->level++;
-        if (data->clientPort == -1) {
-          break;
-        }
-        if (isClient) {
-          int dispId;
-          dispId = tvb_get_ntohl(tvb, offset);
-          offset += 4;
-          col_append_fstr(pinfo->cinfo, COL_INFO, " dispid=%d", dispId);
-        } else {
-          // module name
-          len = tvb_get_ntohl(tvb, offset);
-          offset += 4;
-          // clip string
-          if (len > MAX_STRING_LENGTH) {
-            len = MAX_STRING_LENGTH;
-          }
-          str = tvb_get_ephemeral_string(tvb, offset, len);
-          col_append_fstr(pinfo->cinfo, COL_INFO, " %s", str);
-        }
-        break;
-      case MESSAGE_TYPE_RETURN:
-        {
-          char buf[40];
-          guint8 isexc;
-          data->level--;
-          isexc = tvb_get_guint8(tvb, 1);
-          getValue(tvb, 2, buf, sizeof(buf));
-          col_append_fstr(pinfo->cinfo, COL_INFO, " %s%s",
-              isexc ? "** EXCEPTION ** " : "", buf);
-        }
-        break;
-      case MESSAGE_TYPE_INVOKESPECIAL:
-        {
-          guint8 specialType;
-          data->level++;
-          specialType = tvb_get_guint8(tvb, 1);
-          col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
-              specialTypes[specialType].strptr);
-        }
-        break;
-    }
-  }
-
-  /*
-   * If tree is non-null, then we want to get the detailed data.
-   */
-  if (tree) {
-    proto_item *ti = 0;
-    proto_tree *gwtcs_tree = 0;
-    gint32 offset = 1;
-
-    ti = proto_tree_add_item(tree, proto_gwtcs, tvb, 0 , -1, FALSE);
-    gwtcs_tree = proto_item_add_subtree(ti, ett_gwtcs);
-    proto_tree_add_item(gwtcs_tree, hf_gwtcs_pdu_type, tvb, 0, 1, FALSE);
-    switch (packetType) {
-      case MESSAGE_TYPE_CHECK_VERSIONS:
-        proto_tree_add_item(gwtcs_tree, hf_gwtcs_min_vers, tvb, 1, 4, FALSE);
-        proto_tree_add_item(gwtcs_tree, hf_gwtcs_max_vers, tvb, 5, 4, FALSE);
-        proto_tree_add_item(gwtcs_tree, hf_gwtcs_hosted_vers, tvb, 9, 4, FALSE);
-        break;
-      case MESSAGE_TYPE_PROTOCOL_VERSION:
-        proto_tree_add_item(gwtcs_tree, hf_gwtcs_sel_vers, tvb, 1, 4, FALSE);
-        break;
-      case MESSAGE_TYPE_LOAD_MODULE:
-        {
-          guint32 len;
-          len = tvb_get_ntohl(tvb, offset);
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_url, tvb, offset, 4,
-              FALSE);
-          offset += 4 + len;
-          len = tvb_get_ntohl(tvb, offset);
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_tabkey, tvb, offset, 4,
-              FALSE);
-          offset += 4 + len;
-          len = tvb_get_ntohl(tvb, offset);
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_seskey, tvb, offset, 4,
-              FALSE);
-          offset += 4 + len;
-          len = tvb_get_ntohl(tvb, offset);
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_modname, tvb, offset, 4,
-              FALSE);
-          offset += 4 + len;
-          len = tvb_get_ntohl(tvb, offset);
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_lm_ua, tvb, offset, 4,
-              FALSE);
-          offset += 4 + len;
-        }
-        break;
-      case MESSAGE_TYPE_INVOKE:
-        {
-          int numArgs, len, i;
-          proto_item* ti;
-          proto_tree* subtree;
-          if (data->clientPort == -1) {
-            proto_tree_add_text(gwtcs_tree, tvb, 1, -1,
-                "Can't decode - unknown direction");
-            break;
-          }
-          if (isClient) {
-            proto_tree_add_item(gwtcs_tree, hf_gwtcs_dispid, tvb, offset, 4,
-                FALSE);
-            offset += 4;
-          } else {
-            // method name
-            len = tvb_get_ntohl(tvb, offset);
-            proto_tree_add_item(gwtcs_tree, hf_gwtcs_methname, tvb, offset, 4,
-                FALSE);
-            offset += 4 + len;
-          }
-          offset = showValue(gwtcs_tree, "This Value", tvb, offset);
-          numArgs = tvb_get_ntohl(tvb, offset);
-          ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
-              FALSE);
-          subtree = proto_item_add_subtree(ti, ett_args);
-          offset += 4;
-          for (i = 0; i < numArgs; ++i) {
-            char argName[10];
-            snprintf(argName, sizeof(argName), "arg%d", i);
-            offset = showValue(subtree, argName, tvb, offset);
-          }
-        }
-        break;
-      case MESSAGE_TYPE_RETURN:
-        proto_tree_add_item(gwtcs_tree, hf_gwtcs_isexc, tvb, 1, 1, FALSE);
-        showValue(gwtcs_tree, "Return Value", tvb, 2);
-        break;
-      case MESSAGE_TYPE_LOADJSNI:
-        proto_tree_add_item(gwtcs_tree, hf_gwtcs_jsni, tvb, 1, 4, FALSE);
-        break;
-      case MESSAGE_TYPE_INVOKESPECIAL:
-        {
-          int numArgs, i;
-          proto_item* ti;
-          proto_tree* subtree;
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_spectype, tvb, offset++, 1,
-              FALSE);
-          numArgs = tvb_get_ntohl(tvb, offset);
-          ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
-              FALSE);
-          offset += 4;
-          subtree = proto_item_add_subtree(ti, ett_args);
-          for (i = 0; i < numArgs; ++i) {
-            char argName[10];
-            snprintf(argName, sizeof(argName), "arg%d", i);
-            offset = showValue(subtree, argName, tvb, offset);
-          }
-        }
-        break;
-      case MESSAGE_TYPE_FREEVALUE:
-        {
-          int numArgs, i, label;
-          proto_item* ti;
-          proto_tree* subtree;
-          numArgs = tvb_get_ntohl(tvb, offset);
-          ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
-              FALSE);
-          offset += 4;
-          subtree = proto_item_add_subtree(ti, ett_args);
-          label = isClient ? hf_gwtcs_val_jsobj : hf_gwtcs_val_javaobj;
-          for (i = 0; i < numArgs; ++i) {
-            proto_tree_add_item(subtree, label, tvb, offset, 4, FALSE);
-            offset += 4;
-          }
-        }
-        break;
-      case MESSAGE_TYPE_CHOOSE_TRANSPORT:
-        {
-          int numArgs, i, len;
-          proto_item* ti;
-          proto_tree* subtree;
-          numArgs = tvb_get_ntohl(tvb, offset);
-          ti = proto_tree_add_item(gwtcs_tree, hf_gwtcs_numargs, tvb, offset, 4,
-              FALSE);
-          offset += 4;
-          subtree = proto_item_add_subtree(ti, ett_args);
-          for (i = 0; i < numArgs; ++i) {
-            len = tvb_get_ntohl(tvb, offset);
-            proto_tree_add_item(subtree, hf_gwtcs_transport, tvb, offset, 4,
-                FALSE);
-            offset += 4 + len;
-          }
-        }
-        break;
-      case MESSAGE_TYPE_SWITCH_TRANSPORT:
-        {
-          int len;
-          len = tvb_get_ntohl(tvb, offset);
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_transport, tvb, offset, 4,
-              FALSE);
-          offset += 4 + len;
-          len = tvb_get_ntohl(tvb, offset);
-          proto_tree_add_item(gwtcs_tree, hf_gwtcs_transargs, tvb, offset, 4,
-              FALSE);
-          offset += 4 + len;
-        }
-        break;
-    }
-  }
-
-  return tvb_length(tvb);
-}
-
-void proto_register_gwtcs(void)
-{
-  /*
-   * List of subtree identifiers to be allocated.
-   */
-  static gint *ett[] = {
-    &ett_gwtcs,
-    &ett_value,
-    &ett_args,
-  };
-
-  /*
-   * List of display identifiers to be allocated.
-   */
-  static hf_register_info hf[] = {
-    {
-      &hf_gwtcs_pdu_type,
-      {
-        "Packet Type", "gwtcs.type",
-        FT_UINT8, BASE_DEC, VALS(packetTypes), 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_spectype,
-      {
-        "Type", "gwtcs.spectype",
-        FT_UINT8, BASE_DEC, VALS(specialTypes), 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_value_tag,
-      {
-        "Value Tag", "gwtcs.value.tag",
-        FT_UINT8, BASE_DEC, VALS(valueTypes), 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_min_vers,
-      {
-        "Minimum version", "gwtcs.minvers",
-        FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_max_vers,
-      {
-        "Maximum version", "gwtcs.maxvers",
-        FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_hosted_vers,
-      {
-        "hosted.html version", "gwtcs.hostedvers",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_sel_vers,
-      {
-        "Selected version", "gwtcs.selvers",
-        FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_lm_url,
-      {
-        "URL", "gwtcs.lm.url",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_lm_modname,
-      {
-        "Module Name", "gwtcs.lm.modname",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_lm_tabkey,
-      {
-        "Tab Key", "gwtcs.lm.tabkey",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_lm_seskey,
-      {
-        "Session Key", "gwtcs.lm.seskey",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_lm_ua,
-      {
-        "User Agent", "gwtcs.lm.ua",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_methname,
-      {
-        "Method Name", "gwtcs.lm.methname",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_isexc,
-      {
-        "Is Exception", "gwtcs.isexc",
-        FT_BOOLEAN, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_dispid,
-      {
-        "Dispatch ID", "gwtcs.dispid",
-        FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_jsni,
-      {
-        "JSNI Source", "gwtcs.jsni",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_hdr,
-      {
-        "Value", "gwtcs.val.hdr",
-        FT_STRINGZ, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_numargs,
-      {
-        "# of Arguments", "gwtcs.val.numargs",
-        FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_null,
-      {
-        "Null Value", "gwtcs.val.null",
-        FT_NONE, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_undef,
-      {
-        "Undef Value", "gwtcs.val.undef",
-        FT_NONE, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_bool,
-      {
-        "Boolean Value", "gwtcs.val.bool",
-        FT_BOOLEAN, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_byte,
-      {
-        "Byte Value", "gwtcs.val.byte",
-        FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_char,
-      {
-        "Char Value", "gwtcs.val.char",
-        FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_short,
-      {
-        "Short Value", "gwtcs.val.short",
-        FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_int,
-      {
-        "Int Value", "gwtcs.val.int",
-        FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_long,
-      {
-        "Long Value", "gwtcs.val.long",
-        FT_INT64, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_float,
-      {
-        "Float Value", "gwtcs.val.float",
-        FT_FLOAT, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_double,
-      {
-        "Double Value", "gwtcs.val.double",
-        FT_DOUBLE, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_javaobj,
-      {
-        "Java Object Id", "gwtcs.val.javaobj",
-        FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_jsobj,
-      {
-        "JS Object Id", "gwtcs.val.jsobj",
-        FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_val_string,
-      {
-        "String Value", "gwtcs.val.string",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_transport,
-      {
-        "Transport Name", "gwtcs.transport",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-    {
-      &hf_gwtcs_transargs,
-      {
-        "Transport Args", "gwtcs.transargs",
-        FT_UINT_STRING, BASE_DEC, NULL, 0x0, NULL, HFILL,
-      }
-    },
-  };
-
-  if (proto_gwtcs == -1)
-  {
-     register_init_routine(&init);
-     proto_gwtcs = proto_register_protocol (
-        "GWT Code Server Protocol", /* name */
-        "GWT-CS",          /* short name */
-        "gwtcs"           /* abbrev */
-     );
-
-     proto_register_field_array(proto_gwtcs, hf, array_length(hf));
-     proto_register_subtree_array(ett, array_length(ett));
-  }
-}
-
-void proto_reg_handoff_gwtcs(void)
-{
-   static int Initialized=FALSE;
-
-   /* register with wireshark to dissect tdp packets on port 9997 */
-   if (!Initialized) {
-      gwtcs_handle = new_create_dissector_handle(dissect_gwtcs, proto_gwtcs);
-      dissector_add("tcp.port", DEFAULT_GWTCS_PORT, gwtcs_handle);
-      Initialized = TRUE;
-   }
-}
diff --git a/plugins/xpcom/ExternalWrapper.cpp b/plugins/xpcom/ExternalWrapper.cpp
deleted file mode 100644
index 62cc1b5..0000000
--- a/plugins/xpcom/ExternalWrapper.cpp
+++ /dev/null
@@ -1,417 +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.
- */
-
-#include "ExternalWrapper.h"
-
-#include "nsIHttpProtocolHandler.h"
-#include "nsISupports.h"
-#include "nsNetCID.h"
-#include "nsCOMPtr.h"
-#include "nsMemory.h"
-#include "nsServiceManagerUtils.h"
-#include "nsIPromptService.h"
-#include "nsIDOMWindow.h"
-#if GECKO_VERSION <= 7000
-#include "nsIDOMWindowInternal.h"
-#endif //GECKO_VERSION
-#include "nsIDOMLocation.h"
-#include "nsXPCOMStrings.h"
-#include "nsICategoryManager.h"
-#include "nsIJSContextStack.h"
-#include "nsIScriptContext.h"
-#include "nsIScriptGlobalObject.h"
-#include "nsPIDOMWindow.h"
-#include "LoadModuleMessage.h"
-#include "ServerMethods.h"
-#include "BrowserChannel.h"
-#include "AllowedConnections.h"
-
-#if GECKO_VERSION >= 1900
-#include "nsIClassInfoImpl.h"
-#endif //GECKO_VERSION
-
-#if GECKO_VERSION >= 2000
-NS_IMPL_CLASSINFO(ExternalWrapper, NULL, 0, OOPHM_CID)
-#endif //GECKO_VERSION
-
-NS_IMPL_ISUPPORTS2_CI(ExternalWrapper, IOOPHM, nsISecurityCheckedComponent)
-
-ExternalWrapper::ExternalWrapper() {
-  Debug::log(Debug::Debugging) << "ExternalWrapper::ExternalWrapper(this="
-      << this << ")" << Debug::flush;
-  preferences = new Preferences();
-  windowWatcher = do_GetService(NS_WINDOWWATCHER_CONTRACTID);
-  if (!windowWatcher) {
-    Debug::log(Debug::Warning) << "Can't get WindowWatcher service"
-        << Debug::flush;
-    return;
-  }
-}
-
-ExternalWrapper::~ExternalWrapper() {
-  Debug::log(Debug::Debugging) << "ExternalWrapper::~ExternalWrapper(this="
-      << this << ")" << Debug::flush;
-}
-
-// define the CID for nsIHttpProtocolHandler
-static NS_DEFINE_CID(kHttpHandlerCID, NS_HTTPPROTOCOLHANDLER_CID);
-
-static nsresult getUserAgent(std::string& userAgent) {
-  nsresult res;
-  nsCOMPtr<nsIHttpProtocolHandler> http = do_GetService(kHttpHandlerCID, &res);
-  if (NS_FAILED(res)) {
-    return res;
-  }
-  nsCString userAgentStr;
-  res = http->GetUserAgent(userAgentStr);
-  if (NS_FAILED(res)) {
-    return res;
-  }
-  userAgent.assign(userAgentStr.get());
-  return NS_OK;
-}
-
-/**
- * Get JS window object.
- *
- * @param win output parameter to store the window object
- * @return true on success
- */
-static bool getWindowObject(nsIDOMWindow** win) {
-  // Get JSContext from stack.
-  nsCOMPtr<nsIJSContextStack> stack =
-      do_GetService("@mozilla.org/js/xpc/ContextStack;1");
-  if (!stack) {
-    Debug::log(Debug::Error) << "getWindowObject: no context stack"
-        << Debug::flush;
-    return false;
-  }
-  JSContext *cx;
-  if (NS_FAILED(stack->Peek(&cx)) || !cx) {
-    Debug::log(Debug::Error) << "getWindowObject: no context on stack"
-        << Debug::flush;
-    return false;
-  }
-  if (!(::JS_GetOptions(cx) & JSOPTION_PRIVATE_IS_NSISUPPORTS)) {
-    Debug::log(Debug::Error)
-        << "getWindowObject: context doesn't have nsISupports" << Debug::flush;
-    return false;
-  }
-
-  nsCOMPtr<nsIScriptContext> scx =
-    do_QueryInterface(static_cast<nsISupports *>
-                                 (::JS_GetContextPrivate(cx)));
-  if (!scx) {
-    Debug::log(Debug::Error) << "getWindowObject: no script context"
-        << Debug::flush;
-    return false;
-  }
-  nsCOMPtr<nsIScriptGlobalObject> globalObj = scx->GetGlobalObject();
-  if (!globalObj) {
-    Debug::log(Debug::Error) << "getWindowObject: no global object"
-        << Debug::flush;
-    return false;
-  }
-  nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(globalObj);
-  if (!window) {
-    Debug::log(Debug::Error) << "getWindowObject: window is null"
-        << Debug::flush;
-    return false;
-  }
-  NS_ADDREF(*win = window);
-  return true;
-}
-
-/**
- * Get the URL of a window.
- *
- * @param win DOMWindowInternal instance
- * @param url output wide string for the URL
- * @return true if successful
- */
-static bool getWindowUrl(nsIDOMWindowInternal* win, nsAString& url) {
-  nsCOMPtr<nsIDOMLocation> loc;
-  if (win->GetLocation(getter_AddRefs(loc)) != NS_OK) {
-    Debug::log(Debug::Info) << "Unable to get location" << Debug::flush;
-    return false;
-  }
-  if (loc->GetHref(url) != NS_OK) {
-    Debug::log(Debug::Info) << "Unable to get URL" << Debug::flush;
-    return false;
-  }
-  return true;
-}
-
-/**
- * Get the top-level window for a given window, and its URL.
- *
- * @param win window to start from
- * @param topWinRet output parameter to store top window
- * @param topUrl output parameter to store URL
- * @return true on success, false on error (already logged)
- */
-static bool getTopWindow(nsIDOMWindow* win, nsIDOMWindowInternal** topWinRet,
-    nsAString& topUrl) {
-  nsCOMPtr<nsIDOMWindow> topWin;
-  if (win->GetTop(getter_AddRefs(topWin)) != NS_OK) {
-    Debug::log(Debug::Error) << "Unable to get top window" << Debug::flush;
-    return false;
-  }
-  nsresult rv;
-  nsCOMPtr<nsIDOMWindowInternal> topWinInt = do_QueryInterface(topWin, &rv);
-  if (rv != NS_OK) {
-    Debug::log(Debug::Error) << "Unable to QI DOMWindowInternal"
-        << Debug::flush;
-    return false;
-  }
-  if (!getWindowUrl(topWinInt, topUrl)) {
-    Debug::log(Debug::Error) << "Unable to get url of top window"
-        << Debug::flush;
-    return false;
-  }
-  NS_ADDREF(*topWinRet = topWinInt);
-  return true;
-}
-
-std::string ExternalWrapper::computeTabIdentity() {
-  std::string returnVal;
-  if (!windowWatcher) {
-    return returnVal;
-  }
-  // The nsPIDOMWindow interface of our top-level window appears to be stable
-  // across refreshes, so we will use that for our tab ID.
-  nsCOMPtr<nsPIDOMWindow> privateWin = do_QueryInterface(topWindow);
-  if (!privateWin) {
-    return returnVal;
-  }
-  char buf[20]; // typically 8-16 hex digits plus 0x, not horrible if truncated
-  snprintf(buf, sizeof(buf), "%p", privateWin.get());
-  buf[19] = 0; // ensure null termination
-  returnVal = buf;
-  return returnVal;
-}
-
-// TODO(jat): remove suppliedWindow and update hosted.html API
-
-#if GECKO_VERSION < 10000
-NS_IMETHODIMP ExternalWrapper::Init(nsIDOMWindow* suppliedWindow,
-    PRBool *_retval) {
-#else
-NS_IMETHODIMP ExternalWrapper::Init(nsIDOMWindow* suppliedWindow,
-    bool *_retval) {
-#endif //GECKO_VERSION
-
-  Debug::log(Debug::Debugging) << "Plugin initialized from hosted.html"
-      << Debug::flush;
-  *_retval = false;
-  nsCOMPtr<nsIDOMWindow> computedWindow;
-  if (getWindowObject(getter_AddRefs(computedWindow))) {
-    Debug::log(Debug::Debugging) << " passed window=" << suppliedWindow
-        << ", computed=" << computedWindow << Debug::flush;
-    domWindow = computedWindow;
-  } else {
-    Debug::log(Debug::Warning) << " using supplied window object"
-        << Debug::flush;
-    // TODO(jat): remove this
-    domWindow = suppliedWindow;
-  }
-  if (getTopWindow(domWindow, getter_AddRefs(topWindow), url)) {
-    *_retval = true;
-  }
-  return NS_OK;
-}
-
-bool ExternalWrapper::askUserToAllow(const std::string& url) {
-  nsCOMPtr<nsIPromptService> promptService = do_GetService(
-      "@mozilla.org/embedcomp/prompt-service;1");
-  if (!promptService) {
-    return false;
-  }
-  NS_ConvertASCIItoUTF16 title("Allow GWT Developer Plugin Connection");
-  NS_ConvertASCIItoUTF16 text("The web and code server combination is unrecognized and requesting a GWT "
-      "developer plugin connection -- do you want to allow it?");
-  NS_ConvertASCIItoUTF16 checkMsg("Remember this decision for this server "
-      "(change in GWT Developer Plugin preferences)");
-
-#if GECKO_VERSION < 10000
-  // Please see: https://bugzilla.mozilla.org/show_bug.cgi?id=681188
-  PRBool remember = false;
-  PRBool include = true;
-  if (promptService->ConfirmCheck(domWindow.get(), title.get(), text.get(),
-      checkMsg.get(), &remember, &include) != NS_OK) {
-    return false;
-  }
-
-  if (remember) {
-    std::string host = AllowedConnections::getHostFromUrl(url);
-    std::string server = AllowedConnections::getCodeServerFromUrl(url);
-    preferences->addNewRule(host + "/" + server, !include);
-  }
-  return include;
-
-#else
-
-  bool remember = false;
-  bool include = true;
-  if (promptService->ConfirmCheck(domWindow.get(), title.get(), text.get(),
-      checkMsg.get(), &remember, &include) != NS_OK) {
-    return false;
-  }
-
-  if (remember) {
-    std::string host = AllowedConnections::getHostFromUrl(url);
-    std::string server = AllowedConnections::getCodeServerFromUrl(url);
-    preferences->addNewRule(host + "/" + server, !include);
-  }
-
-  return include;
-
-#endif //GECKO_VERSION
-}
-
-// TODO(jat): remove suppliedUrl and update hosted.html API
-#if GECKO_VERSION < 10000
-NS_IMETHODIMP ExternalWrapper::Connect(const nsACString& suppliedUrl,
-                const nsACString& sessionKey, const nsACString& aAddr,
-                const nsACString& aModuleName, const nsACString& hostedHtmlVersion,
-                PRBool *_retval) {
-#else
-NS_IMETHODIMP ExternalWrapper::Connect(const nsACString& suppliedUrl,
-                const nsACString& sessionKey, const nsACString& aAddr,
-                const nsACString& aModuleName, const nsACString& hostedHtmlVersion,
-                bool *_retval) {
-#endif //GECKO_VERSION
-
-  Debug::log(Debug::Info) << "Connect(url=" <<  url << ", sessionKey="
-      << sessionKey << ", address=" << aAddr << ", module=" << aModuleName
-      << ", hostedHtmlVersion=" << hostedHtmlVersion << Debug::flush;
-
-  // TODO: string utilities?
-  nsCString urlAutoStr;
-  NS_UTF16ToCString(url, NS_CSTRING_ENCODING_UTF8, urlAutoStr);
-  nsCString sessionKeyAutoStr(sessionKey);
-  nsCString addrAutoStr(aAddr);
-  nsCString moduleAutoStr(aModuleName);
-  nsCString hostedHtmlVersionAutoStr(hostedHtmlVersion);
-  std::string hostedUrl(addrAutoStr.get());
-  std::string urlStr(urlAutoStr.get());
-
-  bool allowed = false;
-  std::string webHost = AllowedConnections::getHostFromUrl(urlStr);
-  std::string codeServer = AllowedConnections::getCodeServerFromUrl(urlStr);
-  if (!AllowedConnections::matchesRule( webHost, codeServer, &allowed)) {
-    // If we didn't match an existing rule, prompt the user
-    allowed = askUserToAllow(urlStr);
-  }
-  if (!allowed) {
-    *_retval = false;
-    return NS_OK;
-  }
-
-  size_t index = hostedUrl.find(':');
-  if (index == std::string::npos) {
-    *_retval = false;
-    return NS_OK;
-  }
-  std::string hostPart = hostedUrl.substr(0, index);
-  std::string portPart = hostedUrl.substr(index + 1);
-
-  // TODO(jat): leaks HostChannel -- need to save it in a session object and
-  // return that so the host page can call a disconnect method on it at unload
-  // time or when it gets GC'd.
-  HostChannel* channel = new HostChannel();
-
-  Debug::log(Debug::Debugging) << "Connecting..." << Debug::flush;
-
-  if (!channel->connectToHost(hostPart.c_str(),
-      atoi(portPart.c_str()))) {
-    *_retval = false;
-    return NS_OK;
-  }
-
-  Debug::log(Debug::Debugging) << "...Connected" << Debug::flush;
-  sessionHandler.reset(new FFSessionHandler(channel/*, ctx*/));
-
-  std::string hostedHtmlVersionStr(hostedHtmlVersionAutoStr.get());
-  if (!channel->init(sessionHandler.get(), BROWSERCHANNEL_PROTOCOL_VERSION,
-      BROWSERCHANNEL_PROTOCOL_VERSION, hostedHtmlVersionStr)) {
-    *_retval = false;
-    return NS_OK;
-  }
-
-  std::string moduleName(moduleAutoStr.get());
-  std::string userAgent;
-
-  // get the user agent
-  nsresult res = getUserAgent(userAgent);
-  if (NS_FAILED(res)) {
-    return res;
-  }
-
-  std::string tabKeyStr = computeTabIdentity();
-  std::string sessionKeyStr(sessionKeyAutoStr.get());
-
-  LoadModuleMessage::send(*channel, urlStr, tabKeyStr, sessionKeyStr,
-      moduleName, userAgent, sessionHandler.get());
-
-  // TODO: return session object?
-  *_retval = true;
-  return NS_OK;
-}
-
-// nsISecurityCheckedComponent
-static char* cloneAllAccess() {
-  static const char allAccess[] = "allAccess";
-  return static_cast<char*>(nsMemory::Clone(allAccess, sizeof(allAccess)));
-}
-
-static bool strEquals(const PRUnichar* utf16, const char* ascii) {
-  nsCString utf8;
-  NS_UTF16ToCString(nsDependentString(utf16), NS_CSTRING_ENCODING_UTF8, utf8);
-  return strcmp(ascii, utf8.get()) == 0;
-}
-
-NS_IMETHODIMP ExternalWrapper::CanCreateWrapper(const nsIID * iid,
-    char **_retval) {
-  Debug::log(Debug::Spam) << "ExternalWrapper::CanCreateWrapper"
-      << Debug::flush;
-  *_retval = cloneAllAccess();
-  return NS_OK;
-}
-
-NS_IMETHODIMP ExternalWrapper::CanCallMethod(const nsIID * iid,
-    const PRUnichar *methodName, char **_retval) {
-  Debug::log(Debug::Spam) << "ExternalWrapper::CanCallMethod" << Debug::flush;
-  if (strEquals(methodName, "connect") || strEquals(methodName, "init")) {
-    *_retval = cloneAllAccess();
-  } else {
-    *_retval = nsnull;
-  }
-  return NS_OK;
-}
-
-NS_IMETHODIMP ExternalWrapper::CanGetProperty(const nsIID * iid,
-    const PRUnichar *propertyName, char **_retval) {
-  Debug::log(Debug::Spam) << "ExternalWrapper::CanGetProperty" << Debug::flush;
-  *_retval = nsnull;
-  return NS_OK;
-}
-NS_IMETHODIMP ExternalWrapper::CanSetProperty(const nsIID * iid,
-    const PRUnichar *propertyName, char **_retval) {
-  Debug::log(Debug::Spam) << "ExternalWrapper::CanSetProperty" << Debug::flush;
-  *_retval = nsnull;
-  return NS_OK;
-}
diff --git a/plugins/xpcom/ExternalWrapper.h b/plugins/xpcom/ExternalWrapper.h
deleted file mode 100755
index 9d012e1..0000000
--- a/plugins/xpcom/ExternalWrapper.h
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef _H_ExternalWrapper
-#define _H_ExternalWrapper
-/*
- * 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.
- */
-
-#include <string>
-
-#include "mozincludes.h"
-
-#include "IOOPHM.h"
-
-#include "Preferences.h"
-#include "FFSessionHandler.h"
-#include "Debug.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-#include "nsCOMPtr.h"
-#include "nsISecurityCheckedComponent.h"
-#include "nsStringAPI.h"
-#include "nsIWindowWatcher.h"
-#include "nsIDOMWindow.h"
-
-class nsIDOMWindow;
-
-// {028DD88B-6D65-401D-AAFD-17E497D15D09}
-#define OOPHM_CID \
-  { 0x028DD88B, 0x6D65, 0x401D, \
-  { 0xAA, 0xFD, 0x17, 0xE4, 0x97, 0xD1, 0x5D, 0x09 } }
-
-#define OOPHM_CONTRACTID "@gwt.google.com/oophm/ExternalWrapper;1"
-#define OOPHM_CLASSNAME "GWT DevMode component"
-
-class ExternalWrapper : public IOOPHM,
-                        public nsISecurityCheckedComponent {
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-  NS_DECL_NSISECURITYCHECKEDCOMPONENT
-
-  ExternalWrapper();
-  virtual ~ExternalWrapper();
-
-private:
-  nsCOMPtr<nsIDOMWindow> domWindow;
-  nsCOMPtr<nsIDOMWindowInternal> topWindow;
-  nsString url;
-  nsCOMPtr<Preferences> preferences;
-  scoped_ptr<FFSessionHandler> sessionHandler;
-  nsCOMPtr<nsIWindowWatcher> windowWatcher;
-
-  /**
-   * Prompt the user whether a connection should be allowed, and optionally
-   * update the preferences.
-   */
-  bool askUserToAllow(const std::string& url);
-
-  /**
-   * Compute a stable tab identity value for the DOM window.
-   *
-   * @return a unique tab identifier which is stable across reloads, or an
-   *     empty string if it cannot be computed
-   */
-  std::string computeTabIdentity();
-
-};
-
-inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg,
-    const nsACString& str) {
-  nsCString copy(str);
-  dbg << copy.get();
-  return dbg;
-}
-
-inline Debug::DebugStream& operator<<(Debug::DebugStream& dbg,
-    const nsAString& str) {
-  NS_ConvertUTF16toUTF8 copy(str);
-  dbg << copy.get();
-  return dbg;
-}
-
-#endif
diff --git a/plugins/xpcom/FFSessionHandler.cpp b/plugins/xpcom/FFSessionHandler.cpp
deleted file mode 100755
index 4cd9771..0000000
--- a/plugins/xpcom/FFSessionHandler.cpp
+++ /dev/null
@@ -1,651 +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.
- */
-
-#include "FFSessionHandler.h"
-#include "HostChannel.h"
-#include "JavaObject.h"
-#include "JSRunner.h"
-#include "Debug.h"
-#include "XpcomDebug.h"
-#include "scoped_ptr/scoped_ptr.h"
-#include "RootedObject.h"
-#include "InvokeMessage.h"
-#include "ServerMethods.h"
-#include "AllowedConnections.h"
-
-#include "jsapi.h"
-#include "nsCOMPtr.h"
-#include "nsStringAPI.h"
-#include "nsIJSContextStack.h"
-#include "nsIPrincipal.h"
-#include "nsServiceManagerUtils.h"
-
-#if GECKO_VERSION >= 2000
-#define JS_RemoveRootRT js_RemoveRoot
-static inline bool INT_FITS_IN_JSVAL(int i) {
-  return (i >= JSVAL_INT_MIN) && (i <= JSVAL_INT_MAX);
-}
-#endif //GECKO_VERSION
-
-static JSContext* getJSContext() {
-  // Get JSContext from stack.
-  nsCOMPtr<nsIJSContextStack> stack =
-      do_GetService("@mozilla.org/js/xpc/ContextStack;1");
-  if (!stack) {
-    return NULL;
-  }
-
-  JSContext *cx;
-  if (NS_FAILED(stack->Peek(&cx))) {
-    return NULL;
-  }
-
-  if (cx == nsnull) {
-    // TODO(jat): figure out why this can be null at plugin unload time
-    Debug::log(Debug::Error) << "GWT Dev Plugin: Null JS context" << Debug::flush;
-  }
-
-  return cx;
-}
-
-FFSessionHandler::FFSessionHandler(HostChannel* channel)
-    : SessionData(channel, this, getJSContext()), jsObjectId(0),
-    jsObjectsById(NULL), stringObjectClass(NULL) {
-  Debug::log(Debug::Debugging) << "FFSessionHandler::FFSessionHandler(this="
-      << this << ")" << Debug::flush;
-  // TODO(jat): is there a way to avoid calling this twice, without keeping
-  // JSContext in an instance field?
-  JSContext* ctx = getJSContext();
-  if (!JS_AddNamedObjectRoot(ctx, &jsObjectsById, "jsObjectsById")) {
-    Debug::log(Debug::Error) << "Error rooting jsObjectsById" << Debug::flush;
-  }
-  jsObjectsById = JS_NewArrayObject(ctx, 0, NULL);
-  if (!jsObjectsById) {
-    Debug::log(Debug::Error) << "Error rooting jsObjectsById" << Debug::flush;
-  }
-  if (!JS_AddNamedValueRoot(ctx, &toStringTearOff, "toStringTearOff")) {
-    Debug::log(Debug::Error) << "Error rooting toStringTearOff" << Debug::flush;
-  }
-  getStringObjectClass(ctx);
-  getToStringTearOff(ctx);
-}
-
-void FFSessionHandler::getStringObjectClass(JSContext* ctx) {
-  jsval str = JS_GetEmptyStringValue(ctx);
-  JSObject* obj = 0;
-  if (!JS_ValueToObject(ctx, str, &obj)) {
-    return;
-  }
-  if (!obj) {
-    return;
-  }
-  stringObjectClass = JS_GET_CLASS(ctx, obj);
-}
-
-void FFSessionHandler::getToStringTearOff(JSContext* ctx) {
-  jsval funcVal;
-
-  Debug::log(Debug::Debugging) << "Getting function \"__gwt_makeTearOff\""
-        << Debug::flush;
-
-  if (!JS_GetProperty(ctx, global, "__gwt_makeTearOff", &funcVal)
-      || funcVal == JSVAL_VOID) {
-    Debug::log(Debug::Error) << "Could not get function \"__gwt_makeTearOff\""
-        << Debug::flush;
-    return;
-  }
-  jsval jsargs[3] = {
-    JSVAL_NULL,                                     // no proxy
-    INT_TO_JSVAL(InvokeMessage::TOSTRING_DISP_ID),  // dispId
-    JSVAL_ZERO                                      // arg count is zero
-  };
-  if (!JS_CallFunctionValue(ctx, global, funcVal, 3, jsargs, &toStringTearOff)) {
-    jsval exc;
-    if (JS_GetPendingException(ctx, &exc)) {
-      Debug::log(Debug::Error)
-          << "__gwt_makeTearOff(null,0,0) threw exception "
-          << dumpJsVal(ctx, exc) << Debug::flush;
-    } else {
-      Debug::log(Debug::Error) << "Error creating toString tear-off"
-          << Debug::flush;
-    }
-    // TODO(jat): show some crash page and die
-  }
-}
-
-FFSessionHandler::~FFSessionHandler(void) {
-  Debug::log(Debug::Debugging) << "FFSessionHandler::~FFSessionHandler(this="
-      << this << ")" << Debug::flush;
-  disconnect();
-  if (runtime) {
-    JS_RemoveRootRT(runtime, &jsObjectsById);
-    jsObjectsById = NULL;
-    JS_RemoveRootRT(runtime, &toStringTearOff);
-    runtime = NULL;
-  }
-}
-
-void FFSessionHandler::disconnectDetectedImpl() {
-  JSContext* ctx = getJSContext();
-  if (!ctx) {
-    return;
-  }
-
-  Debug::log(Debug::Debugging) << "Getting function \"__gwt_disconnected\""
-        << Debug::flush;
-
-  jsval funcVal;
-  if (!JS_GetProperty(ctx, global, "__gwt_disconnected", &funcVal)
-      || funcVal == JSVAL_VOID) {
-    Debug::log(Debug::Error) << "Could not get function \"__gwt_disconnected\""
-        << Debug::flush;
-    return;
-  }
-  jsval rval;
-  JS_CallFunctionValue(ctx, global, funcVal, 0, 0, &rval);
-}
-
-void FFSessionHandler::freeValue(HostChannel& channel, int idCount, const int* ids) {
-  Debug::DebugStream& dbg = Debug::log(Debug::Spam)
-      << "FFSessionHandler::freeValue [ ";
-  JSContext* ctx = getJSContext();
-
-  for (int i = 0; i < idCount; ++i) {
-    int objId = ids[i];
-    dbg << objId << " ";
-    jsval toRemove;
-    if (JS_GetElement(ctx, jsObjectsById, objId, &toRemove) && 
-#ifdef JSVAL_IS_OBJECT
-       JSVAL_IS_OBJECT(toRemove)) {
-#else
-       !JSVAL_IS_PRIMITIVE(toRemove)) { 
-#endif
-      jsIdsByObject.erase(identityFromObject(JSVAL_TO_OBJECT(toRemove)));
-      JS_DeleteElement(ctx, jsObjectsById, objId);
-    } else {
-      Debug::log(Debug::Error) << "Error deleting js objId=" << objId << Debug::flush;
-    }
-  }
-
-  dbg << "]" << Debug::flush;
-}
-
-void FFSessionHandler::loadJsni(HostChannel& channel, const std::string& js) {
-  Debug::log(Debug::Spam) << "FFSessionHandler::loadJsni " << js << "(EOM)" << Debug::flush;
-  JSContext* ctx = getJSContext();
-  if (!JSRunner::eval(ctx, global, js)) {
-    Debug::log(Debug::Error) << "Error executing script" << Debug::flush;
-  }
-}
-
-void FFSessionHandler::sendFreeValues(HostChannel& channel) {
-  unsigned n = javaObjectsToFree.size();
-  if (n) {
-    scoped_array<int> ids(new int[n]);
-    int i = 0;
-    for (std::set<int>::iterator it = javaObjectsToFree.begin();
-        it != javaObjectsToFree.end(); ++it) {
-      ids[i++] = *it;
-    }
-    if (ServerMethods::freeJava(channel, this, n, ids.get())) {
-      javaObjectsToFree.clear();
-    }
-  }
-}
-
-void FFSessionHandler::fatalError(HostChannel& channel,
-    const std::string& message) {
-  // TODO(jat): implement
-}
-
-bool FFSessionHandler::invoke(HostChannel& channel, const gwt::Value& thisObj, const std::string& methodName,
-    int numArgs, const gwt::Value* const args, gwt::Value* returnValue) {
-  Debug::log(Debug::Debugging) << "FFSessionHandler::invoke " << thisObj.toString()
-      << "::" << methodName << Debug::flush;
-  JSContext* ctx = getJSContext();
-
-  // Used to root JSthis and args while making the JS call
-  // TODO(jat): keep one object and just keep a "stack pointer" into that
-  // object on the native stack so we don't keep allocating/rooting/freeing
-  // an object
-  RootedObject argsRoot(ctx, "FFSessionhandler::invoke");
-  argsRoot = JS_NewArrayObject(ctx, 0, NULL);
-  if (!JS_SetArrayLength(ctx, argsRoot.get(), numArgs + 1)) {
-    Debug::log(Debug::Error)
-        << "FFSessionhandler::invoke - could not set argsRoot length"
-        << Debug::flush;
-    return true;
-  }
-
-  jsval jsThis;
-  if (thisObj.isNull()) {
-    jsThis = OBJECT_TO_JSVAL(global);
-    Debug::log(Debug::Debugging) << " using global object for this" << Debug::flush;
-  } else {
-    makeJsvalFromValue(jsThis, ctx, thisObj);
-    if (Debug::level(Debug::Spam)) {
-      Debug::log(Debug::Spam) << "  obj=" << dumpJsVal(ctx, jsThis)
-          << Debug::flush;
-    }
-  }
-  if (!JS_SetElement(ctx, argsRoot.get(), 0, &jsThis)) {
-    Debug::log(Debug::Error)
-        << "FFSessionhandler::invoke - could not set argsRoot[0] to this"
-        << Debug::flush;
-    return true;
-  }
-
-  jsval funcVal;
-  // TODO: handle non-ASCII method names
-  if (!JS_GetProperty(ctx, global, methodName.c_str(), &funcVal)
-      || funcVal == JSVAL_VOID) {
-    Debug::log(Debug::Error) << "Could not get function " << methodName
-        << Debug::flush;
-    return true;
-  } 
-
-  scoped_array<jsval> jsargs(new jsval[numArgs]);
-  for (int i = 0; i < numArgs; ++i) {
-    makeJsvalFromValue(jsargs[i], ctx, args[i]);
-    if (Debug::level(Debug::Spam)) {
-      Debug::log(Debug::Spam) << "  arg[" << i << "] = " << dumpJsVal(ctx,
-          jsargs[i]) << Debug::flush;
-    }
-    if (!JS_SetElement(ctx, argsRoot.get(), i + 1, &jsargs[i])) {
-      Debug::log(Debug::Error)
-          << "FFSessionhandler::invoke - could not set args[" << (i + 1) << "]"
-          << Debug::flush;
-      return true;
-    }
-  }
-
-  if (JS_IsExceptionPending(ctx)) {
-    JS_ClearPendingException(ctx);
-  }
-
-  jsval rval;
-  JSBool ok = JS_CallFunctionValue(ctx, JSVAL_TO_OBJECT(jsThis), funcVal,
-      numArgs, jsargs.get(), &rval);
-
-  if (!ok) {
-    if (JS_GetPendingException(ctx, &rval)) {
-      makeValueFromJsval(*returnValue, ctx, rval);
-      Debug::log(Debug::Debugging) << "FFSessionHandler::invoke "
-          << thisObj.toString() << "::" << methodName << " threw exception "
-          << dumpJsVal(ctx, rval) << Debug::flush;
-    } else {
-      Debug::log(Debug::Error) << "Non-exception failure invoking "
-          << methodName << Debug::flush;
-      returnValue->setUndefined();
-    }
-  } else {
-    makeValueFromJsval(*returnValue, ctx, rval);
-  }
-  Debug::log(Debug::Spam) << "  return= " << *returnValue << Debug::flush;
-  return !ok;
-}
-
-/**
- * Invoke a plugin-provided method with the given args.  As above, this method does not own
- * any of its args.
- *
- * Returns true if an exception occurred.
- */
-bool FFSessionHandler::invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
-    const gwt::Value* const args, gwt::Value* returnValue)  {
-  Debug::log(Debug::Spam) << "FFSessionHandler::invokeSpecial" << Debug::flush;
-  return false;
-}
-
-/**
- * Convert UTF16 string to UTF8-encoded std::string.
- *
- * This is implemented here because the Mozilla libraries mangle certain UTF8
- * strings.
- *
- * @return UTF8-encoded string.
- */
-static std::string utf8String(const jschar* str, unsigned len) {
-  std::string utf8str;
-  while (len-- > 0) {
-    unsigned ch = *str++;
-    // check for paired surrogates first, leave unpaired surrogates as-is
-    if (ch >= 0xD800 && ch < 0xDC00 && len > 0 && *str >= 0xDC00 && *str < 0xE000) {
-      ch = ((ch & 1023) << 10) + (*str++ & 1023) + 0x10000;
-      len--;
-    }
-    if (ch < 0x80) {          // U+0000 - U+007F as 0xxxxxxx
-      utf8str.append(1, ch);
-    } else if (ch < 0x800) {  // U+0080 - U+07FF as 110xxxxx 10xxxxxx
-      utf8str.append(1, 0xC0 + ((ch >> 6) & 31));
-      utf8str.append(1, 0x80 + (ch & 63));
-    } else if (ch < 0x10000) { // U+0800 - U+FFFF as 1110xxxx 10xxxxxx 10xxxxxx
-      utf8str.append(1, 0xE0 + ((ch >> 12) & 15));
-      utf8str.append(1, 0x80 + ((ch >> 6) & 63));
-      utf8str.append(1, 0x80 + (ch & 63));
-    } else {  // rest as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-      utf8str.append(1, 0xF0 + ((ch >> 18) & 7));
-      utf8str.append(1, 0x80 + ((ch >> 12) & 63));
-      utf8str.append(1, 0x80 + ((ch >> 6) & 63));
-      utf8str.append(1, 0x80 + (ch & 63));
-    }
-  }
-  return utf8str;
-}
-
-/**
- * Creates a JSString from a UTF8-encoded std::string.
- *
- * This is implemented here because the Mozilla libraries mangle certain UTF8
- * strings.
- *
- * @return the JSString object, which owns its memory buffer.
- */
-static JSString* stringUtf8(JSContext* ctx, const std::string& utf8str) {
-  unsigned len = 0;
-  for (unsigned i = 0; i < utf8str.length(); ++i) {
-    char ch = utf8str[i];
-    switch (ch & 0xF8) {
-      // continuation & invalid chars
-      default:
-      // ASCII characters
-      case 0x00: case 0x08: case 0x10: case 0x18:
-      case 0x20: case 0x28: case 0x30: case 0x38:
-      case 0x40: case 0x48: case 0x50: case 0x58:
-      case 0x60: case 0x68: case 0x70: case 0x78:
-      // 2-byte UTF8 characters
-      case 0xC0: case 0xC8: case 0xD0: case 0xD8:
-      // 3-byte UTF8 characters
-      case 0xE0: case 0xE8:
-        ++len;
-        break;
-      case 0xF0:
-        len += 2;
-        break;
-    }
-  }
-  // Account for null terminator even if it isn't included in the string length
-  // Note that buf becomes owned by the JSString and must not be freed here.
-  jschar* buf = static_cast<jschar*>(JS_malloc(ctx, (len + 1) * sizeof(jschar)));
-  if (!buf) {
-    return NULL;
-  }
-  jschar* p = buf;
-  unsigned codePoint;
-  int charsLeft = -1;
-  for (unsigned i = 0; i < utf8str.length(); ++i) {
-    char ch = utf8str[i];
-    if (charsLeft >= 0) {
-      if ((ch & 0xC0) != 0x80) {
-        // invalid, missing continuation character
-        *p++ = static_cast<jschar>(0xFFFD);
-        charsLeft = -1;
-      } else {
-        codePoint = (codePoint << 6) | (ch & 63);
-        if (!--charsLeft) {
-          if (codePoint >= 0x10000) {
-            codePoint -= 0x10000;
-            *p++ = static_cast<jschar>(0xD800 + ((codePoint >> 10) & 1023));
-            *p++ = static_cast<jschar>(0xDC00 + (codePoint & 1023));
-          } else {
-            *p++ = static_cast<jschar>(codePoint);
-          }
-          charsLeft = -1;
-        }
-      }
-      continue;
-    }
-    // Look at the top 5 bits to determine how many bytes are in this character.
-    switch (ch & 0xF8) {
-      default: // skip invalid and continuation chars
-        break;
-      case 0x00: case 0x08: case 0x10: case 0x18:
-      case 0x20: case 0x28: case 0x30: case 0x38:
-      case 0x40: case 0x48: case 0x50: case 0x58:
-      case 0x60: case 0x68: case 0x70: case 0x78:
-        *p++ = static_cast<jschar>(ch);
-        break;
-      case 0xC0: case 0xC8: case 0xD0: case 0xD8:
-        charsLeft = 1;
-        codePoint = ch & 31;
-        break;
-      case 0xE0: case 0xE8:
-        charsLeft = 2;
-        codePoint = ch & 15;
-        break;
-      case 0xF0:
-        charsLeft = 3;
-        codePoint = ch & 7;
-        break;
-    }
-  }
-  // null terminator, apparently some code expects a terminator even though
-  // the strings are counted.  Note that this null word should not be included
-  // in the length, and that the buffer becomes owned by the JSString object.
-  *p = 0;
-  return JS_NewUCString(ctx, buf, p - buf);
-}
-
-void FFSessionHandler::makeValueFromJsval(gwt::Value& retVal, JSContext* ctx,
-    const jsval& value) {
-  if (JSVAL_IS_VOID(value)) {
-    retVal.setUndefined();
-  } else if (JSVAL_IS_NULL(value)) {
-    retVal.setNull();
-  } else if (JSVAL_IS_INT(value)) {
-    retVal.setInt(JSVAL_TO_INT(value));
-  } else if (JSVAL_IS_BOOLEAN(value)) {
-    retVal.setBoolean(JSVAL_TO_BOOLEAN(value));
-  } else if (JSVAL_IS_STRING(value)) {
-    JSString* str = JSVAL_TO_STRING(value);
-#if GECKO_VERSION < 2000
-    retVal.setString(utf8String(JS_GetStringChars(str),
-        JS_GetStringLength(str)));
-#else
-    retVal.setString(utf8String(JS_GetStringCharsZ(ctx, str),
-        JS_GetStringLength(str)));
-#endif //GECKO_VERSION
-  } else if (JSVAL_IS_DOUBLE(value)) {
-    retVal.setDouble(JSVAL_TO_DOUBLE(value));
-#ifdef JSVAL_IS_OBJECT
-  } else if (JSVAL_IS_OBJECT(value)) {
-#else
-  } else if (!JSVAL_IS_PRIMITIVE(value)) {
-#endif
-    JSObject* obj = JSVAL_TO_OBJECT(value);
-    if (JavaObject::isJavaObject(ctx, obj)) {
-      retVal.setJavaObject(JavaObject::getObjectId(ctx, obj));
-    } else if (JS_GET_CLASS(ctx, obj) == stringObjectClass) {
-      // JS String wrapper object, treat as a string primitive
-      JSString* str = JS_ValueToString(ctx, value);
-#if GECKO_VERSION < 2000
-    retVal.setString(utf8String(JS_GetStringChars(str),
-        JS_GetStringLength(str)));
-#else
-    retVal.setString(utf8String(JS_GetStringCharsZ(ctx, str),
-        JS_GetStringLength(str)));
-#endif //GECKO_VERSION
-      // str will be garbage-collected, does not need to be freed
-    } else {
-      // It's a plain-old JavaScript Object
-      void* objKey = identityFromObject(obj);
-      std::map<void*, int>::iterator it = jsIdsByObject.find(objKey);
-      if (it != jsIdsByObject.end()) {
-        retVal.setJsObjectId(it->second);
-      } else {
-        // Allocate a new id
-        int objId = ++jsObjectId;
-        JS_SetElement(ctx, jsObjectsById, objId, const_cast<jsval*>(&value));
-        jsIdsByObject[objKey] = objId;
-        retVal.setJsObjectId(objId);
-      }
-    }
-  } else {
-    Debug::log(Debug::Error) << "Unhandled jsval type " << Debug::flush;
-    retVal.setString("Unhandled jsval type");
-  }
-}
-
-void FFSessionHandler::makeJsvalFromValue(jsval& retVal, JSContext* ctx,
-    const gwt::Value& value) {
-  switch (value.getType()) {
-    case gwt::Value::NULL_TYPE:
-      retVal = JSVAL_NULL;
-      break;
-    case gwt::Value::BOOLEAN:
-      retVal = BOOLEAN_TO_JSVAL(value.getBoolean());
-      break;
-    case gwt::Value::BYTE:
-      retVal = INT_TO_JSVAL((int) value.getByte());
-      break;
-    case gwt::Value::CHAR:
-      retVal = INT_TO_JSVAL((int) value.getChar());
-      break;
-    case gwt::Value::SHORT:
-      retVal = INT_TO_JSVAL((int) value.getShort());
-      break;
-    case gwt::Value::INT: {
-      int intValue = value.getInt();
-      if (INT_FITS_IN_JSVAL(intValue)) {
-        retVal = INT_TO_JSVAL(intValue);
-      } else {
-        JS_NewNumberValue(ctx, (jsdouble) intValue, &retVal);
-      }
-      break;
-    }
-    // TODO(jat): do we still need long support in the wire format and Value?
-//    case gwt::Value::LONG:
-//      retVal = value.getLong();
-//      break;
-    case gwt::Value::FLOAT:
-      JS_NewNumberValue(ctx, (jsdouble) value.getFloat(), &retVal);
-      break;
-    case gwt::Value::DOUBLE:
-      JS_NewNumberValue(ctx, (jsdouble) value.getDouble(), &retVal);
-      break;
-    case gwt::Value::STRING:
-      {
-        JSString* str = stringUtf8(ctx, value.getString());
-        retVal = STRING_TO_JSVAL(str);
-      }
-      break;
-    case gwt::Value::JAVA_OBJECT:
-      {
-        int javaId = value.getJavaObjectId();
-        std::map<int, JSObject*>::iterator i = javaObjectsById.find(javaId);
-        if (i == javaObjectsById.end()) {
-          JSObject* obj = JavaObject::construct(ctx, this, javaId);
-          javaObjectsById[javaId] = obj;
-          // We may have previously released the proxy for the same object id,
-          // but have not yet sent a free message back to the server.
-          javaObjectsToFree.erase(javaId);
-          retVal = OBJECT_TO_JSVAL(obj);
-        } else {
-          retVal = OBJECT_TO_JSVAL(i->second);
-        }
-      }
-      break;
-    case gwt::Value::JS_OBJECT:
-      {
-        int jsId = value.getJsObjectId();
-        if (!JS_GetElement(ctx, jsObjectsById, jsId, &retVal)) {
-          Debug::log(Debug::Error) << "Error getting jsObject with id " << jsId << Debug::flush;
-        }
-#ifdef JSVAL_IS_OBJECT
-        if (!JSVAL_IS_OBJECT(retVal)) {
-#else
-        if (JSVAL_IS_PRIMITIVE(retVal)) {
-#endif
-          Debug::log(Debug::Error) << "Missing jsObject with id " << jsId << Debug::flush;
-        }
-      }
-      break;
-    case gwt::Value::UNDEFINED:
-      retVal = JSVAL_VOID;
-      break;
-    default:
-      Debug::log(Debug::Error) << "Unknown Value type " << value.toString() << Debug::flush;
-  }
-}
-
-void FFSessionHandler::freeJavaObject(int objectId) {
-  if (!javaObjectsById.erase(objectId)) {
-    Debug::log(Debug::Error) << "Trying to free unknown JavaObject: " << objectId << Debug::flush;
-    return;
-  }
-  javaObjectsToFree.insert(objectId);
-}
-
-void FFSessionHandler::disconnect() {
-  Debug::log(Debug::Debugging) << "FFSessionHandler::disconnect" << Debug::flush;
-  JSContext* ctx = getJSContext();
-  bool freeCtx = false;
-  if (!ctx) {
-    Debug::log(Debug::Debugging) << "  creating temporary context"
-        << Debug::flush;
-    freeCtx = true;
-    ctx = JS_NewContext(runtime, 8192);
-    if (ctx) {
-      JS_SetOptions(ctx, JSOPTION_VAROBJFIX);
-#ifdef JSVERSION_LATEST
-      JS_SetVersion(ctx, JSVERSION_LATEST);
-#endif
-    }
-  }
-  if (ctx) {
-    JS_BeginRequest(ctx);
-    for (std::map<int, JSObject*>::iterator it = javaObjectsById.begin();
-        it != javaObjectsById.end(); ++it) {
-      int javaId = it->first;
-      JSObject* obj = it->second;
-      if (JavaObject::isJavaObject(ctx, obj)) {
-        // clear the SessionData pointer -- JavaObject knows it is
-        // disconnected if this is null
-        MOZ_JS_SetPrivate(ctx, obj, NULL);
-        javaObjectsToFree.erase(javaId);
-      }
-    }
-    JS_EndRequest(ctx);
-    if (freeCtx) {
-      JS_DestroyContext(ctx);
-    }
-  } else {
-    Debug::log(Debug::Warning)
-        << "FFSessionHandler::disconnect - no context available"
-        << Debug::flush;
-  }
-  HostChannel* channel = getHostChannel();
-  if (channel->isConnected()) {
-    channel->disconnectFromHost();
-  }
-}
-
-void* FFSessionHandler::identityFromObject(JSObject* obj) {
-  JSContext* ctx = getJSContext();
-  jsval rval;
-  void* returnValue = obj;
-  if (JS_GetProperty(ctx, obj, "wrappedJSObject", &rval)
-#ifdef JSVAL_IS_OBJECT
-      && JSVAL_IS_OBJECT(rval)) {
-#else
-      && !JSVAL_IS_PRIMITIVE(rval)) {
-#endif
-    returnValue = JSVAL_TO_OBJECT(rval);
-    Debug::log(Debug::Info) << "identityFromObject mapped " << obj << " to "
-        << returnValue << Debug::flush;
-  }
-  return returnValue;
-}
diff --git a/plugins/xpcom/FFSessionHandler.h b/plugins/xpcom/FFSessionHandler.h
deleted file mode 100755
index f7941bf..0000000
--- a/plugins/xpcom/FFSessionHandler.h
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef _H_FFSessionHandler
-#define _H_FFSessionHandler
-/*
- * 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.
- */
-
-#include <set>
-#include <map>
-
-#include "mozincludes.h"
-#include "SessionData.h"
-#include "Preferences.h"
-
-#include "jsapi.h"
-
-class HostChannel;
-namespace gwt {
-  class Value;
-}
-
-class FFSessionHandler : public SessionData, public SessionHandler {
-  friend class JavaObject;
-public:
-  FFSessionHandler(HostChannel* channel);
-  ~FFSessionHandler(void);
-  virtual void makeValueFromJsval(gwt::Value& retVal, JSContext* ctx,
-      const jsval& value);
-  virtual void makeJsvalFromValue(jsval& retVal, JSContext* ctx,
-      const gwt::Value& value);
-  virtual void freeJavaObject(int objectId);
-  void disconnect();
-
-protected:
-  virtual void disconnectDetectedImpl();
-  virtual void freeValue(HostChannel& channel, int idCount, const int* ids);
-  virtual void loadJsni(HostChannel& channel, const std::string& js);
-  virtual bool invoke(HostChannel& channel, const gwt::Value& thisObj, const std::string& methodName,
-      int numArgs, const gwt::Value* const args, gwt::Value* returnValue);
-  virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs,
-      const gwt::Value* const args, gwt::Value* returnValue);
-  virtual void sendFreeValues(HostChannel& channel);
-  virtual void fatalError(HostChannel& channel, const std::string& message);
-
-private:
-  void getStringObjectClass(JSContext* ctx);
-  void getToStringTearOff(JSContext* ctx);
-  void* identityFromObject(JSObject* obj);
-
-  int jsObjectId;
-
-  std::map<int, JSObject*> javaObjectsById;
-  std::set<int> javaObjectsToFree;
-
-  // Array of JSObjects exposed to the host
-  JSObject* jsObjectsById;
-  JSClass* stringObjectClass;
-
-  std::map<void*, int> jsIdsByObject;
-};
-
-#endif
diff --git a/plugins/xpcom/IOOPHM.idl b/plugins/xpcom/IOOPHM.idl
deleted file mode 100644
index 1aeea54..0000000
--- a/plugins/xpcom/IOOPHM.idl
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "nsISupports.idl"
-
-interface nsIDOMWindow;
-
-[scriptable, uuid(90CEF17B-C3FE-4251-AF68-4381B3D938A0)]
-interface IOOPHM : nsISupports
-{
-  boolean init(in nsIDOMWindow window);
-  boolean connect(in ACString url, in ACString sessionKey, in ACString addr,
-  in ACString moduleName, in ACString hostedHtmlVersion);
-};
diff --git a/plugins/xpcom/IOOPHM.xpt b/plugins/xpcom/IOOPHM.xpt
deleted file mode 100644
index 4be87b7..0000000
--- a/plugins/xpcom/IOOPHM.xpt
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/JSRunner.cpp b/plugins/xpcom/JSRunner.cpp
deleted file mode 100755
index f5b3a8a..0000000
--- a/plugins/xpcom/JSRunner.cpp
+++ /dev/null
@@ -1,142 +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.
- */
-
-#include "Debug.h"
-#include "JSRunner.h"
-
-#include "nsCOMPtr.h"
-#include "nsIPrincipal.h"
-#include "nsIScriptGlobalObject.h"
-#include "nsIScriptObjectPrincipal.h"
-#include "nsIURI.h"
-#include "nsIXPConnect.h"
-#if GECKO_VERSION >= 13000
-#include "nsJSPrincipals.h"
-#endif
-#include "nsStringAPI.h"
-
-// from js_runner_ff.cc in Gears (http://code.google.com/p/gears/)
-
-bool JSRunner::eval(JSContext* ctx, JSObject* object, const std::string& script) {
-  // To eval the script, we need the JSPrincipals to be acquired through
-  // nsIPrincipal.  nsIPrincipal can be queried through the
-  // nsIScriptObjectPrincipal interface on the Script Global Object.  In order
-  // to get the Script Global Object, we need to request the private data
-  // associated with the global JSObject on the current context.
-  nsCOMPtr<nsIScriptGlobalObject> sgo;
-  nsISupports *priv = reinterpret_cast<nsISupports *>(JS_GetPrivate(
-#if GECKO_VERSION < 13000
-                                                          ctx,
-#endif
-                                                          object));
-  nsCOMPtr<nsIXPConnectWrappedNative> wrapped_native = do_QueryInterface(priv);
-
-  if (wrapped_native) {
-    // The global object is a XPConnect wrapped native, the native in
-    // the wrapper might be the nsIScriptGlobalObject.
-    sgo = do_QueryWrappedNative(wrapped_native);
-  } else {
-    sgo = do_QueryInterface(priv);
-  }
-
-  JSPrincipals *jsprin = nsnull;
-  std::string virtual_filename;
-  nsresult nr;
-
-  nsCOMPtr<nsIScriptObjectPrincipal> obj_prin = do_QueryInterface(sgo, &nr);
-  if (NS_FAILED(nr)) {
-    Debug::log(Debug::Error) << "Error getting object principal" << Debug::flush;
-    return false;
-  }
-
-  nsIPrincipal *principal = obj_prin->GetPrincipal();
-  if (!principal) {
-    Debug::log(Debug::Error) << "Error getting principal" << Debug::flush;
-    return false;
-  }
-
-  // Get the script scheme and host from the principal.  This is the URI that
-  // Firefox treats this script as running from.
-
-  // If the codebase is null, the script may be running from a chrome context.
-  // In that case, don't construct a virtual filename.
-
-  nsCOMPtr<nsIURI> codebase;
-  nr = principal->GetURI(getter_AddRefs(codebase));
-  if (codebase) { 
-    nsCString scheme;
-    nsCString host;
-
-    if (NS_FAILED(codebase->GetScheme(scheme)) ||
-        NS_FAILED(codebase->GetHostPort(host))) {
-      Debug::log(Debug::Error) << "Error getting codebase" << Debug::flush;
-      return false;
-    }
-
-    // Build a virtual filename that we'll run as.  This is to workaround
-    // http://lxr.mozilla.org/seamonkey/source/dom/src/base/nsJSEnvironment.cpp#500
-    // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=387477
-    // The filename is being used as the security origin instead of the principal.
-    // TODO(zork): Remove this section if this bug is resolved.
-    virtual_filename = std::string(scheme.BeginReading());
-    virtual_filename += "://";
-    virtual_filename += host.BeginReading();
-  }
-
-#if GECKO_VERSION >= 13000
-  jsprin = nsJSPrincipals::get(principal);
-#else
-  principal->GetJSPrincipals(ctx, &jsprin);
-#endif
-
-  if (jsprin == nsnull) {
-    Debug::log(Debug::Error) << "Get JSPrincial failed at JSRunner::eval"
-        << Debug::flush;
-    return false;
-  }
-
-  // Set up the JS stack so that our context is on top.  This is needed to
-  // play nicely with plugins that access the context stack, such as Firebug.
-//  nsCOMPtr<nsIJSContextStack> stack =
-//      do_GetService("@mozilla.org/js/xpc/ContextStack;1");
-//  if (!stack) { return false; }
-//
-//  stack->Push(js_engine_context_);
-
-  uintN line_number_start = 0;
-  jsval rval;
-  JSBool js_ok = JS_EvaluateScriptForPrincipals(ctx, object, jsprin,
-      script.c_str(), script.length(), virtual_filename.c_str(),
-      line_number_start, &rval);
-
-  // Restore the context stack.
-//  JSContext *cx;
-//  stack->Pop(&cx);
-
-  // Decrements ref count on jsprin (Was added in GetJSPrincipals()).
-#if GECKO_VERSION >= 13000
-  (void) JS_DropPrincipals(JS_GetRuntime(ctx), jsprin);
-#else
-  (void) JSPRINCIPALS_DROP(ctx, jsprin);
-#endif
-  if (!js_ok) {
-    Debug::log(Debug::Error) << "JS execution failed in JSRunner::eval"
-        << Debug::flush;
-    return false;
-  }
-
-  return true;
-}
diff --git a/plugins/xpcom/JSRunner.h b/plugins/xpcom/JSRunner.h
deleted file mode 100755
index 733970e..0000000
--- a/plugins/xpcom/JSRunner.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _H_JSRunner
-#define _H_JSRunner
-/*
- * 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.
- */
-
-#include <string>
-
-#include "mozincludes.h"
-#include "jsapi.h"
-
-class JSRunner {
-public:
-  static bool eval(JSContext* ctx, JSObject* global, const std::string& script);
-};
-
-#endif
diff --git a/plugins/xpcom/JavaObject.cpp b/plugins/xpcom/JavaObject.cpp
deleted file mode 100644
index 9940fa9..0000000
--- a/plugins/xpcom/JavaObject.cpp
+++ /dev/null
@@ -1,506 +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.
- */
-
-#include "JavaObject.h"
-#include "FFSessionHandler.h"
-#include "SessionData.h"
-#include "ServerMethods.h"
-#include "Debug.h"
-#include "XpcomDebug.h"
-#include "HostChannel.h"
-#include "InvokeMessage.h"
-#include "ReturnMessage.h"
-#include "scoped_ptr/scoped_ptr.h"
-
-static JSClass JavaObjectClass = {
-  "GWTJavaObject", /* class name */
-  JSCLASS_HAS_PRIVATE | JSCLASS_HAS_RESERVED_SLOTS(1) | JSCLASS_NEW_ENUMERATE, /* flags */
-
-  JS_PropertyStub, /* add property */
-  JS_PropertyStub, /* delete property */
-#if GECKO_VERSION < 15000
-  JavaObject::getProperty, /* get property */
-  JavaObject::setProperty, /* set property */
-#else
-  JavaObject::getPropertyWrapper,
-  JavaObject::setPropertyWrapper,
-#endif //GECHO_VERSION
-
-  reinterpret_cast<JSEnumerateOp>(JavaObject::enumerate), /* enumerate */
-  JS_ResolveStub, /* resolve */
-  JS_ConvertStub, // JavaObject::convert, /* convert */
-  JavaObject::finalize, /* finalize */ //TODO
-
-#if GECKO_VERSION < 13000
-  NULL, /* object hooks */
-#endif
-  NULL, /* check access */
-#if GECKO_VERSION < 2000
-  JavaObject::call, /* call */ //TODO
-#else
-  JavaObject::call20, /* call: compatability wrapper for 2.0+ */
-#endif //GECKO_VERSION
-  NULL, /* construct */
-  NULL, /* object serialization */
-  NULL, /* has instance */
-  NULL, /* mark */
-  NULL /* reserve slots */
-};
-
-int JavaObject::getObjectId(JSContext* ctx, JSObject* obj) {
-  jsval val;
-  JSClass* jsClass = JS_GET_CLASS(ctx, obj);
-  if (jsClass != &JavaObjectClass) {
-    Debug::log(Debug::Error)
-        << "JavaObject::getObjectId called on non-JavaObject: " << jsClass->name
-        << Debug::flush;
-    return -1;
-  }
-  if (JSCLASS_RESERVED_SLOTS(jsClass) < 1) {
-    Debug::log(Debug::Error)
-        << "JavaObject::getObjectId -- " << static_cast<void*>(obj)
-        << " has only " << (JSCLASS_RESERVED_SLOTS(jsClass))
-        << " reserved slots, no objectId present" << Debug::flush;
-    return -1;
-  }
-
-
-#if GECKO_VERSION >= 13000
-  val = JS_GetReservedSlot(obj, 0);
-#else
-  if (!JS_GetReservedSlot(ctx, obj, 0, &val)) {
-    Debug::log(Debug::Error) << "Error getting reserved slot" << Debug::flush;
-    return -1;
-  }
-#endif
-
-  // TODO: assert JSVAL_IS_INT(val)
-  return JSVAL_TO_INT(val);
-}
-
-SessionData* JavaObject::getSessionData(JSContext* ctx, JSObject* obj) {
-  void* data = JS_GetInstancePrivate(ctx, obj, &JavaObjectClass, NULL);
-  return static_cast<SessionData*>(data);
-}
-
-
-bool JavaObject::isJavaObject(JSContext* ctx, JSObject* obj) {
-  return JS_GET_CLASS(ctx, obj) == &JavaObjectClass;
-}
-
-JSObject* JavaObject::construct(JSContext* ctx, SessionData* data, int objectRef) {
-  // TODO: prototype? parent?
-  Debug::log(Debug::Spam) << "JavaObject::construct objectId=" << objectRef << Debug::flush;
-  JSObject* obj = JS_NewObject(ctx, &JavaObjectClass, NULL, NULL);
-  Debug::log(Debug::Spam) << "  obj=" << obj << Debug::flush;
-  if (!obj) {
-    return NULL;
-  }
-  // set the session data
-#if GECKO_VERSION >= 13000
-  MOZ_JS_SetPrivate(ctx, obj, data);
-#else
-  if (!MOZ_JS_SetPrivate(ctx, obj, data)) {
-    Debug::log(Debug::Error) << "Could not set private data" << Debug::flush;
-    return NULL;
-  }
-#endif
-
-  #if GECKO_VERSION >= 13000
-  MOZ_JS_SetReservedSlot(ctx, obj, 0, INT_TO_JSVAL(objectRef));
-  #else
-  // set the objectId
-  if (!MOZ_JS_SetReservedSlot(ctx, obj, 0, INT_TO_JSVAL(objectRef))) {
-    Debug::log(Debug::Error) << "Could not set reserved slot" << Debug::flush;
-    return NULL;
-  }
-  #endif
-
-  // define toString (TODO: some way to avoid doing this each time)
-#if GECKO_VERSION < 2000
-  if (!JS_DefineFunction(ctx, obj, "toString", JavaObject::toString, 0, 0)) {
-    Debug::log(Debug::Error) << "Could not define toString method on object"
-        << Debug::flush;
-  }
-#else
-  if (!JS_DefineFunction(ctx, obj, "toString", JavaObject::toString20, 0, 0)) {
-    Debug::log(Debug::Error) << "Could not define toString method on object"
-        << Debug::flush;
-  }
-#endif //GECKO_VERSION
-  return obj;
-}
-
-#if GECKO_VERSION >= 15000
-JSBool JavaObject::getPropertyWrapper(JSContext* ctx, JSHandleObject obj,
-    JSHandleId id, jsval *vp) {
-#if GECKO_VERSION >= 16000
-  return JavaObject::getProperty(ctx, obj.get(), id.get(), vp);
-#else
-  return JavaObject::getProperty(ctx, obj.value(), id.value(), vp);
-#endif
-}
-#endif
-
-JSBool JavaObject::getProperty(JSContext* ctx, JSObject* obj, jsid id,
-    jsval* rval) {
-  Debug::log(Debug::Spam) << "JavaObject::getProperty obj=" << obj << Debug::flush;
-  SessionData* data = JavaObject::getSessionData(ctx, obj);
-  if (!data) {
-    // TODO: replace the frame with an error page instead?
-    *rval = JSVAL_VOID;
-    return JS_TRUE;
-  }
-  int objectRef = JavaObject::getObjectId(ctx, obj);
-  if (JSID_IS_STRING(id)) {
-    JSString* str = JSID_TO_STRING(id);
-    if ((JS_GetStringEncodingLength(ctx, str) == 8) && !strncmp("toString",
-          JS_EncodeString(ctx, str), 8)) {
-      *rval = data->getToStringTearOff();
-      return JS_TRUE;
-    }
-    if ((JS_GetStringEncodingLength(ctx, str) == 2) && !strncmp("id",
-          JS_EncodeString(ctx, str), 2)) {
-      *rval = INT_TO_JSVAL(objectRef);
-      return JS_TRUE;
-    }
-    if ((JS_GetStringEncodingLength(ctx, str) == 16) && !strncmp("__noSuchMethod__",
-          JS_EncodeString(ctx, str), 16)) {
-      // Avoid error spew if we are disconnected
-      *rval = JSVAL_VOID;
-      return JS_TRUE;
-    }
-    // TODO: dumpJsVal can no longer handle this case
-    //Debug::log(Debug::Error) << "Getting unexpected string property "
-    //    << dumpJsVal(ctx, id) << Debug::flush;
-    // TODO: throw a better exception here
-    return JS_FALSE;
-  }
-  if (!JSID_IS_INT(id)) {
-    // TODO: dumpJsVal can no longer handle this case
-    //Debug::log(Debug::Error) << "Getting non-int/non-string property "
-    //      << dumpJsVal(ctx, id) << Debug::flush;
-    // TODO: throw a better exception here
-    return JS_FALSE;
-  }
-  int dispId = JSID_TO_INT(id);
-
-  HostChannel* channel = data->getHostChannel();
-  SessionHandler* handler = data->getSessionHandler();
-
-  gwt::Value value = ServerMethods::getProperty(*channel, handler, objectRef, dispId);
-  data->makeJsvalFromValue(*rval, ctx, value);
-  return JS_TRUE;
-}
-
-#if GECKO_VERSION >= 15000
-JSBool JavaObject::setPropertyWrapper(JSContext* ctx, JSHandleObject obj,
-    JSHandleId id, JSBool strict, jsval *vp) {
-#if GECKO_VERSION >= 16000
-  return setProperty(ctx, obj.get(), id.get(), strict, vp);
-#else
-  return setProperty(ctx, obj.value(), id.value(), strict, vp);
-#endif
-}
-#endif
-
-#if GECKO_VERSION < 2000
-JSBool JavaObject::setProperty(JSContext* ctx, JSObject* obj, jsid id,
-    jsval* vp) {
-#else
-JSBool JavaObject::setProperty(JSContext* ctx, JSObject* obj, jsid id,
-    JSBool strict, jsval* vp) {
-#endif //GECKO_VERSION
-
-  Debug::log(Debug::Spam) << "JavaObject::setProperty obj=" << obj << Debug::flush;
-  if (!JSID_IS_INT(id)) {
-    Debug::log(Debug::Error) << "  Error: setting string property id" << Debug::flush;
-    // TODO: throw a better exception here
-    return JS_FALSE;
-  }
-
-  SessionData* data = JavaObject::getSessionData(ctx, obj);
-  if (!data) {
-    return JS_TRUE;
-  }
-
-  int objectRef = JavaObject::getObjectId(ctx, obj);
-  int dispId = JSID_TO_INT(id);
-
-  gwt::Value value;
-  data->makeValueFromJsval(value, ctx, *vp);
-
-  HostChannel* channel = data->getHostChannel();
-  SessionHandler* handler = data->getSessionHandler();
-
-  if (!ServerMethods::setProperty(*channel, handler, objectRef, dispId, value)) {
-    // TODO: throw a better exception here
-    return JS_FALSE;
-  }
-  return JS_TRUE;
-}
-
-// TODO: can this be removed now?
-JSBool JavaObject::convert(JSContext* ctx, JSObject* obj, JSType type, jsval* vp) {
-  Debug::log(Debug::Spam) << "JavaObject::convert obj=" << obj
-      << " type=" << type << Debug::flush;
-  switch (type) {
-    case JSTYPE_STRING:
-      return toString(ctx, obj, 0, NULL, vp);
-    case JSTYPE_VOID:
-      *vp = JSVAL_VOID;
-      return JS_TRUE;
-    case JSTYPE_NULL:
-      *vp = JSVAL_NULL;
-      return JS_TRUE;
-    case JSTYPE_OBJECT:
-      *vp = OBJECT_TO_JSVAL(obj);
-      return JS_TRUE;
-    default:
-      break;
-  }
-  return JS_FALSE;
-}
-
-/**
- * List of property names we want to fake on wrapped Java objects.
- */
-static const char* propertyNames[] = {
-    "toString",
-    "id",
-};
-#define NUM_PROPERTY_NAMES (sizeof(propertyNames) / sizeof(propertyNames[0]))
-
-JSBool JavaObject::enumerate(JSContext* ctx, JSObject* obj, JSIterateOp op,
-    jsval* statep, jsid* idp) {
-  int objectId = JavaObject::getObjectId(ctx, obj);
-  switch (op) {
-    case JSENUMERATE_INIT:
-      Debug::log(Debug::Spam) << "JavaObject::enumerate(oid=" << objectId
-          << ", INIT)" << Debug::flush;
-      *statep = JSVAL_ZERO;
-      if (idp) {
-        *idp = INT_TO_JSID(NUM_PROPERTY_NAMES);
-      }
-      break;
-    case JSENUMERATE_NEXT:
-    {
-      int idNum = JSVAL_TO_INT(*statep);
-      Debug::log(Debug::Spam) << "JavaObject::enumerate(oid=" << objectId
-          << ", NEXT " << idNum << ")" << Debug::flush;
-      *statep = INT_TO_JSVAL(idNum + 1);
-      if (idNum >= NUM_PROPERTY_NAMES) {
-        *statep = JSVAL_NULL;
-#if GECKO_VERSION < 2000
-	//TODO(jat): do we need to do this?
-        *idp = JSVAL_NULL;
-#endif //GECKO_VERSION
-      } else {
-        const char* propName = propertyNames[idNum];
-        JSString* str = JS_NewStringCopyZ(ctx, propName);
-        return JS_ValueToId(ctx, STRING_TO_JSVAL(str), idp);
-      }
-      break;
-    }
-    case JSENUMERATE_DESTROY:
-      Debug::log(Debug::Spam) << "JavaObject::enumerate(oid=" << objectId
-          << ", DESTROY)" << Debug::flush;
-      *statep = JSVAL_NULL;
-      break;
-    default:
-      Debug::log(Debug::Error) << "Unknown Enumerate op " <<
-          static_cast<int>(op) << Debug::flush;
-      return JS_FALSE;
-  }
-  return JS_TRUE;
-}
-
-#if GECKO_VERSION >= 14000
-void JavaObject::finalize(JSFreeOp* fop, JSObject* obj) {
-  // In general use of JS_GetPrivate is not safe but it is OK in the finalizer
-  // according to:
-  // https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetPrivate
-  // We will not be using getSession for that reason.
-  SessionData * data = static_cast<SessionData*>(JS_GetPrivate(obj));
-  if (data) {
-    jsval val = JS_GetReservedSlot(obj, 0);
-    int objectId = JSVAL_TO_INT(val);
-    data->freeJavaObject(objectId);
-    MOZ_JS_SetPrivate(/** Post-FF13 requires no ctx anyways*/ NULL, obj, NULL);
-  }
-}
-#else
-void JavaObject::finalize(JSContext* ctx, JSObject* obj) {
-  Debug::log(Debug::Spam) << "JavaObject::finalize obj=" << obj
-      << " objId=" << JavaObject::getObjectId(ctx, obj) << Debug::flush;
-  SessionData* data = JavaObject::getSessionData(ctx, obj);
-  if (data) {
-    int objectId = JavaObject::getObjectId(ctx, obj);
-    data->freeJavaObject(objectId);
-    MOZ_JS_SetPrivate(ctx, obj, NULL);
-  }
-}
-#endif
-
-JSBool JavaObject::toString(JSContext* ctx, JSObject* obj, uintN argc,
-    jsval* argv, jsval* rval) {
-  SessionData* data = JavaObject::getSessionData(ctx, obj);
-  if (!data) {
-    *rval = JSVAL_VOID;
-    return JS_TRUE;
-  }
-  int oid = getObjectId(ctx, obj);
-  Debug::log(Debug::Spam) << "JavaObject::toString(id=" << oid << ")"
-      << Debug::flush;
-  gwt::Value javaThis;
-  javaThis.setJavaObject(oid);
-  // we ignore any supplied parameters
-  return invokeJava(ctx, data, javaThis, InvokeMessage::TOSTRING_DISP_ID, 0,
-      NULL, rval);
-}
-
-/**
- * Called when the JavaObject is invoked as a function.
- * We ignore the JSObject* argument, which is the 'this' context, which is
- * usually the window object. The JavaObject instance is in argv[-2].
- *
- * Returns a JS array, with the first element being a boolean indicating that
- * an exception occured, and the second element is either the return value or
- * the exception which was thrown.  In this case, we always return false and
- * raise the exception ourselves.
- */
-JSBool JavaObject::call(JSContext* ctx, JSObject*, uintN argc, jsval* argv,
-    jsval* rval) {
-  // Get the JavaObject called as a function
-  JSObject* obj = JSVAL_TO_OBJECT(argv[-2]);
-  if (argc < 2 || !JSVAL_IS_INT(argv[0]) ||
-#ifdef JSVAL_IS_OBJECT
-  !JSVAL_IS_OBJECT(argv[1])) {
-#else
-    (JSVAL_IS_PRIMITIVE(argv[1]) && !JSVAL_IS_NULL(argv[1]))) {
-#endif
-    Debug::log(Debug::Error) << "JavaObject::call incorrect arguments" << Debug::flush;
-    return JS_FALSE;
-  }
-  int dispId = JSVAL_TO_INT(argv[0]);
-  if (Debug::level(Debug::Spam)) {
-    Debug::DebugStream& dbg = Debug::log(Debug::Spam) << "JavaObject::call oid="
-        << JavaObject::getObjectId(ctx, obj) << ",dispId=" << dispId << " (";
-    for (unsigned i = 2; i < argc; ++i) {
-      if (i > 2) {
-        dbg << ", ";
-      }
-      dbg << dumpJsVal(ctx, argv[i]);
-    }
-    dbg << ")" << Debug::flush;
-  }
-
-  SessionData* data = JavaObject::getSessionData(ctx, obj);
-  if (!data) {
-    *rval = JSVAL_VOID;
-    return JS_TRUE;
-  }
-  Debug::log(Debug::Spam) << "Data = " << data << Debug::flush;
-
-  gwt::Value javaThis;
-  if (!JSVAL_IS_NULL(argv[1])) {
-    JSObject* thisObj = JSVAL_TO_OBJECT(argv[1]);
-    if (isJavaObject(ctx, thisObj)) {
-      javaThis.setJavaObject(getObjectId(ctx, thisObj));
-    } else {
-      data->makeValueFromJsval(javaThis, ctx, argv[1]);
-    }
-  } else {
-    int oid = getObjectId(ctx, obj);
-    javaThis.setJavaObject(oid);
-  }
-  return invokeJava(ctx, data, javaThis, dispId, argc - 2, &argv[2], rval);
-}
-
-#if GECKO_VERSION >= 2000
-/**
- * Compatability wrapper for Gecko 2.0+
- */
-JSBool JavaObject::toString20(JSContext* ctx, uintN argc, jsval* vp) {
-  jsval rval = JSVAL_VOID;
-  JSBool success;
-  success = toString(ctx, JS_THIS_OBJECT(ctx, vp), argc, JS_ARGV(ctx, vp),
-                       &rval);
-  JS_SET_RVAL(cx, vp, rval);
-  return success;
-}
-
-/**
- * Compatability wrapper method for Gecko 2.0+
- */
-JSBool JavaObject::call20(JSContext* ctx, uintN argc, jsval* vp) {
-  jsval rval = JSVAL_VOID;
-  JSBool success;
-  success = call(ctx, NULL, argc, JS_ARGV(ctx, vp), &rval);
-  JS_SET_RVAL(ctx, vp, rval);
-  return success;
-}
-#endif //GECKO_VERSION
-
-/**
- * Calls a method on a Java object and returns a two-element JS array, with
- * the first element being a boolean flag indicating an exception was thrown,
- * and the second element is the actual return value or exception.
- */
-JSBool JavaObject::invokeJava(JSContext* ctx, SessionData* data,
-    const gwt::Value& javaThis, int dispId, int numArgs, const jsval* jsargs,
-    jsval* rval) {
-  HostChannel* channel = data->getHostChannel();
-  SessionHandler* handler = data->getSessionHandler();
-  scoped_array<gwt::Value> args(new gwt::Value[numArgs]);
-  for (int i = 0; i < numArgs; ++i) {
-    data->makeValueFromJsval(args[i], ctx, jsargs[i]);
-  }
-
-  bool isException = false;
-  gwt::Value returnValue;
-  if (!InvokeMessage::send(*channel, javaThis, dispId, numArgs, args.get())) {
-    Debug::log(Debug::Debugging) << "JavaObject::call failed to send invoke message" << Debug::flush;
-  } else {
-    Debug::log(Debug::Spam) << " return from invoke" << Debug::flush;
-    scoped_ptr<ReturnMessage> retMsg(channel->reactToMessagesWhileWaitingForReturn(handler));
-    if (!retMsg.get()) {
-      Debug::log(Debug::Debugging) << "JavaObject::call failed to get return value" << Debug::flush;
-    } else {
-      isException = retMsg->isException();
-      returnValue = retMsg->getReturnValue();
-    }
-  }
-  // Since we can set exceptions normally, we always return false to the
-  // wrapper function and set the exception ourselves if one occurs.
-  // TODO: cleanup exception case
-  jsval retvalArray[] = {JSVAL_FALSE, JSVAL_VOID};
-  JSObject* retval = JS_NewArrayObject(ctx, 2, retvalArray);
-  *rval = OBJECT_TO_JSVAL(retval);
-  jsval retJsVal;
-  Debug::log(Debug::Spam) << "  result is " << returnValue << Debug::flush;
-  data->makeJsvalFromValue(retJsVal, ctx, returnValue);
-  if (isException) {
-    JS_SetPendingException(ctx, retJsVal);
-    return false;
-  }
-  if (!JS_SetElement(ctx, retval, 1, &retJsVal)) {
-    Debug::log(Debug::Error) << "Error setting return value element in array"
-        << Debug::flush;
-    return false;
-  }
-  return true;
-}
diff --git a/plugins/xpcom/JavaObject.h b/plugins/xpcom/JavaObject.h
deleted file mode 100755
index c2fcf00..0000000
--- a/plugins/xpcom/JavaObject.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef _H_JavaObject
-#define _H_JavaObject
-/*
- * 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.
- */
-
-#include "mozincludes.h"
-#include "jsapi.h"
-
-class SessionData;
-namespace gwt {
-  class Value;
-}
-
-#if GECKO_VERSION < 2000
-#define jsid jsval
-#define JSID_IS_STRING JSVAL_IS_STRING
-#define JSID_TO_STRING JSVAL_TO_STRING
-#define JSID_IS_INT JSVAL_IS_INT
-#define JSID_TO_INT JSVAL_TO_INT
-#define INT_TO_JSID INT_TO_JSVAL
-#define JS_GetStringEncodingLength(ctx, str) JS_GetStringLength(str)
-#define JS_EncodeString(ctx, str) JS_GetStringBytes(str)
-#endif
-
-class JavaObject {
-public:
-  static bool isJavaObject(JSContext* ctx, JSObject* obj);
-  static JSObject* construct(JSContext* ctx, SessionData* data, int objectRef);
-  static int getObjectId(JSContext* ctx, JSObject* obj);
-  static JSBool getProperty(JSContext* ctx, JSObject* obj, jsid id, jsval* vp);
-
-#if GECKO_VERSION < 2000
-  static JSBool setProperty(JSContext* ctx, JSObject* obj, jsid id, jsval* vp);
-#else
-  static JSBool setProperty(JSContext* ctx, JSObject* obj, jsid id, JSBool strict, jsval* vp);
-#endif //GECKO_VERSION
-
-  static JSBool resolve(JSContext* ctx, JSObject* obj, jsval id);
-  static JSBool convert(JSContext* cx, JSObject* obj, JSType type, jsval* vp);
-  static JSBool enumerate(JSContext* ctx, JSObject* obj, JSIterateOp op, jsval* statep, jsid* idp);
-#if GECKO_VERSION >= 14000
-  static void finalize(JSFreeOp* fop, JSObject* obj);
-#else
-  static void finalize(JSContext* ctx, JSObject* obj);
-#endif //GECKO_VERSION
-  static JSBool toString(JSContext* ctx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
-  static JSBool call(JSContext* ctx, JSObject* obj, uintN argc, jsval* argv, jsval* rval);
-
-#if GECKO_VERSION >= 2000
-  static JSBool toString20(JSContext* ctx, uintN argc, jsval* vp);
-  static JSBool call20(JSContext* ctx, uintN argc, jsval* vp);
-#endif //GECKO_VERSION
-#if GECKO_VERSION >= 15000
-  static JSBool getPropertyWrapper(JSContext* ctx, JSHandleObject obj, JSHandleId id, jsval *vp);
-  static JSBool setPropertyWrapper(JSContext* ctx, JSHandleObject obj, JSHandleId id,
-      JSBool strict, jsval *vp);
-#endif
-
-private:
-  static SessionData* getSessionData(JSContext* ctx, JSObject* obj);
-  static JSBool invokeJava(JSContext* ctx, SessionData* data,
-      const gwt::Value& javaThis, int dispId, int numArgs, const jsval* jsargs,
-      jsval* rval);
-};
-
-#endif
diff --git a/plugins/xpcom/Makefile b/plugins/xpcom/Makefile
deleted file mode 100644
index 37c5f92..0000000
--- a/plugins/xpcom/Makefile
+++ /dev/null
@@ -1,442 +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.
-
-include ../config.mk
-
-# Make variables intended to be settable from the command line:
-#   DEFAULT_FIREFOX_LIBS	points to /usr/lib/firefox or equivalent
-#   PLUGIN_SDKS			points to GWT /plugin-sdks directory
-#   GECKO_PLATFORM		XPCOM ABI (ie, Linux_x86_64-gcc3)
-#
-
-ifeq ($(OS),mac)
-DEFAULT_FIREFOX_LIBS ?= /Applications/Firefox.app/Contents/MacOS
-RUN_PATH_FLAG = -executable_path
-DLL_SUFFIX = .dylib
-DLLFLAGS += -bundle $(ALLARCHCFLAGS) -mmacosx-version-min=10.5  -isysroot /Developer/SDKs/MacOSX10.5.sdk
-CFLAGS += $(ALLARCHCFLAGS)
-CXXFLAGS += $(ALLARCHCFLAGS)
-TARGET_PLATFORM = Darwin-gcc3
-# Mac puts multiple architectures into the same files
-GECKO_PLATFORM = Darwin-gcc3
-else
-ifeq ($(OS),linux)
-DEFAULT_FIREFOX_LIBS ?= /usr/lib/firefox
-RUN_PATH_FLAG = -rpath-link
-DLL_SUFFIX = .so
-DLLFLAGS += -shared -m$(FLAG32BIT)
-TARGET_PLATFORM = Linux_$(ARCH)-gcc3
-else
-ifeq ($(OS),sun)
-TARGET_PLATFORM = SunOS_$(ARCH)-sunc
-RUN_PATH_FLAG = -rpath-link
-DLLFLAGS ?= ""
-endif
-endif
-endif
-
-export FLAG32BIT
-
-ifeq ($(BROWSER),)
-$(warning Defaulting to FF3 build [set with BROWSER=ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, f110, ff120, ff130, ff140, ff150, ff160])
-BROWSER=ff3
-endif
-
-# Gold doesn't play nice with xpcom libs
-LINKER=$(shell ld -v | awk '{print $$2}')
-ifeq ($(LINKER), gold)
-ifeq ($(wildcard /usr/lib/compat-ld),)
-$(error cannot link with gold, use the BFD ld instead)
-else
-CFLAGS += -B/usr/lib/compat-ld/
-CXXFLAGS += -B/usr/lib/compat-ld/
-DLLFLAGS += -B/usr/lib/compat-ld/
-endif
-endif
-
-CFLAGS += -DBROWSER=$(BROWSER)
-GECKO_MINOR_VERSION=
-GECKO_DLLFLAGS = -lxpcomglue_s -lxpcom
-NSPR_DLLFLAGS = -lnspr4
-MOZJS_DLLFLAGS = -lxul
-
-#defaults to post-FF4
-MOZALLOC_DLLFLAGS = -lmozalloc
-
-#default ALLARCHFLAGS for post-FF4
-ALLARCHCFLAGS = -arch i386 -arch x86_64 -Xarch_i386 -DFLAG32BIT=32 -Xarch_x86_64 -DFLAG32BIT=64
-
-# Python xpidl tool is the new hotness post-FF9
-XPIDL_TOOL = python
-
-ifeq ($(BROWSER),ff3)
-XPIDL_TOOL = binary
-MOZALLOC_DLLFLAGS =
-GECKO_VERSION   = 1.9.0
-CFLAGS += -DGECKO_VERSION=1900
-MOZJS_DLLFLAGS = -lmozjs
-ifeq ($(OS),mac)
-ALLARCHCFLAGS = -arch i386 -arch ppc
-endif
-else
-ifeq ($(BROWSER),ff3+)
-XPIDL_TOOL = binary
-MOZALLOC_DLLFLAGS =
-GECKO_VERSION   = 1.9.0
-CFLAGS += -DGECKO_VERSION=1901
-GECKO_MINOR_VERSION=.10
-MOZJS_DLLFLAGS = -lmozjs
-ifeq ($(OS),mac)
-ALLARCHCFLAGS = -arch i386 -arch ppc
-endif
-else
-ifeq ($(BROWSER),ff35)
-XPIDL_TOOL = binary
-MOZALLOC_DLLFLAGS =
-GECKO_VERSION   = 1.9.1
-CFLAGS += -DGECKO_VERSION=1910
-MOZJS_DLLFLAGS = -lmozjs
-ifeq ($(OS),mac)
-ALLARCHCFLAGS = -arch i386 -arch ppc
-endif
-else
-ifeq ($(BROWSER),ff36)
-XPIDL_TOOL = binary
-MOZALLOC_DLLFLAGS =
-GECKO_VERSION   = 1.9.2
-CFLAGS += -DGECKO_VERSION=1920
-MOZJS_DLLFLAGS = -lmozjs
-ifeq ($(OS),mac)
-ALLARCHCFLAGS = -arch i386 -arch ppc
-endif
-else
-ifeq ($(BROWSER),ff40)
-XPIDL_TOOL = binary
-GECKO_VERSION   = 2.0.0
-CFLAGS += -DGECKO_VERSION=2000
-else
-ifeq ($(BROWSER),ff50)
-XPIDL_TOOL = binary
-GECKO_VERSION   = 5.0.0
-CFLAGS += -DGECKO_VERSION=5000
-else
-ifeq ($(BROWSER),ff60)
-XPIDL_TOOL = binary
-GECKO_VERSION   = 6.0.0
-CFLAGS += -DGECKO_VERSION=6000
-else
-ifeq ($(BROWSER),ff70)
-XPIDL_TOOL = binary
-GECKO_VERSION   = 7.0.0
-CFLAGS += -DGECKO_VERSION=7000
-else
-ifeq ($(BROWSER),ff80)
-XPIDL_TOOL = binary
-GECKO_VERSION   = 8.0.0
-CFLAGS += -DGECKO_VERSION=8000
-else
-ifeq ($(BROWSER),ff90)
-GECKO_VERSION   = 9.0.0
-CFLAGS += -DGECKO_VERSION=9000
-else
-ifeq ($(BROWSER),ff100)
-GECKO_VERSION   = 10.0.0
-CFLAGS += -DGECKO_VERSION=10000
-else
-ifeq ($(BROWSER),ff110)
-GECKO_VERSION   = 11.0.0
-CFLAGS += -DGECKO_VERSION=11000
-else
-ifeq ($(BROWSER),ff120)
-GECKO_VERSION   = 12.0.0
-CFLAGS += -DGECKO_VERSION=12000
-else
-ifeq ($(BROWSER),ff130)
-GECKO_VERSION   = 13.0.0
-CFLAGS += -DGECKO_VERSION=13000
-else
-ifeq ($(BROWSER),ff140)
-GECKO_VERSION   = 14.0.0
-CFLAGS += -DGECKO_VERSION=14000
-else
-ifeq ($(BROWSER),ff150)
-GECKO_VERSION   = 15.0.0
-CFLAGS += -DGECKO_VERSION=15000
-else
-ifeq ($(BROWSER),ff160)
-GECKO_VERSION   = 16.0.0
-CFLAGS += -DGECKO_VERSION=16000
-else
-$(error Unrecognized BROWSER of $(BROWSER) - options are ff3, ff3+, ff35, ff36, ff40, ff50, ff60, ff70, ff80, ff90, ff100, ff110, ff120, ff130, ff140, ff150)
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-endif
-
-CFLAGS += -fshort-wchar
-CXXFLAGS = $(CXXONLYFLAGS) $(CFLAGS)
-DIR = $(shell pwd)
-
-# Set $PLUGIN_SDKS if it isn't in the default location
-PLUGIN_SDKS ?= ../../../plugin-sdks
-GECKO_PLATFORM ?= $(TARGET_PLATFORM)
-
-COMMON            = ../common/libcommon$(FLAG32BIT).a
-
-OBJ_OUTDIR        = build/$(TARGET_PLATFORM)-$(BROWSER)
-EXTENSION_OUTDIR  = prebuilt/extension
-FF_PLATFORM_DIR   = $(EXTENSION_OUTDIR)/lib/$(TARGET_PLATFORM)/$(BROWSER)
-
-INSTALLER_XPI     = prebuilt/gwt-dev-plugin.xpi
-FF_DLL            = $(OBJ_OUTDIR)/libgwt_dev_$(BROWSER)$(DLL_SUFFIX)
-#FF_TYPELIB        = build/IOOPHM.xpt
-#FF_HEADER         = $(OBJ_OUTDIR)/IOOPHM.h
-FF_TYPELIB        = prebuilt/extension/components/IOOPHM.xpt
-FF_HEADERDIR      = prebuilt/$(BROWSER)/include
-FF_HEADER         = $(FF_HEADERDIR)/IOOPHM.h
-INSTALL_RDF       = $(EXTENSION_OUTDIR)/install.rdf
-
-SDK_PATH          = $(PLUGIN_SDKS)/gecko-sdks
-GECKO_SDK         = $(SDK_PATH)/gecko-$(GECKO_VERSION)
-GECKO_PLAT_INC    = $(GECKO_SDK)/$(GECKO_PLATFORM)/include
-GECKO_LIBS        = $(GECKO_SDK)/$(GECKO_PLATFORM)/lib$(GECKO_MINOR_VERSION)
-
-ifeq ($(XPIDL_TOOL),python)
-XPIDL             = $(GECKO_SDK)/bin/xpidl.py
-XPIDL_HEADER      = $(GECKO_SDK)/bin/header.py
-XPIDL_TYPELIBS    = $(GECKO_SDK)/bin/typelib.py
-else
-XPIDL             = $(GECKO_SDK)/$(GECKO_PLATFORM)/bin/xpidl
-XPIDL_HEADER      = $(GECKO_SDK)/$(GECKO_PLATFORM)/bin/xpidl -m header
-XPIDL_TYPELIBS    = $(GECKO_SDK)/$(GECKO_PLATFORM)/bin/xpidl -m typelib
-endif
-
-XPIDL_FLAGS       = -I$(GECKO_SDK)/idl
-
-DLLFLAGS += \
-		-L$(GECKO_LIBS) \
-		-Wl,$(RUN_PATH_FLAG),$(GECKO_LIBS) \
-		$(GECKO_DLLFLAGS) $(NSPR_DLLFLAGS) \
-		$(MOZALLOC_DLLFLAGS) $(MOZJS_DLLFLAGS)
-
-INC += -I$(GECKO_PLAT_INC) -I$(GECKO_SDK)/include -I$(dir $(FF_HEADER))
-
-VERSION ?= 1.0.$(shell ./getversion).$(shell date +%Y%m%d%H%M%S)
-
-.PHONY: all xpi lib common browser clean depend install install-platform find-ff-libs
-
-all:: common lib xpi
-
-lib:: browser $(OBJ_OUTDIR) $(EXTENSION_OUTDIR) $(FF_DLL)
-xpi:: $(EXTENSION_OUTDIR) $(INSTALLER_XPI)
-
-find-ff-libs::
-ifeq ($(FIREFOX_LIBS),)
-	$(warning Using firefox libraries at $(GECKO_LIBS))
-	$(eval FIREFOX_LIBS = $(GECKO_LIBS))
-endif
-
-browser:: find-ff-libs
-#	if [ ! -r $(GECKO_LIBS)/libxpcom.so ]
-#	then
-#	    $(error Missing Firefox libraries at $(GECKO_LIBS))
-#	fi
-
-generate-install:: $(EXTENSION_OUTDIR) install-template.rdf
-	sed -e s/GWT_DEV_PLUGIN_VERSION/$(VERSION)/ install-template.rdf >$(INSTALL_RDF)
-
-linuxplatforms:
-	$(MAKE) lib BROWSER=ff3 ARCH=x86
-	$(MAKE) lib BROWSER=ff3+ ARCH=x86
-	$(MAKE) lib BROWSER=ff35 ARCH=x86
-	$(MAKE) lib BROWSER=ff36 ARCH=x86
-	$(MAKE) lib BROWSER=ff40 ARCH=x86
-	$(MAKE) lib BROWSER=ff50 ARCH=x86
-	$(MAKE) lib BROWSER=ff60 ARCH=x86
-	$(MAKE) lib BROWSER=ff70 ARCH=x86
-	$(MAKE) lib BROWSER=ff80 ARCH=x86
-	$(MAKE) lib BROWSER=ff90 ARCH=x86
-	$(MAKE) lib BROWSER=ff100 ARCH=x86
-	$(MAKE) lib BROWSER=ff110 ARCH=x86
-	$(MAKE) lib BROWSER=ff120 ARCH=x86
-	$(MAKE) lib BROWSER=ff130 ARCH=x86
-	$(MAKE) lib BROWSER=ff140 ARCH=x86
-	$(MAKE) lib BROWSER=ff150 ARCH=x86
-	$(MAKE) lib BROWSER=ff160 ARCH=x86
-	$(MAKE) lib BROWSER=ff3 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff3+ ARCH=x86_64
-	$(MAKE) lib BROWSER=ff35 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff36 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff40 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff50 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff60 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff70 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff80 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff90 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff100 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff110 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff120 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff130 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff140 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff150 ARCH=x86_64
-	$(MAKE) lib BROWSER=ff160 ARCH=x86_64
-
-macplatforms:
-	$(MAKE) lib BROWSER=ff3
-	$(MAKE) lib BROWSER=ff35
-	$(MAKE) lib BROWSER=ff36
-	$(MAKE) lib BROWSER=ff40
-	$(MAKE) lib BROWSER=ff50
-	$(MAKE) lib BROWSER=ff60
-	$(MAKE) lib BROWSER=ff70
-	$(MAKE) lib BROWSER=ff80
-	$(MAKE) lib BROWSER=ff90
-	$(MAKE) lib BROWSER=ff100
-	$(MAKE) lib BROWSER=ff110
-	$(MAKE) lib BROWSER=ff120
-	$(MAKE) lib BROWSER=ff130
-	$(MAKE) lib BROWSER=ff140
-
-SRCS =	\
-		ExternalWrapper.cpp \
-		ModuleOOPHM.cpp \
-		FFSessionHandler.cpp \
-		JavaObject.cpp \
-		JSRunner.cpp \
-		Preferences.cpp \
-		XpcomDebug.cpp
-
-FF_OBJS = $(patsubst %.cpp,$(OBJ_OUTDIR)/%.o,$(SRCS))
-
-$(FF_OBJS): $(OBJ_OUTDIR)
-
-$(OBJ_OUTDIR)::
-	@mkdir -p $@
-
-$(INSTALLER_XPI): $(FF_TYPELIB) $(EXTENSION_OUTDIR) generate-install $(shell find prebuilt/extension $(EXTENSION_OUTDIR))
-	@mkdir -p $(EXTENSION_OUTDIR)/components
-	#(cd prebuilt/extension; find . \( -name .svn -prune \) -o -print | cpio -pmdua ../../$(EXTENSION_OUTDIR))
-	-rm $(INSTALLER_XPI)
-	(cd $(EXTENSION_OUTDIR) && zip -r -D -9 $(DIR)/$(INSTALLER_XPI) * -x '*/.svn/*' -x 'META-INF/*')
-
-$(FF_TYPELIB): IOOPHM.idl
-	[ ! -x $(XPIDL) -o \( -e $(FF_TYPELIB) -a ! -w $(FF_TYPELIB) \) ] || $(XPIDL_TYPELIBS) $(XPIDL_FLAGS) -o $@ $<
-
-$(FF_HEADERDIR):
-	@mkdir -p $@
-
-$(FF_HEADER): IOOPHM.idl $(OBJ_OUTDIR) $(FF_HEADERDIR)
-	[ ! -x $(XPIDL) -o \( -e $(FF_HEADER) -a ! -w $(FF_HEADER) \) ] || $(XPIDL_HEADER) $(XPIDL_FLAGS) -o $@ $<
-
-$(FF_DLL): $(FF_OBJS) $(COMMON)
-	$(CXX) -o $@ $(FF_OBJS) $(COMMON) $(DLLFLAGS)
-	@mkdir -p $(FF_PLATFORM_DIR)
-	cp $(FF_DLL) $(FF_PLATFORM_DIR)/
-
-$(OBJ_OUTDIR)/%.o: %.cpp $(FF_HEADER)
-	$(CXX) $(CXXFLAGS) -c -o $@ -I. -I../common $<
-
-common $(COMMON):
-	(cd ../common && $(MAKE))
-
-clean:
-	rm -rf build
-	(cd ../common && $(MAKE) clean)
-
-install-platform:
-ifdef BROWSER
-	@-mkdir -p $(FF_PLATFORM_DIR)
-	-cp $(FF_DLL) $(FF_PLATFORM_DIR))/
-ifeq ($(OS),mac)
-	@-mkdir -p $(subst $(EXTENSION_OUTDIR),prebuilt/extension-$(BROWSER),$(subst x86,ppc,$(FF_PLATFORM_DIR)))/components
-	-cp $(FF_DLL) $(subst $(EXTENSION_OUTDIR),prebuilt/extension-$(BROWSER),$(subst x86,ppc,$(FF_PLATFORM_DIR)))/components
-endif
-else
-	@$(MAKE) $@ BROWSER=ff3
-	@$(MAKE) $@ BROWSER=ff3+
-	@$(MAKE) $@ BROWSER=ff35
-	@$(MAKE) $@ BROWSER=ff36
-	@$(MAKE) $@ BROWSER=ff40
-	@$(MAKE) $@ BROWSER=ff50
-endif
-
-DEPEND = g++ -MM -MT'$$(OBJ_OUTDIR)/$(patsubst %.cpp,%.o,$(src))' \
-  -I. -I../common -isystem$(dir $(FF_HEADER)) -isystem$(GECKO_SDK)/include $(src) &&
-depend: browser $(OBJ_OUTDIR) $(FF_HEADER)
-	($(foreach src,$(SRCS),$(DEPEND)) true) >>Makefile
-#	makedepend -- $(CFLAGS) -- $(SRCS)
-
-# DO NOT DELETE
-$(OBJ_OUTDIR)/ExternalWrapper.o: ExternalWrapper.cpp ExternalWrapper.h \
-  mozincludes.h FFSessionHandler.h SessionData.h \
-  ../common/SessionHandler.h ../common/BrowserChannel.h ../common/Value.h \
-  ../common/Debug.h ../common/Platform.h ../common/DebugLevel.h \
-  ../common/BrowserChannel.h ../common/scoped_ptr/scoped_ptr.h \
-  ../common/LoadModuleMessage.h ../common/Message.h \
-  ../common/BrowserChannel.h ../common/HostChannel.h ../common/Debug.h \
-  ../common/ByteOrder.h ../common/Platform.h ../common/Socket.h \
-  ../common/Platform.h ../common/Debug.h ../common/AllowedConnections.h \
-  ../common/Platform.h ../common/Message.h ../common/ReturnMessage.h \
-  ../common/Message.h ../common/BrowserChannel.h ../common/Value.h \
-  ../common/Value.h ../common/SessionHandler.h ../common/SessionHandler.h \
-  ../common/ServerMethods.h ../common/Value.h
-$(OBJ_OUTDIR)/ModuleOOPHM.o: ModuleOOPHM.cpp ../common/Debug.h \
-  ../common/Platform.h ../common/DebugLevel.h ExternalWrapper.h \
-  mozincludes.h FFSessionHandler.h SessionData.h \
-  ../common/SessionHandler.h ../common/BrowserChannel.h ../common/Value.h \
-  ../common/Debug.h ../common/BrowserChannel.h \
-  ../common/scoped_ptr/scoped_ptr.h
-$(OBJ_OUTDIR)/FFSessionHandler.o: FFSessionHandler.cpp FFSessionHandler.h \
-  mozincludes.h SessionData.h ../common/SessionHandler.h \
-  ../common/BrowserChannel.h ../common/Value.h ../common/Debug.h \
-  ../common/Platform.h ../common/DebugLevel.h ../common/BrowserChannel.h \
-  ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
-  ../common/Platform.h ../common/Socket.h ../common/Platform.h \
-  ../common/Debug.h ../common/AllowedConnections.h ../common/Platform.h \
-  ../common/Message.h ../common/ReturnMessage.h ../common/Message.h \
-  ../common/BrowserChannel.h ../common/Value.h ../common/Value.h \
-  ../common/SessionHandler.h JavaObject.h JSRunner.h XpcomDebug.h \
-  ../common/scoped_ptr/scoped_ptr.h RootedObject.h \
-  ../common/InvokeMessage.h ../common/Message.h \
-  ../common/BrowserChannel.h ../common/Value.h ../common/ServerMethods.h \
-  ../common/Value.h
-$(OBJ_OUTDIR)/JavaObject.o: JavaObject.cpp JavaObject.h mozincludes.h \
-  FFSessionHandler.h SessionData.h ../common/SessionHandler.h \
-  ../common/BrowserChannel.h ../common/Value.h ../common/Debug.h \
-  ../common/Platform.h ../common/DebugLevel.h ../common/BrowserChannel.h \
-  ../common/ServerMethods.h ../common/Value.h XpcomDebug.h \
-  ../common/HostChannel.h ../common/Debug.h ../common/ByteOrder.h \
-  ../common/Platform.h ../common/Socket.h ../common/Platform.h \
-  ../common/Debug.h ../common/AllowedConnections.h ../common/Platform.h \
-  ../common/Message.h ../common/ReturnMessage.h ../common/Message.h \
-  ../common/BrowserChannel.h ../common/Value.h ../common/Value.h \
-  ../common/SessionHandler.h ../common/InvokeMessage.h \
-  ../common/Message.h ../common/BrowserChannel.h ../common/Value.h \
-  ../common/scoped_ptr/scoped_ptr.h
-$(OBJ_OUTDIR)/JSRunner.o: JSRunner.cpp JSRunner.h mozincludes.h
-$(OBJ_OUTDIR)/XpcomDebug.o: XpcomDebug.cpp XpcomDebug.h mozincludes.h \
-  JavaObject.h
diff --git a/plugins/xpcom/ModuleOOPHM.cpp b/plugins/xpcom/ModuleOOPHM.cpp
deleted file mode 100644
index 7e52bb1..0000000
--- a/plugins/xpcom/ModuleOOPHM.cpp
+++ /dev/null
@@ -1,214 +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.
- */
-
-#include "Debug.h"
-#include "ExternalWrapper.h"
-
-#include "nsCOMPtr.h"
-#include "nsISupports.h"
-#include "nsIXULAppInfo.h"
-#include "nsIXULRuntime.h"
-#include "nsServiceManagerUtils.h"
-#include "nsXPCOMCID.h"
-
-#if GECKO_VERSION >= 1900
-#include "nsIClassInfoImpl.h"
-#endif
-
-#if GECKO_VERSION >= 2000
-#include "mozilla/ModuleUtils.h"
-#else
-#include "nsIGenericFactory.h"
-#include "nsICategoryManager.h"
-#endif
-
-
-// Allow a macro to be treated as a C string, ie -Dfoo=bar; QUOTE(foo) = "bar"
-#define QUOTE_HELPER(x) #x
-#define QUOTE(x) QUOTE_HELPER(x)
-
-#ifdef _WINDOWS
-#include <windows.h>
-
-BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) {
-  switch (ulReasonForCall) {
-    case DLL_PROCESS_ATTACH:
-    case DLL_THREAD_ATTACH:
-    case DLL_THREAD_DETACH:
-    case DLL_PROCESS_DETACH:
-      break;
-  }
-  return TRUE;
-}
-#endif
-
-// This defines ExternalWrapperConstructor, which in turn instantiates via
-// ExternalWrapper::ExternalWrapper()
-NS_GENERIC_FACTORY_CONSTRUCTOR(ExternalWrapper);
-
-static nsresult Load() {
-  nsresult nr;
-  nsCOMPtr<nsIXULAppInfo> app_info
-      = do_GetService("@mozilla.org/xre/app-info;1", &nr);
-  if (NS_FAILED(nr) || !app_info) {
-    return NS_ERROR_FAILURE;
-  }
-  nsCString gecko_version;
-  app_info->GetPlatformVersion(gecko_version);
-  nsCString browser_version;
-  app_info->GetVersion(browser_version);
-  nsCOMPtr<nsIXULRuntime> xulRuntime
-      = do_GetService("@mozilla.org/xre/app-info;1", &nr);
-  if (NS_FAILED(nr) || !app_info) {
-    return NS_ERROR_FAILURE;
-  }
-  nsCString os;
-  xulRuntime->GetOS(os);
-  nsCString abi;
-  xulRuntime->GetXPCOMABI(abi);
-  Debug::log(Debug::Info) << "Initializing GWT Developer Plugin"
-      << Debug::flush;
-  Debug::log(Debug::Info) << "  gecko=" << gecko_version.BeginReading()
-      << ", firefox=" << browser_version.BeginReading() << ", abi="
-      << os.BeginReading() << "_" << abi.BeginReading() << ", built for "
-      QUOTE(BROWSER) << Debug::flush;
-  return NS_OK;
-}
-
-static void Unload() {
-  Debug::log(Debug::Debugging) << "ModuleOOPHM Unload()"
-      << Debug::flush;
-}
-
-#if GECKO_VERSION >= 2000
-/**
- * Gecko 2.0 has a completely different initialization mechanism
- */
-
-// This defines kOOPHM_CID variable that refers to the OOPHM_CID
-NS_DEFINE_NAMED_CID(OOPHM_CID);
-
-// Build a table of ClassIDs (CIDs) which are implemented by this module. CIDs
-// should be completely unique UUIDs.
-// each entry has the form { CID, service, factoryproc, constructorproc }
-// where factoryproc is usually NULL.
-static const mozilla::Module::CIDEntry kOOPHMCIDs[] = {
-  {&kOOPHM_CID, false, NULL, ExternalWrapperConstructor},
-  {NULL }
-};
-
-// Build a table which maps contract IDs to CIDs.
-// A contract is a string which identifies a particular set of functionality. In some
-// cases an extension component may override the contract ID of a builtin gecko component
-// to modify or extend functionality.
-static const mozilla::Module::ContractIDEntry kOOPHMContracts[] = {
-  {OOPHM_CONTRACTID, &kOOPHM_CID},
-  {NULL}
-};
-
-// Category entries are category/key/value triples which can be used
-// to register contract ID as content handlers or to observe certain
-// notifications.
-static const mozilla::Module::CategoryEntry kOOPHMCategories[] = {
-  {"JavaScript-global-property", "__gwt_HostedModePlugin", OOPHM_CONTRACTID},
-  {NULL}
-};
-
-static const mozilla::Module kModuleOOPHM = {
-  mozilla::Module::kVersion,
-  kOOPHMCIDs,
-  kOOPHMContracts,
-  kOOPHMCategories,
-  NULL, /* Use the default factory */
-  Load,
-  Unload
-};
-
-NSMODULE_DEFN(ModuleOOPHM) = &kModuleOOPHM;
-
-#else
-/**
- * pre-Gecko2.0 initialization
- */
-NS_DECL_CLASSINFO(ExternalWrapper);
-static NS_IMETHODIMP registerSelf(nsIComponentManager *aCompMgr, nsIFile *aPath,
-    const char *aLoaderStr, const char *aType,
-    const nsModuleComponentInfo *aInfo) {
-
-  Debug::log(Debug::Info)
-      << "  successfully registered GWT Developer Plugin"
-      << Debug::flush;
-  nsresult rv;
-  nsCOMPtr<nsICategoryManager> categoryManager =
-      do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
-
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = categoryManager->AddCategoryEntry("JavaScript global property",
-      "__gwt_HostedModePlugin", OOPHM_CONTRACTID, true, true, nsnull);
-
-  if (rv != NS_OK) {
-    Debug::log(Debug::Error) << "ModuleOOPHM registerSelf returned " << rv
-        << Debug::flush;
-  }
-  return rv;
-}
-
-static NS_IMETHODIMP factoryDestructor(void) {
-  Unload();
-  return NS_OK;
-}
-
-static NS_IMETHODIMP unregisterSelf(nsIComponentManager *aCompMgr,
-    nsIFile *aPath, const char *aLoaderStr,
-    const nsModuleComponentInfo *aInfo) {
-  Debug::log(Debug::Info) << "Unregistered GWT Developer Plugin"
-      << Debug::flush;
-  return NS_OK;
-}
-
-static nsModuleComponentInfo components[] = {
-    {
-       OOPHM_CLASSNAME,
-       OOPHM_CID,
-       OOPHM_CONTRACTID,
-       ExternalWrapperConstructor,
-       registerSelf,
-       unregisterSelf, /* unregister self */
-       factoryDestructor, /* factory destructor */
-       NS_CI_INTERFACE_GETTER_NAME(ExternalWrapper), /* get interfaces */
-       nsnull, /* language helper */
-       &NS_CLASSINFO_NAME(ExternalWrapper), /* global class-info pointer */
-       0 /* class flags */
-    }
-};
-
-// From Gears base/firefox/module.cc
-static nsModuleInfo const kModuleInfo = {
-  NS_MODULEINFO_VERSION,
-  ("ExternalWrapperModule"),
-  (components),
-  (sizeof(components) / sizeof(components[0])),
-  (nsnull),
-  (nsnull)
-};
-
-NSGETMODULE_ENTRY_POINT(ExternalWrapperModule) (nsIComponentManager *servMgr,
-    nsIFile* location, nsIModule** result) {
-  Load();
-  return NS_NewGenericModule2(&kModuleInfo, result);
-}
-#endif //GECKO_VERSION
diff --git a/plugins/xpcom/Preferences.cpp b/plugins/xpcom/Preferences.cpp
deleted file mode 100644
index 055200c..0000000
--- a/plugins/xpcom/Preferences.cpp
+++ /dev/null
@@ -1,123 +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.
- */
-
-#include "Preferences.h"
-#include "Debug.h"
-#include "AllowedConnections.h"
-
-#include "nsCOMPtr.h"
-#include "nsStringAPI.h"
-#include "nsISupportsImpl.h"
-#include "nsIObserver.h"
-#include "nsIPrefService.h"
-#include "nsIPrefBranch.h"
-#include "nsIPrefBranch2.h"
-#include "nsServiceManagerUtils.h"
-
-#define GWT_DEV_PREFS_PREFIX "gwt-dev-plugin."
-#define GWT_DEV_ACCESS_LIST "accessList"
-
-NS_IMPL_ADDREF(Preferences)
-NS_IMPL_RELEASE(Preferences)
-NS_IMPL_QUERY_INTERFACE1(Preferences, nsIObserver)
-
-Preferences::Preferences() {
-  nsCOMPtr<nsIPrefService> prefService = do_GetService(
-      NS_PREFSERVICE_CONTRACTID);
-  if (!prefService) {
-    Debug::log(Debug::Error) << "Unable to get preference service"
-        << Debug::flush;
-    return;
-  }
-  nsCOMPtr<nsIPrefBranch> branch;
-  prefService->GetBranch(GWT_DEV_PREFS_PREFIX, getter_AddRefs(branch));
-  if (!branch) {
-    Debug::log(Debug::Error) << "Unable to get " GWT_DEV_PREFS_PREFIX
-        " preference branch" << Debug::flush;
-    return;
-  }
-  prefs = do_QueryInterface(branch);
-  if (!prefs) {
-    Debug::log(Debug::Error) << "Unable to get nsIPrefBranch2" << Debug::flush;
-    return;
-  }
-  prefs->AddObserver(GWT_DEV_ACCESS_LIST, this, PR_FALSE);
-  nsCString prefValue;
-  if (branch->GetCharPref(GWT_DEV_ACCESS_LIST, getter_Copies(prefValue))
-      == NS_OK) {
-    loadAccessList(prefValue.get());
-  }
-}
-
-// implements nsIObserver
-NS_IMETHODIMP
-Preferences::Observe(nsISupports *aSubject, const char* aTopic,
-    const PRUnichar *aData) {
-  nsresult rv = NS_OK;
-  Debug::log(Debug::Spam) << "Preferences::Observe(subject="
-      << aSubject << ", topic=" << aTopic << ", data=" << aData << Debug::flush;
-  if (strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) {
-    return NS_ERROR_UNEXPECTED;
-  }
-  // TODO(jat): check preference name in aData if we ever add another one
-  nsCOMPtr<nsIPrefBranch> prefs(do_QueryInterface(aSubject, &rv));
-  NS_ENSURE_SUCCESS(rv, rv);
-  nsCString prefValue;
-  if (prefs->GetCharPref(GWT_DEV_ACCESS_LIST, getter_Copies(prefValue))
-      == NS_OK) {
-    loadAccessList(prefValue.get());
-  }
-  return NS_OK;
-}
-
-void Preferences::addNewRule(const std::string& pattern, bool exclude) {
-  nsCString prefValue;
-  if (prefs->GetCharPref(GWT_DEV_ACCESS_LIST, getter_Copies(prefValue))
-      != NS_OK) {
-    Debug::log(Debug::Error) << "Unable to retrieve access list preference"
-        << Debug::flush;
-    return;
-  }
-  // TODO(jat): see if the same rule already exists
-  std::string pref(prefValue.get());
-  if (pref.length() > 0) {
-    pref += ',';
-  }
-  if (exclude) {
-    pref += '!';
-  }
-  pref += pattern;
-  if (prefs->SetCharPref(GWT_DEV_ACCESS_LIST, pref.c_str()) != NS_OK) {
-    Debug::log(Debug::Error) << "Unable to save modified access list preference"
-        << Debug::flush;
-    return;
-  }
-}
-
-void Preferences::loadAccessList(const char* prefValue) {
-  if (!prefValue) {
-    return;
-  }
-  Debug::log(Debug::Spam) << "loadFromAccessList(prefValue=" << prefValue << ")"
-      << Debug::flush;
-  AllowedConnections::initFromAccessList(prefValue);
-}
-
-Preferences::~Preferences() {
-  if (prefs) {
-    prefs->RemoveObserver(GWT_DEV_ACCESS_LIST, this);
-  }
-}
diff --git a/plugins/xpcom/Preferences.h b/plugins/xpcom/Preferences.h
deleted file mode 100644
index 2bc0a81..0000000
--- a/plugins/xpcom/Preferences.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef _H_Preferences
-#define _H_Preferences
-/*
- * 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.
- */
-
-#include <string>
-
-#include "mozincludes.h"
-
-#include "nsCOMPtr.h"
-#include "nsISupports.h"
-#include "nsIObserver.h"
-#include "nsIPrefBranch2.h"
-
-class HostChannel;
-namespace gwt {
-  class Value;
-}
-
-class Preferences : public nsIObserver {
-  NS_DECL_ISUPPORTS
-  NS_DECL_NSIOBSERVER
-public:
-  Preferences();
-  virtual ~Preferences();
-
-  /**
-   * Add a new rule to the access list preference.
-   *
-   * @param pattern pattern to add (currently only an exact-match literal)
-   * @param exclude true if the pattern should be excluded from matches,
-   *     otherwise included
-   */
-  void addNewRule(const std::string& pattern, bool exclude);
-
-private:
-  static void loadAccessList(const char*);
-
-  nsCOMPtr<nsIPrefBranch2> prefs;
-};
-
-#endif
diff --git a/plugins/xpcom/README.txt b/plugins/xpcom/README.txt
deleted file mode 100644
index 0ef9b49..0000000
--- a/plugins/xpcom/README.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-You will need to checkout the SDKs required for building the plugin
-separately.  These are located at:
-	https://google-web-toolkit.googlecode.com/svn/plugin-sdks
-
-This assumes the SDKS are located in ../../../plugin-sdks -- if this is
-not correct, edit the definition in Makefile or pass PLUGIN_SDKS=<path> on the
-make command.
-
-Build by:
-
-make ARCH=x86 BROWSER=ff35
-make ARCH=x86_64 BROWSER=ff3
-
-etc -- default is current architecture and ff3.
-
-BROWSER values supported:
-  ff3	Firefox 3.0
-  ff3+  Firefox 3.0.11+ on some platforms
-  ff35  Firefox 3.5
-  ff36  Firefox 3.6
-  ff40  Firefox 4.0 (and 3.7alpha)
-
-You may need to try both ff3 and ff3+, as different platforms chose different
-library layouts.
-
-Targets of interest:
-  make linuxplatforms
-  make macplatforms
diff --git a/plugins/xpcom/RootedObject.h b/plugins/xpcom/RootedObject.h
deleted file mode 100755
index 1f85b71..0000000
--- a/plugins/xpcom/RootedObject.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef _H_RootedObject
-#define _H_RootedObject
-/*
- * 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.
- */
-
-#include "Debug.h"
-
-#include "jsapi.h"
-
-#if GECKO_VERSION < 2000
-#define JS_AddNamedObjectRoot JS_AddNamedRoot
-#define JS_AddNamedValueRoot JS_AddNamedRoot
-#define JS_RemoveObjectRoot JS_RemoveRoot
-#define JS_RemoveValueRoot JS_RemoveRoot
-#endif
-
-class RootedObject {
-public:
-  RootedObject(JSContext* ctx, const char* name = 0) : ctx(ctx), obj(0) {
-    if (!JS_AddNamedObjectRoot(ctx, &obj, name)) {
-      Debug::log(Debug::Error) << "RootedObject(" << (name ? name : "")
-          << "): JS_AddNamedRoot failed" << Debug::flush;
-    }
-  }
-  
-  ~RootedObject() {
-    // Always returns success, so no need to check.
-    JS_RemoveObjectRoot(ctx, &obj);
-  }
-  
-  JSObject& operator*() const {
-    assert(obj != 0);
-    return *obj;
-  }
-
-  JSObject* operator->() const  {
-    assert(obj != 0);
-    return obj;
-  }
-
-  bool operator==(JSObject* p) const {
-    return obj == p;
-  }
-
-  bool operator!=(JSObject* p) const {
-    return obj != p;
-  }
-
-  JSObject* get() const  {
-    return obj;
-  }
-  
-  RootedObject& operator=(JSObject* val) {
-    obj = val;
-    return *this;
-  }
-
-private:
-  JSContext* ctx;
-  JSObject* obj; 
-};
-
-inline bool operator==(JSObject* p, const RootedObject& ro) {
-  return p == ro.get();
-}
-
-inline bool operator!=(JSObject* p, const RootedObject& ro) {
-  return p != ro.get();
-}
-
-#endif
diff --git a/plugins/xpcom/SessionData.h b/plugins/xpcom/SessionData.h
deleted file mode 100755
index 3f77d42..0000000
--- a/plugins/xpcom/SessionData.h
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef _H_SessionData
-#define _H_SessionData
-/*
- * 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.
- */
-
-#include "mozincludes.h"
-
-#include "SessionHandler.h"
-
-#include "jsapi.h"
-
-#if GECKO_VERSION >= 2000 && GECKO_VERSION < 10000
-#include "jsobj.h"
-#endif
-
-class HostChannel;
-
-class SessionData {
-public:
-  SessionData(HostChannel* channel, SessionHandler* sessionHandler,
-      JSContext* ctx) : channel(channel), sessionHandler(sessionHandler),
-      global(SessionData::getJSGlobalObject(ctx)), runtime(JS_GetRuntime(ctx)),
-      toStringTearOff(JSVAL_VOID)
-  {
-  }
-
-  HostChannel* getHostChannel() const {
-    return channel;
-  }
-
-  SessionHandler* getSessionHandler() const {
-    return sessionHandler;
-  }
-
-  JSObject* getGlobalObject() const {
-    return global;
-  }
-
-  jsval getToStringTearOff() const {
-    return toStringTearOff;
-  }
-
-  /*
-  * Convert a value from the JavaScript into something that can be sent back
-  * to the OOPHM host.
-  */
-  virtual void makeValueFromJsval(gwt::Value& retVal, JSContext* ctx, const jsval& value)=0;
-
-  /*
-  * Convert a value from the OOPHM host into something that can be passed into
-  * the JavaScript execution environment.
-  */
-  virtual void makeJsvalFromValue(jsval& retVal, JSContext* ctx, const gwt::Value& value)=0;
-  
-  /*
-  * Removes the JavaObject wrapper with the given id and notifies the host.
-  */
-  virtual void freeJavaObject(int objectId)=0;
-
-private:
-  static JSObject* getJSGlobalObject(JSContext* ctx) {
-#if GECKO_VERSION < 10000
-    JSObject* global = JS_GetGlobalObject(ctx);
-#endif
-
-// See: https://developer.mozilla.org/en/SpiderMonkey/JSAPI_Reference/JS_GetGlobalObject
-#if GECKO_VERSION >= 2000 && GECKO_VERSION < 10000
-    // Innerize the global object from the WindowProxy object to its inner
-    // Window delegate since the proxy can't be used for evaluating scripts.
-    OBJ_TO_INNER_OBJECT(ctx, global);
-#endif
-
-#if GECKO_VERSION >= 10000
-    JSObject* global = JS_GetGlobalForScopeChain(ctx);
-#endif
-
-    return global;
-  }
-
-protected:
-  /*
-  * The communication channel used for the OOPHM session.
-  */
-  HostChannel* const channel;
-
-  /*
-  * A reference to the SessionHandler being used in the OOPHM session.
-  */
-  SessionHandler* const sessionHandler;
-
-  JSRuntime* runtime;
-  
-  JSObject* const global; 
-  
-  /**
-   * A function object representing the toString tear-off method.
-   */
-  jsval toStringTearOff;
-};
-
-#endif
diff --git a/plugins/xpcom/UserAgents.txt b/plugins/xpcom/UserAgents.txt
deleted file mode 100644
index 28d70ae..0000000
--- a/plugins/xpcom/UserAgents.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-User agents that work with ff3 XPI:
-===================================
-Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.13) Gecko/2009080315 Ubuntu/9.04 (jaunty) Firefox/3.08
-
-User agents that work with ff3+ XPI:
-====================================
-Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.12) Gecko/2009072110 Fedora/3.0.12-1.fc10 Firefox/3.0.12
-
diff --git a/plugins/xpcom/VisualStudio/FirefoxPlugins.sln b/plugins/xpcom/VisualStudio/FirefoxPlugins.sln
deleted file mode 100644
index e4bb71e..0000000
--- a/plugins/xpcom/VisualStudio/FirefoxPlugins.sln
+++ /dev/null
@@ -1,48 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff70-xpcom", "ff70-xpcom.vcxproj", "{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff60-xpcom", "ff60-xpcom.vcxproj", "{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff50-xpcom", "ff50-xpcom.vcxproj", "{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff40-xpcom", "ff40-xpcom.vcxproj", "{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff36-xpcom", "ff36-xpcom.vcxproj", "{37692217-C7AD-4FA9-A588-DDC11E17D925}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff35-xpcom", "ff35-xpcom.vcxproj", "{59A0C5AD-DE66-4C6D-9164-86F31308E719}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ff3-xpcom", "ff3-xpcom.vcxproj", "{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Debug|Win32.ActiveCfg = Debug|Win32
-		{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Debug|Win32.Build.0 = Debug|Win32
-		{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Release|Win32.ActiveCfg = Release|Win32
-		{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}.Release|Win32.Build.0 = Release|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Debug|Win32.ActiveCfg = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Debug|Win32.Build.0 = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Release|Win32.ActiveCfg = Release|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}.Release|Win32.Build.0 = Release|Win32
-		{37692217-C7AD-4FA9-A588-DDC11E17D925}.Debug|Win32.ActiveCfg = Debug|Win32
-		{37692217-C7AD-4FA9-A588-DDC11E17D925}.Debug|Win32.Build.0 = Debug|Win32
-		{37692217-C7AD-4FA9-A588-DDC11E17D925}.Release|Win32.ActiveCfg = Release|Win32
-		{37692217-C7AD-4FA9-A588-DDC11E17D925}.Release|Win32.Build.0 = Release|Win32
-		{59A0C5AD-DE66-4C6D-9164-86F31308E719}.Debug|Win32.ActiveCfg = Debug|Win32
-		{59A0C5AD-DE66-4C6D-9164-86F31308E719}.Debug|Win32.Build.0 = Debug|Win32
-		{59A0C5AD-DE66-4C6D-9164-86F31308E719}.Release|Win32.ActiveCfg = Release|Win32
-		{59A0C5AD-DE66-4C6D-9164-86F31308E719}.Release|Win32.Build.0 = Release|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Debug|Win32.ActiveCfg = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Debug|Win32.Build.0 = Debug|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Release|Win32.ActiveCfg = Release|Win32
-		{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/plugins/xpcom/VisualStudio/ff100-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff100-xpcom.vcproj
deleted file mode 100755
index c8b81e8..0000000
--- a/plugins/xpcom/VisualStudio/ff100-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff100-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff100-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug100"
-			IntermediateDirectory="Debug100"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff100\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=10000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff100\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release100"
-			IntermediateDirectory="Release100"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff100\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=10000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff100\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff100\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-10.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff110-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff110-xpcom.vcproj
deleted file mode 100755
index 3d46823..0000000
--- a/plugins/xpcom/VisualStudio/ff110-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff110-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff110-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug110"
-			IntermediateDirectory="Debug110"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff110\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=11000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff110\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release110"
-			IntermediateDirectory="Release110"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff110\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=11000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff110\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff110\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-11.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff120-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff120-xpcom.vcproj
deleted file mode 100755
index 340e6d4..0000000
--- a/plugins/xpcom/VisualStudio/ff120-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff120-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff120-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug120"
-			IntermediateDirectory="Debug120"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff120\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=12000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff120\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release120"
-			IntermediateDirectory="Release120"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff120\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=12000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff120\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff120\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-12.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj
deleted file mode 100755
index 4f3ac18..0000000
--- a/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff130-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff130-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug130"
-			IntermediateDirectory="Debug130"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff130\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=13000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff130\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="2"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release130"
-			IntermediateDirectory="Release130"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff130\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=13000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff130\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="2"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff130\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-13.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj
deleted file mode 100755
index ee3d7f9..0000000
--- a/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff140-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff140-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug140"
-			IntermediateDirectory="Debug140"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff140\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=14000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff140\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="2"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release140"
-			IntermediateDirectory="Release140"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff140\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=14000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff140\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="2"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff140\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-14.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj
deleted file mode 100755
index ebcf539..0000000
--- a/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj
+++ /dev/null
@@ -1,846 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff150-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff150-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug150"
-			IntermediateDirectory="Debug150"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff150\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=15000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff150\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="2"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release150"
-			IntermediateDirectory="Release150"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff150\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=15000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib msvcrt.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff150\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\lib&quot;"
-				IgnoreDefaultLibraryNames=""
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="2"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff150\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-15.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff160-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff160-xpcom.vcxproj
deleted file mode 100644
index b9e5a6f..0000000
--- a/plugins/xpcom/VisualStudio/ff160-xpcom.vcxproj
+++ /dev/null
@@ -1,280 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}</ProjectGuid>
-    <RootNamespace>ff160-xpcom</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug160\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug160\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release160\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release160\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">xpGwtDevPlugin</TargetName>
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">xpGwtDevPlugin</TargetName>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff160\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=16000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff160\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>true</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>Full</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff160\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=16000</PreprocessorDefinitions>
-      <ExceptionHandling>Sync</ExceptionHandling>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;msvcrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff160\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>true</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h" />
-    <ClInclude Include="..\FFSessionHandler.h" />
-    <ClInclude Include="..\prebuilt\ff160\include\IOOPHM.h" />
-    <ClInclude Include="..\JavaObject.h" />
-    <ClInclude Include="..\JSRunner.h" />
-    <ClInclude Include="..\mozincludes.h" />
-    <ClInclude Include="..\Preferences.h" />
-    <ClInclude Include="..\RootedObject.h" />
-    <ClInclude Include="..\SessionData.h" />
-    <ClInclude Include="..\XpcomDebug.h" />
-    <ClInclude Include="..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\common\ByteOrder.h" />
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\common\Debug.h" />
-    <ClInclude Include="..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\common\Message.h" />
-    <ClInclude Include="..\..\common\Platform.h" />
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
-    <ClInclude Include="..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\common\Socket.h" />
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\common\Value.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\include\js-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jsapi.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jsautocfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jscompat.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jsconfig.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\jsinttypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jslong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\jsosdep.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jsotypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jspubtd.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jstypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jsutil.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\include\mozilla-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpconnect\nsAXPCNativeCallContext.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsCOMPtr.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsCycleCollector.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsDebug.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsError.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\widget\nsEvent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsICategoryManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIClassInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIClassInfoImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIComponentManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsIEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsIException.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsIExceptionService.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIGenericFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\necko\nsIHttpProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsIInterfaceInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsIInterfaceInfoManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpconnect\nsIJSContextStack.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIModule.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\caps\nsIPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIProgrammingLanguage.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\necko\nsIProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\necko\nsIProxiedProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpconnect\nsIScriptableInterfaces.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\dom\nsIScriptGlobalObject.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\dom\nsIScriptObjectPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\caps\nsISecurityCheckedComponent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsISerializable.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIServiceManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsISupportsImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsIURI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsIVariant.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpconnect\nsIXPConnect.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\necko\nsNetCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsServiceManagerUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsStringAPI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsTraceRefcnt.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsXPCOM.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsXPCOMCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\nsXPCOMStrings.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\pratom.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prcpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prinrval.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prlock.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prlog.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prlong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\obsolete\protypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prthread.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prtime.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\prtypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpconnect\xpccomponents.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpconnect\xpcexception.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpconnect\xpcjsid.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\WINNT_x86-msvc\include\xpcom-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\xpt_arena.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\xpt_struct.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\xpcom\xptinfo.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-16.0.0\include\js\jsproto.tbl" />
-    <None Include="..\xpGwtDevPlugin.def" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp" />
-    <ClCompile Include="..\FFSessionHandler.cpp" />
-    <ClCompile Include="..\JavaObject.cpp" />
-    <ClCompile Include="..\JSRunner.cpp" />
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
-      <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp" />
-    <ClCompile Include="..\XpcomDebug.cpp" />
-    <ClCompile Include="..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj
deleted file mode 100755
index 582c455..0000000
--- a/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj
+++ /dev/null
@@ -1,837 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff3-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}"
-	RootNamespace="ff3-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug3"
-			IntermediateDirectory="Debug3"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;&quot;..\prebuilt\ff3\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release3"
-			IntermediateDirectory="Release3"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff3\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include&quot;"
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff3;GECKO_VERSION=1900"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff3\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj
deleted file mode 100644
index 53575bb..0000000
--- a/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj
+++ /dev/null
@@ -1,269 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{6BF0C2CE-CB0C-421B-A67C-1E448371D24C}</ProjectGuid>
-    <RootNamespace>ff3-xpcom</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug3\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug3\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release3\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release3\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff3\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff3;GECKO_VERSION=1900;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>Full</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff3\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff3;GECKO_VERSION=1900;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ExceptionHandling>Sync</ExceptionHandling>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff3\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h" />
-    <ClInclude Include="..\FFSessionHandler.h" />
-    <ClInclude Include="..\prebuilt\ff3\include\IOOPHM.h" />
-    <ClInclude Include="..\JavaObject.h" />
-    <ClInclude Include="..\JSRunner.h" />
-    <ClInclude Include="..\ModuleOOPHM.h" />
-    <ClInclude Include="..\mozincludes.h" />
-    <ClInclude Include="..\Preferences.h" />
-    <ClInclude Include="..\RootedObject.h" />
-    <ClInclude Include="..\SessionData.h" />
-    <ClInclude Include="..\XpcomDebug.h" />
-    <ClInclude Include="..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\common\ByteOrder.h" />
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\common\Debug.h" />
-    <ClInclude Include="..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\common\Message.h" />
-    <ClInclude Include="..\..\common\Platform.h" />
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
-    <ClInclude Include="..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\common\Socket.h" />
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\common\Value.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsapi.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsautocfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscompat.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsconfig.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jslong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsosdep.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsotypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jspubtd.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jstypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\mozilla-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsAXPCNativeCallContext.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCOMPtr.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCycleCollector.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsDebug.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsError.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsEvent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsICategoryManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfoImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIComponentManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIException.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIExceptionService.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIGenericFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIHttpProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfoManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIJSContextStack.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIModule.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProgrammingLanguage.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProxiedProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptableInterfaces.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptGlobalObject.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptObjectPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISecurityCheckedComponent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISerializable.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIServiceManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIURI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIVariant.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIXPConnect.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsNetCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsServiceManagerUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsStringAPI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsTraceRefcnt.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOM.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMStrings.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\pratom.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prcpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prinrval.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlock.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlog.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\obsolete\protypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prthread.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtime.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpccomponents.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcexception.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcjsid.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\xpcom-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_arena.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_struct.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xptinfo.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsproto.tbl" />
-    <None Include="..\xpGwtDevPlugin.def" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp" />
-    <ClCompile Include="..\FFSessionHandler.cpp" />
-    <ClCompile Include="..\JavaObject.cpp" />
-    <ClCompile Include="..\JSRunner.cpp" />
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
-      <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp" />
-    <ClCompile Include="..\XpcomDebug.cpp" />
-    <ClCompile Include="..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj.filters
deleted file mode 100644
index 94395ca..0000000
--- a/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj.filters
+++ /dev/null
@@ -1,460 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Header Files\common">
-      <UniqueIdentifier>{fc617b60-337a-4e22-a021-35cb77fb21d7}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\gecko">
-      <UniqueIdentifier>{9d802c13-b225-4cb5-8cbf-794f114b390a}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
-    </Filter>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Source Files\common">
-      <UniqueIdentifier>{b7f8abdc-77a5-4e89-9c37-3528a82c42d2}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\FFSessionHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\prebuilt\ff3\include\IOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JavaObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JSRunner.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\ModuleOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\mozincludes.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Preferences.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\RootedObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\SessionData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\XpcomDebug.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\AllowedConnections.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\BrowserChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ByteOrder.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Debug.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\DebugLevel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FatalErrorMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FreeValueMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HashMap.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HostChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadJsniMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadModuleMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Message.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Platform.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\QuitMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ReturnMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ServerMethods.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SessionHandler.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Socket.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Value.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsapi.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsautocfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscompat.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsconfig.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jslong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsosdep.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsotypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jspubtd.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jstypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsutil.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\mozilla-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsAXPCNativeCallContext.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCOMPtr.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsCycleCollector.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsDebug.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsError.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsEvent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsICategoryManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIClassInfoImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIComponentManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIException.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIExceptionService.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIGenericFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIHttpProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIInterfaceInfoManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIJSContextStack.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIModule.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProgrammingLanguage.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIProxiedProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptableInterfaces.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptGlobalObject.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIScriptObjectPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISecurityCheckedComponent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISerializable.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIServiceManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIURI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIVariant.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsIXPConnect.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsNetCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsServiceManagerUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsStringAPI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsTraceRefcnt.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOM.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\nsXPCOMStrings.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\pratom.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prcpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prinrval.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlock.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlog.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prlong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\obsolete\protypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prthread.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtime.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\prtypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpccomponents.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcexception.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpcjsid.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\WINNT_x86-msvc\include\xpcom-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_arena.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xpt_struct.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\xptinfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.0\include\jsproto.tbl">
-      <Filter>Header Files\gecko</Filter>
-    </None>
-    <None Include="..\xpGwtDevPlugin.def">
-      <Filter>Source Files</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\FFSessionHandler.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JavaObject.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JSRunner.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\XpcomDebug.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\AllowedConnections.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Debug.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\HostChannel.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ReturnMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ServerMethods.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Socket.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff35-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff35-xpcom.vcproj
deleted file mode 100755
index 02682dc..0000000
--- a/plugins/xpcom/VisualStudio/ff35-xpcom.vcproj
+++ /dev/null
@@ -1,837 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff35-xpcom"
-	ProjectGUID="{59A0C5AD-DE66-4C6D-9164-86F31308E719}"
-	RootNamespace="ff35-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug35"
-			IntermediateDirectory="Debug35"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff35\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release35"
-			IntermediateDirectory="Release35"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff35\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include&quot;"
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff35;GECKO_VERSION=1901"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff35\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj
deleted file mode 100644
index eaef50d..0000000
--- a/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj
+++ /dev/null
@@ -1,275 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{59A0C5AD-DE66-4C6D-9164-86F31308E719}</ProjectGuid>
-    <RootNamespace>ff35-xpcom</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug35\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug35\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release35\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release35\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff35\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff35;GECKO_VERSION=1901;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>Full</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff35\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff35;GECKO_VERSION=1901;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ExceptionHandling>Sync</ExceptionHandling>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff35\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h" />
-    <ClInclude Include="..\FFSessionHandler.h" />
-    <ClInclude Include="..\prebuilt\ff35\include\IOOPHM.h" />
-    <ClInclude Include="..\JavaObject.h" />
-    <ClInclude Include="..\JSRunner.h" />
-    <ClInclude Include="..\ModuleOOPHM.h" />
-    <ClInclude Include="..\mozincludes.h" />
-    <ClInclude Include="..\Preferences.h" />
-    <ClInclude Include="..\RootedObject.h" />
-    <ClInclude Include="..\SessionData.h" />
-    <ClInclude Include="..\XpcomDebug.h" />
-    <ClInclude Include="..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\common\ByteOrder.h" />
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\common\Debug.h" />
-    <ClInclude Include="..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\common\Message.h" />
-    <ClInclude Include="..\..\common\Platform.h" />
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
-    <ClInclude Include="..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\common\Socket.h" />
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\common\Value.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsapi.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsautocfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jscompat.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsconfig.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jslong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jsosdep.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsotypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jspubtd.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jstypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\mozilla-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsAXPCNativeCallContext.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCOMPtr.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCycleCollector.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsDebug.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsError.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\widget\nsEvent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsICategoryManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfoImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIComponentManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIException.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIExceptionService.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIGenericFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIHttpProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfoManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIJSContextStack.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIModule.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsIPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIProgrammingLanguage.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProxiedProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIScriptableInterfaces.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptGlobalObject.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptObjectPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsISecurityCheckedComponent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISerializable.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIServiceManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIURI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIVariant.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIXPConnect.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsNetCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsServiceManagerUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsStringAPI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsTraceRefcnt.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOM.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMStrings.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\pratom.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prcpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prinrval.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlock.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlog.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\obsolete\protypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prthread.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtime.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpccomponents.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcexception.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcjsid.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\xpcom-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_arena.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_struct.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xptinfo.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsproto.tbl" />
-    <None Include="..\xpGwtDevPlugin.def" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp" />
-    <ClCompile Include="..\FFSessionHandler.cpp" />
-    <ClCompile Include="..\JavaObject.cpp" />
-    <ClCompile Include="..\JSRunner.cpp" />
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
-      <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp" />
-    <ClCompile Include="..\XpcomDebug.cpp" />
-    <ClCompile Include="..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj.filters
deleted file mode 100644
index ce2cab8..0000000
--- a/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj.filters
+++ /dev/null
@@ -1,478 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Header Files\common">
-      <UniqueIdentifier>{4f18743c-59fe-408a-91e9-dc3d52dcdb5f}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\gecko">
-      <UniqueIdentifier>{df580225-cf8c-4a43-b99e-1fe657ff5722}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
-    </Filter>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Source Files\common">
-      <UniqueIdentifier>{a894e408-3d66-4e63-ac34-51c4a524cfd4}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\FFSessionHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\prebuilt\ff35\include\IOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JavaObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JSRunner.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\ModuleOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\mozincludes.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Preferences.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\RootedObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\SessionData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\XpcomDebug.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\AllowedConnections.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\BrowserChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ByteOrder.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Debug.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\DebugLevel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FatalErrorMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FreeValueMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HashMap.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HostChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadJsniMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadModuleMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Message.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Platform.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\QuitMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ReturnMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ServerMethods.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SessionHandler.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Socket.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Value.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsapi.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsautocfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jscompat.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsconfig.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jslong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\jsosdep.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsotypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jspubtd.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jstypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsutil.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\mozilla-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsAXPCNativeCallContext.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCOMPtr.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsCycleCollector.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsDebug.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsError.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\widget\nsEvent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsICategoryManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIClassInfoImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIComponentManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIException.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIExceptionService.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIGenericFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIHttpProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIInterfaceInfoManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIJSContextStack.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIModule.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsIPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIProgrammingLanguage.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsIProxiedProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIScriptableInterfaces.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptGlobalObject.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\dom\nsIScriptObjectPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\caps\nsISecurityCheckedComponent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISerializable.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIServiceManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsIURI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsIVariant.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\nsIXPConnect.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\necko\nsNetCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsServiceManagerUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsStringAPI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsTraceRefcnt.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOM.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\nsXPCOMStrings.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\pratom.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prcpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prinrval.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlock.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlog.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prlong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\obsolete\protypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prthread.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtime.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\prtypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpccomponents.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcexception.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpconnect\xpcjsid.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\WINNT_x86-msvc\include\xpcom-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_arena.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xpt_struct.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\xpcom\xptinfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.1\include\js\jsproto.tbl">
-      <Filter>Header Files\gecko</Filter>
-    </None>
-    <None Include="..\xpGwtDevPlugin.def">
-      <Filter>Source Files</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\FFSessionHandler.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JavaObject.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JSRunner.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\XpcomDebug.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\AllowedConnections.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Debug.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\HostChannel.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ReturnMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ServerMethods.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Socket.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff36-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff36-xpcom.vcproj
deleted file mode 100644
index f1667a1..0000000
--- a/plugins/xpcom/VisualStudio/ff36-xpcom.vcproj
+++ /dev/null
@@ -1,849 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff36-xpcom"
-	ProjectGUID="{37692217-C7AD-4FA9-A588-DDC11E17D925}"
-	RootNamespace="ff36-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug36"
-			IntermediateDirectory="Debug36"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff36\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release36"
-			IntermediateDirectory="Release36"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff36\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include&quot;"
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib xpcomglue_s.lib xpcom.lib nspr4.lib js3250.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff36\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj
deleted file mode 100644
index d00b934..0000000
--- a/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj
+++ /dev/null
@@ -1,278 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{37692217-C7AD-4FA9-A588-DDC11E17D925}</ProjectGuid>
-    <RootNamespace>ff36-xpcom</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug36\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug36\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release36\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release36\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff36\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>Full</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff36\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Warning;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF3;BROWSER=ff36;GECKO_VERSION=1910;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <ExceptionHandling>Sync</ExceptionHandling>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;js3250.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff36\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h" />
-    <ClInclude Include="..\FFSessionHandler.h" />
-    <ClInclude Include="..\prebuilt\ff36\include\IOOPHM.h" />
-    <ClInclude Include="..\JavaObject.h" />
-    <ClInclude Include="..\JSRunner.h" />
-    <ClInclude Include="..\ModuleOOPHM.h" />
-    <ClInclude Include="..\mozincludes.h" />
-    <ClInclude Include="..\Preferences.h" />
-    <ClInclude Include="..\RootedObject.h" />
-    <ClInclude Include="..\SessionData.h" />
-    <ClInclude Include="..\XpcomDebug.h" />
-    <ClInclude Include="..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\common\ByteOrder.h" />
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\common\Debug.h" />
-    <ClInclude Include="..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\common\Message.h" />
-    <ClInclude Include="..\..\common\Platform.h" />
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
-    <ClInclude Include="..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\common\Socket.h" />
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\common\Value.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\js-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsapi.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsautocfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jscompat.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsconfig.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsinttypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jslong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsosdep.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsotypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jspubtd.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jstypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\mozilla-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsAXPCNativeCallContext.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCOMPtr.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCycleCollector.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsDebug.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsError.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\widget\nsEvent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsICategoryManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfoImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIComponentManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIException.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIExceptionService.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIGenericFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIHttpProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfoManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIJSContextStack.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIModule.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsIPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIProgrammingLanguage.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProxiedProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIScriptableInterfaces.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptGlobalObject.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptObjectPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsISecurityCheckedComponent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISerializable.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIServiceManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIURI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIVariant.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIXPConnect.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsNetCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsServiceManagerUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsStringAPI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsTraceRefcnt.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOM.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMStrings.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\pratom.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prcpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prinrval.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlock.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlog.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\obsolete\protypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prthread.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtime.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpccomponents.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcexception.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcjsid.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\xpcom-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_arena.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_struct.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xptinfo.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsproto.tbl" />
-    <None Include="..\xpGwtDevPlugin.def" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp" />
-    <ClCompile Include="..\FFSessionHandler.cpp" />
-    <ClCompile Include="..\JavaObject.cpp" />
-    <ClCompile Include="..\JSRunner.cpp" />
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
-      <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp" />
-    <ClCompile Include="..\XpcomDebug.cpp" />
-    <ClCompile Include="..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj.filters
deleted file mode 100644
index 4e8e2db..0000000
--- a/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj.filters
+++ /dev/null
@@ -1,487 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Header Files\common">
-      <UniqueIdentifier>{f5a3dd15-8632-44d4-9eae-08d8ce7f6140}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\gecko">
-      <UniqueIdentifier>{7e144492-1e7b-48d4-8fd9-027f5d1d157d}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
-    </Filter>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Source Files\common">
-      <UniqueIdentifier>{b9a8c71b-0d6b-43ae-9af8-53dc254d84e0}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\FFSessionHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\prebuilt\ff36\include\IOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JavaObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JSRunner.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\ModuleOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\mozincludes.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Preferences.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\RootedObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\SessionData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\XpcomDebug.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\AllowedConnections.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\BrowserChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ByteOrder.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Debug.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\DebugLevel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FatalErrorMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FreeValueMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HashMap.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HostChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadJsniMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadModuleMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Message.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Platform.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\QuitMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ReturnMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ServerMethods.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SessionHandler.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Socket.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Value.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\js-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsapi.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsautocfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jscompat.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsconfig.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsinttypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jslong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\jsosdep.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsotypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jspubtd.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jstypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsutil.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\mozilla-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsAXPCNativeCallContext.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCOMPtr.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsCycleCollector.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsDebug.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsError.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\widget\nsEvent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsICategoryManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIClassInfoImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIComponentManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIException.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIExceptionService.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIGenericFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIHttpProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIInterfaceInfoManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIJSContextStack.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIModule.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsIPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIProgrammingLanguage.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsIProxiedProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIScriptableInterfaces.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptGlobalObject.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\dom\nsIScriptObjectPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\caps\nsISecurityCheckedComponent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISerializable.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIServiceManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsIURI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsIVariant.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\nsIXPConnect.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\necko\nsNetCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsServiceManagerUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsStringAPI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsTraceRefcnt.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOM.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\nsXPCOMStrings.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\pratom.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prcpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prinrval.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlock.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlog.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prlong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\obsolete\protypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prthread.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtime.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\prtypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpccomponents.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcexception.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpconnect\xpcjsid.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\WINNT_x86-msvc\include\xpcom-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_arena.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xpt_struct.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\xpcom\xptinfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-1.9.2\include\js\jsproto.tbl">
-      <Filter>Header Files\gecko</Filter>
-    </None>
-    <None Include="..\xpGwtDevPlugin.def">
-      <Filter>Source Files</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\FFSessionHandler.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JavaObject.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JSRunner.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\XpcomDebug.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\AllowedConnections.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Debug.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\HostChannel.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ReturnMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ServerMethods.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Socket.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff40-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff40-xpcom.vcproj
deleted file mode 100644
index 2821a53..0000000
--- a/plugins/xpcom/VisualStudio/ff40-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff40-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff40-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug40"
-			IntermediateDirectory="Debug40"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff40\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release40"
-			IntermediateDirectory="Release40"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff40\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff40\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj
deleted file mode 100644
index 97a2154..0000000
--- a/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj
+++ /dev/null
@@ -1,277 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}</ProjectGuid>
-    <RootNamespace>ff40-xpcom</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug40\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug40\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release40\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release40\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff40\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>Full</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff40\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000</PreprocessorDefinitions>
-      <ExceptionHandling>Sync</ExceptionHandling>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff40\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h" />
-    <ClInclude Include="..\FFSessionHandler.h" />
-    <ClInclude Include="..\prebuilt\ff40\include\IOOPHM.h" />
-    <ClInclude Include="..\JavaObject.h" />
-    <ClInclude Include="..\JSRunner.h" />
-    <ClInclude Include="..\mozincludes.h" />
-    <ClInclude Include="..\Preferences.h" />
-    <ClInclude Include="..\RootedObject.h" />
-    <ClInclude Include="..\SessionData.h" />
-    <ClInclude Include="..\XpcomDebug.h" />
-    <ClInclude Include="..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\common\ByteOrder.h" />
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\common\Debug.h" />
-    <ClInclude Include="..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\common\Message.h" />
-    <ClInclude Include="..\..\common\Platform.h" />
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
-    <ClInclude Include="..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\common\Socket.h" />
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\common\Value.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\js-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsapi.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsautocfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jscompat.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsconfig.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsinttypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jslong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsosdep.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsotypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jspubtd.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jstypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\mozilla-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsAXPCNativeCallContext.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCOMPtr.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCycleCollector.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsDebug.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsError.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\widget\nsEvent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsICategoryManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfoImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIComponentManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIException.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIExceptionService.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIGenericFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIHttpProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfoManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIJSContextStack.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIModule.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsIPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIProgrammingLanguage.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProxiedProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIScriptableInterfaces.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptGlobalObject.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptObjectPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsISecurityCheckedComponent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISerializable.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIServiceManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIURI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIVariant.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIXPConnect.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsNetCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsServiceManagerUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsStringAPI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsTraceRefcnt.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOM.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMStrings.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\pratom.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prcpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prinrval.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlock.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlog.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\obsolete\protypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prthread.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtime.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpccomponents.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcexception.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcjsid.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\xpcom-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_arena.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_struct.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xptinfo.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsproto.tbl" />
-    <None Include="..\xpGwtDevPlugin.def" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp" />
-    <ClCompile Include="..\FFSessionHandler.cpp" />
-    <ClCompile Include="..\JavaObject.cpp" />
-    <ClCompile Include="..\JSRunner.cpp" />
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
-      <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp" />
-    <ClCompile Include="..\XpcomDebug.cpp" />
-    <ClCompile Include="..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj.filters
deleted file mode 100644
index 3b0a31b..0000000
--- a/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj.filters
+++ /dev/null
@@ -1,484 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Header Files\common">
-      <UniqueIdentifier>{a7c29063-75f8-42b1-965f-a05c1216d850}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\gecko">
-      <UniqueIdentifier>{5a35bded-1db6-48ba-ae1a-efd9f28c578f}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
-    </Filter>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Source Files\common">
-      <UniqueIdentifier>{155aa627-d60d-49af-9953-f150d540f110}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\FFSessionHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\prebuilt\ff40\include\IOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JavaObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JSRunner.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\mozincludes.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Preferences.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\RootedObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\SessionData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\XpcomDebug.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\AllowedConnections.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\BrowserChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ByteOrder.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Debug.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\DebugLevel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FatalErrorMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FreeValueMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HashMap.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HostChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadJsniMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadModuleMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Message.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Platform.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\QuitMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ReturnMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ServerMethods.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SessionHandler.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Socket.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Value.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\js-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsapi.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsautocfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jscompat.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsconfig.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsinttypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jslong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\jsosdep.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsotypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jspubtd.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jstypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsutil.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\mozilla-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsAXPCNativeCallContext.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCOMPtr.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsCycleCollector.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsDebug.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsError.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\widget\nsEvent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsICategoryManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIClassInfoImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIComponentManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIException.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIExceptionService.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIGenericFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIHttpProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIInterfaceInfoManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIJSContextStack.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIModule.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsIPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIProgrammingLanguage.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsIProxiedProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIScriptableInterfaces.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptGlobalObject.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\dom\nsIScriptObjectPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\caps\nsISecurityCheckedComponent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISerializable.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIServiceManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsIURI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsIVariant.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\nsIXPConnect.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\necko\nsNetCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsServiceManagerUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsStringAPI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsTraceRefcnt.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOM.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\nsXPCOMStrings.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\pratom.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prcpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prinrval.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlock.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlog.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prlong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\obsolete\protypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prthread.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtime.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\prtypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpccomponents.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcexception.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpconnect\xpcjsid.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\WINNT_x86-msvc\include\xpcom-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_arena.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xpt_struct.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\xpcom\xptinfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-2.0.0\include\js\jsproto.tbl">
-      <Filter>Header Files\gecko</Filter>
-    </None>
-    <None Include="..\xpGwtDevPlugin.def">
-      <Filter>Source Files</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\FFSessionHandler.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JavaObject.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JSRunner.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\XpcomDebug.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\AllowedConnections.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Debug.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\HostChannel.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ReturnMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ServerMethods.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Socket.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff50-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff50-xpcom.vcproj
deleted file mode 100644
index 6071520..0000000
--- a/plugins/xpcom/VisualStudio/ff50-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff50-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff50-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug50"
-			IntermediateDirectory="Debug50"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff50\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release50"
-			IntermediateDirectory="Release50"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff50\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff50\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj
deleted file mode 100644
index 8db2270..0000000
--- a/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj
+++ /dev/null
@@ -1,277 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{58AE040D-01CC-4E4A-AE98-BEDE56480AE9}</ProjectGuid>
-    <RootNamespace>ff50-xpcom</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>Static</UseOfMfc>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug50\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug50\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release50\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release50\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff50\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <Optimization>Full</Optimization>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <AdditionalIncludeDirectories>$(ProjectDir)\..\..\common;..\prebuilt\ff50\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\mozilla;..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000</PreprocessorDefinitions>
-      <ExceptionHandling>Sync</ExceptionHandling>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <ResourceOutputFileName>$(IntDir)$(TargetName).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>ws2_32.lib;Advapi32.lib;xpcomglue_s.lib;xpcom.lib;nspr4.lib;mozalloc.lib;xul.lib;mozjs.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ShowProgress>LinkVerboseLib</ShowProgress>
-      <OutputFile>$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff50\xpGwtDevPlugin.dll</OutputFile>
-      <AdditionalLibraryDirectories>..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>$(ProjectDir)\..\xpGwtDevPlugin.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h" />
-    <ClInclude Include="..\FFSessionHandler.h" />
-    <ClInclude Include="..\prebuilt\ff50\include\IOOPHM.h" />
-    <ClInclude Include="..\JavaObject.h" />
-    <ClInclude Include="..\JSRunner.h" />
-    <ClInclude Include="..\mozincludes.h" />
-    <ClInclude Include="..\Preferences.h" />
-    <ClInclude Include="..\RootedObject.h" />
-    <ClInclude Include="..\SessionData.h" />
-    <ClInclude Include="..\XpcomDebug.h" />
-    <ClInclude Include="..\..\common\AllowedConnections.h" />
-    <ClInclude Include="..\..\common\BrowserChannel.h" />
-    <ClInclude Include="..\..\common\ByteOrder.h" />
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h" />
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h" />
-    <ClInclude Include="..\..\common\Debug.h" />
-    <ClInclude Include="..\..\common\DebugLevel.h" />
-    <ClInclude Include="..\..\common\FatalErrorMessage.h" />
-    <ClInclude Include="..\..\common\FreeValueMessage.h" />
-    <ClInclude Include="..\..\common\HashMap.h" />
-    <ClInclude Include="..\..\common\HostChannel.h" />
-    <ClInclude Include="..\..\common\InvokeMessage.h" />
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h" />
-    <ClInclude Include="..\..\common\LoadJsniMessage.h" />
-    <ClInclude Include="..\..\common\LoadModuleMessage.h" />
-    <ClInclude Include="..\..\common\Message.h" />
-    <ClInclude Include="..\..\common\Platform.h" />
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h" />
-    <ClInclude Include="..\..\common\QuitMessage.h" />
-    <ClInclude Include="..\..\common\ReturnMessage.h" />
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h" />
-    <ClInclude Include="..\..\common\ServerMethods.h" />
-    <ClInclude Include="..\..\common\SessionHandler.h" />
-    <ClInclude Include="..\..\common\Socket.h" />
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h" />
-    <ClInclude Include="..\..\common\Value.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\js-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsapi.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsautocfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jscompat.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsconfig.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jscpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsinttypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jslong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsosdep.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsotypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jspubtd.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jstypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\mozilla-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsAXPCNativeCallContext.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCOMPtr.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nscore.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCycleCollector.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsDebug.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsError.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\widget\nsEvent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsICategoryManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfoImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIComponentManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIException.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIExceptionService.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIGenericFactory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIHttpProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfo.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfoManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIJSContextStack.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIModule.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsIPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIProgrammingLanguage.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProxiedProtocolHandler.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIScriptableInterfaces.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptGlobalObject.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptObjectPrincipal.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsISecurityCheckedComponent.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISerializable.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIServiceManager.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISimpleEnumerator.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupports.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsBase.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsImpl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIURI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIVariant.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIXPConnect.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsMemory.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsNetCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsrootidl.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsServiceManagerUtils.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsStringAPI.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsTraceRefcnt.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOM.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMCID.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMStrings.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\pratom.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prcpucfg.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prinrval.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlock.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlog.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlong.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\obsolete\protypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prthread.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtime.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtypes.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpccomponents.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcexception.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcjsid.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\xpcom-config.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_arena.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_struct.h" />
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xptinfo.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsproto.tbl" />
-    <None Include="..\xpGwtDevPlugin.def" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp" />
-    <ClCompile Include="..\FFSessionHandler.cpp" />
-    <ClCompile Include="..\JavaObject.cpp" />
-    <ClCompile Include="..\JSRunner.cpp" />
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>
-      <PreprocessSuppressLineNumbers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessSuppressLineNumbers>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp" />
-    <ClCompile Include="..\XpcomDebug.cpp" />
-    <ClCompile Include="..\..\common\AllowedConnections.cpp" />
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp" />
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp" />
-    <ClCompile Include="..\..\common\Debug.cpp" />
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp" />
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp" />
-    <ClCompile Include="..\..\common\HostChannel.cpp" />
-    <ClCompile Include="..\..\common\InvokeMessage.cpp" />
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp" />
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp" />
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp" />
-    <ClCompile Include="..\..\common\ReturnMessage.cpp" />
-    <ClCompile Include="..\..\common\ServerMethods.cpp" />
-    <ClCompile Include="..\..\common\Socket.cpp" />
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj.filters b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj.filters
deleted file mode 100644
index 0bd143e..0000000
--- a/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj.filters
+++ /dev/null
@@ -1,484 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Header Files\common">
-      <UniqueIdentifier>{a7c29063-75f8-42b1-965f-a05c1216d850}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\gecko">
-      <UniqueIdentifier>{5a35bded-1db6-48ba-ae1a-efd9f28c578f}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
-    </Filter>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Source Files\common">
-      <UniqueIdentifier>{155aa627-d60d-49af-9953-f150d540f110}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="..\ExternalWrapper.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\FFSessionHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\prebuilt\ff40\include\IOOPHM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JavaObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\JSRunner.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\mozincludes.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\Preferences.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\RootedObject.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\SessionData.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\XpcomDebug.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\AllowedConnections.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\BrowserChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ByteOrder.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\CheckVersionsMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ChooseTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Debug.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\DebugLevel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FatalErrorMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\FreeValueMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HashMap.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\HostChannel.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\InvokeSpecialMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadJsniMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\LoadModuleMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Message.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Platform.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ProtocolVersionMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\QuitMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ReturnMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\scoped_ptr\scoped_ptr.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\ServerMethods.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SessionHandler.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Socket.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\SwitchTransportMessage.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\common\Value.h">
-      <Filter>Header Files\common</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\js-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsapi.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsautocfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jscompat.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsconfig.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jscpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsinttypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jslong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\jsosdep.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsotypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jspubtd.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jstypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsutil.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\mozilla-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsAXPCNativeCallContext.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCOMPtr.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nscore.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsCycleCollector.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsDebug.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsError.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\widget\nsEvent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsICategoryManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIClassInfoImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIComponentManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIException.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIExceptionService.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIGenericFactory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIHttpProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIInterfaceInfoManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIJSContextStack.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIModule.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsIPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIProgrammingLanguage.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsIProxiedProtocolHandler.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIScriptableInterfaces.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptGlobalObject.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\dom\nsIScriptObjectPrincipal.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\caps\nsISecurityCheckedComponent.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISerializable.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIServiceManager.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISimpleEnumerator.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupports.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsBase.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsImpl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsISupportsUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsIURI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsIVariant.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\nsIXPConnect.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsMemory.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\necko\nsNetCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsrootidl.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsServiceManagerUtils.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsStringAPI.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsTraceRefcnt.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOM.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMCID.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\nsXPCOMStrings.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\pratom.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prcpucfg.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prinrval.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlock.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlog.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prlong.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\obsolete\protypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prthread.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtime.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\prtypes.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpccomponents.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcexception.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpconnect\xpcjsid.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\WINNT_x86-msvc\include\xpcom-config.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_arena.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xpt_struct.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\xpcom\xptinfo.h">
-      <Filter>Header Files\gecko</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="..\..\..\..\plugin-sdks\gecko-sdks\gecko-5.0.0\include\js\jsproto.tbl">
-      <Filter>Header Files\gecko</Filter>
-    </None>
-    <None Include="..\xpGwtDevPlugin.def">
-      <Filter>Source Files</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\xpGwtDevPlugin.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\ExternalWrapper.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\FFSessionHandler.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JavaObject.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\JSRunner.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\ModuleOOPHM.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\Preferences.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\XpcomDebug.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\AllowedConnections.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\CheckVersionsMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ChooseTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Debug.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FatalErrorMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\FreeValueMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\HostChannel.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\InvokeSpecialMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadJsniMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\LoadModuleMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ProtocolVersionMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ReturnMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\ServerMethods.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\Socket.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\common\SwitchTransportMessage.cpp">
-      <Filter>Source Files\common</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/plugins/xpcom/VisualStudio/ff60-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff60-xpcom.vcproj
deleted file mode 100755
index fe269c3..0000000
--- a/plugins/xpcom/VisualStudio/ff60-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff60-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff60-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug60"
-			IntermediateDirectory="Debug60"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff60\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff60\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release60"
-			IntermediateDirectory="Release60"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff60\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff60\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff60\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-6.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff70-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff70-xpcom.vcproj
deleted file mode 100755
index d4f64e3..0000000
--- a/plugins/xpcom/VisualStudio/ff70-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff70-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff70-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug70"
-			IntermediateDirectory="Debug70"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff70\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff70\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release70"
-			IntermediateDirectory="Release70"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff70\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF4;GECKO_VERSION=2000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff70\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff70\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-7.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff80-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff80-xpcom.vcproj
deleted file mode 100755
index a007fbd..0000000
--- a/plugins/xpcom/VisualStudio/ff80-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff80-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff80-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug80"
-			IntermediateDirectory="Debug80"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff80\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=8000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff80\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release80"
-			IntermediateDirectory="Release80"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff80\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=8000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff80\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff80\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-8.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/VisualStudio/ff90-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff90-xpcom.vcproj
deleted file mode 100755
index 51ee65c..0000000
--- a/plugins/xpcom/VisualStudio/ff90-xpcom.vcproj
+++ /dev/null
@@ -1,845 +0,0 @@
-﻿<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="ff90-xpcom"
-	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24D}"
-	RootNamespace="ff90-xpcom"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug90"
-			IntermediateDirectory="Debug90"
-			ConfigurationType="2"
-			UseOfMFC="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff90\include;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\mozilla&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect&quot;;&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include&quot;"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=9000"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff90\xpGwtDevPlugin.dll"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release90"
-			IntermediateDirectory="Release90"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="3"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..\..\common&quot;;..\prebuilt\ff90\include;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\mozilla&quot;;&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include&quot;;&quot;..\..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect&quot;"
-				PreprocessorDefinitions="WIN32;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS;GWT_DEBUGLEVEL=Debugging;XPCOM_GLUE;XPCOM_GLUE_USE_NSPR;MOZILLA_STRICT_API;BROWSER_FF8;GECKO_VERSION=9000;$(NOINHERIT)"
-				ExceptionHandling="1"
-				RuntimeLibrary="0"
-				TreatWChar_tAsBuiltInType="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				ResourceOutputFileName="$(IntDir)/$(TargetName).res"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib Advapi32.lib xpcomglue_s.lib xpcom.lib nspr4.lib mozalloc.lib xul.lib mozjs.lib"
-				ShowProgress="2"
-				OutputFile="$(ProjectDir)\..\prebuilt\extension\lib\WINNT_x86-msvc\ff90\xpGwtDevPlugin.dll"
-				LinkIncremental="0"
-				AdditionalLibraryDirectories="&quot;..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\lib&quot;"
-				ModuleDefinitionFile="$(ProjectDir)\..\xpGwtDevPlugin.def"
-				GenerateDebugInformation="true"
-				ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="$(IntDir)\$(TargetName).lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.h"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.h"
-				>
-			</File>
-			<File
-				RelativePath="..\prebuilt\ff90\include\IOOPHM.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.h"
-				>
-			</File>
-			<File
-				RelativePath="..\mozincludes.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Preferences.h"
-				>
-			</File>
-			<File
-				RelativePath="..\RootedObject.h"
-				>
-			</File>
-			<File
-				RelativePath="..\SessionData.h"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.h"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\BrowserChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ByteOrder.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\DebugLevel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HashMap.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Message.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Platform.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\QuitMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\scoped_ptr\scoped_ptr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SessionHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Value.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="gecko"
-				>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\js-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsapi.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsautocfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jscompat.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsconfig.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\jscpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\jsinttypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jslong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\jsosdep.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsotypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsproto.tbl"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jspubtd.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jstypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\js\jsutil.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\mozilla-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsAXPCNativeCallContext.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsCOMPtr.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nscore.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsCycleCollector.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsDebug.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\widget\nsEvent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsICategoryManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIClassInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIClassInfoImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIComponentManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIExceptionService.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIGenericFactory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsIHttpProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIInterfaceInfo.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIInterfaceInfoManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsIJSContextStack.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIModule.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\caps\nsIPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIProgrammingLanguage.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsIProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsIProxiedProtocolHandler.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsIScriptableInterfaces.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\dom\nsIScriptGlobalObject.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\dom\nsIScriptObjectPrincipal.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\caps\nsISecurityCheckedComponent.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISerializable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIServiceManager.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISimpleEnumerator.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupports.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupportsBase.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupportsImpl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsISupportsUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsIURI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsIVariant.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\nsIXPConnect.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsMemory.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\necko\nsNetCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\nsrootidl.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsServiceManagerUtils.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsStringAPI.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsTraceRefcnt.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsXPCOM.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsXPCOMCID.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\nsXPCOMStrings.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\pratom.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prcpucfg.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prinrval.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prlock.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prlog.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prlong.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\obsolete\protypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prthread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prtime.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\prtypes.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\xpccomponents.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\xpcexception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpconnect\xpcjsid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\WINNT_x86-msvc\include\xpcom-config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\xpt_arena.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\xpt_struct.h"
-					>
-				</File>
-				<File
-					RelativePath="..\..\..\..\plugin-sdks\gecko-sdks\gecko-9.0.0\include\xpcom\xptinfo.h"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath="..\xpGwtDevPlugin.rc"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath="..\ExternalWrapper.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\FFSessionHandler.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JavaObject.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\JSRunner.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\ModuleOOPHM.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						GeneratePreprocessedFile="0"
-					/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="..\Preferences.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\XpcomDebug.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\xpGwtDevPlugin.def"
-				>
-			</File>
-			<Filter
-				Name="common"
-				>
-				<File
-					RelativePath="..\..\common\AllowedConnections.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\CheckVersionsMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ChooseTransportMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Debug.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FatalErrorMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\FreeValueMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\HostChannel.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\InvokeSpecialMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadJsniMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\LoadModuleMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ProtocolVersionMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ReturnMessage.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\ServerMethods.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\Socket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\..\common\SwitchTransportMessage.cpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/plugins/xpcom/XpcomDebug.cpp b/plugins/xpcom/XpcomDebug.cpp
deleted file mode 100644
index eddc15b..0000000
--- a/plugins/xpcom/XpcomDebug.cpp
+++ /dev/null
@@ -1,89 +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.
- */
-
-#include <cstring>
-
-#include "XpcomDebug.h"
-#include "JavaObject.h"
-
-#ifdef _WINDOWS
-// avoid deprecation warnings for strncpy
-#define strncpy(d,s,c) strncpy_s((d),(c),(s),(c))
-
-#include <cstdarg>
-inline int snprintf(char* buf, size_t buflen, const char* fmt, ...) {
-  va_list args;
-  va_start(args, fmt);
-  int n = _vsnprintf_s(buf, buflen, buflen, fmt, args);
-  va_end(args);
-  return n;
-}
-
-#endif
-
-std::string dumpJsVal(JSContext* ctx, jsval v) {
-  char buf[70];
-  if (JSVAL_IS_VOID(v)) {
-    strncpy(buf, "undef", sizeof(buf));
-  } else if (JSVAL_IS_NULL(v)) {
-    strncpy(buf, "null", sizeof(buf));
-#ifdef JSVAL_IS_OBJECT
-  } else if (JSVAL_IS_OBJECT(v)) {
-#else
-  } else if (!JSVAL_IS_PRIMITIVE(v)) {
-#endif
-    JSObject* obj = JSVAL_TO_OBJECT(v);
-    if (JavaObject::isJavaObject(ctx, obj)) {
-      int oid = JavaObject::getObjectId(ctx, obj);
-      snprintf(buf, sizeof(buf), "JavaObj(%d)", oid);
-    } else {
-      JSClass* jsClass = JS_GET_CLASS(ctx, obj);
-      const char* name = jsClass->name ? jsClass->name : "<null>";
-      snprintf(buf, sizeof(buf), "Object(%.20s @ %p)", name, obj);
-    }
-  } else if (JSVAL_IS_INT(v)) {
-    snprintf(buf, sizeof(buf), "int(%d)", JSVAL_TO_INT(v));
-  } else if (JSVAL_IS_DOUBLE(v)) {
-    double d;
-#if GECKO_VERSION < 2000
-    d= *JSVAL_TO_DOUBLE(v);
-#else
-    d = JSVAL_TO_DOUBLE(v);
-#endif //GECKO_VERSION
-    snprintf(buf, sizeof(buf), "double(%lf)", d);
-  } else if (JSVAL_IS_STRING(v)) {
-    JSString* str = JSVAL_TO_STRING(v);
-
-    size_t len = JS_GetStringEncodingLength(ctx, str);
-
-    const char* continued = "";
-    if (len > 20) {
-      len = 20;
-      continued = "...";
-    }
-    // TODO: trashes Unicode
-    snprintf(buf, sizeof(buf), "string(%.*s%s)", static_cast<int>(len),
-        JS_EncodeString(ctx, str), continued);
-  } else if (JSVAL_IS_BOOLEAN(v)) {
-    snprintf(buf, sizeof(buf), "bool(%s)", JSVAL_TO_BOOLEAN(v) ? "true"
-        : " false");
-  } else {
-    // TODO(acleung): When we run into this, use the other api to figure out what v is.
-    // snprintf(buf, sizeof(buf), "unknown(%08x)", (unsigned) v);
-  }
-  buf[sizeof(buf) - 1] = 0;
-  return std::string(buf);
-}
diff --git a/plugins/xpcom/XpcomDebug.h b/plugins/xpcom/XpcomDebug.h
deleted file mode 100644
index 4296ad2..0000000
--- a/plugins/xpcom/XpcomDebug.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef _H_XpcomDebug
-#define _H_XpcomDebug
-/*
- * 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.
- */
-
-#include <string>
-
-#include "mozincludes.h"
-#include "jsapi.h"
-
-std::string dumpJsVal(JSContext* ctx, jsval v);
-
-#endif
diff --git a/plugins/xpcom/getversion b/plugins/xpcom/getversion
deleted file mode 100755
index 7557e49..0000000
--- a/plugins/xpcom/getversion
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-# Wrapper to prevent failure if svnversion isn't available
-
-V=`svnversion ${PWD}/.. 2>/dev/null`
-if [ $? -gt 0 -o -z "$V" ]
-then
-  V='?'
-fi
-echo $V
-exit 0
diff --git a/plugins/xpcom/install-template.rdf b/plugins/xpcom/install-template.rdf
deleted file mode 100644
index 81b8307..0000000
--- a/plugins/xpcom/install-template.rdf
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0"?>
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-
-  <Description about="urn:mozilla:install-manifest">
-    <em:id>gwt-dev-plugin@google.com</em:id>
-    <em:name>Google Web Toolkit Developer Plugin for Firefox</em:name>
-    <em:version>GWT_DEV_PLUGIN_VERSION</em:version>
-    <em:type>2</em:type>
-    <em:unpack>true</em:unpack>
-    <em:targetApplication>
-      <Description>
-        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-        <em:minVersion>3.0</em:minVersion>
-        <em:maxVersion>16.0.*</em:maxVersion>
-      </Description>
-
-    <!-- TODO: This seems to break Firefox 3.6. With this on, FF gets into a
-               infinity loop of requiring to restart. I suspect it is a bug
-               in that version that was fixed in later version.
-    <em:strictCompatibility>true</em:strictCompatibility>
-    -->
-
-    </em:targetApplication>
-
-    <!-- Front End MetaData -->
-    <em:description>A plugin to support GWT development-mode in XPCOM-based browsers</em:description>
-    <em:creator>Google, Inc.</em:creator>
-    <em:homepageURL>http://code.google.com/webtoolkit/</em:homepageURL>
-    <em:iconURL>chrome://gwt-dev-plugin/skin/icon.png</em:iconURL>
-
-    <em:targetPlatform>Linux_x86-gcc3</em:targetPlatform>
-    <em:targetPlatform>Linux_x86_64-gcc3</em:targetPlatform>
-    <em:targetPlatform>WINNT_x86-msvc</em:targetPlatform>
-    <em:targetPlatform>Darwin_x86-gcc3</em:targetPlatform>
-    <em:targetPlatform>Darwin_x86_64-gcc3</em:targetPlatform>
-    <em:targetPlatform>Darwin_ppc-gcc3</em:targetPlatform>
-
-    <em:optionsURL>chrome://gwt-dev-plugin/content/options.xul</em:optionsURL>
-
-    <!-- updates, see http://developer.mozilla.org/en/docs/Extension_Versioning%2C_Update_and_Compatibility#Update_RDF_Format -->
-    <em:updateURL><![CDATA[https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin-updates.rdf?guid=%ITEM_ID%&version=%ITEM_VERSION%&application=%APP_ID%&appversion=%APP_VERSION%&locale=%APP_LOCALE%&os=%APP_OS%&abi=%APP_ABI%]]></em:updateURL>
-
-    <!-- TODO
-    # replace default about dialog
-    <em:aboutURL>chrome://gwt-dmp/content/about.xul</em:aboutURL>
-
-    # more platforms - any others?
-    <em:targetPlatform>SunOS_sparc-sunc</em:targetPlatform>
-    <em:targetPlatform>SunOS_x86-sunc</em:targetPlatform>
-    <em:targetPlatform>SunOS_x86_64-sunc</em:targetPlatform>
-    <em:targetPlatform>FreeBSD_x86-gcc3</em:targetPlatform>
-    <em:targetPlatform>FreeBSD_x86_64-gcc3</em:targetPlatform>
-    -->
-
-  </Description>
-</RDF>
diff --git a/plugins/xpcom/mozincludes.h b/plugins/xpcom/mozincludes.h
deleted file mode 100755
index 80961cc..0000000
--- a/plugins/xpcom/mozincludes.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef _H_mozincludes
-#define _H_mozincludes
-
-// Defines private prototypes for copy constructor and assigment operator. Do
-// not implement these methods.
-#define DISALLOW_EVIL_CONSTRUCTORS(CLASS) \
- private:                                 \
-  CLASS(const CLASS&);                    \
-  CLASS& operator=(const CLASS&)
-
-#include "xpcom-config.h"
-#include "mozilla-config.h"
-
-// See https://developer.mozilla.org/en/SpiderMonkey/1.8.8
-#if GECKO_VERSION >= 13000
-
-// See https://bugzilla.mozilla.org/show_bug.cgi?id=417710
-//     https://bugzilla.mozilla.org/show_bug.cgi?id=723517 
-#define JS_GET_CLASS(cx, obj) JS_GetClass(obj)
-#define MOZ_JS_SetPrivate(cx, obj, data) JS_SetPrivate(obj, data)
-#define MOZ_JS_SetReservedSlot(cx, obj, index, v) JS_SetReservedSlot(obj, index, v)
-#define uintN unsigned int
-#define intN int
-#define jsdouble double
-#else
-#define MOZ_JS_SetPrivate(cx, obj, data) JS_SetPrivate(cx, obj, data)
-#define MOZ_JS_SetReservedSlot(cx, obj, index, v) JS_SetReservedSlot(cx, obj, index, v)
-#endif
-
-#endif
diff --git a/plugins/xpcom/prebuilt/LICENSE.txt b/plugins/xpcom/prebuilt/LICENSE.txt
deleted file mode 100644
index 326366d..0000000
--- a/plugins/xpcom/prebuilt/LICENSE.txt
+++ /dev/null
@@ -1,13 +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.
diff --git a/plugins/xpcom/prebuilt/README.txt b/plugins/xpcom/prebuilt/README.txt
deleted file mode 100644
index 6f54ad5..0000000
--- a/plugins/xpcom/prebuilt/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Files common to all platforms should be placed under extension/...
-Files for FF1.5/2 should go under extension-ff2/...
-Files for FF3 should go under extension-ff3/...
-
-Files such as headers that need to be supplied pre-generated should be under
-ff2/ff3.
diff --git a/plugins/xpcom/prebuilt/extension/chrome.manifest b/plugins/xpcom/prebuilt/extension/chrome.manifest
deleted file mode 100644
index bd114d1..0000000
--- a/plugins/xpcom/prebuilt/extension/chrome.manifest
+++ /dev/null
@@ -1,99 +0,0 @@
-content gwt-dev-plugin content/
-skin gwt-dev-plugin classic/1.0 skin/
-
-# This file is parsed top to bottom. List the lowest versions first
-
-# Firefox 4
-binary-component lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so ABI=Linux_x86_64-gcc3 appversion<=4.0.*
-binary-component lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so ABI=Linux_x86-gcc3 appversion<=4.0.*
-binary-component lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib ABI=Darwin_x86_64-gcc3 appversion<=4.0.*
-binary-component lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib ABI=Darwin_x86-gcc3 appversion<=4.0.*
-binary-component lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=4.0.*
-
-# Firefox 5
-binary-component lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so ABI=Linux_x86_64-gcc3 appversion<=5.0.*
-binary-component lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so ABI=Linux_x86-gcc3 appversion<=5.0.*
-binary-component lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib ABI=Darwin_x86_64-gcc3 appversion<=5.0.*
-binary-component lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib ABI=Darwin_x86-gcc3 appversion<=5.0.*
-binary-component lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=5.0.*
-
-# Firefox 6
-binary-component lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so ABI=Linux_x86_64-gcc3 appversion<=6.0.*
-binary-component lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so ABI=Linux_x86-gcc3 appversion<=6.0.*
-binary-component lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib ABI=Darwin_x86_64-gcc3 appversion<=6.0.*
-binary-component lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib ABI=Darwin_x86-gcc3 appversion<=6.0.*
-binary-component lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=6.0.*
-
-# Firefox 7
-binary-component lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so ABI=Linux_x86_64-gcc3 appversion<=7.0.*
-binary-component lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so ABI=Linux_x86-gcc3 appversion<=7.0.*
-binary-component lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib ABI=Darwin_x86_64-gcc3 appversion<=7.0.*
-binary-component lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib ABI=Darwin_x86-gcc3 appversion<=7.0.*
-binary-component lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=7.0.*
-
-# Firefox 8
-binary-component lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so ABI=Linux_x86_64-gcc3 appversion<=8.0.*
-binary-component lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so ABI=Linux_x86-gcc3 appversion<=8.0.*
-binary-component lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib ABI=Darwin_x86_64-gcc3 appversion<=8.0.*
-binary-component lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib ABI=Darwin_x86-gcc3 appversion<=8.0.*
-binary-component lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=8.0.*
-
-# Firefox 9
-binary-component lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so ABI=Linux_x86_64-gcc3 appversion<=9.0.*
-binary-component lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so ABI=Linux_x86-gcc3 appversion<=9.0.*
-binary-component lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib ABI=Darwin_x86_64-gcc3 appversion<=9.0.*
-binary-component lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib ABI=Darwin_x86-gcc3 appversion<=9.0.*
-binary-component lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=9.0.*
-
-# Firefox 10
-binary-component lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so ABI=Linux_x86_64-gcc3 appversion<=10.0.*
-binary-component lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so ABI=Linux_x86-gcc3 appversion<=10.0.*
-binary-component lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib ABI=Darwin_x86_64-gcc3 appversion<=10.0.*
-binary-component lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib ABI=Darwin_x86-gcc3 appversion<=10.0.*
-binary-component lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=10.0.*
-
-# Firefox 11
-binary-component lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so ABI=Linux_x86_64-gcc3 appversion<=11.0.*
-binary-component lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so ABI=Linux_x86-gcc3 appversion<=11.0.*
-binary-component lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib ABI=Darwin_x86_64-gcc3 appversion<=11.0.*
-binary-component lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib ABI=Darwin_x86-gcc3 appversion<=11.0.*
-binary-component lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=11.0.*
-
-# Firefox 12
-binary-component lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so ABI=Linux_x86_64-gcc3 appversion<=12.0.*
-binary-component lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so ABI=Linux_x86-gcc3 appversion<=12.0.*
-binary-component lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib ABI=Darwin_x86_64-gcc3 appversion<=12.0.*
-binary-component lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib ABI=Darwin_x86-gcc3 appversion<=12.0.*
-binary-component lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=12.0.*
-
-# Firefox 13
-binary-component lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so ABI=Linux_x86_64-gcc3 appversion<=13.0.*
-binary-component lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so ABI=Linux_x86-gcc3 appversion<=13.0.*
-binary-component lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib ABI=Darwin_x86_64-gcc3 appversion<=13.0.*
-binary-component lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib ABI=Darwin_x86-gcc3 appversion<=13.0.*
-binary-component lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=13.0.*
-
-# Firefox 14
-binary-component lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so ABI=Linux_x86_64-gcc3 appversion<=14.0.*
-binary-component lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so ABI=Linux_x86-gcc3 appversion<=14.0.*
-binary-component lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib ABI=Darwin_x86_64-gcc3 appversion<=14.0.*
-binary-component lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib ABI=Darwin_x86-gcc3 appversion<=14.0.*
-binary-component lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=14.0.*
-
-# Firefox 15
-binary-component lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so ABI=Linux_x86_64-gcc3 appversion<=15.0.*
-binary-component lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so ABI=Linux_x86-gcc3 appversion<=15.0.*
-binary-component lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=15.0.*
-binary-component lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib ABI=Darwin_x86_64-gcc3 appversion<=15.0.*
-binary-component lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib ABI=Darwin_x86-gcc3 appversion<=15.0.*
-
-# Firefox 16
-binary-component lib/Linux_x86_64-gcc3/ff160/libgwt_dev_ff160.so ABI=Linux_x86_64-gcc3 appversion<=16.0.*
-binary-component lib/Linux_x86-gcc3/ff160/libgwt_dev_ff160.so ABI=Linux_x86-gcc3 appversion<=16.0.*
-binary-component lib/WINNT_x86-msvc/ff160/xpGwtDevPlugin.dll ABI=WINNT_x86-msvc appversion<=16.0.*
-binary-component lib/Darwin-gcc3/ff160/libgwt_dev_ff160.dylib ABI=Darwin_x86_64-gcc3 appversion<=16.0.*
-binary-component lib/Darwin-gcc3/ff160/libgwt_dev_ff160.dylib ABI=Darwin_x86-gcc3 appversion<=16.0.*
-
-
-interfaces components/IOOPHM.xpt
-contract @gwt.google.com/ExternalWrapper;1 {028DD88B-6D65-401D-AAFD-17E497D15D09}
diff --git a/plugins/xpcom/prebuilt/extension/components/IOOPHM.xpt b/plugins/xpcom/prebuilt/extension/components/IOOPHM.xpt
deleted file mode 100644
index 683c881..0000000
--- a/plugins/xpcom/prebuilt/extension/components/IOOPHM.xpt
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/components/stub.js b/plugins/xpcom/prebuilt/extension/components/stub.js
deleted file mode 100644
index 8df702b..0000000
--- a/plugins/xpcom/prebuilt/extension/components/stub.js
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2009, Google Inc.
-//
-// Redistribution and use in source and binary forms, with or without 
-// modification, are permitted provided that the following conditions are met:
-//
-//  1. Redistributions of source code must retain the above copyright notice, 
-//   this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright notice,
-//   this list of conditions and the following disclaimer in the documentation
-//   and/or other materials provided with the distribution.
-//  3. Neither the name of Google Inc. nor the names of its contributors may be
-//   used to endorse or promote products derived from this software without
-//   specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Our binary is compiled against different versions of the Gecko SDK for
-// different versions of Firefox. But we want a single XPI so that users can
-// switch between versions of Firefox without having to change their Gears
-// version.
-
-// This JavaScript file is detected and loaded by Gecko when our extension is
-// installed. We then use nsIComponentRegistrar to tell Gecko where our real
-// components are located, depending on what version of Firefox we detect we are
-// running in.
-
-// NOTE: This file is only used pre Gecko 2.0 (FF4). The registration mechanism
-// in Gecko 2.0 allows the chrome.manifest to indicate the appropriate binary
-// component for each ABI.
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-// Detect which version of our lib we should use.
-function getLibFileName() {
-  var appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
-  var geckoVersion = appInfo.platformVersion.substring(0, 3);
-
-  if (geckoVersion == "1.8") {
-    return "ff2";
-  }
-
-  if (geckoVersion.substring(0, 3) == "1.9") {
-    var firefoxVersion = appInfo.version.substring(0, 3);
-
-    if (firefoxVersion == "3.0") {
-      if (isFedora()) {
-        return "ff3+";
-      }
-      return "ff3";
-    }
-
-    if (firefoxVersion == "3.5") {
-      return "ff35";
-    }
-
-    if (firefoxVersion == "3.6") {
-      return "ff36";
-    }
-
-    if (firefoxVersion == "3.7" || firefoxVersion == "4.0") {
-      return "ff40";
-    }
-
-    throw "Unsupported Firefox version: " + firefoxVersion;
-  }
-
-  throw "Unsupported Gecko version: " + geckoVersion;
-}
-
-function getPlatform() {
-  var runtime = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime);
-
-  if (runtime.OS == "Darwin") {
-    return runtime.OS + "-gcc3";
-  }
-
-  return runtime.OS + "_" + runtime.XPCOMABI;
-}
-
-function isFedora() {
-  var navigator = Cc["@mozilla.org/network/protocol;1?name=http"].
-    getService(Ci.nsIHttpProtocolHandler);
-
-  return navigator.userAgent.indexOf("Fedora") != -1;
-}
-
-// This function is called by Firefox at installation time.
-function NSGetModule() {
-  return {
-    registerSelf: function(compMgr, location, loaderStr, type) {
-      var libFile = location.parent.parent;
-      libFile.append("lib");
-      libFile.append(getPlatform());
-      libFile.append(getLibFileName());
-
-      // Note: we register a directory instead of an individual file because
-      // Gecko will only load components with a specific file name pattern. We 
-      // don't want this file to have to know about that. Luckily, if you
-      // register a directory, Gecko will look inside the directory for files
-      // to load.
-      var compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
-      compMgr.autoRegister(libFile);
-    }
-  }
-}
diff --git a/plugins/xpcom/prebuilt/extension/content/options.xul b/plugins/xpcom/prebuilt/extension/content/options.xul
deleted file mode 100644
index 202844e..0000000
--- a/plugins/xpcom/prebuilt/extension/content/options.xul
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<dialog buttons="accept"
-     id="gwt-dev-prefs"
-     title="GWT Developer Plugin Options"
-     onload="GwtDeveloperPlugin.onload()"
-     ondialogaccept="return true;"
-     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<script type="application/x-javascript"
-    src="chrome://gwt-dev-plugin/content/prefScript.js"/>
-
-<vbox flex="1">
-
-  <groupbox flex="1">
-    <caption>
-      <hbox>
-        <image src="chrome://gwt-dev-plugin/skin/warning.png"/>
-        <label value="Security Restrictions" style="font-weight: bold"/>
-      </hbox>
-    </caption>
-    <description width="55em">
-      The GWT Developer Plugin will open a TCP/IP connection to an
-      arbitrary host/port at the request of a web page.  To minimize security
-      risks, by default it will only connect to the local machine.  To allow
-      cross-machine debugging, you can add exceptions here -- include the exact
-      host name of the web and code server you will use for debugging, but do not
-      include any you do not trust.
-    </description>
-  </groupbox>
-
-  <hbox align="top" flex="1">
-    <hbox align="center" flex="1">
-      <label control="hostname" value="Host name: "/>
-      <textbox id="hostname" maxlength="40" flex="1"/>
-    </hbox>
-    <hbox align="center" flex="1">
-      <label control="codeserver" value="Code server: "/>
-      <textbox id="codeserver" maxlength="40" flex="1"/>
-    </hbox>
-    <radiogroup id="incexc">
-      <radio id="include" label="Include" selected="true"/>
-      <radio id="exclude" label="Exclude"/>
-    </radiogroup>
-    <button id="addButton" label="Add Entry" oncommand="GwtDeveloperPlugin.addEntry()"/>
-  </hbox>
-
-  <listbox id="accessListListbox" rows="5">
-    <listhead>
-      <listheader label="Inc/Exc"/>
-      <listheader label="Host Name"/>
-      <listheader label="Code Server"/>
-    </listhead>
-    <listcols>
-      <listcol/>
-      <listcol flex="1"/>
-      <listcol flex="1"/>
-    </listcols>
-  </listbox>
-
-  <hbox>
-    <button id="removeButton" label="Remove Selected"
-        oncommand="GwtDeveloperPlugin.removeEntry()"/>
-    <!-- TODO(jat): add move up/down buttons -->
-  </hbox>
-
-</vbox>
-
-</dialog>
diff --git a/plugins/xpcom/prebuilt/extension/content/prefScript.js b/plugins/xpcom/prebuilt/extension/content/prefScript.js
deleted file mode 100644
index deb34e9..0000000
--- a/plugins/xpcom/prebuilt/extension/content/prefScript.js
+++ /dev/null
@@ -1,115 +0,0 @@
-var GwtDeveloperPlugin = {
-
-// Add a new entry when the Add Entry button is clicked.
-addEntry: function() {
-  var prefs = this.getAccessList();
-  var hostname = document.getElementById("hostname").value;
-  if (!hostname || hostname.length == 0) {
-    alert("No host name provided");
-    return;
-  }
-  if (hostname.indexOf(",") >=0 || hostname.indexOf("!") >= 0 || hostname.indexOf("/") >= 0) {
-    alert("Host name must not contain ',', '!', or '/'");
-    return;
-  }
-  var codeserver = document.getElementById("codeserver").value;
-  if (!codeserver || codeserver.length == 0) {
-    alert("No code server provided");
-    return;
-  }
-  if (codeserver.indexOf(",") >=0 || codeserver.indexOf("!") >= 0 || codeserver.indexOf("/") >= 0) {
-    alert("Code server must not contain ',', '!', or '/'");
-    return;
-  }
-  var exclude = document.getElementById("exclude");
-  var incText;
-  var prefix = "";
-  if (exclude.selected) {
-    incText = "Exclude";
-    prefix = "!";
-  } else {
-    incText = "Include";
-  }
-  var listboxEntry = this.makeLBE(incText, hostname, codeserver);
-  var prefsEntry = prefix + hostname + '/' + codeserver;
-  var listbox = document.getElementById("accessListListbox");
-  listbox.appendChild(listboxEntry);
-  prefs.push(prefsEntry.toString());
-  this.saveAccessList(prefs);
-},
-
-// Remove the selected entry when the Remove Entry button is clicked.
-removeEntry: function() {
-  var listbox = document.getElementById("accessListListbox");
-  var idx = listbox.selectedIndex;
-  if (idx >= 0) {
-    listbox.removeItemAt(idx);
-    var prefs = this.getAccessList();
-    prefs.splice(idx, 1);
-    this.saveAccessList(prefs);
-  }
-},
-
-// Populate the listbox when the dialog window is loaded
-onload: function() {
-  var listbox = document.getElementById("accessListListbox");
-  var prefs = this.getAccessList();
-  for (var i = 0 ; i < prefs.length; ++i) {
-    var pref = prefs[i];
-    var hostname = pref;
-    var incexc = "Include";
-    if (pref.length > 0 && pref.charAt(0) == "!") {
-      hostname = hostname.substr(1);
-      incexc = "Exclude";
-    }  
-    var codeserver = "localhost";
-    var slash = hostname.indexOf("/");
-    if( slash >= 0 )
-    {
-      codeserver = hostname.substr(slash+1);
-      hostname   = hostname.substr(0,slash);
-    }
-    var listboxEntry = this.makeLBE(incexc, hostname, codeserver);
-    listbox.appendChild(listboxEntry);
-  }
-},
-
-// Internal - create a entry for the list box
-makeLBE: function(inc, hostname, codeserver) {
-  var listboxEntry = document.createElement("listitem");
-  var lbeInc = document.createElement("listcell");
-  lbeInc.setAttribute("label", inc);
-  listboxEntry.appendChild(lbeInc);
-  var lbeHost = document.createElement("listcell");
-  lbeHost.setAttribute("label", hostname);
-  listboxEntry.appendChild(lbeHost);
-  var lbeCode = document.createElement("listcell");
-  lbeCode.setAttribute("label", codeserver);
-  listboxEntry.appendChild(lbeCode);
-  return listboxEntry;
-},
-
-// Internal - load the access list from the gwt-dev-plugin.accessList
-// preference
-getAccessList: function() {
-  var prefServ = Components.classes["@mozilla.org/preferences-service;1"]
-                  .getService(Components.interfaces.nsIPrefService);
-  var prefs = prefServ.getBranch("gwt-dev-plugin.");
-  var pref = prefs.getCharPref("accessList");
-  if (!pref) {
-    return [];
-  }
-  return pref.split(",");
-},
-
-// Internal - save the access list to the gwt-dev-plugin.accessList
-// preference
-saveAccessList: function(list) {
-  var prefServ = Components.classes["@mozilla.org/preferences-service;1"]
-                  .getService(Components.interfaces.nsIPrefService);
-  var prefs = prefServ.getBranch("gwt-dev-plugin.");
-  prefs.setCharPref("accessList", list.join(","));
-  prefServ.savePrefFile(null);
-}
-
-};
diff --git a/plugins/xpcom/prebuilt/extension/defaults/preferences/defaults.js b/plugins/xpcom/prebuilt/extension/defaults/preferences/defaults.js
deleted file mode 100644
index 29b3f76..0000000
--- a/plugins/xpcom/prebuilt/extension/defaults/preferences/defaults.js
+++ /dev/null
@@ -1 +0,0 @@
-pref("gwt-dev-plugin.accessList", "");
diff --git a/plugins/xpcom/prebuilt/extension/icon.png b/plugins/xpcom/prebuilt/extension/icon.png
deleted file mode 100644
index 7ba8270..0000000
--- a/plugins/xpcom/prebuilt/extension/icon.png
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib
deleted file mode 100755
index 5d29200..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib
deleted file mode 100755
index 2d7b35f..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib
deleted file mode 100755
index 68599c2..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib
deleted file mode 100755
index 03501fa..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib
deleted file mode 100755
index 7d621cc..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib
deleted file mode 100755
index 010c13a..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff160/libgwt_dev_ff160.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff160/libgwt_dev_ff160.dylib
deleted file mode 100755
index ae1b58d8..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff160/libgwt_dev_ff160.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff3/libgwt_dev_ff3.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff3/libgwt_dev_ff3.dylib
deleted file mode 100755
index a51473a..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff3/libgwt_dev_ff3.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff35/libgwt_dev_ff35.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff35/libgwt_dev_ff35.dylib
deleted file mode 100755
index 2226927..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff35/libgwt_dev_ff35.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff36/libgwt_dev_ff36.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff36/libgwt_dev_ff36.dylib
deleted file mode 100755
index d030ed1..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff36/libgwt_dev_ff36.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib
deleted file mode 100755
index daeaab3..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib
deleted file mode 100755
index 6998a72..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib
deleted file mode 100755
index 507b1cf..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib
deleted file mode 100755
index 5905200..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib
deleted file mode 100755
index 52ffe0d..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib
deleted file mode 100755
index 8b6b066..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so
deleted file mode 100755
index 5cf9327..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so
deleted file mode 100755
index 868bc12..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so
deleted file mode 100755
index 38ca71c..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so
deleted file mode 100755
index 7aca049..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so
deleted file mode 100755
index ea9ebdb..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so
deleted file mode 100755
index 3edb34f..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff160/libgwt_dev_ff160.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff160/libgwt_dev_ff160.so
deleted file mode 100755
index 9a29135..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff160/libgwt_dev_ff160.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3+/libgwt_dev_ff3+.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3+/libgwt_dev_ff3+.so
deleted file mode 100755
index 68135ba..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3+/libgwt_dev_ff3+.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3/libgwt_dev_ff3.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3/libgwt_dev_ff3.so
deleted file mode 100755
index c467d43..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3/libgwt_dev_ff3.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff35/libgwt_dev_ff35.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff35/libgwt_dev_ff35.so
deleted file mode 100755
index 8fd8729..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff35/libgwt_dev_ff35.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff36/libgwt_dev_ff36.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff36/libgwt_dev_ff36.so
deleted file mode 100755
index b54bcdc..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff36/libgwt_dev_ff36.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so
deleted file mode 100755
index 362cf1a..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so
deleted file mode 100755
index 34d0f56..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so
deleted file mode 100755
index 3418aa6..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so
deleted file mode 100755
index 58b452f..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so
deleted file mode 100755
index fa6a37f..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so
deleted file mode 100755
index 820b2b2..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so
deleted file mode 100755
index c482702..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so
deleted file mode 100755
index c612e7a..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so
deleted file mode 100755
index 65df393..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so
deleted file mode 100755
index cead4df..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so
deleted file mode 100755
index 48ab7ee..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so
deleted file mode 100755
index ae46bd8..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff160/libgwt_dev_ff160.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff160/libgwt_dev_ff160.so
deleted file mode 100755
index 3296f0f..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff160/libgwt_dev_ff160.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3+/libgwt_dev_ff3+.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3+/libgwt_dev_ff3+.so
deleted file mode 100755
index 5751ab2..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3+/libgwt_dev_ff3+.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3/libgwt_dev_ff3.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3/libgwt_dev_ff3.so
deleted file mode 100755
index 4f4471f..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3/libgwt_dev_ff3.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff35/libgwt_dev_ff35.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff35/libgwt_dev_ff35.so
deleted file mode 100755
index 29ff650..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff35/libgwt_dev_ff35.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff36/libgwt_dev_ff36.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff36/libgwt_dev_ff36.so
deleted file mode 100755
index f36c567..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff36/libgwt_dev_ff36.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so
deleted file mode 100755
index cd8368b..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so
deleted file mode 100755
index a54dc00..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so
deleted file mode 100755
index 24bba4e..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so
deleted file mode 100755
index ac3f55e..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so
deleted file mode 100755
index 3ea691d..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so
deleted file mode 100755
index 87d66a9..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll
deleted file mode 100755
index c174d65..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll
deleted file mode 100755
index 351b046..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll
deleted file mode 100755
index d23f4f7..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll
deleted file mode 100755
index 5b55c0b..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll
deleted file mode 100755
index 5a0ed7f..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll
deleted file mode 100755
index 63684a0..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff160/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff160/xpGwtDevPlugin.dll
deleted file mode 100755
index cef19b3..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff160/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff3/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff3/xpGwtDevPlugin.dll
deleted file mode 100755
index cd065b0..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff3/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff35/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff35/xpGwtDevPlugin.dll
deleted file mode 100755
index 9396adf..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff35/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff36/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff36/xpGwtDevPlugin.dll
deleted file mode 100755
index 5ef91b3..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff36/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll
deleted file mode 100755
index b8b0ee5..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll
deleted file mode 100755
index 7f517e2..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll
deleted file mode 100755
index 3ef13fb..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll
deleted file mode 100755
index 0b72e7c..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll
deleted file mode 100755
index 38aaa82..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll
deleted file mode 100755
index bcf7476..0000000
--- a/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/skin/README.txt b/plugins/xpcom/prebuilt/extension/skin/README.txt
deleted file mode 100644
index 7d212f0..0000000
--- a/plugins/xpcom/prebuilt/extension/skin/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-warning.png generated from public domain SVG file found at
-  http://www.wowwiki.com/File:Icon-warning.svg
diff --git a/plugins/xpcom/prebuilt/extension/skin/icon.png b/plugins/xpcom/prebuilt/extension/skin/icon.png
deleted file mode 100644
index 7ba8270..0000000
--- a/plugins/xpcom/prebuilt/extension/skin/icon.png
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/skin/warning.png b/plugins/xpcom/prebuilt/extension/skin/warning.png
deleted file mode 100644
index 55a203b..0000000
--- a/plugins/xpcom/prebuilt/extension/skin/warning.png
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h
deleted file mode 100644
index e37792d..0000000
--- a/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff110/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff110/include/IOOPHM.h
deleted file mode 100644
index e37792d..0000000
--- a/plugins/xpcom/prebuilt/ff110/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff120/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff120/include/IOOPHM.h
deleted file mode 100644
index e37792d..0000000
--- a/plugins/xpcom/prebuilt/ff120/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff130/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff130/include/IOOPHM.h
deleted file mode 100644
index e37792d..0000000
--- a/plugins/xpcom/prebuilt/ff130/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h
deleted file mode 100644
index e37792d..0000000
--- a/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h
deleted file mode 100644
index e37792d..0000000
--- a/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff160/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff160/include/IOOPHM.h
deleted file mode 100644
index e37792d..0000000
--- a/plugins/xpcom/prebuilt/ff160/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, bool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff3+/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff3+/include/IOOPHM.h
deleted file mode 100644
index 169598e..0000000
--- a/plugins/xpcom/prebuilt/ff3+/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff3/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff3/include/IOOPHM.h
deleted file mode 100644
index 169598e..0000000
--- a/plugins/xpcom/prebuilt/ff3/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff35/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff35/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff35/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff36/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff36/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff36/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff40/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff40/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff40/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff50/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff50/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff50/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff60/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff60/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff60/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff70/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff70/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff70/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff80/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff80/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff80/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/ff90/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff90/include/IOOPHM.h
deleted file mode 100644
index 0e7be5d..0000000
--- a/plugins/xpcom/prebuilt/ff90/include/IOOPHM.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * DO NOT EDIT.  THIS FILE IS GENERATED FROM IOOPHM.idl
- */
-
-#ifndef __gen_IOOPHM_h__
-#define __gen_IOOPHM_h__
-
-
-#ifndef __gen_nsISupports_h__
-#include "nsISupports.h"
-#endif
-
-/* For IDL files that don't want to include root IDL files. */
-#ifndef NS_NO_VTABLE
-#define NS_NO_VTABLE
-#endif
-class nsIDOMWindow; /* forward declaration */
-
-
-/* starting interface:    IOOPHM */
-#define IOOPHM_IID_STR "90cef17b-c3fe-4251-af68-4381b3d938a0"
-
-#define IOOPHM_IID \
-  {0x90cef17b, 0xc3fe, 0x4251, \
-    { 0xaf, 0x68, 0x43, 0x81, 0xb3, 0xd9, 0x38, 0xa0 }}
-
-class NS_NO_VTABLE NS_SCRIPTABLE IOOPHM : public nsISupports {
- public: 
-
-  NS_DECLARE_STATIC_IID_ACCESSOR(IOOPHM_IID)
-
-  /* boolean init (in nsIDOMWindow window); */
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) = 0;
-
-  /* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) = 0;
-
-};
-
-  NS_DEFINE_STATIC_IID_ACCESSOR(IOOPHM, IOOPHM_IID)
-
-/* Use this macro when declaring classes that implement this interface. */
-#define NS_DECL_IOOPHM \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM); \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM); 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object. */
-#define NS_FORWARD_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return _to Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return _to Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
-#define NS_FORWARD_SAFE_IOOPHM(_to) \
-  NS_SCRIPTABLE NS_IMETHOD Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(window, _retval); } \
-  NS_SCRIPTABLE NS_IMETHOD Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM) { return !_to ? NS_ERROR_NULL_POINTER : _to->Connect(url, sessionKey, addr, moduleName, hostedHtmlVersion, _retval); } 
-
-#if 0
-/* Use the code below as a template for the implementation class for this interface. */
-
-/* Header file */
-class _MYCLASS_ : public IOOPHM
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_IOOPHM
-
-  _MYCLASS_();
-
-private:
-  ~_MYCLASS_();
-
-protected:
-  /* additional members */
-};
-
-/* Implementation file */
-NS_IMPL_ISUPPORTS1(_MYCLASS_, IOOPHM)
-
-_MYCLASS_::_MYCLASS_()
-{
-  /* member initializers and constructor code */
-}
-
-_MYCLASS_::~_MYCLASS_()
-{
-  /* destructor code */
-}
-
-/* boolean init (in nsIDOMWindow window); */
-NS_IMETHODIMP _MYCLASS_::Init(nsIDOMWindow *window, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* boolean connect (in ACString url, in ACString sessionKey, in ACString addr, in ACString moduleName, in ACString hostedHtmlVersion); */
-NS_IMETHODIMP _MYCLASS_::Connect(const nsACString & url, const nsACString & sessionKey, const nsACString & addr, const nsACString & moduleName, const nsACString & hostedHtmlVersion, PRBool *_retval NS_OUTPARAM)
-{
-    return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* End of implementation class template. */
-#endif
-
-
-#endif /* __gen_IOOPHM_h__ */
diff --git a/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi b/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
deleted file mode 100644
index 75ad0ad..0000000
--- a/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
+++ /dev/null
Binary files differ
diff --git a/plugins/xpcom/prebuilt/update.rdf b/plugins/xpcom/prebuilt/update.rdf
deleted file mode 100644
index 03ea059..0000000
--- a/plugins/xpcom/prebuilt/update.rdf
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-         xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-
-  <RDF:Description about="urn:mozilla:extension:gwt-dev-plugin@google.com">
-    <em:updates>
-      <RDF:Seq>
-
-        <RDF:li>
-          <RDF:Description>
-            <em:version>0.9.6553M.20091030005401</em:version>
-            <em:targetApplication>
-              <Description>
-                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-                <em:minVersion>3.0</em:minVersion>
-                <em:maxVersion>16.0.*</em:maxVersion>
-                <em:updateLink>https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi</em:updateLink>
-                <em:updateInfoURL>https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin-info.xhtml?locale=%APP_LOCALE%</em:updateInfoURL>
-
-              </Description>
-            </em:targetApplication>
-          </RDF:Description>
-        </RDF:li>
-
-      </RDF:Seq>
-    </em:updates>
-  </RDF:Description>
-</RDF:RDF>
diff --git a/plugins/xpcom/xpGwtDevPlugin.def b/plugins/xpcom/xpGwtDevPlugin.def
deleted file mode 100644
index b3e5034..0000000
--- a/plugins/xpcom/xpGwtDevPlugin.def
+++ /dev/null
@@ -1,3 +0,0 @@
-LIBRARY xpGwtDevPlugin
-
-EXPORTS
diff --git a/plugins/xpcom/xpGwtDevPlugin.rc b/plugins/xpcom/xpGwtDevPlugin.rc
deleted file mode 100644
index de20962..0000000
--- a/plugins/xpcom/xpGwtDevPlugin.rc
+++ /dev/null
@@ -1,71 +0,0 @@
-#define APSTUDIO_READONLY_SYMBOLS
-#include "windows.h"
-#undef APSTUDIO_READONLY_SYMBOLS
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif
-
-1 VERSIONINFO
-  FILEVERSION 0,9,0,0
-  PRODUCTVERSION 0,9,0,0
-  FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
-  FILEFLAGS 0x1L
-#else
-  FILEFLAGS 0x0L
-#endif
-  FILEOS 0x40004L
-  FILETYPE 0x2L
-  FILESUBTYPE 0x0L
-BEGIN
-  BLOCK "StringFileInfo"
-  BEGIN
-  	BLOCK "040904e4"
-  	BEGIN
-  	  VALUE "CompanyName", 		"Google Inc"
-  	  VALUE "FileDescription",	"GWT Developer Plugin (XPCOM)"
-#if 0
-  	  VALUE "FileExtents",		""
-#endif
-  	  VALUE "FileOpenName",		"Plugin to allow debugging of GWT applications in development mode."
-  	  VALUE "FileVersion",		"0.1a"
-  	  VALUE "InternalName",		"GWT Developer Plugin (XPCOM)"
-  	  VALUE "LegalCopyright",	"Copyright © 2008 Google Inc.  Licensed under Apache 2.0 license."
-  	  VALUE "MIMEType",			"application/x-gwt-hosted-mode"
-  	  VALUE "OriginalFilename",	"xpGwtDevPlugin.dll"
-  	  VALUE "ProductName",		"GWT Developer Plugin (XPCOM)"
-  	  VALUE "ProductVersion",	"0.9.0.0"
-  	END
-  END
-  BLOCK "VarFileInfo"
-  BEGIN
-    VALUE "Translation", 0x409, 1252
-  END
-END
-
-#ifdef APSTUDIO_INVOKED
-1 TEXTINCLUDE
-BEGIN
-  "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
-  "#include ""windows.h""\r\n"
-  "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
-  "\r\n"
-  "\0"
-END
-
-#endif
-
-#else
-
-#endif
diff --git a/reference/dispatch/Dispatch.gwt.xml b/reference/dispatch/Dispatch.gwt.xml
deleted file mode 100644
index fa1c708..0000000
--- a/reference/dispatch/Dispatch.gwt.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<!DOCTYPE document SYSTEM
-    "http://google-web-toolkit.googlecode.com/svn/releases/1.5/distro-source/core/src/gwt-module.dtd">
-<module>
-  <inherits name='com.google.gwt.user.User' />
-  <entry-point class='kellegous.client.Dispatch' />
-</module>
diff --git a/reference/dispatch/client/Dispatch.java b/reference/dispatch/client/Dispatch.java
deleted file mode 100644
index cac6f18..0000000
--- a/reference/dispatch/client/Dispatch.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package kellegous.client;
-
-import com.google.gwt.core.client.Duration;
-import com.google.gwt.core.client.EntryPoint;
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.dom.client.DivElement;
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.user.client.Command;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.EventListener;
-
-public class Dispatch implements EntryPoint {
-  private static native Event createMockEvent() /*-{
-    return { type: "click" };
-  }-*/;
-
-  private static double[] runTrial(int numberOfObservers,
-      int numberOfIterations, int numberOfSamples) {
-    final double[] results = new double[numberOfSamples];
-    final EventListener subject = Subject.create(numberOfObservers);
-    final Event event = createMockEvent();
-    for (int j = 0; j < numberOfSamples; ++j) {
-      final Duration d = new Duration();
-      for (int i = 0; i < numberOfIterations; ++i) {
-        subject.onBrowserEvent(event);
-      }
-      results[j] = d.elapsedMillis();
-    }
-    return results;
-  }
-
-  private static native void schedule(Command command) /*-{
-    $wnd.setTimeout(function() {
-      command.@com.google.gwt.user.client.Command::execute()();
-    }, 0);
-  }-*/;
-
-  // t-distribution for p = 0.05 (used to compute 95% confidence intervals).
-  // This table is based at df = 2.
-  private final static double[] TDIST = new double[] {
-      4.3027, 3.1824, 2.7765, 2.5706, 2.4469, 2.3646, 2.3060, 2.2622, 2.2281,
-      2.2010, 2.1788, 2.1604, 2.1448, 2.1315, 2.1199, 2.1098, 2.1009, 2.0930,
-      2.0860, 2.0796, 2.0739, 2.0687, 2.0639, 2.0595, 2.0555, 2.0518, 2.0484,
-      2.0452, 2.0423, 2.0395, 2.0369, 2.0345, 2.0322, 2.0301, 2.0281, 2.0262,
-      2.0244, 2.0227, 2.0211, 2.0195, 2.0181, 2.0167, 2.0154, 2.0141, 2.0129,
-      2.0117, 2.0106, 2.0096, 2.0086, 2.0076, 2.0066, 2.0057, 2.0049, 2.0040,
-      2.0032, 2.0025, 2.0017, 2.0010, 2.0003, 1.9996, 1.9990, 1.9983, 1.9977,
-      1.9971, 1.9966, 1.9960, 1.9955, 1.9949, 1.9944, 1.9939, 1.9935, 1.9930,
-      1.9925, 1.9921, 1.9917, 1.9913, 1.9908, 1.9905, 1.9901, 1.9897, 1.9893,
-      1.9890, 1.9886, 1.9883, 1.9879, 1.9876, 1.9873, 1.9870, 1.9867, 1.9864,
-      1.9861, 1.9858, 1.9855, 1.9852, 1.9850, 1.9847, 1.9845, 1.9842, 1.9840};
-
-  private static double computeT(int df) {
-    return TDIST[df - 2];
-  }
-
-  private static double computeMean(double[] s) {
-    double sum = 0.0;
-    final int n = s.length;
-    for (int i = 0; i < n; ++i) {
-      sum += s[i];
-    }
-    return sum / n;
-  }
-
-  private static double computeStandardError(double[] data, double mean) {
-    final int n = data.length;
-    double sum = 0.0;
-    for (int i = 0; i < n; ++i) {
-      final double d = data[i] - mean;
-      sum += d * d;
-    }
-
-    return Math.sqrt(sum / n) / Math.sqrt(n);
-  }
-
-  private static class Stats {
-    private final double mean, upper, lower;
-
-    Stats(double[] data) {
-      mean = computeMean(data);
-      final double error = computeStandardError(data, mean);
-      final double t = computeT(data.length - 1);
-      upper = mean + t * error;
-      lower = mean - t * error;
-    }
-
-    @Override
-    public String toString() {
-      return mean + ", " + lower + ", " + upper;
-    }
-  }
-
-  public static class Runner {
-    private int n;
-    private final int max, numIterations, numSamples;
-    private Stats[] results;
-
-    Runner(int min, int max, int numIterations, int numSamples) {
-      n = min;
-      this.max = max;
-      this.numIterations = numIterations;
-      this.numSamples = numSamples;
-      results = new Stats[max - min + 1];
-    }
-
-    void finish() {
-      final Document document = Document.get();
-      final DivElement root = document.createDivElement();
-      document.getBody().appendChild(root);
-      for (int i = 0, n = results.length; i < n; ++i) {
-        final DivElement div = document.createDivElement();
-        root.appendChild(div);
-        div.setInnerText("" + results[i].toString());
-      }
-    }
-
-    void next() {
-      schedule(new Command() {
-        public void execute() {
-          final double[] results = runTrial(n, numIterations, numSamples);
-          Runner.this.results[n] = new Stats(results);
-          if (++n <= max) {
-            next();
-          } else {
-            finish();
-          }
-        }
-      });
-    }
-
-    void run() {
-      next();
-    }
-  }
-
-  public void onModuleLoad() {
-    // Don't run this in hosted mode.
-    if (GWT.isScript()) {
-      new Runner(0, 10, 10000, 20).run();
-    }
-  }
-}
diff --git a/reference/dispatch/client/Subject.java b/reference/dispatch/client/Subject.java
deleted file mode 100644
index fc21bee..0000000
--- a/reference/dispatch/client/Subject.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package kellegous.client;
-
-import com.google.gwt.user.client.EventListener;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.ClickListener;
-import com.google.gwt.user.client.ui.Widget;
-
-public class Subject {
-  public static EventListener create(int numberOfObserver) {
-    final Button subject = new Button("a button");
-    for (int i = 0; i < numberOfObserver; ++i) {
-      subject.addClickListener(new ClickListener() {
-        private int count = 0;
-
-        public void onClick(Widget sender) {
-          count++;
-        }
-      });
-    }
-    return subject;
-  }
-}
diff --git a/reference/dispatch/public/Dispatch.html b/reference/dispatch/public/Dispatch.html
deleted file mode 100644
index e87c244..0000000
--- a/reference/dispatch/public/Dispatch.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-  <head>
-    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
-    <title>Dispatch5</title>
-    <script type="text/javascript" language="javascript" src="kellegous.Dispatch.nocache.js"></script>
-  </head>
-  <body>
-  </body>
-</html>
diff --git a/reference/html-encyclopedia/FieldSet.html b/reference/html-encyclopedia/FieldSet.html
deleted file mode 100644
index 53c5f9a..0000000
--- a/reference/html-encyclopedia/FieldSet.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html>
-<body>
-
-<h1>Fieldset examples</h1>
-
-<h2>Fieldsets take HTML captions</h2>
-Everything below is confirmed to work in FF 1.5, FF 2.0, IE 6, IE 7, Safari 3.1
-
-<fieldset>
-  <legend><b>Bold</b> is supported</legend>
-  <button>Button</button>
-</fieldset>
-
-<fieldset>
-  <legend><u>Underline</u> is supported</legend>
-  <button>Button</button>
-</fieldset>
-
-<fieldset>
-  <legend><button>Buttons</button> are supported</legend>
-  <button>Button</button>
-</fieldset>
-
-<fieldset>
-  <legend><img src="http://www.google.com/images/logo.gif"> (images are supported)</legend>
-  <button>Button</button>
-</fieldset>
-
-<fieldset>
-  <legend>
-    <table>
-      <tr><td colspan="2">Tables work</td></tr>
-      <tr><td>row 1, col 1</td><td>row 1, col 2</td></tr>
-      <tr><td>row 2, col 1</td><td>row 2, col 2</td></tr>
-    </table>
-  </legend>
-  <button>Button</button>
-</fieldset>
-  
-<fieldset>
-  <legend>
-    <span><input id="mycheckbox" type="checkbox"><label for="mycheckbox">GWT-structured checkboxes work</label></span>
-  </legend>
-  <button>Button</button>
-</fieldset>
-  
-<h2>Fieldsets without a &lt;legend&gt; element shows no gap</h2>
-<fieldset>
-  <button>Button</button>
-</fieldset>
-
-<h2>Fieldsets with an empty &lt;legend&gt; element show a gap in some browsers</h2>
-<fieldset>
-  <legend></legend>
-  <button>Button</button>
-</fieldset>
-
-</body>
-</html>
-
diff --git a/user/build.xml b/user/build.xml
index 3290ba5..d49f25f 100755
--- a/user/build.xml
+++ b/user/build.xml
@@ -35,7 +35,7 @@
   <property name="gwt.tck.testcase.dev.includes" value="com/google/gwt/validation/tck/**/*GwtSuite.class" />
   <property name="gwt.tct.testcase.dev.excludes" value="" />
 
-  <property name="gwt.nongwt.testcase.includes" value="com/google/gwt/dev/jjs/GwtAstBuilderTest.class" />
+  <property name="gwt.nongwt.testcase.includes" value="**/*SuiteNoBrowser.class" />
   <property name="gwt.nongwt.testcase.excludes" value="" />
 
   <!--
diff --git a/user/src/com/google/gwt/animation/Animation.gwt.xml b/user/src/com/google/gwt/animation/Animation.gwt.xml
index bc2a47c..8fd4427 100644
--- a/user/src/com/google/gwt/animation/Animation.gwt.xml
+++ b/user/src/com/google/gwt/animation/Animation.gwt.xml
@@ -32,11 +32,13 @@
   <replace-with class="com.google.gwt.animation.client.AnimationSchedulerImplMozilla">
     <when-type-is class="com.google.gwt.animation.client.AnimationScheduler"/>
     <when-property-is name="user.agent" value="gecko1_8"/>
+    <when-property-is name="webApiUsage" value="modern"/>
   </replace-with>
 
   <!-- Implementation based on webkitRequestAnimationFrame -->
   <replace-with class="com.google.gwt.animation.client.AnimationSchedulerImplWebkit">
     <when-type-is class="com.google.gwt.animation.client.AnimationScheduler"/>
     <when-property-is name="user.agent" value="safari"/>
+    <when-property-is name="webApiUsage" value="modern"/>
   </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/animation/client/Animation.java b/user/src/com/google/gwt/animation/client/Animation.java
index cf3530e..800d1fb 100644
--- a/user/src/com/google/gwt/animation/client/Animation.java
+++ b/user/src/com/google/gwt/animation/client/Animation.java
@@ -242,8 +242,10 @@
    * 
    * The value of progress is between 0.0 and 1.0 (inclusive) (unless you
    * override the {@link #interpolate(double)} method to provide a wider range
-   * of values). You can override {@link #onStart()} and {@link #onComplete()}
-   * to perform setup and tear down procedures.
+   * of values). There is no guarantee that {@link #onUpdate(double)} is called 
+   * with 0.0 or 1.0. 
+   * If you need to perform setup or tear down procedures, you can override 
+   * {@link #onStart()} and {@link #onComplete()}.
    * 
    * @param progress a double, normally between 0.0 and 1.0 (inclusive)
    */
diff --git a/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml b/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
index b988b19..1c45f9d 100644
--- a/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
+++ b/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
@@ -23,7 +23,17 @@
   <define-configuration-property name="installScriptJs" is-multi-valued="false" />
   <define-configuration-property name="installCode" is-multi-valued="false" />
   <define-configuration-property name="computeScriptBaseJs" is-multi-valued="false" />
-
+  <!--
+     - Determines whether the GWT compiler generates cache.js files
+     - that end with a comment pointing to a sourcemap file, to support source-level
+     - debugging in browsers.
+     - Specification: http://goo.gl/ZQ3V3
+     - Takes on the following values:
+     - if false, no sourcemap URL declarations are included at the end of the primary fragment script
+     - if true, a relative URL to the standard sourcemap for the primary fragment is included
+     - else the value is assumed to be a custom URL -->
+  <define-configuration-property name="includeSourceMapUrl" is-multi-valued="false"/>
+  <set-configuration-property name="includeSourceMapUrl" value="false"/>
   <set-configuration-property name="xsiframe.failIfScriptTag" value="TRUE"/> 
 
   <replace-with class="com.google.gwt.core.client.impl.ScriptTagLoadingStrategy">
@@ -31,4 +41,6 @@
       class="com.google.gwt.core.client.impl.AsyncFragmentLoader.LoadingStrategy" />
     <when-linker-added name="xsiframe" />
   </replace-with>
+
+
 </module>
diff --git a/user/src/com/google/gwt/core/client/ScriptInjector.java b/user/src/com/google/gwt/core/client/ScriptInjector.java
index 4c08242..d07ad4a 100644
--- a/user/src/com/google/gwt/core/client/ScriptInjector.java
+++ b/user/src/com/google/gwt/core/client/ScriptInjector.java
@@ -119,6 +119,7 @@
    */
   public static class FromUrl {
     private Callback<Void, Exception> callback;
+    private boolean removeTag = false;
     private final String scriptUrl;
     private JavaScriptObject window;
 
@@ -139,8 +140,8 @@
       assert doc != null;
       JavaScriptObject scriptElement = nativeMakeScriptElement(doc);
       assert scriptElement != null;
-      if (callback != null) {
-        attachListeners(scriptElement, callback);
+      if (callback != null || removeTag) {
+        attachListeners(scriptElement, callback, removeTag);
       }
       nativeSetSrc(scriptElement, scriptUrl);
       nativeAttachToHead(doc, scriptElement);
@@ -175,6 +176,19 @@
     }
 
     /**
+     * @param removeTag If true, remove the tag after the script finishes
+     *          loading. This shrinks the DOM, possibly at the expense of
+     *          readability if you are debugging javaScript.
+     *
+     *          Default value is {@code false}, but this may change in a future
+     *          release.
+     */
+    public FromUrl setRemoveTag(boolean removeTag) {
+      this.removeTag = removeTag;
+      return this;
+    }
+
+    /**
      * This call allows you to specify which DOM window object to install the
      * script tag in. To install into the Top level window call
      * 
@@ -243,20 +257,27 @@
    * @param callback callback that runs when the script is loaded and parsed.
    */
   private static native void attachListeners(JavaScriptObject scriptElement,
-      Callback<Void, Exception> callback) /*-{
+      Callback<Void, Exception> callback, boolean removeTag) /*-{
     function clearCallbacks() {
       scriptElement.onerror = scriptElement.onreadystatechange = scriptElement.onload = function() {
       };
+      if (removeTag) {
+        @com.google.gwt.core.client.ScriptInjector::nativeRemove(Lcom/google/gwt/core/client/JavaScriptObject;)(scriptElement);
+      }
     }
     scriptElement.onload = $entry(function() {
       clearCallbacks();
-      callback.@com.google.gwt.core.client.Callback::onSuccess(Ljava/lang/Object;)(null);
+      if (callback) {
+        callback.@com.google.gwt.core.client.Callback::onSuccess(Ljava/lang/Object;)(null);
+      }
     });
-    // or possibly more portable script_tag.addEventListener('error', function(){...}, true); 
+    // or possibly more portable script_tag.addEventListener('error', function(){...}, true);
     scriptElement.onerror = $entry(function() {
       clearCallbacks();
-      var ex = @com.google.gwt.core.client.CodeDownloadException::new(Ljava/lang/String;)("onerror() called.");
-      callback.@com.google.gwt.core.client.Callback::onFailure(Ljava/lang/Object;)(ex)
+      if (callback) {
+        var ex = @com.google.gwt.core.client.CodeDownloadException::new(Ljava/lang/String;)("onerror() called.");
+        callback.@com.google.gwt.core.client.Callback::onFailure(Ljava/lang/Object;)(ex);
+      }
     });
     scriptElement.onreadystatechange = $entry(function() {
       if (scriptElement.readyState == 'complete' || scriptElement.readyState == 'loaded') {
diff --git a/user/src/com/google/gwt/core/client/impl/Impl.java b/user/src/com/google/gwt/core/client/impl/Impl.java
index 5a224dd..f94faea 100644
--- a/user/src/com/google/gwt/core/client/impl/Impl.java
+++ b/user/src/com/google/gwt/core/client/impl/Impl.java
@@ -184,11 +184,11 @@
   }-*/;
 
   private static native Object apply(Object jsFunction, Object thisObj,
-      Object arguments) /*-{
+      Object args) /*-{
     if (@com.google.gwt.core.client.GWT::isScript()()) {
-      return jsFunction.apply(thisObj, arguments);
+      return jsFunction.apply(thisObj, args);
     } else {
-      var _ = jsFunction.apply(thisObj, arguments);
+      var _ = jsFunction.apply(thisObj, args);
       if (_ != null) {
         // Wrap for Development Mode
         _ = Object(_);
diff --git a/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java b/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
index fd76da9..14d4381 100644
--- a/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
+++ b/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
@@ -149,55 +149,7 @@
     return queue;
   }
 
-  /**
-   * Execute a list of Tasks that hold RepeatingCommands.
-   * 
-   * @return A replacement array that is possibly a shorter copy of
-   *         <code>tasks</code>
-   */
-  private static JsArray<Task> runRepeatingTasks(JsArray<Task> tasks) {
-    assert tasks != null : "tasks";
 
-    int length = tasks.length();
-    if (length == 0) {
-      return null;
-    }
-
-    boolean canceledSomeTasks = false;
-    double start = Duration.currentTimeMillis();
-
-    while (Duration.currentTimeMillis() - start < TIME_SLICE) {
-      for (int i = 0; i < length; i++) {
-        assert tasks.length() == length : "Working array length changed "
-            + tasks.length() + " != " + length;
-        Task t = tasks.get(i);
-        if (t == null) {
-          continue;
-        }
-
-        assert t.isRepeating() : "Found a non-repeating Task";
-
-        if (!t.executeRepeating()) {
-          tasks.set(i, null);
-          canceledSomeTasks = true;
-        }
-      }
-    }
-
-    if (canceledSomeTasks) {
-      JsArray<Task> newTasks = createQueue();
-      // Remove tombstones
-      for (int i = 0; i < length; i++) {
-        if (tasks.get(i) != null) {
-          newTasks.push(tasks.get(i));
-        }
-      }
-      assert newTasks.length() < length;
-      return newTasks.length() == 0 ? null : newTasks;
-    } else {
-      return tasks;
-    }
-  }
 
   /**
    * Execute a list of Tasks that hold both ScheduledCommands and
@@ -374,6 +326,13 @@
   }
 
   /**
+   * there for testing
+   */
+  Duration createDuration() {
+    return new Duration();
+  }
+
+  /**
    * Called by Flusher.
    */
   void flushPostEventPumpCommands() {
@@ -412,4 +371,59 @@
       scheduleFixedDelayImpl(rescue, RESCUE_DELAY);
     }
   }
+
+  /**
+   * Execute a list of Tasks that hold RepeatingCommands.
+   *
+   * @return A replacement array that is possibly a shorter copy of <code>tasks</code>
+   */
+  private JsArray<Task> runRepeatingTasks(JsArray<Task> tasks) {
+    assert tasks != null : "tasks";
+
+    int length = tasks.length();
+    if (length == 0) {
+      return null;
+    }
+
+    boolean canceledSomeTasks = false;
+
+    Duration duration = createDuration();
+    while (duration.elapsedMillis() < TIME_SLICE) {
+      boolean executedSomeTask = false;
+      for (int i = 0; i < length; i++) {
+        assert tasks.length() == length : "Working array length changed " + tasks.length() + " != "
+            + length;
+        Task t = tasks.get(i);
+        if (t == null) {
+          continue;
+        }
+        executedSomeTask = true;
+
+        assert t.isRepeating() : "Found a non-repeating Task";
+
+        if (!t.executeRepeating()) {
+          tasks.set(i, null);
+          canceledSomeTasks = true;
+        }
+      }
+      if (!executedSomeTask) {
+        // no work left to do, break to avoid busy waiting until TIME_SLICE is reached
+        break;
+      }
+    }
+
+    if (canceledSomeTasks) {
+      JsArray<Task> newTasks = createQueue();
+      // Remove tombstones
+      for (int i = 0; i < length; i++) {
+        if (tasks.get(i) != null) {
+          newTasks.push(tasks.get(i));
+        }
+      }
+      assert newTasks.length() < length;
+      return newTasks.length() == 0 ? null : newTasks;
+    } else {
+      return tasks;
+    }
+  }
 }
diff --git a/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java b/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
index 6b2b97e..1e88bf5 100644
--- a/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
+++ b/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
@@ -15,7 +15,8 @@
  */
 package com.google.gwt.core.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.Callback;
+import com.google.gwt.core.client.ScriptInjector;
 import com.google.gwt.core.client.impl.AsyncFragmentLoader.HttpDownloadFailure;
 
 /**
@@ -23,10 +24,8 @@
  * therefore cross site compatible. Note that if this strategy is used, the
  * deferred fragments must be wrapped in a callback called runAsyncCallbackX()
  * where X is the fragment number.
- * 
+ *
  * This is the default strategy for the CrossSiteIframeLinker.
- * 
- * TODO(unnurg): Try to use the ScriptInjector here
  */
 
 public class ScriptTagLoadingStrategy extends LoadingStrategyBase {
@@ -37,96 +36,57 @@
   protected static class ScriptTagDownloadStrategy implements DownloadStrategy {
     @Override
     public void tryDownload(final RequestData request) {
-      int fragment = request.getFragment();
-      JavaScriptObject scriptTag = createScriptTag(request.getUrl());
-      setOnSuccess(fragment, onSuccess(fragment, scriptTag, request));
-      setOnFailure(scriptTag, onFailure(fragment, scriptTag, request));
-      installScriptTag(scriptTag);
+      setAsyncCallback(request.getFragment(), request);
+
+      ScriptInjector.fromUrl(request.getUrl()).setRemoveTag(true).setCallback(
+        new Callback<Void, Exception>() {
+          @Override
+          public void onFailure(Exception reason) {
+            cleanup(request);
+          }
+
+          @Override
+          public void onSuccess(Void result) {
+            cleanup(request);
+          }
+      }).inject();
     }
   }
-  
-  protected static void callOnLoadError(RequestData request) {
-    request.onLoadError(new HttpDownloadFailure(request.getUrl(), 404,
-      "Script Tag Failure - no status available"), true);
+
+  private static void asyncCallback(RequestData request, String code) {
+    boolean firstTimeCalled = clearAsyncCallback(request.getFragment());
+    if (firstTimeCalled) {
+      request.tryInstall(code);
+    }
   }
 
-  private static native boolean clearCallbacksAndRemoveTag(
-      int fragment, JavaScriptObject scriptTag) /*-{
-    if (scriptTag.parentNode == null) {
-      // onSuccess or onFailure must have already been called.
+  private static void cleanup(RequestData request) {
+    boolean neverCalled = clearAsyncCallback(request.getFragment());
+    if (neverCalled) {
+      request.onLoadError(new HttpDownloadFailure(request.getUrl(), 404,
+        "Script Tag Failure - no status available"), true);
+    }
+  }
+
+  /**
+   * Returns true if the callback existed.
+   */
+  private static native boolean clearAsyncCallback(int fragment) /*-{
+    if (!__gwtModuleFunction['runAsyncCallback' + fragment]) {
       return false;
     }
-    var head = document.getElementsByTagName('head').item(0);
-    @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearOnSuccess(I)(fragment);
-    @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearOnFailure(Lcom/google/gwt/core/client/JavaScriptObject;)(
-      scriptTag);
-    head.removeChild(scriptTag);
+    delete __gwtModuleFunction['runAsyncCallback' + fragment];
     return true;
   }-*/;
-  
-  private static native void clearOnFailure(JavaScriptObject scriptTag) /*-{
-    scriptTag.onerror = scriptTag.onload = scriptTag.onreadystatechange = function(){};
-  }-*/;
 
-  private static native void clearOnSuccess(int fragment) /*-{
-    delete __gwtModuleFunction['runAsyncCallback' + fragment];
-  }-*/;
-  
-  private static native JavaScriptObject createScriptTag(String url) /*-{
-    var head = document.getElementsByTagName('head').item(0);
-    var scriptTag = document.createElement('script');
-    scriptTag.src = url;
-    return scriptTag;
-  }-*/;
-
-  private static native void installScriptTag(JavaScriptObject scriptTag) /*-{
-    var head = document.getElementsByTagName('head').item(0);
-    head.appendChild(scriptTag);
-  }-*/;
-
-  private static native JavaScriptObject onFailure(
-      int fragment, JavaScriptObject scriptTag, RequestData request) /*-{
-    return function() {
-      if (@com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearCallbacksAndRemoveTag(ILcom/google/gwt/core/client/JavaScriptObject;)(
-        fragment, scriptTag)) {
-        @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::callOnLoadError(Lcom/google/gwt/core/client/impl/LoadingStrategyBase$RequestData;)(
-          request)
-      }
-    }
-  }-*/;
-  
-  private static native JavaScriptObject onSuccess(int fragment,
-      JavaScriptObject scriptTag, RequestData request) /*-{
-    return function(code, instance) {
-      if (@com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::clearCallbacksAndRemoveTag(ILcom/google/gwt/core/client/JavaScriptObject;)(
-        fragment, scriptTag)) {
-        request.@com.google.gwt.core.client.impl.LoadingStrategyBase.RequestData::tryInstall(Ljava/lang/String;)(
-          code);
-      }
-    }
-  }-*/;
-  
-  private static native void setOnFailure(JavaScriptObject script,
-      JavaScriptObject callback) /*-{
-    script.onerror = function() {
-      callback();
-    }
-    script.onload = function() {
-      callback();
-    }
-    script.onreadystatechange = function () {
-      if (script.readyState == 'loaded' || script.readyState == 'complete') {
-        script.onreadystatechange = function () { }
-        callback();
-      }
-    }
-  }-*/;
-  
-  private static native void setOnSuccess(int fragment, JavaScriptObject callback) /*-{
-    __gwtModuleFunction['runAsyncCallback'+fragment] = callback;
+  private static native void setAsyncCallback(int fragment, RequestData request) /*-{
+    __gwtModuleFunction['runAsyncCallback' + fragment] = $entry(function(code, instance) {
+      @com.google.gwt.core.client.impl.ScriptTagLoadingStrategy::asyncCallback(Lcom/google/gwt/core/client/impl/LoadingStrategyBase$RequestData;Ljava/lang/String;)(
+        request, code);
+    });
   }-*/;
 
   public ScriptTagLoadingStrategy() {
     super(new ScriptTagDownloadStrategy());
-  } 
+  }
 }
diff --git a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
index 6b4924a..faff5a5 100644
--- a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
+++ b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
@@ -338,9 +338,16 @@
 
       index = toReturn.indexOf("(");
       if (index == -1) {
-        // No bracketed items found, hence no function name available
-        location = toReturn;
-        toReturn = "";
+        // No bracketed items found, try '@' (used by iOS).
+        index = toReturn.indexOf("@");
+        if (index == -1) {
+          // No bracketed items nor '@' found, hence no function name available
+          location = toReturn;
+          toReturn = "";
+        } else {
+          location = toReturn.substring(index + 1).trim();
+          toReturn = toReturn.substring(0, index).trim();
+        }
       } else {
         // Bracketed items found: strip them off, parse location info
         int closeParen = toReturn.indexOf(")", index);
diff --git a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
index 6b306fc..5dd8343 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
@@ -141,14 +141,22 @@
 
   @Override
   public native int getBodyOffsetLeft(Document doc) /*-{
-    var style = $wnd.getComputedStyle(doc.documentElement, '');
-    return parseInt(style.marginLeft) + parseInt(style.borderLeftWidth);
+    var style = $wnd.getComputedStyle(doc.documentElement, null);
+    if (style == null) {
+      // Works around https://bugzilla.mozilla.org/show_bug.cgi?id=548397
+      return 0;
+    }
+    return parseInt(style.marginLeft, 10) + parseInt(style.borderLeftWidth, 10);
   }-*/;
 
   @Override
   public native int getBodyOffsetTop(Document doc) /*-{
-    var style = $wnd.getComputedStyle(doc.documentElement, '');
-    return parseInt(style.marginTop) + parseInt(style.borderTopWidth);
+    var style = $wnd.getComputedStyle(doc.documentElement, null);
+    if (style == null) {
+      // Works around https://bugzilla.mozilla.org/show_bug.cgi?id=548397
+      return 0;
+    }
+    return parseInt(style.marginTop, 10) + parseInt(style.borderTopWidth, 10);
   }-*/;
 
   @Override
diff --git a/user/src/com/google/gwt/dom/client/Element.java b/user/src/com/google/gwt/dom/client/Element.java
index 258d3d3..7d1fd5b 100644
--- a/user/src/com/google/gwt/dom/client/Element.java
+++ b/user/src/com/google/gwt/dom/client/Element.java
@@ -85,9 +85,10 @@
    * present, this method has no effect.
    * 
    * @param className the class name to be added
+   * @return <code>true</code> if this element did not already have the specified class name
    * @see #setClassName(String)
    */
-  public final void addClassName(String className) {
+  public final boolean addClassName(String className) {
     assert (className != null) : "Unexpectedly null class name";
 
     className = className.trim();
@@ -95,28 +96,18 @@
 
     // Get the current style string.
     String oldClassName = getClassName();
-    int idx = oldClassName.indexOf(className);
-
-    // Calculate matching index.
-    while (idx != -1) {
-      if (idx == 0 || oldClassName.charAt(idx - 1) == ' ') {
-        int last = idx + className.length();
-        int lastPos = oldClassName.length();
-        if ((last == lastPos)
-            || ((last < lastPos) && (oldClassName.charAt(last) == ' '))) {
-          break;
-        }
-      }
-      idx = oldClassName.indexOf(className, idx + 1);
-    }
+    int idx = indexOfName(oldClassName, className);
 
     // Only add the style if it's not already present.
     if (idx == -1) {
       if (oldClassName.length() > 0) {
-        oldClassName += " ";
+        setClassName(oldClassName + " " + className);
+      } else {
+        setClassName(className);
       }
-      setClassName(oldClassName + className);
+      return true;
     }
+    return false;
   }
 
   /**
@@ -528,10 +519,11 @@
    * Removes a name from this element's class property. If the name is not
    * present, this method has no effect.
    * 
-   * @param className the class name to be added
+   * @param className the class name to be removed
+   * @return <code>true</code> if this element had the specified class name
    * @see #setClassName(String)
    */
-  public final void removeClassName(String className) {
+  public final boolean removeClassName(String className) {
     assert (className != null) : "Unexpectedly null class name";
 
     className = className.trim();
@@ -539,20 +531,7 @@
 
     // Get the current style string.
     String oldStyle = getClassName();
-    int idx = oldStyle.indexOf(className);
-
-    // Calculate matching index.
-    while (idx != -1) {
-      if (idx == 0 || oldStyle.charAt(idx - 1) == ' ') {
-        int last = idx + className.length();
-        int lastPos = oldStyle.length();
-        if ((last == lastPos)
-            || ((last < lastPos) && (oldStyle.charAt(last) == ' '))) {
-          break;
-        }
-      }
-      idx = oldStyle.indexOf(className, idx + 1);
-    }
+    int idx = indexOfName(oldStyle, className);
 
     // Don't try to remove the style if it's not there.
     if (idx != -1) {
@@ -571,7 +550,35 @@
       }
 
       setClassName(newClassName);
+      return true;
     }
+    return false;
+  }
+
+  /**
+   * Returns the index of the first occurrence of name in a space-separated list of names,
+   * or -1 if not found.
+   *
+   * @param nameList list of space delimited names
+   * @param name a non-empty string.  Should be already trimmed.
+   */
+  static int indexOfName(String nameList, String name) {
+    int idx = nameList.indexOf(name);
+
+    // Calculate matching index.
+    while (idx != -1) {
+      if (idx == 0 || nameList.charAt(idx - 1) == ' ') {
+        int last = idx + name.length();
+        int lastPos = nameList.length();
+        if ((last == lastPos)
+            || ((last < lastPos) && (nameList.charAt(last) == ' '))) {
+          break;
+        }
+      }
+      idx = nameList.indexOf(name, idx + 1);
+    }
+
+    return idx;
   }
 
   /**
diff --git a/user/src/com/google/gwt/dom/client/Style.java b/user/src/com/google/gwt/dom/client/Style.java
index 29cbc81..414483b 100644
--- a/user/src/com/google/gwt/dom/client/Style.java
+++ b/user/src/com/google/gwt/dom/client/Style.java
@@ -1153,7 +1153,7 @@
   }
 
   /**
-   * Clear the font-size css property.
+   * Clear the float css property.
    */
   public final void clearFloat() {
     clearProperty(DOMImpl.impl.cssFloatPropertyName());
diff --git a/user/src/com/google/gwt/editor/client/adapters/EditorSource.java b/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
index 6a1d779..e2991fa 100644
--- a/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
+++ b/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
@@ -22,7 +22,7 @@
 
 /**
  * An entity capable of creating and destroying instances of Editors. This type
- * is used by Editors which operate on ordered data, sich as {@link ListEditor}.
+ * is used by Editors which operate on ordered data, such as {@link ListEditor}.
  * 
  * @param <E> the type of Editor required
  * @see com.google.gwt.editor.client.testing.FakeEditorSource
@@ -45,6 +45,7 @@
    * @return a List of {@link Editor}s of type E
    */
   public List<E> create(int count, int index) {
+    assert index >= 0;
     List<E> toReturn = new ArrayList<E>(count);
     for (int i = 0; i < count; i++) {
       toReturn.add(create(index + i));
@@ -53,6 +54,22 @@
   }
 
   /**
+   * Creates a temporary sub-Editor to use for traversal.
+   * <p>
+   * For backwards compatibility with GWT 2.5.0 and earlier, the default implementation calls
+   * {@code create(0)} and {@link #dispose(Editor) disposes} the editor right away.
+   * 
+   * @return an {@link Editor} of type E
+   * @see ListEditor#createEditorForTraversal()
+   * @see com.google.gwt.editor.client.EditorContext#traverseSyntheticCompositeEditor
+   */
+  public E createEditorForTraversal() {
+    E toReturn = create(0);
+    dispose(toReturn);
+    return toReturn;
+  }
+
+  /**
    * Called when an Editor no longer requires a sub-Editor. The default
    * implementation is a no-op.
    *
@@ -68,5 +85,6 @@
    * @param index the index of the Editor
    */
   public void setIndex(E editor, int index) {
+    assert index >= 0;
   }
 }
\ No newline at end of file
diff --git a/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java b/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
index f2bb40f..a2a781f 100644
--- a/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
@@ -35,21 +35,30 @@
 
     @Override
     public IndexedEditor<T> create(int index) {
+      assert index >= 0;
       return new IndexedEditor<T>(index, data);
     }
 
     @Override
+    public LeafValueEditor<T> createEditorForTraversal() {
+      return new IndexedEditor<T>(-1, null);
+    }
+
+    @Override
     public void dispose(LeafValueEditor<T> subEditor) {
+      // We use a negative index as flag in createEditorForTraversal
+      assert ((IndexedEditor<T>) subEditor).index >= 0;
       data.setRowCount(data.getRowCount() - 1);
     }
 
     @Override
     public void setIndex(LeafValueEditor<T> editor, int index) {
+      assert index >= 0;
       ((IndexedEditor<T>) editor).setIndex(index);
     }
   }
 
-  static class IndexedEditor<Q> implements LeafValueEditor<Q> {
+  private static class IndexedEditor<Q> implements LeafValueEditor<Q> {
     private int index;
     private Q value;
     private final HasData<Q> data;
@@ -59,22 +68,27 @@
       this.data = data;
     }
 
+    @Override
     public Q getValue() {
       return value;
     }
 
-    public void setIndex(int index) {
-      this.index = index;
-      push();
-    }
-
+    @Override
     public void setValue(Q value) {
       this.value = value;
       push();
     }
 
+    void setIndex(int index) {
+      assert index >= 0;
+      this.index = index;
+      push();
+    }
+
     private void push() {
-      data.setRowData(index, Collections.singletonList(value));
+      if (data != null) {
+        data.setRowData(index, Collections.singletonList(value));
+      }
     }
   }
 
@@ -92,7 +106,7 @@
   /**
    * Prevent subclassing.
    */
-  HasDataEditor(HasData<T> data) {
+  private HasDataEditor(HasData<T> data) {
     super(new HasDataEditorSource<T>(data));
   }
 }
diff --git a/user/src/com/google/gwt/editor/client/adapters/ListEditor.java b/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
index 262ad66..0befca9 100644
--- a/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
@@ -66,9 +66,7 @@
    * @return an {@link Editor} of type E
    */
   public E createEditorForTraversal() {
-    E toReturn = editorSource.create(0);
-    editorSource.dispose(toReturn);
-    return toReturn;
+    return editorSource.createEditorForTraversal();
   }
 
   public void flush() {
diff --git a/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java b/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java
index a51c62a..742e180 100644
--- a/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java
+++ b/user/src/com/google/gwt/editor/client/impl/ErrorCollector.java
@@ -1,12 +1,12 @@
 /*
  * 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
@@ -57,10 +57,14 @@
       // Get the enclosing error domain
       List<EditorError> tryConsume = errorStack.pop();
       int prefixLength = ctx.getAbsolutePath().length();
-      // Remove trailing dot in non-empty paths
-      prefixLength = prefixLength == 0 ? 0 : prefixLength + 1;
       for (EditorError error : tryConsume) {
-        ((SimpleError) error).setPathPrefixLength(prefixLength);
+        if ((prefixLength > 0) && (prefixLength < error.getAbsolutePath().length())) {
+          // Remove trailing dot
+          ((SimpleError) error).setPathPrefixLength(prefixLength + 1);
+        } else {
+          assert prefixLength == 0 || error.getAbsolutePath().equals(ctx.getAbsolutePath());
+          ((SimpleError) error).setPathPrefixLength(prefixLength);
+        }
       }
       /*
        * Pass collected errors to the editor. Must pass empty error collection
diff --git a/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java b/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
index 073aec3..5deff76 100644
--- a/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
+++ b/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
@@ -48,6 +48,11 @@
   }
 
   @Override
+  public FakeLeafValueEditor<T> createEditorForTraversal() {
+    return new FakeLeafValueEditor<T>();
+  }
+
+  @Override
   public void dispose(FakeLeafValueEditor<T> subEditor) {
     lastKnownPosition.put(subEditor, DISPOSED);
   }
diff --git a/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java b/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java
index 1c8ea00..c183fe2 100644
--- a/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java
+++ b/user/src/com/google/gwt/event/dom/client/HandlesAllTouchEvents.java
@@ -17,10 +17,10 @@
 package com.google.gwt.event.dom.client;
 
 /**
- * Receiver used to handle all mouse events at once.
+ * Receiver used to handle all touch events at once.
  *
  * WARNING, PLEASE READ: As this class is intended for developers who wish to
- * handle all mouse events in GWT, new mouse handler interfaces will be added to
+ * handle all touch events in GWT, new touch handler interfaces will be added to
  * it. Therefore, updates to GWT could cause breaking API changes.
  *
  */
diff --git a/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java b/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
index b0aa76b..bf102ab 100644
--- a/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
+++ b/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
@@ -76,7 +76,27 @@
     castFireEventFromSource(event, source);
   }
 
+  /**
+   * How many handlers are registered for the given {@code type}.
+   *
+   * @deprecated Please use {@code getHandlerCount}.
+   */
   public int getCount(GwtEvent.Type<?> type) {
     return real.getCount(type);
   }
+
+  /**
+   * How many events have fired for the given {@code type}. These events may not have been
+   * passed to any handlers.
+   */
+  public int getFiredCount(Type<?> type) {
+    return real.getFiredCount(type);
+  }
+
+  /**
+   * How many handlers are registered for the given {@code type}.
+   */
+  public int getHandlerCount(Type<?> type) {
+    return real.getHandlerCount(type);
+  }
 }
diff --git a/user/src/com/google/gwt/http/HTTP.gwt.xml b/user/src/com/google/gwt/http/HTTP.gwt.xml
index c212dd4..4d2da5b 100644
--- a/user/src/com/google/gwt/http/HTTP.gwt.xml
+++ b/user/src/com/google/gwt/http/HTTP.gwt.xml
@@ -24,4 +24,13 @@
 	<!-- Inheriting User module for Window and Timer. These should be factored
 	     out of User soon. -->
 	<inherits name="com.google.gwt.user.User"/>
+
+	<replace-with class="com.google.gwt.http.client.Request.RequestImplIE6To9">
+		<when-type-is class="com.google.gwt.http.client.Request.RequestImpl" />
+		<any>
+			<when-property-is name="user.agent" value="ie6" />
+			<when-property-is name="user.agent" value="ie8" />
+			<when-property-is name="user.agent" value="ie9" />
+		</any>
+	</replace-with>
 </module>
diff --git a/user/src/com/google/gwt/http/client/Request.java b/user/src/com/google/gwt/http/client/Request.java
index 212b13f..12608c5 100644
--- a/user/src/com/google/gwt/http/client/Request.java
+++ b/user/src/com/google/gwt/http/client/Request.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.http.client;
 
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.user.client.Timer;
 import com.google.gwt.xhr.client.XMLHttpRequest;
 
@@ -32,6 +33,63 @@
 public class Request {
 
   /**
+   * Native implementation associated with {@link Request}. User classes should not use this class
+   * directly.
+   */
+  static class RequestImpl {
+
+    /**
+     * Creates a {@link Response} instance for the given JavaScript XmlHttpRequest object.
+     *
+     * @param xmlHttpRequest xmlHttpRequest object for which we need a response
+     * @return a {@link Response} object instance
+     */
+    Response createResponse(final XMLHttpRequest xmlHttpRequest) {
+      return new ResponseImpl(xmlHttpRequest);
+    }
+  }
+
+  /**
+   * Special {@link RequestImpl} for IE6-9 to work around some IE specialities.
+   */
+  static class RequestImplIE6To9 extends RequestImpl {
+
+    @Override
+    Response createResponse(XMLHttpRequest xmlHttpRequest) {
+      return new ResponseImpl(xmlHttpRequest) {
+
+        @Override
+        public int getStatusCode() {
+          /*
+           * http://code.google.com/p/google-web-toolkit/issues/detail?id=5031
+           *
+           * The XMLHTTPRequest object in IE will return a status code of 1223 and drop some
+           * response headers if the server returns a HTTP/204.
+           *
+           * This issue is fixed in IE10.
+           */
+          int statusCode = super.getStatusCode();
+          return (statusCode == 1223) ? SC_NO_CONTENT : statusCode;
+        }
+      };
+    }
+  }
+
+  /*
+   * Although Request is a client-side class, it's a transitive dependency of
+   * some GWT servlet code.  Because GWT.create() isn't safe to call on the
+   * server, we use the "Initialization On Demand Holder" idiom to lazily
+   * initialize the RequestImpl.
+   */
+  private static class ImplHolder {
+    private static final RequestImpl impl = GWT.create(RequestImpl.class);
+
+    public static RequestImpl get() {
+      return impl;
+    }
+  }
+
+  /**
    * Creates a {@link Response} instance for the given JavaScript XmlHttpRequest
    * object.
    * 
@@ -39,94 +97,7 @@
    * @return a {@link Response} object instance
    */
   private static Response createResponse(final XMLHttpRequest xmlHttpRequest) {
-    assert (isResponseReady(xmlHttpRequest));
-    Response response = new Response() {
-      @Override
-      public String getHeader(String header) {
-        StringValidator.throwIfEmptyOrNull("header", header);
-
-        return xmlHttpRequest.getResponseHeader(header);
-      }
-
-      @Override
-      public Header[] getHeaders() {
-        return Request.getHeaders(xmlHttpRequest);
-      }
-
-      @Override
-      public String getHeadersAsString() {
-        return xmlHttpRequest.getAllResponseHeaders();
-      }
-
-      @Override
-      public int getStatusCode() {
-        return xmlHttpRequest.getStatus();
-      }
-
-      @Override
-      public String getStatusText() {
-        return xmlHttpRequest.getStatusText();
-      }
-
-      @Override
-      public String getText() {
-        return xmlHttpRequest.getResponseText();
-      }
-    };
-    return response;
-  }
-
-  /**
-   * Returns an array of headers built by parsing the string of headers returned
-   * by the JavaScript <code>XmlHttpRequest</code> object.
-   * 
-   * @param xmlHttpRequest
-   * @return array of Header items
-   */
-  private static Header[] getHeaders(XMLHttpRequest xmlHttp) {
-    String allHeaders = xmlHttp.getAllResponseHeaders();
-    String[] unparsedHeaders = allHeaders.split("\n");
-    Header[] parsedHeaders = new Header[unparsedHeaders.length];
-
-    for (int i = 0, n = unparsedHeaders.length; i < n; ++i) {
-      String unparsedHeader = unparsedHeaders[i];
-
-      if (unparsedHeader.length() == 0) {
-        continue;
-      }
-
-      int endOfNameIdx = unparsedHeader.indexOf(':');
-      if (endOfNameIdx < 0) {
-        continue;
-      }
-
-      final String name = unparsedHeader.substring(0, endOfNameIdx).trim();
-      final String value = unparsedHeader.substring(endOfNameIdx + 1).trim();
-      Header header = new Header() {
-        @Override
-        public String getName() {
-          return name;
-        }
-
-        @Override
-        public String getValue() {
-          return value;
-        }
-
-        @Override
-        public String toString() {
-          return name + " : " + value;
-        }
-      };
-
-      parsedHeaders[i] = header;
-    }
-
-    return parsedHeaders;
-  }
-
-  private static boolean isResponseReady(XMLHttpRequest xhr) {
-    return xhr.getReadyState() == XMLHttpRequest.DONE;
+    return ImplHolder.get().createResponse(xmlHttpRequest);
   }
 
   /**
diff --git a/user/src/com/google/gwt/http/client/RequestBuilder.java b/user/src/com/google/gwt/http/client/RequestBuilder.java
index 27685cd..3168a8d 100644
--- a/user/src/com/google/gwt/http/client/RequestBuilder.java
+++ b/user/src/com/google/gwt/http/client/RequestBuilder.java
@@ -91,6 +91,11 @@
   private final String httpMethod;
 
   /**
+   * Whether to include credentials for a Cross Origin Request.
+   */
+  private boolean includeCredentials;
+
+  /**
    * Password to use when opening a JavaScript XmlHttpRequest object.
    */
   private String password;
@@ -355,6 +360,15 @@
   }
 
   /**
+   * Sets whether the cross origin request will include credentials.
+   *
+   * @param withCredentials whether to include credentials in XHR
+   */
+  public void setIncludeCredentials(boolean includeCredentials) {
+    this.includeCredentials = includeCredentials;
+  }
+
+  /**
    * Sends an HTTP request based on the current builder configuration. If no
    * request headers have been set, the header "Content-Type" will be used with
    * a value of "text/plain; charset=utf-8".
@@ -384,6 +398,9 @@
     }
 
     setHeaders(xmlHttpRequest);
+    if (includeCredentials) {
+      xmlHttpRequest.setWithCredentials(true);
+    }
 
     final Request request = new Request(xmlHttpRequest, timeoutMillis, callback);
 
diff --git a/user/src/com/google/gwt/http/client/ResponseImpl.java b/user/src/com/google/gwt/http/client/ResponseImpl.java
new file mode 100644
index 0000000..8927aef
--- /dev/null
+++ b/user/src/com/google/gwt/http/client/ResponseImpl.java
@@ -0,0 +1,106 @@
+/*
+ * 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.http.client;
+
+import com.google.gwt.xhr.client.XMLHttpRequest;
+
+/**
+ * A {@link Response} implementation based on a {@link XMLHttpRequest}.
+ */
+class ResponseImpl extends Response {
+
+  private final XMLHttpRequest xmlHttpRequest;
+
+  public ResponseImpl(XMLHttpRequest xmlHttpRequest) {
+    this.xmlHttpRequest = xmlHttpRequest;
+
+    assert isResponseReady();
+  }
+
+  @Override
+  public String getHeader(String header) {
+    StringValidator.throwIfEmptyOrNull("header", header);
+
+    return xmlHttpRequest.getResponseHeader(header);
+  }
+
+  @Override
+  public Header[] getHeaders() {
+    String allHeaders = xmlHttpRequest.getAllResponseHeaders();
+    String[] unparsedHeaders = allHeaders.split("\n");
+    Header[] parsedHeaders = new Header[unparsedHeaders.length];
+
+    for (int i = 0, n = unparsedHeaders.length; i < n; ++i) {
+      String unparsedHeader = unparsedHeaders[i];
+
+      if (unparsedHeader.length() == 0) {
+        continue;
+      }
+
+      int endOfNameIdx = unparsedHeader.indexOf(':');
+      if (endOfNameIdx < 0) {
+        continue;
+      }
+
+      final String name = unparsedHeader.substring(0, endOfNameIdx).trim();
+      final String value = unparsedHeader.substring(endOfNameIdx + 1).trim();
+      Header header = new Header() {
+        @Override
+        public String getName() {
+          return name;
+        }
+
+        @Override
+        public String getValue() {
+          return value;
+        }
+
+        @Override
+        public String toString() {
+          return name + " : " + value;
+        }
+      };
+
+      parsedHeaders[i] = header;
+    }
+
+    return parsedHeaders;
+  }
+
+  @Override
+  public String getHeadersAsString() {
+    return xmlHttpRequest.getAllResponseHeaders();
+  }
+
+  @Override
+  public int getStatusCode() {
+    return xmlHttpRequest.getStatus();
+  }
+
+  @Override
+  public String getStatusText() {
+    return xmlHttpRequest.getStatusText();
+  }
+
+  @Override
+  public String getText() {
+    return xmlHttpRequest.getResponseText();
+  }
+
+  private boolean isResponseReady() {
+    return xmlHttpRequest.getReadyState() == XMLHttpRequest.DONE;
+  }
+}
diff --git a/user/src/com/google/gwt/i18n/client/Messages.java b/user/src/com/google/gwt/i18n/client/Messages.java
index d442349..22d93a1 100644
--- a/user/src/com/google/gwt/i18n/client/Messages.java
+++ b/user/src/com/google/gwt/i18n/client/Messages.java
@@ -129,17 +129,17 @@
  * &#64;DefaultLocale("en_US")
  * public interface MyMessages extends Messages {
  *   &#64;Key("1234")
- *   &#64;DefaultText("This is a plain string.")
+ *   &#64;DefaultMessage("This is a plain string.")
  *   String oneTwoThreeFour();
  *   
- *   &#64;DefaultText("You have {0} widgets")
+ *   &#64;DefaultMessage("You have {0} widgets")
  *   &#64;PluralText({"one", "You have one widget")
  *   String widgetCount(&#64;PluralCount int count);
  *   
- *   &#64;DefaultText("No reference to the argument")
+ *   &#64;DefaultMessage("No reference to the argument")
  *   String optionalArg(&#64;Optional String ignored);
  *   
- *   &#64;DefaultText("Your cart total is {0,number,currency}")
+ *   &#64;DefaultMessage("Your cart total is {0,number,currency}")
  *   &#64;Description("The total value of the items in the shopping cart in local currency")
  *   String totalAmount(&#64;Example("$5.00") double amount);
  *   
diff --git a/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java b/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
index a0ab0a3..60d85e3 100644
--- a/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
+++ b/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
@@ -19,6 +19,7 @@
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArrayInteger;
 import com.google.gwt.core.client.JsArrayString;
+import com.google.gwt.core.client.JsonUtils;
 
 /**
  * A JavaScript Overlay type on top of the JSON data describing everything we
@@ -38,13 +39,9 @@
    * @return a TimeZoneInfo object made from the supplied JSON.
    */
   public static TimeZoneInfo buildTimeZoneData(String json) {
-    return (TimeZoneInfo) eval(json);
+    return JsonUtils.safeEval(json);
   }
   
-  private static native JavaScriptObject eval(String json) /*-{
-    return eval("(" + json + ")");
-  }-*/;
-  
   protected TimeZoneInfo() { }
   
   public final native String getID() /*-{ return this.id; }-*/;
diff --git a/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties b/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
index 35c09a4..6b5547f 100644
--- a/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
+++ b/user/src/com/google/gwt/i18n/client/constants/CurrencyExtra.properties
@@ -151,7 +151,7 @@
 QAR = |||Rial
 RON = |||RON
 RSD = |||din
-RUB = руб|||Rup
+RUB = руб.|||руб.
 RWF = |||RF
 SAR = SR|||Rial
 SBD = |||$
diff --git a/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java b/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java
index 7f43656..8bb77b7 100644
--- a/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java
+++ b/user/src/com/google/gwt/i18n/client/impl/plurals/DefaultRule_1_paucal_n.java
@@ -19,8 +19,13 @@
 import com.google.gwt.i18n.client.PluralRule.PluralForm;
 
 /**
- * Common plural rule for languages that have 1, few, and other forms.
- * 
+ * Common plural rule for languages that have singular, two plural forms
+ * (based on the units and tens digits) and a fractional form ("other").
+ *
+ * Polish is the only language that uses this plural rule.
+ *
+ * Note: Perhaps this class should have been named: DefaultRule_1_x234_n
+ *
  * @see DefaultRule_0_1_2_n
  * @see DefaultRule_0_1_n
  * @see DefaultRule_01_n
@@ -35,16 +40,18 @@
     return new PluralForm[] {
         new PluralForm("other", "Default plural form"),
         new PluralForm("one", "Count is 1"),
-        new PluralForm("paucal", "Count ends in 2-4 but not 12-14 or 22-24"),
+        new PluralForm("few", "Count ends in 2-4 but not 12-14"),
+        new PluralForm("many", "Count is not 1 and does not end in 2-4 except 12-14"),
     };
   }
 
   public static int select(int n) {
     /*
-     * For Polish, numbers that end in 2-4, except 12-14 and 22-24, have a special plural form.
+     * This method will only return a 1, 2, or 3 ("one", "few", or "many").
+     * This method will never return 0 because "other" is the fractional form.
      */
     return n == 1 ? 1
-        : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 29) ? 2
-        : 0;
+        : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 2
+        : 3;
   }
 }
diff --git a/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java b/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java
index 8fde38c..90ee633 100644
--- a/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java
+++ b/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java
@@ -335,7 +335,7 @@
     if (!isConstants) {
       if (constantsCount > 0) {
         throw new AnnotationsError(
-            "@Default*Value is not permitted on a Messages interface; see @DefaultText");
+            "@Default*Value is not permitted on a Messages interface; see @DefaultMessage");
       }
       if (defaultText != null) {
         return defaultText.value();
@@ -343,7 +343,7 @@
     } else {
       if (defaultText != null) {
         throw new AnnotationsError(
-            "@DefaultText is not permitted on a Constants interface; see @Default*Value");
+            "@DefaultMessage is not permitted on a Constants interface; see @Default*Value");
       }
       if (constantsCount > 1) {
         throw new AnnotationsError(
diff --git a/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java b/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java
index 7996850..471314d 100644
--- a/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java
+++ b/user/src/com/google/gwt/i18n/shared/DateTimeFormat.java
@@ -1473,7 +1473,7 @@
       if (part.count > 0) {
         if (abutPat < 0 && part.abutStart) {
           abutPat = i;
-          abutStart = start;
+          abutStart = parsePos[0];
           abutPass = 0;
         }
 
diff --git a/user/src/com/google/gwt/junit/client/impl/JUnitHost.java b/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
index 711b6da..9d82121 100644
--- a/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
+++ b/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
@@ -146,13 +146,22 @@
     public boolean equals(Object o) {
       if (o instanceof TestInfo) {
         TestInfo other = (TestInfo) o;
-        return getTestModule().equals(other.getTestModule())
-            && getTestClass().equals(other.getTestClass())
-            && getTestMethod().equals(other.getTestMethod());
+        return equals(testModule, other.testModule)
+            && equals(testClass, other.testClass)
+            && equals(testMethod, other.testMethod);
       }
       return false;
     }
 
+    /*
+     * Helper method for TestInfo.equals.
+     *
+     * TODO: Replace with Objects.equals() once we can rely on JDK7.
+     */
+    private static boolean equals(Object a, Object b) {
+      return a == null ? b == null : a.equals(b);
+    }
+
     public String getTestClass() {
       return testClass;
     }
diff --git a/user/src/com/google/gwt/junit/public/junit-standards.html b/user/src/com/google/gwt/junit/public/junit-standards.html
index 490ee0c..0d6fe07 100644
--- a/user/src/com/google/gwt/junit/public/junit-standards.html
+++ b/user/src/com/google/gwt/junit/public/junit-standards.html
@@ -47,12 +47,12 @@
 }
 
 function loadSelectionScript() {
-  var moduleName = document.location.href;
+  var moduleName = location.pathname;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'><\/script>");
+  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
 }
 loadSelectionScript();
 -->
diff --git a/user/src/com/google/gwt/junit/public/junit.html b/user/src/com/google/gwt/junit/public/junit.html
index efb2d26..e58ebce 100644
--- a/user/src/com/google/gwt/junit/public/junit.html
+++ b/user/src/com/google/gwt/junit/public/junit.html
@@ -45,12 +45,12 @@
 }
 
 function loadSelectionScript() {
-  var moduleName = document.location.href;
+  var moduleName = location.pathname;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
+  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
 }
 loadSelectionScript();
 -->
diff --git a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
index 18567f8..59bef01 100644
--- a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
+++ b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
@@ -27,8 +27,11 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Scanner;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.LogRecord;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -49,39 +52,109 @@
  */
 public class StackTraceDeobfuscator {
 
-  private static class SymbolMap extends HashMap<String, String> {
+  /**
+   * A cache that maps obfuscated symbols to arbitrary non-null string values.
+   * The cache can assume each (strongName, symbol) pair always maps to the
+   * same value (never goes invalid), but must treat data as an opaque string.
+   */
+  private static class SymbolCache {
+    // TODO(srogoff): This SymbolCache implementation never drops old entries. If clients ever need
+    // to cap memory usage even with lazy loading, consider making SymbolCache an interface.
+    // This could allow clients to pass their own implementation to the StackTraceDeobfuscator
+    // constructor, backed by a Guava Cache or other entry-evicting mapping.
+
+    private final ConcurrentHashMap<String, HashMap<String, String>> symbolMaps;
+
+    SymbolCache() {
+      symbolMaps = new ConcurrentHashMap<String, HashMap<String, String>>();
+    }
+
+    /**
+     * Adds some symbol data to the cache for the given strong name.
+     */
+    void putAll(String strongName, Map<String, String> symbolMap) {
+      if (strongName == null || symbolMap.size() == 0) {
+        return;
+      }
+      symbolMaps.putIfAbsent(strongName, new HashMap<String, String>());
+      HashMap<String, String> existingMap = symbolMaps.get(strongName);
+      synchronized (existingMap) {
+        existingMap.putAll(symbolMap);
+      }
+    }
+
+    /**
+     * Returns the data for each of the specified symbols that's currently cached for the
+     * given strong name. There will be no entry for symbols that are not in the cache.
+     * If none of the symbols are cached, an empty Map is returned.
+     */
+    Map<String, String> getAll(String strongName, Set<String> symbols) {
+      Map<String, String> toReturn = new HashMap<String, String>();
+      if (strongName == null || !symbolMaps.containsKey(strongName) || symbols.isEmpty()) {
+        return toReturn;
+      }
+      HashMap<String, String> existingMap = symbolMaps.get(strongName);
+      synchronized (existingMap) {
+        for (String symbol : symbols) {
+          if (existingMap.containsKey(symbol)) {
+            toReturn.put(symbol, existingMap.get(symbol));
+          }
+        }
+      }
+      return toReturn;
+    }
   }
 
   // From JsniRef class, which is in gwt-dev and so can't be accessed here
   // TODO(unnurg) once there is a place for shared code, move this to there.
-  private static Pattern JsniRefPattern =
+  private static final Pattern JsniRefPattern =
       Pattern.compile("@?([^:]+)::([^(]+)(\\((.*)\\))?");
 
   // The javadoc for StackTraceElement.getLineNumber() says it returns -1 when
   // the line number is unavailable
   private static final int LINE_NUMBER_UNKNOWN = -1;
 
-  Pattern fragmentIdPattern = Pattern.compile(".*(\\d+)\\.js");
+  // Data to store in the symbol cache if no symbol data can be found on disk.
+  private static final String SYMBOL_DATA_UNKNOWN = "";
+
+  final Pattern fragmentIdPattern = Pattern.compile(".*(\\d+)\\.js");
+
+  private final boolean lazyLoad;
 
   protected File symbolMapsDirectory;
 
   // Map of strongName + fragmentId to sourceMap
-  private Map<String, SourceMapping> sourceMaps =
+  private final Map<String, SourceMapping> sourceMaps =
       new HashMap<String, SourceMapping>();
 
-  private Map<String, SymbolMap> symbolMaps =
-      new HashMap<String, SymbolMap>();
+  private final SymbolCache symbolCache = new SymbolCache();
 
   /**
-   * Constructor, which takes a <code>symbolMaps</code> directory as its argument. Symbol maps are
+   * Creates a deobfuscator that loads symbol map files from the given directory. Symbol maps are
    * generated into the location specified by the GWT compiler <code>-deploy</code> command line
    * argument.
    *
-   * @param symbolMapsDirectory the <code>symbolMaps</code> directory with, or without trailing
+   * @param symbolMapsDirectory the <code>symbolMaps</code> directory, with or without trailing
    *                            directory separator character
    */
   public StackTraceDeobfuscator(String symbolMapsDirectory) {
     setSymbolMapsDirectory(symbolMapsDirectory);
+    this.lazyLoad = false;
+  }
+
+  /**
+   * Creates a deobfuscator that loads symbol map files from the given directory. Symbol maps are
+   * generated into the location specified by the GWT compiler <code>-deploy</code> command line
+   * argument.
+   *
+   * @param symbolMapsDirectory the <code>symbolMaps</code> directory, with or without trailing
+   *                            directory separator character
+   * @param lazyLoad if true, only symbols requested to be deobfuscated are cached. This provides
+   *                 a large memory savings at the expense of occasional extra disk reads.
+   */
+  public StackTraceDeobfuscator(String symbolMapsDirectory, boolean lazyLoad) {
+    setSymbolMapsDirectory(symbolMapsDirectory);
+    this.lazyLoad = lazyLoad;
   }
 
   /**
@@ -107,6 +180,13 @@
    */
   public StackTraceElement[] deobfuscateStackTrace(
       StackTraceElement[] st, String strongName) {
+    // Warm the symbol cache for all symbols in this stack trace.
+    Set<String> requiredSymbols = new HashSet<String>();
+    for (StackTraceElement ste : st) {
+      requiredSymbols.add(ste.getMethodName());
+    }
+    loadSymbolMap(strongName, requiredSymbols);
+
     StackTraceElement[] newSt = new StackTraceElement[st.length];
     for (int i = 0; i < st.length; i++) {
       newSt[i] = resymbolize(st[i], strongName);
@@ -128,7 +208,7 @@
   }
 
   /**
-   * Best effort resymbolization of a a single stack trace element.
+   * Best effort resymbolization of a single stack trace element.
    *
    * @param ste        the stack trace element to resymbolize
    * @param strongName the GWT permutation strong name
@@ -143,8 +223,7 @@
     int fragmentId = -1;
 
     String steFilename = ste.getFileName();
-    SymbolMap map = loadSymbolMap(strongName);
-    String symbolData = map == null ? null : map.get(ste.getMethodName());
+    String symbolData = loadOneSymbol(strongName, ste.getMethodName());
 
     boolean sourceMapCapable = false;
 
@@ -163,7 +242,7 @@
     }
 
     // first use symbolMap, then refine via sourceMap if possible
-    if (symbolData != null) {
+    if (!symbolData.isEmpty()) {
       // jsniIdent, className, memberName, sourceUri, sourceLine, fragmentId
       String[] parts = symbolData.split(",");
       if (parts.length == 6) {
@@ -289,36 +368,60 @@
     return new Scanner(stream).useDelimiter("\\A").next();
   }
 
-  private SymbolMap loadSymbolMap(
-      String strongName) {
-    SymbolMap toReturn = symbolMaps.get(strongName);
-    if (toReturn != null) {
+  private String loadOneSymbol(String strongName, String symbol) {
+    Set<String> symbolSet = new HashSet<String>();
+    symbolSet.add(symbol);
+    Map<String, String> symbolMap = loadSymbolMap(strongName, symbolSet);
+    return symbolMap.get(symbol);
+  }
+
+  /**
+   * Returns a symbol map for the given strong name containing symbol data for
+   * all of the given required symbols. First checks the symbol cache, then
+   * reads from disk if any symbol is missing. If a symbol cannot be loaded for
+   * some reason, it will be mapped to empty string.
+   */
+  private Map<String, String> loadSymbolMap(
+      String strongName, Set<String> requiredSymbols) {
+    Map<String, String> toReturn = symbolCache.getAll(strongName, requiredSymbols);
+    if (toReturn.size() == requiredSymbols.size()) {
       return toReturn;
     }
-    toReturn = new SymbolMap();
+
+    Set<String> symbolsLeftToFind = new HashSet<String>(requiredSymbols);
+    toReturn = new HashMap<String, String>();
     String line;
 
     try {
       BufferedReader bin = new BufferedReader(
           new InputStreamReader(getSymbolMapInputStream(strongName)));
       try {
-        while ((line = bin.readLine()) != null) {
+        while ((line = bin.readLine()) != null && (symbolsLeftToFind.size() > 0 || !lazyLoad)) {
           if (line.charAt(0) == '#') {
             continue;
           }
           int idx = line.indexOf(',');
-          toReturn.put(new String(line.substring(0, idx)),
-              line.substring(idx + 1));
+          String symbol = line.substring(0, idx);
+          String symbolData = line.substring(idx + 1);
+          if (requiredSymbols.contains(symbol) || !lazyLoad) {
+            symbolsLeftToFind.remove(symbol);
+            toReturn.put(symbol, symbolData);
+          }
         }
       } finally {
         bin.close();
       }
     } catch (IOException e) {
-      //  use empty symbol map to avoid repeated lookups
-      toReturn = new SymbolMap();
+      // If the symbol map isn't found or there's an I/O error reading the file, the returned
+      // mapping may contain some or all empty data (see below).
+    }
+    for (String symbol : symbolsLeftToFind) {
+      // Store the empty string in the symbolCache to show we actually looked on disk and couldn't
+      // find the symbols. This avoids reading disk repeatedly for symbols that can't be translated.
+      toReturn.put(symbol, SYMBOL_DATA_UNKNOWN);
     }
 
-    symbolMaps.put(strongName, toReturn);
+    symbolCache.putAll(strongName, toReturn);
     return toReturn;
   }
 
diff --git a/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java b/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
index da35a2d..cc3065a 100644
--- a/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
+++ b/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
@@ -185,9 +185,16 @@
 
   @Override
   public boolean visit(CssMediaRule x, Context ctx) {
-    out.print("@MEDIA");
+    out.print("@media");
+    boolean isFirst = true;
     for (String m : x.getMedias()) {
-      out.print(" " + m);
+      if (isFirst) {
+        out.print(" ");
+        isFirst = false;
+      } else {
+        comma();
+      }
+      out.print(m);
     }
     spaceOpt();
     out.print("{");
diff --git a/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java b/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java
index bffbd36..1620fe7 100644
--- a/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java
+++ b/user/src/com/google/gwt/resources/css/ast/CssNodeCloner.java
@@ -180,7 +180,7 @@
   @Override
   public boolean visit(CssMediaRule x, Context ctx) {
     CssMediaRule newRule = new CssMediaRule();
-    newRule.getMedias().addAll(newRule.getMedias());
+    newRule.getMedias().addAll(x.getMedias());
 
     pushNodes(newRule);
     return true;
diff --git a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
index 3d3442a..59007b5 100644
--- a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
+++ b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
@@ -498,7 +498,7 @@
         if (resourceURL == null) {
           error = true;
           logger.log(TreeLogger.ERROR, "Resource " + resource
-              + " not found. Is the name specified as Class.getResource()"
+              + " not found. Is the name specified as ClassLoader.getResource()"
               + " would expect?");
         }
 
diff --git a/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java b/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
index 6e61e38..d46fe93 100644
--- a/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
+++ b/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
@@ -23,6 +23,7 @@
  */
 public enum CssObfuscationStyle {
   VERBOSE (true, false, true, true),
+  DEBUG (true, false, true, false),
   STABLE_FULL_CLASSNAME (true, true, true, true),
   STABLE_SHORT_CLASSNAME (true, true, true, false),
   STABLE_NO_CLASSNAME (true, true, false, false),
@@ -31,6 +32,8 @@
   static CssObfuscationStyle getObfuscationStyle(String name) {
     if (name.equalsIgnoreCase("pretty")) {
       return VERBOSE;
+    } else if (name.equalsIgnoreCase("debug")) {
+      return DEBUG;
     } else if (name.equalsIgnoreCase("stable")) {
       return STABLE_FULL_CLASSNAME;
     } else if (name.equalsIgnoreCase("stable-shorttype")) {
diff --git a/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java b/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
index 429acfa..931d2b2 100644
--- a/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
+++ b/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
@@ -24,6 +24,7 @@
 import org.w3c.dom.Node;
 
 import java.awt.Graphics2D;
+import java.awt.RenderingHints;
 import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
@@ -538,6 +539,8 @@
     Graphics2D g2d = bundledImage.createGraphics();
     createGraphicsEvent.end();
 
+    setBetterRenderingQuality(g2d);
+
     g2d.drawImage(rect.getImage(), rect.transform(), null);
     g2d.dispose();
 
@@ -593,6 +596,13 @@
     return b / gcd(a, b) * a;
   }
 
+  private static void setBetterRenderingQuality(Graphics2D g2d) {
+    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+        RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+    g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
+        RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
+  }
+
   private final Map<String, ImageRect> imageNameToImageRectMap = new HashMap<String, ImageRect>();
 
   public ImageBundleBuilder() {
@@ -818,6 +828,9 @@
     SpeedTracerLogger.Event graphicsEvent = SpeedTracerLogger.start(CompilerEventType.GRAPHICS_INIT,
         "java.awt.headless", System.getProperty("java.awt.headless"));
     Graphics2D g2d = bundledImage.createGraphics();
+
+    setBetterRenderingQuality(g2d);
+
     graphicsEvent.end();
 
     for (ImageRect imageRect : imageRects) {
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
index 706c6ec..10456e5 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
@@ -335,7 +335,8 @@
   public FieldWriter require(String fieldName) {
     FieldWriter fieldWriter = lookup(fieldName);
     if (fieldWriter == null) {
-      throw new RuntimeException("The required field %s doesn't exist.");
+      throw new RuntimeException(String.format("The required field \"%s\" doesn't exist.",
+          fieldName));
     }
     return fieldWriter;
   }
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
index bc3d7cb..91e2c6d 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
@@ -1793,6 +1793,16 @@
     {
       Element maybeTableCell = null;
       Element cur = target;
+
+      /*
+       * If an event happens in the TD element but outside the cell's div, we want 
+       * to handle it as if it happened within the table cell.
+       */
+      if (TableCellElement.TAG_TD.equalsIgnoreCase(cur.getTagName()) && 
+          tableBuilder.isColumn(cur.getFirstChildElement())) {
+        cur = cur.getFirstChildElement();
+      }
+      
       while (cur != null && targetTableSection == null) {
         /*
          * Found the table section. Return the most recent cell element that we
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java b/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
index 0e4fde0..e1da850 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
@@ -254,10 +254,20 @@
     TableRowBuilder row = tbody.startTR();
     row.attribute(ROW_ATTRIBUTE, rowIndex);
     row.attribute(SUBROW_ATTRIBUTE, subrowIndex);
+    addRowAttributes(row);
     subrowIndex++;
     return row;
   }
-    
+
+  /**
+   * Hook for subclasses to add their own attributes to each row in the table.
+   * The default does nothing.
+   *
+   * @param row the row element
+   */
+  protected void addRowAttributes(TableRowBuilder row) {
+  }
+
   /**
    * Build zero or more table rows for the specified row value.
    * 
diff --git a/user/src/com/google/gwt/user/cellview/client/CellWidget.java b/user/src/com/google/gwt/user/cellview/client/CellWidget.java
index a3bb819..f644cde 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellWidget.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellWidget.java
@@ -35,6 +35,8 @@
 import com.google.gwt.view.client.HasKeyProvider;
 import com.google.gwt.view.client.ProvidesKey;
 
+import java.util.Set;
+
 /**
  * A {@link Widget} that wraps a {@link Cell}.
  * 
@@ -193,7 +195,8 @@
 
     // Forward the event to the cell.
     String eventType = event.getType();
-    if (cell.getConsumedEvents().contains(eventType)) {
+    Set<String> consumedEvents = cell.getConsumedEvents();
+    if (consumedEvents != null && consumedEvents.contains(eventType)) {
       cell.onBrowserEvent(createContext(), getElement(), value, event, valueUpdater);
     }
   }
diff --git a/user/src/com/google/gwt/user/cellview/client/SimplePager.java b/user/src/com/google/gwt/user/cellview/client/SimplePager.java
index 3645a00..14499c2 100644
--- a/user/src/com/google/gwt/user/cellview/client/SimplePager.java
+++ b/user/src/com/google/gwt/user/cellview/client/SimplePager.java
@@ -260,7 +260,6 @@
    * @param location the location of the text relative to the buttons
    */
   @UiConstructor
-  // Hack for Google I/O demo
   public SimplePager(TextLocation location) {
     this(location, getDefaultResources(), true, DEFAULT_FAST_FORWARD_ROWS,
         false);
diff --git a/user/src/com/google/gwt/user/client/Window.java b/user/src/com/google/gwt/user/client/Window.java
index aec4a14..68eec21 100644
--- a/user/src/com/google/gwt/user/client/Window.java
+++ b/user/src/com/google/gwt/user/client/Window.java
@@ -118,7 +118,7 @@
    * 
    */
   public static class Location {
-    private static Map<String, String> paramMap;
+    private static String cachedQueryString = "";
     private static Map<String, List<String>> listParamMap;
 
     /**
@@ -206,24 +206,28 @@
      * returned.
      * 
      * @param name the name of the URL's parameter
-     * @return the value of the URL's parameter
+     * @return the value of the URL's parameter, or null if missing
      */
     public static String getParameter(String name) {
-      ensureParameterMap();
-      return paramMap.get(name);
+      ensureListParameterMap();
+      List<String> paramsForName = listParamMap.get(name);
+      if (paramsForName == null) {
+        return null;
+      } else {
+        return paramsForName.get(paramsForName.size() - 1);
+      }
     }
 
     /**
-     * Returns a Map of the URL query parameters for the host page; since
-     * changing the map would not change the window's location, the map returned
-     * is immutable.
+     * Returns an immutable Map of the URL query parameters for the host page
+     * at the time this method was called.
+     * Any changes to the window's location will be reflected in the result
+     * of subsequent calls.
      * 
      * @return a map from URL query parameter names to a list of values
      */
     public static Map<String, List<String>> getParameterMap() {
-      if (listParamMap == null) {
-        listParamMap = buildListParamMap(getQueryString());
-      }
+      ensureListParameterMap();
       return listParamMap;
     }
 
@@ -316,21 +320,12 @@
       return out;
     }
 
-    private static void ensureParameterMap() {
-      if (paramMap == null) {
-        paramMap = new HashMap<String, String>();
-        String queryString = getQueryString();
-        if (queryString != null && queryString.length() > 1) {
-          String qs = queryString.substring(1);
-          for (String kvPair : qs.split("&")) {
-            String[] kv = kvPair.split("=", 2);
-            if (kv.length > 1) {
-              paramMap.put(kv[0], URL.decodeQueryString(kv[1]));
-            } else {
-              paramMap.put(kv[0], "");
-            }
-          }
-        }
+    private static void ensureListParameterMap() {
+      final String currentQueryString = getQueryString();
+      if (listParamMap == null ||
+          !cachedQueryString.equals(currentQueryString)) {
+        listParamMap = buildListParamMap(currentQueryString);
+        cachedQueryString = currentQueryString;
       }
     }
 
@@ -771,8 +766,8 @@
    * defined. The top left corner will not be moved (it stays in its original
    * coordinates).
    * <p>
-   * NOTE: In Chrome, this method only works with windows created by
-   * Window.open().
+   * NOTE: In most modern browsers, this method only works with windows created
+   * by Window.open() with a supplied width and height.
    * </p>
    *
    * @param width A positive or a negative number that specifies how many pixels
@@ -787,8 +782,8 @@
   /**
    * Resizes the window to the specified width and height.
    * <p>
-   * NOTE: In Chrome, this method only works with windows created by
-   * Window.open().
+   * NOTE: In most modern browsers, this method only works with windows created
+   * by Window.open() with a supplied width and height.
    * </p>
    *
    * @param width The width of the window, in pixels
diff --git a/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java b/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java
index 2c41d4a..3ffb204 100644
--- a/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java
+++ b/user/src/com/google/gwt/user/client/rpc/core/java/util/Arrays.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.user.client.rpc.core.java.util;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.user.client.rpc.CustomFieldSerializer;
 import com.google.gwt.user.client.rpc.SerializationException;
 import com.google.gwt.user.client.rpc.SerializationStreamReader;
diff --git a/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java b/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
index 5174790..20e67b6 100644
--- a/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
+++ b/user/src/com/google/gwt/user/client/rpc/impl/SerializerBase.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.user.client.rpc.impl;
 
-import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.shared.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.core.client.JsArrayString;
diff --git a/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java b/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java
index 4f5a9b3..8b62d94 100644
--- a/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/CustomScrollPanel.java
@@ -557,7 +557,7 @@
    * corner.
    * 
    * <p>
-   * In RTL, the vertical scrollbar appears on the right.
+   * In RTL, the vertical scrollbar appears on the left.
    */
   private void maybeUpdateScrollbars() {
     if (!isAttached()) {
diff --git a/user/src/com/google/gwt/user/client/ui/DeckPanel.java b/user/src/com/google/gwt/user/client/ui/DeckPanel.java
index 393a1ed..919f5a8 100644
--- a/user/src/com/google/gwt/user/client/ui/DeckPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DeckPanel.java
@@ -266,9 +266,9 @@
   }
 
   /**
-   * Gets the index of the currently-visible widget.
+   * Gets the index of the currently-visible widget, if any.
    * 
-   * @return the visible widget's index
+   * @return the visible widget's index, or -1 if there is no such widget
    */
   public int getVisibleWidget() {
     return getWidgetIndex(visibleWidget);
diff --git a/user/src/com/google/gwt/user/client/ui/NamedFrame.java b/user/src/com/google/gwt/user/client/ui/NamedFrame.java
index 9fe635b..fb65033 100644
--- a/user/src/com/google/gwt/user/client/ui/NamedFrame.java
+++ b/user/src/com/google/gwt/user/client/ui/NamedFrame.java
@@ -38,8 +38,10 @@
   interface IFrameTemplate extends SafeHtmlTemplates {
     static final IFrameTemplate INSTANCE = GWT.create(IFrameTemplate.class);
 
-    @Template("<iframe src='{0}' name='{1}'>")
-    SafeHtml get(String src, String name);
+    // Setting a src prevents mixed-content warnings.
+    // http://weblogs.asp.net/bleroy/archive/2005/08/09/how-to-put-a-div-over-a-select-in-ie.aspx
+    @Template("<iframe src=\"javascript:''\" name='{0}'>")
+    SafeHtml get(String name);
   }
 
   // Used inside JSNI, so please don't delete this field just because
@@ -53,9 +55,8 @@
   }
 
   /**
-   * Creates an HTML IFRAME element with a src and name.
+   * Creates an HTML IFRAME element with a name.
    * 
-   * @param src the src of the frame
    * @param name the name of the frame, which must contain at least one
    *          non-whitespace character and must not contain reserved HTML markup
    *          characters such as '<code>&lt;</code>', '<code>&gt;</code>',
@@ -63,7 +64,7 @@
    * @return the newly-created element
    * @throws IllegalArgumentException if the supplied name is not allowed 
    */
-  private static IFrameElement createIFrame(String src, String name) {
+  private static IFrameElement createIFrame(String name) {
     if (name == null || !isValidName(name.trim())) {
       throw new IllegalArgumentException(
           "expecting one or more non-whitespace chars with no '<', '>', or '&'");
@@ -72,7 +73,7 @@
     // Use innerHTML to implicitly create the <iframe>. This is necessary
     // because most browsers will not respect a dynamically-set iframe name.
     Element div = DOM.createDiv();
-    div.setInnerSafeHtml(IFrameTemplate.INSTANCE.get(src, name));
+    div.setInnerSafeHtml(IFrameTemplate.INSTANCE.get(name));
     return div.getFirstChild().cast();
   }
 
@@ -101,9 +102,7 @@
    */
   @UiConstructor
   public NamedFrame(String name) {
-    // Setting a src prevents mixed-content warnings.
-    // http://weblogs.asp.net/bleroy/archive/2005/08/09/how-to-put-a-div-over-a-select-in-ie.aspx
-    super(createIFrame("javascript:''", name));
+    super(createIFrame(name));
     setStyleName(DEFAULT_STYLENAME);
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/PopupPanel.java b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
index 2434496..ddcad33 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -904,7 +904,7 @@
    * popup. The callback allows positioning to be performed based on the
    * offsetWidth and offsetHeight of the popup, which are normally not available
    * until the popup is showing. By positioning the popup before it is shown,
-   * the the popup will not jump from its original position to the new position.
+   * the popup will not jump from its original position to the new position.
    *
    * @param callback the callback to set the position of the popup
    * @see PositionCallback#setPosition(int offsetWidth, int offsetHeight)
diff --git a/user/src/com/google/gwt/user/client/ui/PrefixTree.java b/user/src/com/google/gwt/user/client/ui/PrefixTree.java
index 302b696..55d97f1 100644
--- a/user/src/com/google/gwt/user/client/ui/PrefixTree.java
+++ b/user/src/com/google/gwt/user/client/ui/PrefixTree.java
@@ -365,7 +365,7 @@
 
   /**
    * Retrieve suggestions from the PrefixTree. The number of items returned from
-   * getSuggesstions may slightly exceed <code>limit</code> so that all
+   * getSuggestions may slightly exceed <code>limit</code> so that all
    * suffixes and partial stems will be returned. This prevents the search space
    * from changing size if the PrefixTree is used in an interactive manner.
    * <br/> The returned List is guaranteed to be safe; changing its contents
diff --git a/user/src/com/google/gwt/user/client/ui/ResizeComposite.java b/user/src/com/google/gwt/user/client/ui/ResizeComposite.java
index 7d0bab3..1054249 100644
--- a/user/src/com/google/gwt/user/client/ui/ResizeComposite.java
+++ b/user/src/com/google/gwt/user/client/ui/ResizeComposite.java
@@ -26,7 +26,7 @@
   @Override
   protected void initWidget(Widget widget) {
     assert widget instanceof RequiresResize :
-      "LayoutComposite requires that its wrapped widget implement RequiresResize";
+      "ResizeComposite requires that its wrapped widget implement RequiresResize";
     super.initWidget(widget);
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
index 2f4dac6..49f1278 100644
--- a/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
@@ -140,6 +140,7 @@
       expandable.getStyle().setHeight(100.0, Unit.PCT);
       expandable.getStyle().setWidth(100.0, Unit.PCT);
       expandable.getStyle().setOverflow(Overflow.SCROLL);
+      expandable.getStyle().setZIndex(-1);
       elem.appendChild(expandable);
       expandableInner = Document.get().createDivElement().cast();
       expandable.appendChild(expandableInner);
@@ -160,6 +161,7 @@
       collapsible.getStyle().setHeight(100.0, Unit.PCT);
       collapsible.getStyle().setWidth(100.0, Unit.PCT);
       collapsible.getStyle().setOverflow(Overflow.SCROLL);
+      collapsible.getStyle().setZIndex(-1);
       elem.appendChild(collapsible);
       collapsibleInner = Document.get().createDivElement().cast();
       collapsibleInner.getStyle().setWidth(200, Unit.PCT);
diff --git a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
index 6cb8462..a0acd62 100644
--- a/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/SplitLayoutPanel.java
@@ -141,7 +141,7 @@
           mouseDown = false;
 
           glassElem.removeFromParent();
-          
+
           // Handle double-clicks.
           // Fake them since the double-click event aren't fired.
           if (this.toggleDisplayAllowed) {
@@ -377,6 +377,16 @@
     return false;
   }
 
+  @Override
+  public void setWidgetHidden(Widget widget, boolean hidden) {
+    super.setWidgetHidden(widget, hidden);
+    Splitter splitter = getAssociatedSplitter(widget);
+    if (splitter != null) {
+      // The splitter is null for the center element.
+      super.setWidgetHidden(splitter, hidden);
+    }
+  }
+
   /**
    * Sets the minimum allowable size for the given widget.
    *
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index a83796c..5d062a5 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -243,6 +243,8 @@
 
   private TreeItem root;
 
+  private boolean scrollOnSelectEnabled = true;
+  
   private boolean useLeafImages;
 
   /**
@@ -635,6 +637,13 @@
     return isAnimationEnabled;
   }
 
+  /**
+   * Determines whether selecting a tree item will scroll it into view.
+   */
+  public boolean isScrollOnSelectEnabled() {
+    return scrollOnSelectEnabled;
+  }
+  
   @Override
   public Iterator<Widget> iterator() {
     final Widget[] widgets = new Widget[childWidgets.size()];
@@ -853,6 +862,14 @@
   }
 
   /**
+   * Enable or disable scrolling a tree item into view when it is selected. Scrolling into view is
+   * enabled by default.
+   */
+  public void setScrollOnSelectEnabled(boolean enable) {
+    scrollOnSelectEnabled = enable;
+  }
+  
+  /**
    * Selects a specified item.
    *
    * @param item the item to be selected, or <code>null</code> to deselect all
@@ -1221,35 +1238,39 @@
     Focusable focusableWidget = curSelection.getFocusable();
     if (focusableWidget != null) {
       focusableWidget.setFocus(true);
-      DOM.scrollIntoView(((Widget) focusableWidget).getElement());
-    } else {
-      // Get the location and size of the given item's content element relative
-      // to the tree.
-      Element selectedElem = curSelection.getContentElem();
-      int containerLeft = getAbsoluteLeft();
-      int containerTop = getAbsoluteTop();
-
-      int left = DOM.getAbsoluteLeft(selectedElem) - containerLeft;
-      int top = DOM.getAbsoluteTop(selectedElem) - containerTop;
-      int width = DOM.getElementPropertyInt(selectedElem, "offsetWidth");
-      int height = DOM.getElementPropertyInt(selectedElem, "offsetHeight");
-
-      // If the item is not visible, quite here
-      if (width == 0 || height == 0) {
-        DOM.setIntStyleAttribute(focusable, "left", 0);
-        DOM.setIntStyleAttribute(focusable, "top", 0);
-        return;
+      if (scrollOnSelectEnabled) {
+        DOM.scrollIntoView(((Widget) focusableWidget).getElement());
       }
+    } else {
+      if (scrollOnSelectEnabled) {
+        // Get the location and size of the given item's content element relative
+        // to the tree.
+        Element selectedElem = curSelection.getContentElem();
+        int containerLeft = getAbsoluteLeft();
+        int containerTop = getAbsoluteTop();
+  
+        int left = DOM.getAbsoluteLeft(selectedElem) - containerLeft;
+        int top = DOM.getAbsoluteTop(selectedElem) - containerTop;
+        int width = DOM.getElementPropertyInt(selectedElem, "offsetWidth");
+        int height = DOM.getElementPropertyInt(selectedElem, "offsetHeight");
 
-      // Set the focusable element's position and size to exactly underlap the
-      // item's content element.
-      DOM.setStyleAttribute(focusable, "left", left + "px");
-      DOM.setStyleAttribute(focusable, "top", top + "px");
-      DOM.setStyleAttribute(focusable, "width", width + "px");
-      DOM.setStyleAttribute(focusable, "height", height + "px");
-
-      // Scroll it into view.
-      DOM.scrollIntoView(focusable);
+        // If the item is not visible, quite here
+        if (width == 0 || height == 0) {
+          DOM.setIntStyleAttribute(focusable, "left", 0);
+          DOM.setIntStyleAttribute(focusable, "top", 0);
+          return;
+        }
+  
+        // Set the focusable element's position and size to exactly underlap the
+        // item's content element.
+        DOM.setStyleAttribute(focusable, "left", left + "px");
+        DOM.setStyleAttribute(focusable, "top", top + "px");
+        DOM.setStyleAttribute(focusable, "width", width + "px");
+        DOM.setStyleAttribute(focusable, "height", height + "px");
+  
+        // Scroll it into view.
+        DOM.scrollIntoView(focusable);
+      }
 
       // Update ARIA attributes to reflect the information from the
       // newly-selected item.
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java
index 3593855..fe3bbcb 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplMozilla.java
@@ -27,6 +27,11 @@
   boolean isFirstFocus;
 
   @Override
+  public String getBackColor() {
+    return queryCommandValue("HiliteColor");
+  }
+
+  @Override
   public native void initElement() /*-{
     // Mozilla doesn't allow designMode to be set reliably until the iframe is
     // fully loaded.
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
index 67a6737..28aea46 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
@@ -95,11 +95,15 @@
     var _this = this;
     _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitializing()();
     setTimeout($entry(function() {
-      // Turn on design mode.
-      _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem.contentWindow.document.designMode = 'On';
+      // We need to check to see if the content window still is there. It might not be if the RTA
+      // first was attached to the DOM and then quickly was removed before the timeout fired.
+      if (_this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem.contentWindow != null) {
+        // Turn on design mode.
+        _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem.contentWindow.document.designMode = 'On';
 
-      // Send notification that the iframe has reached design mode.
-      _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()();
+        // Send notification that the iframe has reached design mode.
+        _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()();
+      }
     }), 1);
   }-*/;
 
diff --git a/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java b/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
index f49e003..29bfa07 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
@@ -114,18 +114,7 @@
  */
 public class SerializableTypeOracleBuilder {
 
-  class TypeInfoComputed {
-    /**
-     * <code>true</code> if the type is assignable to {@link IsSerializable} or
-     * {@link java.io.Serializable Serializable}.
-     */
-    private final boolean autoSerializable;
-
-    /**
-     * <code>true</code> if the this type directly implements one of the marker
-     * interfaces.
-     */
-    private final boolean directlyImplementsMarker;
+  static class TypeInfoComputed {
 
     /**
      * <code>true</code> if the type is automatically or manually serializable
@@ -145,10 +134,10 @@
     private boolean instantiableSubtypes;
 
     /**
-     * All instantiable types found when this type was quaried, including the
-     * type itself.
+     * All instantiable types found when this type was queried, including the
+     * type itself. (Null until calculated.)
      */
-    private Set<JClassType> instantiableTypes = new HashSet<JClassType>();
+    private Set<JClassType> instantiableTypes;
 
     /**
      * Custom field serializer or <code>null</code> if there isn't one.
@@ -176,38 +165,19 @@
      */
     private final JType type;
 
-    public TypeInfoComputed(JType type, TypePath path) {
+    private TypeInfoComputed(JType type, TypePath path, TypeOracle typeOracle) {
       this.type = type;
       this.path = path;
       if (type instanceof JClassType) {
         JClassType typeClass = (JClassType) type;
-        autoSerializable = SerializableTypeOracleBuilder.isAutoSerializable(typeClass);
         manualSerializer = findCustomFieldSerializer(typeOracle, typeClass);
-        directlyImplementsMarker = directlyImplementsMarkerInterface(typeClass);
         maybeEnhanced = hasJdoAnnotation(typeClass) || hasJpaAnnotation(typeClass);
       } else {
-        autoSerializable = false;
         manualSerializer = null;
-        directlyImplementsMarker = false;
         maybeEnhanced = false;
       }
     }
 
-    /**
-     * Returns the internal set of instantiable types for this TIC.
-     * Modifications to this set are immediately recorded into the TIC as well.
-     * TODO(spoon) maybe pass the TIC around instead of the set? then there
-     * could be addInstantiableType(JClassType) instead of speccing this to be
-     * mutable.
-     */
-    public Set<JClassType> getInstantiableTypes() {
-      return instantiableTypes;
-    }
-
-    public JClassType getManualSerializer() {
-      return manualSerializer;
-    }
-
     public TypePath getPath() {
       return path;
     }
@@ -217,19 +187,7 @@
     }
 
     public boolean hasInstantiableSubtypes() {
-      return isInstantiable() || instantiableSubtypes || isPendingInstantiable();
-    }
-
-    public boolean isAutoSerializable() {
-      return autoSerializable;
-    }
-
-    public boolean isDeclaredSerializable() {
-      return autoSerializable || isManuallySerializable();
-    }
-
-    public boolean isDirectlySerializable() {
-      return directlyImplementsMarker || isManuallySerializable();
+      return instantiable || instantiableSubtypes || state == TypeState.CHECK_IN_PROGRESS;
     }
 
     public boolean isDone() {
@@ -850,29 +808,40 @@
       if (!entrySucceeded) {
         problems.report(logger, TreeLogger.ERROR, TreeLogger.INFO);
       } else {
-        if (problems.hasFatalProblems()) {
-          entrySucceeded = false;
-          problems.reportFatalProblems(logger, TreeLogger.ERROR);
-        }
-        // if entrySucceeded, there may still be "warning" problems, but too
-        // often they're expected (e.g. non-instantiable subtypes of List), so
-        // we log them at DEBUG.
-        // TODO(fabbott): we could blacklist or graylist those types here, so
-        // instantiation during code generation would flag them for us.
-        problems.report(logger, TreeLogger.DEBUG, TreeLogger.DEBUG);
+        maybeReport(logger, problems);
       }
-
-      allSucceeded &= entrySucceeded;
+      allSucceeded &= entrySucceeded & !problems.hasFatalProblems();
     }
 
     if (!allSucceeded) {
       throw new UnableToCompleteException();
     }
+    assertNothingPending();
 
-    for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
-      assert (!tic.isPendingInstantiable());
+    // Add covariant arrays in a separate pass. We want to ensure that nothing is pending
+    // so that the leaf type's instantiableTypes variable is ready (if it's computed at all)
+    // and all of the leaf's subtypes are ready.
+    // (Copy values to avoid concurrent modification.)
+    List<TypeInfoComputed> ticsToCheck = new ArrayList<TypeInfoComputed>();
+    ticsToCheck.addAll(typeToTypeInfoComputed.values());
+    for (TypeInfoComputed tic : ticsToCheck) {
+      JArrayType type = tic.getType().isArray();
+      if (type != null && tic.instantiable) {
+        ProblemReport problems = new ProblemReport();
+        problems.setContextType(type);
+
+        markArrayTypes(logger, type, tic.getPath(), problems);
+
+        maybeReport(logger, problems);
+        allSucceeded &= !problems.hasFatalProblems();
+      }
     }
 
+    if (!allSucceeded) {
+      throw new UnableToCompleteException();
+    }
+    assertNothingPending();
+
     pruneUnreachableTypes();
 
     logReachableTypes(logger);
@@ -943,7 +912,7 @@
       ProblemReport problems) {
     assert (type != null);
     if (type.isPrimitive() != null) {
-      TypeInfoComputed tic = getTypeInfoComputed(type, path, true);
+      TypeInfoComputed tic = ensureTypeInfoComputed(type, path);
       tic.setInstantiableSubtypes(true);
       tic.setInstantiable(false);
       return tic;
@@ -953,7 +922,7 @@
 
     JClassType classType = (JClassType) type;
 
-    TypeInfoComputed tic = getTypeInfoComputed(classType, path, false);
+    TypeInfoComputed tic = typeToTypeInfoComputed.get(classType);
     if (tic != null && tic.isDone()) {
       // we have an answer already; use it.
       return tic;
@@ -974,7 +943,7 @@
        * caller's responsibility to deal with it. We assume that it is
        * indirectly instantiable here.
        */
-      tic = getTypeInfoComputed(classType, path, true);
+      tic = ensureTypeInfoComputed(classType, path);
       tic.setInstantiableSubtypes(true);
       tic.setInstantiable(false);
       return tic;
@@ -988,7 +957,7 @@
             computeTypeInstantiability(localLogger, bound, path, problems)
                 .hasInstantiableSubtypes();
       }
-      tic = getTypeInfoComputed(classType, path, true);
+      tic = ensureTypeInfoComputed(classType, path);
       tic.setInstantiableSubtypes(success);
       tic.setInstantiable(false);
       return tic;
@@ -997,7 +966,7 @@
     JArrayType isArray = classType.isArray();
     if (isArray != null) {
       TypeInfoComputed arrayTic = checkArrayInstantiable(localLogger, isArray, path, problems);
-      assert getTypeInfoComputed(classType, path, false) != null;
+      assert typeToTypeInfoComputed.get(classType) != null;
       return arrayTic;
     }
 
@@ -1009,7 +978,7 @@
        */
       problems.add(classType, "In order to produce smaller client-side code, 'Object' is not "
           + "allowed; please use a more specific type", Priority.DEFAULT);
-      tic = getTypeInfoComputed(classType, path, true);
+      tic = ensureTypeInfoComputed(classType, path);
       tic.setInstantiable(false);
       return tic;
     }
@@ -1028,13 +997,16 @@
 
     // TreeLogger subtypesLogger = localLogger.branch(TreeLogger.DEBUG,
     // "Analyzing subclasses:", null);
-    tic = getTypeInfoComputed(classType, path, true);
+    tic = ensureTypeInfoComputed(classType, path);
+    Set<JClassType> instantiableTypes = new HashSet<JClassType>();
     boolean anySubtypes =
-        checkSubtypes(localLogger, originalType, tic.getInstantiableTypes(), path, problems);
+        checkSubtypes(localLogger, originalType, instantiableTypes, path, problems);
     if (!tic.isDone()) {
       tic.setInstantiableSubtypes(anySubtypes);
       tic.setInstantiable(false);
     }
+    // Don't publish this until complete to ensure nobody depends on partial results.
+    tic.instantiableTypes = instantiableTypes;
     return tic;
   }
 
@@ -1052,10 +1024,16 @@
     return shouldConsiderFieldsForSerialization(type, typeFilter, problems);
   }
 
+  private void assertNothingPending() {
+    if (getClass().desiredAssertionStatus()) {
+      for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
+        assert (!tic.isPendingInstantiable());
+      }
+    }
+  }
+
   /**
    * Consider any subtype of java.lang.Object which qualifies for serialization.
-   * 
-   * @param logger
    */
   private void checkAllSubtypesOfObject(TreeLogger logger, TypePath parent, ProblemReport problems) {
     if (alreadyCheckedObject) {
@@ -1091,12 +1069,16 @@
       return checkArrayInstantiable(logger, arrayType, path, problems);
     }
 
-    JClassType leafClass = leafType.isClassOrInterface();
+    TypeInfoComputed tic = ensureTypeInfoComputed(array, path);
+    if (tic.isDone() || tic.isPendingInstantiable()) {
+      return tic;
+    }
+    tic.setPendingInstantiable();
+
     JTypeParameter isLeafTypeParameter = leafType.isTypeParameter();
     if (isLeafTypeParameter != null && !typeParametersInRootTypes.contains(isLeafTypeParameter)) {
       // Don't deal with non root type parameters, but make a TIC entry to
       // save time if it recurs. We assume they're indirectly instantiable.
-      TypeInfoComputed tic = getTypeInfoComputed(array, path, true);
       tic.setInstantiableSubtypes(true);
       tic.setInstantiable(false);
       return tic;
@@ -1105,18 +1087,12 @@
     if (!isAllowedByFilter(array, problems)) {
       // Don't deal with filtered out types either, but make a TIC entry to
       // save time if it recurs. We assume they're not instantiable.
-      TypeInfoComputed tic = getTypeInfoComputed(array, path, true);
       tic.setInstantiable(false);
       return tic;
     }
 
-    TypeInfoComputed tic = getTypeInfoComputed(array, path, true);
-    if (tic.isDone()) {
-      return tic;
-    } else if (tic.isPendingInstantiable()) {
-      return tic;
-    }
-    tic.setPendingInstantiable();
+    // An array is instantiable provided that any leaf subtype is instantiable.
+    // (Ignores the possibility of empty arrays of non-instantiable types.)
 
     TreeLogger branch = logger.branch(TreeLogger.DEBUG, "Analyzing component type:", null);
 
@@ -1124,32 +1100,6 @@
         computeTypeInstantiability(branch, leafType, TypePaths
             .createArrayComponentPath(array, path), problems);
     boolean succeeded = leafTic.hasInstantiableSubtypes();
-    if (succeeded) {
-      if (leafClass == null) {
-        assert leafType.isPrimitive() != null;
-        markArrayTypesInstantiable(leafType, array.getRank(), path);
-      } else {
-        TreeLogger covariantArrayLogger = logger.branch(TreeLogger.DEBUG, "Covariant array types");
-
-        /*
-         * Compute covariant arrays for arrays of reference types.
-         */
-        for (JClassType instantiableType : TypeHierarchyUtils.getAllTypesBetweenRootTypeAndLeaves(
-            leafClass, leafTic.getInstantiableTypes())) {
-          if (!isAccessibleToSerializer(instantiableType)) {
-            // Skip types that are not accessible from a serializer
-            continue;
-          }
-
-          if (covariantArrayLogger.isLoggable(TreeLogger.DEBUG)) {
-            covariantArrayLogger.branch(TreeLogger.DEBUG, getArrayType(typeOracle, array.getRank(),
-                instantiableType).getParameterizedQualifiedSourceName());
-          }
-
-          markArrayTypesInstantiable(instantiableType, array.getRank(), path);
-        }
-      }
-    }
 
     tic.setInstantiable(succeeded);
     return tic;
@@ -1266,7 +1216,7 @@
       }
     }
 
-    TypeInfoComputed tic = getTypeInfoComputed(classOrInterface, parent, true);
+    TypeInfoComputed tic = ensureTypeInfoComputed(classOrInterface, parent);
     return checkDeclaredFields(logger, tic, parent, problems);
   }
 
@@ -1276,7 +1226,7 @@
    */
   private boolean checkSubtypes(TreeLogger logger, JClassType originalType,
       Set<JClassType> instSubtypes, TypePath path, ProblemReport problems) {
-    JClassType baseType = getBaseType(originalType);
+    JRealClassType baseType = getBaseType(originalType);
     TreeLogger computationLogger =
         logger.branch(TreeLogger.DEBUG, "Finding possibly instantiable subtypes");
     List<JClassType> candidates =
@@ -1300,7 +1250,7 @@
       }
 
       TypePath subtypePath = TypePaths.createSubtypePath(path, candidate, originalType);
-      TypeInfoComputed tic = getTypeInfoComputed(candidate, subtypePath, true);
+      TypeInfoComputed tic = ensureTypeInfoComputed(candidate, subtypePath);
       if (tic.isDone()) {
         if (tic.isInstantiable()) {
           anySubtypes = true;
@@ -1329,7 +1279,7 @@
       // Note we are leaving hasInstantiableSubtypes() as false which might be
       // wrong but it is only used by arrays and thus it will never be looked at
       // for this tic.
-      if (instantiable && instSubtypes != null) {
+      if (instantiable) {
         instSubtypes.add(candidate);
       }
     }
@@ -1342,8 +1292,7 @@
    * it is applied to be serializable. As a side effect, populates
    * {@link #typeToTypeInfoComputed} in the same way as
    * {@link #computeTypeInstantiability}.
-   * 
-   * @param logger
+   *
    * @param baseType - The generic type the parameter is on
    * @param paramIndex - The index of the parameter in the generic type
    * @param typeArg - An upper bound on the actual argument being applied to the
@@ -1435,8 +1384,8 @@
   /**
    * Returns the subtypes of a given base type as parameterized by wildcards.
    */
-  private List<JClassType> getPossiblyInstantiableSubtypes(TreeLogger logger, JClassType baseType,
-      ProblemReport problems) {
+  private List<JClassType> getPossiblyInstantiableSubtypes(TreeLogger logger,
+      JRealClassType baseType, ProblemReport problems) {
     assert (baseType == getBaseType(baseType));
 
     List<JClassType> possiblyInstantiableTypes = new ArrayList<JClassType>();
@@ -1487,10 +1436,10 @@
     return possiblyInstantiableTypes;
   }
 
-  private TypeInfoComputed getTypeInfoComputed(JType type, TypePath path, boolean createIfNeeded) {
+  private TypeInfoComputed ensureTypeInfoComputed(JType type, TypePath path) {
     TypeInfoComputed tic = typeToTypeInfoComputed.get(type);
-    if (tic == null && createIfNeeded) {
-      tic = new TypeInfoComputed(type, path);
+    if (tic == null) {
+      tic = new TypeInfoComputed(type, path, typeOracle);
       typeToTypeInfoComputed.put(type, tic);
     }
     return tic;
@@ -1582,11 +1531,81 @@
     for (int rank = 1; rank <= maxRank; ++rank) {
       JArrayType covariantArray = getArrayType(typeOracle, rank, leafType);
 
-      TypeInfoComputed covariantArrayTic = getTypeInfoComputed(covariantArray, path, true);
+      TypeInfoComputed covariantArrayTic = ensureTypeInfoComputed(covariantArray, path);
       covariantArrayTic.setInstantiable(true);
     }
   }
 
+  /**
+   * Marks all covariant and lesser-ranked arrays as instantiable for all leaf types between
+   * the given array's leaf type and its instantiable subtypes. (Note: this adds O(S * R)
+   * array types to the output where S is the number of subtypes and R is the rank.)
+   * Prerequisite: The leaf type's tic and its subtypes must already be created.
+   * @see #checkArrayInstantiable
+   */
+  private void markArrayTypes(TreeLogger logger, JArrayType array, TypePath path,
+      ProblemReport problems) {
+    logger = logger.branch(TreeLogger.DEBUG, "Adding array types for " + array);
+
+    JType leafType = array.getLeafType();
+    JTypeParameter isLeafTypeParameter = leafType.isTypeParameter();
+    if (isLeafTypeParameter != null) {
+      if (typeParametersInRootTypes.contains(isLeafTypeParameter)) {
+        leafType = isLeafTypeParameter.getFirstBound(); // to match computeTypeInstantiability
+      } else {
+        // skip non-root leaf parameters, to match checkArrayInstantiable
+        return;
+      }
+    }
+
+    TypeInfoComputed leafTic = typeToTypeInfoComputed.get(leafType);
+    if (leafTic == null) {
+      problems.add(array, "internal error: leaf type not computed: " +
+          leafType.getQualifiedSourceName(), Priority.FATAL);
+      return;
+    }
+
+    if (leafType.isClassOrInterface() == null) {
+      // Simple case: no covariance, just lower ranks.
+      assert leafType.isPrimitive() != null;
+      markArrayTypesInstantiable(leafType, array.getRank(), path);
+      return;
+    }
+
+    JRealClassType baseClass = getBaseType(leafType.isClassOrInterface());
+
+    TreeLogger covariantArrayLogger =
+        logger.branch(TreeLogger.DEBUG, "Covariant array types:");
+
+    Set<JClassType> instantiableTypes = leafTic.instantiableTypes;
+    if (instantiableTypes == null) {
+      // The types are there (due to a supertype) but the Set wasn't computed, so compute it now.
+      instantiableTypes = new HashSet<JClassType>();
+      List<JClassType> candidates =
+          getPossiblyInstantiableSubtypes(logger, baseClass, problems);
+      for (JClassType candidate : candidates) {
+        TypeInfoComputed tic = typeToTypeInfoComputed.get(candidate);
+        if (tic != null && tic.instantiable) {
+          instantiableTypes.add(candidate);
+        }
+      }
+    }
+    for (JClassType instantiableType : TypeHierarchyUtils.getAllTypesBetweenRootTypeAndLeaves(
+        baseClass, instantiableTypes)) {
+      if (!isAccessibleToSerializer(instantiableType)) {
+        // Skip types that are not accessible from a serializer
+        continue;
+      }
+
+      if (covariantArrayLogger.isLoggable(TreeLogger.DEBUG)) {
+        covariantArrayLogger.branch(TreeLogger.DEBUG, getArrayType(typeOracle, array.getRank(),
+            instantiableType).getParameterizedQualifiedSourceName());
+      }
+
+      markArrayTypesInstantiable(instantiableType, array.getRank(), path);
+    }
+  }
+
   private boolean maybeInstantiable(TreeLogger logger, JClassType type, ProblemReport problems) {
     boolean success =
         canBeInstantiated(type, problems) && shouldConsiderFieldsForSerialization(type, problems);
@@ -1599,6 +1618,21 @@
     return success;
   }
 
+  /**
+   * Report problems if they are fatal or we're debugging.
+   */
+  private void maybeReport(TreeLogger logger, ProblemReport problems) {
+    if (problems.hasFatalProblems()) {
+      problems.reportFatalProblems(logger, TreeLogger.ERROR);
+    }
+    // if entrySucceeded, there may still be "warning" problems, but too
+    // often they're expected (e.g. non-instantiable subtypes of List), so
+    // we log them at DEBUG.
+    // TODO(fabbott): we could blacklist or graylist those types here, so
+    // instantiation during code generation would flag them for us.
+    problems.report(logger, TreeLogger.DEBUG, TreeLogger.DEBUG);
+  }
+
   private boolean mightNotBeExposed(JGenericType baseType, int paramIndex) {
     TypeParameterFlowInfo flowInfo = getFlowInfo(baseType, paramIndex);
     return flowInfo.getMightNotBeExposed() || isManuallySerializable(baseType);
@@ -1619,8 +1653,7 @@
     Set<JType> supersOfInstantiableTypes = new LinkedHashSet<JType>();
     for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
       if (tic.isInstantiable() && tic.getType() instanceof JClassType) {
-        JClassType type = (JClassType) tic.getType().getErasedType();
-        JClassType sup = type;
+        JClassType sup = (JClassType) tic.getType().getErasedType();
         while (sup != null) {
           supersOfInstantiableTypes.add(sup.getErasedType());
           sup = sup.getErasedType().getSuperclass();
diff --git a/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java b/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
index 17cc6a0..0d6f826 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
@@ -18,6 +18,7 @@
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.typeinfo.JArrayType;
 import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.JEnumConstant;
 import com.google.gwt.core.ext.typeinfo.JField;
 import com.google.gwt.core.ext.typeinfo.JParameterizedType;
 import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
@@ -27,6 +28,7 @@
 
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -268,6 +270,26 @@
     } else if (type.isArray() != null) {
       JArrayType isArray = type.isArray();
       generateSerializationSignature(typeOracle, isArray.getComponentType(), crc);
+    } else if (type.isEnum() != null) {
+      List<JEnumConstant> constants = Arrays.asList(type.isEnum().getEnumConstants());
+      // Make sure the list is sorted; the getEnumConstants contract doesn't guarantees it.
+      Collections.sort(constants, new Comparator<JEnumConstant>() {
+        @Override
+        public int compare(JEnumConstant o1, JEnumConstant o2) {
+          int i1 = o1.getOrdinal();
+          int i2 = o2.getOrdinal();
+          if (i1 < i2) {
+            return -1;
+          } else if (i1 > i2) {
+            return 1;
+          } else {
+            return 0;
+          }
+        }
+      });
+      for (JEnumConstant constant : constants) {
+        crc.update(constant.getName().getBytes(Util.DEFAULT_ENCODING));
+      }
     } else if (type.isClassOrInterface() != null) {
       JClassType isClassOrInterface = type.isClassOrInterface();
       JField[] fields = getSerializableFields(typeOracle, isClassOrInterface);
diff --git a/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java b/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java
index 3ad43e9..574a30d 100644
--- a/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java
+++ b/user/src/com/google/gwt/user/rebind/ui/ImageBundleBuilder.java
@@ -389,7 +389,7 @@
         // before this point.
         logger.log(TreeLogger.ERROR,
             "Resource not found on classpath (is the name specified as "
-                + "Class.getResource() would expect?)", null);
+                + "ClassLoader.getResource() would expect?)", null);
         throw new UnableToCompleteException();
       }
 
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java b/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
index 2dd668d..c62f0ec 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/SerializabilityUtil.java
@@ -219,25 +219,50 @@
   }
 
   /**
-   * Return the concrete type that a generic type maps to, if known.
+   * Resolve type variables to concrete types if possible. Otherwise, just return
+   * the type variable.
    *
-   * @param genericType The generic type to resolve.
+   * @param unresolved The type to resolve
    * @param resolvedTypes A map of generic types to actual types.
    * @return The actual type, which may be of any subclass of Type.
    */
-  public static Type findActualType(Type genericType,
+  public static Type findActualType(Type unresolved,
       DequeMap<TypeVariable<?>, Type> resolvedTypes) {
-    Type result = genericType;
-    // Look for things that TypeVariables are mapped to, but stop if mapped
-    // to itself. We map a TypeVariable to itself when we wish to explicitly
-    // mark it as unmapped.
-    while (result instanceof TypeVariable<?> &&
-        resolvedTypes.get((TypeVariable<?>) result) != result &&
-        resolvedTypes.get((TypeVariable<?>) result) != null) {
-      result = resolvedTypes.get((TypeVariable<?>) result);
+
+    // Handle simple cases quickly.
+    if (!(unresolved instanceof TypeVariable<?>)) {
+      return unresolved;
+    }
+    TypeVariable<?> var = (TypeVariable<?>) unresolved;
+    Type target = resolvedTypes.get(var);
+    if (target == null || target == var) {
+      return var;
+    }
+    if (!(target instanceof TypeVariable<?>)) {
+      return target;
     }
 
-    return result;
+    // Type variables that point to other type variables might form a cycle, which
+    // means they're all equivalent. Keep track of visited type variables to detect this.
+    Set<TypeVariable<?>> seen = new HashSet<TypeVariable<?>>();
+    seen.add(var);
+    var = (TypeVariable<?>) target;
+    seen.add(var);
+
+    while (true) {
+      target = resolvedTypes.get(var);
+      if (target == null || target == var) {
+        return var;
+      }
+      if (!(target instanceof TypeVariable<?>)) {
+        return target;
+      }
+      var = (TypeVariable<?>) target;
+      if (!seen.add(var)) {
+        // Cycle detected; returning an arbitrary var in the cycle.
+        return var;
+      }
+    }
   }
 
   /**
@@ -870,6 +895,14 @@
       generateSerializationSignature(customSerializer, crc, policy);
     } else if (instanceType.isArray()) {
       generateSerializationSignature(instanceType.getComponentType(), crc, policy);
+    } else if (Enum.class.isAssignableFrom(instanceType) && !Enum.class.equals(instanceType)) {
+      if (!instanceType.isEnum()) {
+        instanceType = instanceType.getSuperclass();
+      }
+      Enum<?>[] constants = instanceType.asSubclass(Enum.class).getEnumConstants();
+      for (Enum<?> constant : constants) {
+        crc.update(constant.name().getBytes(RPCServletUtils.CHARSET_UTF8));
+      }
     } else if (!instanceType.isPrimitive()) {
       Field[] fields = applyFieldSerializationPolicy(instanceType);
       Set<String> clientFieldNames = policy.getClientFieldNamesForEnhancedClass(instanceType);
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java
index b1df67d..0348bdf 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamWriter.java
@@ -337,7 +337,6 @@
      * JavaScript Vertical Tab character '\v' into 'v'. As such, we do not use
      * the short form of the unicode escape here.
      */
-    JS_CHARS_ESCAPED['\u0000'] = '0';
     JS_CHARS_ESCAPED['\b'] = 'b';
     JS_CHARS_ESCAPED['\t'] = 't';
     JS_CHARS_ESCAPED['\n'] = 'n';
@@ -503,6 +502,9 @@
       case NON_BREAKING_HYPHEN:
         // This can be expanded into a break followed by a hyphen
         return true;
+      case '\'': case '&': case '<': case '=': case '>':
+        // These can cause HTML content sniffing
+        return true;
       default:
         if (ch < ' ') {
           // Chrome 11 mangles control characters
diff --git a/user/src/com/google/gwt/useragent/UserAgent.gwt.xml b/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
index 16a65ec..3039a35 100644
--- a/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
+++ b/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
@@ -33,6 +33,15 @@
     is-multi-valued="false" />
   <set-configuration-property name="user.agent.runtimeWarning" value="true"/>
 
+  <!--
+    If set to "modern", GWT widgets will sometimes attempt to use new web API's that
+    aren't yet standardized (such as prefixed API's). The "stable" setting turns this off.
+    If recompiling and redeploying your GWT app when someone reports a browser bug would be
+    a problem, you should choose "stable".
+  -->
+  <define-property name="webApiUsage" values="stable,modern"/>
+  <set-property name="webApiUsage" value="modern"/>
+
   <!-- Asserts that the compile time user.agent value matches the runtime -->
   <!-- user.agent value -->
   <entry-point class="com.google.gwt.useragent.client.UserAgentAsserter" />
diff --git a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
index dfcd5a7..4ee9674 100644
--- a/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
+++ b/user/src/com/google/gwt/validation/rebind/GwtSpecificValidatorCreator.java
@@ -1112,14 +1112,14 @@
   private void writeFieldWrapperMethod(SourceWriter sw, JField field) {
     writeUnsafeNativeLongIfNeeded(sw, field.getType());
 
-    // private native fieldType _fieldName(Bean object) /*-{
+    // private native fieldType _fieldName(com.example.Bean object) /*-{
     sw.print("private native ");
 
     sw.print(field.getType().getQualifiedSourceName());
     sw.print(" ");
     sw.print(toWrapperName(field));
     sw.print("(");
-    sw.print(beanType.getName());
+    sw.print(field.getEnclosingType().getQualifiedSourceName());
     sw.println(" object) /*-{");
     sw.indent();
 
diff --git a/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java b/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
index d3e4c95..19a1d68 100644
--- a/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
+++ b/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
@@ -366,6 +366,18 @@
   }-*/;
 
   /**
+   * Sets withCredentials attribute.
+   * <p>
+   * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute"
+   * >http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute</a>.
+   *
+   * @param withCredentials whether to include credentials in XHR
+   */
+  public final native void setWithCredentials(boolean withCredentials) /*-{
+    this.withCredentials = withCredentials;
+  }-*/;
+
+  /**
    * Sets the response type.
    * <p>
    * See <a href="http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute"
diff --git a/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java b/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
index 7e33728..de48103 100644
--- a/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
+++ b/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
@@ -214,7 +214,7 @@
     List<H> l = getHandlerList(type, source);
 
     boolean removed = l.remove(handler);
-    assert removed : "redundant remove call";
+
     if (removed && l.isEmpty()) {
       prune(type, source);
     }
diff --git a/user/src/com/google/web/bindery/requestfactory/server/RequestState.java b/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
index 93e7078..c1d698a 100644
--- a/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
+++ b/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
@@ -157,7 +157,8 @@
   /**
    * EntityCodex support. This method is identical to
    * {@link IdFactory#getHistoryToken(SimpleProxyId)} except that it
-   * base64-encodes the server ids.
+   * base64-encodes the server ids and adds client ids for stable ids
+   * that were ephemeral.
    * <p>
    * XXX: Merge this with AbstsractRequestContext's implementation
    */
@@ -172,6 +173,9 @@
       ref.setStrength(Strength.EPHEMERAL);
       ref.setClientId(stableId.getClientId());
     } else {
+      if (stableId.wasEphemeral()) {
+        ref.setClientId(stableId.getClientId());
+      }
       ref.setServerId(SimpleRequestProcessor.toBase64(stableId.getServerId()));
     }
     return AutoBeanCodex.encode(bean);
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
index c4f68b3..3bcffa3 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
@@ -1269,6 +1269,8 @@
       }
       processReturnOperation(id, op, toPropagate);
     }
+
+    assert state.returnedProxies.size() == ops.size();
   }
 
   /**
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java
index 04225bf..b63feb2 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationData.java
@@ -15,9 +15,6 @@
  */
 package com.google.web.bindery.requestfactory.vm.impl;
 
-import com.google.gwt.dev.asm.Type;
-import com.google.gwt.dev.asm.commons.Method;
-
 /**
  * Describes operations that the client may ask the server to perform.
  */
@@ -32,18 +29,14 @@
       OperationData toReturn = d;
       d = null;
 
+      // Strip return types
       if (toReturn.clientMethodDescriptor != null) {
-        // Strip return types
-        Method noReturn =
-            new Method(toReturn.methodName, Type.VOID_TYPE, Type
-                .getArgumentTypes(toReturn.clientMethodDescriptor));
-        toReturn.clientMethodDescriptor = noReturn.getDescriptor();
+        toReturn.clientMethodDescriptor =
+            OperationKey.stripReturnType(toReturn.clientMethodDescriptor);
       }
       if (toReturn.domainMethodDescriptor != null) {
-        Method noReturn =
-            new Method(toReturn.methodName, Type.VOID_TYPE, Type
-                .getArgumentTypes(toReturn.domainMethodDescriptor));
-        toReturn.domainMethodDescriptor = noReturn.getDescriptor();
+        toReturn.domainMethodDescriptor =
+            OperationKey.stripReturnType(toReturn.domainMethodDescriptor);
       }
 
       return toReturn;
@@ -101,4 +94,4 @@
   public String toString() {
     return getRequestContext() + "::" + getMethodName() + getDomainMethodDescriptor();
   }
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java
index 87b9d2c..84ea217 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/impl/OperationKey.java
@@ -15,8 +15,6 @@
  */
 package com.google.web.bindery.requestfactory.vm.impl;
 
-import com.google.gwt.dev.asm.Type;
-import com.google.gwt.dev.asm.commons.Method;
 import com.google.gwt.dev.util.StringKey;
 import com.google.gwt.user.server.Base64Utils;
 
@@ -53,9 +51,13 @@
     }
   }
 
+  static String stripReturnType(String descriptor) {
+    assert descriptor.contains(")") : descriptor + " does not look like a method descriptor";
+    return descriptor.substring(0, descriptor.lastIndexOf(')')) + ")V";
+  }
+
   private static String key(String requestContextBinaryName, String methodName, String descriptor) {
-    Method m = new Method(methodName, Type.VOID_TYPE, Type.getArgumentTypes(descriptor));
-    String raw = requestContextBinaryName + "::" + methodName + m.getDescriptor();
+    String raw = requestContextBinaryName + "::" + methodName + stripReturnType(descriptor);
     return raw.length() >= HASH_LENGTH ? hash(raw) : raw;
   }
 
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java b/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java
index 06b4f12..183d399 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/testing/UrlRequestTransport.java
@@ -19,14 +19,11 @@
 import com.google.web.bindery.requestfactory.shared.RequestTransport;
 import com.google.web.bindery.requestfactory.shared.ServerFailure;
 
-import org.json.Cookie;
-import org.json.JSONException;
-import org.json.JSONObject;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.HttpCookie;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.util.HashMap;
@@ -97,18 +94,22 @@
       List<String> cookieHeaders = connection.getHeaderFields().get("Set-Cookie");
       if (cookieHeaders != null) {
         for (String header : cookieHeaders) {
+          List<HttpCookie> headerCookies;
           try {
-            JSONObject cookie = Cookie.toJSONObject(header);
-            String name = cookie.getString("name");
-            String value = cookie.getString("value");
-            String domain = cookie.optString("Domain");
+            headerCookies = HttpCookie.parse(header);
+          } catch (IllegalArgumentException e) {
+            // if we can't parse it, ignore it
+            continue;
+          }
+
+          for (HttpCookie cookie : headerCookies) {
+            String domain = cookie.getDomain();
             if (domain == null || url.getHost().endsWith(domain)) {
-              String path = cookie.optString("Path");
+              String path = cookie.getPath();
               if (path == null || url.getPath().startsWith(path)) {
-                cookies.put(name, value);
+                cookies.put(cookie.getName(), cookie.getValue());
               }
             }
-          } catch (JSONException ignored) {
           }
         }
       }
diff --git a/user/super/com/google/gwt/emul/java/lang/Number.java b/user/super/com/google/gwt/emul/java/lang/Number.java
index 04a85e1..ab89197 100644
--- a/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -74,12 +74,12 @@
       6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // base 22-35
       5 // base 36
     };
-  
+
     /**
      * A table of values radix*maxDigitsForRadix[radix].
      */
     private static final int[] maxDigitsRadixPower = new int[37];
-  
+
     /**
      * The largest number of digits (excluding minus sign and leading zeros) that
      * can fit into a long for a given radix between 2 and 36, inclusive.
@@ -121,12 +121,12 @@
       13, // base 35
       13  // base 36
     };
-  
+
     /**
      * A table of floor(MAX_VALUE / maxDigitsRadixPower).
      */
     private static final long[] maxValueForRadix = new long[37];
-  
+
     static {
       for (int i = 2; i <= 36; i++) {
         maxDigitsRadixPower[i] = (int) Math.pow(i, maxDigitsForRadix[i]);
@@ -183,27 +183,21 @@
    * This function contains common logic for parsing a String as a floating-
    * point number and validating the range.
    */
-  protected static double __parseAndValidateDouble(String s)
-      throws NumberFormatException {
-
-    double toReturn = __parseDouble(s);
-
-    if (__isNaN(toReturn)) {
+  protected static double __parseAndValidateDouble(String s) throws NumberFormatException {
+    if (!__isValidDouble(s)) {
       throw NumberFormatException.forInputString(s);
     }
-
-    return toReturn;
+    return __parseDouble(s);
   }
-  
+
   /**
    * @skip
    * 
    * This function contains common logic for parsing a String in a given radix
    * and validating the result.
    */
-  protected static int __parseAndValidateInt(String s, int radix,
-      int lowerBound, int upperBound) throws NumberFormatException {
-
+  protected static int __parseAndValidateInt(String s, int radix, int lowerBound, int upperBound)
+      throws NumberFormatException {
     if (s == null) {
       throw new NumberFormatException("null");
     }
@@ -229,16 +223,14 @@
 
     return toReturn;
   }
-  
+
   /**
    * @skip
    * 
    * This function contains common logic for parsing a String in a given radix
    * and validating the result.
    */
-  protected static long __parseAndValidateLong(String s, int radix)
-      throws NumberFormatException {
-    
+  protected static long __parseAndValidateLong(String s, int radix) throws NumberFormatException {
     if (s == null) {
       throw new NumberFormatException("null");
     }
@@ -246,6 +238,8 @@
       throw new NumberFormatException("radix " + radix + " out of range");
     }
 
+    final String orig = s;
+
     int length = s.length();
     boolean negative = (length > 0) && (s.charAt(0) == '-');
     if (negative) {
@@ -253,7 +247,7 @@
       length--;
     }
     if (length == 0) {
-      throw NumberFormatException.forInputString(s);
+      throw NumberFormatException.forInputString(orig);
     }
 
     // Strip leading zeros
@@ -261,13 +255,13 @@
       s = s.substring(1);
       length--;
     }
-    
+
     // Immediately eject numbers that are too long -- this avoids more complex
     // overflow handling below
     if (length > __ParseLong.maxLengthForRadix[radix]) {
-      throw NumberFormatException.forInputString(s);
+      throw NumberFormatException.forInputString(orig);
     }
-    
+
     // Validate the digits
     int maxNumericDigit = '0' + Math.min(radix, 10);
     int maxLowerCaseDigit = radix + 'a' - 10;
@@ -283,50 +277,56 @@
       if (c >= 'A' && c < maxUpperCaseDigit) {
         continue;
       }
-      throw NumberFormatException.forInputString(s);
+      throw NumberFormatException.forInputString(orig);
     }
 
     long toReturn = 0;
     int maxDigits = __ParseLong.maxDigitsForRadix[radix];
     long radixPower = __ParseLong.maxDigitsRadixPower[radix];
-    long maxValue = __ParseLong.maxValueForRadix[radix];
-    
+    long minValue = -__ParseLong.maxValueForRadix[radix];
+
     boolean firstTime = true;
     int head = length % maxDigits;
     if (head > 0) {
-      toReturn = __parseInt(s.substring(0, head), radix);
+      // accumulate negative numbers, as -Long.MAX_VALUE == Long.MIN_VALUE + 1
+      // (in other words, -Long.MIN_VALUE overflows, see issue 7308)
+      toReturn = - __parseInt(s.substring(0, head), radix);
       s = s.substring(head);
       length -= head;
       firstTime = false;
     }
-    
+
     while (length >= maxDigits) {
       head = __parseInt(s.substring(0, maxDigits), radix);
       s = s.substring(maxDigits);
       length -= maxDigits;
       if (!firstTime) {
         // Check whether multiplying by radixPower will overflow
-        if (toReturn > maxValue) {
+        if (toReturn < minValue) {
           throw new NumberFormatException(s);
         }
-        toReturn *= radixPower;      
+        toReturn *= radixPower;
       } else {
         firstTime = false;
       }
-      toReturn += head;
+      toReturn -= head;
     }
     
-    // A negative value means we overflowed Long.MAX_VALUE
-    if (toReturn < 0) {
-      throw NumberFormatException.forInputString(s);
+    // A positive value means we overflowed Long.MIN_VALUE
+    if (toReturn > 0) {
+      throw NumberFormatException.forInputString(orig);
     }
     
-    if (negative) {
+    if (!negative) {
       toReturn = -toReturn;
+      // A negative value means we overflowed Long.MAX_VALUE
+      if (toReturn < 0) {
+        throw NumberFormatException.forInputString(orig);
+      }
     }
     return toReturn;
   }
-  
+
   /**
    * @skip
    */
@@ -337,21 +337,26 @@
   /**
    * @skip
    * 
-   * @return The floating-point representation of <code>str</code> or
-   *         <code>Number.NaN</code> if the string does not match
-   *         {@link #floatRegex}.
+   * @param str
+   * @return {@code true} if the string matches {@link #floatRegex}, {@code false} otherwise
    */
-  private static native double __parseDouble(String str) /*-{
+  private static native boolean __isValidDouble(String str) /*-{
     var floatRegex = @java.lang.Number::floatRegex;
     if (!floatRegex) {
       // Disallow '.' with no digits on either side
-      floatRegex = @java.lang.Number::floatRegex = /^\s*[+-]?((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?[dDfF]?\s*$/i;
+      floatRegex = @java.lang.Number::floatRegex =
+          /^\s*[+-]?(NaN|Infinity|((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?[dDfF]?)\s*$/;
     }
-    if (floatRegex.test(str)) {
-      return parseFloat(str);
-    } else {
-      return Number.NaN;
-    }
+    return floatRegex.test(str);
+  }-*/;
+
+  /**
+   * @skip
+   * 
+   * @return The floating-point representation of <code>str</code>.
+   */
+  private static native double __parseDouble(String str) /*-{
+    return parseFloat(str);
   }-*/;
 
   /**
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 032e04c..6fab967 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -764,10 +764,9 @@
    * TODO(jat): properly handle Java regex syntax
    */
   public native boolean matches(String regex) /*-{
-    var matchObj = new RegExp(regex).exec(this);
-    // if there is no match at all, matchObj will be null 
-    // matchObj[0] is the entire matched string
-    return (matchObj == null) ? false : (this == matchObj[0]);
+    // We surround the regex with '^' and '$' because it must match
+    // the entire string.
+    return new RegExp('^(' + regex + ')$').test(this);
   }-*/;
 
   public int offsetByCodePoints(int index, int codePointOffset) {
diff --git a/user/super/com/google/gwt/emul/java/math/BigDecimal.java b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
index 7cc988b..ffbdfb7 100644
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -2615,18 +2615,10 @@
         throw new NumberFormatException("For input string: \"" + val + "\"");
       }
     }
-    int counter = 0;
-    boolean wasNonZero = false;
     // Accumulating all digits until a possible decimal point
-    for (; (offset < last) && (val.charAt(offset) != '.')
-        && (val.charAt(offset) != 'e') && (val.charAt(offset) != 'E'); offset++) {
-      if (!wasNonZero) {
-        if (val.charAt(offset) == '0') {
-          counter++;
-        } else {
-          wasNonZero = true;
-        }
-      }
+    while ((offset < last) && (val.charAt(offset) != '.')
+        && (val.charAt(offset) != 'e') && (val.charAt(offset) != 'E')) {
+      offset++;
     }
     unscaledBuffer.append(val, begin, offset);
     // A decimal point was found
@@ -2634,15 +2626,9 @@
       offset++;
       // Accumulating all digits until a possible exponent
       begin = offset;
-      for (; (offset < last) && (val.charAt(offset) != 'e')
-          && (val.charAt(offset) != 'E'); offset++) {
-        if (!wasNonZero) {
-          if (val.charAt(offset) == '0') {
-            counter++;
-          } else {
-            wasNonZero = true;
-          }
-        }
+      while ((offset < last) && (val.charAt(offset) != 'e')
+          && (val.charAt(offset) != 'E')) {
+        offset++;
       }
       scale = offset - begin;
       unscaledBuffer.append(val, begin, offset);
@@ -2681,7 +2667,7 @@
     } else {
       setUnscaledValue(new BigInteger(unscaled));
     }
-    precision = unscaledBuffer.length() - counter;
+    precision = unscaledBuffer.length();
     // Don't count leading zeros in the precision
     for (int i = 0; i < unscaledBuffer.length(); ++i) {
       char ch = unscaledBuffer.charAt(i);
@@ -2690,6 +2676,10 @@
       }
       --precision;
     }
+    // The precision of a zero value is 1
+    if (precision == 0) {
+      precision = 1;
+    }
   }
 
   /**
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractMap.java b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
index 93606f5..bdeb8ee 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractMap.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
@@ -207,6 +207,7 @@
       K k = entry.getKey();
       if (key == null ? k == null : key.equals(k)) {
         if (remove) {
+          entry = new MapEntryImpl<K, V>(entry.getKey(), entry.getValue());
           iter.remove();
         }
         return entry;
diff --git a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
index bf2a6bf..b4a1791 100644
--- a/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
+++ b/user/super/com/google/gwt/junit/translatable/com/google/gwt/junit/client/impl/GWTRunner.java
@@ -334,7 +334,8 @@
         builder.setParameter(SESSIONID_QUERY_PARAM,
             String.valueOf(clientInfo.getSessionId()));
       }
-      Window.Location.replace(builder.buildString());
+      // Replace "%3A" with ":" as a hack to support broken DevMode plugins.
+      Window.Location.replace(builder.buildString().replaceAll("%3A", ":"));
       currentBlock = null;
       currentTestIndex = 0;
     }
diff --git a/user/test/com/google/gwt/animation/AnimationApiUsage.gwt.xml b/user/test/com/google/gwt/animation/AnimationApiUsage.gwt.xml
new file mode 100644
index 0000000..b8afd4c
--- /dev/null
+++ b/user/test/com/google/gwt/animation/AnimationApiUsage.gwt.xml
@@ -0,0 +1,19 @@
+<!--                                                                        -->
+<!-- Copyright 2013 Google Inc.                                             -->
+<!-- Licensed under the Apache License, Version 2.0 (the "License"); you    -->
+<!-- may not use this file except in compliance with the License. You may   -->
+<!-- may obtain a copy of the License at                                    -->
+<!--                                                                        -->
+<!-- http://www.apache.org/licenses/LICENSE-2.0                             -->
+<!--                                                                        -->
+<!-- Unless required by applicable law or agreed to in writing, software    -->
+<!-- distributed under the License is distributed on an "AS IS" BASIS,      -->
+<!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
+<!-- implied. License for the specific language governing permissions and   -->
+<!-- limitations under the License.                                         -->
+
+<!-- Module used to test Animation API usage.                               -->
+<module>
+  <inherits name="com.google.gwt.animation.Animation"/>
+  <set-property name="webApiUsage" value="stable"/>
+</module>
\ No newline at end of file
diff --git a/user/test/com/google/gwt/animation/AnimationSuite.java b/user/test/com/google/gwt/animation/AnimationSuite.java
index ef8551f..8302101 100644
--- a/user/test/com/google/gwt/animation/AnimationSuite.java
+++ b/user/test/com/google/gwt/animation/AnimationSuite.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.animation;
 
+import com.google.gwt.animation.client.AnimationApiUsageTest;
 import com.google.gwt.animation.client.AnimationSchedulerImplTimerTest;
 import com.google.gwt.animation.client.AnimationTest;
 
@@ -28,6 +29,7 @@
   public static Test suite() {
     TestSuite suite = new TestSuite("Tests of the animation package");
 
+    suite.addTestSuite(AnimationApiUsageTest.class);
     suite.addTestSuite(AnimationSchedulerImplTimerTest.class);
     suite.addTestSuite(AnimationTest.class);
 
diff --git a/user/test/com/google/gwt/animation/client/AnimationApiUsageTest.java b/user/test/com/google/gwt/animation/client/AnimationApiUsageTest.java
new file mode 100644
index 0000000..27a6c64
--- /dev/null
+++ b/user/test/com/google/gwt/animation/client/AnimationApiUsageTest.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2013 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.animation.client;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Verifies that we always use timers in 'resistance' mode.
+ */
+public class AnimationApiUsageTest extends GWTTestCase {
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.animation.AnimationApiUsage";
+  }
+
+  public void testAnimationSchedulerUsesTimer() {
+    AnimationScheduler scheduler = AnimationScheduler.get();
+    assertEquals("Expected timer implementation but got: " + scheduler.getClass().getName(),
+        AnimationSchedulerImplTimer.class, scheduler.getClass());
+  }
+}
diff --git a/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java b/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
index 49a6aa0..3925bd7 100644
--- a/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
+++ b/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
@@ -199,8 +199,8 @@
     }
 
     Context2d context = canvas1.getContext2d();
-    context.setFont("40px Times New Roman");
-    assertEquals("40px Times New Roman", context.getFont());
+    context.setFont("40px \"Times New Roman\"");
+    assertEquals("40px \"Times New Roman\"", context.getFont());
   }
 
   public void testGlobalAlpha() {
diff --git a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
index 7596688..f245a1c 100644
--- a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
+++ b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
@@ -204,7 +204,8 @@
     this.delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test4.js";
     assertFalse(nativeTest4Worked());
-    final JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).inject();
+    final JavaScriptObject injectedElement =
+        ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false).inject();
 
     // We'll check using a callback in another test. This test will poll to see
     // that the script had an effect.
@@ -242,8 +243,8 @@
     delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test5.js";
     assertFalse(nativeTest5Worked());
-    JavaScriptObject injectedElement =
-        ScriptInjector.fromUrl(scriptUrl).setCallback(new Callback<Void, Exception>() {
+    JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
+        .setCallback(new Callback<Void, Exception>() {
           @Override
           public void onFailure(Exception reason) {
             assertNotNull(reason);
@@ -272,8 +273,8 @@
   public void testInjectUrlTopWindow() {
     final String scriptUrl = "script_injector_test6.js";
     assertFalse(nativeTest6Worked());
-    JavaScriptObject injectedElement =
-        ScriptInjector.fromUrl(scriptUrl).setWindow(ScriptInjector.TOP_WINDOW).inject();
+    JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
+        .setWindow(ScriptInjector.TOP_WINDOW).inject();
     // We'll check using a callback in another test. This test will poll to see
     // that the script had an effect.
     Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@@ -309,8 +310,8 @@
     delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test7.js";
     assertFalse(nativeTest7Worked());
-    JavaScriptObject injectedElement =
-        ScriptInjector.fromUrl(scriptUrl).setWindow(ScriptInjector.TOP_WINDOW).setCallback(
+    JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
+        .setWindow(ScriptInjector.TOP_WINDOW).setCallback(
             new Callback<Void, Exception>() {
 
               @Override
diff --git a/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java b/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
index 47f70ad..86a4abd 100644
--- a/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
+++ b/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.core.client.impl;
 
+import com.google.gwt.core.client.Duration;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.core.client.Scheduler.RepeatingCommand;
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -75,6 +76,22 @@
     void schedule(ScheduledCommand cmd);
   }
 
+  private static class RepeatingCommandImpl implements RepeatingCommand {
+    private boolean firstTime = true;
+    private boolean commandRanSecondTime = false;
+
+    @Override
+    public boolean execute() {
+      // Command needs to run for the second time to be executed in runScheduledTasks
+      if (firstTime) {
+        firstTime = false;
+        return true;
+      }
+      commandRanSecondTime = true;
+      return false;
+    }
+  }
+
   private static final int TEST_DELAY = 5000;
 
   @Override
@@ -106,6 +123,45 @@
     delayTestFinish(TEST_DELAY);
   }
 
+  /**
+   * This test could potentially timeout since loop in {@link SchedulerImpl#runRepeatingTasks} would
+   * run indefinitely since we are mocking Duration to always return zero.
+   * 
+   * see for details: https://code.google.com/p/google-web-toolkit/issues/detail?id=7307
+   */
+  public void testEarlyBreakIfAllTaskAreFinished() {
+    final SchedulerImpl impl = new SchedulerImpl() {
+      @Override
+      Duration createDuration() {
+        return new Duration() {
+          @Override
+          public int elapsedMillis() {
+            // never expire
+            return 0;
+          }
+        };
+      }
+    };
+
+    final RepeatingCommandImpl command = new RepeatingCommandImpl();
+
+    impl.scheduleIncremental(command);
+
+    impl.scheduleDeferred(new ScheduledCommand() {
+      @Override
+      public void execute() {
+
+        if (command.commandRanSecondTime) {
+          finishTest();
+        } else {
+          impl.scheduleDeferred(this);
+        }
+      }
+    });
+
+    delayTestFinish(TEST_DELAY);
+  }
+
   public void testEntryCommands() {
     final SchedulerImpl impl = new SchedulerImpl();
 
diff --git a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
index e4bfe0d..6b71d59 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
@@ -192,6 +192,10 @@
         c.extractName(" at Type.functionName (file.js:1:2)"));
     assertEquals("functionName@@file.js:1:2",
         c.extractName(" at Type.functionName [as methodName] (file.js:1:2)"));
+    
+    // iOS style
+    assertEquals("functionName@@file.js:1",
+        c.extractName("functionName@file.js:1"));
   }
 
   public void testFirefox14ExtractName() {
diff --git a/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java b/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
index e480282..4107144 100644
--- a/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
@@ -16,6 +16,7 @@
 package com.google.gwt.dev.jjs.test;
 
 import com.google.gwt.core.client.JavaScriptException;
+import com.google.gwt.dev.jjs.test.compilertests.MethodNamedSameAsClass;
 import com.google.gwt.junit.client.GWTTestCase;
 
 import junit.framework.Assert;
@@ -951,6 +952,7 @@
             ai = foo;
           }
 
+          @SuppressWarnings("ReturnValueIgnored")
           @Override
           public String toString() {
             // this line used to cause ICE due to no synthetic path to bar
@@ -967,6 +969,14 @@
     assertEquals(result, "foofoofoofoo");
   }
 
+  /**
+   * test for issue 7824.
+   */
+  public void testMethodNamedSameAsClass() {
+    MethodNamedSameAsClass obj = new MethodNamedSameAsClass();
+    obj.MethodNamedSameAsClass();
+  }
+
   public void testNotOptimizations() {
     assertFalse(!true);
     assertTrue(!false);
diff --git a/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java b/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
index 072974a..9b8e651 100644
--- a/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
@@ -111,12 +111,90 @@
     }
   }
 
+
+  /**
+   * Used in test {@link #testExtendsNested()}
+   */
+  private static class ESOuter {
+    class ESInner {
+      public int value;
+      public ESInner() {
+        value = 1;
+      }
+      public ESInner(int value) {
+        this.value = value;
+      }
+    }
+
+    public ESInner newESInner() {
+      return new ESInner();
+    }
+  }
+
+  private static class ESInnerSubclass extends ESOuter.ESInner {
+    ESInnerSubclass(ESOuter outer) {
+      outer.super();
+    }
+
+    ESInnerSubclass(int value, ESOuter outer) {
+      outer.super(value);
+    }
+  }
+
+  /**
+   * Used in test {@link #testExtendsNestedWithGenerics()}
+   */
+  private static class ESWGOuter<T> {
+    class ESWGInner {
+      public int value;
+      public ESWGInner() {
+        value = 1;
+      }
+      public ESWGInner(int value) {
+        this.value = value;
+      }
+    }
+
+    public ESWGInner newESWGInner() {
+      return new ESWGInner();
+    }
+  }
+
+  private static class ESWGInnerSubclass extends ESWGOuter<String>.ESWGInner {
+    ESWGInnerSubclass(ESWGOuter<String> outer) {
+      outer.super();
+    }
+
+    ESWGInnerSubclass(int value, ESWGOuter<String> outer) {
+      outer.super(value);
+    }
+  }
+
   private StringBuffer testAppend = new StringBuffer();
 
   public String getModuleName() {
     return "com.google.gwt.dev.jjs.CompilerSuite";
   }
 
+  public void testExtendsNested() {
+    ESOuter o = new ESOuter();
+    assertEquals(1, o.new ESInner().value);
+    assertEquals(2, o.new ESInner(2).value);
+    assertEquals(1, new ESInnerSubclass(o).value);
+    assertEquals(2, new ESInnerSubclass(2, o).value);
+  }
+
+  /**
+   * Test for Issue 7789
+   */
+  public void testExtendsNestedWithGenerics() {
+    ESWGOuter<String> o = new ESWGOuter<String>();
+    assertEquals(1, o.new ESWGInner().value);
+    assertEquals(2, o.new ESWGInner(2).value);
+    assertEquals(1, new ESWGInnerSubclass(o).value);
+    assertEquals(2, new ESWGInnerSubclass(2, o).value);
+  }
+
   public void testInnerClassCtors() {
     P1<?> p1 = new P1<Object>();
     assertEquals(1, p1.value);
diff --git a/user/test/com/google/gwt/dev/jjs/test/JsoTest.java b/user/test/com/google/gwt/dev/jjs/test/JsoTest.java
index 5bf60b0..059d1c9 100644
--- a/user/test/com/google/gwt/dev/jjs/test/JsoTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/JsoTest.java
@@ -370,7 +370,7 @@
     assertFalse(o instanceof String);
     try {
       String s = (String) o;
-      s.toString();
+      s = s.toString();
       fail("Expected ClassCastException");
     } catch (ClassCastException expected) {
     }
diff --git a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
index 0285390..a615d1f 100644
--- a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
@@ -28,6 +28,7 @@
     return "com.google.gwt.dev.jjs.CompilerSuite";
   }
 
+  @SuppressWarnings("all")
   public void testNullEmpty() {
     assertNotNull(vararg());
     assertNull(vararg(null));
diff --git a/user/test/com/google/gwt/dev/jjs/test/compilertests/MethodNamedSameAsClass.java b/user/test/com/google/gwt/dev/jjs/test/compilertests/MethodNamedSameAsClass.java
new file mode 100644
index 0000000..bdfe2f8
--- /dev/null
+++ b/user/test/com/google/gwt/dev/jjs/test/compilertests/MethodNamedSameAsClass.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2013 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.jjs.test.compilertests;
+
+/**
+ * Test for issue 7824
+ */
+public class MethodNamedSameAsClass {
+  public void MethodNamedSameAsClass() { }
+}
diff --git a/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java b/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
index ff3a48c..8eb5f6f 100644
--- a/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
+++ b/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
@@ -23,7 +23,6 @@
 import com.google.gwt.user.client.ui.VerticalPanel;
 
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 /**
@@ -111,14 +110,14 @@
    */
   public void testInnerModules() {
     String url = getURL();
-    Map params = getURLParams(url);
+    Map<String, String> params = getURLParams(url);
     if (!params.containsKey("gwt.junit.testfuncname")) {
       // if this test is being run as a normal JUnit test, return success
       return;
     }
 
     // we were invoked by testMultipleModules, get the frame to load
-    String frameName = (String) params.get("frame");
+    String frameName = params.get("frame");
     
     VerticalPanel panel = new VerticalPanel();
     RootPanel.get().add(panel);
@@ -167,7 +166,7 @@
     
     // build new URL from current one
     String url = getURL();
-    Map params = getURLParams(url);
+    Map<String, String> params = getURLParams(url);
     params.put("frame", "top");
     params.put("gwt.junit.testclassname", MultiModuleTest.class.getName());
     params.put("gwt.junit.testfuncname", "testInnerModules");
@@ -207,7 +206,7 @@
    * @param params a map of parameter names to values
    * @return the revised URL
    */
-  private String buildURL(String url, Map params) {
+  private String buildURL(String url, Map<String, String> params) {
 
     // strip off the query string if present
     int pos = url.indexOf("?");
@@ -225,9 +224,8 @@
     }
 
     // now add the rest of the parameters, excluding gwt.hybrid
-    for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
-      Map.Entry entry = (Map.Entry) it.next();
-      String param = (String) entry.getKey();
+    for (Map.Entry<String, String> entry : params.entrySet()) {
+      String param = entry.getKey();
 
       if (param.equals("gwt.hybrid")) {
         // we already included gwt.hybrid if it was present
@@ -244,7 +242,7 @@
       url += param;
 
       // add the value if necessary
-      String value = (String) entry.getValue();
+      String value = entry.getValue();
       if (value != null) {
         url += "=" + value;
       }
@@ -268,7 +266,7 @@
    */
   private void doneLoading() {
     String url = getURL();
-    Map params = getURLParams(url);
+    Map<String, String> params = getURLParams(url);
     mainPanel.add(new Label("done loading"));
     if (++state == 4) {
       // all tests complete, notify parent
@@ -306,8 +304,8 @@
    * @param url the full or partial (ie, only location.search) URL to parse
    * @return the map of parameter names to values
    */
-  private Map getURLParams(String url) {
-    HashMap map = new HashMap();
+  private Map<String, String> getURLParams(String url) {
+    HashMap<String, String> map = new HashMap<String, String>();
     int pos = url.indexOf("?");
     
     // loop precondition: pos is the index of the next ? or & character in url
@@ -372,7 +370,7 @@
    * 
    * @param frameNumber the number of the frame to replace, starting with 0
    */
-  private void toggleFrame(int frameNumber, String url, Map params) {
+  private void toggleFrame(int frameNumber, String url, Map<String, String> params) {
     params.put("frame", (frameNumber + 1) + (frameB[frameNumber] ? "a" : "b"));
     frame[frameNumber].setUrl(buildURL(url, params));
     frameB[frameNumber] = !frameB[frameNumber];
diff --git a/user/test/com/google/gwt/dom/client/ElementTest.java b/user/test/com/google/gwt/dom/client/ElementTest.java
index f1e1950..a1e6145 100644
--- a/user/test/com/google/gwt/dom/client/ElementTest.java
+++ b/user/test/com/google/gwt/dom/client/ElementTest.java
@@ -40,15 +40,45 @@
     div.setClassName("foo");
     assertEquals("foo", div.getClassName());
 
-    div.addClassName("bar");
+    assertTrue(div.addClassName("bar"));
     assertEquals("foo bar", div.getClassName());
 
-    div.addClassName("baz");
+    assertTrue(div.addClassName("baz"));
+    assertEquals("foo bar baz", div.getClassName());
+
+    assertFalse(div.addClassName("baz"));
     assertEquals("foo bar baz", div.getClassName());
 
     div.replaceClassName("bar", "tintin");
     assertTrue(div.getClassName().contains("tintin"));
     assertFalse(div.getClassName().contains("bar"));
+
+    assertTrue(div.removeClassName("tintin"));
+    assertEquals("foo baz", div.getClassName());
+
+    assertFalse(div.removeClassName("bar"));
+    assertEquals("foo baz", div.getClassName());
+
+    assertTrue(div.removeClassName("baz"));
+    assertEquals("foo", div.getClassName());
+
+    assertTrue(div.removeClassName("foo"));
+    assertEquals("", div.getClassName());
+  }
+
+  public void testIndexOfName() {
+    assertEquals(-1, Element.indexOfName("", "foo"));
+
+    assertEquals(-1, Element.indexOfName("foo", "fo"));
+    assertEquals(-1, Element.indexOfName("foo", "fool"));
+
+    assertEquals(-1, Element.indexOfName("bar fool", "foo"));
+    assertEquals(-1, Element.indexOfName("bar fool baz", "foo"));
+
+    assertEquals(0, Element.indexOfName("foo", "foo"));
+    assertEquals(0, Element.indexOfName("foo bar", "foo"));
+    assertEquals(4, Element.indexOfName("bar foo", "foo"));
+    assertEquals(4, Element.indexOfName("bar foo baz", "foo"));
   }
 
   /**
diff --git a/user/test/com/google/gwt/editor/client/EditorErrorTest.java b/user/test/com/google/gwt/editor/client/EditorErrorTest.java
index 755ebef..0bd7a75 100644
--- a/user/test/com/google/gwt/editor/client/EditorErrorTest.java
+++ b/user/test/com/google/gwt/editor/client/EditorErrorTest.java
@@ -1,12 +1,12 @@
 /*
  * 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
@@ -39,25 +39,43 @@
 
     private EditorDelegate<Address> delegate;
 
+    @Override
     public void flush() {
       delegate.recordError("Hello Errors!", null, null);
     }
 
+    @Override
     public void onPropertyChange(String... paths) {
     }
 
+    @Override
     public void setDelegate(EditorDelegate<Address> delegate) {
       this.delegate = delegate;
     }
 
+    @Override
     public void setValue(Address value) {
     }
   }
 
+  class AddressEditorReceivesErrors extends AddressEditor implements
+      HasEditorErrors<Address> {
+    List<EditorError> errors;
+
+    @Override
+    public void showErrors(List<EditorError> errors) {
+      this.errors = errors;
+      for (EditorError error : errors) {
+        error.setConsumed(true);
+      }
+    }
+  }
+
   class PersonEditorReceivesErrors extends PersonEditor implements
       HasEditorErrors<Person> {
     List<EditorError> errors;
 
+    @Override
     public void showErrors(List<EditorError> errors) {
       this.errors = errors;
       for (EditorError error : errors) {
@@ -86,6 +104,7 @@
 
     private List<EditorError> errors;
 
+    @Override
     public void showErrors(List<EditorError> errors) {
       this.errors = errors;
     }
@@ -107,6 +126,7 @@
 
     List<EditorError> errors;
 
+    @Override
     public void showErrors(List<EditorError> errors) {
       this.errors = errors;
     }
@@ -267,7 +287,7 @@
     assertEquals(driver.getErrors().toString(), 8, driver.getErrors().size());
 
     List<EditorError> list = driver.getErrors();
-    
+
     // All the errors w/ addressEditor are collected first
     EditorError error = list.get(0);
     assertEquals("msg1", error.getMessage());
@@ -284,7 +304,7 @@
     assertSame(e4, error.getUserData());
     assertSame(null, error.getValue());
     assertSame(editor.addressEditor, error.getEditor());
-    
+
     error = list.get(2);
     assertEquals("msg6", error.getMessage());
     assertEquals("address.bogusparent.boguschild", error.getAbsolutePath());
@@ -292,7 +312,7 @@
     assertSame(e6, error.getUserData());
     assertSame(null, error.getValue());
     assertSame(editor.addressEditor, error.getEditor());
-    
+
     error = list.get(3);
     assertEquals("msg8", error.getMessage());
     assertEquals("address.", error.getAbsolutePath());
@@ -300,7 +320,7 @@
     assertSame(e8, error.getUserData());
     assertSame(null, error.getValue());
     assertSame(editor.addressEditor, error.getEditor());
-    
+
     // Then the rest of the errors.
     error = list.get(4);
     assertEquals("msg2", error.getMessage());
@@ -309,7 +329,7 @@
     assertSame(e2, error.getUserData());
     assertSame(null, error.getValue());
     assertSame(editor, error.getEditor());
-    
+
     error = list.get(5);
     assertEquals("msg3", error.getMessage());
     assertEquals("address.city", error.getAbsolutePath());
@@ -324,8 +344,8 @@
     assertEquals("address.city.bogus3", error.getPath());
     assertSame(e5, error.getUserData());
     assertSame(null, error.getValue());
-    assertSame(editor.addressEditor.city, error.getEditor());    
-    
+    assertSame(editor.addressEditor.city, error.getEditor());
+
     error = list.get(7);
     assertEquals("msg7", error.getMessage());
     assertEquals(".", error.getAbsolutePath());
@@ -335,6 +355,46 @@
     assertSame(editor, error.getEditor());
   }
 
+  /**
+   * Test for IndexOutOfBoundsException in getPath() when called on a leaf editor error display.
+   *
+   *  The external bug report: http://code.google.com/p/google-web-toolkit/issues/detail?id=5589
+   */
+  public void testSamePathHasError() {
+    PersonEditorReceivesErrors editor = new PersonEditorReceivesErrors();
+    AddressEditorReceivesErrors addressEditor = new AddressEditorReceivesErrors();
+    editor.addressEditor = addressEditor;
+
+    Address a = new Address();
+    Person p = new Person();
+    p.address = a;
+
+    PersonEditorDriver driver = GWT.create(PersonEditorDriver.class);
+    driver.initialize(editor);
+    driver.edit(p);
+    driver.flush();
+
+    driver.setConstraintViolations(
+        Arrays.<ConstraintViolation<?>>asList(createViolation("samePathError", p, "address")));
+    assertEquals(0, driver.getErrors().size());
+
+    assertEquals(0, editor.errors.size());
+
+
+    List<EditorError> list = addressEditor.errors;
+    assertNotNull(list);
+    assertEquals(1, list.size());
+
+    EditorError error = list.get(0);
+    assertNotNull(error);
+    assertEquals("address", error.getAbsolutePath());
+    assertEquals("samePathError", error.getMessage());
+    assertEquals("", error.getPath());
+    assertNotNull(error.getUserData());
+    assertSame(a, error.getValue());
+    assertSame(addressEditor, error.getEditor());
+  }
+
   private <T> ConstraintViolation<T> createViolation(
       String msg, T rootBean, final String path) {
     return new ConstraintViolationImpl.Builder<T>()
diff --git a/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java b/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
index 9e400fa..8a5481e 100644
--- a/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
+++ b/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
@@ -16,6 +16,8 @@
 package com.google.gwt.editor.client.adapters;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.editor.client.EditorContext;
+import com.google.gwt.editor.client.EditorVisitor;
 import com.google.gwt.editor.client.SimpleBeanEditorDriver;
 import com.google.gwt.event.shared.GwtEvent;
 import com.google.gwt.event.shared.HandlerRegistration;
@@ -205,6 +207,26 @@
     assertEquals(expectedValue, editor.getList());
     assertEquals(expectedValue, hasData.getRowData());
   }
+  
+  /**
+   * See <a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=6959">issue 6959</a>
+   */
+  public void testTraverseSyntheticCompositeEditor() {
+    List<Integer> expectedValue = Arrays.asList(1, 2, 3, 4, 5);
+
+    EditorVisitor visitor = new SyntheticVisitor();
+
+    // check that it won't throw
+    driver.accept(visitor);
+
+    driver.edit(expectedValue);
+
+    // Shouldn't affect the editor and HasData
+    driver.accept(visitor);
+
+    assertEquals(expectedValue, editor.getList());
+    assertEquals(expectedValue, hasData.getRowData());
+  }
 
   @Override
   protected void gwtSetUp() throws Exception {
@@ -213,4 +235,14 @@
     driver = GWT.create(HasDataEditorDriver.class);
     driver.initialize(editor);
   }
+
+  /** A visitor that visits synthetic composite editors. */
+  private static class SyntheticVisitor extends EditorVisitor {
+    public <T> boolean visit(EditorContext<T> ctx) {
+      if (ctx.asCompositeEditor() != null) {
+        ctx.traverseSyntheticCompositeEditor(this);
+      }
+      return true;
+    }
+  }
 }
diff --git a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
index ac9adb3..c5a6cc7 100644
--- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -23,6 +23,7 @@
  */
 public class DoubleTest extends GWTTestCase {
 
+  @Override
   public String getModuleName() {
     return "com.google.gwt.emultest.EmulSuite";
   }
@@ -77,7 +78,7 @@
       // Expected behavior
     }
   }
-  
+
   public void testCompare() {
     assertTrue(Double.compare(Double.NaN, Double.NaN) == 0);
     assertTrue(Double.compare(0.0, Double.NaN) < 0);
@@ -88,14 +89,14 @@
     assertTrue(Double.compare(500.0, 3.0) > 0);
     assertTrue(Double.compare(500.0, 500.0) == 0);
   }
-  
+
   public void testCompareTo() {
     Double zero = new Double(0.0);
     Double three = new Double(3.0);
     Double fiveHundred = new Double(500.0);
     Double infinity = new Double(Double.POSITIVE_INFINITY);
     Double nan = new Double(Double.NaN);
-    
+
     assertTrue(nan.compareTo(nan) == 0);
     assertTrue(zero.compareTo(nan) < 0);
     assertTrue(nan.compareTo(infinity) > 0);
@@ -136,7 +137,7 @@
     assertTrue(
         "Can't parse MAX_VALUE",
         Double.MAX_VALUE == Double.parseDouble(String.valueOf(Double.MAX_VALUE)));
-    
+
     // Test that leading and trailing whitespace is ignored
     // Test that both 'e' and 'E' may be used as the exponent delimiter
     assertTrue(2.56789e1 == Double.parseDouble("2.56789e1"));
@@ -151,12 +152,47 @@
     assertTrue(-2.56789e1 == Double.parseDouble("  -2.56789E1"));
     assertTrue(-2.56789e1 == Double.parseDouble("-2.56789e+01   "));
     assertTrue(-2.56789e1 == Double.parseDouble("   -2.56789E1   "));
-    
+
     // Test that a float/double type suffix is allowed
     assertEquals(1.0d, Double.parseDouble("1.0f"), 0.0);
     assertEquals(1.0d, Double.parseDouble("1.0F"), 0.0);
     assertEquals(1.0d, Double.parseDouble("1.0d"), 0.0);
     assertEquals(1.0d, Double.parseDouble("1.0D"), 0.0);
+
+    // Test NaN/Infinity - issue 7713
+    assertTrue(Double.isNaN(Double.parseDouble("+NaN")));
+    assertTrue(Double.isNaN(Double.parseDouble("NaN")));
+    assertTrue(Double.isNaN(Double.parseDouble("-NaN")));
+    assertEquals(Double.POSITIVE_INFINITY, Double.parseDouble("+Infinity"));
+    assertEquals(Double.POSITIVE_INFINITY, Double.parseDouble("Infinity"));
+    assertEquals(Double.NEGATIVE_INFINITY, Double.parseDouble("-Infinity"));
+
+    // check for parsing some invalid values
+    try {
+      Double.parseDouble("nan");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Double.parseDouble("infinity");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Double.parseDouble("1.2.3");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Double.parseDouble("+-1.2");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Double.parseDouble("1e");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
   }
 
   public void testDoubleBits() {
diff --git a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
index 7c2b559..15c6718 100644
--- a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
@@ -93,6 +93,41 @@
 //        Float.parseFloat(String.valueOf(Float.MAX_VALUE)), 1e31);
 //    assertEquals("Can't parse MIN_VALUE", Float.MIN_VALUE,
 //        Float.parseFloat(String.valueOf(Float.MIN_VALUE)), Float.MIN_VALUE);
+
+    // Test NaN/Infinity - issue 7713
+    assertTrue(Float.isNaN(Float.parseFloat("+NaN")));
+    assertTrue(Float.isNaN(Float.parseFloat("NaN")));
+    assertTrue(Float.isNaN(Float.parseFloat("-NaN")));
+    assertEquals(Float.POSITIVE_INFINITY, Float.parseFloat("+Infinity"));
+    assertEquals(Float.POSITIVE_INFINITY, Float.parseFloat("Infinity"));
+    assertEquals(Float.NEGATIVE_INFINITY, Float.parseFloat("-Infinity"));
+
+    // check for parsing some invalid values
+    try {
+      Float.parseFloat("nan");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Float.parseFloat("infinity");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Float.parseFloat("1.2.3");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Float.parseFloat("+-1.2");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
+    try {
+      Float.parseFloat("1e");
+      fail("Expected NumberFormatException");
+    } catch (NumberFormatException expected) {
+    }
   }
 
   public void testFloatBits() {
diff --git a/user/test/com/google/gwt/emultest/java/lang/LongTest.java b/user/test/com/google/gwt/emultest/java/lang/LongTest.java
index c307636..f1124f6 100644
--- a/user/test/com/google/gwt/emultest/java/lang/LongTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/LongTest.java
@@ -93,6 +93,9 @@
     assertEquals(100000000000L, Long.parseLong("100000000000"));
     assertEquals(-100000000000L, Long.parseLong("-100000000000"));
     assertEquals(10L, Long.parseLong("010"));
+    assertEquals(Long.MAX_VALUE, Long.parseLong("" + Long.MAX_VALUE));
+    // Issue 7308
+    assertEquals(Long.MIN_VALUE, Long.parseLong("" + Long.MIN_VALUE));
     try {
       Long.parseLong("10L");
       fail("expected NumberFormatException");
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
index 2266c08..07b4ebb 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -424,18 +424,27 @@
     assertEquals("", "".toLowerCase());
   }
 
-  /*
-   * TODO: needs rewriting to avoid compiler optimizations.
-   */
   public void testMatch() {
-    assertFalse("1f", "abbbbcd".matches("b*"));
-    assertFalse("2f", "abbbbcd".matches("b+"));
-    assertTrue("3t", "abbbbcd".matches("ab*bcd"));
-    assertTrue("4t", "abbbbcd".matches("ab+cd"));
-    assertTrue("5t", "abbbbcd".matches("ab+bcd"));
-    assertFalse("6f", "abbbbcd".matches(""));
-    assertTrue("7t", "abbbbcd".matches("a.*d"));
-    assertFalse("8f", "abbbbcd".matches("a.*e"));
+    assertFalse("1f", hideFromCompiler("abbbbcd").matches("b*"));
+    assertFalse("2f", hideFromCompiler("abbbbcd").matches("b+"));
+    assertTrue("3t", hideFromCompiler("abbbbcd").matches("ab*bcd"));
+    assertTrue("4t", hideFromCompiler("abbbbcd").matches("ab+cd"));
+    assertTrue("5t", hideFromCompiler("abbbbcd").matches("ab+bcd"));
+    assertFalse("6f", hideFromCompiler("abbbbcd").matches(""));
+    assertTrue("7t", hideFromCompiler("abbbbcd").matches("a.*d"));
+    assertFalse("8f", hideFromCompiler("abbbbcd").matches("a.*e"));
+    // issue #7736
+    assertTrue("9t.1", hideFromCompiler("").matches("(|none)"));
+    assertTrue("9t.2", hideFromCompiler("none").matches("(|none)"));
+    assertFalse("9f.1", hideFromCompiler("ab").matches("(|none)"));
+    assertFalse("9f.2", hideFromCompiler("anoneb").matches("(|none)"));
+    assertTrue("10t", hideFromCompiler("none").matches("^(|none)$"));
+    assertFalse("10f", hideFromCompiler("abbbbcd").matches("^b*$"));
+    assertTrue("11t.1", hideFromCompiler("").matches("|none"));
+    assertTrue("11t.2", hideFromCompiler("none").matches("|none"));
+    assertFalse("11f.1", hideFromCompiler("ab").matches("|none"));
+    assertFalse("11f.2", hideFromCompiler("anoneb").matches("|none"));
+    assertTrue("12t", hideFromCompiler("none").matches("^|none$"));
   }
 
   /*
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
index 981e59a..f3b4a3d 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalArithmeticTest.java
@@ -626,7 +626,7 @@
     BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
     BigDecimal bNumber = BigDecimal.valueOf(0L);
     try {
-      aNumber.divide(bNumber);
+      aNumber = aNumber.divide(bNumber);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Division by zero",
@@ -645,7 +645,7 @@
     BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
     BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
     try {
-      aNumber.divide(bNumber, 100);
+      aNumber = aNumber.divide(bNumber, 100);
       fail("IllegalArgumentException has not been caught");
     } catch (IllegalArgumentException e) {
       assertEquals("Improper exception message", "Invalid rounding mode",
@@ -664,7 +664,7 @@
     BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
     BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale);
     try {
-      aNumber.divide(bNumber, BigDecimal.ROUND_UNNECESSARY);
+      aNumber = aNumber.divide(bNumber, BigDecimal.ROUND_UNNECESSARY);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Rounding necessary",
@@ -735,7 +735,7 @@
     BigDecimal arg1 = new BigDecimal("320.0E+2147483647");
     BigDecimal arg2 = new BigDecimal("6E-2147483647");
     try {
-      arg1.divide(arg2, Integer.MAX_VALUE, RoundingMode.CEILING);
+      arg1 = arg1.divide(arg2, Integer.MAX_VALUE, RoundingMode.CEILING);
       fail("Expected ArithmeticException when dividing with a scale that's too large");
     } catch (ArithmeticException e) {
       // expected behaviour
@@ -1523,17 +1523,20 @@
     
     // 1 digit left of dp, 14 scale + 1
     val = BigDecimal.valueOf(5.43445663479765);
-    val.setScale(val.scale() + 1, RoundingMode.CEILING).round(new
+    val =
+        val.setScale(val.scale() + 1, RoundingMode.CEILING).round(new
         MathContext(1, RoundingMode.CEILING));
 
      // 1 digit left of dp, 13 scale + 2
     val = BigDecimal.valueOf(5.4344566347976);
-    val.setScale(val.scale() + 2, RoundingMode.CEILING).round(new
+    val =
+        val.setScale(val.scale() + 2, RoundingMode.CEILING).round(new
         MathContext(1, RoundingMode.CEILING));
     
     // 2 digits left of dp, 13 scale + 2
     BigDecimal test = BigDecimal.valueOf(12.4344566347976);
-    test.setScale(test.scale() + 1, RoundingMode.CEILING).round(new
+    test =
+        test.setScale(test.scale() + 1, RoundingMode.CEILING).round(new
         MathContext(1, RoundingMode.CEILING));
   }
 
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
index 794309e..474ce3a 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
@@ -248,6 +248,23 @@
   }
 
   /**
+   * Test identical fraction values with different scales.
+   * http://code.google.com/p/google-web-toolkit/issues/detail?id=7834
+   */
+  public void testFractionScale() {
+    BigDecimal a = new BigDecimal("0.02");
+    BigDecimal b = new BigDecimal("0.02000");
+    assertEquals(0, a.compareTo(b));
+
+    BigDecimal a1 = new BigDecimal("0.029900000000000003");
+    BigDecimal a2 = new BigDecimal("0.0001");
+    a = a1.add(a2);
+    // a is 0.030000000000000003 (0.029900000000000003 + 0.0001)
+    b = new BigDecimal("0.03990");
+    assertEquals(-1, a.compareTo(b));
+  }
+
+  /**
    * hashCode() for equal BigDecimals.
    */
   public void testHashCodeEqual() {
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
index aa5765c..15bdee8 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
@@ -687,11 +687,19 @@
   }
 
   /**
-   * Test second failing example in gwt-java-math issue 4.
+   * Test second failing example in gwt-java-math issue 4 and variations
+   * to validate that precision is calculated correctly when leading zeros
+   * and minus signs are present.
    */
   public void testConstrStringWithLeadingZeros() {
-    BigDecimal value = new BigDecimal("-000.1");
-    assertEquals("bad precision", 1, value.precision());
+    assertEquals("bad precision", 1, new BigDecimal("-000.1").precision());
+    assertEquals("bad precision", 4, new BigDecimal("001234").precision());
+    assertEquals("bad precision", 4, new BigDecimal("-5555").precision());
+    assertEquals("bad precision", 1, new BigDecimal("0").precision());
+    assertEquals("bad precision", 1, new BigDecimal("-0").precision());
+    assertEquals("bad precision", 4, new BigDecimal("001234e3").precision());
+    assertEquals("bad precision", 5, new BigDecimal("00056789e+17").precision());
+    assertEquals("bad precision", 6, new BigDecimal("0900000e-42").precision());
   }
 
   /**
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
index 0547078..5f5dd96 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
@@ -512,6 +512,7 @@
   /**
    * valueOf(Double.NaN).
    */
+  @SuppressWarnings("ReturnValueIgnored")
   public void testValueOfDoubleNaN() {
     double a = Double.NaN;
     try {
diff --git a/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java b/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
index 5323bc7..e1b45fb 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalScaleOperationsTest.java
@@ -143,7 +143,7 @@
     int newScale = 18;
     BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
     try {
-      aNumber.setScale(newScale);
+      aNumber = aNumber.setScale(newScale);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Rounding necessary",
@@ -357,7 +357,7 @@
     int shift = -18;
     BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale);
     try {
-      aNumber.movePointRight(shift);
+      aNumber = aNumber.movePointRight(shift);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Underflow", e.getMessage());
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
index 1e119cb..37f569f 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerDivideTest.java
@@ -57,7 +57,7 @@
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     BigInteger bNumber = new BigInteger(bSign, bBytes);
     try {
-      aNumber.divide(bNumber);
+      aNumber = aNumber.divide(bNumber);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "BigInteger divide by zero",
@@ -168,7 +168,7 @@
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     BigInteger bNumber = new BigInteger(bSign, bBytes);
     try {
-      aNumber.remainder(bNumber);
+      aNumber = aNumber.remainder(bNumber);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "BigInteger divide by zero",
@@ -266,7 +266,7 @@
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     BigInteger bNumber = BigInteger.ZERO;
     try {
-      aNumber.divide(bNumber);
+      aNumber = aNumber.divide(bNumber);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "BigInteger divide by zero",
@@ -336,7 +336,7 @@
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     BigInteger bNumber = new BigInteger(bSign, bBytes);
     try {
-      aNumber.mod(bNumber);
+      aNumber = aNumber.mod(bNumber);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message",
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
index a107b6b..33bda42 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
@@ -63,6 +63,7 @@
   /**
    * Test hash codes for the same object.
    */
+  @SuppressWarnings("ReturnValueIgnored")
   public void testSameObject() {
     String value1 = "12378246728727834290276457386374882976782849";
     String value2 = "-5634562095872038262928728727834290276457386374882976782849";
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
index ce676ff..96fb58f 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerModPowTest.java
@@ -173,7 +173,7 @@
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     BigInteger modulus = new BigInteger(mSign, mBytes);
     try {
-      aNumber.modInverse(modulus);
+      aNumber = aNumber.modInverse(modulus);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message",
@@ -234,7 +234,7 @@
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     BigInteger modulus = new BigInteger(mSign, mBytes);
     try {
-      aNumber.modInverse(modulus);
+      aNumber = aNumber.modInverse(modulus);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "BigInteger not invertible.",
@@ -299,7 +299,7 @@
     BigInteger exp = new BigInteger(eSign, eBytes);
     BigInteger modulus = new BigInteger(mSign, mBytes);
     try {
-      aNumber.modPow(exp, modulus);
+      aNumber = aNumber.modPow(exp, modulus);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message",
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
index 06157f4..c9d9eac 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerMultiplyTest.java
@@ -303,7 +303,7 @@
     int exp = -5;
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     try {
-      aNumber.pow(exp);
+      aNumber = aNumber.pow(exp);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Negative exponent",
diff --git a/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java b/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
index 9ef9e27..6e6d3a8 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerOperateBitsTest.java
@@ -149,7 +149,7 @@
     int number = -7;
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     try {
-      aNumber.clearBit(number);
+      aNumber = aNumber.clearBit(number);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Negative bit address",
@@ -459,7 +459,7 @@
     int number = -7;
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     try {
-      aNumber.flipBit(number);
+      aNumber = aNumber.flipBit(number);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Negative bit address",
@@ -768,7 +768,7 @@
     int number = -7;
     BigInteger aNumber = new BigInteger(aSign, aBytes);
     try {
-      aNumber.setBit(number);
+      aNumber = aNumber.setBit(number);
       fail("ArithmeticException has not been caught");
     } catch (ArithmeticException e) {
       assertEquals("Improper exception message", "Negative bit address",
diff --git a/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java b/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java
index 939e75e..e46d534 100644
--- a/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ComparatorTest.java
@@ -25,12 +25,12 @@
  * TODO: document me.
  */
 public class ComparatorTest extends TestComparator {
-  public Comparator makeComparator() {
+  public Comparator<Object> makeComparator() {
     return new DummyComparator();
   }
 
-  public List getComparableObjectsOrdered() {
-    List l = new ArrayList();
+  public List<Object> getComparableObjectsOrdered() {
+    List<Object> l = new ArrayList<Object>();
     l.add("x");
     l.add("y");
     l.add("z");
@@ -41,7 +41,7 @@
 /**
  * List comparator for testing.
  */
-class DummyComparator implements Comparator {
+class DummyComparator implements Comparator<Object> {
   /**
    * Compares returns reverse hash order.
    */
diff --git a/user/test/com/google/gwt/emultest/java/util/HashMapTest.java b/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
index 2f7be81..2b78350 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
@@ -25,12 +25,10 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import java.util.Map.Entry;
 
 /**
  * Tests <code>HashMap</code>.
  */
-@SuppressWarnings("unchecked")
 public class HashMapTest extends TestMap {
   private static final int CAPACITY_16 = 16;
   private static final int CAPACITY_NEG_ONE_HALF = -1;
@@ -90,7 +88,7 @@
   private static final String VALUE_TEST_REMOVE = KEY_TEST_REMOVE + " - value";
   private static final String VALUE_VAL = "value";
 
-  private static void assertEmptyIterator(Iterator it) {
+  private static void assertEmptyIterator(Iterator<?> it) {
     assertNotNull(it);
     assertFalse(it.hasNext());
     try {
@@ -105,7 +103,7 @@
    * 
    * @param hashMap
    */
-  private static void checkEmptyHashMapAssumptions(HashMap hashMap) {
+  private static void checkEmptyHashMapAssumptions(HashMap<?, ?> hashMap) {
     assertNotNull(hashMap);
     assertTrue(hashMap.isEmpty());
 
@@ -130,7 +128,7 @@
   }
 
   public void testAddEqualKeys() {
-    final HashMap expected = new HashMap();
+    final HashMap<Number, Object> expected = new HashMap<Number, Object>();
     assertEquals(expected.size(), 0);
     iterateThrough(expected);
     expected.put(new Long(45), new Object());
@@ -143,7 +141,7 @@
   }
 
   public void testAddWatch() {
-    HashMap m = new HashMap();
+    HashMap<String, String> m = new HashMap<String, String>();
     m.put("watch", "watch");
     assertEquals(m.get("watch"), "watch");
   }
@@ -152,7 +150,7 @@
    * Test method for 'java.util.HashMap.clear()'
    */
   public void testClear() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     hashMap.put("Hello", "Bye");
@@ -168,11 +166,10 @@
    * Test method for 'java.util.HashMap.clone()'
    */
   public void testClone() {
-    HashMap srcMap = new HashMap();
+    HashMap<String, String> srcMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(srcMap);
 
-    // Check empty clone behavior
-    HashMap dstMap = (HashMap) srcMap.clone();
+    HashMap<String, String> dstMap = cloneMap(srcMap);
     assertNotNull(dstMap);
     assertEquals(dstMap.size(), srcMap.size());
     // assertTrue(dstMap.values().toArray().equals(srcMap.values().toArray()));
@@ -183,7 +180,7 @@
     srcMap.put(KEY_1, VALUE_1);
     srcMap.put(KEY_2, VALUE_2);
     srcMap.put(KEY_3, VALUE_3);
-    dstMap = (HashMap) srcMap.clone();
+    dstMap = cloneMap(srcMap);
     assertNotNull(dstMap);
     assertEquals(dstMap.size(), srcMap.size());
 
@@ -196,7 +193,7 @@
    * Test method for 'java.util.HashMap.containsKey(Object)'
    */
   public void testContainsKey() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertFalse(hashMap.containsKey(KEY_TEST_CONTAINS_KEY));
@@ -213,7 +210,7 @@
    * Test method for 'java.util.HashMap.containsValue(Object)'
    */
   public void testContainsValue() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertFalse("check contains of empty map",
@@ -233,18 +230,18 @@
    * Test method for 'java.util.HashMap.entrySet()'
    */
   public void testEntrySet() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
-    Set entrySet = hashMap.entrySet();
+    Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
     assertNotNull(entrySet);
 
     // Check that the entry set looks right
     hashMap.put(KEY_TEST_ENTRY_SET, VALUE_TEST_ENTRY_SET_1);
     entrySet = hashMap.entrySet();
     assertEquals(entrySet.size(), SIZE_ONE);
-    Iterator itSet = entrySet.iterator();
-    Map.Entry entry = (Map.Entry) itSet.next();
+    Iterator<Map.Entry<String, String>> itSet = entrySet.iterator();
+    Map.Entry<String, String> entry = itSet.next();
     assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
     assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_1);
     assertEmptyIterator(itSet);
@@ -254,7 +251,7 @@
     entrySet = hashMap.entrySet();
     assertEquals(entrySet.size(), SIZE_ONE);
     itSet = entrySet.iterator();
-    entry = (Map.Entry) itSet.next();
+    entry = itSet.next();
     assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
     assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_2);
     assertEmptyIterator(itSet);
@@ -268,16 +265,16 @@
    * Used to test the entrySet entry's set method.
    */
   public void testEntrySetEntrySetterNonString() {
-    HashMap hashMap = new HashMap();
+    HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
     hashMap.put(1, 2);
-    Set entrySet = hashMap.entrySet();
-    Entry entry = (Entry) entrySet.iterator().next();
+    Set<Map.Entry<Integer, Integer>> entrySet = hashMap.entrySet();
+    Map.Entry<Integer, Integer> entry = entrySet.iterator().next();
 
     entry.setValue(3);
-    assertEquals(3, hashMap.get(1));
+    assertEquals(3, hashMap.get(1).intValue());
 
     hashMap.put(1, 4);
-    assertEquals(4, entry.getValue());
+    assertEquals(4, entry.getValue().intValue());
 
     assertEquals(1, hashMap.size());
   }
@@ -286,16 +283,16 @@
    * Used to test the entrySet entry's set method.
    */
   public void testEntrySetEntrySetterNull() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
     hashMap.put(null, 2);
-    Set entrySet = hashMap.entrySet();
-    Entry entry = (Entry) entrySet.iterator().next();
+    Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();
+    Map.Entry<String, Integer> entry = entrySet.iterator().next();
 
     entry.setValue(3);
-    assertEquals(3, hashMap.get(null));
+    assertEquals(3, hashMap.get(null).intValue());
 
     hashMap.put(null, 4);
-    assertEquals(4, entry.getValue());
+    assertEquals(4, entry.getValue().intValue());
 
     assertEquals(1, hashMap.size());
   }
@@ -304,10 +301,10 @@
    * Used to test the entrySet entry's set method.
    */
   public void testEntrySetEntrySetterString() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     hashMap.put("A", "B");
-    Set entrySet = hashMap.entrySet();
-    Entry entry = (Entry) entrySet.iterator().next();
+    Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
+    Map.Entry<String, String> entry = entrySet.iterator().next();
 
     entry.setValue("C");
     assertEquals("C", hashMap.get("A"));
@@ -322,12 +319,12 @@
    * Used to test the entrySet remove method.
    */
   public void testEntrySetRemove() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     hashMap.put("A", "B");
-    HashMap dummy = new HashMap();
+    HashMap<String, String> dummy = new HashMap<String, String>();
     dummy.put("A", "b");
-    Entry bogus = (Entry) dummy.entrySet().iterator().next();
-    Set entrySet = hashMap.entrySet();
+    Map.Entry<String, String> bogus = dummy.entrySet().iterator().next();
+    Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
     boolean removed = entrySet.remove(bogus);
     assertEquals(removed, false);
     assertEquals(hashMap.get("A"), "B");
@@ -337,18 +334,23 @@
    * Test method for 'java.util.AbstractMap.equals(Object)'
    */
   public void testEquals() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     hashMap.put(KEY_KEY, VALUE_VAL);
 
-    HashMap copyMap = (HashMap) hashMap.clone();
+    HashMap<String, String> copyMap = cloneMap(hashMap);
 
     assertTrue(hashMap.equals(copyMap));
     hashMap.put(VALUE_VAL, KEY_KEY);
     assertFalse(hashMap.equals(copyMap));
   }
 
+  @SuppressWarnings("unchecked")
+  private HashMap<String, String> cloneMap(HashMap<String, String> hashMap) {
+    return (HashMap<String, String>) hashMap.clone();
+  }
+
   /*
    * Test method for 'java.lang.Object.finalize()'.
    */
@@ -360,7 +362,7 @@
    * Test method for 'java.util.HashMap.get(Object)'.
    */
   public void testGet() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.get(KEY_TEST_GET));
@@ -379,7 +381,7 @@
    * Test method for 'java.util.AbstractMap.hashCode()'.
    */
   public void testHashCode() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     // Check that hashCode changes
@@ -394,7 +396,7 @@
    * Test method for 'java.util.HashMap.HashMap()'.
    */
   public void testHashMap() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
   }
 
@@ -402,13 +404,13 @@
    * Test method for 'java.util.HashMap.HashMap(int)'
    */
   public void testHashMapInt() {
-    HashMap hashMap = new HashMap(CAPACITY_16);
+    HashMap<String, String> hashMap = new HashMap<String, String>(CAPACITY_16);
     checkEmptyHashMapAssumptions(hashMap);
 
     // TODO(mmendez): how do we verify capacity?
     boolean failed = true;
     try {
-      new HashMap(-SIZE_ONE);
+      new HashMap<String, String>(-SIZE_ONE);
     } catch (Throwable ex) {
       if (ex instanceof IllegalArgumentException) {
         failed = false;
@@ -419,7 +421,7 @@
       fail("Failure testing new HashMap(-1)");
     }
 
-    HashMap zeroSizedHashMap = new HashMap(0);
+    HashMap<String, String> zeroSizedHashMap = new HashMap<String, String>(0);
     assertNotNull(zeroSizedHashMap);
   }
 
@@ -427,8 +429,8 @@
    * Test method for 'java.util.HashMap.HashMap(int, float)'
    */
   public void testHashMapIntFloat() {
-
-    HashMap hashMap = new HashMap(CAPACITY_16, LOAD_FACTOR_ONE_HALF);
+    HashMap<String, String> hashMap =
+        new HashMap<String, String>(CAPACITY_16, LOAD_FACTOR_ONE_HALF);
     checkEmptyHashMapAssumptions(hashMap);
 
     // TODO(mmendez): how do we verify capacity and load factor?
@@ -436,7 +438,7 @@
     // Test new HashMap(-1, 0.0F)
     boolean failed = true;
     try {
-      new HashMap(CAPACITY_NEG_ONE_HALF, LOAD_FACTOR_ZERO);
+      new HashMap<String, String>(CAPACITY_NEG_ONE_HALF, LOAD_FACTOR_ZERO);
     } catch (Throwable ex) {
       if (ex instanceof IllegalArgumentException) {
         failed = false;
@@ -450,7 +452,7 @@
     // Test new HashMap(0, -1.0F)
     failed = true;
     try {
-      new HashMap(CAPACITY_ZERO, LOAD_FACTOR_NEG_ONE);
+      new HashMap<String, String>(CAPACITY_ZERO, LOAD_FACTOR_NEG_ONE);
     } catch (Throwable ex) {
       if (ex instanceof IllegalArgumentException) {
         failed = false;
@@ -462,7 +464,7 @@
     }
 
     // Test new HashMap(0,0F);
-    hashMap = new HashMap(CAPACITY_ZERO, LOAD_FACTOR_ONE_TENTH);
+    hashMap = new HashMap<String, String>(CAPACITY_ZERO, LOAD_FACTOR_ONE_TENTH);
     assertNotNull(hashMap);
   }
 
@@ -470,7 +472,7 @@
    * Test method for 'java.util.HashMap.HashMap(Map)'
    */
   public void testHashMapMap() {
-    HashMap srcMap = new HashMap();
+    HashMap<Integer, Integer> srcMap = new HashMap<Integer, Integer>();
     assertNotNull(srcMap);
     checkEmptyHashMapAssumptions(srcMap);
 
@@ -478,16 +480,16 @@
     srcMap.put(INTEGER_2, INTEGER_22);
     srcMap.put(INTEGER_3, INTEGER_33);
 
-    HashMap hashMap = new HashMap(srcMap);
+    HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>(srcMap);
     assertFalse(hashMap.isEmpty());
     assertTrue(hashMap.size() == SIZE_THREE);
 
-    Collection valColl = hashMap.values();
+    Collection<Integer> valColl = hashMap.values();
     assertTrue(valColl.contains(INTEGER_11));
     assertTrue(valColl.contains(INTEGER_22));
     assertTrue(valColl.contains(INTEGER_33));
 
-    Collection keyColl = hashMap.keySet();
+    Collection<Integer> keyColl = hashMap.keySet();
     assertTrue(keyColl.contains(INTEGER_1));
     assertTrue(keyColl.contains(INTEGER_2));
     assertTrue(keyColl.contains(INTEGER_3));
@@ -497,10 +499,10 @@
    * Test method for 'java.util.AbstractMap.isEmpty()'
    */
   public void testIsEmpty() {
-    HashMap srcMap = new HashMap();
+    HashMap<String, String> srcMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(srcMap);
 
-    HashMap dstMap = new HashMap();
+    HashMap<String, String> dstMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(dstMap);
 
     dstMap.putAll(srcMap);
@@ -515,7 +517,7 @@
   }
 
   public void testKeysConflict() {
-    HashMap hashMap = new HashMap();
+    HashMap<Object, String> hashMap = new HashMap<Object, String>();
 
     hashMap.put(STRING_ZERO_KEY, STRING_ZERO_VALUE);
     hashMap.put(INTEGER_ZERO_KEY, INTEGER_ZERO_VALUE);
@@ -542,10 +544,10 @@
    * Test method for 'java.util.HashMap.keySet()'
    */
   public void testKeySet() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
-    Set keySet = hashMap.keySet();
+    Set<String> keySet = hashMap.keySet();
     assertNotNull(keySet);
     assertTrue(keySet.isEmpty());
     assertTrue(keySet.size() == 0);
@@ -589,7 +591,7 @@
    * Test method for 'java.util.HashMap.put(Object, Object)'
    */
   public void testPut() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_1));
@@ -602,7 +604,7 @@
    * Test method for 'java.util.HashMap.putAll(Map)'.
    */
   public void testPutAll() {
-    HashMap srcMap = new HashMap();
+    HashMap<String, String> srcMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(srcMap);
 
     srcMap.put(KEY_1, VALUE_1);
@@ -610,7 +612,7 @@
     srcMap.put(KEY_3, VALUE_3);
 
     // Make sure that the data is copied correctly
-    HashMap dstMap = new HashMap();
+    HashMap<String, String> dstMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(dstMap);
 
     dstMap.putAll(srcMap);
@@ -632,7 +634,7 @@
 
     // Check that an empty map does not blow away the contents of the
     // destination map
-    HashMap emptyMap = new HashMap();
+    HashMap<String, String> emptyMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(emptyMap);
     dstMap.putAll(emptyMap);
     assertTrue(dstMap.size() == srcMap.size());
@@ -667,7 +669,7 @@
    * Test method for 'java.util.HashMap.remove(Object)'.
    */
   public void testRemove() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.remove(null));
@@ -683,7 +685,7 @@
    * Test method for 'java.util.HashMap.size()'.
    */
   public void testSize() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     // Test size behavior on put
@@ -707,7 +709,7 @@
     hashMap.put(KEY_1, VALUE_1);
     hashMap.put(KEY_2, VALUE_2);
     hashMap.put(KEY_3, VALUE_3);
-    HashMap srcMap = new HashMap(hashMap);
+    HashMap<String, String> srcMap = new HashMap<String, String>(hashMap);
     hashMap.putAll(srcMap);
     assertEquals(hashMap.size(), SIZE_THREE);
 
@@ -720,7 +722,7 @@
    * Test method for 'java.util.AbstractMap.toString()'.
    */
   public void testToString() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
     hashMap.put(KEY_KEY, VALUE_VAL);
     String entryString = makeEntryString(KEY_KEY, VALUE_VAL);
@@ -731,33 +733,33 @@
    * Test method for 'java.util.AbstractMap.values()'.
    */
   public void testValues() {
-    HashMap hashMap = new HashMap();
+    HashMap<String, String> hashMap = new HashMap<String, String>();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNotNull(hashMap.values());
 
     hashMap.put(KEY_KEY, VALUE_VAL);
 
-    Collection valColl = hashMap.values();
+    Collection<String> valColl = hashMap.values();
     assertNotNull(valColl);
     assertEquals(valColl.size(), SIZE_ONE);
 
-    Iterator itVal = valColl.iterator();
-    String val = (String) itVal.next();
+    Iterator<String> itVal = valColl.iterator();
+    String val = itVal.next();
     assertEquals(val, VALUE_VAL);
   }
 
+  @SuppressWarnings("rawtypes")
   @Override
   protected Map makeEmptyMap() {
     return new HashMap();
   }
 
-  private Iterator iterateThrough(final HashMap expected) {
-    Iterator iter = expected.entrySet().iterator();
+  private void iterateThrough(final HashMap<?, ?> expected) {
+    Iterator<?> iter = expected.entrySet().iterator();
     for (int i = 0; i < expected.size(); i++) {
       iter.next();
     }
-    return iter;
   }
 
   private String makeEntryString(final String key, final String value) {
diff --git a/user/test/com/google/gwt/emultest/java/util/HashSetTest.java b/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
index 65c7e5a..0a0b793 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
@@ -32,21 +32,23 @@
   }
 
   public void testAddingKeys() {
-    Map map = new HashMap();
-    Set keys = new HashSet(map.keySet());
+    Map<Object, Object> map = new HashMap<Object, Object>();
+    Set<Object> keys = new HashSet<Object>(map.keySet());
     keys.add(new Object()); // Throws exception in IE6 (web-mode) but not GWT
   }
 
   public void testAddWatch() {
-    HashSet s = new HashSet();
+    HashSet<String> s = new HashSet<String>();
     s.add("watch");
     assertTrue(s.contains("watch"));
   }
 
+  @SuppressWarnings("rawtypes")
   protected Set makeEmptySet() {
     return new HashSet();
   }
 
+  @SuppressWarnings("rawtypes")
   public Object makeObject() {
     return new HashSet();
   }
diff --git a/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java b/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
index cea9f19..4ad811a 100644
--- a/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
@@ -24,12 +24,13 @@
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Set;
 
 /**
  * Tests <code>IdentityHashMap</code>.
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class IdentityHashMapTest extends TestMap {
 
   /**
@@ -49,8 +50,6 @@
   }
 
   private static final int CAPACITY_16 = 16;
-  private static final int CAPACITY_NEG_ONE_HALF = -1;
-  private static final int CAPACITY_ZERO = 0;
   private static final Integer INTEGER_1 = new Integer(1);
   private static final Integer INTEGER_11 = new Integer(11);
   private static final Integer INTEGER_2 = new Integer(2);
@@ -71,10 +70,6 @@
   private static final String KEY_TEST_KEY_SET = "testKeySet";
   private static final String KEY_TEST_PUT = "testPut";
   private static final String KEY_TEST_REMOVE = "testRemove";
-  private static final float LOAD_FACTOR_NEG_ONE = -1.0F;
-  private static final float LOAD_FACTOR_ONE_HALF = 0.5F;
-  private static final float LOAD_FACTOR_ONE_TENTH = 0.1F;
-  private static final float LOAD_FACTOR_ZERO = 0.0F;
   private static final Object ODD_ZERO_KEY = new Object() {
     public int hashCode() {
       return 0;
diff --git a/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java b/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
index ed8c804..1d06fd5 100644
--- a/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/LinkedHashMapTest.java
@@ -21,10 +21,10 @@
 
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
 import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 
 /**
  * Tests <code>LinkedHashMap</code>.
@@ -119,8 +119,7 @@
    * 
    * @param hashMap
    */
-  @SuppressWarnings("unchecked") // raw LinkedHashMap
-  private static void checkEmptyLinkedHashMapAssumptions(LinkedHashMap hashMap) {
+  private static void checkEmptyLinkedHashMapAssumptions(LinkedHashMap<?, ?> hashMap) {
     assertNotNull(hashMap);
     assertTrue(hashMap.isEmpty());
 
@@ -754,12 +753,11 @@
    * @param hashMap the LinkedHashMap to be copied
    * @return the copy
    */
-  @SuppressWarnings("unchecked") // raw LinkedHashMap
-  private LinkedHashMap cloneLinkedHashMap(LinkedHashMap hashMap) {
+  private <K, V> LinkedHashMap<K, V> cloneLinkedHashMap(LinkedHashMap<K, V> hashMap) {
     if (GWT.isScript()) {
-      return new LinkedHashMap(hashMap);
+      return new LinkedHashMap<K, V>(hashMap);
     } else {
-      LinkedHashMap m = new LinkedHashMap();
+      LinkedHashMap<K, V> m = new LinkedHashMap<K, V>();
       m.putAll(hashMap);
       return m;
     }
diff --git a/user/test/com/google/gwt/emultest/java/util/StackProfile.java b/user/test/com/google/gwt/emultest/java/util/StackProfile.java
index fa941c9..e755168 100644
--- a/user/test/com/google/gwt/emultest/java/util/StackProfile.java
+++ b/user/test/com/google/gwt/emultest/java/util/StackProfile.java
@@ -45,7 +45,7 @@
   }
 
   public void addTiming(int num) {
-    Stack s = new Stack();
+    Stack<String> s = new Stack<String>();
     resetTimer();
     for (int i = 0; i < num; i++) {
       s.push("item" + i);
diff --git a/user/test/com/google/gwt/emultest/java/util/StackTest.java b/user/test/com/google/gwt/emultest/java/util/StackTest.java
index 28e3930..bcc1070 100644
--- a/user/test/com/google/gwt/emultest/java/util/StackTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/StackTest.java
@@ -25,12 +25,129 @@
  */
 public class StackTest extends GWTTestCase {
 
-  public static final int TEST_SEARCH_SIZE = 10;
-  public static final int TEST_SIZE = 10;
-  public static Stack testStack = new Stack();
+  private static final int TEST_SEARCH_SIZE = 10;
+  private static final int TEST_SIZE = 10;
+
+  /** Sets module name so that javascript compiler can operate. */
+  public String getModuleName() {
+    return "com.google.gwt.emultest.EmulSuite";
+  }
+
+  /** Tests clone on Stacks. */
+  public void testClone() {
+    Stack<Integer> large = createLargeStack();
+    @SuppressWarnings("unchecked")
+    Stack<Integer> cloned = (Stack<Integer>) large.clone();
+    checkLargeStack(cloned, 0);
+    assertEquals(large.size(), TEST_SIZE);
+  }
+
+  /**
+   * Tests pushing many elements into a stack, and seeing if they come out in
+   * order. Also verifies that we get the correct exception when we run out of
+   * elements, and tests peek
+   */
+  public void testCountAndOrderWithPeek() {
+    Stack<Integer> large = new Stack<Integer>();
+    for (int i = 0; i < TEST_SIZE; i++) {
+      large.push(i);
+      assertTrue(large.peek() == i);
+      assertTrue(large.pop() == i);
+      int theFinalInt = i + TEST_SIZE;
+      large.push(theFinalInt);
+      assertTrue(large.peek() == theFinalInt);
+    }
+    checkLargeStack(large, TEST_SIZE);
+  }
+
+  /** tests empty and tries to get emptyStackException as desired. */
+  public void testEmptyAndEmptyStackException() {
+    Stack<String> s = new Stack<String>();
+    String item = "empty1";
+    s.push(item);
+    assertEquals(1, s.size());
+    assertFalse(s.empty());
+    assertEquals(s.pop(), item);
+    checkEmptiness(s);
+  }
+
+  /** Tests pop and peek. */
+  public void testPopAndPeek() {
+    Stack<String> testStack = createStack();
+    int x = testStack.size();
+    Object item = testStack.peek();
+    assertTrue(testStack.pop() == item);
+    assertEquals(x - 1, testStack.size());
+  }
+
+  /** Tests push and peek. */
+  public void testPushAndPeek() {
+    Stack<String> testStack = createStack();
+    int x = testStack.size();
+    String item = "4";
+    testStack.push(item);
+    assertEquals(x + 1, testStack.size());
+    assertTrue(testStack.peek() == item);
+  }
+
+  /**
+   * Tests all combinations of search for a stack that attains a max size of
+   * TEST_SEARCH_SIZE.
+   */
+  public void testSearch() {
+    Stack<Integer> searchStack = new Stack<Integer>();
+    checkEmptiness(searchStack);
+    for (int stackSizeIncreasing = 0; stackSizeIncreasing < TEST_SEARCH_SIZE;
+        stackSizeIncreasing++) {
+      for (int theInt = 0; theInt < stackSizeIncreasing; theInt++) {
+        assertEquals(
+            "Increasing search found", searchStack.search(theInt), searchStack.size() - theInt);
+      }
+      for (int theInt = stackSizeIncreasing; theInt < TEST_SEARCH_SIZE; theInt++) {
+        assertEquals("Increasing not found", searchStack.search(theInt), -1);
+      }
+      searchStack.push(stackSizeIncreasing);
+    }
+    for (int stackSizeDecreasing = TEST_SEARCH_SIZE - 1; stackSizeDecreasing >= 0;
+        stackSizeDecreasing--) {
+      for (int theInt = TEST_SEARCH_SIZE - 1; theInt > stackSizeDecreasing; theInt--) {
+        assertEquals("Search decreasing not found", searchStack.search(theInt), -1);
+      }
+      for (int theInt = stackSizeDecreasing; theInt >= 0; theInt--) {
+        assertEquals(
+            "Search decreasing found", searchStack.search(theInt), searchStack.size() - theInt);
+      }
+      searchStack.pop();
+    }
+    checkEmptiness(searchStack);
+  }
+
+  private void checkLargeStack(Stack<Integer> stack, int offset) {
+    for (int i = TEST_SIZE - 1; i >= 0; i--) {
+      int theObtainedInt = stack.pop();
+      assertEquals(i + offset, theObtainedInt);
+    }
+    checkEmptiness(stack);
+  }
+
+  private Stack<Integer> createLargeStack() {
+    Stack<Integer> large = new Stack<Integer>();
+    for (int i = 0; i < TEST_SIZE; i++) {
+      large.push(i);
+    }
+    return large;
+  }
+  
+  private Stack<String> createStack() {
+    Stack<String> stack = new Stack<String>();
+    stack.push("1");
+    stack.push("2");
+    stack.push("3");
+    return stack;
+  }
 
   /** Checks for emptiness of stack by peeking and popping. */
-  public void checkEmptiness(Stack s) {
+  private void checkEmptiness(Stack<?> s) {
     assertTrue(s.empty());
     try {
       s.pop();
@@ -44,120 +161,4 @@
       }
     }
   }
-
-  /** Sets module name so that javascript compiler can operate. */
-  public String getModuleName() {
-    return "com.google.gwt.emultest.EmulSuite";
-  }
-
-  /** Tests clone on Stacks. */
-  public void testClone() {
-    Stack large = createLargeStack();
-    Stack cloned = (Stack) large.clone();
-    checkLargeStack(cloned, 0);
-    assertEquals(large.size(), TEST_SIZE);
-  }
-
-  /**
-   * Tests pushing many elements into a stack, and seeing if they come out in
-   * order. Also verifies that we get the correct exception when we run out of
-   * elements, and tests peek
-   */
-  public void testCountAndOrderWithPeek() {
-    Stack large = new Stack();
-    for (int i = 0; i < TEST_SIZE; i++) {
-      Integer theInt = new Integer(i);
-      large.push(theInt);
-      assertTrue(large.peek() == theInt);
-      assertTrue(large.pop() == theInt);
-      Integer theFinalInt = new Integer(theInt.intValue() + TEST_SIZE);
-      large.push(theFinalInt);
-      assertTrue(large.peek() == theFinalInt);
-    }
-    checkLargeStack(large, TEST_SIZE);
-  }
-
-  /** tests empty and tries to get emptyStackException as desired. */
-  public void testEmptyAndEmptyStackException() {
-    Stack s = new Stack();
-    String item = "empty1";
-    s.push(item);
-    assertEquals(1, s.size());
-    assertFalse(s.empty());
-    assertEquals(s.pop(), item);
-    checkEmptiness(s);
-  }
-
-  /** Tests pop and peek. */
-  public void testPopAndPeek() {
-    int x = testStack.size();
-    Object item = testStack.peek();
-    assertTrue(testStack.pop() == item);
-    assertEquals(x - 1, testStack.size());
-  }
-
-  /** Tests push and peek. */
-  public void testPushAndPeek() {
-    int x = testStack.size();
-    Object item = "4";
-    testStack.push(item);
-    assertEquals(x + 1, testStack.size());
-    assertTrue(testStack.peek() == item);
-  }
-
-  /**
-   * Tests all combinations of search for a stack that attains a max size of
-   * TEST_SEARCH_SIZE.
-   */
-  public void testSearch() {
-    Stack searchStack = new Stack();
-    checkEmptiness(searchStack);
-    for (int stackSizeIncreasing = 0; stackSizeIncreasing < TEST_SEARCH_SIZE; stackSizeIncreasing++) {
-      for (int theInt = 0; theInt < stackSizeIncreasing; theInt++) {
-        assertEquals("Increasing search found", searchStack.search(new Integer(
-          theInt)), searchStack.size() - theInt);
-      }
-      for (int theInt = stackSizeIncreasing; theInt < TEST_SEARCH_SIZE; theInt++) {
-        assertEquals("Increasing not found", searchStack.search(new Integer(
-          theInt)), -1);
-      }
-      searchStack.push(new Integer(stackSizeIncreasing));
-    }
-    for (int stackSizeDecreasing = TEST_SEARCH_SIZE - 1; stackSizeDecreasing >= 0; stackSizeDecreasing--) {
-      for (int theInt = TEST_SEARCH_SIZE - 1; theInt > stackSizeDecreasing; theInt--) {
-        assertEquals("Search decreasing not found",
-          searchStack.search(new Integer(theInt)), -1);
-      }
-      for (int theInt = stackSizeDecreasing; theInt >= 0; theInt--) {
-        assertEquals("Search decreasing found", searchStack.search(new Integer(
-          theInt)), searchStack.size() - theInt);
-      }
-      searchStack.pop();
-    }
-    checkEmptiness(searchStack);
-  }
-
-  private void checkLargeStack(Stack cloned, int offset) {
-    for (int i = TEST_SIZE - 1; i >= 0; i--) {
-      Integer theObtainedInt = (Integer) cloned.pop();
-      assertEquals(i + offset, theObtainedInt.intValue());
-    }
-    checkEmptiness(cloned);
-  }
-
-  private Stack createLargeStack() {
-    Stack large = new Stack();
-    for (int i = 0; i < TEST_SIZE; i++) {
-      Integer theFinalInt = new Integer(i);
-      large.push(theFinalInt);
-    }
-    return large;
-  }
-
-  static {
-    testStack.push("1");
-    testStack.push("2");
-    testStack.push("3");
-  }
-
 }
diff --git a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
index 30ea28e..59a5f66 100644
--- a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java
@@ -29,11 +29,11 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
-import java.util.Map.Entry;
 
 /**
  * Tests <code>TreeMap</code>.
@@ -943,6 +943,7 @@
     assertEquals(1, keySet.size());
   }
 
+  @SuppressWarnings("unchecked")
   public void testKeySetIteratorRemove() {
     Map<K, V> map = makeFullMap();
     resetFull();
@@ -1541,6 +1542,7 @@
    * 
    * @see java.util.Map#remove(Object)
    */
+  @SuppressWarnings("unchecked")
   public void testRemove_throwsNullPointerException() {
     // The _throwsUnsupportedOperationException version of this test will
     // verify that the method is not supported.
diff --git a/user/test/com/google/gwt/http/RequestTest.gwt.xml b/user/test/com/google/gwt/http/RequestTest.gwt.xml
index 38b75b2..9926f14 100644
--- a/user/test/com/google/gwt/http/RequestTest.gwt.xml
+++ b/user/test/com/google/gwt/http/RequestTest.gwt.xml
@@ -15,6 +15,6 @@
 <module>
   <inherits name='com.google.gwt.user.User' />
 
-  <servlet path='/testRequest'
+  <servlet path='/testRequest/*'
     class='com.google.gwt.http.server.RequestTestServlet' />
 </module>
diff --git a/user/test/com/google/gwt/http/client/RequestTest.java b/user/test/com/google/gwt/http/client/RequestTest.java
index 7046195..0f31fac 100644
--- a/user/test/com/google/gwt/http/client/RequestTest.java
+++ b/user/test/com/google/gwt/http/client/RequestTest.java
@@ -127,4 +127,32 @@
       fail(e.getMessage());
     }
   }
+
+  /*
+   * Checks that the status code is correct when receiving a 204-No-Content. This needs special
+   * handling in IE6-9. See http://code.google.com/p/google-web-toolkit/issues/detail?id=5031
+   */
+  public void test204NoContent() {
+    delayTestFinishForRequest();
+
+    RequestBuilder builder =
+        new RequestBuilder(RequestBuilder.GET, getTestBaseURL() + "204NoContent");
+    try {
+      builder.sendRequest(null, new RequestCallback() {
+
+        @Override
+        public void onResponseReceived(Request request, Response response) {
+          assertEquals(204, response.getStatusCode());
+          finishTest();
+        }
+
+        @Override
+        public void onError(Request request, Throwable exception) {
+          fail(exception.getMessage());
+        }
+      });
+    } catch (RequestException e) {
+      fail(e.getMessage());
+    }
+  }
 }
diff --git a/user/test/com/google/gwt/http/server/RequestTestServlet.java b/user/test/com/google/gwt/http/server/RequestTestServlet.java
index ec631b4..e267650 100644
--- a/user/test/com/google/gwt/http/server/RequestTestServlet.java
+++ b/user/test/com/google/gwt/http/server/RequestTestServlet.java
@@ -29,12 +29,16 @@
 
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
-    try {
-      Thread.sleep(5000);
-    } catch (InterruptedException e) {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
+    if (request.getRequestURI().endsWith("/204NoContent")) {
+      response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+    } else {
+      try {
+        Thread.sleep(5000);
+      } catch (InterruptedException e) {
+        // TODO Auto-generated catch block
+        e.printStackTrace();
+      }
+      response.setStatus(HttpServletResponse.SC_OK);
     }
-    response.setStatus(HttpServletResponse.SC_OK);
   }
 }
diff --git a/user/test/com/google/gwt/i18n/I18NSuite.java b/user/test/com/google/gwt/i18n/I18NSuite.java
index 9906f51..dc1864b 100644
--- a/user/test/com/google/gwt/i18n/I18NSuite.java
+++ b/user/test/com/google/gwt/i18n/I18NSuite.java
@@ -43,6 +43,7 @@
 import com.google.gwt.i18n.client.NumberFormat_fr_Test;
 import com.google.gwt.i18n.client.NumberParse_en_Test;
 import com.google.gwt.i18n.client.NumberParse_fr_Test;
+import com.google.gwt.i18n.client.PolishPluralsTest;
 import com.google.gwt.i18n.client.RuntimeLocalesTest;
 import com.google.gwt.i18n.client.TimeZoneInfoTest;
 import com.google.gwt.i18n.client.TimeZoneTest;
@@ -110,6 +111,7 @@
     suite.addTestSuite(NumberFormat_fr_Test.class);
     suite.addTestSuite(NumberParse_en_Test.class);
     suite.addTestSuite(NumberParse_fr_Test.class);
+    suite.addTestSuite(PolishPluralsTest.class);
     suite.addTestSuite(PropertyCatalogFactoryTest.class);
     suite.addTestSuite(ReflectionMessageInterfaceTest.class);
     suite.addTestSuite(RegionInheritanceTest.class);
diff --git a/user/test/com/google/gwt/i18n/MapTestBase.java b/user/test/com/google/gwt/i18n/MapTestBase.java
index 2901dd2..475a3e4 100644
--- a/user/test/com/google/gwt/i18n/MapTestBase.java
+++ b/user/test/com/google/gwt/i18n/MapTestBase.java
@@ -106,6 +106,7 @@
  * @author Paul Jack
  * @version $Id: TestMap.java,v 1.20.2.1 2004/05/22 12:14:05 scolebourne Exp $
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class MapTestBase extends TestCase {
 
   // These instance variables are initialized with the reset method.
diff --git a/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java b/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java
index 54d4803..7360286 100644
--- a/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java
+++ b/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java
@@ -74,6 +74,11 @@
     assertEquals(9 - 1900, date.getYear());
     assertEquals(12 - 1, date.getMonth());
     assertEquals(2, date.getDate());
+
+    assertEquals(6, parse("dd HHmm", "11 213", 0, date));
+    assertEquals(11, date.getDate());
+    assertEquals(2, date.getHours());
+    assertEquals(13, date.getMinutes());
   }
 
   public void testAmbiguousYear() {
diff --git a/user/test/com/google/gwt/i18n/client/I18N2Test.java b/user/test/com/google/gwt/i18n/client/I18N2Test.java
index c1578c0..0d0c9be 100644
--- a/user/test/com/google/gwt/i18n/client/I18N2Test.java
+++ b/user/test/com/google/gwt/i18n/client/I18N2Test.java
@@ -156,9 +156,9 @@
     String str = timeZoneData.americaLosAngeles();
     TimeZoneInfo tzInfo = TimeZoneInfo.buildTimeZoneData(str);
     TimeZone tz = TimeZone.createTimeZone(tzInfo);
-    assertEquals("in timezone: 2/1/2010 7:04:05 PM", m.inTimezone(date, tz));
+    assertEquals("in timezone: 2/1/2010, 7:04:05 PM", m.inTimezone(date, tz));
 
-    assertEquals("in timezone: 2/1/2010 7:04:05 PM", m.inTimezoneAsSafeHtml(date, tz).asString());
+    assertEquals("in timezone: 2/1/2010, 7:04:05 PM", m.inTimezoneAsSafeHtml(date, tz).asString());
 }
 
   public void testListWithArray() {
@@ -513,9 +513,9 @@
   public void testStaticTimeZone() {
     TestAnnotatedMessages m = GWT.create(TestAnnotatedMessages.class);
     Date date = new Date(Date.UTC(2010 - 1900, 1, 2, 3, 4, 5));
-    assertEquals("in GMT: 2/2/2010 3:04:05 AM", m.gmt(date));
+    assertEquals("in GMT: 2/2/2010, 3:04:05 AM", m.gmt(date));
 
-    assertEquals("in GMT: 2/2/2010 3:04:05 AM", m.gmtAsSafeHtml(date).asString(
+    assertEquals("in GMT: 2/2/2010, 3:04:05 AM", m.gmtAsSafeHtml(date).asString(
         ));
   }
 
diff --git a/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java b/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java
index ede08e8..88da5d9 100644
--- a/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java
+++ b/user/test/com/google/gwt/i18n/client/I18N_nb_Test.java
@@ -64,6 +64,6 @@
     currencyData = currencyList.lookup("RUB");
     assertNotNull(currencyData);
     assertEquals("RUB", currencyData.getCurrencyCode());
-    assertEquals("руб", currencyData.getCurrencySymbol());
+    assertEquals("руб.", currencyData.getCurrencySymbol());
   }
 }
diff --git a/user/test/com/google/gwt/i18n/client/PolishPluralsTest.java b/user/test/com/google/gwt/i18n/client/PolishPluralsTest.java
new file mode 100644
index 0000000..df9e59b
--- /dev/null
+++ b/user/test/com/google/gwt/i18n/client/PolishPluralsTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012 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.i18n.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Tests Polish plurals, which is one of the most complicated.
+ */
+public class PolishPluralsTest extends GWTTestCase {
+
+  /**
+   * Shorter message for just testing that Polish plurals work properly.
+   */
+  public interface PluralMessage extends Messages {
+    @DefaultMessage("{0} widgets-few")
+    @AlternateMessage({"one", "A widget"})
+    String pluralWidgetsOther(@PluralCount int count);
+  }
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.i18n.I18NTest_pl";
+  }
+
+  public void testPlurals() {
+    // Note that all text is actually in English, but written according to
+    // Polish plural rules.
+    PluralMessage m = GWT.create(PluralMessage.class);
+    assertEquals("(Polish many) 0 widgets", m.pluralWidgetsOther(0));
+    assertEquals("(Polish one) A widget", m.pluralWidgetsOther(1));
+    assertEquals("(Polish few) 2 widgets", m.pluralWidgetsOther(2));
+    assertEquals("(Polish few) 3 widgets", m.pluralWidgetsOther(3));
+    assertEquals("(Polish few) 4 widgets", m.pluralWidgetsOther(4));
+    assertEquals("(Polish many) 5 widgets", m.pluralWidgetsOther(5));
+    assertEquals("(Polish many) 10 widgets", m.pluralWidgetsOther(10));
+    assertEquals("(Polish many) 11 widgets", m.pluralWidgetsOther(11));
+    assertEquals("(Polish many) 12 widgets", m.pluralWidgetsOther(12));
+    assertEquals("(Polish many) 13 widgets", m.pluralWidgetsOther(13));
+    assertEquals("(Polish many) 14 widgets", m.pluralWidgetsOther(14));
+    assertEquals("(Polish many) 15 widgets", m.pluralWidgetsOther(15));
+    assertEquals("(Polish many) 20 widgets", m.pluralWidgetsOther(20));
+    assertEquals("(Polish many) 21 widgets", m.pluralWidgetsOther(21));
+    assertEquals("(Polish few) 22 widgets", m.pluralWidgetsOther(22));
+    assertEquals("(Polish few) 23 widgets", m.pluralWidgetsOther(23));
+    assertEquals("(Polish few) 24 widgets", m.pluralWidgetsOther(24));
+    assertEquals("(Polish many) 25 widgets", m.pluralWidgetsOther(25));
+    assertEquals("(Polish many) 99 widgets", m.pluralWidgetsOther(99));
+    assertEquals("(Polish many) 100 widgets", m.pluralWidgetsOther(100));
+    assertEquals("(Polish many) 101 widgets", m.pluralWidgetsOther(101));
+    assertEquals("(Polish few) 102 widgets", m.pluralWidgetsOther(102));
+    assertEquals("(Polish few) 103 widgets", m.pluralWidgetsOther(103));
+    assertEquals("(Polish few) 104 widgets", m.pluralWidgetsOther(104));
+    assertEquals("(Polish many) 105 widgets", m.pluralWidgetsOther(105));
+  }
+}
diff --git a/user/test/com/google/gwt/i18n/client/PolishPluralsTest_PluralMessage_pl.properties b/user/test/com/google/gwt/i18n/client/PolishPluralsTest_PluralMessage_pl.properties
new file mode 100644
index 0000000..ee22380
--- /dev/null
+++ b/user/test/com/google/gwt/i18n/client/PolishPluralsTest_PluralMessage_pl.properties
@@ -0,0 +1,4 @@
+pluralWidgetsOther=(Polish other) {0} widgets
+pluralWidgetsOther[one]=(Polish one) A widget
+pluralWidgetsOther[few]=(Polish few) {0} widgets
+pluralWidgetsOther[many]=(Polish many) {0} widgets
diff --git a/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html b/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html
index 1ae3c80..a998bc9 100644
--- a/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html
+++ b/user/test/com/google/gwt/i18n/public_es_AR/junit-standards.html
@@ -53,12 +53,12 @@
 }
 
 function loadSelectionScript() {
-  var moduleName = document.location.href;
+  var moduleName = location.pathname;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'><\/script>");
+  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
 }
 loadSelectionScript();
 -->
diff --git a/user/test/com/google/gwt/i18n/public_es_AR/junit.html b/user/test/com/google/gwt/i18n/public_es_AR/junit.html
index e30fb7b..31c0114 100644
--- a/user/test/com/google/gwt/i18n/public_es_AR/junit.html
+++ b/user/test/com/google/gwt/i18n/public_es_AR/junit.html
@@ -52,12 +52,12 @@
 }
 
 function loadSelectionScript() {
-  var moduleName = document.location.href;
+  var moduleName = location.pathname;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
+  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
 }
 loadSelectionScript();
 -->
diff --git a/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html b/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html
index da44249..db0b393 100644
--- a/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html
+++ b/user/test/com/google/gwt/i18n/public_es_MX/junit-standards.html
@@ -53,12 +53,12 @@
 }
 
 function loadSelectionScript() {
-  var moduleName = document.location.href;
+  var moduleName = location.pathname;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'><\/script>");
+  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
 }
 loadSelectionScript();
 -->
diff --git a/user/test/com/google/gwt/i18n/public_es_MX/junit.html b/user/test/com/google/gwt/i18n/public_es_MX/junit.html
index 0de069d..924012c 100644
--- a/user/test/com/google/gwt/i18n/public_es_MX/junit.html
+++ b/user/test/com/google/gwt/i18n/public_es_MX/junit.html
@@ -52,12 +52,12 @@
 }
 
 function loadSelectionScript() {
-  var moduleName = document.location.href;
+  var moduleName = location.pathname;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
+  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
 }
 loadSelectionScript();
 -->
diff --git a/user/test/com/google/gwt/junit/ExpectedFailure.java b/user/test/com/google/gwt/junit/ExpectedFailure.java
new file mode 100644
index 0000000..dc76900
--- /dev/null
+++ b/user/test/com/google/gwt/junit/ExpectedFailure.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2012 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.junit;
+
+import junit.framework.AssertionFailedError;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * An annotation to mark test cases where the expected result is a failure.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExpectedFailure {
+  String withMessage() default "";
+
+  Class<? extends Throwable> withType() default AssertionFailedError.class;
+}
diff --git a/user/test/com/google/gwt/junit/ForwardingTestResult.java b/user/test/com/google/gwt/junit/ForwardingTestResult.java
new file mode 100644
index 0000000..22c3cb8
--- /dev/null
+++ b/user/test/com/google/gwt/junit/ForwardingTestResult.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2012 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.junit;
+
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestFailure;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+
+import java.util.Enumeration;
+
+/**
+ * A {@link TestResult} that forwards calls to the provided delegate with the exception of
+ * {@link #run} and {@link #runProtected} as these two methods just call other methods that a
+ * subclass of ForwardingTestResult might override.
+ */
+abstract class ForwardingTestResult extends TestResult {
+  private TestResult delegate;
+
+  public ForwardingTestResult(TestResult result) {
+    delegate = result;
+  }
+
+  public void addError(Test test, Throwable t) {
+    delegate.addError(test, t);
+  }
+
+  public void addFailure(Test test, AssertionFailedError t) {
+    delegate.addFailure(test, t);
+  }
+
+  public void addListener(TestListener listener) {
+    delegate.addListener(listener);
+  }
+
+  public void removeListener(TestListener listener) {
+    delegate.removeListener(listener);
+  }
+
+  public void endTest(Test test) {
+    delegate.endTest(test);
+  }
+
+  public int errorCount() {
+    return delegate.errorCount();
+  }
+
+  public Enumeration<TestFailure> errors() {
+    return delegate.errors();
+  }
+
+  public int failureCount() {
+    return delegate.failureCount();
+  }
+
+  public Enumeration<TestFailure> failures() {
+    return delegate.failures();
+  }
+
+  public int runCount() {
+    return delegate.runCount();
+  }
+
+  public boolean shouldStop() {
+    return delegate.shouldStop();
+  }
+
+  public void startTest(Test test) {
+    delegate.startTest(test);
+  }
+
+  public void stop() {
+    delegate.stop();
+  }
+
+  public boolean wasSuccessful() {
+    return delegate.wasSuccessful();
+  }
+}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/junit/GwtTestSuiteWithExpectedFailures.java b/user/test/com/google/gwt/junit/GwtTestSuiteWithExpectedFailures.java
new file mode 100644
index 0000000..2b3ebf4
--- /dev/null
+++ b/user/test/com/google/gwt/junit/GwtTestSuiteWithExpectedFailures.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 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.junit;
+
+import com.google.gwt.junit.tools.GWTTestSuite;
+
+import junit.framework.TestResult;
+
+/**
+ * A {@link GWTTestSuite} that can interpret {@link ExpectedFailure} on test methods.
+ */
+class GwtTestSuiteWithExpectedFailures extends GWTTestSuite {
+
+  public GwtTestSuiteWithExpectedFailures(String name) {
+    super(name);
+  }
+
+  @Override
+  public void run(TestResult result) {
+    super.run(decorateResult(result));
+  }
+
+  private TestResult decorateResult(TestResult result) {
+    return new TestResultWithExpectedFailures(result);
+  }
+}
diff --git a/user/test/com/google/gwt/junit/JUnitSuite.java b/user/test/com/google/gwt/junit/JUnitSuite.java
index e225dff..eba96f3 100644
--- a/user/test/com/google/gwt/junit/JUnitSuite.java
+++ b/user/test/com/google/gwt/junit/JUnitSuite.java
@@ -16,24 +16,29 @@
 package com.google.gwt.junit;
 
 import com.google.gwt.junit.client.DevModeOnCompiledScriptTest;
+import com.google.gwt.junit.client.GWTTestCaseAsyncTest;
+import com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest;
 import com.google.gwt.junit.client.GWTTestCaseTest;
 import com.google.gwt.junit.client.PropertyDefiningGWTTest;
-import com.google.gwt.junit.tools.GWTTestSuite;
 
 import junit.framework.Test;
+import junit.framework.TestSuite;
 
 /**
  * Tests of the junit package.
  */
 public class JUnitSuite {
   public static Test suite() {
-    GWTTestSuite suite = new GWTTestSuite(
-        "Test for suite for com.google.gwt.junit");
+    TestSuite suite = new GwtTestSuiteWithExpectedFailures("Test suite for com.google.gwt.junit");
 
     // client
     // Suppressed due to flakiness on Linux
     // suite.addTestSuite(BenchmarkTest.class);
+
     suite.addTestSuite(GWTTestCaseTest.class);
+    suite.addTest(new TestSuiteWithOrder(GWTTestCaseAsyncTest.class));
+    suite.addTest(new TestSuiteWithOrder(GWTTestCaseSetupTearDownTest.class));
+
     suite.addTestSuite(DevModeOnCompiledScriptTest.class);
 
     // Must run after a GWTTestCase so JUnitShell is initialized.
@@ -45,9 +50,8 @@
     suite.addTestSuite(JUnitMessageQueueTest.class);
     suite.addTestSuite(GWTTestCaseNoClientTest.class);
 
-    // These two are intended only to be run manually. See class comments
+    // Intended only to be run manually. See class comments
     // suite.addTestSuite(ParallelRemoteTest.class);
-    // suite.addTestSuite(TestManualAsync.class);
 
     // remote
     // Run manually only, launches servers that die on port contention
diff --git a/user/test/com/google/gwt/junit/TestResultWithExpectedFailures.java b/user/test/com/google/gwt/junit/TestResultWithExpectedFailures.java
new file mode 100644
index 0000000..555d8da
--- /dev/null
+++ b/user/test/com/google/gwt/junit/TestResultWithExpectedFailures.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2012 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.junit;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestResult;
+
+import java.lang.reflect.Method;
+
+/**
+ * A {@link TestResult} that can interpret {@link ExpectedFailure} on test methods.
+ */
+class TestResultWithExpectedFailures extends ForwardingTestResult {
+
+  private boolean failed;
+
+  public TestResultWithExpectedFailures(TestResult delegate) {
+    super(delegate);
+  }
+
+  @Override
+  public void startTest(Test test) {
+    failed = false;
+    super.startTest(test);
+  }
+
+  @Override
+  public void addFailure(Test test, AssertionFailedError t) {
+    failed = true;
+    if (isAnExpectedException(test, t)) {
+      return; // This is a good kind of failure, do not report it.
+    }
+    super.addFailure(test, t);
+  }
+
+  @Override
+  public void addError(Test test, Throwable t) {
+    failed = true;
+    if (isAnExpectedException(test, t)) {
+      return; // This is a good kind of failure, do not report it.
+    }
+    super.addError(test, t);
+  }
+
+  @Override
+  public void endTest(Test test) {
+    if (!failed && isTestExpectedToFail(test)) {
+      // Test should have failed but didn't. Report the failure by calling the super directly to
+      // prevent any interference from overridden #addFailure.
+      super.addFailure(test, new AssertionFailedError("Expected failure but didn't fail"));
+    }
+    super.endTest(test);
+  }
+
+  private boolean isTestExpectedToFail(Test test) {
+    return getExpectedFailureAnnotation(test) != null;
+  }
+
+  private boolean isAnExpectedException(Test test, Throwable t) {
+    ExpectedFailure annotation = getExpectedFailureAnnotation(test);
+    if (annotation != null) {
+      t = normalizeGwtTestException(t);
+      return t.getClass().isAssignableFrom(annotation.withType())
+          && getExceptionMessage(t).contains(annotation.withMessage());
+    }
+    return false;
+  }
+
+  /**
+   * Extracts the real exception from the {@code RuntimeException} thrown by GwtTestCase.
+   */
+  private Throwable normalizeGwtTestException(Throwable t) {
+    // GWTTestCase replaces AssertionFailedError with RuntimeException and for all other exceptions
+    // it puts them into 'cause' property.
+    return t.getCause() == null ? new AssertionFailedError(t.getMessage()) : t.getCause();
+  }
+
+  private String getExceptionMessage(Throwable t) {
+    return t.getMessage() == null ? "" : t.getMessage();
+  }
+
+  private ExpectedFailure getExpectedFailureAnnotation(Test test) {
+    if (test instanceof TestCase) {
+      TestCase testCase = (TestCase) test;
+      try {
+        Method testMethod = testCase.getClass().getMethod(testCase.getName());
+        return testMethod.getAnnotation(ExpectedFailure.class);
+      } catch (NoSuchMethodException e) {
+        throw new RuntimeException(e);
+      }
+    }
+    return null;
+  }
+}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/junit/TestSuiteWithOrder.java b/user/test/com/google/gwt/junit/TestSuiteWithOrder.java
new file mode 100644
index 0000000..459b477
--- /dev/null
+++ b/user/test/com/google/gwt/junit/TestSuiteWithOrder.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 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.junit;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Arrays;
+import java.util.Comparator;
+
+/**
+ * Add {@link TestSuite} that runs test cases in alphabetical order.
+ */
+class TestSuiteWithOrder extends TestSuite {
+
+  /*
+   * Implementation Note: When batching is active, TestModuleInfo in GWTTestCase#ALL_GWT_TESTS
+   * accidentally forces the test execution order that is derived from first time the TestCase is
+   * instantiated. The implementation of this class should guarantee the order not only by sorting
+   * TestCases but also creating them in order.
+   */
+
+  public TestSuiteWithOrder(Class<? extends TestCase> clazz) {
+    for (Class<?> c = clazz; Test.class.isAssignableFrom(c); c = c.getSuperclass()) {
+      for (Method each : getDeclaredMethods(c)) {
+        if (isTestMethod(each)) {
+          addTestMethod(each, clazz);
+        }
+      }
+    }
+    if (countTestCases() == 0) {
+      addTest(warning("No tests found in " + clazz.getName()));
+    }
+  }
+
+  private void addTestMethod(Method m, Class<?> theClass) {
+    if (!Modifier.isPublic(m.getModifiers())) {
+      addTest(warning("Test method isn't public: " + m.getName() + "(" + theClass.getName() + ")"));
+      return;
+    }
+    addTest(createTest(theClass, m.getName()));
+  }
+
+  private boolean isTestMethod(Method m) {
+    return m.getParameterTypes().length == 0
+        && m.getName().startsWith("test")
+        && m.getReturnType().equals(Void.TYPE);
+  }
+
+  private Method[] getDeclaredMethods(Class<?> clazz) {
+    Method[] methods = clazz.getDeclaredMethods();
+    Arrays.sort(methods, new Comparator<Method>() {
+      @Override
+      public int compare(Method m1, Method m2) {
+        return m1.toString().compareTo(m2.toString());
+      }
+    });
+    return methods;
+  }
+}
diff --git a/user/test/com/google/gwt/junit/client/GWTTestCaseAsyncTest.java b/user/test/com/google/gwt/junit/client/GWTTestCaseAsyncTest.java
new file mode 100644
index 0000000..5342fa0
--- /dev/null
+++ b/user/test/com/google/gwt/junit/client/GWTTestCaseAsyncTest.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2012 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.junit.client;
+
+import com.google.gwt.dom.client.ButtonElement;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.junit.ExpectedFailure;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.EventListener;
+import com.google.gwt.user.client.Timer;
+
+/**
+ * This class tests GwtTestCase in async mode.
+ *
+ * Note: This test requires some test methods to be executed in a specific order.
+ */
+public class GWTTestCaseAsyncTest extends GWTTestCase {
+
+  public String getModuleName() {
+    return "com.google.gwt.junit.JUnit";
+  }
+
+  // The following tests (all prefixed with test_) are intended to test the
+  // interaction of synchronous failures (within event handlers) with various
+  // other types of failures and successes. All of them are expected to fail
+  // with the message "Expected failure".
+  //
+  // Nomenclature for these tests:
+  // DTF => delayTestFinish()
+  // SF => synchronous failure (from event handler)
+  // FT => finishTest()
+  // F => fail()
+  // R => return;
+
+  @ExpectedFailure(withMessage = "test_dtf_sf")
+  public void test_dtf_sf() {
+    delayTestFinish();
+    synchronousFailure("test_dtf_sf");
+  }
+
+  @ExpectedFailure(withMessage = "test_dtf_sf_f")
+  public void test_dtf_sf_f() {
+    delayTestFinish();
+    synchronousFailure("test_dtf_sf_f");
+    failNow("test_dtf_sf_f");
+  }
+
+  @ExpectedFailure(withMessage = "test_dtf_sf_ft")
+  public void test_dtf_sf_ft() {
+    delayTestFinish();
+    synchronousFailure("test_dtf_sf_ft");
+    finishTest();
+  }
+
+  // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7846
+  @ExpectedFailure(withMessage = "test_dtf_sf_r_f")
+  public void _suppressed_test_dtf_sf_r_f() {
+    delayTestFinish();
+    synchronousFailure("test_dtf_sf_r_f");
+    failLater("test_dtf_sf_r_f");
+  }
+
+  @ExpectedFailure(withMessage = "test_dtf_sf_r_ft")
+  public void test_dtf_sf_r_ft() {
+    delayTestFinish();
+    synchronousFailure("test_dtf_sf_r_ft");
+    finishTestLater();
+  }
+
+  @ExpectedFailure(withMessage = "test_sf")
+  public void test_sf() {
+    synchronousFailure("test_sf");
+  }
+
+  @ExpectedFailure(withMessage = "test_sf_dtf_f")
+  public void test_sf_dtf_f() {
+    synchronousFailure("test_sf_dtf_f");
+    delayTestFinish();
+    failNow("test_sf_dtf_f");
+  }
+
+  @ExpectedFailure(withMessage = "test_sf_dtf_ft")
+  public void test_sf_dtf_ft() {
+    synchronousFailure("test_sf_dtf_ft");
+    delayTestFinish();
+    finishTest();
+  }
+
+  // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7846
+  @ExpectedFailure(withMessage = "test_sf_dtf_r_f")
+  public void _suppressed_test_sf_dtf_r_f() {
+    synchronousFailure("test_sf_dtf_r_f");
+    delayTestFinish();
+    failLater("test_sf_dtf_r_f");
+  }
+
+  @ExpectedFailure(withMessage = "test_sf_dtf_r_ft")
+  public void test_sf_dtf_r_ft() {
+    synchronousFailure("test_sf_dtf_r_ft");
+    delayTestFinish();
+    finishTestLater();
+  }
+
+  @ExpectedFailure(withMessage = "test_sf_f")
+  public void test_sf_f() {
+    synchronousFailure("test_sf_f");
+    failNow("test_sf_f");
+  }
+
+  /**
+   * Fails normally.
+   */
+  @ExpectedFailure(withMessage = "testDelayFail")
+  public void testDelayFail() {
+    delayTestFinish(100);
+    fail("testDelayFail");
+    finishTest();
+  }
+
+  /**
+   * Completes normally.
+   */
+  public void testDelayNormal() {
+    delayTestFinish(100);
+    finishTest();
+  }
+
+  @ExpectedFailure(withMessage = "testFailAsync")
+  public void testFailAsync() {
+    delayTestFinish(1000);
+    failLater("testFailAsync");
+  }
+
+  // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7846
+  public void _suppressed_testLateFail() {
+    // Kickoff timer to fail the test in the middle of next one.
+    failLater("testLateFail", 2000);
+  }
+
+  /**
+   * Second half of the previous test.
+   */
+  public void _suppressed_testLateFail_assert() {
+    delayTestFinish(3000);
+    finishTestLater(2500);
+    // fail() call from previous test case should not cause a failure here.
+  }
+
+  public void testLateFinish() {
+    // Kickoff timer to finish test in the middle of next one.
+    finishTestLater(2000);
+  }
+
+  /**
+   * Second half of the previous test.
+   */
+  @ExpectedFailure(withType = TimeoutException.class)
+  public void testLateFinish_assert() {
+    delayTestFinish(3000);
+    // finishTest() call from previous test case should not prevent the timeout here.
+  }
+
+  public void testSpuriousFinishTest() {
+    try {
+      finishTest();
+      fail("finishTest should have failed");
+    } catch (IllegalStateException e) {
+    }
+  }
+
+  @ExpectedFailure(withType = TimeoutException.class)
+  public void testTimeoutAsync() {
+    delayTestFinish(100);
+    finishTestLater(200);
+  }
+
+  public void testNormalAsync() {
+    delayTestFinish(200);
+    finishTestLater(100);
+  }
+
+  public void testRepeatingNormalAsync() {
+    delayTestFinish(200);
+    new Timer() {
+      private int i = 0;
+
+      public void run() {
+        if (++i < 4) {
+          delayTestFinish(200);
+        } else {
+          cancel();
+          finishTest();
+        }
+      }
+    }.scheduleRepeating(100);
+  }
+
+  // Call delayTestFinish() with enough time so that failLater() will definitely fail.
+  private void delayTestFinish() {
+    delayTestFinish(2500);
+  }
+
+  private void failLater(String failMsg) {
+    failLater(failMsg, 100);
+  }
+
+  private void failLater(final String failMsg, int delay) {
+    new Timer() {
+      @Override
+      public void run() {
+        failNow(failMsg);
+      }
+    }.schedule(delay);
+  }
+
+  private void failNow(String failMsg) {
+    fail("Expected failure (" + failMsg + ")");
+  }
+
+  private void finishTestLater() {
+    finishTestLater(1);
+  }
+
+  private void finishTestLater(int delay) {
+    new Timer() {
+      @Override
+      public void run() {
+        finishTest();
+      }
+    }.schedule(delay);
+  }
+
+  // Trigger a test failure synchronously, but from within an event handler.
+  // (The exception thrown from fail() will get caught by the GWT UncaughtExceptionHandler).
+  private void synchronousFailure(final String failMsg) {
+    ButtonElement btn = Document.get().createPushButtonElement();
+    Document.get().getBody().appendChild(btn);
+    Event.sinkEvents(btn, Event.ONCLICK);
+
+    EventListener listener = new EventListener() {
+      public void onBrowserEvent(Event event) {
+        failNow(failMsg);
+      }
+    };
+
+    DOM.setEventListener(btn.<com.google.gwt.user.client.Element>cast(), listener);
+    btn.click();
+  }
+}
diff --git a/user/test/com/google/gwt/junit/client/GWTTestCaseSetupTearDownTest.java b/user/test/com/google/gwt/junit/client/GWTTestCaseSetupTearDownTest.java
new file mode 100644
index 0000000..d93cef2
--- /dev/null
+++ b/user/test/com/google/gwt/junit/client/GWTTestCaseSetupTearDownTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2012 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.junit.client;
+
+import static com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest.SetUpTearDownState.SETUP;
+import static com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest.SetUpTearDownState.TEARDOWN;
+import static com.google.gwt.junit.client.GWTTestCaseSetupTearDownTest.SetUpTearDownState.TESTCASE;
+
+import com.google.gwt.junit.ExpectedFailure;
+import com.google.gwt.user.client.Timer;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * This class tests {@link GWTTestCase#setUp()} and {@link GWTTestCase#tearDown()}.
+ *
+ * Note: This test requires some test methods to be executed in a specific order.
+ */
+public class GWTTestCaseSetupTearDownTest extends GWTTestCase {
+
+  public String getModuleName() {
+    return "com.google.gwt.junit.JUnit";
+  }
+
+  /**
+   * Tracks setup, teardown and testcase runs.
+   */
+  protected enum SetUpTearDownState {
+    SETUP, TEARDOWN, TESTCASE
+  }
+
+  private static List<SetUpTearDownState> executions = new ArrayList<SetUpTearDownState>();
+
+  @Override
+  protected void gwtSetUp() {
+    executions.add(SETUP);
+  }
+
+  @Override
+  protected void gwtTearDown() {
+    executions.add(TEARDOWN);
+  }
+
+  /**
+   * This pseudo testcase for recording setup/testcase/teardown order.
+   */
+  public void testSetUpTearDown() {
+    executions.add(TESTCASE);
+  }
+
+  /**
+   * Delays test finish.
+   */
+  public void testSetUpTearDownAsync() {
+    delayTestFinish(1000);
+    new Timer() {
+      @Override
+      public void run() {
+        executions.add(TESTCASE);
+        finishTest();
+      }
+    }.schedule(1);
+  }
+
+  /**
+   * Fails.
+   */
+  @ExpectedFailure
+  public void testSetUpTearDownFail() {
+    executions.add(TESTCASE);
+    fail();
+  }
+
+  /**
+   * Fails with delayed test finish.
+   */
+  @ExpectedFailure(withMessage = "testSetUpTearDownFailAsync")
+  public void testSetUpTearDownFailSync() {
+    executions.add(TESTCASE);
+    delayTestFinish(1000);
+    fail("testSetUpTearDownFailAsync");
+  }
+
+  /**
+   * Fails async.
+   */
+  @ExpectedFailure(withMessage = "testSetUpTearDownFailAsync")
+  public void testSetUpTearDownFailAsync() {
+    delayTestFinish(1000);
+    new Timer() {
+      @Override
+      public void run() {
+        executions.add(TESTCASE);
+        fail("testSetUpTearDownFailAsync");
+      }
+    }.schedule(1);
+  }
+
+  /**
+   * Times out async.
+   */
+  @ExpectedFailure(withType = TimeoutException.class)
+  public void testSetUpTearDownTimeout() {
+    executions.add(TESTCASE);
+    delayTestFinish(1);
+  }
+
+  /**
+   * This is the last test to be is executed (under_score forces that). Will assert all setups &
+   * teardowns.
+   */
+  public void test_assertAllSetUpTearDowns() {
+    // These list needs to kept in alphabetical order for correct failure messaging.
+    final String[] testCases = {
+        "testSetUpTearDown",
+        "testSetUpTearDownAsync",
+        "testSetUpTearDownFail",
+        "testSetUpTearDownFailAsync",
+        "testSetUpTearDownFailSync",
+        "testSetUpTearDownTimeout"};
+
+    Iterator<SetUpTearDownState> iterator = executions.iterator();
+    for (String testCase : testCases) {
+      assertSame(testCase, SETUP, iterator.next());
+      assertSame(testCase, TESTCASE, iterator.next());
+      assertSame(testCase, TEARDOWN, iterator.next());
+    }
+    assertSame(SETUP, iterator.next()); // one last setup call for this test case
+    assertFalse(iterator.hasNext());
+  }
+}
diff --git a/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java b/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java
index 2d151f4..1146b89 100644
--- a/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java
+++ b/user/test/com/google/gwt/junit/client/GWTTestCaseTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,43 +20,22 @@
  */
 package com.google.gwt.junit.client;
 
-import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.INITIAL;
-import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_SETUP;
-import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_TORNDOWN;
-
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JavaScriptException;
 import com.google.gwt.junit.DoNotRunWith;
+import com.google.gwt.junit.ExpectedFailure;
 import com.google.gwt.junit.Platform;
-import com.google.gwt.user.client.Timer;
 
 import junit.framework.AssertionFailedError;
 
+import java.util.Collections;
+
 /**
- * This class tests our implementation of the GWTTestCase class which provides
- * the behavior of TestCase that is necessary in GWT.
+ * This class tests our implementation of the GWTTestCase class which provides the behavior of
+ * TestCase that is necessary in GWT.
  */
 public class GWTTestCaseTest extends GWTTestCase {
 
-  /**
-   * Tracks whether or not setup and teardown have run.
-   */
-  protected enum SetUpTearDownState {
-    INITIAL, IS_SETUP, IS_TORNDOWN
-  }
-
-  /**
-   * If non-null, records an error related to setup/teardown that could not have
-   * been caught during normal test execution.
-   */
-  private static String outOfBandError = null;
-
-  /**
-   * These two variables test the retry functionality, currently used with
-   * HtmlUnit.
-   */
-  private static boolean attemptedOnce = false;
-  private static boolean htmlunitMode = true;
-
   private static void assertNotEquals(double a, double b, double delta) {
     boolean failed = false;
     try {
@@ -67,8 +46,7 @@
     }
 
     if (!failed) {
-      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta
-          + ")");
+      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta + ")");
     }
   }
 
@@ -82,20 +60,35 @@
     }
 
     if (!failed) {
-      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta
-          + ")");
+      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta + ")");
     }
   }
-
-  /**
-   * Tracks whether this test has been setup and torn down.
-   */
-  protected SetUpTearDownState setupTeardownFlag = INITIAL;
+  
+  private Object obj1 = Collections.nCopies(1, "data");
+  private Object obj2 = Collections.nCopies(2, "data");
+  private Object obj1Equal = Collections.nCopies(1, "data");
 
   public String getModuleName() {
     return "com.google.gwt.junit.JUnit";
   }
 
+  @ExpectedFailure(withMessage = "testFail")
+  public void testFail() {
+    fail("testFail");
+  }
+
+  @ExpectedFailure(withType = Exception.class)
+  public void testThrowsException() throws Exception {
+    throw new Exception();
+  }
+
+  // Fails in 'web' mode.
+  // Issue: http://code.google.com/p/google-web-toolkit/issues/detail?id=7847
+  @ExpectedFailure(withType = JavaScriptException.class)
+  public void _suppressed_testThrowsNonSerializableException() {
+    throw new JavaScriptException("name", "desc");
+  }
+
   public void testAssertEqualsDouble() {
     assertEquals(0.0, 0.0, 0.0);
     assertEquals(1.1, 1.1, 0.0);
@@ -130,241 +123,126 @@
     assertNotEquals(-2.0f, -1.0f, 0.1f);
   }
 
-  /**
-   * 
-   */
   public void testAssertEqualsIntInt() {
     assertEquals(5, 5);
-
-    boolean exWasThrown = false;
-    try {
-      assertEquals(5, 4);
-    } catch (Throwable ex) {
-      exWasThrown = true;
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertEquals(int,int) testing");
-      }
-    }
-
-    if (!exWasThrown) {
-      fail("No exception was thrown during assertEquals(int,int) testing");
-    }
+    assertEquals("msg", 5, 5);
   }
 
-  /**
-   * 
-   */
+  @ExpectedFailure
+  public void testAssertEqualsIntIntFail() {
+    assertEquals(5, 4);
+  }
+
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertEqualsIntIntFailWithMessage() {
+    assertEquals("msg", 5, 4);
+  }
+
   public void testAssertEqualsObjectObject() {
-    Object obj1 = "String";
-
-    assertEquals(obj1, obj1);
-
-    boolean exWasThrown = false;
-    try {
-      Object obj2 = "not String";
-      assertEquals(obj1, obj2);
-    } catch (Throwable ex) {
-      exWasThrown = true;
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertEquals(String,String) testing");
-      }
-    }
-
-    if (!exWasThrown) {
-      fail("No exception was thrown during assertEquals(String,String) testing");
-    }
-  }
-
-  /**
-   * 
-   */
-  public void testAssertEqualsStringIntInt() {
-    assertEquals("", 5, 5);
-
-    boolean exWasThrown = false;
-    try {
-      assertEquals("hello", 5, 4);
-    } catch (Throwable ex) {
-      exWasThrown = true;
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertEquals(String,int,int) testing");
-      }
-    }
-
-    if (!exWasThrown) {
-      fail("No exception was thrown during assertEquals(String,int,int) testing");
-    }
-  }
-
-  /**
-   * 
-   */
-  public void testAssertEqualsStringObjectObject() {
-    Object obj1 = "String";
-
+    assertEquals(obj1, obj1Equal);
     assertEquals("msg", obj1, obj1);
-
-    boolean exWasThrown = false;
-    try {
-      Object obj2 = "not String";
-      assertEquals("msg", obj1, obj2);
-    } catch (Throwable ex) {
-      exWasThrown = true;
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertEquals(String,Object,Object) testing");
-      }
-    }
-
-    if (!exWasThrown) {
-      fail("No exception was thrown during assertEquals(String,Object,Object) testing");
-    }
   }
 
-  /**
-   * 
-   */
+  @ExpectedFailure
+  public void testAssertEqualsObjectObjectFail() {
+    assertEquals(obj1, obj2);
+  }
+
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertEqualsObjectObjectFailWithMessage() {
+    assertEquals("msg", obj1, obj2);
+  }
+
   public void testAssertFalse() {
-    // Should not fail
     assertFalse(false);
-
-    // Should not fail
-    assertFalse("We should be okay", false);
-
-    boolean exWasThrown = false;
-    try {
-      // Should fail
-      assertFalse(true);
-    } catch (Throwable ex) {
-      exWasThrown = true;
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertFalse(boolean) testing");
-      }
-    }
-
-    if (!exWasThrown) {
-      fail("No exception was thrown");
-    }
-    exWasThrown = false;
-
-    try {
-      // Should fail
-      assertFalse("This should be okay", true);
-    } catch (Throwable ex) {
-      exWasThrown = true;
-      if (ex instanceof AssertionFailedError) {
-        return;
-      }
-    }
-
-    if (!exWasThrown) {
-      fail("No exception was thrown");
-    } else {
-      fail("Unexpected exception during assertFalse(String, boolean) testing");
-    }
+    assertFalse("msg", false);
   }
 
-  /**
-   * 
-   */
+  @ExpectedFailure
+  public void testAssertFalseFail() {
+    assertFalse(true);
+  }
+
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertFalseFailWithMessage() {
+    assertFalse("msg", true);
+  }
+
   public void testAssertNotNull() {
     assertNotNull("Hello");
-    assertNotNull("We should be okay", "Hello");
-
-    try {
-      assertNotNull("Hello");
-    } catch (Throwable ex) {
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertNotNull(Object) testing");
-      }
-    }
-
-    try {
-      assertNotNull("This should be okay", null);
-    } catch (Throwable ex) {
-      if (ex instanceof AssertionFailedError) {
-        return;
-      }
-    }
-
-    fail("Unexpected exception during assertNotNull(String, Object) testing");
+    assertNotNull("msg", "Hello");
   }
 
-  /**
-   * 
-   */
+  @ExpectedFailure
+  public void testAssertNotNullFail() {
+    assertNotNull(null);
+  }
+
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertNotNullStringFailWithMessage() {
+    assertNotNull("msg", null);
+  }
+
   public void testAssertNotSame() {
-    Object obj1 = "Foo";
-    Object obj2 = "Bar";
-
     assertNotSame(obj1, obj2);
-    assertNotSame("Hello", obj1, obj2);
-
-    try {
-      assertNotSame(obj1, "Baz");
-    } catch (Throwable ex) {
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception");
-      }
-    }
+    assertNotSame("msg", obj1, obj2);
+    assertNotSame(obj1, obj1Equal);
+    assertNotSame("msg", obj1, obj1Equal);
   }
 
-  /**
-   * 
-   */
+  @ExpectedFailure
+  public void testAssertNotSameFail() {
+    assertNotSame(obj1, obj1);
+  }
+
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertNotSameFailWithMessage() {
+    assertNotSame("msg", obj1, obj1);
+  }
+
   public void testAssertNull() {
     assertNull(null);
-    assertNull("We should be okay", null);
-
-    try {
-      assertNull("Hello");
-    } catch (Throwable ex) {
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertNull(Object) testing");
-      }
-    }
-
-    try {
-      assertNull("This should be okay", "Hello");
-    } catch (Throwable ex) {
-      if (ex instanceof AssertionFailedError) {
-        return;
-      }
-    }
-
-    fail("Unexpected exception during assertNull(String, Object) testing");
+    assertNull("msg", null);
   }
 
-  /**
-   * 
-   */
+  @ExpectedFailure
+  public void testAssertNullFail() {
+    assertNull("Hello");
+  }
+
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertNullFailWithMessage() {
+    assertNull("msg", "Hello");
+  }
+
   public void testAssertSame() {
-    // TODO(mmendez): finish this test
+    assertSame(obj1, obj1);
+    assertSame("msg", obj1, obj1);
   }
 
-  /**
-   * 
-   */
+  @ExpectedFailure
+  public void testAssertSameFail() {
+    assertSame(obj1, obj1Equal);
+  }
+
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertSameFailWithMessage() {
+    assertSame("msg", obj1, obj1Equal);
+  }
+
   public void testAssertTrue() {
     assertTrue(true);
-    assertTrue("We should be okay", true);
+    assertTrue("msg", true);
+  }
 
-    try {
-      assertTrue(false);
-    } catch (Throwable ex) {
-      if (!(ex instanceof AssertionFailedError)) {
-        fail("Unexpected type of exception during assertFalse(boolean) testing");
-      }
-    }
+  @ExpectedFailure
+  public void testAssertTrueFail() {
+    assertTrue(false);
+  }
 
-    try {
-      assertTrue("This should be okay", false);
-    } catch (Throwable ex) {
-      if (ex instanceof AssertionFailedError) {
-        return;
-      }
-    }
-
-    fail("Unexpected exception during assertTrue(String, boolean) testing");
+  @ExpectedFailure(withMessage = "msg")
+  public void testAssertTrueFailWithMessage() {
+    assertTrue("msg", false);
   }
 
   /**
@@ -382,74 +260,4 @@
   public void testPlatformProd() {
     assertTrue("Should not run in prod mode", !GWT.isScript());
   }
-
-  public void testSetUpTearDown() throws Exception {
-    assertSame(IS_SETUP, setupTeardownFlag);
-    tearDown();
-    assertSame(IS_TORNDOWN, setupTeardownFlag);
-    setUp();
-    assertSame(IS_SETUP, setupTeardownFlag);
-    gwtTearDown();
-    assertSame(IS_TORNDOWN, setupTeardownFlag);
-    gwtSetUp();
-    assertSame(IS_SETUP, setupTeardownFlag);
-  }
-
-  public void testSetUpTearDownAsync() {
-    assertSame(IS_SETUP, setupTeardownFlag);
-    delayTestFinish(1000);
-    new Timer() {
-      @Override
-      public void run() {
-        assertSame(IS_SETUP, setupTeardownFlag);
-        finishTest();
-        if (setupTeardownFlag != IS_TORNDOWN) {
-          recordOutofBandError("Bad async success tearDown behavior not catchable by JUnit");
-        }
-      }
-    }.schedule(1);
-  }
-
-  public void testSetUpTearDownAsyncHadNoOutOfBandErrors() {
-    assertNoOutOfBandErrorsAsync();
-  }
-
-  @Override
-  protected void gwtSetUp() throws Exception {
-    setupTeardownFlag = IS_SETUP;
-  }
-
-  @Override
-  protected void gwtTearDown() throws Exception {
-    if (setupTeardownFlag != IS_SETUP) {
-      // Must use window alert to grind the test to a halt in this failure.
-      recordOutofBandError("Bad tearDown behavior not catchable by JUnit");
-    }
-    setupTeardownFlag = IS_TORNDOWN;
-  }
-
-  protected static void recordOutofBandError(String outOfBandError) {
-    GWTTestCaseTest.outOfBandError = outOfBandError;
-  }
-
-  /**
-   * Call this method to asynchronously check for out of band errors in the
-   * previous test.
-   */
-  protected void assertNoOutOfBandErrorsAsync() {
-    // Give things a chance to settle down.
-    delayTestFinish(10000);
-    new Timer() {
-      @Override
-      public void run() {
-        if (outOfBandError != null) {
-          String msg = outOfBandError;
-          outOfBandError = null;
-          fail(msg);
-        }
-        finishTest();
-      }
-
-    }.schedule(1000);
-  }
 }
diff --git a/user/test/com/google/gwt/junit/client/TestManualAsync.java b/user/test/com/google/gwt/junit/client/TestManualAsync.java
deleted file mode 100644
index 907d252..0000000
--- a/user/test/com/google/gwt/junit/client/TestManualAsync.java
+++ /dev/null
@@ -1,347 +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.junit.client;
-
-import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_SETUP;
-import static com.google.gwt.junit.client.GWTTestCaseTest.SetUpTearDownState.IS_TORNDOWN;
-
-import com.google.gwt.dom.client.ButtonElement;
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.EventListener;
-import com.google.gwt.user.client.Timer;
-
-/**
- * This test must be run manually to inspect for correct results. Many of these
- * tests are designed to fail in specific ways, the rest should succeed. The
- * name of each test method indicates how it should behave.
- */
-public class TestManualAsync extends GWTTestCaseTest {
-
-  // The following tests (all prefixed with test_) are intended to test the
-  // interaction of synchronous failures (within event handlers) with various
-  // other types of failures and successes. All of them are expected to fail
-  // with the message "Expected failure".
-  //
-  // Nomenclature for these tests:
-  // DTF => delayTestFinish()
-  // SF => synchronous failure (from event handler)
-  // FT => finishTest()
-  // F => fail()
-  // R => return;
-
-  public void test_dtf_sf() {
-    delayTestFinish();
-    synchronousFailure("test_dtf_sf");
-  }
-
-  public void test_dtf_sf_f() {
-    delayTestFinish();
-    synchronousFailure("test_dtf_sf_f");
-    failNow("test_dtf_sf_f");
-  }
-
-  public void test_dtf_sf_ft() {
-    delayTestFinish();
-    synchronousFailure("test_dtf_sf_ft");
-    finishTest();
-  }
-
-  public void test_dtf_sf_r_f() {
-    delayTestFinish();
-    synchronousFailure("test_dtf_sf_r_f");
-    failLater("test_dtf_sf_r_f");
-  }
-
-  public void test_dtf_sf_r_ft() {
-    delayTestFinish();
-    synchronousFailure("test_dtf_sf_r_ft");
-    finishTestLater();
-  }
-
-  public void test_sf() {
-    synchronousFailure("test_sf");
-  }
-
-  public void test_sf_dtf_f() {
-    synchronousFailure("test_sf_dtf_f");
-    delayTestFinish();
-    failNow("test_sf_dtf_f");
-  }
-
-  public void test_sf_dtf_ft() {
-    synchronousFailure("test_sf_dtf_ft");
-    delayTestFinish();
-    finishTest();
-  }
-
-  public void test_sf_dtf_r_f() {
-    synchronousFailure("test_sf_dtf_r_f");
-    delayTestFinish();
-    failLater("test_sf_dtf_r_f");
-  }
-
-  public void test_sf_dtf_r_ft() {
-    synchronousFailure("test_sf_dtf_r_ft");
-    delayTestFinish(5 * 60 * 1000);
-    finishTestLater();
-  }
-
-  public void test_sf_f() {
-    synchronousFailure("test_sf_f");
-    failNow("test_sf_f");
-  }
-
-  /**
-   * Fails normally.
-   */
-  public void testDelayFail() {
-    delayTestFinish(100);
-    fail("Expected failure");
-    finishTest();
-  }
-
-  /**
-   * Completes normally.
-   */
-  public void testDelayNormal() {
-    delayTestFinish(100);
-    finishTest();
-  }
-
-  /**
-   * Fails normally.
-   */
-  public void testFail() {
-    fail("Expected failure");
-  }
-
-  /**
-   * Async fails.
-   */
-  public void testFailAsync() {
-    delayTestFinish(1000);
-    new Timer() {
-      public void run() {
-        fail("Expected failure");
-      }
-    }.schedule(100);
-  }
-
-  /**
-   * Tests the case where a JUnit exception is thrown from an event handler, but
-   * after this test method has completed successfully.
-   * 
-   * This test should *not* fail, but the next one should.
-   */
-  public void testLateFailPart1() {
-    // Leave the test in synchronous mode, but crank up a timer to fail in 2.5s.
-    new Timer() {
-      @Override
-      public void run() {
-        // This fail should be called during the next test.
-        fail();
-      }
-    }.schedule(2500);
-
-    // We don't actually assert anything here. This test exists solely to make
-    // the next one fail.
-  }
-
-  /**
-   * Second half of the previous test.
-   */
-  public void testLateFailPart2() {
-    // Go into async mode from 5s, finishing in 4. The timer from the previous
-    // test will go off and call fail() before finishTest() is called.
-    delayTestFinish(5000);
-    new Timer() {
-      @Override
-      public void run() {
-        finishTest();
-      }
-    }.schedule(4000);
-  }
-
-  /**
-   * Completes normally.
-   */
-  public void testNormal() {
-  }
-
-  /**
-   * Completes async.
-   */
-  public void testNormalAsync() {
-    delayTestFinish(200);
-    new Timer() {
-      public void run() {
-        finishTest();
-      }
-    }.schedule(100);
-  }
-
-  /**
-   * Completes async.
-   */
-  public void testRepeatingNormal() {
-    delayTestFinish(200);
-    new Timer() {
-      private int i = 0;
-
-      public void run() {
-        if (++i < 4) {
-          delayTestFinish(200);
-        } else {
-          cancel();
-          finishTest();
-        }
-      }
-    }.scheduleRepeating(100);
-  }
-
-  /**
-   * Fails async.
-   */
-  public void testSetUpTearDownFailAsync() {
-    assertEquals(IS_SETUP, setupTeardownFlag);
-    delayTestFinish(1000);
-    new Timer() {
-      @Override
-      public void run() {
-        fail("Expected failure");
-      }
-    }.schedule(1);
-
-    new Timer() {
-      @Override
-      public void run() {
-        /*
-         * The failing test should have triggered tearDown.
-         */
-        if (setupTeardownFlag != IS_TORNDOWN) {
-          recordOutofBandError("Bad async failure tearDown behavior not catchable by JUnit");
-        }
-      }
-    }.schedule(100);
-  }
-
-  /**
-   * Completes async.
-   */
-  public void testSetUpTearDownFailAsyncHadNoOutOfBandErrors() {
-    assertNoOutOfBandErrorsAsync();
-  }
-
-  /**
-   * Times out async.
-   */
-  public void testSetUpTearDownTimeoutAsync() {
-    assertSame(IS_SETUP, setupTeardownFlag);
-    delayTestFinish(1);
-    new Timer() {
-      @Override
-      public void run() {
-        /*
-         * The failing test should have triggered tearDown.
-         */
-        if (setupTeardownFlag != IS_TORNDOWN) {
-          recordOutofBandError("Bad async timeout tearDown behavior not catchable by JUnit");
-        }
-      }
-    }.schedule(100);
-  }
-
-  /**
-   * Completes async.
-   */
-  public void testSetUpTearDownTimeoutAsyncHadNoOutOfBandErrors() {
-    assertNoOutOfBandErrorsAsync();
-  }
-
-  /**
-   * Completes normally.
-   */
-  public void testSpuriousFinishTest() {
-    try {
-      finishTest();
-      fail("Unexpected failure");
-    } catch (IllegalStateException e) {
-    }
-  }
-
-  /**
-   * Times out.
-   */
-  public void testTimeoutAsync() {
-    delayTestFinish(100);
-    new Timer() {
-      public void run() {
-        finishTest();
-      }
-    }.schedule(200);
-  }
-
-  // Call delayTestFinish() with enough time so that failLater() will
-  // definitely fail.
-  private void delayTestFinish() {
-    delayTestFinish(2500);
-  }
-
-  // Fail asynchronously after a small amount of time.
-  private void failLater(final String failMsg) {
-    new Timer() {
-      @Override
-      public void run() {
-        failNow(failMsg);
-      }
-    }.schedule(100);
-  }
-
-  // Fail synchronously with an "expected failure" message.
-  private void failNow(String failMsg) {
-    fail("Expected failure (" + failMsg + ")");
-  }
-
-  // Finish the test asynchronously after a small amount of time.
-  private void finishTestLater() {
-    new Timer() {
-      @Override
-      public void run() {
-        finishTest();
-      }
-    }.schedule(1);
-  }
-
-  // Trigger a test failure synchronously, but from within an event handler.
-  // (The exception thrown from fail() will get caught by the GWT
-  // UncaughtExceptionHandler).
-  private void synchronousFailure(final String failMsg) {
-    ButtonElement btn = Document.get().createButtonElement();
-    Document.get().getBody().appendChild(btn);
-    Event.sinkEvents(btn, Event.ONCLICK);
-
-    EventListener listener = new EventListener() {
-      public void onBrowserEvent(Event event) {
-        failNow(failMsg);
-      }
-    };
-
-    DOM.setEventListener(btn.<com.google.gwt.user.client.Element>cast(), listener);
-    btn.click();
-  }
-}
diff --git a/user/test/com/google/gwt/layout/client/LayoutTest.java b/user/test/com/google/gwt/layout/client/LayoutTest.java
index eac839f..129ddcc 100644
--- a/user/test/com/google/gwt/layout/client/LayoutTest.java
+++ b/user/test/com/google/gwt/layout/client/LayoutTest.java
@@ -35,8 +35,8 @@
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.layout.client.Layout.Alignment;
 import com.google.gwt.layout.client.Layout.Layer;
+import com.google.gwt.user.client.ResizeHelper;
 import com.google.gwt.user.client.Window;
-import com.google.gwt.user.client.WindowTest;
 
 /**
  * Tests for the {@link Layout} class.
@@ -56,7 +56,6 @@
   private Element wrapper0, wrapper1;
   private Layout layout;
   private Layer layer0, layer1;
-  private boolean resized;
 
   @Override
   public String getModuleName() {
@@ -307,7 +306,7 @@
   @DoNotRunWith(Platform.HtmlUnitLayout)
   public void testStaticConstraints() {
     // This test assumes enough size. Ignore it if size cannot be guaranteed.
-    if (!resized) {
+    if (!ResizeHelper.isResizeSupported()) {
       return;
     }
 
@@ -350,7 +349,7 @@
   @DoNotRunWith(Platform.HtmlUnitLayout)
   public void testUnits() {
     // This test assumes enough size. Ignore it if size cannot be guaranteed.
-    if (!resized) {
+    if (!ResizeHelper.isResizeSupported()) {
       return;
     }
 
@@ -440,7 +439,7 @@
   @Override
   protected void gwtSetUp() throws Exception {
     // ensure enough sizes for this test
-    resized = WindowTest.ResizeHelper.resizeTo(800, 600);
+    ResizeHelper.resizeTo(800, 600);
 
     Window.enableScrolling(false);
 
@@ -466,7 +465,6 @@
     Window.enableScrolling(true);
     Document.get().getBody().removeChild(parent);
     layout.onDetach();
-    WindowTest.ResizeHelper.restoreSize();
   }
 
   private void assertLeftRightTopBottomUnitsMakeSense(Element elem) {
diff --git a/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java b/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
index 7467a60..b2e8f8e 100644
--- a/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
+++ b/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
@@ -56,6 +56,16 @@
     }
   }
 
+  public void testCloneMedia() throws UnableToCompleteException {
+    CssStylesheet sheet = GenerateCssAst.exec(TreeLogger.NULL,
+        getClass().getClassLoader().getResource(
+            "com/google/gwt/resources/css/media.css"));
+
+    CssStylesheet cloned = CssNodeCloner.clone(CssStylesheet.class, sheet);
+
+    assertEquals("@media print, standard {\n}\n", cloned.toString());
+  }
+
   public void testCloneProperty() {
     CssProperty.IdentValue value = new CssProperty.IdentValue("value");
     CssProperty p = new CssProperty("name", value, true);
diff --git a/user/test/com/google/gwt/resources/css/media.css b/user/test/com/google/gwt/resources/css/media.css
new file mode 100644
index 0000000..fef5ea5
--- /dev/null
+++ b/user/test/com/google/gwt/resources/css/media.css
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ */
+
+@media print, standard {}
diff --git a/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java b/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java
index f8ec5e2..81af5a1 100644
--- a/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java
+++ b/user/test/com/google/gwt/uibinder/attributeparsers/StrictAttributeParserTest.java
@@ -31,13 +31,13 @@
   public void testSimple() {
     String before = "{able.baker.charlie.prawns}";
     String expected = "able.baker().charlie().prawns()";
-    assertEquals(expected, converter.convert(before, new FieldReferenceDelegate(null)));
+    assertEquals(expected, converter.convert(before, new FieldReferenceDelegate()));
   }
   
   public void testNoneShouldFail() {
     String before = "able.baker.charlie.prawns";
     try {
-      converter.convert(before, new FieldReferenceDelegate(null));
+      converter.convert(before, new FieldReferenceDelegate());
       fail();
     } catch (IllegalFieldReferenceException e) {
       /* pass */
@@ -47,7 +47,7 @@
   public void testTooManyShouldFail() {
     String before = "{able.baker.charlie} {prawns.are.yummy}";
     try {
-      converter.convert(before, new FieldReferenceDelegate(null));
+      converter.convert(before, new FieldReferenceDelegate());
       fail();
     } catch (IllegalFieldReferenceException e) {
       /* pass */
@@ -57,7 +57,7 @@
   public void testMixedShouldFail() {
     String before = "{able.baker.charlie} prawns are still yummy}";
     try {
-      converter.convert(before, new FieldReferenceDelegate(null));
+      converter.convert(before, new FieldReferenceDelegate());
       fail();
     } catch (IllegalFieldReferenceException e) {
       /* pass */
diff --git a/user/test/com/google/gwt/user/MiscSuite.java b/user/test/com/google/gwt/user/MiscSuite.java
new file mode 100644
index 0000000..888f903
--- /dev/null
+++ b/user/test/com/google/gwt/user/MiscSuite.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user;
+
+import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.layout.client.LayoutTest;
+import com.google.gwt.user.client.AsyncProxyTest;
+import com.google.gwt.user.client.CommandExecutorTest;
+import com.google.gwt.user.client.CookieTest;
+import com.google.gwt.user.client.DoubleClickEventSinkTest;
+import com.google.gwt.user.client.DragAndDropEventsSinkTest;
+import com.google.gwt.user.client.EventTest;
+import com.google.gwt.user.client.GestureEventSinkTest;
+import com.google.gwt.user.client.HistoryDisabledTest;
+import com.google.gwt.user.client.TouchEventSinkTest;
+import com.google.gwt.user.client.WindowTest;
+import com.google.gwt.user.datepicker.client.CalendarUtilTest;
+import com.google.gwt.user.datepicker.client.DateChangeEventTest;
+import com.google.gwt.user.rebind.ui.ImageBundleGeneratorTest;
+import com.google.gwt.xml.client.XMLTest;
+
+import junit.framework.Test;
+
+/**
+ * Various tests split out from UISuite because they're not in gwt.client.ui.
+ */
+public class MiscSuite {
+
+  public static Test suite() {
+    GWTTestSuite suite = new GWTTestSuite("Miscellaneous GWT tests");
+    suite.addTestSuite(AsyncProxyTest.class);
+    suite.addTestSuite(CalendarUtilTest.class);
+    suite.addTestSuite(CommandExecutorTest.class);
+    suite.addTestSuite(CookieTest.class);
+    suite.addTestSuite(DateChangeEventTest.class);
+    suite.addTestSuite(DoubleClickEventSinkTest.class);
+    suite.addTestSuite(DragAndDropEventsSinkTest.class);
+    suite.addTestSuite(EventTest.class);
+    suite.addTestSuite(GestureEventSinkTest.class);
+    suite.addTestSuite(HistoryDisabledTest.class);
+    suite.addTestSuite(ImageBundleGeneratorTest.class);
+    suite.addTestSuite(LayoutTest.class);
+    suite.addTestSuite(TouchEventSinkTest.class);
+    suite.addTestSuite(WindowTest.class);
+    suite.addTestSuite(XMLTest.class);
+    return suite;
+  }
+}
diff --git a/user/test/com/google/gwt/user/RPCSuite.java b/user/test/com/google/gwt/user/RPCSuite.java
index c2459a2..96b74fc 100644
--- a/user/test/com/google/gwt/user/RPCSuite.java
+++ b/user/test/com/google/gwt/user/RPCSuite.java
@@ -49,20 +49,6 @@
 import com.google.gwt.user.client.rpc.ValueTypesTest;
 import com.google.gwt.user.client.rpc.ValueTypesTestWithTypeObfuscation;
 import com.google.gwt.user.client.rpc.XsrfProtectionTest;
-import com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReaderTest;
-import com.google.gwt.user.rebind.rpc.BlacklistTypeFilterTest;
-import com.google.gwt.user.rebind.rpc.SerializableTypeOracleBuilderTest;
-import com.google.gwt.user.rebind.rpc.TypeHierarchyUtilsTest;
-import com.google.gwt.user.server.Base64Test;
-import com.google.gwt.user.server.UtilTest;
-import com.google.gwt.user.server.rpc.AbstractXsrfProtectedServiceServletTest;
-import com.google.gwt.user.server.rpc.RPCRequestTest;
-import com.google.gwt.user.server.rpc.RPCServletUtilsTest;
-import com.google.gwt.user.server.rpc.RPCTest;
-import com.google.gwt.user.server.rpc.SerializationPolicyLoaderTest;
-import com.google.gwt.user.server.rpc.impl.LegacySerializationPolicyTest;
-import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriterTest;
-import com.google.gwt.user.server.rpc.impl.StandardSerializationPolicyTest;
 
 import junit.framework.Test;
 
@@ -84,24 +70,7 @@
     GWTTestSuite suite = new GWTTestSuite(
         "Test for com.google.gwt.user.client.rpc");
 
-    // Non GWTTestCases
-    suite.addTestSuite(BlacklistTypeFilterTest.class);
-    suite.addTestSuite(SerializableTypeOracleBuilderTest.class);
-    suite.addTestSuite(TypeHierarchyUtilsTest.class);
-    suite.addTestSuite(RPCTest.class);
-    suite.addTestSuite(com.google.gwt.user.server.rpc.RemoteServiceServletTest.class);
-    suite.addTestSuite(LegacySerializationPolicyTest.class);
-    suite.addTestSuite(StandardSerializationPolicyTest.class);
-    suite.addTestSuite(SerializationPolicyLoaderTest.class);
-    suite.addTestSuite(RPCServletUtilsTest.class);
-    suite.addTestSuite(RPCRequestTest.class);
-    suite.addTestSuite(FailedRequestTest.class);
-    suite.addTestSuite(FailingRequestBuilderTest.class);
-    suite.addTestSuite(Base64Test.class);
-    suite.addTestSuite(UtilTest.class);
-    suite.addTestSuite(AbstractXsrfProtectedServiceServletTest.class);
-    suite.addTestSuite(ClientSerializationStreamReaderTest.class);
-    suite.addTestSuite(ServerSerializationStreamWriterTest.class);
+    // Non GWTTestCases: see RpcSuiteNoBrowser
 
     // GWTTestCases
     suite.addTestSuite(ValueTypesTest.class);
@@ -119,6 +88,8 @@
     suite.addTestSuite(RecursiveClassTest.class);
     suite.addTestSuite(TypeCheckedObjectsTest.class);
     suite.addTestSuite(XsrfProtectionTest.class);
+    suite.addTestSuite(FailedRequestTest.class);
+    suite.addTestSuite(FailingRequestBuilderTest.class);
 
     // This test turns on the type-elision feature of RPC
     suite.addTestSuite(ValueTypesTestWithTypeObfuscation.class);
diff --git a/user/test/com/google/gwt/user/RpcSuiteNoBrowser.java b/user/test/com/google/gwt/user/RpcSuiteNoBrowser.java
new file mode 100644
index 0000000..5756bcc
--- /dev/null
+++ b/user/test/com/google/gwt/user/RpcSuiteNoBrowser.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user;
+
+import com.google.gwt.dev.BootStrapPlatform;
+import com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReaderTest;
+import com.google.gwt.user.rebind.rpc.BlacklistTypeFilterTest;
+import com.google.gwt.user.rebind.rpc.SerializationUtilsTest;
+import com.google.gwt.user.rebind.rpc.SerializableTypeOracleBuilderTest;
+import com.google.gwt.user.rebind.rpc.TypeHierarchyUtilsTest;
+import com.google.gwt.user.server.Base64Test;
+import com.google.gwt.user.server.UtilTest;
+import com.google.gwt.user.server.rpc.AbstractXsrfProtectedServiceServletTest;
+import com.google.gwt.user.server.rpc.RPCRequestTest;
+import com.google.gwt.user.server.rpc.RPCServletUtilsTest;
+import com.google.gwt.user.server.rpc.RPCTest;
+import com.google.gwt.user.server.rpc.RPCTypeCheckTest;
+import com.google.gwt.user.server.rpc.RemoteServiceServletTest;
+import com.google.gwt.user.server.rpc.SerializationPolicyLoaderTest;
+import com.google.gwt.user.server.rpc.impl.LegacySerializationPolicyTest;
+import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriterTest;
+import com.google.gwt.user.server.rpc.impl.StandardSerializationPolicyTest;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * RPC tests that don't extend GWTTestCase.
+ */
+public class RpcSuiteNoBrowser {
+
+  static {
+    /*
+     * Required for OS X Leopard. This call ensures we have a valid context
+     * ClassLoader. Many of the tests test low-level RPC mechanisms and rely on
+     * a ClassLoader to resolve classes and resources.
+     */
+    BootStrapPlatform.applyPlatformHacks();
+  }
+
+  public static Test suite() {
+    TestSuite suite = new TestSuite("Non-browser tests for com.google.gwt.user.client.rpc");
+    suite.addTestSuite(BlacklistTypeFilterTest.class);
+    suite.addTestSuite(SerializationUtilsTest.class);
+    suite.addTestSuite(SerializableTypeOracleBuilderTest.class);
+    suite.addTestSuite(TypeHierarchyUtilsTest.class);
+    suite.addTestSuite(RPCTest.class);
+    suite.addTestSuite(RPCTypeCheckTest.class);
+    suite.addTestSuite(RemoteServiceServletTest.class);
+    suite.addTestSuite(LegacySerializationPolicyTest.class);
+    suite.addTestSuite(StandardSerializationPolicyTest.class);
+    suite.addTestSuite(SerializationPolicyLoaderTest.class);
+    suite.addTestSuite(RPCServletUtilsTest.class);
+    suite.addTestSuite(RPCRequestTest.class);
+    suite.addTestSuite(Base64Test.class);
+    suite.addTestSuite(UtilTest.class);
+    suite.addTestSuite(AbstractXsrfProtectedServiceServletTest.class);
+    suite.addTestSuite(ClientSerializationStreamReaderTest.class);
+    suite.addTestSuite(ServerSerializationStreamWriterTest.class);
+    return suite;
+  }
+}
diff --git a/user/test/com/google/gwt/user/UISuite.java b/user/test/com/google/gwt/user/UISuite.java
deleted file mode 100644
index 9de41d8..0000000
--- a/user/test/com/google/gwt/user/UISuite.java
+++ /dev/null
@@ -1,246 +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.user;
-
-import com.google.gwt.junit.tools.GWTTestSuite;
-import com.google.gwt.layout.client.LayoutTest;
-import com.google.gwt.user.client.AsyncProxyTest;
-import com.google.gwt.user.client.CommandExecutorTest;
-import com.google.gwt.user.client.CookieTest;
-import com.google.gwt.user.client.DoubleClickEventSinkTest;
-import com.google.gwt.user.client.DragAndDropEventsSinkTest;
-import com.google.gwt.user.client.EventTest;
-import com.google.gwt.user.client.GestureEventSinkTest;
-import com.google.gwt.user.client.HistoryDisabledTest;
-import com.google.gwt.user.client.TouchEventSinkTest;
-import com.google.gwt.user.client.WindowTest;
-import com.google.gwt.user.client.ui.AbsolutePanelTest;
-import com.google.gwt.user.client.ui.AnchorTest;
-import com.google.gwt.user.client.ui.ButtonTest;
-import com.google.gwt.user.client.ui.CaptionPanelTest;
-import com.google.gwt.user.client.ui.CheckBoxTest;
-import com.google.gwt.user.client.ui.CompositeTest;
-import com.google.gwt.user.client.ui.CreateEventTest;
-import com.google.gwt.user.client.ui.CustomButtonTest;
-import com.google.gwt.user.client.ui.CustomScrollPanelTest;
-import com.google.gwt.user.client.ui.DOMRtlTest;
-import com.google.gwt.user.client.ui.DOMTest;
-import com.google.gwt.user.client.ui.DateBoxTest;
-import com.google.gwt.user.client.ui.DatePickerTest;
-import com.google.gwt.user.client.ui.DeckLayoutPanelTest;
-import com.google.gwt.user.client.ui.DeckPanelTest;
-import com.google.gwt.user.client.ui.DecoratedPopupTest;
-import com.google.gwt.user.client.ui.DecoratedStackPanelTest;
-import com.google.gwt.user.client.ui.DecoratedTabBarTest;
-import com.google.gwt.user.client.ui.DecoratedTabPanelTest;
-import com.google.gwt.user.client.ui.DecoratorPanelTest;
-import com.google.gwt.user.client.ui.DefaultSuggestionDisplayTest;
-import com.google.gwt.user.client.ui.DelegatingKeyboardListenerCollectionTest;
-import com.google.gwt.user.client.ui.DialogBoxTest;
-import com.google.gwt.user.client.ui.DirectionalTextHelperTest;
-import com.google.gwt.user.client.ui.DisclosurePanelTest;
-import com.google.gwt.user.client.ui.DockLayoutPanelRtlTest;
-import com.google.gwt.user.client.ui.DockLayoutPanelTest;
-import com.google.gwt.user.client.ui.DockPanelTest;
-import com.google.gwt.user.client.ui.ElementWrappingTest;
-import com.google.gwt.user.client.ui.FastStringMapTest;
-import com.google.gwt.user.client.ui.FileUploadTest;
-import com.google.gwt.user.client.ui.FiniteWidgetIteratorTest;
-import com.google.gwt.user.client.ui.FlexTableTest;
-import com.google.gwt.user.client.ui.FlowPanelTest;
-import com.google.gwt.user.client.ui.FocusPanelTest;
-import com.google.gwt.user.client.ui.FormPanelTest;
-import com.google.gwt.user.client.ui.GridTest;
-import com.google.gwt.user.client.ui.HTMLPanelTest;
-import com.google.gwt.user.client.ui.HTMLTest;
-import com.google.gwt.user.client.ui.HeaderPanelTest;
-import com.google.gwt.user.client.ui.HiddenTest;
-import com.google.gwt.user.client.ui.HistoryTest;
-import com.google.gwt.user.client.ui.HorizontalPanelTest;
-import com.google.gwt.user.client.ui.HorizontalSplitPanelTest;
-import com.google.gwt.user.client.ui.HyperlinkTest;
-import com.google.gwt.user.client.ui.ImageTest;
-import com.google.gwt.user.client.ui.InlineHTMLTest;
-import com.google.gwt.user.client.ui.InlineHyperlinkTest;
-import com.google.gwt.user.client.ui.IsWidgetTest;
-import com.google.gwt.user.client.ui.LabelTest;
-import com.google.gwt.user.client.ui.LazyPanelTest;
-import com.google.gwt.user.client.ui.LinearPanelTest;
-import com.google.gwt.user.client.ui.ListBoxTest;
-import com.google.gwt.user.client.ui.MenuBarTest;
-import com.google.gwt.user.client.ui.MenuItemTest;
-import com.google.gwt.user.client.ui.NamedFrameTest;
-import com.google.gwt.user.client.ui.NativeHorizontalScrollbarTest;
-import com.google.gwt.user.client.ui.NativeVerticalScrollbarTest;
-import com.google.gwt.user.client.ui.PopupTest;
-import com.google.gwt.user.client.ui.PrefixTreeTest;
-import com.google.gwt.user.client.ui.RadioButtonTest;
-import com.google.gwt.user.client.ui.ResetButtonTest;
-import com.google.gwt.user.client.ui.ResizeLayoutPanelTest;
-import com.google.gwt.user.client.ui.RichTextAreaTest;
-import com.google.gwt.user.client.ui.RootPanelTest;
-import com.google.gwt.user.client.ui.ScrollPanelTest;
-import com.google.gwt.user.client.ui.SimpleCheckBoxTest;
-import com.google.gwt.user.client.ui.SimpleLayoutPanelTest;
-import com.google.gwt.user.client.ui.SimplePanelTest;
-import com.google.gwt.user.client.ui.SimpleRadioButtonTest;
-import com.google.gwt.user.client.ui.SplitLayoutPanelTest;
-import com.google.gwt.user.client.ui.StackLayoutPanelTest;
-import com.google.gwt.user.client.ui.StackPanelTest;
-import com.google.gwt.user.client.ui.SubmitButtonTest;
-import com.google.gwt.user.client.ui.SuggestBoxTest;
-import com.google.gwt.user.client.ui.TabBarTest;
-import com.google.gwt.user.client.ui.TabLayoutPanelTest;
-import com.google.gwt.user.client.ui.TabPanelTest;
-import com.google.gwt.user.client.ui.TextAreaTest;
-import com.google.gwt.user.client.ui.TreeItemTest;
-import com.google.gwt.user.client.ui.TreeTest;
-import com.google.gwt.user.client.ui.UIObjectTest;
-import com.google.gwt.user.client.ui.ValueBoxBaseTest;
-import com.google.gwt.user.client.ui.ValueListBoxTest;
-import com.google.gwt.user.client.ui.VerticalPanelTest;
-import com.google.gwt.user.client.ui.VerticalSplitPanelTest;
-import com.google.gwt.user.client.ui.WidgetCollectionTest;
-import com.google.gwt.user.client.ui.WidgetIteratorsTest;
-import com.google.gwt.user.client.ui.WidgetOnLoadTest;
-import com.google.gwt.user.client.ui.WidgetSubclassingTest;
-import com.google.gwt.user.client.ui.WidgetTest;
-import com.google.gwt.user.client.ui.impl.ClippedImagePrototypeTest;
-import com.google.gwt.user.datepicker.client.CalendarUtilTest;
-import com.google.gwt.user.datepicker.client.DateChangeEventTest;
-import com.google.gwt.user.rebind.ui.ImageBundleGeneratorTest;
-import com.google.gwt.xml.client.XMLTest;
-
-import junit.framework.Test;
-
-/**
- * Tests of the ui package.
- */
-public class UISuite {
-  public static Test suite() {
-    GWTTestSuite suite = new GWTTestSuite("Test for suite for all user widgets");
-
-    suite.addTestSuite(AbsolutePanelTest.class);
-    suite.addTestSuite(AnchorTest.class);
-    suite.addTestSuite(AsyncProxyTest.class);
-    suite.addTestSuite(ButtonTest.class);
-    suite.addTestSuite(CalendarUtilTest.class);
-    suite.addTestSuite(CaptionPanelTest.class);
-    suite.addTestSuite(CheckBoxTest.class);
-    suite.addTestSuite(ClassInitTest.class);
-    suite.addTestSuite(ClippedImagePrototypeTest.class);
-    suite.addTestSuite(CommandExecutorTest.class);
-    suite.addTestSuite(CompositeTest.class);
-    suite.addTestSuite(CookieTest.class);
-    suite.addTestSuite(CreateEventTest.class);
-    suite.addTestSuite(CustomButtonTest.class);
-    suite.addTestSuite(CustomScrollPanelTest.class);
-    suite.addTestSuite(DateBoxTest.class);
-    suite.addTestSuite(DateChangeEventTest.class);
-    suite.addTestSuite(DatePickerTest.class);
-    suite.addTestSuite(DeckLayoutPanelTest.class);
-    suite.addTestSuite(DeckPanelTest.class);
-    suite.addTestSuite(DecoratedPopupTest.class);
-    suite.addTestSuite(DecoratedStackPanelTest.class);
-    suite.addTestSuite(DecoratedTabBarTest.class);
-    suite.addTestSuite(DecoratedTabPanelTest.class);
-    suite.addTestSuite(DecoratorPanelTest.class);
-    suite.addTestSuite(DefaultSuggestionDisplayTest.class);
-    suite.addTestSuite(DelegatingKeyboardListenerCollectionTest.class);
-    suite.addTestSuite(DialogBoxTest.class);
-    suite.addTestSuite(DirectionalTextHelperTest.class);
-    suite.addTestSuite(DisclosurePanelTest.class);
-    suite.addTestSuite(DockLayoutPanelRtlTest.class);
-    suite.addTestSuite(DockLayoutPanelTest.class);
-    suite.addTestSuite(DockPanelTest.class);
-    suite.addTestSuite(DoubleClickEventSinkTest.class);
-    suite.addTestSuite(DOMTest.class);
-    suite.addTestSuite(DOMRtlTest.class);
-    suite.addTestSuite(DragAndDropEventsSinkTest.class);
-    suite.addTestSuite(ElementWrappingTest.class);
-    suite.addTestSuite(EventTest.class);
-    suite.addTestSuite(FastStringMapTest.class);
-    suite.addTestSuite(FileUploadTest.class);
-    suite.addTestSuite(FiniteWidgetIteratorTest.class);
-    suite.addTestSuite(FlexTableTest.class);
-    suite.addTestSuite(FlowPanelTest.class);
-    suite.addTestSuite(FocusPanelTest.class);
-    suite.addTestSuite(FormPanelTest.class);
-    suite.addTestSuite(GestureEventSinkTest.class);
-    suite.addTestSuite(GridTest.class);
-    suite.addTestSuite(HeaderPanelTest.class);
-    suite.addTestSuite(HiddenTest.class);
-    suite.addTestSuite(HistoryTest.class);
-    suite.addTestSuite(HistoryDisabledTest.class);
-    suite.addTestSuite(HorizontalPanelTest.class);
-    suite.addTestSuite(HorizontalSplitPanelTest.class);
-    suite.addTestSuite(HTMLPanelTest.class);
-    suite.addTestSuite(HTMLTest.class);
-    suite.addTestSuite(HyperlinkTest.class);
-    suite.addTestSuite(ImageBundleGeneratorTest.class);
-    suite.addTestSuite(ImageTest.class);
-    suite.addTestSuite(InlineHTMLTest.class);
-    suite.addTestSuite(InlineHyperlinkTest.class);
-    suite.addTestSuite(IsWidgetTest.class);
-    suite.addTestSuite(LabelTest.class);
-    suite.addTestSuite(LayoutTest.class);
-    suite.addTestSuite(LazyPanelTest.class);
-    suite.addTestSuite(LinearPanelTest.class);
-    suite.addTestSuite(ListBoxTest.class);
-    suite.addTestSuite(MenuBarTest.class);
-    suite.addTestSuite(MenuItemTest.class);
-    suite.addTestSuite(NamedFrameTest.class);
-    suite.addTestSuite(NativeHorizontalScrollbarTest.class);
-    suite.addTestSuite(NativeVerticalScrollbarTest.class);
-    suite.addTestSuite(PopupTest.class);
-    suite.addTestSuite(PrefixTreeTest.class);
-    suite.addTestSuite(RadioButtonTest.class);
-    suite.addTestSuite(ResetButtonTest.class);
-    suite.addTestSuite(ResizeLayoutPanelTest.class);
-    suite.addTestSuite(RichTextAreaTest.class);
-    suite.addTestSuite(RootPanelTest.class);
-    suite.addTestSuite(ScrollPanelTest.class);
-    suite.addTestSuite(SimpleCheckBoxTest.class);
-    suite.addTestSuite(SimpleRadioButtonTest.class);
-    suite.addTestSuite(SimplePanelTest.class);
-    suite.addTestSuite(SimpleLayoutPanelTest.class);
-    suite.addTestSuite(SplitLayoutPanelTest.class);
-    suite.addTestSuite(StackLayoutPanelTest.class);
-    suite.addTestSuite(StackPanelTest.class);
-    suite.addTestSuite(SubmitButtonTest.class);
-    suite.addTestSuite(SuggestBoxTest.class);
-    suite.addTestSuite(TabBarTest.class);
-    suite.addTestSuite(TabLayoutPanelTest.class);
-    suite.addTestSuite(TabPanelTest.class);
-    suite.addTestSuite(TextAreaTest.class);
-    suite.addTestSuite(TreeTest.class);
-    suite.addTestSuite(TreeItemTest.class);
-    suite.addTestSuite(TouchEventSinkTest.class);
-    suite.addTestSuite(UIObjectTest.class);
-    suite.addTestSuite(ValueBoxBaseTest.class);
-    suite.addTestSuite(ValueListBoxTest.class);
-    suite.addTestSuite(VerticalPanelTest.class);
-    suite.addTestSuite(VerticalSplitPanelTest.class);
-    suite.addTestSuite(WidgetCollectionTest.class);
-    suite.addTestSuite(WidgetIteratorsTest.class);
-    suite.addTestSuite(WidgetOnLoadTest.class);
-    suite.addTestSuite(WidgetSubclassingTest.class);
-    suite.addTestSuite(WidgetTest.class);
-    suite.addTestSuite(WindowTest.class);
-    suite.addTestSuite(XMLTest.class);
-    return suite;
-  }
-}
diff --git a/user/test/com/google/gwt/user/UiPart1Suite.java b/user/test/com/google/gwt/user/UiPart1Suite.java
new file mode 100644
index 0000000..74e7d67
--- /dev/null
+++ b/user/test/com/google/gwt/user/UiPart1Suite.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user;
+
+import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.user.client.ui.AbsolutePanelTest;
+import com.google.gwt.user.client.ui.AnchorTest;
+import com.google.gwt.user.client.ui.ButtonTest;
+import com.google.gwt.user.client.ui.CaptionPanelTest;
+import com.google.gwt.user.client.ui.CheckBoxTest;
+import com.google.gwt.user.client.ui.CompositeTest;
+import com.google.gwt.user.client.ui.CreateEventTest;
+import com.google.gwt.user.client.ui.CustomButtonTest;
+import com.google.gwt.user.client.ui.CustomScrollPanelTest;
+import com.google.gwt.user.client.ui.DOMRtlTest;
+import com.google.gwt.user.client.ui.DOMTest;
+import com.google.gwt.user.client.ui.DateBoxTest;
+import com.google.gwt.user.client.ui.DatePickerTest;
+import com.google.gwt.user.client.ui.DeckLayoutPanelTest;
+import com.google.gwt.user.client.ui.DeckPanelTest;
+import com.google.gwt.user.client.ui.DecoratedPopupTest;
+import com.google.gwt.user.client.ui.DecoratedStackPanelTest;
+import com.google.gwt.user.client.ui.DecoratedTabBarTest;
+import com.google.gwt.user.client.ui.DecoratedTabPanelTest;
+import com.google.gwt.user.client.ui.DecoratorPanelTest;
+import com.google.gwt.user.client.ui.DefaultSuggestionDisplayTest;
+import com.google.gwt.user.client.ui.DelegatingKeyboardListenerCollectionTest;
+import com.google.gwt.user.client.ui.DialogBoxTest;
+import com.google.gwt.user.client.ui.DirectionalTextHelperTest;
+import com.google.gwt.user.client.ui.DisclosurePanelTest;
+import com.google.gwt.user.client.ui.DockLayoutPanelRtlTest;
+import com.google.gwt.user.client.ui.DockLayoutPanelTest;
+import com.google.gwt.user.client.ui.DockPanelTest;
+import com.google.gwt.user.client.ui.ElementWrappingTest;
+import com.google.gwt.user.client.ui.FastStringMapTest;
+import com.google.gwt.user.client.ui.FileUploadTest;
+import com.google.gwt.user.client.ui.FiniteWidgetIteratorTest;
+import com.google.gwt.user.client.ui.FlexTableTest;
+import com.google.gwt.user.client.ui.FlowPanelTest;
+import com.google.gwt.user.client.ui.FocusPanelTest;
+import com.google.gwt.user.client.ui.FormPanelTest;
+import com.google.gwt.user.client.ui.GridTest;
+import com.google.gwt.user.client.ui.impl.ClippedImagePrototypeTest;
+
+import junit.framework.Test;
+
+/**
+ * Tests in the user.client.ui package that start with A-G.
+ * @see UiPart2Suite
+ */
+public class UiPart1Suite {
+  public static Test suite() {
+    GWTTestSuite suite = new GWTTestSuite("Test for suite for all user widgets");
+
+    suite.addTestSuite(AbsolutePanelTest.class);
+    suite.addTestSuite(AnchorTest.class);
+    suite.addTestSuite(ButtonTest.class);
+    suite.addTestSuite(CaptionPanelTest.class);
+    suite.addTestSuite(CheckBoxTest.class);
+    suite.addTestSuite(ClassInitTest.class);
+    suite.addTestSuite(ClippedImagePrototypeTest.class);
+    suite.addTestSuite(CompositeTest.class);
+    suite.addTestSuite(CreateEventTest.class);
+    suite.addTestSuite(CustomButtonTest.class);
+    suite.addTestSuite(CustomScrollPanelTest.class);
+    suite.addTestSuite(DateBoxTest.class);
+    suite.addTestSuite(DatePickerTest.class);
+    suite.addTestSuite(DeckLayoutPanelTest.class);
+    suite.addTestSuite(DeckPanelTest.class);
+    suite.addTestSuite(DecoratedPopupTest.class);
+    suite.addTestSuite(DecoratedStackPanelTest.class);
+    suite.addTestSuite(DecoratedTabBarTest.class);
+    suite.addTestSuite(DecoratedTabPanelTest.class);
+    suite.addTestSuite(DecoratorPanelTest.class);
+    suite.addTestSuite(DefaultSuggestionDisplayTest.class);
+    suite.addTestSuite(DelegatingKeyboardListenerCollectionTest.class);
+    suite.addTestSuite(DialogBoxTest.class);
+    suite.addTestSuite(DirectionalTextHelperTest.class);
+    suite.addTestSuite(DisclosurePanelTest.class);
+    suite.addTestSuite(DockLayoutPanelRtlTest.class);
+    suite.addTestSuite(DockLayoutPanelTest.class);
+    suite.addTestSuite(DockPanelTest.class);
+    suite.addTestSuite(DOMTest.class);
+    suite.addTestSuite(DOMRtlTest.class);
+    suite.addTestSuite(ElementWrappingTest.class);
+    suite.addTestSuite(FastStringMapTest.class);
+    suite.addTestSuite(FileUploadTest.class);
+    suite.addTestSuite(FiniteWidgetIteratorTest.class);
+    suite.addTestSuite(FlexTableTest.class);
+    suite.addTestSuite(FlowPanelTest.class);
+    suite.addTestSuite(FocusPanelTest.class);
+    suite.addTestSuite(FormPanelTest.class);
+    suite.addTestSuite(GridTest.class);
+
+    return suite;
+  }
+}
diff --git a/user/test/com/google/gwt/user/UiPart2Suite.java b/user/test/com/google/gwt/user/UiPart2Suite.java
new file mode 100644
index 0000000..cde0c66
--- /dev/null
+++ b/user/test/com/google/gwt/user/UiPart2Suite.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user;
+
+import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.user.client.ui.HTMLPanelTest;
+import com.google.gwt.user.client.ui.HTMLTest;
+import com.google.gwt.user.client.ui.HeaderPanelTest;
+import com.google.gwt.user.client.ui.HiddenTest;
+import com.google.gwt.user.client.ui.HistoryTest;
+import com.google.gwt.user.client.ui.HorizontalPanelTest;
+import com.google.gwt.user.client.ui.HorizontalSplitPanelTest;
+import com.google.gwt.user.client.ui.HyperlinkTest;
+import com.google.gwt.user.client.ui.ImageTest;
+import com.google.gwt.user.client.ui.InlineHTMLTest;
+import com.google.gwt.user.client.ui.InlineHyperlinkTest;
+import com.google.gwt.user.client.ui.IsWidgetTest;
+import com.google.gwt.user.client.ui.LabelTest;
+import com.google.gwt.user.client.ui.LazyPanelTest;
+import com.google.gwt.user.client.ui.LinearPanelTest;
+import com.google.gwt.user.client.ui.ListBoxTest;
+import com.google.gwt.user.client.ui.MenuBarTest;
+import com.google.gwt.user.client.ui.MenuItemTest;
+import com.google.gwt.user.client.ui.NamedFrameTest;
+import com.google.gwt.user.client.ui.NativeHorizontalScrollbarTest;
+import com.google.gwt.user.client.ui.NativeVerticalScrollbarTest;
+import com.google.gwt.user.client.ui.PopupTest;
+import com.google.gwt.user.client.ui.PrefixTreeTest;
+import com.google.gwt.user.client.ui.RadioButtonTest;
+import com.google.gwt.user.client.ui.ResetButtonTest;
+import com.google.gwt.user.client.ui.ResizeLayoutPanelTest;
+import com.google.gwt.user.client.ui.RichTextAreaTest;
+import com.google.gwt.user.client.ui.RootPanelTest;
+import com.google.gwt.user.client.ui.ScrollPanelTest;
+import com.google.gwt.user.client.ui.SimpleCheckBoxTest;
+import com.google.gwt.user.client.ui.SimpleLayoutPanelTest;
+import com.google.gwt.user.client.ui.SimplePanelTest;
+import com.google.gwt.user.client.ui.SimpleRadioButtonTest;
+import com.google.gwt.user.client.ui.SplitLayoutPanelTest;
+import com.google.gwt.user.client.ui.StackLayoutPanelTest;
+import com.google.gwt.user.client.ui.StackPanelTest;
+import com.google.gwt.user.client.ui.SubmitButtonTest;
+import com.google.gwt.user.client.ui.SuggestBoxTest;
+import com.google.gwt.user.client.ui.TabBarTest;
+import com.google.gwt.user.client.ui.TabLayoutPanelTest;
+import com.google.gwt.user.client.ui.TabPanelTest;
+import com.google.gwt.user.client.ui.TextAreaTest;
+import com.google.gwt.user.client.ui.TreeItemTest;
+import com.google.gwt.user.client.ui.TreeTest;
+import com.google.gwt.user.client.ui.UIObjectTest;
+import com.google.gwt.user.client.ui.ValueBoxBaseTest;
+import com.google.gwt.user.client.ui.ValueListBoxTest;
+import com.google.gwt.user.client.ui.VerticalPanelTest;
+import com.google.gwt.user.client.ui.VerticalSplitPanelTest;
+import com.google.gwt.user.client.ui.WidgetCollectionTest;
+import com.google.gwt.user.client.ui.WidgetIteratorsTest;
+import com.google.gwt.user.client.ui.WidgetOnLoadTest;
+import com.google.gwt.user.client.ui.WidgetSubclassingTest;
+import com.google.gwt.user.client.ui.WidgetTest;
+
+import junit.framework.Test;
+
+/**
+ * Tests in the user.client.ui package that start with H-Z.
+ * @see UiPart1Suite
+ */
+public class UiPart2Suite {
+  public static Test suite() {
+    GWTTestSuite suite = new GWTTestSuite("Test for suite for all user widgets");
+
+    suite.addTestSuite(HeaderPanelTest.class);
+    suite.addTestSuite(HiddenTest.class);
+    suite.addTestSuite(HistoryTest.class);
+    suite.addTestSuite(HorizontalPanelTest.class);
+    suite.addTestSuite(HorizontalSplitPanelTest.class);
+    suite.addTestSuite(HTMLPanelTest.class);
+    suite.addTestSuite(HTMLTest.class);
+    suite.addTestSuite(HyperlinkTest.class);
+    suite.addTestSuite(ImageTest.class);
+    suite.addTestSuite(InlineHTMLTest.class);
+    suite.addTestSuite(InlineHyperlinkTest.class);
+    suite.addTestSuite(IsWidgetTest.class);
+    suite.addTestSuite(LabelTest.class);
+    suite.addTestSuite(LazyPanelTest.class);
+    suite.addTestSuite(LinearPanelTest.class);
+    suite.addTestSuite(ListBoxTest.class);
+    suite.addTestSuite(MenuBarTest.class);
+    suite.addTestSuite(MenuItemTest.class);
+    suite.addTestSuite(NamedFrameTest.class);
+    suite.addTestSuite(NativeHorizontalScrollbarTest.class);
+    suite.addTestSuite(NativeVerticalScrollbarTest.class);
+    suite.addTestSuite(PopupTest.class);
+    suite.addTestSuite(PrefixTreeTest.class);
+    suite.addTestSuite(RadioButtonTest.class);
+    suite.addTestSuite(ResetButtonTest.class);
+    suite.addTestSuite(ResizeLayoutPanelTest.class);
+    suite.addTestSuite(RichTextAreaTest.class);
+    suite.addTestSuite(RootPanelTest.class);
+    suite.addTestSuite(ScrollPanelTest.class);
+    suite.addTestSuite(SimpleCheckBoxTest.class);
+    suite.addTestSuite(SimpleRadioButtonTest.class);
+    suite.addTestSuite(SimplePanelTest.class);
+    suite.addTestSuite(SimpleLayoutPanelTest.class);
+    suite.addTestSuite(SplitLayoutPanelTest.class);
+    suite.addTestSuite(StackLayoutPanelTest.class);
+    suite.addTestSuite(StackPanelTest.class);
+    suite.addTestSuite(SubmitButtonTest.class);
+    suite.addTestSuite(SuggestBoxTest.class);
+    suite.addTestSuite(TabBarTest.class);
+    suite.addTestSuite(TabLayoutPanelTest.class);
+    suite.addTestSuite(TabPanelTest.class);
+    suite.addTestSuite(TextAreaTest.class);
+    suite.addTestSuite(TreeTest.class);
+    suite.addTestSuite(TreeItemTest.class);
+    suite.addTestSuite(UIObjectTest.class);
+    suite.addTestSuite(ValueBoxBaseTest.class);
+    suite.addTestSuite(ValueListBoxTest.class);
+    suite.addTestSuite(VerticalPanelTest.class);
+    suite.addTestSuite(VerticalSplitPanelTest.class);
+    suite.addTestSuite(WidgetCollectionTest.class);
+    suite.addTestSuite(WidgetIteratorsTest.class);
+    suite.addTestSuite(WidgetOnLoadTest.class);
+    suite.addTestSuite(WidgetSubclassingTest.class);
+    suite.addTestSuite(WidgetTest.class);
+    return suite;
+  }
+}
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java b/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
index 3e1177e..1b74f13 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
@@ -269,16 +269,23 @@
   public void testCellEvent() {
     IndexCell<String> cell = new IndexCell<String>("click");
     T table = createAbstractHasData(cell);
+    
     RootPanel.get().add(table);
     table.setRowData(createData(0, 10));
     table.getPresenter().flush();
 
-    // Trigger an event at index 5.
+    // Trigger an event at index 5 inside the child div.
     NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
     getBodyElement(table, 5, 0).getFirstChildElement().dispatchEvent(event);
     cell.assertLastBrowserEventIndex(5);
     cell.assertLastEditingIndex(5);
 
+    // Trigger an event at index 3 outside the child div.
+    event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
+    getBodyElement(table, 3, 0).dispatchEvent(event);
+    cell.assertLastBrowserEventIndex(3);
+    cell.assertLastEditingIndex(3);
+
     RootPanel.get().remove(table);
   }
 
diff --git a/user/test/com/google/gwt/user/client/ResizeHelper.java b/user/test/com/google/gwt/user/client/ResizeHelper.java
new file mode 100644
index 0000000..1a267eb
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ResizeHelper.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client;
+
+
+import com.google.gwt.regexp.shared.MatchResult;
+import com.google.gwt.regexp.shared.RegExp;
+import com.google.gwt.user.client.Window.Navigator;
+
+import junit.framework.Assert;
+
+/**
+ * Calculates the sizes for Window extras such as border, menu, tool bar, and stores the original
+ * sizes to restore at the end of test.
+ */
+public final class ResizeHelper {
+
+  private static int extraWidth;
+  private static int extraHeight;
+
+  static {
+    // FF4 on win can start in 'almost' fullscreen when the window title bar
+    // is hidden but accounted incorrectly, so, move the window and resize to
+    // smaller size first, to take it out of 'full screen mode'.
+    Window.moveTo(10, 10);
+    Window.resizeTo(700, 500);
+
+    extraWidth = 700 - Window.getClientWidth();
+    extraHeight = 500 - Window.getClientHeight();
+  }
+
+  public static void resizeBy(int width, int height) {
+    Window.resizeBy(width, height);
+  }
+
+  public static void resizeTo(int width, int height) {
+    Window.resizeTo(width, height);
+  }
+
+  public static void assertSize(int width, int height) {
+    Assert.assertEquals(width, Window.getClientWidth() + extraWidth);
+    Assert.assertEquals(height, Window.getClientHeight() + extraHeight);
+  }
+
+  public static boolean isResizeSupported() {
+    String userAgent = Navigator.getUserAgent();
+    if (userAgent.contains("Chrome")) {
+      return false; // All versions of Chrome are upsupported
+    }
+
+    if (userAgent.contains("Firefox")) {
+      RegExp versionRegExp = RegExp.compile("Firefox[\\/\\s](\\d+)\\.\\d+", "ig");
+      MatchResult result = versionRegExp.exec(userAgent);
+      if (result != null) {
+        int version = Integer.parseInt(result.getGroup(1));
+        return version < 7; // Resize is unsupported for Firefox 7 and newer.
+      }
+    }
+    return true;
+  }
+}
diff --git a/user/test/com/google/gwt/user/client/WindowTest.java b/user/test/com/google/gwt/user/client/WindowTest.java
index 085a91d..10d1e8a 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -16,11 +16,14 @@
 package com.google.gwt.user.client;
 
 import com.google.gwt.core.client.JavaScriptException;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.RepeatingCommand;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.event.logical.shared.ResizeEvent;
 import com.google.gwt.event.logical.shared.ResizeHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.http.client.UrlBuilder;
 import com.google.gwt.http.client.URL;
+import com.google.gwt.http.client.UrlBuilder;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 import com.google.gwt.junit.client.GWTTestCase;
@@ -222,7 +225,7 @@
     largeDOM.setPixelSize(oldClientWidth + 100, oldClientHeight + 100);
     RootPanel.get().add(largeDOM);
     delayTestFinish(1000);
-    DeferredCommand.addCommand(new Command() {
+    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
       public void execute() {
         int newClientHeight = Window.getClientHeight();
         int newClientWidth = Window.getClientWidth();
@@ -234,118 +237,15 @@
     });
   }
 
-  /**
-   * Calculates the sizes for Window extras such as border, menu, tool bar, and
-   * stores the original sizes to restore at the end of test.
-   */
-  public static final class ResizeHelper {
-    private static int clientHeight;
-    private static int clientWidth;
-    private static int extraWidth;
-    private static int extraHeight;
-    private static boolean initialized;
-
-    public static int getExtraHeight() {
-      ensureInitialized();
-      return extraHeight;
-    }
-
-    public static int getExtraWidth() {
-      ensureInitialized();
-      return extraWidth;
-    }
-
-    /**
-     * Wraps {@code Window#resizeBy(int, int)} to ensure initialized. This may
-     * be a no-op in Chrome.
-     *
-     * @param width
-     * @param height
-     * @return Whether this operation is done
-     */
-    public static boolean resizeBy(int width, int height) {
-      if (ensureInitialized()) {
-        Window.resizeBy(width, height);
-      }
-      return initialized;
-    }
-
-    /**
-     * Wraps {@code Window#resizeTo(int, int)} to ensure initialized. This may
-     * be a no-op in Chrome.
-     *
-     * @param width
-     * @param height
-     * @return Whether this operation is done
-     */
-    public static boolean resizeTo(int width, int height) {
-      if (ensureInitialized()) {
-        Window.resizeTo(width, height);
-      }
-      return initialized;
-    }
-
-    public static void restoreSize() {
-      // Ignore if not initialized
-      if (initialized) {
-        Window.resizeTo(clientWidth + extraWidth, clientHeight + extraHeight);
-      }
-    }
-
-    private static synchronized boolean ensureInitialized() {
-      if (!initialized) {
-        init();
-      }
-      return initialized;
-    }
-
-    private static void init() {
-      // resizeTo works in Chrome if the window is opened by Window.open(),
-      // which is the case when testing with Selenium and the server is started
-      // with -multiWin. However, the size change is deferred. The test would
-      // involve many nested DeferredCommand.
-      if (Navigator.getUserAgent().toLowerCase().contains("chrome")) {
-        return;
-      }
-
-      // FF4 on win can start in 'almost' fullscreen when the window title bar 
-      // is hidden but accounted incorrectly, so, move the window and resize to 
-      // smaller size first, to take it out of 'full screen mode'.
-      Window.moveTo(10,10);
-      Window.resizeTo(700, 500);
-
-      // store the original size (to be used in restoreSize)
-      clientHeight = Window.getClientHeight();
-      clientWidth = Window.getClientWidth();
-      // IE cannot resize window out of the screen, so we need to move the
-      // window such that it can be resized to below size.
-      // We do not have method to return the window coordinates (screenLeft,
-      // screenTop), so this move is not undone.
-      Window.moveTo(0,0);
-
-      // clientWidth is innerWidth, resizeTo specifies outerWidth
-      // Let's find out the delta for extras such as border, menu, tool bar.
-      // If the sizes are too small to show the extras, resizeTo may not set the
-      // sizes as requested.
-      // If the sizes are too big, for example, height > screen.availHeight + 40
-      // on FF, resizeTo silently sets the height to screen.availHeight + 40.
-      // Some test machines are configured at this time as 800x600, reduce the size 
-      // to give some 'buffer'
-      Window.resizeTo(750, 550);
-      extraWidth = 750 - Window.getClientWidth();
-      extraHeight = 550 - Window.getClientHeight();
-      initialized = true;
-      restoreSize();
-    }
-  }
-
   private static final class TestResizeHandler implements ResizeHandler {
     private int height;
     private int width;
+    private boolean called;
 
     public void onResize(ResizeEvent event) {
       width = event.getWidth();
       height = event.getHeight();
+      called = true;
     }
 
     public int getHeight() {
@@ -355,6 +255,10 @@
     public int getWidth() {
       return width;
     }
+
+    public boolean isCalled() {
+      return called;
+    }
   }
 
   /**
@@ -362,42 +266,37 @@
    */
   @DoNotRunWith({Platform.HtmlUnitLayout})
   public void testResizing() {
+    // There is nothing to test if the browser doesn't support resize
+    if (!ResizeHelper.isResizeSupported()) {
+      return;
+    }
+
     clearBodyContent();
 
-    // Handler for resize events
-    final TestResizeHandler resizeHandler = new TestResizeHandler();
-    final HandlerRegistration handlerRegistration = Window.addResizeHandler(resizeHandler);
+    final int width = 600;
+    final int height = 500;
 
-    delayTestFinish(2000);
-    DeferredCommand.addCommand(new Command() {
-      public void execute() {
-        // Sizes must be appropriate, otherwise browsers may not resize as
-        // requested. See comments in ResizeHelper.
-        int width = 600;
-        int height = 500;
-        // ensureInitialized could fail on Chrome
-        if (!ResizeHelper.resizeTo(width, height)) {
-          handlerRegistration.removeHandler();
-          finishTest(); // nothing we can test
+    final TestResizeHandler handler = new TestResizeHandler();
+    final HandlerRegistration handlerRegistration = Window.addResizeHandler(handler);
+
+    ResizeHelper.resizeTo(width, height);
+    ResizeHelper.assertSize(width, height);
+    ResizeHelper.resizeBy(10, 20);
+    ResizeHelper.assertSize(width + 10, height + 20);
+
+    delayTestFinish(1000);
+    Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
+      public boolean execute() {
+        if (!handler.isCalled()) {
+          return true; // we still didn't receive the callback, let's wait more
         }
-
-        assertEquals(width, Window.getClientWidth() + ResizeHelper.getExtraWidth());
-        assertEquals(height, Window.getClientHeight() + ResizeHelper.getExtraHeight());
-        // TODO: TestResizeHandler.getWidth() returns 0 -- need to investigate
-        // assertEquals(resizeHandler.getWidth(), Window.getClientWidth());
-        // assertEquals(resizeHandler.getHeight(), Window.getClientHeight());
-        ResizeHelper.resizeBy(10, 20);
-        assertEquals(width + 10, Window.getClientWidth() + ResizeHelper.getExtraWidth());
-        assertEquals(height + 20, Window.getClientHeight() + ResizeHelper.getExtraHeight());
-        // assertEquals(resizeHandler.getWidth(), Window.getClientWidth());
-        // assertEquals(resizeHandler.getHeight(), Window.getClientHeight());
-
-        // Cleanup the window
+        assertEquals(Window.getClientWidth(), handler.getWidth());
+        assertEquals(Window.getClientHeight(), handler.getHeight());
         handlerRegistration.removeHandler();
-        ResizeHelper.restoreSize();
         finishTest();
+        return false;
       }
-    });
+    }, 10);
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java b/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
index 2691c34..b694fae 100644
--- a/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
@@ -18,12 +18,10 @@
 import com.google.gwt.http.client.Request;
 import com.google.gwt.user.client.rpc.impl.FailedRequest;
 
-import junit.framework.TestCase;
-
 /**
  * Tests the {@link com.google.gwt.user.client.rpc.impl.FailedRequest} class.
  */
-public class FailedRequestTest extends TestCase {
+public class FailedRequestTest extends RpcTestBase {
   public void testBasics() {
     Request failedRequest = new FailedRequest();
     assertFalse(failedRequest.isPending());
diff --git a/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java b/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
index effa813..4dcb045 100644
--- a/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
@@ -19,12 +19,10 @@
 import com.google.gwt.http.client.RequestException;
 import com.google.gwt.user.client.rpc.impl.FailingRequestBuilder;
 
-import junit.framework.TestCase;
-
 /**
  * Tests the {@link FailingRequestBuilder} class.
  */
-public class FailingRequestBuilderTest extends TestCase {
+public class FailingRequestBuilderTest extends RpcTestBase {
   public void testBasics() throws RequestException {
     final boolean[] callbackCalled = new boolean[] {false};
 
diff --git a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java
index e3b84df..f241687 100644
--- a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTest.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.user.client.rpc;
 
-import com.google.gwt.user.client.rpc.RecursiveClassTestService.ResultNode;
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.rpc.RecursiveClassTestService.ResultNode;
 
 /**
  * Class used to test generics with wild cards and recursive references.
@@ -26,18 +26,19 @@
   /**
    * This method is used to test generics with wild cards and recursive references.
    */
+  @SuppressWarnings({"unchecked", "rawtypes"})
   public void testRecursiveClass() {
     RecursiveClassTestServiceAsync service = getServiceAsync();
     delayTestFinishForRpc();
    
-    service.greetServer("Hello", new AsyncCallback<ResultNode>() {
+    service.greetServer("Hello", new AsyncCallback() {
       public void onFailure(Throwable caught) {
         TestSetValidator.rethrowException(caught);
       }
 
-      public void onSuccess(ResultNode result) {
+      public void onSuccess(Object result) {
         assertNotNull(result);
-        assertTrue(TestSetValidator.isValidRecurisveClassObject(result));
+        assertTrue(result instanceof ResultNode);
         finishTest();
       }
     });
diff --git a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java
index 61fd819..6436f45 100644
--- a/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/RecursiveClassTestServiceAsync.java
@@ -21,6 +21,6 @@
  * Service used to test generics with wild cards and recursive references.
  */
 public interface RecursiveClassTestServiceAsync {
-  <U extends ResultNode<?>> void greetServer(String input, AsyncCallback<ResultNode> callback)
-    throws IllegalArgumentException;
+  <U extends ResultNode<U>> void greetServer(String input, AsyncCallback<ResultNode<U>> callback)
+      throws IllegalArgumentException;
 }
diff --git a/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java b/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
index f5601b0..76fb619 100644
--- a/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
+++ b/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
@@ -31,7 +31,6 @@
 import com.google.gwt.user.client.rpc.TestSetFactory.SerializableGraphWithCFS;
 import com.google.gwt.user.client.rpc.TestSetFactory.SerializablePrivateNoArg;
 import com.google.gwt.user.client.rpc.TestSetFactory.SerializableWithTwoArrays;
-import com.google.gwt.user.client.rpc.RecursiveClassTestService.ResultNode;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
@@ -39,9 +38,9 @@
 import static junit.framework.Assert.assertSame;
 
 import java.util.ArrayList;
+import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.EnumMap;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -49,11 +48,11 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.Vector;
-import java.util.Map.Entry;
 
 /**
  * Misnamed set of static validation methods used by various collection class
@@ -806,10 +805,6 @@
     return true;
   }
   
-  public static boolean isValidRecurisveClassObject(ResultNode<? extends ResultNode<?>> result) {
-    return (result != null);
-  }
-
   public static boolean isValidSingletonList(List<MarkerTypeSingleton> list) {
     if (list == null || list.size() != 1) {
       return false;
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
index f1fe049..5aee0b3 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
@@ -59,6 +59,11 @@
   }
 
   /**
+   * Returns the input string unmodified.
+   */
+  String echo(String str);
+
+  /**
    * Returns a string containing the characters from start to end.
    * 
    * Used to verify server->client escaping.
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
index 6ae9fd4..f998680 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
@@ -21,6 +21,7 @@
  * Async version of the {@link UnicodeEscapingService} interface.
  */
 public interface UnicodeEscapingServiceAsync {
+  void echo(String str, AsyncCallback<String> callback);
   void getStringContainingCharacterRange(int start, int end,
       AsyncCallback<String> callback);
   void verifyStringContainingCharacterRange(int start, int end, String str,
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
index 0a8c7fa..defb3c1 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
@@ -315,4 +315,40 @@
           }
         });
   }
+
+  /**
+   * Verify that string encoding/decoding is lossless.
+   */
+  private void echoVerify(final String str) {
+    delayTestFinish(TEST_FINISH_DELAY_MS);
+    getService().echo(str, new AsyncCallback<String>() {
+      @Override
+      public void onFailure(Throwable caught) {
+        TestSetValidator.rethrowException(caught);
+      }
+
+      @Override
+      public void onSuccess(String result) {
+        assertEquals(str, result);
+        finishTest();
+      }
+    });
+  }
+
+  /**
+   * Test that a NUL character followed by an octal character is encoded
+   * correctly.  Encoding the NUL character simply as "\0" in this case
+   * would cause the recipient to see "\07" as a single octal escape sequence,
+   * rather than two separate characters.
+   */
+  public void testEscapeNull() {
+    echoVerify("\u0000" + "7");  // split to emphasize two characters
+  }
+
+  /**
+   * Test that HTML special characters are encoded correctly.
+   */
+  public void testEscapeHtml() {
+    echoVerify("<img src=x onerror=alert(1)>");
+  }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
index 6f38b6e..9f0b8e2 100644
--- a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
@@ -29,9 +29,7 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
 
 /**
  * Test for <code>PushButton</code> as most of this widget's functionality is UI
@@ -84,29 +82,25 @@
     b.setDown(true);
     assertEquals(b.getStylePrimaryName(), "random");
 
-    Map faces = new HashMap();
+    Map<String, Face> faces = new HashMap<String, Face>();
     faces.put("downDisabled", b.getDownDisabledFace());
     faces.put("upDisabled", b.getUpDisabledFace());
     faces.put("down", b.getDownFace());
     faces.put("up", b.getUpFace());
     faces.put("upHovering", b.getUpHoveringFace());
     faces.put("downHovering", b.getDownHoveringFace());
-    Iterator entries = faces.entrySet().iterator();
     // Set all faces as text.
-    while (entries.hasNext()) {
-      Map.Entry entry = (Entry) entries.next();
-      Face f = (Face) entry.getValue();
+    for (Map.Entry<String, Face> entry : faces.entrySet()) {
+      Face f = entry.getValue();
       b.setCurrentFace(f);
       assertEquals("random", b.getStylePrimaryName());
       assertTrue(b.getStyleName().indexOf("random-" + f.getName()) != -1);
     }
 
-    entries = faces.entrySet().iterator();
     b.addStyleName("fobar");
     // Set all faces as text.
-    while (entries.hasNext()) {
-      Map.Entry entry = (Entry) entries.next();
-      Face f = (Face) entry.getValue();
+    for (Map.Entry<String, Face> entry : faces.entrySet()) {
+      Face f = entry.getValue();
       b.setCurrentFace(f);
       String computedStyleName = DOM.getElementProperty(b.getElement(),
           "className");
@@ -118,43 +112,37 @@
 
   public void testSettingFaces() {
     PushButton b = new PushButton();
-    Map faces = new HashMap();
+    Map<String, Face> faces = new HashMap<String, Face>();
     faces.put("downDisabled", b.getDownDisabledFace());
     faces.put("upDisabled", b.getUpDisabledFace());
     faces.put("down", b.getDownFace());
     faces.put("up", b.getUpFace());
     faces.put("upHovering", b.getUpHoveringFace());
     faces.put("downHovering", b.getDownHoveringFace());
-    Iterator entries = faces.entrySet().iterator();
 
     // Set all faces as text.
-    while (entries.hasNext()) {
-      Map.Entry entry = (Entry) entries.next();
-      Face f = (Face) entry.getValue();
-      String faceName = (String) entry.getKey();
+    for (Map.Entry<String, Face> entry : faces.entrySet()) {
+      Face f = entry.getValue();
+      String faceName = entry.getKey();
       f.setText(faceName);
     }
-    entries = faces.entrySet().iterator();
-    while (entries.hasNext()) {
-      Map.Entry entry = (Entry) entries.next();
-      Face f = (Face) entry.getValue();
-      String faceName = (String) entry.getKey();
+    
+    for (Map.Entry<String, Face> entry : faces.entrySet()) {
+      Face f = entry.getValue();
+      String faceName = entry.getKey();
       assertEquals(f.getText(), faceName);
     }
+    
     // Set all faces as HTML
-    entries = faces.entrySet().iterator();
-    while (entries.hasNext()) {
-      Map.Entry entry = (Entry) entries.next();
-      Face f = (Face) entry.getValue();
-      String faceName = (String) entry.getKey();
+    for (Map.Entry<String, Face> entry : faces.entrySet()) {
+      Face f = entry.getValue();
+      String faceName = entry.getKey();
       f.setHTML("<b>" + faceName + "</b>");
     }
 
-    entries = faces.entrySet().iterator();
-    while (entries.hasNext()) {
-      Map.Entry entry = (Entry) entries.next();
-      Face f = (Face) entry.getValue();
-      String faceName = (String) entry.getKey();
+    for (Map.Entry<String, Face> entry : faces.entrySet()) {
+      Face f = entry.getValue();
+      String faceName = entry.getKey();
       assertEquals(f.getText(), faceName);
       assertEquals(f.getHTML().toLowerCase(), "<b>" + faceName.toLowerCase()
           + "</b>");
diff --git a/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java b/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java
index b6057b4..71f50b1 100644
--- a/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java
+++ b/user/test/com/google/gwt/user/client/ui/FastStringMapProfile.java
@@ -22,7 +22,7 @@
  */
 public class FastStringMapProfile extends WidgetProfile {
 
-  Map m;
+  Map<String, Integer> m;
 
   public void testTiming() throws Exception {
     m = putTiming(32000);
@@ -46,8 +46,8 @@
     this.timing("get(" + size + ")");
   }
 
-  public FastStringMap putTiming(int size) {
-    FastStringMap m1 = new FastStringMap();
+  public FastStringMap<Integer> putTiming(int size) {
+    FastStringMap<Integer> m1 = new FastStringMap<Integer>();
     this.resetTimer();
     for (int i = 0; i < size; i++) {
       Integer iVal = new Integer(size);
diff --git a/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java b/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java
index a033ba7..cc86737 100644
--- a/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java
+++ b/user/test/com/google/gwt/user/client/ui/HTMLTableProfile.java
@@ -70,7 +70,7 @@
 
   public void hashMapShare(int rows, int columns) {
     resetTimer();
-    HashMap m = new HashMap();
+    HashMap<String, Label> m = new HashMap<String, Label>();
     for (int row = 0; row < rows; row++) {
       for (int column = 0; column < columns; column++) {
         Label label = new Label(column + "i");
diff --git a/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java b/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
index d25665c..ff54a362 100644
--- a/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
+++ b/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
@@ -76,4 +76,8 @@
       // Success
     }
   }
+
+  public void testDefaultSrc() {
+    assertEquals("javascript:''", new NamedFrame("defaultSrc").getUrl());
+  }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java b/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
index 7cabdd7..38e8d5e 100644
--- a/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
@@ -18,7 +18,6 @@
 import com.google.gwt.junit.client.GWTTestCase;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -126,7 +125,7 @@
    * Tests newly constructed prefix tree assumptions.
    */
   public void testPlaysWellWithOthers() {
-    final List l = new ArrayList();
+    final List<String> l = new ArrayList<String>();
     for (int i = 0; i < 100; i++) {
       l.add(String.valueOf(i));
     }
@@ -168,7 +167,7 @@
     testSizeByIterator(tree);
     assertTrue(tree.iterator().hasNext());
 
-    List l;
+    List<String> l;
 
     l = tree.getSuggestions("", 13);
     assertTrue("Expected size of 13, got " + l.size(), l.size() == 13);
@@ -188,7 +187,7 @@
 
     l = tree.getSuggestions("o", 1);
     assertTrue("Expected size of 1, got " + l.size(), l.size() == 1);
-    assertTrue(((String) l.get(0)).endsWith("..."));
+    assertTrue(l.get(0).endsWith("..."));
     assertAllStartWith(l, "o");
 
     l = tree.getSuggestions("something", 1);
@@ -197,9 +196,8 @@
     assertAllStartWith(l, "somethingdifferent");
   }
 
-  protected void assertAllStartWith(List l, String prefix) {
-    for (final Iterator i = l.iterator(); i.hasNext();) {
-      final String test = (String) i.next();
+  protected void assertAllStartWith(List<String> l, String prefix) {
+    for (String test : l) {
       assertTrue(test + " does not start with " + prefix,
           test.startsWith(prefix));
     }
@@ -213,8 +211,7 @@
    */
   protected void testSizeByIterator(PrefixTree tree) {
     int count = 0;
-    for (final Iterator i = tree.iterator(); i.hasNext();) {
-      i.next();
+    for (@SuppressWarnings("unused") String s : tree) {
       count++;
     }
 
diff --git a/user/test/com/google/gwt/user/client/ui/TreeTest.java b/user/test/com/google/gwt/user/client/ui/TreeTest.java
index 212b901..dfcda3a 100644
--- a/user/test/com/google/gwt/user/client/ui/TreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TreeTest.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.junit.DoNotRunWith;
+import com.google.gwt.junit.Platform;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
 import com.google.gwt.user.client.DOM;
@@ -344,6 +346,55 @@
       // Expected.
     }
   }
+  
+  @DoNotRunWith(Platform.HtmlUnitLayout)
+  public void testScrollOnSelectEnabledFalse() {
+    // With scrolling disabled.
+    Tree tree = createTree();
+    tree.setScrollOnSelectEnabled(false);
+    assertScrollingOnSelection(tree, false);
+  }
+
+  @DoNotRunWith(Platform.HtmlUnitLayout)
+  public void testScrollOnSelectEnabledTrue() {
+    // With scrolling enabled (default)
+    Tree tree = createTree();
+    assertTrue(tree.isScrollOnSelectEnabled());
+    assertScrollingOnSelection(tree, true);
+  }
+
+  private void assertScrollingOnSelection(Tree tree, boolean shouldScroll) {
+    tree.addItem(new Label("hello1"));
+    tree.addItem(new Label("hello2"));
+    TreeItem levelZeroTreeItem = tree.addItem(new Label("level0"));
+    TreeItem selectedItem = levelZeroTreeItem.addItem(new Label("level1"));
+    selectedItem.addItem(SafeHtmlUtils.fromString("level2"));
+
+    // For the tree to be opened. Otherwise, all sizes will be zero and no scrolling would occur,
+    // regardless of the mode.
+    levelZeroTreeItem.setState(true);
+    selectedItem.setState(true);
+
+    ScrollPanel panel = new ScrollPanel();
+    RootPanel.get().add(panel);
+    panel.setWidget(tree);
+    
+    // Set a size that is smaller than the content to allow scrolling
+    panel.setPixelSize(40, 90);
+
+    assertEquals(0, panel.getVerticalScrollPosition());
+    assertEquals(0, panel.getHorizontalScrollPosition());
+
+    tree.setSelectedItem(selectedItem);
+
+    if (shouldScroll) {
+      assertTrue("Expected vertical scroll", panel.getVerticalScrollPosition() != 0);
+      assertTrue("Expected horizontal scroll", panel.getHorizontalScrollPosition() != 0);
+    } else {
+      assertEquals("Expected no vertical scroll", 0, panel.getVerticalScrollPosition());
+      assertEquals("Expected no horizontal scroll", 0, panel.getHorizontalScrollPosition());
+    }
+  }
 
   public void testSwap() {
     Tree t = createTree();
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java b/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
index 33d01ad..121b54c 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetCollectionTest.java
@@ -38,7 +38,7 @@
     public void clear() {
     }
 
-    public Iterator iterator() {
+    public Iterator<Widget> iterator() {
       return null;
     }
 
@@ -88,7 +88,7 @@
     wc.add(l1);
     wc.add(l2);
 
-    Iterator it = wc.iterator();
+    Iterator<Widget> it = wc.iterator();
     assertTrue(it.hasNext());
     assertEquals(it.next(), l0);
     it.remove();
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java b/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java
index 21821cf..fe7ffc7 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetIteratorsTest.java
@@ -37,7 +37,7 @@
       fail("Unexpected call to clear()");
     }
 
-    public Iterator iterator() {
+    public Iterator<Widget> iterator() {
       fail("Unexpected call to iterator()");
       return null;
     }
@@ -56,7 +56,7 @@
    * Tests that empty arrays operate properly.
    */
   public void testEmptyArray() {
-    final Iterator subject = WidgetIterators.createWidgetIterator(
+    final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(
         new MockWidget(), new Widget[] {null, null});
     assertFalse(subject.hasNext());
     assertNextFails(subject);
@@ -80,7 +80,7 @@
       }
     };
 
-    final Iterator subject = WidgetIterators.createWidgetIterator(mock, widgets);
+    final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(mock, widgets);
 
     expectedRemoveIndex[0] = 1;
     assertTrue(subject.hasNext());
@@ -106,7 +106,7 @@
     final MockWidget mock = new MockWidget();
     final Widget[] widgets = new Widget[] {
         null, createTestWidget(), null, createTestWidget(), null, null};
-    final Iterator subject = WidgetIterators.createWidgetIterator(mock, widgets);
+    final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(mock, widgets);
 
     assertTrue(subject.hasNext());
     assertEquals(widgets[1], subject.next());
@@ -118,7 +118,7 @@
     assertNextFails(subject);
   }
 
-  private void assertNextFails(Iterator iterator) {
+  private void assertNextFails(Iterator<Widget> iterator) {
     try {
       iterator.next();
       fail("Expected NoSuchElementException.");
@@ -127,7 +127,7 @@
     }
   }
 
-  private void assertRemoveFails(Iterator iterator) {
+  private void assertRemoveFails(Iterator<Widget> iterator) {
     try {
       iterator.remove();
       fail("Expected IllegalStateException.");
diff --git a/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java b/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
index d5f01a0..88251fa 100644
--- a/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
+++ b/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
@@ -45,11 +45,16 @@
 import com.google.gwt.user.rebind.rpc.testcases.client.ManualSerialization;
 import com.google.gwt.user.rebind.rpc.testcases.client.NoSerializableTypes;
 import com.google.gwt.user.rebind.rpc.testcases.client.NotAllSubtypesAreSerializable;
+import com.google.gwt.user.rebind.rpc.testcases.client.ParameterizedTypeInList;
+import com.google.gwt.user.rebind.rpc.testcases.client.RawTypeInList;
+import com.google.gwt.user.rebind.rpc.testcases.client.SubclassUsedInArray;
 
 import junit.framework.TestCase;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -1925,6 +1930,44 @@
   }
 
   /**
+   * Tests a case where a subtype is visited and then later used to find covariant array types.
+   * (Reproduces a caching issue that depends on the order in which types are visited.)
+   */
+  public void testSubclassUsedInArray() throws NotFoundException, UnableToCompleteException {
+    JClassType expected = arrayType(SubclassUsedInArray.LeafType.class);
+    checkSerializable(expected,
+        eachJType(SubclassUsedInArray.Base.class, SubclassUsedInArray.HasArray.class));
+  }
+
+  /**
+   * Test the case where a root array type has a type parameter as its leaf.
+   */
+  public void testArrayOfTypeParameterExtendsSubclass() throws Exception {
+    JClassType expected = arrayType(SubclassUsedInArray.LeafType.class);
+
+    TypeOracle oracle = getTestTypeOracle();
+    JGenericType genericHasArray = oracle
+        .getType(SubclassUsedInArray.GenericHasArray.class.getCanonicalName()).isGenericType();
+    JTypeParameter typeParameter = genericHasArray.getTypeParameters()[0];
+
+    checkSerializable(expected,
+        oracle.getType(SubclassUsedInArray.Base.class.getCanonicalName()),
+        oracle.getArrayType(typeParameter));
+  }
+
+  public void testRawTypeInList() throws Exception {
+    JClassType expected = arrayType(RawTypeInList.Covariant.class);
+    checkSerializable(expected,
+        eachJType(RawTypeInList.Marker.class, RawTypeInList.HasList.class));
+  }
+
+  public void testParameterizedTypeInList() throws Exception {
+    JClassType expected = arrayType(ParameterizedTypeInList.Covariant.class);
+    checkSerializable(expected,
+        eachJType(ParameterizedTypeInList.Marker.class, ParameterizedTypeInList.HasList.class));
+  }
+
+  /**
    * Tests subtypes that introduce new instantiable type parameters.
    * 
    * @throws UnableToCompleteException
@@ -2027,7 +2070,7 @@
     JClassType foo = to.getType("Foo");
     JClassType bar = to.getType("Bar");
     JClassType intfOfString =
-        to.getParameterizedType(intf, new JClassType[] {to.getType(String.class.getName())});
+        to.getParameterizedType(intf, new JClassType[]{to.getType(String.class.getName())});
     JClassType ser = to.getType("Ser");
 
     SerializableTypeOracleBuilder sob = createSerializableTypeOracleBuilder(logger, to);
@@ -2301,7 +2344,7 @@
 
     JTypeParameter typeParam = c.getTypeParameters()[0];
 
-    JParameterizedType parameterizedType = to.getParameterizedType(a, new JClassType[] {typeParam});
+    JParameterizedType parameterizedType = to.getParameterizedType(a, new JClassType[]{typeParam});
     SerializableTypeOracleBuilder sob = createSerializableTypeOracleBuilder(logger, to);
     sob.addRootType(logger, parameterizedType);
     SerializableTypeOracle so = sob.build(logger);
@@ -2366,6 +2409,78 @@
     assertNotInstantiableOrFieldSerializable(so, a.getRawType());
   }
 
+  /**
+   * Checks that a type is serializable when searching from the given roots.
+   * Also, check that the root order doesn't matter.
+   */
+  private void checkSerializable(JClassType expected, JType... roots)
+      throws UnableToCompleteException {
+    roots = Arrays.copyOf(roots, roots.length);
+
+    // find serializable types in forward and reverse order
+    SerializableTypeOracle forwardResult = findSerializable(roots);
+    Collections.reverse(Arrays.asList(roots));
+    SerializableTypeOracle reverseResult = findSerializable(roots);
+
+    // check that the expected type is serializable
+    boolean forwardOk = forwardResult.isSerializable(expected);
+    boolean reverseOk = reverseResult.isSerializable(expected);
+    if (!forwardOk && !reverseOk) {
+      fail(expected + " is not serializable from " + join(", ", roots) + " in either order");
+    }
+    if (!forwardOk || !reverseOk) {
+      fail(expected + " is not serializable from " + join(", ", roots) + " in both orders");
+    }
+
+    // also check that other serializable types are stable
+    checkSameSerializables(forwardResult, reverseResult);
+  }
+
+  private SerializableTypeOracle findSerializable(JType... rootTypes)
+      throws UnableToCompleteException {
+    TreeLogger logger = createLogger();
+    TypeOracle oracle = getTestTypeOracle();
+    SerializableTypeOracleBuilder builder =
+        createSerializableTypeOracleBuilder(logger, oracle);
+    for (JType root : rootTypes) {
+      builder.addRootType(logger, root);
+    }
+    return builder.build(logger);
+  }
+
+  private JType[] eachJType(Class... classes) throws UnableToCompleteException {
+    TypeOracle oracle = getTestTypeOracle();
+    List<JType> result = new ArrayList<JType>();
+    for (Class aClass : classes) {
+      result.add(oracle.findType(aClass.getCanonicalName()));
+    }
+    return result.toArray(new JType[result.size()]);
+  }
+
+  private void checkSameSerializables(SerializableTypeOracle first, SerializableTypeOracle second) {
+    String firstTypes = join("\n", first.getSerializableTypes());
+    String secondTypes = join("\n", second.getSerializableTypes());
+    assertEquals("type oracles differ", firstTypes, secondTypes);
+  }
+
+  private JClassType arrayType(Class<?> itemType)
+      throws UnableToCompleteException, NotFoundException {
+    TypeOracle typeOracle = getTestTypeOracle();
+    JClassType leaf = typeOracle.getType(itemType.getCanonicalName());
+    return typeOracle.getArrayType(leaf);
+  }
+
+  private <T> String join(String delimiter, T... items) {
+    StringBuilder result = new StringBuilder();
+    for (int i = 0; i < items.length; i++) {
+      if (i > 0) {
+        result.append(delimiter);
+      }
+      result.append(items[i]);
+    }
+    return result.toString();
+  }
+
   private JClassType[] makeArray(JClassType... elements) {
     return elements;
   }
diff --git a/user/test/com/google/gwt/user/rebind/rpc/SerializationUtilsTest.java b/user/test/com/google/gwt/user/rebind/rpc/SerializationUtilsTest.java
new file mode 100644
index 0000000..3c8a5cc
--- /dev/null
+++ b/user/test/com/google/gwt/user/rebind/rpc/SerializationUtilsTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2013 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.rebind.rpc;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.NotFoundException;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.javac.TypeOracleTestingUtils;
+import com.google.gwt.dev.javac.testing.impl.StaticJavaResource;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for {@link SerializationUtils}.
+ */
+public class SerializationUtilsTest extends TestCase {
+
+  public void testGetSerializationSignatureUseEnumConstants() throws Throwable {
+    assertEquals("Identical enums have different signature",
+        getEnumSerializationSignature("FOO, BAR, BAZ"),
+        getEnumSerializationSignature("FOO, BAR, BAZ"));
+
+    assertFalse("Enums w/ renamed constant have same signature",
+        getEnumSerializationSignature("FOO, BAR, BAZ").equals(
+            getEnumSerializationSignature("FOO, BAZ, BAR")));
+    // reordering is equivalent to renaming, but let's test it anyway
+    assertFalse("Enums w/ reordered constants have same signature",
+        getEnumSerializationSignature("FOO, BAR, BAZ").equals(
+            getEnumSerializationSignature("FOO, BAZ, BAR")));
+
+    assertFalse("Enums w/ added constant have same signature",
+        getEnumSerializationSignature("FOO, BAR, BAZ").equals(
+            getEnumSerializationSignature("FOO, BAR, BAZ, QUUX")));
+    assertFalse("Enums w/ removed constant have same signature",
+        getEnumSerializationSignature("FOO, BAR, BAZ").equals(
+            getEnumSerializationSignature("FOO, BAR")));
+
+    assertEquals("Enums w/ changed implementation have different signature",
+        getEnumSerializationSignature("FOO, BAR, BAZ"),
+        getEnumSerializationSignature("FOO, BAR { @Override public String toString() { return \"QUUX\"; } }, BAZ"));
+  }
+
+  protected String getEnumSerializationSignature(String constants) throws NotFoundException {
+    TypeOracle to = TypeOracleTestingUtils.buildStandardTypeOracleWith(TreeLogger.NULL,
+        new StaticJavaResource("TestEnum", "public enum TestEnum { " + constants + " }"));
+    JClassType enumType = to.getType("TestEnum");
+    return SerializationUtils.getSerializationSignature(to, enumType);
+  }
+}
diff --git a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/ParameterizedTypeInList.java b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/ParameterizedTypeInList.java
new file mode 100644
index 0000000..061a6a6
--- /dev/null
+++ b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/ParameterizedTypeInList.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.user.rebind.rpc.testcases.client;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Sets up the situation where we need to find the covariant arrays of a List that
+ * contains a parameterized type.
+ */
+public class ParameterizedTypeInList {
+
+  /**
+   * A root type to make sure we visit Item as a subtype first
+   * (so that its subtypes aren't cached).
+   */
+  public interface Marker extends Serializable {
+  }
+
+  /**
+   * A root type that uses Item as a parameterized type in a List.
+   * (GWT-RPC automatically adds the corresponding array types for lists.)
+   */
+  public static class HasList implements Serializable {
+    List<Item<String>> field;
+  }
+
+  /**
+   * A parameterized type.
+   */
+  public static class Item<T extends Comparable> implements Marker {
+    T field;
+  }
+
+  /**
+   * Arrays of this type should be added as well.
+   */
+  public static class Covariant extends Item<String> {
+  }
+}
diff --git a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/RawTypeInList.java b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/RawTypeInList.java
new file mode 100644
index 0000000..c5d37bf
--- /dev/null
+++ b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/RawTypeInList.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.user.rebind.rpc.testcases.client;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Sets up the situation where we need to find the covariant arrays of a List that
+ * contains a raw type.
+ */
+public class RawTypeInList {
+
+  /**
+   * A root type to make sure we visit Item as a subtype first
+   * (so that its subtypes aren't cached).
+   */
+  public interface Marker extends Serializable {
+  }
+
+  /**
+   * A root type that uses Item as a raw type in a List.
+   * (GWT-RPC automatically adds the corresponding array types for lists.)
+   */
+  public static class HasList implements Serializable {
+    List<Item> field;
+  }
+
+  /**
+   * A parameterized type.
+   */
+  public static class Item<T extends Comparable> implements Marker {
+    T field;
+  }
+
+  /**
+   * Arrays of this type should be added as well.
+   */
+  public static class Covariant extends Item<String> {
+  }
+}
diff --git a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/SubclassUsedInArray.java b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/SubclassUsedInArray.java
new file mode 100644
index 0000000..247875f
--- /dev/null
+++ b/user/test/com/google/gwt/user/rebind/rpc/testcases/client/SubclassUsedInArray.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.rebind.rpc.testcases.client;
+
+import java.io.Serializable;
+
+/**
+ * Sets up a situation where an array type has a covariant type but its leaf's subtypes aren't
+ * cached.
+ */
+public class SubclassUsedInArray {
+
+  /** Root type. */
+  public interface Base extends Serializable {
+  }
+
+  /** Array's leaf type. Not a root so its subtypes aren't cached. */
+  public static class Subtype implements Base {
+    // Has a field so it's not trivially serializable and full analysis will be done.
+    private FieldType fieldType;
+  }
+
+  /** A subtype to trigger a covariant array type. */
+  public static class LeafType extends Subtype {
+  }
+
+  /** Root type to trigger the array. */
+  public static class HasArray implements Serializable {
+    private Subtype[] array;
+  }
+
+  /** Used to create a type parameter with Subtype as its upper bound */
+  public static class GenericHasArray<T extends Subtype> implements Serializable {
+    private T[] array;
+  }
+
+  /** Just a field. */
+  public static class FieldType implements Serializable {
+  }
+}
diff --git a/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java b/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
index 76f155b..d6fc11d 100644
--- a/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
+++ b/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
@@ -23,6 +23,7 @@
 import com.google.gwt.user.client.rpc.SerializedTypeViolationException;
 import com.google.gwt.user.client.rpc.TestSetFactory.ReverseSorter;
 import com.google.gwt.user.server.rpc.RPCTypeCheckCollectionsTest.TestHashSet;
+import com.google.gwt.user.server.rpc.testcases.TypeVariableCycle;
 
 import junit.framework.TestCase;
 
@@ -2458,6 +2459,23 @@
   }
 
   /**
+   * Test for <a href="https://code.google.com/p/google-web-toolkit/issues/detail?id=7779">7779</a>.
+   */
+  public void testTypeVariableCycle() throws Exception {
+
+    // Build an RPC request that calls dereference(hello)
+    RPCTypeCheckFactory builder = new RPCTypeCheckFactory(TypeVariableCycle.class, "dereference");
+    builder.write(TypeVariableCycle.HELLO);
+    String request = builder.toString();
+
+    // Make sure we can decode it.
+    RPCRequest decoded = RPC.decodeRequest(request);
+    Object deserializedArg = decoded.getParameters()[0];
+    assertEquals(TypeVariableCycle.PtrPtr.class, deserializedArg.getClass());
+    assertEquals("hello", ((TypeVariableCycle.PtrPtr) deserializedArg).get());
+  }
+
+  /**
    * This checks that HashMap correctly reports that it is an incorrect type.
    */
   public void testHashMapSpoofingClass() {
@@ -2760,6 +2778,7 @@
    * arguments of a primitive value type with another primitive type.
    */
   public void testValueSpoofing() {
+    boolean returned = false;
     try {
       // When an int appears in place of a string, the result will be the
       // int value indexing the string table, which will result in
@@ -2767,10 +2786,14 @@
       // an incorrect string if the integer value is within range of the string
       // table.
       RPC.decodeRequest(generateIntSpoofingString());
-      fail("Expected ArrayIndexOutOfBoundsException from testValueSpoofing (1)");
-    } catch (ArrayIndexOutOfBoundsException e) {
+      returned = true;
+    } catch (AssertionError e) {
       // Expected
     }
+    if (returned) {
+      fail("RPC.decodeRequest should have thrown.");
+    }
+
     try {
       // When a string pretends to be an int, it simply results in an incorrect
       // integer value.
diff --git a/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java b/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
index c96276a..30ffbe1 100644
--- a/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
+++ b/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
@@ -25,6 +25,13 @@
     UnicodeEscapingService {
 
   /**
+   * @see UnicodeEscapingService#echo(String)
+   */
+  public String echo(String str) {
+    return str;
+  }
+
+  /**
    * @see UnicodeEscapingService#getStringContainingCharacterRange(int, int)
    */
   public String getStringContainingCharacterRange(int start, int end) {
diff --git a/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java b/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java
index 90bb1be..f75f54d 100644
--- a/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java
+++ b/user/test/com/google/gwt/user/server/rpc/impl/StandardSerializationPolicyTest.java
@@ -21,6 +21,7 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Tests for the {@link StandardSerializationPolicy} class.
@@ -117,14 +118,14 @@
   }
 
   StandardSerializationPolicy getStandardSerializationPolicy() {
-    Map map = new HashMap();
+    Map<Class<?>, Boolean> map = new HashMap<Class<?>, Boolean>();
     map.put(A.class, Boolean.TRUE);
     map.put(C.class, Boolean.FALSE);
     
-    Map typeIds = new HashMap();
+    Map<Class<?>, String> typeIds = new HashMap<Class<?>, String>();
     typeIds.put(A.class, "A");
     typeIds.put(B.class, "B");
 
-    return new StandardSerializationPolicy(map, map, typeIds, new HashMap());
+    return new StandardSerializationPolicy(map, map, typeIds, new HashMap<Class<?>, Set<String>>());
   }
 }
diff --git a/user/test/com/google/gwt/user/server/rpc/testcases/TypeVariableCycle.java b/user/test/com/google/gwt/user/server/rpc/testcases/TypeVariableCycle.java
new file mode 100644
index 0000000..190f129
--- /dev/null
+++ b/user/test/com/google/gwt/user/server/rpc/testcases/TypeVariableCycle.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.server.rpc.testcases;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+import com.google.gwt.user.client.rpc.RemoteService;
+
+/**
+ * An example of how to create a cycle using type variable inference. To determine
+ * the expected type of the HELLO.ptr field, the type inference in
+ * {@link com.google.gwt.user.server.rpc.impl.SerializabilityUtil}
+ * starts with PtrPtr.ptr and deduces the following:
+ *
+ * <ul>
+ *   <li>C = B (by inheritance)
+ *   <li>B = A (by inheritance)
+ *   <li>A = C (because the raw type of ptr is BasePtr&lt;A&gt; and we are substituting C into it)
+ * </pre>
+ *
+ * <p>If we put these deductions into a map then there will be a cycle in the map.
+ * The type inferencer needs to detect the cycle and conclude that there is no constraint
+ * on any of these type variables, so HELLO.ptr.target could be any serializable
+ * type.</p>
+ *
+ * <p>TODO(skybrian): it's unclear whether this should really be a cycle. The 'A' in the second
+ * deduction annotates the the PtrPtr object (HELLO) and the 'A' in the last deduction is for the
+ * SimplePtr object (HELLO.ptr) so perhaps they are two type variables of the same name in different
+ * scopes? Currently the algorithm in SerializabilityUtil doesn't have scopes so this might
+ * just be a false alias. It doesn't affect the conclusion for this example, though.</p>
+ */
+public class TypeVariableCycle implements RemoteService {
+
+  /**
+   * A value we that we want to send via GWT-RPC.
+   */
+  public static final PtrPtr<String> HELLO =
+      new PtrPtr<String>(new SimplePtr<String>("hello"));
+
+  /**
+   * The RPC method that we will call.
+   */
+  @SuppressWarnings("unused")
+  public static <X> X dereference(BasePtr<X> any) {
+    return any.get();
+  }
+
+  /**
+   * The base of a convoluted class hierarchy of pointer types.
+   */
+  public static abstract class BasePtr<A> implements IsSerializable {
+    abstract A get();
+  }
+
+  /**
+   * An unneeded intermediate class to make a size-3 cycle. (Intermediate
+   * classes could be added to make a cycle of any size.)
+   */
+  public abstract static class NonSimplePtr<B> extends BasePtr<B> {
+  }
+
+  /**
+   * A pointer to a pointer.
+   */
+  public static class PtrPtr<C> extends NonSimplePtr<C> {
+    public BasePtr<C> ptr;
+
+    @SuppressWarnings("unused")
+    PtrPtr() {
+    }
+
+    PtrPtr(BasePtr<C> ptr) {
+      this.ptr = ptr;
+    }
+
+    @Override
+    public C get() {
+      return ptr.get();
+    }
+  }
+
+  /**
+   * A trivial implementation of BasePtr.
+   */
+  public static class SimplePtr<D> extends BasePtr<D> {
+    public D target;
+
+    @SuppressWarnings("unused")
+    SimplePtr() {
+    }
+
+    SimplePtr(D target) {
+      this.target = target;
+    }
+
+    @Override
+    D get() {
+      return target;
+    }
+  }
+}
diff --git a/user/test/com/google/gwt/validation/example/client/AuthorTest.java b/user/test/com/google/gwt/validation/example/client/AuthorTest.java
index 374399d..38d4d1b 100644
--- a/user/test/com/google/gwt/validation/example/client/AuthorTest.java
+++ b/user/test/com/google/gwt/validation/example/client/AuthorTest.java
@@ -47,20 +47,20 @@
     initValidAuthor();
     Set<ConstraintViolation<Author>> violations = validator.validate(author,
         ClientGroup.class);
-    assertContentsAnyOrder("valid author", violations);
+    assertContentsEmpty("valid author", violations);
   }
 
   public void testGroup_default() throws Exception {
     initValidAuthor();
     Set<ConstraintViolation<Author>> violations = validator.validate(author,
         Default.class);
-    assertContentsAnyOrder("valid author", violations);
+    assertContentsEmpty("valid author", violations);
   }
 
   public void testGroup_empty() throws Exception {
     initValidAuthor();
     Set<ConstraintViolation<Author>> violations = validator.validate(author);
-    assertContentsAnyOrder("valid author", violations);
+    assertContentsEmpty("valid author", violations);
   }
 
   public void testGroup_serverGroup() throws Exception {
@@ -93,7 +93,7 @@
   public void testValidate_valid() {
     initValidAuthor();
     Set<ConstraintViolation<Author>> violations = validator.validate(author);
-    assertContentsAnyOrder("valid author", violations);
+    assertContentsEmpty("valid author", violations);
   }
 
   public void testValidateProperty_object() {
@@ -125,6 +125,11 @@
     author.setCompany("Google");
   }
 
+  private <T> void assertContentsEmpty(String message,
+      Iterable<T> actual) {
+    assertFalse(message + "Expected empty but found " + actual, actual.iterator().hasNext());
+  }
+
   private <T> void assertContentsAnyOrder(String message,
       Iterable<T> actual, T... expected) {
 
diff --git a/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java b/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
index 29e6541..cbe7b58 100644
--- a/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
+++ b/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
@@ -294,19 +294,7 @@
     final SimpleEventBus eventBus = new SimpleEventBus();
     HandlerRegistration reg = FooEvent.register(eventBus, fooHandler1);
     reg.removeHandler();
-
-    boolean assertsOn = getClass().desiredAssertionStatus();
-
-    if (assertsOn) {
-      try {
-        reg.removeHandler();
-        fail("Should have thrown on remove");
-      } catch (AssertionError e) { /* pass */
-      }
-    } else {
-      reg.removeHandler();
-      // Succeed on no assert failure
-    }
+    reg.removeHandler(); // should not throw
   }
 
   public void testNoSource() {
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
index 90dcd71..caf6670 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java
@@ -16,6 +16,7 @@
 package com.google.web.bindery.requestfactory.gwt.client;
 
 import com.google.web.bindery.autobean.shared.AutoBeanCodex;
+import com.google.web.bindery.autobean.shared.AutoBeanUtils;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
@@ -275,6 +276,63 @@
     });
   }
 
+  /**
+   * See https://code.google.com/p/google-web-toolkit/issues/detail?id=7900
+   */
+  public void testCreatePersistCascadingAndReturnSelfEditWithReferences() {
+    delayTestFinish(DELAY_TEST_FINISH);
+
+    SimpleFooRequest context = simpleFooRequest();
+    SimpleFooProxy foo = context.create(SimpleFooProxy.class);
+    SimpleBarProxy bar = context.create(SimpleBarProxy.class);
+    foo.setBarField(bar);
+    Request<SimpleFooProxy> fooReq = context.persistCascadingAndReturnSelf()
+        .using(foo).with("barField");
+    fooReq.fire(new Receiver<SimpleFooProxy>() {
+
+      @Override
+      public void onSuccess(SimpleFooProxy returned) {
+        assertTrue(AutoBeanUtils.getAutoBean(returned).isFrozen());
+        assertTrue(AutoBeanUtils.getAutoBean(returned.getBarField()).isFrozen());
+
+        simpleFooRequest().edit(returned);
+
+        finishTestAndReset();
+      }
+    });
+  }
+
+  /**
+   * See https://code.google.com/p/google-web-toolkit/issues/detail?id=7900
+   */
+  public void testCreateReferencePersistCascadingAndReturnSelfEdit() {
+    delayTestFinish(DELAY_TEST_FINISH);
+
+    simpleFooRequest().findSimpleFooById(1L).fire(new Receiver<SimpleFooProxy>() {
+      @Override
+      public void onSuccess(SimpleFooProxy response) {
+        SimpleFooRequest context = simpleFooRequest();
+        SimpleFooProxy foo = context.edit(response);
+        SimpleBarProxy bar = context.create(SimpleBarProxy.class);
+        foo.setBarField(bar);
+        Request<SimpleFooProxy> fooReq = context.persistCascadingAndReturnSelf()
+            .using(foo).with("barField");
+        fooReq.fire(new Receiver<SimpleFooProxy>() {
+
+          @Override
+          public void onSuccess(SimpleFooProxy returned) {
+            assertTrue(AutoBeanUtils.getAutoBean(returned).isFrozen());
+            assertTrue(AutoBeanUtils.getAutoBean(returned.getBarField()).isFrozen());
+
+            simpleFooRequest().edit(returned);
+
+            finishTestAndReset();
+          }
+        });
+      }
+    });
+  }
+
   public void testChangedCreate() {
     SimpleFooRequest context = simpleFooRequest();
 
@@ -606,6 +664,9 @@
         assertEquals(2, handler.totalEventCount);
 
         checkStableIdEquals(foo, returned);
+
+        simpleFooRequest().edit(returned);
+
         finishTestAndReset();
       }
     });
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java b/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java
index d40d9a0..e2c33cf 100644
--- a/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/shared/impl/RequestPayloadTest.java
@@ -119,6 +119,7 @@
                     for (OperationMessage operationMessage : requestMessage.getOperations()) {
                       if (fooTypeToken.equals(operationMessage.getTypeToken())) {
                         seenFoos++;
+                        @SuppressWarnings("unchecked")
                         SimpleProxyId<?> id = (SimpleProxyId<?>) foo.stableId();
                         assertEquals(id.getServerId(), operationMessage.getServerId());
                         assertEquals(2, operationMessage.getPropertyMap().size());
diff --git a/user/test/org/apache/commons/collections/AbstractTestListIterator.java b/user/test/org/apache/commons/collections/AbstractTestListIterator.java
index 24701f5..e97f743 100755
--- a/user/test/org/apache/commons/collections/AbstractTestListIterator.java
+++ b/user/test/org/apache/commons/collections/AbstractTestListIterator.java
@@ -37,6 +37,7 @@
  * @author Rodney Waldhoff
  * @author Stephen Colebourne
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestListIterator extends TestIterator {
 
   // -----------------------------------------------------------------------
diff --git a/user/test/org/apache/commons/collections/DefaultMapEntry.java b/user/test/org/apache/commons/collections/DefaultMapEntry.java
index 1b15f06..2f8ee5a 100644
--- a/user/test/org/apache/commons/collections/DefaultMapEntry.java
+++ b/user/test/org/apache/commons/collections/DefaultMapEntry.java
@@ -23,7 +23,7 @@
   * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
   * @author <a href="mailto:mas@apache.org">Michael A. Smith</a>
   */
-  
+@SuppressWarnings({"unchecked", "rawtypes"})
 public class DefaultMapEntry implements Map.Entry {
     
     private Object key;
diff --git a/user/test/org/apache/commons/collections/LocalTestNode.java b/user/test/org/apache/commons/collections/LocalTestNode.java
index 5608b62..ba282ad 100644
--- a/user/test/org/apache/commons/collections/LocalTestNode.java
+++ b/user/test/org/apache/commons/collections/LocalTestNode.java
@@ -22,6 +22,7 @@
 *
 * @author Marc Johnson (marcj at users dot sourceforge dot net)
 */
+@SuppressWarnings({"unchecked", "rawtypes"})
 class LocalTestNode implements Comparable {
 
     private Comparable key;
diff --git a/user/test/org/apache/commons/collections/TestArrayList.java b/user/test/org/apache/commons/collections/TestArrayList.java
index 07ff0ab..63ef8b3 100644
--- a/user/test/org/apache/commons/collections/TestArrayList.java
+++ b/user/test/org/apache/commons/collections/TestArrayList.java
@@ -21,6 +21,7 @@
  * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
  * @version $Id: TestArrayList.java,v 1.5.2.1 2004/05/22 12:14:05 scolebourne Exp $
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class TestArrayList extends TestList
 { 
   
diff --git a/user/test/org/apache/commons/collections/TestCollection.java b/user/test/org/apache/commons/collections/TestCollection.java
index e3aac53..66d187f 100644
--- a/user/test/org/apache/commons/collections/TestCollection.java
+++ b/user/test/org/apache/commons/collections/TestCollection.java
@@ -110,6 +110,7 @@
  * @author <a href="mailto:mas@apache.org">Michael A. Smith</a>
  * @version $Id: TestCollection.java,v 1.9.2.1 2004/05/22 12:14:05 scolebourne Exp $
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class TestCollection extends TestObject {
 
     //
diff --git a/user/test/org/apache/commons/collections/TestComparator.java b/user/test/org/apache/commons/collections/TestComparator.java
index 488dd6a..331644d 100644
--- a/user/test/org/apache/commons/collections/TestComparator.java
+++ b/user/test/org/apache/commons/collections/TestComparator.java
@@ -20,7 +20,7 @@
 import java.util.Comparator;
 import java.util.List;
 
-
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class TestComparator extends TestObject {
  
 
diff --git a/user/test/org/apache/commons/collections/TestIterator.java b/user/test/org/apache/commons/collections/TestIterator.java
index 9b779da..4714bc1 100644
--- a/user/test/org/apache/commons/collections/TestIterator.java
+++ b/user/test/org/apache/commons/collections/TestIterator.java
@@ -23,6 +23,7 @@
  * 
  * @author Morgan Delagrange
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class TestIterator extends TestObject {
 
    
diff --git a/user/test/org/apache/commons/collections/TestList.java b/user/test/org/apache/commons/collections/TestList.java
index 9a0135b..88dd29c 100644
--- a/user/test/org/apache/commons/collections/TestList.java
+++ b/user/test/org/apache/commons/collections/TestList.java
@@ -40,6 +40,7 @@
  * @author Paul Jack
  * @version $Id: TestList.java,v 1.13.2.1 2004/05/22 12:14:05 scolebourne Exp $
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class TestList extends TestCollection {
 
  
diff --git a/user/test/org/apache/commons/collections/TestMap.java b/user/test/org/apache/commons/collections/TestMap.java
index 16e39ce..7e1d0a9 100644
--- a/user/test/org/apache/commons/collections/TestMap.java
+++ b/user/test/org/apache/commons/collections/TestMap.java
@@ -106,6 +106,7 @@
  * @author Paul Jack
  * @version $Id: TestMap.java,v 1.20.2.1 2004/05/22 12:14:05 scolebourne Exp $
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class TestMap extends TestObject{
 
     // These instance variables are initialized with the reset method.
diff --git a/user/test/org/apache/commons/collections/TestSet.java b/user/test/org/apache/commons/collections/TestSet.java
index 14f9933..df77884 100644
--- a/user/test/org/apache/commons/collections/TestSet.java
+++ b/user/test/org/apache/commons/collections/TestSet.java
@@ -38,6 +38,7 @@
  *  @author Paul Jack
  *  @version $Id: TestSet.java,v 1.2.2.1 2004/05/22 12:14:05 scolebourne Exp $
  */
+@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class TestSet extends TestCollection {
 
 
diff --git a/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java b/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
index e58710e..d0509ed 100644
--- a/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
+++ b/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
@@ -25,7 +25,6 @@
 import com.google.gwt.thirdparty.guava.common.base.Predicate;
 
 import junit.framework.Test;
-import junit.framework.TestCase;
 
 import org.hibernate.jsr303.tck.util.client.Failing;
 import org.hibernate.jsr303.tck.util.client.NonTckTest;
@@ -107,8 +106,8 @@
       return;
     }
 
-    Class superClass = theClass;
-    Vector names = new Vector();
+    Class<?> superClass = theClass;
+    Vector<String> names = new Vector<String>();
     while (Test.class.isAssignableFrom(superClass)) {
       for (Method method : filter(copyOf(superClass.getDeclaredMethods()),
           METHOD_FILTER)) {
@@ -120,7 +119,7 @@
       addTest(warning("No tests found in " + theClass.getName()));
   }
 
-  private void addTestMethod(Method m, Vector names, Class theClass) {
+  private void addTestMethod(Method m, Vector<String> names, Class<?> theClass) {
     String name = m.getName();
     if (names.contains(name))
       return;
@@ -133,10 +132,6 @@
     addTest(createTest(theClass, name));
   }
 
-  private boolean ingoreMethod(Method m) {
-    return HAS_FAILING.apply(m);
-  }
-
   private boolean isPublicTestMethod(Method m) {
     return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
   }
