diff --git a/Processes/CMakeLists.txt b/Processes/CMakeLists.txt
index d6162179ca3440e788a40a9a6ab0c18edb7d44f6..cddec6bd425a19f361346a7e50b6da843a0167c9 100644
--- a/Processes/CMakeLists.txt
+++ b/Processes/CMakeLists.txt
@@ -4,7 +4,7 @@ add_subdirectory (Sibyll)
 if (PYTHIA8_FOUND)
   add_subdirectory (Pythia)
 endif (PYTHIA8_FOUND)
-add_subdirectory (StackInspector)
+# add_subdirectory (StackInspector)
 add_subdirectory (TrackWriter)
 add_subdirectory (TrackingLine)
 add_subdirectory (HadronicElasticModel)
diff --git a/Processes/EnergyLoss/EnergyLoss.cc b/Processes/EnergyLoss/EnergyLoss.cc
index 3cdd84e314a08bef4aab378f247e45a41a4362bc..094eec177907048fabd4b70c10bc9b54f49941a8 100644
--- a/Processes/EnergyLoss/EnergyLoss.cc
+++ b/Processes/EnergyLoss/EnergyLoss.cc
@@ -148,7 +148,7 @@ namespace corsika::process::EnergyLoss {
            (0.5 * log(aux) - beta2 - Cadj / Z - delta / 2 + barkas + bloch) * dX;
   }
 
