diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index 298809a..0248cf7 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -322,6 +322,7 @@
     "import java.util.EnumSet;\n" +
     "import java.util.Collections;\n" +
     "import java.util.BitSet;\n" +
+    "import java.nio.ByteBuffer;\n"
     "import java.util.Arrays;\n" +
     "import org.slf4j.Logger;\n" +
     "import org.slf4j.LoggerFactory;\n\n";
@@ -1002,8 +1003,7 @@
   out << endl;
 
   indent(out) << "public boolean equals(" << tstruct->get_name() << " other) {" << endl;
-  indent(out) << "  return other != null && getSetField() == other.getSetField() && ((value_ instanceof byte[]) ? " << endl;
-  indent(out) << "    Arrays.equals((byte[])getFieldValue(), (byte[])other.getFieldValue()) : getFieldValue().equals(other.getFieldValue()));" << endl;
+  indent(out) << "  return other != null && getSetField() == other.getSetField() && getFieldValue().equals(other.getFieldValue());" << endl;
   indent(out) << "}" << endl;
   out << endl;
 
@@ -1312,7 +1312,7 @@
       indent() << "  return false;" << endl;
 
     if (t->is_base_type() && ((t_base_type*)t)->is_binary()) {
-      unequal = "!java.util.Arrays.equals(this." + name + ", that." + name + ")";
+      unequal = "!this." + name + ".equals(that." + name + ")";
     } else if (can_be_null) {
       unequal = "!this." + name + ".equals(that." + name + ")";
     } else {
@@ -1965,12 +1965,7 @@
     }
     
     if (field->get_type()->is_base_type() && ((t_base_type*)(field->get_type()))->is_binary()) {
-      indent(out) << "  int __" << field->get_name() << "_size = Math.min(this." << field->get_name() << ".length, 128);" << endl;
-      indent(out) << "  for (int i = 0; i < __" << field->get_name() << "_size; i++) {" << endl;
-      indent(out) << "    if (i != 0) sb.append(\" \");" << endl;
-      indent(out) << "    sb.append(Integer.toHexString(this." << field->get_name() << "[i]).length() > 1 ? Integer.toHexString(this." << field->get_name() << "[i]).substring(Integer.toHexString(this." << field->get_name() << "[i]).length() - 2).toUpperCase() : \"0\" + Integer.toHexString(this." << field->get_name() << "[i]).toUpperCase());" <<endl;
-      indent(out) << "  }" << endl;
-      indent(out) << "  if (this." << field->get_name() << ".length > 128) sb.append(\" ...\");" << endl;
+      indent(out) << "TBaseHelper.toString(this." << field->get_name() << ", sb);" << endl;
     } else {
       indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << endl;
     }
@@ -3313,7 +3308,7 @@
     return "void";
   case t_base_type::TYPE_STRING:
     if (type->is_binary()) {
-      return "byte[]";
+      return "ByteBuffer";
     } else {
       return "String";
     }
@@ -3691,7 +3686,7 @@
     } else {
       // iterative copy
       if(((t_base_type*)elem_type)->is_binary()){
-        indent(out) << "byte[] temp_binary_element = ";
+        indent(out) << "ByteBuffer temp_binary_element = ";
         generate_deep_copy_non_container(out, iterator_element_name, "temp_binary_element", elem_type);
         out << ";" << endl;
         indent(out) << result_name << ".add(temp_binary_element);" << endl;
@@ -3714,8 +3709,8 @@
   if (type->is_base_type() || type->is_enum() || type->is_typedef()) {
     // binary fields need to be copied with System.arraycopy
     if (((t_base_type*)type)->is_binary()){
-      out << "new byte[" << source_name << ".length];" << endl;
-      indent(out) << "System.arraycopy(" << source_name << ", 0, " << dest_name << ", 0, " << source_name << ".length)";
+      out << "ByteBuffer.wrap(new byte[" << source_name << ".limit() - " << source_name << ".arrayOffset()]);" << endl;
+      indent(out) << "System.arraycopy(" << source_name << ".array(), " << source_name << ".arrayOffset(), " << dest_name << ".array(), 0, " << source_name << ".limit() - " << source_name << ".arrayOffset())";
     }
     // everything else can be copied directly
     else
diff --git a/lib/java/build.xml b/lib/java/build.xml
index b68c95a..aca4bea 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -204,8 +204,6 @@
   <target name="deprecated-test" description="Run the non-JUnit test suite" depends="compile-test">
     <java classname="org.apache.thrift.test.EqualityTest"
       classpathref="test.classpath" failonerror="true" />
-    <java classname="org.apache.thrift.test.ToStringTest"
-      classpathref="test.classpath" failonerror="true" />
     <java classname="org.apache.thrift.test.JavaBeansTest"
       classpathref="test.classpath" failonerror="true" />
   </target>
diff --git a/lib/java/src/org/apache/thrift/TBaseHelper.java b/lib/java/src/org/apache/thrift/TBaseHelper.java
index 55e9505..9a7ee73 100644
--- a/lib/java/src/org/apache/thrift/TBaseHelper.java
+++ b/lib/java/src/org/apache/thrift/TBaseHelper.java
@@ -17,6 +17,7 @@
  */
 package org.apache.thrift;
 
+import java.nio.ByteBuffer;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
@@ -217,4 +218,26 @@
     }
   }
 
+  public static void toString(ByteBuffer bb, StringBuilder sb) {
+    byte[] buf = bb.array();
+
+    int arrayOffset = bb.arrayOffset();
+    int origLimit = bb.limit();
+    int limit = (origLimit - arrayOffset > 128) ? arrayOffset + 128 : origLimit;
+
+    for (int i = arrayOffset; i < limit; i++) {
+      if (i > arrayOffset) {
+        sb.append(" ");
+      }
+      sb.append(paddedByteString(buf[i]));
+    }
+    if (origLimit != limit) {
+      sb.append("...");
+    }
+  }
+
+  public static String paddedByteString(byte b) {
+    int extended = (b | 0x100) & 0x1ff;
+    return Integer.toHexString(extended).toUpperCase().substring(1);
+  }
 }
