diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am
index 4834e9f..4a7ef83 100755
--- a/lib/cpp/Makefile.am
+++ b/lib/cpp/Makefile.am
@@ -71,6 +71,8 @@
                        src/thrift/transport/THttpClient.cpp \
                        src/thrift/transport/THttpServer.cpp \
                        src/thrift/transport/TSocket.cpp \
+                       src/thrift/transport/TPipe.cpp \
+                       src/thrift/transport/TPipeServer.cpp \
                        src/thrift/transport/TSSLSocket.cpp \
                        src/thrift/transport/TSocketPool.cpp \
                        src/thrift/transport/TServerSocket.cpp \
@@ -169,6 +171,8 @@
                          src/thrift/transport/THttpClient.h \
                          src/thrift/transport/THttpServer.h \
                          src/thrift/transport/TSocket.h \
+                         src/thrift/transport/TPipe.h \
+                         src/thrift/transport/TPipeServer.h \
                          src/thrift/transport/TSSLSocket.h \
                          src/thrift/transport/TSocketPool.h \
                          src/thrift/transport/TVirtualTransport.h \
diff --git a/lib/cpp/src/thrift/transport/TPipe.cpp b/lib/cpp/src/thrift/transport/TPipe.cpp
index 2c7cf56..ae98a47 100644
--- a/lib/cpp/src/thrift/transport/TPipe.cpp
+++ b/lib/cpp/src/thrift/transport/TPipe.cpp
@@ -17,8 +17,6 @@
 * under the License.
 */
 
-#ifdef _WIN32
-
 #include "TTransportException.h"
 #include "TPipe.h"
 
@@ -31,33 +29,56 @@
 */
 
 //---- Constructors ----
-TPipe::TPipe(HANDLE hpipe) :
+TPipe::TPipe(int Pipe) :
   pipename_(""),
-  hPipe_(hpipe),
+  Pipe_(Pipe),
   TimeoutSeconds_(3),
   isAnonymous(false)
-{}
+{
+#ifndef _WIN32
+  GlobalOutput.perror("TPipe: constructor using a pipe handle is not supported under *NIX", -99);
+  throw TTransportException(TTransportException::NOT_OPEN, " constructor using a pipe handle is not supported under *NIX");
+#endif
+}
 
 TPipe::TPipe(string pipename) :
   pipename_(pipename),
-  hPipe_(INVALID_HANDLE_VALUE),
+  Pipe_(-1),
   TimeoutSeconds_(3),
   isAnonymous(false)
-{}
+{
+#ifdef _WIN32
+    if(pipename_.find("\\\\") == -1) {
+      pipename_ = "\\\\.\\pipe\\" + pipename_;
+    }
+#else
+  dsocket.reset(new TSocket(pipename));
+#endif
+}
 
-TPipe::TPipe(HANDLE hPipeRd, HANDLE hPipeWrt) :
+TPipe::TPipe(int PipeRd, int PipeWrt) :
   pipename_(""),
-  hPipe_(hPipeRd),
-  hPipeWrt_(hPipeWrt),
+  Pipe_(PipeRd),
+  PipeWrt_(PipeWrt),
   TimeoutSeconds_(3),
   isAnonymous(true)
-{}
+{
+#ifndef _WIN32
+  GlobalOutput.perror("TPipe: Anonymous pipes not yet supported under *NIX", -99);
+  throw TTransportException(TTransportException::NOT_OPEN, " Anonymous pipes not yet supported under *NIX");
+#endif
+}
 
   TPipe::TPipe() :
   pipename_(""),
-  hPipe_(INVALID_HANDLE_VALUE),
+  Pipe_(-1),
   TimeoutSeconds_(3)
-{}
+{
+#ifndef _WIN32
+  GlobalOutput.perror("TPipe: Anonymous pipes not yet supported under *NIX", -99);
+  throw TTransportException(TTransportException::NOT_OPEN, " Anonymous pipes not yet supported under *NIX");
+#endif
+}
 
 //---- Destructor ----
 TPipe::~TPipe() {
@@ -66,20 +87,22 @@
 
 
 bool TPipe::isOpen() {
-  return (hPipe_ != INVALID_HANDLE_VALUE);
+  return (Pipe_ != -1);
 }
 
 //---------------------------------------------------------
 // Transport callbacks
 //---------------------------------------------------------
 
+#ifdef _WIN32 //Windows callbacks
+
 bool TPipe::peek() {
   if (!isOpen()) {
     return false;
   }
   DWORD bytesavail = 0;
   int  PeekRet = 0;
-  PeekRet = PeekNamedPipe(hPipe_, NULL, 0, NULL, &bytesavail, NULL); 
+  PeekRet = PeekNamedPipe((HANDLE)Pipe_, NULL, 0, NULL, &bytesavail, NULL); 
   return (PeekRet != 0 && bytesavail > 0);
 }
 
@@ -90,6 +113,7 @@
 
   int SleepInterval = 500; //ms
   int retries = TimeoutSeconds_ * 1000 / SleepInterval;
+  HANDLE hPipe_;
   for(int i=0; i<retries; i++)
   {
     hPipe_ = CreateFile( 
@@ -101,18 +125,18 @@
               0,              // default attributes 
               NULL);          // no template file 
 
-    if (hPipe_ == INVALID_HANDLE_VALUE) 
+    if ((int)hPipe_ == -1) 
       sleep(SleepInterval);
     else
       break;
   }
-  if (hPipe_ == INVALID_HANDLE_VALUE) 
+  if ((int)hPipe_ == -1) 
     throw TTransportException(TTransportException::NOT_OPEN, "Unable to open pipe");
 
   // The pipe connected; change to message-read mode. 
   DWORD dwMode = PIPE_READMODE_MESSAGE; 
   int fSuccess = SetNamedPipeHandleState( 
-              hPipe_,   // pipe handle 
+              hPipe_, // pipe handle 
               &dwMode,  // new pipe mode 
               NULL,     // don't set maximum bytes 
               NULL);    // don't set maximum time 
@@ -121,14 +145,15 @@
     throw TTransportException(TTransportException::NOT_OPEN, "SetNamedPipeHandleState failed");
     close();
   }
+  Pipe_ = (int)hPipe_;
 }
 
 
 void TPipe::close() {
   if (isOpen())
   {
-    CloseHandle(hPipe_);
-    hPipe_ = INVALID_HANDLE_VALUE;
+    CloseHandle((HANDLE)Pipe_);
+    Pipe_ = -1;
   }
 }
 
@@ -138,7 +163,7 @@
 
   DWORD  cbRead; 
   int fSuccess = ReadFile( 
-              hPipe_,   // pipe handle 
+              (HANDLE)Pipe_, // pipe handle 
               buf,      // buffer to receive reply 
               len,      // size of buffer 
               &cbRead,  // number of bytes read 
@@ -154,10 +179,10 @@
   if (!isOpen())
     throw TTransportException(TTransportException::NOT_OPEN, "Called write on non-open pipe");
 
-  HANDLE WritePipe = isAnonymous? hPipeWrt_: hPipe_;
+  int WritePipe = isAnonymous? PipeWrt_: Pipe_;
   DWORD  cbWritten; 
   int fSuccess = WriteFile( 
-              WritePipe,     // pipe handle 
+              (HANDLE)WritePipe, // pipe handle 
               buf,        // message 
               len,        // message length 
               &cbWritten, // bytes written 
@@ -167,6 +192,28 @@
     throw TTransportException(TTransportException::NOT_OPEN, "Write to pipe failed");
 }
 
+#else //*NIX callbacks implemented via Unix Domain Sockets.
+bool TPipe::peek() {
+  return dsocket->peek();
+}
+
+void TPipe::open() {
+  dsocket->open();
+}
+
+void TPipe::close() {
+  dsocket->close();
+}
+
+uint32_t TPipe::read(uint8_t* buf, uint32_t len) {
+  return dsocket->read(buf, len);
+}
+
+void TPipe::write(const uint8_t* buf, uint32_t len) {
+  dsocket->write(buf, len);
+}
+#endif //callbacks
+
 
 //---------------------------------------------------------
 // Accessors
@@ -180,20 +227,20 @@
   pipename_ = pipename;
 }
 
