Index: src/Fragmentation/Automation/Operations/OperationQueue.cpp
===================================================================
--- src/Fragmentation/Automation/Operations/OperationQueue.cpp	(revision 7f19f8d965b9500bdd7eb697fe07e841aae90249)
+++ src/Fragmentation/Automation/Operations/OperationQueue.cpp	(revision 2c5765fc2598fb70685cc0ead59e118f3df88b1c)
@@ -48,10 +48,16 @@
 {
   if (op != NULL) {
-    AsyncOp_ptr ptr(op); // this always prevents memory loss
-    ptr->signOn(this);
-    OperationQueue_t::iterator iter = queue.insert(queue.end(), ptr );
-    op = NULL;
-    AddressMap.insert( make_pair(*iter, address) );
-    LaunchNextOp();
+    if (!IsBlockedFlag) {
+      AsyncOp_ptr ptr(op); // this always prevents memory loss
+      ptr->signOn(this);
+      OperationQueue_t::iterator iter = queue.insert(queue.end(), ptr );
+      op = NULL;
+      AddressMap.insert( make_pair(*iter, address) );
+      LaunchNextOp();
+    } else {
+      ELOG(1, "Queue is currently blocked, dropping operation "+op->getName()+".");
+      delete op;
+      op = NULL;
+    }
   } else {
     ELOG(1, "Given operation pointer is NULL.");
Index: src/Fragmentation/Automation/Operations/OperationQueue.hpp
===================================================================
--- src/Fragmentation/Automation/Operations/OperationQueue.hpp	(revision 7f19f8d965b9500bdd7eb697fe07e841aae90249)
+++ src/Fragmentation/Automation/Operations/OperationQueue.hpp	(revision 2c5765fc2598fb70685cc0ead59e118f3df88b1c)
@@ -38,5 +38,6 @@
   OperationQueue() :
     Observer("OperationQueue"),
-    RunningOps(0)
+    RunningOps(0),
+    IsBlockedFlag(false)
   {}
   /** Default destructor for class OperationQueue.
@@ -61,4 +62,29 @@
   bool empty() const {
     return queue.empty();
+  }
+
+  /** Blocks the queue for any further operation.
+   *
+   */
+  void block()
+  {
+    IsBlockedFlag = true;
+  }
+
+  /** Unblocks the queue, operations may again be pushed.
+   *
+   */
+  void unblock()
+  {
+    IsBlockedFlag = false;
+  }
+
+  /** Getter whether queue is currently blocked.
+   *
+   * @return OperationQueue::IsBlockedFlag
+   */
+  bool isBlocked() const
+  {
+    return IsBlockedFlag;
   }
 
@@ -113,4 +139,7 @@
   //!> Association for each operation to its address to connect to
   AddressMap_t AddressMap;
+
+  //!> status flag whether queue is blocked or operations may be pushed.
+  bool IsBlockedFlag;
 };
 
Index: src/Fragmentation/Automation/Pool/PoolWorker.cpp
===================================================================
--- src/Fragmentation/Automation/Pool/PoolWorker.cpp	(revision 7f19f8d965b9500bdd7eb697fe07e841aae90249)
+++ src/Fragmentation/Automation/Pool/PoolWorker.cpp	(revision 2c5765fc2598fb70685cc0ead59e118f3df88b1c)
@@ -165,6 +165,5 @@
 /** Helper function to shutdown the worker properly.
  *
- * Note that we will use ShutdownWorkerOperation to unlist from server's pool.
- * We stop the io_service via its callback handler in case of success.
+ * Note that we will use RemoveFromPoolOperation to unlist from server's pool.
  */
 void PoolWorker::shutdown()
@@ -175,4 +174,6 @@
   LOG(2, "DEBUG: Putting remove from pool operation into queue ...");
   OpQueue.push_back(removeOp, ServerAddress);
+  // block queue such that io_service may stop
+  OpQueue.block();
 }
 
@@ -180,5 +181,5 @@
  *
  * This is called after we have been removed from server's pool
- *
+ * We stop the io_service via its callback handler in case of success.
  */
 void PoolWorker::finish()
Index: src/Fragmentation/Automation/unittests/OperationQueueUnitTest.cpp
===================================================================
--- src/Fragmentation/Automation/unittests/OperationQueueUnitTest.cpp	(revision 7f19f8d965b9500bdd7eb697fe07e841aae90249)
+++ src/Fragmentation/Automation/unittests/OperationQueueUnitTest.cpp	(revision 2c5765fc2598fb70685cc0ead59e118f3df88b1c)
@@ -103,4 +103,27 @@
 }
 
+/** UnitTest for block
+ */
+void OperationQueueTest::blockTest()
+{
+  // block queue
+  queue->block();
+  CPPUNIT_ASSERT( queue->isBlocked() );
+  queue->push_back(op,* address);
+  op = NULL;
+  CPPUNIT_ASSERT_EQUAL( (size_t)0, queue->queue.size() );
+
+  // block deletes op, hence re-instantiate
+  AsyncOperation *backup = // we need backup as op is NULL'ed
+      op = new AsyncOperationStub(std::string("AsyncOperationStub"), *conn);
+
+  // unblock and we suceed
+  queue->unblock();
+  CPPUNIT_ASSERT( !queue->isBlocked() );
+  queue->push_back(op,* address);
+  CPPUNIT_ASSERT_EQUAL( (size_t)1, queue->queue.size() );
+  CPPUNIT_ASSERT_EQUAL( backup, queue->queue.begin()->get() );
+}
+
 /** UnitTest for remove
  */
Index: src/Fragmentation/Automation/unittests/OperationQueueUnitTest.hpp
===================================================================
--- src/Fragmentation/Automation/unittests/OperationQueueUnitTest.hpp	(revision 7f19f8d965b9500bdd7eb697fe07e841aae90249)
+++ src/Fragmentation/Automation/unittests/OperationQueueUnitTest.hpp	(revision 2c5765fc2598fb70685cc0ead59e118f3df88b1c)
@@ -30,4 +30,5 @@
     CPPUNIT_TEST_SUITE( OperationQueueTest) ;
     CPPUNIT_TEST ( push_backTest );
+    CPPUNIT_TEST ( blockTest );
     CPPUNIT_TEST ( removeTest );
     CPPUNIT_TEST ( findTest );
@@ -38,4 +39,5 @@
       void setUp();
       void tearDown();
+      void blockTest();
       void findTest();
       void push_backTest();
