Re-tag releases/2.5@11495 as 2.5.0 GA

git-svn-id: https://google-web-toolkit.googlecode.com/svn/tags/2.5.0@11502 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/build-tools/ant-gwt/build.xml b/build-tools/ant-gwt/build.xml
new file mode 100644
index 0000000..bec9154
--- /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}">
+      <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..f81b120
--- /dev/null
+++ b/build-tools/build.xml
@@ -0,0 +1,40 @@
+<project name="buildtools" default="build" basedir=".">
+  <property name="gwt.root" location=".." />
+  <property name="project.tail" value="build-tools" />
+  <import file="${gwt.root}/common.ant.xml" />
+
+  <!-- "build" is the default when subprojects are directly targetted -->
+  <property name="target" value="build" />
+
+  <target name="ant-gwt" description="Builds GWT specific Ant extensions">
+    <gwt.ant dir="ant-gwt" />
+  </target>
+
+  <target name="customchecks" description="Build the checkstyle extensions">
+    <gwt.ant dir="customchecks" />
+  </target>
+  
+  <target name="doctool" description="Build the doctool">
+    <gwt.ant dir="doctool" />
+  </target>
+
+  <target name="-do" depends="ant-gwt, customchecks, doctool" description="Run all subprojects"/>
+  
+  <target name="build" description="Builds GWT">
+    <antcall target="-do">
+      <param name="target" value="build" />
+    </antcall>
+  </target>
+
+  <target name="checkstyle" depends="build" description="Static analysis of GWT source">
+    <antcall target="-do">
+      <param name="target" value="checkstyle" />
+    </antcall>
+  </target>
+
+  <target name="test" depends="build" description="Test GWT">
+    <antcall target="-do">
+      <param name="target" value="test" />
+    </antcall>
+  </target>
+</project>
diff --git a/build-tools/customchecks/build.xml b/build-tools/customchecks/build.xml
new file mode 100644
index 0000000..f929b2d
--- /dev/null
+++ b/build-tools/customchecks/build.xml
@@ -0,0 +1,32 @@
+<project name="customchecks" default="build" basedir=".">
+  <property name="gwt.root" location="../.." />
+  <property name="project.tail" value="build-tools/customchecks" />
+  <import file="${gwt.root}/common.ant.xml" />
+
+  <target name="compile" description="Compiles this project">
+    <mkdir dir="${javac.out}" />
+    <gwt.javac>
+      <classpath>
+        <pathelement location="${gwt.tools.antlib}/checkstyle-all-4.2.jar" />
+      </classpath>
+    </gwt.javac>
+  </target>
+
+  <target name="build" depends="compile" description="Packages this project into a jar">
+    <mkdir dir="${gwt.build.lib}" />
+    <gwt.jar>
+      <fileset dir="src" />
+      <fileset dir="${javac.out}" />
+    </gwt.jar>
+  </target>
+
+  <target name="checkstyle">
+    <!-- NOTE: This project doesn't have the checkstyle rule since it participates in bootstrapping. -->
+  </target>
+
+  <target name="clean" description="Cleans this project's intermediate and output files">
+    <delete dir="${project.build}" />
+    <delete file="${project.lib}" />
+  </target>
+
+</project>
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/CustomRegexpHeaderCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/CustomRegexpHeaderCheck.java
new file mode 100644
index 0000000..f08a2bd
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/CustomRegexpHeaderCheck.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+// //////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2005 Oliver Burn
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// //////////////////////////////////////////////////////////////////////////////
+package com.google.gwt.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.checks.header.RegexpHeaderCheck;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.Utils;
+
+import org.apache.commons.beanutils.ConversionException;
+
+import java.util.Arrays;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+/**
+ * Custom version of {@link RegexpHeaderCheck} that has hooks for a custom log handler (see
+ * {@link CustomLogHandler}).
+ * <p>
+ * This is an exact copy of {@link RegexpHeaderCheck} with three exceptions:
+ * <ol>
+ * <li>{@link CustomLogHandler} has been added for custom log callbacks.</li>
+ * <li>{@link #doChecks(CustomLogHandler)} has been added for custom checks. This method is an exact
+ * copy of {@link RegexpHeaderCheck#beginTree(DetailAST)} except all log calls have been replaced
+ * with a call to a custom log handler.</li>
+ * <li>{@link #beginTree(DetailAST)} has been refactored to call
+ * {@link #doChecks(CustomLogHandler)}.
+ * </ol>
+ */
+public class CustomRegexpHeaderCheck extends RegexpHeaderCheck {
+  /**
+   * Custom log handler callback.
+   */
+  abstract static class CustomLogHandler {
+    abstract void log(int aLine, String aKey);
+
+    abstract void log(int aLine, String aKey, Object aObject);
+  }
+
+  // empty array to avoid instantiations.
+  private static final int[] EMPTY_INT_ARRAY = new int[0];
+
+  // the header lines to repeat (0 or more) in the check, sorted.
+  private int[] mMultiLines = EMPTY_INT_ARRAY;
+
+  // the compiled regular expressions
+  private Pattern[] mHeaderRegexps;
+
+  /**
+   * {@inheritDoc}
+   */
+  public void beginTree(DetailAST aRootAST) {
+    doChecks(new CustomLogHandler() {
+      @Override
+      void log(int aLine, String aKey) {
+        CustomRegexpHeaderCheck.this.log(aLine, aKey);
+      }
+      @Override
+      void log(int aLine, String aKey, Object aObject) {
+        CustomRegexpHeaderCheck.this.log(aLine, aKey, aObject);
+      }
+    });
+  }
+
+  /**
+   * Check the current file using the same method as {@link RegexpHeaderCheck#beginTree(DetailAST)}
+   * but pass all logging calls through a custom log handler (@see {@link CustomLogHandler}).
+   * 
+   * @param logHandler the custom log handler, or <code>null</code> to suppress logging.
+   */
+  public void doChecks(CustomLogHandler logHandler) {
+    // With the exception of the logging hooks, the following is copied from
+    // RegexpHeaderCheck.beginTree().
+
+    final int headerSize = getHeaderLines().length;
+    final int fileSize = getLines().length;
+
+    if (headerSize - mMultiLines.length > fileSize) {
+      if (logHandler != null) {
+        logHandler.log(1, "gwtheader.missing", null);
+      }
+    } else {
+      int headerLineNo = 0;
+      int i;
+      for (i = 0; (headerLineNo < headerSize) && (i < fileSize); i++) {
+        boolean isMatch = isMatch(i, headerLineNo);
+        while (!isMatch && isMultiLine(headerLineNo)) {
+          headerLineNo++;
+          isMatch = (headerLineNo == headerSize) || isMatch(i, headerLineNo);
+        }
+        if (!isMatch) {
+          if (logHandler != null) {
+            logHandler.log(i + 1, "gwtheader.mismatch", getHeaderLines()[headerLineNo]);
+          }
+          break; // stop checking
+        }
+        if (!isMultiLine(headerLineNo)) {
+          headerLineNo++;
+        }
+      }
+      if (i == fileSize) {
+        // if file finished, but we have at least one non-multi-line
+        // header isn't completed
+        for (; headerLineNo < headerSize; headerLineNo++) {
+          if (!isMultiLine(headerLineNo)) {
+            if (logHandler != null) {
+              logHandler.log(1, "gwtheader.missing");
+            }
+            break;
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void setHeader(String aHeader) {
+    super.setHeader(aHeader);
+    initHeaderRegexps();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void setHeaderFile(String aFileName) throws ConversionException {
+    super.setHeaderFile(aFileName);
+    initHeaderRegexps();
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void setMultiLines(int[] aList) {
+    if ((aList == null) || (aList.length == 0)) {
+      mMultiLines = EMPTY_INT_ARRAY;
+      return;
+    }
+
+    mMultiLines = new int[aList.length];
+    System.arraycopy(aList, 0, mMultiLines, 0, aList.length);
+    Arrays.sort(mMultiLines);
+  }
+
+  /**
+   * Initializes {@link #mHeaderRegexps} from {@link AbstractHeaderCheck#getHeaderLines()}.
+   */
+  private void initHeaderRegexps() {
+    final String[] headerLines = getHeaderLines();
+    if (headerLines != null) {
+      mHeaderRegexps = new Pattern[headerLines.length];
+      for (int i = 0; i < headerLines.length; i++) {
+        try {
+          // todo: Not sure if chache in Utils is still necessary
+          mHeaderRegexps[i] = Utils.getPattern(headerLines[i]);
+        } catch (final PatternSyntaxException ex) {
+          throw new ConversionException("line " + i + " in header specification"
+              + " is not a regular expression");
+        }
+      }
+    }
+  }
+
+  /**
+   * Checks if a code line matches the required header line.
+   * 
+   * @param aLineNo the line number to check against the header
+   * @param aHeaderLineNo the header line number.
+   * @return true if and only if the line matches the required header line.
+   */
+  private boolean isMatch(int aLineNo, int aHeaderLineNo) {
+    final String line = getLines()[aLineNo];
+    return mHeaderRegexps[aHeaderLineNo].matcher(line).find();
+  }
+
+  /**
+   * @param aLineNo a line number
+   * @return if <code>aLineNo</code> is one of the repeat header lines.
+   */
+  private boolean isMultiLine(int aLineNo) {
+    return (Arrays.binarySearch(mMultiLines, aLineNo + 1) >= 0);
+  }
+}
\ No newline at end of file
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java
new file mode 100644
index 0000000..4044209
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/FieldCheck.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2006 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+import com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck;
+
+/**
+ * Override MemberNameCheck to correctly use match rather than find.
+ */
+public class FieldCheck extends MemberNameCheck {
+  public FieldCheck() {
+    // Specifically stopping fields such as fMainWnd from being allowed.
+    setFormat("([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*");
+  }
+
+  public void visitToken(DetailAST aAST) {
+    if (mustCheckName(aAST)) {
+      final DetailAST nameAST = aAST.findFirstToken(TokenTypes.IDENT);
+      if (!getRegexp().matcher(nameAST.getText()).matches()) {
+        log(
+            nameAST.getLineNo(),
+            nameAST.getText()
+                + ": Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s.");
+      }
+    }
+  }
+}
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/GwtHeaderCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/GwtHeaderCheck.java
new file mode 100644
index 0000000..0457136
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/GwtHeaderCheck.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2011 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.checkstyle;
+
+import com.google.gwt.checkstyle.CustomRegexpHeaderCheck.CustomLogHandler;
+
+import com.puppycrawl.tools.checkstyle.api.Check;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+
+/**
+ * Checks the header against one of two header options, to support GWT's 80 and 100 column headers.
+ * <p>
+ * To use, set <code>&lt;property name="header" value="[regular expression]" /&gt;</code> and
+ * <code>&lt;property name="headerAlt" value="[alternate regular expression]" /&gt;</code>
+ */
+public class GwtHeaderCheck extends Check {
+  private CustomRegexpHeaderCheck regexpChecker = new CustomRegexpHeaderCheck();
+  private CustomRegexpHeaderCheck regexpCheckerAlt = new CustomRegexpHeaderCheck();
+
+  public void beginTree(DetailAST aRootAST) {
+    final boolean[] passedChecks = new boolean[]{true};
+    regexpChecker.setFileContents(this.getFileContents());
+    regexpChecker.doChecks(new CustomLogHandler() {
+      @Override
+      void log(int aLine, String aKey) {
+        passedChecks[0] = false;
+      }
+
+      @Override
+      void log(int aLine, String aKey, Object aObject) {
+        passedChecks[0] = false;
+      }
+    });
+    if (passedChecks[0]) {
+      // regexpChecker passed, no need to run alternate checker
+      return;
+    }
+
+    regexpCheckerAlt.setFileContents(this.getFileContents());
+    regexpCheckerAlt.doChecks(new CustomLogHandler() {
+      @Override
+      void log(int aLine, String aKey) {
+        GwtHeaderCheck.this.log(aLine, aKey);
+      }
+
+      @Override
+      void log(int aLine, String aKey, Object aObject) {
+        GwtHeaderCheck.this.log(aLine, aKey, aObject);
+      }
+    });
+  }
+
+  @Override
+  public int[] getDefaultTokens() {
+    return new int[0];
+  }
+
+  /**
+   * Set the header to check against. Individual lines in the header must be separated by '\n'
+   * characters.
+   * 
+   * @param aHeader header content to check against.
+   */
+  public void setHeader(String aHeader) {
+    regexpChecker.setHeader(aHeader);
+  }
+
+  /**
+   * Set the alternate header to check against. Individual lines in the header must be separated by
+   * '\n' characters.
+   * 
+   * @param aHeader header content to check against.
+   */
+  public void setHeaderAlt(String aHeader) {
+    regexpCheckerAlt.setHeader(aHeader);
+  }
+}
\ No newline at end of file
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java b/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java
new file mode 100644
index 0000000..5e69331
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/OrderCheck.java
@@ -0,0 +1,215 @@
+// CHECKSTYLE_OFF:Must use GNU license for code based on checkstyle
+// /////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2005 Oliver Burn
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// //////////////////////////////////////////////////////////////////////////////
+// CHECKSTYLE_ON
+
+// This class is based upon the
+// com.puppycrawl.tools.checkstyle.checks.coding.DeclarationOrderCheck
+
+package com.google.gwt.checkstyle;
+
+import com.puppycrawl.tools.checkstyle.api.Check;
+import com.puppycrawl.tools.checkstyle.api.DetailAST;
+import com.puppycrawl.tools.checkstyle.api.Scope;
+import com.puppycrawl.tools.checkstyle.api.ScopeUtils;
+import com.puppycrawl.tools.checkstyle.api.TokenTypes;
+
+import java.util.Stack;
+
+/**
+ * Checks that the parts of a class or interface declaration appear in the order
+ * specified by the 'Making GWT better' style guide.
+ */
+
+public class OrderCheck extends Check {
+  /**
+   * Encapsulate the state in each class scope in order to handle inner classes.
+   */
+  private static class ScopeState {
+    /**
+     * Current state.
+     */
+    private int state = State.TYPE;
+
+    /**
+     * Current access modifier for state.
+     */
+    private Scope visibility = Scope.PUBLIC;
+  }
+
+  /**
+   * Ordered category states for code elements.
+   */
+  private static class State {
+    private static final int TYPE = 0;
+    private static final int STATIC_FIELDS = 1;
+    private static final int STATIC_INITS = 2;
+    private static final int STATIC_METHODS = 3;
+    private static final int INSTANCE_FIELDS = 4;
+    private static final int INSTANCE_INITS = 5;
+    private static final int CONSTRUCTORS = 6;
+    private static final int INSTANCE_METHODS = 7;
+  }
+
+  /**
+   * List of Declaration States. This is necessary due to inner classes that
+   * have their own state.
+   */
+  private final Stack<ScopeState> classScopes = new Stack<ScopeState>();
+
+  /**
+   * Previous method name, used for alphabetical ordering.
+   */
+  private String previousMethodName;
+
+  public int[] getDefaultTokens() {
+    return new int[] {
+        TokenTypes.CTOR_DEF, TokenTypes.METHOD_DEF, TokenTypes.MODIFIERS,
+        TokenTypes.STATIC_INIT, TokenTypes.INSTANCE_INIT, TokenTypes.OBJBLOCK};
+  }
+
+  public void leaveToken(DetailAST aAST) {
+    switch (aAST.getType()) {
+      case TokenTypes.OBJBLOCK:
+        classScopes.pop();
+        previousMethodName = null;
+        break;
+      case TokenTypes.METHOD_DEF:
+        // If the previous method was in the same class, with the same
+        // modifiers, check that it is alphabetically before the current
+        // method.
+        String methodName = aAST.findFirstToken(TokenTypes.IDENT).getText();
+        if (previousMethodName != null
+            && (previousMethodName.compareToIgnoreCase(methodName)) > 0) {
+          log(aAST, methodName + " is not alphabetical.");
+        }
+        previousMethodName = methodName;
+        break;
+      default:
+    }
+  }
+
+  public void visitToken(DetailAST aAST) {
+    try {
+      int parentType = 0;
+      if (aAST.getParent() != null) {
+        parentType = aAST.getParent().getType();
+      }
+      switch (aAST.getType()) {
+        case TokenTypes.OBJBLOCK:
+          classScopes.push(new ScopeState());
+          previousMethodName = null;
+          break;
+
+        case TokenTypes.CTOR_DEF:
+          if (parentType != TokenTypes.OBJBLOCK) {
+            return;
+          }
+          checkState(aAST, State.CONSTRUCTORS, "Constructor");
+          break;
+
+        case TokenTypes.MODIFIERS:
+          if (parentType == TokenTypes.VARIABLE_DEF) {
+            checkVariable(aAST);
+          }
+          if (parentType == TokenTypes.METHOD_DEF) {
+            checkMethod(aAST);
+          }
+          break;
+        case TokenTypes.STATIC_INIT: {
+          checkState(aAST, State.STATIC_INITS, "Static initializer");
+          break;
+        }
+        case TokenTypes.INSTANCE_INIT: {
+          checkState(aAST, State.INSTANCE_INITS, "Instance initializer");
+        }
+          break;
+        default:
+      }
+    } catch (Throwable t) {
+      // CheckStyle swallows errors in general, we want OrderCheck errors to be
+      // visible.
+      t.printStackTrace();
+      throw new RuntimeException("Exception/Error in OrderCheck", t);
+    }
+  }
+
+  /**
+   * Check the modifiers of a method for order conflicts.
+   */
+  private void checkMethod(DetailAST aAST) {
+    if (aAST.getParent().getParent().getType() != TokenTypes.OBJBLOCK) {
+      return;
+    }
+    if (aAST.findFirstToken(TokenTypes.LITERAL_STATIC) != null) {
+      if (checkState(aAST, State.STATIC_METHODS, "Static method")) {
+        previousMethodName = null;
+      }
+    } else {
+      if (checkState(aAST, State.INSTANCE_METHODS, "Instance method")) {
+        previousMethodName = null;
+      }
+    }
+  }
+
+  /**
+   * Checks the category and visibility of declarations.
+   * 
+   * @return whether the state or visibility modifiers have changed
+   */
+  private boolean checkState(DetailAST aAST, int curState, String type) {
+    ScopeState scope = classScopes.peek();
+    if (scope.state > curState) {
+      log(aAST, type + " in wrong order.");
+      // Wrong type implies at least a temporary state switch.
+      return true;
+    } else if (scope.state == curState) {
+      final Scope curVisibility = ScopeUtils.getScopeFromMods(aAST);
+      if (scope.visibility.compareTo(curVisibility) > 0) {
+        log(aAST, curVisibility.getName() + " " + type
+            + " should not occur after " + scope.visibility.getName() + " "
+            + type);
+        return false;
+      } else if (scope.visibility != curVisibility) {
+        scope.visibility = curVisibility;
+        return true;
+      } else {
+        return false;
+      }
+    } else {
+      scope.state = curState;
+      scope.visibility = Scope.PUBLIC;
+      return true;
+    }
+  }
+
+  /**
+   * Check the modifiers of a variable for order conflicts.
+   */
+  private void checkVariable(DetailAST aAST) {
+    if (aAST.getParent().getParent().getType() != TokenTypes.OBJBLOCK) {
+      return;
+    }
+    if (aAST.findFirstToken(TokenTypes.LITERAL_STATIC) != null) {
+      checkState(aAST, State.STATIC_FIELDS, "Static field");
+    } else {
+      checkState(aAST, State.INSTANCE_FIELDS, "Instance field");
+    }
+  }
+}
\ No newline at end of file
diff --git a/build-tools/customchecks/src/com/google/gwt/checkstyle/messages.properties b/build-tools/customchecks/src/com/google/gwt/checkstyle/messages.properties
new file mode 100644
index 0000000..149391c
--- /dev/null
+++ b/build-tools/customchecks/src/com/google/gwt/checkstyle/messages.properties
@@ -0,0 +1,2 @@
+gwtheader.missing=Missing a header - not enough lines in file.
+gwtheader.mismatch=Line does not match expected header line of ''{0}''.
\ No newline at end of file
diff --git a/build-tools/doctool/build.xml b/build-tools/doctool/build.xml
new file mode 100644
index 0000000..bc9cbbd
--- /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 100755
new mode 100644
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 100755
new mode 100644
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/build.xml b/build.xml
index 57903e6..37d6f9c 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,8 +128,6 @@
     <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>
@@ -160,7 +158,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
deleted file mode 100644
index cf6d29a..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}" 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/build.xml b/build_tools/build.xml
deleted file mode 100644
index a1f6576..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 c8d5d79..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/common.ant.xml b/common.ant.xml
index dbb7514..2608186 100755
--- a/common.ant.xml
+++ b/common.ant.xml
@@ -337,7 +337,7 @@
     <attribute name="outputdirectory" default="${project.build}"/>
     <element name="sourcepath" implicit="yes" optional="true" />
     <sequential>
-      <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar" />
+      <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar;${gwt.build.lib}/gwt-customchecks.jar" />
       <mkdir dir="@{outputdirectory}"/>
       <checkstyle config="${gwt.root}/eclipse/settings/code-style/gwt-checkstyle.xml" maxErrors="0" failOnViolation="false" failureProperty="gwt.checkstyle.failed">
         <formatter type="xml" toFile="@{outputdirectory}/checkstyle_log.xml"/>
@@ -352,7 +352,7 @@
     <attribute name="outputdirectory" default="${project.build}"/>
     <element name="sourcepath" implicit="yes" optional="true" />
     <sequential>
-      <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar" />
+      <taskdef resource="checkstyletask.properties" classpath="${gwt.tools.antlib}/checkstyle-all-4.2.jar;${gwt.build.lib}/gwt-customchecks.jar" />
       <mkdir dir="@{outputdirectory}"/>
       <checkstyle config="${gwt.root}/eclipse/settings/code-style/gwt-checkstyle-tests.xml" maxErrors="0" failOnViolation="false" failureProperty="gwt.checkstyle-tests.failed">
         <formatter type="xml" toFile="@{outputdirectory}/checkstyle_tests_log.xml"/>
diff --git a/dev/build.xml b/dev/build.xml
index 6b10f1c..0ea5528 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -34,6 +34,7 @@
       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" />
@@ -60,15 +61,35 @@
           <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/50.1.1/icu4j.jar" />
+          <include name="icu4j/4.4.2/icu4j.jar" />
           <include name="protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
-          <!-- dependencies needed for JSP support in DevMode: BEGIN -->
+          <include name="tomcat/ant-launcher-1.6.5.jar" />
+          <include name="tomcat/catalina-1.0.jar" />
+          <include name="tomcat/catalina-optional-1.0.jar" />
+          <include name="tomcat/commons-beanutils-1.6.jar" />
+          <include name="tomcat/commons-collections-3.1.jar" />
+          <include name="tomcat/commons-digester-1.5.jar" />
           <include name="tomcat/commons-el-1.0.jar" />
+          <include name="tomcat/commons-logging-1.0.jar" />
+          <include name="tomcat/commons-modeler-1.1.jar" />
+          <include name="tomcat/jakarta-regexp-1.3.jar" />
           <include name="tomcat/jasper-compiler-1.0.jar" />
           <include name="tomcat/jasper-runtime-1.0.jar" />
           <include name="tomcat/jsp-api-2.0.jar" />
-          <!-- dependencies needed for JSP support in DevMode: END -->
-          <include name="apache/commons/commons-collections-3.2.1.jar" />
+          <include name="tomcat/mx4j-jmx-1.1.jar" />
+          <include name="tomcat/naming-common-1.0.jar" />
+          <include name="tomcat/naming-factory-1.0.jar" />
+          <include name="tomcat/naming-java-1.0.jar" />
+          <include name="tomcat/naming-resources-1.0.jar" />
+          <include name="tomcat/servlet-api-2.5.jar" />
+          <include name="tomcat/servlet-api-2.4.jar" />
+          <include name="tomcat/servlets-common-1.0.jar" />
+          <include name="tomcat/servlets-default-1.0.jar" />
+          <include name="tomcat/servlets-invoker-1.0.jar" />
+          <include name="tomcat/tomcat-coyote-1.0.jar" />
+          <include name="tomcat/tomcat-http11-1.0.jar" />
+          <include name="tomcat/tomcat-jk2-2.1.jar" />
+          <include name="tomcat/tomcat-util-5.1.jar" />
           <!-- htmlunit dependencies not already included: BEGIN -->
           <include name="apache/http/httpclient-4.1.2.jar" />
           <include name="apache/http/httpcore-4.1.2.jar" />
@@ -77,7 +98,6 @@
           <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" />
@@ -109,15 +129,35 @@
           <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/50.1.1/icu4j.jar" />
+          <zipfileset src="${gwt.tools.lib}/icu4j/4.4.2/icu4j.jar" />
           <zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
-          <!-- dependencies needed for JSP support in DevMode: BEGIN -->
+          <zipfileset src="${gwt.tools.lib}/tomcat/ant-launcher-1.6.5.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/catalina-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/catalina-optional-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/commons-beanutils-1.6.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/commons-digester-1.5.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/commons-el-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/commons-logging-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/commons-modeler-1.1.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/jakarta-regexp-1.3.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/jasper-compiler-1.0.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/jasper-runtime-1.0.jar" />
           <zipfileset src="${gwt.tools.lib}/tomcat/jsp-api-2.0.jar" />
-          <!-- dependencies needed for JSP support in DevMode: END -->
-          <zipfileset src="${gwt.tools.lib}/apache/commons/commons-collections-3.2.1.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/mx4j-jmx-1.1.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/naming-common-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/naming-factory-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/naming-java-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/naming-resources-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/servlet-api-2.5.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/servlet-api-2.4.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/servlets-common-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/servlets-default-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/servlets-invoker-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-coyote-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-http11-1.0.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-jk2-2.1.jar" />
+          <zipfileset src="${gwt.tools.lib}/tomcat/tomcat-util-5.1.jar" />
           <!-- htmlunit dependencies not already included: BEGIN -->
           <zipfileset src="${gwt.tools.lib}/apache/http/httpclient-4.1.2.jar" />
           <zipfileset src="${gwt.tools.lib}/apache/http/httpcore-4.1.2.jar" />
@@ -126,7 +166,6 @@
           <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" />
@@ -181,7 +220,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}/apache/commons/commons-collections-3.2.1.jar" />
+          <pathelement location="${gwt.tools.lib}/tomcat/commons-collections-3.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 52af07f..f2c1e8d 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."
-             value="org.mortbay."/>
+    <replace dir="${src}" token="com.google.gwt.thirdparty.org.mortbay.jetty"
+             value="org.mortbay.jetty"/>
   </target>
 
   <target name="compile" depends="preprocess">
@@ -41,7 +41,6 @@
       <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 1d826e6..6419d86 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/CodeServer.java
@@ -23,6 +23,7 @@
 
 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
@@ -83,8 +84,8 @@
       AppSpace appSpace = AppSpace.create(new File(workDir, moduleName));
 
       Recompiler recompiler = new Recompiler(appSpace, moduleName,
-          options.getSourcePath(), options.getPreferredHost() + ":" + options.getPort(), logger);
-      modules.addModuleState(new ModuleState(recompiler, logger, options.getNoPrecompile()));
+        options.getSourcePath(), logger);
+      modules.addModuleState(new ModuleState(recompiler, logger));
     }
 
     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 32a907e..2d46607 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/ModuleState.java
@@ -42,22 +42,16 @@
   private final Recompiler recompiler;
   private final TreeLogger logger;
 
-  ModuleState(Recompiler recompiler, TreeLogger logger, boolean noPrecompile)
+  ModuleState(Recompiler recompiler, TreeLogger logger)
       throws UnableToCompleteException {
     this.recompiler = recompiler;
     this.logger = logger;
 
-    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);
+    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));
   }
 
   /**
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 758f645..2924e44 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Options.java
@@ -20,7 +20,6 @@
 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;
 
@@ -36,7 +35,6 @@
  * <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>();
@@ -68,13 +66,6 @@
   }
 
   /**
-   * Whether the codeServer should start without precompiling modules.
-   */
-  boolean getNoPrecompile() {
-    return noPrecompile;
-  }
-
-  /**
    * The IP address where the code server should listen.
    */
   String getBindAddress() {
@@ -102,7 +93,6 @@
   private class ArgProcessor extends ArgProcessorBase {
 
     public ArgProcessor() {
-      registerHandler(new NoPrecompileFlag());
       registerHandler(new BindAddressFlag());
       registerHandler(new PortFlag());
       registerHandler(new WorkDirFlag());
@@ -117,25 +107,6 @@
 
   }
 
-  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 8b653d6..3076afa 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/PageUtil.java
@@ -20,11 +20,8 @@
 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;
@@ -128,7 +125,7 @@
   /**
    * Copies in to out and closes in when done.
    */
-  static void copyStream(InputStream in, OutputStream out) throws IOException {
+  private static void copyStream(InputStream in, OutputStream out) throws IOException {
     try {
       byte[] buffer = new byte[8 * 1024];
       while (true) {
@@ -142,27 +139,4 @@
       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 f6c8b4a..73cd65c 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/Recompiler.java
@@ -38,7 +38,6 @@
 
 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;
@@ -51,7 +50,6 @@
   private final String originalModuleName;
   private final List<File> sourcePath;
   private final TreeLogger logger;
-  private String serverPrefix;
   private int compilesDone = 0;
 
   // after renaming
@@ -62,12 +60,11 @@
       new AtomicReference<ResourceLoader>();
 
   Recompiler(AppSpace appSpace, String moduleName, List<File> sourcePath,
-             String serverPrefix, TreeLogger logger) {
+      TreeLogger logger) {
     this.appSpace = appSpace;
     this.originalModuleName = moduleName;
     this.sourcePath = sourcePath;
     this.logger = logger;
-    this.serverPrefix = serverPrefix;
   }
 
   synchronized CompileDir compile(Map<String, String> bindingProperties)
@@ -101,39 +98,6 @@
     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.)
    */
@@ -173,7 +137,7 @@
     ResourceLoader resources = ResourceLoaders.forClassLoader(Thread.currentThread());
     resources = ResourceLoaders.forPathAndFallback(sourcePath, resources);
     this.resourceLoader.set(resources);
-
+    
     ModuleDef moduleDef =
         ModuleDefLoader.loadFromResources(logger, originalModuleName, resources, true);
 
@@ -211,10 +175,6 @@
     // 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 b3e5653..7250bcd 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/WebServer.java
@@ -20,31 +20,23 @@
 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;
 
@@ -82,8 +74,6 @@
   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;
@@ -112,18 +102,13 @@
 
     Server server = new Server();
     server.addConnector(connector);
-
-    ServletHandler servletHandler = new ServletHandler();
-    servletHandler.addServletWithMapping(new ServletHolder(new HttpServlet() {
+    server.addHandler(new AbstractHandler() {
       @Override
-      protected void doGet(HttpServletRequest request, HttpServletResponse response)
-          throws ServletException, IOException {
-        handleRequest(request.getPathInfo(), request, response);
+      public void handle(String target, HttpServletRequest request,
+          HttpServletResponse response, int port) throws IOException {
+        handleRequest(target, request, response);
       }
-    }), "/*");
-    servletHandler.addFilterWithMapping(new FilterHolder(GzipFilter.class),
-        "/*", AbstractHandler.DEFAULT);
-    server.addHandler(servletHandler);
+    });
     try {
       server.start();
     } catch (Exception e) {
@@ -211,13 +196,6 @@
     }
 
     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;
     }
 
@@ -270,14 +248,15 @@
         logger.log(TreeLogger.WARN, "client doesn't accept gzip; bailing");
         return;
       }
-      response.setHeader("Content-Encoding", "gzip");
+      response.addHeader("Content-Encoding", "gzip");
     }
 
-    if (target.endsWith(".cache.js")) {
-      response.setHeader("X-SourceMap", sourceMapLocationForModule(moduleName));
-    }
-    response.setHeader("Access-Control-Allow-Origin", "*");
     String mimeType = guessMimeType(target);
+    if (target.endsWith(".cache.js")) {
+      response.addHeader("X-SourceMap", SourceHandler.SOURCEMAP_PATH + moduleName +
+          "/gwtSourceMap.json");
+    }
+    response.addHeader("Access-Control-Allow-Origin", "*");
     PageUtil.sendFile(mimeType, file, response);
   }
 
@@ -376,10 +355,8 @@
     }
   }
 
