diff --git a/lib/java/src/protocol/TBinaryProtocol.java b/lib/java/src/protocol/TBinaryProtocol.java
index b2e77d9..a759005 100644
--- a/lib/java/src/protocol/TBinaryProtocol.java
+++ b/lib/java/src/protocol/TBinaryProtocol.java
@@ -2,7 +2,6 @@
 
 import com.facebook.thrift.TException;
 import com.facebook.thrift.transport.TTransport;
-import com.facebook.thrift.types.*;
 
 /**
  * Binary protocol implementation for thrift.
@@ -10,227 +9,176 @@
  * @author Mark Slee <mcslee@facebook.com>
  */
 public class TBinaryProtocol implements TProtocol {
-  public int writeStructBegin (TTransport out,
-                               TStruct    struct)  throws TException {
-    return 0;
+  public void writeStructBegin(TTransport out, TStruct struct) throws TException {}
+
+  public void writeStructEnd(TTransport out) throws TException {}
+
+  public void writeFieldBegin(TTransport out, TField field) throws TException {
+    writeByte(out, field.type);
+    writeI32(out, field.id);
   }
 
-  public int writeStructEnd   (TTransport out)     throws TException {
-    return 0;
+  public void writeFieldEnd(TTransport out) throws TException {}
+
+  public void writeFieldStop(TTransport out) throws TException {
+    writeByte(out, TType.STOP);
   }
 
-  public int writeFieldBegin  (TTransport out,
-                               TField     field)   throws TException {
-    return
-      writeByte(out, field.type.getCode()) +
-      writeI32(out, field.id);
+  public void writeMapBegin(TTransport out, TMap map) throws TException {
+    writeByte(out, map.keyType);
+    writeByte(out, map.valueType);
+    writeI32(out, map.size);
   }
 
-  public int writeFieldEnd    (TTransport out)     throws TException {
-    return 0;
+  public void writeMapEnd(TTransport out) throws TException {}
+
+  public void writeListBegin(TTransport out, TList list) throws TException {
+    writeByte(out, list.elemType);
+    writeI32(out, list.size);
   }
 
-  public int writeFieldStop   (TTransport out)     throws TException {
-    return
-      writeByte(out, TType.STOP.getCode());
+  public void writeListEnd(TTransport out) throws TException {}
+
+  public void writeSetBegin(TTransport out, TSet set) throws TException {
+    writeByte(out, set.elemType);
+    writeI32(out, set.size);
   }
 
-  public int writeMapBegin    (TTransport out,
-                               TMap       map)     throws TException {
-    return
-      writeByte(out, map.keyType.getCode()) +
-      writeByte(out, map.valueType.getCode()) +
-      writeI32(out, map.size);
+  public void writeSetEnd(TTransport out) throws TException {}
+
+  byte[] bout = new byte[1];
+  public void writeByte(TTransport out, byte b) throws TException {
+    bout[0] = b;
+    out.write(bout, 0, 1);
   }
 
-  public int writeMapEnd      (TTransport out)     throws TException {
-    return 0;
+  public void writeU32(TTransport out, int u32) throws TException {
+    writeI32(out, u32);
   }
 
-  public int writeListBegin   (TTransport out,
-                               TList      list)    throws TException {
-    return
-      writeByte(out, list.elemType.getCode()) +
-      writeI32(out, list.size);
+  byte[] i32out = new byte[4];
+  public void writeI32(TTransport out, int i32) throws TException {
+    i32out[0] = (byte)(0xff & (i32 >> 24));
+    i32out[1] = (byte)(0xff & (i32 >> 16));
+    i32out[2] = (byte)(0xff & (i32 >> 8));
+    i32out[3] = (byte)(0xff & (i32));
+    out.write(i32out, 0, 4);
   }
 
-  public int writeListEnd     (TTransport out)     throws TException {
-    return 0;
+  public void writeU64(TTransport out, long u64) throws TException {
+    writeI64(out, u64);
   }
 
-  public int writeSetBegin    (TTransport out,
-                               TSet       set)     throws TException {
-    return
-      writeByte(out, set.elemType.getCode()) +
-      writeI32(out, set.size);
+  byte[] i64out = new byte[8];
+  public void writeI64(TTransport out, long i64) throws TException {
+    i64out[0] = (byte)(0xff & (i64 >> 56));
+    i64out[1] = (byte)(0xff & (i64 >> 48));
+    i64out[2] = (byte)(0xff & (i64 >> 40));
+    i64out[3] = (byte)(0xff & (i64 >> 32));
+    i64out[4] = (byte)(0xff & (i64 >> 24));
+    i64out[5] = (byte)(0xff & (i64 >> 16));
+    i64out[6] = (byte)(0xff & (i64 >> 8));
+    i64out[7] = (byte)(0xff & (i64));
+    out.write(i64out, 0, 8);
   }
 
-  public int writeSetEnd      (TTransport out)     throws TException {
-    return 0;
-  }
-
-  public int writeByte        (TTransport out,
-                               UInt8      b)       throws TException {
-    out.write(b.data(), 0, 1);
-    return 1;
-  }
-
-  public int writeU32         (TTransport out,
-                               UInt32     u32)     throws TException {
-    out.write(u32.data(), 0, 4);
-    return 4;
-  }
-
-  public int writeI32         (TTransport out,
-                               Int32      i32)     throws TException {
-    out.write(i32.data(), 0, 4);
-    return 4;
-  }
-
-  public int writeU64         (TTransport out,
-                               UInt64     u64)     throws TException {
-    out.write(u64.data(), 0, 8);
-    return 8;
-  }
-
-  public int writeI64         (TTransport out,
-                               Int64      i64)     throws TException {
-    out.write(i64.data(), 0, 8);
-    return 8;
-  }
-
-  public int writeString      (TTransport out,
-                               TString    str)     throws TException {
-    byte[] dat = str.value.getBytes();
-    int sent = writeI32(out, new Int32(dat.length));
+  public void writeString(TTransport out, String str) throws TException {
+    byte[] dat = str.getBytes();
+    writeI32(out, dat.length);
     out.write(dat, 0, dat.length);
-    return sent + dat.length;
   }
 
   /**
    * Reading methods.
    */
 
-  public int readStructBegin  (TTransport in,
-                               TStruct    struct)  throws TException {
-    struct.name = "";
-    return 0;
+  public TStruct readStructBegin(TTransport in) throws TException {
+    return new TStruct();
   }
 
-  public int readStructEnd    (TTransport  in)     throws TException {
-    return 0;
-  }
+  public void readStructEnd(TTransport in) throws TException {}
 
-  public int readFieldBegin   (TTransport  in,
-                               TField      field)  throws TException {
-    int recv = 0;
-    UInt8 t = new UInt8();
-
-    recv += readByte(in, t);
-    field.type = TType.getType(t);
-    if (field.type.equals(TType.STOP)) {
-      field.id = new Int32(0);
-      return recv;
+  public TField readFieldBegin(TTransport in) throws TException {
+    TField field = new TField();
+    field.type = readByte(in);
+    if (field.type != TType.STOP) {
+      field.id = readI32(in);
     }
-    recv += readI32(in, field.id);
-    return recv;
+    return field;
   }
   
-  public int readFieldEnd     (TTransport  in)     throws TException {
-    return 0;
-  }
+  public void readFieldEnd(TTransport in) throws TException {}
  
-  public int readMapBegin     (TTransport  in,
-                               TMap        map)    throws TException {
-    int recv = 0;
-    UInt8 t = new UInt8();
-    recv += readByte(in, t);
-    map.keyType = TType.getType(t);
-    recv += readByte(in, t);
-    map.valueType = TType.getType(t);
-    recv += readI32(in, map.size);
-    return recv;
+  public TMap readMapBegin(TTransport in) throws TException {
+    TMap map = new TMap();
+    map.keyType = readByte(in);
+    map.valueType = readByte(in);
+    map.size = readI32(in);
+    return map;
   }
 
-  public int readMapEnd       (TTransport  in)     throws TException {
-    return 0;
+  public void readMapEnd(TTransport in) throws TException {}
+
+  public TList readListBegin(TTransport in) throws TException {
+    TList list = new TList();
+    list.elemType = readByte(in);
+    list.size = readI32(in);
+    return list;
   }
 
-  public int readListBegin    (TTransport  in,
-                               TList       list)   throws TException {
-    int recv = 0;
-    UInt8 t = new UInt8();
-    recv += readByte(in, t);
-    list.elemType = TType.getType(t);
-    recv += readI32(in, list.size);
-    return recv;
+  public void readListEnd(TTransport in) throws TException {}
+
+  public TSet readSetBegin(TTransport in) throws TException {
+    TSet set = new TSet();
+    set.elemType = readByte(in);
+    set.size = readI32(in);
+    return set;
   }
 
-  public int readListEnd      (TTransport  in)     throws TException {
-    return 0;
+  public void readSetEnd(TTransport in) throws TException {}
+
+  byte[] bin = new byte[1];
+  public byte readByte(TTransport in) throws TException {
+    in.readAll(bin, 0, 1);
+    return bin[0];
   }
 
-  public int readSetBegin     (TTransport  in,
-                               TSet        set)    throws TException {
-    int recv = 0;
-    UInt8 t = new UInt8();
-    recv += readByte(in, t);
-    set.elemType = TType.getType(t);
-    recv += readI32(in, set.size);
-    return recv;
+  public int readU32(TTransport in) throws TException {
+    return readI32(in);
   }
 
-  public int readSetEnd       (TTransport  in)     throws TException {
-    return 0;
+  byte[] i32rd = new byte[4];
+  public int readI32(TTransport in) throws TException {
+    in.readAll(i32rd, 0, 4);
+    return
+      ((i32rd[0] & 0xff) << 24) |
+      ((i32rd[1] & 0xff) << 16) |
+      ((i32rd[2] & 0xff) <<  8) |
+      ((i32rd[3] & 0xff));
   }
 
-  public int readByte         (TTransport  in,
-                               UInt8       b)      throws TException {
-    byte[] buf = new byte[1];
-    in.readAll(buf, 0, 1);
-    b.read(buf, 0);
-    return 1;
-  }
-
-  public int readU32          (TTransport  in,
-                               UInt32      u32)    throws TException {
-    byte[] buf = new byte[4];
-    in.readAll(buf, 0, 4);
-    u32.read(buf, 0);
-    return 4;
-  }
-
-  public int readI32          (TTransport  in,
-                               Int32       i32)    throws TException {
-    byte[] buf = new byte[4];
-    in.readAll(buf, 0, 4);
-    i32.read(buf, 0);
-    return 4;
-  }
-
-  public int readU64          (TTransport  in,
-                               UInt64      u64)    throws TException {
-    byte[] buf = new byte[8];
-    in.readAll(buf, 0, 8);
-    u64.read(buf, 0);
-    return 8;
+  public long readU64(TTransport in) throws TException {
+    return readI64(in);
   }
   
-  public int readI64          (TTransport  in,
-                               Int64       i64)    throws TException {
-    byte[] buf = new byte[8];
-    in.readAll(buf, 0, 8);
-    i64.read(buf, 0);
-    return 8;
+  byte[] i64rd = new byte[8];
+  public long readI64(TTransport in) throws TException {
+    in.readAll(i64rd, 0, 8);
+    return
+      ((long)(i64rd[0] & 0xff) << 56) |
+      ((long)(i64rd[1] & 0xff) << 48) |
+      ((long)(i64rd[2] & 0xff) << 40) |
+      ((long)(i64rd[3] & 0xff) << 32) |
+      ((long)(i64rd[4] & 0xff) << 24) |
+      ((long)(i64rd[5] & 0xff) << 16) |
+      ((long)(i64rd[6] & 0xff) <<  8) |
+      ((long)(i64rd[7] & 0xff));
   }
 
-  public int readString       (TTransport  in,
-                               TString     s)      throws TException {
-    Int32 size = new Int32();
-    int recv = readI32(in, size);
-    byte[] buf = new byte[size.get()];
-    in.readAll(buf, 0, size.get());
-    s.value = new String(buf);
-    return recv + size.get();
+  public String readString(TTransport in)  throws TException {
+    int size = readI32(in);
+    byte[] buf = new byte[size];
+    in.readAll(buf, 0, size);
+    return new String(buf);
   }
 }
diff --git a/lib/java/src/protocol/TField.java b/lib/java/src/protocol/TField.java
index d758c68..50570fb 100644
--- a/lib/java/src/protocol/TField.java
+++ b/lib/java/src/protocol/TField.java
@@ -1,7 +1,5 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.*;
-
 /**
  * Helper class that encapsulates field metadata.
  *
@@ -10,17 +8,13 @@
 public class TField {
   public TField() {}
 
-  public TField(String n, TType t, int i) {
-    this(n, t, new Int32(i));
-  }
-
-  public TField(String n, TType t, Int32 i) {
+  public TField(String n, byte t, int i) {
     name = n;
     type = t;
     id = i;
   }
 
   public String name = "";
-  public TType  type = TType.STOP;
-  public Int32 id = new Int32();
+  public byte   type = TType.STOP;
+  public int    id   = 0;
 }
diff --git a/lib/java/src/protocol/TList.java b/lib/java/src/protocol/TList.java
index ff76ffd..0528619 100644
--- a/lib/java/src/protocol/TList.java
+++ b/lib/java/src/protocol/TList.java
@@ -1,7 +1,5 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.*;
-
 /**
  * Helper class that encapsulates list metadata.
  *
@@ -10,15 +8,11 @@
 public class TList {
   public TList() {}
   
-  public TList(TType t, int s) {
-    this(t, new Int32(s));
-  }
-
-  public TList(TType t, Int32 s) {
+  public TList(byte t, int s) {
     elemType = t;
     size = s;
   }
 
-  public TType  elemType = TType.STOP;
-  public Int32 size = new Int32();
+  public byte elemType = TType.STOP;
+  public int  size     = 0;
 }
diff --git a/lib/java/src/protocol/TMap.java b/lib/java/src/protocol/TMap.java
index f251fa6..e8d18e1 100644
--- a/lib/java/src/protocol/TMap.java
+++ b/lib/java/src/protocol/TMap.java
@@ -1,7 +1,5 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.*;
-
 /**
  * Helper class that encapsulates map metadata.
  *
@@ -10,17 +8,13 @@
 public class TMap {
   public TMap() {}
   
-  public TMap(TType k, TType v, int s) {
-    this(k, v, new Int32(s));
-  }
-
-  public TMap(TType k, TType v, Int32 s) {
+  public TMap(byte k, byte v, int s) {
     keyType = k;
     valueType = v;
     size = s;
   }
 
-  public TType  keyType = TType.STOP;
-  public TType  valueType = TType.STOP;
-  public Int32 size = new Int32();;
+  public byte  keyType   = TType.STOP;
+  public byte  valueType = TType.STOP;
+  public int   size      = 0;
 }
diff --git a/lib/java/src/protocol/TProtocol.java b/lib/java/src/protocol/TProtocol.java
index f44eb9e..a60becb 100644
--- a/lib/java/src/protocol/TProtocol.java
+++ b/lib/java/src/protocol/TProtocol.java
@@ -1,6 +1,5 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.*;
 import com.facebook.thrift.TException;
 import com.facebook.thrift.transport.TTransport;
 
@@ -15,95 +14,85 @@
    * Writing methods.
    */
 
-  public int writeStructBegin (TTransport out,
-                               TStruct    struct)  throws TException;
-  public int writeStructEnd   (TTransport out)     throws TException;
+  public void writeStructBegin (TTransport out,
+                                TStruct    struct)  throws TException;
 
-  public int writeFieldBegin  (TTransport out,
-                               TField     field)   throws TException;
+  public void writeStructEnd   (TTransport out)     throws TException;
 
-  public int writeFieldEnd    (TTransport out)     throws TException;
+  public void writeFieldBegin  (TTransport out,
+                                TField     field)   throws TException;
 
-  public int writeFieldStop   (TTransport out)     throws TException;
+  public void writeFieldEnd    (TTransport out)     throws TException;
 
-  public int writeMapBegin    (TTransport out,
-                               TMap       map)     throws TException;
+  public void writeFieldStop   (TTransport out)     throws TException;
 
-  public int writeMapEnd      (TTransport out)     throws TException;
+  public void writeMapBegin    (TTransport out,
+                                TMap       map)     throws TException;
 
-  public int writeListBegin   (TTransport out,
-                               TList      list)    throws TException;
+  public void writeMapEnd      (TTransport out)     throws TException;
 
-  public int writeListEnd     (TTransport out)     throws TException;
+  public void writeListBegin   (TTransport out,
+                                TList      list)    throws TException;
 
-  public int writeSetBegin    (TTransport out,
-                               TSet       set)     throws TException;
+  public void writeListEnd     (TTransport out)     throws TException;
 
-  public int writeSetEnd      (TTransport out)     throws TException;
+  public void writeSetBegin    (TTransport out,
+                                TSet       set)     throws TException;
 
-  public int writeByte        (TTransport out,
-                               UInt8      b)       throws TException;
+  public void writeSetEnd      (TTransport out)     throws TException;
 
-  public int writeU32         (TTransport out,
-                               UInt32     u32)     throws TException;
+  public void writeByte        (TTransport out,
+                                byte       b)       throws TException;
 
-  public int writeI32         (TTransport out,
-                               Int32      i32)     throws TException;
+  public void writeU32         (TTransport out,
+                                int        u32)     throws TException;
 
-  public int writeU64         (TTransport out,
-                               UInt64     u64)     throws TException;
+  public void writeI32         (TTransport out,
+                                int        i32)     throws TException;
 
-  public int writeI64         (TTransport out,
-                               Int64      i64)     throws TException;
+  public void writeU64         (TTransport out,
+                                long       u64)     throws TException;
 
-  public int writeString      (TTransport out,
-                               TString    str)     throws TException;
+  public void writeI64         (TTransport out,
+                                long       i64)     throws TException;
+
+  public void writeString      (TTransport out,
+                                String     str)     throws TException;
 
   /**
    * Reading methods.
    */
 
-  public int readStructBegin  (TTransport in,
-                               TStruct    struct)  throws TException;
+  public TStruct readStructBegin  (TTransport in)  throws TException;
 
-  public int readStructEnd    (TTransport  in)     throws TException;
+  public void    readStructEnd    (TTransport in)  throws TException;
 
-  public int readFieldBegin   (TTransport  in,
-                               TField      field)  throws TException;
+  public TField  readFieldBegin   (TTransport in)  throws TException;
   
-  public int readFieldEnd     (TTransport  in)     throws TException;
+  public void    readFieldEnd     (TTransport in)  throws TException;
  
-  public int readMapBegin     (TTransport  in,
-                               TMap        map)    throws TException;
+  public TMap    readMapBegin     (TTransport in)  throws TException;
 
-  public int readMapEnd       (TTransport  in)     throws TException;
+  public void    readMapEnd       (TTransport in)  throws TException;
 
-  public int readListBegin    (TTransport  in,
-                               TList       list)   throws TException;
+  public TList   readListBegin    (TTransport in)  throws TException;
 
-  public int readListEnd      (TTransport  in)     throws TException;
+  public void    readListEnd      (TTransport in)  throws TException;
 
-  public int readSetBegin     (TTransport  in,
-                               TSet        set)    throws TException;
+  public TSet    readSetBegin     (TTransport in)  throws TException;
 
-  public int readSetEnd       (TTransport  in)     throws TException;
+  public void    readSetEnd       (TTransport in)  throws TException;
 
-  public int readByte         (TTransport  in,
-                               UInt8       b)      throws TException;
+  public byte    readByte         (TTransport in)  throws TException;
 
-  public int readU32          (TTransport  in,
-                               UInt32      u32)    throws TException;
+  public int     readU32          (TTransport in)  throws TException;
 
-  public int readI32          (TTransport  in,
-                               Int32       i32)    throws TException;
+  public int     readI32          (TTransport in)  throws TException;
 
-  public int readU64          (TTransport  in,
-                               UInt64      u64)    throws TException;
+  public long    readU64          (TTransport in)  throws TException;
   
-  public int readI64          (TTransport  in,
-                               Int64       i64)    throws TException;
+  public long    readI64          (TTransport in)  throws TException;
 
-  public int readString       (TTransport  in,
-                               TString     s)      throws TException;
+  public String  readString       (TTransport in)  throws TException;
 
 }
diff --git a/lib/java/src/protocol/TProtocolUtil.java b/lib/java/src/protocol/TProtocolUtil.java
index b182139..b8e5afe 100644
--- a/lib/java/src/protocol/TProtocolUtil.java
+++ b/lib/java/src/protocol/TProtocolUtil.java
@@ -1,6 +1,5 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.*;
 import com.facebook.thrift.TException;
 import com.facebook.thrift.transport.TTransport;
 
@@ -11,94 +10,68 @@
  * @author Mark Slee <mcslee@facebook.com>
  */
 public class TProtocolUtil {
-  public static int skip(TProtocol prot, TTransport in, TType type)
+  public static void skip(TProtocol prot, TTransport in, byte type)
     throws TException {
 
     switch (type) {
-    case BYTE:
+    case TType.BYTE:
       {
-        UInt8 b = new UInt8();
-        return prot.readByte(in, b);
+        prot.readByte(in);
       }
-    case U32:
+    case TType.U32:
+    case TType.I32:
       {
-        UInt32 u32 = new UInt32();
-        return prot.readU32(in, u32);
+        prot.readI32(in);
       }
-    case I32:
+    case TType.U64:
+    case TType.I64:
       {
-        Int32 i32 = new Int32();
-        return prot.readI32(in, i32);
+        prot.readI64(in);
       }
-    case U64:
+    case TType.STRING:
       {
-        UInt64 u64 = new UInt64();
-        return prot.readU64(in, u64);
+        prot.readString(in);
       }
-    case I64:
+    case TType.STRUCT:
       {
-        Int64 i64 = new Int64();
-        return prot.readI64(in, i64);
-      }
-    case STRING:
-      {
-        TString s = new TString();
-        return prot.readString(in, s);
-      }
-    case STRUCT:
-      {
-        int result = 0;
-        TString name = new TString();
-        TStruct struct = new TStruct();
-        TField field = new TField();
-        result += prot.readStructBegin(in, struct);
+        prot.readStructBegin(in);
         while (true) {
-          result += prot.readFieldBegin(in, field);
-          if (field.type.equals(TType.STOP)) {
+          TField field = prot.readFieldBegin(in);
+          if (field.type == TType.STOP) {
             break;
           }
-          result += skip(prot, in, field.type);
-          result += prot.readFieldEnd(in);
+          skip(prot, in, field.type);
+          prot.readFieldEnd(in);
         }
-        result += prot.readStructEnd(in);
-        return result;
+        prot.readStructEnd(in);
       }
-    case MAP:
+    case TType.MAP:
       {
-        int result = 0;
-        TMap map = new TMap();
-        result += prot.readMapBegin(in, map);
-        for (int i = 0; i < map.size.get(); i++) {
-          result += skip(prot, in, map.keyType);
-          result += skip(prot, in, map.valueType);
+        TMap map = prot.readMapBegin(in);
+        for (int i = 0; i < map.size; i++) {
+          skip(prot, in, map.keyType);
+          skip(prot, in, map.valueType);
         }
-        result += prot.readMapEnd(in);
-        return result;
+        prot.readMapEnd(in);
       }
-    case SET:
-      {
-        int result = 0;
-        TSet set = new TSet();
-        result += prot.readSetBegin(in, set);
-        for (int i = 0; i < set.size.get(); i++) {
-          result += skip(prot, in, set.elemType);
+    case TType.SET:
+      {        
+        TSet set = prot.readSetBegin(in);
+        for (int i = 0; i < set.size; i++) {
+          skip(prot, in, set.elemType);
         }
-        result += prot.readSetEnd(in);
-        return result;
+        prot.readSetEnd(in);
       }
-    case LIST:
+    case TType.LIST:
       {
-        int result = 0;
-        TList list = new TList();
-        result += prot.readListBegin(in, list);
-        for (int i = 0; i < list.size.get(); i++) {
-          result += skip(prot, in, list.elemType);
+        TList list = prot.readListBegin(in);
+        for (int i = 0; i < list.size; i++) {
+          skip(prot, in, list.elemType);
         }
-        result += prot.readListEnd(in);
-        return result;
+        prot.readListEnd(in);
       }
     default:
-      return 0;
+      return;
     }
   }
 }
diff --git a/lib/java/src/protocol/TSet.java b/lib/java/src/protocol/TSet.java
index fa6e24d..542f3f5 100644
--- a/lib/java/src/protocol/TSet.java
+++ b/lib/java/src/protocol/TSet.java
@@ -1,7 +1,5 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.*;
-
 /**
  * Helper class that encapsulates set metadata.
  *
@@ -10,15 +8,11 @@
 public class TSet {
   public TSet() {}
 
-  public TSet(TType t, int s) {
-    this(t, new Int32(s));
-  }
-
-  public TSet(TType t, Int32 s) {
+  public TSet(byte t, int s) {
     elemType = t;
     size = s;
   }
 
-  public TType  elemType = TType.STOP;
-  public Int32 size = new Int32();
+  public byte elemType = TType.STOP;
+  public int  size     = 0;
 }
diff --git a/lib/java/src/protocol/TStruct.java b/lib/java/src/protocol/TStruct.java
index 2fbcb8f..b8b94ce 100644
--- a/lib/java/src/protocol/TStruct.java
+++ b/lib/java/src/protocol/TStruct.java
@@ -1,7 +1,5 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.*;
-
 /**
  * Helper class that encapsulates struct metadata.
  *
diff --git a/lib/java/src/protocol/TType.java b/lib/java/src/protocol/TType.java
index 21b7914..96f06d3 100644
--- a/lib/java/src/protocol/TType.java
+++ b/lib/java/src/protocol/TType.java
@@ -1,82 +1,22 @@
 package com.facebook.thrift.protocol;
 
-import com.facebook.thrift.types.UInt8;
-
 /**
  * Type constants in the Thrift protocol.
  *
  * @author Mark Slee <mcslee@facebook.com>
  */
-public enum TType {
-  STOP   (1),
-  BYTE   (2),
-  U16    (3),
-  I16    (4),
-  U32    (5),
-  I32    (6),
-  U64    (7),
-  I64    (8),
-  STRING (9),
-  STRUCT (10),
-  MAP    (11),
-  SET    (12),
-  LIST   (13);
-
-  /** U8 identifier */
-  private UInt8 code_;
-
-  /**
-   * Constructor to create a TType object from its code.
-   *
-   * @param code The identifier code for this type
-   */
-  private TType(int code) {
-    code_ = new UInt8((byte)code);
-  }
-
-  /**
-   * Accessor for the code.
-   */
-  public UInt8 getCode() {
-    return code_;
-  }
-
-  /**
-   * Static method to get a type object from a byte.
-   *
-   * @param code The type code
-   */
-  public static TType getType(UInt8 code) {
-    switch (code.get()) {
-    case 1:
-      return STOP;
-    case 2:
-      return BYTE;
-    case 3:
-      return U16;
-    case 4:
-      return I16;
-    case 5:
-      return U32;
-    case 6:
-      return I32;
-    case 7:
-      return U64;
-    case 8:
-      return I64;
-    case 9:
-      return STRING;
-    case 10:
-      return STRUCT;
-    case 11:
-      return MAP;
-    case 12:
-      return SET;
-    case 13:
-      return LIST;
-    default:
-      System.err.println("WARNING: Unidentified type code: " + code.get());
-      return STOP;
-    }
-  }
+public final class TType {
+  public static final byte STOP   = 1;
+  public static final byte BYTE   = 2;
+  public static final byte U16    = 3;
+  public static final byte I16    = 4;
+  public static final byte U32    = 5;
+  public static final byte I32    = 6;
+  public static final byte U64    = 7;
+  public static final byte I64    = 8;
+  public static final byte STRING = 9;
+  public static final byte STRUCT = 10;
+  public static final byte MAP    = 11;
+  public static final byte SET    = 12;
+  public static final byte LIST   = 13;
 }
diff --git a/lib/java/src/transport/TSocket.java b/lib/java/src/transport/TSocket.java
index 2092f11..6b4fa3b 100644
--- a/lib/java/src/transport/TSocket.java
+++ b/lib/java/src/transport/TSocket.java
@@ -32,8 +32,8 @@
     socket_ = socket;
     if (isOpen()) {
       try {
-        inputStream_ = new BufferedInputStream(socket_.getInputStream());
-        outputStream_ = new BufferedOutputStream(socket_.getOutputStream());
+        inputStream_ = new BufferedInputStream(socket_.getInputStream(), 1024);
+        outputStream_ = new BufferedOutputStream(socket_.getOutputStream(), 1024);
       } catch (IOException iox) {
         close();
         throw new TTransportException(iox);
@@ -96,8 +96,8 @@
 
     try {
       socket_.connect(new InetSocketAddress(host_, port_));
-      inputStream_ = new BufferedInputStream(socket_.getInputStream());
-      outputStream_ = new BufferedOutputStream(socket_.getOutputStream());
+      inputStream_ = new BufferedInputStream(socket_.getInputStream(), 1024);
+      outputStream_ = new BufferedOutputStream(socket_.getOutputStream(), 1024);
     } catch (IOException iox) {
       close();
       throw new TTransportException(iox);
diff --git a/lib/java/src/types/Int32.java b/lib/java/src/types/Int32.java
deleted file mode 100644
index e6a8cf2..0000000
--- a/lib/java/src/types/Int32.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.facebook.thrift.types;
-
-import java.io.ByteArrayOutputStream;
-
-/**
- * Wrapper for Pillar TyInt32. We have to flip the byte order in here
- * because Pillar is little endian.
- *
- * @author Mark Slee (mcslee@facebook.com)
- *
- * See: http://darksleep.com/player/JavaAndUnsignedTypes.html
- *
- */
-public class Int32 {
-  private int intValue_ = 0;
-  private byte[] data_ = new byte[4];
-  
-  public int get() {
-    return intValue_;
-  }
-
-  public byte[] data() {
-    return data_;
-  }
-
-  public Int32() {
-    for (int i = 0; i < 4; i++) {
-      data_[i] = 0;
-    }
-  }
-
-  public Int32(byte[] buf, int offset) {
-    read(buf, offset);
-  }
-
-  public Int32(int value) {
-    set(value);
-  }
-
-  public void set(int value) {
-    intValue_ = value;    
-    data_[0] = (byte)((intValue_ & 0xFF000000L) >> 24);
-    data_[1] = (byte)((intValue_ & 0x00FF0000L) >> 16);
-    data_[2] = (byte)((intValue_ & 0x0000FF00L) >> 8);
-    data_[3] = (byte)((intValue_ & 0x000000FFL));
-  }
-
-  public void read(byte[] buf, int offset) {
-    for (int i = 0; i < 4; i++) {
-      data_[i] = buf[offset+i];
-    }
-
-    int[] bytes = new int[4];
-    bytes[0] = (0x000000FF & ((int)data_[0]));
-    bytes[1] = (0x000000FF & ((int)data_[1]));
-    bytes[2] = (0x000000FF & ((int)data_[2]));
-    bytes[3] = (0x000000FF & ((int)data_[3]));
-    intValue_ = ((int) (bytes[0] << 24 | bytes[1] << 16 |
-                        bytes[2] << 8 | bytes[3]));
-  }
-
-  public String toString() {
-    return String.valueOf(intValue_);
-  }
-
-  public int hashCode() {
-    return intValue_;
-  }
-
-  public boolean equals(Object that) {
-    return ((that instanceof Int32) &&
-            (this.intValue_ == ((Int32) that).intValue_));
-  }
-
-}
diff --git a/lib/java/src/types/Int64.java b/lib/java/src/types/Int64.java
deleted file mode 100644
index 12bef4b..0000000
--- a/lib/java/src/types/Int64.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package com.facebook.thrift.types;
-
-import java.io.ByteArrayOutputStream;
-
-/**
- * 64-bit integers, just a wrapper around a long, and a byte-order
- * reverser.
- *
- * @author Mark Slee (mcslee@facebook.com)
- *
- */
-public class Int64 {
-  private long longValue_ = 0L;
-  private byte[] data_ = new byte[8];
-
-  public long get() {
-    return longValue_;
-  }
-
-  public byte[] data() {
-    return data_;
-  }
-
-  public Int64() {
-    for (int i = 0; i < 8; i++) data_[i] = (byte) 0;
-  }
-
-  public Int64(long value) {
-    set(value);
-  }
-
-  public Int64(byte[] buf, int offset) {
-    read(buf, offset);
-  }
-
-
-  /**
-   * Yes, this could be done in a loop, but written out this way makes
-   * it easier to see how the bytes are actually generated.
-   */
-  public void set(long value) {
-    longValue_ = value;
-    data_[0] = (byte)((longValue_ & 0xFF00000000000000L) >> 56);
-    data_[1] = (byte)((longValue_ & 0x00FF000000000000L) >> 48);
-    data_[2] = (byte)((longValue_ & 0x0000FF0000000000L) >> 40);
-    data_[3] = (byte)((longValue_ & 0x000000FF00000000L) >> 32);
-    data_[4] = (byte)((longValue_ & 0x00000000FF000000L) >> 24);
-    data_[5] = (byte)((longValue_ & 0x0000000000FF0000L) >> 16);
-    data_[6] = (byte)((longValue_ & 0x000000000000FF00L) >> 8);
-    data_[7] = (byte)((longValue_ & 0x00000000000000FFL));
-  }
-
-  /**
-   * Reverse byte order to calculate the value.
-   */
-  public void read(byte[] buf, int offset) {
-    for (int i = 0; i < 8; i++) {
-      data_[i] = buf[offset+i];
-    }
-
-    long[] bytes = new long[8];
-    bytes[0] = (0xFF & ((long)data_[0]));
-    bytes[1] = (0xFF & ((long)data_[1]));
-    bytes[2] = (0xFF & ((long)data_[2]));
-    bytes[3] = (0xFF & ((long)data_[3]));
-    bytes[4] = (0xFF & ((long)data_[4]));
-    bytes[5] = (0xFF & ((long)data_[5]));
-    bytes[6] = (0xFF & ((long)data_[6]));
-    bytes[7] = (0xFF & ((long)data_[7]));
-
-    longValue_ = ((long) ((bytes[0] << 56) | (bytes[1] << 48) |
-                          (bytes[2] << 40) | (bytes[3] << 32) |
-                          (bytes[4] << 24) | (bytes[5] << 16) |
-                          (bytes[6] << 8)  | (bytes[7])));
-  }
-
-  public String toString() {
-    return String.valueOf(longValue_);
-  }
-
-  public int hashCode() {
-    return (int)longValue_;
-  }
-
-  public boolean equals(Object that) {
-    return ((that instanceof Int64) &&
-            (this.longValue_ == ((Int64) that).longValue_));
-  }
-
-}
diff --git a/lib/java/src/types/UInt32.java b/lib/java/src/types/UInt32.java
deleted file mode 100644
index 52c6da0..0000000
--- a/lib/java/src/types/UInt32.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.facebook.thrift.types;
-
-import java.io.ByteArrayOutputStream;
-
-/**
- * Bit-twiddling bullshit because java doesn't have unsigned types.
- * Also, the JVM is big-endian, but Pillar is written on the little
- * endian architecture, and it doesn't translated numbers to network
- * byte order (also big-endian) when it transmits them.
- *
- * So, a UInt32 received by pillar will come over the net in little
- * endian byte order, which means we have to reverse it for Java.
- *
- * @author Mark Slee (mcslee@facebook.com)
- *
- * See: http://darksleep.com/player/JavaAndUnsignedTypes.html
- *
- */
-public class UInt32 {
-  private long longValue_ = 0;
-  private byte[] data_ = new byte[4];
-  
-  public long get() {
-    return longValue_;
-  }
-
-  public int toInt() {
-    return (int) longValue_;
-  }
-
-  public byte[] data() {
-    return data_;
-  }
-
-  public UInt32() {
-    for (int i = 0; i < 4; i++) data_[i] = (byte) 0;
-  }
-
-  public UInt32(byte[] buf, int offset) {
-    read(buf, offset);
-  }
-
-  public UInt32(long value) {
-    set(value);
-  }
-
-  public UInt32(int value) {
-    this((long)value);
-  }
-
-  public void set(long value) {
-    if (value < 0) {
-      throw new RuntimeException("Cannot assign negative value to UInt32.");
-    }
-    longValue_ = value;
-    data_[0] = (byte)((longValue_ & 0xFF000000L) >> 24);
-    data_[1] = (byte)((longValue_ & 0x00FF0000L) >> 16);
-    data_[2] = (byte)((longValue_ & 0x0000FF00L) >> 8);
-    data_[3] = (byte)((longValue_ & 0x000000FFL));
-  }
-
-  public void read(byte[] buf, int offset) {
-    for (int i = 0; i < 4; i++) {
-      data_[i] = buf[offset+i];
-    }
-
-    int[] bytes = new int[4];
-    bytes[0] = (0x000000FF & ((int)data_[0]));
-    bytes[1] = (0x000000FF & ((int)data_[1]));
-    bytes[2] = (0x000000FF & ((int)data_[2]));
-    bytes[3] = (0x000000FF & ((int)data_[3]));
-    longValue_ = ((long) ((bytes[0] << 24) | (bytes[1] << 16) |
-                          (bytes[2] << 8) | (bytes[3]))) & 0xFFFFFFFFL;
-  }
-
-  public String toString() {
-    return String.valueOf(longValue_);
-  }
-
-  public int hashCode() {
-    return toInt();
-  }
-
-  public boolean equals(Object that) {
-    return ((that instanceof UInt32) &&
-            (this.longValue_ == ((UInt32) that).longValue_));
-  }
-
-}
diff --git a/lib/java/src/types/UInt64.java b/lib/java/src/types/UInt64.java
deleted file mode 100644
index 18cf44a..0000000
--- a/lib/java/src/types/UInt64.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.facebook.thrift.types;
-
-import java.io.ByteArrayOutputStream;
-
-/**
- * More bit-twiddling bullshit. Take a look at UInt32 for details about
- * the endian difference between Pillar and the JVM.
- *
- * Since we don't do arithmetic on unsigned longs, we just implement
- * them here as a raw byte array. The only caveat is the constructor
- * that takes an integer value. That value will be big-endian (JVM)
- * but the byte array needs to be little-endian (Pillar)
- *
- * @author Mark Slee (mcslee@facebook.com)
- *
- */
-public class UInt64 {
-  private byte[] data_ = new byte[8];
-
-  public byte[] data() {
-    return data_;
-  }
-
-  public UInt64() {
-    for (int i = 0; i < 8; i++) {
-      data_[i] = (byte) 0;
-    }
-  }
-
-  public UInt64(long value) {
-    set(value);
-  }
-
-  public UInt64(byte[] buf, int offset) {
-    read(buf, offset);
-  }
-
-  public long toLong() {
-    long[] bytes = new long[8];
-    bytes[0] = (0xFF & ((long)data_[0]));
-    bytes[1] = (0xFF & ((long)data_[1]));
-    bytes[2] = (0xFF & ((long)data_[2]));
-    bytes[3] = (0xFF & ((long)data_[3]));
-    bytes[4] = (0xFF & ((long)data_[4]));
-    bytes[5] = (0xFF & ((long)data_[5]));
-    bytes[6] = (0xFF & ((long)data_[6]));
-    bytes[7] = (0xFF & ((long)data_[7]));
-
-    return ((long) ((bytes[0] << 56) | (bytes[1] << 48) |
-                    (bytes[2] << 40) | (bytes[3] << 32) |
-                    (bytes[4] << 24) | (bytes[5] << 16) |
-                    (bytes[6] << 8)  | (bytes[7])));
-  }
-
-  /**
-   * "HOLD IT! Pay close attention..." -Prodigy - Out of Space
-   *
-   * This is some wacky business. We want to take the integer value
-   * represented JVM style and put it into an 8-byte array that mirrors
-   * Intel/Pillar endianness (little). To do this, we graduate the
-   * integer to a long and then reverse the byte order, so bytes
-   * 5-8 in the JVM long become bytes 3-0 in the Pillar representation.
-   *
-   * NOTE: value MUST be positive, or else shit gets ill.
-   */
-  public void set(long longValue) {
-    if (longValue < 0) {
-      throw new RuntimeException("Cannot make UInt64 from a negative value.");
-    }
-    data_[0] = (byte)((longValue & 0xFF00000000000000L) >> 56);
-    data_[1] = (byte)((longValue & 0x00FF000000000000L) >> 48);
-    data_[2] = (byte)((longValue & 0x0000FF0000000000L) >> 40);
-    data_[3] = (byte)((longValue & 0x000000FF00000000L) >> 32);
-    data_[4] = (byte)((longValue & 0x00000000FF000000L) >> 24);
-    data_[5] = (byte)((longValue & 0x0000000000FF0000L) >> 16);
-    data_[6] = (byte)((longValue & 0x000000000000FF00L) >> 8);
-    data_[7] = (byte)((longValue & 0x00000000000000FFL));
-  }
-
-  public void read(byte[] buf, int offset) {
-    for (int i = 0; i < 8; i++) {
-      data_[i] = buf[offset+i];
-    }
-  }
-
-  /**
-   * Equivalent to << 8, shifting left by a byte.
-   */
-  public UInt64 lshift() {
-    for (int i = 7; i > 0; i--) {
-      data_[i] = data_[i-1];
-    }
-    data_[0] = (byte) 0;
-    return this;
-  }
-
-  /**
-   * Equivalent to |, logical or across all bytes
-   */
-  public UInt64 lor(UInt64 that) {
-    for (int i = 0; i < 8; i++) {
-      this.data_[i] = (byte) (this.data_[i] | that.data_[i]);
-    }
-    return this;
-  }
-
-  public int hashCode() {
-    return ((0xFF & (int)data_[3]) << 24) |
-           ((0xFF & (int)data_[2]) << 16) |
-           ((0xFF & (int)data_[1]) << 8) |
-           ((0xFF & (int)data_[0]));
-  }
-
-  public boolean equals(Object that) {
-    if (that instanceof UInt64) {
-      for (int i = 0; i < 8; i++) {
-        if (this.data_[i] != ((UInt64)that).data_[i]) {
-          return false;
-        }
-      }
-      return true;
-    }
-    return false;
-  }
-
-}
diff --git a/lib/java/src/types/UInt8.java b/lib/java/src/types/UInt8.java
deleted file mode 100644
index 640a7e1..0000000
--- a/lib/java/src/types/UInt8.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.facebook.thrift.types;
-
-import java.io.ByteArrayOutputStream;
-
-/**
- * WILL IT EVER END? Even 'byte' is signed in Java, so we must use
- * a short to represent bytes. 
- *
- * @author Mark Slee (mcslee@facebook.com)
- *
- */
-public class UInt8 {
-  private short shortValue_;
-  private byte[] data_ = new byte[1];
-  
-  public short get() {
-    return shortValue_;
-  }
-
-  public byte[] data() {
-    return data_;
-  }
-
-  public UInt8() {
-    data_[0] = (byte)0;
-  }
-
-  public UInt8(byte[] buf, int offset) {
-    read(buf, offset);
-  }
-
-  public UInt8(short value) {
-    set(value);
-  }
-
-  public void set(short value) {
-    if (value < 0) throw new RuntimeException("Cannot apply negative value to UInt8");
-    shortValue_ = value;
-    data_[0] = (byte)((shortValue_ & 0x00FF));
-  }
-
-  public void read(byte[] buf, int offset) {
-    data_[0] = buf[offset];
-    shortValue_ = (short) (0x00FF & (short)data_[0]);
-  }
-
-  public String toString() {
-    return String.valueOf(shortValue_);
-  }
-
-  public int hashCode() {
-    return (int)shortValue_;
-  }
-
-  public boolean equals(Object that) {
-    return ((that instanceof UInt8) &&
-            (this.shortValue_ == ((UInt8) that).shortValue_));
-  }
-
-}
