Index: /trunk/MagicSoft/Mars/mhist/MFillH.cc
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MFillH.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mhist/MFillH.cc	(revision 2414)
@@ -324,4 +324,7 @@
     const Ssiz_t length = last-first-1;
 
+    //
+    // Make a copy before stripping leading and trailing White Spaces.
+    //
     TString strip = fHName(first+1, length);
     return strip.Strip(TString::kBoth);
@@ -340,12 +343,36 @@
         return kTRUE;
 
-    if (!fH->OverwritesDraw())
-        return kTRUE;
-
     if (TestBit(kDoNotDisplay))
         return kTRUE;
 
+    const Bool_t dr = fH->OverwritesDraw();
+    const Bool_t ts = fH->OverwritesDraw(NULL, "TS");
+    if (!dr && !ts)
+        return kTRUE;
+
+    if (!ts)
+    {
+        *fLog << warn << "You overwrote " << fH->ClassName() << "::";
+        *fLog << "Draw instead of " << fH->ClassName() << "::DrawTS" << endl;
+        *fLog << "This is not thread safe and might result in trouble using" << endl;
+        *fLog << "multithreaded programs like MONA." << endl;
+        *fLog << "" << endl;
+        return kTRUE;
+    }
+
     fCanvas = &fDisplay->AddTab(fH->GetName());
-    fH->Draw();
+    fH->DrawTS(fCanvas);
+
+    return kTRUE;
+}
+
+// --------------------------------------------------------------------------
+//
+//
+Bool_t MFillH::DrawCloneToDisplay()
+{
+    fH->DrawCloneTS(fCanvas);
+    fCanvas->Modified();
+    fCanvas->Update();
 
     return kTRUE;
@@ -506,10 +533,5 @@
     //
     if (fDisplay && fDisplay->HasCanvas(fCanvas))
-    {
-        fCanvas->cd();
-        fH->DrawClone("nonew");
-        fCanvas->Modified();
-        fCanvas->Update();
-    }
+        DrawCloneToDisplay();
 
     return kTRUE;
Index: /trunk/MagicSoft/Mars/mhist/MFillH.h
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MFillH.h	(revision 2413)
+++ /trunk/MagicSoft/Mars/mhist/MFillH.h	(revision 2414)
@@ -44,4 +44,5 @@
 
     Bool_t DrawToDisplay();
+    Bool_t DrawCloneToDisplay();
 
 public:
@@ -63,4 +64,7 @@
     Int_t PostProcess();
 
+    MH *GetH() { return fH; }
+    TCanvas *GetCanvas() { return fCanvas; }
+
     ClassDef(MFillH, 2) // Task to fill a histogram with data from a parameter container
 };
Index: /trunk/MagicSoft/Mars/mhist/MHHadronness.cc
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MHHadronness.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mhist/MHHadronness.cc	(revision 2414)
@@ -503,5 +503,5 @@
     gPad->SetBorderMode(0);
     //gStyle->SetOptStat(10);
-    MH::Draw(*fGhness, *fPhness, "Hadronness"); // Displ both stat boxes
+    MH::DrawSame(*fGhness, *fPhness, "Hadronness"); // Displ both stat boxes
 
     pad->cd(2);
Index: /trunk/MagicSoft/Mars/mhist/MHTriggerLvl0.cc
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MHTriggerLvl0.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mhist/MHTriggerLvl0.cc	(revision 2414)
@@ -171,20 +171,26 @@
 }
 
-void MHTriggerLvl0::Draw(Option_t *)
+void MHTriggerLvl0::DrawTS(TVirtualPad *p=NULL, Option_t * ="")
 {
-    TVirtualPad *pad = gPad ? gPad : MakeDefCanvas(this);
+    TVirtualPad *pad = p ? p : MakeDefCanvas(this);
     pad->SetBorderMode(0);
 
+    //-----------------------------
     pad->Divide(1,2);
 
-    pad->cd(1);
-    gPad->SetBorderMode(0);
-    gPad->Divide(1,1);
-    gPad->cd(1);
-    gPad->SetBorderMode(0);
-    fSum->Draw();
+    p = pad->GetPad(1);
+    p->SetBorderMode(0);
+    p->Divide(1,1);
+    p->cd(1);
+    p->SetBorderMode(0);
+    // fSum does not derive from MParContainer
+    MParContainer::DrawTS(fSum, p);
 
-    pad->cd(2);
-    gPad->SetBorderMode(0);
-    fSum->Draw("EPhist");
+    p = pad->GetPad(2);
+    p->SetBorderMode(0);
+    // fSum does not derive from MParContainer
+    MParContainer::DrawTS(fSum, p, "EPhist");
+    //-----------------------------
+
+    //MParContainer::DrawTS(fSum, p);
 }
