diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index 66b1aa0b7f51dd51e0e6eff8790b86f448d59913..269ee60c372e79b471510601fd8d8459e06946f8 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -274,7 +274,7 @@ int main() {
 
   // setup processes, decays and interactions
   tracking_line::TrackingLine tracking;
-  stack_inspector::StackInspector<setup::Stack> stackInspect(true);
+  stack_inspector::StackInspector<setup::Stack> stackInspect(1, true);
 
   const std::vector<particles::Code> trackedHadrons = {
       particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc
index 3f95c7a3a63fa6766dd6ed2e26bc5a38e2640a44..89fd65ef42150149a9c0ffbd7183fed865ba659d 100644
--- a/Framework/Cascade/testCascade.cc
+++ b/Framework/Cascade/testCascade.cc
@@ -138,7 +138,7 @@ TEST_CASE("Cascade", "[Cascade]") {
   auto env = MakeDummyEnv();
   tracking_line::TrackingLine tracking;
 
-  stack_inspector::StackInspector<TestCascadeStack> stackInspect(true);
+  stack_inspector::StackInspector<TestCascadeStack> stackInspect(1, true);
   null_model::NullModel nullModel;
 
   const GrammageType X0 = 20_g / square(1_cm);
diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h
index ee154d8ae2810c35aa7b12b4c8ba25162504e3de..3bd759c04a97e55360c87473cc4457159bd967fa 100644
--- a/Framework/ProcessSequence/ProcessSequence.h
+++ b/Framework/ProcessSequence/ProcessSequence.h
@@ -119,16 +119,29 @@ namespace corsika::process {
       return ret;
     }
 
+    bool CheckStep() {
+      bool ret = false;
+      if constexpr (std::is_base_of<StackProcess<T1type>, T1type>::value ||
+                    is_process_sequence<T1>::value) {
+        ret |= A.CheckStep();
+      }
+      if constexpr (std::is_base_of<StackProcess<T2type>, T2type>::value ||
+                    is_process_sequence<T2>::value) {
+        ret |= B.CheckStep();
+      }
+      return ret;
+    }
+
     template <typename TStack>
     EProcessReturn DoStack(TStack& vS) {
       EProcessReturn ret = EProcessReturn::eOk;
       if constexpr (std::is_base_of<StackProcess<T1type>, T1type>::value ||
                     is_process_sequence<T1>::value) {
-        ret |= A.DoStack(vS);
+        if (A.CheckStep()) { ret |= A.DoStack(vS); }
       }
       if constexpr (std::is_base_of<StackProcess<T2type>, T2type>::value ||
                     is_process_sequence<T2>::value) {
-        ret |= B.DoStack(vS);
+        if (B.CheckStep()) { ret |= B.DoStack(vS); }
       }
       return ret;
     }
diff --git a/Framework/ProcessSequence/StackProcess.h b/Framework/ProcessSequence/StackProcess.h
index 0b8775d716154d97bf6e7bea646fcbbae52fdcdd..1458fa75ca5938cdd42d50d0b4d22af46f641302 100644
--- a/Framework/ProcessSequence/StackProcess.h
+++ b/Framework/ProcessSequence/StackProcess.h
@@ -28,7 +28,12 @@ namespace corsika::process {
    */
 
   template <typename derived>
-  struct StackProcess {
+  class StackProcess {
+
+  public:
+    StackProcess() = delete;
+    StackProcess(const unsigned int nStep)
+        : fNStep(nStep) {}
 
     derived& GetRef() { return static_cast<derived&>(*this); }
     const derived& GetRef() const { return static_cast<const derived&>(*this); }
@@ -37,6 +42,19 @@ namespace corsika::process {
     // -> enforce derived to implement DoStack...
     template <typename TStack>
     inline EProcessReturn DoStack(TStack&);
+
+    bool CheckStep() { return !((++fIStep) % fNStep); }
+
+  private:
+    /**
+       @name The number of "steps" during the cascade processing after
+       which this StackProcess is going to be executed. The logic is
+       "fIStep modulo fNStep"
+       @{
+     */
+    unsigned int fNStep = 0;
+    unsigned long int fIStep = 0;
+    //! @}
   };
 
   // overwrite the default trait class, to mark BaseProcess<T> as useful process
diff --git a/Framework/ProcessSequence/testProcessSequence.cc b/Framework/ProcessSequence/testProcessSequence.cc
index 583c6a1ad1a73135b362e5a2870407f89683f772..aa78ee89c4c012eb2df3d322b6b1ddf6fa44ba1e 100644
--- a/Framework/ProcessSequence/testProcessSequence.cc
+++ b/Framework/ProcessSequence/testProcessSequence.cc
@@ -174,6 +174,21 @@ public:
   }
 };
 
+class Stack1 : public StackProcess<Stack1> {
+  int fCount = 0;
+
+public:
+  Stack1(const int n)
+      : StackProcess(n) {}
+  template <typename TStack>
+  EProcessReturn DoStack(TStack&) {
+    fCount++;
+    return EProcessReturn::eOk;
+  }
+  int GetCount() const { return fCount; }
+};
+
+struct DummyStack {};
 struct DummyData {
   double p[nData] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 };
@@ -257,4 +272,24 @@ TEST_CASE("Process Sequence", "[Process Sequence]") {
     }
     cout << "done" << endl;
   }
+
+  SECTION("StackProcess") {
+
+    ContinuousProcess1 cp1(0);
+    ContinuousProcess2 cp2(3);
+    Process2 m2(1);
+    Process3 m3(2);
+    Stack1 s1(1);
+    Stack1 s2(2);
+
+    auto sequence = s1 << s2;
+
+    DummyStack stack;
+
+    const int nLoop = 20;
+    for (int i = 0; i < nLoop; ++i) { sequence.DoStack(stack); }
+
+    CHECK(s1.GetCount() == 20);
+    CHECK(s2.GetCount() == 10);
+  }
 }
diff --git a/Processes/StackInspector/StackInspector.cc b/Processes/StackInspector/StackInspector.cc
index f192926ca73fa2032d05204a80a9250317504f9b..6917b123968a14333f1f61f8db9fa3afe8804a20 100644
--- a/Processes/StackInspector/StackInspector.cc
+++ b/Processes/StackInspector/StackInspector.cc
@@ -28,8 +28,9 @@ using namespace corsika::units::si;
 using namespace corsika::process::stack_inspector;
 
 template <typename Stack>
-StackInspector<Stack>::StackInspector(const bool aReport)
-    : fReport(aReport)
+StackInspector<Stack>::StackInspector(const int nStep, const bool aReport)
+    : StackProcess<StackInspector<Stack>>(nStep)
+    , fReport(aReport)
     , fCountStep(0) {}
 
 template <typename Stack>
diff --git a/Processes/StackInspector/StackInspector.h b/Processes/StackInspector/StackInspector.h
index 4674a591bd1a0ecec1adf5cf80030dd8d79b91a8..6eb70c7093729f3dfea8c6091b2abbf1154ea7d8 100644
--- a/Processes/StackInspector/StackInspector.h
+++ b/Processes/StackInspector/StackInspector.h
@@ -26,7 +26,7 @@ namespace corsika::process {
       typedef typename Stack::ParticleType Particle;
 
     public:
-      StackInspector(const bool aReport);
+      StackInspector(const int nStep, const bool aReport);
       ~StackInspector();
 
       void Init();
diff --git a/Processes/StackInspector/testStackInspector.cc b/Processes/StackInspector/testStackInspector.cc
index d1cc10739c09102d7138a69ba06528fa503ea81b..832bea00a8074214ef9f3a235a6a574f7286cf02 100644
--- a/Processes/StackInspector/testStackInspector.cc
+++ b/Processes/StackInspector/testStackInspector.cc
@@ -50,7 +50,7 @@ TEST_CASE("StackInspector", "[processes]") {
 
   SECTION("interface") {
 
-    StackInspector<TestCascadeStack> model(true);
+    StackInspector<TestCascadeStack> model(1, true);
 
     model.Init();
     [[maybe_unused]] const process::EProcessReturn ret = model.DoStack(stack);