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 331388c..d01a2f0 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
@@ -41,13 +41,25 @@
 public class JMethod extends JNode implements JMember, CanBeAbstract, CanBeNative {
 
   /**
-   * Indicates whether a JsProperty method is a getter or setter. Getters come with names like isX()
-   * and getX() while setters have signatures like setX(int a). If the property doesn't match these
-   * patterns, then it will marked as {@code UNDEFINED} to be later signaled as error in
-   * {@link com.google.gwt.dev.jjs.impl.JsInteropRestrictionChecker}.
+   * Indicates whether a method is a JsProperty accessor.
    */
   public enum JsPropertyAccessorType {
-    GETTER, SETTER, UNDEFINED;
+    /**
+     * Not a property accessor.
+     */
+    NONE,
+    /**
+     * A getter property accessor. Usually in the form of getX()/isX().
+     */
+    GETTER,
+    /**
+     * A setter property accessor. Usually in the form of setX(x).
+     */
+    SETTER,
+    /**
+     * A property accessor but doesn't match setter/getter patterns.
+     */
+    UNDEFINED,
   }
 
   public static final Comparator<JMethod> BY_SIGNATURE_COMPARATOR = new Comparator<JMethod>() {
@@ -60,7 +72,7 @@
   private String jsName;
   private boolean exported;
   private String jsNamespace;
-  private JsPropertyAccessorType jsPropertyType;
+  private JsPropertyAccessorType jsPropertyType = JsPropertyAccessorType.NONE;
   private Specialization specialization;
   private InliningMode inliningMode = InliningMode.NORMAL;
   private boolean preventDevirtualization = false;
@@ -193,23 +205,11 @@
         return overriddenMethod.jsPropertyType;
       }
     }
-    return null;
+    return JsPropertyAccessorType.NONE;
   }
 
   public boolean isJsPropertyAccessor() {
-    return jsPropertyType != null;
-  }
-
-  public boolean isOrOverridesJsPropertyAccessor() {
-    if (isJsPropertyAccessor()) {
-      return true;
-    }
-    for (JMethod overriddenMethod : getOverriddenMethods()) {
-      if (overriddenMethod.isJsPropertyAccessor()) {
-        return true;
-      }
-    }
-    return false;
+    return jsPropertyType != JsPropertyAccessorType.NONE;
   }
 
   private boolean isJsFunctionMethod() {
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 d77975a..d24ae56 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
@@ -67,7 +67,6 @@
 import com.google.gwt.dev.jjs.ast.JLocalRef;
 import com.google.gwt.dev.jjs.ast.JMember;
 import com.google.gwt.dev.jjs.ast.JMethod;
-import com.google.gwt.dev.jjs.ast.JMethod.JsPropertyAccessorType;
 import com.google.gwt.dev.jjs.ast.JMethodBody;
 import com.google.gwt.dev.jjs.ast.JMethodCall;
 import com.google.gwt.dev.jjs.ast.JNameOf;
@@ -1323,24 +1322,20 @@
         result = dispatchToStatic(x, method, args);
       } else if (x.isStaticDispatchOnly()) {
         result = dispatchToSuper(x, method, args);
-      } else if (method.isOrOverridesJsPropertyAccessor()) {
-        result = dispatchToJsProperty(x, method, args);
-      } else if (method.isOrOverridesJsMethod()) {
-        result = dispatchToJsMethod(x, method, args);
       } else if (method.isOrOverridesJsFunctionMethod()) {
-        result = dispatchToJsFunction(x, args);
+        result = dispatchToJsFunction(args, x.getSourceInfo());
       } else {
-        // Dispatch polymorphically (normal case).
-        JsNameRef methodName = polymorphicNames.get(method).makeRef(x.getSourceInfo());
-        methodName.setQualifier((JsExpression) pop()); // instance
-        result = new JsInvocation(x.getSourceInfo(), methodName, args);
+        result = dispatchToInstanceMethod(method, args, x.getSourceInfo());
       }
 
       push(result);
     }
 
     private JsExpression dispatchToStatic(JMethodCall x, JMethod method, List<JsExpression> args) {
-      JsNameRef methodName = names.get(method).makeRef(x.getSourceInfo());
+      JsNameRef methodName =
+          method.isJsNative()
+              ? createJsQualifier(method.getQualifiedJsName(), x.getSourceInfo())
+              : names.get(method).makeRef(x.getSourceInfo());
       JsExpression result = new JsInvocation(x.getSourceInfo(), methodName, args);
       if (x.getInstance() != null) {
         JsExpression unnecessaryQualifier = pop();
@@ -1400,24 +1395,26 @@
       return jsInvocation;
     }
 
-    private JsExpression dispatchToJsProperty(
-        JMethodCall x, JMethod method, List<JsExpression> args) {
-      JsNameRef propertyReference = new JsNameRef(x.getSourceInfo(), method.getJsName());
-      propertyReference.setQualifier((JsExpression) pop()); // instance
-      if (method.getJsPropertyAccessorType() == JsPropertyAccessorType.SETTER) {
-        return createAssignment(propertyReference, args.get(0));
+    private JsExpression dispatchToJsFunction(List<JsExpression> args, SourceInfo sourceInfo) {
+      return new JsInvocation(sourceInfo, (JsExpression) pop(), args);
+    }
+
+    private JsExpression dispatchToInstanceMethod(
+        JMethod method, List<JsExpression> args, SourceInfo sourceInfo) {
+      JsNameRef reference =
+          method.isOrOverridesJsMethod()
+              ? new JsNameRef(sourceInfo, method.getJsName())
+              : polymorphicNames.get(method).makeRef(sourceInfo);
+      reference.setQualifier((JsExpression) pop()); // instance
+
+      switch (method.getJsPropertyAccessorType()) {
+        case SETTER:
+          return createAssignment(reference, args.get(0));
+        case GETTER:
+          return reference;
+        default:
+          return new JsInvocation(sourceInfo, reference, args);
       }
-      return propertyReference;
-    }
-
-    private JsExpression dispatchToJsMethod(JMethodCall x, JMethod method, List<JsExpression> args) {
-      JsNameRef methodName = new JsNameRef(x.getSourceInfo(), method.getJsName());
-      methodName.setQualifier((JsExpression) pop()); // instance
-      return new JsInvocation(x.getSourceInfo(), methodName, args);
-    }
-
-    private JsExpression dispatchToJsFunction(JMethodCall x, List<JsExpression> args) {
-      return new JsInvocation(x.getSourceInfo(), (JsExpression) pop(), args);
     }
 
     @Override
