Index: fact/Evidence/Evidence.cc
===================================================================
--- fact/Evidence/Evidence.cc	(revision 12892)
+++ fact/Evidence/Evidence.cc	(revision 12894)
@@ -421,22 +421,27 @@
   }
 
-  // Simplify format "?;1" to "?" 
-  if (strlen(Format)==3 && Format[2]=='1') Format[1] = '\0';
-  
-  // Structure: print hex representation 
-  if (strlen(Format) != 1) {
-	for (int i=0; i<Size; i++) {
-	  Text << setw(2) << hex << *((char *) Data + i) << " ";
-	} 
-	return Text.str();
-  }
-
   // String if format "C" and terminated with \0
   if (strcmp(Format, "C") == 0 && Size > 0 && *((char *) Data+Size-1)=='\0') {
 	return string((char *) Data);
   }
-
+  
+  // Check if format is made of identical component types
+  vector<string> Components = Tokenize(Format, ";");
+  
+  for (unsigned int i=0; i<Components.size(); i++) {
+  	if (Components[i].empty()) return string();
+
+	// Print hex representation if format complex
+	if (Components[i][0] != Components[0][0]) {
+	  for (int i=0; i<Size; i++) {
+		Text << setw(2) << hex << *((char *) Data + i) << " ";
+	  } 
+	  return Text.str();
+	}
+  }
+  
   // Number array
   int ElementSize;
