diff --git a/Simulation/DetSimCore/CMakeLists.txt b/Simulation/DetSimCore/CMakeLists.txt
index f8a022fa826b818cc054422fb7cf3b173b2da574..5ed403b8494031f622966b2fe4e142840397a04d 100644
--- a/Simulation/DetSimCore/CMakeLists.txt
+++ b/Simulation/DetSimCore/CMakeLists.txt
@@ -11,6 +11,7 @@ include(${Geant4_USE_FILE})
 set(DetSimCore_srcs
     src/DetSimAlg.cpp
     src/DetectorConstruction.cpp
+    src/PrimaryGeneratorAction.cpp
 )
 
 gaudi_add_module(DetSimCore ${DetSimCore_srcs}
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index d7b29b326381f1421eb108eb15c3021b448cdff4..a5b44538fa527f742dd8864a23defde67e71d319 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -6,6 +6,7 @@
 
 #include "G4PhysListFactory.hh"
 
+#include "PrimaryGeneratorAction.h"
 
 DECLARE_COMPONENT(DetSimAlg)
 
@@ -33,8 +34,9 @@ DetSimAlg::initialize() {
         return StatusCode::FAILURE;
     }
 
+    // Detector Construction
     runmgr->SetUserInitialization(new DetectorConstruction());
-
+    // Physics List
     G4VUserPhysicsList *physicsList = nullptr;
     if (m_physics_lists_name.value() == "CEPC") {
 
@@ -44,8 +46,8 @@ DetSimAlg::initialize() {
     }
     assert(physicsList);
     runmgr->SetUserInitialization(physicsList);
-
-    runmgr->SetUserAction((G4VUserPrimaryGeneratorAction*)0);
+    // Primary Generator Action
+    runmgr->SetUserAction(new PrimaryGeneratorAction());
 
     // after set up the user initialization and user actions, start the initialization.
     m_detsimsvc->initializeRM();
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6454963b6dd2b9214b9d07c89c462023d2c8c0b1
--- /dev/null
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
@@ -0,0 +1,42 @@
+#include "PrimaryGeneratorAction.h"
+
+#include "G4Event.hh"
+#include "G4ParticleTable.hh"
+#include "G4IonTable.hh"
+#include "G4ParticleDefinition.hh"
+
+
+PrimaryGeneratorAction::PrimaryGeneratorAction() {
+
+}
+
+PrimaryGeneratorAction::~PrimaryGeneratorAction() {
+
+}
+
+void
+PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) {
+    // Generate Vertex (G4PrimaryVertex) and Particle (G4PrimaryParticle).
+
+    // Following is an example:
+    double x = 0.0;
+    double y = 0.0;
+    double z = 0.0;
+    double t = 0.0;
+    G4PrimaryVertex* g4vtx = new G4PrimaryVertex(x, y, z, t);
+
+
+    G4int pdgcode = 22;
+    // check the pdgid
+    G4ParticleTable* particletbl = G4ParticleTable::GetParticleTable();
+    G4ParticleDefinition* particle_def = particletbl->FindParticle(pdgcode);
+
+    double px = 0.0;
+    double py = 0.0;
+    double pz = 0.0;
+    G4PrimaryParticle* g4prim=new G4PrimaryParticle(particle_def, px, py, pz);
+    g4vtx->SetPrimary(g4prim);
+
+    anEvent->AddPrimaryVertex(g4vtx);
+}
+
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.h b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
new file mode 100644
index 0000000000000000000000000000000000000000..fa34d7a421b4d7579c8b6606eda9b4523ade6cba
--- /dev/null
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
@@ -0,0 +1,18 @@
+#ifndef PrimaryGeneratorAction_h
+#define PrimaryGeneratorAction_h
+
+#include "G4VUserPrimaryGeneratorAction.hh"
+
+class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
+{
+public:
+  PrimaryGeneratorAction();
+  ~PrimaryGeneratorAction();
+
+public:
+  void GeneratePrimaries(G4Event* anEvent);
+
+};
+
+#endif
+