diff --git a/lib/java/build.xml b/lib/java/build.xml
index 22a924f..9042922 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -209,8 +209,6 @@
       classpathref="test.classpath" failonerror="true" />
     <java classname="org.apache.thrift.test.PartialDeserializeTest"
       classpathref="test.classpath" failonerror="true" />
-    <java classname="org.apache.thrift.test.transport.TFramedTransportTest"
-      classpathref="test.classpath" failonerror="true" />
   </target>
 
   <target name="test" description="Run the full test suite" depends="junit-test,deprecated-test"/>
diff --git a/lib/java/test/org/apache/thrift/test/transport/TFramedTransportTest.java b/lib/java/test/org/apache/thrift/test/transport/TFramedTransportTest.java
deleted file mode 100644
index b2169de..0000000
--- a/lib/java/test/org/apache/thrift/test/transport/TFramedTransportTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package org.apache.thrift.test.transport;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-
-import org.apache.thrift.transport.TFramedTransport;
-import org.apache.thrift.transport.TIOStreamTransport;
-import org.apache.thrift.transport.TMemoryBuffer;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-
-public class TFramedTransportTest {
-  public static class WriteCountingTransport extends TTransport {
-    private int writeCount = 0;
-    private final TTransport trans;
-
-    public WriteCountingTransport(TTransport underlying) {
-      trans = underlying;
-    }
-
-    @Override
-    public void close() {}
-
-    @Override
-    public boolean isOpen() {return true;}
-
-    @Override
-    public void open() throws TTransportException {}
-
-    @Override
-    public int read(byte[] buf, int off, int len) throws TTransportException {
-      return 0;
-    }
-
-    @Override
-    public void write(byte[] buf, int off, int len) throws TTransportException {
-      writeCount ++;
-      trans.write(buf, off, len);
-    }
-  }
-
-  public static class ReadCountingTransport extends TTransport {
-    public int readCount = 0;
-    private TTransport trans;
-
-    public ReadCountingTransport(TTransport underlying) {
-      trans = underlying;
-    }
-
-    @Override
-    public void close() {}
-
-    @Override
-    public boolean isOpen() {return true;}
-
-    @Override
-    public void open() throws TTransportException {}
-
-    @Override
-    public int read(byte[] buf, int off, int len) throws TTransportException {
-      readCount++;
-      return trans.read(buf, off, len);
-    }
-
-    @Override
-    public void write(byte[] buf, int off, int len) throws TTransportException {}
-  }
-
-  public static void main(String[] args) throws TTransportException, IOException {
-    testWrite();
-    testRead();
-    testDirectRead();
-  }
-
-  private static void testWrite() throws TTransportException, IOException {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    WriteCountingTransport countingTrans = new WriteCountingTransport(new TIOStreamTransport(baos));
-    TTransport trans = new TFramedTransport(countingTrans);
-
-    trans.write(byteSequence(0,100));
-    failUnless(countingTrans.writeCount == 0);
-    trans.write(byteSequence(101,200));
-    trans.write(byteSequence(201,255));
-    failUnless(countingTrans.writeCount == 0);
-
-    trans.flush();
-    failUnless(countingTrans.writeCount == 2);
-
-    DataInputStream din = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()));
-    failUnless(din.readInt() == 256);
-
-    byte[] buf = new byte[256];
-    din.read(buf, 0, 256);
-    failUnless(Arrays.equals(byteSequence(0,255), buf));
-  }
-
-  private static void testRead() throws IOException, TTransportException {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    DataOutputStream dos = new DataOutputStream(baos);
-    dos.writeInt(50);
-    dos.write(byteSequence(0, 49));
-
-    TMemoryBuffer membuf = new TMemoryBuffer(0);
-    membuf.write(baos.toByteArray());
-
-    ReadCountingTransport countTrans = new ReadCountingTransport(membuf);
-    TFramedTransport trans = new TFramedTransport(countTrans);
-
-    byte[] readBuf = new byte[10];
-    trans.read(readBuf, 0, 10);
-    failUnless(Arrays.equals(readBuf, byteSequence(0,9)));
-
-    trans.read(readBuf, 0, 10);
-    failUnless(Arrays.equals(readBuf, byteSequence(10,19)));
-
-    failUnless(countTrans.readCount == 2);
-  }
-
-  private static void testDirectRead() throws IOException, TTransportException {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    DataOutputStream dos = new DataOutputStream(baos);
-    dos.writeInt(50);
-    dos.write(byteSequence(0, 49));
-
-    TMemoryBuffer membuf = new TMemoryBuffer(0);
-    membuf.write(baos.toByteArray());
-
-    ReadCountingTransport countTrans = new ReadCountingTransport(membuf);
-    TFramedTransport trans = new TFramedTransport(countTrans);
-
-    failUnless(trans.getBytesRemainingInBuffer() == 0);
-
-    byte[] readBuf = new byte[10];
-    trans.read(readBuf, 0, 10);
-    failUnless(Arrays.equals(readBuf, byteSequence(0,9)));
-
-    failUnless(trans.getBytesRemainingInBuffer() == 40);
-    failUnless(trans.getBufferPosition() == 10);
-
-    trans.consumeBuffer(5);
-    failUnless(trans.getBytesRemainingInBuffer() == 35);
-    failUnless(trans.getBufferPosition() == 15);
-
-    failUnless(countTrans.readCount == 2);
-  }
-
-  private static void failUnless(boolean b) {
-    if (!b) {
-      throw new RuntimeException();
-    }
-  }
-
-  private static byte[] byteSequence(int start, int end) {
-    byte[] result = new byte[end-start+1];
-    for (int i = 0; i <= (end-start); i++) {
-      result[i] = (byte)(start+i);
-    }
-    return result;
-  }
-}
diff --git a/lib/java/test/org/apache/thrift/transport/ReadCountingTransport.java b/lib/java/test/org/apache/thrift/transport/ReadCountingTransport.java
new file mode 100644
index 0000000..fb27af6
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/transport/ReadCountingTransport.java
@@ -0,0 +1,34 @@
+/**
+ * 
+ */
+package org.apache.thrift.transport;
+
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
+
+public class ReadCountingTransport extends TTransport {
+  public int readCount = 0;
+  private TTransport trans;
+
+  public ReadCountingTransport(TTransport underlying) {
+    trans = underlying;
+  }
+
+  @Override
+  public void close() {}
+
+  @Override
+  public boolean isOpen() {return true;}
+
+  @Override
+  public void open() throws TTransportException {}
+
+  @Override
+  public int read(byte[] buf, int off, int len) throws TTransportException {
+    readCount++;
+    return trans.read(buf, off, len);
+  }
+
+  @Override
+  public void write(byte[] buf, int off, int len) throws TTransportException {}
+}
\ No newline at end of file
diff --git a/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java b/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java
new file mode 100644
index 0000000..09b465c
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java
@@ -0,0 +1,93 @@
+package org.apache.thrift.transport;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+public class TestTFramedTransport extends TestCase {
+
+  private static byte[] byteSequence(int start, int end) {
+    byte[] result = new byte[end-start+1];
+    for (int i = 0; i <= (end-start); i++) {
+      result[i] = (byte)(start+i);
+    }
+    return result;
+  }
+
+  public void testRead() throws IOException, TTransportException {
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    DataOutputStream dos = new DataOutputStream(baos);
+    dos.writeInt(50);
+    dos.write(byteSequence(0, 49));
+
+    TMemoryBuffer membuf = new TMemoryBuffer(0);
+    membuf.write(baos.toByteArray());
+
+    ReadCountingTransport countTrans = new ReadCountingTransport(membuf);
+    TFramedTransport trans = new TFramedTransport(countTrans);
+
+    byte[] readBuf = new byte[10];
+    trans.read(readBuf, 0, 10);
+    assertTrue(Arrays.equals(readBuf, byteSequence(0,9)));
+
+    trans.read(readBuf, 0, 10);
+    assertTrue(Arrays.equals(readBuf, byteSequence(10,19)));
+
+    assertEquals(2, countTrans.readCount);
+  }
+
+  public void testWrite() throws TTransportException, IOException {
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    WriteCountingTransport countingTrans = new WriteCountingTransport(new TIOStreamTransport(baos));
+    TTransport trans = new TFramedTransport(countingTrans);
+
+    trans.write(byteSequence(0,100));
+    assertEquals(0, countingTrans.writeCount);
+    trans.write(byteSequence(101,200));
+    trans.write(byteSequence(201,255));
+    assertEquals(0, countingTrans.writeCount);
+
+    trans.flush();
+    assertEquals(2, countingTrans.writeCount);
+
+    DataInputStream din = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()));
+    assertEquals(256, din.readInt());
+
+    byte[] buf = new byte[256];
+    din.read(buf, 0, 256);
+    assertTrue(Arrays.equals(byteSequence(0,255), buf));
+  }
+
+  public void testDirectRead() throws IOException, TTransportException {
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    DataOutputStream dos = new DataOutputStream(baos);
+    dos.writeInt(50);
+    dos.write(byteSequence(0, 49));
+
+    TMemoryBuffer membuf = new TMemoryBuffer(0);
+    membuf.write(baos.toByteArray());
+
+    ReadCountingTransport countTrans = new ReadCountingTransport(membuf);
+    TFramedTransport trans = new TFramedTransport(countTrans);
+
+    assertEquals(0, trans.getBytesRemainingInBuffer());
+
+    byte[] readBuf = new byte[10];
+    trans.read(readBuf, 0, 10);
+    assertTrue(Arrays.equals(readBuf, byteSequence(0,9)));
+
+    assertEquals(40, trans.getBytesRemainingInBuffer());
+    assertEquals(10, trans.getBufferPosition());
+
+    trans.consumeBuffer(5);
+    assertEquals(35, trans.getBytesRemainingInBuffer());
+    assertEquals(15, trans.getBufferPosition());
+
+    assertEquals(2, countTrans.readCount);
+  }
+}
diff --git a/lib/java/test/org/apache/thrift/transport/WriteCountingTransport.java b/lib/java/test/org/apache/thrift/transport/WriteCountingTransport.java
new file mode 100644
index 0000000..c04acf3
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/transport/WriteCountingTransport.java
@@ -0,0 +1,34 @@
+
+package org.apache.thrift.transport;
+
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
+
+public class WriteCountingTransport extends TTransport {
+  public int writeCount = 0;
+  private final TTransport trans;
+
+  public WriteCountingTransport(TTransport underlying) {
+    trans = underlying;
+  }
+
+  @Override
+  public void close() {}
+
+  @Override
+  public boolean isOpen() {return true;}
+
+  @Override
+  public void open() throws TTransportException {}
+
+  @Override
+  public int read(byte[] buf, int off, int len) throws TTransportException {
+    return 0;
+  }
+
+  @Override
+  public void write(byte[] buf, int off, int len) throws TTransportException {
+    writeCount ++;
+    trans.write(buf, off, len);
+  }
+}
\ No newline at end of file