-  /* visible for testing */
-  static String guessMimeType(String filename) {
-    Buffer mimeType = MIME_TYPES.getMimeByExtension(filename);
-    return mimeType != null ? mimeType.toString() : "";
+  private static String guessMimeType(String filename) {
+    return URLConnection.guessContentTypeFromName(filename);
   }
 
   /**
@@ -397,11 +374,6 @@
     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 a562f9c..26a2981 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,18 +60,13 @@
     if (!params) {
       return null;
     }
-    try {
-      delete window.__gwt_bookmarklet_params;
-    } catch (e) {
-      // Delete window.x throws and exception in IE8.
-      window['__gwt_bookmarklet_params'] = null;
-    }
+    delete window.__gwt_bookmarklet_params;
     return params;
   }
 
   function makeOverlay() {
     var overlay = document.createElement('div');
-    overlay.style.zIndex = 1000000;
+    overlay.style.zIndex = 1000;
     overlay.style.position = 'absolute';
     overlay.style.top = 0;
     overlay.style.left = 0;
@@ -84,7 +79,7 @@
 
   function makeDialog() {
     var dialog = document.createElement('div');
-    dialog.style.zIndex = 1000001;
+    dialog.style.zIndex = 1001;
     dialog.style.position = 'fixed';
     dialog.style.top = '20pt';
     dialog.style.left = '20pt';
@@ -105,7 +100,7 @@
     result.style.borderBottom = '1px solid black';
     result.style.padding = '3pt';
     result.setAttribute('href', 'javascript:' + encodeURIComponent(javascript));
-    setTextContent(result, name);
+    result.textContent = name;
     result.title = 'Tip: drag this button to the bookmark bar';
     return result;
   }
@@ -129,7 +124,8 @@
    *     a recompile will succeed.
    */
   function getCannotCompileError(module_name) {
-    if (!isModuleOnCodeServer(module_name)) {
+    var modules_on_codeserver = window.__gwt_codeserver_config.moduleNames;
+    if (modules_on_codeserver.indexOf(module_name) < 0) {
       return 'The code server isn\'t configured to compile this module';
     }
 
@@ -153,22 +149,6 @@
   }
 
   /**
-   * 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.
@@ -178,7 +158,7 @@
     function makeHeader() {
       var message = document.createElement('div');
       message.style.fontSize = '24pt';
-      setTextContent(message, 'Choose a module to recompile:');
+      message.textContent = 'Choose a module to recompile:';
       return message;
     }
 
@@ -265,7 +245,7 @@
 
     var message = document.createElement('div');
     message.style.fontSize = '24pt';
-    setTextContent(message, text);
+    message.textContent = text;
 
     dialog.appendChild(message);
 
@@ -286,14 +266,14 @@
       var error = document.createElement('a');
       error.setAttribute('href', log_url);
       error.setAttribute('target', 'gwt_dev_mode_log');
-      setTextContent(error, errorText);
+      error.innerText = errorText;
       error.style.color = 'red';
       error.style.textDecoration = 'underline';
       message.appendChild(error);
 
       var button = document.createElement('button');
       button.style.fontSize = '16pt';
-      setTextContent(button, 'Try Again');
+      button.textContent = 'Try Again';
       button.onclick = function() {
         body.removeChild(dialog);
         body.removeChild(overlay);
@@ -306,20 +286,6 @@
   }
 
   /**
-   * 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 '&'.
@@ -409,7 +375,6 @@
     }
 
     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);
@@ -420,7 +385,6 @@
 
     var url_prefix = codeserver_url + 'recompile/' + module_name + '?' +
     getBindingParameters(module_name, get_prop_map);
-    globals.compiling = true;
     callJsonp(url_prefix, onCompileFinished);
   }
 
@@ -430,12 +394,6 @@
    * @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 afe183b..b7427a1 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.title = title;
-      setTextContent(document.getElementById("title"), title);
+      document.getElementsByTagName("title")[0].textContent = title;
+      document.getElementById("title").textContent = title;
 
       document.getElementById("logLink").setAttribute("href", "../log/" + config.moduleName);
       updateFileList(config, document.getElementById("files"));
@@ -31,37 +31,17 @@
 
         var anchor = document.createElement("a");
         anchor.setAttribute("href", dir.link);
-        setTextContent(anchor, dir.name);
+        anchor.textContent = 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>
+<body onload="updatePage(config)">
 <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
deleted file mode 100644
index d7ccc73..0000000
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/favicon.ico
+++ /dev/null
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 82c3b8e..511f39b 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.title = title;
-      setTextContent(document.getElementById("title"), title);
+      document.getElementsByTagName("title")[0].textContent = title;
+      document.getElementById("title").textContent = title;
 
       document.getElementById("logLink")
               .setAttribute("href", "/log/" + config.moduleName);
@@ -36,37 +36,17 @@
 
         var anchor = document.createElement("a");
         anchor.setAttribute("href", file.link);
-        setTextContent(anchor, file.name);
+        anchor.textContent = 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>
+<body onload="updatePage(config)">
 <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 c855615..6a27050 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 + "/");
-    setTextContent(anchor, moduleName);
+    anchor.setAttribute("href", moduleName + "/");
+    anchor.textContent = moduleName;
 
     var item = document.createElement("li");
     item.appendChild(anchor);
@@ -80,31 +80,11 @@
 
 function makeBookmarklet(name, javascript) {
   var result = document.createElement("a");
-  result.setAttribute(document.all ? "className" : "class", "bookmarklet");
+  result.setAttribute("class", "bookmarklet");
   result.setAttribute("href", "javascript:" + encodeURIComponent(javascript));
-  setTextContent(result, name);
+  result.textContent = 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>
@@ -139,7 +119,7 @@
     }
   </style>
 </head>
-<body>
+<body onload="updatePage(config)">
 
 <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 29a8647..239d44e 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.title = title;
-      setTextContent(document.getElementById("title"), title);
+      document.getElementsByTagName("title")[0].textContent = title;
+      document.getElementById("title").textContent = title;
 
       document.getElementById("logLink")
               .setAttribute("href", "../log/" + config.moduleName);
@@ -34,37 +34,17 @@
 
         var anchor = document.createElement("a");
         anchor.setAttribute("href", file.link);
-        setTextContent(anchor, file.name);
+        anchor.textContent = 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>
+<body onload="updatePage(config)">
 <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
deleted file mode 100644
index 0b5e8e0..0000000
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/nomodule.nocache.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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 35c17a1..93e27fa 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
@@ -1,17 +1,12 @@
-// GWT code can be installed anywhere, but an iFrame is the best place if you
-// want both variable isolation and runAsync support. Variable isolation is
-// useful for avoiding conflicts with JavaScript libraries and critical if
-// you want more than one GWT module on your page. The runAsync implementation
-// will need to install additional chunks of code into the same iFrame later.
-//
-// By default, CrossSiteIFrameLinker will use this script to create the iFrame.
-// It may be replaced by overriding CrossSiteIframeLinker.getJsInstallLocation()
-// to return the name of a different resource file. The replacement script may
-// optionally set this variable inside the iframe:
-//
-// $wnd - the location where the bootstrap module is defined. It should also
-//        be the location where the __gwtStatsEvent function is defined.
-//        If not set, the module will set $wnd to window.parent.
+// The GWT code can be installed anywhere, although an iFrame is the best
+// approach if you want both variable isolation (useful in general, but
+// critical if you want more than one GWT module on your page) and runAsync
+// which will need to be able to install additional chunks of code into that
+// isolated environment later on.
+
+// The items that must be provided in any install location are:
+// $wnd - the location where the bootstrap module is defined. Should also
+//        be the location where the __gwtStatsEvent is defined
 
 var frameDoc;
 
@@ -47,7 +42,13 @@
   // 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();
-  var doctype = (document.compatMode == 'CSS1Compat') ? '<!doctype html>' : '';
-  frameDoc.write(doctype + '<html><head></head><body></body></html>');
+  frameDoc.write('<html><head></head><body></body></html>');
   frameDoc.close();
+
+  var frameDocbody = frameDoc.getElementsByTagName('body')[0];
+  var script = frameDoc.createElement('script');
+  script.language='javascript';
+  var temp = "var $wnd = window.parent;";
+  script.text = temp;
+  frameDocbody.appendChild(script);
 }
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 55db43a..297dccb 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,9 +52,7 @@
   __MODULE_FUNC__.__getPropMap = function() {
     var result = {};
     for (var key in values) {
-      if (values.hasOwnProperty(key)) {
-        result[key] = computePropValue(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 8e59403..baacf86 100644
--- a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
@@ -347,14 +347,12 @@
     throws UnableToCompleteException {
     TextOutput out = new DefaultTextOutput(context.isOutputCompact());
 
-    // $wnd is the main window that the GWT code will affect and also the
-    // location where the bootstrap function was defined. In iframe-based linkers,
-    // $wnd is set to window.parent. Usually, in others, $wnd = window.
-    // By default, $wnd is not set when the module starts, but a replacement for
-    // installLocationIframe.js may set it.
+    // We assume that the $wnd has been set in the same scope as this code is
+    // executing in. $wnd is the main window which the GWT code is affecting. It
+    // is also usually the location the bootstrap function was defined in.
+    // In iframe based linkers, $wnd = window.parent;
+    // Usually, in others, $wnd = window;
 
-    out.print("var $wnd = $wnd || window.parent;");
-    out.newlineOpt();
     out.print("var __gwtModuleFunction = $wnd." + context.getModuleFunctionName() + ";");
     out.newlineOpt();
     out.print("var $sendStats = __gwtModuleFunction.__sendStats;");
@@ -406,20 +404,7 @@
         + "__gwtModuleFunction.__computePropValue);");
     out.newlineOpt();
     out.print("$sendStats('moduleStartup', 'end');");
-    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");
+    out.print("\n//@ sourceURL=0.js\n");
     return out.toString();
   }
 
@@ -589,7 +574,7 @@
       for (String chunk : chunks) {
         newChunks.add(JsToStringGenerationVisitor.javaScriptString(chunk));
       }
-      out.append(Joiner.on(",\n").join(newChunks));
+      out.append(Joiner.on(", ").join(newChunks));
       out.append("]);\n");
     } else {
       out.append(script);
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 a5026f2..816e1b1 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.children[0]);
+  head.insertBefore(script, head.firstElementChild);
 
   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 e4c8eaf..91a1d43 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 + '/' + sourceMapFilenameForFragment(fragment), js);
+      super(SymbolMapsLinker.class, permutationId + "/sourceMap" + fragment + ".json", js);
       this.permutationId = permutationId;
       this.fragment = fragment;
       this.js = js;
@@ -183,10 +183,6 @@
     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 8ba6fb5..f9df91a 100644
--- a/dev/core/src/com/google/gwt/dev/CompileModule.java
+++ b/dev/core/src/com/google/gwt/dev/CompileModule.java
@@ -30,6 +30,8 @@
 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;
@@ -98,6 +100,9 @@
     }
   }
 
+  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
deleted file mode 100644
index b3f6ee4..0000000
--- a/dev/core/src/com/google/gwt/dev/CompileModuleOptions.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 914713d..7c65f6e 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("GWT Compiler Thread");
+      compilerThread.setName("GWTCompiler Thread");
       compilerThread.start();
       // TODO(jat): create an app frame for loggerWindow
       
diff --git a/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java b/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java
index 63f037e..f78b592 100644
--- a/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java
+++ b/dev/core/src/com/google/gwt/dev/DevelModeTabKey.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2009 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/Disconnectable.java b/dev/core/src/com/google/gwt/dev/Disconnectable.java
index 8c00318..ef42887 100644
--- a/dev/core/src/com/google/gwt/dev/Disconnectable.java
+++ b/dev/core/src/com/google/gwt/dev/Disconnectable.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2009 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/GWTCompiler.java b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
new file mode 100644
index 0000000..ef2e4ea
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
@@ -0,0 +1,239 @@
+/*
+ * 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
new file mode 100644
index 0000000..77339ff
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/GWTShell.java
@@ -0,0 +1,252 @@
+/*
+ * 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/ModulePanel.java b/dev/core/src/com/google/gwt/dev/ModulePanel.java
index 07ed37e..a93957e 100644
--- a/dev/core/src/com/google/gwt/dev/ModulePanel.java
+++ b/dev/core/src/com/google/gwt/dev/ModulePanel.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2008 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java b/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java
index 95b5ddd..434a0d5 100644
--- a/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java
+++ b/dev/core/src/com/google/gwt/dev/ModuleTabPanel.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2009 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/SessionModule.java b/dev/core/src/com/google/gwt/dev/SessionModule.java
index fb71456..7b25dbc 100644
--- a/dev/core/src/com/google/gwt/dev/SessionModule.java
+++ b/dev/core/src/com/google/gwt/dev/SessionModule.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2009 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/WebServerPanel.java b/dev/core/src/com/google/gwt/dev/WebServerPanel.java
index 3505a15..62a121d 100644
--- a/dev/core/src/com/google/gwt/dev/WebServerPanel.java
+++ b/dev/core/src/com/google/gwt/dev/WebServerPanel.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2008 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
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 378ab1a..8d972e9 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 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.
+   * 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.
    * 
    * @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/cfg/ModuleDefLoader.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java
index 166723b..f7021d3 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java
@@ -22,9 +22,11 @@
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
 import com.google.gwt.dev.util.xml.ReflectiveParser;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
 import com.google.gwt.util.tools.Utility;
 
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
 import java.io.File;
 import java.io.Reader;
 import java.net.URISyntaxException;
@@ -55,8 +57,9 @@
    * tight. The current context class loader used as a key for modules cache.
    * The module's physical name is used as a key inside the cache.
    */
-  private static final Map<ClassLoader, Map<String, ModuleDef>> loadedModulesCaches =
-      new MapMaker().weakKeys().makeMap();
+  @SuppressWarnings("unchecked")
+  private static final Map<ClassLoader, Map<String, ModuleDef>> loadedModulesCaches = new ReferenceMap(
+      AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD);
 
   /**
    * A mapping from effective to physical module names.
@@ -207,11 +210,12 @@
     return moduleDef;
   }
 
+  @SuppressWarnings("unchecked")
   private static Map<String, ModuleDef> getModulesCache() {
     ClassLoader keyClassLoader = Thread.currentThread().getContextClassLoader();
     Map<String, ModuleDef> cache = loadedModulesCaches.get(keyClassLoader);
     if (cache == null) {
-      cache = new MapMaker().softValues().makeMap();
+      cache = new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT);
       loadedModulesCaches.put(keyClassLoader, cache);
     }
     return cache;
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
new file mode 100644
index 0000000..fee85f3
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/etc/tomcat/conf/web.xml
@@ -0,0 +1,566 @@
+<?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
new file mode 100644
index 0000000..e600b2f
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/etc/tomcat/webapps/ROOT/WEB-INF/web.xml
@@ -0,0 +1,14 @@
+<?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 53e30a8..3db7676 100644
--- a/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
+++ b/dev/core/src/com/google/gwt/dev/javac/CompilationUnit.java
@@ -60,42 +60,16 @@
        */
       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;
@@ -127,18 +101,6 @@
           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
@@ -147,6 +109,8 @@
         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/javac/MemoryUnitCache.java b/dev/core/src/com/google/gwt/dev/javac/MemoryUnitCache.java
index 875ce26..971a1d8 100644
--- a/dev/core/src/com/google/gwt/dev/javac/MemoryUnitCache.java
+++ b/dev/core/src/com/google/gwt/dev/javac/MemoryUnitCache.java
@@ -16,8 +16,11 @@
 package com.google.gwt.dev.javac;
 
 import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
 
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
+import java.util.Collections;
 import java.util.Map;
 
 /**
@@ -76,13 +79,17 @@
    * 
    * The key is resource path.
    */
-  protected final Map<String, UnitCacheEntry> unitMap = new MapMaker().softValues().makeMap();
+  @SuppressWarnings("unchecked")
+  protected final Map<String, UnitCacheEntry> unitMap = Collections
+      .synchronizedMap(new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT));
 
   /**
    * References {@link CompilationUnit} objects by {@link ContentId}, which is
    * composed of the type name and a hash on the source code contents.
    */
-  protected final Map<ContentId, UnitCacheEntry> unitMapByContentId = new MapMaker().softValues().makeMap();
+  @SuppressWarnings("unchecked")
+  protected final Map<ContentId, UnitCacheEntry> unitMapByContentId = Collections
+      .synchronizedMap(new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT));
 
   /**
    * Adds a new entry into the cache.
diff --git a/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java b/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java
index de16ed7..334fcd0 100644
--- a/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java
+++ b/dev/core/src/com/google/gwt/dev/javac/typemodel/TypeOracle.java
@@ -28,7 +28,10 @@
 import com.google.gwt.dev.util.Name;
 import com.google.gwt.dev.util.collect.HashMap;
 import com.google.gwt.dev.util.collect.IdentityHashMap;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
 
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
@@ -280,7 +283,9 @@
    * Cached types that represent Arrays of other types. These types are created
    * as needed.
    */
-  private final Map<JType, JArrayType> arrayTypes = new MapMaker().weakKeys().weakValues().makeMap();
+  @SuppressWarnings("unchecked")
+  private final Map<JType, JArrayType> arrayTypes = new ReferenceIdentityMap(
+      AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK, true);
 
   /**
    * Cached singleton type representing <code>java.lang.Object</code>.
@@ -304,8 +309,9 @@
    * Subclasses of generic types that have type parameters filled in. These
    * types are created as needed.
    */
+  @SuppressWarnings("unchecked")
   private final Map<ParameterizedTypeKey, JParameterizedType> parameterizedTypes =
-      new MapMaker().weakValues().makeMap();
+      new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK, true);
 
   /**
    * A list of recently-added types that will be fully initialized on the next
@@ -315,7 +321,9 @@
 
   private JWildcardType unboundWildCardType;
 
-  private final Map<WildCardKey, JWildcardType> wildcardTypes = new MapMaker().weakValues().makeMap();
+  @SuppressWarnings("unchecked")
+  private final Map<WildCardKey, JWildcardType> wildcardTypes = new ReferenceMap(
+      AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK, true);
 
   public TypeOracle() {
     // Always create the default package.
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 73333a6..8826981 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(logger, jprogram, jsProgram, options, rpo);
-    unifyAst.buildEverything();
+    UnifyAst unifyAst = new UnifyAst(jprogram, jsProgram, options, rpo);
+    unifyAst.buildEverything(logger);
 
     // Compute all super type/sub type info
     jprogram.typeOracle.computeBeforeAST();
diff --git a/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java b/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java
index 8e13492..c8b99cb 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/CorrelationFactory.java
@@ -21,9 +21,11 @@
 import com.google.gwt.dev.jjs.ast.JField;
 import com.google.gwt.dev.jjs.ast.JMethod;
 import com.google.gwt.dev.jjs.ast.JType;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.ReferenceMap;
 
 import java.io.Serializable;
+import java.util.Collections;
 import java.util.EnumMap;
 import java.util.Map;
 
@@ -110,7 +112,9 @@
     /**
      * This cuts down on the total number of Correlation objects allocated.
      */
-    private final Map<Object, Correlation> canonicalMap = new MapMaker().weakKeys().weakValues().makeMap();
+    @SuppressWarnings("unchecked")
+    private final Map<Object, Correlation> canonicalMap = Collections
+        .synchronizedMap(new ReferenceMap(ReferenceMap.WEAK, ReferenceMap.WEAK));
 
     private RealCorrelationFactory() {
     }
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 e1a6180..042e145 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -485,32 +485,21 @@
       PermutationResult toReturn =
           new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable, jsProgram), ranges);
       CompilationMetricsArtifact compilationMetrics = null;
-
       // TODO: enable this when ClosureCompiler is enabled
-      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));
-        }
+      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));
       }
 
       // TODO: enable this when ClosureCompiler is enabled
-      if (options.isClosureCompilerEnabled()) {
-        if (options.isSoycEnabled()) {
-          logger.log(TreeLogger.WARN, "Incompatible options: -XenableClosureCompiler and "
-              + "-compileReport; ignoring -compileReport.");
-        }
-      } else {
+      if (!options.isClosureCompilerEnabled()) {
         toReturn.addArtifacts(makeSoycArtifacts(logger, permutationId, jprogram, js, sizeBreakdowns,
             options.isSoycExtra() ? sourceInfoMaps : null, dependencies, jjsmap, obfuscateMap,
             unifiedAst.getModuleMetrics(), unifiedAst.getPrecompilationMetrics(), compilationMetrics,
@@ -518,15 +507,10 @@
       }
 
       // TODO: enable this when ClosureCompiler is enabled
-      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));
-        }
+      if (!options.isClosureCompilerEnabled() && isSourceMapsEnabled) {
+        logger.log(TreeLogger.INFO, "Source Maps Enabled");
+        toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps,
+            permutationId));
       }
 
       logTrackingStats(logger);
@@ -633,11 +617,11 @@
 
     try {
       // (2) Assemble the Java AST.
-      UnifyAst unifyAst = new UnifyAst(logger, jprogram, jsProgram, options, rpo);
+      UnifyAst unifyAst = new UnifyAst(jprogram, jsProgram, options, rpo);
       unifyAst.addRootTypes(allRootTypes);
       // TODO: move this into UnifyAst?
       findEntryPoints(logger, rpo, declEntryPts, jprogram);
-      unifyAst.exec();
+      unifyAst.exec(logger);
 
       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 1986666..6864453 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,11 +74,6 @@
     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 1b9dc03..7b127d2 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,22 +27,7 @@
 import java.util.List;
 
 /**
- * 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.
- *
+ * Base class for any reference type.
  */
 public abstract class JDeclaredType extends JReferenceType {
 
@@ -63,8 +48,8 @@
   protected transient List<JMethod> methods = Lists.create();
 
   /**
-   * 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.
+   * Tracks the target static initialization for this class. Default to self
+   * until removed or set to be a superclass.
    */
   private JDeclaredType clinitTarget = this;
 
@@ -89,26 +74,6 @@
    */
   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);
   }
@@ -135,12 +100,8 @@
   /**
    * Adds a method to this type.
    */
-  public final void addMethod(JMethod method) {
+  public 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);
   }
 
@@ -179,40 +140,10 @@
   }
 
   /**
-   * 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 final JDeclaredType getClinitTarget() {
+  public JDeclaredType getClinitTarget() {
     return clinitTarget;
   }
 
@@ -255,7 +186,7 @@
    * Returns this type's declared methods; does not include methods defined in a
    * super type unless they are overridden by this type.
    */
-  public final List<JMethod> getMethods() {
+  public List<JMethod> getMethods() {
     return methods;
   }
 
@@ -287,7 +218,7 @@
    * Removes the field at the specified index.
    */
   public void removeField(int i) {
-    assert !isExternal() : "External types can not be modified.";
+    assert !isExternal() : "External types can not be modiified.";
     fields = Lists.remove(fields, i);
   }
 
@@ -295,23 +226,11 @@
    * Removes the method at the specified index.
    */
   public void removeMethod(int i) {
-    assert !isExternal() : "External types can not be modified.";
+    assert !isExternal() : "External types can not be modiified.";
     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 53c46e3..675fcf0 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 expr.hasSideEffects();
+    return false;
   }
 
   /**
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 dede802..1f23013 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,11 +249,7 @@
         sb.append(type.getJsniSignatureName());
       }
       sb.append(')');
-      if (!isConstructor()) {
-        sb.append(getOriginalReturnType().getJsniSignatureName());
-      } else {
-        sb.append(" <init>");
-      }
+      sb.append(getOriginalReturnType().getJsniSignatureName());
       signature = sb.toString();
     }
     return signature;
@@ -271,10 +267,6 @@
     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 bcc1331..ad4542f 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.getClinitMethod())) {
+    if ((enclosingType != null) && (method == enclosingType.getMethods().get(0))) {
       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 5963dd1..8850cb6 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.getClinitMethod();
+    JMethod method = type.getMethods().get(0);
     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 2c871f4..347088d 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,19 +589,8 @@
     return union;
   }
 
-  /**
-   * 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) {
+  private static <T> void updateReverseMap(int entry, Map<T, Integer> map, Set<?> liveWithoutEntry,
+      Iterable<T> all) {
     for (T each : all) {
       if (!liveWithoutEntry.contains(each)) {
         /*
@@ -611,11 +600,7 @@
          * been reached. Thus, it can be downloaded along with either i's or j's
          * code.
          */
-        if (!liveFromSplitPoint.contains(each)) {
-          // complement says it should be live, but it is not actually live within the splitpoint
-        } else {
-          map.put(each, splitPoint);
-        }
+        map.put(each, entry);
       }
     }
   }
@@ -657,7 +642,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
@@ -731,27 +716,6 @@
   }
 
   /**
-   * 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() {
@@ -809,21 +773,7 @@
     // 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>>();
     
@@ -898,20 +848,14 @@
       }
 
       ControlFlowAnalyzer allButOne = computeAllButNCfas(liveAfterInitialSequence, splitPoints);
-      ControlFlowAnalyzer allFromSplitPoints = computeAllLiveFromSplitPoints(liveAfterInitialSequence, splitPoints);
-
       Set<JNode> allLiveNodes =
           union(allButOne.getLiveFieldsAndMethods(), allButOne.getFieldsWritten());
-      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.fields, allLiveNodes, allFields);
+      updateReverseMap(i, fragmentMap.methods, allButOne.getLiveFieldsAndMethods(), allMethods);
       updateReverseMap(i, fragmentMap.strings, allButOne.getLiveStrings(), everything
-          .getLiveStrings(), allFromSplitPoints.getLiveStrings());
+          .getLiveStrings());
       updateReverseMap(i, fragmentMap.types, declaredTypesIn(allButOne.getInstantiatedTypes()),
-          declaredTypesIn(everything.getInstantiatedTypes()),
-          declaredTypesIn(allFromSplitPoints.getInstantiatedTypes()));
+          declaredTypesIn(everything.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 93485dd..f9b3aaa 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.getClinitMethod());
+        rescue(type.getMethods().get(0));
       }
 
       // 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.getClinitMethod());
+        rescue(type.getMethods().get(0));
       }
 
       // 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().getClinitMethod());
+            liveFieldsAndMethods.add(field.getEnclosingType().getMethods().get(0));
           } 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 0907c57..7013f53 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,7 +37,6 @@
 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;
@@ -145,10 +144,10 @@
       }
       switch (op) {
         case AND:
-          maybeReplaceMe(x, Simplifier.and(x), ctx);
+          maybeReplaceMe(x, simplifier.shortCircuitAnd(x, null, lhs, rhs), ctx);
           break;
         case OR:
-          maybeReplaceMe(x, Simplifier.or(x), ctx);
+          maybeReplaceMe(x, simplifier.shortCircuitOr(x, null, lhs, rhs), ctx);
           break;
         case BIT_XOR:
           simplifyXor(lhs, rhs, ctx);
@@ -265,12 +264,13 @@
 
     @Override
     public void endVisit(JCastOperation x, Context ctx) {
-      maybeReplaceMe(x, Simplifier.cast(x), ctx);
+      maybeReplaceMe(x, simplifier.cast(x, x.getSourceInfo(), x.getCastType(), x.getExpr()), ctx);
     }
 
     @Override
     public void endVisit(JConditional x, Context ctx) {
-      maybeReplaceMe(x, Simplifier.conditional(x), ctx);
+      maybeReplaceMe(x, simplifier.conditional(x, x.getSourceInfo(), x.getType(), x.getIfTest(), x
+          .getThenExpr(), x.getElseExpr()), ctx);
     }
 
     @Override
@@ -365,19 +365,8 @@
      */
     @Override
     public void endVisit(JIfStatement x, Context 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);
-      }
+      maybeReplaceMe(x, simplifier.ifStatement(x, x.getSourceInfo(), x.getIfExpr(),
+          x.getThenStmt(), x.getElseStmt(), currentMethod), ctx);
     }
 
     @Override
@@ -450,7 +439,6 @@
         }
       }
 
-      HashSet<JDeclaredType> clinitsCalled = new HashSet<JDeclaredType>();
       for (int i = 0; i < numRemovableExpressions(x); ++i) {
         JExpression expr = x.exprs.get(i);
         if (!expr.hasSideEffects()) {
@@ -468,22 +456,6 @@
           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) {
@@ -550,7 +522,7 @@
         }
       }
       if (x.getOp() == JUnaryOperator.NOT) {
-        maybeReplaceMe(x, Simplifier.not(x), ctx);
+        maybeReplaceMe(x, simplifier.not(x, x.getSourceInfo(), x.getArg()), ctx);
         return;
       } else if (x.getOp() == JUnaryOperator.NEG) {
         maybeReplaceMe(x, simplifyNegate(x, x.getArg()), ctx);
@@ -731,7 +703,7 @@
     }
 
     private JMethodCall createClinitCall(SourceInfo sourceInfo, JDeclaredType targetType) {
-      JMethod clinit = targetType.getClinitTarget().getClinitMethod();
+      JMethod clinit = targetType.getClinitTarget().getMethods().get(0);
       assert (JProgram.isClinit(clinit));
       return new JMethodCall(sourceInfo, null, clinit);
     }
@@ -1201,8 +1173,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) {
@@ -1354,11 +1326,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;
       }
 
@@ -1399,11 +1371,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;
       }
 
