Index: trunk/FACT++/src/MessageDim.cc
===================================================================
--- trunk/FACT++/src/MessageDim.cc	(revision 16477)
+++ trunk/FACT++/src/MessageDim.cc	(revision 16479)
@@ -38,5 +38,6 @@
                           "A general logging service providing a quality of service (severity)"
                           "|Message[string]:The message"),
-MessageImp(out), fDebug(false)
+    MessageImp(out), fDebug(false),
+    fMsgQueue(std::bind(&MessageDimTX::UpdateService, this, placeholders::_1))
 {
     // This is a message which will never arrive because
@@ -52,5 +53,18 @@
 MessageDimTX::~MessageDimTX()
 {
-    Message("MessageDimTX shutting down.");
+    // Everything here will never be sent by dim because the
+    // dim services have been stopped already. This is necessary,
+    // to have them available already during startup
+    Message("MessageDimTX shutting down ["+to_string(fMsgQueue.size())+"]");
+}
+
+void MessageDimTX::UpdateService(const tuple<Time,string,int> &data)
+{
+    setData(get<1>(data));
+    setQuality(get<2>(data));
+
+    const int rc = DimDescribedService::Update(get<0>(data));
+    if (rc==0 && fDebug)
+        Out() << " !! " << get<0>(data).GetAsStr() << " - Sending failed!" << endl;
 }
 
@@ -67,38 +81,7 @@
 {
     MessageImp::Write(t, txt, qos);
+    fMsgQueue.emplace(t, txt, qos);
 
-
-    // We cannot use our own mutex here because it can create dead-locks
-    // in a hand-shake with the global dim-mutex if a service is
-    // updated from within a dimHandler (dim-mutex already locked)
-    // and at the same time another thread tries to lock the mutex.
-    //
-    // Thread 1: Lock global Dim mutex and call infoHandler
-    //
-    // Thread 2: CALL Write
-    // Thread 2: LOCK Write-mutex
-    // Thread 2: setQuality will try to lock global Dim mutex
-    //           (since Thread1!=Thread2 this results in a wait)
-    //
-    // Thread 1: CALL Write from within the infoHandler
-    // Thread 1: LOCK Write-mutex
-    //           (since Thread2 now waits for the infoHandler to finish
-    //            and the infoHandler has to wait for the Write-mutex
-    //            we have a dead-lock)
-    //
-    dim_lock();
-
-    // We have to use setData to make sure the DimService will
-    // hold a local copy of the data.
-    setQuality(qos);
-
-    const int rc = DimDescribedService::Update(txt);
-
-    dim_unlock();
-
-    if (rc==0 && fDebug)
-        Out() << " !! " << t.GetAsStr() << " - Sending failed!" << endl;
-
-    return rc;
+    return 1;
 }
 
Index: trunk/FACT++/src/MessageDim.h
===================================================================
--- trunk/FACT++/src/MessageDim.h	(revision 16477)
+++ trunk/FACT++/src/MessageDim.h	(revision 16479)
@@ -2,8 +2,6 @@
 #define FACT_MessageDim
 
+#include "queue.h"
 #include "MessageImp.h"
-
-
-
 #include "DimDescriptionService.h"
 //#include <dis.hxx> // DimService
@@ -13,4 +11,8 @@
 private:
     bool fDebug;
+
+    Queue<std::tuple<Time,std::string,int>> fMsgQueue;
+
+    void UpdateService(const std::tuple<Time,std::string,int> &data);
 
 public:
