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());
   }
