diff --git a/corsika/detail/framework/process/ProcessSequence.inl b/corsika/detail/framework/process/ProcessSequence.inl
index 9a9cc4d4f00f96a451f403262b87a501ce317552..1240e6c4e60520a16b2ca4316c4da87f3001cd28 100644
--- a/corsika/detail/framework/process/ProcessSequence.inl
+++ b/corsika/detail/framework/process/ProcessSequence.inl
@@ -121,7 +121,9 @@ namespace corsika {
         //~ "doContinuous(TParticle [const]&,TTrack [const]&,bool)\" required for "
         //~ "ContinuousProcess<TDerived>. ");
 
-        ret |= A_.doContinuous(step, limitId == ContinuousProcessIndex(IndexProcess1));
+        ret |= A_.doContinuous(
+            step, limitId == ContinuousProcessIndex(
+                                 static_cast<void const*>(std::addressof(A_))));
       }
     }
 
@@ -142,7 +144,9 @@ namespace corsika {
         //~ "doContinuous(TParticle [const]&,TTrack [const]&,bool)\" required for "
         //~ "ContinuousProcess<TDerived>. ");
 
-        ret |= B_.doContinuous(step, limitId == ContinuousProcessIndex(IndexProcess2));
+        ret |= B_.doContinuous(
+            step, limitId == ContinuousProcessIndex(
+                                 static_cast<void const*>(std::addressof(B_))));
       }
     }
 
@@ -279,8 +283,9 @@ namespace corsika {
                       "getMaxStepLength(TParticle const&, TTrack const&)\" required for "
                       "ContinuousProcess<TDerived>. ");
 
-        ContinuousProcessStepLength const step(A_.getMaxStepLength(particle, vTrack),
-                                               ContinuousProcessIndex(IndexProcess1));
+        ContinuousProcessStepLength const step(
+            A_.getMaxStepLength(particle, vTrack),
+            ContinuousProcessIndex(static_cast<void const*>(std::addressof(A_))));
         max_length = std::min(max_length, step);
       }
     }
@@ -299,8 +304,9 @@ namespace corsika {
                       "getMaxStepLength(TParticle const&, TTrack const&)\" required for "
                       "ContinuousProcess<TDerived>. ");
 
-        ContinuousProcessStepLength const step(B_.getMaxStepLength(particle, vTrack),
-                                               ContinuousProcessIndex(IndexProcess2));
+        ContinuousProcessStepLength const step(
+            B_.getMaxStepLength(particle, vTrack),
+            ContinuousProcessIndex(static_cast<void const*>(std::addressof(B_))));
         max_length = std::min(max_length, step);
       }
     }
