diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index 0d4dc8c0f72b61dd15391ac4012196021a2e8e15..c0dcbdb7323704c658d897f57ca207a397fb4192 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -220,10 +220,7 @@ struct MyBoundaryCrossingProcess
     : public BoundaryCrossingProcess<MyBoundaryCrossingProcess> {
   //~ environment::BaseNodeType const& fA, fB;
 
-  MyBoundaryCrossingProcess() {}
-
-  //~ MyBoundaryCrossingProcess(environment::BaseNodeType const& a,
-  // environment::BaseNodeType const& b) : fA(a), fB(b) {}
+  MyBoundaryCrossingProcess(std::string const& filename) {fFile.open(filename);}
 
   template <typename Particle>
   EProcessReturn DoBoundaryCrossing(Particle& p,
@@ -232,11 +229,18 @@ struct MyBoundaryCrossingProcess
     std::cout << "boundary crossing! from:" << &from << "; to: " << &to << std::endl;
 
     //~ if ((&fA == &from && &fB == &to) || (&fA == &to && &fB == &from)) {
-    p.Delete();
+    //~ p.Delete();
     //~ }
+    
+    auto const& name = particles::GetName(p.GetPID());
+    auto const start = p.GetPosition().GetCoordinates();
+    
+    fFile << name << "    " << start[0] / 1_m << ' ' << start[1] / 1_m << ' ' << start[2] / 1_m << '\n';
 
     return EProcessReturn::eOk;
   }
+  
+  std::ofstream fFile;
 
   void Init() {}
 };
