diff --git a/corsika/detail/framework/analytics/ClassTimer.inl b/corsika/detail/framework/analytics/ClassTimer.inl
index c025efe56a9d540de5605395be406794c4f6ab8f..813e765a1971a52aed937c50724d926e893a8965 100644
--- a/corsika/detail/framework/analytics/ClassTimer.inl
+++ b/corsika/detail/framework/analytics/ClassTimer.inl
@@ -24,84 +24,58 @@ namespace corsika {
   template <typename TClass, typename TRet, typename... TArgs,
             TRet (TClass::*TFuncPtr)(TArgs...)>
   ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj)
-      : obj_(obj) {}
+      : ClassTimerImpl<TClass>(obj) {}
 
   template <typename TClass, typename TRet, typename... TArgs,
             TRet (TClass::*TFuncPtr)(TArgs...)>
   TRet ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) {
-    start_ = TClock::now();
-    auto tmp = (obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
-    timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_);
+    this->start_ = ClassTimerImpl<TClass>::TClock::now();
+    auto tmp = (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
+    this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
     return tmp;
   }
 
-  template <typename TClass, typename TRet, typename... TArgs,
-            TRet (TClass::*TFuncPtr)(TArgs...)>
-  inline typename ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::TDuration
-  ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr>::getTime() const {
-    return timeDiff_;
-  }
-
   // Specialisation 1
 
   template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)>
   ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::ClassTimer(TClass& obj)
-      : obj_(obj) {}
+      : ClassTimerImpl<TClass>(obj) {}
 
   template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)>
   void ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::call(TArgs... args) {
-    start_ = TClock::now();
-    (obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
-    timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_);
+    this->start_ = ClassTimerImpl<TClass>::TClock::now();
+    (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
+    this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
     return;
   }
 
-  template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)>
-  inline typename ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::TDuration
-  ClassTimer<void (TClass::*)(TArgs...), TFuncPtr>::getTime() const {
-    return timeDiff_;
-  }
-
   /// Specialisation 2
 
   template <typename TClass, typename TRet, typename... TArgs,
             TRet (TClass::*TFuncPtr)(TArgs...) const>
   ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj)
-      : obj_(obj) {}
+      : ClassTimerImpl<TClass>(obj) {}
 
   template <typename TClass, typename TRet, typename... TArgs,
             TRet (TClass::*TFuncPtr)(TArgs...) const>
   TRet ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) {
-    start_ = TClock::now();
-    auto tmp = (obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
-    timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_);
+    this->start_ = ClassTimerImpl<TClass>::TClock::now();
+    auto tmp = (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
+    this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
     return tmp;
   }
 
-  template <typename TClass, typename TRet, typename... TArgs,
-            TRet (TClass::*TFuncPtr)(TArgs...) const>
-  inline typename ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::TDuration
-  ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>::getTime() const {
-    return timeDiff_;
-  }
-
   /// Specialisation 3
   template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const>
   ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::ClassTimer(TClass& obj)
-      : obj_(obj) {}
+      : ClassTimerImpl<TClass>(obj) {}
 
   template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const>
   void ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::call(TArgs... args) {
-    start_ = TClock::now();
-    (obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
-    timeDiff_ = std::chrono::duration_cast<TDuration>(TClock::now() - start_);
+    this->start_ = ClassTimerImpl<TClass>::TClock::now();
+    (this->obj_.*TFuncPtr)(std::forward<TArgs>(args)...);
+    this->timeDiff_ = std::chrono::duration_cast<typename ClassTimerImpl<TClass>::TDuration>(ClassTimerImpl<TClass>::TClock::now() - this->start_);
     return;
   }
 
-  template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const>
-  inline typename ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::TDuration
-  ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>::getTime() const {
-    return timeDiff_;
-  }
-
 } // namespace corsika
\ No newline at end of file
diff --git a/corsika/framework/analytics/ClassTimer.hpp b/corsika/framework/analytics/ClassTimer.hpp
index f0bc63914bc894523db7f3c9cd849c8635d5f103..59ee8c8a2b612b9c315e7948cf4ba8026995a839 100644
--- a/corsika/framework/analytics/ClassTimer.hpp
+++ b/corsika/framework/analytics/ClassTimer.hpp
@@ -36,6 +36,13 @@ namespace corsika {
 
     /// Measured runtime of the function
     TDuration timeDiff_;
+
+  public:
+    ClassTimerImpl(TClass& obj)
+        : obj_(obj){};
+
+    /// returns the last runtime of the wraped function accessed via call
+    inline TDuration getTime() const{return timeDiff_;}
   };
 
   /// Measure the runtime of a single class function
@@ -61,7 +68,7 @@ namespace corsika {
    */
   template <typename TClass, typename TRet, typename... TArgs,
             TRet (TClass::*TFuncPtr)(TArgs...)>
-  class ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr> : ClassTimerImpl<TClass>{
+  class ClassTimer<TRet (TClass::*)(TArgs...), TFuncPtr> : public ClassTimerImpl<TClass> {
   private:
   public:
     ClassTimer(TClass& obj);
@@ -75,14 +82,11 @@ namespace corsika {
      * during the process and therefore must be copy constructible!
      */
     TRet call(TArgs... args);
-
-    /// returns the last runtime of the wraped function accessed via call
-    inline TDuration getTime() const;
   };
 
   /// Specialisation for member functions without return value
   template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...)>
-  class ClassTimer<void (TClass::*)(TArgs...), TFuncPtr> : ClassTimerImpl<TClass> {
+  class ClassTimer<void (TClass::*)(TArgs...), TFuncPtr> : public ClassTimerImpl<TClass> {
   private:
     using TClock = std::chrono::high_resolution_clock;
     using TDuration = std::chrono::microseconds;
@@ -91,31 +95,27 @@ namespace corsika {
     ClassTimer(TClass& obj);
 
     void call(TArgs... args);
-
-    inline TDuration getTime() const;
   };
 
   /// Specialisation for const member functions
   template <typename TClass, typename TRet, typename... TArgs,
             TRet (TClass::*TFuncPtr)(TArgs...) const>
-  class ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr> : ClassTimerImpl<TClass>{
+  class ClassTimer<TRet (TClass::*)(TArgs...) const, TFuncPtr>
+      : public ClassTimerImpl<TClass> {
   public:
     ClassTimer(TClass& obj);
 
     TRet call(TArgs... args);
-
-    inline TDuration getTime() const;
   };
 
   /// Specialisation for const member functions without return value
   template <typename TClass, typename... TArgs, void (TClass::*TFuncPtr)(TArgs...) const>
-  class ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr> : ClassTimerImpl<TClass> {
+  class ClassTimer<void (TClass::*)(TArgs...) const, TFuncPtr>
+      : public ClassTimerImpl<TClass> {
   public:
     ClassTimer(TClass& obj);
 
     void call(TArgs... args);
-
-    inline TDuration getTime() const;
   };
 
 } // namespace corsika