diff --git a/.gitignore b/.gitignore
index 5b91f5458c93576fe61ceed0f8077081ca233822..2e9cccb6342811919e613c867533d6433e5de511 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,11 @@
 **/*~
 **/*.bak
 build/
+<<<<<<< HEAD
+=======
+install/
+.vscode/
+>>>>>>> ignore vscode - step1
 Framework/Particles/GeneratedParticleProperties.inc
 flymd.html
 flymd.md
diff --git a/corsika/detail/framework/geometry/Box.inl b/corsika/detail/framework/geometry/Box.inl
new file mode 100644
index 0000000000000000000000000000000000000000..118d6a7817badbf1adbd21d37fabac0c40becfd6
--- /dev/null
+++ b/corsika/detail/framework/geometry/Box.inl
@@ -0,0 +1,47 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#pragma once
+
+namespace corsika {
+  inline Box::Box(CoordinateSystemPtr cs, LengthType const x, LengthType const y,
+                  LengthType const z)
+      : center_(Point(cs, {0_m, 0_m, 0_m}))
+      , cs_(cs)
+      , x_(x)
+      , y_(y)
+      , z_(z) {}
+
+  inline Box::Box(CoordinateSystemPtr cs, LengthType const side)
+      : center_(Point(cs, {0_m, 0_m, 0_m}))
+      , cs_(cs)
+      , x_(side / 2)
+      , y_(side / 2)
+      , z_(side / 2) {}
+
+  inline bool Box::contains(Point const& p) const {
+    if ((abs(p.getX(cs_)) < x_) && (abs(p.getY(cs_)) < y_) && (abs(p.getZ(cs_)) < z_))
+      return true;
+    else
+      return false;
+  }
+
+  inline std::string Box::asString() const {
+    std::ostringstream txt;
+    txt << "center=" << center_ << ", x-axis=" << DirectionVector{cs_, {1, 0, 0}}
+        << ", y-axis: " << DirectionVector{cs_, {0, 1, 0}}
+        << ", z-axis: " << DirectionVector{cs_, {0, 0, 1}};
+    return txt.str();
+  }
+
+  template <typename TDim>
+  inline void Box::rotate(QuantityVector<TDim> const& axis, double const angle) {
+    cs_ = make_rotation(cs_, axis, angle);
+  }
+
+} // namespace corsika
\ No newline at end of file
diff --git a/corsika/detail/modules/ObservationPlane.inl b/corsika/detail/modules/ObservationPlane.inl
index b40e8d772f694cb0335d4c2410f78a2f6b1c660b..7100db181d85ba603be2bda29eba9758a0bff8aa 100644
--- a/corsika/detail/modules/ObservationPlane.inl
+++ b/corsika/detail/modules/ObservationPlane.inl
@@ -22,7 +22,7 @@ namespace corsika {
   template <typename TTracking, typename TOutput>
   template <typename TParticle, typename TTrajectory>
   inline ProcessReturn ObservationPlane<TTracking, TOutput>::doContinuous(
-      TParticle& particle, TTrajectory&, bool const stepLimit) {
+      TParticle& particle, TTrajectory& step, bool const stepLimit) {
     /*
        The current step did not yet reach the ObservationPlane, do nothing now and wait:
      */
@@ -46,7 +46,7 @@ namespace corsika {
     }
 
     HEPEnergyType const energy = particle.getEnergy();
-    Point const pointOfIntersection = particle.getPosition();
+    Point const pointOfIntersection = step.getPosition(1);
     Vector const displacement = pointOfIntersection - plane_.getCenter();
 
     // add our particles to the output file stream
diff --git a/corsika/detail/modules/tracking/TrackingStraight.inl b/corsika/detail/modules/tracking/TrackingStraight.inl
index 3bdbb73df381967627ac9a596a1188aac8252490..f596cd133947dba431f878183602b507a77cd2a0 100644
--- a/corsika/detail/modules/tracking/TrackingStraight.inl
+++ b/corsika/detail/modules/tracking/TrackingStraight.inl
@@ -8,19 +8,19 @@
 
 #pragma once
 
+#include <corsika/framework/core/Logging.hpp>
 #include <corsika/framework/core/PhysicalUnits.hpp>
+#include <corsika/framework/geometry/Intersections.hpp>
 #include <corsika/framework/geometry/Line.hpp>
 #include <corsika/framework/geometry/Plane.hpp>
 #include <corsika/framework/geometry/Sphere.hpp>
-#include <corsika/framework/geometry/Vector.hpp>
 #include <corsika/framework/geometry/StraightTrajectory.hpp>
-#include <corsika/framework/geometry/Intersections.hpp>
-#include <corsika/framework/core/Logging.hpp>
+#include <corsika/framework/geometry/Vector.hpp>
 #include <corsika/modules/tracking/Intersect.hpp>
 
+#include <cmath>
 #include <type_traits>
 #include <utility>
-#include <cmath>
 
 namespace corsika::tracking_line {
 
@@ -81,13 +81,64 @@ namespace corsika::tracking_line {
     return Intersections();
   }
 
+  template <typename TParticle>
+  inline Intersections Tracking::intersect(TParticle const& particle, Box const& box) {
+    Point const& position = particle.getPosition();
+    VelocityVector const velocity =
+        particle.getMomentum() / particle.getEnergy() * constants::c;
+    CoordinateSystemPtr const& cs = box.getCoordinateSystem();
+    LengthType x0 = position.getX(cs);
+    LengthType y0 = position.getY(cs);
+    LengthType z0 = position.getZ(cs);
+    SpeedType vx = velocity.getX(cs);
+    SpeedType vy = velocity.getY(cs);
+    SpeedType vz = velocity.getZ(cs);
+    CORSIKA_LOG_TRACE(
+        "particle in box coordinate: position: ({:.3f}, {:.3f}, "
+        "{:.3f}) m, veolocity: ({:.3f}, {:.3f}, {:.3f}) m/ns",
+        x0 / 1_m, y0 / 1_m, z0 / 1_m, vx / (1_m / 1_ns), vy / (1_m / 1_ns),
+        vz / (1_m / 1_ns));
+
+    auto get_intersect_min_max = [](LengthType x0, SpeedType v0, LengthType dx) {
+      auto t1 = (dx - x0) / v0;
+      auto t2 = (-dx - x0) / v0;
+      if (t1 > t2)
+        return std::make_pair(t1, t2);
+      else
+        return std::make_pair(t2, t1);
+    };
+
+    auto [tx_max, tx_min] = get_intersect_min_max(x0, vx, box.getX());
+    auto [ty_max, ty_min] = get_intersect_min_max(y0, vy, box.getY());
+    auto [tz_max, tz_min] = get_intersect_min_max(z0, vz, box.getZ());
+
+    TimeType t_exit = std::min(std::min(tx_max, ty_max), tz_max);
+    TimeType t_enter = std::max(std::max(tx_min, ty_min), tz_min);
+
+    CORSIKA_LOG_DEBUG("t_enter: {} ns, t_exit: {} ns", t_enter / 1_ns, t_exit / 1_ns);
+    if ((t_exit > t_enter)) {
+      if (t_enter < 0_s && t_exit > 0_s)
+        CORSIKA_LOG_DEBUG("numericallyInside={}", box.contains(position));
+      else if (t_enter < 0_s && t_exit < 0_s)
+        CORSIKA_LOG_DEBUG("oppisite direction");
+      return Intersections(std::move(t_enter), std::move(t_exit));
+    } else
+      return Intersections();
+  }
+
   template <typename TParticle, typename TBaseNodeType>
   inline Intersections Tracking::intersect(TParticle const& particle,
                                            TBaseNodeType const& volumeNode) {
-    Sphere const* sphere = dynamic_cast<Sphere const*>(&volumeNode.getVolume());
-    if (sphere) { return Tracking::intersect<TParticle>(particle, *sphere); }
-    throw std::runtime_error(
-        "The Volume type provided is not supported in Intersect(particle, node)");
+    if (Sphere const* sphere = dynamic_cast<Sphere const*>(&volumeNode.getVolume());
+        sphere) {
+      return Tracking::intersect<TParticle>(particle, *sphere);
+    } else if (Box const* box = dynamic_cast<Box const*>(&volumeNode.getVolume()); box) {
+      return Tracking::intersect<TParticle>(particle, *box);
+    } else {
+      throw std::runtime_error(
+          "The Volume type provided is not supported in "
+          "Intersect(particle, node)");
+    }
   }
 
   template <typename TParticle>
diff --git a/corsika/framework/geometry/Box.hpp b/corsika/framework/geometry/Box.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..696ad54555f8418d964e1b7f4f9ab1bea6d68eaf
--- /dev/null
+++ b/corsika/framework/geometry/Box.hpp
@@ -0,0 +1,58 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#pragma once
+
+#include <corsika/framework/core/PhysicalUnits.hpp>
+#include <corsika/framework/geometry/Point.hpp>
+#include <corsika/framework/geometry/Line.hpp>
+#include <corsika/framework/geometry/IVolume.hpp>
+
+namespace corsika {
+
+  /**
+   * Describes a sphere in space
+   *
+   *  The center point and the orintation of the Box is set by
+   *  a CoordinateSystemPtr at construction.
+   **/
+  class Box : public IVolume {
+
+  public:
+    Box(CoordinateSystemPtr cs, LengthType const x, LengthType const y,
+        LengthType const z);
+
+    Box(CoordinateSystemPtr cs, LengthType const side);
+
+    //! returns true if the Point p is within the sphere
+    bool contains(Point const& p) const override;
+
+    Point const& getCenter() const { return center_; };
+    CoordinateSystemPtr const getCoordinateSystem() const { return cs_; }
+
+    LengthType const getX() const { return x_; }
+    LengthType const getY() const { return y_; }
+    LengthType const getZ() const { return z_; }
+
+    std::string asString() const;
+
+    template <typename TDim>
+    void rotate(QuantityVector<TDim> const& axis, double const angle);
+
+  protected:
+    Point center_;
+    CoordinateSystemPtr cs_; // local coordinate system with center_ in coordinate (0, 0,
+                             // 0) and user defined orientation
+    LengthType x_;
+    LengthType y_;
+    LengthType z_;
+  };
+
+} // namespace corsika
+
+#include <corsika/detail/framework/geometry/Box.inl>
diff --git a/corsika/modules/conex/Random.hpp b/corsika/modules/conex/Random.hpp
index 9532eace8ed29d4322def04b5ad5fee64761b366..31e64361db0c136a0eb11941faa3cdad972da8a3 100644
--- a/corsika/modules/conex/Random.hpp
+++ b/corsika/modules/conex/Random.hpp
@@ -15,7 +15,7 @@
  * \file conex/Random.hpp
  *
  * This file is an integral part of the epos interface. It must be
- * linked to the executable linked to epos exactly once
+ * linked to the executable linked to epos exactly once.
  *
  * Note, that the fortran random numbe interface functions are all
  * defined in the epos corsika 8 interface:
@@ -34,6 +34,7 @@
 
 namespace conex {
 
+  // GCOV_EXCL_START : we don't want to unit-test the random interface
   float rndm_interface() {
     static corsika::default_prng_type& rng =
         corsika::RNGManager<>::getInstance().getRandomStream("conex");
@@ -47,5 +48,6 @@ namespace conex {
     std::uniform_real_distribution<double> dist;
     return dist(rng);
   }
+  // GCOV_EXCL_STOP
 
 } // namespace conex
diff --git a/corsika/modules/tracking/TrackingStraight.hpp b/corsika/modules/tracking/TrackingStraight.hpp
index 3ebc18b37429eb78733fc3886ec8b07e11f648e5..336e4f0bccf1b6d1b2c045ad3298a28ab9575a0a 100644
--- a/corsika/modules/tracking/TrackingStraight.hpp
+++ b/corsika/modules/tracking/TrackingStraight.hpp
@@ -12,6 +12,7 @@
 #include <corsika/framework/geometry/Line.hpp>
 #include <corsika/framework/geometry/Plane.hpp>
 #include <corsika/framework/geometry/Sphere.hpp>
+#include <corsika/framework/geometry/Box.hpp>
 #include <corsika/framework/geometry/Vector.hpp>
 #include <corsika/framework/geometry/StraightTrajectory.hpp>
 #include <corsika/framework/geometry/Intersections.hpp>
@@ -50,6 +51,9 @@ namespace corsika::tracking_line {
     template <typename TParticle>
     static Intersections intersect(TParticle const& particle, Sphere const& sphere);
 
+    template <typename TParticle>
+    static Intersections intersect(TParticle const& particle, Box const& box);
+
     //! find intersection of Volume node with Track of particle
     template <typename TParticle, typename TBaseNodeType>
     static Intersections intersect(TParticle const& particle, TBaseNodeType const& node);
diff --git a/tests/framework/testGeometry.cpp b/tests/framework/testGeometry.cpp
index 19c311881c728524aa7256464f30d7ed52975d55..d9f2e7c29340bed32dfbc8f4a74158e8fea490ff 100644
--- a/tests/framework/testGeometry.cpp
+++ b/tests/framework/testGeometry.cpp
@@ -10,15 +10,16 @@
 
 #include <cmath>
 #include <corsika/framework/core/PhysicalUnits.hpp>
+#include <corsika/framework/geometry/Box.hpp>
 #include <corsika/framework/geometry/CoordinateSystem.hpp>
-#include <corsika/framework/geometry/Line.hpp>
 #include <corsika/framework/geometry/Helix.hpp>
-#include <corsika/framework/geometry/Point.hpp>
+#include <corsika/framework/geometry/LeapFrogTrajectory.hpp>
+#include <corsika/framework/geometry/Line.hpp>
 #include <corsika/framework/geometry/Path.hpp>
+#include <corsika/framework/geometry/Point.hpp>
 #include <corsika/framework/geometry/RootCoordinateSystem.hpp>
 #include <corsika/framework/geometry/Sphere.hpp>
 #include <corsika/framework/geometry/StraightTrajectory.hpp>
-#include <corsika/framework/geometry/LeapFrogTrajectory.hpp>
 
 #include <PhysicalUnitsCatch2.hpp> // namespace corsike::testing
 
@@ -282,6 +283,51 @@ TEST_CASE("Geometry Sphere") {
   }
 }
 
+TEST_CASE("Geometry Box") {
+  CoordinateSystemPtr const& rootCS = get_root_CoordinateSystem();
+  auto initialCS = make_translation(rootCS, {0_m, 0_m, 5_m});
+  Point center = Point(initialCS, {0_m, 0_m, 0_m});
+  Box box(initialCS, 4_m, 5_m, 6_m);
+
+  SECTION("getCenter") {
+    CHECK((box.getCenter().getCoordinates(rootCS) - center.getCoordinates(rootCS))
+              .getNorm()
+              .magnitude() == Approx(0).margin(absMargin));
+    CHECK(box.getX() / 4_m == Approx(1));
+    CHECK(box.getY() / 5_m == Approx(1));
+    CHECK(box.getZ() / 6_m == Approx(1));
+  }
+
+  SECTION("isInside") {
+    CHECK_FALSE(box.contains(Point(rootCS, {4.5_m, 0_m, 0_m})));
+    CHECK(box.contains(Point(rootCS, {0_m, 4.5_m, 0_m})));
+  }
+
+  SECTION("internal coordinate") {
+    CoordinateSystemPtr const internalCS = box.getCoordinateSystem();
+    auto coordinate = box.getCenter().getCoordinates(internalCS);
+    CHECK(coordinate.getX() / 1_m == Approx(0));
+    CHECK(coordinate.getY() / 1_m == Approx(0));
+    CHECK(coordinate.getZ() / 1_m == Approx(0));
+  }
+
+  SECTION("rotation") {
+    QuantityVector<length_d> const axis_z{0_m, 0_m, 1_m};
+    box.rotate(axis_z, 90);
+    CHECK(box.contains(Point(rootCS, {4.5_m, 0_m, 0_m})));
+    CHECK_FALSE(box.contains(Point(rootCS, {0_m, 4.5_m, 0_m})));
+  }
+
+  SECTION("from different coordinate") {
+    QuantityVector<length_d> const axis_z{0_m, 0_m, 1_m};
+    auto rotatedCS = make_rotation(initialCS, axis_z, 90);
+    Point center(rootCS, {0_m, 0_m, 5_m});
+    Box box(rotatedCS, 4_m, 5_m, 6_m);
+    CHECK(box.contains(Point(rootCS, {4.5_m, 0_m, 0_m})));
+    CHECK_FALSE(box.contains(Point(rootCS, {0_m, 4.5_m, 0_m})));
+  }
+}
+
 TEST_CASE("Geometry Trajectories") {
   CoordinateSystemPtr rootCS = get_root_CoordinateSystem();
   Point r0(rootCS, {0_m, 0_m, 0_m});
diff --git a/tests/modules/testQGSJetII.cpp b/tests/modules/testQGSJetII.cpp
index e9caaecf8c3341c53351e78c023a96838af2bd76..f39fecc1f04159cb3f405a005bf03d55d3a66f27 100644
--- a/tests/modules/testQGSJetII.cpp
+++ b/tests/modules/testQGSJetII.cpp
@@ -99,6 +99,9 @@ TEST_CASE("QgsjetII", "[processes]") {
     CHECK_FALSE(model.isValid(Code::Electron, Code::Proton, 1_TeV));
     CHECK_FALSE(model.isValid(Code::Proton, Code::Electron, 1_TeV));
     CHECK_FALSE(model.isValid(Code::Proton, Code::Proton, 1_GeV));
+
+    CHECK(model.isValid(Code::Proton, Code::Helium, 1_TeV));
+    CHECK_FALSE(model.isValid(Code::Proton, Code::Helium, 1_GeV));
   }
 }
 
diff --git a/tests/modules/testTracking.cpp b/tests/modules/testTracking.cpp
index 4906bc58c486d8dbb43a3d790f1426ccfadd862a..02de4348240275c04000b69b10aa5eff08131558 100644
--- a/tests/modules/testTracking.cpp
+++ b/tests/modules/testTracking.cpp
@@ -394,3 +394,10 @@ TEMPLATE_TEST_CASE("TrackingPlane", "plane", tracking_leapfrog_curved::Tracking,
     CHECK(hit.getExit() == 1_s * std::numeric_limits<double>::infinity());
   }
 }
+
+TEST_CASE("Intersections") {
+  Intersections test;
+  CHECK(test.getEntry() ==
+        std::numeric_limits<TimeType::value_type>::infinity() * second);
+  CHECK(test.getExit() == std::numeric_limits<TimeType::value_type>::infinity() * second);
+}
diff --git a/tests/stack/CMakeLists.txt b/tests/stack/CMakeLists.txt
index 149aa0533746dcc4af77c5eee7d01ce4717415de..1314fd435a88474ce1df7cc8bf54cc918f30e5e9 100644
--- a/tests/stack/CMakeLists.txt
+++ b/tests/stack/CMakeLists.txt
@@ -1,7 +1,6 @@
 set (test_stack_sources
   TestMain.cpp
   testHistoryStack.cpp
-  testHistoryView.cpp
   testGeometryNodeStackExtension.cpp
   testWeightStackExtension.cpp
   testDummyStack.cpp