@@ -282,7 +286,7 @@ int main() {
           std::vector<float>{(float)1. - fox, fox}));
 
   auto innerMedium = EnvType::CreateNode<Sphere>(
-      Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, 2000_m);
+      Point{env.GetCoordinateSystem(), 0_m, 0_m, -500_m}, 1000_m);
 
   innerMedium->SetModelProperties<
       TheNameModel<environment::HomogeneousMedium<setup::IEnvironmentModel>>>(
@@ -312,12 +316,13 @@ int main() {
   process::HadronicElasticModel::HadronicElasticInteraction hadronicElastic;
 
   process::TrackWriter::TrackWriter trackWriter("tracks.dat");
+  MyBoundaryCrossingProcess boundaryCrossing("crossings.dat");
 
   // assemble all processes into an ordered process list
   // auto sequence = p0 << sibyll << decay << hadronicElastic << cut << trackWriter;
   auto sequence =
-      p0 /*<< sibyll << sibyllNuc << decay << cut*/ << hadronicElastic
-                                                    << MyBoundaryCrossingProcess()
+      /*p0 <<*/ sibyll << sibyllNuc << decay << cut /* << hadronicElastic */
+                                                    << boundaryCrossing
                                                     << trackWriter;
 
   // setup particle stack, and add primary particle
@@ -328,10 +333,9 @@ int main() {
   const int nuclZ = int(nuclA / 2.15 + 0.7);
   const HEPMassType mass = particles::Proton::GetMass() * nuclZ +
                            (nuclA - nuclZ) * particles::Neutron::GetMass();
-  const HEPEnergyType E0 = nuclA * 100_TeV;
-  double theta = 0;
+  const HEPEnergyType E0 = nuclA * 10_TeV;
   double phi = 0;
-
+  for (double theta = 0; theta < 180; theta += 20)
   {
     auto elab2plab = [](HEPEnergyType Elab, HEPMassType m) {
       return sqrt(Elab * Elab - m * m);
diff --git a/Processes/TrackingLine/TrackingLine.cc b/Processes/TrackingLine/TrackingLine.cc
index 6b119c890aa573b4d62fea9b693472384e1bdfaf..319030f91d5347d47af58cddbdea607684a16677 100644
--- a/Processes/TrackingLine/TrackingLine.cc
+++ b/Processes/TrackingLine/TrackingLine.cc
@@ -44,8 +44,8 @@ namespace corsika::process::tracking_line {
     if (discriminant.magnitude() > 0) {
       auto const sqDisc = sqrt(discriminant);
       auto const invDenom = 1 / vSqNorm;
-      return std::make_pair((vDotDelta - sqDisc) * invDenom,
-                            (vDotDelta + sqDisc) * invDenom);
+      return std::make_pair((-vDotDelta - sqDisc) * invDenom,
+                            (-vDotDelta + sqDisc) * invDenom);
     } else {
       return {};
     }
diff --git a/Processes/TrackingLine/TrackingLine.h b/Processes/TrackingLine/TrackingLine.h
index ff3b178aa4ee597e3a13598e3514fb1c2e7340e7..001297004ed185d12094b7d0127ba61d6b2ff4cf 100644
--- a/Processes/TrackingLine/TrackingLine.h
+++ b/Processes/TrackingLine/TrackingLine.h
@@ -12,8 +12,6 @@
 #ifndef _include_corsika_processes_TrackingLine_h_
 #define _include_corsika_processes_TrackingLine_h_
 
-//~ #include <corsika/environment/Environment.h>
-//~ #include <corsika/environment/VolumeTreeNode.h>
 #include <corsika/units/PhysicalUnits.h>
 #include <corsika/geometry/Vector.h>
 #include <corsika/geometry/Trajectory.h>
@@ -27,10 +25,6 @@ namespace corsika::environment {
   template <typename IEnvironmentModel> class Environment;
   template <typename IEnvironmentModel> class VolumeTreeNode;
 }
-namespace corsika::geometry {
-  class Line;
-  class Sphere;
-} // namespace corsika::geometry
 
 namespace corsika::process {
 
@@ -70,14 +64,16 @@ namespace corsika::process {
         //~ fEnvironment.GetUniverse()->GetContainingNode(currentPosition);
         auto const numericallyInside =
             currentLogicalVolumeNode->GetVolume().Contains(currentPosition);
+            
+        std::cout << "numericallyInside = " << (numericallyInside ? "true":"false");
 
         auto const& children = currentLogicalVolumeNode->GetChildNodes();
         auto const& excluded = currentLogicalVolumeNode->GetExcludedNodes();
 
         std::vector<std::pair<TimeType, decltype(p.GetNode())>> intersections;
 
-        auto addIfIntersects = [&](auto const& vtn, auto const& nextNode) {
-          static_assert(std::is_same_v<decltype(vtn), decltype(nextNode)>);
+		// for entering from outside
+        auto addIfIntersects = [&](auto const& vtn) {
           auto const& volume = vtn.GetVolume();
           auto const& sphere = dynamic_cast<geometry::Sphere const&>(
               volume); // for the moment we are a bit bold here and assume
@@ -88,14 +84,14 @@ namespace corsika::process {
             std::cout << "intersection times: " << t1 / 1_s << "; " << t2 / 1_s
                       << std::endl;
             if (t1.magnitude() > 0)
-              intersections.emplace_back(t1, &nextNode);
+              intersections.emplace_back(t1, &vtn);
             else if (t2.magnitude() > 0)
               throw std::runtime_error("inside other volume");
           }
         };
 
-        for (auto const& child : children) { addIfIntersects(*child, *child); }
-        for (auto const* ex : excluded) { addIfIntersects(*ex, *ex); }
+        for (auto const& child : children) { addIfIntersects(*child); }
+        for (auto const* ex : excluded) { addIfIntersects(*ex); }
 
         {
           auto const& sphere = dynamic_cast<geometry::Sphere const&>(
@@ -120,7 +116,8 @@ namespace corsika::process {
           min = minIter->first;
         }
 
-        std::cout << " t-intersect: " << min << std::endl;
+        std::cout << " t-intersect: " << min << " "  << minIter->second->GetModelProperties().GetName() << std::endl;
+        std::cout << "point of intersection: " << line.GetPosition(min).GetCoordinates() << std::endl;
 
         return std::make_tuple(geometry::Trajectory<geometry::Line>(line, min), velocity.norm() * min,
                                minIter->second);
diff --git a/Processes/TrackingLine/testTrackingLine.cc b/Processes/TrackingLine/testTrackingLine.cc
index 26dce27d178bae5bb7c7cb4f48b0f4d2c58df060..fb213f9d8e3729015a8ad2f19c092e3d476bf9dc 100644
--- a/Processes/TrackingLine/testTrackingLine.cc
+++ b/Processes/TrackingLine/testTrackingLine.cc
@@ -41,7 +41,7 @@ TEST_CASE("TrackingLine") {
   tracking_line::TrackingLine tracking;
 
   SECTION("intersection with sphere") {
-    Point const origin(cs, {0_m, 0_m, 0_m});
+    Point const origin(cs, {0_m, 0_m, -5_m});
     Point const center(cs, {0_m, 0_m, 10_m});
     Sphere const sphere(center, 1_m);
     Vector<corsika::units::si::SpeedType::dimension_type> v(cs, 0_m / second,
@@ -55,8 +55,8 @@ TEST_CASE("TrackingLine") {
     REQUIRE(opt.has_value());
 
     auto [t1, t2] = opt.value();
-    REQUIRE(t1 / 9_s == Approx(1));
-    REQUIRE(t2 / 11_s == Approx(1));
+    REQUIRE(t1 / 14_s == Approx(1));
+    REQUIRE(t2 / 16_s == Approx(1));
 
     auto const optNoIntersection =
         tracking_line::TimeOfIntersection(traj, Sphere(Point(cs, {5_m, 0_m, 10_m}), 1_m));
@@ -70,6 +70,7 @@ TEST_CASE("TrackingLine") {
 
     auto theMedium = environment::Environment<environment::Empty>::CreateNode<Sphere>(
         Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, radius);
+    auto const* theMediumPtr = theMedium.get();
     universe.AddChild(std::move(theMedium));
 
     TestTrackingLineStack stack;
@@ -82,6 +83,7 @@ TEST_CASE("TrackingLine") {
             {cs, {0_m, 0_m, 0_km}},
             0_ns});
     auto p = stack.GetNextParticle();
+    p.SetNode(theMediumPtr);
 
     Point const origin(cs, {0_m, 0_m, 0_m});
     Vector<corsika::units::si::SpeedType::dimension_type> v(cs, 0_m / second,