diff --git a/corsika/detail/framework/process/SwitchProcessSequence.inl b/corsika/detail/framework/process/SwitchProcessSequence.inl
index 0fbe23aacd022fa146dac2c756328777a0ec0703..0e4584a7625a48c5331c55cca2a41331bb4bf16a 100644
--- a/corsika/detail/framework/process/SwitchProcessSequence.inl
+++ b/corsika/detail/framework/process/SwitchProcessSequence.inl
@@ -99,7 +99,9 @@ namespace corsika {
         //            "doContinuous(TParticle[const]&,TTrack[const]&,bool)\" required for
         //            " "ContinuousProcess<TDerived>. ");
 
-        return A_.doContinuous(step, idLimit == ContinuousProcessIndex(IndexProcess1));
+        return A_.doContinuous(
+            step, idLimit == ContinuousProcessIndex(
+                                 static_cast<void const*>(std::addressof(A_))));
       }
     } else {
       if constexpr (process2_type::is_process_sequence) {
@@ -120,7 +122,9 @@ namespace corsika {
         //            "doContinuous(TParticle [const]&,TTrack[const]&,bool)\" required for
         //            " "ContinuousProcess<TDerived>. ");
 
-        return B_.doContinuous(step, idLimit == ContinuousProcessIndex(IndexProcess2));
+        return B_.doContinuous(
+            step, idLimit == ContinuousProcessIndex(
+                                 static_cast<void const*>(std::addressof(B_))));
       }
     }
     return ProcessReturn::Ok;
@@ -184,8 +188,9 @@ namespace corsika {
                       "getMaxStepLength(TParticle const&, TTrack const&)\" required for "
                       "ContinuousProcess<TDerived>. ");
 
-        return ContinuousProcessStepLength(A_.getMaxStepLength(particle, vTrack),
-                                           ContinuousProcessIndex(IndexProcess1));
+        return ContinuousProcessStepLength(
+            A_.getMaxStepLength(particle, vTrack),
+            ContinuousProcessIndex(static_cast<void const*>(std::addressof(A_))));
       }
     } else {
       if constexpr (process2_type::is_process_sequence) {
@@ -200,8 +205,9 @@ namespace corsika {
                       "getMaxStepLength(TParticle const&, TTrack const&)\" required for "
                       "ContinuousProcess<TDerived>. ");
 
-        return ContinuousProcessStepLength(B_.getMaxStepLength(particle, vTrack),
-                                           ContinuousProcessIndex(IndexProcess2));
+        return ContinuousProcessStepLength(
+            B_.getMaxStepLength(particle, vTrack),
+            ContinuousProcessIndex(static_cast<void const*>(std::addressof(B_))));
       }
     }
 
diff --git a/corsika/framework/process/ContinuousProcessIndex.hpp b/corsika/framework/process/ContinuousProcessIndex.hpp
index 7192b86bf968ffdc74b5420940ea549befa12c73..6898633e9b3cde1b6446ed2fe09b1ce4c2297d92 100644
--- a/corsika/framework/process/ContinuousProcessIndex.hpp
+++ b/corsika/framework/process/ContinuousProcessIndex.hpp
@@ -19,16 +19,16 @@ namespace corsika {
   class ContinuousProcessIndex {
   public:
     ContinuousProcessIndex()
-        : id_(-1) {} // default
-    ContinuousProcessIndex(int const id)
+        : id_(nullptr) {} // default
+    ContinuousProcessIndex(void const* id)
         : id_(id) {}
-    void setIndex(int const id) { id_ = id; }
-    int getIndex() const { return id_; }
+    void setIndex(void const* id) { id_ = id; }
+    void const* getIndex() const { return id_; }
     bool operator==(ContinuousProcessIndex const v) const { return id_ == v.id_; }
-    bool operator!=(ContinuousProcessIndex const v) const { return id_ != v.id_; }
+    bool operator!=(ContinuousProcessIndex const v) const { return !(*this == v); }
 
   private:
-    int id_;
+    void const* id_;
   };
 
 } // namespace corsika