@@ -1423,27 +1395,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;
@@ -1479,11 +1451,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;
@@ -1569,7 +1541,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);
@@ -1791,11 +1763,13 @@
   }
 
   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 d7ea10c..959abc1 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,9 +667,10 @@
 
       if (canBeOrdinal(x)) {
         /*
-         * Cleanup clinit method for ordinalizable enums.
+         * Cleanup clinit method for ordinalizable enums. Note, method 0 is
+         * always the clinit.
          */
-        updateClinit(x.getClinitMethod());
+        updateClinit(x.getMethods().get(0));
 
         /*
          * 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 6b86885..1616123 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,7 +439,6 @@
         JsParameter jsParam = jsCatch.getParameter();
         names.put(arg.getTarget(), jsParam.getName());
         catchMap.put(catchBlock, jsCatch);
-        catchParamIdentifiers.add(jsParam.getName());
 
         push(jsCatch.getScope());
         accept(catchBlock);
@@ -1147,9 +1146,7 @@
       for (int i = 0; i < locals.size(); ++i) {
         JsName name = names.get(x.getLocals().get(i));
         String ident = name.getIdent();
-        if (!alreadySeen.contains(ident)
-            // Catch block params don't need var declarations
-            && !catchParamIdentifiers.contains(name)) {
+        if (!alreadySeen.contains(ident)) {
           alreadySeen.add(ident);
           vars.add(new JsVar(x.getSourceInfo(), name));
         }
@@ -1190,7 +1187,7 @@
           return;
         } else if (type != clinitTarget) {
           // replace the method with its retargeted clinit
-          method = clinitTarget.getClinitMethod();
+          method = clinitTarget.getMethods().get(0);
         }
       }
 
@@ -1777,7 +1774,7 @@
        * refs to super classes are preserved.
        */
       JMethodBody clinitBody =
-          (JMethodBody) program.getTypeClassLiteralHolder().getClinitMethod().getBody();
+          (JMethodBody) program.getTypeClassLiteralHolder().getMethods().get(0).getBody();
       for (JStatement stmt : clinitBody.getStatements()) {
         if (stmt instanceof JDeclarationStatement) {
           generateClassLiteral((JDeclarationStatement) stmt, vars);
@@ -2160,7 +2157,7 @@
         return null;
       }
 
-      JMethod clinitMethod = targetType.getClinitMethod();
+      JMethod clinitMethod = targetType.getMethods().get(0);
       SourceInfo sourceInfo = x.getSourceInfo();
       JsInvocation jsInvocation = new JsInvocation(sourceInfo);
       jsInvocation.setQualifier(names.get(clinitMethod).makeRef(sourceInfo));
@@ -2183,7 +2180,7 @@
         return null;
       }
 
-      JMethod clinitMethod = enclosingType.getClinitTarget().getClinitMethod();
+      JMethod clinitMethod = enclosingType.getClinitTarget().getMethods().get(0);
       SourceInfo sourceInfo = x.getSourceInfo();
       JsInvocation jsInvocation = new JsInvocation(sourceInfo);
       jsInvocation.setQualifier(names.get(clinitMethod).makeRef(sourceInfo));
@@ -2340,8 +2337,6 @@
 
   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 9423eeb..30102bc 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,7 +686,8 @@
          * explicit this constructor call, in which case the callee will.
          */
         if (!hasExplicitThis) {
-          JMethod initMethod = curClass.type.getInitMethod();
+          // $init is always in position 1 (clinit is in 0)
+          JMethod initMethod = curClass.type.getMethods().get(1);
           JMethodCall initCall = new JMethodCall(info, makeThisRef(info), initMethod);
           block.addStmt(initCall.makeStatement());
         }
@@ -1742,11 +1743,11 @@
       JDeclaredType type = curClass.type;
       /*
        * Make clinits chain to super class (JDT doesn't write code to do this).
-       * Call super class $clinit;
+       * Call super class $clinit; $clinit is always in position 0.
        */
       if (type.getSuperClass() != null) {
-        JMethod myClinit = type.getClinitMethod();
-        JMethod superClinit = type.getSuperClass().getClinitMethod();
+        JMethod myClinit = type.getMethods().get(0);
+        JMethod superClinit = type.getSuperClass().getMethods().get(0);
         JMethodCall superClinitCall = new JMethodCall(myClinit.getSourceInfo(), null, superClinit);
         JMethodBody body = (JMethodBody) myClinit.getBody();
         body.getBlock().addStmt(0, superClinitCall.makeStatement());
@@ -2050,7 +2051,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.getClinitMethod().getBody()).getBlock();
+      JBlock clinitBlock = ((JMethodBody) type.getMethods().get(0).getBody()).getBlock();
 
       /*
        * HACKY: the $VALUES array must be initialized immediately after all of
@@ -2373,25 +2374,16 @@
       }
     }
 
-    // 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) {
-        // 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));
+        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));
+          }
         }
       }
     }
@@ -2441,9 +2433,9 @@
     private void pushInitializerMethodInfo(FieldDeclaration x, MethodScope scope) {
       JMethod initMeth;
       if (x.isStatic()) {
-        initMeth = curClass.type.getClinitMethod();
+        initMeth = curClass.type.getMethods().get(0);
       } else {
-        initMeth = curClass.type.getInitMethod();
+        initMeth = curClass.type.getMethods().get(1);
       }
       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 868cd93..d13c0fc 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.getClinitMethod().getBody();
+        (JMethodBody) typeClassLiteralHolder.getMethods().get(0).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 be68c72..52df25c 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,9 +202,11 @@
   }
 
   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 beaf790..92eb2bb 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().getClinitMethod() == method && !stmts.isEmpty()) {
+            && method.getEnclosingType().getMethods().get(0) == 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.getClinitMethod();
+      JMethod clinit = targetType.getMethods().get(0);
 
       // 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 5c53646..408afaf 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,9 +202,11 @@
    * 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) {
@@ -219,7 +221,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 65bebe3..66a66bf 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,6 +29,7 @@
 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;
@@ -60,7 +61,7 @@
    * Negate the supplied expression if negating it makes the expression shorter.
    * Otherwise, return null.
    */
-  private static JExpression maybeUnflipBoolean(JExpression expr) {
+  static JExpression maybeUnflipBoolean(JExpression expr) {
     if (expr instanceof JUnaryOperation) {
       JUnaryOperation unop = (JUnaryOperation) expr;
       if (unop.getOp() == JUnaryOperator.NOT) {
@@ -78,57 +79,14 @@
     return list.get(list.size() - 1);
   }
 
-  /**
-   * This class provides only static methods. No instances will ever be created.
-   */
-  private Simplifier() {
+  private final JProgram program;
+
+  public Simplifier(JProgram program) {
+    this.program = program;
   }
 
-  /**
-   * 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) {
+  public JExpression cast(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;
     }
@@ -147,10 +105,10 @@
      * implicit anyway. Cannot coerce char since that would change the semantics
      * of concat.
      */
-    if (type == JPrimitiveType.INT) {
+    if (type == program.getTypePrimitiveInt()) {
       JType expType = exp.getType();
-      if ((expType == JPrimitiveType.SHORT)
-          || (expType == JPrimitiveType.BYTE)) {
+      if ((expType == program.getTypePrimitiveShort())
+          || (expType == program.getTypePrimitiveByte())) {
         return exp;
       }
     }
@@ -162,29 +120,11 @@
     return new JCastOperation(info, 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 cast(JType type, JExpression exp) {
+    return cast(null, exp.getSourceInfo(), type, exp);
   }
 
-  private static JExpression conditionalImpl(JConditional original, SourceInfo info, JType type,
+  public JExpression conditional(JConditional original, SourceInfo info, JType type,
       JExpression condExpr, JExpression thenExpr, JExpression elseExpr) {
     info = getBestSourceInfo(original, info, condExpr);
     if (condExpr instanceof JMultiExpression) {
@@ -193,8 +133,7 @@
       JMultiExpression condMulti = (JMultiExpression) condExpr;
       JMultiExpression newMulti = new JMultiExpression(info);
       newMulti.exprs.addAll(allButLast(condMulti.exprs));
-      newMulti.exprs.add(conditionalImpl(null, info, type, last(condMulti.exprs), thenExpr,
-          elseExpr));
+      newMulti.exprs.add(conditional(null, info, type, last(condMulti.exprs), thenExpr, elseExpr));
       // TODO(spoon): immediately simplify the resulting multi
       return newMulti;
     }
@@ -209,20 +148,20 @@
     } else if (thenExpr instanceof JBooleanLiteral) {
       if (((JBooleanLiteral) thenExpr).getValue()) {
         // e.g. (cond ? true : else) -> cond || else
-        return orImpl(null, info, condExpr, elseExpr);
+        return shortCircuitOr(null, info, condExpr, elseExpr);
       } else {
         // e.g. (cond ? false : else) -> !cond && else
-        JExpression notCondExpr = notImpl(null, condExpr.getSourceInfo(), condExpr);
-        return andImpl(null, info, notCondExpr, elseExpr);
+        JExpression notCondExpr = not(null, condExpr.getSourceInfo(), condExpr);
+        return shortCircuitAnd(null, info, notCondExpr, elseExpr);
       }
     } else if (elseExpr instanceof JBooleanLiteral) {
       if (((JBooleanLiteral) elseExpr).getValue()) {
         // e.g. (cond ? then : true) -> !cond || then
-        JExpression notCondExpr = notImpl(null, condExpr.getSourceInfo(), condExpr);
-        return orImpl(null, info, notCondExpr, thenExpr);
+        JExpression notCondExpr = not(null, condExpr.getSourceInfo(), condExpr);
+        return shortCircuitOr(null, info, notCondExpr, thenExpr);
       } else {
         // e.g. (cond ? then : false) -> cond && then
-        return andImpl(null, info, condExpr, thenExpr);
+        return shortCircuitAnd(null, info, condExpr, thenExpr);
       }
     } else {
       // e.g. (!cond ? then : else) -> (cond ? else : then)
@@ -239,31 +178,8 @@
     return new JConditional(info, type, condExpr, thenExpr, elseExpr);
   }
 
-  /**
-   * 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) {
+  public JStatement ifStatement(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; }
@@ -272,7 +188,7 @@
       for (JExpression expr : allButLast(condMulti.exprs)) {
         newBlock.addStmt(expr.makeStatement());
       }
-      newBlock.addStmt(ifStatementImpl(null, info, last(condMulti.exprs), thenStmt, elseStmt,
+      newBlock.addStmt(ifStatement(null, info, last(condMulti.exprs), thenStmt, elseStmt,
           currentMethod));
       // TODO(spoon): immediately simplify the resulting block
       return newBlock;
@@ -305,7 +221,7 @@
         // TODO: this goes away when we normalize the Java AST properly.
         thenStmt = ensureBlock(thenStmt);
         elseStmt = ensureBlock(elseStmt);
-        return ifStatementImpl(null, info, unflipped, elseStmt, thenStmt, currentMethod);
+        return ifStatement(null, info, unflipped, elseStmt, thenStmt, currentMethod);
       }
     }
 
@@ -322,27 +238,14 @@
     return new JIfStatement(info, condExpr, thenStmt, elseStmt);
   }
 
-  /**
-   * 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) {
+  public JExpression not(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(notImpl(null, info, last(argMulti.exprs)));
+      newMulti.exprs.add(not(null, info, last(argMulti.exprs)));
       // TODO(spoon): immediately simplify the newMulti
       return newMulti;
     }
@@ -397,39 +300,18 @@
 
   /**
    * Simplify short circuit AND expressions.
-   *
+   * 
    * <pre>
-   * true && isWhatever() -> isWhatever()
-   * false && isWhatever() -> false
-   *
-   * isWhatever() && true -> isWhatever()
-   * isWhatever() && false -> false, unless side effects
-   *
-   * (a, b) && c -> (a, b && c)
+   * if (true && isWhatever()) -> if (isWhatever())
+   * if (false && isWhatever()) -> if (false)
+   * 
+   * if (isWhatever() && true) -> if (isWhatever())
+   * if (isWhatever() && false) -> if (false), unless side effects
    * </pre>
-   *
-   * @param exp an AND JBinaryExpression to be simplified.
-   * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
-   *
    */
-  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,
+  public JExpression shortCircuitAnd(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()) {
@@ -455,39 +337,18 @@
 
   /**
    * Simplify short circuit OR expressions.
-   *
+   * 
    * <pre>
-   * true || isWhatever() -> true
-   * false || isWhatever() -> isWhatever()
-   *
-   * isWhatever() || false isWhatever()
-   * isWhatever() || true -> true, unless side effects
-   *
-   * (a, b) || c -> (a, b || c)
+   * if (true || isWhatever()) -> if (true)
+   * if (false || isWhatever()) -> if (isWhatever())
+   * 
+   * if (isWhatever() || false) -> if (isWhatever())
+   * if (isWhatever() || true) -> if (true), unless side effects
    * </pre>
-   *
-   * @param exp an OR JBinaryExpression to be simplified.
-   * @return the simplified expression if a simplification was possible; <code>exp</code> otherwise.
-   *
    */
-  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,
+  public JExpression shortCircuitOr(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()) {
@@ -495,6 +356,7 @@
       } else {
         return rhs;
       }
+
     } else if (rhs instanceof JBooleanLiteral) {
       JBooleanLiteral booleanLiteral = (JBooleanLiteral) rhs;
       if (!booleanLiteral.getValue()) {
@@ -510,7 +372,7 @@
     return new JBinaryOperation(info, rhs.getType(), JBinaryOperator.OR, lhs, rhs);
   }
 
-  private static JStatement ensureBlock(JStatement stmt) {
+  private JStatement ensureBlock(JStatement stmt) {
     if (stmt == null) {
       return null;
     }
@@ -522,7 +384,7 @@
     return stmt;
   }
 
-  private static JExpression extractExpression(JStatement stmt) {
+  private JExpression extractExpression(JStatement stmt) {
     if (stmt instanceof JExpressionStatement) {
       JExpressionStatement statement = (JExpressionStatement) stmt;
       return statement.getExpr();
@@ -531,7 +393,7 @@
     return null;
   }
 
-  private static JStatement extractSingleStatement(JStatement stmt) {
+  private JStatement extractSingleStatement(JStatement stmt) {
     if (stmt instanceof JBlock) {
       JBlock block = (JBlock) stmt;
       if (block.getStatements().size() == 1) {
@@ -542,15 +404,7 @@
     return stmt;
   }
 
-  /**
-   * 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) {
+  private SourceInfo getBestSourceInfo(JNode original, SourceInfo info, JNode defaultNode) {
     if (info == null) {
       if (original == null) {
         info = defaultNode.getSourceInfo();
@@ -561,7 +415,7 @@
     return info;
   }
 
-  private static JStatement rewriteIfIntoBoolean(SourceInfo sourceInfo, JExpression condExpr,
+  private JStatement rewriteIfIntoBoolean(SourceInfo sourceInfo, JExpression condExpr,
       JStatement thenStmt, JStatement elseStmt, JMethod currentMethod) {
     thenStmt = extractSingleStatement(thenStmt);
     elseStmt = extractSingleStatement(elseStmt);
@@ -612,7 +466,7 @@
         }
 
         JBinaryOperation binaryOperation =
-            new JBinaryOperation(sourceInfo, JPrimitiveType.VOID, binaryOperator, condExpr,
+            new JBinaryOperation(sourceInfo, program.getTypeVoid(), 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 70ec21c..d93006c 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,13 +870,10 @@
       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 5aa134c..b6967c4 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 final TreeLogger logger;
+  private TreeLogger logger;
   private Set<JMethod> magicMethodCalls = new IdentityHashSet<JMethod>();
   private final Map<String, JMethod> methodMap = new HashMap<String, JMethod>();
   private final JJSOptions options;
@@ -515,9 +515,8 @@
   private final Map<String, List<JMethod>> virtualMethodsPending =
       new java.util.HashMap<String, List<JMethod>>();
 
-  public UnifyAst(TreeLogger logger, JProgram program, JsProgram jsProgram, JJSOptions options,
+  public UnifyAst(JProgram program, JsProgram jsProgram, JJSOptions options,
       RebindPermutationOracle rpo) {
-    this.logger = logger;
     this.program = program;
     this.jsProgram = jsProgram;
     this.options = options;
@@ -539,7 +538,8 @@
    * Special AST construction, useful for tests. Everything is resolved,
    * translated, and unified.
    */
-  public void buildEverything() throws UnableToCompleteException {
+  public void buildEverything(TreeLogger logger) throws UnableToCompleteException {
+    this.logger = logger;
     for (String internalName : classFileMap.keySet()) {
       String typeName = InternalName.toBinaryName(internalName);
       searchForTypeByBinary(typeName);
@@ -568,7 +568,9 @@
    * entry points. This reduces memory and improves compile speed. Any
    * unreachable elements are pruned.
    */
-  public void exec() throws UnableToCompleteException {
+  public void exec(TreeLogger logger) throws UnableToCompleteException {
+    this.logger = logger;
+
     // Trace execution from entry points.
     for (JMethod entryMethod : program.getEntryMethods()) {
       flowInto(entryMethod);
@@ -639,7 +641,7 @@
       }
 
       // Special clinit handling.
-      JMethod clinit = type.getClinitMethod();
+      JMethod clinit = type.getMethods().get(0);
       if (!liveFieldsAndMethods.contains(clinit)) {
         clinit.setBody(new JMethodBody(SourceOrigin.UNKNOWN));
       }
@@ -992,7 +994,7 @@
       assert errorsFound;
       return;
     }
-    JMethod clinit = type.getClinitMethod();
+    JMethod clinit = type.getMethods().get(0);
     if (!liveFieldsAndMethods.contains(clinit)) {
       flowInto(clinit);
       if (type.getSuperClass() != null) {
diff --git a/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
index f52370e..c0d8f40 100644
--- a/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
+++ b/dev/core/src/com/google/gwt/dev/js/ClosureJsAstTranslator.java
@@ -117,6 +117,7 @@
     Node script = IR.script();
     script.putBooleanProp(Node.SYNTHETIC_BLOCK_PROP, true);
     script.setInputId(inputId);
+    script.putProp(Node.SOURCENAME_PROP, source);
     script.setStaticSourceFile(getClosureSourceFile(source));
     for (JsStatement s : fragment.getGlobalBlock().getStatements()) {
       script.addChildToBack(transform(s));
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java b/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
index daaffc5..5d598e1 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/ResourceOracleImpl.java
@@ -25,7 +25,9 @@
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
 import com.google.gwt.dev.util.msg.Message0;
 import com.google.gwt.dev.util.msg.Message1String;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
 
 import java.io.File;
 import java.io.IOException;
@@ -151,8 +153,9 @@
     }
   }
 
-  private static final Map<ResourceLoader, List<ClassPathEntry>> classPathCache =
-      new MapMaker().weakKeys().makeMap();
+  @SuppressWarnings("unchecked")
+  private static final Map<ResourceLoader, List<ClassPathEntry>> classPathCache = new ReferenceMap(
+      AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD);
   
   public static void clearCache() {
     classPathCache.clear();
diff --git a/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java b/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java
index 110de6a..17a4144 100644
--- a/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java
+++ b/dev/core/src/com/google/gwt/dev/resource/impl/ZipFileClassPathEntry.java
@@ -21,7 +21,10 @@
 import com.google.gwt.dev.util.collect.IdentityMaps;
 import com.google.gwt.dev.util.collect.Sets;
 import com.google.gwt.dev.util.msg.Message1String;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
 
 import java.io.File;
 import java.io.IOException;
@@ -72,7 +75,9 @@
    * not referenced anywhere else, so we use hard reference, and soft reference on
    * {@link ZipFileClassPathEntry} allows its clearing in response to memory demand.
    */
-  private static final Map<String, ZipFileClassPathEntry> entryCache = new MapMaker().softValues().makeMap();
+  @SuppressWarnings("unchecked")
+  private static final Map<String, ZipFileClassPathEntry> entryCache = new ReferenceMap(
+      AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT);
 
   public static void clearCache() {
     entryCache.clear();
@@ -100,7 +105,9 @@
    * and {@link ZipFileSnapshot} is not referenced anywhere outside of {@link ZipFileClassPathEntry}
    * . When the module dies, the {@link ZipFileSnapshot} needs to die also.
    */
-  private final Map<PathPrefixSet, ZipFileSnapshot> cachedSnapshots = new MapMaker().weakKeys().makeMap();
+  @SuppressWarnings("unchecked")
+  private final Map<PathPrefixSet, ZipFileSnapshot> cachedSnapshots = new ReferenceIdentityMap(
+      AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD, true);
 
   private final long lastModified;
   private final String location;
diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
index dd13008..dd6d468 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -45,9 +45,12 @@
 import com.google.gwt.dev.util.log.speedtracer.DevModeEventType;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger;
 import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
 import com.google.gwt.util.tools.Utility;
 
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
 import java.beans.Beans;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -937,9 +940,13 @@
 
   private final TypeOracle typeOracle;
 
-  private final Map<Object, Object> weakJavaWrapperCache = new MapMaker().weakKeys().weakValues().makeMap();
+  @SuppressWarnings("unchecked")
+  private final Map<Object, Object> weakJavaWrapperCache = new ReferenceIdentityMap(
+      AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK);
 
-  private final Map<Integer, Object> weakJsoCache = new MapMaker().weakValues().makeMap();
+  @SuppressWarnings("unchecked")
+  private final Map<Integer, Object> weakJsoCache = new ReferenceMap(
+      AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK);
 
   public CompilingClassLoader(TreeLogger logger,
       CompilationState compilationState, ShellJavaScriptHost javaScriptHost)
diff --git a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
new file mode 100644
index 0000000..77944a6
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
@@ -0,0 +1,999 @@
+/*
+ * 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.util.tools.Utility;
+
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
+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.
+   */
+  @SuppressWarnings("unchecked")
+  private final Map<String, ModuleDef> loadedModulesByName = new ReferenceMap(
+      AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK);
+
+  /**
+   * 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.
+   */
+  @SuppressWarnings("unchecked")
+  private final Map<ModuleDef, Map<String, HttpServlet>> loadedServletsByModuleAndClassName = new ReferenceIdentityMap(
+      AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD, true);
+
+  private final Map<String, String> mimeTypes = new HashMap<String, String>();
+
+  /**
+   * Only for backwards compatibility. Shouldn't we remove this now?
+   */
+  @SuppressWarnings("unchecked")
+  private final Map<String, ModuleDef> modulesByServletPath = new ReferenceMap(
+      AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK);
+
+  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
new file mode 100644
index 0000000..d6b321e
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/HostedModeServletContextProxy.java
@@ -0,0 +1,338 @@
+/*
+ * 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 15e1354..b724854 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:visible;white-space:pre;'>" + stackTrace
+        + "<div style='overflow:visisble;white-space:pre;'>" + stackTrace
         + "</div>";
 
     invokeNativeVoid("__gwt_displayGlassMessage", null,
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
index edaffde..49a181d 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2008 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
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 9bac9bd..01c886a 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,7 +50,6 @@
 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;
@@ -66,12 +65,10 @@
 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;
@@ -214,6 +211,9 @@
       searchField.requestFocusInWindow();
     }
 
+    /**
+     * 
+     */
     private void updateSearchResult() {
       int n = matches.size();
       if (n == 0) {
@@ -260,7 +260,7 @@
 
   String regexFilter;
 
-  private final JTree tree;
+  final JTree tree;
 
   DefaultTreeModel treeModel;
 
@@ -286,8 +286,6 @@
   
   private JScrollPane treeView;
 
-  private JCheckBox autoScroll;
-
   /**
    * Create a Swing-based logger panel, with a tree section and a detail
    * section.
@@ -319,9 +317,6 @@
       }
     });
     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) {
@@ -374,16 +369,6 @@
     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);
@@ -531,6 +516,13 @@
     }
   }
 
+  /**
+   * @param node
+   */
+  public void notifyChange(DefaultMutableTreeNode node) {
+    treeModel.nodeChanged(node);
+  }
+
   @Override
   public void removeAll() {
     tree.removeAll();
@@ -724,18 +716,4 @@
       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 67d4804..ac5d464 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,6 +30,7 @@
 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.
@@ -354,6 +355,9 @@
         }
         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
new file mode 100644
index 0000000..9cf2d95
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/CatalinaLoggerAdapter.java
@@ -0,0 +1,75 @@
+/*
+ * 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
new file mode 100644
index 0000000..d071d2a
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/CommonsLoggerAdapter.java
@@ -0,0 +1,119 @@
+/*
+ * 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
new file mode 100644
index 0000000..e7d27ac
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/shell/tomcat/EmbeddedTomcatServer.java
@@ -0,0 +1,436 @@
+/*
+ * 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/dev/util/BrowserInfo.java b/dev/core/src/com/google/gwt/dev/util/BrowserInfo.java
index d56513a..851eba6 100644
--- a/dev/core/src/com/google/gwt/dev/util/BrowserInfo.java
+++ b/dev/core/src/com/google/gwt/dev/util/BrowserInfo.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2009 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java b/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java
index 78f3149..7029c58 100644
--- a/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java
+++ b/dev/core/src/com/google/gwt/dev/util/log/CompositeTreeLogger.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Copyright 2008 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
diff --git a/dev/core/src/com/google/gwt/soyc/GlobalInformation.java b/dev/core/src/com/google/gwt/soyc/GlobalInformation.java
index a6eac5d..4112404 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 fragment", "leftovers");
+      "Leftovers code, code not in any other split point", "leftovers");
+  private int numSplitPoints = 0;
   private Map<String, TreeSet<String>> packageToClasses = new TreeMap<String, TreeSet<String>>();
   private final String permutationId;
-  private ArrayList<Integer> initialFragmentLoadSequence = new ArrayList<Integer>();
-  private HashMap<Integer, List<String>> fragmentDescriptors =
-      new HashMap<Integer, List<String>>();
+  private ArrayList<Integer> splitPointInitialLoadSequence = new ArrayList<Integer>();
+  private HashMap<Integer, String> splitPointToLocation = new HashMap<Integer, 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 (getNumFragments() > 0) {
+    if (numSplitPoints > 0) {
       breakdowns.add(leftoversBreakdown);
-      for (int fragment = 1; fragment <= getNumFragments(); fragment++) {
-        breakdowns.add(fragmentCodeBreakdown(fragment));
+      for (int sp = 1; sp <= numSplitPoints; sp++) {
+        breakdowns.add(splitPointCodeBreakdown(sp));
       }
     }
     return breakdowns.toArray(EMPTY_SIZE_BREAKDOWN);
@@ -99,7 +99,7 @@
   }
 
   /**
-   * Gets the initial fragment size breakdown.
+   * Gets the initial code breakdown.
    * 
    * @return initialCodeBreakdown
    */
@@ -108,7 +108,7 @@
   }
 
   /**
-   * Gets the leftovers fragment size breakdown.
+   * Gets the leftovers code breakdown.
    * 
    * @return leftoversCodeBreakdown
    */
@@ -117,12 +117,12 @@
   }
 
   /**
-   * Gets the number of fragments..
+   * Gets the number of split points.
    * 
-   * @return the number of fragments.
+   * @return numSplitPoints
    */
-  public final int getNumFragments() {
-    return fragmentDescriptors.size();
+  public final int getNumSplitPoints() {
+    return numSplitPoints;
   }
 
   /**
@@ -141,37 +141,19 @@
   /**
    * Gets the initial load sequence.
    * 
-   * @return initialFragmentLoadSequence
+   * @return splitPointInitialLoadSequence
    */
-  public final ArrayList<Integer> getInitialFragmentLoadSequence() {
-    return initialFragmentLoadSequence;
+  public final ArrayList<Integer> getSplitPointInitialLoadSequence() {
+    return splitPointInitialLoadSequence;
   }
 
   /**
-   * 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>
-   *
+   * Gets the mapping from split points to locations where they were set.
+   * 
+   * @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);
+  public final HashMap<Integer, String> getSplitPointToLocation() {
+    return splitPointToLocation;
   }
 
   /**
@@ -184,18 +166,25 @@
   }
 
   /**
-   * Gets an exclusive code breakdown for a fragment.
-   * 
-   * @param fragment the fragment id
-   * @return exlusive code breakdown for fragment
+   * Increments the split point count.
    */
-  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));
+  public final void incrementSplitPoints() {
+    numSplitPoints++;
+  }
+
+  /**
+   * Gets an exclusive code breakdown for a split point.
+   * 
+   * @param sp split point
+   * @return exlusive code breakdown for sp
+   */
+  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));
     }
-    return exclusiveCodeBreakdowns.get(fragment);
+    return exclusiveCodeBreakdowns.get(sp);
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
index 4809e79..f3a70ef 100644
--- a/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
+++ b/dev/core/src/com/google/gwt/soyc/MakeTopLevelHtmlForPerm.java
@@ -20,7 +20,6 @@
 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;
@@ -261,16 +260,9 @@
 
       // array of split point descriptions
       outFile.println("  var spl = [");
-      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, ",")
-            + "',");
+      for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
+        outFile.println("        '"
+            + globalInformation.getSplitPointToLocation().get(sp) + "',");
       }
       outFile.println("  ];");
       
@@ -372,7 +364,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.getNumFragments() + "; sp++) {");
+          + globalInformation.getNumSplitPoints() + "; 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] + \")"
@@ -627,14 +619,7 @@
     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);
   }
 
@@ -1280,39 +1265,34 @@
     percentFormatter.setMinimumFractionDigits(1);
     percentFormatter.setMaximumFractionDigits(1);
 
-    if (globalInformation.getNumFragments() >= 1) {
+    if (globalInformation.getSplitPointToLocation().size() >= 1) {
 
-      int numFragments = globalInformation.getNumFragments();
+      int numSplitPoints = globalInformation.getSplitPointToLocation().size();
       int maxSize = globalInformation.getTotalCodeBreakdown().sizeAllCode;
 
-      for (int fragment = FRAGMENT_NUMBER_TOTAL_PROGRAM; fragment <= numFragments + 1; fragment++) {
+      for (int i = FRAGMENT_NUMBER_TOTAL_PROGRAM; i <= numSplitPoints + 1; i++) {
         SizeBreakdown breakdown;
-        if (fragment == FRAGMENT_NUMBER_TOTAL_PROGRAM
-            || fragment == numFragments + 1 // leftovers
-            || fragment == FRAGMENT_NUMBER_INITIAL_DOWNLOAD) {
+        if (i == FRAGMENT_NUMBER_TOTAL_PROGRAM) {
           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());
-        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>");
+        String splitPointDescription = globalInformation.getSplitPointToLocation().get(
+            i);
 
         int size = breakdown.sizeAllCode;
         float perc = (float) size / (float) maxSize;
 
         outFile.println("<tr>");
-        outFile.println("<td>" + fragment + "</td>");
-        outFile.print("<td><a href=\"" + drillDownFileName + "\">" + fragmentDescription
-            + "</a></td>");
+        outFile.println("<td>" + i + "</td>");
+        outFile.println("<td><a href=\"" + drillDownFileName + "\">"
+            + splitPointDescription + "</a></td>");
         outFile.println("<td class=\"soyc-bargraph-col\">");
         outFile.println("<div class=\"soyc-bar-graph goog-inline-block\">");
         // CHECKSTYLE_OFF
@@ -1432,7 +1412,7 @@
    * @returns true of the split point is initial, false otherwise
    */
   private boolean isInitialSplitPoint(int splitPoint) {
-    return globalInformation.getInitialFragmentLoadSequence().contains(
+    return globalInformation.getSplitPointInitialLoadSequence().contains(
         splitPoint);
   }
 
@@ -1844,8 +1824,8 @@
    */
   private Iterable<Integer> splitPointsWithClass(String className) {
     List<Integer> sps = new ArrayList<Integer>();
-    for (int sp = 1; sp <= globalInformation.getNumFragments(); sp++) {
-      Map<String, Integer> classToSize = globalInformation.fragmentCodeBreakdown(sp).classToSize;
+    for (int sp = 1; sp <= globalInformation.getNumSplitPoints(); sp++) {
+      Map<String, Integer> classToSize = globalInformation.splitPointCodeBreakdown(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 03d01c4..e2b3409 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.getNumFragments() > 0) {
+    if (globalInformation.getNumSplitPoints() > 0) {
       makeTopLevelHtmlForPerm.makeSplitStatusPages();
       makeTopLevelHtmlForPerm.makeLeftoverStatusPages();
     }
@@ -395,11 +395,11 @@
     if (fragment == 0) {
       breakdowns.add(globalInformation.getInitialCodeBreakdown());
     }
-    if (fragment == (globalInformation.getNumFragments() + 1)) {
+    if (fragment == (globalInformation.getNumSplitPoints() + 1)) {
       breakdowns.add(globalInformation.getLeftoversBreakdown());
     }
-    if (fragment >= 1 && fragment <= globalInformation.getNumFragments()) {
-      breakdowns.add(globalInformation.fragmentCodeBreakdown(fragment));
+    if (fragment >= 1 && fragment <= globalInformation.getNumSplitPoints()) {
+      breakdowns.add(globalInformation.splitPointCodeBreakdown(fragment));
     }
     return breakdowns;
   }
@@ -411,7 +411,7 @@
     }
 
     if (breakdown == globalInformation.getTotalCodeBreakdown()) {
-      if (globalInformation.getNumFragments() > 0) {
+      if (globalInformation.getNumSplitPoints() > 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.getNumFragments() > 0;
+      assert globalInformation.getNumSplitPoints() > 0;
       return makeTopLevelHtmlForPerm.new DependencyLinkerForLeftoversFragment();
     } else {
       return new NullDependencyLinker();
@@ -607,17 +607,13 @@
           inInitialLoadSequence = true;
         } else if (inInitialLoadSequence
             && strippedName.compareTo("splitpointref") == 0) {
-          globalInformation.getInitialFragmentLoadSequence().add(
+          globalInformation.getSplitPointInitialLoadSequence().add(
               parseSplitPointReference(attributes));
         }
       }
 
-      /**
-       * 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)
+      /*
+       * parses the split points
        */
       private void parseSplitPoint(final Attributes attributes) {
         if (attributes.getValue("id") != null) {
@@ -628,8 +624,9 @@
             curSplitPointLocation = curSplitPointLocation.replaceAll("\\(L.*",
                 "");
 
-            globalInformation.addFragmentDescriptor(
+            globalInformation.getSplitPointToLocation().put(
                 Integer.parseInt(curSplitPoint), curSplitPointLocation);
+            globalInformation.incrementSplitPoints();
           }
         }
       }
diff --git a/dev/core/src/org/apache/COPYING b/dev/core/src/org/apache/COPYING
new file mode 100644
index 0000000..d9a10c0
--- /dev/null
+++ b/dev/core/src/org/apache/COPYING
@@ -0,0 +1,176 @@
+                                 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
new file mode 100644
index 0000000..f941fad
--- /dev/null
+++ b/dev/core/src/org/apache/catalina/loader/WebappClassLoader.java
@@ -0,0 +1,2169 @@
+/*
+ * 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 93c0bb7..291dc81 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 {
+public class UtilSuite extends TestSuite {
   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
new file mode 100644
index 0000000..8955714
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/GWTCompilerTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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
new file mode 100644
index 0000000..557189e
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/GWTShellTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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 8a988ca..0f428e2 100644
--- a/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
+++ b/dev/core/test/com/google/gwt/dev/javac/GeneratedClassnameFinderTest.java
@@ -89,10 +89,6 @@
         + "$MainClass$NestedClass").getClassNames().size());
   }
 
-  public void testAbstractNative() {
-    assertEquals(2, new AbstractNativeTester().getGeneratedClasses().size());
-  }
-
   public void testAnonymous() {
     assertEquals(1, new AnonymousTester().getGeneratedClasses().size());
   }
@@ -128,28 +124,6 @@
     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/TypeOracleMediatorTestBase.java b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
index 759bf3d..86c5580 100644
--- a/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
+++ b/dev/core/test/com/google/gwt/dev/javac/TypeOracleMediatorTestBase.java
@@ -64,10 +64,12 @@
 import com.google.gwt.dev.util.Util;
 import com.google.gwt.dev.util.log.AbstractTreeLogger;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
-import com.google.gwt.thirdparty.guava.common.collect.MapMaker;
 
 import junit.framework.TestCase;
 
+import org.apache.commons.collections.map.AbstractReferenceMap;
+import org.apache.commons.collections.map.ReferenceMap;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -858,13 +860,15 @@
    * parameterizedTypes, arrayTypes, and wildCardTypes in TypeOracle. Note: this
    * test is manual because gc can be unreliable.
    */
+  @SuppressWarnings("unchecked")
   public void manualTestAbstractRefrenceMap() {
 
     /*
      * with a HARD -> WEAK map, verify that the entry remains if there is no
      * reference to key, but is deleted when the reference to value is gone
      */
-    Map<Integer, Integer> simpleMap = new MapMaker().weakValues().makeMap();
+    Map<Integer, Integer> simpleMap =
+        new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.WEAK, true);
     Integer bar = new Integer(42);
     simpleMap.put(new Integer(32), bar);
     Runtime.getRuntime().gc();
@@ -877,8 +881,9 @@
      * with a WEAK -> WEAK map, verify that the entry is gone if there are no
      * references to either the key or the value.
      */
-    simpleMap = new MapMaker().weakKeys().weakValues().makeMap();
-    Map<Integer, Integer> reverseMap = new MapMaker().weakKeys().weakValues().makeMap();
+    simpleMap = new ReferenceMap(AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK, true);
+    Map<Integer, Integer> reverseMap =
+        new ReferenceMap(AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK, true);
     Integer foo = new Integer(32);
     bar = new Integer(42);
     simpleMap.put(foo, bar);
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 cdd2f1b..96b730a 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 {
+public class TypeOracleSuite extends TestSuite {
   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 878780a..0913202 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,8 +37,6 @@
     addSnippetClassDecl("static volatile double d;");
     addSnippetClassDecl("static volatile String s;");
     addSnippetClassDecl("static volatile Object o;");
-
-    runMethodInliner = false;
   }
 
   public void testConditionalOptimizations() throws Exception {
@@ -101,27 +99,6 @@
         "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 {", 
@@ -137,32 +114,8 @@
         "} 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;");
@@ -192,42 +145,10 @@
     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) {
-
-    if (runMethodInliner) {
-      MethodInliner.exec(program);
-    }
-
+    // This is necessary for String calls optimizations
+    MethodCallTightener.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 0d47a3f..98a4d13 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,24 +16,10 @@
 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;
 
@@ -108,155 +94,11 @@
     }
   }
 
-  /**
-   * 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 85e3530..9ee6e0d 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,8 +350,9 @@
    * despite there being side-effects of the multi-expression.  So, we want to test that inlining
    * proceeds, but not further constant transformation.
    * 
-   * TODO(rluble): This test may need to evolve over time, as the specifics of the
-   * optimizers change.
+   * 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).
    */
   public void testInlinedConstantExpressionWithSideEffects() throws Exception {
     
@@ -373,9 +374,10 @@
               "  fail();",
               "}",
               "return x;")
-        .into("Integer n = new Integer(1);",
-               "x = n;",
-               "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();");
     
   }
   
@@ -385,21 +387,14 @@
   @Override
   protected boolean optimizeMethod(JProgram program, JMethod method) {
     boolean didChange = false;
-    boolean optimizeChange = false;
 
-    // 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 (runDCE) {
+      didChange = DeadCodeElimination.exec(program).didChange() || didChange;
+    }
 
-      if (runMethodInliner) {
-        optimizeChange = MethodInliner.exec(program).didChange() || optimizeChange;
-      }
-      didChange = didChange || optimizeChange;
-    } while (optimizeChange);
+    if (runMethodInliner) {
+      didChange = MethodInliner.exec(program).didChange() || didChange;
+    }
 
     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 a3591db..2071e3d 100644
--- a/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
+++ b/dev/core/test/org/apache/commons/collections/collection/AbstractTestCollection.java
@@ -16,8 +16,6 @@
  */
 package org.apache.commons.collections.collection;
 
-import org.apache.commons.collections.AbstractTestObject;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
@@ -36,6 +34,8 @@
 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,7 +121,6 @@
  * @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 a9ce434..d2e6870 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,7 +35,6 @@
  * @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 b5e7e01..5bd5191 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,7 +37,6 @@
  * 
  * @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 a9d1250..46b0436 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,7 +32,6 @@
  * 
  * @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 3d4668f..433a665 100644
--- a/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/AbstractTestMap.java
@@ -16,11 +16,6 @@
  */
 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;
@@ -30,6 +25,11 @@
 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,7 +119,6 @@
  * @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 532ac95..13e042a 100644
--- a/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
+++ b/dev/core/test/org/apache/commons/collections/map/TestIdentityMap.java
@@ -16,6 +16,11 @@
  */
 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;
@@ -23,11 +28,6 @@
 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,7 +35,6 @@
  * 
  * @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 dc3a3d4..398fa78 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,7 +43,6 @@
  * 
  * @author Paul Jack
  */
-@SuppressWarnings({"unchecked", "rawtypes"})
 public abstract class AbstractTestSet extends AbstractTestCollection {
 
     /**
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..1366e70
--- /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..2895078
--- /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..f998847
--- /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/build_tools/ant_gwt/.project b/eclipse/build_tools/ant_gwt/.project
deleted file mode 100644
index 5e11ce7..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 be5e338..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 249e503..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/dev/.classpath b/eclipse/dev/.classpath
index 4b1f5b4..fa17a0d 100644
--- a/eclipse/dev/.classpath
+++ b/eclipse/dev/.classpath
@@ -12,16 +12,35 @@
 	<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 a360353..60d2da3 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/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="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="output" path="bin"/>
 </classpath>
diff --git a/eclipse/settings/code-style/gwt-checkstyle-tests.xml b/eclipse/settings/code-style/gwt-checkstyle-tests.xml
index bbd1205..d27c8e2 100644
--- a/eclipse/settings/code-style/gwt-checkstyle-tests.xml
+++ b/eclipse/settings/code-style/gwt-checkstyle-tests.xml
@@ -87,10 +87,10 @@
             <property name="logLoadErrors" value="true"/>
             <property name="tokens" value="METHOD_DEF"/>
         </module>
-        <module name="RegexpHeader">
+        <module name="com.google.gwt.checkstyle.GwtHeaderCheck">
            <property name="severity" value="error"/>
-           <property name="header" value="^/\*[ ]*$\n^ \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.$\n^ \*[ ]*$\n^ \* Licensed under the Apache License, Version 2\.0 \(the &quot;License&quot;\); you may not( use this file except)?$\n^ \* (use this file except )?in compliance with the License\. You may obtain a copy of( the License at)?$\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( distributed under the License)?$\n^ \* (distributed under the License )?is distributed on an &quot;AS IS&quot; BASIS, WITHOUT( WARRANTIES OR CONDITIONS OF ANY KIND, either express)?$\n^ \* (WARRANTIES OR CONDITIONS OF ANY KIND, either express )?or implied\. See the( License for the specific language governing permissions and limitations under)?$\n^ \* License for the specific language governing permissions and limitations under$\n^ \* the License\.$\n^ \*/$"/>
-           <property name="multiLines" value="6,13"/>
+           <property name="header" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the &quot;License&quot;\); 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 &quot;AS IS&quot; 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 \*/"/>
+           <property name="headerAlt" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the &quot;License&quot;\); you may not use this file except\n \* in compliance with the License\. You may obtain a copy of 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 distributed under the License\n \* is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n \* or implied\. See the License for the specific language governing permissions and limitations under\n \* the License\.\n \*/"/>
        </module>
         <module name="ImportOrder">
             <property name="severity" value="error"/>
@@ -153,6 +153,14 @@
         <module name="AvoidStarImport">
             <property name="severity" value="error"/>
         </module>
+        <module name="com.google.gwt.checkstyle.OrderCheck">
+            <metadata name="com.atlassw.tools.eclipse.checkstyle.lastEnabledSeverity" value="error"/>
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="com.google.gwt.checkstyle.FieldCheck">
+            <metadata name="com.atlassw.tools.eclipse.checkstyle.lastEnabledSeverity" value="error"/>
+            <property name="severity" value="ignore"/>
+        </module>
         <module name="GenericIllegalRegexp">
             <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="bad // comment"/>
             <property name="severity" value="error"/>
@@ -173,10 +181,9 @@
             <property name="format" value="^[a-z_][a-zA-Z0-9_]*$"/>
         </module>
         <module name="MemberName">
-            <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s."/>
             <metadata name="com.atlassw.tools.eclipse.checkstyle.lastEnabledSeverity" value="error"/>
             <property name="severity" value="ignore"/>
-            <property name="format" value="^([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*$"/>
+            <property name="format" value="[a-z]|[a-z][a-z_0-9][A-Za-z0-9_]*|[a-z](?&lt;!f)[A-Z0-9]*"/>
         </module>
         <module name="TodoComment">
             <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Author tags"/>
diff --git a/eclipse/settings/code-style/gwt-checkstyle.xml b/eclipse/settings/code-style/gwt-checkstyle.xml
index 0206954..c3c30d3 100644
--- a/eclipse/settings/code-style/gwt-checkstyle.xml
+++ b/eclipse/settings/code-style/gwt-checkstyle.xml
@@ -80,10 +80,10 @@
             <property name="logLoadErrors" value="true"/>
             <property name="tokens" value="METHOD_DEF"/>
         </module>
-        <module name="RegexpHeader">
+        <module name="com.google.gwt.checkstyle.GwtHeaderCheck">
            <property name="severity" value="error"/>
-           <property name="header" value="^/\*[ ]*$\n^ \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.$\n^ \*[ ]*$\n^ \* Licensed under the Apache License, Version 2\.0 \(the &quot;License&quot;\); you may not( use this file except)?$\n^ \* (use this file except )?in compliance with the License\. You may obtain a copy of( the License at)?$\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( distributed under the License)?$\n^ \* (distributed under the License )?is distributed on an &quot;AS IS&quot; BASIS, WITHOUT( WARRANTIES OR CONDITIONS OF ANY KIND, either express)?$\n^ \* (WARRANTIES OR CONDITIONS OF ANY KIND, either express )?or implied\. See the( License for the specific language governing permissions and limitations under)?$\n^ \* License for the specific language governing permissions and limitations under$\n^ \* the License\.$\n^ \*/$"/>
-           <property name="multiLines" value="6,13"/>
+           <property name="header" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the &quot;License&quot;\); 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 &quot;AS IS&quot; 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 \*/"/>
+           <property name="headerAlt" value="/\*\n \* Copyright 20(0[6789]|[12][0-9]) Google Inc\.\n \*[ ]*\n \* Licensed under the Apache License, Version 2\.0 \(the &quot;License&quot;\); you may not use this file except\n \* in compliance with the License\. You may obtain a copy of 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 distributed under the License\n \* is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n \* or implied\. See the License for the specific language governing permissions and limitations under\n \* the License\.\n \*/"/>
        </module>
         <module name="ImportOrder">
             <property name="severity" value="error"/>
@@ -141,6 +141,12 @@
         <module name="AvoidStarImport">
             <property name="severity" value="error"/>
         </module>
+        <module name="com.google.gwt.checkstyle.OrderCheck">
+            <property name="severity" value="error"/>
+        </module>
+        <module name="com.google.gwt.checkstyle.FieldCheck">
+            <property name="severity" value="error"/>
+        </module>
         <module name="GenericIllegalRegexp">
             <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="bad // comment"/>
             <property name="severity" value="error"/>
@@ -157,9 +163,8 @@
             <property name="severity" value="error"/>
         </module>
         <module name="MemberName">
-            <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Field names must start with [a-z], may not start with f[A-Z], and should not contain '_''s."/>
             <property name="severity" value="error"/>
-            <property name="format" value="^([a-eg-z]|(f[a-z0-9]))[a-zA-Z0-9]*$"/>
+            <property name="format" value="[a-z]|[a-z][a-z_0-9][A-Za-z0-9_]*|[a-z](?&lt;!f)[A-Z0-9]*"/>
         </module>
         <module name="TodoComment">
             <metadata name="com.atlassw.tools.eclipse.checkstyle.comment" value="Author tags"/>
diff --git a/eclipse/settings/code-style/gwt-customchecks.jar b/eclipse/settings/code-style/gwt-customchecks.jar
new file mode 100644
index 0000000..1b51aa7
--- /dev/null
+++ b/eclipse/settings/code-style/gwt-customchecks.jar
Binary files differ
diff --git a/eclipse/tools/cldr-import/.classpath b/eclipse/tools/cldr-import/.classpath
index acb1c55..14514f2 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/icu4j/50.1.1/icu4j.jar" />
-        <classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/50.1.1/utilities.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="output" path="bin"/>
 </classpath>
diff --git a/eclipse/user/.classpath b/eclipse/user/.classpath
index 42172aa..fbbbd48 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/50.1.1/icu4j.jar"/>
+	<classpathentry kind="var" path="GWT_TOOLS/lib/icu4j/4.4.2/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 2db459b..3ed35bb 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;)(string);
+    return @elemental.js.json.JsJsonValue::box(Lelemental/json/JsonValue;)(value);
   }-*/;
 
   protected JsJsonString() {
diff --git a/plugins/Makefile b/plugins/Makefile
new file mode 100644
index 0000000..28babe1
--- /dev/null
+++ b/plugins/Makefile
@@ -0,0 +1,4 @@
+# Placeholder Makefile, to be replaced with ant build file
+
+xpcom::
+	cd xpcom; make
diff --git a/plugins/MissingBrowserPlugin.html b/plugins/MissingBrowserPlugin.html
new file mode 100644
index 0000000..1ae3dba
--- /dev/null
+++ b/plugins/MissingBrowserPlugin.html
@@ -0,0 +1,11 @@
+<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
new file mode 100644
index 0000000..da7ca6f
--- /dev/null
+++ b/plugins/MissingPlugin/assets/Download.psd
Binary files differ
diff --git a/plugins/MissingPlugin/assets/download.png b/plugins/MissingPlugin/assets/download.png
new file mode 100644
index 0000000..31c080d
--- /dev/null
+++ b/plugins/MissingPlugin/assets/download.png
Binary files differ
diff --git a/plugins/MissingPlugin/build.xml b/plugins/MissingPlugin/build.xml
new file mode 100644
index 0000000..c3dcf01
--- /dev/null
+++ b/plugins/MissingPlugin/build.xml
@@ -0,0 +1,84 @@
+<!--                                                                        -->
+<!-- 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
new file mode 100644
index 0000000..7f3bf7f
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/MissingPlugin.gwt.xml
@@ -0,0 +1,18 @@
+<!--                                                                        -->
+<!-- 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
new file mode 100644
index 0000000..b992d77
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.java
@@ -0,0 +1,81 @@
+/*
+ * 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
new file mode 100644
index 0000000..59e91d0
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/AllDownloadsPane.ui.xml
@@ -0,0 +1,57 @@
+<!--                                                                        -->
+<!-- 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
new file mode 100644
index 0000000..2235d96
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.java
@@ -0,0 +1,54 @@
+/*
+ * 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
new file mode 100644
index 0000000..36e7b39
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadBox.ui.xml
@@ -0,0 +1,60 @@
+<!--                                                                        -->
+<!-- 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
new file mode 100644
index 0000000..1915735
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadEntry.java
@@ -0,0 +1,43 @@
+/*
+ * 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
new file mode 100644
index 0000000..f32238e
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/DownloadInfo.java
@@ -0,0 +1,51 @@
+/*
+ * 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
new file mode 100644
index 0000000..43fb4a7
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.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
new file mode 100644
index 0000000..d602ab1
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/InferredDownloadPane.ui.xml
@@ -0,0 +1,50 @@
+<!--                                                                        -->
+<!-- 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
new file mode 100644
index 0000000..c7433ee
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPlugin.java
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000..e094195
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.java
@@ -0,0 +1,69 @@
+/*
+ * 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
new file mode 100644
index 0000000..e8a4ecb
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/MissingPluginPane.ui.xml
@@ -0,0 +1,65 @@
+<!--                                                                        -->
+<!-- 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
new file mode 100644
index 0000000..bdfeac3
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/UnsupportedBox.ui.xml
@@ -0,0 +1,60 @@
+<!--                                                                        -->
+<!-- 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
new file mode 100644
index 0000000..da0d53e
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/download.gif
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
new file mode 100644
index 0000000..304788d
--- /dev/null
+++ b/plugins/MissingPlugin/src/com/google/gwt/missingplugin/client/unsupported.gif
Binary files differ
diff --git a/plugins/MissingPlugin/war/MissingPlugin.html b/plugins/MissingPlugin/war/MissingPlugin.html
new file mode 100644
index 0000000..eb709ae
--- /dev/null
+++ b/plugins/MissingPlugin/war/MissingPlugin.html
@@ -0,0 +1,199 @@
+<!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://dl-ssl.google.com/gwt/plugins/chrome/gwt-dev-plugin.crx",
+            "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"];
+        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
new file mode 100644
index 0000000..afac8c3
--- /dev/null
+++ b/plugins/MissingPlugin/war/WEB-INF/appengine-web.xml
@@ -0,0 +1,14 @@
+<?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
new file mode 100644
index 0000000..ccb3a6f
--- /dev/null
+++ b/plugins/MissingPlugin/war/WEB-INF/logging.properties
@@ -0,0 +1,24 @@
+# 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
new file mode 100644
index 0000000..658aca0
--- /dev/null
+++ b/plugins/MissingPlugin/war/WEB-INF/web.xml
@@ -0,0 +1,13 @@
+<?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
new file mode 100644
index 0000000..4d980fc
--- /dev/null
+++ b/plugins/Protocol.txt
@@ -0,0 +1,46 @@
+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
new file mode 100644
index 0000000..447c0fc
--- /dev/null
+++ b/plugins/README.txt
@@ -0,0 +1,22 @@
+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
new file mode 100644
index 0000000..ffe6441
--- /dev/null
+++ b/plugins/common/AllowedConnections.cpp
@@ -0,0 +1,183 @@
+/*
+ * 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
new file mode 100644
index 0000000..0856aee
--- /dev/null
+++ b/plugins/common/AllowedConnections.h
@@ -0,0 +1,125 @@
+#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
new file mode 100644
index 0000000..ac91af5
--- /dev/null
+++ b/plugins/common/BrowserChannel.h
@@ -0,0 +1,44 @@
+/*
+ * 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
new file mode 100644
index 0000000..7e6bd86
--- /dev/null
+++ b/plugins/common/ByteOrder.h
@@ -0,0 +1,141 @@
+#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
new file mode 100644
index 0000000..911cf38
--- /dev/null
+++ b/plugins/common/CheckVersionsMessage.cpp
@@ -0,0 +1,65 @@
+/*
+ * 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
new file mode 100644
index 0000000..10634ae
--- /dev/null
+++ b/plugins/common/CheckVersionsMessage.h
@@ -0,0 +1,56 @@
+#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
new file mode 100644
index 0000000..08c315f
--- /dev/null
+++ b/plugins/common/ChooseTransportMessage.cpp
@@ -0,0 +1,67 @@
+/*
+ * 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
new file mode 100644
index 0000000..512185e
--- /dev/null
+++ b/plugins/common/ChooseTransportMessage.h
@@ -0,0 +1,55 @@
+#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
new file mode 100644
index 0000000..586c1b6
--- /dev/null
+++ b/plugins/common/Debug.cpp
@@ -0,0 +1,84 @@
+/*
+ * 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
new file mode 100644
index 0000000..c44e824
--- /dev/null
+++ b/plugins/common/Debug.h
@@ -0,0 +1,214 @@
+#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
new file mode 100644
index 0000000..b6f6a27
--- /dev/null
+++ b/plugins/common/DebugLevel.h
@@ -0,0 +1,25 @@
+#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
new file mode 100644
index 0000000..0b4b2d0
--- /dev/null
+++ b/plugins/common/FatalErrorMessage.cpp
@@ -0,0 +1,50 @@
+/*
+ * 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
new file mode 100644
index 0000000..a80b9d1
--- /dev/null
+++ b/plugins/common/FatalErrorMessage.h
@@ -0,0 +1,54 @@
+#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
new file mode 100644
index 0000000..b7f0bab
--- /dev/null
+++ b/plugins/common/FreeValueMessage.cpp
@@ -0,0 +1,47 @@
+/*
+ * 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
new file mode 100644
index 0000000..3158f40
--- /dev/null
+++ b/plugins/common/FreeValueMessage.h
@@ -0,0 +1,60 @@
+#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
new file mode 100644
index 0000000..ebf634a
--- /dev/null
+++ b/plugins/common/HashMap.h
@@ -0,0 +1,58 @@
+#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
new file mode 100644
index 0000000..2cabb01
--- /dev/null
+++ b/plugins/common/HostChannel.cpp
@@ -0,0 +1,445 @@
+/*
+ * 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
new file mode 100644
index 0000000..e8a53ec
--- /dev/null
+++ b/plugins/common/HostChannel.h
@@ -0,0 +1,159 @@
+#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
new file mode 100644
index 0000000..9207f81
--- /dev/null
+++ b/plugins/common/InvokeMessage.cpp
@@ -0,0 +1,79 @@
+/*
+ * 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
new file mode 100644
index 0000000..0296d75
--- /dev/null
+++ b/plugins/common/InvokeMessage.h
@@ -0,0 +1,67 @@
+#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
new file mode 100644
index 0000000..0a9f418
--- /dev/null
+++ b/plugins/common/InvokeSpecialMessage.cpp
@@ -0,0 +1,74 @@
+/*
+ * 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
new file mode 100644
index 0000000..84c90ff
--- /dev/null
+++ b/plugins/common/InvokeSpecialMessage.h
@@ -0,0 +1,59 @@
+#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
new file mode 100644
index 0000000..db8b943
--- /dev/null
+++ b/plugins/common/LoadJsniMessage.cpp
@@ -0,0 +1,26 @@
+/*
+ * 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
new file mode 100644
index 0000000..5b1f8d9
--- /dev/null
+++ b/plugins/common/LoadJsniMessage.h
@@ -0,0 +1,43 @@
+#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
new file mode 100644
index 0000000..525383b
--- /dev/null
+++ b/plugins/common/LoadModuleMessage.cpp
@@ -0,0 +1,49 @@
+/*
+ * 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
new file mode 100644
index 0000000..4a331cb
--- /dev/null
+++ b/plugins/common/LoadModuleMessage.h
@@ -0,0 +1,62 @@
+#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
new file mode 100644
index 0000000..4003274
--- /dev/null
+++ b/plugins/common/Makefile
@@ -0,0 +1,124 @@
+# 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
new file mode 100644
index 0000000..2043187
--- /dev/null
+++ b/plugins/common/Makefile.sun
@@ -0,0 +1,115 @@
+# 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
new file mode 100644
index 0000000..a244e0b
--- /dev/null
+++ b/plugins/common/Message.h
@@ -0,0 +1,28 @@
+#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
new file mode 100644
index 0000000..bbc0334
--- /dev/null
+++ b/plugins/common/Platform.h
@@ -0,0 +1,46 @@
+#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
new file mode 100644
index 0000000..e2db3f9
--- /dev/null
+++ b/plugins/common/ProtocolVersionMessage.cpp
@@ -0,0 +1,48 @@
+/*
+ * 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
new file mode 100644
index 0000000..db6f770
--- /dev/null
+++ b/plugins/common/ProtocolVersionMessage.h
@@ -0,0 +1,54 @@
+#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
new file mode 100644
index 0000000..f8f9b80
--- /dev/null
+++ b/plugins/common/QuitMessage.h
@@ -0,0 +1,42 @@
+#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
new file mode 100644
index 0000000..159d009
--- /dev/null
+++ b/plugins/common/ReturnMessage.cpp
@@ -0,0 +1,42 @@
+/*
+ * 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
new file mode 100644
index 0000000..29141ec
--- /dev/null
+++ b/plugins/common/ReturnMessage.h
@@ -0,0 +1,50 @@
+#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
new file mode 100644
index 0000000..672b44a
--- /dev/null
+++ b/plugins/common/ServerMethods.cpp
@@ -0,0 +1,149 @@
+/*
+ * 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
new file mode 100644
index 0000000..02bf921
--- /dev/null
+++ b/plugins/common/ServerMethods.h
@@ -0,0 +1,78 @@
+#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
new file mode 100644
index 0000000..159f762
--- /dev/null
+++ b/plugins/common/SessionHandler.h
@@ -0,0 +1,111 @@
+#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
new file mode 100644
index 0000000..fd32461
--- /dev/null
+++ b/plugins/common/Socket.cpp
@@ -0,0 +1,174 @@
+/*
+ * 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
new file mode 100644
index 0000000..90298f6
--- /dev/null
+++ b/plugins/common/Socket.h
@@ -0,0 +1,170 @@
+#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
new file mode 100644
index 0000000..ccb5520
--- /dev/null
+++ b/plugins/common/SwitchTransportMessage.cpp
@@ -0,0 +1,49 @@
+/*
+ * 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
new file mode 100644
index 0000000..0dad82a
--- /dev/null
+++ b/plugins/common/SwitchTransportMessage.h
@@ -0,0 +1,53 @@
+#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
new file mode 100644
index 0000000..ab50f5e
--- /dev/null
+++ b/plugins/common/Value.h
@@ -0,0 +1,399 @@
+#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
new file mode 100644
index 0000000..d513e21
--- /dev/null
+++ b/plugins/common/scoped_ptr/README.google
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..1ae1b96
--- /dev/null
+++ b/plugins/common/scoped_ptr/scoped_ptr.h
@@ -0,0 +1,364 @@
+#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
new file mode 100644
index 0000000..add1357
--- /dev/null
+++ b/plugins/common/testing/DebugTest.cpp
@@ -0,0 +1,40 @@
+/*
+ * 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
new file mode 100755
index 0000000..e2e8ea4
--- /dev/null
+++ b/plugins/common/testing/testdebug
@@ -0,0 +1,61 @@
+#!/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
new file mode 100644
index 0000000..1e9e244
--- /dev/null
+++ b/plugins/config.mk
@@ -0,0 +1,112 @@
+# 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)
+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
new file mode 100644
index 0000000..f4f030b
--- /dev/null
+++ b/plugins/ie/README.txt
@@ -0,0 +1,17 @@
+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
new file mode 100755
index 0000000..e3841a4
--- /dev/null
+++ b/plugins/ie/build.cmd
@@ -0,0 +1,18 @@
+@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
new file mode 100644
index 0000000..b783838
--- /dev/null
+++ b/plugins/ie/installer/README.txt
@@ -0,0 +1,21 @@
+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
new file mode 100755
index 0000000..203dc90
--- /dev/null
+++ b/plugins/ie/installer/build.cmd
@@ -0,0 +1,79 @@
+@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
new file mode 100755
index 0000000..d2cf48c
--- /dev/null
+++ b/plugins/ie/installer/generate-wxsfile.cmd
@@ -0,0 +1,30 @@
+@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
new file mode 100644
index 0000000..79eb6b8
--- /dev/null
+++ b/plugins/ie/installer/gwt.ico
Binary files differ
diff --git a/plugins/ie/installer/installer.wxs.xml b/plugins/ie/installer/installer.wxs.xml
new file mode 100644
index 0000000..c7c0c7b
--- /dev/null
+++ b/plugins/ie/installer/installer.wxs.xml
@@ -0,0 +1,204 @@
+<?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
new file mode 100644
index 0000000..4059a54
--- /dev/null
+++ b/plugins/ie/installer/oophm.wxs
@@ -0,0 +1,51 @@
+<?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
new file mode 100644
index 0000000..846b7eb
--- /dev/null
+++ b/plugins/ie/installer/wix/README.txt
@@ -0,0 +1,10 @@
+
+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
new file mode 100755
index 0000000..9c3e2a8
--- /dev/null
+++ b/plugins/ie/installer/wix/WixIIsExtension.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/WixUtilExtension.dll b/plugins/ie/installer/wix/WixUtilExtension.dll
new file mode 100755
index 0000000..36eac99
--- /dev/null
+++ b/plugins/ie/installer/wix/WixUtilExtension.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/WixVSExtension.dll b/plugins/ie/installer/wix/WixVSExtension.dll
new file mode 100755
index 0000000..2fa2a1b
--- /dev/null
+++ b/plugins/ie/installer/wix/WixVSExtension.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/candle.exe b/plugins/ie/installer/wix/candle.exe
new file mode 100755
index 0000000..a5be152
--- /dev/null
+++ b/plugins/ie/installer/wix/candle.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/candle.exe.config b/plugins/ie/installer/wix/candle.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/plugins/ie/installer/wix/candle.exe.config
@@ -0,0 +1,10 @@
+<?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
new file mode 100644
index 0000000..dab4567
--- /dev/null
+++ b/plugins/ie/installer/wix/darice.cub
Binary files differ
diff --git a/plugins/ie/installer/wix/heat.exe b/plugins/ie/installer/wix/heat.exe
new file mode 100755
index 0000000..e5c9336
--- /dev/null
+++ b/plugins/ie/installer/wix/heat.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/heat.exe.config b/plugins/ie/installer/wix/heat.exe.config
new file mode 100644
index 0000000..5d5aa30
--- /dev/null
+++ b/plugins/ie/installer/wix/heat.exe.config
@@ -0,0 +1,13 @@
+<?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
new file mode 100755
index 0000000..544dd92
--- /dev/null
+++ b/plugins/ie/installer/wix/libiconv2.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/libintl3.dll b/plugins/ie/installer/wix/libintl3.dll
new file mode 100755
index 0000000..ec11e6b
--- /dev/null
+++ b/plugins/ie/installer/wix/libintl3.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/light.exe b/plugins/ie/installer/wix/light.exe
new file mode 100755
index 0000000..d36e01e
--- /dev/null
+++ b/plugins/ie/installer/wix/light.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/light.exe.config b/plugins/ie/installer/wix/light.exe.config
new file mode 100644
index 0000000..bed32a7
--- /dev/null
+++ b/plugins/ie/installer/wix/light.exe.config
@@ -0,0 +1,10 @@
+<?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
new file mode 100755
index 0000000..4720f1a
--- /dev/null
+++ b/plugins/ie/installer/wix/mspatchc.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/regex2.dll b/plugins/ie/installer/wix/regex2.dll
new file mode 100755
index 0000000..f84a847
--- /dev/null
+++ b/plugins/ie/installer/wix/regex2.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/sed.exe b/plugins/ie/installer/wix/sed.exe
new file mode 100755
index 0000000..42c2677
--- /dev/null
+++ b/plugins/ie/installer/wix/sed.exe
Binary files differ
diff --git a/plugins/ie/installer/wix/wconsole.dll b/plugins/ie/installer/wix/wconsole.dll
new file mode 100755
index 0000000..916b492
--- /dev/null
+++ b/plugins/ie/installer/wix/wconsole.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/winterop.dll b/plugins/ie/installer/wix/winterop.dll
new file mode 100755
index 0000000..0385acd
--- /dev/null
+++ b/plugins/ie/installer/wix/winterop.dll
Binary files differ
diff --git a/plugins/ie/installer/wix/wix.dll b/plugins/ie/installer/wix/wix.dll
new file mode 100755
index 0000000..5057e35
--- /dev/null
+++ b/plugins/ie/installer/wix/wix.dll
Binary files differ
diff --git a/plugins/ie/oophm/oophm.sln b/plugins/ie/oophm/oophm.sln
new file mode 100644
index 0000000..7555624
--- /dev/null
+++ b/plugins/ie/oophm/oophm.sln
@@ -0,0 +1,26 @@
+
+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
new file mode 100644
index 0000000..17c0b9d
--- /dev/null
+++ b/plugins/ie/oophm/oophm/Constants.h
@@ -0,0 +1,22 @@
+#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
new file mode 100644
index 0000000..44d9ff9
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ExceptionCatcher.cpp
@@ -0,0 +1,54 @@
+/*
+ * 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
new file mode 100644
index 0000000..c1a091c
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ExceptionCatcher.h
@@ -0,0 +1,80 @@
+/*
+ * 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
new file mode 100644
index 0000000..ba8960b
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ExceptionCatcher.rgs
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..6e2a653
--- /dev/null
+++ b/plugins/ie/oophm/oophm/IESessionHandler.cpp
@@ -0,0 +1,469 @@
+/*
+ * 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
new file mode 100644
index 0000000..2675810
--- /dev/null
+++ b/plugins/ie/oophm/oophm/IESessionHandler.h
@@ -0,0 +1,78 @@
+/*
+ * 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
new file mode 100644
index 0000000..8c5dd28
--- /dev/null
+++ b/plugins/ie/oophm/oophm/IEUtils.h
@@ -0,0 +1,178 @@
+/*
+* 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
new file mode 100644
index 0000000..fdf87ce
--- /dev/null
+++ b/plugins/ie/oophm/oophm/JavaObject.cpp
@@ -0,0 +1,266 @@
+/*
+ * 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
new file mode 100644
index 0000000..cf56fa2
--- /dev/null
+++ b/plugins/ie/oophm/oophm/JavaObject.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..f84f142
--- /dev/null
+++ b/plugins/ie/oophm/oophm/JavaObject.rgs
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..2e7a437
--- /dev/null
+++ b/plugins/ie/oophm/oophm/ReadMe.txt
@@ -0,0 +1,56 @@
+========================================================================
+    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
new file mode 100644
index 0000000..ac8fe67
--- /dev/null
+++ b/plugins/ie/oophm/oophm/SessionData.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..7b86f60
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dlldata.c
@@ -0,0 +1,38 @@
+/*********************************************************
+   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
new file mode 100644
index 0000000..8979369
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dlldatax.c
@@ -0,0 +1,34 @@
+/*
+ * 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
new file mode 100644
index 0000000..4ce5f66
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dlldatax.h
@@ -0,0 +1,31 @@
+/*
+ * 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
new file mode 100644
index 0000000..eaa3ed9
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dllmain.cpp
@@ -0,0 +1,39 @@
+/*
+ * 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
new file mode 100644
index 0000000..6965209
--- /dev/null
+++ b/plugins/ie/oophm/oophm/dllmain.h
@@ -0,0 +1,26 @@
+/*
+ * 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
new file mode 100644
index 0000000..27a7cf6
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.aps
Binary files differ
diff --git a/plugins/ie/oophm/oophm/oophm.cpp b/plugins/ie/oophm/oophm/oophm.cpp
new file mode 100644
index 0000000..b94b12e
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.cpp
@@ -0,0 +1,112 @@
+/*
+ * 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
new file mode 100644
index 0000000..bbb6f99
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.def
@@ -0,0 +1,24 @@
+; 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
new file mode 100644
index 0000000..662618b
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.idl
@@ -0,0 +1,124 @@
+/*
+ * 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
new file mode 100644
index 0000000..3665d98
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.rc
@@ -0,0 +1,174 @@
+// 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
new file mode 100644
index 0000000..b106174
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.rgs
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 0000000..9014169
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.vcproj
@@ -0,0 +1,860 @@
+<?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
new file mode 100644
index 0000000..f073a5d
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.vcxproj
@@ -0,0 +1,397 @@
+<?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
new file mode 100644
index 0000000..eba06fa
--- /dev/null
+++ b/plugins/ie/oophm/oophm/oophm.vcxproj.filters
@@ -0,0 +1,262 @@
+<?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
new file mode 100644
index 0000000..1229764
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.bmp
Binary files differ
diff --git a/plugins/ie/oophm/oophm/plugin.cpp b/plugins/ie/oophm/oophm/plugin.cpp
new file mode 100644
index 0000000..9bc4184
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.cpp
@@ -0,0 +1,140 @@
+/*
+ * 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
new file mode 100644
index 0000000..d508558
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.h
@@ -0,0 +1,227 @@
+/*
+* 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
new file mode 100644
index 0000000..1dac491
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.htm
@@ -0,0 +1,82 @@
+<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
new file mode 100644
index 0000000..e6f868e
--- /dev/null
+++ b/plugins/ie/oophm/oophm/plugin.rgs
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 0000000..7a017d7
--- /dev/null
+++ b/plugins/ie/oophm/oophm/pluginUI.htm
@@ -0,0 +1,11 @@
+<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
new file mode 100644
index 0000000..e0ef5a4
--- /dev/null
+++ b/plugins/ie/oophm/oophm/resource.h
@@ -0,0 +1,24 @@
+//{{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
new file mode 100644
index 0000000..39ac1a3
--- /dev/null
+++ b/plugins/ie/oophm/oophm/stdafx.cpp
@@ -0,0 +1,21 @@
+/*
+ * 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
new file mode 100644
index 0000000..b60571c
--- /dev/null
+++ b/plugins/ie/oophm/oophm/stdafx.h
@@ -0,0 +1,46 @@
+/*
+ * 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
new file mode 100644
index 0000000..e33be6a
--- /dev/null
+++ b/plugins/ie/oophm/oophm/targetver.h
@@ -0,0 +1,41 @@
+/*
+ * 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
new file mode 100755
index 0000000..38973b2
--- /dev/null
+++ b/plugins/ie/prebuilt/Win32/oophm.dll
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi b/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi
new file mode 100755
index 0000000..205ee1f
--- /dev/null
+++ b/plugins/ie/prebuilt/gwt-dev-plugin-x64.msi
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi b/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi
new file mode 100755
index 0000000..3496298
--- /dev/null
+++ b/plugins/ie/prebuilt/gwt-dev-plugin-x86.msi
Binary files differ
diff --git a/plugins/ie/prebuilt/gwt-dev-plugin.msi b/plugins/ie/prebuilt/gwt-dev-plugin.msi
new file mode 100644
index 0000000..b7e928a
--- /dev/null
+++ b/plugins/ie/prebuilt/gwt-dev-plugin.msi
Binary files differ
diff --git a/plugins/ie/prebuilt/x64/oophm.dll b/plugins/ie/prebuilt/x64/oophm.dll
new file mode 100755
index 0000000..2b7d6bb
--- /dev/null
+++ b/plugins/ie/prebuilt/x64/oophm.dll
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/build.xml b/plugins/npapi/DevModeOptions/build.xml
new file mode 100644
index 0000000..da11701
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/build.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="DevModeOptions" default="prebuilt" basedir=".">
+  <!-- Arguments to gwtc and devmode targets -->
+  <property name="gwt.args" value="" />
+
+  <!-- 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="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 (production mode)">
+    <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"/>
+      <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="src"/>
+        <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/src/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml
new file mode 100644
index 0000000..a53534f
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/DevModeOptions.gwt.xml
@@ -0,0 +1,16 @@
+<?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'/>
+
+  <!-- TARGETING WEBKIT ONLY -->
+  <set-property name='user.agent' value='safari' />
+  <add-linker name="xsiframe" />
+
+  <!-- Specify the paths for translatable code                    -->
+  <source path='client'/>
+</module>
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.java
new file mode 100644
index 0000000..681a173
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.java
@@ -0,0 +1,236 @@
+/*
+ * 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/src/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml
new file mode 100644
index 0000000..1833223
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptions.ui.xml
@@ -0,0 +1,75 @@
+<!-- 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/src/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java
new file mode 100644
index 0000000..3f17ced
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/DevModeOptionsResources.java
@@ -0,0 +1,70 @@
+/*
+ * 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/src/com/google/gwt/devmodeoptions/client/HostEntry.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntry.java
new file mode 100644
index 0000000..672a783
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntry.java
@@ -0,0 +1,51 @@
+/*
+ * 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/src/com/google/gwt/devmodeoptions/client/HostEntryStorage.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntryStorage.java
new file mode 100644
index 0000000..6a7ddc0
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/HostEntryStorage.java
@@ -0,0 +1,52 @@
+/*
+ * 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/src/com/google/gwt/devmodeoptions/client/LocalStorage.java b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/LocalStorage.java
new file mode 100644
index 0000000..9e6a6c2
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/LocalStorage.java
@@ -0,0 +1,62 @@
+/*
+ * 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/src/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css
new file mode 100644
index 0000000..51d8605
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/DevModeOptions.css
@@ -0,0 +1,72 @@
+/*
+ * 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/src/com/google/gwt/devmodeoptions/client/resources/gwt128.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt128.png
new file mode 100644
index 0000000..57e8e01
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt128.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt16.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt16.png
new file mode 100644
index 0000000..f26096e
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt16.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt32.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt32.png
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt32.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt48.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt48.png
new file mode 100644
index 0000000..e8a4172
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt48.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt64.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt64.png
new file mode 100644
index 0000000..922cc88
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/gwt64.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/warning.png b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/warning.png
new file mode 100644
index 0000000..55a203b
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/src/com/google/gwt/devmodeoptions/client/resources/warning.png
Binary files differ
diff --git a/plugins/npapi/DevModeOptions/war/DevModeOptions.html b/plugins/npapi/DevModeOptions/war/DevModeOptions.html
new file mode 100644
index 0000000..d2132e8
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/DevModeOptions.html
@@ -0,0 +1,12 @@
+<!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
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/WEB-INF/classes/marker
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker b/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/WEB-INF/lib/marker
diff --git a/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml b/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml
new file mode 100644
index 0000000..bd4f348
--- /dev/null
+++ b/plugins/npapi/DevModeOptions/war/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+<?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
new file mode 100644
index 0000000..adbdbc8
--- /dev/null
+++ b/plugins/npapi/JavaObject.cpp
@@ -0,0 +1,182 @@
+/*
+ * 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
new file mode 100644
index 0000000..c5dc310
--- /dev/null
+++ b/plugins/npapi/JavaObject.h
@@ -0,0 +1,67 @@
+#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
new file mode 100644
index 0000000..a450381
--- /dev/null
+++ b/plugins/npapi/LocalObjectTable.cpp
@@ -0,0 +1,8 @@
+#include "mozincludes.h"
+#include "LocalObjectTable.h"
+
+LocalObjectTable::~LocalObjectTable() {
+  if (!dontFree) {
+    freeAll();
+  }
+}
diff --git a/plugins/npapi/LocalObjectTable.h b/plugins/npapi/LocalObjectTable.h
new file mode 100644
index 0000000..57a5887
--- /dev/null
+++ b/plugins/npapi/LocalObjectTable.h
@@ -0,0 +1,183 @@
+#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
new file mode 100644
index 0000000..43ffd22
--- /dev/null
+++ b/plugins/npapi/Makefile
@@ -0,0 +1,202 @@
+# 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.
+
+include ../config.mk
+
+ifeq ($(OS),mac)
+RUN_PATH_FLAG = -executable_path
+DLL_SUFFIX = .dylib
+DLLFLAGS = -bundle $(ARCHCFLAGS) -mmacosx-version-min=10.5
+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
+PLATFORM_DIR      = $(EXTENSION_OUTDIR)/$(TARGET_PLATFORM)
+PLATFORM_DIR_SUFFIX ?= ""
+
+INSTALLER_CRX     = prebuilt/gwt-dev-plugin.crx
+DLL               = $(OBJ_OUTDIR)/libGwtDevPlugin$(DLL_SUFFIX)
+GWTDEV_CRX_PEM   ?= $(CURDIR)/gwt-dev-plugin.pem
+CHROME_COMMAND    = $(CHROME_PATH) --pack-extension=$(CURDIR)/$(EXTENSION_OUTDIR) --no-message-box --user-data-dir=$(CURDIR)/$(OBJ_OUTDIR)/user-data --pack-extension-key=$(GWTDEV_CRX_PEM)
+
+#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 crx lib common clean depend install install-platform \
+	versioned-files devmodeoptions
+
+default:: lib versioned-files devmodeoptions
+
+all:: common lib install-platform crx
+
+lib:: $(OBJ_OUTDIR) $(EXTENSION_OUTDIR) $(DLL)
+crx:: $(EXTENSION_OUTDIR) $(INSTALLER_CRX)
+
+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 $@
+
+$(INSTALLER_CRX): $(GWTDEV_CRX_PEM) $(EXTENSION_OUTDIR) versioned-files
+	$(shell $(CHROME_COMMAND))
+
+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 && $(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
new file mode 100644
index 0000000..89280fab
--- /dev/null
+++ b/plugins/npapi/NPObjectWrapper.h
@@ -0,0 +1,169 @@
+// 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
new file mode 100644
index 0000000..2ca7ea5
--- /dev/null
+++ b/plugins/npapi/NPVariantUtil.h
@@ -0,0 +1,132 @@
+#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
new file mode 100644
index 0000000..a1844c5
--- /dev/null
+++ b/plugins/npapi/NPVariantWrapper.h
@@ -0,0 +1,550 @@
+#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);
+  }
+
+  Value getAsValue(ScriptableInstance& scriptInstance, bool unwrapJava = true) const {
+    return getAsValue(variant, scriptInstance, unwrapJava);
+  }
+
+  static Value getAsValue(const NPVariant& variant, ScriptableInstance& scriptInstance,
+      bool unwrapJava = true) {
+    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 Value& newval) {
+    assignFrom(plugin, variant, newval);
+    return *this;
+  }
+
+  static void assignFrom(ScriptableInstance& plugin, NPVariant& variant, const 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);
+  }
+
+  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 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
new file mode 100644
index 0000000..4abe7a4
--- /dev/null
+++ b/plugins/npapi/Plugin.cpp
@@ -0,0 +1,47 @@
+/*
+ * 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
new file mode 100644
index 0000000..b5d989a
--- /dev/null
+++ b/plugins/npapi/Plugin.h
@@ -0,0 +1,55 @@
+#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
new file mode 100644
index 0000000..ca89e98
--- /dev/null
+++ b/plugins/npapi/README.txt
@@ -0,0 +1,5 @@
+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
new file mode 100644
index 0000000..bc79d17
--- /dev/null
+++ b/plugins/npapi/ScriptableInstance.cpp
@@ -0,0 +1,793 @@
+/*
+ * 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 Value& value, NPVariant* result) {
+  Debug::log(Debug::Debugging) << "makeResult(" << isException << ", " << value << ")"
+      << Debug::flush;
+  Value temp;
+  if (value.getType() == 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;
+  }
+}
+
+Value ScriptableInstance::clientMethod_getProperty(HostChannel& channel, int numArgs, const 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 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 Value();
+  }
+  return npResult.getAsValue(*this);
+}
+
+Value ScriptableInstance::clientMethod_setProperty(HostChannel& channel, int numArgs, const 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 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 Value();
+  }
+  return 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 Value* const args, 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 Value& thisRef,
+    const string& methodName, int numArgs, const Value* const args,
+    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;
+  }
+
+  Value javaThis;
+  javaThis.setJavaObject(objectId);
+  scoped_array<Value> vargs(new Value[numArgs]);
+  for (unsigned i = 0; i < numArgs; ++i) {
+    vargs[i] = NPVariantProxy::getAsValue(args[i], *this);
+  }
+  bool isException = false;
+  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);
+  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;
+  }
+  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);
+
+  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
new file mode 100644
index 0000000..1bea653
--- /dev/null
+++ b/plugins/npapi/ScriptableInstance.h
@@ -0,0 +1,154 @@
+#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 Value& value, NPVariant* result);
+  
+  // SessionHandler methods
+  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 dispatchId,
+      int numArgs, const Value* const args, 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);
+  Value clientMethod_getProperty(HostChannel& channel, int numArgs, const Value* const args);
+  Value clientMethod_setProperty(HostChannel& channel, int numArgs, const 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
new file mode 100644
index 0000000..67869d4
--- /dev/null
+++ b/plugins/npapi/SigningCommands.txt
@@ -0,0 +1,9 @@
+# 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
new file mode 100755
index 0000000..1705f7d
--- /dev/null
+++ b/plugins/npapi/VisualStudio/npapi-plugin.sln
@@ -0,0 +1,26 @@
+
+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.vcproj b/plugins/npapi/VisualStudio/npapi-plugin.vcproj
new file mode 100755
index 0000000..bb53d97
--- /dev/null
+++ b/plugins/npapi/VisualStudio/npapi-plugin.vcproj
@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="npapi-plugin"
+	ProjectGUID="{6BF0C2CE-CB0C-421B-A67C-1E448371D24A}"
+	RootNamespace="npapi-plugin"
+	Keyword="Win32Proj"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..&quot;;&quot;$(ProjectDir)\..\..\common&quot;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				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"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\gwt-dev-plugin\WINNT_x86-msvc\npGwtDevPlugin.dll"
+				LinkIncremental="1"
+				ModuleDefinitionFile="$(ProjectDir)\..\npGwtDevPlugin.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="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="1"
+				AdditionalIncludeDirectories="&quot;$(ProjectDir)\..&quot;;&quot;$(ProjectDir)\..\..\common&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FIREFOXPLUGIN_EXPORTS"
+				ExceptionHandling="1"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				WarnAsError="false"
+				Detect64BitPortabilityProblems="false"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="ws2_32.lib"
+				ShowProgress="2"
+				OutputFile="$(ProjectDir)\..\prebuilt\gwt-dev-plugin\WINNT_x86-msvc\npGwtDevPlugin.dll"
+				LinkIncremental="0"
+				AdditionalLibraryDirectories=""
+				ModuleDefinitionFile="..\npGwtDevPlugin.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="..\JavaObject.h"
+				>
+			</File>
+			<File
+				RelativePath="..\LocalObjectTable.h"
+				>
+			</File>
+			<File
+				RelativePath="..\mozincludes.h"
+				>
+			</File>
+			<File
+				RelativePath="..\NPObjectWrapper.h"
+				>
+			</File>
+			<File
+				RelativePath="..\NPVariantWrapper.h"
+				>
+			</File>
+			<File
+				RelativePath="..\Plugin.h"
+				>
+			</File>
+			<File
+				RelativePath="..\resource.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ScriptableInstance.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\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="npapi"
+				>
+				<File
+					RelativePath="..\npapi\npapi.h"
+					>
+				</File>
+				<File
+					RelativePath="..\npapi\nphostapi.h"
+					>
+				</File>
+				<File
+					RelativePath="..\npapi\npruntime.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="..\npGwtDevPlugin.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="..\JavaObject.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\LocalObjectTable.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\main.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\npGwtDevPlugin.def"
+				>
+			</File>
+			<File
+				RelativePath="..\npn_bindings.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\Plugin.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\ScriptableInstance.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>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/plugins/npapi/arch b/plugins/npapi/arch
new file mode 100644
index 0000000..027cd25
--- /dev/null
+++ b/plugins/npapi/arch
@@ -0,0 +1 @@
+Linux_x86-gcc3
diff --git a/plugins/npapi/computearch b/plugins/npapi/computearch
new file mode 100755
index 0000000..9d7c343
--- /dev/null
+++ b/plugins/npapi/computearch
@@ -0,0 +1,72 @@
+#!/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
new file mode 100755
index 0000000..ff62c6a
--- /dev/null
+++ b/plugins/npapi/get32bitflag
@@ -0,0 +1,19 @@
+#!/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
new file mode 100755
index 0000000..fc69c11
--- /dev/null
+++ b/plugins/npapi/getarch
@@ -0,0 +1,10 @@
+#!/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
new file mode 100755
index 0000000..c5ec58f
--- /dev/null
+++ b/plugins/npapi/getversion
@@ -0,0 +1,10 @@
+#!/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
new file mode 100644
index 0000000..e292b87
--- /dev/null
+++ b/plugins/npapi/main.cpp
@@ -0,0 +1,302 @@
+/*
+ *  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;
+
+    // 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
new file mode 100644
index 0000000..9c6a1b8
--- /dev/null
+++ b/plugins/npapi/manifest-template.json
@@ -0,0 +1,30 @@
+{
+  "name": "GWT Developer Plugin",
+  "version": "GWT_DEV_PLUGIN_VERSION",
+  "description": "A plugin to enable debugging with GWT's Development Mode",
+  "update_url": "https://dl-ssl.google.com/gwt/plugins/chrome/updates.xml",
+  "icons": {
+    "16": "gwt16.png",
+    "32": "gwt32.png",
+    "48": "gwt48.png",
+    "64": "gwt64.png",
+    "128": "gwt128.png"
+  },
+  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi6RrEy9YllRLM8bGBcIEk5ECAG2z+8ngTz7wwzRAQJpOzDp1Alq8fQFjH0+dzxok4RFLrWKHjxGqvXzWyWyTEo2nY3ScHLN/RoANMs8pl9X6TygRyO+3naqZOtLCrYHfV49JKXnYoFVbY5eBVYxHYY3BHAOKJj9onyAM4UPmMzQIDAQAB",
+  "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
new file mode 100644
index 0000000..302b2eb
--- /dev/null
+++ b/plugins/npapi/mozincludes.h
@@ -0,0 +1,63 @@
+#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
new file mode 100644
index 0000000..5a7d84b
--- /dev/null
+++ b/plugins/npapi/npGwtDevPlugin.def
@@ -0,0 +1,7 @@
+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
new file mode 100644
index 0000000..913b4ea
--- /dev/null
+++ b/plugins/npapi/npGwtDevPlugin.rc
@@ -0,0 +1,111 @@
+#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
new file mode 100644
index 0000000..dc37367
--- /dev/null
+++ b/plugins/npapi/npapi/npapi.h
@@ -0,0 +1,801 @@
+/* -*- 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
+
+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
+} 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
+} 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
new file mode 100644
index 0000000..2794dee
--- /dev/null
+++ b/plugins/npapi/npapi/nphostapi.h
@@ -0,0 +1,289 @@
+// 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
new file mode 100644
index 0000000..21b8089
--- /dev/null
+++ b/plugins/npapi/npapi/npruntime.h
@@ -0,0 +1,380 @@
+/*
+ * 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
new file mode 100644
index 0000000..b47b7af
--- /dev/null
+++ b/plugins/npapi/npn_bindings.cpp
@@ -0,0 +1,381 @@
+/* ***** 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.crx b/plugins/npapi/prebuilt/gwt-dev-plugin.crx
new file mode 100644
index 0000000..9417939
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin.crx
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
new file mode 100644
index 0000000..4df9097
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/Info.plist
@@ -0,0 +1,43 @@
+<?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
new file mode 100755
index 0000000..b089cef
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Darwin-gcc3/gwtDev.plugin/Contents/MacOS/libGwtDevPlugin.dylib
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt b/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt
new file mode 100644
index 0000000..326366d
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/LICENSE.txt
@@ -0,0 +1,13 @@
+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
new file mode 100755
index 0000000..a25d124
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86-gcc3/libGwtDevPlugin.so
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
new file mode 100755
index 0000000..c0e4546
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/Linux_x86_64-gcc3/libGwtDevPlugin.so
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
new file mode 100755
index 0000000..cbc3f58
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/WINNT_x86-msvc/npGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/background.html b/plugins/npapi/prebuilt/gwt-dev-plugin/background.html
new file mode 100644
index 0000000..73f674d
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/background.html
@@ -0,0 +1,93 @@
+<html>
+<head>
+</head>
+
+<embed id="pluginEmbed" type="application/x-gwt-hosted-mode" width="10"
+height="10">
+</embed>
+
+
+<script>
+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);
+</script>
+</html>
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png
new file mode 100644
index 0000000..57e8e01
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt128.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png
new file mode 100644
index 0000000..f26096e
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt16.png
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
new file mode 100644
index 0000000..d02689e
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32-gray.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt32.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png
new file mode 100644
index 0000000..e8a4172
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt48.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png
new file mode 100644
index 0000000..922cc88
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/gwt64.png
Binary files differ
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json b/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json
new file mode 100644
index 0000000..a60ccf8
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/manifest.json
@@ -0,0 +1,30 @@
+{
+  "name": "GWT Developer Plugin",
+  "version": "1.0.10242",
+  "description": "A plugin to enable debugging with GWT's Development Mode",
+  "update_url": "https://dl-ssl.google.com/gwt/plugins/chrome/updates.xml",
+  "icons": {
+    "16": "gwt16.png",
+    "32": "gwt32.png",
+    "48": "gwt48.png",
+    "64": "gwt64.png",
+    "128": "gwt128.png"
+  },
+  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDi6RrEy9YllRLM8bGBcIEk5ECAG2z+8ngTz7wwzRAQJpOzDp1Alq8fQFjH0+dzxok4RFLrWKHjxGqvXzWyWyTEo2nY3ScHLN/RoANMs8pl9X6TygRyO+3naqZOtLCrYHfV49JKXnYoFVbY5eBVYxHYY3BHAOKJj9onyAM4UPmMzQIDAQAB",
+  "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
new file mode 100644
index 0000000..4094828
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/page_action.html
@@ -0,0 +1,48 @@
+<head>
+  <style>
+    body {
+      width: 20em;
+    }
+  </style>
+  <script>
+    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;
+    }
+
+    function updateConfiguration() {
+      var url = 'DevModeOptions.html?host=' + getParam('host') + '&codeserver=' + getParam('codeserver');
+      url = chrome.extension.getURL(url);
+      chrome.tabs.create({'url' : url});
+    }
+  </script>
+</head>
+<body onload='javascript:init()'>
+  <h3>GWT Developer Plugin</h3>
+  <div id='message'></div>
+  <br/>
+  <button onclick= "updateConfiguration()">Update Your Configuration</button>
+  </p>
+</body>
diff --git a/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png b/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png
new file mode 100644
index 0000000..55a203b
--- /dev/null
+++ b/plugins/npapi/prebuilt/gwt-dev-plugin/warning.png
Binary files differ
diff --git a/plugins/npapi/resource.h b/plugins/npapi/resource.h
new file mode 100644
index 0000000..bd2d338
--- /dev/null
+++ b/plugins/npapi/resource.h
@@ -0,0 +1,23 @@
+//{{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
new file mode 100644
index 0000000..e55d25e
--- /dev/null
+++ b/plugins/npapi/test.html
@@ -0,0 +1,110 @@
+<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
new file mode 100644
index 0000000..4c00d4e
--- /dev/null
+++ b/plugins/npapi/version
@@ -0,0 +1 @@
+0.0.0.20090326025214
diff --git a/plugins/platform/Win/AllowDialog.cpp b/plugins/platform/Win/AllowDialog.cpp
new file mode 100644
index 0000000..6e5672b
--- /dev/null
+++ b/plugins/platform/Win/AllowDialog.cpp
@@ -0,0 +1,54 @@
+/*
+ * 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
new file mode 100644
index 0000000..93f9438
--- /dev/null
+++ b/plugins/platform/Win/AllowDialog.h
@@ -0,0 +1,42 @@
+#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
new file mode 100644
index 0000000..7eeb381
--- /dev/null
+++ b/plugins/platform/Win/Preferences.cpp
@@ -0,0 +1,100 @@
+/*
+ * 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
new file mode 100644
index 0000000..f4fc49b
--- /dev/null
+++ b/plugins/platform/Win/Preferences.h
@@ -0,0 +1,34 @@
+#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
new file mode 100644
index 0000000..2d4747f
--- /dev/null
+++ b/plugins/webkit/Browser/AppController.h
@@ -0,0 +1,25 @@
+/*
+ * 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
new file mode 100644
index 0000000..046a507
--- /dev/null
+++ b/plugins/webkit/Browser/AppController.m
@@ -0,0 +1,59 @@
+/*
+ * 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
new file mode 100644
index 0000000..c597e30
--- /dev/null
+++ b/plugins/webkit/Browser/Browser-Info.plist
@@ -0,0 +1,26 @@
+<?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
new file mode 100644
index 0000000..18664ed
--- /dev/null
+++ b/plugins/webkit/Browser/BrowserWindow.h
@@ -0,0 +1,23 @@
+/*
+ * 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
new file mode 100644
index 0000000..c822886
--- /dev/null
+++ b/plugins/webkit/Browser/BrowserWindow.m
@@ -0,0 +1,21 @@
+/*
+ * 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
new file mode 100644
index 0000000..af71aad
--- /dev/null
+++ b/plugins/webkit/Browser/browser.nib/classes.nib
@@ -0,0 +1,56 @@
+<?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
new file mode 100644
index 0000000..6271e8e
--- /dev/null
+++ b/plugins/webkit/Browser/browser.nib/info.nib
@@ -0,0 +1,18 @@
+<?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
new file mode 100644
index 0000000..7691b0d
--- /dev/null
+++ b/plugins/webkit/Browser/browser.nib/keyedobjects.nib
Binary files differ
diff --git a/plugins/webkit/Browser/main.m b/plugins/webkit/Browser/main.m
new file mode 100644
index 0000000..f1a7cba
--- /dev/null
+++ b/plugins/webkit/Browser/main.m
@@ -0,0 +1,22 @@
+/*
+ * 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
new file mode 100644
index 0000000..a0a4a73
--- /dev/null
+++ b/plugins/webkit/Core/ObjectFunctions.cpp
@@ -0,0 +1,100 @@
+/*
+ * 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
new file mode 100644
index 0000000..176218e
--- /dev/null
+++ b/plugins/webkit/Core/ObjectFunctions.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2008 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+#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
new file mode 100644
index 0000000..9f60ddf
--- /dev/null
+++ b/plugins/webkit/Core/SessionData.h
@@ -0,0 +1,60 @@
+/*
+ * 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
new file mode 100644
index 0000000..de19f00
--- /dev/null
+++ b/plugins/webkit/Core/TrackingData.h
@@ -0,0 +1,53 @@
+/*
+ * 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
new file mode 100644
index 0000000..1a1e972
--- /dev/null
+++ b/plugins/webkit/Core/WebScriptSessionHandler.cpp
@@ -0,0 +1,727 @@
+/*
+ * 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
new file mode 100644
index 0000000..5e05385
--- /dev/null
+++ b/plugins/webkit/Core/WebScriptSessionHandler.h
@@ -0,0 +1,157 @@
+/*
+ * 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
new file mode 100644
index 0000000..92beb1a
--- /dev/null
+++ b/plugins/webkit/English.lproj/InfoPlist.strings
@@ -0,0 +1,3 @@
+/* Localized versions of Info.plist keys */
+
+NSHumanReadableCopyright = "© Google Inc, 2008";
diff --git a/plugins/webkit/Info.plist b/plugins/webkit/Info.plist
new file mode 100644
index 0000000..79fa629
--- /dev/null
+++ b/plugins/webkit/Info.plist
@@ -0,0 +1,43 @@
+<?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
new file mode 100644
index 0000000..6cc8edf
--- /dev/null
+++ b/plugins/webkit/Plugin/Debug.mm
@@ -0,0 +1,36 @@
+/*
+ * 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
new file mode 100644
index 0000000..dbf47e0
--- /dev/null
+++ b/plugins/webkit/Plugin/English.lproj/crash.html
@@ -0,0 +1,43 @@
+<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
new file mode 100644
index 0000000..57da6e3
--- /dev/null
+++ b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.h
@@ -0,0 +1,26 @@
+/*
+ * 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
new file mode 100644
index 0000000..ed0f62b
--- /dev/null
+++ b/plugins/webkit/Plugin/NSMutableString+HtmlReplacement.m
@@ -0,0 +1,27 @@
+/*
+ * 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
new file mode 100644
index 0000000..96d0ed3
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmPlugin.h
@@ -0,0 +1,58 @@
+/*
+ * 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
new file mode 100644
index 0000000..b4c3338
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmPlugin.mm
@@ -0,0 +1,108 @@
+/*
+ * 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
new file mode 100644
index 0000000..ee435d5
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmWebScriptObject.h
@@ -0,0 +1,45 @@
+/*
+ * 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
new file mode 100644
index 0000000..040b766
--- /dev/null
+++ b/plugins/webkit/Plugin/OophmWebScriptObject.mm
@@ -0,0 +1,420 @@
+/*
+ * 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
new file mode 100644
index 0000000..f46ab94
--- /dev/null
+++ b/plugins/webkit/Plugin/SlowScriptProxy.h
@@ -0,0 +1,61 @@
+/*
+ * 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
new file mode 100644
index 0000000..8798ada
--- /dev/null
+++ b/plugins/webkit/Plugin/SlowScriptProxy.m
@@ -0,0 +1,53 @@
+/*
+ * 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
new file mode 100644
index 0000000..975ea6d
--- /dev/null
+++ b/plugins/webkit/Plugin/WebFrameNonTigerHeaders.h
@@ -0,0 +1,24 @@
+/*
+ * 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
new file mode 100755
index 0000000..34fee9e
--- /dev/null
+++ b/plugins/webkit/build.xml
@@ -0,0 +1,18 @@
+<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
new file mode 100644
index 0000000..6a593df
--- /dev/null
+++ b/plugins/webkit/gwtlogo.icns
Binary files differ
diff --git a/plugins/webkit/oophm.xcodeproj/project.pbxproj b/plugins/webkit/oophm.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..7cc225d
--- /dev/null
+++ b/plugins/webkit/oophm.xcodeproj/project.pbxproj
@@ -0,0 +1,786 @@
+// !$*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
new file mode 100644
index 0000000..e7b7f01
--- /dev/null
+++ b/plugins/webkit/oophm_Prefix.pch
@@ -0,0 +1,7 @@
+//
+// 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
new file mode 100644
index 0000000..b7af14f
--- /dev/null
+++ b/plugins/webkit/oophm_bypass.plist
@@ -0,0 +1,9 @@
+<?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
new file mode 100644
index 0000000..b96c731
--- /dev/null
+++ b/plugins/webkit/prebuilt/gwt-dev-plugin.dmg
Binary files differ
diff --git a/plugins/wireshark/Makefile b/plugins/wireshark/Makefile
new file mode 100644
index 0000000..a1be1f9
--- /dev/null
+++ b/plugins/wireshark/Makefile
@@ -0,0 +1,51 @@
+#
+# 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
new file mode 100644
index 0000000..1ed9817
--- /dev/null
+++ b/plugins/wireshark/README.txt
@@ -0,0 +1,12 @@
+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
new file mode 100644
index 0000000..fc12f8c
--- /dev/null
+++ b/plugins/wireshark/packet-gwtcs.c
@@ -0,0 +1,975 @@
+/*
+ * 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
new file mode 100644
index 0000000..62cc1b5
--- /dev/null
+++ b/plugins/xpcom/ExternalWrapper.cpp
@@ -0,0 +1,417 @@
+/*
+ * 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
new file mode 100755
index 0000000..9d012e1
--- /dev/null
+++ b/plugins/xpcom/ExternalWrapper.h
@@ -0,0 +1,93 @@
+#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
new file mode 100755
index 0000000..37eb57b
--- /dev/null
+++ b/plugins/xpcom/FFSessionHandler.cpp
@@ -0,0 +1,651 @@
+/*
+ * 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::Error) << " 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
new file mode 100755
index 0000000..f7941bf
--- /dev/null
+++ b/plugins/xpcom/FFSessionHandler.h
@@ -0,0 +1,73 @@
+#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
new file mode 100644
index 0000000..1aeea54
--- /dev/null
+++ b/plugins/xpcom/IOOPHM.idl
@@ -0,0 +1,11 @@
+#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
new file mode 100644
index 0000000..4be87b7
--- /dev/null
+++ b/plugins/xpcom/IOOPHM.xpt
Binary files differ
diff --git a/plugins/xpcom/JSRunner.cpp b/plugins/xpcom/JSRunner.cpp
new file mode 100755
index 0000000..f5b3a8a
--- /dev/null
+++ b/plugins/xpcom/JSRunner.cpp
@@ -0,0 +1,142 @@
+/*
+ * 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
new file mode 100755
index 0000000..733970e
--- /dev/null
+++ b/plugins/xpcom/JSRunner.h
@@ -0,0 +1,29 @@
+#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
new file mode 100644
index 0000000..e54aa48
--- /dev/null
+++ b/plugins/xpcom/JavaObject.cpp
@@ -0,0 +1,498 @@
+/*
+ * 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) {
+  return JavaObject::getProperty(ctx, obj.value(), id.value(), vp);
+}
+#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) {
+  return setProperty(ctx, obj.value(), id.value(), strict, vp);
+}
+#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
new file mode 100755
index 0000000..c2fcf00
--- /dev/null
+++ b/plugins/xpcom/JavaObject.h
@@ -0,0 +1,79 @@
+#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
new file mode 100644
index 0000000..7d7f755
--- /dev/null
+++ b/plugins/xpcom/Makefile
@@ -0,0 +1,435 @@
+# 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])
+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
+$(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
+
+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=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
+
+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
new file mode 100644
index 0000000..7e52bb1
--- /dev/null
+++ b/plugins/xpcom/ModuleOOPHM.cpp
@@ -0,0 +1,214 @@
+/*
+ * 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
new file mode 100644
index 0000000..055200c
--- /dev/null
+++ b/plugins/xpcom/Preferences.cpp
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+#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
new file mode 100644
index 0000000..2bc0a81
--- /dev/null
+++ b/plugins/xpcom/Preferences.h
@@ -0,0 +1,55 @@
+#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
new file mode 100644
index 0000000..0ef9b49
--- /dev/null
+++ b/plugins/xpcom/README.txt
@@ -0,0 +1,28 @@
+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
new file mode 100755
index 0000000..1f85b71
--- /dev/null
+++ b/plugins/xpcom/RootedObject.h
@@ -0,0 +1,84 @@
+#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
new file mode 100755
index 0000000..3f77d42
--- /dev/null
+++ b/plugins/xpcom/SessionData.h
@@ -0,0 +1,114 @@
+#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
new file mode 100644
index 0000000..28d70ae
--- /dev/null
+++ b/plugins/xpcom/UserAgents.txt
@@ -0,0 +1,8 @@
+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
new file mode 100644
index 0000000..e4bb71e
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/FirefoxPlugins.sln
@@ -0,0 +1,48 @@
+
+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
new file mode 100755
index 0000000..c8b81e8
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff100-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..3d46823
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff110-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..340e6d4
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff120-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..4f3ac18
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff130-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..ee3d7f9
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff140-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..ebcf539
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff150-xpcom.vcproj
@@ -0,0 +1,846 @@
+<?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/ff3-xpcom.vcproj b/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj
new file mode 100755
index 0000000..582c455
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff3-xpcom.vcproj
@@ -0,0 +1,837 @@
+<?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
new file mode 100644
index 0000000..53575bb
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj
@@ -0,0 +1,269 @@
+<?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
new file mode 100644
index 0000000..94395ca
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff3-xpcom.vcxproj.filters
@@ -0,0 +1,460 @@
+<?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
new file mode 100755
index 0000000..02682dc
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff35-xpcom.vcproj
@@ -0,0 +1,837 @@
+<?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
new file mode 100644
index 0000000..eaef50d
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj
@@ -0,0 +1,275 @@
+<?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
new file mode 100644
index 0000000..ce2cab8
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff35-xpcom.vcxproj.filters
@@ -0,0 +1,478 @@
+<?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
new file mode 100644
index 0000000..f1667a1
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff36-xpcom.vcproj
@@ -0,0 +1,849 @@
+<?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
new file mode 100644
index 0000000..d00b934
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj
@@ -0,0 +1,278 @@
+<?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
new file mode 100644
index 0000000..4e8e2db
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff36-xpcom.vcxproj.filters
@@ -0,0 +1,487 @@
+<?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
new file mode 100644
index 0000000..2821a53
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff40-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100644
index 0000000..97a2154
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj
@@ -0,0 +1,277 @@
+<?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
new file mode 100644
index 0000000..3b0a31b
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff40-xpcom.vcxproj.filters
@@ -0,0 +1,484 @@
+<?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
new file mode 100644
index 0000000..6071520
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff50-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100644
index 0000000..8db2270
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj
@@ -0,0 +1,277 @@
+<?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
new file mode 100644
index 0000000..0bd143e
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff50-xpcom.vcxproj.filters
@@ -0,0 +1,484 @@
+<?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
new file mode 100755
index 0000000..fe269c3
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff60-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..d4f64e3
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff70-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..a007fbd
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff80-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100755
index 0000000..51ee65c
--- /dev/null
+++ b/plugins/xpcom/VisualStudio/ff90-xpcom.vcproj
@@ -0,0 +1,845 @@
+<?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
new file mode 100644
index 0000000..eddc15b
--- /dev/null
+++ b/plugins/xpcom/XpcomDebug.cpp
@@ -0,0 +1,89 @@
+/*
+ * 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
new file mode 100644
index 0000000..4296ad2
--- /dev/null
+++ b/plugins/xpcom/XpcomDebug.h
@@ -0,0 +1,26 @@
+#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
new file mode 100755
index 0000000..7557e49
--- /dev/null
+++ b/plugins/xpcom/getversion
@@ -0,0 +1,10 @@
+#!/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
new file mode 100644
index 0000000..66191a3
--- /dev/null
+++ b/plugins/xpcom/install-template.rdf
@@ -0,0 +1,57 @@
+<?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>15.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
new file mode 100755
index 0000000..80961cc
--- /dev/null
+++ b/plugins/xpcom/mozincludes.h
@@ -0,0 +1,30 @@
+#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
new file mode 100644
index 0000000..326366d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/LICENSE.txt
@@ -0,0 +1,13 @@
+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
new file mode 100644
index 0000000..6f54ad5
--- /dev/null
+++ b/plugins/xpcom/prebuilt/README.txt
@@ -0,0 +1,6 @@
+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
new file mode 100644
index 0000000..71cf50f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/chrome.manifest
@@ -0,0 +1,92 @@
+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.*
+
+
+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
new file mode 100644
index 0000000..683c881
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/components/IOOPHM.xpt
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/components/stub.js b/plugins/xpcom/prebuilt/extension/components/stub.js
new file mode 100644
index 0000000..8df702b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/components/stub.js
@@ -0,0 +1,115 @@
+// 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
new file mode 100644
index 0000000..202844e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/content/options.xul
@@ -0,0 +1,70 @@
+<?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
new file mode 100644
index 0000000..deb34e9
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/content/prefScript.js
@@ -0,0 +1,115 @@
+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
new file mode 100644
index 0000000..29b3f76
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/defaults/preferences/defaults.js
@@ -0,0 +1 @@
+pref("gwt-dev-plugin.accessList", "");
diff --git a/plugins/xpcom/prebuilt/extension/icon.png b/plugins/xpcom/prebuilt/extension/icon.png
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/icon.png
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
new file mode 100755
index 0000000..5d29200
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff100/libgwt_dev_ff100.dylib
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
new file mode 100755
index 0000000..2d7b35f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff110/libgwt_dev_ff110.dylib
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
new file mode 100755
index 0000000..68599c2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff120/libgwt_dev_ff120.dylib
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
new file mode 100755
index 0000000..03501fa
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff130/libgwt_dev_ff130.dylib
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
new file mode 100755
index 0000000..7d621cc
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff140/libgwt_dev_ff140.dylib
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
new file mode 100755
index 0000000..7548240
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff150/libgwt_dev_ff150.dylib
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
new file mode 100755
index 0000000..a51473a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff3/libgwt_dev_ff3.dylib
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
new file mode 100755
index 0000000..2226927
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff35/libgwt_dev_ff35.dylib
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
new file mode 100755
index 0000000..d030ed1
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff36/libgwt_dev_ff36.dylib
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
new file mode 100755
index 0000000..daeaab3
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff40/libgwt_dev_ff40.dylib
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
new file mode 100755
index 0000000..6998a72
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff50/libgwt_dev_ff50.dylib
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
new file mode 100755
index 0000000..507b1cf
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff60/libgwt_dev_ff60.dylib
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
new file mode 100755
index 0000000..5905200
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff70/libgwt_dev_ff70.dylib
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
new file mode 100755
index 0000000..52ffe0d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff80/libgwt_dev_ff80.dylib
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
new file mode 100755
index 0000000..8b6b066
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Darwin-gcc3/ff90/libgwt_dev_ff90.dylib
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
new file mode 100755
index 0000000..5cf9327
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff100/libgwt_dev_ff100.so
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
new file mode 100755
index 0000000..868bc12
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff110/libgwt_dev_ff110.so
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
new file mode 100755
index 0000000..38ca71c
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff120/libgwt_dev_ff120.so
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
new file mode 100755
index 0000000..7aca049
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff130/libgwt_dev_ff130.so
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
new file mode 100755
index 0000000..ea9ebdb
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff140/libgwt_dev_ff140.so
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
new file mode 100755
index 0000000..af04a8e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff150/libgwt_dev_ff150.so
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
new file mode 100755
index 0000000..68135ba
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3+/libgwt_dev_ff3+.so
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
new file mode 100755
index 0000000..c467d43
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff3/libgwt_dev_ff3.so
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
new file mode 100755
index 0000000..8fd8729
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff35/libgwt_dev_ff35.so
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
new file mode 100755
index 0000000..b54bcdc
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff36/libgwt_dev_ff36.so
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
new file mode 100755
index 0000000..362cf1a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff40/libgwt_dev_ff40.so
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
new file mode 100755
index 0000000..34d0f56
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff50/libgwt_dev_ff50.so
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
new file mode 100755
index 0000000..3418aa6
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff60/libgwt_dev_ff60.so
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
new file mode 100755
index 0000000..58b452f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff70/libgwt_dev_ff70.so
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
new file mode 100755
index 0000000..fa6a37f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff80/libgwt_dev_ff80.so
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
new file mode 100755
index 0000000..820b2b2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86-gcc3/ff90/libgwt_dev_ff90.so
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
new file mode 100755
index 0000000..c482702
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff100/libgwt_dev_ff100.so
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
new file mode 100755
index 0000000..c612e7a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff110/libgwt_dev_ff110.so
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
new file mode 100755
index 0000000..65df393
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff120/libgwt_dev_ff120.so
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
new file mode 100755
index 0000000..cead4df
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff130/libgwt_dev_ff130.so
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
new file mode 100755
index 0000000..48ab7ee
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff140/libgwt_dev_ff140.so
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
new file mode 100755
index 0000000..8f5a64a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff150/libgwt_dev_ff150.so
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
new file mode 100755
index 0000000..5751ab2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3+/libgwt_dev_ff3+.so
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
new file mode 100755
index 0000000..4f4471f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff3/libgwt_dev_ff3.so
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
new file mode 100755
index 0000000..29ff650
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff35/libgwt_dev_ff35.so
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
new file mode 100755
index 0000000..f36c567
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff36/libgwt_dev_ff36.so
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
new file mode 100755
index 0000000..cd8368b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff40/libgwt_dev_ff40.so
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
new file mode 100755
index 0000000..a54dc00
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff50/libgwt_dev_ff50.so
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
new file mode 100755
index 0000000..24bba4e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff60/libgwt_dev_ff60.so
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
new file mode 100755
index 0000000..ac3f55e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff70/libgwt_dev_ff70.so
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
new file mode 100755
index 0000000..3ea691d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff80/libgwt_dev_ff80.so
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
new file mode 100755
index 0000000..87d66a9
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/Linux_x86_64-gcc3/ff90/libgwt_dev_ff90.so
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
new file mode 100755
index 0000000..c174d65
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff100/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..351b046
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff110/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..d23f4f7
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff120/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..5b55c0b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff130/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..5a0ed7f
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff140/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..63684a0
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff150/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..cd065b0
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff3/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..9396adf
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff35/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..5ef91b3
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff36/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..b8b0ee5
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff40/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..7f517e2
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff50/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..3ef13fb
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff60/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..0b72e7c
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff70/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..38aaa82
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff80/xpGwtDevPlugin.dll
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
new file mode 100755
index 0000000..bcf7476
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/lib/WINNT_x86-msvc/ff90/xpGwtDevPlugin.dll
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/skin/README.txt b/plugins/xpcom/prebuilt/extension/skin/README.txt
new file mode 100644
index 0000000..7d212f0
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/skin/README.txt
@@ -0,0 +1,2 @@
+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
new file mode 100644
index 0000000..7ba8270
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/skin/icon.png
Binary files differ
diff --git a/plugins/xpcom/prebuilt/extension/skin/warning.png b/plugins/xpcom/prebuilt/extension/skin/warning.png
new file mode 100644
index 0000000..55a203b
--- /dev/null
+++ b/plugins/xpcom/prebuilt/extension/skin/warning.png
Binary files differ
diff --git a/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h b/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff100/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff110/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff120/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff130/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff140/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..e37792d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff150/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..169598e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff3+/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..169598e
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff3/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff35/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff36/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff40/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff50/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff60/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff70/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff80/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..0e7be5d
--- /dev/null
+++ b/plugins/xpcom/prebuilt/ff90/include/IOOPHM.h
@@ -0,0 +1,105 @@
+/*
+ * 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
new file mode 100644
index 0000000..d83406a
--- /dev/null
+++ b/plugins/xpcom/prebuilt/gwt-dev-plugin.xpi
Binary files differ
diff --git a/plugins/xpcom/prebuilt/update.rdf b/plugins/xpcom/prebuilt/update.rdf
new file mode 100644
index 0000000..47a3c64
--- /dev/null
+++ b/plugins/xpcom/prebuilt/update.rdf
@@ -0,0 +1,29 @@
+<?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>15.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
new file mode 100644
index 0000000..b3e5034
--- /dev/null
+++ b/plugins/xpcom/xpGwtDevPlugin.def
@@ -0,0 +1,3 @@
+LIBRARY xpGwtDevPlugin
+
+EXPORTS
diff --git a/plugins/xpcom/xpGwtDevPlugin.rc b/plugins/xpcom/xpGwtDevPlugin.rc
new file mode 100644
index 0000000..de20962
--- /dev/null
+++ b/plugins/xpcom/xpGwtDevPlugin.rc
@@ -0,0 +1,71 @@
+#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
new file mode 100644
index 0000000..fa1c708
--- /dev/null
+++ b/reference/dispatch/Dispatch.gwt.xml
@@ -0,0 +1,6 @@
+<!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
new file mode 100644
index 0000000..cac6f18
--- /dev/null
+++ b/reference/dispatch/client/Dispatch.java
@@ -0,0 +1,143 @@
+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
new file mode 100644
index 0000000..fc21bee
--- /dev/null
+++ b/reference/dispatch/client/Subject.java
@@ -0,0 +1,22 @@
+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
new file mode 100644
index 0000000..e87c244
--- /dev/null
+++ b/reference/dispatch/public/Dispatch.html
@@ -0,0 +1,10 @@
+<!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
new file mode 100644
index 0000000..53c5f9a
--- /dev/null
+++ b/reference/html-encyclopedia/FieldSet.html
@@ -0,0 +1,60 @@
+<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/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java b/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java
index fddfad0..4797b6b 100644
--- a/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java
+++ b/samples/showcase/src/com/google/gwt/sample/showcase/client/ContentWidgetView.java
@@ -56,7 +56,7 @@
   }
 
   public void setDescription(SafeHtml html) {
-    descElem.setInnerSafeHtml(html);
+    descElem.setInnerHTML(html.asString());
   }
 
   public void setExample(Widget widget) {
diff --git a/user/build.xml b/user/build.xml
index d49f25f..3290ba5 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="**/*SuiteNoBrowser.class" />
+  <property name="gwt.nongwt.testcase.includes" value="com/google/gwt/dev/jjs/GwtAstBuilderTest.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 8fd4427..bc2a47c 100644
--- a/user/src/com/google/gwt/animation/Animation.gwt.xml
+++ b/user/src/com/google/gwt/animation/Animation.gwt.xml
@@ -32,13 +32,11 @@
   <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 800d1fb..cf3530e 100644
--- a/user/src/com/google/gwt/animation/client/Animation.java
+++ b/user/src/com/google/gwt/animation/client/Animation.java
@@ -242,10 +242,8 @@
    * 
    * 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). 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()}.
+   * of values). You can override {@link #onStart()} and {@link #onComplete()}
+   * to perform setup and tear down procedures.
    * 
    * @param progress a double, normally between 0.0 and 1.0 (inclusive)
    */
diff --git a/user/src/com/google/gwt/cell/client/AbstractCell.java b/user/src/com/google/gwt/cell/client/AbstractCell.java
index 68899f9..26205ed 100644
--- a/user/src/com/google/gwt/cell/client/AbstractCell.java
+++ b/user/src/com/google/gwt/cell/client/AbstractCell.java
@@ -135,7 +135,7 @@
   public void setValue(Context context, Element parent, C value) {
     SafeHtmlBuilder sb = new SafeHtmlBuilder();
     render(context, value, sb);
-    parent.setInnerSafeHtml(sb.toSafeHtml());
+    parent.setInnerHTML(sb.toSafeHtml().asString());
   }
 
   /**
diff --git a/user/src/com/google/gwt/cell/client/ImageLoadingCell.java b/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
index 236980b..ea4a6d0 100644
--- a/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
+++ b/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
@@ -195,7 +195,8 @@
       imgWrapper.getStyle().setProperty("overflow", "auto");
     } else if (BrowserEvents.ERROR.equals(type) && eventOccurredOnImage(event, parent)) {
       // Replace the loading indicator with an error message.
-      parent.getFirstChildElement().setInnerSafeHtml(errorRenderer.render(value));
+      parent.getFirstChildElement().setInnerHTML(
+          errorRenderer.render(value).asString());
     }
   }
 
diff --git a/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml b/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
index 1c45f9d..b988b19 100644
--- a/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
+++ b/user/src/com/google/gwt/core/CrossSiteIframeLinker.gwt.xml
@@ -23,17 +23,7 @@
   <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">
@@ -41,6 +31,4 @@
       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 d07ad4a..4c08242 100644
--- a/user/src/com/google/gwt/core/client/ScriptInjector.java
+++ b/user/src/com/google/gwt/core/client/ScriptInjector.java
@@ -119,7 +119,6 @@
    */
   public static class FromUrl {
     private Callback<Void, Exception> callback;
-    private boolean removeTag = false;
     private final String scriptUrl;
     private JavaScriptObject window;
 
@@ -140,8 +139,8 @@
       assert doc != null;
       JavaScriptObject scriptElement = nativeMakeScriptElement(doc);
       assert scriptElement != null;
-      if (callback != null || removeTag) {
-        attachListeners(scriptElement, callback, removeTag);
+      if (callback != null) {
+        attachListeners(scriptElement, callback);
       }
       nativeSetSrc(scriptElement, scriptUrl);
       nativeAttachToHead(doc, scriptElement);
@@ -176,19 +175,6 @@
     }
 
     /**
-     * @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
      * 
@@ -257,27 +243,20 @@
    * @param callback callback that runs when the script is loaded and parsed.
    */
   private static native void attachListeners(JavaScriptObject scriptElement,
-      Callback<Void, Exception> callback, boolean removeTag) /*-{
+      Callback<Void, Exception> callback) /*-{
     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();
-      if (callback) {
-        callback.@com.google.gwt.core.client.Callback::onSuccess(Ljava/lang/Object;)(null);
-      }
+      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();
-      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);
-      }
+      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 f94faea..5a224dd 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 args) /*-{
+      Object arguments) /*-{
     if (@com.google.gwt.core.client.GWT::isScript()()) {
-      return jsFunction.apply(thisObj, args);
+      return jsFunction.apply(thisObj, arguments);
     } else {
-      var _ = jsFunction.apply(thisObj, args);
+      var _ = jsFunction.apply(thisObj, arguments);
       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 14d4381..fd76da9 100644
--- a/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
+++ b/user/src/com/google/gwt/core/client/impl/SchedulerImpl.java
@@ -149,7 +149,55 @@
     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
@@ -326,13 +374,6 @@
   }
 
   /**
-   * there for testing
-   */
-  Duration createDuration() {
-    return new Duration();
-  }
-
-  /**
    * Called by Flusher.
    */
   void flushPostEventPumpCommands() {
@@ -371,59 +412,4 @@
       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 1e88bf5..6b2b97e 100644
--- a/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
+++ b/user/src/com/google/gwt/core/client/impl/ScriptTagLoadingStrategy.java
@@ -15,8 +15,7 @@
  */
 package com.google.gwt.core.client.impl;
 
-import com.google.gwt.core.client.Callback;
-import com.google.gwt.core.client.ScriptInjector;
+import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.impl.AsyncFragmentLoader.HttpDownloadFailure;
 
 /**
@@ -24,8 +23,10 @@
  * 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 {
@@ -36,57 +37,96 @@
   protected static class ScriptTagDownloadStrategy implements DownloadStrategy {
     @Override
     public void tryDownload(final RequestData request) {
-      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();
+      int fragment = request.getFragment();
+      JavaScriptObject scriptTag = createScriptTag(request.getUrl());
+      setOnSuccess(fragment, onSuccess(fragment, scriptTag, request));
+      setOnFailure(scriptTag, onFailure(fragment, scriptTag, request));
+      installScriptTag(scriptTag);
     }
   }
-
-  private static void asyncCallback(RequestData request, String code) {
-    boolean firstTimeCalled = clearAsyncCallback(request.getFragment());
-    if (firstTimeCalled) {
-      request.tryInstall(code);
-    }
+  
+  protected static void callOnLoadError(RequestData request) {
+    request.onLoadError(new HttpDownloadFailure(request.getUrl(), 404,
+      "Script Tag Failure - no status available"), true);
   }
 
-  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]) {
+  private static native boolean clearCallbacksAndRemoveTag(
+      int fragment, JavaScriptObject scriptTag) /*-{
+    if (scriptTag.parentNode == null) {
+      // onSuccess or onFailure must have already been called.
       return false;
     }
-    delete __gwtModuleFunction['runAsyncCallback' + fragment];
+    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);
     return true;
   }-*/;
+  
+  private static native void clearOnFailure(JavaScriptObject scriptTag) /*-{
+    scriptTag.onerror = scriptTag.onload = scriptTag.onreadystatechange = function(){};
+  }-*/;
 
-  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);
-    });
+  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;
   }-*/;
 
   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 faff5a5..6b4924a 100644
--- a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
+++ b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
@@ -338,16 +338,9 @@
 
       index = toReturn.indexOf("(");
       if (index == -1) {
-        // 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();
-        }
+        // No bracketed items found, hence no function name available
+        location = toReturn;
+        toReturn = "";
       } else {
         // Bracketed items found: strip them off, parse location info
         int closeParen = toReturn.indexOf(")", index);
diff --git a/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java b/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
index 88ae07d..280d9fb 100644
--- a/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/client/DomBuilderImpl.java
@@ -568,7 +568,7 @@
 
   @Override
   protected void doHtmlImpl(SafeHtml html) {
-    getCurrentElement().setInnerSafeHtml(html);
+    getCurrentElement().setInnerHTML(html.asString());
   }
 
   @Override
diff --git a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
index 66919c5..8488cc2 100644
--- a/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
+++ b/user/src/com/google/gwt/dom/builder/shared/HtmlBuilderImpl.java
@@ -654,7 +654,7 @@
   @Override
   protected Element doFinishImpl() {
     Element tmp = Document.get().createDivElement();
-    tmp.setInnerSafeHtml(asSafeHtml());
+    tmp.setInnerHTML(asSafeHtml().asString());
     return tmp.getFirstChildElement();
   }
 
diff --git a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
index 5dd8343..6b306fc 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplMozilla.java
@@ -141,22 +141,14 @@
 
   @Override
   public native int getBodyOffsetLeft(Document doc) /*-{
-    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);
+    var style = $wnd.getComputedStyle(doc.documentElement, '');
+    return parseInt(style.marginLeft) + parseInt(style.borderLeftWidth);
   }-*/;
 
   @Override
   public native int getBodyOffsetTop(Document doc) /*-{
-    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);
+    var style = $wnd.getComputedStyle(doc.documentElement, '');
+    return parseInt(style.marginTop) + parseInt(style.borderTopWidth);
   }-*/;
 
   @Override
diff --git a/user/src/com/google/gwt/dom/client/Element.java b/user/src/com/google/gwt/dom/client/Element.java
index 7d1fd5b..258d3d3 100644
--- a/user/src/com/google/gwt/dom/client/Element.java
+++ b/user/src/com/google/gwt/dom/client/Element.java
@@ -85,10 +85,9 @@
    * 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 boolean addClassName(String className) {
+  public final void addClassName(String className) {
     assert (className != null) : "Unexpectedly null class name";
 
     className = className.trim();
@@ -96,18 +95,28 @@
 
     // Get the current style string.
     String oldClassName = getClassName();
-    int idx = indexOfName(oldClassName, className);
+    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);
+    }
 
     // Only add the style if it's not already present.
     if (idx == -1) {
       if (oldClassName.length() > 0) {
-        setClassName(oldClassName + " " + className);
-      } else {
-        setClassName(className);
+        oldClassName += " ";
       }
-      return true;
+      setClassName(oldClassName + className);
     }
-    return false;
   }
 
   /**
@@ -519,11 +528,10 @@
    * 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 removed
-   * @return <code>true</code> if this element had the specified class name
+   * @param className the class name to be added
    * @see #setClassName(String)
    */
-  public final boolean removeClassName(String className) {
+  public final void removeClassName(String className) {
     assert (className != null) : "Unexpectedly null class name";
 
     className = className.trim();
@@ -531,7 +539,20 @@
 
     // Get the current style string.
     String oldStyle = getClassName();
-    int idx = indexOfName(oldStyle, className);
+    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);
+    }
 
     // Don't try to remove the style if it's not there.
     if (idx != -1) {
@@ -550,35 +571,7 @@
       }
 
       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 414483b..29cbc81 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 float css property.
+   * Clear the font-size 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 e2991fa..6a1d779 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, such as {@link ListEditor}.
+ * is used by Editors which operate on ordered data, sich as {@link ListEditor}.
  * 
  * @param <E> the type of Editor required
  * @see com.google.gwt.editor.client.testing.FakeEditorSource
@@ -45,7 +45,6 @@
    * @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));
@@ -54,22 +53,6 @@
   }
 
   /**
-   * 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.
    *
@@ -85,6 +68,5 @@
    * @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 a2a781f..f2bb40f 100644
--- a/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/HasDataEditor.java
@@ -35,30 +35,21 @@
 
     @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);
     }
   }
 
-  private static class IndexedEditor<Q> implements LeafValueEditor<Q> {
+  static class IndexedEditor<Q> implements LeafValueEditor<Q> {
     private int index;
     private Q value;
     private final HasData<Q> data;
@@ -68,27 +59,22 @@
       this.data = data;
     }
 
-    @Override
     public Q getValue() {
       return value;
     }
 
-    @Override
+    public void setIndex(int index) {
+      this.index = index;
+      push();
+    }
+
     public void setValue(Q value) {
       this.value = value;
       push();
     }
 
-    void setIndex(int index) {
-      assert index >= 0;
-      this.index = index;
-      push();
-    }
-
     private void push() {
-      if (data != null) {
-        data.setRowData(index, Collections.singletonList(value));
-      }
+      data.setRowData(index, Collections.singletonList(value));
     }
   }
 
@@ -106,7 +92,7 @@
   /**
    * Prevent subclassing.
    */
-  private HasDataEditor(HasData<T> data) {
+  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 0befca9..262ad66 100644
--- a/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
@@ -66,7 +66,9 @@
    * @return an {@link Editor} of type E
    */
   public E createEditorForTraversal() {
-    return editorSource.createEditorForTraversal();
+    E toReturn = editorSource.create(0);
+    editorSource.dispose(toReturn);
+    return toReturn;
   }
 
   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 742e180..a51c62a 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,14 +57,10 @@
       // 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) {
-        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);
-        }
+        ((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 5deff76..073aec3 100644
--- a/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
+++ b/user/src/com/google/gwt/editor/client/testing/FakeEditorSource.java
@@ -48,11 +48,6 @@
   }
 
   @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/editor/rebind/AbstractEditorDriverGenerator.java b/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
index 1cf0be9..4039f3cf 100644
--- a/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
+++ b/user/src/com/google/gwt/editor/rebind/AbstractEditorDriverGenerator.java
@@ -260,7 +260,7 @@
           + editedSourceName + ">");
       SourceWriter sw = f.createSourceWriter(context, pw);
 
-      String parentSourceName = parent.getEditedType().getParameterizedQualifiedSourceName();
+      String parentSourceName = parent.getEditedType().getQualifiedSourceName();
       sw.println("private final %s parent;", parentSourceName);
 
       sw.println("public %s(%s parent, %s<%s> editor, String path) {",
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 c183fe2..1c8ea00 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 touch events at once.
+ * Receiver used to handle all mouse events at once.
  *
  * WARNING, PLEASE READ: As this class is intended for developers who wish to
- * handle all touch events in GWT, new touch handler interfaces will be added to
+ * handle all mouse events in GWT, new mouse 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 bf102ab..b0aa76b 100644
--- a/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
+++ b/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
@@ -76,27 +76,7 @@
     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 4d2da5b..c212dd4 100644
--- a/user/src/com/google/gwt/http/HTTP.gwt.xml
+++ b/user/src/com/google/gwt/http/HTTP.gwt.xml
@@ -24,13 +24,4 @@
 	<!-- 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 12608c5..212b13f 100644
--- a/user/src/com/google/gwt/http/client/Request.java
+++ b/user/src/com/google/gwt/http/client/Request.java
@@ -15,7 +15,6 @@
  */
 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;
 
@@ -33,63 +32,6 @@
 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.
    * 
@@ -97,7 +39,94 @@
    * @return a {@link Response} object instance
    */
   private static Response createResponse(final XMLHttpRequest xmlHttpRequest) {
-    return ImplHolder.get().createResponse(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;
   }
 
   /**
diff --git a/user/src/com/google/gwt/http/client/RequestBuilder.java b/user/src/com/google/gwt/http/client/RequestBuilder.java
index 3168a8d..27685cd 100644
--- a/user/src/com/google/gwt/http/client/RequestBuilder.java
+++ b/user/src/com/google/gwt/http/client/RequestBuilder.java
@@ -91,11 +91,6 @@
   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;
@@ -360,15 +355,6 @@
   }
 
   /**
-   * 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".
@@ -398,9 +384,6 @@
     }
 
     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
deleted file mode 100644
index 8927aef..0000000
--- a/user/src/com/google/gwt/http/client/ResponseImpl.java
+++ /dev/null
@@ -1,106 +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.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 22d93a1..d442349 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;DefaultMessage("This is a plain string.")
+ *   &#64;DefaultText("This is a plain string.")
  *   String oneTwoThreeFour();
  *   
- *   &#64;DefaultMessage("You have {0} widgets")
+ *   &#64;DefaultText("You have {0} widgets")
  *   &#64;PluralText({"one", "You have one widget")
  *   String widgetCount(&#64;PluralCount int count);
  *   
- *   &#64;DefaultMessage("No reference to the argument")
+ *   &#64;DefaultText("No reference to the argument")
  *   String optionalArg(&#64;Optional String ignored);
  *   
- *   &#64;DefaultMessage("Your cart total is {0,number,currency}")
+ *   &#64;DefaultText("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 60d85e3..a0ab0a3 100644
--- a/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
+++ b/user/src/com/google/gwt/i18n/client/TimeZoneInfo.java
@@ -19,7 +19,6 @@
 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
@@ -39,9 +38,13 @@
    * @return a TimeZoneInfo object made from the supplied JSON.
    */
   public static TimeZoneInfo buildTimeZoneData(String json) {
-    return JsonUtils.safeEval(json);
+    return (TimeZoneInfo) eval(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 6b5547f..35c09a4 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 = руб.|||руб.
+RUB = руб|||Rup
 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 8bb77b7..7f43656 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,13 +19,8 @@
 import com.google.gwt.i18n.client.PluralRule.PluralForm;
 
 /**
- * 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
- *
+ * Common plural rule for languages that have 1, few, and other forms.
+ * 
  * @see DefaultRule_0_1_2_n
  * @see DefaultRule_0_1_n
  * @see DefaultRule_01_n
@@ -40,18 +35,16 @@
     return new PluralForm[] {
         new PluralForm("other", "Default plural form"),
         new PluralForm("one", "Count is 1"),
-        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"),
+        new PluralForm("paucal", "Count ends in 2-4 but not 12-14 or 22-24"),
     };
   }
 
   public static int select(int n) {
     /*
-     * 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.
+     * For Polish, numbers that end in 2-4, except 12-14 and 22-24, have a special plural form.
      */
     return n == 1 ? 1
-        : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 20) ? 2
-        : 3;
+        : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 > 29) ? 2
+        : 0;
   }
 }
diff --git a/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java b/user/src/com/google/gwt/i18n/rebind/AnnotationsResource.java
index 90ee633..8fde38c 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 @DefaultMessage");
+            "@Default*Value is not permitted on a Messages interface; see @DefaultText");
       }
       if (defaultText != null) {
         return defaultText.value();
@@ -343,7 +343,7 @@
     } else {
       if (defaultText != null) {
         throw new AnnotationsError(
-            "@DefaultMessage is not permitted on a Constants interface; see @Default*Value");
+            "@DefaultText 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 471314d..7996850 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 = parsePos[0];
+          abutStart = start;
           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 9d82121..711b6da 100644
--- a/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
+++ b/user/src/com/google/gwt/junit/client/impl/JUnitHost.java
@@ -146,22 +146,13 @@
     public boolean equals(Object o) {
       if (o instanceof TestInfo) {
         TestInfo other = (TestInfo) o;
-        return equals(testModule, other.testModule)
-            && equals(testClass, other.testClass)
-            && equals(testMethod, other.testMethod);
+        return getTestModule().equals(other.getTestModule())
+            && getTestClass().equals(other.getTestClass())
+            && getTestMethod().equals(other.getTestMethod());
       }
       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 0d6fe07..490ee0c 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 = location.pathname;
+  var moduleName = document.location.href;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+  document.write("<script language='javascript' src='" + 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 e58ebce..efb2d26 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 = location.pathname;
+  var moduleName = document.location.href;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+  document.write("<script language='javascript' src='" + moduleName + ".nocache.js'></script>");
 }
 loadSelectionScript();
 -->
diff --git a/user/src/com/google/gwt/layout/client/LayoutImpl.java b/user/src/com/google/gwt/layout/client/LayoutImpl.java
index 1118a38..9816333 100644
--- a/user/src/com/google/gwt/layout/client/LayoutImpl.java
+++ b/user/src/com/google/gwt/layout/client/LayoutImpl.java
@@ -28,7 +28,6 @@
 import com.google.gwt.dom.client.Style.Overflow;
 import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.dom.client.Style.Unit;
-import com.google.gwt.dom.client.Style.Visibility;
 import com.google.gwt.layout.client.Layout.Layer;
 
 /**
@@ -65,7 +64,6 @@
     style.setWidth(10, widthUnit);
     style.setHeight(10, heightUnit);
 
-    style.setVisibility(Visibility.HIDDEN);
     State.HIDDEN.set(ruler, true);
     return ruler;
   }
diff --git a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
index 59bef01..e82e963 100644
--- a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
+++ b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
@@ -27,11 +27,8 @@
 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;
@@ -52,109 +49,39 @@
  */
 public class StackTraceDeobfuscator {
 
-  /**
-   * 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;
-    }
+  private static class SymbolMap extends HashMap<String, String> {
   }
 
   // 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 final Pattern JsniRefPattern =
+  private static 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;
 
-  // 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;
+  Pattern fragmentIdPattern = Pattern.compile(".*(\\d+)\\.js");
 
   protected File symbolMapsDirectory;
 
   // Map of strongName + fragmentId to sourceMap
-  private final Map<String, SourceMapping> sourceMaps =
+  private Map<String, SourceMapping> sourceMaps =
       new HashMap<String, SourceMapping>();
 
-  private final SymbolCache symbolCache = new SymbolCache();
+  private Map<String, SymbolMap> symbolMaps =
+      new HashMap<String, SymbolMap>();
 
   /**
-   * Creates a deobfuscator that loads symbol map files from the given directory. Symbol maps are
+   * Constructor, which takes a <code>symbolMaps</code> directory as its argument. 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;
   }
 
   /**
@@ -180,13 +107,6 @@
    */
   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);
@@ -194,21 +114,8 @@
     return newSt;
   }
 
-  public Throwable deobfuscateThrowable(Throwable old, String strongName) {
-    Throwable t = new Throwable(old.getMessage());
-    if (old.getStackTrace() != null) {
-      t.setStackTrace(deobfuscateStackTrace(old.getStackTrace(), strongName));
-    } else {
-      t.setStackTrace(new StackTraceElement[0]);
-    }
-    if (old.getCause() != null) {
-      t.initCause(deobfuscateThrowable(old.getCause(), strongName));
-    }
-    return t;
-  }
-
   /**
-   * Best effort resymbolization of a single stack trace element.
+   * Best effort resymbolization of a a single stack trace element.
    *
    * @param ste        the stack trace element to resymbolize
    * @param strongName the GWT permutation strong name
@@ -223,7 +130,8 @@
     int fragmentId = -1;
 
     String steFilename = ste.getFileName();
-    String symbolData = loadOneSymbol(strongName, ste.getMethodName());
+    SymbolMap map = loadSymbolMap(strongName);
+    String symbolData = map == null ? null : map.get(ste.getMethodName());
 
     boolean sourceMapCapable = false;
 
@@ -242,7 +150,7 @@
     }
 
     // first use symbolMap, then refine via sourceMap if possible
-    if (!symbolData.isEmpty()) {
+    if (symbolData != null) {
       // jsniIdent, className, memberName, sourceUri, sourceLine, fragmentId
       String[] parts = symbolData.split(",");
       if (parts.length == 6) {
@@ -350,6 +258,19 @@
     return new FileInputStream(filename);
   }
 
+  private Throwable deobfuscateThrowable(Throwable old, String strongName) {
+    Throwable t = new Throwable(old.getMessage());
+    if (old.getStackTrace() != null) {
+      t.setStackTrace(deobfuscateStackTrace(old.getStackTrace(), strongName));
+    } else {
+      t.setStackTrace(new StackTraceElement[0]);
+    }
+    if (old.getCause() != null) {
+      t.initCause(deobfuscateThrowable(old.getCause(), strongName));
+    }
+    return t;
+  }
+
   private SourceMapping loadSourceMap(String permutationStrongName, int fragmentId) {
     SourceMapping toReturn = sourceMaps.get(permutationStrongName + fragmentId);
     if (toReturn == null) {
@@ -368,60 +289,36 @@
     return new Scanner(stream).useDelimiter("\\A").next();
   }
 
-  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()) {
+  private SymbolMap loadSymbolMap(
+      String strongName) {
+    SymbolMap toReturn = symbolMaps.get(strongName);
+    if (toReturn != null) {
       return toReturn;
     }
-
-    Set<String> symbolsLeftToFind = new HashSet<String>(requiredSymbols);
-    toReturn = new HashMap<String, String>();
+    toReturn = new SymbolMap();
     String line;
 
     try {
       BufferedReader bin = new BufferedReader(
           new InputStreamReader(getSymbolMapInputStream(strongName)));
       try {
-        while ((line = bin.readLine()) != null && (symbolsLeftToFind.size() > 0 || !lazyLoad)) {
+        while ((line = bin.readLine()) != null) {
           if (line.charAt(0) == '#') {
             continue;
           }
           int idx = line.indexOf(',');
-          String symbol = line.substring(0, idx);
-          String symbolData = line.substring(idx + 1);
-          if (requiredSymbols.contains(symbol) || !lazyLoad) {
-            symbolsLeftToFind.remove(symbol);
-            toReturn.put(symbol, symbolData);
-          }
+          toReturn.put(new String(line.substring(0, idx)),
+              line.substring(idx + 1));
         }
       } finally {
         bin.close();
       }
     } catch (IOException e) {
-      // 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);
+      //  use empty symbol map to avoid repeated lookups
+      toReturn = new SymbolMap();
     }
 
-    symbolCache.putAll(strongName, toReturn);
+    symbolMaps.put(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 cc3065a..da35a2d 100644
--- a/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
+++ b/user/src/com/google/gwt/resources/css/CssGenerationVisitor.java
@@ -185,16 +185,9 @@
 
   @Override
   public boolean visit(CssMediaRule x, Context ctx) {
-    out.print("@media");
-    boolean isFirst = true;
+    out.print("@MEDIA");
     for (String m : x.getMedias()) {
-      if (isFirst) {
-        out.print(" ");
-        isFirst = false;
-      } else {
-        comma();
-      }
-      out.print(m);
+      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 1620fe7..bffbd36 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(x.getMedias());
+    newRule.getMedias().addAll(newRule.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 59007b5..3d3442a 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 ClassLoader.getResource()"
+              + " not found. Is the name specified as Class.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 d46fe93..fc582ae 100644
--- a/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
+++ b/user/src/com/google/gwt/resources/rg/CssObfuscationStyle.java
@@ -23,7 +23,6 @@
  */
 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),
@@ -32,8 +31,6 @@
   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")) {
@@ -71,9 +68,9 @@
      */
     if (showClassName) {
       if (showPackageName) {
-        toReturn = getPrettyCssClass(type.getQualifiedSourceName(), toReturn);
+        toReturn = type.getQualifiedSourceName().replaceAll("[.$]", "-") + "-" + toReturn;
       } else {
-        toReturn = getPrettyCssClass(type.getName(), toReturn);
+        toReturn = type.getName() + "-" + toReturn;
       }
     } 
     
@@ -91,8 +88,4 @@
   public boolean isPretty() {
     return isPretty;
   }
-
-  private static String getPrettyCssClass(String typeName, String cssClass) {
-    return typeName.replaceAll("[.$]", "-") + "-" + cssClass;
-  }
 }
diff --git a/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java b/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
index 931d2b2..429acfa 100644
--- a/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
+++ b/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java
@@ -24,7 +24,6 @@
 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;
@@ -539,8 +538,6 @@
     Graphics2D g2d = bundledImage.createGraphics();
     createGraphicsEvent.end();
 
-    setBetterRenderingQuality(g2d);
-
     g2d.drawImage(rect.getImage(), rect.transform(), null);
     g2d.dispose();
 
@@ -596,13 +593,6 @@
     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() {
@@ -828,9 +818,6 @@
     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 10456e5..706c6ec 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
@@ -335,8 +335,7 @@
   public FieldWriter require(String fieldName) {
     FieldWriter fieldWriter = lookup(fieldName);
     if (fieldWriter == null) {
-      throw new RuntimeException(String.format("The required field \"%s\" doesn't exist.",
-          fieldName));
+      throw new RuntimeException("The required field %s doesn't exist.");
     }
     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 91e2c6d..d489cae 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTable.java
@@ -475,11 +475,11 @@
        */
       sectionTag = sectionTag.toLowerCase();
       if ("tbody".equals(sectionTag)) {
-        tmpElem.setInnerSafeHtml(template.tbody(rowHtml));
+        tmpElem.setInnerHTML(template.tbody(rowHtml).asString());
       } else if ("thead".equals(sectionTag)) {
-        tmpElem.setInnerSafeHtml(template.thead(rowHtml));
+        tmpElem.setInnerHTML(template.thead(rowHtml).asString());
       } else if ("tfoot".equals(sectionTag)) {
-        tmpElem.setInnerSafeHtml(template.tfoot(rowHtml));
+        tmpElem.setInnerHTML(template.tfoot(rowHtml).asString());
       } else {
         throw new IllegalArgumentException("Invalid table section tag: " + sectionTag);
       }
@@ -633,7 +633,7 @@
      */
     protected void replaceAllRowsImpl(AbstractCellTable<?> table, TableSectionElement section,
         SafeHtml html) {
-      section.setInnerSafeHtml(html);
+      section.setInnerHTML(html.asString());
     }
   }
 
@@ -1793,16 +1793,6 @@
     {
       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 e1da850..0e4fde0 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractCellTableBuilder.java
@@ -254,20 +254,10 @@
     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/AbstractHasData.java b/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
index fe84f8f..05ba50c 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
@@ -363,7 +363,7 @@
     // cached images.
     DOM.setEventListener(tmpElem, widget);
 
-    tmpElem.setInnerSafeHtml(html);
+    tmpElem.setInnerHTML(html.asString());
 
     // Detach the event listener.
     DOM.setEventListener(tmpElem, null);
@@ -386,7 +386,7 @@
     }
 
     // Render the HTML.
-    childContainer.setInnerSafeHtml(CellBasedWidgetImpl.get().processHtml(html));
+    childContainer.setInnerHTML(CellBasedWidgetImpl.get().processHtml(html).asString());
 
     // Detach the event listener.
     if (!widget.isAttached()) {
diff --git a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
index 34e5c7b..b6dd0292 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
@@ -375,7 +375,7 @@
       } else {
         image = closedImageHtml;
       }
-      tmpElem.setInnerSafeHtml(image);
+      tmpElem.setInnerHTML(image.asString());
       elem.replaceChild(tmpElem.getFirstChildElement(), elem.getFirstChildElement());
 
       // Update the open state.
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
index 503c7ba..95d8573 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
@@ -860,7 +860,7 @@
    * @param parentNodeInfo the {@link NodeInfo} of the parent
    * @param elem the outer element of this {@link CellTreeNodeView}
    * @param value the value of this node
-   * @param messages translation messages
+   * @param messages tranlation messages
    */
   CellTreeNodeView(final CellTree tree, final CellTreeNodeView<?> parent,
       NodeInfo<T> parentNodeInfo, Element elem, T value, CellTreeMessages messages) {
@@ -1394,7 +1394,7 @@
       html = LEAF_IMAGE;
     }
     Element tmp = Document.get().createDivElement();
-    tmp.setInnerSafeHtml(html);
+    tmp.setInnerHTML(html.asString());
     Element imageElem = tmp.getFirstChildElement();
 
     Element oldImg = getImageElement();
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 f644cde..0c5b44b 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellWidget.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellWidget.java
@@ -35,8 +35,6 @@
 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}.
  * 
@@ -195,8 +193,7 @@
 
     // Forward the event to the cell.
     String eventType = event.getType();
-    Set<String> consumedEvents = cell.getConsumedEvents();
-    if (consumedEvents != null && consumedEvents.contains(eventType)) {
+    if (cell.getConsumedEvents().contains(eventType)) {
       cell.onBrowserEvent(createContext(), getElement(), value, event, valueUpdater);
     }
   }
@@ -207,7 +204,7 @@
   public void redraw() {
     SafeHtmlBuilder sb = new SafeHtmlBuilder();
     cell.render(createContext(), value, sb);
-    getElement().setInnerSafeHtml(sb.toSafeHtml());
+    getElement().setInnerHTML(sb.toSafeHtml().asString());
 
     /*
      * The rendered Cell should fill the root element so height and width styles
@@ -285,4 +282,4 @@
   private Object getKey(C value) {
     return (keyProvider == null || value == null) ? value : keyProvider.getKey(value);
   }
-}
+}
\ No newline at end of file
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 14499c2..3645a00 100644
--- a/user/src/com/google/gwt/user/cellview/client/SimplePager.java
+++ b/user/src/com/google/gwt/user/cellview/client/SimplePager.java
@@ -260,6 +260,7 @@
    * @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 68eec21..aec4a14 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 String cachedQueryString = "";
+    private static Map<String, String> paramMap;
     private static Map<String, List<String>> listParamMap;
 
     /**
@@ -206,28 +206,24 @@
      * returned.
      * 
      * @param name the name of the URL's parameter
-     * @return the value of the URL's parameter, or null if missing
+     * @return the value of the URL's parameter
      */
     public static String getParameter(String name) {
-      ensureListParameterMap();
-      List<String> paramsForName = listParamMap.get(name);
-      if (paramsForName == null) {
-        return null;
-      } else {
-        return paramsForName.get(paramsForName.size() - 1);
-      }
+      ensureParameterMap();
+      return paramMap.get(name);
     }
 
     /**
-     * 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.
+     * 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.
      * 
      * @return a map from URL query parameter names to a list of values
      */
     public static Map<String, List<String>> getParameterMap() {
-      ensureListParameterMap();
+      if (listParamMap == null) {
+        listParamMap = buildListParamMap(getQueryString());
+      }
       return listParamMap;
     }
 
@@ -320,12 +316,21 @@
       return out;
     }
 
-    private static void ensureListParameterMap() {
-      final String currentQueryString = getQueryString();
-      if (listParamMap == null ||
-          !cachedQueryString.equals(currentQueryString)) {
-        listParamMap = buildListParamMap(currentQueryString);
-        cachedQueryString = currentQueryString;
+    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], "");
+            }
+          }
+        }
       }
     }
 
@@ -766,8 +771,8 @@
    * defined. The top left corner will not be moved (it stays in its original
    * coordinates).
    * <p>
-   * NOTE: In most modern browsers, this method only works with windows created
-   * by Window.open() with a supplied width and height.
+   * NOTE: In Chrome, this method only works with windows created by
+   * Window.open().
    * </p>
    *
    * @param width A positive or a negative number that specifies how many pixels
@@ -782,8 +787,8 @@
   /**
    * Resizes the window to the specified width and height.
    * <p>
-   * NOTE: In most modern browsers, this method only works with windows created
-   * by Window.open() with a supplied width and height.
+   * NOTE: In Chrome, this method only works with windows created by
+   * Window.open().
    * </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 3ffb204..2c41d4a 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.shared.GWT;
+import com.google.gwt.core.client.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 20e67b6..5174790 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.shared.GWT;
+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.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 8b62d94..4f5a9b3 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 left.
+   * In RTL, the vertical scrollbar appears on the right.
    */
   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 919f5a8..393a1ed 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, if any.
+   * Gets the index of the currently-visible widget.
    * 
-   * @return the visible widget's index, or -1 if there is no such widget
+   * @return the visible widget's index
    */
   public int getVisibleWidget() {
     return getWidgetIndex(visibleWidget);
diff --git a/user/src/com/google/gwt/user/client/ui/LoadListener.java b/user/src/com/google/gwt/user/client/ui/LoadListener.java
index 1d3d3b0..8164979 100644
--- a/user/src/com/google/gwt/user/client/ui/LoadListener.java
+++ b/user/src/com/google/gwt/user/client/ui/LoadListener.java
@@ -5,7 +5,7 @@
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
  * 
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0/
  * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
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 fb65033..9fe635b 100644
--- a/user/src/com/google/gwt/user/client/ui/NamedFrame.java
+++ b/user/src/com/google/gwt/user/client/ui/NamedFrame.java
@@ -38,10 +38,8 @@
   interface IFrameTemplate extends SafeHtmlTemplates {
     static final IFrameTemplate INSTANCE = GWT.create(IFrameTemplate.class);
 
-    // 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);
+    @Template("<iframe src='{0}' name='{1}'>")
+    SafeHtml get(String src, String name);
   }
 
   // Used inside JSNI, so please don't delete this field just because
@@ -55,8 +53,9 @@
   }
 
   /**
-   * Creates an HTML IFRAME element with a name.
+   * Creates an HTML IFRAME element with a src and 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>',
@@ -64,7 +63,7 @@
    * @return the newly-created element
    * @throws IllegalArgumentException if the supplied name is not allowed 
    */
-  private static IFrameElement createIFrame(String name) {
+  private static IFrameElement createIFrame(String src, String name) {
     if (name == null || !isValidName(name.trim())) {
       throw new IllegalArgumentException(
           "expecting one or more non-whitespace chars with no '<', '>', or '&'");
@@ -73,7 +72,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(name));
+    div.setInnerSafeHtml(IFrameTemplate.INSTANCE.get(src, name));
     return div.getFirstChild().cast();
   }
 
@@ -102,7 +101,9 @@
    */
   @UiConstructor
   public NamedFrame(String name) {
-    super(createIFrame(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));
     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 ddcad33..2434496 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 popup will not jump from its original position to the new position.
+   * the 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 55d97f1..302b696 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
-   * getSuggestions may slightly exceed <code>limit</code> so that all
+   * getSuggesstions 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/RenderablePanel.java b/user/src/com/google/gwt/user/client/ui/RenderablePanel.java
index 3656ecb..165fc66 100644
--- a/user/src/com/google/gwt/user/client/ui/RenderablePanel.java
+++ b/user/src/com/google/gwt/user/client/ui/RenderablePanel.java
@@ -233,7 +233,7 @@
 
     // Build the div that'll container the panel's HTML.
     Element element = Document.get().createDivElement();
-    element.setInnerSafeHtml(getInnerHtml());
+    element.setInnerHTML(getInnerHtml().asString());
 
     // TODO(rdcastro): Implement something like
     // element.mergeFrom(getElement());
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 1054249..7d0bab3 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 :
-      "ResizeComposite requires that its wrapped widget implement RequiresResize";
+      "LayoutComposite 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 49f1278..2f4dac6 100644
--- a/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/ResizeLayoutPanel.java
@@ -140,7 +140,6 @@
       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);
@@ -161,7 +160,6 @@
       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 a0acd62..6cb8462 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,16 +377,6 @@
     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 5d062a5..a83796c 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -243,8 +243,6 @@
 
   private TreeItem root;
 
-  private boolean scrollOnSelectEnabled = true;
-  
   private boolean useLeafImages;
 
   /**
@@ -637,13 +635,6 @@
     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()];
@@ -862,14 +853,6 @@
   }
 
   /**
-   * 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
@@ -1238,40 +1221,36 @@
     Focusable focusableWidget = curSelection.getFocusable();
     if (focusableWidget != null) {
       focusableWidget.setFocus(true);
-      if (scrollOnSelectEnabled) {
-        DOM.scrollIntoView(((Widget) focusableWidget).getElement());
-      }
+      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");
+      // 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();
 
-        // 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);
+      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;
       }
 
+      // 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.
       updateAriaAttributes();
diff --git a/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java b/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
index a772f1d..85da019 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/ClippedImageImpl.java
@@ -63,7 +63,7 @@
 
   public Element createStructure(SafeUri url, int left, int top, int width, int height) {
     Element tmp = Document.get().createSpanElement();
-    tmp.setInnerSafeHtml(getSafeHtml(url, left, top, width, height));
+    tmp.setInnerHTML(getSafeHtml(url, left, top, width, height).asString());
     return tmp.getFirstChildElement();
   }
 
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 fe3bbcb..3593855 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,11 +27,6 @@
   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 28aea46..67a6737 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,15 +95,11 @@
     var _this = this;
     _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitializing()();
     setTimeout($entry(function() {
-      // 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';
+      // 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 29bfa07..f49e003 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilder.java
@@ -114,7 +114,18 @@
  */
 public class SerializableTypeOracleBuilder {
 
-  static class TypeInfoComputed {
+  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;
 
     /**
      * <code>true</code> if the type is automatically or manually serializable
@@ -134,10 +145,10 @@
     private boolean instantiableSubtypes;
 
     /**
-     * All instantiable types found when this type was queried, including the
-     * type itself. (Null until calculated.)
+     * All instantiable types found when this type was quaried, including the
+     * type itself.
      */
-    private Set<JClassType> instantiableTypes;
+    private Set<JClassType> instantiableTypes = new HashSet<JClassType>();
 
     /**
      * Custom field serializer or <code>null</code> if there isn't one.
@@ -165,19 +176,38 @@
      */
     private final JType type;
 
-    private TypeInfoComputed(JType type, TypePath path, TypeOracle typeOracle) {
+    public TypeInfoComputed(JType type, TypePath path) {
       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;
     }
@@ -187,7 +217,19 @@
     }
 
     public boolean hasInstantiableSubtypes() {
-      return instantiable || instantiableSubtypes || state == TypeState.CHECK_IN_PROGRESS;
+      return isInstantiable() || instantiableSubtypes || isPendingInstantiable();
+    }
+
+    public boolean isAutoSerializable() {
+      return autoSerializable;
+    }
+
+    public boolean isDeclaredSerializable() {
+      return autoSerializable || isManuallySerializable();
+    }
+
+    public boolean isDirectlySerializable() {
+      return directlyImplementsMarker || isManuallySerializable();
     }
 
     public boolean isDone() {
@@ -808,40 +850,29 @@
       if (!entrySucceeded) {
         problems.report(logger, TreeLogger.ERROR, TreeLogger.INFO);
       } else {
-        maybeReport(logger, problems);
+        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);
       }
-      allSucceeded &= entrySucceeded & !problems.hasFatalProblems();
+
+      allSucceeded &= entrySucceeded;
     }
 
     if (!allSucceeded) {
       throw new UnableToCompleteException();
     }
-    assertNothingPending();
 
-    // 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();
-      }
+    for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
+      assert (!tic.isPendingInstantiable());
     }
 
-    if (!allSucceeded) {
-      throw new UnableToCompleteException();
-    }
-    assertNothingPending();
-
     pruneUnreachableTypes();
 
     logReachableTypes(logger);
@@ -912,7 +943,7 @@
       ProblemReport problems) {
     assert (type != null);
     if (type.isPrimitive() != null) {
-      TypeInfoComputed tic = ensureTypeInfoComputed(type, path);
+      TypeInfoComputed tic = getTypeInfoComputed(type, path, true);
       tic.setInstantiableSubtypes(true);
       tic.setInstantiable(false);
       return tic;
@@ -922,7 +953,7 @@
 
     JClassType classType = (JClassType) type;
 
-    TypeInfoComputed tic = typeToTypeInfoComputed.get(classType);
+    TypeInfoComputed tic = getTypeInfoComputed(classType, path, false);
     if (tic != null && tic.isDone()) {
       // we have an answer already; use it.
       return tic;
@@ -943,7 +974,7 @@
        * caller's responsibility to deal with it. We assume that it is
        * indirectly instantiable here.
        */
-      tic = ensureTypeInfoComputed(classType, path);
+      tic = getTypeInfoComputed(classType, path, true);
       tic.setInstantiableSubtypes(true);
       tic.setInstantiable(false);
       return tic;
@@ -957,7 +988,7 @@
             computeTypeInstantiability(localLogger, bound, path, problems)
                 .hasInstantiableSubtypes();
       }
-      tic = ensureTypeInfoComputed(classType, path);
+      tic = getTypeInfoComputed(classType, path, true);
       tic.setInstantiableSubtypes(success);
       tic.setInstantiable(false);
       return tic;
@@ -966,7 +997,7 @@
     JArrayType isArray = classType.isArray();
     if (isArray != null) {
       TypeInfoComputed arrayTic = checkArrayInstantiable(localLogger, isArray, path, problems);
-      assert typeToTypeInfoComputed.get(classType) != null;
+      assert getTypeInfoComputed(classType, path, false) != null;
       return arrayTic;
     }
 
@@ -978,7 +1009,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 = ensureTypeInfoComputed(classType, path);
+      tic = getTypeInfoComputed(classType, path, true);
       tic.setInstantiable(false);
       return tic;
     }
@@ -997,16 +1028,13 @@
 
     // TreeLogger subtypesLogger = localLogger.branch(TreeLogger.DEBUG,
     // "Analyzing subclasses:", null);
-    tic = ensureTypeInfoComputed(classType, path);
-    Set<JClassType> instantiableTypes = new HashSet<JClassType>();
+    tic = getTypeInfoComputed(classType, path, true);
     boolean anySubtypes =
-        checkSubtypes(localLogger, originalType, instantiableTypes, path, problems);
+        checkSubtypes(localLogger, originalType, tic.getInstantiableTypes(), 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;
   }
 
@@ -1024,16 +1052,10 @@
     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) {
@@ -1069,16 +1091,12 @@
       return checkArrayInstantiable(logger, arrayType, path, problems);
     }
 
-    TypeInfoComputed tic = ensureTypeInfoComputed(array, path);
-    if (tic.isDone() || tic.isPendingInstantiable()) {
-      return tic;
-    }
-    tic.setPendingInstantiable();
-
+    JClassType leafClass = leafType.isClassOrInterface();
     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;
@@ -1087,12 +1105,18 @@
     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;
     }
 
-    // An array is instantiable provided that any leaf subtype is instantiable.
-    // (Ignores the possibility of empty arrays of non-instantiable types.)
+    TypeInfoComputed tic = getTypeInfoComputed(array, path, true);
+    if (tic.isDone()) {
+      return tic;
+    } else if (tic.isPendingInstantiable()) {
+      return tic;
+    }
+    tic.setPendingInstantiable();
 
     TreeLogger branch = logger.branch(TreeLogger.DEBUG, "Analyzing component type:", null);
 
@@ -1100,6 +1124,32 @@
         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;
@@ -1216,7 +1266,7 @@
       }
     }
 
-    TypeInfoComputed tic = ensureTypeInfoComputed(classOrInterface, parent);
+    TypeInfoComputed tic = getTypeInfoComputed(classOrInterface, parent, true);
     return checkDeclaredFields(logger, tic, parent, problems);
   }
 
