diff --git a/Processes/Proposal/CMakeLists.txt b/Processes/Proposal/CMakeLists.txt
index 970abe29dc0ed296479e2ba20df2f134f0c0d007..8d2a19788215b616ca2d6dd28199212ce8fc2918 100644
--- a/Processes/Proposal/CMakeLists.txt
+++ b/Processes/Proposal/CMakeLists.txt
@@ -15,6 +15,11 @@ SET_TARGET_PROPERTIES ( ProcessProposal PROPERTIES VERSION ${PROJECT_VERSION}
 
 TARGET_LINK_LIBRARIES (
   ProcessProposal
+  CORSIKAparticles
+  CORSIKAutilities
+  CORSIKAunits
+  CORSIKAthirdparty
+  CORSIKAgeometry
   CORSIKAenvironment
   ${PROPOSAL_LIBRARY}
   )
diff --git a/Processes/Proposal/Interaction.cc b/Processes/Proposal/Interaction.cc
index a19b6bf5ff82a9ecb96689d47156e111bbaddee8..7faaa9dbb8b75f28acd77bc69748d6d79b37ad6e 100644
--- a/Processes/Proposal/Interaction.cc
+++ b/Processes/Proposal/Interaction.cc
@@ -2,6 +2,7 @@
 #include <corsika/environment/IMediumModel.h>
 #include <corsika/environment/NuclearComposition.h>
 #include <corsika/process/proposal/Interaction.h>
+#include <corsika/setup/SetupEnvironment.h>
 #include <corsika/setup/SetupStack.h>
 #include <corsika/setup/SetupTrajectory.h>
 #include <corsika/units/PhysicalUnits.h>
@@ -14,12 +15,11 @@
 #include <tuple>
 
 using Component_PROPOSAL = PROPOSAL::Components::Component;
-namespace corsika::process::proposal {
 
+namespace corsika::process::proposal {
   using namespace corsika::setup;
   using namespace corsika::environment;
   using namespace corsika::units::si;
-  using SetupParticle = corsika::setup::Stack::StackIterator;
 
   template <>
   std::unordered_map<particles::Code, PROPOSAL::ParticleDef>
@@ -65,43 +65,42 @@ namespace corsika::process::proposal {
   template <>
   template <>
   corsika::process::EProcessReturn Interaction<SetupEnvironment>::DoInteraction(
-      SetupParticle& vP) {
-    auto calc = GetCalculator(vP); // [CrossSections]
-    std::uniform_real_distribution<double> distr(0., 1.);
-    auto [type, comp_ptr, v] = std::get<INTERACTION>(calc->second)
-                                   ->TypeInteraction(vP.GetEnergy() / 1_GeV, distr(fRNG));
-    auto rnd = std::vector<double>();
-    for (size_t i = 0;
-         i < std::get<SECONDARIES>(calc->second).RequiredRandomNumbers(type); ++i)
-      rnd.push_back(distr(fRNG));
-    double primary_energy = vP.GetEnergy() / 1_GeV;
-    auto point =
-        PROPOSAL::Vector3D(vP.GetPosition().GetX() / 1_cm, vP.GetPosition().GetY() / 1_cm,
-                           vP.GetPosition().GetZ() / 1_cm);
-    auto p = vP.GetMomentum().GetComponents();
-    auto direction = PROPOSAL::Vector3D(p[0] / 1_GeV, p[1] / 1_GeV, p[2] / 1_GeV);
-    auto loss =
-        make_tuple(static_cast<int>(type), point, direction, v * primary_energy, 0.);
-    auto sec = std::get<SECONDARIES>(calc->second)
-                   .CalculateSecondaries(primary_energy, loss, *comp_ptr, rnd);
-    for (auto& s : sec) {
-      auto energy = get<PROPOSAL::Loss::ENERGY>(s) * 1_MeV;
-      auto vec = corsika::geometry::QuantityVector(
-          std::get<PROPOSAL::Loss::DIRECTION>(s).GetX() * energy,
-          std::get<PROPOSAL::Loss::DIRECTION>(s).GetY() * energy,
-          std::get<PROPOSAL::Loss::DIRECTION>(s).GetZ() * energy);
-      auto momentum = corsika::stack::MomentumVector(
-          corsika::geometry::RootCoordinateSystem::GetInstance()
-              .GetRootCoordinateSystem(),
-          vec);
-      particles::Code sec_code = corsika::particles::ConvertFromPDG(
-          static_cast<particles::PDGCode>(get<PROPOSAL::Loss::TYPE>(s)));
-      corsika::units::si::HEPEnergyType sec_energy = energy;
-      stack::MomentumVector sec_momentum = momentum;
-      geometry::Point sec_position = vP.GetPosition();
-      corsika::units::si::TimeType sec_time = vP.GetTime();
-      vP.AddSecondary(
-          make_tuple(sec_code, sec_energy, sec_momentum, sec_position, sec_time));
+      setup::StackView::StackIterator& vP) {
+    if (CanInteract(vP.GetPID())) {
+      auto calc = GetCalculator(vP); // [CrossSections]
+      std::uniform_real_distribution<double> distr(0., 1.);
+      auto [type, comp_ptr, v] =
+          std::get<INTERACTION>(calc->second)
+              ->TypeInteraction(vP.GetEnergy() / 1_GeV, distr(fRNG));
+      auto rnd = std::vector<double>();
+      for (size_t i = 0;
+           i < std::get<SECONDARIES>(calc->second).RequiredRandomNumbers(type); ++i)
+        rnd.push_back(distr(fRNG));
+      double primary_energy = vP.GetEnergy() / 1_GeV;
+      auto point = PROPOSAL::Vector3D(vP.GetPosition().GetX() / 1_cm,
+                                      vP.GetPosition().GetY() / 1_cm,
+                                      vP.GetPosition().GetZ() / 1_cm);
+      auto p = vP.GetMomentum().GetComponents();
+      auto direction = PROPOSAL::Vector3D(p[0] / 1_GeV, p[1] / 1_GeV, p[2] / 1_GeV);
+      auto loss =
+          make_tuple(static_cast<int>(type), point, direction, v * primary_energy, 0.);
+      auto sec = std::get<SECONDARIES>(calc->second)
+                     .CalculateSecondaries(primary_energy, loss, *comp_ptr, rnd);
+      for (auto& s : sec) {
+        auto energy = get<PROPOSAL::Loss::ENERGY>(s) * 1_MeV;
+        auto vec = corsika::geometry::QuantityVector(
+            std::get<PROPOSAL::Loss::DIRECTION>(s).GetX() * energy,
+            std::get<PROPOSAL::Loss::DIRECTION>(s).GetY() * energy,
+            std::get<PROPOSAL::Loss::DIRECTION>(s).GetZ() * energy);
+        auto momentum = corsika::stack::MomentumVector(
+            corsika::geometry::RootCoordinateSystem::GetInstance()
+                .GetRootCoordinateSystem(),
+            vec);
+        particles::Code sec_code = corsika::particles::ConvertFromPDG(
+            static_cast<particles::PDGCode>(get<PROPOSAL::Loss::TYPE>(s)));
+        vP.AddSecondary(
+            make_tuple(sec_code, energy, momentum, vP.GetPosition(), vP.GetTime()));
+      }
     }
     return process::EProcessReturn::eOk;
   }
@@ -109,13 +108,16 @@ namespace corsika::process::proposal {
   template <>
   template <>
   corsika::units::si::GrammageType Interaction<SetupEnvironment>::GetInteractionLength(
-      SetupParticle const& vP) {
-    auto calc = GetCalculator(vP); // [CrossSections]
-    std::uniform_real_distribution<double> distr(0., 1.);
-    auto energy = get<INTERACTION>(calc->second)
-                      ->EnergyInteraction(vP.GetEnergy() / 1_GeV, distr(fRNG));
-    return get<DISPLACEMENT>(calc->second)
-               ->SolveTrackIntegral(vP.GetEnergy() / 1_GeV, energy) *
-           1_g / 1_cm / 1_cm;
+      setup::Stack::StackIterator& vP) {
+    if (CanInteract(vP.GetPID())) {
+      auto calc = GetCalculator(vP); // [CrossSections]
+      std::uniform_real_distribution<double> distr(0., 1.);
+      auto energy = get<INTERACTION>(calc->second)
+                        ->EnergyInteraction(vP.GetEnergy() / 1_GeV, distr(fRNG));
+      return get<DISPLACEMENT>(calc->second)
+                 ->SolveTrackIntegral(vP.GetEnergy() / 1_GeV, energy) *
+             1_g / 1_cm / 1_cm;
+    }
+    return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm);
   }
 } // namespace corsika::process::proposal
diff --git a/Processes/Proposal/Interaction.h b/Processes/Proposal/Interaction.h
index 8692dd4e68f0860f361aad77a762873a31adc122..503827f356892d636303a62c33f0ed31d5cb882d 100644
--- a/Processes/Proposal/Interaction.h
+++ b/Processes/Proposal/Interaction.h
@@ -38,12 +38,10 @@ namespace corsika::process::proposal {
     static std::unordered_map<particles::Code, PROPOSAL::ParticleDef> particles;
     std::unordered_map<const NuclearComposition*, PROPOSAL::Medium> media;
 
-    enum { SECONDARIES, INTERACTION, DISPLACEMENT };
-
     corsika::random::RNG& fRNG =
-        corsika::random::RNGManager::GetInstance().GetRandomStream("s_rndm");
+        corsika::random::RNGManager::GetInstance().GetRandomStream("p_rndm");
 
-    auto IsTracked(particles::Code pcode) const noexcept {
+    bool CanInteract(particles::Code pcode) const noexcept {
       auto search = particles.find(pcode);
       if (search != particles.end()) return true;
       return false;
@@ -54,6 +52,7 @@ namespace corsika::process::proposal {
               unique_ptr<PROPOSAL::Displacement>>;
     std::unordered_map<const NuclearComposition*, calculator_t> calculators;
 
+    enum { SECONDARIES, INTERACTION, DISPLACEMENT };
     template <typename Particle>
     auto GetCalculator(Particle& vP) {
       auto& comp = vP.GetNode()->GetModelProperties().GetNuclearComposition();
@@ -81,6 +80,5 @@ namespace corsika::process::proposal {
     template <typename TParticle>
     corsika::units::si::GrammageType GetInteractionLength(TParticle& p);
   };
-
 } // namespace corsika::process::proposal
 #endif