Index: /trunk/MagicSoft/Mars/mhist/MHTriggerLvl0.h
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MHTriggerLvl0.h	(revision 2413)
+++ /trunk/MagicSoft/Mars/mhist/MHTriggerLvl0.h	(revision 2414)
@@ -34,5 +34,6 @@
     TH1 *GetHistByName(const TString name="");
 
-    void Draw(Option_t * ="");
+    //void Draw(Option_t * ="");
+    void DrawTS(TVirtualPad *pad=NULL, Option_t * ="");
 
     void PrintOutlayers(Float_t s) const;
Index: /trunk/MagicSoft/Mars/mimage/MHHillas.cc
===================================================================
--- /trunk/MagicSoft/Mars/mimage/MHHillas.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mimage/MHHillas.cc	(revision 2414)
@@ -278,5 +278,5 @@
     gStyle->SetPalette(50, c);
 }
-
+/*
 // --------------------------------------------------------------------------
 //
@@ -323,4 +323,50 @@
     pad->Update();
 }
+*/
+
+// --------------------------------------------------------------------------
+//
+// Creates a new canvas and draws the four histograms into it.
+// Be careful: The histograms belongs to this object and won't get deleted
+// together with the canvas.
+//
+void MHHillas::DrawTS(TVirtualPad *p, Option_t *)
+{
+    TVirtualPad *pad = p ? p : MakeDefCanvas(this);
+    pad->SetBorderMode(0);
+
+    MParContainer::DrawTS(pad);
+
+    pad->Divide(2,3);
+
+    p = pad->GetPad(1);
+    p->SetBorderMode(0);
+    MH::DrawSame(*fWidth, *fLength, "Width'n'Length", p);
+
+    p = pad->GetPad(2);
+    p->SetBorderMode(0);
+    MParContainer::DrawTS(fDistC, p);
+
+    p = pad->GetPad(3);
+    p->SetBorderMode(0);
+    p->SetLogx();
+    MParContainer::DrawTS(fSize, p);
+
+    p = pad->GetPad(4);
+    p->SetBorderMode(0);
+    p->SetPad(0.51, 0.01, 0.99, 0.65);
+    SetColors();
+    MParContainer::DrawTS(fCenter, p, "colz");
+
+    p = pad->GetPad(5);
+    p->SetBorderMode(0);
+    MParContainer::DrawTS(fDelta, p);
+
+    delete pad->GetPad(6);
+
+    pad->Modified();
+    pad->Update();
+}
+
 
 TH1 *MHHillas::GetHistByName(const TString name)
Index: /trunk/MagicSoft/Mars/mimage/MHHillas.h
===================================================================
--- /trunk/MagicSoft/Mars/mimage/MHHillas.h	(revision 2413)
+++ /trunk/MagicSoft/Mars/mimage/MHHillas.h	(revision 2414)
@@ -51,5 +51,6 @@
     TH2F *GetHistCenter() { return fCenter; }
 
-    void Draw(Option_t *opt=NULL);
+    //void Draw(Option_t *opt=NULL);
+    void DrawTS(TVirtualPad *pad=NULL, Option_t *opt=NULL);
 
     //Int_t DistancetoPrimitive(Int_t px, Int_t py) { return 0; }
Index: /trunk/MagicSoft/Mars/mimage/MHHillasExt.cc
===================================================================
--- /trunk/MagicSoft/Mars/mimage/MHHillasExt.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mimage/MHHillasExt.cc	(revision 2414)
@@ -242,5 +242,5 @@
     pad->cd(1);
     gPad->SetBorderMode(0);
-    MH::Draw(fHM3Long, fHM3Trans, "3^{rd} Moments");
+    MH::DrawSame(fHM3Long, fHM3Trans, "3^{rd} Moments");
 
     pad->cd(2);
Index: /trunk/MagicSoft/Mars/mimage/MHHillasSrc.cc
===================================================================
--- /trunk/MagicSoft/Mars/mimage/MHHillasSrc.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mimage/MHHillasSrc.cc	(revision 2414)
@@ -198,27 +198,34 @@
 // together with the canvas.
 //
