diff --git a/Processes/Proposal/Interaction.cc b/Processes/Proposal/Interaction.cc
index ea9186b019b56ab48a8dd2e41b757cf35ed0c745..834f2a133021350d5562f443cbf58da040d3a92a 100644
--- a/Processes/Proposal/Interaction.cc
+++ b/Processes/Proposal/Interaction.cc
@@ -39,20 +39,21 @@ namespace corsika::process::proposal {
   Interaction::Interaction(SetupEnvironment const& _env, CORSIKA_ParticleCut const& _cut)
       : cut(make_shared<const PROPOSAL::EnergyCutSettings>(_cut.GetCutEnergy() / 1_GeV, 1,
                                                            false)) {
-    auto all_compositions = std::vector<NuclearComposition>();
+    auto all_compositions = std::vector<const NuclearComposition*>();
     _env.GetUniverse()->walk([&](auto& vtn) {
-      if (vtn.HasModelProperties())
-        all_compositions.push_back(vtn.GetModelProperties().GetNuclearComposition());
+      if (vtn.HasModelProperties()) {
+        all_compositions.push_back(&vtn.GetModelProperties().GetNuclearComposition());
+      }
     });
     for (auto& ncarg : all_compositions) {
       auto comp_vec = std::vector<Component_PROPOSAL>();
-      auto frac_iter = ncarg.GetFractions().cbegin();
-      for (auto& pcode : ncarg.GetComponents()) {
+      auto frac_iter = ncarg->GetFractions().cbegin();
+      for (auto& pcode : ncarg->GetComponents()) {
         comp_vec.emplace_back(GetName(pcode), GetNucleusZ(pcode), GetNucleusA(pcode),
                               *frac_iter);
         ++frac_iter;
       }
-      media[&ncarg] = PROPOSAL::Medium(
+      media[ncarg] = PROPOSAL::Medium(
           "Modified Air", 1., PROPOSAL::Air().GetI(), PROPOSAL::Air().GetC(),
           PROPOSAL::Air().GetA(), PROPOSAL::Air().GetM(), PROPOSAL::Air().GetX0(),
           PROPOSAL::Air().GetX1(), PROPOSAL::Air().GetD0(), 1.0, comp_vec);
diff --git a/Processes/Proposal/Interaction.h b/Processes/Proposal/Interaction.h
index d4b3c103a4380c10332f506e312397b3140c8769..33632445792f730929a61fcc36e44038fe233b81 100644
--- a/Processes/Proposal/Interaction.h
+++ b/Processes/Proposal/Interaction.h
@@ -49,17 +49,46 @@ namespace corsika::process::proposal {
       auto& comp = vP.GetNode()->GetModelProperties().GetNuclearComposition();
       auto calc_it = calculators.find(&comp);
       if (calc_it != calculators.end()) return calc_it;
-      auto cross =
-          PROPOSAL::GetStdCrossSections(particles[vP.GetPID()], media[&comp], cut, true);
-      auto inter_types = PROPOSAL::CrossSectionVector::GetInteractionTypes(cross);
-      auto [insert_it, success] = calculators.insert(
-          {&comp, make_tuple(PROPOSAL::SecondariesCalculator(
-                                 inter_types, particles[vP.GetPID()], media[&comp]),
-                             PROPOSAL::make_interaction(cross, true),
-                             PROPOSAL::make_displacement(cross, true))});
-      return insert_it;
+      return BuildCalculator(vP.GetPID(), comp);
     }
 
+    auto BuildCalculator(particles::Code corsika_code, NuclearComposition const& comp) {
+      auto medium = media.at(&comp);
+      if (corsika_code == particles::Code::Gamma) {
+        auto cross =
+            GetStdCrossSections(PROPOSAL::GammaDef(), media.at(&comp), cut, true);
+        auto inter_types = PROPOSAL::CrossSectionVector::GetInteractionTypes(cross);
+        auto [insert_it, success] = calculators.insert(
+            {&comp, make_tuple(PROPOSAL::SecondariesCalculator(
+                                   inter_types, PROPOSAL::GammaDef(), media[&comp]),
+                               PROPOSAL::make_interaction(cross, true),
+                               PROPOSAL::make_displacement(cross, true))});
+        return insert_it;
+      }
+      if (corsika_code == particles::Code::Electron) {
+        auto cross =
+            GetStdCrossSections(PROPOSAL::EMinusDef(), media.at(&comp), cut, true);
+        auto inter_types = PROPOSAL::CrossSectionVector::GetInteractionTypes(cross);
+        auto [insert_it, success] = calculators.insert(
+            {&comp, make_tuple(PROPOSAL::SecondariesCalculator(
+                                   inter_types, PROPOSAL::EMinusDef(), media[&comp]),
+                               PROPOSAL::make_interaction(cross, true),
+                               PROPOSAL::make_displacement(cross, true))});
+        return insert_it;
+      }
+      if (corsika_code == particles::Code::Positron) {
+        auto cross =
+            GetStdCrossSections(PROPOSAL::EPlusDef(), media.at(&comp), cut, true);
+        auto inter_types = PROPOSAL::CrossSectionVector::GetInteractionTypes(cross);
+        auto [insert_it, success] = calculators.insert(
+            {&comp, make_tuple(PROPOSAL::SecondariesCalculator(
+                                   inter_types, PROPOSAL::EPlusDef(), media[&comp]),
+                               PROPOSAL::make_interaction(cross, true),
+                               PROPOSAL::make_displacement(cross, true))});
+        return insert_it;
+      }
+    } // namespace corsika::process::proposal
+
   public:
     template <typename TEnvironment>
     Interaction(TEnvironment const& env, CORSIKA_ParticleCut const& cut);
@@ -71,6 +100,6 @@ namespace corsika::process::proposal {
 
     template <typename TParticle>
     corsika::units::si::GrammageType GetInteractionLength(TParticle const& p);
-  };
+  }; // namespace corsika::process::proposal
 } // namespace corsika::process::proposal
 #endif