-  process::EProcessReturn EnergyLoss::DoContinuous(Particle& p, Track& t, Stack&) {
+  process::EProcessReturn EnergyLoss::DoContinuous(Particle& p, Track& t) {
     if (p.GetChargeNumber() == 0) return process::EProcessReturn::eOk;
     GrammageType const dX =
         p.GetNode()->GetModelProperties().IntegratedGrammage(t, t.GetLength());
@@ -178,16 +178,16 @@ namespace corsika::process::EnergyLoss {
     return units::si::meter * std::numeric_limits<double>::infinity();
   }
 
-  void EnergyLoss::MomentumUpdate(corsika::setup::Stack::ParticleType& p,
+  void EnergyLoss::MomentumUpdate(corsika::setup::Stack::ParticleType& vP,
                                   corsika::units::si::HEPEnergyType Enew) {
-    HEPMomentumType Pnew = elab2plab(Enew, p.GetMass());
-    auto pnew = p.GetMomentum();
-    p.SetMomentum(pnew * Pnew / pnew.GetNorm());
+    HEPMomentumType Pnew = elab2plab(Enew, vP.GetMass());
+    auto pnew = vP.GetMomentum();
+    vP.SetMomentum(pnew * Pnew / pnew.GetNorm());
   }
 
 #include <corsika/geometry/CoordinateSystem.h>
 
-  int EnergyLoss::GetXbin(corsika::setup::Stack::ParticleType& p,
+  int EnergyLoss::GetXbin(corsika::setup::Stack::ParticleType& vP,
                           const HEPEnergyType dE) {
 
     using namespace corsika::geometry;
@@ -195,12 +195,12 @@ namespace corsika::process::EnergyLoss {
     CoordinateSystem const& rootCS =
         RootCoordinateSystem::GetInstance().GetRootCoordinateSystem();
     Point pos1(rootCS, 0_m, 0_m, 0_m);
-    Point pos2(rootCS, 0_m, 0_m, p.GetPosition().GetCoordinates()[2]);
+    Point pos2(rootCS, 0_m, 0_m, vP.GetPosition().GetCoordinates()[2]);
     Vector delta = (pos2 - pos1) / 1_s;
     Trajectory t(Line(pos1, delta), 1_s);
 
     GrammageType const grammage =
-        p.GetNode()->GetModelProperties().IntegratedGrammage(t, t.GetLength());
+        vP.GetNode()->GetModelProperties().IntegratedGrammage(t, t.GetLength());
 
     const int bin = grammage / fdX;
 
diff --git a/Processes/EnergyLoss/EnergyLoss.h b/Processes/EnergyLoss/EnergyLoss.h
index 5eb2a6b6782b12bb7b336e67d43e2882d666b80a..323ef85735eb1525ef3514329bbc112d7c44cf97 100644
--- a/Processes/EnergyLoss/EnergyLoss.h
+++ b/Processes/EnergyLoss/EnergyLoss.h
@@ -35,8 +35,7 @@ namespace corsika::process::EnergyLoss {
     void Init() {}
 
     corsika::process::EProcessReturn DoContinuous(corsika::setup::Stack::ParticleType&,
-                                                  corsika::setup::Trajectory&,
-                                                  corsika::setup::Stack&);
+                                                  corsika::setup::Trajectory&);
     corsika::units::si::LengthType MaxStepLength(corsika::setup::Stack::ParticleType&,
                                                  corsika::setup::Trajectory&);
 
diff --git a/Processes/HadronicElasticModel/HadronicElasticModel.cc b/Processes/HadronicElasticModel/HadronicElasticModel.cc
index 289968645c4c758d10f7230dbcf99babba40838c..33f162e41531bf4008f91b21bb98e8afc13a7abb 100644
--- a/Processes/HadronicElasticModel/HadronicElasticModel.cc
+++ b/Processes/HadronicElasticModel/HadronicElasticModel.cc
@@ -79,7 +79,7 @@ namespace corsika::process::HadronicElasticModel {
   }
 
   template <>
-  process::EProcessReturn HadronicElasticInteraction::DoInteraction(Particle& p, Stack&) {
+  process::EProcessReturn HadronicElasticInteraction::DoInteraction(Particle& p) {
     if (p.GetPID() != particles::Code::Proton) { return process::EProcessReturn::eOk; }
 
     using namespace units::si;
diff --git a/Processes/HadronicElasticModel/HadronicElasticModel.h b/Processes/HadronicElasticModel/HadronicElasticModel.h
index fae8c97242bac32426eca9089ac8a8ff611b631e..4180c04c514d00089fd044ab39027b9128a853ff 100644
--- a/Processes/HadronicElasticModel/HadronicElasticModel.h
+++ b/Processes/HadronicElasticModel/HadronicElasticModel.h
@@ -59,8 +59,8 @@ namespace corsika::process::HadronicElasticModel {
     template <typename Particle, typename Track>
     corsika::units::si::GrammageType GetInteractionLength(Particle const& p, Track&);
 
-    template <typename Particle, typename Stack>
-    corsika::process::EProcessReturn DoInteraction(Particle& p, Stack&);
+    template <typename Particle>
+    corsika::process::EProcessReturn DoInteraction(Particle&);
   };
 
 } // namespace corsika::process::HadronicElasticModel
diff --git a/Processes/Sibyll/Decay.cc b/Processes/Sibyll/Decay.cc
index 3cd009c580d10845ea2219b59322dc1855a88295..7a865e92fa08d606c68c5bad782e0a70e826f101 100644
--- a/Processes/Sibyll/Decay.cc
+++ b/Processes/Sibyll/Decay.cc
@@ -24,7 +24,8 @@ using std::vector;
 
 using namespace corsika;
 using namespace corsika::setup;
-using Particle = Stack::StackIterator; // ParticleType;
+using Projectile = corsika::setup::StackView::ParticleType;
+using Particle = corsika::setup::Stack::ParticleType;
 using Track = Trajectory;
 
 namespace corsika::process::sibyll {
@@ -103,27 +104,27 @@ namespace corsika::process::sibyll {
   }
 
   template <>
-  units::si::TimeType Decay::GetLifetime(Particle const& p) {
+  units::si::TimeType Decay::GetLifetime(Particle const& vP) {
     using namespace units::si;
 
-    HEPEnergyType E = p.GetEnergy();
-    HEPMassType m = p.GetMass();
+    HEPEnergyType E = vP.GetEnergy();
+    HEPMassType m = vP.GetMass();
 
     const double gamma = E / m;
 
-    const TimeType t0 = particles::GetLifetime(p.GetPID());
+    const TimeType t0 = particles::GetLifetime(vP.GetPID());
     auto const lifetime = gamma * t0;
 
     const auto mkin =
-        (E * E - p.GetMomentum().squaredNorm()); // delta_mass(p.GetMomentum(), E, m);
-    cout << "Decay: code: " << p.GetPID() << endl;
+        (E * E - vP.GetMomentum().squaredNorm()); // delta_mass(vP.GetMomentum(), E, m);
+    cout << "Decay: code: " << vP.GetPID() << endl;
     cout << "Decay: MinStep: t0: " << t0 << endl;
     cout << "Decay: MinStep: energy: " << E / 1_GeV << " GeV" << endl;
-    cout << "Decay: momentum: " << p.GetMomentum().GetComponents() / 1_GeV << " GeV"
+    cout << "Decay: momentum: " << vP.GetMomentum().GetComponents() / 1_GeV << " GeV"
          << endl;
     cout << "Decay: momentum: shell mass-kin. inv. mass " << mkin / 1_GeV / 1_GeV << " "
          << m / 1_GeV * m / 1_GeV << endl;
-    auto sib_id = process::sibyll::ConvertToSibyllRaw(p.GetPID());
+    auto sib_id = process::sibyll::ConvertToSibyllRaw(vP.GetPID());
     cout << "Decay: sib mass: " << get_sibyll_mass2(sib_id) << endl;
     cout << "Decay: MinStep: gamma: " << gamma << endl;
     cout << "Decay: MinStep: tau: " << lifetime << endl;
@@ -132,23 +133,23 @@ namespace corsika::process::sibyll {
   }
 
   template <>
-  void Decay::DoDecay(Particle& p, Stack&) {
+  void Decay::DoDecay(Projectile& vP) {
     using geometry::Point;
     using namespace units::si;
 
     fCount++;
     SibStack ss;
     ss.Clear();
-    const particles::Code pCode = p.GetPID();
+    const particles::Code pCode = vP.GetPID();
     // copy particle to sibyll stack
-    ss.AddParticle(process::sibyll::ConvertToSibyllRaw(pCode), p.GetEnergy(),
-                   p.GetMomentum(),
+    ss.AddParticle(process::sibyll::ConvertToSibyllRaw(pCode), vP.GetEnergy(),
+                   vP.GetMomentum(),
                    // setting particle mass with Corsika values, may be inconsistent
                    // with sibyll internal values
                    particles::GetMass(pCode));
     // remember position
-    Point const decayPoint = p.GetPosition();
-    TimeType const t0 = p.GetTime();
+    Point const decayPoint = vP.GetPosition();
+    TimeType const t0 = vP.GetTime();
     // set all particles/hadrons unstable
     // setHadronsUnstable();
     SetUnstable(pCode);
@@ -166,7 +167,7 @@ namespace corsika::process::sibyll {
       // FOR NOW: skip particles that have decayed in Sibyll, move to iterator?
       if (psib.HasDecayed()) continue;
       // add to corsika stack
-      p.AddSecondary(
+      vP.AddSecondary(
           tuple<particles::Code, units::si::HEPEnergyType, corsika::stack::MomentumVector,
                 geometry::Point, units::si::TimeType>{
               process::sibyll::ConvertFromSibyll(psib.GetPID()), psib.GetEnergy(),
@@ -174,8 +175,6 @@ namespace corsika::process::sibyll {
     }
     // empty sibyll stack
     ss.Clear();
-    // remove original particle from corsika stack
-    p.Delete();
   }
 
 } // namespace corsika::process::sibyll
diff --git a/Processes/Sibyll/Decay.h b/Processes/Sibyll/Decay.h
index 7e7a202e7c3172577c6a5662d09eb67bbb9433f2..5dc06bd0cfc6db1a59c74f04dd78971b3f01a748 100644
--- a/Processes/Sibyll/Decay.h
+++ b/Processes/Sibyll/Decay.h
@@ -37,10 +37,10 @@ namespace corsika::process {
       void SetHadronsUnstable();
 
       template <typename Particle>
-      corsika::units::si::TimeType GetLifetime(Particle const& p);
+      corsika::units::si::TimeType GetLifetime(Particle const&);
 
-      template <typename Particle, typename Stack>
-      void DoDecay(Particle& p, Stack&);
+      template <typename Projectile>
+      void DoDecay(Projectile&);
     };
   } // namespace sibyll
 } // namespace corsika::process
diff --git a/Processes/Sibyll/Interaction.cc b/Processes/Sibyll/Interaction.cc
index 645667f812f972ce76fb97baecdd549a84d88699..83348508b37938b07eff8e664322e780930ba23c 100644
--- a/Processes/Sibyll/Interaction.cc
+++ b/Processes/Sibyll/Interaction.cc
@@ -29,7 +29,8 @@ using std::tuple;
 
 using namespace corsika;
 using namespace corsika::setup;
-using Particle = Stack::StackIterator; // ParticleType;
+using Particle = Stack::StackIterator;       // ParticleType;
+using Projectile = StackView::StackIterator; // ParticleType;
 using Track = Trajectory;
 
 namespace corsika::process::sibyll {
@@ -207,7 +208,7 @@ namespace corsika::process::sibyll {
    */
 
   template <>
-  process::EProcessReturn Interaction::DoInteraction(Particle& p, Stack&) {
+  process::EProcessReturn Interaction::DoInteraction(Projectile& p) {
 
     using namespace units;
     using namespace utl;
@@ -331,7 +332,6 @@ namespace corsika::process::sibyll {
              << " DoInteraction: should have dropped particle.. "
              << "THIS IS AN ERROR" << endl;
         throw std::runtime_error("energy too low for SIBYLL");
-        // p.Delete(); delete later... different process
       } else {
         fCount++;
         // Sibyll does not know about units..
diff --git a/Processes/Sibyll/Interaction.h b/Processes/Sibyll/Interaction.h
index 33fe9001a65c20294d7b04077befdee12165080c..4d70a0afb8bc53cb07c1ad09909bce103419dc47 100644
--- a/Processes/Sibyll/Interaction.h
+++ b/Processes/Sibyll/Interaction.h
@@ -61,8 +61,8 @@ namespace corsika::process::sibyll {
        event is copied (and boosted) into the shower lab frame.
      */
 
-    template <typename Particle, typename Stack>
-    corsika::process::EProcessReturn DoInteraction(Particle&, Stack&);
+    template <typename Particle>
+    corsika::process::EProcessReturn DoInteraction(Particle&);
 
   private:
     corsika::random::RNG& fRNG =
diff --git a/Processes/Sibyll/NuclearInteraction.cc b/Processes/Sibyll/NuclearInteraction.cc
index f12dba92364a4a09ce804c5ec236255d4c6c6c6c..da85b0f3da83729de49e21d921fce068b4990cea 100644
--- a/Processes/Sibyll/NuclearInteraction.cc
+++ b/Processes/Sibyll/NuclearInteraction.cc
@@ -31,7 +31,8 @@ using std::vector;
 
 using namespace corsika;
 using namespace corsika::setup;
-using Particle = Stack::StackIterator; // ParticleType;
+using Particle = Stack::ParticleType;        // StackIterator; // ParticleType;
+using Projectile = StackView::StackIterator; // StackView::ParticleType;
 using Track = Trajectory;
 
 namespace corsika::process::sibyll {
@@ -307,7 +308,7 @@ namespace corsika::process::sibyll {
   }
 
   template <>
-  process::EProcessReturn NuclearInteraction::DoInteraction(Particle& p, Stack& s) {
+  process::EProcessReturn NuclearInteraction::DoInteraction(Projectile& p) {
 
     // this routine superimposes different nucleon-nucleon interactions
     // in a nucleus-nucleus interaction, based the SIBYLL routine SIBNUC
@@ -594,12 +595,9 @@ namespace corsika::process::sibyll {
               PprojNucLab.GetSpaceLikeComponents(), pOrig, tOrig});
       // create inelastic interaction
       cout << "calling HadronicInteraction..." << endl;
-      fHadronicInteraction.DoInteraction(inelasticNucleon, s);
+      fHadronicInteraction.DoInteraction(inelasticNucleon);
     }
 
-    // delete parent particle
-    p.Delete();
-
     cout << "NuclearInteraction: DoInteraction: done" << endl;
 
     return process::EProcessReturn::eOk;
diff --git a/Processes/Sibyll/NuclearInteraction.h b/Processes/Sibyll/NuclearInteraction.h
index 1a6449d2c4d924fcfe3a9363c4c553a433ea34c5..520265fbb692a34571f5e8baa23de3d5e9c4372e 100644
--- a/Processes/Sibyll/NuclearInteraction.h
+++ b/Processes/Sibyll/NuclearInteraction.h
@@ -55,8 +55,8 @@ namespace corsika::process::sibyll {
     template <typename Particle, typename Track>
     corsika::units::si::GrammageType GetInteractionLength(Particle& p, Track&);
 
-    template <typename Particle, typename Stack>
-    corsika::process::EProcessReturn DoInteraction(Particle& p, Stack& s);
+    template <typename Projectle>
+    corsika::process::EProcessReturn DoInteraction(Projectle& p);
 
   private:
     corsika::process::sibyll::Interaction& fHadronicInteraction;
diff --git a/Processes/Sibyll/testSibyll.cc b/Processes/Sibyll/testSibyll.cc
index 7a02fa2888fc7d85bc55f81df1aad2abd3557bc9..ce096994b7829547f28e5f88bf53ff623108daab 100644
--- a/Processes/Sibyll/testSibyll.cc
+++ b/Processes/Sibyll/testSibyll.cc
@@ -119,12 +119,13 @@ TEST_CASE("SibyllInterface", "[processes]") {
                    corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
             particles::Code::Proton, E0, plab, pos, 0_ns});
     particle.SetNode(nodePtr);
+    stack::SecondaryView view(particle);
+    auto projectile = view.GetProjectile();
 
     Interaction model;
 
     model.Init();
-    [[maybe_unused]] const process::EProcessReturn ret =
-        model.DoInteraction(particle, stack);
+    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(projectile);
     [[maybe_unused]] const GrammageType length =
         model.GetInteractionLength(particle, track);
   }
@@ -144,13 +145,14 @@ TEST_CASE("SibyllInterface", "[processes]") {
                                      units::si::TimeType, unsigned short, unsigned short>{
             particles::Code::Nucleus, E0, plab, pos, 0_ns, 4, 2});
     particle.SetNode(nodePtr);
+    stack::SecondaryView view(particle);
+    auto projectile = view.GetProjectile();
 
     Interaction hmodel;
     NuclearInteraction model(hmodel);
 
     model.Init();
-    [[maybe_unused]] const process::EProcessReturn ret =
-        model.DoInteraction(particle, stack);
+    [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(projectile);
     [[maybe_unused]] const GrammageType length =
         model.GetInteractionLength(particle, track);
   }
@@ -167,6 +169,8 @@ TEST_CASE("SibyllInterface", "[processes]") {
         std::tuple<particles::Code, units::si::HEPEnergyType,
                    corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{
             particles::Code::Proton, E0, plab, pos, 0_ns});
+    stack::SecondaryView view(particle);
+    auto projectile = view.GetProjectile();
 
     const std::vector<particles::Code> particleList = {
         particles::Code::PiPlus, particles::Code::PiMinus, particles::Code::KPlus,
@@ -175,8 +179,7 @@ TEST_CASE("SibyllInterface", "[processes]") {
     Decay model(particleList);
 
     model.Init();
-    /*[[maybe_unused]] const process::EProcessReturn ret =*/model.DoDecay(particle,
-                                                                          stack);
+    /*[[maybe_unused]] const process::EProcessReturn ret =*/model.DoDecay(projectile);
     [[maybe_unused]] const TimeType time = model.GetLifetime(particle);
   }
 }
diff --git a/Processes/StackInspector/StackInspector.cc b/Processes/StackInspector/StackInspector.cc
index a22742165bec0a6f4a9bfe3b06e33e25ca2e9c3c..eb0c9e11f871dfc22f5b2a27f46ef8f0e6051d3d 100644
--- a/Processes/StackInspector/StackInspector.cc
+++ b/Processes/StackInspector/StackInspector.cc
@@ -37,8 +37,8 @@ template <typename Stack>
 StackInspector<Stack>::~StackInspector() {}
 
 template <typename Stack>
-process::EProcessReturn StackInspector<Stack>::DoContinuous(Particle&, setup::Trajectory&,
-                                                            Stack& s) {
+process::EProcessReturn StackInspector<Stack>::DoContinuous(Particle&,
+                                                            setup::Trajectory&) {
 
   if (!fReport) return process::EProcessReturn::eOk;
   [[maybe_unused]] int i = 0;
diff --git a/Processes/StackInspector/StackInspector.h b/Processes/StackInspector/StackInspector.h
index 9488767d780c9b2747ace740a14b21aa7da341a4..c4262c1754ddb66cdd55ddc3689e507541da7a7c 100644
--- a/Processes/StackInspector/StackInspector.h
+++ b/Processes/StackInspector/StackInspector.h
@@ -31,7 +31,7 @@ namespace corsika::process {
       ~StackInspector();
 
       void Init();
-      EProcessReturn DoContinuous(Particle&, corsika::setup::Trajectory&, Stack& s);
+      EProcessReturn DoContinuous(Particle&, corsika::setup::Trajectory&);
       corsika::units::si::LengthType MaxStepLength(Particle&,
                                                    corsika::setup::Trajectory&);
 
diff --git a/Processes/TrackWriter/TrackWriter.cc b/Processes/TrackWriter/TrackWriter.cc
index b58a40fbbeca28b8e295ea246901253d674bef8a..5ea8588d9f19aca5f430aa7e749e7d3a51005e59 100644
--- a/Processes/TrackWriter/TrackWriter.cc
+++ b/Processes/TrackWriter/TrackWriter.cc
@@ -33,13 +33,13 @@ namespace corsika::process::TrackWriter {
   }
 
   template <>
-  process::EProcessReturn TrackWriter::DoContinuous(Particle& p, Track& t, Stack&) {
+  process::EProcessReturn TrackWriter::DoContinuous(Particle& vP, Track& vT) {
     using namespace units::si;
-    auto const start = t.GetPosition(0).GetCoordinates();
-    auto const delta = t.GetPosition(1).GetCoordinates() - start;
-    auto const& name = particles::GetName(p.GetPID());
+    auto const start = vT.GetPosition(0).GetCoordinates();
+    auto const delta = vT.GetPosition(1).GetCoordinates() - start;
+    auto const& name = particles::GetName(vP.GetPID());
 
-    fFile << name << "    " << p.GetEnergy() / 1_eV << ' ' << start[0] / 1_m << ' '
+    fFile << name << "    " << vP.GetEnergy() / 1_eV << ' ' << start[0] / 1_m << ' '
           << start[1] / 1_m << ' ' << start[2] / 1_m << "   " << delta[0] / 1_m << ' '
           << delta[1] / 1_m << ' ' << delta[2] / 1_m << '\n';
 
diff --git a/Processes/TrackWriter/TrackWriter.h b/Processes/TrackWriter/TrackWriter.h
index fa2430569240b159f0c8cb94dd06bc314472be05..51fd5a157da9955aed9a06c69a1b6270626cfb5d 100644
--- a/Processes/TrackWriter/TrackWriter.h
+++ b/Processes/TrackWriter/TrackWriter.h
@@ -28,8 +28,8 @@ namespace corsika::process::TrackWriter {
 
     void Init();
 
-    template <typename Particle, typename Track, typename Stack>
-    corsika::process::EProcessReturn DoContinuous(Particle& p, Track& t, Stack&);
+    template <typename Particle, typename Track>
+    corsika::process::EProcessReturn DoContinuous(Particle&, Track&);
 
     template <typename Particle, typename Track>
     corsika::units::si::LengthType MaxStepLength(Particle&, Track&);