diff --git a/corsika/detail/framework/core/Cascade.inl b/corsika/detail/framework/core/Cascade.inl
index 82b6887a3edcf18ff4f2044adc0c1d33efb9f9fe..bcbcf45ec67fba9e4e9fe40cdf4502a3242b9313 100644
--- a/corsika/detail/framework/core/Cascade.inl
+++ b/corsika/detail/framework/core/Cascade.inl
@@ -35,6 +35,10 @@ namespace corsika {
 
   template <typename TTracking, typename TProcessList, typename TOutput, typename TStack>
   inline void Cascade<TTracking, TProcessList, TOutput, TStack>::run() {
+
+    // trigger the start of the outputs for this shower
+    output.startOfShower();
+
     setNodes(); // put each particle on stack in correct environment volume
 
     while (!stack_.isEmpty()) {
@@ -60,6 +64,9 @@ namespace corsika {
       // thus, the double loop
       sequence_.doCascadeEquations(stack_);
     }
+
+    // indicate end of shower
+    output.endOfShower();
   }
 
   template <typename TTracking, typename TProcessList, typename TOutput, typename TStack>
diff --git a/corsika/detail/output/OutputManager.inl b/corsika/detail/output/OutputManager.inl
index 1b19136cc868b0e4d5e70235d2b1b59355fa30a4..47c5169a8ea0f4ddf41d9deecc318f27a3e5c32b 100644
--- a/corsika/detail/output/OutputManager.inl
+++ b/corsika/detail/output/OutputManager.inl
@@ -46,6 +46,15 @@ namespace corsika {
 
   template <typename TOutput>
   inline void OutputManager::add(std::string const& name, TOutput& output) {
+
+    if (state_ == OutputState::NoInit) {
+      // if "add" is called after the ouptput has started, this is an ERROR.
+      CORSIKA_LOGGER_ERROR(
+          logger_, "Cannot add more outputs to OutputManager after output was started.");
+      throw std::runtime_error(
+          "Cannot add more outputs to OutputManager after output was started.");
+    }
+
     // check if that name is already in the map
     if (outputs_.count(name) > 0) {
       CORSIKA_LOGGER_ERROR(
diff --git a/examples/boundary_example.cpp b/examples/boundary_example.cpp
index 8402dcd95ec2b2e9fbb90593cbdaf90bf17e885b..bffda918f64b3fc7ef79193f6470f9d104f9e711 100644
--- a/examples/boundary_example.cpp
+++ b/examples/boundary_example.cpp
@@ -166,11 +166,9 @@ int main() {
   // define air shower object, run simulation
   Cascade EAS(env, tracking, sequence, output, stack);
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   CORSIKA_LOG_INFO("Done");
-
-  output.endOfLibrary();
 }
diff --git a/examples/cascade_example.cpp b/examples/cascade_example.cpp
index 4a33fba5047efc32ad294f501ab6392e35bac382..b43428ae50e482f0760b4bb133bc0cd4fbfa1c14 100644
--- a/examples/cascade_example.cpp
+++ b/examples/cascade_example.cpp
@@ -155,9 +155,9 @@ int main() {
   // define air shower object, run simulation
   Cascade EAS(env, tracking, sequence, output, stack);
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   const HEPEnergyType Efinal = dEdX.getEnergyLost();
   CORSIKA_LOG_INFO(
@@ -168,6 +168,4 @@ int main() {
       "relative difference (%): {}\n",
       Efinal / 1_GeV, (Efinal / E0 - 1) * 100, dEdX.getEnergyLost() / 1_GeV,
       dEdX.getEnergyLost() / E0 * 100);
-
-  output.endOfLibrary();
 }
diff --git a/examples/cascade_proton_example.cpp b/examples/cascade_proton_example.cpp
index 3d878acd6c70fcac937e0352927b274198d6c269..7f41162b2feaf3efa785711697d17243a0e6ca89 100644
--- a/examples/cascade_proton_example.cpp
+++ b/examples/cascade_proton_example.cpp
@@ -147,11 +147,9 @@ int main() {
 
   // define air shower object, run simulation
   Cascade EAS(env, tracking, sequence, output, stack);
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   CORSIKA_LOG_INFO("Done");
-
-  output.endOfLibrary();
 }
diff --git a/examples/corsika.cpp b/examples/corsika.cpp
index 392f7cd22eaed92a536ac4a271fa1d54491a2c7f..ffda4726879bea8baeb3b1b319dc49d842c851b9 100644
--- a/examples/corsika.cpp
+++ b/examples/corsika.cpp
@@ -380,9 +380,6 @@ int main(int argc, char** argv) {
 
     CORSIKA_LOG_INFO("Shower {} / {} ", i_shower, nevent);
 
-    // trigger the start of the outputs for this shower
-    output.startOfShower();
-
     // directory for outputs
     string const outdir(app["--filename"]->as<std::string>());
     string const labHist_file = outdir + "/inthist_lab_" + to_string(i_shower) + ".npz";
@@ -420,7 +417,6 @@ int main(int argc, char** argv) {
 
     save_hist(hists.labHist(), labHist_file, true);
     save_hist(hists.CMSHist(), cMSHist_file, true);
-    output.endOfShower();
   }
 
   // and finalize the output on disk
diff --git a/examples/em_shower.cpp b/examples/em_shower.cpp
index 979960925281396c0fd98ceaf092be5791ffe74e..cdd171e5ebd47ab276a95c875c5d305893ef2fd5 100644
--- a/examples/em_shower.cpp
+++ b/examples/em_shower.cpp
@@ -183,9 +183,9 @@ int main(int argc, char** argv) {
   //  EAS.setNodes();
   //  EAS.forceInteraction();
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   HEPEnergyType const Efinal = dEdX.getEnergyLost() + observationLevel.getEnergyGround();
 
@@ -193,6 +193,4 @@ int main(int argc, char** argv) {
       "total energy budget (GeV): {}, "
       "relative difference (%): {}",
       Efinal / 1_GeV, (Efinal / E0 - 1) * 100);
-
-  output.endOfLibrary();
 }
diff --git a/examples/hybrid_MC.cpp b/examples/hybrid_MC.cpp
index eaf4f9881dbf1958f083fc53c8dd12421580b0e4..4e695063468ad88ca2159c0642f57eb54117eced 100644
--- a/examples/hybrid_MC.cpp
+++ b/examples/hybrid_MC.cpp
@@ -316,9 +316,9 @@ int main(int argc, char** argv) {
   //  EAS.SetNodes();
   //  EAS.forceInteraction();
 
-  output.startOfShower();
+  output.startOfLibrary();
   EAS.run();
-  output.endOfShower();
+  output.endOfLibrary();
 
   const HEPEnergyType Efinal = dEdX.getEnergyLost() + observationLevel.getEnergyGround();
   CORSIKA_LOG_INFO(
@@ -332,7 +332,5 @@ int main(int argc, char** argv) {
   save_hist(hists.labHist(), "inthist_lab_hybrid.npz", true);
   save_hist(hists.CMSHist(), "inthist_cms_hybrid.npz", true);
 
-  output.endOfLibrary();
-
   CORSIKA_LOG_INFO("done");
 }