diff --git a/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java b/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java
index 1a4283b..82e2c7e 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java
@@ -60,8 +60,6 @@
  */
 public class JSORestrictionsChecker {
 
-  public static final String ERR_JSTYPE_OVERLOADS_NOT_ALLOWED =
-      "JsType methods cannot overload another method.";
   public static final String ERR_JSEXPORT_ONLY_CTORS_STATIC_METHODS_AND_STATIC_FINAL_FIELDS =
       "@JsExport may only be applied to public constructors and static methods and public "
       + "static final fields in public classes.";
@@ -101,7 +99,7 @@
   static boolean LINT_MODE = false;
 
   private enum ClassState {
-    NORMAL, JSO, JSTYPE, JSTYPE_IMPL
+    NORMAL, JSO
   }
 
   /**
@@ -119,12 +117,6 @@
       String alreadyImplementor = interfacesToJsoImpls.get(intfName);
       String myName = CharOperation.toString(jsoType.binding.compoundName);
 
-      if (!areInSameModule(jsoType, interf)) {
-        String msg = errMustBeDefinedInTheSameModule(intfName,myName);
-        errorOn(jsoType, cud, msg);
-        return;
-      }
-
       if (alreadyImplementor != null) {
         String msg = errAlreadyImplemented(intfName, alreadyImplementor, myName);
         errorOn(jsoType, cud, msg);
@@ -133,12 +125,6 @@
 
       interfacesToJsoImpls.put(intfName, myName);
     }
-
-    // TODO(rluble): (Separate compilation) Implement a real check that a JSO must is defined in
-    // the same module as the interface(s) it implements. Depends on upcoming JProgram changes.
-    private boolean areInSameModule(TypeDeclaration jsoType, ReferenceBinding interf) {
-      return true;
-    }
   }
 
   private class JSORestrictionsVisitor extends SafeASTVisitor implements
@@ -278,10 +264,7 @@
           errorOn(type, ERR_JS_TYPE_WITH_PROTOTYPE_SET_NOT_ALLOWED_ON_CLASS_TYPES);
         }
       }
-      Map<String, MethodBinding> methodSignatures = new HashMap<String, MethodBinding>();
-      Map<String, MethodBinding> noExports = new HashMap<String, MethodBinding>();
 
-      checkJsTypeMethodsForOverloads(methodSignatures, noExports, binding);
       for (MethodBinding mb : binding.methods()) {
         checkJsProperty(mb);
       }
@@ -329,52 +312,16 @@
       }
     }
 
-    private void checkJsTypeMethodsForOverloads(Map<String, MethodBinding> methodNamesAndSigs,
-        Map<String, MethodBinding> noExports, ReferenceBinding binding) {
-      if (isJsType(binding)) {
-        for (MethodBinding mb : binding.methods()) {
-          String methodName = String.valueOf(mb.selector);
-          if (JdtUtil.getAnnotation(mb, JsInteropUtil.JSNOEXPORT_CLASS) != null) {
-            noExports.put(methodName, mb);
-            continue;
-          }
-          if (mb.isConstructor() || mb.isStatic()) {
-            continue;
-          }
-          if (JdtUtil.getAnnotation(mb, JsInteropUtil.JSPROPERTY_CLASS) != null) {
-            if (isGetter(methodName, mb) || isSetter(methodName, mb)) {
-              // JS properties are allowed to be overloaded (setter/getter)
-              continue;
-            }
-          }
-          if (methodNamesAndSigs.containsKey(methodName)) {
-            if (!methodNamesAndSigs.get(methodName).areParameterErasuresEqual(mb)) {
-              if (noExports.containsKey(methodName)
-                  && noExports.get(methodName).areParameterErasuresEqual(mb)) {
-                continue;
-              }
-              errorOn(mb, ERR_JSTYPE_OVERLOADS_NOT_ALLOWED);
-            }
-          } else {
-            methodNamesAndSigs.put(methodName, mb);
-          }
-        }
-      }
-      for (ReferenceBinding rb : binding.superInterfaces()) {
-        checkJsTypeMethodsForOverloads(methodNamesAndSigs, noExports, rb);
-      }
-    }
-
     private ClassState checkType(TypeDeclaration type) {
       SourceTypeBinding binding = type.binding;
       checkJsFunction(type, binding);
       if (isJsType(type.binding)) {
         checkJsType(type, type.binding);
-        return ClassState.JSTYPE;
+        return ClassState.NORMAL;
       }
 
       if (checkClassImplementingJsType(type)) {
-        return ClassState.JSTYPE_IMPL;
+        return ClassState.NORMAL;
       }
 
       if (!isJsoSubclass(binding)) {
@@ -509,13 +456,13 @@
     /**
      * Walks up chain of interfaces and superinterfaces to find the first one marked with @JsType.
      */
-    private ReferenceBinding findNearestJsType(ReferenceBinding binding, boolean mustHavePrototype) {
+    private ReferenceBinding findNearestJsType(ReferenceBinding binding) {
       if (isJsType(binding)) {
         return binding;
       }
 
       for (ReferenceBinding intb : binding.superInterfaces()) {
-        ReferenceBinding checkSuperInt = findNearestJsType(intb, false);
+        ReferenceBinding checkSuperInt = findNearestJsType(intb);
         if (checkSuperInt != null) {
           return checkSuperInt;
         }
@@ -524,7 +471,7 @@
     }
 
     private ReferenceBinding findNearestJsTypeRecursive(ReferenceBinding binding) {
-      ReferenceBinding nearest = findNearestJsType(binding, false);
+      ReferenceBinding nearest = findNearestJsType(binding);
       if (nearest != null) {
         return nearest;
       } else if (binding.superclass() != null) {
@@ -617,13 +564,6 @@
         + ") is implemented by both (" + impl1 + ") and (" + impl2 + ")";
   }
 
-  // TODO(rluble): (Separate compilation) It would be nice to have the actual module names here.
-  static String errMustBeDefinedInTheSameModule(String intfName, String jsoImplementation) {
-    return "A JavaScriptObject type may only implement an interface that is defined in the same"
-        + " module. The interface (" + intfName + ") and  the JavaScriptObject type (" +
-        jsoImplementation + ") are defined different modules";
-  }
-
   private static void errorOn(ASTNode node, CompilationUnitDeclaration cud,
       String error) {
     GWTProblem.recordError(node, cud, error, new InstalledHelpInfo(
diff --git a/dev/core/test/com/google/gwt/dev/javac/JSORestrictionsTest.java b/dev/core/test/com/google/gwt/dev/javac/JSORestrictionsTest.java
index 0177ecb..27e86b6 100644
--- a/dev/core/test/com/google/gwt/dev/javac/JSORestrictionsTest.java
+++ b/dev/core/test/com/google/gwt/dev/javac/JSORestrictionsTest.java
@@ -356,31 +356,6 @@
     shouldGenerateNoError(goodCode);
   }
 
-  public void testJsTypeNoOverloads() {
-    StringBuilder buggyCode = new StringBuilder();
-    buggyCode.append("import com.google.gwt.core.client.js.JsType;\n");
-    buggyCode.append("@JsType\n");
-    buggyCode.append("public interface Buggy {\n");
-    buggyCode.append("void foo();\n");
-    buggyCode.append("void foo(int x);\n");
-    buggyCode.append("}\n");
-
-    shouldGenerateError(buggyCode,
-        "Line 5: " + JSORestrictionsChecker.ERR_JSTYPE_OVERLOADS_NOT_ALLOWED);
-  }
-
-  public void testJsTypeNoOverloadsHierarchy() {
-    StringBuilder buggyCode = new StringBuilder();
-    buggyCode.append("import com.google.gwt.core.client.js.JsType;\n");
-    buggyCode.append("public interface Buggy {\n");
-    buggyCode.append("@JsType interface Buggy2 { void foo(); }\n");
-    buggyCode.append("@JsType interface Buggy3 extends Buggy2 { void foo(int x); }\n");
-    buggyCode.append("}\n");
-
-    shouldGenerateError(buggyCode,
-        "Line 3: " + JSORestrictionsChecker.ERR_JSTYPE_OVERLOADS_NOT_ALLOWED);
-  }
-
   public void testJsExport() {
     StringBuilder goodCode = new StringBuilder();
     goodCode.append("import com.google.gwt.core.client.js.JsExport;\n");
@@ -903,10 +878,6 @@
     logger.assertCorrectLogEntries();
   }
 
-  private void shouldGenerateNoError(SourceLevel sourceLevel, StringBuilder buggyCode) {
-    shouldGenerateError(sourceLevel, buggyCode, (String[]) null);
-  }
-
   private void shouldGenerateError(CharSequence buggyCode, String... expectedErrors) {
     shouldGenerateError(SourceLevel.DEFAULT_SOURCE_LEVEL, buggyCode, expectedErrors);
   }
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
index 4346a09..eed058d 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
@@ -114,58 +114,58 @@
         + "global name 'show' is already taken.");
   }
 
-  public void testCollidingJsPropertiesHasAndGetterSucceeds() throws Exception {
+  public void testJsPropertyGetterStyleSucceeds() throws Exception {
     addSnippetImport("com.google.gwt.core.client.js.JsType");
     addSnippetImport("com.google.gwt.core.client.js.JsProperty");
     addSnippetClassDecl(
         "@JsType",
         "public static interface IBuggy {",
-        "  @JsProperty",
-        "  boolean hasX();",
-        "  @JsProperty",
-        "  int x();",
+        "  @JsProperty boolean hasX();",
+        "  @JsProperty int getX();",
+        "  @JsProperty void setX(int x);",
         "}",
         "public static class Buggy implements IBuggy {",
         "  public boolean hasX() {return false;}",
-        "  public int x() {return 0;}",
+        "  public int getX() {return 0;}",
+        "  public void setX(int x) {};",
         "}");
 
     assertCompileSucceeds();
   }
 
-  public void testCollidingJsPropertiesHasAndSetterSucceeds() throws Exception {
+  public void testJsPropertyNonGetterStyleSucceeds() throws Exception {
     addSnippetImport("com.google.gwt.core.client.js.JsType");
     addSnippetImport("com.google.gwt.core.client.js.JsProperty");
     addSnippetClassDecl(
         "@JsType",
         "public static interface IBuggy {",
-        "  @JsProperty",
-        "  boolean hasX();",
-        "  @JsProperty",
-        "  void x(int x);",
+        "  @JsProperty boolean hasX();",
+        "  @JsProperty int x();",
+        "  @JsProperty void x(int x);",
         "}",
         "public static class Buggy implements IBuggy {",
         "  public boolean hasX() {return false;}",
-        "  public void x(int x) {}",
+        "  public int x() {return 0;}",
+        "  public void x(int x) {};",
         "}");
 
     assertCompileSucceeds();
   }
 
-  public void testCollidingJsPropertiesSetterAndGetterSucceeds() throws Exception {
+  public void testJsPropertyFluentStyleSucceeds() throws Exception {
     addSnippetImport("com.google.gwt.core.client.js.JsType");
     addSnippetImport("com.google.gwt.core.client.js.JsProperty");
     addSnippetClassDecl(
         "@JsType",
         "public static interface IBuggy {",
-        "  @JsProperty",
-        "  int x();",
-        "  @JsProperty",
-        "  void x(int x);",
+        "  @JsProperty boolean hasX();",
+        "  @JsProperty int x();",
+        "  @JsProperty IBuggy x(int x);",
         "}",
         "public static class Buggy implements IBuggy {",
+        "  public boolean hasX() {return false;}",
         "  public int x() {return 0;}",
-        "  public void x(int x) {}",
+        "  public IBuggy x(int x) {return null;};",
         "}");
 
     assertCompileSucceeds();
@@ -303,6 +303,19 @@
         + "'test.EntryPoint$Buggy' because the member name 'show' is already taken.");
   }
 
+  public void testCollidingMethodToMethodJsTypeFails() throws Exception {
+    addSnippetImport("com.google.gwt.core.client.js.JsType");
+    addSnippetClassDecl(
+        "@JsType",
+        "public static class Buggy {",
+        "  public void show(int x) {}",
+        "  public void show() {}",
+        "}");
+
+    assertCompileFails("Method 'test.EntryPoint$Buggy.show()V' can't be exported in type "
+        + "'test.EntryPoint$Buggy' because the member name 'show' is already taken.");
+  }
+
   public void testCollidingSubclassExportedFieldToFieldJsTypeSucceeds() throws Exception {
     addSnippetImport("com.google.gwt.core.client.js.JsType");
     addSnippetClassDecl(
