Index: fact/Evidence/Edd/Edd.cc
===================================================================
--- fact/Evidence/Edd/Edd.cc	(revision 10105)
+++ fact/Evidence/Edd/Edd.cc	(revision 10112)
@@ -549,5 +549,5 @@
     int DataPoints = Items[ItemNo].x.size();	
 	if (DataPoints == 0) continue;
- 
+
     // Normalize y scale if requested
     double *y = new double [DataPoints];
@@ -562,5 +562,5 @@
       }  
     }
-
+ 
     // Plot data
     Items[ItemNo].Signal->setData(Items[ItemNo].x.data(), y, DataPoints);
@@ -735,5 +735,5 @@
     Stream << QString("# ") + Items[ItemNo].Signal->title().text() + ".hist" << endl;
     for (int i=0; i<Items[ItemNo].Signal->dataSize(); i++) {
-      Stream << (int) Items[ItemNo].x.at(i) << " " << Items[ItemNo].Signal->y(i) << endl;
+      Stream << Items[ItemNo].x.at(i) << " " << Items[ItemNo].Signal->y(i) << endl;
     }
   }
@@ -1019,5 +1019,4 @@
 
   Name = DRSBoard+"/EventData";
-  Active = false;
 
   Tmpfile = tmpfile();
@@ -1031,8 +1030,12 @@
 
   // Context menu
-  PhysPipeAction = new QAction("Plot physical pipeline", this);
+  PhysPipeAction = new QAction("Physical pipeline", this);
   PhysPipeAction->setCheckable(true);
   connect(PhysPipeAction, SIGNAL(triggered()), SLOT(PlotTraces()));
   Menu->insertAction(StripAction, PhysPipeAction);
+
+  PersistanceAction = new QAction("Persistance", this);
+  PersistanceAction->setCheckable(true);
+  Menu->insertAction(StripAction, PersistanceAction);
   Menu->removeAction(StripAction);
 
@@ -1084,4 +1087,7 @@
   if (List.isEmpty()) return;
   
+  // Clear in case persistance was activated
+  ClearCurve(0);
+
   List.first().Signal->setTitle(QString::number(Board)+","+QString::number(Chip)+","+ QString::number(Channel) + " (" + DRS_to_Pixel(Board, Chip, Channel).c_str() + ")");
   List.first().Board = Board;
@@ -1094,5 +1100,5 @@
 // Update event buffer
 void EventScope::Update(QString Name, int Time, QByteArray Data, QString Format, QString) {
-
+  
   if (Name != this->Name) return;
 
@@ -1100,4 +1106,7 @@
   if (!SetStatus(this, Name, Time, Format)) return;
   if (Data.size() < (int) sizeof(RunHeader)) return;
+  
+  // Disconnect while processing to avoid queing of events
+  disconnect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), this, SLOT(Update(QString, int, QByteArray, QString, QString)));
   
   // Open tempory file and write event data to this file
@@ -1154,5 +1163,9 @@
   emit(EventHeaderChanged(Stream.readAll()));
 
+  // Update display
   PlotTraces();
+  
+  // Reconnect after processing
+  connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), SLOT(Update(QString, int, QByteArray, QString, QString)));
 }
 
@@ -1162,17 +1175,22 @@
   double x,y;
   unsigned int Cell, Trig;
+  static int Last = 0;
   
   // Only process if valid data in RawDataCTX class
-  if (!Active || ErrCode != CTX_OK) return;
+  if (ErrCode != CTX_OK) return;
   
   // Set x axis title
   if (PhysPipeAction->isChecked()) setAxisTitle(QwtPlot::xBottom, "Time from start of pipeline (ns)");
   else setAxisTitle(QwtPlot::xBottom, "Time from trigger minus one revolution (ns)");
-  
+
   // Loop through event data to update event scope
   RunHeader *R = RD->RHeader;
   for (int i=0; i<List.size(); i++) {
 
-	ClearCurve(i);
+	if (PersistanceAction->isChecked()) List[i].Signal->setStyle(QwtPlotCurve::Dots);
+	else {
+	  ClearCurve(i);
+	  List[i].Signal->setStyle(QwtPlotCurve::Lines);
+	}
 
  	// Check if current event contains requested trace
@@ -1185,4 +1203,5 @@
 	Trig = *((int *) RD->Data + List[i].Board*R->NChips + List[i].Chip);
 
+	// Calulate point of curve
 	for (unsigned int j=0; j<R->Samples; j++) {
 
@@ -1202,5 +1221,10 @@
   }
 
-  UpdatePlot();
+  // Limit update rate in persistance mode 
+  if (!PersistanceAction->isChecked() || time(NULL) > Last) {
+    UpdatePlot();
+    Last = time(NULL);
+  }
+
 
   // Loop through event data for pixel display
@@ -1237,4 +1261,6 @@
 // Set display active (if inactive, disconnect from server)
 void EventScope::SetActive(bool State) {
+
+  static bool Active = false;
 
   if (State && !Active) Handler->Subscribe(DRSBoard+"/EventData");
@@ -1529,4 +1555,7 @@
   }
 
+  connect(Scope, SIGNAL(RunHeaderChanged(QString)), RunHeaderDisplay, SLOT(setPlainText(QString)));
+  connect(Scope, SIGNAL(EventHeaderChanged(QString)), EventHeaderDisplay, SLOT(setPlainText(QString)));
+
   StartStop(false);
   connect(Scope, SIGNAL(PixelData(QVector<double>)), SLOT(SetPixelData(QVector<double>)));
@@ -1562,12 +1591,6 @@
   Scope->SetActive(!State);
   StartStopButton->setText(State ? "Start" : "Stop");
-  if (!State) {
-	connect(Scope, SIGNAL(RunHeaderChanged(QString)), RunHeaderDisplay, SLOT(setPlainText(QString)));
-	connect(Scope, SIGNAL(EventHeaderChanged(QString)), EventHeaderDisplay, SLOT(setPlainText(QString)));
-  }
-  else {
-	disconnect(Scope, SIGNAL(RunHeaderChanged(QString)), RunHeaderDisplay, SLOT(setPlainText(QString)));
-	disconnect(Scope, SIGNAL(EventHeaderChanged(QString)), EventHeaderDisplay, SLOT(setPlainText(QString)));
-  }
+  if (!State) connect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), Scope, SLOT(Update(QString, int, QByteArray, QString, QString)));
+  else disconnect(Handler, SIGNAL(YEP(QString, int, QByteArray, QString, QString)), Scope, SLOT(Update(QString, int, QByteArray, QString, QString)));
 }
 
Index: fact/Evidence/Edd/Edd.h
===================================================================
--- fact/Evidence/Edd/Edd.h	(revision 10105)
+++ fact/Evidence/Edd/Edd.h	(revision 10112)
@@ -280,6 +280,6 @@
 	CTX_ErrCode ErrCode;
 	QAction *PhysPipeAction;
+	QAction *PersistanceAction;
 	FILE *Tmpfile;
-	bool Active;
 
   public:
