Moves JsInterop integration tests to new annotations.

Change-Id: Ic7fdaabb337afb8e30e047ad697e3c24baea6542
Review-Link: https://gwt-review.googlesource.com/#/c/13772/
diff --git a/user/test/com/google/gwt/core/client/interop/AbstractJsType.java b/user/test/com/google/gwt/core/client/interop/AbstractJsType.java
index 5f059e5..8e07404 100644
--- a/user/test/com/google/gwt/core/client/interop/AbstractJsType.java
+++ b/user/test/com/google/gwt/core/client/interop/AbstractJsType.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
  * This concrete test class is *directly* annotated as a @JsType.
diff --git a/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java b/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java
index 74c89e4..55529f1 100644
--- a/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java
+++ b/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
  * This concrete test class is *directly* annotated as a @JsType.
diff --git a/user/test/com/google/gwt/core/client/interop/ConcreteJsTypeJsSubclass.java b/user/test/com/google/gwt/core/client/interop/ConcreteJsTypeJsSubclass.java
index 9e89e41..f9506ec 100644
--- a/user/test/com/google/gwt/core/client/interop/ConcreteJsTypeJsSubclass.java
+++ b/user/test/com/google/gwt/core/client/interop/ConcreteJsTypeJsSubclass.java
@@ -15,12 +15,9 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
-
 /**
  * This test class exposes parent jsmethod as non-jsmethod.
  */
-@JsType
 class ConcreteJsTypeJsSubclass extends ConcreteJsType implements SubclassInterface {
 }
 
diff --git a/user/test/com/google/gwt/core/client/interop/ElementLikeJsInterface.java b/user/test/com/google/gwt/core/client/interop/ElementLikeNativeInterface.java
similarity index 83%
rename from user/test/com/google/gwt/core/client/interop/ElementLikeJsInterface.java
rename to user/test/com/google/gwt/core/client/interop/ElementLikeNativeInterface.java
index a3ff6c6..2881058 100644
--- a/user/test/com/google/gwt/core/client/interop/ElementLikeJsInterface.java
+++ b/user/test/com/google/gwt/core/client/interop/ElementLikeNativeInterface.java
@@ -16,14 +16,14 @@
 package com.google.gwt.core.client.interop;
 
 
-import com.google.gwt.core.client.js.JsProperty;
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
 
 /**
  * An interface that represent part of HTML element's contract.
  */
