diff --git a/tests/framework/testProcessSequence.cpp b/tests/framework/testProcessSequence.cpp
index 641d3eecb8e4d4d9abb548eb2e05209fbc67f719..7d207965e57c98c304a1cf0aacca5c1bcdfbc318 100644
--- a/tests/framework/testProcessSequence.cpp
+++ b/tests/framework/testProcessSequence.cpp
@@ -1065,3 +1065,112 @@ TEST_CASE("ProcessSequence Indexing", "ProcessSequence") {
               << std::endl;
   }
 }
+
+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 sequence = make_sequence(make_select(select1, cp1, cp2), cp3, cp4);
+
+  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();
+}