Index: src/Fragmentation/Automation/Operations/Workers/RemoveFromPoolOperation.cpp
===================================================================
--- src/Fragmentation/Automation/Operations/Workers/RemoveFromPoolOperation.cpp	(revision d57585e6a2a4bac3922a30b0d4538287bd9d1987)
+++ src/Fragmentation/Automation/Operations/Workers/RemoveFromPoolOperation.cpp	(revision bff93d44ade4571ea324e40c71e6fa2cce82cf93)
@@ -33,14 +33,87 @@
 
 
-/** Internal operation after connect to give address and send remove signal
- *
- */
-void RemoveFromPoolOperation::internal()
+/// Handle completion of a connect operation.
+void RemoveFromPoolOperation::handle_connect(const boost::system::error_code& e,
+    boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
+{
+  Info info(__FUNCTION__);
+  if (!e)
+  {
+    // Successfully established connection. Start operation to read the list
+    // of jobs. The connection::async_write() function will automatically
+    // decode the data that is read from the underlying socket.
+    LOG(1, "INFO: Sending address " << address << " ...");
+    connection_.async_write(address,
+      boost::bind(&RemoveFromPoolOperation::handle_SendChoice, this,
+      boost::asio::placeholders::error));
+  } else if (endpoint_iterator != boost::asio::ip::tcp::resolver::iterator()) {
+    // Try the next endpoint.
+    connection_.socket().close();
+    boost::asio::ip::tcp::endpoint endpoint = *endpoint_iterator;
+    connection_.socket().async_connect(endpoint,
+      boost::bind(&RemoveFromPoolOperation::handle_connect, this,
+      boost::asio::placeholders::error, ++endpoint_iterator));
+  } else {
+    // An error occurred. Log it and return. Since we are not starting a new
+    // operation the io_service will run out of work to do and the client will
+    // exit.
+    ELOG(1, e.message());
+    AsyncOperation::handle_FinishOperation(e);
+  }
+}
+
+/// Callback function when address has been sent and result is about to
+void RemoveFromPoolOperation::handle_SendChoice(const boost::system::error_code& e)
+{
+  Info info(__FUNCTION__);
+  if (!e)
+  {
+    // Successfully established connection. Start operation to read the list
+    // of jobs. The connection::async_write() function will automatically
+    // decode the data that is read from the underlying socket.
+    enum WorkerChoices choice = RemoveFromPool;
+    connection_.async_write(choice,
+      boost::bind(&RemoveFromPoolOperation::handle_ReceiveFlag, this,
+      boost::asio::placeholders::error));
+  } else {
+    // An error occurred. Log it and return. Since we are not starting a new
+    // operation the io_service will run out of work to do and the client will
+    // exit.
+    ELOG(1, e.message());
+    AsyncOperation::handle_FinishOperation(e);
+  }
+}
+
+/// Callback function when address has been sent and result is about to
+void RemoveFromPoolOperation::handle_ReceiveFlag(const boost::system::error_code& e)
+{
+  Info info(__FUNCTION__);
+  if (!e)
+  {
+    // Successfully established connection. Start operation to read the list
+    // of jobs. The connection::async_write() function will automatically
+    // decode the data that is read from the underlying socket.
+    connection_.async_read(RemovalFlag,
+      boost::bind(&RemoveFromPoolOperation::handle_FinishOperation, this,
+      boost::asio::placeholders::error));
+  } else {
+    // An error occurred. Log it and return. Since we are not starting a new
+    // operation the io_service will run out of work to do and the client will
+    // exit.
+    ELOG(1, e.message());
+    AsyncOperation::handle_FinishOperation(e);
+  }
+}
+
+/// Callback function when result has been sent.
+void RemoveFromPoolOperation::handle_FinishOperation(const boost::system::error_code& e)
 {
   Info info(__FUNCTION__);
 
-  LOG(1, "INFO: Removing " << address << " from server's pool ...");
-  connection_.sync_write(address);
-  enum WorkerChoices choice = RemoveFromPool;
-  connection_.sync_write(choice);
+  if (RemovalFlag)
+    LOG(1, "INFO: Removal successful.");
+  else
+    ELOG(1, "INFO: Removal failed.");
+
+  AsyncOperation::handle_FinishOperation(e);
 }
Index: src/Fragmentation/Automation/Operations/Workers/RemoveFromPoolOperation.hpp
===================================================================
--- src/Fragmentation/Automation/Operations/Workers/RemoveFromPoolOperation.hpp	(revision d57585e6a2a4bac3922a30b0d4538287bd9d1987)
+++ src/Fragmentation/Automation/Operations/Workers/RemoveFromPoolOperation.hpp	(revision bff93d44ade4571ea324e40c71e6fa2cce82cf93)
@@ -20,12 +20,14 @@
 #include "Connection.hpp"
 
-#include "Operations/SyncOperation.hpp"
+#include "Operations/AsyncOperation.hpp"
 #include "WorkerAddress.hpp"
 
-class RemoveFromPoolOperation : public SyncOperation  {
+class RemoveFromPoolOperation : public AsyncOperation  {
 public:
   /// Constructor for class RemoveFromPoolOperation.
-  RemoveFromPoolOperation(Connection &_connection, const WorkerAddress &_address) :
-    SyncOperation(std::string("shutdownworker"),_connection),
+  RemoveFromPoolOperation(Connection &_connection, const WorkerAddress &_address,
+      const boost::function<void ()> &_callback_on_success = NoOpCallback,
+      const boost::function<void ()> &_callback_on_failure = NoOpCallback) :
+    AsyncOperation(std::string("shutdownworker"),_connection, _callback_on_success, _callback_on_failure),
     address(_address)
   {}
@@ -34,10 +36,23 @@
 
 public:
-  // function that implements read&writes in between connect/disconnect
-  virtual void internal();
+  // virtual function pointer to the connection handler
+  void handle_connect(const boost::system::error_code& e,
+      boost::asio::ip::tcp::resolver::iterator endpoint_iterator);
+
+  /// Callback function when address has been sent and we ask for removal
+  void handle_SendChoice(const boost::system::error_code& e);
+
+  /// Callback function when receiving flag indication succesful removal
+  void handle_ReceiveFlag(const boost::system::error_code& e);
+
+  /// Callback function when op is finished.
+  void handle_FinishOperation(const boost::system::error_code& e);
 
 private:
   //!> address to enroll with
   WorkerAddress address;
+
+  //!> flag indication successful removal from server
+  bool RemovalFlag;
 };
 
