diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h
index db628600737f260e007e3acde8eca63ae2b2943e..f4d1381b339f0cd821e029d678bb55a35b2808e1 100644
--- a/Framework/Cascade/Cascade.h
+++ b/Framework/Cascade/Cascade.h
@@ -33,6 +33,9 @@
 #include <cmath>
 #include <limits>
 
+#include <boost/type_index.hpp>
+using boost::typeindex::type_id_with_cvr;
+
 /**
  * The cascade namespace assembles all objects needed to simulate full particles cascades.
  */
@@ -225,7 +228,7 @@ namespace corsika::cascade {
 
       // take minimum of geometry, interaction, decay for next step
       auto const min_distance =
-          std::min({distance_interact, distance_decay/*, distance_max, geomMaxLength*/});
+          std::min({distance_interact, distance_decay, distance_max, geomMaxLength});
 
       C8LOG_DEBUG("transport particle by : {} m", min_distance / 1_m);
 
@@ -233,19 +236,21 @@ namespace corsika::cascade {
       // std::visit(setup::ParticleUpdate<Particle>{vParticle}, step);
       vParticle.SetPosition(step.PositionFromArclength(min_distance));
       // .... also update time, momentum, direction, ...
-
-// magneticfield/u have wrong units, not sure if corsika::stack is right
-	  auto magneticfield = corsika::stack::MomentumVector(fEnvironment.GetCoordinateSystem(),
-	        {0_eV, 50e-06_eV, 0_eV});
+	  
+	  //Euler algorithm to change momentum of the particle
+	  int charge;
+	  if(corsika::particles::IsNucleus(vParticle.GetPID())) {
+        charge = vParticle.GetNuclearZ();
+	  } else {
+		charge = corsika::particles::GetChargeNumber(vParticle.GetPID());
+	  }
 	  geometry::Vector<SpeedType::dimension_type> const velocity =
-            vParticle.GetMomentum() / vParticle.GetEnergy() * corsika::units::constants::c;
-      geometry::Vector<SpeedType::dimension_type> const u = velocity * 1_m / (velocity.GetNorm() * 1_s) + 
-        velocity.cross(magneticfield) * corsika::particles::GetChargeNumber(vParticle.GetPID()) * 
+        vParticle.GetMomentum() / vParticle.GetEnergy() * corsika::units::constants::c;
+      geometry::Vector<dimensionless_d> const u = velocity / velocity.GetNorm() + 
+        velocity.cross(fEnvironment.GetMagneticField(vParticle.GetPosition())) * charge *
             min_distance * corsika::units::constants::cSquared / 
-                (vParticle.GetEnergy() * velocity.GetNorm() * velocity.GetNorm()* 1_m);
-	  vParticle.SetMomentum(u * 1_s / 1_m * vParticle.GetMomentum().GetNorm());
-//      std::cout << " Test: " << magneticfield.GetComponents() << std::endl;
-//      std::cout << " Test: " << vParticle.GetMomentum().cross(magneticfield).GetComponents() << std::endl;
+                (vParticle.GetEnergy() * velocity.GetNorm() * velocity.GetNorm());
+	  vParticle.SetMomentum(u * vParticle.GetMomentum().GetNorm());
       vParticle.SetTime(vParticle.GetTime() + min_distance / units::constants::c);
 
       step.LimitEndTo(min_distance);