diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index cc37b2131566ad1ad39afcba3311f66532298154..ee2d9940b8c54809269dc40db77a91ff929389a3 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -141,18 +141,18 @@ public:
       cout << "removing em. particle..." << endl;
       fEmEnergy += p.GetEnergy();
       fEmCount += 1;
-      p.Delete();
+      // p.Delete();
       ret = EProcessReturn::eParticleAbsorbed;
     } else if (isInvisible(pid)) {
       cout << "removing inv. particle..." << endl;
       fInvEnergy += p.GetEnergy();
       fInvCount += 1;
-      p.Delete();
+      // p.Delete();
       ret = EProcessReturn::eParticleAbsorbed;
     } else if (isBelowEnergyCut(p)) {
       cout << "removing low en. particle..." << endl;
       fEnergy += p.GetEnergy();
-      p.Delete();
+      // p.Delete();
       ret = EProcessReturn::eParticleAbsorbed;
     }
     return ret;
diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h
index 31c16e2eab8164db2598c9149409cd5dc7900f76..51d7099500a4606ad818e91c6437c6872a6b9e8c 100644
--- a/Framework/Cascade/Cascade.h
+++ b/Framework/Cascade/Cascade.h
@@ -119,7 +119,10 @@ namespace corsika::cascade {
           fProcessSequence.DoContinuous(particle, step, fStack);
 
       if (status == corsika::process::EProcessReturn::eParticleAbsorbed) {
-        // fStack.Delete(particle); // TODO: check if this is really needed
+        std::cout << "Cascade: delete absorbed particle " << particle.GetPID() << " "
+                  << particle.GetEnergy() / 1_GeV << "GeV" << std::endl;
+        particle.Delete();
+        return;
       } else {
 
         std::cout << "sth. happening before geometric limit ?"
diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc
index 80ebf4b21b1999754a2ccf2d244e4dfd7e5e0b4f..081325f96038dc8c733f4599603e0ee97a22d04f 100644
--- a/Framework/Cascade/testCascade.cc
+++ b/Framework/Cascade/testCascade.cc
@@ -80,7 +80,7 @@ public:
   }
 
   template <typename Particle, typename T, typename Stack>
-  void DoContinuous(Particle& p, T&, Stack& s) const {
+  EProcessReturn DoContinuous(Particle& p, T&, Stack& s) const {
     EnergyType E = p.GetEnergy();
     if (E < 85_MeV) {
       p.Delete();
@@ -95,6 +95,7 @@ public:
       pnew.SetPosition(p.GetPosition());
       pnew.SetMomentum(p.GetMomentum());
     }
+    return EProcessReturn::eOk;
   }
 
   void Init() { fCount = 0; }
diff --git a/Framework/ProcessSequence/ProcessReturn.h b/Framework/ProcessSequence/ProcessReturn.h
index ae4869ea84ba228e1b59b2fe89778f2e932efc25..215994b42fb74daaba3b382513d94e50a45d430b 100644
--- a/Framework/ProcessSequence/ProcessReturn.h
+++ b/Framework/ProcessSequence/ProcessReturn.h
@@ -20,13 +20,25 @@ namespace corsika::process {
      that can be accumulated easily with "|="
    */
 
-  enum class EProcessReturn {
-    eOk = 1,
-    eParticleAbsorbed = 2,
-    eInteracted = 3,
-    eDecayed = 4,
+  enum class EProcessReturn : int {
+    eOk = (1 << 0),
+    eParticleAbsorbed = (1 << 2),
+    eInteracted = (1 << 3),
+    eDecayed = (1 << 4),
   };
 
+  inline EProcessReturn operator|(EProcessReturn a, EProcessReturn b) {
+    return static_cast<EProcessReturn>(static_cast<int>(a) | static_cast<int>(b));
+  }
+
+  inline EProcessReturn& operator|=(EProcessReturn& a, EProcessReturn b) {
+    return a = a | b;
+  }
+
+  inline bool operator==(EProcessReturn a, EProcessReturn b) {
+    return (static_cast<int>(a) & static_cast<int>(b)) != 0;
+  }
+
 } // namespace corsika::process
 
 #endif
diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h
index a1b92b0e3f9c27dd896012a16b56d0e063c3954f..bc4bf679e4c92bf5d5dc60188ecb3404eef05a35 100644
--- a/Framework/ProcessSequence/ProcessSequence.h
+++ b/Framework/ProcessSequence/ProcessSequence.h
@@ -60,11 +60,11 @@ namespace corsika::process {
       EProcessReturn ret = EProcessReturn::eOk;
       if constexpr (std::is_base_of<ContinuousProcess<T1>, T1>::value ||
                     is_process_sequence<T1>::value) {
-        A.DoContinuous(p, t, s);
+        ret |= A.DoContinuous(p, t, s);
       }
       if constexpr (std::is_base_of<ContinuousProcess<T2>, T2>::value ||
                     is_process_sequence<T2>::value) {
-        B.DoContinuous(p, t, s);
+        ret |= B.DoContinuous(p, t, s);
       }
       return ret;
     }