-void MHHillasSrc::Draw(Option_t *)
-{
-    TVirtualPad *pad = gPad ? gPad : MakeDefCanvas(this);
+void MHHillasSrc::DrawTS(TVirtualPad *p, Option_t *)
+{
+    TVirtualPad *pad = p ? p : MakeDefCanvas(this);
     pad->SetBorderMode(0);
 
-    AppendPad("");
+    //
+    // Add this object to the given pad
+    //
+    MParContainer::DrawTS(pad);
 
     // FIXME: Display Source position
 
+    //
+    // Fill the pad with histograms
+    //
     pad->Divide(2, 2);
 
-    pad->cd(1);
-    gPad->SetBorderMode(0);
-    fAlpha->Draw();
-
-    pad->cd(2);
-    gPad->SetBorderMode(0);
-    fDist->Draw();
-
-    pad->cd(4);
-    gPad->SetBorderMode(0);
-    //gPad->SetLogy();
-    fCosDA->Draw();
+    p = pad->GetPad(1);
+    p->SetBorderMode(0);
+    MParContainer::DrawTS(fAlpha, p);
+
+    p = pad->GetPad(2);
+    p->SetBorderMode(0);
+    MParContainer::DrawTS(fDist, p);
+
+    delete pad->GetPad(3);
+
+    p = pad->GetPad(4);
+    p->SetBorderMode(0);
+    MParContainer::DrawTS(fCosDA, p);
 
     pad->Modified();
Index: /trunk/MagicSoft/Mars/mimage/MHHillasSrc.h
===================================================================
--- /trunk/MagicSoft/Mars/mimage/MHHillasSrc.h	(revision 2413)
+++ /trunk/MagicSoft/Mars/mimage/MHHillasSrc.h	(revision 2414)
@@ -35,5 +35,6 @@
     TH1F *GetHistCosDeltaAlpha() { return fCosDA; }
 
-    void Draw(Option_t *opt=NULL);
+    //void Draw(Option_t *opt=NULL);
+    void DrawTS(TVirtualPad *pad=NULL, Option_t *opt=NULL);
     void Paint(Option_t *opt);
 
Index: /trunk/MagicSoft/Mars/mimage/MHNewImagePar.cc
===================================================================
--- /trunk/MagicSoft/Mars/mimage/MHNewImagePar.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mimage/MHNewImagePar.cc	(revision 2414)
@@ -191,13 +191,13 @@
     TAxis &x = *fHistLeakage1.GetXaxis();
     x.SetRangeUser(0.0, x.GetXmax());
-    MH::Draw(fHistLeakage1, fHistLeakage2, "Leakage1 and Leakage2");
+    MH::DrawSame(fHistLeakage1, fHistLeakage2, "Leakage1 and Leakage2");
 
     pad->cd(2);
     gPad->SetBorderMode(0);
-    MH::Draw(fHistCorePix, fHistUsedPix, "Number of core/used Pixels");
+    MH::DrawSame(fHistCorePix, fHistUsedPix, "Number of core/used Pixels");
 
     pad->cd(3);
     gPad->SetBorderMode(0);
-    MH::Draw(fHistConc1, fHistConc, "Concentrations");
+    MH::DrawSame(fHistConc1, fHistConc, "Concentrations");
 
     pad->cd(4);
Index: /trunk/MagicSoft/Mars/mraw/MRawEvtData.cc
===================================================================
--- /trunk/MagicSoft/Mars/mraw/MRawEvtData.cc	(revision 2413)
+++ /trunk/MagicSoft/Mars/mraw/MRawEvtData.cc	(revision 2414)
@@ -215,9 +215,17 @@
 //     <index>      The pixel with the given index is drawn
 //
-void MRawEvtData::Draw(Option_t *opt)
+// Rem: DrawTS is the thread-safe version of Draw. In most cases
+//      you can use Draw instead
+//
+void MRawEvtData::DrawTS(TVirtualPad *pad=NULL, Option_t *opt="")
 {
     if (GetNumPixels()==0)
     {
         *fLog << warn << "Sorry, no pixel to draw!" << endl;
+        return;
+    }
+    if (!pad)
+    {
+        *fLog << warn << "MRawEvtData::DrawTS - No pad available..." << endl;
         return;
     }
@@ -238,5 +246,5 @@
     if (!pix.Jump(id))
     {
-        *fLog << warn << "Pixel Idx #" << id << " doesn't exist!" << endl;
+        *fLog << warn << "Pixel Idx #" << dec << id << " doesn't exist!" << endl;
         return;
     }
@@ -255,5 +263,5 @@
     if (str.BeginsWith("graph"))
     {
-        *fLog << inf << "Drawing Graph: Pixel Idx #" << pix.GetPixelId();
+        *fLog << inf << "Drawing Graph: Pixel Idx #" << dec << pix.GetPixelId();
         *fLog << " of " << (int)GetNumPixels() << "Pixels" << endl;
 
@@ -267,5 +275,5 @@
 
         graphhi->SetBit(kCanDelete);
-        graphhi->Draw(same ? "C*" : "AC*");
+        MParContainer::DrawTS(graphhi, pad, same ? "C*" : "AC*");
 
         TH1F *histhi = graphhi->GetHistogram();
@@ -286,5 +294,5 @@
 
             graphlo->SetBit(kCanDelete);
-            graphlo->Draw("C*");
+            MParContainer::DrawTS(graphlo, pad, "C*");
 
             TH1F *histlo = graphlo->GetHistogram();
@@ -300,5 +308,6 @@
     {
         // FIXME: Add Legend
-        *fLog << inf << "Drawing Histogram of Pixel with Idx #" << pix.GetPixelId() << endl;
+        *fLog << inf << "Drawing Histogram of Pixel with Idx #";
+        *fLog << dec << pix.GetPixelId() << endl;
 
         TH1F *histh = new TH1F(name, "FADC Samples", nh, -0.5, nh-.5);
@@ -309,5 +318,5 @@
             histh->Fill(i, higains[i]);
         histh->SetBit(kCanDelete);
-        histh->Draw(same ? "same" : "");
+        MParContainer::DrawTS(histh, pad, same ? "same" : "");
 
         if (nl>0)
@@ -319,5 +328,5 @@
                 histl->Fill(i, logains[i]);
             histl->SetBit(kCanDelete);
-            histl->Draw("same");
+            MParContainer::DrawTS(histl, pad, "same");
         }
         return;
@@ -516,2 +525,21 @@
     return kTRUE;
 }
+
+void MRawEvtData::Copy(TObject &named)
+#if ROOT_VERSION_CODE > ROOT_VERSION(3,04,01)
+const
+#endif
+{
+    MRawEvtData &evt = (MRawEvtData &)named;
+
+    *evt.fHiGainPixId = *fHiGainPixId;
+    *evt.fLoGainPixId = *fLoGainPixId;
+
+    *evt.fHiGainFadcSamples = *fHiGainFadcSamples;
+    *evt.fLoGainFadcSamples = *fLoGainFadcSamples;
+
+    evt.fPosInArray      = fPosInArray;
+    evt.fConnectedPixels = fConnectedPixels;
+    evt.fArraySize       = fArraySize;
+}
+
Index: /trunk/MagicSoft/Mars/mraw/MRawEvtData.h
===================================================================
--- /trunk/MagicSoft/Mars/mraw/MRawEvtData.h	(revision 2413)
+++ /trunk/MagicSoft/Mars/mraw/MRawEvtData.h	(revision 2414)
@@ -24,9 +24,9 @@
     // FIXME: COMMENT ABOUT ORDERING
 
-    MArrayS *fHiGainPixId;        // list of pixel IDs of hi gain channel
-    MArrayB *fHiGainFadcSamples;  // list of hi gain samples of all pixels (ordering: see fHiGainPixId)
+    MArrayS *fHiGainPixId;        //-> list of pixel IDs of hi gain channel
+    MArrayB *fHiGainFadcSamples;  //-> list of hi gain samples of all pixels (ordering: see fHiGainPixId)
 
-    MArrayS *fLoGainPixId;        // list of pixel IDs of lo gain channel
-    MArrayB *fLoGainFadcSamples;  // list of lo gain samples of all pixels (ordering: see fLoGainPixId)
+    MArrayS *fLoGainPixId;        //-> list of pixel IDs of lo gain channel
+    MArrayB *fLoGainFadcSamples;  //-> list of lo gain samples of all pixels (ordering: see fLoGainPixId)
 
     Int_t fPosInArray;        //!
@@ -52,5 +52,10 @@
     void Clear(Option_t * = NULL);
     void Print(Option_t * = NULL) const;
-    void Draw (Option_t * = NULL);
+    void DrawTS(TVirtualPad *pad=NULL, Option_t *option="");
+    void Copy(TObject &named)
+#if ROOT_VERSION_CODE > ROOT_VERSION(3,04,01)
+const
+#endif
+        ;
 
     void DeletePixels(Bool_t flag=kFALSE);
@@ -65,9 +70,10 @@
 
     Bool_t GetPixelContent(Double_t &val, Int_t idx, const MGeomCam &cam, Int_t type=0) const;
-    void   DrawPixelContent(Int_t num) const
+    void   DrawPixelContent(Int_t num, TVirtualPad *pad=NULL) const
     {
         TString s("HIST");
         s += num;
-        const_cast<MRawEvtData*>(this)->Draw(s);
+        const_cast<MRawEvtData*>(this)->DrawTS(pad, s);
+        //const_cast<MRawEvtData*>(this)->Draw(s);
     }
 
