diff --git a/test/DrawTest.C b/test/DrawTest.C
new file mode 100644
index 0000000000000000000000000000000000000000..4a47340ce7c77320a1842ee4a66fe9bc22af453c
--- /dev/null
+++ b/test/DrawTest.C
@@ -0,0 +1,150 @@
+#include "TTree.h"
+#include "TFile.h"
+#include "TList.h"
+#include <TBenchmark.h>
+
+int gHasLibrary = kFALSE;
+TList gSkipped;
+
+void DrawSkippable(TTree* tree, const char* what, const char* where, bool skip) {
+  //cerr << "Doing " << what << " which is " << skip << endl;
+  if (skip) gSkipped.Add(new TNamed(where,where));
+  else {
+    TString cut = what;
+    cut.Append(">>");
+    cut.Append(where);
+    tree->Draw(cut.Data(),"","goff");
+  }
+};
+
+void DrawSkippable(TTree* tree, const char* what, const char* cond,
+                   const char* where, bool skip) {
+  //cerr << "Doing " << what << " which is " << skip << endl;
+  if (skip) gSkipped.Add(new TNamed(where,where));
+  else {
+    TString cut = what;
+    cut.Append(">>");
+    cut.Append(where);
+    tree->Draw(cut.Data(),cond,"goff");
+  }
+};
+
+// Rootmarks for fcdflnx1 is 153.4
+void DrawMarks() {
+
+  // The base is currently: RunDrawTest.C++("Event.old.split.root",0)
+  Float_t rt_base = 2.33;
+  Float_t cp_base = 2.34;
+
+  Float_t rt = gBenchmark->GetRealTime("DrawTest");
+  Float_t ct = gBenchmark->GetCpuTime("DrawTest");
+
+  // gBenchmark->Print("DrawTest");
+  
+  Float_t rootmarks = 200*(rt_base + cp_base)/(rt + ct);
+  
+  printf("*  ROOTMARKS =%6.1f   *  Root%-8s  %d/%d\n",rootmarks,gROOT->GetVersion(),gROOT->GetVersionDate(),gROOT->GetVersionTime());
+ 
+}
+
+
+//_______________________________________________________________
+TDirectory* GenerateDrawHist(TTree *tree,int level = 1)
+{
+// Test selections via TreeFormula
+// tree is a TTree when called by stress9
+// tree is a TChain when called from stres11
+// This is a quite complex test checking the results of TTree::Draw
+// or TChain::Draw with an explicit loop on events.
+// Also a good test for the interpreter
+
+   gROOT->cd();
+   TDirectory *hfile = gDirectory;
+
+   gBenchmark = new TBenchmark();
+   gBenchmark->Start("DrawTest");
+   
+   // Each tree->Draw generates an histogram
+   DrawSkippable(tree,"GetNtrack()","hGetNtrack",!(level>0 && gHasLibrary));
+
+   //gBenchmark->Show("DrawTest");  gBenchmark->Start("DrawTest");
+
+   tree->Draw("fNtrack>>hNtrack",    "","goff");
+   tree->Draw("fNseg>>hNseg",        "","goff");
+   tree->Draw("fTemperature>>hTemp", "","goff");
+
+   tree->Draw("fH.GetMean()>>hHmean","","goff");
+   if (level>0) tree->Draw("fH.fXaxis.fXmax>>hHAxisMax","","goff");
+   if (level>0) tree->Draw("fH.fXaxis.GetXmax()>>hHAxisGetMax","","goff");
+   DrawSkippable(tree,"fH.GetXaxis().GetXmax()","hHGetAxisGetMax",!(level>0));
+   DrawSkippable(tree,"fH.GetXaxis().fXmax","hHGetAxisMax",!(level>0));
+   DrawSkippable(tree,"GetHistogram().GetXaxis().GetXmax()","hGetHGetAxisMax",
+                 !(level>0&&gHasLibrary));
+   DrawSkippable(tree,"event.GetHistogram().GetXaxis().GetXmax()",
+                 "hGetRefHGetAxisMax",!(level>0&&gHasLibrary));
+
+   tree->Draw("fTracks.fPx>>hPx","fEvtHdr.fEvtNum%10 == 0","goff");
+   tree->Draw("fTracks.fPy>>hPy","fEvtHdr.fEvtNum%10 == 0","goff");
+   tree->Draw("fTracks.fPz>>hPz","fEvtHdr.fEvtNum%10 == 0","goff");
+   tree->Draw("fRandom>>hRandom","fEvtHdr.fEvtNum%10 == 1","goff");
+   tree->Draw("fMass2>>hMass2",  "fEvtHdr.fEvtNum%10 == 1","goff");
+   tree->Draw("fBx>>hBx",        "fEvtHdr.fEvtNum%10 == 1","goff");
+   tree->Draw("fBy>>hBy",        "fEvtHdr.fEvtNum%10 == 1","goff");
+   tree->Draw("fXfirst>>hXfirst","fEvtHdr.fEvtNum%10 == 2","goff");
+   tree->Draw("fYfirst>>hYfirst","fEvtHdr.fEvtNum%10 == 2","goff");
+   tree->Draw("fZfirst>>hZfirst","fEvtHdr.fEvtNum%10 == 2","goff");
+   tree->Draw("fXlast>>hXlast",  "fEvtHdr.fEvtNum%10 == 3","goff");
+   tree->Draw("fYlast>>hYlast",  "fEvtHdr.fEvtNum%10 == 3","goff");
+   tree->Draw("fZlast>>hZlast",  "fEvtHdr.fEvtNum%10 == 3","goff");
+   tree->Draw("fCharge>>hCharge","fPx < 0","goff");
+   tree->Draw("fNpoint>>hNpoint","fPx < 0","goff");
+   tree->Draw("fValid>>hValid",  "fPx < 0","goff");
+
+   tree->Draw("fMatrix>>hFullMatrix","","goff");
+   tree->Draw("fMatrix[][0]>>hColMatrix","","goff");
+   tree->Draw("fMatrix[1][]>>hRowMatrix","","goff");
+   tree->Draw("fMatrix[2][2]>>hCellMatrix","","goff");
+
+   tree->Draw("fMatrix - fVertex>>hFullOper","","goff");
+   tree->Draw("fMatrix[2][1] - fVertex[5][1]>>hCellOper","","goff");
+   tree->Draw("fMatrix[][1]  - fVertex[5][1]>>hColOper","","goff");
+   tree->Draw("fMatrix[2][]  - fVertex[5][2]>>hRowOper","","goff");
+   tree->Draw("fMatrix[2][]  - fVertex[5][]>>hMatchRowOper","","goff");
+   tree->Draw("fMatrix[][2]  - fVertex[][1]>>hMatchColOper","","goff");
+   tree->Draw("fMatrix[][2]  - fVertex[][]>>hRowMatOper","","goff");
+   tree->Draw("fMatrix[][2]  - fVertex[5][]>>hMatchDiffOper","","goff");
+   tree->Draw("fMatrix[][]   - fVertex[][]>>hFullOper2","","goff");
+
+   // Test on variable arrays
+   tree->Draw("fClosestDistance>>hClosestDistance","","goff");
+   tree->Draw("fClosestDistance[2]>>hClosestDistance2","","goff");
+   tree->Draw("fClosestDistance[9]>>hClosestDistance9","","goff");
+
+   // Test variable indexing
+   DrawSkippable(tree,"fClosestDistance[fNvertex/2]","hClosestDistanceIndex",
+                 !(level>0));
+   DrawSkippable(tree,"fPx:fPy[fNpoint]","fPy[fNpoint]>0","hPxInd",!(level>0));
+
+   // Test of simple function calls
+   DrawSkippable(tree,"sqrt(fNtrack)","hSqrtNtrack",!(level>0));   
+
+   // Test string operations
+   DrawSkippable(tree,"fEvtHdr.fEvtNum","fType==\"type1\" ","hString",!(level>0));
+   DrawSkippable(tree,"fEvtHdr.fEvtNum","strstr(fType,\"1\") ","+hString",!(level>0));
+
+   // Test binary operators
+   DrawSkippable(tree,"fValid<<4","hShiftValid",!(level>0));
+   DrawSkippable(tree,"((fValid<<4)>>2)","+hShiftValid",!(level>0));
+   DrawSkippable(tree,"fValid&0x1","(fNvertex>10) && (fNseg<=6000)"
+                 ,"hAndValid",!(level>0));
+
+   // Test weight
+   DrawSkippable(tree,"fPx","(fBx>.4) || (fBy<=-.4)","hPxBx",!(level>0));
+   DrawSkippable(tree,"fPx","fBx*fBx*(fBx>.4) + fBy*fBy*(fBy<=-.4)",
+                 "hPxBxWeight",!(level>0));
+  
+   gBenchmark->Show("DrawTest");  gBenchmark->Start("DrawTest");
+
+   return hfile;
+
+}
diff --git a/test/DrawTest.sh b/test/DrawTest.sh
new file mode 100755
index 0000000000000000000000000000000000000000..468f7f5d69523ad2284a8d4ea704e78bb17b8fbc
--- /dev/null
+++ b/test/DrawTest.sh
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+MakeFiles.sh
+root -b -q 'MakeRef.C("Event.new.split9.root");'
+RunDrawTest.sh
+
+
diff --git a/test/MakeFiles.sh b/test/MakeFiles.sh
new file mode 100755
index 0000000000000000000000000000000000000000..5b2a642f14cb49125bbc15b3c46b58eb904387df
--- /dev/null
+++ b/test/MakeFiles.sh
@@ -0,0 +1,26 @@
+#!/bin/sh -xf
+
+size=50
+tracks=600
+comp=0
+action=1
+
+./Event $size $comp 0 $action $tracks 1
+mv Event.root Event.new.split0.root
+
+./Event $size $comp 1 $action $tracks 1
+mv Event.root Event.new.split1.root
+
+./Event $size $comp 9 $action $tracks 1
+mv Event.root Event.new.split9.root
+
+./Event $size $comp 0 $action $tracks 0 
+mv Event.root Event.old.streamed.root
+
+./Event $size $comp 1 $action $tracks 0
+mv Event.root Event.old.split.root
+
+# Next step is to do something like
+# root -q 'MakeRef.C("Event.old.split.root");'
+
+
diff --git a/test/MakeRef.C b/test/MakeRef.C
new file mode 100644
index 0000000000000000000000000000000000000000..d035dd8b6d8d77c83928f11eb8bdee81fab357fa
--- /dev/null
+++ b/test/MakeRef.C
@@ -0,0 +1,247 @@
+#include "RunDrawTest.C"
+
+#include "TClassTable.h"
+#include "TDirectory.h"
+#include "TFile.h"
+#include "TH1.h"
+
+#ifndef __CINT__
+#include "Event.h"
+#endif
+
+TH1F* RefClone(TH1F* orig) {    
+  TH1F *cloned = (TH1F*)orig->Clone(); 
+  TString name = orig->GetName();
+  name.Prepend("ref");
+  cloned->SetName(name); 
+  cloned->Reset();
+  return cloned;
+};
+
+TH1F* RefClone(TDirectory* from, const char* name) {
+  TH1F * orig = (TH1F*)from->Get(name);
+  if (!orig) {
+    cerr << "Missing " << name << " from " << from->GetName() << endl;
+    return 0;
+  }
+  return RefClone(orig);
+}
+
+void MakeHisto(TTree *tree, TDirectory* To) {
+   
+   cout << "Generating histograms from TTree::Draw" << endl;
+   TDirectory* where = GenerateDrawHist(tree);
+   To->cd();
+
+   Event *event = new Event();
+   tree->SetBranchAddress("event",&event);
+
+   //We make clones of the generated histograms
+   //We set new names and reset the clones.
+   //We want to have identical histogram limits
+   TH1F *refNtrack = RefClone(where,"hNtrack");
+   TH1F *refGetNtrack = RefClone(where,"hGetNtrack");
+   TH1F *refNseg   = RefClone(where,"hNseg");  
+   TH1F *refTemp   = RefClone(where,"hTemp");  
+   TH1F *refHmean  = RefClone(where,"hHmean"); 
+   TH1F *refHAxisMax = RefClone(where,"hHAxisMax"); 
+   TH1F *refHAxisGetMax = RefClone(where,"hHAxisGetMax"); 
+   TH1F *refHGetAxisGetMax  = RefClone(where,"hHGetAxisGetMax");
+   TH1F *refHGetAxisMax  = RefClone(where,"hHGetAxisMax");
+   TH1F *refGetHGetAxisMax  = RefClone(where,"hGetHGetAxisMax");
+   TH1F *refGetRefHGetAxisMax  = RefClone(where,"hGetRefHGetAxisMax");
+
+   TH1F *refPx     = RefClone(where,"hPx"); 
+   TH1F *refPy     = RefClone(where,"hPy");
+   TH1F *refPz     = RefClone(where,"hPz"); 
+   TH1F *refRandom = RefClone(where,"hRandom");
+   TH1F *refMass2  = RefClone(where,"hMass2");
+   TH1F *refBx     = RefClone(where,"hBx");
+   TH1F *refBy     = RefClone(where,"hBy");
+   TH1F *refXfirst = RefClone(where,"hXfirst");
+   TH1F *refYfirst = RefClone(where,"hYfirst");
+   TH1F *refZfirst = RefClone(where,"hZfirst");
+   TH1F *refXlast  = RefClone(where,"hXlast");
+   TH1F *refYlast  = RefClone(where,"hYlast");
+   TH1F *refZlast  = RefClone(where,"hZlast");
+   TH1F *refCharge = RefClone(where,"hCharge");
+   TH1F *refNpoint = RefClone(where,"hNpoint");
+   TH1F *refValid  = RefClone(where,"hValid");
+
+   TH1F *refFullMatrix   = RefClone(where,"hFullMatrix");
+   TH1F *refColMatrix    = RefClone(where,"hColMatrix");
+   TH1F *refRowMatrix    = RefClone(where,"hRowMatrix");
+   TH1F *refCellMatrix   = RefClone(where,"hCellMatrix");
+   TH1F *refFullOper     = RefClone(where,"hFullOper");
+   TH1F *refCellOper     = RefClone(where,"hCellOper");
+   TH1F *refColOper      = RefClone(where,"hColOper");
+   TH1F *refRowOper      = RefClone(where,"hRowOper");
+   TH1F *refMatchRowOper = RefClone(where,"hMatchRowOper");
+   TH1F *refMatchColOper = RefClone(where,"hMatchColOper");
+   TH1F *refRowMatOper   = RefClone(where,"hRowMatOper");
+   TH1F *refMatchDiffOper= RefClone(where,"hMatchDiffOper");
+   TH1F *refFullOper2    = RefClone(where,"hFullOper2");
+
+   TH1F *refClosestDistance  = RefClone(where,"hClosestDistance");
+   TH1F *refClosestDistance2 = RefClone(where,"hClosestDistance2");
+   TH1F *refClosestDistance9 = RefClone(where,"hClosestDistance9");
+
+   TH1F *refClosestDistanceIndex = RefClone(where, "hClosestDistanceIndex");
+   TH2F *refPxInd = (TH2F*)RefClone(where,"hPxInd");
+
+   TH1F *refSqrtNtrack = RefClone(where,"hSqrtNtrack");
+   TH1F *refShiftValid = RefClone(where,"hShiftValid");
+   TH1F *refAndValid = RefClone(where,"hAndValid");
+
+   TH1F *refString = RefClone(where,"hString");
+
+   TH1F *refPxBx = RefClone(where,"hPxBx");
+   TH1F *refPxBxWeight =  RefClone(where,"hPxBxWeight");
+
+   // Loop with user code on all events and fill the ref histograms
+   // The code below should produce identical results to the tree->Draw above
+
+   cout << "Recalculating the histograms with custom loop." << endl;
+
+   TClonesArray *tracks = event->GetTracks();
+   Int_t nev = (Int_t)tree->GetEntries();
+   Int_t i, ntracks, evmod,i0,i1, Nvertex;
+   Track *t;
+   EventHeader *head;
+   Int_t nbin = 0;
+   for (Int_t ev=0;ev<nev;ev++) {
+      nbin += tree->GetEntry(ev);
+      head = event->GetHeader();
+      evmod = head->GetEvtNum()%10;
+      refNtrack->Fill(event->GetNtrack());
+      refGetNtrack->Fill(event->GetNtrack());
+      refNseg->Fill(event->GetNseg());
+      refTemp->Fill(event->GetTemperature());
+      refHmean->Fill(event->GetHistogram()->GetMean());
+      refHAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
+      refHAxisGetMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
+      refHGetAxisGetMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
+      refHGetAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
+      refGetHGetAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
+      refGetRefHGetAxisMax->Fill(event->GetHistogram()->GetXaxis()->GetXmax());
+      refSqrtNtrack->Fill(sqrt(event->GetNtrack()));
+
+      //NOTE: This is loop is to take in consideration a know bug :(
+      for (int i9=0;i9<20;i9++) {
+         if (!strcmp("type1",event->GetType())) 
+            refString->Fill(event->GetHeader()->GetEvtNum());
+         if (strstr(event->GetType(),"1"))
+            refString->Fill(event->GetHeader()->GetEvtNum());
+      }
+
+      Nvertex = event->GetNvertex();
+      for(i0=0;i0<Nvertex;i0++) {
+         refClosestDistance->Fill(event->GetClosestDistance(i0));
+      }
+      if (Nvertex>2) refClosestDistance2->Fill(event->GetClosestDistance(2));
+      if (Nvertex>9) refClosestDistance9->Fill(event->GetClosestDistance(9));
+      refClosestDistanceIndex->Fill(event->GetClosestDistance(Nvertex/2));
+
+      for(i0=0;i0<4;i0++) {
+         for(i1=0;i1<4;i1++) {
+            refFullMatrix->Fill(event->GetMatrix(i0,i1));
+         }
+         refColMatrix->Fill(event->GetMatrix(i0,0));
+         refRowMatrix->Fill(event->GetMatrix(1,i0)); // done here because the matrix is square!
+      }
+      refCellMatrix->Fill(event->GetMatrix(2,2));
+
+      ntracks = event->GetNtrack();
+      if ( 5 < ntracks ) {
+         t = (Track*)tracks->UncheckedAt(5);
+         for(i0=0;i0<4;i0++) {
+            for(i1=0;i1<4;i1++) {
+            }
+            refColOper->Fill( event->GetMatrix(i0,1) - t->GetVertex(1) );
+            refRowOper->Fill( event->GetMatrix(2,i0) - t->GetVertex(2) );
+         }
+         for(i0=0;i0<3;i0++) {
+            refMatchRowOper->Fill( event->GetMatrix(2,i0) - t->GetVertex(i0) );
+            refMatchDiffOper->Fill( event->GetMatrix(i0,2) - t->GetVertex(i0) );
+         }
+         refCellOper->Fill( event->GetMatrix(2,1) - t->GetVertex(1) );
+      }
+      for (i=0;i<ntracks;i++) {
+         t = (Track*)tracks->UncheckedAt(i);
+         if (evmod == 0) refPx->Fill(t->GetPx());
+         if (evmod == 0) refPy->Fill(t->GetPy());
+         if (evmod == 0) refPz->Fill(t->GetPz());
+         if (evmod == 1) refRandom->Fill(t->GetRandom());
+         if (evmod == 1) refMass2->Fill(t->GetMass2());
+         if (evmod == 1) refBx->Fill(t->GetBx());
+         if (evmod == 1) refBy->Fill(t->GetBy());
+         if (evmod == 2) refXfirst->Fill(t->GetXfirst());
+         if (evmod == 2) refYfirst->Fill(t->GetYfirst());
+         if (evmod == 2) refZfirst->Fill(t->GetZfirst());
+         if (evmod == 3) refXlast->Fill(t->GetXlast());
+         if (evmod == 3) refYlast->Fill(t->GetYlast());
+         if (evmod == 3) refZlast->Fill(t->GetZlast());
+         if (t->GetPx() < 0) {
+            refCharge->Fill(t->GetCharge());
+            refNpoint->Fill(t->GetNpoint());
+            refValid->Fill(t->GetValid());
+         }
+         Int_t valid = t->GetValid();
+         refShiftValid->Fill(valid << 4);
+         refShiftValid->Fill( (valid << 4) >> 2 );
+         if (event->GetNvertex()>10 && event->GetNseg()<=6000) {
+            refAndValid->Fill( t->GetValid() & 0x1 );
+         }
+         
+         Track * t2 = (Track*)tracks->At(t->GetNpoint());
+         if (t2 && t2->GetPy()>0) {
+            refPxInd->Fill(t2->GetPy(),t->GetPx());
+         }
+         float Bx,By;
+         Bx = t->GetBx();
+         By = t->GetBy();
+         if ((Bx>.4) || (By<=-.4)) refPxBx->Fill(t->GetPx());
+         double weight = Bx*Bx*(Bx>.4) + By*By*(By<=-.4);
+         if (weight) refPxBxWeight->Fill(t->GetPx(),weight);
+
+         if (i<4) {
+            for(i1=0;i1<3;i1++) { // 3 is the min of the 2nd dim of Matrix and Vertex
+               refFullOper ->Fill( event->GetMatrix(i,i1) - t->GetVertex(i1) );
+               refFullOper2->Fill( event->GetMatrix(i,i1) - t->GetVertex(i1) );
+               refRowMatOper->Fill( event->GetMatrix(i,2) - t->GetVertex(i1) );
+            }
+            refMatchColOper->Fill( event->GetMatrix(i,2) - t->GetVertex(1) );
+         }
+      }
+   }
+
+   delete event;
+   Event::Reset();
+
+}
+
+void MakeRef(const char* from) {
+   if (!TClassTable::GetDict("Event")) {
+      gROOT->ProcessLine(".L libEvent.so");
+      gHasLibrary = kTRUE;
+   }
+
+   gROOT->GetList()->Delete();
+
+   TFile *hfile = new TFile(from);
+   TTree *tree = (TTree*)hfile->Get("T");
+   
+   TFile* f= new TFile("draw_test_ref.root","recreate");
+   MakeHisto(tree,f);
+   f->Write();
+   delete f;
+
+   delete hfile;
+
+   gROOT->cd();
+   cout << "Checking histograms" << endl;
+   Compare(gDirectory);
+
+    //   gROOT->GetList()->Delete();
+
+}
diff --git a/test/RunDrawTest.C b/test/RunDrawTest.C
new file mode 100644
index 0000000000000000000000000000000000000000..abf930f594cf79d83cb2e4e6179bdcbbc2f1de01
--- /dev/null
+++ b/test/RunDrawTest.C
@@ -0,0 +1,172 @@
+#include "TCanvas.h"
+#include "TClassTable.h"
+#include "TFile.h"
+#include "TH1.h"
+#include "TKey.h"
+#include "TChain.h"
+
+#include "iostream.h"
+
+#include "DrawTest.C"
+
+Bool_t gInteractiveTest = kTRUE;
+Bool_t gQuietLevel = 0;
+
+//_______________________________________________________________
+Int_t HistCompare(TH1 *ref, TH1 *comp)
+{
+// Compare histograms h1 and h2
+// Check number of entries, mean and rms
+// if means differ by more than 1/1000 of the range return -1
+// if rms differs in percent by more than 1/1000 return -2
+// Otherwise return difference of number of entries
+
+   Int_t n1       = (Int_t)ref->GetEntries();
+   Double_t mean1 = ref->GetMean();
+   Double_t rms1  = ref->GetRMS();
+   Int_t n2       = (Int_t)comp->GetEntries();
+   Double_t mean2 = comp->GetMean();
+   Double_t rms2  = comp->GetRMS();
+
+   Int_t factor = 1;
+   if (n2==2*n1) {
+     // we have a chain.
+     factor = 2;
+   }
+
+   Float_t xrange = ref->GetXaxis()->GetXmax() - ref->GetXaxis()->GetXmin();
+   if (TMath::Abs((mean1-mean2)/xrange) > 0.001*xrange) return -1;
+   if (rms1 && TMath::Abs((rms1-rms2)/rms1) > 0.001)    return -2;
+   return n1*factor-n2;
+}
+
+Int_t Compare(TDirectory* from) {
+   TFile * reffile = new TFile("draw_test_ref.root");
+   
+   TIter next(reffile->GetListOfKeys());
+   TH1 *ref, *draw;
+   const char* name;
+   Int_t comp;
+   Int_t fail = 0;
+   TKey* key;
+   while ((key=(TKey*)next())) {
+      if (strcmp(key->GetClassName(),"TH1F")
+          && strcmp(key->GetClassName(),"TH2F") ) 
+        continue; //may be a TList of TStreamerInfo
+      ref = (TH1*)reffile->Get(key->GetName());
+      name = ref->GetName();
+      if (strncmp(name,"ref",3)) continue;
+      name += 3;
+      draw = (TH1*)from->Get(name);
+      if (!draw) {
+         if (!gSkipped.FindObject(name)) {
+            cerr << "Miss: " << name << endl;
+            fail++;
+         }
+         continue;
+      }
+      comp = HistCompare(ref,draw);
+      if (comp!=0) {
+         cerr << "Fail: " << name << ":" << comp << endl;
+         fail++;
+         if (gInteractiveTest) {
+            TCanvas * canv = new TCanvas();
+            canv->Divide(2,1);
+            canv->cd(1); ref->Draw();
+            canv->cd(2); draw->Draw();
+            return 1;
+         }
+      } else {
+         if (gQuietLevel<1) cerr << "Succ: " << name << ":" << comp << endl;
+      }
+   }
+   return fail;
+}
+
+void SetVerboseLevel(Int_t verboseLevel) {
+   switch (verboseLevel) {
+   case 0: gInteractiveTest = kFALSE;
+     gQuietLevel = 2;
+     break;
+   case 1: gInteractiveTest = kFALSE;
+     gQuietLevel = 1;
+     break;
+   case 2: gInteractiveTest = kFALSE;
+     gQuietLevel = 0;
+     break;
+   case 3: gInteractiveTest = kTRUE;
+     gQuietLevel = 0;
+     break;
+   }
+}
+
+void RunDrawTest(const char* from, Int_t mode = 0, Int_t verboseLevel = 0) {
+  // This launch a test a TTree::Draw.
+  // The mode currently available are:
+  //    0: Do not load the shared library
+  //    1: Load the shared library before opening the file
+  //    2: Load the shared library after opening the file
+  //    3: Simple TChain test with shared library
+  //    4: Simple Friend test with shared library
+  // The verboseLeve currently available:
+  //    0: As silent as possible, only report errors and overall speed results.
+  //    1: Output 0 + label for the start of each phase
+  //    2: Output 1 + more details on the different phase being done
+  //    3: Output 2 + stop at the first first and draw a canvas showing the differences
+
+   SetVerboseLevel(verboseLevel);
+
+   if (mode == 1) {
+      if (!TClassTable::GetDict("Event")) {
+         gROOT->ProcessLine(".L libEvent.so");
+      }     
+      gHasLibrary = kTRUE;
+   }
+
+   TFile *hfile = 0;
+   TTree *tree;
+   if (mode <3) {
+      hfile = new TFile(from);
+      tree = (TTree*)hfile->Get("T");
+   }
+
+   if (mode >= 2 && mode <= 4) {
+      if (!TClassTable::GetDict("Event")) {
+         gROOT->ProcessLine(".L libEvent.so");
+      } else {
+         cerr << "Since libEvent.so has already been loaded, mode 2 can not be tested!";
+         cerr << endl;
+      }
+      gHasLibrary = kTRUE;
+   }
+
+   if (mode == 3) {
+      // Test Chains.
+      TChain * chain = new TChain("T");
+      chain->Add(from);
+      chain->Add(from);
+      tree = chain;
+   }
+
+   if (mode == 4) {
+      // Test friends.
+      tree = new TTree("T","Base of friendship");
+      tree->AddFriend("T",from);
+   }
+
+   if (gQuietLevel<2) cout << "Generating histograms from TTree::Draw" << endl;
+   TDirectory* where = GenerateDrawHist(tree);
+ 
+   if (gQuietLevel<2) cout << "Comparing histograms" << endl;
+   if (Compare(where)>0) {
+     cout << "DrawTest: Comparison failed" << endl;
+     return;
+   }
+   DrawMarks();
+
+   cout << "DrawTest: Comparison was successfull" << endl;
+   if (hfile) delete hfile;
+   else delete tree;
+   gROOT->GetList()->Delete();
+
+}   
diff --git a/test/RunDrawTest.sh b/test/RunDrawTest.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ddb981285b02b8e7c59cad6c0b3ff378e13e9846
--- /dev/null
+++ b/test/RunDrawTest.sh
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+# Previous step is to do something like
+# root -l -q 'MakeRef.C("Event.old.split.root");'
+
+ClassWarning='Warning in <TClass::TClass>: no dictionary for class'
+RootPrompt='root \[0\]'
+Streamer="Event::Streamer not available,"
+
+root.exe -l -q -b 'RunDrawTest.C++("Event.old.split.root",0)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b  'RunDrawTest.C+("Event.old.split.root",1)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b  'RunDrawTest.C+("Event.old.split.root",2)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b  'RunDrawTest.C+("Event.old.split.root",3)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b  'RunDrawTest.C+("Event.old.split.root",4)' 2>&1 | grep -v "$RootPrompt"
+
+root.exe -l -q -b 'RunDrawTest.C+("Event.old.streamed.root",0)' 2>&1 | grep -v "$Streamer\|$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.old.streamed.root",1)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.old.streamed.root",2)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.old.streamed.root",3)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.old.streamed.root",4)' 2>&1 | grep -v "$RootPrompt"
+
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split9.root",0)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split9.root",1)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split9.root",2)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split9.root",3)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split9.root",4)' 2>&1 | grep -v "$RootPrompt"
+
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split1.root",0)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split1.root",1)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split1.root",2)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split1.root",3)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split1.root",4)' 2>&1 | grep -v "$RootPrompt"
+
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split0.root",0)' 2>&1 | grep -v "$Streamer\|$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split0.root",1)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split0.root",2)' 2>&1 | grep -v "$ClassWarning\|$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split0.root",3)' 2>&1 | grep -v "$RootPrompt"
+root.exe -l -q -b 'RunDrawTest.C+("Event.new.split0.root",4)' 2>&1 | grep -v "$RootPrompt"