Index: src/Fragmentation/Automation/FragmentScheduler.cpp
===================================================================
--- src/Fragmentation/Automation/FragmentScheduler.cpp	(revision a40c85e2a7ef886ef6dc01bfdf7300e9f5816bc5)
+++ src/Fragmentation/Automation/FragmentScheduler.cpp	(revision ba995dcf6e21a9d90d6b3f43c134c6556ee111de)
@@ -69,6 +69,5 @@
     ControllerListener(_io_service, controllerport, JobsQueue,
         boost::bind(&FragmentScheduler::shutdown, boost::ref(*this))),
-    connection(_io_service),
-    shutdownWorkerOp(connection)
+    connection(_io_service)
 {
   Info info(__FUNCTION__);
@@ -527,5 +526,6 @@
       "FragmentScheduler::sendJobToWorker() - Worker "+toString(address)+" is already busy.");
   LOG(2, "INFO: Shutting down worker " << address << "...");
-  shutdownWorkerOp(address.host, address.service);
+  AsyncOperation *shutdownWorkerOp = new ShutdownWorkerOperation(connection);
+  OpQueue.push_back(shutdownWorkerOp, address);
 }
 
@@ -548,4 +548,6 @@
     shutdownWorker(address);
   }
+  // wait for pending shutdown operations
+  while (!OpQueue.empty());
   pool.removeAllWorkers();
 }
Index: src/Fragmentation/Automation/FragmentScheduler.hpp
===================================================================
--- src/Fragmentation/Automation/FragmentScheduler.hpp	(revision a40c85e2a7ef886ef6dc01bfdf7300e9f5816bc5)
+++ src/Fragmentation/Automation/FragmentScheduler.hpp	(revision ba995dcf6e21a9d90d6b3f43c134c6556ee111de)
@@ -221,7 +221,4 @@
   //!> internal queue for all asynchronous operations
   OperationQueue OpQueue;
-
-  //!> internal operation to shutdown a worker
-  ShutdownWorkerOperation shutdownWorkerOp;
 };
 
Index: src/Fragmentation/Automation/Operations/OperationQueue.hpp
===================================================================
--- src/Fragmentation/Automation/Operations/OperationQueue.hpp	(revision a40c85e2a7ef886ef6dc01bfdf7300e9f5816bc5)
+++ src/Fragmentation/Automation/Operations/OperationQueue.hpp	(revision ba995dcf6e21a9d90d6b3f43c134c6556ee111de)
@@ -54,4 +54,12 @@
   void push_back(AsyncOperation *&op, const WorkerAddress &address);
 
+  /** States whether the queue is empty.
+   *
+   * @return true - queue is empty, false - operations are pending
+   */
+  bool empty() const {
+    return queue.empty();
+  }
+
   void update(Observable *publisher);
   void recieveNotification(Observable *publisher, Notification_ptr notification);
Index: src/Fragmentation/Automation/Operations/Servers/ShutdownWorkerOperation.cpp
===================================================================
--- src/Fragmentation/Automation/Operations/Servers/ShutdownWorkerOperation.cpp	(revision a40c85e2a7ef886ef6dc01bfdf7300e9f5816bc5)
+++ src/Fragmentation/Automation/Operations/Servers/ShutdownWorkerOperation.cpp	(revision ba995dcf6e21a9d90d6b3f43c134c6556ee111de)
@@ -35,12 +35,34 @@
 FragmentJob::ptr ShutdownWorkerOperation::NoJob(new SystemCommandJob(std::string(""), std::string(""), JobId::NoJob));
 
-/** Virtual internal function to give shutdown choice.
+/** Handle connect operation to shutdown scheduler.
  *
+ * \param e error code if something went wrong
+ * \param endpoint_iterator endpoint of the connection
  */
-void ShutdownWorkerOperation::internal()
+void ShutdownWorkerOperation::handle_connect(const boost::system::error_code& e,
+    boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
 {
   Info info(__FUNCTION__);
+  if (!e)
+  {
+    // The connection::async_write() function will automatically
+    // serialize the data structure for us.
+    connection_.async_write(NoJob,
+      boost::bind(&ShutdownWorkerOperation::handle_FinishOperation, 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(&ShutdownWorkerOperation::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.
+    Exitflag = ErrorFlag;
+    ELOG(1, e.message());
+  }
+}
 
-  // send the NoJob
-  connection_.sync_write(NoJob);
-}
Index: src/Fragmentation/Automation/Operations/Servers/ShutdownWorkerOperation.hpp
===================================================================
--- src/Fragmentation/Automation/Operations/Servers/ShutdownWorkerOperation.hpp	(revision a40c85e2a7ef886ef6dc01bfdf7300e9f5816bc5)
+++ src/Fragmentation/Automation/Operations/Servers/ShutdownWorkerOperation.hpp	(revision ba995dcf6e21a9d90d6b3f43c134c6556ee111de)
@@ -21,20 +21,21 @@
 
 #include "Jobs/FragmentJob.hpp"
-#include "Operations/SyncOperation.hpp"
+#include "Operations/AsyncOperation.hpp"
 
 /** Synchronous operation that gives shutdown command.
  *
  */
-class ShutdownWorkerOperation : public SyncOperation  {
+class ShutdownWorkerOperation : public AsyncOperation  {
 public:
   /// Constructor for class ShutdownWorkerOperation.
   ShutdownWorkerOperation(Connection &_connection) :
-    SyncOperation(std::string("shutdown"),_connection) {}
+    AsyncOperation(std::string("shutdown"),_connection) {}
   /// Destructor for class ShutdownWorkerOperation
   ~ShutdownWorkerOperation() {}
 
 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);
 
 private:
