diff --git a/DDG4/include/DDG4/Geant4Kernel.h b/DDG4/include/DDG4/Geant4Kernel.h
index 7495aade654915bf35e74c12a3e7c9d989bef3d8..761cfddda905f4de71d0edc7f4108eaddf465cc9 100644
--- a/DDG4/include/DDG4/Geant4Kernel.h
+++ b/DDG4/include/DDG4/Geant4Kernel.h
@@ -20,6 +20,13 @@
 #include <map>
 #include <typeinfo>
 
+class DD4hep_End_Of_File : public std::exception {
+public:
+  DD4hep_End_Of_File() : std::exception() {}
+  virtual const char* what() const noexcept { return "Reached end of input file"; }
+
+};
+
 // Forward declarations
 class G4RunManager;
 class G4UIdirectory;
diff --git a/DDG4/src/Geant4GeneratorAction.cpp b/DDG4/src/Geant4GeneratorAction.cpp
index da144575fd6e95c6f96a3d138f5f12687f2e6288..1d9cfce8c92c28328baf5239af39bc670dcab7cf 100644
--- a/DDG4/src/Geant4GeneratorAction.cpp
+++ b/DDG4/src/Geant4GeneratorAction.cpp
@@ -14,6 +14,7 @@
 // Framework include files
 #include "DD4hep/InstanceCount.h"
 #include "DDG4/Geant4GeneratorAction.h"
+#include "DDG4/Geant4Kernel.h"
 // Geant4 headers
 #include "G4Threading.hh"
 #include "G4AutoLock.hh"
diff --git a/DDG4/src/Geant4InputAction.cpp b/DDG4/src/Geant4InputAction.cpp
index ae451357fa329f6258a9aebeae58dc6c8c0c3d8a..537696bf90cfd03fb1bb090a991fd7d1372c5cef 100644
--- a/DDG4/src/Geant4InputAction.cpp
+++ b/DDG4/src/Geant4InputAction.cpp
@@ -17,6 +17,7 @@
 #include "DD4hep/Plugins.h"
 #include "DDG4/Geant4Primary.h"
 #include "DDG4/Geant4Context.h"
+#include "DDG4/Geant4Kernel.h"
 #include "DDG4/Geant4InputAction.h"
 
 #include "G4Event.hh"
@@ -174,6 +175,14 @@ int Geant4InputAction::readParticles(int evt_number,
     }
   }
   int status = m_reader->moveToEvent(evid);
+  if(status == Geant4EventReader::EVENT_READER_EOF ) {
+    long nEvents = context()->kernel().property("NumEvents").value<long>();
+    if(nEvents < 0) {
+      //context()->kernel().runManager().AbortRun(true);
+      throw DD4hep_End_Of_File();
+    }
+  }
+
   if ( Geant4EventReader::EVENT_READER_OK != status )  {
     string msg = issue(evid)+"Error when moving to event - ";
     if ( status == Geant4EventReader::EVENT_READER_EOF ) msg += " EOF: [end of file].";
@@ -187,6 +196,13 @@ int Geant4InputAction::readParticles(int evt_number,
     return status;
   }
   status = m_reader->readParticles(evid, vertices, particles);
+  if(status == Geant4EventReader::EVENT_READER_EOF ) {
+    long nEvents = context()->kernel().property("NumEvents").value<long>();
+    if(nEvents < 0) {
+      //context()->kernel().runManager().AbortRun(true);
+      throw DD4hep_End_Of_File();
+    }
+  }
 
 
   if ( Geant4EventReader::EVENT_READER_OK != status )  {
diff --git a/DDG4/src/Geant4UIManager.cpp b/DDG4/src/Geant4UIManager.cpp
index 078c5ba61ddd734f3d2d974eb40fceed4ba50f40..b27b4732626e950de13b58644d3d9bf8179dea20 100644
--- a/DDG4/src/Geant4UIManager.cpp
+++ b/DDG4/src/Geant4UIManager.cpp
@@ -140,8 +140,14 @@ void Geant4UIManager::start() {
 
   // No UI. Pure batch mode: Simply execute requested number of events
   long numEvent = context()->kernel().property("NumEvents").value<long>();
+  if(numEvent < 0) numEvent = std::numeric_limits<int>::max();
   printout(INFO,"Geant4UIManager","++ Start run with %d events.",numEvent);
-  context()->kernel().runManager().BeamOn(numEvent);
+  try {
+    context()->kernel().runManager().BeamOn(numEvent);
+  } catch (DD4hep_End_Of_File& e) {
+    printout(INFO,"Geant4UIManager","++ End of file reached, ending run...");
+    context()->kernel().runManager().RunTermination();
+  }
 }
 
 /// Stop and release resources