-HANDLE TPipe::getPipeHandle() {
-  return hPipe_;
+int TPipe::getPipeHandle() {
+  return Pipe_;
 }
 
-void TPipe::setPipeHandle(HANDLE pipehandle) {
-  hPipe_ = pipehandle;
+void TPipe::setPipeHandle(int pipehandle) {
+  Pipe_ = pipehandle;
 }
 
-HANDLE TPipe::getWrtPipeHandle() {
-  return hPipeWrt_;
+int TPipe::getWrtPipeHandle() {
+  return PipeWrt_;
 }
 
-void TPipe::setWrtPipeHandle(HANDLE pipehandle) {
-  hPipeWrt_ = pipehandle;
+void TPipe::setWrtPipeHandle(int pipehandle) {
+  PipeWrt_ = pipehandle;
 }
 
 long TPipe::getConnectTimeout() {
@@ -205,5 +252,3 @@
 }
 
 }}} // apache::thrift::transport
-
-#endif //_WIN32
diff --git a/lib/cpp/src/thrift/transport/TPipe.h b/lib/cpp/src/thrift/transport/TPipe.h
index bca3e27..942f54f 100644
--- a/lib/cpp/src/thrift/transport/TPipe.h
+++ b/lib/cpp/src/thrift/transport/TPipe.h
@@ -19,10 +19,12 @@
 
 #ifndef _THRIFT_TRANSPORT_TPIPE_H_
 #define _THRIFT_TRANSPORT_TPIPE_H_ 1
-#ifdef _WIN32
 
-#include "TTransport.h"
-#include "TVirtualTransport.h"
+#include <thrift/transport/TTransport.h>
+#include <thrift/transport/TVirtualTransport.h>
+#ifndef _WIN32
+#  include "TSocket.h"
+#endif
 
 namespace apache { namespace thrift { namespace transport {
 
@@ -36,10 +38,10 @@
   // Constructs a new pipe object.
   TPipe();
   // Named pipe constructors -
-  TPipe(HANDLE hPipe);
-  TPipe(std::string path);
+  TPipe(int Pipe);
+  TPipe(std::string pipename);
   // Anonymous pipe -
-  TPipe(HANDLE hPipeRd, HANDLE hPipeWrt);
+  TPipe(int PipeRd, int PipeWrt);
 
   // Destroys the pipe object, closing it if necessary.
   virtual ~TPipe();
@@ -66,24 +68,27 @@
   //Accessors
   std::string getPipename();
   void setPipename(std::string pipename);
-  HANDLE getPipeHandle(); //doubles as the read handle for anon pipe
-  void setPipeHandle(HANDLE pipehandle);
-  HANDLE getWrtPipeHandle();
-  void setWrtPipeHandle(HANDLE pipehandle);
+  int getPipeHandle(); //doubles as the read handle for anon pipe
+  void setPipeHandle(int pipehandle);
+  int getWrtPipeHandle();
+  void setWrtPipeHandle(int pipehandle);
   long getConnectTimeout();
   void setConnectTimeout(long seconds);
 
  private:
   std::string pipename_;
   //Named pipe handles are R/W, while anonymous pipes are one or the other (half duplex).
-  HANDLE hPipe_, hPipeWrt_;
+  int Pipe_, PipeWrt_;
   long TimeoutSeconds_;
   bool isAnonymous;
 
+#ifndef _WIN32
+  //*NIX named pipe implementation uses domain socket
+  boost::shared_ptr<TSocket> dsocket;
+#endif
 };
 
 }}} // apache::thrift::transport
 
