diff --git a/Android.mk b/Android.mk
index 6df03ae..931ebf7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -185,7 +185,6 @@
 	$(LOCAL_PATH)/bridge/jni \
 	$(LOCAL_PATH)/bridge/jni/v8
 JNI_SRC_FILES := \
-	jni_class.cpp \
 	jni_instance.cpp \
 	jni_npobject.cpp \
 	jni_runtime.cpp
diff --git a/V8Binding/jni/jni_instance.cpp b/V8Binding/jni/jni_instance.cpp
index c674e88..205e3f4 100644
--- a/V8Binding/jni/jni_instance.cpp
+++ b/V8Binding/jni/jni_instance.cpp
@@ -30,7 +30,7 @@
 #include "jni_instance.h"
 
 #include "JNIUtility.h"
-#include "jni_class.h"
+#include "JavaClassV8.h"
 #include "jni_runtime.h"
 
 #include <assert.h>
diff --git a/V8Binding/jni/jni_npobject.cpp b/V8Binding/jni/jni_npobject.cpp
index d736cdd..31196fc 100644
--- a/V8Binding/jni/jni_npobject.cpp
+++ b/V8Binding/jni/jni_npobject.cpp
@@ -28,7 +28,7 @@
 #include "jni_npobject.h"
 
 #include "JNIUtility.h"
-#include "jni_class.h"
+#include "JavaClassV8.h"
 #include "jni_instance.h"
 #include "jni_runtime.h"
 // This source file should be in bridge/jni, so it's OK to use the private
diff --git a/WebCore/Android.v8bindings.mk b/WebCore/Android.v8bindings.mk
index ac88cf7..88b28c9 100644
--- a/WebCore/Android.v8bindings.mk
+++ b/WebCore/Android.v8bindings.mk
@@ -172,4 +172,5 @@
 
 LOCAL_SRC_FILES += \
 	bridge/jni/JNIUtility.cpp \
+	bridge/jni/v8/JavaClassV8.cpp \
 	bridge/jni/v8/jni_utility_private.cpp
