diff --git a/Processes/Proposal/Interaction.cc b/Processes/Proposal/Interaction.cc
index f91ed4e43a7a3a7a50faf8c91c4505f616390b6b..a42cf04f1349c948e4902b76fa0b2bb5ed079756 100644
--- a/Processes/Proposal/Interaction.cc
+++ b/Processes/Proposal/Interaction.cc
@@ -1,3 +1,4 @@
+
 #include <corsika/process/proposal/Interaction.h>
 #include <corsika/setup/SetupStack.h>
 #include <corsika/setup/SetupTrajectory.h>
@@ -9,7 +10,8 @@
 #include <memory>
 #include <limits>
 #include <random>
-
+#include <tuple>
+#include <corsika/utl/COMBoost.h>
 
 namespace corsika::process::proposal {
 
@@ -169,7 +171,7 @@ corsika::units::si::GrammageType Interaction<SetupEnvironment>::GetInteractionLe
         double rndiMin = corsika_particle_to_utility_map[vP.GetPID()]->Calculate(particle_energy, 0, 0);
 
         if (rndi >= rndiMin || rndiMin <= 0) {
-            return 1 * 1_g / 1_cm / 1_cm;
+            return  std::numeric_limits<double>::max() * 1_g / 1_cm / 1_cm;
         }
         double final_energy = corsika_particle_to_utility_map[vP.GetPID()]->GetUpperLimit(particle_energy, rndi) ;
         return corsika_particle_to_displacement_map[vP.GetPID()]->Calculate(
@@ -190,6 +192,8 @@ process::EProcessReturn Interaction<SetupEnvironment>::DoInteraction(SetupPartic
     double rnd3 = distribution(fRNG);
     double particle_energy = vP.GetEnergy()  / 1_GeV * 1000;
 
+	corsika::geometry::Point pOrig = vP.GetPosition();
+	corsika::units::si::TimeType tOrig = vP.GetTime();
 	corsika::stack::MomentumVector Ptot = vP.GetMomentum();
     corsika::geometry::QuantityVector q_momentum = Ptot.GetComponents();
 	PROPOSAL::Vector3D initial_direction(q_momentum[0] / 1_GeV, q_momentum[1] / 1_GeV, q_momentum[2] / 1_GeV);
@@ -198,31 +202,46 @@ process::EProcessReturn Interaction<SetupEnvironment>::DoInteraction(SetupPartic
 	std::pair<double, PROPOSAL::DynamicData::Type> energy_loss;
 	energy_loss = corsika_particle_to_utility_map[vP.GetPID()]->GetUtility().StochasticLoss(particle_energy, rnd1, rnd2, rnd3);
 
-	// std::vector<CrossSection*> cross_sections = utility_.GetCrosssections();
-	// for (unsigned int i = 0; i < cross_sections.size(); i++) {
-	// 	if (cross_sections[i]->GetTypeId() == energy_loss.second)
-	// 	{
-	// 		deflection_angles = cross_sections[i]->StochasticDeflection(particle_energy, energy_loss.first);
-	// 		// calculate produced particles, get an empty list if no particles
-            // // are produced in interaction
-	// 		products = cross_sections[i]->CalculateProducedParticles(particle_energy, energy_loss.first, particle_.GetDirection());
-	// 	}
-	// }
-
-	// auto pnew = vP.AddSecondary(tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
-	// 							geometry::Point, units::si::TimeType>
-	// 							{
-	// 							  process::sibyll::ConvertFromSibyll(psib.GetPID()),
-	// 							  Plab.GetTimeLikeComponent(),
-	// 							  Plab.GetSpaceLikeComponents(),
-	// 							  pOrig,
-	// 							  tOrig
-	// 							}
-	// 			);
-
+	std::vector<PROPOSAL::CrossSection*> cross_sections = corsika_particle_to_utility_map[vP.GetPID()]->GetUtility().GetCrosssections();
+    std::pair<std::vector<PROPOSAL::Particle*>, bool> products;
+	for (unsigned int i = 0; i < cross_sections.size(); i++) {
+		if (cross_sections[i]->GetTypeId() == energy_loss.second)
+		{
+			// calculate produced particles, get an empty list if no particles
+            // are produced in interaction
+			products = cross_sections[i]->CalculateProducedParticles(particle_energy, energy_loss.first, initial_direction);
+            break;
+		}
+	}
+    double particle_energy_after_loss = particle_energy - energy_loss.first;
+    if (particle_energy_after_loss == 0.)
+    {
+        PROPOSAL::Vector3D particle_direction = initial_direction * particle_energy_after_loss;
+
+        corsika::geometry::QuantityVector q_vec(
+            particle_direction.GetX() * 1_MeV,
+            particle_direction.GetY() * 1_MeV,
+            particle_direction.GetZ() * 1_MeV);
+        // vp.GetCoordinateSystem();
+        const corsika::geometry::CoordinateSystem& rootCS = corsika::geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem();
+        corsika::stack::MomentumVector p_particle(rootCS, q_vec);
+        // std::cout << p_particle.GetTimeLikeComponent() << " and " << particle_energy_after_loss << std::endl;
+        units::si::HEPEnergyType const converted_particle_energy = particle_energy * 1_GeV;
+        HEPEnergyType const eCoM = particle_energy * 1_GeV ;
+        //auto const Plab = boost.fromCoM(FourVector(eCoM, p_particle));
+	auto pnew = vP.AddSecondary(std::tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
+								geometry::Point, units::si::TimeType>
+                                {
+                                 //convert_proposal_particle_name_to_corsika_code[PROPOSAL::MuMinusDef::Get().name],
+                                 vP.GetPID(),
+                                 eCoM,
+                                 p_particle,
+                                 pOrig,
+                                 tOrig
+                                 }
+				);
+    }
 	// // position and time of interaction, not used in PROPOSAL
-	// Point pOrig = vP.GetPosition();
-	// TimeType tOrig = vP.GetTime();
 
 	// // add to corsika stack
 	// auto pnew = vP.AddSecondary(tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector,
diff --git a/Processes/Proposal/Interaction.h b/Processes/Proposal/Interaction.h
index a574e1eb147084cc3caed0e6bf2bf6f1436ebcc3..3defff2a05ea53461fd0862fc61725dcf820da1d 100644
--- a/Processes/Proposal/Interaction.h
+++ b/Processes/Proposal/Interaction.h
@@ -41,6 +41,33 @@ namespace corsika::process::proposal {
 
     corsika::random::RNG& fRNG = corsika::random::RNGManager::GetInstance().GetRandomStream("s_rndm");
 
+    std::map<std::string, particles::Code> const convert_proposal_particle_name_to_corsika_code = {
+        {"Gamma", particles::Code::Gamma},
+        {"EMinus", particles::Code::Electron},
+        {"EPlus", particles::Code::Positron},
+        {"MuMinu", particles::Code::MuMinus},
+        {"MuPlus", particles::Code::MuPlus},
+        {"TauPlus", particles::Code::TauPlus},
+        {"TauMinus",particles::Code::TauMinus},
+    };
+
+    std::map<particles::Code, PROPOSAL::ParticleDef> const convert_corsika_code_to_proposal_particle_def = {
+        {particles::Code::Gamma, PROPOSAL::GammaDef::Get()},
+        {particles::Code::Electron, PROPOSAL::EMinusDef::Get()},
+        {particles::Code::Positron, PROPOSAL::EPlusDef::Get()},
+        {particles::Code::MuMinus, PROPOSAL::MuMinusDef::Get()},
+        {particles::Code::MuPlus, PROPOSAL::MuPlusDef::Get()},
+        {particles::Code::TauPlus, PROPOSAL::TauPlusDef::Get()},
+        {particles::Code::TauMinus, PROPOSAL::TauMinusDef::Get()},
+    };
+
+    // fTrackedParticles[proposal_particle.GetName()] return  particle::Code
+
+    bool IsTracked(particles::Code pcode) {
+        for (auto i : convert_corsika_code_to_proposal_particle_def) if (i.first==pcode) return true;
+        return false;
+    };
+
 
   public:
     Interaction(TEnvironment const& env, ParticleCut const& cut);