+
   switch (toupper(*Format)) {
     case 'B':
Index: fact/Evidence/GUI.cc
===================================================================
--- fact/Evidence/GUI.cc	(revision 12892)
+++ fact/Evidence/GUI.cc	(revision 12894)
@@ -8,5 +8,5 @@
 a DIM status service
 
-April 2010, Oliver Grimm
+April 2010, February 2012, Oliver Grimm
 
 ============================================================ */
@@ -19,5 +19,5 @@
 // History chooser function (opens plot for numeric data, TextHist for all other)
 //
-void OpenHistory(char *Service, int Index) {
+void OpenHistory(char *Service, int FromIndex, int ToIndex) {
 
   QString Format;
@@ -29,5 +29,6 @@
   if (strcmp(Service, "Edd/Rate_kBSec") == 0) Format = "F";
   else if (Hist == NULL || Hist->GetFormat() == NULL) {
-	QMessageBox::warning(NULL, "Edd Message", QString("Could not retrieve history for service ") + Service ,QMessageBox::Ok);
+	//QMessageBox::warning(NULL, "Edd Message", QString("Could not retrieve history for service ") + Service ,QMessageBox::Ok);
+	printf("Edd Message: Could not retrieve history for service %s\n", Service);
   }
   else Format = Hist->GetFormat();
@@ -44,14 +45,20 @@
   M->setStatusBar(new QStatusBar(M));
   M->setAttribute(Qt::WA_DeleteOnClose);
-  M->setWindowTitle("Edd History - " + QString(Service));
-  
-  QWidget *W;
-  if (Format.size() == 1 && Format[0] != 'C') W = new EddPlot(Service, Index);
-  else W = new EddText(Service);
+  M->setWindowTitle("Edd History");
 
   QGridLayout *Layout = new QGridLayout(M->centralWidget());
-  Layout->addWidget(W, 0, 0);
-  Layout->addWidget(new EddLineDisplay(Service, Index), 1, 0);
-  M->resize(300,350);
+  
+  if (Format.size() == 1 && Format[0] == 'C') Layout->addWidget(new EddText(Service), 0, 0);
+  else  {
+    EddPlot *W = new EddPlot(Service, FromIndex);
+	for (int i=FromIndex+1; i<=ToIndex; i++) {
+	  W->AddService(Service,i);
+      Layout->addWidget(new EddLineDisplay(Service, i), 1 + (i-FromIndex)/5, (i-FromIndex)%5);
+	}
+	Layout->addWidget(W, 0, 0, 1, 5);
+  }
+  
+  Layout->addWidget(new EddLineDisplay(Service, FromIndex), 1, 0);
+  M->resize(400,450);
   M->show();
 }
@@ -107,5 +114,5 @@
 EddLineDisplay::~EddLineDisplay() {
 
-  Handler->Unsubscribe(ServiceName, this);
+  Handler->Unsubscribe(ServiceName, this, Index);
 }
 
@@ -404,11 +411,5 @@
 
  	// Append data if service available
-	if (SetStatus(this, Name, Time, Format)) {
-	  //QString Txt = Text;
-	  //Txt = Txt.section(' ', List[ItemNo].Index, List[ItemNo].Index);
-      //AddPoint(ItemNo, Time, atof(Txt.toAscii().data()));
-      AddPoint(ItemNo, Time, atof(Text.toAscii().data()));
-	}
-
+	if (SetStatus(this, Name, Time, Format)) AddPoint(ItemNo, Time, atof(Text.toAscii().data()));
 	NewData = true;
   }
@@ -485,5 +486,5 @@
 
   for (int i=0; i<List.size(); i++) if (List[i].Signal == Curve) {
-    Handler->Unsubscribe(List[i].Name, this);
+    Handler->Unsubscribe(List[i].Name, this, List[i].Index);
     List.removeAt(i);
   }
@@ -1007,6 +1008,9 @@
   // Check if already subscribed to service
   if (ServiceList.contains(Name)) {
-	ServiceList[Name].Subscribers[Instance] = Index;
-	if (Index>=0 && Index<ServiceList[Name].Items.size()) Instance->Update(Name, ServiceList[Name].TimeStamp, ServiceList[Name].ByteArray, ServiceList[Name].Format, ServiceList[Name].Items[Index]);
+    ServiceList[Name].Subscribers.append(QPair<class EddWidget *, int>(Instance, Index));
+	
+	if (Index>=0 && Index<ServiceList[Name].Items.size()) {
+	  Instance->Update(Name, ServiceList[Name].TimeStamp, ServiceList[Name].ByteArray, ServiceList[Name].Format, ServiceList[Name].Items[Index]);
+	}
 	else Instance->Update(Name, ServiceList[Name].TimeStamp, ServiceList[Name].ByteArray, ServiceList[Name].Format, ServiceList[Name].Text);
 
@@ -1017,5 +1021,5 @@
   ServiceList[Name].ByteArray = QByteArray();
   ServiceList[Name].TimeStamp = -1;
-  ServiceList[Name].Subscribers[Instance] = Index;
+  ServiceList[Name].Subscribers.append(QPair<class EddWidget *, int>(Instance, Index));
   ServiceList[Name].DIMService = new DimStampedInfo(Name.toAscii().data(), INT_MAX, NO_LINK, this);
 }
@@ -1023,5 +1027,5 @@
 
 // Unsubscribe from DIM service
-void EddDim::Unsubscribe(QString Name, class EddWidget *Instance) {
+void EddDim::Unsubscribe(QString Name, class EddWidget *Instance, int Index) {
 
   // Lock before accessing list
@@ -1029,13 +1033,15 @@
 
   if (!ServiceList.contains(Name)) return;
-  
-  if (ServiceList[Name].Subscribers.contains(Instance)) {
-	ServiceList[Name].Subscribers.remove(Instance);
-  }
-
+
+  QPair<class EddWidget *, int> P(Instance, Index);
+  
+  if (ServiceList[Name].Subscribers.contains(P)) {
+	ServiceList[Name].Subscribers.removeAt(ServiceList[Name].Subscribers.indexOf(P));
+  }
+
+  // If no more needed, drop DIM subsription
   if (ServiceList[Name].Subscribers.isEmpty()) {
 	delete ServiceList[Name].DIMService;
 	ServiceList.remove(Name);
-	return;
   }
 }
@@ -1111,5 +1117,5 @@
   Volume += Data.size();
 
-  // Store service data
+  // Store service data and update all subscribers
   if (ServiceList.contains(Name)) {
 	ServiceList[Name].TimeStamp = Time;
@@ -1119,9 +1125,11 @@
 	ServiceList[Name].Items = ServiceList[Name].Text.split(" ");
 
-	QMap<class EddWidget *, int>::const_iterator i = ServiceList[Name].Subscribers.constBegin();
-	while (i != ServiceList[Name].Subscribers.constEnd()) {
-	  if (i.value() >=0 && i.value() < ServiceList[Name].Items.size()) i.key()->Update(Name, Time, Data, Format, ServiceList[Name].Items[i.value()], i.value());
-	  else i.key()->Update(Name, Time, Data, Format, ServiceList[Name].Text, i.value());
-	  i++;
+	for (int i=0; i<ServiceList[Name].Subscribers.size(); i++) {
+	  QPair<class EddWidget *, int> P = ServiceList[Name].Subscribers[i];
+
+	  if (P.second >=0 && P.second < ServiceList[Name].Items.size()) {
+	    P.first->Update(Name, Time, Data, Format, ServiceList[Name].Items[P.second], P.second);
+	  }
+	  else P.first->Update(Name, Time, Data, Format, ServiceList[Name].Text, P.second);
 	}
   }  
Index: fact/Evidence/GUI.h
===================================================================
--- fact/Evidence/GUI.h	(revision 12892)
+++ fact/Evidence/GUI.h	(revision 12894)
@@ -31,5 +31,5 @@
 const QColor EddPlotBackgroundColor(Qt::yellow);
 
-void OpenHistory(char *, int);
+void OpenHistory(char *, int, int=-1);
 bool SetStatus(QWidget *, QString, int, QString, int = -1);
 
@@ -231,5 +231,5 @@
 	struct Item {
 	  DimStampedInfo *DIMService;
-	  QMap<class EddWidget *, int> Subscribers;
+	  QList<QPair<class EddWidget *, int> > Subscribers;
 	  int TimeStamp;
 	  QByteArray ByteArray;
@@ -263,5 +263,5 @@
 
 	void Subscribe(QString, class EddWidget *, int = -1);
-	void Unsubscribe (QString, class EddWidget *);
+	void Unsubscribe (QString, class EddWidget *, int = -1);
 	void Ignore (QString, bool);
 	class EvidenceHistory *GetHistory(QString);
Index: fact/tools/Edd/Edd.cc
===================================================================
--- fact/tools/Edd/Edd.cc	(revision 12892)
+++ fact/tools/Edd/Edd.cc	(revision 12894)
@@ -921,5 +921,5 @@
   QTimer *Timer = new QTimer(this);
   connect(Timer, SIGNAL(timeout()), this, SLOT(CheckAlarm()));
-  Timer->start(5000);
+  if (QString(DimServer::getDnsNode()).contains("ethz.ch")) Timer->start(5000);
 }  
     
@@ -940,5 +940,5 @@
 void GUI::MenuNewHistory() {
 
-  QStringList List;
+  QStringList List, Index;
   char *Name, *Format;
   int Type;
@@ -954,5 +954,5 @@
   // Open dialog and open history window
   QString Result = QInputDialog::getItem(this, "Edd Request",
-    "Enter or choose DIM service name (add index separated by colon)", List, 0, true, &OK);
+    "Enter or choose DIM service name (add index or index range a-b separated by colon)", List, 0, true, &OK);
 
   // Check if cancelled or empty data
@@ -960,6 +960,19 @@
   if (!OK || List.isEmpty()) return;
 
-  if (List.size() == 1) OpenHistory(List[0].toAscii().data(), 0);
-  else OpenHistory(List[0].toAscii().data(), atoi(List[1].toAscii().data()));
+  // Check if index was given
+  if (List.size() == 1) {
+	OpenHistory(List[0].toAscii().data(), 0);
+	return;
+  }
+
+  // Single index or index range?
+  Index = List[1].trimmed().split("-", QString::SkipEmptyParts);
+  if (Index.isEmpty()) {
+  	QMessageBox::warning(NULL, "Edd Message", QString("Incorrect index range given") ,QMessageBox::Ok);
+	return;
+  }
+
+  if (Index.size() == 1) OpenHistory(List[0].toAscii().data(), atoi(Index[0].toAscii().data()));
+  else OpenHistory(List[0].toAscii().data(), atoi(Index[0].toAscii().data()), atoi(Index[1].toAscii().data()));
 }
 
