diff --git a/Simulation/DetSimCore/src/ActionInitialization.cpp b/Simulation/DetSimCore/src/ActionInitialization.cpp
index 515f975bfb960d8d3a8d87cc1ae0eb2d9c74edf7..7238d15bb92153421fb59bbd29c79683308f3cf2 100644
--- a/Simulation/DetSimCore/src/ActionInitialization.cpp
+++ b/Simulation/DetSimCore/src/ActionInitialization.cpp
@@ -5,8 +5,9 @@
 #include "TrackingAction.h"
 #include "SteppingAction.h"
 
-ActionInitialization::ActionInitialization()
-    : G4VUserActionInitialization() {
+ActionInitialization::ActionInitialization(ToolHandleArray<IAnaElemTool>& anatools)
+    : G4VUserActionInitialization(),
+      m_anaelemtools(anatools) {
 
 }
 
@@ -23,16 +24,16 @@ void
 ActionInitialization::Build() const {
 
 
-    RunAction* runAction = new RunAction();
+    RunAction* runAction = new RunAction(m_anaelemtools);
     SetUserAction(runAction);
 
-    EventAction* eventAction = new EventAction();
+    EventAction* eventAction = new EventAction(m_anaelemtools);
     SetUserAction(eventAction);
 
-    TrackingAction* trackingAction = new TrackingAction();
+    TrackingAction* trackingAction = new TrackingAction(m_anaelemtools);
     SetUserAction(trackingAction);
 
-    SteppingAction* steppingAction = new SteppingAction();
+    SteppingAction* steppingAction = new SteppingAction(m_anaelemtools);
     SetUserAction(steppingAction);
 
 }
diff --git a/Simulation/DetSimCore/src/ActionInitialization.h b/Simulation/DetSimCore/src/ActionInitialization.h
index 6ad9791d4c71d5aa839295ef2d24655771abd407..ef33b470ad134dfcc5bcdc989a9ebb9016770cd4 100644
--- a/Simulation/DetSimCore/src/ActionInitialization.h
+++ b/Simulation/DetSimCore/src/ActionInitialization.h
@@ -1,17 +1,24 @@
 #ifndef ActionInitialization_h
 #define ActionInitialization_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
+
 #include "G4VUserActionInitialization.hh"
 
 class ActionInitialization: public G4VUserActionInitialization {
 public:
 
-    ActionInitialization();
+    ActionInitialization(ToolHandleArray<IAnaElemTool>&);
     ~ActionInitialization();
 
     void BuildForMaster() const override;
     void Build() const override;
 
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 };
 
 
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index 8bd06abb4c7d5d23c147134c9b00e6cf800e0f69..70dde30cd133d2a7c77493b64526f53da424c223 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -56,7 +56,10 @@ DetSimAlg::initialize() {
     runmgr->SetUserAction(new PrimaryGeneratorAction());
 
     // User Actions
-    runmgr->SetUserInitialization(new ActionInitialization());
+    for (auto anaelem: m_ana_elems.value()) {
+        m_anaelemtools.push_back(anaelem);
+    }
+    runmgr->SetUserInitialization(new ActionInitialization(m_anaelemtools));
 
     // Vis Mac
     bool hasVis = false;
diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h
index d9c2a2f6b98606b9c6b7b20f25cf5cd2342f4932..08ee2489f09b4920c4aa00ab5514afd45230f550 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.h
+++ b/Simulation/DetSimCore/src/DetSimAlg.h
@@ -6,8 +6,10 @@
 
 #include <GaudiKernel/Algorithm.h>
 #include <GaudiKernel/Property.h>
+#include <GaudiKernel/ToolHandle.h>
 
 #include <DetSimInterface/IDetSimSvc.h>
+#include <DetSimInterface/IAnaElemTool.h>
 
 class DetSimAlg: public Algorithm {
 public:
@@ -19,6 +21,7 @@ public:
 
 private:
     SmartIF<IDetSimSvc> m_detsimsvc;
+    ToolHandleArray<IAnaElemTool> m_anaelemtools;
 
 private:
 
@@ -27,6 +30,10 @@ private:
     Gaudi::Property<std::vector<std::string>> m_vis_macs{this, "VisMacs"};
 
     Gaudi::Property<std::string> m_physics_lists_name{this, "PhysicsList", "QGSP_BERT"};
+
+    Gaudi::Property<std::vector<std::string>> m_ana_elems{this, "AnaElems"};
+
+
 private:
     int i_event;
 };
diff --git a/Simulation/DetSimCore/src/EventAction.cpp b/Simulation/DetSimCore/src/EventAction.cpp
index c0a9ab3593b8dfd440d96dad6b961701989c2057..bbe00357b030b267ad3356508f7dc67823136ae6 100644
--- a/Simulation/DetSimCore/src/EventAction.cpp
+++ b/Simulation/DetSimCore/src/EventAction.cpp
@@ -1,7 +1,8 @@
 #include "EventAction.h"
 
-EventAction::EventAction() 
-    : G4UserEventAction() {
+EventAction::EventAction(ToolHandleArray<IAnaElemTool>& anatools) 
+    : G4UserEventAction(),
+      m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/EventAction.h b/Simulation/DetSimCore/src/EventAction.h
index af2bc93a78b4740525ec5dcbc00597886b7ff2e0..8cd9fb998ada1f9d645795f40ebcf6aa11b5ab81 100644
--- a/Simulation/DetSimCore/src/EventAction.h
+++ b/Simulation/DetSimCore/src/EventAction.h
@@ -1,6 +1,10 @@
 #ifndef EventAction_h
 #define EventAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserEventAction.hh"
 
 class G4Event;
@@ -8,12 +12,14 @@ class G4Event;
 class EventAction: public G4UserEventAction {
 public:
 
-    EventAction();
+    EventAction(ToolHandleArray<IAnaElemTool>&);
     ~EventAction();
 
     void BeginOfEventAction(const G4Event*) override;
     void EndOfEventAction(const G4Event*) override;
 
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 };
 
 #endif
diff --git a/Simulation/DetSimCore/src/RunAction.cpp b/Simulation/DetSimCore/src/RunAction.cpp
index b86ff14c215dccc43aa69f63437412d482b05243..81699bddbfa6b6f4ad736f968e07010ffda8da02 100644
--- a/Simulation/DetSimCore/src/RunAction.cpp
+++ b/Simulation/DetSimCore/src/RunAction.cpp
@@ -2,8 +2,9 @@
 
 #include "G4Run.hh"
 
-RunAction::RunAction() 
-    : G4UserRunAction() {
+RunAction::RunAction(ToolHandleArray<IAnaElemTool>& anatools) 
+    : G4UserRunAction(),
+      m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/RunAction.h b/Simulation/DetSimCore/src/RunAction.h
index 72b7601280fa87143d5bab613c02152cd479b573..ab98e54629dd60a2a7b5f5de55c64c424af2908f 100644
--- a/Simulation/DetSimCore/src/RunAction.h
+++ b/Simulation/DetSimCore/src/RunAction.h
@@ -1,6 +1,10 @@
 #ifndef RunAction_h
 #define RunAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserRunAction.hh"
 
 class G4Run;
@@ -9,11 +13,13 @@ class G4Run;
 class RunAction: public G4UserRunAction {
 
 public:
-    RunAction();
+    RunAction(ToolHandleArray<IAnaElemTool>&);
     ~RunAction();
 
     virtual void BeginOfRunAction(const G4Run*);
     virtual void EndOfRunAction(const G4Run*);
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 
 };
 
diff --git a/Simulation/DetSimCore/src/SteppingAction.cpp b/Simulation/DetSimCore/src/SteppingAction.cpp
index 3ad62235e749a866809d1964f13558f23a286ae8..30ef20f65d7d90360da12856a12d694d2797a2b8 100644
--- a/Simulation/DetSimCore/src/SteppingAction.cpp
+++ b/Simulation/DetSimCore/src/SteppingAction.cpp
@@ -1,6 +1,7 @@
 #include "SteppingAction.h"
 
-SteppingAction::SteppingAction() {
+SteppingAction::SteppingAction(ToolHandleArray<IAnaElemTool>& anatools)
+    : m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/SteppingAction.h b/Simulation/DetSimCore/src/SteppingAction.h
index 9c18175381f4184749f4f2255ee10a6a522f9388..fd7e6ef7ab619f65100a6fce7bbdf35a94d9083e 100644
--- a/Simulation/DetSimCore/src/SteppingAction.h
+++ b/Simulation/DetSimCore/src/SteppingAction.h
@@ -1,6 +1,10 @@
 #ifndef SteppingAction_h
 #define SteppingAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserSteppingAction.hh"
 
 class G4Step;
@@ -8,11 +12,13 @@ class G4Step;
 class SteppingAction: public G4UserSteppingAction {
 
 public:
-    SteppingAction();
+    SteppingAction(ToolHandleArray<IAnaElemTool>&);
     ~SteppingAction();
 
     void UserSteppingAction(const G4Step*) override;
 
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 };
 
 #endif
diff --git a/Simulation/DetSimCore/src/TrackingAction.cpp b/Simulation/DetSimCore/src/TrackingAction.cpp
index 7672c7d6703461ccbf6bc99f408368a540bec817..89b6d1ee46ee03a962b6f67643e6661ca40cc54f 100644
--- a/Simulation/DetSimCore/src/TrackingAction.cpp
+++ b/Simulation/DetSimCore/src/TrackingAction.cpp
@@ -1,7 +1,8 @@
 #include "TrackingAction.h"
 
-TrackingAction::TrackingAction()
-    : G4UserTrackingAction() {
+TrackingAction::TrackingAction(ToolHandleArray<IAnaElemTool>& anatools)
+    : G4UserTrackingAction(),
+      m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/TrackingAction.h b/Simulation/DetSimCore/src/TrackingAction.h
index 5b7ff885a74e6ce094c4a374e8492523ee63cf5b..49cd8dce1a09090a2776d09ed255276aea3c2ea6 100644
--- a/Simulation/DetSimCore/src/TrackingAction.h
+++ b/Simulation/DetSimCore/src/TrackingAction.h
@@ -1,20 +1,25 @@
 #ifndef TrackingAction_h
 #define TrackingAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserTrackingAction.hh"
 
 class TrackingAction: public G4UserTrackingAction {
 
 public:
 
-    TrackingAction();
+    TrackingAction(ToolHandleArray<IAnaElemTool>&);
     ~TrackingAction();
 
     void PreUserTrackingAction(const G4Track*);
     void PostUserTrackingAction(const G4Track*);
 
-
-
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
+    
 };
 
 #endif
diff --git a/Simulation/DetSimInterface/DetSimInterface/IAnaElemTool.h b/Simulation/DetSimInterface/DetSimInterface/IAnaElemTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..9d7f7ab17619af8d81dc57db2f021a21b603e941
--- /dev/null
+++ b/Simulation/DetSimInterface/DetSimInterface/IAnaElemTool.h
@@ -0,0 +1,42 @@
+#ifndef IAnaElemTool_h
+#define IAnaElemTool_h
+
+#include "GaudiKernel/IAlgTool.h"
+
+class G4Run;
+class G4Event;
+class G4Track;
+class G4Step;
+
+#include "G4ClassificationOfNewTrack.hh"
+
+class IAnaElemTool : virtual public IAlgTool {
+public:
+    DeclareInterfaceID(IAnaElemTool, 0, 1);
+
+    virtual ~IAnaElemTool() {}
+
+    // Run
+    virtual void BeginOfRunAction(const G4Run*) {}
+    virtual void EndOfRunAction(const G4Run*) {}
+
+    // Event
+    virtual void BeginOfEventAction(const G4Event*) {}
+    virtual void EndOfEventAction(const G4Event*) {}
+
+    // Stacking
+    virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*) {return fUrgent;}
+    virtual void NewStage() {}
+    virtual void PrepareNewEvent() {}
+
+    // Tracking
+    virtual void PreUserTrackingAction(const G4Track*) {}
+    virtual void PostUserTrackingAction(const G4Track*) {}
+
+    // Stepping
+    virtual void UserSteppingAction(const G4Step*) {}
+
+};
+
+
+#endif