@@ -1226,7 +1276,7 @@
    */
   private boolean checkSubtypes(TreeLogger logger, JClassType originalType,
       Set<JClassType> instSubtypes, TypePath path, ProblemReport problems) {
-    JRealClassType baseType = getBaseType(originalType);
+    JClassType baseType = getBaseType(originalType);
     TreeLogger computationLogger =
         logger.branch(TreeLogger.DEBUG, "Finding possibly instantiable subtypes");
     List<JClassType> candidates =
@@ -1250,7 +1300,7 @@
       }
 
       TypePath subtypePath = TypePaths.createSubtypePath(path, candidate, originalType);
-      TypeInfoComputed tic = ensureTypeInfoComputed(candidate, subtypePath);
+      TypeInfoComputed tic = getTypeInfoComputed(candidate, subtypePath, true);
       if (tic.isDone()) {
         if (tic.isInstantiable()) {
           anySubtypes = true;
@@ -1279,7 +1329,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) {
+      if (instantiable && instSubtypes != null) {
         instSubtypes.add(candidate);
       }
     }
@@ -1292,7 +1342,8 @@
    * 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
@@ -1384,8 +1435,8 @@
   /**
    * Returns the subtypes of a given base type as parameterized by wildcards.
    */
-  private List<JClassType> getPossiblyInstantiableSubtypes(TreeLogger logger,
-      JRealClassType baseType, ProblemReport problems) {
+  private List<JClassType> getPossiblyInstantiableSubtypes(TreeLogger logger, JClassType baseType,
+      ProblemReport problems) {
     assert (baseType == getBaseType(baseType));
 
     List<JClassType> possiblyInstantiableTypes = new ArrayList<JClassType>();
@@ -1436,10 +1487,10 @@
     return possiblyInstantiableTypes;
   }
 
-  private TypeInfoComputed ensureTypeInfoComputed(JType type, TypePath path) {
+  private TypeInfoComputed getTypeInfoComputed(JType type, TypePath path, boolean createIfNeeded) {
     TypeInfoComputed tic = typeToTypeInfoComputed.get(type);
-    if (tic == null) {
-      tic = new TypeInfoComputed(type, path, typeOracle);
+    if (tic == null && createIfNeeded) {
+      tic = new TypeInfoComputed(type, path);
       typeToTypeInfoComputed.put(type, tic);
     }
     return tic;
@@ -1531,81 +1582,11 @@
     for (int rank = 1; rank <= maxRank; ++rank) {
       JArrayType covariantArray = getArrayType(typeOracle, rank, leafType);
 
-      TypeInfoComputed covariantArrayTic = ensureTypeInfoComputed(covariantArray, path);
+      TypeInfoComputed covariantArrayTic = getTypeInfoComputed(covariantArray, path, true);
       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);
@@ -1618,21 +1599,6 @@
     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);
@@ -1653,7 +1619,8 @@
     Set<JType> supersOfInstantiableTypes = new LinkedHashSet<JType>();
     for (TypeInfoComputed tic : typeToTypeInfoComputed.values()) {
       if (tic.isInstantiable() && tic.getType() instanceof JClassType) {
-        JClassType sup = (JClassType) tic.getType().getErasedType();
+        JClassType type = (JClassType) tic.getType().getErasedType();
+        JClassType sup = type;
         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 0d6f826..17cc6a0 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/SerializationUtils.java
@@ -18,7 +18,6 @@
 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;
@@ -28,7 +27,6 @@
 
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -270,26 +268,6 @@
     } 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 574a30d..3ad43e9 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 "
-                + "ClassLoader.getResource() would expect?)", null);
+                + "Class.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 c62f0ec..2dd668d 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,50 +219,25 @@
   }
 
   /**
-   * Resolve type variables to concrete types if possible. Otherwise, just return
-   * the type variable.
+   * Return the concrete type that a generic type maps to, if known.
    *
-   * @param unresolved The type to resolve
+   * @param genericType The generic 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 unresolved,
+  public static Type findActualType(Type genericType,
       DequeMap<TypeVariable<?>, Type> resolvedTypes) {
-
-    // 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;
+    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);
     }
 
-    // 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;
-      }
-    }
+    return result;
   }
 
   /**
@@ -895,14 +870,6 @@
       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 0348bdf..b1df67d 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,6 +337,7 @@
      * 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';
@@ -502,9 +503,6 @@
       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 3039a35..16a65ec 100644
--- a/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
+++ b/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
@@ -33,15 +33,6 @@
     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 4ee9674..dfcd5a7 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(com.example.Bean object) /*-{
+    // private native fieldType _fieldName(Bean object) /*-{
     sw.print("private native ");
 
     sw.print(field.getType().getQualifiedSourceName());
     sw.print(" ");
     sw.print(toWrapperName(field));
     sw.print("(");
-    sw.print(field.getEnclosingType().getQualifiedSourceName());
+    sw.print(beanType.getName());
     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 19a1d68..d3e4c95 100644
--- a/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
+++ b/user/src/com/google/gwt/xhr/client/XMLHttpRequest.java
@@ -366,18 +366,6 @@
   }-*/;
 
   /**
-   * 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 de48103..7e33728 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/apt/ValidationTool.java b/user/src/com/google/web/bindery/requestfactory/apt/ValidationTool.java
index 5f54312..206b9e9 100644
--- a/user/src/com/google/web/bindery/requestfactory/apt/ValidationTool.java
+++ b/user/src/com/google/web/bindery/requestfactory/apt/ValidationTool.java
@@ -212,11 +212,7 @@
   /**
    * A testable "main" method.
    */
-  public static boolean exec(String[] args) throws IOException {
-    return exec(args, ToolProvider.getSystemJavaCompiler());
-  }
-
-  public static boolean exec(String[] args, JavaCompiler compiler) throws IOException {
+  static boolean exec(String[] args) throws IOException {
     if (args.length < 2) {
       System.err.println("java -cp requestfactory-client.jar:your_server-code.jar "
           + ValidationTool.class.getCanonicalName()
@@ -226,6 +222,7 @@
           + "for more information.");
       return false;
     }
+    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
     if (compiler == null) {
       System.err.println("This tool must be run with a JDK, not a JRE");
       return false;
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 c1d698a..93e7078 100644
--- a/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
+++ b/user/src/com/google/web/bindery/requestfactory/server/RequestState.java
@@ -157,8 +157,7 @@
   /**
    * EntityCodex support. This method is identical to
    * {@link IdFactory#getHistoryToken(SimpleProxyId)} except that it
-   * base64-encodes the server ids and adds client ids for stable ids
-   * that were ephemeral.
+   * base64-encodes the server ids.
    * <p>
    * XXX: Merge this with AbstsractRequestContext's implementation
    */
@@ -173,9 +172,6 @@
       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 3bcffa3..c4f68b3 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,8 +1269,6 @@
       }
       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 b63feb2..04225bf 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,6 +15,9 @@
  */
 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.
  */
@@ -29,14 +32,18 @@
       OperationData toReturn = d;
       d = null;
 
-      // Strip return types
       if (toReturn.clientMethodDescriptor != null) {
-        toReturn.clientMethodDescriptor =
-            OperationKey.stripReturnType(toReturn.clientMethodDescriptor);
+        // Strip return types
+        Method noReturn =
+            new Method(toReturn.methodName, Type.VOID_TYPE, Type
+                .getArgumentTypes(toReturn.clientMethodDescriptor));
+        toReturn.clientMethodDescriptor = noReturn.getDescriptor();
       }
       if (toReturn.domainMethodDescriptor != null) {
-        toReturn.domainMethodDescriptor =
-            OperationKey.stripReturnType(toReturn.domainMethodDescriptor);
+        Method noReturn =
+            new Method(toReturn.methodName, Type.VOID_TYPE, Type
+                .getArgumentTypes(toReturn.domainMethodDescriptor));
+        toReturn.domainMethodDescriptor = noReturn.getDescriptor();
       }
 
       return toReturn;
@@ -94,4 +101,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 84ea217..87b9d2c 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,6 +15,8 @@
  */
 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;
 
@@ -51,13 +53,9 @@
     }
   }
 
-  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) {
-    String raw = requestContextBinaryName + "::" + methodName + stripReturnType(descriptor);
+    Method m = new Method(methodName, Type.VOID_TYPE, Type.getArgumentTypes(descriptor));
+    String raw = requestContextBinaryName + "::" + methodName + m.getDescriptor();
     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 183d399..06b4f12 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,11 +19,14 @@
 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;
@@ -94,22 +97,18 @@
       List<String> cookieHeaders = connection.getHeaderFields().get("Set-Cookie");
       if (cookieHeaders != null) {
         for (String header : cookieHeaders) {
-          List<HttpCookie> headerCookies;
           try {
-            headerCookies = HttpCookie.parse(header);
-          } catch (IllegalArgumentException e) {
-            // if we can't parse it, ignore it
-            continue;
-          }
-
-          for (HttpCookie cookie : headerCookies) {
-            String domain = cookie.getDomain();
+            JSONObject cookie = Cookie.toJSONObject(header);
+            String name = cookie.getString("name");
+            String value = cookie.getString("value");
+            String domain = cookie.optString("Domain");
             if (domain == null || url.getHost().endsWith(domain)) {
-              String path = cookie.getPath();
+              String path = cookie.optString("Path");
               if (path == null || url.getPath().startsWith(path)) {
-                cookies.put(cookie.getName(), cookie.getValue());
+                cookies.put(name, value);
               }
             }
+          } 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 ab89197..04a85e1 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,21 +183,27 @@
    * 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 {
-    if (!__isValidDouble(s)) {
+  protected static double __parseAndValidateDouble(String s)
+      throws NumberFormatException {
+
+    double toReturn = __parseDouble(s);
+
+    if (__isNaN(toReturn)) {
       throw NumberFormatException.forInputString(s);
     }
-    return __parseDouble(s);
-  }
 
+    return toReturn;
+  }
+  
   /**
    * @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");
     }
@@ -223,14 +229,16 @@
 
     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");
     }
@@ -238,8 +246,6 @@
       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) {
@@ -247,7 +253,7 @@
       length--;
     }
     if (length == 0) {
-      throw NumberFormatException.forInputString(orig);
+      throw NumberFormatException.forInputString(s);
     }
 
     // Strip leading zeros
@@ -255,13 +261,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(orig);
+      throw NumberFormatException.forInputString(s);
     }
-
+    
     // Validate the digits
     int maxNumericDigit = '0' + Math.min(radix, 10);
     int maxLowerCaseDigit = radix + 'a' - 10;
@@ -277,56 +283,50 @@
       if (c >= 'A' && c < maxUpperCaseDigit) {
         continue;
       }
-      throw NumberFormatException.forInputString(orig);
+      throw NumberFormatException.forInputString(s);
     }
 
     long toReturn = 0;
     int maxDigits = __ParseLong.maxDigitsForRadix[radix];
     long radixPower = __ParseLong.maxDigitsRadixPower[radix];
-    long minValue = -__ParseLong.maxValueForRadix[radix];
-
+    long maxValue = __ParseLong.maxValueForRadix[radix];
+    
     boolean firstTime = true;
     int head = length % maxDigits;
     if (head > 0) {
-      // 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);
+      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 < minValue) {
+        if (toReturn > maxValue) {
           throw new NumberFormatException(s);
         }
-        toReturn *= radixPower;
+        toReturn *= radixPower;      
       } else {
         firstTime = false;
       }
-      toReturn -= head;
+      toReturn += head;
     }
     
-    // A positive value means we overflowed Long.MIN_VALUE
-    if (toReturn > 0) {
-      throw NumberFormatException.forInputString(orig);
+    // A negative value means we overflowed Long.MAX_VALUE
+    if (toReturn < 0) {
+      throw NumberFormatException.forInputString(s);
     }
     
-    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,26 +337,21 @@
   /**
    * @skip
    * 
-   * @param str
-   * @return {@code true} if the string matches {@link #floatRegex}, {@code false} otherwise
+   * @return The floating-point representation of <code>str</code> or
+   *         <code>Number.NaN</code> if the string does not match
+   *         {@link #floatRegex}.
    */
-  private static native boolean __isValidDouble(String str) /*-{
+  private static native double __parseDouble(String str) /*-{
     var floatRegex = @java.lang.Number::floatRegex;
     if (!floatRegex) {
       // Disallow '.' with no digits on either side
-      floatRegex = @java.lang.Number::floatRegex =
-          /^\s*[+-]?(NaN|Infinity|((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?[dDfF]?)\s*$/;
+      floatRegex = @java.lang.Number::floatRegex = /^\s*[+-]?((\d+\.?\d*)|(\.\d+))([eE][+-]?\d+)?[dDfF]?\s*$/i;
     }
-    return floatRegex.test(str);
-  }-*/;
-
-  /**
-   * @skip
-   * 
-   * @return The floating-point representation of <code>str</code>.
-   */
-  private static native double __parseDouble(String str) /*-{
-    return parseFloat(str);
+    if (floatRegex.test(str)) {
+      return parseFloat(str);
+    } else {
+      return Number.NaN;
+    }
   }-*/;
 
   /**
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 6fab967..032e04c 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -764,9 +764,10 @@
    * TODO(jat): properly handle Java regex syntax
    */
   public native boolean matches(String regex) /*-{
-    // We surround the regex with '^' and '$' because it must match
-    // the entire string.
-    return new RegExp('^(' + regex + ')$').test(this);
+    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]);
   }-*/;
 
   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 ffbdfb7..7cc988b 100644
--- a/user/super/com/google/gwt/emul/java/math/BigDecimal.java
+++ b/user/super/com/google/gwt/emul/java/math/BigDecimal.java
@@ -2615,10 +2615,18 @@
         throw new NumberFormatException("For input string: \"" + val + "\"");
       }
     }
+    int counter = 0;
+    boolean wasNonZero = false;
     // Accumulating all digits until a possible decimal point
-    while ((offset < last) && (val.charAt(offset) != '.')
-        && (val.charAt(offset) != 'e') && (val.charAt(offset) != 'E')) {
-      offset++;
+    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;
+        }
+      }
     }
     unscaledBuffer.append(val, begin, offset);
     // A decimal point was found
@@ -2626,9 +2634,15 @@
       offset++;
       // Accumulating all digits until a possible exponent
       begin = offset;
-      while ((offset < last) && (val.charAt(offset) != 'e')
-          && (val.charAt(offset) != 'E')) {
-        offset++;
+      for (; (offset < last) && (val.charAt(offset) != 'e')
+          && (val.charAt(offset) != 'E'); offset++) {
+        if (!wasNonZero) {
+          if (val.charAt(offset) == '0') {
+            counter++;
+          } else {
+            wasNonZero = true;
+          }
+        }
       }
       scale = offset - begin;
       unscaledBuffer.append(val, begin, offset);
@@ -2667,7 +2681,7 @@
     } else {
       setUnscaledValue(new BigInteger(unscaled));
     }
-    precision = unscaledBuffer.length();
+    precision = unscaledBuffer.length() - counter;
     // Don't count leading zeros in the precision
     for (int i = 0; i < unscaledBuffer.length(); ++i) {
       char ch = unscaledBuffer.charAt(i);
@@ -2676,10 +2690,6 @@
       }
       --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 bdeb8ee..93606f5 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractMap.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractMap.java
@@ -207,7 +207,6 @@
       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 b4a1791..bf2a6bf 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,8 +334,7 @@
         builder.setParameter(SESSIONID_QUERY_PARAM,
             String.valueOf(clientInfo.getSessionId()));
       }
-      // Replace "%3A" with ":" as a hack to support broken DevMode plugins.
-      Window.Location.replace(builder.buildString().replaceAll("%3A", ":"));
+      Window.Location.replace(builder.buildString());
       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
deleted file mode 100644
index b8afd4c..0000000
--- a/user/test/com/google/gwt/animation/AnimationApiUsage.gwt.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--                                                                        -->
-<!-- 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 8302101..ef8551f 100644
--- a/user/test/com/google/gwt/animation/AnimationSuite.java
+++ b/user/test/com/google/gwt/animation/AnimationSuite.java
@@ -15,7 +15,6 @@
  */
 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;
 
@@ -29,7 +28,6 @@
   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
deleted file mode 100644
index 27a6c64..0000000
--- a/user/test/com/google/gwt/animation/client/AnimationApiUsageTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 3925bd7..49a6aa0 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/cell/client/ImageLoadingCellTest.java b/user/test/com/google/gwt/cell/client/ImageLoadingCellTest.java
index 9c4e477..87d7beb 100644
--- a/user/test/com/google/gwt/cell/client/ImageLoadingCellTest.java
+++ b/user/test/com/google/gwt/cell/client/ImageLoadingCellTest.java
@@ -36,7 +36,7 @@
 
     // Render the html.
     Element elem = Document.get().createDivElement();
-    elem.setInnerSafeHtml(sb.toSafeHtml());
+    elem.setInnerHTML(sb.toSafeHtml().asString());
 
     // Verify the image.
     assertEquals(2, elem.getChildCount());
@@ -56,7 +56,7 @@
  
     // Render the html.
     Element elem = Document.get().createDivElement();
-    elem.setInnerSafeHtml(sb.toSafeHtml());
+    elem.setInnerHTML(sb.toSafeHtml().asString());
 
     // Verify the image.
     assertEquals(2, elem.getChildCount());
diff --git a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
index f245a1c..7596688 100644
--- a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
+++ b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
@@ -204,8 +204,7 @@
     this.delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test4.js";
     assertFalse(nativeTest4Worked());
-    final JavaScriptObject injectedElement =
-        ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false).inject();
+    final JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).inject();
 
     // We'll check using a callback in another test. This test will poll to see
     // that the script had an effect.
