Index: trunk/MagicSoft/Mars/mbase/MAGIC.h
===================================================================
--- trunk/MagicSoft/Mars/mbase/MAGIC.h	(revision 1117)
+++ trunk/MagicSoft/Mars/mbase/MAGIC.h	(revision 1118)
@@ -17,4 +17,5 @@
 //
 const Int_t kCONTINUE = 2;
+const Int_t kSKIP     = 2;
 
 //
Index: trunk/MagicSoft/Mars/mbase/MTask.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MTask.cc	(revision 1117)
+++ trunk/MagicSoft/Mars/mbase/MTask.cc	(revision 1118)
@@ -138,9 +138,21 @@
     fNumExecutions = 0;
 
-    if (!PreProcess(plist))
+    switch (PreProcess(plist))
+    {
+    case kFALSE:
         return kFALSE;
 
-    fIsPreprocessed = kTRUE;
-    return kTRUE;
+    case kTRUE:
+        fIsPreprocessed = kTRUE;
+        return kTRUE;
+
+    case kSKIP:
+        return kSKIP;
+    }
+
+    *fLog << err << dbginf << "PreProcess of " << GetDescriptor();
+    *fLog << " returned an unknown value... aborting." << endl;
+
+    return kFALSE;
 }
 
Index: trunk/MagicSoft/Mars/mbase/MTaskList.cc
===================================================================
--- trunk/MagicSoft/Mars/mbase/MTaskList.cc	(revision 1117)
+++ trunk/MagicSoft/Mars/mbase/MTaskList.cc	(revision 1118)
@@ -245,4 +245,17 @@
 // --------------------------------------------------------------------------
 //
+//  removes a task from the list (used in PreProcess).
+//  if kIsOwner is set the task is deleted. (see SetOwner())
+//
+void MTaskList::Remove(MTask *task)
+{
+    TObject *obj = fTasks->Remove(task);
+
+    if (TestBit(kIsOwner))
+        delete obj;
+}
+
+// --------------------------------------------------------------------------
+//
 //  do pre processing (before eventloop) of all tasks in the task-list
 //
@@ -267,6 +280,20 @@
         *fLog << all << task->GetName() << "... " << flush;
 
-        if (!task->CallPreProcess(fParList))
+        switch (task->CallPreProcess(fParList))
+        {
+        case kFALSE:
             return kFALSE;
+
+        case kTRUE:
+            continue;
+
+        case kSKIP:
+            Remove(task);
+            continue;
+        }
+
+        *fLog << err << dbginf << "PreProcess of " << task->GetDescriptor();
+        *fLog << " returned an unknown value... aborting." << endl;
+        return kFALSE;
     }
 
