diff --git a/lib/rb/lib/thrift/protocol.rb b/lib/rb/lib/thrift/protocol.rb
new file mode 100644
index 0000000..47fe723
--- /dev/null
+++ b/lib/rb/lib/thrift/protocol.rb
@@ -0,0 +1,223 @@
+#
+# Copyright (c) 2006- Facebook
+# Distributed under the Thrift Software License
+#
+# See accompanying file LICENSE or visit the Thrift site at:
+# http://developers.facebook.com/thrift/
+#
+# Author: Mark Slee <mcslee@facebook.com>
+#
+
+module Thrift
+  class ProtocolException < Exception
+
+    UNKNOWN = 0
+    INVALID_DATA = 1
+    NEGATIVE_SIZE = 2
+    SIZE_LIMIT = 3
+    BAD_VERSION = 4
+
+    attr_reader :type
+
+    def initialize(type=UNKNOWN, message=nil)
+      super(message)
+      @type = type
+    end
+
+  end
+  deprecate_class! :TProtocolException => ProtocolException
+
+  class Protocol
+
+    attr_reader :trans
+
+    def initialize(trans)
+      @trans = trans
+    end
+
+    def writeMessageBegin(name, type, seqid); nil; end
+
+    def writeMessageEnd; nil; end
+
+    def writeStructBegin(name); nil; end
+
+    def writeStructEnd(); nil; end
+
+    def writeFieldBegin(name, type, id); nil; end
+
+    def writeFieldEnd(); nil; end
+
+    def writeFieldStop(); nil; end
+
+    def writeMapBegin(ktype, vtype, size); nil; end
+
+    def writeMapEnd(); nil; end
+
+    def writeListBegin(etype, size); nil; end
+
+    def writeListEnd(); nil; end
+
+    def writeSetBegin(etype, size); nil; end
+
+    def writeSetEnd(); nil; end
+
+    def writeBool(bool); nil; end
+
+    def writeByte(byte); nil; end
+
+    def writeI16(i16); nil; end
+
+    def writeI32(i32); nil; end
+
+    def writeI64(i64); nil; end
+
+    def writeDouble(dub); nil; end
+
+    def writeString(str); nil; end
+
+    def readMessageBegin(); nil; end
+
+    def readMessageEnd(); nil; end
+
+    def readStructBegin(); nil; end
+
+    def readStructEnd(); nil; end
+
+    def readFieldBegin(); nil; end
+
+    def readFieldEnd(); nil; end
+
+    def readMapBegin(); nil; end
+
+    def readMapEnd(); nil; end
+
+    def readListBegin(); nil; end
+
+    def readListEnd(); nil; end
+
+    def readSetBegin(); nil; end
+
+    def readSetEnd(); nil; end
+
+    def readBool(); nil; end
+
+    def readByte(); nil; end
+
+    def readI16(); nil; end
+
+    def readI32(); nil; end
+
+    def readI64(); nil; end
+
+    def readDouble(); nil; end
+
+    def readString(); nil; end
+
+    def write_field(name, type, fid, value)
+      writeFieldBegin(name, type, fid)
+      write_type(type, value)
+      writeFieldEnd
+    end
+
+    def write_type(type, value)
+      case type
+      when Types::BOOL
+        writeBool(value)
+      when Types::BYTE
+        writeByte(value)
+      when Types::DOUBLE
+        writeDouble(value)
+      when Types::I16
+        writeI16(value)
+      when Types::I32
+        writeI32(value)
+      when Types::I64
+        writeI64(value)
+      when Types::STRING
+        writeString(value)
+      when Types::STRUCT
+        value.write(self)
+      else
+        raise NotImplementedError
+      end
+    end
+
+    def read_type(type)
+      case type
+      when Types::BOOL
+        readBool
+      when Types::BYTE
+        readByte
+      when Types::DOUBLE
+        readDouble
+      when Types::I16
+        readI16
+      when Types::I32
+        readI32
+      when Types::I64
+        readI64
+      when Types::STRING
+        readString
+      else
+        raise NotImplementedError
+      end
+    end
+
+    def skip(type)
+      if type === Types::STOP
+        nil
+      elsif type === Types::BOOL
+        readBool()
+      elsif type === Types::BYTE
+        readByte()
+      elsif type === Types::I16
+        readI16()
+      elsif type === Types::I32
+        readI32()
+      elsif type === Types::I64
+        readI64()
+      elsif type === Types::DOUBLE
+        readDouble()
+      elsif type === Types::STRING
+        readString()
+      elsif type === Types::STRUCT
+        readStructBegin()
+        while true
+          name, type, id = readFieldBegin()
+          if type === Types::STOP
+            break
+          else
+            skip(type)
+            readFieldEnd()
+          end
+          readStructEnd()
+        end
+      elsif type === Types::MAP
+        ktype, vtype, size = readMapBegin()
+        for i in 1..size
+          skip(ktype)
+          skip(vtype)
+        end
+        readMapEnd()
+      elsif type === Types::SET
+        etype, size = readSetBegin()
+        for i in 1..size
+          skip(etype)
+        end
+        readSetEnd()
+      elsif type === Types::LIST
+        etype, size = readListBegin()
+        for i in 1..size
+          skip(etype)
+        end
+        readListEnd()
+      end
+    end
+
+  end
+  deprecate_class! :TProtocol => Protocol
+end
+
+class TProtocolFactory
+  def getProtocol(trans); nil; end
+end
diff --git a/lib/rb/lib/thrift/protocol/binaryprotocol.rb b/lib/rb/lib/thrift/protocol/binaryprotocol.rb
new file mode 100644
index 0000000..9832383
--- /dev/null
+++ b/lib/rb/lib/thrift/protocol/binaryprotocol.rb
@@ -0,0 +1,191 @@
+#
+# Copyright (c) 2006- Facebook
+# Distributed under the Thrift Software License
+#
+# See accompanying file LICENSE or visit the Thrift site at:
+# http://developers.facebook.com/thrift/
+#
+# Author: Mark Slee <mcslee@facebook.com>
+#
+require 'thrift/protocol'
+
+module Thrift
+  class BinaryProtocol < Protocol
+    VERSION_MASK = 0xffff0000
+    VERSION_1 = 0x80010000
+
+    def initialize(trans)
+      super(trans)
+    end
+
+    def writeMessageBegin(name, type, seqid)
+      writeI32(VERSION_1 | type)
+      writeString(name)
+      writeI32(seqid)
+    end
+
+    def writeFieldBegin(name, type, id)
+      writeByte(type)
+      writeI16(id)
+    end
+
+    def writeFieldStop()
+      writeByte(Thrift::Types::STOP)
+    end
+
+    def writeMapBegin(ktype, vtype, size)
+      writeByte(ktype)
+      writeByte(vtype)
+      writeI32(size)
+    end
+
+    def writeListBegin(etype, size)
+      writeByte(etype)
+      writeI32(size)
+    end
+
+    def writeSetBegin(etype, size)
+      writeByte(etype)
+      writeI32(size)
+    end
+
+    def writeBool(bool)
+      if (bool)
+        writeByte(1)
+      else
+        writeByte(0)
+      end
+    end
+
+    def writeByte(byte)
+      trans.write([byte].pack('n')[1..1])
+    end
+
+    def writeI16(i16)
+      trans.write([i16].pack('n'))
+    end
+
+    def writeI32(i32)
+      trans.write([i32].pack('N'))
+    end
+
+    def writeI64(i64)
+      hi = i64 >> 32
+      lo = i64 & 0xffffffff
+      trans.write([hi, lo].pack('N2'))
+    end
+
+    def writeDouble(dub)
+      trans.write([dub].pack('G'))
+    end
+
+    def writeString(str)
+      writeI32(str.length)
+      trans.write(str)
+    end
+
+    def readMessageBegin()
+      version = readI32()
+      if (version & VERSION_MASK != VERSION_1)
+        raise ProtocolException.new(ProtocolException::BAD_VERSION, 'Missing version identifier')
+      end
+      type = version & 0x000000ff
+      name = readString()
+      seqid = readI32()
+      return name, type, seqid
+    end
+
+    def readFieldBegin()
+      type = readByte()
+      if (type === Types::STOP)
+        return nil, type, 0
+      end
+      id = readI16()
+      return nil, type, id
+    end
+
+    def readMapBegin()
+      ktype = readByte()
+      vtype = readByte()
+      size = readI32()
+      return ktype, vtype, size
+    end
+
+    def readListBegin()
+      etype = readByte()
+      size = readI32()
+      return etype, size
+    end
+
+    def readSetBegin()
+      etype = readByte()
+      size = readI32()
+      return etype, size
+    end
+
+    def readBool()
+      byte = readByte()
+      return byte != 0
+    end
+
+    def readByte()
+      dat = trans.readAll(1)
+      val = dat[0]
+      if (val > 0x7f)
+        val = 0 - ((val - 1) ^ 0xff)
+      end
+      return val
+    end
+
+    def readI16()
+      dat = trans.readAll(2)
+      val, = dat.unpack('n')
+      if (val > 0x7fff)
+        val = 0 - ((val - 1) ^ 0xffff)
+      end
+      return val
+    end
+
+    def readI32()
+      dat = trans.readAll(4)
+      val, = dat.unpack('N')
+      if (val > 0x7fffffff)
+        val = 0 - ((val - 1) ^ 0xffffffff)
+      end
+      return val
+    end
+
+    def readI64()
+      dat = trans.readAll(8)
+      hi, lo = dat.unpack('N2')
+      if (hi > 0x7fffffff)
+        hi = hi ^ 0xffffffff
+        lo = lo ^ 0xffffffff
+        return 0 - hi*4294967296 - lo - 1
+      else
+        return hi*4294967296 + lo
+      end
+    end
+
+    def readDouble()
+      dat = trans.readAll(8)
+      val, = dat.unpack('G')
+      return val
+    end
+
+    def readString()
+      sz = readI32()
+      dat = trans.readAll(sz)
+      return dat
+    end
+
+  end
+  deprecate_class! :TBinaryProtocol => BinaryProtocol
+end
+
+class TBinaryProtocolFactory < TProtocolFactory
+  def getProtocol(trans)
+    return TBinaryProtocol.new(trans)
+  end
+end
+
diff --git a/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb b/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb
index adfeb81..038e190 100644
--- a/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb
+++ b/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb
@@ -1,192 +1 @@
-#!/usr/bin/env ruby
-#
-# Copyright (c) 2006- Facebook
-# Distributed under the Thrift Software License
-#
-# See accompanying file LICENSE or visit the Thrift site at:
-# http://developers.facebook.com/thrift/
-#
-# Author: Mark Slee <mcslee@facebook.com>
-#
-require 'thrift/protocol/tprotocol'
-
-module Thrift
-  class BinaryProtocol < Protocol
-    VERSION_MASK = 0xffff0000
-    VERSION_1 = 0x80010000
-
-    def initialize(trans)
-      super(trans)
-    end
-
-    def writeMessageBegin(name, type, seqid)
-      writeI32(VERSION_1 | type)
-      writeString(name)
-      writeI32(seqid)
-    end
-
-    def writeFieldBegin(name, type, id)
-      writeByte(type)
-      writeI16(id)
-    end
-
-    def writeFieldStop()
-      writeByte(Thrift::Types::STOP)
-    end
-
-    def writeMapBegin(ktype, vtype, size)
-      writeByte(ktype)
-      writeByte(vtype)
-      writeI32(size)
-    end
-
-    def writeListBegin(etype, size)
-      writeByte(etype)
-      writeI32(size)
-    end
-
-    def writeSetBegin(etype, size)
-      writeByte(etype)
-      writeI32(size)
-    end
-
-    def writeBool(bool)
-      if (bool)
-        writeByte(1)
-      else
-        writeByte(0)
-      end
-    end
-
-    def writeByte(byte)
-      trans.write([byte].pack('n')[1..1])
-    end
-
-    def writeI16(i16)
-      trans.write([i16].pack('n'))
-    end
-
-    def writeI32(i32)
-      trans.write([i32].pack('N'))
-    end
-
-    def writeI64(i64)
-      hi = i64 >> 32
-      lo = i64 & 0xffffffff
-      trans.write([hi, lo].pack('N2'))
-    end
-
-    def writeDouble(dub)
-      trans.write([dub].pack('G'))
-    end
-
-    def writeString(str)
-      writeI32(str.length)
-      trans.write(str)
-    end
-
-    def readMessageBegin()
-      version = readI32()
-      if (version & VERSION_MASK != VERSION_1)
-        raise ProtocolException.new(ProtocolException::BAD_VERSION, 'Missing version identifier')
-      end
-      type = version & 0x000000ff
-      name = readString()
-      seqid = readI32()
-      return name, type, seqid
-    end
-
-    def readFieldBegin()
-      type = readByte()
-      if (type === Types::STOP)
-        return nil, type, 0
-      end
-      id = readI16()
-      return nil, type, id
-    end
-
-    def readMapBegin()
-      ktype = readByte()
-      vtype = readByte()
-      size = readI32()
-      return ktype, vtype, size
-    end
-
-    def readListBegin()
-      etype = readByte()
-      size = readI32()
-      return etype, size
-    end
-
-    def readSetBegin()
-      etype = readByte()
-      size = readI32()
-      return etype, size
-    end
-
-    def readBool()
-      byte = readByte()
-      return byte != 0
-    end
-
-    def readByte()
-      dat = trans.readAll(1)
-      val = dat[0]
-      if (val > 0x7f)
-        val = 0 - ((val - 1) ^ 0xff)
-      end
-      return val
-    end
-
-    def readI16()
-      dat = trans.readAll(2)
-      val, = dat.unpack('n')
-      if (val > 0x7fff)
-        val = 0 - ((val - 1) ^ 0xffff)
-      end
-      return val
-    end
-
-    def readI32()
-      dat = trans.readAll(4)
-      val, = dat.unpack('N')
-      if (val > 0x7fffffff)
-        val = 0 - ((val - 1) ^ 0xffffffff)
-      end
-      return val
-    end
-
-    def readI64()
-      dat = trans.readAll(8)
-      hi, lo = dat.unpack('N2')
-      if (hi > 0x7fffffff)
-        hi = hi ^ 0xffffffff
-        lo = lo ^ 0xffffffff
-        return 0 - hi*4294967296 - lo - 1
-      else
-        return hi*4294967296 + lo
-      end
-    end
-
-    def readDouble()
-      dat = trans.readAll(8)
-      val, = dat.unpack('G')
-      return val
-    end
-
-    def readString()
-      sz = readI32()
-      dat = trans.readAll(sz)
-      return dat
-    end
-
-  end
-  deprecate_class! :TBinaryProtocol => BinaryProtocol
-end
-
-class TBinaryProtocolFactory < TProtocolFactory
-  def getProtocol(trans)
-    return TBinaryProtocol.new(trans)
-  end
-end
-
+require 'thrift/protocol/binaryprotocol'
diff --git a/lib/rb/lib/thrift/protocol/tprotocol.rb b/lib/rb/lib/thrift/protocol/tprotocol.rb
index 905b754..48bf261 100644
--- a/lib/rb/lib/thrift/protocol/tprotocol.rb
+++ b/lib/rb/lib/thrift/protocol/tprotocol.rb
@@ -1,224 +1 @@
-#!/usr/bin/env ruby
-#
-# Copyright (c) 2006- Facebook
-# Distributed under the Thrift Software License
-#
-# See accompanying file LICENSE or visit the Thrift site at:
-# http://developers.facebook.com/thrift/
-#
-# Author: Mark Slee <mcslee@facebook.com>
-#
-
-module Thrift
-  class ProtocolException < Exception
-
-    UNKNOWN = 0
-    INVALID_DATA = 1
-    NEGATIVE_SIZE = 2
-    SIZE_LIMIT = 3
-    BAD_VERSION = 4
-
-    attr_reader :type
-
-    def initialize(type=UNKNOWN, message=nil)
-      super(message)
-      @type = type
-    end
-
-  end
-  deprecate_class! :TProtocolException => ProtocolException
-
-  class Protocol
-
-    attr_reader :trans
-
-    def initialize(trans)
-      @trans = trans
-    end
-
-    def writeMessageBegin(name, type, seqid); nil; end
-
-    def writeMessageEnd; nil; end
-
-    def writeStructBegin(name); nil; end
-
-    def writeStructEnd(); nil; end
-
-    def writeFieldBegin(name, type, id); nil; end
-
-    def writeFieldEnd(); nil; end
-
-    def writeFieldStop(); nil; end
-
-    def writeMapBegin(ktype, vtype, size); nil; end
-
-    def writeMapEnd(); nil; end
-
-    def writeListBegin(etype, size); nil; end
-
-    def writeListEnd(); nil; end
-
-    def writeSetBegin(etype, size); nil; end
-
-    def writeSetEnd(); nil; end
-
-    def writeBool(bool); nil; end
-
-    def writeByte(byte); nil; end
-
-    def writeI16(i16); nil; end
-
-    def writeI32(i32); nil; end
-
-    def writeI64(i64); nil; end
-
-    def writeDouble(dub); nil; end
-
-    def writeString(str); nil; end
-
-    def readMessageBegin(); nil; end
-
-    def readMessageEnd(); nil; end
-
-    def readStructBegin(); nil; end
-
-    def readStructEnd(); nil; end
-
-    def readFieldBegin(); nil; end
-
-    def readFieldEnd(); nil; end
-
-    def readMapBegin(); nil; end
-
-    def readMapEnd(); nil; end
-
-    def readListBegin(); nil; end
-
-    def readListEnd(); nil; end
-
-    def readSetBegin(); nil; end
-
-    def readSetEnd(); nil; end
-
-    def readBool(); nil; end
-
-    def readByte(); nil; end
-
-    def readI16(); nil; end
-
-    def readI32(); nil; end
-
-    def readI64(); nil; end
-
-    def readDouble(); nil; end
-
-    def readString(); nil; end
-
-    def write_field(name, type, fid, value)
-      writeFieldBegin(name, type, fid)
-      write_type(type, value)
-      writeFieldEnd
-    end
-
-    def write_type(type, value)
-      case type
-      when Types::BOOL
-        writeBool(value)
-      when Types::BYTE
-        writeByte(value)
-      when Types::DOUBLE
-        writeDouble(value)
-      when Types::I16
-        writeI16(value)
-      when Types::I32
-        writeI32(value)
-      when Types::I64
-        writeI64(value)
-      when Types::STRING
-        writeString(value)
-      when Types::STRUCT
-        value.write(self)
-      else
-        raise NotImplementedError
-      end
-    end
-
-    def read_type(type)
-      case type
-      when Types::BOOL
-        readBool
-      when Types::BYTE
-        readByte
-      when Types::DOUBLE
-        readDouble
-      when Types::I16
-        readI16
-      when Types::I32
-        readI32
-      when Types::I64
-        readI64
-      when Types::STRING
-        readString
-      else
-        raise NotImplementedError
-      end
-    end
-
-    def skip(type)
-      if type === Types::STOP
-        nil
-      elsif type === Types::BOOL
-        readBool()
-      elsif type === Types::BYTE
-        readByte()
-      elsif type === Types::I16
-        readI16()
-      elsif type === Types::I32
-        readI32()
-      elsif type === Types::I64
-        readI64()
-      elsif type === Types::DOUBLE
-        readDouble()
-      elsif type === Types::STRING
-        readString()
-      elsif type === Types::STRUCT
-        readStructBegin()
-        while true
-          name, type, id = readFieldBegin()
-          if type === Types::STOP
-            break
-          else
-            skip(type)
-            readFieldEnd()
-          end
-          readStructEnd()
-        end
-      elsif type === Types::MAP
-        ktype, vtype, size = readMapBegin()
-        for i in 1..size
-          skip(ktype)
-          skip(vtype)
-        end
-        readMapEnd()
-      elsif type === Types::SET
-        etype, size = readSetBegin()
-        for i in 1..size
-          skip(etype)
-        end
-        readSetEnd()
-      elsif type === Types::LIST
-        etype, size = readListBegin()
-        for i in 1..size
-          skip(etype)
-        end
-        readListEnd()
-      end
-    end
-
-  end
-  deprecate_class! :TProtocol => Protocol
-end
-
-class TProtocolFactory
-  def getProtocol(trans); nil; end
-end
+require 'thrift/protocol'
diff --git a/lib/rb/lib/thrift/thrift.rb b/lib/rb/lib/thrift/thrift.rb
index dfad650..a676160 100644
--- a/lib/rb/lib/thrift/thrift.rb
+++ b/lib/rb/lib/thrift/thrift.rb
@@ -1,8 +1,9 @@
 # This file kept for backwards compatability
 # require File.join(File.dirname(__FILE__), '../thrift')
-require File.join(File.dirname(__FILE__), 'deprecation')
-require File.join(File.dirname(__FILE__), 'types')
-require File.join(File.dirname(__FILE__), 'processor')
-require File.join(File.dirname(__FILE__), 'exceptions')
-require File.join(File.dirname(__FILE__), 'client')
-require File.join(File.dirname(__FILE__), 'struct')
+$:.unshift File.dirname(File.dirname(__FILE__))
+require 'thrift/deprecation'
+require 'thrift/types'
+require 'thrift/processor'
+require 'thrift/exceptions'
+require 'thrift/client'
+require 'thrift/struct'