-@JsType
-public interface ElementLikeJsInterface {
+@JsType(isNative = true)
+public interface ElementLikeNativeInterface {
   @JsProperty
   String getTagName();
 }
diff --git a/user/test/com/google/gwt/core/client/interop/ElementLikeJsInterfaceImpl.java b/user/test/com/google/gwt/core/client/interop/ElementLikeNativeInterfaceImpl.java
similarity index 89%
rename from user/test/com/google/gwt/core/client/interop/ElementLikeJsInterfaceImpl.java
rename to user/test/com/google/gwt/core/client/interop/ElementLikeNativeInterfaceImpl.java
index 7a9d81a..8821150 100644
--- a/user/test/com/google/gwt/core/client/interop/ElementLikeJsInterfaceImpl.java
+++ b/user/test/com/google/gwt/core/client/interop/ElementLikeNativeInterfaceImpl.java
@@ -18,7 +18,7 @@
 /**
  * Implements ElementLikeJsInterface.
  */
-public class ElementLikeJsInterfaceImpl implements ElementLikeJsInterface {
+public class ElementLikeNativeInterfaceImpl implements ElementLikeNativeInterface {
   @Override
   public String getTagName() {
     return "mytag";
diff --git a/user/test/com/google/gwt/core/client/interop/HTMLButtonElement.java b/user/test/com/google/gwt/core/client/interop/HTMLButtonElement.java
index 7c1c532..fa178c9 100644
--- a/user/test/com/google/gwt/core/client/interop/HTMLButtonElement.java
+++ b/user/test/com/google/gwt/core/client/interop/HTMLButtonElement.java
@@ -15,8 +15,9 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsType;
 
-@JsType(prototype = "HTMLButtonElement")
-class HTMLButtonElement extends HTMLElement {
+@JsType(namespace = JsPackage.GLOBAL, name = "HTMLButtonElement", isNative = true)
+class HTMLButtonElement extends HTMLElementConcreteNativeJsType {
 }
diff --git a/user/test/com/google/gwt/core/client/interop/HTMLElement.java b/user/test/com/google/gwt/core/client/interop/HTMLElement.java
deleted file mode 100644
index 41e9c3a..0000000
--- a/user/test/com/google/gwt/core/client/interop/HTMLElement.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2014 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * 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.core.client.interop;
-
-import com.google.gwt.core.client.js.JsType;
-
-@JsType(prototype = "HTMLElement")
-class HTMLElement {
-}
diff --git a/user/test/com/google/gwt/core/client/interop/HTMLAnotherElement.java b/user/test/com/google/gwt/core/client/interop/HTMLElementAnotherConcreteNativeJsType.java
similarity index 75%
copy from user/test/com/google/gwt/core/client/interop/HTMLAnotherElement.java
copy to user/test/com/google/gwt/core/client/interop/HTMLElementAnotherConcreteNativeJsType.java
index 2c2ca7e..7ea72ed 100644
--- a/user/test/com/google/gwt/core/client/interop/HTMLAnotherElement.java
+++ b/user/test/com/google/gwt/core/client/interop/HTMLElementAnotherConcreteNativeJsType.java
@@ -15,8 +15,9 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsType;
 
-@JsType(prototype = "HTMLElement")
-class HTMLAnotherElement {
+@JsType(namespace = JsPackage.GLOBAL, name = "HTMLElement", isNative = true)
+class HTMLElementAnotherConcreteNativeJsType {
 }
diff --git a/user/test/com/google/gwt/core/client/interop/HTMLAnotherElement.java b/user/test/com/google/gwt/core/client/interop/HTMLElementConcreteNativeJsType.java
similarity index 76%
rename from user/test/com/google/gwt/core/client/interop/HTMLAnotherElement.java
rename to user/test/com/google/gwt/core/client/interop/HTMLElementConcreteNativeJsType.java
index 2c2ca7e..4bd6936 100644
--- a/user/test/com/google/gwt/core/client/interop/HTMLAnotherElement.java
+++ b/user/test/com/google/gwt/core/client/interop/HTMLElementConcreteNativeJsType.java
@@ -15,8 +15,9 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsType;
 
-@JsType(prototype = "HTMLElement")
-class HTMLAnotherElement {
+@JsType(namespace = JsPackage.GLOBAL, name = "HTMLElement", isNative = true)
+class HTMLElementConcreteNativeJsType {
 }
diff --git a/user/test/com/google/gwt/core/client/interop/JsExportTest.java b/user/test/com/google/gwt/core/client/interop/JsExportTest.java
index 1c044d8..11d3fd5 100644
--- a/user/test/com/google/gwt/core/client/interop/JsExportTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsExportTest.java
@@ -18,10 +18,10 @@
 import static com.google.gwt.core.client.ScriptInjector.TOP_WINDOW;
 
 import com.google.gwt.core.client.ScriptInjector;
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNamespace;
 import com.google.gwt.junit.client.GWTTestCase;
 
+import jsinterop.annotations.JsType;
+
 /**
  * Tests JsExport.
  */
@@ -146,8 +146,7 @@
     return obj.getInstance();
   }-*/;
 
-  @JsExport
-  @JsNamespace("bar.foo.baz")
+  @JsType(namespace = "bar.foo.baz")
   static class MyExportedClassCorrectNamespace {
     public MyExportedClassCorrectNamespace() { }
   }
@@ -411,8 +410,8 @@
   public void testEnum_exportedFields() {
     assertEquals(1, getPublicStaticFinalFieldInEnum());
 
-    // explicitly marked @JsExport fields must be final
-    // but ones that are in a @JsExported class don't need to be final
+    // explicitly marked @JsType() fields must be final
+    // but ones that are in a @JsType()ed class don't need to be final
     assertEquals(2, getPublicStaticFieldInEnum());
   }
 
diff --git a/user/test/com/google/gwt/core/client/interop/JsFunctionTest.java b/user/test/com/google/gwt/core/client/interop/JsFunctionTest.java
index 8bb7025..242e0eb 100644
--- a/user/test/com/google/gwt/core/client/interop/JsFunctionTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsFunctionTest.java
@@ -138,7 +138,7 @@
     assertNotNull(c1);
     MyJsFunctionIdentityInterface c2 = (MyJsFunctionIdentityInterface) createFunction();
     assertNotNull(c2);
-    ElementLikeJsInterface i = (ElementLikeJsInterface) createFunction();
+    ElementLikeNativeInterface i = (ElementLikeNativeInterface) createFunction();
     assertNotNull(i);
     try {
       MyJsFunctionInterfaceImpl c3 = (MyJsFunctionInterfaceImpl) createFunction();
@@ -150,7 +150,7 @@
   }
 
   public void testCast_fromJsObject() {
-    ElementLikeJsInterface obj = (ElementLikeJsInterface) createObject();
+    ElementLikeNativeInterface obj = (ElementLikeNativeInterface) createObject();
     assertNotNull(obj);
     try {
       MyJsFunctionInterface c = (MyJsFunctionInterface) createObject();
@@ -185,9 +185,11 @@
     assertNotNull(c3);
     MyJsFunctionIdentityInterface c4 = (MyJsFunctionIdentityInterface) object;
     assertNotNull(c4);
+    ElementLikeNativeInterface c5 = (ElementLikeNativeInterface) object;
+    assertNotNull(c5);
     try {
-      ElementLikeJsInterface c5 = (ElementLikeJsInterface) object;
-      assertNotNull(c5);
+      HTMLElementConcreteNativeJsType c6 = (HTMLElementConcreteNativeJsType) object;
+      assertNotNull(c6);
       fail("ClassCastException should be caught.");
     } catch (ClassCastException cce) {
       // Expected.
@@ -206,7 +208,7 @@
     assertTrue(object instanceof MyJsFunctionIdentityInterface);
     assertTrue(object instanceof MyJsFunctionWithOnlyInstanceofReference);
     assertFalse(object instanceof MyJsFunctionInterfaceImpl);
-    assertTrue(object instanceof ElementLikeJsInterface);
+    assertTrue(object instanceof ElementLikeNativeInterface);
   }
 
   public void testInstanceOf_jsObject() {
@@ -215,7 +217,7 @@
     assertFalse(object instanceof MyJsFunctionIdentityInterface);
     assertFalse(object instanceof MyJsFunctionWithOnlyInstanceofReference);
     assertFalse(object instanceof MyJsFunctionInterfaceImpl);
-    assertTrue(object instanceof ElementLikeJsInterface);
+    assertTrue(object instanceof ElementLikeNativeInterface);
   }
 
   public void testInstanceOf_javaInstance() {
@@ -224,7 +226,8 @@
     assertTrue(object instanceof MyJsFunctionInterfaceImpl);
     assertTrue(object instanceof MyJsFunctionIdentityInterface);
     assertTrue(object instanceof MyJsFunctionWithOnlyInstanceofReference);
-    assertFalse(object instanceof ElementLikeJsInterface);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertFalse(object instanceof HTMLElementConcreteNativeJsType);
   }
 
   // uncomment when Java8 is supported.
diff --git a/user/test/com/google/gwt/core/client/interop/JsListInterface.java b/user/test/com/google/gwt/core/client/interop/JsListInterface.java
index 885647d..0976b77 100644
--- a/user/test/com/google/gwt/core/client/interop/JsListInterface.java
+++ b/user/test/com/google/gwt/core/client/interop/JsListInterface.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 @JsType
 interface JsListInterface {
diff --git a/user/test/com/google/gwt/core/client/interop/JsPropertyTest.java b/user/test/com/google/gwt/core/client/interop/JsPropertyTest.java
index 73c6a64..ce4dd93 100644
--- a/user/test/com/google/gwt/core/client/interop/JsPropertyTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsPropertyTest.java
@@ -17,12 +17,15 @@
 
 import static com.google.gwt.core.client.ScriptInjector.TOP_WINDOW;
 
+import static jsinterop.annotations.JsPackage.GLOBAL;
+
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.ScriptInjector;
-import com.google.gwt.core.client.js.JsProperty;
-import com.google.gwt.core.client.js.JsType;
 import com.google.gwt.junit.client.GWTTestCase;
 
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
+
 /**
  * Tests JsProperty functionality.
  */
@@ -138,7 +141,7 @@
     assertEquals(12 + SET_X, obj.x);
   }
 
-  @JsType(prototype = "JsPropertyTest_MyNativeJsType")
+  @JsType(isNative = true, namespace = GLOBAL, name = "JsPropertyTest_MyNativeJsType")
   static class MyNativeJsType {
 
     public static int staticX;
@@ -196,7 +199,7 @@
     assertEquals(52, mc.getY());
   }
 
-  @JsType(prototype = "JsPropertyTest_MyNativeJsTypeInterface")
+  @JsType(isNative = true, namespace = GLOBAL, name = "JsPropertyTest_MyNativeJsTypeInterface")
   interface MyNativeJsTypeInterface {
     @JsProperty
     int getX();
@@ -318,7 +321,7 @@
     assertEquals(5 + SET_PARENT_X, ((OtherAccidentalImplementer) object).x);
   }
 
-  @JsType
+  @JsType(isNative = true)
   interface MyJsTypeInterfaceWithProtectedNames {
     String var();
 
@@ -341,7 +344,7 @@
     assertEquals("import2", obj.getImport());
   }
 
-  @JsType
+  @JsType(isNative = true)
   interface JsTypeIsProperty {
 
     @JsProperty
@@ -361,7 +364,7 @@
     assertFalse(object.isX());
   }
 
-  @JsType
+  @JsType(isNative = true)
   interface JsTypeGetProperty {
 
     @JsProperty
diff --git a/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java b/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java
index eb64663..b938e95 100644
--- a/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java
@@ -15,10 +15,11 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsProperty;
-import com.google.gwt.core.client.js.JsType;
 import com.google.gwt.junit.client.GWTTestCase;
 
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
+
 /**
  * Tests JsType with array functionality.
  */
@@ -31,7 +32,7 @@
 
   /* MAKE SURE EACH TYPE IS ONLY USED ONCE PER TEST CASE */
 
-  @JsType
+  @JsType(isNative = true)
   interface SimpleJsTypeReturnFromNative { }
 
   public void testJsTypeArray_returnFromNative() {
@@ -44,21 +45,21 @@
     return [{}, {}];
   }-*/;
 
-  @JsType
-  interface SimpleJsTypeReturnFromNativeWithACall {
+  @JsType(isNative = true)
+  interface SimpleJsTypeReturnFromNativeWithAMethod {
     @JsProperty int getId();
   }
 
   public void testJsTypeArray_returnFromNativeWithACall() {
-    SimpleJsTypeReturnFromNativeWithACall[] array = returnJsTypeWithIdsFromNative();
+    SimpleJsTypeReturnFromNativeWithAMethod[] array = returnJsTypeWithIdsFromNative();
     assertEquals(2, array[1].getId());
   }
 
-  private native SimpleJsTypeReturnFromNativeWithACall[] returnJsTypeWithIdsFromNative() /*-{
+  private native SimpleJsTypeReturnFromNativeWithAMethod[] returnJsTypeWithIdsFromNative() /*-{
     return [{id:1}, {id:2}];
   }-*/;
 
-  @JsType
+  @JsType(isNative = true)
   interface SimpleJsTypeAsAField { }
 
   @JsType
@@ -79,7 +80,7 @@
     holder.arrayField = [{}, {}];
   }-*/;
 
-  @JsType
+  @JsType(isNative = true)
   interface SimpleJsTypeAsAParam { }
 
   @JsType
@@ -103,7 +104,7 @@
     holder.setArrayParam([{}, {}]);
   }-*/;
 
-  @JsType
+  @JsType(isNative = true)
   interface SimpleJsTypeReturnForMultiDimArray {
     @JsProperty int getId();
   }
diff --git a/user/test/com/google/gwt/core/client/interop/JsTypeRunnable.java b/user/test/com/google/gwt/core/client/interop/JsTypeRunnable.java
index 21bb672..316bf05 100644
--- a/user/test/com/google/gwt/core/client/interop/JsTypeRunnable.java
+++ b/user/test/com/google/gwt/core/client/interop/JsTypeRunnable.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
  * Causes the run() function of any implementor to be exported.
diff --git a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
index 14d9ae9..2173649 100644
--- a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
@@ -17,15 +17,19 @@
 
 import static com.google.gwt.core.client.ScriptInjector.TOP_WINDOW;
 
+import static jsinterop.annotations.JsPackage.GLOBAL;
+
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.ScriptInjector;
-import com.google.gwt.core.client.js.JsFunction;
-import com.google.gwt.core.client.js.JsProperty;
-import com.google.gwt.core.client.js.JsType;
 import com.google.gwt.junit.client.GWTTestCase;
 
 import java.util.Iterator;
 
+import jsinterop.annotations.JsFunction;
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
+
 /**
  * Tests JsType functionality.
  */
@@ -38,8 +42,7 @@
 
   @Override
   protected void gwtSetUp() throws Exception {
-    ScriptInjector.fromString("function JsTypeTest_MyNativeJsTypeInterface() {}\n"
-        + "function JsTypeTest_MyNativeJsType() {}\n"
+    ScriptInjector.fromString("function JsTypeTest_MyNativeJsType() {}\n"
         + "JsTypeTest_MyNativeJsType.prototype.sum = "
         + "    function sum(bias) { return this.y + bias; };")
         .setWindow(TOP_WINDOW).inject();
@@ -123,7 +126,7 @@
     PlainParentType plainParentType = new PlainParentType();
     RevealedOverrideSubType revealedOverrideSubType = new RevealedOverrideSubType();
 
-    // PlainParentType is neither @JsExport or @JsType and so exports no functions.
+    // PlainParentType is neither @JsType or @JsType and so exports no functions.
     assertFalse(hasField(plainParentType, "run"));
 
     // RevealedOverrideSubType defines no functions itself, it only inherits them, but it still
@@ -141,7 +144,7 @@
     assertEquals(100, subclassInterface.publicMethodAlsoExposedAsNonJsMethod());
   }
 
-  @JsType(prototype = "JsTypeTest_MyNativeJsTypeInterface")
+  @JsType(isNative = true)
   interface MyNativeJsTypeInterface {
   }
 
@@ -150,20 +153,20 @@
 
   public void testCasts() {
     Object myClass;
-    assertNotNull(myClass = (ElementLikeJsInterface) createMyNativeJsTypeInterface());
-    assertNotNull(myClass = (MyNativeJsTypeInterface) createMyNativeJsTypeInterface());
-    assertNotNull(myClass = (HTMLElement) createNativeButton());
+    assertNotNull(myClass = (ElementLikeNativeInterface) createMyNativeJsType());
+    assertNotNull(myClass = (MyNativeJsTypeInterface) createMyNativeJsType());
+    assertNotNull(myClass = (HTMLElementConcreteNativeJsType) createNativeButton());
 
     try {
-      assertNotNull(myClass = (HTMLElement) createMyNativeJsTypeInterface());
+      assertNotNull(myClass = (HTMLElementConcreteNativeJsType) createMyNativeJsType());
       fail();
     } catch (ClassCastException cce) {
       // Expected.
     }
 
     // Test cross cast for native types
-    Object nativeButton1 = (HTMLElement) createNativeButton();
-    Object nativeButton2 = (HTMLAnotherElement) nativeButton1;
+    Object nativeButton1 = (HTMLElementConcreteNativeJsType) createNativeButton();
+    Object nativeButton2 = (HTMLElementAnotherConcreteNativeJsType) nativeButton1;
 
     /*
      * If the optimizations are turned on, it is possible for the compiler to dead-strip the
@@ -177,25 +180,32 @@
   /**
    * A test class marked with JsType but isn't referenced from any Java code except instanceof.
    */
-  @JsType(prototype = "JsTypeTest_MyNativeJsTypeInterface")
-  public interface MyJsInterfaceWithPrototypeAndOnlyInstanceofReference {
+  @JsType(isNative = true)
+  public interface MyNativeJsTypeInterfaceAndOnlyInstanceofReference {
+  }
+
+  /**
+   * A test class marked with JsType but isn't referenced from any Java code except instanceof.
+   */
+  @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "JsTypeTest_MyNativeJsType")
+  public static class AliasToMyNativeJsTypeWithOnlyInstanceofReference {
   }
 
   public void testInstanceOf_jsoWithProto() {
-    Object object = createMyNativeJsTypeInterface();
+    Object object = createMyNativeJsType();
 
     assertTrue(object instanceof Object);
-    assertFalse(object instanceof HTMLAnotherElement);
+    assertFalse(object instanceof HTMLElementAnotherConcreteNativeJsType);
     assertFalse(object instanceof HTMLButtonElement);
-    assertFalse(object instanceof HTMLElement);
+    assertFalse(object instanceof HTMLElementConcreteNativeJsType);
     assertFalse(object instanceof Iterator);
     assertTrue(object instanceof MyNativeJsTypeInterface);
     assertFalse(object instanceof MyNativeJsTypeInterfaceImpl);
-    assertTrue(object instanceof ElementLikeJsInterface);
-    assertFalse(object instanceof ElementLikeJsInterfaceImpl);
-    assertTrue(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
-    assertTrue(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertFalse(object instanceof ElementLikeNativeInterfaceImpl);
+    assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
+    assertTrue(object instanceof MyNativeJsTypeInterfaceAndOnlyInstanceofReference);
+    assertTrue(object instanceof AliasToMyNativeJsTypeWithOnlyInstanceofReference);
     assertFalse(object instanceof ConcreteJsType);
   }
 
@@ -203,17 +213,17 @@
     Object object = JavaScriptObject.createObject();
 
     assertTrue(object instanceof Object);
-    assertFalse(object instanceof HTMLAnotherElement);
+    assertFalse(object instanceof HTMLElementAnotherConcreteNativeJsType);
     assertFalse(object instanceof HTMLButtonElement);
-    assertFalse(object instanceof HTMLElement);
+    assertFalse(object instanceof HTMLElementConcreteNativeJsType);
     assertFalse(object instanceof Iterator);
-    assertFalse(object instanceof MyNativeJsTypeInterface);
+    assertTrue(object instanceof MyNativeJsTypeInterface);
     assertFalse(object instanceof MyNativeJsTypeInterfaceImpl);
-    assertTrue(object instanceof ElementLikeJsInterface);
-    assertFalse(object instanceof ElementLikeJsInterfaceImpl);
-    assertTrue(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertFalse(object instanceof ElementLikeNativeInterfaceImpl);
+    assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
+    assertTrue(object instanceof MyNativeJsTypeInterfaceAndOnlyInstanceofReference);
+    assertFalse(object instanceof AliasToMyNativeJsTypeWithOnlyInstanceofReference);
     assertFalse(object instanceof ConcreteJsType);
   }
 
@@ -221,36 +231,36 @@
     Object object = createNativeButton();
 
     assertTrue(object instanceof Object);
-    assertTrue(object instanceof HTMLAnotherElement);
+    assertTrue(object instanceof HTMLElementAnotherConcreteNativeJsType);
     assertTrue(object instanceof HTMLButtonElement);
-    assertTrue(object instanceof HTMLElement);
+    assertTrue(object instanceof HTMLElementConcreteNativeJsType);
     assertFalse(object instanceof Iterator);
-    assertFalse(object instanceof MyNativeJsTypeInterface);
+    assertTrue(object instanceof MyNativeJsTypeInterface);
     assertFalse(object instanceof MyNativeJsTypeInterfaceImpl);
-    assertTrue(object instanceof ElementLikeJsInterface);
-    assertFalse(object instanceof ElementLikeJsInterfaceImpl);
-    assertTrue(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
-    assertTrue(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertFalse(object instanceof ElementLikeNativeInterfaceImpl);
+    assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
+    assertTrue(object instanceof MyNativeJsTypeInterfaceAndOnlyInstanceofReference);
+    assertFalse(object instanceof AliasToMyNativeJsTypeWithOnlyInstanceofReference);
     assertFalse(object instanceof ConcreteJsType);
   }
 
   public void testInstanceOf_implementsJsType() {
     // Foils type tightening.
-    Object object = alwaysTrue() ? new ElementLikeJsInterfaceImpl() : new Object();
+    Object object = alwaysTrue() ? new ElementLikeNativeInterfaceImpl() : new Object();
 
     assertTrue(object instanceof Object);
-    assertFalse(object instanceof HTMLAnotherElement);
+    assertFalse(object instanceof HTMLElementAnotherConcreteNativeJsType);
     assertFalse(object instanceof HTMLButtonElement);
-    assertFalse(object instanceof HTMLElement);
+    assertFalse(object instanceof HTMLElementConcreteNativeJsType);
     assertFalse(object instanceof Iterator);
-    assertFalse(object instanceof MyNativeJsTypeInterface);
+    assertTrue(object instanceof MyNativeJsTypeInterface);
     assertFalse(object instanceof MyNativeJsTypeInterfaceImpl);
-    assertTrue(object instanceof ElementLikeJsInterface);
-    assertTrue(object instanceof ElementLikeJsInterfaceImpl);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertTrue(object instanceof ElementLikeNativeInterfaceImpl);
     assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
+    assertTrue(object instanceof MyNativeJsTypeInterfaceAndOnlyInstanceofReference);
+    assertFalse(object instanceof AliasToMyNativeJsTypeWithOnlyInstanceofReference);
     assertFalse(object instanceof ConcreteJsType);
   }
 
@@ -259,17 +269,17 @@
     Object object = alwaysTrue() ? new MyNativeJsTypeInterfaceImpl() : new Object();
 
     assertTrue(object instanceof Object);
-    assertFalse(object instanceof HTMLAnotherElement);
+    assertFalse(object instanceof HTMLElementAnotherConcreteNativeJsType);
     assertFalse(object instanceof HTMLButtonElement);
-    assertFalse(object instanceof HTMLElement);
+    assertFalse(object instanceof HTMLElementConcreteNativeJsType);
     assertFalse(object instanceof Iterator);
     assertTrue(object instanceof MyNativeJsTypeInterface);
     assertTrue(object instanceof MyNativeJsTypeInterfaceImpl);
-    assertFalse(object instanceof ElementLikeJsInterface);
-    assertFalse(object instanceof ElementLikeJsInterfaceImpl);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertFalse(object instanceof ElementLikeNativeInterfaceImpl);
     assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
+    assertTrue(object instanceof MyNativeJsTypeInterfaceAndOnlyInstanceofReference);
+    assertFalse(object instanceof AliasToMyNativeJsTypeWithOnlyInstanceofReference);
     assertFalse(object instanceof ConcreteJsType);
   }
 
@@ -278,17 +288,17 @@
     Object object = alwaysTrue() ? new ConcreteJsType() : new Object();
 
     assertTrue(object instanceof Object);
-    assertFalse(object instanceof HTMLAnotherElement);
+    assertFalse(object instanceof HTMLElementAnotherConcreteNativeJsType);
     assertFalse(object instanceof HTMLButtonElement);
-    assertFalse(object instanceof HTMLElement);
+    assertFalse(object instanceof HTMLElementConcreteNativeJsType);
     assertFalse(object instanceof Iterator);
-    assertFalse(object instanceof MyNativeJsTypeInterface);
+    assertTrue(object instanceof MyNativeJsTypeInterface);
     assertFalse(object instanceof MyNativeJsTypeInterfaceImpl);
-    assertFalse(object instanceof ElementLikeJsInterface);
-    assertFalse(object instanceof ElementLikeJsInterfaceImpl);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertFalse(object instanceof ElementLikeNativeInterfaceImpl);
     assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
+    assertTrue(object instanceof MyNativeJsTypeInterfaceAndOnlyInstanceofReference);
+    assertFalse(object instanceof AliasToMyNativeJsTypeWithOnlyInstanceofReference);
     assertTrue(object instanceof ConcreteJsType);
   }
 
@@ -297,21 +307,21 @@
     Object object = alwaysTrue() ? new MyCustomHtmlButtonWithIterator() : new Object();
 
     assertTrue(object instanceof Object);
-    assertTrue(object instanceof HTMLAnotherElement);
+    assertTrue(object instanceof HTMLElementAnotherConcreteNativeJsType);
     assertTrue(object instanceof HTMLButtonElement);
-    assertTrue(object instanceof HTMLElement);
+    assertTrue(object instanceof HTMLElementConcreteNativeJsType);
     assertTrue(object instanceof Iterable);
-    assertFalse(object instanceof MyNativeJsTypeInterface);
+    assertTrue(object instanceof MyNativeJsTypeInterface);
     assertFalse(object instanceof MyNativeJsTypeInterfaceImpl);
-    assertFalse(object instanceof ElementLikeJsInterface);
-    assertFalse(object instanceof ElementLikeJsInterfaceImpl);
+    assertTrue(object instanceof ElementLikeNativeInterface);
+    assertFalse(object instanceof ElementLikeNativeInterfaceImpl);
     assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
-    assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
-    assertTrue(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
+    assertTrue(object instanceof MyNativeJsTypeInterfaceAndOnlyInstanceofReference);
+    assertFalse(object instanceof AliasToMyNativeJsTypeWithOnlyInstanceofReference);
     assertFalse(object instanceof ConcreteJsType);
   }
 
-  @JsType(prototype = "JsTypeTest_MyNativeJsType")
+  @JsType(isNative = true, namespace = GLOBAL, name = "JsTypeTest_MyNativeJsType")
   static class MyNativeJsType {
     @JsProperty
     public native int getY();
@@ -334,18 +344,18 @@
     assertTrue(myNativeJsTypeSubclass instanceof MyNativeJsTypeSubclass);
   }
 
-  @JsType(prototype = "testfoo.bar.MyNativeType")
-  interface MyNamespacedJsInterface {
+  @JsType(isNative = true, namespace = "testfoo.bar")
+  static class MyNamespacedNativeJsType {
   }
 
-  public void testInstanceOf_withNameSpace() {
+  public void _testInstanceOf_withNameSpace() {
     Object obj1 = createMyNamespacedJsInterface();
     Object obj2 = createMyWrongNamespacedJsInterface();
 
-    assertTrue(obj1 instanceof MyNamespacedJsInterface);
-    assertFalse(obj1 instanceof MyNativeJsTypeInterface);
+    assertTrue(obj1 instanceof MyNamespacedNativeJsType);
+    assertFalse(obj1 instanceof MyNativeJsType);
 
-    assertFalse(obj2 instanceof MyNamespacedJsInterface);
+    assertFalse(obj2 instanceof MyNamespacedNativeJsType);
   }
 
   public void testEnumeration() {
@@ -378,20 +388,20 @@
     return $doc.createElement("button");
   }-*/;
 
-  private static native Object createMyNativeJsTypeInterface() /*-{
-    return new $wnd.JsTypeTest_MyNativeJsTypeInterface();
+  private static native Object createMyNativeJsType() /*-{
+    return new $wnd.JsTypeTest_MyNativeJsType();
   }-*/;
 
   private static native Object createMyNamespacedJsInterface() /*-{
     $wnd.testfoo = {};
     $wnd.testfoo.bar = {};
-    $wnd.testfoo.bar.MyNativeType = function(){};
-    return new $wnd.testfoo.bar.MyNativeType();
+    $wnd.testfoo.bar.MyNamespacedNativeJsType = function(){};
+    return new $wnd.testfoo.bar.MyNamespacedNativeJsType();
   }-*/;
 
   private static native Object createMyWrongNamespacedJsInterface() /*-{
-    $wnd["testfoo.bar.MyNativeType"] = function(){};
-    return new $wnd['testfoo.bar.MyNativeType']();
+    $wnd["testfoo.bar.MyNamespacedNativeJsType"] = function(){};
+    return new $wnd['testfoo.bar.MyNamespacedNativeJsType']();
   }-*/;
 
   private static native boolean isUndefined(int value) /*-{
@@ -430,13 +440,13 @@
   static class SimpleJsTypeFieldClass implements SimpleJsTypeFieldInterface {
   }
 
-  @JsType
   static class SimpleJsTypeWithField {
+    @JsProperty
     public SimpleJsTypeFieldInterface someField;
   }
 
   public void testJsTypeField() {
-    new SimpleJsTypeFieldClass();
+    assertTrue(new SimpleJsTypeFieldClass() != new SimpleJsTypeFieldClass());
     SimpleJsTypeWithField holder = new SimpleJsTypeWithField();
     fillJsTypeField(holder);
     SimpleJsTypeFieldInterface someField = holder.someField;
@@ -447,7 +457,7 @@
     jstype.someField = {};
   }-*/;
 
-  @JsType
+  @JsType(isNative = true)
   interface InterfaceWithSingleJavaConcrete {
     int m();
   }
diff --git a/user/test/com/google/gwt/core/client/interop/MyClassExportsConstructor.java b/user/test/com/google/gwt/core/client/interop/MyClassExportsConstructor.java
index d7052af..9618dfc 100644
--- a/user/test/com/google/gwt/core/client/interop/MyClassExportsConstructor.java
+++ b/user/test/com/google/gwt/core/client/interop/MyClassExportsConstructor.java
@@ -15,15 +15,15 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsConstructor;
 
 /**
- * A test class that exhibits a variety of @JsExports on constructors.
+ * A test class that exports a constructor.
  */
 public class MyClassExportsConstructor {
   private int a;
 
-  @JsExport
+  @JsConstructor
   public MyClassExportsConstructor(int a) {
     this.a = a;
   }
diff --git a/user/test/com/google/gwt/core/client/interop/MyClassExportsMethod.java b/user/test/com/google/gwt/core/client/interop/MyClassExportsMethod.java
index 921b3aa..95e3989 100644
--- a/user/test/com/google/gwt/core/client/interop/MyClassExportsMethod.java
+++ b/user/test/com/google/gwt/core/client/interop/MyClassExportsMethod.java
@@ -15,13 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import static com.google.gwt.core.client.js.JsNamespace.GLOBAL;
+import static jsinterop.annotations.JsPackage.GLOBAL;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNamespace;
+import jsinterop.annotations.JsMethod;
 
 /**
- * A test class that exhibits a variety of @JsExports.
+ * A test class that exhibits a variety of @JsTypes.
  */
 public class MyClassExportsMethod {
   public static boolean calledFromCallMe1 = false;
@@ -30,30 +29,27 @@
   public static boolean calledFromCallMe4 = false;
   public static boolean calledFromCallMe5 = false;
 
-  @JsNamespace(GLOBAL)
-  @JsExport("exported")
+  @JsMethod(namespace = GLOBAL, name = "exported")
   public static void callMe1() {
     calledFromCallMe1 = true;
   }
 
-  @JsNamespace("exportNamespace")
-  @JsExport("exported")
+  @JsMethod(namespace = "exportNamespace", name = "exported")
   public static void callMe2(int i) {
     calledFromCallMe2 = true;
   }
 
-  @JsNamespace("exportNamespace")
-  @JsExport
+  @JsMethod(namespace = "exportNamespace")
   public static void callMe3(float f) {
     calledFromCallMe3 = true;
   }
 
-  @JsExport("exported")
+  @JsMethod(name = "exported")
   public static void callMe4(boolean f) {
     calledFromCallMe4 = true;
   }
 
-  @JsExport
+  @JsMethod
   public static void callMe5(byte f) {
     calledFromCallMe5 = true;
   }
@@ -83,21 +79,18 @@
   }
 
   // There should be no calls to this method from java.
-  @JsNamespace(GLOBAL)
-  @JsExport("callBar")
+  @JsMethod(namespace = GLOBAL)
   public static void callBar(A a) {
     a.bar();
   }
 
   // There should be a call to this method from java.
-  @JsNamespace(GLOBAL)
-  @JsExport("callFoo")
+  @JsMethod(namespace = GLOBAL)
   public static void callFoo(A a) {
     a.foo();
   }
 
-  @JsNamespace(GLOBAL)
-  @JsExport("newA")
+  @JsMethod(namespace = GLOBAL)
   public static A newA() {
     return new A();
   }
diff --git a/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithClinit.java b/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithClinit.java
index 99694d9..d378eab 100644
--- a/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithClinit.java
+++ b/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithClinit.java
@@ -17,7 +17,7 @@
 
 import static junit.framework.Assert.assertEquals;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsConstructor;
 
 class MyClassExportsMethodWithClinit {
 
@@ -30,7 +30,7 @@
     }
   }
 
-  @JsExport
+  @JsConstructor
   public MyClassExportsMethodWithClinit() {
     // ensure clinit() is called even when invoked from JS
     assertEquals(42, magicNumber);
diff --git a/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithoutReference.java b/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithoutReference.java
index 27ab623..a3a534f 100644
--- a/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithoutReference.java
+++ b/user/test/com/google/gwt/core/client/interop/MyClassExportsMethodWithoutReference.java
@@ -15,13 +15,13 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsMethod;
 
 /**
  * A test class exports a method but isn't referenced from any Java code.
  */
 public class MyClassExportsMethodWithoutReference {
-  @JsExport("onlyCalledFromJs")
+  @JsMethod(name = "onlyCalledFromJs")
   public static int callMe() {
     return 42;
   }
diff --git a/user/test/com/google/gwt/core/client/interop/MyClassWithEmptyNamespace.java b/user/test/com/google/gwt/core/client/interop/MyClassWithEmptyNamespace.java
index 77c5db2..560d787 100644
--- a/user/test/com/google/gwt/core/client/interop/MyClassWithEmptyNamespace.java
+++ b/user/test/com/google/gwt/core/client/interop/MyClassWithEmptyNamespace.java
@@ -15,17 +15,18 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNamespace;
+import jsinterop.annotations.JsConstructor;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
 
 /**
  * Class with empty namespace.
  */
-@JsNamespace("")
+@JsType(namespace = "")
 public class MyClassWithEmptyNamespace {
-  @JsExport
+  @JsProperty
   public static final int DAN = 82;
 
-  @JsExport
+  @JsConstructor
   public MyClassWithEmptyNamespace() { }
 }
diff --git a/user/test/com/google/gwt/core/client/interop/MyClassWithNamespace.java b/user/test/com/google/gwt/core/client/interop/MyClassWithNamespace.java
index ab4fa57..4ddc0f7 100644
--- a/user/test/com/google/gwt/core/client/interop/MyClassWithNamespace.java
+++ b/user/test/com/google/gwt/core/client/interop/MyClassWithNamespace.java
@@ -15,14 +15,14 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNamespace;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
 
 /**
  * Class with a namespace.
  */
-@JsNamespace("foobaz")
+@JsType(namespace = "foobaz")
 public class MyClassWithNamespace {
-  @JsExport
+  @JsProperty
   public static final int BAZ = 99;
 }
diff --git a/user/test/com/google/gwt/core/client/interop/MyClassWithNestedExportedClass.java b/user/test/com/google/gwt/core/client/interop/MyClassWithNestedExportedClass.java
index 6349a11..2c13781 100644
--- a/user/test/com/google/gwt/core/client/interop/MyClassWithNestedExportedClass.java
+++ b/user/test/com/google/gwt/core/client/interop/MyClassWithNestedExportedClass.java
@@ -15,8 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNamespace;
+import jsinterop.annotations.JsType;
 
 /**
  * Class with a nested exported class.
@@ -25,7 +24,7 @@
   /**
    * Exported nested class.
    */
-  @JsExport
+  @JsType
   public static class Inner {
     public static final int WOO = 99;
   }
@@ -33,8 +32,7 @@
   /**
    * Exported nested class with namespace.
    */
-  @JsNamespace("zoo")
-  @JsExport
+  @JsType(namespace = "zoo")
   public static class InnerWithNamespace {
     public static final int WOOZ = 999;
   }
@@ -42,7 +40,7 @@
   /**
    * Exported nested enum.
    */
-  @JsExport
+  @JsType
   public enum InnerEnum {
     AA, BB;
   }
diff --git a/user/test/com/google/gwt/core/client/interop/MyEnumWithJsType.java b/user/test/com/google/gwt/core/client/interop/MyEnumWithJsType.java
index 7cc67e8..6cce259 100644
--- a/user/test/com/google/gwt/core/client/interop/MyEnumWithJsType.java
+++ b/user/test/com/google/gwt/core/client/interop/MyEnumWithJsType.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
  * This enum is annotated as a @JsType.
diff --git a/user/test/com/google/gwt/core/client/interop/MyEnumWithSubclassGen.java b/user/test/com/google/gwt/core/client/interop/MyEnumWithSubclassGen.java
index dccda4d..36f5e9c 100644
--- a/user/test/com/google/gwt/core/client/interop/MyEnumWithSubclassGen.java
+++ b/user/test/com/google/gwt/core/client/interop/MyEnumWithSubclassGen.java
@@ -15,13 +15,11 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
- * This enum is annotated as @JsExport and has enumerations which cause subclass generation.
+ * This enum is annotated exported and has enumerations which cause subclass generation.
  */
-@JsExport
 @JsType
 public enum MyEnumWithSubclassGen {
 
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedClass.java b/user/test/com/google/gwt/core/client/interop/MyExportedClass.java
index 9c2d613..13e10f7 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedClass.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedClass.java
@@ -15,13 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
- * A test class that is annotated by @JsExport.
+ * A test class that is exported.
  */
-@JsExport
+@JsType
 public class MyExportedClass {
 
   public static final int EXPORTED_1 = 100;
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java
index f74c39f..66894a8 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java
@@ -15,12 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsType;
 
 /**
- * A class which only has implicit default constructor and is annotated by "JsExport".
+ * A class which only has implicit default constructor and is exported.
  * Its default constructor is exported automatically.
  */
-@JsExport
+@JsType
 public class MyExportedClassWithImplicitConstructor {
 }
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespace.java b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespace.java
index 16b9713..f29e5b4 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespace.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespace.java
@@ -15,14 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNamespace;
+import jsinterop.annotations.JsType;
 
 /**
  * Test namespace on a class.
  */
-@JsNamespace("foo")
-@JsExport
+@JsType(namespace = "foo")
 public class MyExportedClassWithNamespace {
   /**
    * Exported field.
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespaceAndName.java b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespaceAndName.java
index 3d363be..40bc295 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespaceAndName.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNamespaceAndName.java
@@ -15,14 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNamespace;
+import jsinterop.annotations.JsType;
 
 /**
  * Test namespace on a class.
  */
-@JsNamespace("foo")
-@JsExport("boo")
+@JsType(namespace = "foo", name = "boo")
 public class MyExportedClassWithNamespaceAndName {
   /**
    * Exported field.
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNestedExportedClass.java b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNestedExportedClass.java
index 5e77c60..626a073 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNestedExportedClass.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithNestedExportedClass.java
@@ -15,17 +15,17 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsType;
 
 /**
  * Exported class with a nested exported class.
  */
-@JsExport("Bloo")
+@JsType(name = "Bloo")
 public class MyExportedClassWithNestedExportedClass {
   /**
    * Exported nested class.
    */
-  @JsExport
+  @JsType
   public static class Inner {
     public static final int LOO = 99;
   }
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithPackageNamespace.java b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithPackageNamespace.java
index 5841163..255afae 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithPackageNamespace.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithPackageNamespace.java
@@ -15,12 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsType;
 
 /**
  * An exported class.
  */
-@JsExport // Uses the namespace from the package
+@JsType // Uses the namespace from the package
 public class MyExportedClassWithPackageNamespace {
   /**
    * Exported field.
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedEnum.java b/user/test/com/google/gwt/core/client/interop/MyExportedEnum.java
index 9cffb76..e99cc7c 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedEnum.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedEnum.java
@@ -15,12 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsType;
 
 /**
- * This enum is annotated as @JsExport.
+ * This enum is annotated as @JsType.
  */
-@JsExport
+@JsType
 public enum MyExportedEnum {
   TEST1, TEST2;
 
@@ -30,8 +30,8 @@
 
   public static final int publicStaticFinalField = 1;
 
-  // explicitly marked @JsExport fields must be final
-  // but ones that are in a @JsExported class don't need to be final
+  // explicitly marked @JsProperty fields must be final
+  // but ones that are in an exported class doesn't need to be final
   public static int publicStaticField = 2;
 
   public final int publicFinalField = 3;
diff --git a/user/test/com/google/gwt/core/client/interop/MyJsClassWithPrototypeAndOnlyInstanceofReference.java b/user/test/com/google/gwt/core/client/interop/MyJsClassWithPrototypeAndOnlyInstanceofReference.java
deleted file mode 100644
index d4a013d..0000000
--- a/user/test/com/google/gwt/core/client/interop/MyJsClassWithPrototypeAndOnlyInstanceofReference.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * 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.core.client.interop;
-
-import com.google.gwt.core.client.js.JsType;
-
-/**
- * A test class marked with JsType but isn't referenced from any Java code except instanceof.
- */
-@JsType(prototype = "HTMLButtonElement")
-public class MyJsClassWithPrototypeAndOnlyInstanceofReference {
-}
diff --git a/user/test/com/google/gwt/core/client/interop/MyJsFunctionIdentityInterface.java b/user/test/com/google/gwt/core/client/interop/MyJsFunctionIdentityInterface.java
index 47cb2a7..616ecdd 100644
--- a/user/test/com/google/gwt/core/client/interop/MyJsFunctionIdentityInterface.java
+++ b/user/test/com/google/gwt/core/client/interop/MyJsFunctionIdentityInterface.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsFunction;
+import jsinterop.annotations.JsFunction;
 
 /**
  * A JsFunction interface, which is used to test the SAM function that returns this.
diff --git a/user/test/com/google/gwt/core/client/interop/MyJsFunctionInterface.java b/user/test/com/google/gwt/core/client/interop/MyJsFunctionInterface.java
index 9259272..e1bc958 100644
--- a/user/test/com/google/gwt/core/client/interop/MyJsFunctionInterface.java
+++ b/user/test/com/google/gwt/core/client/interop/MyJsFunctionInterface.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsFunction;
+import jsinterop.annotations.JsFunction;
 
 /**
  * A functional interface annotated by JsFunction.
diff --git a/user/test/com/google/gwt/core/client/interop/MyJsFunctionWithOnlyInstanceofReference.java b/user/test/com/google/gwt/core/client/interop/MyJsFunctionWithOnlyInstanceofReference.java
index 4c5b951..7cf0369 100644
--- a/user/test/com/google/gwt/core/client/interop/MyJsFunctionWithOnlyInstanceofReference.java
+++ b/user/test/com/google/gwt/core/client/interop/MyJsFunctionWithOnlyInstanceofReference.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsFunction;
+import jsinterop.annotations.JsFunction;
 
 /**
  * A functional interface annotated by JsFunction that is only referenced by instanceof.
diff --git a/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithOnlyInstanceofReference.java b/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithOnlyInstanceofReference.java
index acf2863..60f838b 100644
--- a/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithOnlyInstanceofReference.java
+++ b/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithOnlyInstanceofReference.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
  * A test class marked with JsType but isn't referenced from any Java code except instanceof.
diff --git a/user/test/com/google/gwt/core/client/interop/MyJsTypeThatUsesLongType.java b/user/test/com/google/gwt/core/client/interop/MyJsTypeThatUsesLongType.java
index 374e40e..1b2ce5b 100644
--- a/user/test/com/google/gwt/core/client/interop/MyJsTypeThatUsesLongType.java
+++ b/user/test/com/google/gwt/core/client/interop/MyJsTypeThatUsesLongType.java
@@ -15,14 +15,12 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
  * A class with a method that takes and returns longs.
  */
 @JsType
-@JsExport
 public class MyJsTypeThatUsesLongType {
 
   public long addLong(long a, long b) {
diff --git a/user/test/com/google/gwt/core/client/interop/MyOtherJsFunctionInterface.java b/user/test/com/google/gwt/core/client/interop/MyOtherJsFunctionInterface.java
index 4a5f6ed..efdb9c8 100644
--- a/user/test/com/google/gwt/core/client/interop/MyOtherJsFunctionInterface.java
+++ b/user/test/com/google/gwt/core/client/interop/MyOtherJsFunctionInterface.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsFunction;
+import jsinterop.annotations.JsFunction;
 
 /**
  * A @JsFunction interface.
diff --git a/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticField.java b/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticField.java
index 4275644..c15c3e7 100644
--- a/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticField.java
+++ b/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticField.java
@@ -15,20 +15,20 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNoExport;
+import jsinterop.annotations.JsIgnore;
+import jsinterop.annotations.JsType;
 
 /**
  * Test access to static field from JS, ensuring clinit run.
  */
-@JsExport
+@JsType
 public class StaticInitializerStaticField {
   public static final Object EXPORTED_1 = new Object();
 
   // Not final
   public static Object EXPORTED_2 = new Object();
 
-  @JsNoExport
+  @JsIgnore
   public static final Object NOT_EXPORTED_1 = new Object();
 
   // Not static
@@ -46,7 +46,7 @@
   /**
    * Test interface that export a static field.
    */
-  @JsExport
+  @JsType
   public interface InterfaceWithField {
     Object STATIC = new Object();
   }
diff --git a/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticMethod.java b/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticMethod.java
index 6560684..b6fe3a8 100644
--- a/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticMethod.java
+++ b/user/test/com/google/gwt/core/client/interop/StaticInitializerStaticMethod.java
@@ -15,13 +15,13 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsNoExport;
+import jsinterop.annotations.JsIgnore;
+import jsinterop.annotations.JsType;
 
 /**
  * Test access to static field from JS through exported static method.
  */
-@JsExport
+@JsType
 public class StaticInitializerStaticMethod {
   private static StaticInitializerStaticMethod STATIC = new StaticInitializerStaticMethod();
 
@@ -29,7 +29,7 @@
     return STATIC;
   }
 
-  @JsNoExport
+  @JsIgnore
   public static StaticInitializerStaticMethod notExported_1() {
     return STATIC;
   }
diff --git a/user/test/com/google/gwt/core/client/interop/StaticInitializerVirtualMethod.java b/user/test/com/google/gwt/core/client/interop/StaticInitializerVirtualMethod.java
index 2cd3676..cf5ac6c 100644
--- a/user/test/com/google/gwt/core/client/interop/StaticInitializerVirtualMethod.java
+++ b/user/test/com/google/gwt/core/client/interop/StaticInitializerVirtualMethod.java
@@ -15,13 +15,11 @@
  */
 package com.google.gwt.core.client.interop;
 
-import com.google.gwt.core.client.js.JsExport;
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsType;
 
 /**
  * Test access to static field from JS through exported virtual method.
  */
-@JsExport
 @JsType
 public class StaticInitializerVirtualMethod {
   private static StaticInitializerVirtualMethod STATIC = new StaticInitializerVirtualMethod();
diff --git a/user/test/com/google/gwt/core/client/interop/package-info.java b/user/test/com/google/gwt/core/client/interop/package-info.java
index 19705dd..11e1959 100644
--- a/user/test/com/google/gwt/core/client/interop/package-info.java
+++ b/user/test/com/google/gwt/core/client/interop/package-info.java
@@ -13,6 +13,6 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-@com.google.gwt.core.client.js.JsNamespace("woo")
+@jsinterop.annotations.JsPackage(namespace = "woo")
 @com.google.gwt.util.PreventSpuriousRebuilds
 package com.google.gwt.core.client.interop;
diff --git a/user/test/com/google/gwt/core/client/interop/subpackage/MyNestedExportedClassSansPackageNamespace.java b/user/test/com/google/gwt/core/client/interop/subpackage/MyNestedExportedClassSansPackageNamespace.java
index 456192d..1ecd978 100644
--- a/user/test/com/google/gwt/core/client/interop/subpackage/MyNestedExportedClassSansPackageNamespace.java
+++ b/user/test/com/google/gwt/core/client/interop/subpackage/MyNestedExportedClassSansPackageNamespace.java
@@ -13,16 +13,13 @@
  */
 package com.google.gwt.core.client.interop.subpackage;
 
-import com.google.gwt.core.client.js.JsExport;
+import jsinterop.annotations.JsType;
 
 /**
  * An exported class that is also not subject to the package namespace specified in its parent
  * package.
  */
-@JsExport // Does *not* uses the namespace from the parent package
+@JsType // Does *not* uses the namespace from the parent package
 public class MyNestedExportedClassSansPackageNamespace {
-  /**
-   * Exported field.
-   */
   public final static int WOO = 1001;
 }
diff --git a/user/test/com/google/gwt/dev/jjs/optimized/CastOptimizationTest.java b/user/test/com/google/gwt/dev/jjs/optimized/CastOptimizationTest.java
index 4d9743d..1891953 100644
--- a/user/test/com/google/gwt/dev/jjs/optimized/CastOptimizationTest.java
+++ b/user/test/com/google/gwt/dev/jjs/optimized/CastOptimizationTest.java
@@ -16,12 +16,13 @@
 package com.google.gwt.dev.jjs.optimized;
 
 import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.core.client.js.JsType;
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 
 import java.util.Random;
 
+import jsinterop.annotations.JsType;
+
 /**
  * Tests cast checks are optimized out when cast checking is disabled.
  */
@@ -30,7 +31,7 @@
 
   private static class TestObject { }
 
-  @JsType(prototype = "Test")
+  @JsType(isNative = true)
   private interface JsTypeTestInterface { }
 
   private interface DualJsoTestInterface { }
diff --git a/user/test/com/google/gwt/dev/jjs/optimized/OptimizationTestBase.java b/user/test/com/google/gwt/dev/jjs/optimized/OptimizationTestBase.java
index 5677c36..9465ae3 100644
--- a/user/test/com/google/gwt/dev/jjs/optimized/OptimizationTestBase.java
+++ b/user/test/com/google/gwt/dev/jjs/optimized/OptimizationTestBase.java
@@ -48,7 +48,7 @@
     for (char toBeEscaped : ".[]+".toCharArray()) {
       pattern = pattern.replace("" + toBeEscaped, "\\" + toBeEscaped);
     }
-    pattern = pattern.replace("<obf>", "\\w+");
+    pattern = pattern.replace("<obf>", "[\\w$_]+");
     return pattern + ";?";
   }
 }
diff --git a/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java b/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java
index a21dbc3..311abbd 100644
--- a/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/CompilerMiscRegressionTest.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.dev.jjs.test;
 
-import com.google.gwt.core.client.js.JsType;
 import com.google.gwt.dev.jjs.test.overrides.package1.Caller;
 import com.google.gwt.dev.jjs.test.overrides.package1.ClassExposingM;
 import com.google.gwt.dev.jjs.test.overrides.package1.SomeParent;
@@ -36,6 +35,7 @@
 import java.util.Map;
 
 import javaemul.internal.annotations.DoNotInline;
+import jsinterop.annotations.JsType;
 
 /**
  * Tests Miscelaneous fixes.
diff --git a/user/test/com/google/gwt/uibinder/test/client/TestJsElementType.java b/user/test/com/google/gwt/uibinder/test/client/TestJsElementType.java
index c5728b3..3fca08c 100644
--- a/user/test/com/google/gwt/uibinder/test/client/TestJsElementType.java
+++ b/user/test/com/google/gwt/uibinder/test/client/TestJsElementType.java
@@ -15,13 +15,13 @@
  */
 package com.google.gwt.uibinder.test.client;
 
-import com.google.gwt.core.client.js.JsProperty;
-import com.google.gwt.core.client.js.JsType;
+import jsinterop.annotations.JsProperty;
+import jsinterop.annotations.JsType;
 
 /**
  * Test class for checking UiBinder casting to a JsType like this one.
  */
-@JsType
+@JsType(isNative = true)
 public interface TestJsElementType {
   @JsProperty
   String getTagName();