@@ -243,8 +242,8 @@
     delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test5.js";
     assertFalse(nativeTest5Worked());
-    JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
-        .setCallback(new Callback<Void, Exception>() {
+    JavaScriptObject injectedElement =
+        ScriptInjector.fromUrl(scriptUrl).setCallback(new Callback<Void, Exception>() {
           @Override
           public void onFailure(Exception reason) {
             assertNotNull(reason);
@@ -273,8 +272,8 @@
   public void testInjectUrlTopWindow() {
     final String scriptUrl = "script_injector_test6.js";
     assertFalse(nativeTest6Worked());
-    JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
-        .setWindow(ScriptInjector.TOP_WINDOW).inject();
+    JavaScriptObject injectedElement =
+        ScriptInjector.fromUrl(scriptUrl).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() {
@@ -310,8 +309,8 @@
     delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test7.js";
     assertFalse(nativeTest7Worked());
-    JavaScriptObject injectedElement = ScriptInjector.fromUrl(scriptUrl).setRemoveTag(false)
-        .setWindow(ScriptInjector.TOP_WINDOW).setCallback(
+    JavaScriptObject injectedElement =
+        ScriptInjector.fromUrl(scriptUrl).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 86a4abd..47f70ad 100644
--- a/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
+++ b/user/test/com/google/gwt/core/client/impl/SchedulerImplTest.java
@@ -15,7 +15,6 @@
  */
 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;
@@ -76,22 +75,6 @@
     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
@@ -123,45 +106,6 @@
     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 6b71d59..e4bfe0d 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
@@ -192,10 +192,6 @@
         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 4107144..e480282 100644
--- a/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/CompilerTest.java
@@ -16,7 +16,6 @@
 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;
@@ -952,7 +951,6 @@
             ai = foo;
           }
 
-          @SuppressWarnings("ReturnValueIgnored")
           @Override
           public String toString() {
             // this line used to cause ICE due to no synthetic path to bar
@@ -969,14 +967,6 @@
     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 9b8e651..072974a 100644
--- a/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/InnerClassTest.java
@@ -111,90 +111,12 @@
     }
   }
 
-
-  /**
-   * 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 059d1c9..5bf60b0 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 = s.toString();
+      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 a615d1f..0285390 100644
--- a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
@@ -28,7 +28,6 @@
     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
deleted file mode 100644
index bdfe2f8..0000000
--- a/user/test/com/google/gwt/dev/jjs/test/compilertests/MethodNamedSameAsClass.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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 8eb5f6f..ff3a48c 100644
--- a/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
+++ b/user/test/com/google/gwt/dev/shell/test/MultiModuleTest.java
@@ -23,6 +23,7 @@
 import com.google.gwt.user.client.ui.VerticalPanel;
 
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 /**
@@ -110,14 +111,14 @@
    */
   public void testInnerModules() {
     String url = getURL();
-    Map<String, String> params = getURLParams(url);
+    Map 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 = params.get("frame");
+    String frameName = (String) params.get("frame");
     
     VerticalPanel panel = new VerticalPanel();
     RootPanel.get().add(panel);
@@ -166,7 +167,7 @@
     
     // build new URL from current one
     String url = getURL();
-    Map<String, String> params = getURLParams(url);
+    Map params = getURLParams(url);
     params.put("frame", "top");
     params.put("gwt.junit.testclassname", MultiModuleTest.class.getName());
     params.put("gwt.junit.testfuncname", "testInnerModules");
@@ -206,7 +207,7 @@
    * @param params a map of parameter names to values
    * @return the revised URL
    */
-  private String buildURL(String url, Map<String, String> params) {
+  private String buildURL(String url, Map params) {
 
     // strip off the query string if present
     int pos = url.indexOf("?");
@@ -224,8 +225,9 @@
     }
 
     // now add the rest of the parameters, excluding gwt.hybrid
-    for (Map.Entry<String, String> entry : params.entrySet()) {
-      String param = entry.getKey();
+    for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
+      Map.Entry entry = (Map.Entry) it.next();
+      String param = (String) entry.getKey();
 
       if (param.equals("gwt.hybrid")) {
         // we already included gwt.hybrid if it was present
@@ -242,7 +244,7 @@
       url += param;
 
       // add the value if necessary
-      String value = entry.getValue();
+      String value = (String) entry.getValue();
       if (value != null) {
         url += "=" + value;
       }
@@ -266,7 +268,7 @@
    */
   private void doneLoading() {
     String url = getURL();
-    Map<String, String> params = getURLParams(url);
+    Map params = getURLParams(url);
     mainPanel.add(new Label("done loading"));
     if (++state == 4) {
       // all tests complete, notify parent
@@ -304,8 +306,8 @@
    * @param url the full or partial (ie, only location.search) URL to parse
    * @return the map of parameter names to values
    */
-  private Map<String, String> getURLParams(String url) {
-    HashMap<String, String> map = new HashMap<String, String>();
+  private Map getURLParams(String url) {
+    HashMap map = new HashMap();
     int pos = url.indexOf("?");
     
     // loop precondition: pos is the index of the next ? or & character in url
@@ -370,7 +372,7 @@
    * 
    * @param frameNumber the number of the frame to replace, starting with 0
    */
-  private void toggleFrame(int frameNumber, String url, Map<String, String> params) {
+  private void toggleFrame(int frameNumber, String url, Map 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 a1e6145..f1e1950 100644
--- a/user/test/com/google/gwt/dom/client/ElementTest.java
+++ b/user/test/com/google/gwt/dom/client/ElementTest.java
@@ -40,45 +40,15 @@
     div.setClassName("foo");
     assertEquals("foo", div.getClassName());
 
-    assertTrue(div.addClassName("bar"));
+    div.addClassName("bar");
     assertEquals("foo bar", div.getClassName());
 
-    assertTrue(div.addClassName("baz"));
-    assertEquals("foo bar baz", div.getClassName());
-
-    assertFalse(div.addClassName("baz"));
+    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 0bd7a75..755ebef 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,43 +39,25 @@
 
     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) {
@@ -104,7 +86,6 @@
 
     private List<EditorError> errors;
 
-    @Override
     public void showErrors(List<EditorError> errors) {
       this.errors = errors;
     }
@@ -126,7 +107,6 @@
 
     List<EditorError> errors;
 
-    @Override
     public void showErrors(List<EditorError> errors) {
       this.errors = errors;
     }
@@ -287,7 +267,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());
@@ -304,7 +284,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());
@@ -312,7 +292,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());
@@ -320,7 +300,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());
@@ -329,7 +309,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());
@@ -344,8 +324,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());
@@ -355,46 +335,6 @@
     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/SimpleBeanEditorTest.java b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
index 81be530..6a1c2d7 100644
--- a/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
+++ b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
@@ -298,16 +298,6 @@
     }
   }
 
-  class TaggedItemAddressEditor implements Editor<TaggedItem<Address>> {
-    @Path("item.city") SimpleEditor<String> itemCityEditor = SimpleEditor.of(UNINITIALIZED);   
-    @Path("item.street") SimpleEditor<String> itemStreetEditor = SimpleEditor.of(UNINITIALIZED);   
-    @Path("tag") SimpleEditor<String> tagEditor = SimpleEditor.of(UNINITIALIZED);   
-  }
-
-  interface TaggedItemAddressEditorDriver extends
-      SimpleBeanEditorDriver<TaggedItem<Address>, TaggedItemAddressEditor> {
-  }
-
   Person person;
   Address personAddress;
   Person manager;
@@ -742,30 +732,6 @@
     assertEquals(1, addressEditor.setDelegateCalled);
   }
 
-  public void testEditorWithParameterizedModel() {
-    TaggedItemAddressEditorDriver driver = GWT.create(TaggedItemAddressEditorDriver.class);
-    TaggedItemAddressEditor editor = new TaggedItemAddressEditor();
-    driver.initialize(editor);
-
-    TaggedItem<Address> taggedAddress = new TaggedItem<Address>();
-    taggedAddress.setTag("tag1");
-    taggedAddress.setItem(personAddress);
-    driver.edit(taggedAddress);
-
-    assertEquals("tag1", editor.tagEditor.getValue());
-    assertEquals("City", editor.itemCityEditor.getValue());
-    assertEquals("Street", editor.itemStreetEditor.getValue());
-
-    editor.tagEditor.setValue("tag2");
-    editor.itemCityEditor.setValue("Town");
-    editor.itemStreetEditor.setValue("Road");
-    driver.flush();
-
-    assertEquals("tag2", taggedAddress.getTag());
-    assertEquals("Town", taggedAddress.getItem().getCity());
-    assertEquals("Road", taggedAddress.getItem().getStreet());
-  }
-
   @Override
   protected void gwtSetUp() throws Exception {
     personAddress = new Address();
diff --git a/user/test/com/google/gwt/editor/client/TaggedItem.java b/user/test/com/google/gwt/editor/client/TaggedItem.java
deleted file mode 100644
index a985393..0000000
--- a/user/test/com/google/gwt/editor/client/TaggedItem.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.editor.client;
-
-/**
- * Simple parameterized data object used in 
- * {@link SimpleBeanEditorTest#testEditorWithParameterizedModels()}.
- *
- * @param <T> type of the item
- */
-public class TaggedItem<T> {
-  private T item;
-  private String tag;
-
-  public T getItem() {
-    return item;
-  }
-
-  public String getTag() {
-    return tag;
-  }
-
-  public void setItem(T item) {
-    this.item = item;
-  }
-
-  public void setTag(String tag) {
-    this.tag = tag;
-  }
-}
-
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 8a5481e..9e400fa 100644
--- a/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
+++ b/user/test/com/google/gwt/editor/client/adapters/HasDataEditorTest.java
@@ -16,8 +16,6 @@
 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;
@@ -207,26 +205,6 @@
     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 {
@@ -235,14 +213,4 @@
     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 c5a6cc7..ac9adb3 100644
--- a/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/DoubleTest.java
@@ -23,7 +23,6 @@
  */
 public class DoubleTest extends GWTTestCase {
 
-  @Override
   public String getModuleName() {
     return "com.google.gwt.emultest.EmulSuite";
   }
@@ -78,7 +77,7 @@
       // Expected behavior
     }
   }
-
+  
   public void testCompare() {
     assertTrue(Double.compare(Double.NaN, Double.NaN) == 0);
     assertTrue(Double.compare(0.0, Double.NaN) < 0);
@@ -89,14 +88,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);
@@ -137,7 +136,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"));
@@ -152,47 +151,12 @@
     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 15c6718..7c2b559 100644
--- a/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/FloatTest.java
@@ -93,41 +93,6 @@
 //        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 f1124f6..c307636 100644
--- a/user/test/com/google/gwt/emultest/java/lang/LongTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/LongTest.java
@@ -93,9 +93,6 @@
     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 07b4ebb..2266c08 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -424,27 +424,18 @@
     assertEquals("", "".toLowerCase());
   }
 
+  /*
+   * TODO: needs rewriting to avoid compiler optimizations.
+   */
   public void testMatch() {
-    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$"));
+    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"));
   }
 
   /*
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 f3b4a3d..981e59a 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 = aNumber.divide(bNumber);
+      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 = aNumber.divide(bNumber, 100);
+      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 = aNumber.divide(bNumber, BigDecimal.ROUND_UNNECESSARY);
+      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 = arg1.divide(arg2, Integer.MAX_VALUE, RoundingMode.CEILING);
+      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,20 +1523,17 @@
     
     // 1 digit left of dp, 14 scale + 1
     val = BigDecimal.valueOf(5.43445663479765);
-    val =
-        val.setScale(val.scale() + 1, RoundingMode.CEILING).round(new
+    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 =
-        val.setScale(val.scale() + 2, RoundingMode.CEILING).round(new
+    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 =
-        test.setScale(test.scale() + 1, RoundingMode.CEILING).round(new
+    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 474ce3a..794309e 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalCompareTest.java
@@ -248,23 +248,6 @@
   }
 
   /**
-   * 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 15bdee8..aa5765c 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalConstructorsTest.java
@@ -687,19 +687,11 @@
   }
 
   /**
-   * 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.
+   * Test second failing example in gwt-java-math issue 4.
    */
   public void testConstrStringWithLeadingZeros() {
-    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());
+    BigDecimal value = new BigDecimal("-000.1");
+    assertEquals("bad precision", 1, value.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 5f5dd96..0547078 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigDecimalConvertTest.java
@@ -512,7 +512,6 @@
   /**
    * 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 e1b45fb..5323bc7 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 = aNumber.setScale(newScale);
+      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 = aNumber.movePointRight(shift);
+      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 37f569f..1e119cb 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 = aNumber.divide(bNumber);
+      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 = aNumber.remainder(bNumber);
+      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 = aNumber.divide(bNumber);
+      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 = aNumber.mod(bNumber);
+      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 33bda42..a107b6b 100644
--- a/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
+++ b/user/test/com/google/gwt/emultest/java/math/BigIntegerHashCodeTest.java
@@ -63,7 +63,6 @@
   /**
    * 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 96fb58f..ce676ff 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 = aNumber.modInverse(modulus);
+      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 = aNumber.modInverse(modulus);
+      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 = aNumber.modPow(exp, modulus);
+      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 c9d9eac..06157f4 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 = aNumber.pow(exp);
+      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 6e6d3a8..9ef9e27 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 = aNumber.clearBit(number);
+      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 = aNumber.flipBit(number);
+      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 = aNumber.setBit(number);
+      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 e46d534..939e75e 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<Object> makeComparator() {
+  public Comparator makeComparator() {
     return new DummyComparator();
   }
 
-  public List<Object> getComparableObjectsOrdered() {
-    List<Object> l = new ArrayList<Object>();
+  public List getComparableObjectsOrdered() {
+    List l = new ArrayList();
     l.add("x");
     l.add("y");
     l.add("z");
@@ -41,7 +41,7 @@
 /**
  * List comparator for testing.
  */
-class DummyComparator implements Comparator<Object> {
+class DummyComparator implements Comparator {
   /**
    * 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 2b78350..2f7be81 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashMapTest.java
@@ -25,10 +25,12 @@
 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;
@@ -88,7 +90,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 {
@@ -103,7 +105,7 @@
    * 
    * @param hashMap
    */
-  private static void checkEmptyHashMapAssumptions(HashMap<?, ?> hashMap) {
+  private static void checkEmptyHashMapAssumptions(HashMap hashMap) {
     assertNotNull(hashMap);
     assertTrue(hashMap.isEmpty());
 
@@ -128,7 +130,7 @@
   }
 
   public void testAddEqualKeys() {
-    final HashMap<Number, Object> expected = new HashMap<Number, Object>();
+    final HashMap expected = new HashMap();
     assertEquals(expected.size(), 0);
     iterateThrough(expected);
     expected.put(new Long(45), new Object());
@@ -141,7 +143,7 @@
   }
 
   public void testAddWatch() {
-    HashMap<String, String> m = new HashMap<String, String>();
+    HashMap m = new HashMap();
     m.put("watch", "watch");
     assertEquals(m.get("watch"), "watch");
   }
@@ -150,7 +152,7 @@
    * Test method for 'java.util.HashMap.clear()'
    */
   public void testClear() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     hashMap.put("Hello", "Bye");
@@ -166,10 +168,11 @@
    * Test method for 'java.util.HashMap.clone()'
    */
   public void testClone() {
-    HashMap<String, String> srcMap = new HashMap<String, String>();
+    HashMap srcMap = new HashMap();
     checkEmptyHashMapAssumptions(srcMap);
 
-    HashMap<String, String> dstMap = cloneMap(srcMap);
+    // Check empty clone behavior
+    HashMap dstMap = (HashMap) srcMap.clone();
     assertNotNull(dstMap);
     assertEquals(dstMap.size(), srcMap.size());
     // assertTrue(dstMap.values().toArray().equals(srcMap.values().toArray()));
@@ -180,7 +183,7 @@
     srcMap.put(KEY_1, VALUE_1);
     srcMap.put(KEY_2, VALUE_2);
     srcMap.put(KEY_3, VALUE_3);
-    dstMap = cloneMap(srcMap);
+    dstMap = (HashMap) srcMap.clone();
     assertNotNull(dstMap);
     assertEquals(dstMap.size(), srcMap.size());
 
@@ -193,7 +196,7 @@
    * Test method for 'java.util.HashMap.containsKey(Object)'
    */
   public void testContainsKey() {
-    HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertFalse(hashMap.containsKey(KEY_TEST_CONTAINS_KEY));
@@ -210,7 +213,7 @@
    * Test method for 'java.util.HashMap.containsValue(Object)'
    */
   public void testContainsValue() {
-    HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertFalse("check contains of empty map",
@@ -230,18 +233,18 @@
    * Test method for 'java.util.HashMap.entrySet()'
    */
   public void testEntrySet() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
-    Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
+    Set 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<Map.Entry<String, String>> itSet = entrySet.iterator();
-    Map.Entry<String, String> entry = itSet.next();
+    Iterator itSet = entrySet.iterator();
+    Map.Entry entry = (Map.Entry) itSet.next();
     assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
     assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_1);
     assertEmptyIterator(itSet);
@@ -251,7 +254,7 @@
     entrySet = hashMap.entrySet();
     assertEquals(entrySet.size(), SIZE_ONE);
     itSet = entrySet.iterator();
-    entry = itSet.next();
+    entry = (Map.Entry) itSet.next();
     assertEquals(entry.getKey(), KEY_TEST_ENTRY_SET);
     assertEquals(entry.getValue(), VALUE_TEST_ENTRY_SET_2);
     assertEmptyIterator(itSet);
@@ -265,16 +268,16 @@
    * Used to test the entrySet entry's set method.
    */
   public void testEntrySetEntrySetterNonString() {
-    HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
+    HashMap hashMap = new HashMap();
     hashMap.put(1, 2);
-    Set<Map.Entry<Integer, Integer>> entrySet = hashMap.entrySet();
-    Map.Entry<Integer, Integer> entry = entrySet.iterator().next();
+    Set entrySet = hashMap.entrySet();
+    Entry entry = (Entry) entrySet.iterator().next();
 
     entry.setValue(3);
-    assertEquals(3, hashMap.get(1).intValue());
+    assertEquals(3, hashMap.get(1));
 
     hashMap.put(1, 4);
-    assertEquals(4, entry.getValue().intValue());
+    assertEquals(4, entry.getValue());
 
     assertEquals(1, hashMap.size());
   }
@@ -283,16 +286,16 @@
    * Used to test the entrySet entry's set method.
    */
   public void testEntrySetEntrySetterNull() {
-    HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
+    HashMap hashMap = new HashMap();
     hashMap.put(null, 2);
-    Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();
-    Map.Entry<String, Integer> entry = entrySet.iterator().next();
+    Set entrySet = hashMap.entrySet();
+    Entry entry = (Entry) entrySet.iterator().next();
 
     entry.setValue(3);
-    assertEquals(3, hashMap.get(null).intValue());
+    assertEquals(3, hashMap.get(null));
 
     hashMap.put(null, 4);
-    assertEquals(4, entry.getValue().intValue());
+    assertEquals(4, entry.getValue());
 
     assertEquals(1, hashMap.size());
   }
@@ -301,10 +304,10 @@
    * Used to test the entrySet entry's set method.
    */
   public void testEntrySetEntrySetterString() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     hashMap.put("A", "B");
-    Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
-    Map.Entry<String, String> entry = entrySet.iterator().next();
+    Set entrySet = hashMap.entrySet();
+    Entry entry = (Entry) entrySet.iterator().next();
 
     entry.setValue("C");
     assertEquals("C", hashMap.get("A"));
@@ -319,12 +322,12 @@
    * Used to test the entrySet remove method.
    */
   public void testEntrySetRemove() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     hashMap.put("A", "B");
-    HashMap<String, String> dummy = new HashMap<String, String>();
+    HashMap dummy = new HashMap();
     dummy.put("A", "b");
-    Map.Entry<String, String> bogus = dummy.entrySet().iterator().next();
-    Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
+    Entry bogus = (Entry) dummy.entrySet().iterator().next();
+    Set entrySet = hashMap.entrySet();
     boolean removed = entrySet.remove(bogus);
     assertEquals(removed, false);
     assertEquals(hashMap.get("A"), "B");
@@ -334,23 +337,18 @@
    * Test method for 'java.util.AbstractMap.equals(Object)'
    */
   public void testEquals() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     hashMap.put(KEY_KEY, VALUE_VAL);
 
-    HashMap<String, String> copyMap = cloneMap(hashMap);
+    HashMap copyMap = (HashMap) hashMap.clone();
 
     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()'.
    */
@@ -362,7 +360,7 @@
    * Test method for 'java.util.HashMap.get(Object)'.
    */
   public void testGet() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.get(KEY_TEST_GET));
@@ -381,7 +379,7 @@
    * Test method for 'java.util.AbstractMap.hashCode()'.
    */
   public void testHashCode() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     // Check that hashCode changes
@@ -396,7 +394,7 @@
    * Test method for 'java.util.HashMap.HashMap()'.
    */
   public void testHashMap() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
   }
 
@@ -404,13 +402,13 @@
    * Test method for 'java.util.HashMap.HashMap(int)'
    */
   public void testHashMapInt() {
-    HashMap<String, String> hashMap = new HashMap<String, String>(CAPACITY_16);
+    HashMap hashMap = new HashMap(CAPACITY_16);
     checkEmptyHashMapAssumptions(hashMap);
 
     // TODO(mmendez): how do we verify capacity?
     boolean failed = true;
     try {
-      new HashMap<String, String>(-SIZE_ONE);
+      new HashMap(-SIZE_ONE);
     } catch (Throwable ex) {
       if (ex instanceof IllegalArgumentException) {
         failed = false;
@@ -421,7 +419,7 @@
       fail("Failure testing new HashMap(-1)");
     }
 
-    HashMap<String, String> zeroSizedHashMap = new HashMap<String, String>(0);
+    HashMap zeroSizedHashMap = new HashMap(0);
     assertNotNull(zeroSizedHashMap);
   }
 
@@ -429,8 +427,8 @@
    * Test method for 'java.util.HashMap.HashMap(int, float)'
    */
   public void testHashMapIntFloat() {
-    HashMap<String, String> hashMap =
-        new HashMap<String, String>(CAPACITY_16, LOAD_FACTOR_ONE_HALF);
+
+    HashMap hashMap = new HashMap(CAPACITY_16, LOAD_FACTOR_ONE_HALF);
     checkEmptyHashMapAssumptions(hashMap);
 
     // TODO(mmendez): how do we verify capacity and load factor?
@@ -438,7 +436,7 @@
     // Test new HashMap(-1, 0.0F)
     boolean failed = true;
     try {
-      new HashMap<String, String>(CAPACITY_NEG_ONE_HALF, LOAD_FACTOR_ZERO);
+      new HashMap(CAPACITY_NEG_ONE_HALF, LOAD_FACTOR_ZERO);
     } catch (Throwable ex) {
       if (ex instanceof IllegalArgumentException) {
         failed = false;
@@ -452,7 +450,7 @@
     // Test new HashMap(0, -1.0F)
     failed = true;
     try {
-      new HashMap<String, String>(CAPACITY_ZERO, LOAD_FACTOR_NEG_ONE);
+      new HashMap(CAPACITY_ZERO, LOAD_FACTOR_NEG_ONE);
     } catch (Throwable ex) {
       if (ex instanceof IllegalArgumentException) {
         failed = false;
@@ -464,7 +462,7 @@
     }
 
     // Test new HashMap(0,0F);
-    hashMap = new HashMap<String, String>(CAPACITY_ZERO, LOAD_FACTOR_ONE_TENTH);
+    hashMap = new HashMap(CAPACITY_ZERO, LOAD_FACTOR_ONE_TENTH);
     assertNotNull(hashMap);
   }
 
@@ -472,7 +470,7 @@
    * Test method for 'java.util.HashMap.HashMap(Map)'
    */
   public void testHashMapMap() {
-    HashMap<Integer, Integer> srcMap = new HashMap<Integer, Integer>();
+    HashMap srcMap = new HashMap();
     assertNotNull(srcMap);
     checkEmptyHashMapAssumptions(srcMap);
 
@@ -480,16 +478,16 @@
     srcMap.put(INTEGER_2, INTEGER_22);
     srcMap.put(INTEGER_3, INTEGER_33);
 
-    HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>(srcMap);
+    HashMap hashMap = new HashMap(srcMap);
     assertFalse(hashMap.isEmpty());
     assertTrue(hashMap.size() == SIZE_THREE);
 
-    Collection<Integer> valColl = hashMap.values();
+    Collection valColl = hashMap.values();
     assertTrue(valColl.contains(INTEGER_11));
     assertTrue(valColl.contains(INTEGER_22));
     assertTrue(valColl.contains(INTEGER_33));
 
-    Collection<Integer> keyColl = hashMap.keySet();
+    Collection keyColl = hashMap.keySet();
     assertTrue(keyColl.contains(INTEGER_1));
     assertTrue(keyColl.contains(INTEGER_2));
     assertTrue(keyColl.contains(INTEGER_3));
@@ -499,10 +497,10 @@
    * Test method for 'java.util.AbstractMap.isEmpty()'
    */
   public void testIsEmpty() {
-    HashMap<String, String> srcMap = new HashMap<String, String>();
+    HashMap srcMap = new HashMap();
     checkEmptyHashMapAssumptions(srcMap);
 
-    HashMap<String, String> dstMap = new HashMap<String, String>();
+    HashMap dstMap = new HashMap();
     checkEmptyHashMapAssumptions(dstMap);
 
     dstMap.putAll(srcMap);
@@ -517,7 +515,7 @@
   }
 
   public void testKeysConflict() {
-    HashMap<Object, String> hashMap = new HashMap<Object, String>();
+    HashMap hashMap = new HashMap();
 
     hashMap.put(STRING_ZERO_KEY, STRING_ZERO_VALUE);
     hashMap.put(INTEGER_ZERO_KEY, INTEGER_ZERO_VALUE);
@@ -544,10 +542,10 @@
    * Test method for 'java.util.HashMap.keySet()'
    */
   public void testKeySet() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
-    Set<String> keySet = hashMap.keySet();
+    Set keySet = hashMap.keySet();
     assertNotNull(keySet);
     assertTrue(keySet.isEmpty());
     assertTrue(keySet.size() == 0);
@@ -591,7 +589,7 @@
    * Test method for 'java.util.HashMap.put(Object, Object)'
    */
   public void testPut() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.put(KEY_TEST_PUT, VALUE_TEST_PUT_1));
@@ -604,7 +602,7 @@
    * Test method for 'java.util.HashMap.putAll(Map)'.
    */
   public void testPutAll() {
-    HashMap<String, String> srcMap = new HashMap<String, String>();
+    HashMap srcMap = new HashMap();
     checkEmptyHashMapAssumptions(srcMap);
 
     srcMap.put(KEY_1, VALUE_1);
@@ -612,7 +610,7 @@
     srcMap.put(KEY_3, VALUE_3);
 
     // Make sure that the data is copied correctly
-    HashMap<String, String> dstMap = new HashMap<String, String>();
+    HashMap dstMap = new HashMap();
     checkEmptyHashMapAssumptions(dstMap);
 
     dstMap.putAll(srcMap);
@@ -634,7 +632,7 @@
 
     // Check that an empty map does not blow away the contents of the
     // destination map
-    HashMap<String, String> emptyMap = new HashMap<String, String>();
+    HashMap emptyMap = new HashMap();
     checkEmptyHashMapAssumptions(emptyMap);
     dstMap.putAll(emptyMap);
     assertTrue(dstMap.size() == srcMap.size());
@@ -669,7 +667,7 @@
    * Test method for 'java.util.HashMap.remove(Object)'.
    */
   public void testRemove() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNull(hashMap.remove(null));
@@ -685,7 +683,7 @@
    * Test method for 'java.util.HashMap.size()'.
    */
   public void testSize() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     // Test size behavior on put
@@ -709,7 +707,7 @@
     hashMap.put(KEY_1, VALUE_1);
     hashMap.put(KEY_2, VALUE_2);
     hashMap.put(KEY_3, VALUE_3);
-    HashMap<String, String> srcMap = new HashMap<String, String>(hashMap);
+    HashMap srcMap = new HashMap(hashMap);
     hashMap.putAll(srcMap);
     assertEquals(hashMap.size(), SIZE_THREE);
 
@@ -722,7 +720,7 @@
    * Test method for 'java.util.AbstractMap.toString()'.
    */
   public void testToString() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
     hashMap.put(KEY_KEY, VALUE_VAL);
     String entryString = makeEntryString(KEY_KEY, VALUE_VAL);
@@ -733,33 +731,33 @@
    * Test method for 'java.util.AbstractMap.values()'.
    */
   public void testValues() {
-    HashMap<String, String> hashMap = new HashMap<String, String>();
+    HashMap hashMap = new HashMap();
     checkEmptyHashMapAssumptions(hashMap);
 
     assertNotNull(hashMap.values());
 
     hashMap.put(KEY_KEY, VALUE_VAL);
 
-    Collection<String> valColl = hashMap.values();
+    Collection valColl = hashMap.values();
     assertNotNull(valColl);
     assertEquals(valColl.size(), SIZE_ONE);
 
-    Iterator<String> itVal = valColl.iterator();
-    String val = itVal.next();
+    Iterator itVal = valColl.iterator();
+    String val = (String) itVal.next();
     assertEquals(val, VALUE_VAL);
   }
 
-  @SuppressWarnings("rawtypes")
   @Override
   protected Map makeEmptyMap() {
     return new HashMap();
   }
 
-  private void iterateThrough(final HashMap<?, ?> expected) {
-    Iterator<?> iter = expected.entrySet().iterator();
+  private Iterator 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 0a0b793..65c7e5a 100644
--- a/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/HashSetTest.java
@@ -32,23 +32,21 @@
   }
 
   public void testAddingKeys() {
-    Map<Object, Object> map = new HashMap<Object, Object>();
-    Set<Object> keys = new HashSet<Object>(map.keySet());
+    Map map = new HashMap();
+    Set keys = new HashSet(map.keySet());
     keys.add(new Object()); // Throws exception in IE6 (web-mode) but not GWT
   }
 
   public void testAddWatch() {
-    HashSet<String> s = new HashSet<String>();
+    HashSet s = new HashSet();
     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 4ad811a..cea9f19 100644
--- a/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/IdentityHashMapTest.java
@@ -24,13 +24,12 @@
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
+import java.util.Map.Entry;
 
 /**
  * Tests <code>IdentityHashMap</code>.
  */
-@SuppressWarnings({"unchecked", "rawtypes"})
 public class IdentityHashMapTest extends TestMap {
 
   /**
@@ -50,6 +49,8 @@
   }
 
   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);
@@ -70,6 +71,10 @@
   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 1d06fd5..ed8c804 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.LinkedHashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
+import java.util.Map.Entry;
+import java.util.LinkedHashMap;
 
 /**
  * Tests <code>LinkedHashMap</code>.
@@ -119,7 +119,8 @@
    * 
    * @param hashMap
    */
-  private static void checkEmptyLinkedHashMapAssumptions(LinkedHashMap<?, ?> hashMap) {
+  @SuppressWarnings("unchecked") // raw LinkedHashMap
+  private static void checkEmptyLinkedHashMapAssumptions(LinkedHashMap hashMap) {
     assertNotNull(hashMap);
     assertTrue(hashMap.isEmpty());
 
@@ -753,11 +754,12 @@
    * @param hashMap the LinkedHashMap to be copied
    * @return the copy
    */
-  private <K, V> LinkedHashMap<K, V> cloneLinkedHashMap(LinkedHashMap<K, V> hashMap) {
+  @SuppressWarnings("unchecked") // raw LinkedHashMap
+  private LinkedHashMap cloneLinkedHashMap(LinkedHashMap hashMap) {
     if (GWT.isScript()) {
-      return new LinkedHashMap<K, V>(hashMap);
+      return new LinkedHashMap(hashMap);
     } else {
-      LinkedHashMap<K, V> m = new LinkedHashMap<K, V>();
+      LinkedHashMap m = new LinkedHashMap();
       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 e755168..fa941c9 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<String> s = new Stack<String>();
+    Stack s = new Stack();
     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 bcc1070..28e3930 100644
--- a/user/test/com/google/gwt/emultest/java/util/StackTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/StackTest.java
@@ -25,129 +25,12 @@
  */
 public class StackTest extends GWTTestCase {
 
-  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;
-  }
+  public static final int TEST_SEARCH_SIZE = 10;
+  public static final int TEST_SIZE = 10;
+  public static Stack testStack = new Stack();
 
   /** Checks for emptiness of stack by peeking and popping. */
-  private void checkEmptiness(Stack<?> s) {
+  public void checkEmptiness(Stack s) {
     assertTrue(s.empty());
     try {
       s.pop();
@@ -161,4 +44,120 @@
       }
     }
   }
+
+  /** 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 59a5f66..30ea28e 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,7 +943,6 @@
     assertEquals(1, keySet.size());
   }
 
-  @SuppressWarnings("unchecked")
   public void testKeySetIteratorRemove() {
     Map<K, V> map = makeFullMap();
     resetFull();
@@ -1542,7 +1541,6 @@
    * 
    * @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 9926f14..38b75b2 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 0f31fac..7046195 100644
--- a/user/test/com/google/gwt/http/client/RequestTest.java
+++ b/user/test/com/google/gwt/http/client/RequestTest.java
@@ -127,32 +127,4 @@
       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 e267650..ec631b4 100644
--- a/user/test/com/google/gwt/http/server/RequestTestServlet.java
+++ b/user/test/com/google/gwt/http/server/RequestTestServlet.java
@@ -29,16 +29,12 @@
 
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
-    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);
+    try {
+      Thread.sleep(5000);
+    } catch (InterruptedException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
     }
+    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 dc1864b..9906f51 100644
--- a/user/test/com/google/gwt/i18n/I18NSuite.java
+++ b/user/test/com/google/gwt/i18n/I18NSuite.java
@@ -43,7 +43,6 @@
 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;
@@ -111,7 +110,6 @@
     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 475a3e4..2901dd2 100644
--- a/user/test/com/google/gwt/i18n/MapTestBase.java
+++ b/user/test/com/google/gwt/i18n/MapTestBase.java
@@ -106,7 +106,6 @@
  * @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 7360286..54d4803 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,11 +74,6 @@
     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 0d0c9be..c1578c0 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 88da5d9..ede08e8 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
deleted file mode 100644
index df9e59b..0000000
--- a/user/test/com/google/gwt/i18n/client/PolishPluralsTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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
deleted file mode 100644
index ee22380..0000000
--- a/user/test/com/google/gwt/i18n/client/PolishPluralsTest_PluralMessage_pl.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-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 a998bc9..1ae3c80 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 = location.pathname;
+  var moduleName = document.location.href;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+  document.write("<script language='javascript' src='" + 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 31c0114..e30fb7b 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 = location.pathname;
+  var moduleName = document.location.href;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+  document.write("<script language='javascript' src='" + 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 db0b393..da44249 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 = location.pathname;
+  var moduleName = document.location.href;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+  document.write("<script language='javascript' src='" + 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 924012c..0de069d 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 = location.pathname;
+  var moduleName = document.location.href;
   var pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(0, pos);
   pos = moduleName.lastIndexOf('/');
   moduleName = moduleName.substr(pos + 1);
-  document.write('<script language="javascript" src="' + encodeURIComponent(moduleName) + '.nocache.js"><\/script>');
+  document.write("<script language='javascript' src='" + 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
deleted file mode 100644
index dc76900..0000000
--- a/user/test/com/google/gwt/junit/ExpectedFailure.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 22c3cb8..0000000
--- a/user/test/com/google/gwt/junit/ForwardingTestResult.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 2b3ebf4..0000000
--- a/user/test/com/google/gwt/junit/GwtTestSuiteWithExpectedFailures.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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 eba96f3..e225dff 100644
--- a/user/test/com/google/gwt/junit/JUnitSuite.java
+++ b/user/test/com/google/gwt/junit/JUnitSuite.java
@@ -16,29 +16,24 @@
 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() {
-    TestSuite suite = new GwtTestSuiteWithExpectedFailures("Test suite for com.google.gwt.junit");
+    GWTTestSuite suite = new GWTTestSuite(
+        "Test for 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.
@@ -50,8 +45,9 @@
     suite.addTestSuite(JUnitMessageQueueTest.class);
     suite.addTestSuite(GWTTestCaseNoClientTest.class);
 
-    // Intended only to be run manually. See class comments
+    // These two are 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
deleted file mode 100644
index 555d8da..0000000
--- a/user/test/com/google/gwt/junit/TestResultWithExpectedFailures.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 459b477..0000000
--- a/user/test/com/google/gwt/junit/TestSuiteWithOrder.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 5342fa0..0000000
--- a/user/test/com/google/gwt/junit/client/GWTTestCaseAsyncTest.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * 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
deleted file mode 100644
index d93cef2..0000000
--- a/user/test/com/google/gwt/junit/client/GWTTestCaseSetupTearDownTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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 1146b89..2d151f4 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,22 +20,43 @@
  */
 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 {
@@ -46,7 +67,8 @@
     }
 
     if (!failed) {
-      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta + ")");
+      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta
+          + ")");
     }
   }
 
@@ -60,35 +82,20 @@
     }
 
     if (!failed) {
-      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta + ")");
+      fail("Expected failure for assertEquals(" + a + ", " + b + ", " + delta
+          + ")");
     }
   }
-  
-  private Object obj1 = Collections.nCopies(1, "data");
-  private Object obj2 = Collections.nCopies(2, "data");
-  private Object obj1Equal = Collections.nCopies(1, "data");
+
+  /**
+   * Tracks whether this test has been setup and torn down.
+   */
+  protected SetUpTearDownState setupTeardownFlag = INITIAL;
 
   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);
@@ -123,126 +130,241 @@
     assertNotEquals(-2.0f, -1.0f, 0.1f);
   }
 
+  /**
+   * 
+   */
   public void testAssertEqualsIntInt() {
     assertEquals(5, 5);
-    assertEquals("msg", 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");
+    }
   }
 
-  @ExpectedFailure
-  public void testAssertEqualsIntIntFail() {
-    assertEquals(5, 4);
-  }
-
-  @ExpectedFailure(withMessage = "msg")
-  public void testAssertEqualsIntIntFailWithMessage() {
-    assertEquals("msg", 5, 4);
-  }
-
+  /**
+   * 
+   */
   public void testAssertEqualsObjectObject() {
-    assertEquals(obj1, obj1Equal);
+    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("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);
-    assertFalse("msg", 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");
+    }
   }
 
-  @ExpectedFailure
-  public void testAssertFalseFail() {
-    assertFalse(true);
-  }
-
-  @ExpectedFailure(withMessage = "msg")
-  public void testAssertFalseFailWithMessage() {
-    assertFalse("msg", true);
-  }
-
+  /**
+   * 
+   */
   public void testAssertNotNull() {
     assertNotNull("Hello");
-    assertNotNull("msg", "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");
   }
 
-  @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("msg", obj1, obj2);
-    assertNotSame(obj1, obj1Equal);
-    assertNotSame("msg", obj1, obj1Equal);
+    assertNotSame("Hello", obj1, obj2);
+
+    try {
+      assertNotSame(obj1, "Baz");
+    } catch (Throwable ex) {
+      if (!(ex instanceof AssertionFailedError)) {
+        fail("Unexpected type of exception");
+      }
+    }
   }
 
-  @ExpectedFailure
-  public void testAssertNotSameFail() {
-    assertNotSame(obj1, obj1);
-  }
-
-  @ExpectedFailure(withMessage = "msg")
-  public void testAssertNotSameFailWithMessage() {
-    assertNotSame("msg", obj1, obj1);
-  }
-
+  /**
+   * 
+   */
   public void testAssertNull() {
     assertNull(null);
-    assertNull("msg", 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");
   }
 
-  @ExpectedFailure
-  public void testAssertNullFail() {
-    assertNull("Hello");
-  }
-
-  @ExpectedFailure(withMessage = "msg")
-  public void testAssertNullFailWithMessage() {
-    assertNull("msg", "Hello");
-  }
-
+  /**
+   * 
+   */
   public void testAssertSame() {
-    assertSame(obj1, obj1);
-    assertSame("msg", obj1, obj1);
+    // TODO(mmendez): finish this test
   }
 
-  @ExpectedFailure
-  public void testAssertSameFail() {
-    assertSame(obj1, obj1Equal);
-  }
-
-  @ExpectedFailure(withMessage = "msg")
-  public void testAssertSameFailWithMessage() {
-    assertSame("msg", obj1, obj1Equal);
-  }
-
+  /**
+   * 
+   */
   public void testAssertTrue() {
     assertTrue(true);
-    assertTrue("msg", true);
-  }
+    assertTrue("We should be okay", true);
 
-  @ExpectedFailure
-  public void testAssertTrueFail() {
-    assertTrue(false);
-  }
+    try {
+      assertTrue(false);
+    } catch (Throwable ex) {
+      if (!(ex instanceof AssertionFailedError)) {
+        fail("Unexpected type of exception during assertFalse(boolean) testing");
+      }
+    }
 
-  @ExpectedFailure(withMessage = "msg")
-  public void testAssertTrueFailWithMessage() {
-    assertTrue("msg", false);
+    try {
+      assertTrue("This should be okay", false);
+    } catch (Throwable ex) {
+      if (ex instanceof AssertionFailedError) {
+        return;
+      }
+    }
+
+    fail("Unexpected exception during assertTrue(String, boolean) testing");
   }
 
   /**
@@ -260,4 +382,74 @@
   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
new file mode 100644
index 0000000..907d252
--- /dev/null
+++ b/user/test/com/google/gwt/junit/client/TestManualAsync.java
@@ -0,0 +1,347 @@
+/*
+ * 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 129ddcc..eac839f 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,6 +56,7 @@
   private Element wrapper0, wrapper1;
   private Layout layout;
   private Layer layer0, layer1;
+  private boolean resized;
 
   @Override
   public String getModuleName() {
@@ -306,7 +307,7 @@
   @DoNotRunWith(Platform.HtmlUnitLayout)
   public void testStaticConstraints() {
     // This test assumes enough size. Ignore it if size cannot be guaranteed.
-    if (!ResizeHelper.isResizeSupported()) {
+    if (!resized) {
       return;
     }
 
@@ -349,7 +350,7 @@
   @DoNotRunWith(Platform.HtmlUnitLayout)
   public void testUnits() {
     // This test assumes enough size. Ignore it if size cannot be guaranteed.
-    if (!ResizeHelper.isResizeSupported()) {
+    if (!resized) {
       return;
     }
 
@@ -439,7 +440,7 @@
   @Override
   protected void gwtSetUp() throws Exception {
     // ensure enough sizes for this test
-    ResizeHelper.resizeTo(800, 600);
+    resized = WindowTest.ResizeHelper.resizeTo(800, 600);
 
     Window.enableScrolling(false);
 
@@ -465,6 +466,7 @@
     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 b2e8f8e..7467a60 100644
--- a/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
+++ b/user/test/com/google/gwt/resources/css/CssNodeClonerTest.java
@@ -56,16 +56,6 @@
     }
   }
 
-  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
deleted file mode 100644
index fef5ea5..0000000
--- a/user/test/com/google/gwt/resources/css/media.css
+++ /dev/null
@@ -1,17 +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.
- */
-
-@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 81af5a1..f8ec5e2 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()));
+    assertEquals(expected, converter.convert(before, new FieldReferenceDelegate(null)));
   }
   
   public void testNoneShouldFail() {
     String before = "able.baker.charlie.prawns";
     try {
-      converter.convert(before, new FieldReferenceDelegate());
+      converter.convert(before, new FieldReferenceDelegate(null));
       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());
+      converter.convert(before, new FieldReferenceDelegate(null));
       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());
+      converter.convert(before, new FieldReferenceDelegate(null));
       fail();
     } catch (IllegalFieldReferenceException e) {
       /* pass */
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java b/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java
index 934becf..8f6c53e 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiRendererEventsTest.java
@@ -170,7 +170,7 @@
     bazReceiver = new MockBazReceiver();
 
     uiParent = Document.get().createDivElement();
-    uiParent.setInnerSafeHtml(renderedUi);
+    uiParent.setInnerHTML(renderedUi.asString());
     Document.get().getBody().appendChild(uiParent);
 
     uiRoot = Element.as(uiParent.getChild(0));
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java b/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
index b97a9e4..b5a5ef5 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
@@ -51,7 +51,7 @@
     renderer = UiRendererUi.getRenderer();
 
     docDiv = Document.get().createDivElement();
-    docDiv.setInnerSafeHtml(renderedHtml);
+    docDiv.setInnerHTML(renderedHtml.asString());
     Document.get().getBody().appendChild(docDiv);
   }
 
diff --git a/user/test/com/google/gwt/user/MiscSuite.java b/user/test/com/google/gwt/user/MiscSuite.java
deleted file mode 100644
index 888f903..0000000
--- a/user/test/com/google/gwt/user/MiscSuite.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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 96b74fc..c2459a2 100644
--- a/user/test/com/google/gwt/user/RPCSuite.java
+++ b/user/test/com/google/gwt/user/RPCSuite.java
@@ -49,6 +49,20 @@
 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;
 
@@ -70,7 +84,24 @@
     GWTTestSuite suite = new GWTTestSuite(
         "Test for com.google.gwt.user.client.rpc");
 
-    // Non GWTTestCases: see RpcSuiteNoBrowser
+    // 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);
 
     // GWTTestCases
     suite.addTestSuite(ValueTypesTest.class);
@@ -88,8 +119,6 @@
     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
deleted file mode 100644
index 5756bcc..0000000
--- a/user/test/com/google/gwt/user/RpcSuiteNoBrowser.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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
new file mode 100644
index 0000000..9de41d8
--- /dev/null
+++ b/user/test/com/google/gwt/user/UISuite.java
@@ -0,0 +1,246 @@
+/*
+ * 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
deleted file mode 100644
index 74e7d67..0000000
--- a/user/test/com/google/gwt/user/UiPart1Suite.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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
deleted file mode 100644
index cde0c66..0000000
--- a/user/test/com/google/gwt/user/UiPart2Suite.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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 1b74f13..3e1177e 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractCellTableTestBase.java
@@ -269,23 +269,16 @@
   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 inside the child div.
+    // Trigger an event at index 5.
     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
deleted file mode 100644
index 1a267eb..0000000
--- a/user/test/com/google/gwt/user/client/ResizeHelper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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 10d1e8a..085a91d 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -16,14 +16,11 @@
 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.URL;
 import com.google.gwt.http.client.UrlBuilder;
+import com.google.gwt.http.client.URL;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 import com.google.gwt.junit.client.GWTTestCase;
@@ -225,7 +222,7 @@
     largeDOM.setPixelSize(oldClientWidth + 100, oldClientHeight + 100);
     RootPanel.get().add(largeDOM);
     delayTestFinish(1000);
-    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+    DeferredCommand.addCommand(new Command() {
       public void execute() {
         int newClientHeight = Window.getClientHeight();
         int newClientWidth = Window.getClientWidth();
@@ -237,15 +234,118 @@
     });
   }
 
+  /**
+   * 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() {
@@ -255,10 +355,6 @@
     public int getWidth() {
       return width;
     }
-
-    public boolean isCalled() {
-      return called;
-    }
   }
 
   /**
@@ -266,37 +362,42 @@
    */
   @DoNotRunWith({Platform.HtmlUnitLayout})
   public void testResizing() {
-    // There is nothing to test if the browser doesn't support resize
-    if (!ResizeHelper.isResizeSupported()) {
-      return;
-    }
-
     clearBodyContent();
 
-    final int width = 600;
-    final int height = 500;
+    // Handler for resize events
+    final TestResizeHandler resizeHandler = new TestResizeHandler();
+    final HandlerRegistration handlerRegistration = Window.addResizeHandler(resizeHandler);
 
-    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
+    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
         }
-        assertEquals(Window.getClientWidth(), handler.getWidth());
-        assertEquals(Window.getClientHeight(), handler.getHeight());
+
+        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
         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 b694fae..2691c34 100644
--- a/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/FailedRequestTest.java
@@ -18,10 +18,12 @@
 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 RpcTestBase {
+public class FailedRequestTest extends TestCase {
   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 4dcb045..effa813 100644
--- a/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/FailingRequestBuilderTest.java
@@ -19,10 +19,12 @@
 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 RpcTestBase {
+public class FailingRequestBuilderTest extends TestCase {
   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 f241687..e3b84df 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.core.client.GWT;
 import com.google.gwt.user.client.rpc.RecursiveClassTestService.ResultNode;
+import com.google.gwt.core.client.GWT;
 
 /**
  * Class used to test generics with wild cards and recursive references.
@@ -26,19 +26,18 @@
   /**
    * 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() {
+    service.greetServer("Hello", new AsyncCallback<ResultNode>() {
       public void onFailure(Throwable caught) {
         TestSetValidator.rethrowException(caught);
       }
 
-      public void onSuccess(Object result) {
+      public void onSuccess(ResultNode result) {
         assertNotNull(result);
-        assertTrue(result instanceof ResultNode);
+        assertTrue(TestSetValidator.isValidRecurisveClassObject(result));
         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 6436f45..61fd819 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<U>> void greetServer(String input, AsyncCallback<ResultNode<U>> callback)
-      throws IllegalArgumentException;
+  <U extends ResultNode<?>> void greetServer(String input, AsyncCallback<ResultNode> 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 76fb619..f5601b0 100644
--- a/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
+++ b/user/test/com/google/gwt/user/client/rpc/TestSetValidator.java
@@ -31,6 +31,7 @@
 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;
@@ -38,9 +39,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;
@@ -48,11 +49,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
@@ -805,6 +806,10 @@
     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 5aee0b3..f1fe049 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingService.java
@@ -59,11 +59,6 @@
   }
 
   /**
-   * 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 f998680..6ae9fd4 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingServiceAsync.java
@@ -21,7 +21,6 @@
  * 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 defb3c1..0a8c7fa 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
@@ -315,40 +315,4 @@
           }
         });
   }
-
-  /**
-   * 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 9f0b8e2..6f38b6e 100644
--- a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
@@ -29,7 +29,9 @@
 
 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
@@ -82,25 +84,29 @@
     b.setDown(true);
     assertEquals(b.getStylePrimaryName(), "random");
 
-    Map<String, Face> faces = new HashMap<String, Face>();
+    Map faces = new HashMap();
     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.
-    for (Map.Entry<String, Face> entry : faces.entrySet()) {
-      Face f = entry.getValue();
+    while (entries.hasNext()) {
+      Map.Entry entry = (Entry) entries.next();
+      Face f = (Face) 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.
-    for (Map.Entry<String, Face> entry : faces.entrySet()) {
-      Face f = entry.getValue();
+    while (entries.hasNext()) {
+      Map.Entry entry = (Entry) entries.next();
+      Face f = (Face) entry.getValue();
       b.setCurrentFace(f);
       String computedStyleName = DOM.getElementProperty(b.getElement(),
           "className");
@@ -112,37 +118,43 @@
 
   public void testSettingFaces() {
     PushButton b = new PushButton();
-    Map<String, Face> faces = new HashMap<String, Face>();
+    Map faces = new HashMap();
     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.
-    for (Map.Entry<String, Face> entry : faces.entrySet()) {
-      Face f = entry.getValue();
-      String faceName = entry.getKey();
+    while (entries.hasNext()) {
+      Map.Entry entry = (Entry) entries.next();
+      Face f = (Face) entry.getValue();
+      String faceName = (String) entry.getKey();
       f.setText(faceName);
     }
-    
-    for (Map.Entry<String, Face> entry : faces.entrySet()) {
-      Face f = entry.getValue();
-      String faceName = entry.getKey();
+    entries = faces.entrySet().iterator();
+    while (entries.hasNext()) {
+      Map.Entry entry = (Entry) entries.next();
+      Face f = (Face) entry.getValue();
+      String faceName = (String) entry.getKey();
       assertEquals(f.getText(), faceName);
     }
-    
     // Set all faces as HTML
-    for (Map.Entry<String, Face> entry : faces.entrySet()) {
-      Face f = entry.getValue();
-      String faceName = entry.getKey();
+    entries = faces.entrySet().iterator();
+    while (entries.hasNext()) {
+      Map.Entry entry = (Entry) entries.next();
+      Face f = (Face) entry.getValue();
+      String faceName = (String) entry.getKey();
       f.setHTML("<b>" + faceName + "</b>");
     }
 
-    for (Map.Entry<String, Face> entry : faces.entrySet()) {
-      Face f = entry.getValue();
-      String faceName = entry.getKey();
+    entries = faces.entrySet().iterator();
+    while (entries.hasNext()) {
+      Map.Entry entry = (Entry) entries.next();
+      Face f = (Face) entry.getValue();
+      String faceName = (String) 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 71f50b1..b6057b4 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<String, Integer> m;
+  Map m;
 
   public void testTiming() throws Exception {
     m = putTiming(32000);
@@ -46,8 +46,8 @@
     this.timing("get(" + size + ")");
   }
 
-  public FastStringMap<Integer> putTiming(int size) {
-    FastStringMap<Integer> m1 = new FastStringMap<Integer>();
+  public FastStringMap putTiming(int size) {
+    FastStringMap m1 = new FastStringMap();
     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 cc86737..a033ba7 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<String, Label> m = new HashMap<String, Label>();
+    HashMap m = new HashMap();
     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 ff54a362..d25665c 100644
--- a/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
+++ b/user/test/com/google/gwt/user/client/ui/NamedFrameTest.java
@@ -76,8 +76,4 @@
       // 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 38e8d5e..7cabdd7 100644
--- a/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PrefixTreeTest.java
@@ -18,6 +18,7 @@
 import com.google.gwt.junit.client.GWTTestCase;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -125,7 +126,7 @@
    * Tests newly constructed prefix tree assumptions.
    */
   public void testPlaysWellWithOthers() {
-    final List<String> l = new ArrayList<String>();
+    final List l = new ArrayList();
     for (int i = 0; i < 100; i++) {
       l.add(String.valueOf(i));
     }
@@ -167,7 +168,7 @@
     testSizeByIterator(tree);
     assertTrue(tree.iterator().hasNext());
 
-    List<String> l;
+    List l;
 
     l = tree.getSuggestions("", 13);
     assertTrue("Expected size of 13, got " + l.size(), l.size() == 13);
@@ -187,7 +188,7 @@
 
     l = tree.getSuggestions("o", 1);
     assertTrue("Expected size of 1, got " + l.size(), l.size() == 1);
-    assertTrue(l.get(0).endsWith("..."));
+    assertTrue(((String) l.get(0)).endsWith("..."));
     assertAllStartWith(l, "o");
 
     l = tree.getSuggestions("something", 1);
@@ -196,8 +197,9 @@
     assertAllStartWith(l, "somethingdifferent");
   }
 
-  protected void assertAllStartWith(List<String> l, String prefix) {
-    for (String test : l) {
+  protected void assertAllStartWith(List l, String prefix) {
+    for (final Iterator i = l.iterator(); i.hasNext();) {
+      final String test = (String) i.next();
       assertTrue(test + " does not start with " + prefix,
           test.startsWith(prefix));
     }
@@ -211,7 +213,8 @@
    */
   protected void testSizeByIterator(PrefixTree tree) {
     int count = 0;
-    for (@SuppressWarnings("unused") String s : tree) {
+    for (final Iterator i = tree.iterator(); i.hasNext();) {
+      i.next();
       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 dfcda3a..212b901 100644
--- a/user/test/com/google/gwt/user/client/ui/TreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TreeTest.java
@@ -15,8 +15,6 @@
  */
 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;
@@ -346,55 +344,6 @@
       // 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 121b54c..33d01ad 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<Widget> iterator() {
+    public Iterator iterator() {
       return null;
     }
 
@@ -88,7 +88,7 @@
     wc.add(l1);
     wc.add(l2);
 
-    Iterator<Widget> it = wc.iterator();
+    Iterator 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 fe7ffc7..21821cf 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<Widget> iterator() {
+    public Iterator iterator() {
       fail("Unexpected call to iterator()");
       return null;
     }
@@ -56,7 +56,7 @@
    * Tests that empty arrays operate properly.
    */
   public void testEmptyArray() {
-    final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(
+    final Iterator subject = WidgetIterators.createWidgetIterator(
         new MockWidget(), new Widget[] {null, null});
     assertFalse(subject.hasNext());
     assertNextFails(subject);
@@ -80,7 +80,7 @@
       }
     };
 
-    final Iterator<Widget> subject = WidgetIterators.createWidgetIterator(mock, widgets);
+    final Iterator 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<Widget> subject = WidgetIterators.createWidgetIterator(mock, widgets);
+    final Iterator subject = WidgetIterators.createWidgetIterator(mock, widgets);
 
     assertTrue(subject.hasNext());
     assertEquals(widgets[1], subject.next());
@@ -118,7 +118,7 @@
     assertNextFails(subject);
   }
 
-  private void assertNextFails(Iterator<Widget> iterator) {
+  private void assertNextFails(Iterator iterator) {
     try {
       iterator.next();
       fail("Expected NoSuchElementException.");
@@ -127,7 +127,7 @@
     }
   }
 
-  private void assertRemoveFails(Iterator<Widget> iterator) {
+  private void assertRemoveFails(Iterator 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 88251fa..d5f01a0 100644
--- a/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
+++ b/user/test/com/google/gwt/user/rebind/rpc/SerializableTypeOracleBuilderTest.java
@@ -45,16 +45,11 @@
 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;
@@ -1930,44 +1925,6 @@
   }
 
   /**
-   * 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
@@ -2070,7 +2027,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);
@@ -2344,7 +2301,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);
@@ -2409,78 +2366,6 @@
     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
deleted file mode 100644
index 3c8a5cc..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/SerializationUtilsTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 061a6a6..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/ParameterizedTypeInList.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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
deleted file mode 100644
index c5d37bf..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/RawTypeInList.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 247875f..0000000
--- a/user/test/com/google/gwt/user/rebind/rpc/testcases/client/SubclassUsedInArray.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 d6fc11d..76f155b 100644
--- a/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
+++ b/user/test/com/google/gwt/user/server/rpc/RPCTypeCheckTest.java
@@ -23,7 +23,6 @@
 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;
 
@@ -2459,23 +2458,6 @@
   }
 
   /**
-   * 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() {
@@ -2778,7 +2760,6 @@
    * 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
@@ -2786,14 +2767,10 @@
       // an incorrect string if the integer value is within range of the string
       // table.
       RPC.decodeRequest(generateIntSpoofingString());
-      returned = true;
-    } catch (AssertionError e) {
+      fail("Expected ArrayIndexOutOfBoundsException from testValueSpoofing (1)");
+    } catch (ArrayIndexOutOfBoundsException 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 30ffbe1..c96276a 100644
--- a/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
+++ b/user/test/com/google/gwt/user/server/rpc/UnicodeEscapingServiceImpl.java
@@ -25,13 +25,6 @@
     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 f75f54d..90bb1be 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,7 +21,6 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Tests for the {@link StandardSerializationPolicy} class.
@@ -118,14 +117,14 @@
   }
 
   StandardSerializationPolicy getStandardSerializationPolicy() {
-    Map<Class<?>, Boolean> map = new HashMap<Class<?>, Boolean>();
+    Map map = new HashMap();
     map.put(A.class, Boolean.TRUE);
     map.put(C.class, Boolean.FALSE);
     
-    Map<Class<?>, String> typeIds = new HashMap<Class<?>, String>();
+    Map typeIds = new HashMap();
     typeIds.put(A.class, "A");
     typeIds.put(B.class, "B");
 
-    return new StandardSerializationPolicy(map, map, typeIds, new HashMap<Class<?>, Set<String>>());
+    return new StandardSerializationPolicy(map, map, typeIds, new HashMap());
   }
 }
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
deleted file mode 100644
index 190f129..0000000
--- a/user/test/com/google/gwt/user/server/rpc/testcases/TypeVariableCycle.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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 38d4d1b..374399d 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);
-    assertContentsEmpty("valid author", violations);
+    assertContentsAnyOrder("valid author", violations);
   }
 
   public void testGroup_default() throws Exception {
     initValidAuthor();
     Set<ConstraintViolation<Author>> violations = validator.validate(author,
         Default.class);
-    assertContentsEmpty("valid author", violations);
+    assertContentsAnyOrder("valid author", violations);
   }
 
   public void testGroup_empty() throws Exception {
     initValidAuthor();
     Set<ConstraintViolation<Author>> violations = validator.validate(author);
-    assertContentsEmpty("valid author", violations);
+    assertContentsAnyOrder("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);
-    assertContentsEmpty("valid author", violations);
+    assertContentsAnyOrder("valid author", violations);
   }
 
   public void testValidateProperty_object() {
@@ -125,11 +125,6 @@
     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 cbe7b58..29e6541 100644
--- a/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
+++ b/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
@@ -294,7 +294,19 @@
     final SimpleEventBus eventBus = new SimpleEventBus();
     HandlerRegistration reg = FooEvent.register(eventBus, fooHandler1);
     reg.removeHandler();
-    reg.removeHandler(); // should not throw
+
+    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
+    }
   }
 
   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 caf6670..90dcd71 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,7 +16,6 @@
 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;
@@ -276,63 +275,6 @@
     });
   }
 
-  /**
-   * 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();
 
@@ -664,9 +606,6 @@
         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 e2c33cf..d40d9a0 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,7 +119,6 @@
                     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 e97f743..24701f5 100755
--- a/user/test/org/apache/commons/collections/AbstractTestListIterator.java
+++ b/user/test/org/apache/commons/collections/AbstractTestListIterator.java
@@ -37,7 +37,6 @@
  * @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 2f8ee5a..1b15f06 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 ba282ad..5608b62 100644
--- a/user/test/org/apache/commons/collections/LocalTestNode.java
+++ b/user/test/org/apache/commons/collections/LocalTestNode.java
@@ -22,7 +22,6 @@
 *
 * @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 63ef8b3..07ff0ab 100644
--- a/user/test/org/apache/commons/collections/TestArrayList.java
+++ b/user/test/org/apache/commons/collections/TestArrayList.java
@@ -21,7 +21,6 @@
  * @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 66d187f..e3aac53 100644
--- a/user/test/org/apache/commons/collections/TestCollection.java
+++ b/user/test/org/apache/commons/collections/TestCollection.java
@@ -110,7 +110,6 @@
  * @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 331644d..488dd6a 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 4714bc1..9b779da 100644
--- a/user/test/org/apache/commons/collections/TestIterator.java
+++ b/user/test/org/apache/commons/collections/TestIterator.java
@@ -23,7 +23,6 @@
  * 
  * @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 88dd29c..9a0135b 100644
--- a/user/test/org/apache/commons/collections/TestList.java
+++ b/user/test/org/apache/commons/collections/TestList.java
@@ -40,7 +40,6 @@
  * @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 7e1d0a9..16e39ce 100644
--- a/user/test/org/apache/commons/collections/TestMap.java
+++ b/user/test/org/apache/commons/collections/TestMap.java
@@ -106,7 +106,6 @@
  * @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 df77884..14f9933 100644
--- a/user/test/org/apache/commons/collections/TestSet.java
+++ b/user/test/org/apache/commons/collections/TestSet.java
@@ -38,7 +38,6 @@
  *  @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 d0509ed..e58710e 100644
--- a/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
+++ b/user/test/org/hibernate/jsr303/tck/util/TckTestSuiteWrapper.java
@@ -25,6 +25,7 @@
 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;
@@ -106,8 +107,8 @@
       return;
     }
 
-    Class<?> superClass = theClass;
-    Vector<String> names = new Vector<String>();
+    Class superClass = theClass;
+    Vector names = new Vector();
     while (Test.class.isAssignableFrom(superClass)) {
       for (Method method : filter(copyOf(superClass.getDeclaredMethods()),
           METHOD_FILTER)) {
@@ -119,7 +120,7 @@
       addTest(warning("No tests found in " + theClass.getName()));
   }
 
-  private void addTestMethod(Method m, Vector<String> names, Class<?> theClass) {
+  private void addTestMethod(Method m, Vector names, Class theClass) {
     String name = m.getName();
     if (names.contains(name))
       return;
@@ -132,6 +133,10 @@
     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());
   }