diff --git a/lib/cpp/src/transport/TSocketPool.cpp b/lib/cpp/src/transport/TSocketPool.cpp
index d1d5bcd..e22a4b8 100644
--- a/lib/cpp/src/transport/TSocketPool.cpp
+++ b/lib/cpp/src/transport/TSocketPool.cpp
@@ -13,6 +13,8 @@
 
 using namespace std;
 
+using boost::shared_ptr;
+
 /**
  * TSocketPoolServer implementation
  *
@@ -27,7 +29,7 @@
 /**
  * Constructor for TSocketPool server
  */
-TSocketPoolServer::TSocketPoolServer(const std::string &host, int port)
+TSocketPoolServer::TSocketPoolServer(const string &host, int port)
   : host_(host),
     port_(port),
     lastFailTime_(0),
@@ -39,6 +41,14 @@
  * @author Jason Sobel <jsobel@facebook.com>
  */
 
+TSocketPool::TSocketPool() : TSocket(),
+  numRetries_(1),
+  retryInterval_(60),
+  maxConsecutiveFailures_(1),
+  randomize_(true),
+  alwaysTryLast_(true) {
+}
+
 TSocketPool::TSocketPool(const vector<string> &hosts,
                          const vector<int> &ports) : TSocket(),
   numRetries_(1),
@@ -57,7 +67,7 @@
   }
 }
 
-TSocketPool::TSocketPool(const std::vector<pair<string, int> >& servers) : TSocket(),
+TSocketPool::TSocketPool(const vector<pair<string, int> >& servers) : TSocket(),
   numRetries_(1),
   retryInterval_(60),
   maxConsecutiveFailures_(1),
@@ -69,7 +79,7 @@
   }
 }
 
-TSocketPool::TSocketPool(const std::vector<TSocketPoolServer>& servers) : TSocket(),
+TSocketPool::TSocketPool(const vector< shared_ptr<TSocketPoolServer> >& servers) : TSocket(),
   servers_(servers),
   numRetries_(1),
   retryInterval_(60),
@@ -94,11 +104,15 @@
 }
 
 void TSocketPool::addServer(const string& host, int port) {
-  servers_.push_back(TSocketPoolServer(host, port));
+  servers_.push_back(shared_ptr<TSocketPoolServer>(new TSocketPoolServer(host, port)));
 }
 
-std::vector<TSocketPoolServer> TSocketPool::getServers() {
-  return servers_;
+void TSocketPool::setServers(const vector< shared_ptr<TSocketPoolServer> >& servers) {
+  servers_ = servers;
+}
+
+void TSocketPool::getServers(vector< shared_ptr<TSocketPoolServer> >& servers) {
+  servers = servers_;
 }
 
 void TSocketPool::setNumRetries(int numRetries) {
@@ -125,13 +139,13 @@
 /* TODO: without apc we ignore a lot of functionality from the php version */
 void TSocketPool::open() {
   if (randomize_) {
-    std::random_shuffle(servers_.begin(), servers_.end());
+    random_shuffle(servers_.begin(), servers_.end());
   }
 
   unsigned int numServers = servers_.size();
   for (unsigned int i = 0; i < numServers; ++i) {
 
-    TSocketPoolServer &server = servers_[i];
+    TSocketPoolServer &server = *(servers_[i]);
     bool retryIntervalPassed = (server.lastFailTime_ == 0);
     bool isLastServer = alwaysTryLast_ ? (i == (numServers - 1)) : false;
 
@@ -162,13 +176,13 @@
           // connection failed
         }
       }
-    }
 
-    ++server.consecutiveFailures_;
-    if (server.consecutiveFailures_ > maxConsecutiveFailures_) {
-      // Mark server as down
-      server.consecutiveFailures_ = 0;
-      server.lastFailTime_ = time(NULL);
+      ++server.consecutiveFailures_;
+      if (server.consecutiveFailures_ > maxConsecutiveFailures_) {
+        // Mark server as down
+        server.consecutiveFailures_ = 0;
+        server.lastFailTime_ = time(NULL);
+      }
     }
   }
 
diff --git a/lib/cpp/src/transport/TSocketPool.h b/lib/cpp/src/transport/TSocketPool.h
index 2d0496b..6c3b0f7 100644
--- a/lib/cpp/src/transport/TSocketPool.h
+++ b/lib/cpp/src/transport/TSocketPool.h
@@ -51,6 +51,12 @@
 class TSocketPool : public TSocket {
 
  public:
+
+   /**
+    * Socket pool constructor
+    */
+   TSocketPool();
+
    /**
     * Socket pool constructor
     *
@@ -72,7 +78,7 @@
     *
     * @param servers list of TSocketPoolServers
     */
-   TSocketPool(const std::vector<TSocketPoolServer>& servers);
+  TSocketPool(const std::vector< boost::shared_ptr<TSocketPoolServer> >& servers);
 
    /**
     * Socket pool constructor
@@ -92,11 +98,15 @@
     */
    void addServer(const std::string& host, int port);
 
+   /**
+    * Set list of servers in this pool
+    */
+  void setServers(const std::vector< boost::shared_ptr<TSocketPoolServer> >& servers);
 
    /**
     * Get list of servers in this pool
     */
-   std::vector<TSocketPoolServer> getServers();
+  void getServers(std::vector< boost::shared_ptr<TSocketPoolServer> >& servers);
 
    /**
     * Sets how many times to keep retrying a host in the connect function.
@@ -131,7 +141,7 @@
  protected:
 
    /** List of servers to connect to */
-   std::vector<TSocketPoolServer> servers_;
+  std::vector< boost::shared_ptr<TSocketPoolServer> > servers_;
 
    /** How many times to retry each host in connect */
    int numRetries_;
