diff --git a/CMakeLists.txt b/CMakeLists.txt
index c67782af870c5ca65c03664a62d0bbb24ee808a5..af8d04ff8a4e99a55130d62c56c8fb8d9cba8615 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -47,6 +47,7 @@ set (CMAKE_CXX_STANDARD 17)
 set (CMAKE_CXX_EXTENSIONS OFF)
 enable_testing ()
 set (CTEST_OUTPUT_ON_FAILURE 1)
+list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")
 
 # Set the possible values of build type for cmake-gui and command line check
 set (ALLOWED_BUILD_TYPES Debug Release MinSizeRel RelWithDebInfo Coverage)
diff --git a/Framework/Analytics/ClassTimer.h b/Framework/Analytics/ClassTimer.h
index 68c13039210a5c4e664cf9afe7055db93280d7f1..3d1102afd096bfd2b1c0cdf978e5c2fc4f717c68 100644
--- a/Framework/Analytics/ClassTimer.h
+++ b/Framework/Analytics/ClassTimer.h
@@ -36,7 +36,7 @@ namespace corsika::analytics {
     timeClass(TType& obj)
         : vObj(obj) {}
 
-    TRet call(TArgs&&... args) {
+    TRet call(TArgs... args) {
       vStart = TClock::now();
       auto tmp = (vObj.*TFuncPtr)(std::forward<TArgs>(args)...);
       vDiff = std::chrono::duration_cast<TDuration>(TClock::now() - vStart);
@@ -62,7 +62,7 @@ namespace corsika::analytics {
     timeClass(TType& obj)
         : vObj(obj) {}
 
-    void call(TArgs&&... args) {
+    void call(TArgs... args) {
       vStart = TClock::now();
       (vObj.*TFuncPtr)(std::forward<TArgs>(args)...);
       vDiff = std::chrono::duration_cast<TDuration>(TClock::now() - vStart);
@@ -90,7 +90,7 @@ namespace corsika::analytics {
     timeClass(TType& obj)
         : vObj(obj) {}
 
-    TRet call(TArgs&&... args) {
+    TRet call(TArgs... args) {
       vStart = TClock::now();
       auto tmp = (vObj.*TFuncPtr)(std::forward<TArgs>(args)...);
       vDiff = std::chrono::duration_cast<TDuration>(TClock::now() - vStart);
@@ -117,11 +117,11 @@ namespace corsika::analytics {
     timeClass(TType& obj)
         : vObj(obj) {}
 
-    void call(TArgs&&... args) {
+    void call(TArgs... args) {
       vStart = TClock::now();
-     (vObj.*TFuncPtr)(std::forward<TArgs>(args)...);
+      (vObj.*TFuncPtr)(std::forward<TArgs>(args)...);
       vDiff = std::chrono::duration_cast<TDuration>(TClock::now() - vStart);
-      return ;
+      return;
     }
 
     inline TDuration getTime() const { return vDiff; }
diff --git a/Framework/Analytics/testClassTimer.cc b/Framework/Analytics/testClassTimer.cc
index 6e179c391c9ccdf896011f96b822775575296429..6e53a93630efab1ba34874fe4eb9ea4f7529ca7d 100644
--- a/Framework/Analytics/testClassTimer.cc
+++ b/Framework/Analytics/testClassTimer.cc
@@ -16,7 +16,19 @@
 
 using namespace corsika;
 
-class foo {
+class _foo2 {
+public:
+  int inside(int) { return 123; }
+
+  int inside(char) { return 312; }
+};
+
+class _foo1 : public _foo2 {
+public:
+  int inside(int) { return 123; }
+};
+
+class foo : public _foo1 {
 public:
   int bar() {
     std::this_thread::sleep_for(std::chrono::milliseconds(100));
@@ -32,6 +44,62 @@ public:
     std::this_thread::sleep_for(std::chrono::milliseconds(100));
     return;
   }
+
+  int inside() {
+    auto tc = corsika::analytics::timeClass<int (_foo1::*)(int), &_foo1::inside>(*this);
+
+    auto r = tc.call(1);
+
+    return r;
+  }
+};
+
+template <typename TType, TType>
+class timeMin;
+
+template <typename TType, typename TRet, typename... TArgs,
+          TRet (TType::*TFuncPtr)(TArgs...)>
+class timeMin<TRet (TType::*)(TArgs...), TFuncPtr> {
+private:
+  TType& vObj;
+
+public:
+  timeMin(TType& obj)
+      : vObj(obj) {}
+
+  TRet call(TArgs... args) { return (vObj.*TFuncPtr)(std::forward<TArgs>(args)...); }
+};
+
+// quasi processor
+class fooT1 {
+public:
+  template <typename T1, typename T2>
+  int inside_t(T1 a, T2 b, T2 c) {
+    return 123;
+  }
+};
+
+//  exec_time_impl
+template <typename T>
+class fooT2 : public T {
+public:
+  using _T = T;
+};
+
+//  exec_time_impl
+template <typename T>
+class fooT3 : public fooT2<T> {
+public:
+  template <typename T1, typename T2>
+  int inside_t(T1 a, T2 b, T2 c) {
+    auto tc =
+        timeMin<int (fooT2<T>::_T::*)(T1, T2, T2),
+                &fooT2<T>::_T::template inside_t<T1, T2>>(*this); // <- dependent template
+
+    auto r = tc.call(a, b, c);
+
+    return r;
+  }
 };
 
 TEST_CASE("Analytics", "[Timer]") {
@@ -42,7 +110,7 @@ TEST_CASE("Analytics", "[Timer]") {
 
     tc.call();
 
-    std::cout << tc.getTime().count() << std::endl;
+    REQUIRE(tc.getTime().count() == Approx(100000).margin(1000));
   }
 
   SECTION("Measure runtime of a function with arguments") {
@@ -52,7 +120,7 @@ TEST_CASE("Analytics", "[Timer]") {
 
     tc.call(1);
 
-    std::cout << tc.getTime().count() << std::endl;
+    REQUIRE(tc.getTime().count() == Approx(100000).margin(1000));
   }
 
   SECTION("Measure runtime of a const function without arguments") {
@@ -63,6 +131,17 @@ TEST_CASE("Analytics", "[Timer]") {
 
     tc.call();
 
-    std::cout << tc.getTime().count() << std::endl;
+    REQUIRE(tc.getTime().count() == Approx(100000).margin(1000));
+  }
+
+  SECTION("Measure runtime of function inside class") {
+
+    auto test = foo();
+    REQUIRE(test.inside() == 123);
+  }
+
+  SECTION("Measure runtime of function inside class") {
+    auto test = fooT3<fooT1>();
+    REQUIRE(test.inside_t(1, 'a', 'b') == 123);
   }
 }
diff --git a/Framework/ProcessSequence/BoundaryCrossingProcess.h b/Framework/ProcessSequence/BoundaryCrossingProcess.h
index feee4d0db95a74891c80fd84e52ef8c95687fc25..b5906f4d9d1782907fbe516269ec89bba4dcc5ce 100644
--- a/Framework/ProcessSequence/BoundaryCrossingProcess.h
+++ b/Framework/ProcessSequence/BoundaryCrossingProcess.h
@@ -11,6 +11,8 @@
 #include <corsika/process/BaseProcess.h>
 #include <corsika/process/ProcessReturn.h>
 
+#include <type_traits>
+
 namespace corsika::process {
 
   template <typename TDerived>
diff --git a/Framework/ProcessSequence/StackProcess.h b/Framework/ProcessSequence/StackProcess.h
index ad39f1193231378b4a951212c9ee23a1f54ba012..6a5f8abb797f69786603b3613ee73af453b7ed0c 100644
--- a/Framework/ProcessSequence/StackProcess.h
+++ b/Framework/ProcessSequence/StackProcess.h
@@ -28,9 +28,9 @@ namespace corsika::process {
   class StackProcess : public BaseProcess<TDerived>{
   private:
   protected:
-    using _TDerived = TDerived;
-
   public:
+    using _TDerived = TDerived;
+    
     StackProcess() = delete;
     StackProcess(const unsigned int nStep)
         : fNStep(nStep) {}
diff --git a/Processes/AnalyticProcessors/ExecTime.h b/Processes/AnalyticProcessors/ExecTime.h
index 6d7c6de451c16578d11c105ad34cd20f3eb6e373..0a39d280575f114be5edaf8ecd0c57915b5f04ba 100644
--- a/Processes/AnalyticProcessors/ExecTime.h
+++ b/Processes/AnalyticProcessors/ExecTime.h
@@ -31,50 +31,58 @@ namespace corsika::process {
     class _ExecTimeImpl : protected T {
     private:
       std::chrono::high_resolution_clock::time_point startTime_;
-      std::chrono::duration<double, std::micro> cumulatedTime_;
-      double mean_;
-      double mean2_;
-      double min_;
-      double max_;
-      long long n_;
+      std::chrono::duration<double, std::micro> cumulatedTime_;      
+      volatile double mean_;
+      volatile double mean2_;
+      volatile double min_;
+      volatile double max_;
+      volatile long long n_;
 
     protected:
     public:
+      using _T = T;
+
       _ExecTimeImpl() {
-        min_ = std::numeric_limits<long long>::max();
+        min_ = std::numeric_limits<double>::max();
+        cumulatedTime_ = std::chrono::duration<double, std::micro>(0);
         max_ = 0;
         mean_ = 0;
         mean2_ = 0;
         n_ = 0;
       }
 
-      void start() { startTime_ = std::chrono::high_resolution_clock::now(); }
-      void stop() {
+      inline void start() { startTime_ = std::chrono::high_resolution_clock::now(); }
+      inline void stop() {
         auto end = std::chrono::high_resolution_clock::now();
         std::chrono::duration<double, std::micro> timeDiv =
             std::chrono::duration_cast<std::chrono::duration<double, std::micro> >(
                 end - startTime_);
 
-        cumulatedTime_ += timeDiv;
+        this->update(timeDiv);
+      }
+
+      void update(std::chrono::duration<double, std::micro> timeDif) {
+
+        cumulatedTime_ += timeDif;       
         n_ = n_ + 1;
 
-        if (max_ < timeDiv.count()) max_ = timeDiv.count();
+        if (max_ < timeDif.count()) max_ = timeDif.count();
 
-        if (timeDiv.count() < min_) min_ = timeDiv.count();
+        if (timeDif.count() < min_) min_ = timeDif.count();
 
-        double delta = timeDiv.count() - mean_;
+        double delta = timeDif.count() - mean_;
         mean_ += delta / static_cast<double>(n_);
 
-        double delta2 = timeDiv.count() - mean_;
+        double delta2 = timeDif.count() - mean_;
 
         mean2_ += delta * delta2;
       }
 
-      double mean() const { return mean_; }
-      double min() const { return min_; }
-      double max() const { return max_; }
-      double var() const { return mean2_ / n_; }
-      double sumTime() const { return cumulatedTime_.count(); }
+      inline double mean() const { return mean_; }
+      inline double min() const { return min_; }
+      inline double max() const { return max_; }
+      inline double var() const { return mean2_ / n_; }
+      inline double sumTime() const { return cumulatedTime_.count(); }     
     };
 
     template <typename T>
@@ -94,7 +102,11 @@ namespace corsika::process {
               std::is_base_of<corsika::process::InteractionProcess<typename T::_TDerived>,
                               T>::value>,
           public Secondaries<
-              T, std::is_base_of<corsika::process::SecondariesProcess<typename T::_TDerived>,
-                                 T>::value> {};
-  } // namespace devtools
+              T,
+              std::is_base_of<corsika::process::SecondariesProcess<typename T::_TDerived>,
+                              T>::value> {
+      using is_process = decltype(is_process_impl(std::declval<T*>()));
+      static_assert(std::is_same<is_process, std::true_type>::value, "error message");
+    };
+  } // namespace analytic_processors
 } // namespace corsika::process
\ No newline at end of file
diff --git a/Processes/AnalyticProcessors/ImplBoundary.h b/Processes/AnalyticProcessors/ImplBoundary.h
index 57fcdf7effada5251d24d30fc65fbc47a50c7611..ff491fc3a66a8d42d2cb1a0016b6156eeee2bafa 100644
--- a/Processes/AnalyticProcessors/ImplBoundary.h
+++ b/Processes/AnalyticProcessors/ImplBoundary.h
@@ -9,6 +9,8 @@
 
 #include <corsika/process/analytic_processors/ExecTime.h>
 
+#include <corsika/analytics/ClassTimer.h>
+
 namespace corsika::process {
   namespace analytic_processors {
 
@@ -25,14 +27,20 @@ namespace corsika::process {
     class Boundary<T, true> : public _ExecTimeImpl<T> {
     private:
     public:
+      
       template <typename Particle, typename VTNType>
       EProcessReturn DoBoundaryCrossing(Particle& p, VTNType const& from,
-                                        VTNType const& to) {
-        this->start();
-        auto r = T::DoBoundaryCrossing(p, from, to);
-        this->stop();
+                                        VTNType const& to) {        
+        auto tc = corsika::analytics::timeClass<
+            EProcessReturn (_ExecTimeImpl<T>::_T::*)(Particle&, VTNType const&, VTNType const&),
+            &_ExecTimeImpl<T>::_T::template DoBoundaryCrossing<Particle, VTNType>>(*this);
+
+        EProcessReturn r = tc.call(p, from, to);
+        this->update(
+            std::chrono::duration_cast<std::chrono::duration<double, std::micro>>(
+                tc.getTime()));
         return r;
       }
     };
-  } // namespace devtools
+  } // namespace analytic_processors
 } // namespace corsika::process
\ No newline at end of file
diff --git a/Processes/AnalyticProcessors/ImplContinuous.h b/Processes/AnalyticProcessors/ImplContinuous.h
index ef36b8052c52ed0637a3ee9ae001209a9dfa0c94..21b21ad6b9e84076da8ceab74e3d114a1c023add 100644
--- a/Processes/AnalyticProcessors/ImplContinuous.h
+++ b/Processes/AnalyticProcessors/ImplContinuous.h
@@ -26,9 +26,9 @@ namespace corsika::process {
     private:
     public:
       template <typename Particle, typename Track>
-      EProcessReturn DoContinuous(Particle& p, Track const& t) const {
+      EProcessReturn DoContinuous(Particle& p, Track const& t) {
         this->start();
-        auto r = T::DoContinous(p, t);
+        auto r = _ExecTimeImpl<T>::DoContinuous(p, t);
         this->stop();
         return r;
       }
@@ -41,5 +41,5 @@ namespace corsika::process {
         return r;
       }
     };
-  } // namespace devtools
+  } // namespace analytic_processors
 } // namespace corsika::process
\ No newline at end of file
diff --git a/Processes/AnalyticProcessors/ImplDecay.h b/Processes/AnalyticProcessors/ImplDecay.h
index b3ff6a8ebd57b0780275cbec9985984a91ba31d2..e24ec159ffa3fb02b1a991ff190142192129f492 100644
--- a/Processes/AnalyticProcessors/ImplDecay.h
+++ b/Processes/AnalyticProcessors/ImplDecay.h
@@ -28,7 +28,7 @@ namespace corsika::process {
       template <typename Particle>
       EProcessReturn DoDecay(Particle& p) {
         this->start();
-        auto r = T::DoDecay(p);
+        auto r = _ExecTimeImpl<T>::DoDecay(p);
         this->stop();
         return r;
       }
@@ -41,5 +41,5 @@ namespace corsika::process {
         return r;
       }
     };
-  } // namespace devtools
+  } // namespace analytic_processors
 } // namespace corsika::process
\ No newline at end of file
diff --git a/Processes/AnalyticProcessors/ImplInteraction.h b/Processes/AnalyticProcessors/ImplInteraction.h
index 4d1688d299d4749d09412471225aea692289ac33..cf67865417d8dfee4c7ab80bc9b1de345e8cb6e6 100644
--- a/Processes/AnalyticProcessors/ImplInteraction.h
+++ b/Processes/AnalyticProcessors/ImplInteraction.h
@@ -28,7 +28,7 @@ namespace corsika::process {
       template <typename Particle>
       EProcessReturn DoInteraction(Particle& p) {
         this->start();
-        auto r = T::DoInteraction(p);
+        auto r = _ExecTimeImpl<T>::DoInteraction(p);
         this->stop();
         return r;
       }
@@ -41,5 +41,5 @@ namespace corsika::process {
         return r;
       }
     };
-  } // namespace devtools
+  } // namespace analytic_processors
 } // namespace corsika::process
\ No newline at end of file
diff --git a/Processes/AnalyticProcessors/ImplSecondaries.h b/Processes/AnalyticProcessors/ImplSecondaries.h
index 044c872523564cad6331b958b85e84743b0e0b74..42ceea871a15df5a3f1b4b830de1f4a30e28cacd 100644
--- a/Processes/AnalyticProcessors/ImplSecondaries.h
+++ b/Processes/AnalyticProcessors/ImplSecondaries.h
@@ -28,10 +28,10 @@ namespace corsika::process {
       template <typename Secondaries>
       inline EProcessReturn DoSecondaries(Secondaries& sec) {
         this->start();
-        auto r = T::DoSecondaries(sec);
+        auto r = _ExecTimeImpl<T>::DoSecondaries(sec);
         this->stop();
         return r;
       }
     };
-  } // namespace devtools
+  } // namespace analytic_processors
 } // namespace corsika::process
\ No newline at end of file
diff --git a/Processes/AnalyticProcessors/testExecTime.cc b/Processes/AnalyticProcessors/testExecTime.cc
index 4b25c139ec9dfbb80a1ef5535da600a9a7eb5bdd..f1bfa3537889fce41cfe9329c9bee2468f59f02e 100644
--- a/Processes/AnalyticProcessors/testExecTime.cc
+++ b/Processes/AnalyticProcessors/testExecTime.cc
@@ -19,6 +19,7 @@
 #include <corsika/process/example_processors/DummySecondariesProcess.h>
 
 #include <random>
+#include <vector>
 
 using namespace corsika::process;
 using namespace corsika::process::analytic_processors;
@@ -26,21 +27,89 @@ using namespace corsika::process::example_processors;
 
 TEST_CASE("Timing process", "[proccesses][analytic_processors ExecTime]") {
 
-  ExecTime<DummyBoundaryCrossingProcess<50>> execTime;
   int tmp = 0;
 
   SECTION("BoundaryCrossing") {
+    ExecTime<DummyBoundaryCrossingProcess<10>> execTime;
     auto start = std::chrono::steady_clock::now();
     REQUIRE(execTime.DoBoundaryCrossing(tmp, 0, 0) == EProcessReturn::eOk);
     auto end = std::chrono::steady_clock::now();
     REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() ==
-            Approx(50).margin(5));
+            Approx(10).margin(5));
 
     for (int i = 0; i < 100; i++) execTime.DoBoundaryCrossing(tmp, 0, 0);
 
+    REQUIRE(execTime.mean() == Approx(10 * 1000).margin(2 * 1000));
+
+    REQUIRE(execTime.sumTime() == Approx(10 * 100 * 1000).margin((10 * 100) * 1000));
+
+    REQUIRE(execTime.var() == Approx(0).margin(20000));
+  }
+
+  SECTION("Continuous") {
+    ExecTime<DummyContinuousProcess<50>> execTime;
+    auto start = std::chrono::steady_clock::now();
+    REQUIRE(execTime.DoContinuous(tmp, tmp) == EProcessReturn::eOk);
+    auto end = std::chrono::steady_clock::now();
+    REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() ==
+            Approx(50).margin(5));
+
+    for (int i = 0; i < 100; i++) execTime.DoContinuous(tmp, tmp);
+
     REQUIRE(execTime.mean() == Approx(50 * 1000).margin(2 * 1000));
 
-    REQUIRE(execTime.sumTime() == Approx(50 * 100 * 1000).margin(200 * 1000));
+    REQUIRE(execTime.sumTime() == Approx(50 * 100 * 1000).margin((10 * 100) * 1000));
+
+    REQUIRE(execTime.var() == Approx(0).margin(20000));
+  }
+
+  SECTION("Decay") {
+    ExecTime<DummyDecayProcess<10>> execTime;
+    auto start = std::chrono::steady_clock::now();
+    REQUIRE(execTime.DoDecay(tmp) == EProcessReturn::eOk);
+    auto end = std::chrono::steady_clock::now();
+    REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() ==
+            Approx(10).margin(5));
+
+    for (int i = 0; i < 100; i++) execTime.DoDecay(tmp);
+
+    REQUIRE(execTime.mean() == Approx(10 * 1000).margin(2 * 1000));
+
+    REQUIRE(execTime.sumTime() == Approx(10 * 100 * 100).margin((10 * 100) * 1000));
+
+    REQUIRE(execTime.var() == Approx(0).margin(20000));
+  }
+
+  SECTION("Interaction") {
+    ExecTime<DummyInteractionProcess<10>> execTime;
+    auto start = std::chrono::steady_clock::now();
+    REQUIRE(execTime.DoInteraction(tmp) == EProcessReturn::eOk);
+    auto end = std::chrono::steady_clock::now();
+    REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() ==
+            Approx(10).margin(5));
+
+    for (int i = 0; i < 100; i++) execTime.DoInteraction(tmp);
+
+    REQUIRE(execTime.mean() == Approx(10 * 1000).margin(2 * 1000));
+
+    REQUIRE(execTime.sumTime() == Approx(10 * 100 * 1000).margin((10 * 100) * 1000));
+
+    REQUIRE(execTime.var() == Approx(0).margin(20000));
+  }
+
+  SECTION("Secondaries") {
+    ExecTime<DummySecondariesProcess<10>> execTime;
+    auto start = std::chrono::steady_clock::now();
+    REQUIRE(execTime.DoSecondaries(tmp) == EProcessReturn::eOk);
+    auto end = std::chrono::steady_clock::now();
+    REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() ==
+            Approx(10).margin(5));
+
+    for (int i = 0; i < 100; i++) execTime.DoSecondaries(tmp);
+
+    REQUIRE(execTime.mean() == Approx(10 * 1000).margin(2 * 1000));
+
+    REQUIRE(execTime.sumTime() == Approx(10 * 100 * 1000).margin((10 * 100) * 1000));
 
     REQUIRE(execTime.var() == Approx(0).margin(20000));
   }
@@ -49,16 +118,19 @@ TEST_CASE("Timing process", "[proccesses][analytic_processors ExecTime]") {
     std::default_random_engine generator;
     std::normal_distribution<double> distribution(10000.0, 200.0);
 
-    double fStart;
-    double fElapsedSum;
-    double fMean;
-    double fMean2;
-    long long fMin;
-    long long fMax;
-    long long fN;
+    double fElapsedSum = 0;
+    double fMean = 0;
+    double fMean2 = 0;
+    long long fMin = std::numeric_limits<long long>::max();
+    long long fMax = std::numeric_limits<long long>::min();
+    int fN = 0;
+
+    std::vector<double> elems;
 
     for (int i = 0; i < 1000000; i++) {
-      auto timeDiv = distribution(generator);
+      double timeDiv = distribution(generator);
+
+      elems.push_back(timeDiv);
 
       fElapsedSum += timeDiv;
       fN = fN + 1;
@@ -75,7 +147,21 @@ TEST_CASE("Timing process", "[proccesses][analytic_processors ExecTime]") {
       fMean2 += delta * delta2;
     }
 
-    REQUIRE(fMean2 / fN == Approx(200*200).margin(200)); // Varianz
+    REQUIRE(fN == 1000000);
+
+    double mean = 0;
+    std::for_each(elems.begin(), elems.end(), [&](double i) { mean += i; });
+    mean = mean / fN;
+
+    double var = 0;
+    std::for_each(elems.begin(), elems.end(),
+                  [&](double i) { var += (mean - i) * (mean - i); });
+    var = var / fN;
+
+    REQUIRE(mean == Approx(10000.0).margin(10));
+    REQUIRE(var == Approx(200.0 * 200).margin(200));
+
+    REQUIRE(fMean2 / fN == Approx(200 * 200).margin(200)); // Varianz
     REQUIRE(fMean == Approx(10000).margin(10));
   }
 }
diff --git a/Processes/ExampleProcessors/DummyBoundaryCrossingProcess.h b/Processes/ExampleProcessors/DummyBoundaryCrossingProcess.h
index 2925c8c580c7283ab6da4e2627c6faadfdc653f6..936a65a5130dbdea0b0ec83ceaacbb947f73929d 100644
--- a/Processes/ExampleProcessors/DummyBoundaryCrossingProcess.h
+++ b/Processes/ExampleProcessors/DummyBoundaryCrossingProcess.h
@@ -20,12 +20,14 @@ namespace corsika::process {
     class DummyBoundaryCrossingProcess
         : public BoundaryCrossingProcess<DummyBoundaryCrossingProcess<ISleep>> {
     private:
+    protected:
+      
     public:
       template <typename Particle, typename VTNType>
       EProcessReturn DoBoundaryCrossing(Particle&, VTNType const&, VTNType const&) {
         std::this_thread::sleep_for(std::chrono::milliseconds(ISleep));
         return EProcessReturn::eOk;
-      }
+      }    
     };
 
   } // namespace example_processors
