diff --git a/corsika/detail/modules/proposal/ContinuousProcess.inl b/corsika/detail/modules/proposal/ContinuousProcess.inl
index b8403dc145a85f212ceb95699443e56916c7336a..e65046c2324d4cb57119d22b4bd44953aec4a95e 100644
--- a/corsika/detail/modules/proposal/ContinuousProcess.inl
+++ b/corsika/detail/modules/proposal/ContinuousProcess.inl
@@ -16,12 +16,6 @@
 #include <corsika/framework/utility/COMBoost.hpp>
 #include <corsika/framework/core/Logging.hpp>
 
-#include <corsika/setup/SetupEnvironment.hpp>
-#include <corsika/setup/SetupStack.hpp>
-#include <corsika/setup/SetupTrajectory.hpp>
-
-#include <iostream>
-
 namespace corsika::proposal {
 
   inline void ContinuousProcess::buildCalculator(Code code,
@@ -54,13 +48,12 @@ namespace corsika::proposal {
     calc[std::make_pair(comp.getHash(), code)] = std::move(calculator);
   }
 
-  template <>
-  inline ContinuousProcess::ContinuousProcess(setup::Environment const& _env)
+  template <typename TEnvironment>
+  inline ContinuousProcess::ContinuousProcess(TEnvironment const& _env)
       : ProposalProcessBase(_env) {}
 
-  template <>
-  inline void ContinuousProcess::scatter(setup::Stack::particle_type& vP,
-                                         HEPEnergyType const& loss,
+  template <typename TParticle>
+  inline void ContinuousProcess::scatter(TParticle& vP, HEPEnergyType const& loss,
                                          GrammageType const& grammage) {
 
     // get or build corresponding calculators
@@ -91,9 +84,9 @@ namespace corsika::proposal {
     vP.setMomentum(MomentumVector(vP_dir.getCoordinateSystem(), vec));
   }
 
-  template <>
-  inline ProcessReturn ContinuousProcess::doContinuous(setup::Stack::particle_type& vP,
-                                                       setup::Trajectory const& vT,
+  template <typename TParticle, typename TTrajectory>
+  inline ProcessReturn ContinuousProcess::doContinuous(TParticle& vP,
+                                                       TTrajectory const& vT,
                                                        bool const) {
 
     if (!canInteract(vP.getPID())) return ProcessReturn::Ok;
@@ -119,9 +112,9 @@ namespace corsika::proposal {
     return ProcessReturn::Ok;
   }
 
-  template <>
-  inline LengthType ContinuousProcess::getMaxStepLength(
-      setup::Stack::particle_type const& vP, setup::Trajectory const& vT) {
+  template <typename TParticle, typename TTrajectory>
+  inline LengthType ContinuousProcess::getMaxStepLength(TParticle const& vP,
+                                                        TTrajectory const& vT) {
     auto const code = vP.getPID();
     if (!canInteract(code)) return meter * std::numeric_limits<double>::infinity();
 
diff --git a/corsika/detail/modules/proposal/Interaction.inl b/corsika/detail/modules/proposal/Interaction.inl
index 019d31270abeb1da6fe2a99121081363762dcac6..c450594146f13a7afaa809c99d0f3354d9427b02 100644
--- a/corsika/detail/modules/proposal/Interaction.inl
+++ b/corsika/detail/modules/proposal/Interaction.inl
@@ -12,10 +12,6 @@
 #include <corsika/framework/utility/COMBoost.hpp>
 #include <corsika/framework/core/PhysicalUnits.hpp>
 
-#include <corsika/setup/SetupEnvironment.hpp>
-#include <corsika/setup/SetupStack.hpp>
-#include <corsika/setup/SetupTrajectory.hpp>
-
 #include <limits>
 #include <memory>
 #include <random>
@@ -23,8 +19,8 @@
 
 namespace corsika::proposal {
 
-  template <>
-  inline Interaction::Interaction(setup::Environment const& _env)
+  template <typename TEnvironment>
+  inline Interaction::Interaction(TEnvironment const& _env)
       : ProposalProcessBase(_env) {}
 
   inline void Interaction::buildCalculator(Code code, NuclearComposition const& comp) {
@@ -52,8 +48,8 @@ namespace corsika::proposal {
         PROPOSAL::make_interaction(c, true));
   }
 
-  template <>
-  inline ProcessReturn Interaction::doInteraction(setup::StackView& view) {
+  template <typename TStackView>
+  inline ProcessReturn Interaction::doInteraction(TStackView& view) {
 
     auto const projectile = view.getProjectile();
 
@@ -106,9 +102,8 @@ namespace corsika::proposal {
     return ProcessReturn::Ok;
   }
 
-  template <>
-  inline GrammageType Interaction::getInteractionLength(
-      setup::Stack::particle_type const& projectile) {
+  template <typename TParticle>
+  inline GrammageType Interaction::getInteractionLength(TParticle const& projectile) {
 
     if (canInteract(projectile.getPID())) {
       auto c = getCalculator(projectile, calc);
diff --git a/corsika/detail/modules/proposal/ProposalProcessBase.inl b/corsika/detail/modules/proposal/ProposalProcessBase.inl
index bc497ea94a696c926ffd42baaf4283ee644e50ad..0633df0c6cf25c71f9b83e2a06db0c53e4feea06 100644
--- a/corsika/detail/modules/proposal/ProposalProcessBase.inl
+++ b/corsika/detail/modules/proposal/ProposalProcessBase.inl
@@ -12,10 +12,6 @@
 #include <corsika/framework/core/PhysicalUnits.hpp>
 #include <corsika/framework/utility/COMBoost.hpp>
 
-#include <corsika/setup/SetupEnvironment.hpp>
-#include <corsika/setup/SetupStack.hpp>
-#include <corsika/setup/SetupTrajectory.hpp>
-
 #include <cstdlib>
 #include <iostream>
 #include <limits>
@@ -30,7 +26,8 @@ namespace corsika::proposal {
     return false;
   }
 
-  inline ProposalProcessBase::ProposalProcessBase(setup::Environment const& _env)
+  template <typename TEnvironment>
+  inline ProposalProcessBase::ProposalProcessBase(TEnvironment const& _env)
       : RNG_(RNGManager::getInstance().getRandomStream("proposal")) {
     _env.getUniverse()->walk([&](auto& vtn) {
       if (vtn.hasModelProperties()) {
diff --git a/corsika/modules/proposal/Interaction.hpp b/corsika/modules/proposal/Interaction.hpp
index 80a8a7864247e2bc798db5564aa8506869ce1525..b6f2fabbab60f772f69eb83bd9f78697a08fb8f8 100644
--- a/corsika/modules/proposal/Interaction.hpp
+++ b/corsika/modules/proposal/Interaction.hpp
@@ -16,12 +16,8 @@
 #include <corsika/framework/random/RNGManager.hpp>
 #include <corsika/framework/random/UniformRealDistribution.hpp>
 
-#include <corsika/media/Environment.hpp>
-
 #include <corsika/modules/proposal/ProposalProcessBase.hpp>
 
-#include <array>
-
 namespace corsika::proposal {
 
   //!
diff --git a/corsika/modules/proposal/ProposalProcessBase.hpp b/corsika/modules/proposal/ProposalProcessBase.hpp
index 3edb90720f2346161f062c45ec79b8f9de85c639..d1231a5db0923db85f51fdd1400ca8923c6d003e 100644
--- a/corsika/modules/proposal/ProposalProcessBase.hpp
+++ b/corsika/modules/proposal/ProposalProcessBase.hpp
@@ -13,8 +13,6 @@
 #include <corsika/framework/core/ParticleProperties.hpp>
 #include <corsika/framework/random/RNGManager.hpp>
 
-#include <corsika/setup/SetupEnvironment.hpp>
-
 #include <array>
 
 namespace corsika::proposal {
@@ -83,7 +81,8 @@ namespace corsika::proposal {
     //! Store cut and  nuclear composition of the whole universe in media which are
     //! required for creating crosssections by proposal.
     //!
-    ProposalProcessBase(corsika::setup::Environment const& _env);
+    template <typename TEnvironment>
+    ProposalProcessBase(TEnvironment const& _env);
 
     //!
     //! Checks if a particle can be processed by proposal