Index: /trunk/FACT++/src/EventBuilder.cc
===================================================================
--- /trunk/FACT++/src/EventBuilder.cc	(revision 17657)
+++ /trunk/FACT++/src/EventBuilder.cc	(revision 17658)
@@ -850,4 +850,7 @@
         return true;
 
+    // If we will have a software trigger which prevents single events from writing,
+    // the logic of writing the stop time and the trigger counters need to be adapted.
+    // Currently it is just the values of the last valid event.
     bool rc1 = true;
     if (evt->valid())
@@ -896,4 +899,7 @@
 bool procEvt(const shared_ptr<EVT_CTRL2> &evt)
 {
+    RUN_CTRL2 &run = *evt->runCtrl;
+
+    bool check = true;
     if (evt->valid())
     {
@@ -915,42 +921,48 @@
             event->BoardTime[ib] = evt->FADhead[ib].time;
 
-        RUN_CTRL2 &run = *evt->runCtrl;
-
-        // Physics trigger
-        if (evt->trgTyp && !(evt->trgTyp & FAD::EventHeader::kAll))
-            run.triggerCounter[0]++;
-        // Pure pedestal trigger
-        else  if ((evt->trgTyp&FAD::EventHeader::kPedestal) && !(evt->trgTyp&FAD::EventHeader::kTIM))
-            run.triggerCounter[1]++;
-        // external light pulser trigger
-        else if (evt->trgTyp & FAD::EventHeader::kLPext)
-            run.triggerCounter[2]++;
-        // time calibration triggers
-        else if (evt->trgTyp & (FAD::EventHeader::kTIM|FAD::EventHeader::kPedestal))
-            run.triggerCounter[3]++;
-        // internal light pulser trigger
-        else if (evt->trgTyp & FAD::EventHeader::kLPint)
-            run.triggerCounter[4]++;
-        // external trigger input 1
-        else if (evt->trgTyp & FAD::EventHeader::kExt1)
-            run.triggerCounter[5]++;
-        // external trigger input 2
-        else if (evt->trgTyp & FAD::EventHeader::kExt2)
-            run.triggerCounter[6]++;
-        // other triggers
-        else
-            run.triggerCounter[7]++;
-
-        evt->triggerCounter = run.triggerCounter;
-
-        if (!eventCheck(*evt))
-        {
-            secondaryQueue.emplace(new EVT_CTRL2(kRequestEventCheckFailed, evt->runCtrl));
-            return true;
-        }
-    }
-
-    // If file is open post the event for being written
-    secondaryQueue.post(evt);
+        check = eventCheck(*evt);
+
+        // If the event is valid, increase the trigger counter accordingly
+        if (check)
+        {
+            // Physics trigger
+            if (evt->trgTyp && !(evt->trgTyp & FAD::EventHeader::kAll))
+                run.triggerCounter[0]++;
+            // Pure pedestal trigger
+            else  if ((evt->trgTyp&FAD::EventHeader::kPedestal) && !(evt->trgTyp&FAD::EventHeader::kTIM))
+                run.triggerCounter[1]++;
+            // external light pulser trigger
+            else if (evt->trgTyp & FAD::EventHeader::kLPext)
+                run.triggerCounter[2]++;
+            // time calibration triggers
+            else if (evt->trgTyp & (FAD::EventHeader::kTIM|FAD::EventHeader::kPedestal))
+                run.triggerCounter[3]++;
+            // internal light pulser trigger
+            else if (evt->trgTyp & FAD::EventHeader::kLPint)
+                run.triggerCounter[4]++;
+            // external trigger input 1
+            else if (evt->trgTyp & FAD::EventHeader::kExt1)
+                run.triggerCounter[5]++;
+            // external trigger input 2
+            else if (evt->trgTyp & FAD::EventHeader::kExt2)
+                run.triggerCounter[6]++;
+            // other triggers
+            else
+                run.triggerCounter[7]++;
+        }
+    }
+
+    // If this is an invalid event, the current triggerCounter needs to be copied
+    // because runClose will use that one to update the TRIGGER_COUNTER.
+    // When closing the file, the trigger counter of the last successfully
+    // written event is used.
+    evt->triggerCounter = run.triggerCounter;
+
+    // If event check has failed, skip the event and post a close request instead.
+    // Otherwise, if file is open post the event for being written
+    if (!check)
+        secondaryQueue.emplace(new EVT_CTRL2(kRequestEventCheckFailed, evt->runCtrl));
+    else
+        secondaryQueue.post(evt);
 
     return true;
Index: /trunk/FACT++/src/EventBuilder.h
===================================================================
--- /trunk/FACT++/src/EventBuilder.h	(revision 17657)
+++ /trunk/FACT++/src/EventBuilder.h	(revision 17658)
@@ -74,5 +74,5 @@
     FileStatus_t fileStat;
 
-    std::array<uint32_t, 8> triggerCounter;
+    std::array<uint32_t, 8> triggerCounter;  // triggerCounter must only be manipulated in procEvt to keep it thread safe
 
     std::shared_ptr<DrsCalibration> calib;
@@ -134,5 +134,5 @@
     int closeRequest;
 
-    std::array<uint32_t, 8> triggerCounter;
+    std::array<uint32_t, 8> triggerCounter;  // triggerCounter must only be manipulated in procEvt to keep it thread safe
 
     std::shared_ptr<RUN_CTRL2> runCtrl;