diff --git a/Processes/ExampleProcessors/DummyContinuousProcess.h b/Processes/ExampleProcessors/DummyContinuousProcess.h
index 60da8466e45e2b15ade0825010ffcd6c624a2897..85cf237692a528fec3e1fc94155380ff5c745b8b 100644
--- a/Processes/ExampleProcessors/DummyContinuousProcess.h
+++ b/Processes/ExampleProcessors/DummyContinuousProcess.h
@@ -22,13 +22,13 @@ namespace corsika::process {
     private:
     public:
       template <typename Particle, typename Track>
-      EProcessReturn DoContinuous(Particle&, Track const&) const {
+      inline EProcessReturn DoContinuous(Particle&, Track const&) const {
         std::this_thread::sleep_for(std::chrono::milliseconds(ISleep));
         return process::EProcessReturn::eOk;
       }
 
       template <typename Particle, typename Track>
-      units::si::LengthType MaxStepLength(Particle const&, Track const&) const {
+      inline units::si::LengthType MaxStepLength(Particle const&, Track const&) const {
         std::this_thread::sleep_for(std::chrono::milliseconds(ISleep));
         return units::si::meter * std::numeric_limits<double>::infinity();
       }
diff --git a/Processes/ExampleProcessors/DummyDecayProcess.h b/Processes/ExampleProcessors/DummyDecayProcess.h
index 19b3a559400d10443a6addde4433f131642c3e66..b2546e5299f35c1017d360cfcbcc1d41b4c913f8 100644
--- a/Processes/ExampleProcessors/DummyDecayProcess.h
+++ b/Processes/ExampleProcessors/DummyDecayProcess.h
@@ -18,7 +18,7 @@ namespace corsika::process {
   namespace example_processors {
 
     template <int ISleep>
-    class DummyDecayProcess : DecayProcess<DummyDecayProcess<ISleep>> {
+    class DummyDecayProcess : public DecayProcess<DummyDecayProcess<ISleep>> {
     private:
     public:
       template <typename Particle>
diff --git a/Processes/ExampleProcessors/DummyInteractionProcess.h b/Processes/ExampleProcessors/DummyInteractionProcess.h
index b69f69702962a54e043716675e4382811afc561f..51e9bfbe837ed1d14e3c7668f7245ba6e597ba9e 100644
--- a/Processes/ExampleProcessors/DummyInteractionProcess.h
+++ b/Processes/ExampleProcessors/DummyInteractionProcess.h
@@ -17,7 +17,7 @@ namespace corsika::process {
   namespace example_processors {
 
     template <int ISleep>
-    class DummyInteractionProcess : InteractionProcess<DummyInteractionProcess<ISleep> > {
+    class DummyInteractionProcess : public InteractionProcess<DummyInteractionProcess<ISleep> > {
     private:
     public:
       template <typename Particle>
diff --git a/Processes/ExampleProcessors/DummySecondariesProcess.h b/Processes/ExampleProcessors/DummySecondariesProcess.h
index 980d909be874f5ad8f6009af425fd95eb67a3043..848e88411ec4941b604dff80bf5401e3fd654ba3 100644
--- a/Processes/ExampleProcessors/DummySecondariesProcess.h
+++ b/Processes/ExampleProcessors/DummySecondariesProcess.h
@@ -17,7 +17,7 @@ namespace corsika::process {
   namespace example_processors {
 
     template <int ISleep>
-    class DummySecondariesProcess : SecondariesProcess<DummySecondariesProcess<ISleep>> {
+    class DummySecondariesProcess : public SecondariesProcess<DummySecondariesProcess<ISleep>> {
     private:
     public:
       template <typename TSecondaries>