diff --git a/tests/framework/testProcessSequence.cpp b/tests/framework/testProcessSequence.cpp
index 2686b2cca2354dcba06127002105fefe6251b6c2..a7f23a329e5c42e0a0407f249b679c86f814274a 100644
--- a/tests/framework/testProcessSequence.cpp
+++ b/tests/framework/testProcessSequence.cpp
@@ -535,7 +535,7 @@ TEST_CASE("ProcessSequence General", "ProcessSequence") {
     int const nLoop = 5;
     CORSIKA_LOG_DEBUG("Running loop with n={}", nLoop);
     for (int iLoop = 0; iLoop < nLoop; ++iLoop) {
-      sequence2.doContinuous(step, ContinuousProcessIndex(1));
+      sequence2.doContinuous(step, ContinuousProcessIndex(&cp1));
     }
     CHECK(step.getDiffT() / 1_s == Approx(77));
     CHECK(step.getDiffEkin() / 1_eV == Approx(7));
@@ -692,7 +692,7 @@ TEST_CASE("SwitchProcessSequence", "ProcessSequence") {
     checkSec = 0;
     checkCont = 0;
     particle.data_[0] = 100; // data positive --> sequence1
-    sequence3.doContinuous(step, ContinuousProcessIndex(1));
+    sequence3.doContinuous(step, ContinuousProcessIndex(&cp1));
     CHECK(checkInteract == 0);
     CHECK(checkDecay == 0);
     CHECK(checkCont == 0b011);
@@ -703,7 +703,7 @@ TEST_CASE("SwitchProcessSequence", "ProcessSequence") {
     checkSec = 0;
     checkCont = 0;
     particle.data_[0] = -100; // data negative  --> sequence2
-    sequence3.doContinuous(step, ContinuousProcessIndex(1));
+    sequence3.doContinuous(step, ContinuousProcessIndex(&cp1));
     CHECK(checkInteract == 0);
     CHECK(checkDecay == 0);
     CHECK(checkCont == 0b101);
@@ -1089,12 +1089,11 @@ TEST_CASE("SelectInteractionZeroCrossSection", "ProcessSequence") {
 
   auto sequence = make_sequence(ProcessZero());
 
+  FourMomentum const projectileP4{10_GeV, {rootCS, {0_eV, 0_eV, 0_eV}}};
+
   DummyData particle;
-  DummyTrajectory track;
   DummyView view(particle);
 
-  FourMomentum const projectileP4{10_GeV, {rootCS, {0_eV, 0_eV, 0_eV}}};
-
   CrossSectionType cx_select =
       sequence.getCrossSection(particle, Code::Nitrogen, projectileP4);
   CHECK(cx_select == 0_mb); // should be zero
@@ -1105,4 +1104,184 @@ TEST_CASE("SelectInteractionZeroCrossSection", "ProcessSequence") {
       sequence.selectInteraction(view, projectileP4, noComposition, rng, 0_mb);
   CHECK(!isInteracted(retValue)); // cross section of process sequence is zero, no process
                                   // should cause an interaction
-}
\ No newline at end of file
+}
+
+TEST_CASE("SwitchProcessSequence Indexing", "ProcessSequence") {
+  // see issue https://gitlab.iap.kit.edu/AirShowerPhysics/corsika/-/issues/573
+  // and issue https://gitlab.iap.kit.edu/AirShowerPhysics/corsika/-/issues/586
+
+  logging::set_level(logging::level::info);
+
+  CoordinateSystemPtr rootCS = get_root_CoordinateSystem();
+
+  struct SwitchSelect {
+    bool operator()(DummyData const& p) const { return (p.data_[0] > 0); }
+  };
+  SwitchSelect select1;
+
+  auto cp1 = ContinuousProcess1(0, 0_m);
+  auto cp2 = ContinuousProcess1(0, 0_m);
+  auto cp3 = ContinuousProcess1(0, 0_m);
+  auto cp4 = ContinuousProcess1(0, 0_m);
+
+  auto switch_sequence = make_select(select1, cp1, cp2);
+  auto sequence = make_sequence(switch_sequence, cp3, cp4);
+
+  CHECK(sequence.getNumberOfProcesses() == 4);
+  CHECK(switch_sequence.getNumberOfProcesses() == 2);
+
+  DummyData particle;
+  DummyTrajectory track;
+  DummyView view(particle);
+  Step step(particle, track);
+
+  // cp1 selected
+  cp1.setStep(1_m);
+  cp2.setStep(100_m);
+  cp3.setStep(100_m);
+  cp4.setStep(100_m);
+  particle.data_[0] = 1; // positive so that cp1 is selected
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  CHECK_FALSE(cp4.getFlag());
+  ContinuousProcessStepLength continuousMaxStep =
+      sequence.getMaxStepLength(particle, track);
+  sequence.doContinuous(step, continuousMaxStep.getIndex());
+  CHECK(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  CHECK_FALSE(cp4.getFlag());
+  cp1.resetFlag();
+  cp2.resetFlag();
+  cp3.resetFlag();
+  cp4.resetFlag();
+
+  // cp2 selected
+  cp1.setStep(100_m);
+  cp2.setStep(1_m);
+  cp3.setStep(100_m);
+  cp4.setStep(100_m);
+  particle.data_[0] = -1; // negative so that cp2 is selected
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  CHECK_FALSE(cp4.getFlag());
+  continuousMaxStep = sequence.getMaxStepLength(particle, track);
+  sequence.doContinuous(step, continuousMaxStep.getIndex());
+  CHECK_FALSE(cp1.getFlag());
+  CHECK(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  CHECK_FALSE(cp4.getFlag());
+  cp1.resetFlag();
+  cp2.resetFlag();
+  cp3.resetFlag();
+  cp4.resetFlag();
+
+  // cp3 selected
+  cp1.setStep(100_m);
+  cp2.setStep(100_m);
+  cp3.setStep(1_m);
+  cp4.setStep(100_m);
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  CHECK_FALSE(cp4.getFlag());
+  continuousMaxStep = sequence.getMaxStepLength(particle, track);
+  sequence.doContinuous(step, continuousMaxStep.getIndex());
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK(cp3.getFlag());
+  CHECK_FALSE(cp4.getFlag());
+  cp1.resetFlag();
+  cp2.resetFlag();
+  cp3.resetFlag();
+  cp4.resetFlag();
+
+  // cp4 selected
+  cp1.setStep(100_m);
+  cp2.setStep(100_m);
+  cp3.setStep(100_m);
+  cp4.setStep(1_m);
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  CHECK_FALSE(cp4.getFlag());
+  continuousMaxStep = sequence.getMaxStepLength(particle, track);
+  sequence.doContinuous(step, continuousMaxStep.getIndex());
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  CHECK(cp4.getFlag());
+  cp1.resetFlag();
+  cp2.resetFlag();
+  cp3.resetFlag();
+  cp4.resetFlag();
+}
+
+TEST_CASE("Nested ProcessSequence", "ProcessSequence") {
+  //
+
+  logging::set_level(logging::level::info);
+
+  CoordinateSystemPtr rootCS = get_root_CoordinateSystem();
+
+  auto cp1 = ContinuousProcess1(0, 0_m);
+  auto cp2 = ContinuousProcess1(0, 0_m);
+  auto cp3 = ContinuousProcess1(0, 0_m);
+
+  auto sequence = make_sequence(make_sequence(cp1, cp2), cp3);
+
+  CHECK(sequence.getNumberOfProcesses() == 3);
+
+  DummyData particle;
+  DummyTrajectory track;
+  DummyView view(particle);
+  Step step(particle, track);
+
+  // cp1 selected
+  cp1.setStep(1_m);
+  cp2.setStep(100_m);
+  cp3.setStep(100_m);
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  ContinuousProcessStepLength continuousMaxStep =
+      sequence.getMaxStepLength(particle, track);
+  sequence.doContinuous(step, continuousMaxStep.getIndex());
+  CHECK(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  cp1.resetFlag();
+  cp2.resetFlag();
+  cp3.resetFlag();
+
+  // cp2 selected
+  cp1.setStep(100_m);
+  cp2.setStep(1_m);
+  cp3.setStep(100_m);
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  continuousMaxStep = sequence.getMaxStepLength(particle, track);
+  sequence.doContinuous(step, continuousMaxStep.getIndex());
+  CHECK_FALSE(cp1.getFlag());
+  CHECK(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  cp1.resetFlag();
+  cp2.resetFlag();
+  cp3.resetFlag();
+
+  // cp3 selected
+  cp1.setStep(100_m);
+  cp2.setStep(100_m);
+  cp3.setStep(1_m);
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK_FALSE(cp3.getFlag());
+  continuousMaxStep = sequence.getMaxStepLength(particle, track);
+  sequence.doContinuous(step, continuousMaxStep.getIndex());
+  CHECK_FALSE(cp1.getFlag());
+  CHECK_FALSE(cp2.getFlag());
+  CHECK(cp3.getFlag());
+}