Index: src/Actions/ActionQueue.cpp
===================================================================
--- src/Actions/ActionQueue.cpp	(revision e63edb93a800204ca8a32bfc45eed103c7679210)
+++ src/Actions/ActionQueue.cpp	(revision 23b6cf7ccc51b9a98424d0793c25f776ae063e5f)
@@ -66,6 +66,6 @@
 #else
     lastActionOk(true),
-    run_thread(boost::bind(&ActionQueue::run, this)),
-    run_thread_isIdle(true)
+    run_thread_isIdle(true),
+    run_thread(boost::bind(&ActionQueue::run, this))
 #endif
 {
@@ -127,9 +127,10 @@
   }
 #else
+  const bool new_run_thread_isIdle = (CurrentAction == actionqueue.size());
+  mtx_queue.unlock();
   {
-    boost::lock_guard<boost::mutex> lock(mtx_idle);
-    run_thread_isIdle = (CurrentAction == actionqueue.size());
-  }
-  mtx_queue.unlock();
+    boost::lock_guard<boost::mutex> lock(mtx_run_thread_isIdle);
+    run_thread_isIdle = new_run_thread_isIdle;
+  }
 #endif
 }
@@ -145,5 +146,5 @@
   tempqueue.push_back( newaction );
   {
-    boost::lock_guard<boost::mutex> lock(mtx_idle);
+    boost::lock_guard<boost::mutex> lock(mtx_run_thread_isIdle);
     run_thread_isIdle = !((CurrentAction != actionqueue.size()) || !tempqueue.empty());
   }
@@ -160,5 +161,5 @@
     try {
 #if BOOST_VERSION < 105000
-      run_thread.sleep(boost::get_system_time() + boost::posix_time::milliseconds(100));
+      boost::this_thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(100));
 #else
       boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
@@ -176,4 +177,6 @@
     while (status) {
       //      boost::this_thread::disable_interruption di;
+      // access actionqueue, hence using mutex
+      mtx_queue.lock();
       LOG(0, "Calling Action " << actionqueue[CurrentAction]->getName() << " ... ");
       try {
@@ -195,11 +198,6 @@
         CurrentAction = (size_t)-1;
       }
-      if (lastActionOk) {
-        OBSERVE;
-        NOTIFY(ActionQueued);
-        _lastchangedaction = actionqueue[CurrentAction];
-      }
-      // access actionqueue, hence using mutex
-      mtx_queue.lock();
+      // remember action we juse executed
+      const Action *lastaction = actionqueue[CurrentAction];
       // step on to next action and check for end
       CurrentAction++;
@@ -209,9 +207,21 @@
       insertTempQueue();
       status = (CurrentAction != actionqueue.size());
-      mtx_queue.unlock();
+      // set last action
+      if (lastActionOk) {
+        OBSERVE;
+        NOTIFY(ActionQueued);
+        _lastchangedaction = lastaction;
+        // unlock before we delve into Observer functions ...
+        mtx_queue.unlock();
+      } else {
+        mtx_queue.unlock();
+      }
     }
+    mtx_queue.lock();
+    const bool new_run_thread_isIdle = !((CurrentAction != actionqueue.size()) || !tempqueue.empty());
+    mtx_queue.unlock();
     {
-      boost::lock_guard<boost::mutex> lock(mtx_idle);
-      run_thread_isIdle = !((CurrentAction != actionqueue.size()) || !tempqueue.empty());
+      boost::lock_guard<boost::mutex> lock(mtx_run_thread_isIdle);
+      run_thread_isIdle = new_run_thread_isIdle;
     }
     cond_idle.notify_one();
@@ -234,5 +244,5 @@
 void ActionQueue::wait()
 {
-  boost::unique_lock<boost::mutex> lock(mtx_idle);
+  boost::unique_lock<boost::mutex> lock(mtx_run_thread_isIdle);
   while(!run_thread_isIdle)
   {
Index: src/Actions/ActionQueue.hpp
===================================================================
--- src/Actions/ActionQueue.hpp	(revision e63edb93a800204ca8a32bfc45eed103c7679210)
+++ src/Actions/ActionQueue.hpp	(revision 23b6cf7ccc51b9a98424d0793c25f776ae063e5f)
@@ -265,22 +265,25 @@
 
 #ifdef HAVE_ACTION_THREAD
+  //!> internal mutex to synchronize access to queue
+  boost::mutex mtx_queue;
+
+  //!> conditional variable notifying when run_thread is idling
+  boost::condition_variable cond_idle;
+
+  //!> flag indicating whether run_thread is idle or not
+  bool run_thread_isIdle;
+
+  //!> internal mutex to synchronize access to run_thread_isIdle
+  boost::mutex mtx_run_thread_isIdle;
+#endif
+
+  //!> internal list of status messages from Actions for UIs to display
+  ActionStatusList StatusList;
+
+  // set run_thread to end such that others are initialized first (especially mutexes)
+#ifdef HAVE_ACTION_THREAD
   //!> internal thread to call Actions
   boost::thread run_thread;
-
-  //!> internal mutex to synchronize access to queue
-  boost::mutex mtx_queue;
-
-  //!> conditional variable notifying when run_thread is idling
-  boost::condition_variable cond_idle;
-
-  //!> flag indicating whether run_thread is idle or not
-  bool run_thread_isIdle;
-
-  //!> internal mutex to synchronize access to run_thread_isIdle
-  boost::mutex mtx_idle;
-#endif
-
-  //!> internal list of status messages from Actions for UIs to display
-  ActionStatusList StatusList;
+#endif
 };
 namespace Queuedetail {
