diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index dd776a1f326186d39b8a95ef1fad315b0b26be91..2203a2cb0016e51bc2f83b104dbcba97c5562952 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -245,11 +245,10 @@ double s_rndm_(int&) {
 }
 
 int main() {
-  Environment env;
-  //~ auto& universe = env.GetUniverse();
+  corsika::environment::Environment env; // dummy environment  
   auto& universe = *(env.GetUniverse());
 
-  auto const theMedium = Environment::CreateNode<Sphere>(
+  auto theMedium = corsika::environment::Environment::CreateNode<Sphere>(
       Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, 100_km);
       
   universe.AddChild(std::move(theMedium));
diff --git a/Environment/Environment.h b/Environment/Environment.h
index 65de554e79b4aa105939a26625de6d4878c1d7a5..285659a6bc1ec707673f55ee03f1f8d9ab1a9ea1 100644
--- a/Environment/Environment.h
+++ b/Environment/Environment.h
@@ -17,13 +17,19 @@
 #include <corsika/setup/SetupEnvironment.h>
 
 namespace corsika::environment {
+  struct Universe : public corsika::geometry::Volume {
+      bool Contains(corsika::geometry::Point const&) const override {return true;}
+  };
 
   class Environment {
   public:
+    Environment() : fUniverse(std::make_unique<VolumeTreeNode<IEnvironmentModel>>(
+          std::make_unique<Universe>())) {}
+  
     using IEnvironmentModel = corsika::setup::IEnvironmentModel;
 
-    auto& GetUniverse() { return universe; }
-    auto const& GetUniverse() const { return universe; }
+    auto& GetUniverse() { return fUniverse; }
+    auto const& GetUniverse() const { return fUniverse; }
 
     auto const& GetCoordinateSystem() const {
       return corsika::geometry::RootCoordinateSystem::GetInstance().GetRootCS();
@@ -41,7 +47,7 @@ namespace corsika::environment {
     }
 
   private:
-    VolumeTreeNode<IEnvironmentModel>::VTNUPtr universe;
+    VolumeTreeNode<IEnvironmentModel>::VTNUPtr fUniverse;
   };
 
 } // namespace corsika::environment
diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc
index 5017d5acf48727e167d7a6cba90d8c446b47e6fe..5419838f0413b3b12a41c1bae8c8b0b686d76755 100644
--- a/Framework/Cascade/testCascade.cc
+++ b/Framework/Cascade/testCascade.cc
@@ -78,8 +78,13 @@ private:
 
 TEST_CASE("Cascade", "[Cascade]") {
   corsika::environment::Environment env; // dummy environment
+  auto& universe = *(env.GetUniverse());
+  auto const radius = 20_km;
+  auto theMedium = corsika::environment::Environment::CreateNode<Sphere>(
+    Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, radius);      
+  universe.AddChild(std::move(theMedium));
 
-  tracking_line::TrackingLine<setup::Stack> tracking(env);
+  tracking_line::TrackingLine<setup::Stack> tracking(env);  
 
   stack_inspector::StackInspector<setup::Stack> p0(true);
   ProcessSplit p1;
diff --git a/Framework/Geometry/Vector.h b/Framework/Geometry/Vector.h
index 904b7039874ec3dbca83692f9316f93a0932201b..94394b90dd859761d4f15d0a2389f173726ee34d 100644
--- a/Framework/Geometry/Vector.h
+++ b/Framework/Geometry/Vector.h
@@ -190,7 +190,7 @@ namespace corsika::geometry {
 
       using ProdQuantity = phys::units::detail::Product<dim, dim2, double, double>;
 
-      return ProdQuantity(bareResult);
+      return ProdQuantity(phys::units::detail::magnitude_tag, bareResult);
     }
   };
 
diff --git a/Processes/StackInspector/StackInspector.cc b/Processes/StackInspector/StackInspector.cc
index b0acefc4a86c72acba373feafc82b7434aa2b9a0..1986c83bb4471b1adee8b2b13653cb64c7ef5167 100644
--- a/Processes/StackInspector/StackInspector.cc
+++ b/Processes/StackInspector/StackInspector.cc
@@ -12,6 +12,7 @@
 #include <corsika/geometry/RootCoordinateSystem.h>
 #include <corsika/process/stack_inspector/StackInspector.h>
 #include <corsika/units/PhysicalUnits.h>
+#include <corsika/particles/ParticleProperties.h>
 
 #include <corsika/logging/Logger.h>
 
diff --git a/Processes/TrackingLine/TrackingLine.h b/Processes/TrackingLine/TrackingLine.h
index 99fe8272ac09ad9a95c590d72939392daea5e92b..a53fbc6ceee5a1fe0c34e0563038f946d79d5500 100644
--- a/Processes/TrackingLine/TrackingLine.h
+++ b/Processes/TrackingLine/TrackingLine.h
@@ -14,6 +14,7 @@
 #include <algorithm>
 #include <iostream>
 #include <optional>
+#include <utility>
 
 using namespace corsika;
 
@@ -28,7 +29,7 @@ namespace corsika::process {
       corsika::environment::Environment const& fEnvironment;
 
     public:
-      std::optional<corsika::units::si::TimeType> TimeOfIntersection(
+      std::optional<std::pair<corsika::units::si::TimeType, corsika::units::si::TimeType>> TimeOfIntersection(
           corsika::geometry::Line const& traj, geometry::Sphere const& sphere) {
         using namespace corsika::units::si;
         auto const& cs = fEnvironment.GetCoordinateSystem();
@@ -49,8 +50,8 @@ namespace corsika::process {
         //~ std::cout << "beta: " << beta << std::endl;
 
         if (discriminant.magnitude() > 0) {
-          auto const t = (-alpha - sqrt(discriminant)) / (2 * v0.squaredNorm());
-          return t;
+          (-alpha - sqrt(discriminant)) / (2 * v0.squaredNorm());
+          return std::make_pair((-alpha - sqrt(discriminant)) / (2 * v0.squaredNorm()), (-alpha + sqrt(discriminant)) / (2 * v0.squaredNorm()));
         } else {
           return {};
         }
@@ -82,7 +83,13 @@ namespace corsika::process {
                        // everything is a sphere, crashes with exception if not
 
           if (auto opt = TimeOfIntersection(line, sphere); opt.has_value())
-            intersectionTimes.push_back(*opt);
+          {
+            auto const [t1, t2] = *opt;
+            if (t1.magnitude() >= 0)
+                intersectionTimes.push_back(t1);
+            else if (t2.magnitude() >= 0)
+                intersectionTimes.push_back(t2);
+          }
         };
 
         for (auto const& child : children) { addIfIntersects(*child); }
diff --git a/Processes/TrackingLine/testTrackingLine.cc b/Processes/TrackingLine/testTrackingLine.cc
index 050b1b932a52bacf83d77b216f7cdd440e3f53eb..ef44f2390a5071f645e383bff23373d8ec240993 100644
--- a/Processes/TrackingLine/testTrackingLine.cc
+++ b/Processes/TrackingLine/testTrackingLine.cc
@@ -32,12 +32,27 @@ using namespace corsika::geometry;
 using namespace std;
 using namespace corsika::units::si;
 
+struct DummyParticle {
+    EnergyType fEnergy;
+    Vector<momentum_d> fMomentum;
+    Point fPosition;
+    
+    DummyParticle(EnergyType pEnergy, Vector<momentum_d> pMomentum, Point pPosition) : fEnergy(pEnergy), fMomentum(pMomentum), fPosition(pPosition) {}
+    
+    auto GetEnergy() const { return fEnergy; }
+    auto GetMomentum() const { return fMomentum; }
+    auto GetPosition() const { return fPosition; }
+};
+
+struct DummyStack {
+    using ParticleType = DummyParticle;
+};
 
 TEST_CASE("TrackingLine") {
   corsika::environment::Environment env; // dummy environment
   auto const& cs = env.GetCoordinateSystem();
   
-  tracking_line::TrackingLine<setup::Stack> tracking(env);
+  tracking_line::TrackingLine<DummyStack> tracking(env);
 
   SECTION("intersection with sphere") {
     Point const origin(cs, {0_m, 0_m, 0_m});
@@ -50,7 +65,10 @@ TEST_CASE("TrackingLine") {
     
     auto const opt = tracking.TimeOfIntersection(traj, Sphere(Point(cs, {0_m, 0_m, 10_m}), 1_m));
     REQUIRE(opt.has_value());
-    REQUIRE(opt.value() / 9_s == Approx(1));
+    
+    auto [t1, t2] = opt.value();
+    REQUIRE(t1 / 9_s == Approx(1));
+    REQUIRE(t2 / 11_s == Approx(1));
     
     auto const optNoIntersection = tracking.TimeOfIntersection(traj, Sphere(Point(cs, {5_m, 0_m, 10_m}), 1_m));
     REQUIRE_FALSE(optNoIntersection.has_value());
@@ -59,9 +77,22 @@ TEST_CASE("TrackingLine") {
   SECTION("maximally possible propagation") {
       auto& universe = *(env.GetUniverse());
       
-      auto theMedium = corsika::environment::Environment::CreateNode<Sphere>(
-      Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, 100_km);
+      //~ std::cout << env.GetUniverse().get() << std::endl;
+      
+      DummyParticle p(1_J, Vector<momentum_d>(cs, 0*kilogram*meter/second, 0*kilogram*meter/second, 1*kilogram*meter/second), Point(cs, 0_m, 0_m,0_m));
       
+      auto const radius = 20_m;
+      
+      auto theMedium = corsika::environment::Environment::CreateNode<Sphere>(
+      Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, radius);      
       universe.AddChild(std::move(theMedium));
+      
+      Point const origin(cs, {0_m, 0_m, 0_m});
+      Vector<corsika::units::si::SpeedType::dimension_type> v(cs, 0_m/second, 0_m/second, 1_m/second);
+      Line line(origin, v);
+      
+      auto const traj = tracking.GetTrack(p);
+      
+      REQUIRE((traj.GetPosition(1.) - Point(cs, 0_m, 0_m, radius)).GetComponents(cs).norm().magnitude() == Approx(0).margin(1e-4));
   }
 }