diff --git a/V8Binding/jni/jni_class.cpp b/WebCore/bridge/jni/v8/JavaClassV8.cpp
similarity index 69%
rename from V8Binding/jni/jni_class.cpp
rename to WebCore/bridge/jni/v8/JavaClassV8.cpp
index 2c577d8..54b40c9 100644
--- a/V8Binding/jni/jni_class.cpp
+++ b/WebCore/bridge/jni/v8/JavaClassV8.cpp
@@ -1,31 +1,31 @@
 /*
- * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
- * Copyright 2009, The Android Open Source Project
+ * Copyright (C) 2010 Apple Computer, Inc.  All rights reserved.
+ * Copyright 2010, The Android Open Source Project
  *
  * 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
+ *  * 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
+ *  * 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.
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  * 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. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include "config.h"
-#include "jni_class.h"
+#include "JavaClassV8.h"
 
 #include "JNIUtility.h"
 #include "jni_runtime.h"
@@ -35,28 +35,28 @@
 JavaClass::JavaClass(jobject anInstance)
 {
     jobject aClass = callJNIMethod<jobject>(anInstance, "getClass", "()Ljava/lang/Class;");
-    
+
     if (!aClass) {
         fprintf(stderr, "%s:  unable to call getClass on instance %p\n", __PRETTY_FUNCTION__, anInstance);
         return;
     }
-    
+
     jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;");
-    const char *classNameC = getCharactersFromJString(className);
-    _name = strdup(classNameC);
+    const char* classNameC = getCharactersFromJString(className);
+    m_name = strdup(classNameC);
     releaseCharactersForJString(className, classNameC);
 
     int i;
-    JNIEnv *env = getJNIEnv();
+    JNIEnv* env = getJNIEnv();
 
     // Get the fields
     jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;");
-    int numFields = env->GetArrayLength(fields);    
+    int numFields = env->GetArrayLength(fields);
     for (i = 0; i < numFields; i++) {
         jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i);
-        JavaField *aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
+        JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
         {
-            _fields.set(aField->name(), aField);
+            m_fields.set(aField->name(), aField);
         }
         env->DeleteLocalRef(aJField);
     }
@@ -66,42 +66,43 @@
     int numMethods = env->GetArrayLength(methods);
     for (i = 0; i < numMethods; i++) {
         jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i);
-        JavaMethod *aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
+        JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
         MethodList* methodList;
         {
-            methodList = _methods.get(aMethod->name());
+            methodList = m_methods.get(aMethod->name());
             if (!methodList) {
                 methodList = new MethodList();
-                _methods.set(aMethod->name(), methodList);
+                m_methods.set(aMethod->name(), methodList);
             }
         }
         methodList->append(aMethod);
         env->DeleteLocalRef(aJMethod);
-    }    
+    }
     env->DeleteLocalRef(fields);
     env->DeleteLocalRef(methods);
     env->DeleteLocalRef(aClass);
 }
 
-JavaClass::~JavaClass() {
-    free((void *)_name);
+JavaClass::~JavaClass()
+{
+    free((void*)m_name);
 
-    deleteAllValues(_fields);
-    _fields.clear();
+    deleteAllValues(m_fields);
+    m_fields.clear();
 
-    MethodListMap::const_iterator end = _methods.end();
-    for (MethodListMap::const_iterator it = _methods.begin(); it != end; ++it) {
+    MethodListMap::const_iterator end = m_methods.end();
+    for (MethodListMap::const_iterator it = m_methods.begin(); it != end; ++it) {
         const MethodList* methodList = it->second;
         deleteAllValues(*methodList);
         delete methodList;
     }
-    _methods.clear();
+    m_methods.clear();
 }
 
 MethodList JavaClass::methodsNamed(const char* name) const
 {
-    MethodList *methodList = _methods.get(name);
-    
+    MethodList* methodList = m_methods.get(name);
+
     if (methodList)
         return *methodList;
     return MethodList();
@@ -109,5 +110,5 @@
 
 JavaField* JavaClass::fieldNamed(const char* name) const
 {
-    return _fields.get(name);
+    return m_fields.get(name);
 }
diff --git a/V8Binding/jni/jni_class.h b/WebCore/bridge/jni/v8/JavaClassV8.h
similarity index 67%
rename from V8Binding/jni/jni_class.h
rename to WebCore/bridge/jni/v8/JavaClassV8.h
index 58787d3..12cdf93 100644
--- a/V8Binding/jni/jni_class.h
+++ b/WebCore/bridge/jni/v8/JavaClassV8.h
@@ -1,37 +1,37 @@
 /*
- * Copyright (C) 2003 Apple Computer, Inc.  All rights reserved.
- * Copyright 2009, The Android Open Source Project
+ * Copyright (C) 2010 Apple Computer, Inc.  All rights reserved.
+ * Copyright 2010, The Android Open Source Project
  *
  * 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
+ *  * 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
+ *  * 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.
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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 COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  * 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. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef JNI_CLASS_H_
-#define JNI_CLASS_H_
+#ifndef JavaClassV8_h
+#define JavaClassV8_h
 
-#include <jni_runtime.h>
-#include <wtf/HashMap.h>
-#include <wtf/Vector.h>
 #include "PlatformString.h"
 #include "StringHash.h"
+#include "jni_runtime.h"
+#include <wtf/HashMap.h>
+#include <wtf/Vector.h>
 
 namespace JSC {
 
@@ -43,20 +43,20 @@
 
 class JavaClass {
 public:
-    JavaClass (jobject anInstance);
-    ~JavaClass ();
+    JavaClass(jobject anInstance);
+    ~JavaClass();
 
-    MethodList methodsNamed(const char* name) const;    
+    MethodList methodsNamed(const char* name) const;
     JavaField* fieldNamed(const char* name) const;
 
 private:
-    const char *_name;
-    MethodListMap _methods;
-    FieldMap _fields;
+    const char* m_name;
+    MethodListMap m_methods;
+    FieldMap m_fields;
 };
 
 } // namespace Bindings
 
 } // namespace JSC
 
-#endif // JNI_CLASS_H_
+#endif // JavaClassV8_h
