diff --git a/plugins/xpcom/JavaObject.cpp b/plugins/xpcom/JavaObject.cpp
index 2780090..61d1c8e 100644
--- a/plugins/xpcom/JavaObject.cpp
+++ b/plugins/xpcom/JavaObject.cpp
@@ -41,7 +41,11 @@
 
   NULL, /* object hooks */
   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 */
@@ -52,7 +56,6 @@
 int JavaObject::getObjectId(JSContext* ctx, JSObject* obj) {
   jsval val;
   JSClass* jsClass = JS_GET_CLASS(ctx, obj);
-#if 1
   if (jsClass != &JavaObjectClass) {
     Debug::log(Debug::Error)
         << "JavaObject::getObjectId called on non-JavaObject: " << jsClass->name
@@ -66,7 +69,6 @@
         << " reserved slots, no objectId present" << Debug::flush;
     return -1;
   }
-#endif
   if (!JS_GetReservedSlot(ctx, obj, 0, &val)) {
     Debug::log(Debug::Error) << "Error getting reserved slot" << Debug::flush;
     return -1;
@@ -104,16 +106,21 @@
     return NULL;
   }
   // define toString (TODO: some way to avoid doing this each time)
-#if 1
+#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;
   }
-#endif
+#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;
 }
 
-JSBool JavaObject::getProperty(JSContext* ctx, JSObject* obj, jsval id,
+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);
@@ -123,20 +130,20 @@
     return JS_TRUE;
   }
   int objectRef = JavaObject::getObjectId(ctx, obj);
-  if (JSVAL_IS_STRING(id)) {
-    JSString* str = JSVAL_TO_STRING(id);
-    if ((JS_GetStringLength(str) == 8) && !strncmp("toString",
-          JS_GetStringBytes(str), 8)) {
+  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_GetStringLength(str) == 2) && !strncmp("id",
-          JS_GetStringBytes(str), 2)) {
+    if ((JS_GetStringEncodingLength(ctx, str) == 2) && !strncmp("id",
+          JS_EncodeString(ctx, str), 2)) {
       *rval = INT_TO_JSVAL(objectRef);
       return JS_TRUE;
     }
-    if ((JS_GetStringLength(str) == 16) && !strncmp("__noSuchMethod__",
-          JS_GetStringBytes(str), 16)) {
+    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;
@@ -146,13 +153,13 @@
     // TODO: throw a better exception here
     return JS_FALSE;
   }
-  if (!JSVAL_IS_INT(id)) {
+  if (!JSID_IS_INT(id)) {
     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 = JSVAL_TO_INT(id);
+  int dispId = JSID_TO_INT(id);
 
   HostChannel* channel = data->getHostChannel();
   SessionHandler* handler = data->getSessionHandler();
@@ -162,10 +169,10 @@
   return JS_TRUE;
 }
 
-JSBool JavaObject::setProperty(JSContext* ctx, JSObject* obj, jsval id,
+JSBool JavaObject::setProperty(JSContext* ctx, JSObject* obj, jsid id,
     jsval* vp) {
   Debug::log(Debug::Spam) << "JavaObject::setProperty obj=" << obj << Debug::flush;
-  if (!JSVAL_IS_INT(id)) {
+  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;
@@ -177,7 +184,7 @@
   }
 
   int objectRef = JavaObject::getObjectId(ctx, obj);
-  int dispId = JSVAL_TO_INT(id);
+  int dispId = JSID_TO_INT(id);
 
   Value value;
   data->makeValueFromJsval(value, ctx, *vp);
@@ -232,7 +239,7 @@
           << ", INIT)" << Debug::flush;
       *statep = JSVAL_ZERO;
       if (idp) {
-        *idp = INT_TO_JSVAL(NUM_PROPERTY_NAMES);
+        *idp = INT_TO_JSID(NUM_PROPERTY_NAMES);
       }
       break;
     case JSENUMERATE_NEXT:
@@ -243,7 +250,10 @@
       *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);
@@ -345,6 +355,31 @@
   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,
