diff --git a/Simulation/DetSimCore/CMakeLists.txt b/Simulation/DetSimCore/CMakeLists.txt
index e25301fad3e6d60a3648fe1f86a8ba1d7b35f03f..57f82000cd42384b801d52b9f796619610d6ca85 100644
--- a/Simulation/DetSimCore/CMakeLists.txt
+++ b/Simulation/DetSimCore/CMakeLists.txt
@@ -14,6 +14,7 @@ set(DetSimCore_srcs
     src/DetSimSvc.cpp
     src/DetectorConstruction.cpp
     src/PrimaryGeneratorAction.cpp
+    src/G4PrimaryCnvTool.cpp
     src/ActionInitialization.cpp
     src/RunAction.cpp
     src/EventAction.cpp
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index 34420d42268573bf7519bc4966c30dfb163f39ca..17385cf701b1a40ce8370d7c86d17ae8c325e668 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -54,7 +54,11 @@ DetSimAlg::initialize() {
     assert(physicsList);
     runmgr->SetUserInitialization(physicsList);
     // Primary Generator Action
-    runmgr->SetUserAction(new PrimaryGeneratorAction());
+    if (!m_prim_cnvtool) {
+        error() << "Failed to get the primary cnvtool." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    runmgr->SetUserAction(new PrimaryGeneratorAction(m_prim_cnvtool));
 
     // User Actions
     for (auto anaelem: m_ana_elems.value()) {
diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h
index ff484969a9cca814e35f7ea77981ae07b549f8a5..0f66b74ccc89b9dc0d4d65f3bb590914d2ec249a 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.h
+++ b/Simulation/DetSimCore/src/DetSimAlg.h
@@ -9,6 +9,7 @@
 #include <GaudiKernel/ToolHandle.h>
 
 #include <DetSimInterface/IDetSimSvc.h>
+#include <DetSimInterface/IG4PrimaryCnvTool.h>
 #include <DetSimInterface/IAnaElemTool.h>
 #include <DetSimInterface/IDetElemTool.h>
 
@@ -24,6 +25,7 @@ private:
     SmartIF<IDetSimSvc> m_detsimsvc;
     ToolHandleArray<IAnaElemTool> m_anaelemtools;
     ToolHandle<IDetElemTool> m_root_detelem;
+    ToolHandle<IG4PrimaryCnvTool> m_prim_cnvtool{"G4PrimaryCnvTool", this};
 
 private:
 
diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4f34751eb03ab8e499972bc7393c41a3b8f04aec
--- /dev/null
+++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
@@ -0,0 +1,11 @@
+#include "G4PrimaryCnvTool.h"
+
+#include "G4Event.hh"
+
+DECLARE_COMPONENT(G4PrimaryCnvTool)
+
+bool G4PrimaryCnvTool::mutate(G4Event* anEvent) {
+
+
+    return true;
+}
diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.h b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..00c225a52bc85da53f1f9ad8a91864116ed39084
--- /dev/null
+++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h
@@ -0,0 +1,16 @@
+#ifndef G4PrimaryCnvTool_h
+#define G4PrimaryCnvTool_h
+
+#include "GaudiKernel/AlgTool.h"
+#include "DetSimInterface/IG4PrimaryCnvTool.h"
+
+class G4PrimaryCnvTool: public extends<AlgTool, IG4PrimaryCnvTool> {
+public:
+
+    using extends::extends;
+
+    bool mutate(G4Event* anEvent) override;
+
+};
+
+#endif
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
index 6454963b6dd2b9214b9d07c89c462023d2c8c0b1..067bd8ce9abb3154176621293b8796951f568126 100644
--- a/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
@@ -6,7 +6,9 @@
 #include "G4ParticleDefinition.hh"
 
 
-PrimaryGeneratorAction::PrimaryGeneratorAction() {
+PrimaryGeneratorAction::PrimaryGeneratorAction(ToolHandle<IG4PrimaryCnvTool>& cnvtool) 
+    : G4VUserPrimaryGeneratorAction(), 
+      tool(cnvtool) {
 
 }
 
@@ -17,6 +19,10 @@ PrimaryGeneratorAction::~PrimaryGeneratorAction() {
 void
 PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) {
     // Generate Vertex (G4PrimaryVertex) and Particle (G4PrimaryParticle).
+    if (tool) {
+        tool->mutate(anEvent);
+    }
+
 
     // Following is an example:
     double x = 0.0;
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.h b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
index fa34d7a421b4d7579c8b6606eda9b4523ade6cba..f8ac0ebeb4522f0a5a1f444413ed7d45804cbde4 100644
--- a/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
@@ -1,17 +1,21 @@
 #ifndef PrimaryGeneratorAction_h
 #define PrimaryGeneratorAction_h
 
+#include <GaudiKernel/ToolHandle.h>
 #include "G4VUserPrimaryGeneratorAction.hh"
+#include <DetSimInterface/IG4PrimaryCnvTool.h>
 
 class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
 {
 public:
-  PrimaryGeneratorAction();
+  PrimaryGeneratorAction(ToolHandle<IG4PrimaryCnvTool>& cnvtool);
   ~PrimaryGeneratorAction();
 
 public:
   void GeneratePrimaries(G4Event* anEvent);
 
+private:
+  ToolHandle<IG4PrimaryCnvTool> tool;
 };
 
 #endif
diff --git a/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h b/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h
index 83caf9d5b97d05c2826570c70c4c44ec16a5e785..3eba505cd43681ad3910641f007eca50080350c1 100644
--- a/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h
+++ b/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h
@@ -16,7 +16,7 @@ public:
 
     virtual ~IG4PrimaryCnvTool() {};
 
-    virtual mutate(G4Event* anEvent) = 0;
+    virtual bool mutate(G4Event* anEvent) = 0;
 };
 
 #endif