diff --git a/lib/rb/lib/thrift.rb b/lib/rb/lib/thrift.rb
index 9c9c4b2..2e747d4 100644
--- a/lib/rb/lib/thrift.rb
+++ b/lib/rb/lib/thrift.rb
@@ -21,7 +21,7 @@
 require 'thrift/processor'
 require 'thrift/client'
 require 'thrift/struct'
-require 'thrift/protocol/tprotocol'
-require 'thrift/transport/tsocket'
-require 'thrift/transport/ttransport'
-require 'thrift/server/tserver'
+require 'thrift/protocol'
+require 'thrift/transport/socket'
+require 'thrift/transport'
+require 'thrift/server'
diff --git a/lib/rb/lib/thrift/protocol.rb b/lib/rb/lib/thrift/protocol.rb
index e8a6cb7..23433be 100644
--- a/lib/rb/lib/thrift/protocol.rb
+++ b/lib/rb/lib/thrift/protocol.rb
@@ -255,9 +255,10 @@
 
   end
   deprecate_class! :TProtocol => Protocol
-end
 
-class TProtocolFactory
-  def get_protocol(trans); nil; end
-  deprecate! :getProtocol => :get_protocol
+  class ProtocolFactory
+    def get_protocol(trans); nil; end
+    deprecate! :getProtocol => :get_protocol
+  end
+  deprecate_class! :TProtocolFactory => ProtocolFactory
 end
diff --git a/lib/rb/lib/thrift/protocol/binaryprotocol.rb b/lib/rb/lib/thrift/protocol/binaryprotocol.rb
index 682ecbf..b344faf 100644
--- a/lib/rb/lib/thrift/protocol/binaryprotocol.rb
+++ b/lib/rb/lib/thrift/protocol/binaryprotocol.rb
@@ -181,11 +181,11 @@
 
   end
   deprecate_class! :TBinaryProtocol => BinaryProtocol
-end
 
-class TBinaryProtocolFactory < TProtocolFactory
-  def get_protocol(trans)
-    return TBinaryProtocol.new(trans)
+  class BinaryProtocolFactory < ProtocolFactory
+    def get_protocol(trans)
+      return TBinaryProtocol.new(trans)
+    end
   end
+  deprecate_class! :TBinaryProtocolFactory => BinaryProtocolFactory
 end
-
diff --git a/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb b/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb
index 038e190..bde3169 100644
--- a/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb
+++ b/lib/rb/lib/thrift/protocol/tbinaryprotocol.rb
@@ -1 +1,2 @@
+require 'thrift/deprecation'
 require 'thrift/protocol/binaryprotocol'
diff --git a/lib/rb/lib/thrift/protocol/tprotocol.rb b/lib/rb/lib/thrift/protocol/tprotocol.rb
index 48bf261..235a34b 100644
--- a/lib/rb/lib/thrift/protocol/tprotocol.rb
+++ b/lib/rb/lib/thrift/protocol/tprotocol.rb
@@ -1 +1,2 @@
+require 'thrift/deprecation'
 require 'thrift/protocol'
diff --git a/lib/rb/lib/thrift/server.rb b/lib/rb/lib/thrift/server.rb
new file mode 100644
index 0000000..d19a5b2
--- /dev/null
+++ b/lib/rb/lib/thrift/server.rb
@@ -0,0 +1,141 @@
+# 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'
+require 'thrift/protocol/binaryprotocol'
+require 'thrift/transport'
+
+module Thrift
+  class Server
+    def initialize(processor, serverTransport, transportFactory=nil, protocolFactory=nil)
+      @processor = processor
+      @serverTransport = serverTransport
+      @transportFactory = transportFactory ? transportFactory : Thrift::TransportFactory.new()
+      @protocolFactory = protocolFactory ? protocolFactory : Thrift::BinaryProtocolFactory.new()
+    end
+
+    def serve(); nil; end
+  end
+  deprecate_class! :TServer => Server
+
+  class SimpleServer < Server
+    def initialize(processor, serverTransport, transportFactory=nil, protocolFactory=nil)
+      super(processor, serverTransport, transportFactory, protocolFactory)
+    end
+
+    def serve()
+      begin
+        @serverTransport.listen()
+        while (true)
+          client = @serverTransport.accept()
+          trans = @transportFactory.get_transport(client)
+          prot = @protocolFactory.get_protocol(trans)
+          begin
+            while (true)
+              @processor.process(prot, prot)
+            end
+          rescue TTransportException, Thrift::ProtocolException => ttx
+            #print ttx,"\n"
+          ensure
+            trans.close()
+          end
+        end
+      ensure
+        @serverTransport.close()
+      end
+    end
+  end
+  deprecate_class! :TSimpleServer => SimpleServer
+end
+
+begin
+  require 'fastthread'
+rescue LoadError
+  require 'thread'
+end
+
+module Thrift
+  class ThreadedServer < Server
+    def serve()
+      begin
+        @serverTransport.listen()
+        while (true)
+          client = @serverTransport.accept()
+          trans = @transportFactory.get_transport(client)
+          prot = @protocolFactory.get_protocol(trans)
+          Thread.new(prot, trans) do |p, t|
+            begin
+              while (true)
+                @processor.process(p, p)
+              end
+            rescue TTransportException, Thrift::ProtocolException => e
+            ensure
+              t.close()
+            end
+          end
+        end
+      ensure
+        @serverTransport.close()
+      end
+    end
+  end
+  deprecate_class! :TThreadedServer => ThreadedServer
+
+  class ThreadPoolServer < Server
+    def initialize(processor, serverTransport, transportFactory=nil, protocolFactory=nil, num=20)
+      super(processor, serverTransport, transportFactory, protocolFactory)
+      @thread_q = SizedQueue.new(num)
+      @exception_q = Queue.new
+      @running = false
+    end
+
+    ## exceptions that happen in worker threads will be relayed here and
+    ## must be caught. 'retry' can be used to continue. (threads will
+    ## continue to run while the exception is being handled.)
+    def rescuable_serve
+      Thread.new { serve } unless @running
+      raise @exception_q.pop
+    end
+
+    ## exceptions that happen in worker threads simply cause that thread
+    ## to die and another to be spawned in its place.
+    def serve
+      @serverTransport.listen()
+
+      begin
+        while (true)
+          @thread_q.push(:token)
+          Thread.new do
+            begin
+              while (true)
+                client = @serverTransport.accept()
+                trans = @transportFactory.get_transport(client)
+                prot = @protocolFactory.get_protocol(trans)
+                begin
+                  while (true)
+                    @processor.process(prot, prot)
+                  end
+                rescue TTransportException, Thrift::ProtocolException => e
+                ensure
+                  trans.close()
+                end
+              end
+            rescue Exception => e
+              @exception_q.push(e)
+            ensure
+              @thread_q.pop() # thread died!
+            end
+          end
+        end
+      ensure
+        @serverTransport.close()
+      end
+    end
+  end
+  deprecate_class! :TThreadPoolServer => ThreadPoolServer
+end
diff --git a/lib/rb/lib/thrift/server/httpserver.rb b/lib/rb/lib/thrift/server/httpserver.rb
new file mode 100644
index 0000000..c92e0ca
--- /dev/null
+++ b/lib/rb/lib/thrift/server/httpserver.rb
@@ -0,0 +1,44 @@
+require 'thrift/protocol'
+require 'thrift/protocol/binaryprotocol'
+require 'thrift/transport'
+
+require 'mongrel'
+
+## Sticks a service on a URL, using mongrel to do the HTTP work
+module Thrift
+  class SimpleMongrelHTTPServer
+    class Handler < Mongrel::HttpHandler
+      def initialize(processor, protocol_factory)
+        @processor = processor
+        @protocol_factory = protocol_factory
+      end
+
+      def process(request, response)
+        unless request.params["REQUEST_METHOD"] == "POST"
+          response.start(404) { } # better way?
+          return
+        end
+        response.start(200) do |head, out|
+          head["Content-Type"] = "application/x-thrift"
+          transport = TIOStreamTransport.new request.body, out
+          protocol = @protocol_factory.get_protocol transport
+          @processor.process protocol, protocol
+        end
+      end
+    end
+
+    def initialize(processor, opts={})
+      port = opts[:port] || 80
+      ip = opts[:ip] || "0.0.0.0"
+      path = opts[:path] || ""
+      protocol_factory = opts[:protocol_factory] || TBinaryProtocolFactory.new
+      @server = Mongrel::HttpServer.new ip, port
+      @server.register "/#{path}", Handler.new(processor, protocol_factory)
+    end
+
+    def serve
+      @server.run.join
+    end
+  end
+  deprecate_class! :TSimpleMongrelHTTPServer => SimpleMongrelHTTPServer
+end
diff --git a/lib/rb/lib/thrift/server/thttpserver.rb b/lib/rb/lib/thrift/server/thttpserver.rb
index d6e85a1..0eb7ea6 100644
--- a/lib/rb/lib/thrift/server/thttpserver.rb
+++ b/lib/rb/lib/thrift/server/thttpserver.rb
@@ -1,43 +1,2 @@
-#!/usr/bin/env ruby
-
-require 'thrift/protocol/tprotocol'
-require 'thrift/protocol/tbinaryprotocol'
-require 'thrift/transport/ttransport'
-
-require 'mongrel'
-
-## Sticks a service on a URL, using mongrel to do the HTTP work
-class TSimpleMongrelHTTPServer
-  class Handler < Mongrel::HttpHandler
-    def initialize(processor, protocol_factory)
-      @processor = processor
-      @protocol_factory = protocol_factory
-    end
-
-    def process(request, response)
-      unless request.params["REQUEST_METHOD"] == "POST"
-        response.start(404) { } # better way?
-        return
-      end
-      response.start(200) do |head, out|
-        head["Content-Type"] = "application/x-thrift"
-        transport = TIOStreamTransport.new request.body, out
-        protocol = @protocol_factory.get_protocol transport
-        @processor.process protocol, protocol
-      end
-    end
-  end
-
-  def initialize(processor, opts={})
-    port = opts[:port] || 80
-    ip = opts[:ip] || "0.0.0.0"
-    path = opts[:path] || ""
-    protocol_factory = opts[:protocol_factory] || TBinaryProtocolFactory.new
-    @server = Mongrel::HttpServer.new ip, port
-    @server.register "/#{path}", Handler.new(processor, protocol_factory)
-  end
-
-  def serve
-    @server.run.join
-  end
-end
+require 'thrift/deprecation'
+require 'thrift/server/httpserver'
diff --git a/lib/rb/lib/thrift/server/tserver.rb b/lib/rb/lib/thrift/server/tserver.rb
index 6e3830a..5903bce 100644
--- a/lib/rb/lib/thrift/server/tserver.rb
+++ b/lib/rb/lib/thrift/server/tserver.rb
@@ -1,139 +1,2 @@
-#!/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'
-require 'thrift/protocol/tbinaryprotocol'
-require 'thrift/transport/ttransport'
-
-class TServer
-
-  def initialize(processor, serverTransport, transportFactory=nil, protocolFactory=nil)
-    @processor = processor
-    @serverTransport = serverTransport
-    @transportFactory = transportFactory ? transportFactory : TTransportFactory.new()
-    @protocolFactory = protocolFactory ? protocolFactory : TBinaryProtocolFactory.new()
-  end
-
-  def serve(); nil; end
-
-end
-
-class TSimpleServer < TServer
-
-  def initialize(processor, serverTransport, transportFactory=nil, protocolFactory=nil)
-    super(processor, serverTransport, transportFactory, protocolFactory)
-  end
-
-  def serve()
-    begin
-      @serverTransport.listen()
-      while (true)
-        client = @serverTransport.accept()
-        trans = @transportFactory.get_transport(client)
-        prot = @protocolFactory.get_protocol(trans)
-        begin
-          while (true)
-            @processor.process(prot, prot)
-          end
-        rescue TTransportException, Thrift::ProtocolException => ttx
-          #print ttx,"\n"
-        ensure
-          trans.close()
-        end
-      end
-    ensure
-      @serverTransport.close()
-    end
-  end
-end
-
-begin
-  require 'fastthread'
-rescue LoadError
-  require 'thread'
-end
-
-class TThreadedServer < TServer
-  def serve()
-    begin
-      @serverTransport.listen()
-      while (true)
-        client = @serverTransport.accept()
-        trans = @transportFactory.get_transport(client)
-        prot = @protocolFactory.get_protocol(trans)
-        Thread.new(prot, trans) do |p, t|
-          begin
-            while (true)
-              @processor.process(p, p)
-            end
-          rescue TTransportException, Thrift::ProtocolException => e
-          ensure
-            t.close()
-          end
-        end
-      end
-    ensure
-      @serverTransport.close()
-    end
-  end
-end
-
-class TThreadPoolServer < TServer
-  def initialize(processor, serverTransport, transportFactory=nil, protocolFactory=nil, num=20)
-    super(processor, serverTransport, transportFactory, protocolFactory)
-    @thread_q = SizedQueue.new(num)
-    @exception_q = Queue.new
-    @running = false
-  end
-
-  ## exceptions that happen in worker threads will be relayed here and
-  ## must be caught. 'retry' can be used to continue. (threads will
-  ## continue to run while the exception is being handled.)
-  def rescuable_serve
-    Thread.new { serve } unless @running
-    raise @exception_q.pop
-  end
-
-  ## exceptions that happen in worker threads simply cause that thread
-  ## to die and another to be spawned in its place.
-  def serve
-    @serverTransport.listen()
-
-    begin
-      while (true)
-        @thread_q.push(:token)
-        Thread.new do
-          begin
-            while (true)
-              client = @serverTransport.accept()
-              trans = @transportFactory.get_transport(client)
-              prot = @protocolFactory.get_protocol(trans)
-              begin
-                while (true)
-                  @processor.process(prot, prot)
-                end
-              rescue TTransportException, Thrift::ProtocolException => e
-              ensure
-                trans.close()
-              end
-            end
-          rescue Exception => e
-            @exception_q.push(e)
-          ensure
-            @thread_q.pop() # thread died!
-          end
-        end
-      end
-    ensure
-      @serverTransport.close()
-    end
-  end
-end
-
+require 'thrift/deprecation'
+require 'thrift/server'
diff --git a/lib/rb/lib/thrift/transport.rb b/lib/rb/lib/thrift/transport.rb
new file mode 100644
index 0000000..cc45fac
--- /dev/null
+++ b/lib/rb/lib/thrift/transport.rb
@@ -0,0 +1,290 @@
+# 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 TransportException < Exception
+    UNKNOWN = 0
+    NOT_OPEN = 1
+    ALREADY_OPEN = 2
+    TIMED_OUT = 3
+    END_OF_FILE = 4
+
+    attr_reader :type
+
+    def initialize(type=UNKNOWN, message=nil)
+      super(message)
+      @type = type
+    end
+  end
+  deprecate_class! :TTransportException => TransportException
+
+# Transport is basically an abstract class, but isn't raising NotImplementedError
+# TODO: Think about if this is the right thing - Kevin Clark - 3/27/08
+  class Transport
+    def open?; end
+    deprecate! :isOpen => :open?
+    deprecate! :is_open? => :open?
+
+    def open; end
+
+    def close; end
+
+    def read(sz); end
+
+    def read_all(size)
+      buff = ''
+      have = 0
+    
+      while (have < size)
+        chunk = read(size - have)
+        have += chunk.length
+        buff << chunk
+      end
+    
+      buff
+    end
+    deprecate! :readAll => :read_all
+  
+    def write(buf); end
+
+    def flush; end
+  end
+  deprecate_class! :TTransport => Transport
+
+  class ServerTransport
+    def listen(); nil; end
+
+    def accept(); nil; end
+
+    def close(); nil; end
+  end
+  deprecate_class! :TServerTransport => ServerTransport
+
+  class TransportFactory
+    def get_transport(trans)
+      return trans
+    end
+    deprecate! :getTransport => :get_transport
+  end
+  deprecate_class! :TTransportFactory => TransportFactory
+
+  class BufferedTransport < Transport
+    def initialize(transport)
+      @transport = transport
+      @wbuf = ''
+    end
+
+    def open?()
+      return @transport.open?()
+    end
+
+    def open()
+      @transport.open()
+    end
+
+    def close()
+      @transport.close()
+    end
+
+    def read(sz)
+      return @transport.read(sz)
+    end
+
+    def write(buf)
+      @wbuf << buf
+    end
+
+    def flush()
+      @transport.write(@wbuf)
+      @transport.flush()
+      @wbuf = ''
+    end
+  end
+  deprecate_class! :TBufferedTransport => BufferedTransport
+
+  class BufferedTransportFactory < TransportFactory
+    def get_transport(transport)
+      return BufferedTransport.new(transport)
+    end
+  end
+  deprecate_class! :TBufferedTransportFactory => BufferedTransportFactory
+
+  class FramedTransport < Transport
+    def initialize(transport, read=true, write=true)
+      @transport = transport
+      @rbuf      = ''
+      @wbuf      = ''
+      @read      = read
+      @write     = write
+    end
+
+    def open?()
+      return @transport.open?
+    end
+
+    def open()
+      @transport.open
+    end
+
+    def close()
+      @transport.close
+    end
+
+    def read(sz)
+      if !@read
+        return @transport.read(sz)
+      end
+
+      if (sz <= 0)
+        return ''
+      end
+
+      if (@rbuf.length == 0)
+        read_frame
+      end
+
+      # return full buf
+      if (sz > @rbuf.length)
+        out = @rbuf
+        @rbuf = ''
+        return out
+      end
+
+      # Return substr
+      out = @rbuf.slice(0, sz)
+      @rbuf = @rbuf.slice(sz, @rbuf.length)
+      return out
+    end
+
+    def write(buf,sz=nil)
+      if !@write
+        return @transport.write(buf);
+      end
+
+      if (sz != nil && sz < buf.length)
+        buf = buf.slice(0,sz)
+      end
+
+      @wbuf << buf
+    end
+
+    #
+    # Writes the output buffer to the stream in the format of a 4-byte length
+    # followed by the actual data.
+    #
+    def flush
+      if !@write
+        return @transport.flush
+      end
+
+      out = [@wbuf.length].pack('N')
+      out << @wbuf
+      @transport.write(out)
+      @transport.flush
+      @wbuf = ''
+    end
+
+    private
+
+    def read_frame
+      buf  = @transport.read_all(4)
+      val  = buf.unpack('N')
+      sz   = val[0]
+
+      @rbuf = @transport.read_all(sz)
+    end
+  end
+  deprecate_class! :TFramedTransport => FramedTransport
+
+  class FramedTransportFactory < TransportFactory
+    def get_transport(transport)
+      return FramedTransport.new(transport)
+    end
+  end
+  deprecate_class! :TFramedTransportFactory => FramedTransportFactory
+
+  class MemoryBuffer < Transport
+    def initialize(sz=1024)
+      @buf = ''
+      @sz  = sz
+      @wpos = 0
+      @rpos = 0
+    end
+
+    def open?
+      return 1
+    end
+
+    def open
+    end
+
+    def close
+    end
+
+    def peek
+      return @rpos < @wpos
+    end
+
+    def get_buffer
+      return @buf
+    end
+
+    def reset_buffer(new_buf = '')
+       @buf  = new_buf
+       @sz   = new_buf.length
+       @wpos = new_buf.length
+       @rpos = 0
+    end
+
+    def available
+      return @wpos - @rpos
+    end
+
+    def read(len)
+      avail = available()
+
+      return '' if avail == 0
+
+      #how much to give
+      give = len
+      give = avail if avail < len
+
+      ret = @buf.slice(@rpos,give)
+
+      @rpos += give;
+
+      return ret;
+    end
+
+    def write(wbuf)
+      @buf  << wbuf
+      @wpos += wbuf.length()
+    end
+
+    def flush
+    end
+  end
+  deprecate_class! :TMemoryBuffer => MemoryBuffer
+
+  ## Very very simple implementation of wrapping two objects, one with a #read
+  ## method and one with a #write method, into a transport for thrift.
+  ##
+  ## Assumes both objects are open, remain open, don't require flushing, etc.
+  class IOStreamTransport < Transport
+    def initialize(input, output)
+      @input = input
+      @output = output
+    end
+
+    def open?; true end
+    def read(sz); @input.read(sz) end
+    def write(buf); @output.write(buf) end
+  end
+  deprecate_class! :TIOStreamTransport => IOStreamTransport
+end
diff --git a/lib/rb/lib/thrift/transport/httpclient.rb b/lib/rb/lib/thrift/transport/httpclient.rb
new file mode 100644
index 0000000..2c4adfc
--- /dev/null
+++ b/lib/rb/lib/thrift/transport/httpclient.rb
@@ -0,0 +1,26 @@
+require 'thrift/transport'
+
+require 'net/http'
+require 'uri'
+require 'stringio'
+
+## Very simple HTTP client
+module Thrift
+  class HTTPClient < Transport
+    def initialize(url)
+      @url = URI url
+      @outbuf = ""
+    end
+
+    def open?; true end
+    def read(sz); @inbuf.read sz end
+    def write(buf); @outbuf << buf end
+    def flush
+      http = Net::HTTP.new @url.host, @url.port
+      resp, data = http.post(@url.path, @outbuf)
+      @inbuf = StringIO.new data
+      @outbuf = ""
+    end
+  end
+  deprecate_class! :THttpClient => HTTPClient
+end
diff --git a/lib/rb/lib/thrift/transport/socket.rb b/lib/rb/lib/thrift/transport/socket.rb
new file mode 100644
index 0000000..762b8d3
--- /dev/null
+++ b/lib/rb/lib/thrift/transport/socket.rb
@@ -0,0 +1,90 @@
+#!/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/transport'
+require 'socket'
+
+module Thrift
+  class Socket < Transport
+    def initialize(host='localhost', port=9090)
+      @host = host
+      @port = port
+      @handle = nil
+    end
+
+    def set_handle(handle)
+      @handle = handle
+    end
+
+    def open()
+      begin
+        @handle = TCPSocket.new(@host, @port)
+      rescue StandardError
+        raise TransportException.new(TransportException::NOT_OPEN, "Could not connect to #{@host}:#{@port}")
+      end
+    end
+
+    def open?()
+      return !@handle.nil?
+    end
+
+    def write(str)
+      begin
+        @handle.write(str)
+      rescue StandardError
+        raise TransportException.new(TransportException::NOT_OPEN)
+      end
+    end
+
+    def read(sz)
+      begin
+        data = @handle.recv(sz)
+        if (data.length == 0)
+          raise TransportException.new("TSocket: Could not read #{sz} bytes from #{@host}:#{@port}")
+        end
+        return data
+      rescue StandardError
+        raise TransportException.new(TransportException::NOT_OPEN)
+      end
+    end
+
+    def close()
+      @handle.close() unless @handle.nil?
+      @handle = nil
+    end
+  end
+  deprecate_class! :TSocket => Socket
+
+  class ServerSocket < ServerTransport
+    def initialize(port)
+      @port = port
+      @handle = nil
+    end
+
+    def listen()
+      @handle = TCPserver.new(nil, @port)
+    end
+
+    def accept()
+      if (@handle != nil)
+        sock = @handle.accept()
+        trans = Socket.new()
+        trans.set_handle(sock)
+        return trans
+      end
+      return nil
+    end
+
+    def close()
+     @handle.close() unless @handle.nil?
+    end
+  end
+  deprecate_class! :TServerSocket => ServerSocket
+end
diff --git a/lib/rb/lib/thrift/transport/thttpclient.rb b/lib/rb/lib/thrift/transport/thttpclient.rb
index 2fe3c57..ffca0ca 100644
--- a/lib/rb/lib/thrift/transport/thttpclient.rb
+++ b/lib/rb/lib/thrift/transport/thttpclient.rb
@@ -1,25 +1,2 @@
-#!/usr/bin/env ruby
-
-require 'thrift/transport/ttransport'
-
-require 'net/http'
-require 'uri'
-require 'stringio'
-
-## Very simple HTTP client
-class THttpClient < TTransport
-  def initialize(url)
-    @url = URI url
-    @outbuf = ""
-  end
-
-  def open?; true end
-  def read(sz); @inbuf.read sz end
-  def write(buf); @outbuf << buf end
-  def flush
-    http = Net::HTTP.new @url.host, @url.port
-    resp, data = http.post(@url.path, @outbuf)
-    @inbuf = StringIO.new data
-    @outbuf = ""
-  end
-end
+require 'thrift/deprecation'
+require 'thrift/transport/httpclient'
diff --git a/lib/rb/lib/thrift/transport/tsocket.rb b/lib/rb/lib/thrift/transport/tsocket.rb
index e6ce9a9..fec6edf 100644
--- a/lib/rb/lib/thrift/transport/tsocket.rb
+++ b/lib/rb/lib/thrift/transport/tsocket.rb
@@ -1,88 +1,2 @@
-#!/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/transport/ttransport'
-require 'socket'
-
-class TSocket < TTransport
-  def initialize(host='localhost', port=9090)
-    @host = host
-    @port = port
-    @handle = nil
-  end
-
-  def set_handle(handle)
-    @handle = handle
-  end
-
-  def open()
-    begin
-      @handle = TCPSocket.new(@host, @port)
-    rescue StandardError
-      raise TTransportException.new(TTransportException::NOT_OPEN, "Could not connect to #{@host}:#{@port}")
-    end
-  end
-
-  def open?()
-    return !@handle.nil?
-  end
-
-  def write(str)
-    begin
-      @handle.write(str)
-    rescue StandardError
-      raise TTransportException.new(TTransportException::NOT_OPEN)
-    end
-  end
-
-  def read(sz)
-    begin
-      data = @handle.recv(sz)
-      if (data.length == 0)
-        raise TTransportException.new("TSocket: Could not read #{sz} bytes from #{@host}:#{@port}")
-      end
-      return data
-    rescue StandardError
-      raise TTransportException.new(TTransportException::NOT_OPEN)
-    end
-  end
-
-  def close()
-    @handle.close() unless @handle.nil?
-    @handle = nil
-  end
-
-end
-
-class TServerSocket < TServerTransport
-  def initialize(port)
-    @port = port
-    @handle = nil
-  end
-
-  def listen()
-    @handle = TCPserver.new(nil, @port)
-  end
-
-  def accept()
-    if (@handle != nil)
-      sock = @handle.accept()
-      trans = TSocket.new()
-      trans.set_handle(sock)
-      return trans
-    end
-    return nil
-  end
-
-  def close()
-   @handle.close() unless @handle.nil?
-  end
-
-end
+require 'thrift/deprecation'
+require 'thrift/transport/socket'
diff --git a/lib/rb/lib/thrift/transport/ttransport.rb b/lib/rb/lib/thrift/transport/ttransport.rb
index 3d475b9..bae6088 100644
--- a/lib/rb/lib/thrift/transport/ttransport.rb
+++ b/lib/rb/lib/thrift/transport/ttransport.rb
@@ -1,289 +1,2 @@
-#!/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>
-#
-
-class TTransportException < Thrift::Exception
-
-  UNKNOWN = 0
-  NOT_OPEN = 1
-  ALREADY_OPEN = 2
-  TIMED_OUT = 3
-  END_OF_FILE = 4
-
-  attr_reader :type
-
-  def initialize(type=UNKNOWN, message=nil)
-    super(message)
-    @type = type
-  end
-
-end
-
-# TTransport is basically an abstract class, but isn't raising NotImplementedError
-# TODO: Think about if this is the right thing - Kevin Clark - 3/27/08
-class TTransport
-  def open?; end
-  deprecate! :isOpen => :open?
-  deprecate! :is_open? => :open?
-
-  def open; end
-
-  def close; end
-
-  def read(sz); end
-
-  def read_all(size)
-    buff = ''
-    have = 0
-    
-    while (have < size)
-      chunk = read(size - have)
-      have += chunk.length
-      buff << chunk
-    end
-    
-    buff
-  end
-  deprecate! :readAll => :read_all
-  
-  def write(buf); end
-
-  def flush; end
-end
-
-class TServerTransport
-  def listen(); nil; end
-
-  def accept(); nil; end
-
-  def close(); nil; end
-
-end
-
-class TTransportFactory
-  def get_transport(trans)
-    return trans
-  end
-  deprecate! :getTransport => :get_transport
-end
-
-class TBufferedTransport < TTransport
-  def initialize(transport)
-    @transport = transport
-    @wbuf = ''
-  end
-
-  def open?()
-    return @transport.open?()
-  end
-
-  def open()
-    @transport.open()
-  end
-
-  def close()
-    @transport.close()
-  end
-
-  def read(sz)
-    return @transport.read(sz)
-  end
-
-  def write(buf)
-    @wbuf << buf
-  end
-
-  def flush()
-    @transport.write(@wbuf)
-    @transport.flush()
-    @wbuf = ''
-  end
-end
-
-class TBufferedTransportFactory < TTransportFactory
-  def get_transport(transport)
-    return TBufferedTransport.new(transport)
-  end
-end
-
-
-class TFramedTransport < TTransport
-  def initialize(transport, read=true, write=true)
-    @transport = transport
-    @rbuf      = ''
-    @wbuf      = ''
-    @read      = read
-    @write     = write
-  end
-
-  def open?()
-    return @transport.open?
-  end
-
-  def open()
-    @transport.open
-  end
-
-  def close()
-    @transport.close
-  end
-
-  def read(sz)
-    if !@read
-      return @transport.read(sz)
-    end
-
-    if (sz <= 0)
-      return ''
-    end
-
-    if (@rbuf.length == 0)
-      read_frame
-    end
-
-    # return full buf
-    if (sz > @rbuf.length)
-      out = @rbuf
-      @rbuf = ''
-      return out
-    end
-
-    # Return substr
-    out = @rbuf.slice(0, sz)
-    @rbuf = @rbuf.slice(sz, @rbuf.length)
-    return out
-
-  end
-
-  def write(buf,sz=nil)
-
-    if !@write
-      return @transport.write(buf);
-    end
-
-    if (sz != nil && sz < buf.length)
-      buf = buf.slice(0,sz)
-    end
-
-    @wbuf << buf
-
-  end
-
-  #
-  # Writes the output buffer to the stream in the format of a 4-byte length
-  # followed by the actual data.
-  #
-  def flush
-    if !@write
-      return @transport.flush
-    end
-
-    out = [@wbuf.length].pack('N')
-    out << @wbuf
-    @transport.write(out)
-    @transport.flush
-    @wbuf = ''
-  end
-
-  private
-
-  def read_frame
-    buf  = @transport.read_all(4)
-    val  = buf.unpack('N')
-    sz   = val[0]
-
-    @rbuf = @transport.read_all(sz)
-  end
-
-end
-
-
-class TFramedTransportFactory < TTransportFactory
-  def get_transport(transport)
-    return TFramedTransport.new(transport)
-  end
-end
-
-class TMemoryBuffer < TTransport
-  def initialize(sz=1024)
-    @buf = ''
-    @sz  = sz
-    @wpos = 0
-    @rpos = 0
-  end
-
-  def open?
-    return 1
-  end
-
-  def open
-  end
-
-  def close
-  end
-
-  def peek
-    return @rpos < @wpos
-  end
-
-  def get_buffer
-    return @buf
-  end
-
-  def reset_buffer(new_buf = '')
-     @buf  = new_buf
-     @sz   = new_buf.length
-     @wpos = new_buf.length
-     @rpos = 0
-  end
-
-  def available
-    return @wpos - @rpos
-  end
-
-  def read(len)
-    avail = available()
-
-    return '' if avail == 0
-
-    #how much to give
-    give = len
-    give = avail if avail < len
-
-    ret = @buf.slice(@rpos,give)
-
-    @rpos += give;
-
-    return ret;
-  end
-
-  def write(wbuf)
-    @buf  << wbuf
-    @wpos += wbuf.length()
-  end
-
-  def flush
-  end
-end
-
-## Very very simple implementation of wrapping two objects, one with a #read
-## method and one with a #write method, into a transport for thrift.
-##
-## Assumes both objects are open, remain open, don't require flushing, etc.
-class TIOStreamTransport < TTransport
-  def initialize(input, output)
-    @input = input
-    @output = output
-  end
-
-  def open?; true end
-  def read(sz); @input.read(sz) end
-  def write(buf); @output.write(buf) end
-end
+require 'thrift/deprecation'
+require 'thrift/transport'
diff --git a/lib/rb/lib/thrift/types.rb b/lib/rb/lib/thrift/types.rb
index b1fbb87..2831748 100644
--- a/lib/rb/lib/thrift/types.rb
+++ b/lib/rb/lib/thrift/types.rb
@@ -22,4 +22,4 @@
     EXCEPTION = 3
   end
   deprecate_class! :TMessageType => MessageTypes
-end
\ No newline at end of file
+end