diff --git a/lib/java/src/org/apache/thrift/TDeserializer.java b/lib/java/src/org/apache/thrift/TDeserializer.java
index 3e9c7c3..dbefcd8 100644
--- a/lib/java/src/org/apache/thrift/TDeserializer.java
+++ b/lib/java/src/org/apache/thrift/TDeserializer.java
@@ -20,6 +20,7 @@
 package org.apache.thrift;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
 
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TField;
@@ -203,9 +204,9 @@
    * @param fieldIdPathRest The rest FieldId's that define a path to a binary field
    * @throws TException
    */
-  public byte[] partialDeserializeByteArray(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException {
+  public ByteBuffer partialDeserializeByteArray(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException {
     // TType does not have binary, so we use the arbitrary num 100
-    return (byte[]) partialDeserializeField((byte)100, bytes, fieldIdPathFirst, fieldIdPathRest);
+    return (ByteBuffer) partialDeserializeField((byte)100, bytes, fieldIdPathFirst, fieldIdPathRest);
   }
 
   /**
diff --git a/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java b/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
index 1cfa69d..913573b 100644
--- a/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
+++ b/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
@@ -20,6 +20,7 @@
 package org.apache.thrift.protocol;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
 
 import org.apache.thrift.TException;
 import org.apache.thrift.transport.TTransport;
@@ -189,9 +190,10 @@
     }
   }
 
-  public void writeBinary(byte[] bin) throws TException {
-    writeI32(bin.length);
-    trans_.write(bin, 0, bin.length);
+  public void writeBinary(ByteBuffer bin) throws TException {
+    int length = bin.limit() - bin.position() - bin.arrayOffset();
+    writeI32(length);
+    trans_.write(bin.array(), bin.position() + bin.arrayOffset(), length);
   }
 
   /**
@@ -356,12 +358,19 @@
     }
   }
 
-  public byte[] readBinary() throws TException {
+  public ByteBuffer readBinary() throws TException {
     int size = readI32();
     checkReadLength(size);
+
+    if (trans_.getBytesRemainingInBuffer() >= size) {
+      ByteBuffer bb = ByteBuffer.wrap(trans_.getBuffer(), trans_.getBufferPosition(), size);
+      trans_.consumeBuffer(size);
+      return bb;
+    }
+
     byte[] buf = new byte[size];
     trans_.readAll(buf, 0, size);
-    return buf;
+    return ByteBuffer.wrap(buf);
   }
 
   private int readAll(byte[] buf, int off, int len) throws TException {
diff --git a/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java b/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java
index f497942..4c2cfc0 100755
--- a/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java
+++ b/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java
@@ -21,6 +21,7 @@
 package org.apache.thrift.protocol;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
 
 import org.apache.thrift.ShortStack;
 import org.apache.thrift.TException;
@@ -294,7 +295,8 @@
    */
   public void writeString(String str) throws TException {
     try {
-      writeBinary(str.getBytes("UTF-8"));
+      byte[] bytes = str.getBytes("UTF-8");
+      writeBinary(bytes, 0, bytes.length);
     } catch (UnsupportedEncodingException e) {
       throw new TException("UTF-8 not supported!");
     }
@@ -303,9 +305,14 @@
   /**
    * Write a byte array, using a varint for the size. 
    */
-  public void writeBinary(byte[] bin) throws TException {
-    writeVarint32(bin.length);
-    trans_.write(bin);
+  public void writeBinary(ByteBuffer bin) throws TException {
+    int length = bin.limit() - bin.position() - bin.arrayOffset();
+    writeBinary(bin.array(), bin.position() + bin.arrayOffset(), length);
+  }
+
+  private void writeBinary(byte[] buf, int offset, int length) throws TException {
+    writeVarint32(length);
+    trans_.write(buf, offset, length);
   }
 
   //
@@ -626,13 +633,13 @@
   /**
    * Read a byte[] from the wire. 
    */
-  public byte[] readBinary() throws TException {
+  public ByteBuffer readBinary() throws TException {
     int length = readVarint32();
-    if (length == 0) return new byte[0];
+    if (length == 0) return ByteBuffer.wrap(new byte[0]);
 
     byte[] buf = new byte[length];
     trans_.readAll(buf, 0, length);
-    return buf;
+    return ByteBuffer.wrap(buf);
   }
 
   /**
diff --git a/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java b/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java
index 89ba9b4..d00980e 100644
--- a/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java
+++ b/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java
@@ -19,12 +19,14 @@
 
 package org.apache.thrift.protocol;
 
-import org.apache.thrift.TException;
-import org.apache.thrift.TByteArrayOutputStream;
-import org.apache.thrift.transport.TTransport;
 import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
 import java.util.Stack;
 
+import org.apache.thrift.TByteArrayOutputStream;
+import org.apache.thrift.TException;
+import org.apache.thrift.transport.TTransport;
+
 /**
  * JSON protocol implementation for thrift.
  *
@@ -438,11 +440,11 @@
 
   // Write out contents of byte array b as a JSON string with base-64 encoded
   // data
-  private void writeJSONBase64(byte[] b) throws TException {
+  private void writeJSONBase64(byte[] b, int offset, int length) throws TException {
     context_.write();
     trans_.write(QUOTE);
-    int len = b.length;
-    int off = 0;
+    int len = length;
+    int off = offset;
     while (len >= 3) {
       // Encode 3 bytes at a time
       TBase64Utils.encode(b, off, 3, tmpbuf_, 0);
@@ -604,8 +606,8 @@
   }
 
   @Override
-  public void writeBinary(byte[] bin) throws TException {
-    writeJSONBase64(bin);
+  public void writeBinary(ByteBuffer bin) throws TException {
+    writeJSONBase64(bin.array(), bin.position() + bin.arrayOffset(), bin.limit() - bin.position() - bin.arrayOffset());
   }
 
   /**
@@ -927,8 +929,8 @@
   }
 
   @Override
-  public byte[] readBinary() throws TException {
-    return readJSONBase64();
+  public ByteBuffer readBinary() throws TException {
+    return ByteBuffer.wrap(readJSONBase64());
   }
 
 }
diff --git a/lib/java/src/org/apache/thrift/protocol/TProtocol.java b/lib/java/src/org/apache/thrift/protocol/TProtocol.java
index 78b07f9..16fac64 100644
--- a/lib/java/src/org/apache/thrift/protocol/TProtocol.java
+++ b/lib/java/src/org/apache/thrift/protocol/TProtocol.java
@@ -19,6 +19,8 @@
 
 package org.apache.thrift.protocol;
 
+import java.nio.ByteBuffer;
+
 import org.apache.thrift.TException;
 import org.apache.thrift.transport.TTransport;
 
@@ -97,7 +99,7 @@
 
   public abstract void writeString(String str) throws TException;
 
-  public abstract void writeBinary(byte[] bin) throws TException;
+  public abstract void writeBinary(ByteBuffer buf) throws TException;
 
   /**
    * Reading methods.
@@ -141,7 +143,7 @@
 
   public abstract String readString() throws TException;
 
-  public abstract byte[] readBinary() throws TException;
+  public abstract ByteBuffer readBinary() throws TException;
 
   /**
    * Reset any internal state back to a blank slate. This method only needs to
diff --git a/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java b/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java
index a60bdf4..83a2532 100644
--- a/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java
+++ b/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java
@@ -20,6 +20,7 @@
 package org.apache.thrift.protocol;
 
 import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
 import java.util.Stack;
 
 import org.apache.thrift.TException;
@@ -282,10 +283,10 @@
     _writeStringData(escape.toString());
   }
 
-  public void writeBinary(byte[] bin) throws TException {
+  public void writeBinary(ByteBuffer bin) throws TException {
     try {
       // TODO(mcslee): Fix this
-      writeString(new String(bin, "UTF-8"));
+      writeString(new String(bin.array(), bin.position() + bin.arrayOffset(), bin.limit() - bin.position() - bin.arrayOffset(), "UTF-8"));
     } catch (UnsupportedEncodingException uex) {
       throw new TException("JVM DOES NOT SUPPORT UTF-8");
     }
@@ -376,9 +377,9 @@
     return "";
   }
 
-  public byte[] readBinary() throws TException {
+  public ByteBuffer readBinary() throws TException {
     // TODO(mcslee): implement
-    return new byte[0];
+    return ByteBuffer.wrap(new byte[0]);
   }
 
 }
diff --git a/lib/java/test/org/apache/thrift/Fixtures.java b/lib/java/test/org/apache/thrift/Fixtures.java
index 75070d0..14bdc08 100644
--- a/lib/java/test/org/apache/thrift/Fixtures.java
+++ b/lib/java/test/org/apache/thrift/Fixtures.java
@@ -20,6 +20,7 @@
 
 package org.apache.thrift;
 
+import java.nio.ByteBuffer;
 import java.util.*;
 import thrift.test.*;
 
@@ -52,7 +53,7 @@
       oneOfEach.double_precision = Math.PI;
       oneOfEach.some_characters = "JSON THIS! \"\1";
       oneOfEach.zomg_unicode = new String(kUnicodeBytes, "UTF-8");
-      oneOfEach.base64 = "base64".getBytes();
+      oneOfEach.base64 = ByteBuffer.wrap("base64".getBytes());
       // byte, i16, and i64 lists are populated by default constructor
 
       Bonk bonk = new Bonk();
@@ -112,7 +113,7 @@
 
       // superhuge compact proto test struct
       compactProtoTestStruct = new CompactProtoTestStruct(thrift.test.Constants.COMPACT_TEST);
-      compactProtoTestStruct.a_binary = new byte[]{0,1,2,3,4,5,6,7,8};
+      compactProtoTestStruct.a_binary = ByteBuffer.wrap(new byte[]{0,1,2,3,4,5,6,7,8});
     } catch (Exception e) {
       throw new RuntimeException(e);
     }
diff --git a/lib/java/test/org/apache/thrift/TestStruct.java b/lib/java/test/org/apache/thrift/TestStruct.java
index 755534d..e9f165d 100644
--- a/lib/java/test/org/apache/thrift/TestStruct.java
+++ b/lib/java/test/org/apache/thrift/TestStruct.java
@@ -18,10 +18,7 @@
  */
 package org.apache.thrift;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
+import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -39,32 +36,13 @@
 import thrift.test.CrazyNesting;
 import thrift.test.HolyMoley;
 import thrift.test.Insanity;
+import thrift.test.JavaTestHelper;
 import thrift.test.Nesting;
 import thrift.test.Numberz;
 import thrift.test.OneOfEach;
 import thrift.test.Xtruct;
 
 public class TestStruct extends TestCase {
-
-  public static Object deepCopyViaSerialization(Object oldObj) throws Exception {
-    ObjectOutputStream oos = null;
-    ObjectInputStream ois = null;
-    try {
-      ByteArrayOutputStream bos =
-        new ByteArrayOutputStream();
-      oos = new ObjectOutputStream(bos);
-      oos.writeObject(oldObj);
-      oos.flush();
-      ByteArrayInputStream bis =
-        new ByteArrayInputStream(bos.toByteArray());
-      ois = new ObjectInputStream(bis);
-      return ois.readObject();
-    } finally {
-      oos.close();
-      ois.close();
-    }
-  }
-
   public void testIdentity() throws Exception {
     TSerializer   binarySerializer   = new   TSerializer(new TBinaryProtocol.Factory());
     TDeserializer binaryDeserializer = new TDeserializer(new TBinaryProtocol.Factory());
@@ -72,7 +50,7 @@
     OneOfEach ooe = Fixtures.oneOfEach;
 
     Nesting n = new Nesting();
-    n.my_ooe = (OneOfEach)deepCopyViaSerialization(ooe);
+    n.my_ooe = ooe;
     n.my_ooe.integer16 = 16;
     n.my_ooe.integer32 = 32;
     n.my_ooe.integer64 = 64;
@@ -127,10 +105,10 @@
     assertEquals(hmCopy, hmCopy2);
 
     // change binary value in original object
-    hm.big.get(0).base64[0]++;
+    hm.big.get(0).base64.array()[0]++;
     // make sure the change didn't propagate to the copied object
     assertFalse(hm.equals(hmCopy2));
-    hm.big.get(0).base64[0]--; // undo change
+    hm.big.get(0).base64.array()[0]--; // undo change
 
     hmCopy2.bonks.get("two").get(1).message = "What else?";
 
@@ -261,4 +239,61 @@
     assertTrue(vmd.valueMetaData.isTypedef());
     assertFalse(vmd.keyMetaData.isTypedef());
   }
+
+  public void testToString() throws Exception {
+    JavaTestHelper object = new JavaTestHelper();
+    object.req_int = 0;
+    object.req_obj = "";
+
+    object.req_bin = ByteBuffer.wrap(new byte[] {
+      0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15,
+      16, -17, 18, -19, 20, -21, 22, -23, 24, -25, 26, -27, 28, -29,
+      30, -31, 32, -33, 34, -35, 36, -37, 38, -39, 40, -41, 42, -43, 44,
+      -45, 46, -47, 48, -49, 50, -51, 52, -53, 54, -55, 56, -57, 58, -59,
+      60, -61, 62, -63, 64, -65, 66, -67, 68, -69, 70, -71, 72, -73, 74,
+      -75, 76, -77, 78, -79, 80, -81, 82, -83, 84, -85, 86, -87, 88, -89,
+      90, -91, 92, -93, 94, -95, 96, -97, 98, -99, 100, -101, 102, -103,
+      104, -105, 106, -107, 108, -109, 110, -111, 112, -113, 114, -115,
+      116, -117, 118, -119, 120, -121, 122, -123, 124, -125, 126, -127,
+    });
+
+    assertEquals("JavaTestHelper(req_int:0, req_obj:, req_bin:"+
+        "00 FF 02 FD 04 FB 06 F9 08 F7 0A F5 0C F3 0E F1 10 EF 12 ED 14 "+
+        "EB 16 E9 18 E7 1A E5 1C E3 1E E1 20 DF 22 DD 24 DB 26 D9 28 D7 "+
+        "2A D5 2C D3 2E D1 30 CF 32 CD 34 CB 36 C9 38 C7 3A C5 3C C3 3E "+
+        "C1 40 BF 42 BD 44 BB 46 B9 48 B7 4A B5 4C B3 4E B1 50 AF 52 AD "+
+        "54 AB 56 A9 58 A7 5A A5 5C A3 5E A1 60 9F 62 9D 64 9B 66 99 68 "+
+        "97 6A 95 6C 93 6E 91 70 8F 72 8D 74 8B 76 89 78 87 7A 85 7C 83 "+
+        "7E 81)",
+        object.toString());
+ 
+    object.req_bin = ByteBuffer.wrap(new byte[] {
+      0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15,
+      16, -17, 18, -19, 20, -21, 22, -23, 24, -25, 26, -27, 28, -29,
+      30, -31, 32, -33, 34, -35, 36, -37, 38, -39, 40, -41, 42, -43, 44,
+      -45, 46, -47, 48, -49, 50, -51, 52, -53, 54, -55, 56, -57, 58, -59,
+      60, -61, 62, -63, 64, -65, 66, -67, 68, -69, 70, -71, 72, -73, 74,
+      -75, 76, -77, 78, -79, 80, -81, 82, -83, 84, -85, 86, -87, 88, -89,
+      90, -91, 92, -93, 94, -95, 96, -97, 98, -99, 100, -101, 102, -103,
+      104, -105, 106, -107, 108, -109, 110, -111, 112, -113, 114, -115,
+      116, -117, 118, -119, 120, -121, 122, -123, 124, -125, 126, -127,
+      0,
+    });
+
+    assertEquals("JavaTestHelper(req_int:0, req_obj:, req_bin:"+
+        "00 FF 02 FD 04 FB 06 F9 08 F7 0A F5 0C F3 0E F1 10 EF 12 ED 14 "+
+        "EB 16 E9 18 E7 1A E5 1C E3 1E E1 20 DF 22 DD 24 DB 26 D9 28 D7 "+
+        "2A D5 2C D3 2E D1 30 CF 32 CD 34 CB 36 C9 38 C7 3A C5 3C C3 3E "+
+        "C1 40 BF 42 BD 44 BB 46 B9 48 B7 4A B5 4C B3 4E B1 50 AF 52 AD "+
+        "54 AB 56 A9 58 A7 5A A5 5C A3 5E A1 60 9F 62 9D 64 9B 66 99 68 "+
+        "97 6A 95 6C 93 6E 91 70 8F 72 8D 74 8B 76 89 78 87 7A 85 7C 83 "+
+        "7E 81...)",
+        object.toString());
+
+    object.req_bin = ByteBuffer.wrap(new byte[] {});
+    object.setOpt_binIsSet(true);
+
+    assertEquals("JavaTestHelper(req_int:0, req_obj:, req_bin:)", 
+        object.toString());
+  }
 }
diff --git a/lib/java/test/org/apache/thrift/TestTDeserializer.java b/lib/java/test/org/apache/thrift/TestTDeserializer.java
index aae2ee4..1f141bd 100644
--- a/lib/java/test/org/apache/thrift/TestTDeserializer.java
+++ b/lib/java/test/org/apache/thrift/TestTDeserializer.java
@@ -18,7 +18,7 @@
  */
 package org.apache.thrift;
 
-import java.util.Arrays;
+import java.nio.ByteBuffer;
 
 import junit.framework.TestCase;
 
@@ -97,10 +97,10 @@
       String resultString = deserializer.partialDeserializeString(serialize(level1SWU, factory), StructWithAUnion._Fields.TEST_UNION, TestUnion._Fields.STRUCT_FIELD, OneOfEach._Fields.SOME_CHARACTERS);
       assertEquals(expectedString, resultString);
 
-      byte[] expectedBinary = level3OneOfEach.getBase64();
-      byte[] resultBinary = deserializer.partialDeserializeByteArray(serialize(level1SWU, factory), StructWithAUnion._Fields.TEST_UNION, TestUnion._Fields.STRUCT_FIELD, OneOfEach._Fields.BASE64);
-      assertEquals(expectedBinary.length, resultBinary.length);
-      assertTrue(Arrays.equals(expectedBinary, resultBinary));
+      byte[] expectedBinary = level3OneOfEach.getBase64().array();
+      ByteBuffer resultBinary = deserializer.partialDeserializeByteArray(serialize(level1SWU, factory), StructWithAUnion._Fields.TEST_UNION, TestUnion._Fields.STRUCT_FIELD, OneOfEach._Fields.BASE64);
+      assertEquals(expectedBinary.length, resultBinary.limit() - resultBinary.position() - resultBinary.arrayOffset());
+      assertEquals(ByteBuffer.wrap(expectedBinary), resultBinary);
 
       // Test field id in Union
       short id = deserializer.partialDeserializeSetFieldIdInUnion(serialize(level1SWU, factory), StructWithAUnion._Fields.TEST_UNION);
diff --git a/lib/java/test/org/apache/thrift/TestTUnion.java b/lib/java/test/org/apache/thrift/TestTUnion.java
index a8b1287..b6032cc 100644
--- a/lib/java/test/org/apache/thrift/TestTUnion.java
+++ b/lib/java/test/org/apache/thrift/TestTUnion.java
@@ -18,6 +18,15 @@
  */
 package org.apache.thrift;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.transport.TMemoryBuffer;
@@ -29,12 +38,6 @@
 import thrift.test.StructWithAUnion;
 import thrift.test.TestUnion;
 import thrift.test.TestUnionMinusStringField;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import junit.framework.TestCase;
 
 public class TestTUnion extends TestCase {
 
@@ -95,12 +98,12 @@
     assertTrue(cu.compareTo(cu2) < 0);
     assertTrue(cu2.compareTo(cu) > 0);
 
-    cu2 = ComparableUnion.binary_field(new byte[]{2});
+    cu2 = ComparableUnion.binary_field(ByteBuffer.wrap(new byte[]{2}));
 
     assertTrue(cu.compareTo(cu2) < 0);
     assertTrue(cu2.compareTo(cu) > 0);
 
-    cu = ComparableUnion.binary_field(new byte[]{1});
+    cu = ComparableUnion.binary_field(ByteBuffer.wrap(new byte[]{1}));
 
     assertTrue(cu.compareTo(cu2) < 0);
     assertTrue(cu2.compareTo(cu) > 0);
diff --git a/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java b/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
index da0de05..5f22cfc 100644
--- a/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
+++ b/lib/java/test/org/apache/thrift/protocol/ProtocolTestBase.java
@@ -18,6 +18,7 @@
  */
 package org.apache.thrift.protocol;
 
+import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.List;
 
@@ -231,18 +232,18 @@
   private void internalTestNakedBinary(byte[] data) throws Exception {
     TMemoryBuffer buf = new TMemoryBuffer(0);
     TProtocol proto = getFactory().getProtocol(buf);
-    proto.writeBinary(data);
-    assertTrue(Arrays.equals(data, proto.readBinary()));
+    proto.writeBinary(ByteBuffer.wrap(data));
+    assertEquals(ByteBuffer.wrap(data), proto.readBinary());
   }
 
   private void internalTestBinaryField(final byte[] data) throws Exception {
     internalTestStructField(new StructFieldTestCase(TType.STRING, (short)15) {
       public void writeMethod(TProtocol proto) throws TException {
-        proto.writeBinary(data);
+        proto.writeBinary(ByteBuffer.wrap(data));
       }
 
       public void readMethod(TProtocol proto) throws TException {
-        assertTrue(Arrays.equals(data, proto.readBinary()));
+        assertEquals(ByteBuffer.wrap(data), proto.readBinary());
       }
     });
   }
diff --git a/lib/java/test/org/apache/thrift/test/EqualityTest.java b/lib/java/test/org/apache/thrift/test/EqualityTest.java
index f01378f..94ba543 100644
--- a/lib/java/test/org/apache/thrift/test/EqualityTest.java
+++ b/lib/java/test/org/apache/thrift/test/EqualityTest.java
@@ -129,7 +129,9 @@
 package org.apache.thrift.test;
 
 // Generated code
-import thrift.test.*;
+import java.nio.ByteBuffer;
+
+import thrift.test.JavaTestHelper;
 
 /**
  */
@@ -486,8 +488,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{1,2};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
     lhs.req_bin = null;
     rhs.req_bin = null;
     // this_present = False
@@ -499,8 +501,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{3,4};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{3,4});
     lhs.req_bin = null;
     rhs.req_bin = null;
     // this_present = False
@@ -512,8 +514,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{1,2};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
     lhs.req_bin = null;
     // this_present = False
     // that_present = True
@@ -522,8 +524,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{3,4};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{3,4});
     lhs.req_bin = null;
     // this_present = False
     // that_present = True
@@ -532,8 +534,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{1,2};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
     rhs.req_bin = null;
     // this_present = True
     // that_present = False
@@ -542,8 +544,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{3,4};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{3,4});
     rhs.req_bin = null;
     // this_present = True
     // that_present = False
@@ -552,8 +554,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{1,2};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
     // this_present = True
     // that_present = True
     if (lhs.equals(rhs) != true)
@@ -563,8 +565,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.req_bin = new byte[]{1,2};
-    rhs.req_bin = new byte[]{3,4};
+    lhs.req_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.req_bin = ByteBuffer.wrap(new byte[]{3,4});
     // this_present = True
     // that_present = True
     if (lhs.equals(rhs) != false)
@@ -572,8 +574,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{1,2};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
     lhs.opt_bin = null;
     rhs.opt_bin = null;
     // this_present = False
@@ -585,8 +587,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{3,4};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{3,4});
     lhs.opt_bin = null;
     rhs.opt_bin = null;
     // this_present = False
@@ -598,8 +600,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{1,2};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
     lhs.opt_bin = null;
     // this_present = False
     // that_present = True
@@ -608,8 +610,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{3,4};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{3,4});
     lhs.opt_bin = null;
     // this_present = False
     // that_present = True
@@ -618,8 +620,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{1,2};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
     rhs.opt_bin = null;
     // this_present = True
     // that_present = False
@@ -628,8 +630,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{3,4};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{3,4});
     rhs.opt_bin = null;
     // this_present = True
     // that_present = False
@@ -638,8 +640,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{1,2};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
     // this_present = True
     // that_present = True
     if (lhs.equals(rhs) != true)
@@ -649,8 +651,8 @@
 
     lhs = new JavaTestHelper();
     rhs = new JavaTestHelper();
-    lhs.opt_bin = new byte[]{1,2};
-    rhs.opt_bin = new byte[]{3,4};
+    lhs.opt_bin = ByteBuffer.wrap(new byte[]{1,2});
+    rhs.opt_bin = ByteBuffer.wrap(new byte[]{3,4});
     // this_present = True
     // that_present = True
     if (lhs.equals(rhs) != false)
diff --git a/lib/java/test/org/apache/thrift/test/JavaBeansTest.java b/lib/java/test/org/apache/thrift/test/JavaBeansTest.java
index b72bd38..3f8d22a 100644
--- a/lib/java/test/org/apache/thrift/test/JavaBeansTest.java
+++ b/lib/java/test/org/apache/thrift/test/JavaBeansTest.java
@@ -19,7 +19,9 @@
 
 package org.apache.thrift.test;
 
+import java.nio.ByteBuffer;
 import java.util.LinkedList;
+
 import thrift.test.OneOfEachBeans;
 
 public class JavaBeansTest {
@@ -58,7 +60,7 @@
 
     // Everything is set
     ooe.set_a_bite((byte) 1);
-    ooe.set_base64("bytes".getBytes());
+    ooe.set_base64(ByteBuffer.wrap("bytes".getBytes()));
     ooe.set_byte_list(new LinkedList<Byte>());
     ooe.set_double_precision(1);
     ooe.set_i16_list(new LinkedList<Short>());
diff --git a/lib/java/test/org/apache/thrift/test/ToStringTest.java b/lib/java/test/org/apache/thrift/test/ToStringTest.java
index 569a61c..e69de29 100644
--- a/lib/java/test/org/apache/thrift/test/ToStringTest.java
+++ b/lib/java/test/org/apache/thrift/test/ToStringTest.java
@@ -1,92 +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;
-
-import thrift.test.*;
-
-/**
- */
-public class ToStringTest {
-  public static void main(String[] args) throws Exception {
-    JavaTestHelper object = new JavaTestHelper();
-    object.req_int = 0;
-    object.req_obj = "";
-
-
-    object.req_bin = new byte[] {
-      0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15,
-      16, -17, 18, -19, 20, -21, 22, -23, 24, -25, 26, -27, 28, -29,
-      30, -31, 32, -33, 34, -35, 36, -37, 38, -39, 40, -41, 42, -43, 44,
-      -45, 46, -47, 48, -49, 50, -51, 52, -53, 54, -55, 56, -57, 58, -59,
-      60, -61, 62, -63, 64, -65, 66, -67, 68, -69, 70, -71, 72, -73, 74,
-      -75, 76, -77, 78, -79, 80, -81, 82, -83, 84, -85, 86, -87, 88, -89,
-      90, -91, 92, -93, 94, -95, 96, -97, 98, -99, 100, -101, 102, -103,
-      104, -105, 106, -107, 108, -109, 110, -111, 112, -113, 114, -115,
-      116, -117, 118, -119, 120, -121, 122, -123, 124, -125, 126, -127,
-    };
-
-    if (!object.toString().equals(
-        "JavaTestHelper(req_int:0, req_obj:, req_bin:"+
-        "00 FF 02 FD 04 FB 06 F9 08 F7 0A F5 0C F3 0E F1 10 EF 12 ED 14 "+
-        "EB 16 E9 18 E7 1A E5 1C E3 1E E1 20 DF 22 DD 24 DB 26 D9 28 D7 "+
-        "2A D5 2C D3 2E D1 30 CF 32 CD 34 CB 36 C9 38 C7 3A C5 3C C3 3E "+
-        "C1 40 BF 42 BD 44 BB 46 B9 48 B7 4A B5 4C B3 4E B1 50 AF 52 AD "+
-        "54 AB 56 A9 58 A7 5A A5 5C A3 5E A1 60 9F 62 9D 64 9B 66 99 68 "+
-        "97 6A 95 6C 93 6E 91 70 8F 72 8D 74 8B 76 89 78 87 7A 85 7C 83 "+
-        "7E 81)")) {
-      throw new RuntimeException();
-    }
- 
-    object.req_bin = new byte[] {
-      0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15,
-      16, -17, 18, -19, 20, -21, 22, -23, 24, -25, 26, -27, 28, -29,
-      30, -31, 32, -33, 34, -35, 36, -37, 38, -39, 40, -41, 42, -43, 44,
-      -45, 46, -47, 48, -49, 50, -51, 52, -53, 54, -55, 56, -57, 58, -59,
-      60, -61, 62, -63, 64, -65, 66, -67, 68, -69, 70, -71, 72, -73, 74,
-      -75, 76, -77, 78, -79, 80, -81, 82, -83, 84, -85, 86, -87, 88, -89,
-      90, -91, 92, -93, 94, -95, 96, -97, 98, -99, 100, -101, 102, -103,
-      104, -105, 106, -107, 108, -109, 110, -111, 112, -113, 114, -115,
-      116, -117, 118, -119, 120, -121, 122, -123, 124, -125, 126, -127,
-      0,
-    };
-
-    if (!object.toString().equals(
-        "JavaTestHelper(req_int:0, req_obj:, req_bin:"+
-        "00 FF 02 FD 04 FB 06 F9 08 F7 0A F5 0C F3 0E F1 10 EF 12 ED 14 "+
-        "EB 16 E9 18 E7 1A E5 1C E3 1E E1 20 DF 22 DD 24 DB 26 D9 28 D7 "+
-        "2A D5 2C D3 2E D1 30 CF 32 CD 34 CB 36 C9 38 C7 3A C5 3C C3 3E "+
-        "C1 40 BF 42 BD 44 BB 46 B9 48 B7 4A B5 4C B3 4E B1 50 AF 52 AD "+
-        "54 AB 56 A9 58 A7 5A A5 5C A3 5E A1 60 9F 62 9D 64 9B 66 99 68 "+
-        "97 6A 95 6C 93 6E 91 70 8F 72 8D 74 8B 76 89 78 87 7A 85 7C 83 "+
-        "7E 81 ...)")) {
-      throw new RuntimeException();
-    } 
-
-    object.req_bin = new byte[] {};
-    object.setOpt_binIsSet(true);
-
-
-    if (!object.toString().equals(
-        "JavaTestHelper(req_int:0, req_obj:, req_bin:)")) {
-      throw new RuntimeException();
-    } 
-  }
-}
-
