diff --git a/lib/java/build.xml b/lib/java/build.xml
index 02172fb..22a924f 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -191,8 +191,6 @@
   </target>
 
   <target name="deprecated-test" description="Run the non-JUnit test suite" depends="compile-test">
-    <java classname="org.apache.thrift.test.JSONProtoTest"
-      classpathref="test.classpath" failonerror="true" />
     <java classname="org.apache.thrift.test.IdentityTest"
       classpathref="test.classpath" failonerror="true" />
     <java classname="org.apache.thrift.test.EqualityTest"
diff --git a/lib/java/src/org/apache/thrift/protocol/TMessage.java b/lib/java/src/org/apache/thrift/protocol/TMessage.java
index 9efedee..1438b11 100644
--- a/lib/java/src/org/apache/thrift/protocol/TMessage.java
+++ b/lib/java/src/org/apache/thrift/protocol/TMessage.java
@@ -38,10 +38,12 @@
   public final byte type;
   public final int seqid;
 
+  @Override
   public String toString() {
     return "<TMessage name:'" + name + "' type: " + type + " seqid:" + seqid + ">";
   }
 
+  @Override
   public boolean equals(Object other) {
     if (other instanceof TMessage) {
       return equals((TMessage) other);
diff --git a/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java b/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
index e3e592a..b69c47d 100644
--- a/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
+++ b/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
@@ -38,30 +38,42 @@
 
 public abstract class ProtocolTestBase extends TestCase {
 
+  protected abstract boolean canBeUsedNaked();
+  
   protected abstract TProtocolFactory getFactory();
 
   public void testProtocol() throws Exception {
-    internalTestNakedByte();
+    if (canBeUsedNaked()) {
+      internalTestNakedByte();
+    }
     for (int i = 0; i < 128; i++) {
       internalTestByteField((byte)i);
       internalTestByteField((byte)-i);
     }
 
     for (int s : Arrays.asList(0, 1, 7, 150, 15000, 0x7fff, -1, -7, -150, -15000, -0x7fff)) {
-      internalTestNakedI16((short)s);
+      if (canBeUsedNaked()) {
+        internalTestNakedI16((short)s);
+      }
       internalTestI16Field((short)s);
     }
 
     for (int i : Arrays.asList(0, 1, 7, 150, 15000, 31337, 0xffff, 0xffffff, -1, -7, -150, -15000, -0xffff, -0xffffff)) {
-      internalTestNakedI32(i);
+      if (canBeUsedNaked()) {
+        internalTestNakedI32(i);
+      }
       internalTestI32Field(i);
     }
 
-    internalTestNakedI64(0);
+    if (canBeUsedNaked()) {
+      internalTestNakedI64(0);
+    }
     internalTestI64Field(0);
     for (int i = 0; i < 62; i++) {
-      internalTestNakedI64(1L << i);
-      internalTestNakedI64(-(1L << i));
+      if (canBeUsedNaked()) {
+        internalTestNakedI64(1L << i);
+        internalTestNakedI64(-(1L << i));
+      }
       internalTestI64Field(1L << i);
       internalTestI64Field(-(1L << i));
     }
@@ -69,12 +81,16 @@
     internalTestDouble();
 
     for (String s : Arrays.asList("", "short", "borderlinetiny", "a bit longer than the smallest possible")) {
-      internalTestNakedString(s);
+      if (canBeUsedNaked()) {
+        internalTestNakedString(s);
+      }
       internalTestStringField(s);
     }
 
     for (byte[] b : Arrays.asList(new byte[0], new byte[]{0,1,2,3,4,5,6,7,8,9,10}, new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}, new byte[128])) {
-      internalTestNakedBinary(b);
+      if (canBeUsedNaked()) {
+        internalTestNakedBinary(b);
+      }
       internalTestBinaryField(b);
     }
 
@@ -91,7 +107,7 @@
   }
 
   private void internalTestNakedByte() throws Exception {
-    TMemoryBuffer buf = new TMemoryBuffer(0);
+    TMemoryBuffer buf = new TMemoryBuffer(1000);
     TProtocol proto = getFactory().getProtocol(buf);
     proto.writeByte((byte)123);
     assertEquals((byte) 123, proto.readByte());
@@ -167,10 +183,24 @@
   }
 
   private void internalTestDouble() throws Exception {
-    TMemoryBuffer buf = new TMemoryBuffer(1000);
-    TProtocol proto = getFactory().getProtocol(buf);
-    proto.writeDouble(123.456);
-    assertEquals(123.456, proto.readDouble());
+    if (canBeUsedNaked()) {
+      TMemoryBuffer buf = new TMemoryBuffer(1000);
+      TProtocol proto = getFactory().getProtocol(buf);
+      proto.writeDouble(123.456);
+      assertEquals(123.456, proto.readDouble());
+    }
+    
+    internalTestStructField(new StructFieldTestCase(TType.DOUBLE, (short)15) {
+      @Override
+      public void readMethod(TProtocol proto) throws TException {
+        assertEquals(123.456, proto.readDouble());
+      }
+
+      @Override
+      public void writeMethod(TProtocol proto) throws TException {
+        proto.writeDouble(123.456);
+      }
+    });
   }
 
   private void internalTestNakedString(String str) throws Exception {
diff --git a/lib/java/test/org/apache/thrift/protocol/TestTBinaryProtocol.java b/lib/java/test/org/apache/thrift/protocol/TestTBinaryProtocol.java
index 9f91a5e..aff1492 100644
--- a/lib/java/test/org/apache/thrift/protocol/TestTBinaryProtocol.java
+++ b/lib/java/test/org/apache/thrift/protocol/TestTBinaryProtocol.java
@@ -6,4 +6,9 @@
   protected TProtocolFactory getFactory() {
     return new TBinaryProtocol.Factory();
   }
+
+  @Override
+  protected boolean canBeUsedNaked() {
+    return true;
+  }
 }
diff --git a/lib/java/test/org/apache/thrift/protocol/TestTCompactProtocol.java b/lib/java/test/org/apache/thrift/protocol/TestTCompactProtocol.java
index 67b1655..7d0a37c 100755
--- a/lib/java/test/org/apache/thrift/protocol/TestTCompactProtocol.java
+++ b/lib/java/test/org/apache/thrift/protocol/TestTCompactProtocol.java
@@ -28,4 +28,9 @@
   protected TProtocolFactory getFactory() {
     return new TCompactProtocol.Factory();
   }
+
+  @Override
+  protected boolean canBeUsedNaked() {
+    return true;
+  }
 }
\ No newline at end of file
diff --git a/lib/java/test/org/apache/thrift/protocol/TestTJSONProtocol.java b/lib/java/test/org/apache/thrift/protocol/TestTJSONProtocol.java
new file mode 100644
index 0000000..d7376ac
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/protocol/TestTJSONProtocol.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.thrift.protocol;
+
+public class TestTJSONProtocol extends ProtocolTestBase {
+  @Override
+  protected TProtocolFactory getFactory() {
+    return new TJSONProtocol.Factory();
+  }
+
+  @Override
+  protected boolean canBeUsedNaked() {
+    return false;
+  }
+}
diff --git a/lib/java/test/org/apache/thrift/test/JSONProtoTest.java b/lib/java/test/org/apache/thrift/test/JSONProtoTest.java
deleted file mode 100644
index 23d89a2..0000000
--- a/lib/java/test/org/apache/thrift/test/JSONProtoTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.apache.thrift.test;
-
-// Generated code
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-
-import org.apache.thrift.protocol.TJSONProtocol;
-import org.apache.thrift.transport.TMemoryBuffer;
-
-import thrift.test.Base64;
-import thrift.test.Bonk;
-import thrift.test.HolyMoley;
-import thrift.test.Nesting;
-import thrift.test.OneOfEach;
-
-/**
- * Tests for the Java implementation of TJSONProtocol. Mirrors the C++ version
- *
- */
-public class JSONProtoTest {
-
-  public static void main(String [] args) throws Exception {
-   try {
-      System.out.println("In JSON Proto test");
-
-      OneOfEach ooe = Fixtures.oneOfEach;
-      Nesting n = Fixtures.nesting;
-
-      HolyMoley hm = Fixtures.holyMoley;
-
-      TMemoryBuffer buffer = new TMemoryBuffer(1024);
-      TJSONProtocol proto = new TJSONProtocol(buffer);
-
-      System.out.println("Writing ooe");
-      ooe.write(proto);
-      System.out.println("Reading ooe");
-      OneOfEach ooe2 = new OneOfEach();
-      ooe2.read(proto);
-
-      System.out.println("Comparing ooe");
-      if (!ooe.equals(ooe2)) {
-        throw new RuntimeException("ooe != ooe2");
-      }
-
-      System.out.println("Writing hm");
-      hm.write(proto);
-
-      System.out.println("Reading hm");
-      HolyMoley hm2 = new HolyMoley();
-      hm2.read(proto);
-
-      System.out.println("Comparing hm");
-      if (!hm.equals(hm2)) {
-        throw new RuntimeException("hm != hm2");
-      }
-
-      hm2.big.get(0).a_bite = (byte)0xFF;
-      if (hm.equals(hm2)) {
-        throw new RuntimeException("hm should not equal hm2");
-      }
-
-      Base64 base = new Base64();
-      base.a = 123;
-      base.b1 = "1".getBytes("UTF-8");
-      base.b2 = "12".getBytes("UTF-8");
-      base.b3 = "123".getBytes("UTF-8");
-      base.b4 = "1234".getBytes("UTF-8");
-      base.b5 = "12345".getBytes("UTF-8");
-      base.b6 = "123456".getBytes("UTF-8");
-
-      System.out.println("Writing base");
-      base.write(proto);
-
-      System.out.println("Reading base");
-      Base64 base2 = new Base64();
-      base2.read(proto);
-
-      System.out.println("Comparing base");
-      if (!base.equals(base2)) {
-        throw new RuntimeException("base != base2");
-      }
-
-    } catch (Exception ex) {
-      ex.printStackTrace();
-      throw ex;
-   }
-  }
-
-}