-#endif //_WIN32
 #endif // #ifndef _THRIFT_TRANSPORT_TPIPE_H_
 
diff --git a/lib/cpp/src/thrift/transport/TPipeServer.cpp b/lib/cpp/src/thrift/transport/TPipeServer.cpp
index 6f2f73d..73a5219 100644
--- a/lib/cpp/src/thrift/transport/TPipeServer.cpp
+++ b/lib/cpp/src/thrift/transport/TPipeServer.cpp
@@ -17,8 +17,6 @@
  * under the License.
  */
 
-#ifdef _WIN32
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -27,8 +25,10 @@
 #include "TPipe.h"
 #include "TPipeServer.h"
 #include <boost/shared_ptr.hpp>
-#include <AccCtrl.h>
-#include <Aclapi.h>
+#ifdef _WIN32
+#  include <AccCtrl.h>
+#  include <Aclapi.h>
+#endif //_WIN32
 
 namespace apache { namespace thrift { namespace transport {
 
@@ -39,15 +39,23 @@
 TPipeServer::TPipeServer(string pipename, uint32_t bufsize) :
   pipename_(pipename),
   bufsize_(bufsize),
-  hPipe_(INVALID_HANDLE_VALUE),
-  isAnonymous(false),
-  maxconns_(TPIPE_SERVER_MAX_CONNS_DEFAULT)
- {}
+  Pipe_(-1),
+  maxconns_(TPIPE_SERVER_MAX_CONNS_DEFAULT),
+  isAnonymous(false)
+ {
+#ifdef _WIN32
+    if(pipename_.find("\\\\") == 0) {
+      pipename_ = "\\\\.\\pipe\\" + pipename_;
+    }
+#else
+    dsrvsocket.reset(new TServerSocket(pipename));
+#endif
+ }
 
 TPipeServer::TPipeServer(string pipename, uint32_t bufsize, uint32_t maxconnections) :
   pipename_(pipename),
   bufsize_(bufsize),
-  hPipe_(INVALID_HANDLE_VALUE),
+  Pipe_(-1),
   isAnonymous(false)
  {  //Restrict maxconns_ to 1-255
     if(maxconnections == 0)
@@ -56,23 +64,40 @@
       maxconns_ = 255;
 	else
       maxconns_ = maxconnections;
+
+#ifdef _WIN32
+    if(pipename_.find("\\\\") == -1) {
+      pipename_ = "\\\\.\\pipe\\" + pipename_;
+    }
+#else
+    dsrvsocket.reset(new TServerSocket(pipename));
+#endif
  }
 
 TPipeServer::TPipeServer(string pipename) :
   pipename_(pipename),
   bufsize_(1024),
-  hPipe_(INVALID_HANDLE_VALUE),
-  isAnonymous(false),
-  maxconns_(TPIPE_SERVER_MAX_CONNS_DEFAULT)
- {}
+  Pipe_(-1),
+  maxconns_(TPIPE_SERVER_MAX_CONNS_DEFAULT),
+  isAnonymous(false)
+ {
+#ifdef _WIN32
+    if(pipename_.find("\\\\") == 0) {
+      pipename_ = "\\\\.\\pipe\\" + pipename_;
+    }
+#else
+    dsrvsocket.reset(new TServerSocket(pipename));
+#endif
+ }
 
 TPipeServer::TPipeServer(int bufsize) : 
   pipename_(""),
   bufsize_(bufsize),
-  hPipe_(INVALID_HANDLE_VALUE),
-  isAnonymous(true),
-  maxconns_(1)
+  Pipe_(-1),
+  maxconns_(1),
+  isAnonymous(true)
  {
+#ifdef _WIN32
   //The anonymous pipe needs to be created first so that the server can
   //pass the handles on to the client before the serve (acceptImpl)
   //blocking call.
@@ -80,19 +105,28 @@
     GlobalOutput.perror("TPipeServer Create(Anon)Pipe failed, GLE=", GetLastError());
     throw TTransportException(TTransportException::NOT_OPEN, " TPipeServer Create(Anon)Pipe failed");
   }
+#else
+  GlobalOutput.perror("TPipeServer: Anonymous pipes not yet supported under *NIX", -99);
+  throw TTransportException(TTransportException::NOT_OPEN, " Anonymous pipes not yet supported under *NIX");
+#endif
 }
 
 TPipeServer::TPipeServer() : 
   pipename_(""),
   bufsize_(1024),
-  hPipe_(INVALID_HANDLE_VALUE),
-  isAnonymous(true),
-  maxconns_(1)
+  Pipe_(-1),
+  maxconns_(1),
+  isAnonymous(true)
 {
+#ifdef _WIN32
   if (!TCreateAnonPipe()) {
     GlobalOutput.perror("TPipeServer Create(Anon)Pipe failed, GLE=", GetLastError());
     throw TTransportException(TTransportException::NOT_OPEN, " TPipeServer Create(Anon)Pipe failed");
   }
+#else
+  GlobalOutput.perror("TPipeServer: Anonymous pipes not yet supported under *NIX", -99);
+  throw TTransportException(TTransportException::NOT_OPEN, " Anonymous pipes not yet supported under *NIX");
+#endif
 }
 
 //---- Destructor ----
@@ -104,6 +138,8 @@
 // Transport callbacks
 //---------------------------------------------------------
 
+#ifdef _WIN32
+
 shared_ptr<TTransport> TPipeServer::acceptImpl() {
   shared_ptr<TPipe> client;
 
@@ -113,7 +149,7 @@
     byte buf;
     DWORD br;
     int fSuccess = ReadFile( 
-          hPipe_, // pipe handle 
+          (HANDLE)Pipe_, // pipe handle 
           &buf,   // buffer to receive reply 
           0,      // size of buffer 
           &br,    // number of bytes read 
@@ -123,7 +159,7 @@
       GlobalOutput.perror("TPipeServer unable to initiate pipe comms, GLE=", GetLastError());
       throw TTransportException(TTransportException::NOT_OPEN, " TPipeServer unable to initiate pipe comms");
     }
-	client.reset(new TPipe(hPipe_, hPipeW_));
+	client.reset(new TPipe(Pipe_, PipeW_));
   }
   else
   { //Named Pipe
@@ -138,7 +174,7 @@
       // Wait for the client to connect; if it succeeds, the
       // function returns a nonzero value. If the function returns 
       // zero, GetLastError should return ERROR_PIPE_CONNECTED. 
-      ConnectRet = ConnectNamedPipe(hPipe_, NULL) ? 
+      ConnectRet = ConnectNamedPipe((HANDLE)Pipe_, NULL) ? 
                     TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
 
       if (ConnectRet == TRUE)
@@ -153,34 +189,34 @@
         throw TTransportException(TTransportException::NOT_OPEN, "TPipeServer: client connection failed");
       }
     }
-	client.reset(new TPipe(hPipe_));
+	client.reset(new TPipe(Pipe_));
   }
 
   return client;
 }
 
 void TPipeServer::interrupt() {
-  if(hPipe_ != INVALID_HANDLE_VALUE) {
-    CancelIo(hPipe_);
+  if(Pipe_ != -1) {
+    CancelIo((HANDLE)Pipe_);
   }
 }
 
 void TPipeServer::close() {
   if(!isAnonymous)
   {
-    if(hPipe_ != INVALID_HANDLE_VALUE) {
-      DisconnectNamedPipe(hPipe_);
-      CloseHandle(hPipe_);
-      hPipe_ = INVALID_HANDLE_VALUE;
+    if(Pipe_ != -1) {
+      DisconnectNamedPipe((HANDLE)Pipe_);
+      CloseHandle((HANDLE)Pipe_);
+      Pipe_ = -1;
     }
   }
   else
   {
     try {
-      CloseHandle(hPipe_);
-      CloseHandle(hPipeW_);
-      CloseHandle(ClientAnonRead);
-      CloseHandle(ClientAnonWrite);
+      CloseHandle((HANDLE)Pipe_);
+      CloseHandle((HANDLE)PipeW_);
+      CloseHandle((HANDLE)ClientAnonRead);
+      CloseHandle((HANDLE)ClientAnonWrite);
     }
     catch(...) {
         GlobalOutput.perror("TPipeServer anon close GLE=", GetLastError());
@@ -219,7 +255,7 @@
   sa.bInheritHandle = FALSE;
 
   // Create an instance of the named pipe
-  hPipe_ = CreateNamedPipe( 
+  HANDLE hPipe_ = CreateNamedPipe( 
         pipename_.c_str(),        // pipe name 
         PIPE_ACCESS_DUPLEX,       // read/write access 
         PIPE_TYPE_MESSAGE |       // message type pipe 
@@ -230,7 +266,16 @@
         0,                        // client time-out 
         &sa);                     // default security attribute 
 
-  return (hPipe_ != INVALID_HANDLE_VALUE);
+  if(hPipe_ == INVALID_HANDLE_VALUE)
+  {
+    Pipe_ = -1;
+    GlobalOutput.perror("TPipeServer::TCreateNamedPipe() GLE=", GetLastError());
+    throw TTransportException(TTransportException::NOT_OPEN, "TCreateNamedPipe() failed", GetLastError());
+    return false;
+  }
+
+  Pipe_ = (int)hPipe_;
+  return true;
 }
 
 bool TPipeServer::TCreateAnonPipe() {
@@ -244,22 +289,55 @@
   sa.nLength = sizeof(SECURITY_ATTRIBUTES);
   sa.bInheritHandle = true; //allow passing handle to child
 
-  if (!CreatePipe(&ClientAnonRead,&hPipeW_,&sa,0))   //create stdin pipe
+  HANDLE ClientAnonReadH, PipeW_H, ClientAnonWriteH, Pipe_H;
+  if (!CreatePipe(&ClientAnonReadH,&PipeW_H,&sa,0))   //create stdin pipe
   {
     GlobalOutput.perror("TPipeServer CreatePipe (anon) failed, GLE=", GetLastError());
     return false;
   }
-  if (!CreatePipe(&hPipe_,&ClientAnonWrite,&sa,0))  //create stdout pipe
+  if (!CreatePipe(&Pipe_H,&ClientAnonWriteH,&sa,0))  //create stdout pipe
   {
     GlobalOutput.perror("TPipeServer CreatePipe (anon) failed, GLE=", GetLastError());
-    CloseHandle(ClientAnonRead);
-    CloseHandle(hPipeW_);
+    CloseHandle(ClientAnonReadH);
+    CloseHandle(PipeW_H);
     return false;
   }
+  ClientAnonRead  = (int)ClientAnonReadH;
+  ClientAnonWrite = (int)ClientAnonWriteH;
+  Pipe_  = (int)Pipe_H;
+  PipeW_ = (int)PipeW_H;
 
   return true;
 }
 
+#else
+//*NIX implementation uses Unix Domain Sockets.
+void TPipeServer::listen() {
+  dsrvsocket->listen();
+}
+
+shared_ptr<TTransport> TPipeServer::acceptImpl() {
+//	return boost::shared_dynamic_cast<apache::thrift::transport::TServerSocket>(dsrvsocket)->accept();
+  return dsrvsocket->accept();
+}
+
+void TPipeServer::interrupt() {
+  dsrvsocket->interrupt();
+}
+
+void TPipeServer::close() {
+  dsrvsocket->close();
+}
+
+bool TPipeServer::TCreateNamedPipe() {
+  return false; //placeholder
+}
+
+bool TPipeServer::TCreateAnonPipe() {
+  return false; //currently unimplemented
+}
+#endif //_WIN32
+
 
 //---------------------------------------------------------
 // Accessors
@@ -281,21 +359,21 @@
   bufsize_ = bufsize;
 }
 
-HANDLE TPipeServer::getPipeHandle() {
-  return hPipe_;
+int TPipeServer::getPipeHandle() {
+  return Pipe_;
 }
 
-HANDLE TPipeServer::getWrtPipeHandle()
+int TPipeServer::getWrtPipeHandle()
 {
-  return hPipeW_;
+  return PipeW_;
 }
 
-HANDLE TPipeServer::getClientRdPipeHandle()
+int TPipeServer::getClientRdPipeHandle()
 {
   return ClientAnonRead;
 }
 
-HANDLE TPipeServer::getClientWrtPipeHandle()
+int TPipeServer::getClientWrtPipeHandle()
 {
   return ClientAnonWrite;
 }
@@ -309,5 +387,3 @@
 }
 
 }}} // apache::thrift::transport
-
-#endif //_WIN32
diff --git a/lib/cpp/src/thrift/transport/TPipeServer.h b/lib/cpp/src/thrift/transport/TPipeServer.h
index 1732546..a5c4528 100644
--- a/lib/cpp/src/thrift/transport/TPipeServer.h
+++ b/lib/cpp/src/thrift/transport/TPipeServer.h
@@ -19,10 +19,12 @@
 
 #ifndef _THRIFT_TRANSPORT_TSERVERWINPIPES_H_
 #define _THRIFT_TRANSPORT_TSERVERWINPIPES_H_ 1
-#ifdef _WIN32
 
 #include "TServerTransport.h"
 #include <boost/shared_ptr.hpp>
+#ifndef _WIN32
+#  include "TServerSocket.h"
+#endif
 
 #define TPIPE_SERVER_MAX_CONNS_DEFAULT 10
 
@@ -46,7 +48,6 @@
   ~TPipeServer();
 
   //Standard transport callbacks
-  //void listen(); //Unnecessary for Windows pipes
   void interrupt();
   void close();
  protected:
@@ -61,10 +62,10 @@
   void setPipename(std::string pipename);
   int  getBufferSize();
   void setBufferSize(int bufsize);
-  HANDLE getPipeHandle();  //Named Pipe R/W -or- Anonymous pipe Read handle
-  HANDLE getWrtPipeHandle();
-  HANDLE getClientRdPipeHandle();
-  HANDLE getClientWrtPipeHandle();
+  int getPipeHandle();  //Named Pipe R/W -or- Anonymous pipe Read handle
+  int getWrtPipeHandle();
+  int getClientRdPipeHandle();
+  int getClientWrtPipeHandle();
   bool getAnonymous();
   void setAnonymous(bool anon);
 
@@ -72,14 +73,20 @@
   std::string pipename_;
   uint32_t bufsize_;
   uint32_t maxconns_;
-  HANDLE hPipe_;  //Named Pipe (R/W) or Anonymous Pipe (R)
-  HANDLE hPipeW_; //Anonymous Pipe (W)
-  HANDLE ClientAnonRead, ClientAnonWrite; //Client side anonymous pipe handles
+  int Pipe_;  //Named Pipe (R/W) or Anonymous Pipe (R)
+  int PipeW_; //Anonymous Pipe (W)
+  int ClientAnonRead, ClientAnonWrite; //Client side anonymous pipe handles
   //? Do we need duplicates to send to client?
   bool isAnonymous;
+
+public:
+#ifndef _WIN32
+  //*NIX named pipe implementation uses domain socket
+  void listen(); //Only needed for domain sockets
+  boost::shared_ptr<TServerSocket> dsrvsocket;
+#endif
 };
 
 }}} // apache::thrift::transport
 
-#endif //_WIN32
 #endif // #ifndef _THRIFT_TRANSPORT_TSERVERWINPIPES_H_
