Index: fact/Evidence/GUI.cc
===================================================================
--- fact/Evidence/GUI.cc	(revision 10280)
+++ fact/Evidence/GUI.cc	(revision 10928)
@@ -81,7 +81,8 @@
   setFrame(false);
   setAttribute(Qt::WA_DeleteOnClose);
+  setText("connecting...");
   
   // Connect to DIM handler
-  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString))) == false) {
+  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString)), Qt::QueuedConnection) == false) {
     printf("Failed connection for %s\n", Name.toAscii().data());
   }
@@ -242,5 +243,5 @@
   
   // Connect to DIM handler
-  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString))) == false) {
+  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString)), Qt::QueuedConnection) == false) {
     printf("Failed connection for %s\n", Service.toAscii().data());
   }
@@ -795,9 +796,10 @@
   setAttribute(Qt::WA_DeleteOnClose);
   setAutoFillBackground(true);
+  setText("connecting...");
   document()->setMaximumBlockCount(1000);
   Accumulate = true;
   
   // Connect to DIM handler
-  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString))) == false) {
+  if (connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString)), Qt::QueuedConnection) == false) {
     printf("Failed connection for %s\n", Name.toAscii().data());
   }
@@ -839,4 +841,5 @@
     Pal.setColor(QPalette::Base, Qt::lightGray);
 	setPalette(Pal);
+    setText("n/a");
 	return;
   }
@@ -875,4 +878,9 @@
     printf("Failed connection in EddDim()\n");
   }
+
+  // To ensure responsiveness of GUI, subscriptions handled only when no GUI events (timeout 0)
+  Timer = new QTimer(this);
+  connect(Timer, SIGNAL(timeout()), SLOT(MakeSubscriptions()));
+  Timer->start();
 }
 
@@ -886,14 +894,27 @@
 }
 
-// Subscribe to DIM service
+// Subscribe to DIM service (actual subscription handled in worker thread below)
 void EddDim::Subscribe(QString Name) {
 
   // Lock before accessing list
   QMutexLocker Locker(Mutex);
-
-  // If already subscribed to service, increase usage count and reemit data for new subscriber
+  WaitingList.append(Name);
+}
+
+// Subscriptions handled only when no GUI events waiting (launched by timer, see constructor)
+void EddDim::MakeSubscriptions() {
+
+  if (WaitingList.isEmpty()) return;
+
+  // Lock before accessing list
+  QMutexLocker Locker(Mutex);
+
+  QString Name = WaitingList.first();
+  WaitingList.removeFirst();
+
+  // If already subscribed to service, increase usage count
   if (ServiceList.contains(Name)) {
 	ServiceList[Name].Count++;
-	YEP(Name, ServiceList[Name].TimeStamp, ServiceList[Name].ByteArray, ServiceList[Name].Format, ServiceList[Name].Text);
+	//YEP(Name, ServiceList[Name].TimeStamp, ServiceList[Name].ByteArray, ServiceList[Name].Format, ServiceList[Name].Text);
 	return;
   }
@@ -904,6 +925,6 @@
   ServiceList[Name].Count = 1;
   ServiceList[Name].DIMService = new DimStampedInfo(Name.toAscii().data(), INT_MAX, NO_LINK, this);
-  return;
-}
+}
+
 
 // Unsubsribe from DIM service
@@ -973,4 +994,18 @@
 }
 
+// Force reemit of all buffered DIM data (work around for widget update problem)
+void EddDim::ForceEmit() {
+
+  // Lock before accessing list
+  QMutexLocker Locker(Mutex);
+
+  QMap<QString, struct Item>::const_iterator i = ServiceList.constBegin();
+
+  while (i != ServiceList.constEnd()) {
+	YEP(i.key(), i.value().TimeStamp, i.value().ByteArray, i.value().Format, i.value().Text);
+     ++i;
+  }
+}
+
 // Store service information for usage by Subscribe(), update statistics and emit signal to widgets
 void EddDim::Update(QString Name, int Time, QByteArray Data, QString Format, QString Text) {
@@ -1027,5 +1062,8 @@
 
   if (M->isVisible()) M->hide();
-  else M->show();
+  else {
+	M->show();
+	M->raise();
+  }
 }
 
Index: fact/Evidence/GUI.h
===================================================================
--- fact/Evidence/GUI.h	(revision 10280)
+++ fact/Evidence/GUI.h	(revision 10928)
@@ -3,5 +3,6 @@
 
 #include <QtGui>
- 
+#include <QtConcurrentRun>
+
 #include <qwt_plot.h>
 #include <qwt_plot_curve.h>
@@ -224,4 +225,5 @@
     QMap<QString, struct Item> ServiceList;
     QMutex *Mutex;
+	QList<QString> WaitingList;
 
 	struct HistItem {
@@ -239,4 +241,5 @@
 	void Update(QString, int, QByteArray, QString, QString);
 	void UpdateStatistics();
+	void MakeSubscriptions();
 
   public:
@@ -248,4 +251,5 @@
 	class EvidenceHistory *GetHistory(QString);
 	void DropHistory(QString);
+	void ForceEmit();
 
   signals:
