diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml
index f588fd48c9811cde95ae3577cc4991f6875b9e93..12b998b8ec54422c0602ca30dc514c8ff323d43b 100644
--- a/Detector/DetDriftChamber/compact/det.xml
+++ b/Detector/DetDriftChamber/compact/det.xml
@@ -50,8 +50,13 @@
     <vis name="VisibleGreen" alpha="1.0" r="0.0" g="1.0" b="0.0" drawingStyle="solid" lineStyle="solid" showDaughters="true" visible="true"/>
   </display>
 
+  <regions>
+    <region name="DriftChamberRegion">
+    </region>
+  </regions>
+
   <detectors>
-    <detector id="1" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="VisibleBlue" sensitive="true">
+    <detector id="1" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="VisibleBlue" sensitive="true" region="DriftChamberRegion">
       <envelope vis="SeeThrough">
         <shape type="BooleanShape" operation="Union" material="Air">
           <shape type="Tube" rmin="SDT_inner_chamber_radius_min" rmax="SDT_inner_chamber_radius_max" dz="SDT_half_length" />
diff --git a/Detector/DetSegmentation/src/GridDriftChamber.cpp b/Detector/DetSegmentation/src/GridDriftChamber.cpp
index 991f42a816953224c8138a488885983e3739d901..d4facaaea91861aea6166c8d117d8823178f3b4f 100644
--- a/Detector/DetSegmentation/src/GridDriftChamber.cpp
+++ b/Detector/DetSegmentation/src/GridDriftChamber.cpp
@@ -56,13 +56,13 @@ CellID GridDriftChamber::cellID(const Vector3D& /*localPosition*/, const Vector3
   _decoder->set(cID, m_phiID, lphi);
 
 
-//std::cout << "#######################################: " 
-//          <<  " offset : " << m_offset
-//          << " offsetphi: " << offsetphi
-//          << " layerID: " << layerID
-//          << " r: " << _currentRadius
-//          << " layerphi: " << _currentLayerphi
-//          << std::endl;
+// std::cout << "#######################################: " 
+//           <<  " offset : " << m_offset
+//           << " offsetphi: " << offsetphi
+//           << " layerID: " << layerID
+//           << " r: " << _currentRadius
+//           << " layerphi: " << _currentLayerphi
+//           << std::endl;
 
   return cID;
 }
diff --git a/Examples/options/tut_detsim_SDT.py b/Examples/options/tut_detsim_SDT.py
index 779454ac323fdd87a20415dd3e3193dfbf643b14..4aa215871c5357e1ba5099a9d73ef7327b817cbc 100644
--- a/Examples/options/tut_detsim_SDT.py
+++ b/Examples/options/tut_detsim_SDT.py
@@ -117,6 +117,13 @@ if int(os.environ.get("VIS", 0)):
 detsimalg.RunCmds = [
 #    "/tracking/verbose 1",
 ]
+
+from Configurables import DummyFastSimG4Tool
+dummy_fastsim_tool = DummyFastSimG4Tool("DummyFastSimG4Tool")
+
+detsimalg.FastSimG4Tools = [
+    "DummyFastSimG4Tool"
+]
 detsimalg.AnaElems = [
     # example_anatool.name()
     # "ExampleAnaElemTool"
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index 17385cf701b1a40ce8370d7c86d17ae8c325e668..31583d82135590f33f4ed712740df02505d8199e 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -10,6 +10,9 @@
 
 #include "DetectorConstruction.h"
 #include "G4PhysListFactory.hh"
+#include "G4EmParameters.hh"
+#include "G4StepLimiterPhysics.hh"
+#include "G4FastSimulationPhysics.hh"
 #include "PrimaryGeneratorAction.h"
 
 #include "ActionInitialization.h"
@@ -42,14 +45,37 @@ DetSimAlg::initialize() {
 
     // Detector Construction
     m_root_detelem = ToolHandle<IDetElemTool>(m_root_det_elem.value());
-    runmgr->SetUserInitialization(new DetectorConstruction(m_root_detelem));
+
+    for (auto fastsimname: m_fast_simnames) {
+        info() << "Fast Sim Tool: " << fastsimname << endmsg;
+        m_fast_simtools.push_back(fastsimname);
+    }
+
+    runmgr->SetUserInitialization(new DetectorConstruction(m_root_detelem, m_fast_simtools));
     // Physics List
     G4VUserPhysicsList *physicsList = nullptr;
     if (m_physics_lists_name.value() == "CEPC") {
 
     } else {
         G4PhysListFactory *physListFactory = new G4PhysListFactory();
-        physicsList = physListFactory->GetReferencePhysList(m_physics_lists_name.value());
+        G4VModularPhysicsList* modularPhysicsList = physListFactory->GetReferencePhysList(m_physics_lists_name.value());
+
+        // PAI model
+        G4EmParameters::Instance()->AddPAIModel("all","DriftChamberRegion","pai");
+        // G4EmParameters::Instance()->AddPAIModel("all","DriftChamberRegion","pai_photon");
+
+        // register addition physics list
+        modularPhysicsList->RegisterPhysics(new G4StepLimiterPhysics());
+
+        // register fastsim physics
+        G4FastSimulationPhysics* fastsim_physics = new G4FastSimulationPhysics();
+        fastsim_physics->BeVerbose();
+        fastsim_physics->ActivateFastSimulation("e-");
+        fastsim_physics->ActivateFastSimulation("e+");
+        fastsim_physics->ActivateFastSimulation("gamma");
+        modularPhysicsList->RegisterPhysics(fastsim_physics);
+
+        physicsList = modularPhysicsList;
     }
     assert(physicsList);
     runmgr->SetUserInitialization(physicsList);
diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h
index 0f66b74ccc89b9dc0d4d65f3bb590914d2ec249a..86754631d96ac78cec77510f1b75ba9bcf55983b 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.h
+++ b/Simulation/DetSimCore/src/DetSimAlg.h
@@ -12,6 +12,7 @@
 #include <DetSimInterface/IG4PrimaryCnvTool.h>
 #include <DetSimInterface/IAnaElemTool.h>
 #include <DetSimInterface/IDetElemTool.h>
+#include <DetSimInterface/IFastSimG4Tool.h>
 
 class DetSimAlg: public Algorithm {
 public:
@@ -24,6 +25,7 @@ public:
 private:
     SmartIF<IDetSimSvc> m_detsimsvc;
     ToolHandleArray<IAnaElemTool> m_anaelemtools;
+    ToolHandleArray<IFastSimG4Tool> m_fast_simtools;
     ToolHandle<IDetElemTool> m_root_detelem;
     ToolHandle<IG4PrimaryCnvTool> m_prim_cnvtool{"G4PrimaryCnvTool", this};
 
@@ -36,6 +38,7 @@ private:
     Gaudi::Property<std::string> m_physics_lists_name{this, "PhysicsList", "QGSP_BERT"};
 
     Gaudi::Property<std::vector<std::string>> m_ana_elems{this, "AnaElems"};
+    Gaudi::Property<std::vector<std::string>> m_fast_simnames{this, "FastSimG4Tools"};
     Gaudi::Property<std::string> m_root_det_elem{this, "RootDetElem"};
 
 
diff --git a/Simulation/DetSimCore/src/DetectorConstruction.cpp b/Simulation/DetSimCore/src/DetectorConstruction.cpp
index 1f06435134761a8c0c14f3f9627396e166eaf51b..fb3bbb131afbbfefa6e1bbb5dfa1cc853f37c1c9 100644
--- a/Simulation/DetSimCore/src/DetectorConstruction.cpp
+++ b/Simulation/DetSimCore/src/DetectorConstruction.cpp
@@ -25,8 +25,9 @@
 #include "G4ios.hh"
 
 
-DetectorConstruction::DetectorConstruction(ToolHandle<IDetElemTool>& root_elem) 
-    : m_root_detelem(root_elem) {
+DetectorConstruction::DetectorConstruction(ToolHandle<IDetElemTool>& root_elem,
+                                           ToolHandleArray<IFastSimG4Tool>& fast_simtools) 
+    : m_root_detelem(root_elem), m_fast_simtools(fast_simtools) {
 
 }
 
@@ -60,6 +61,15 @@ DetectorConstruction::Construct() {
                                                       false,           // no boolean operations
                                                       0);              // no field specific to volume
 
+    // =======================================================================
+    // Associate Fast Simulation Model and Regions
+    // =======================================================================
+    for (auto fastsimtool: m_fast_simtools) {
+        G4cout << "Invoke CreateFastSimulationModel of fastsimtool instance "
+               << m_fast_simtools << G4endl;
+        fastsimtool->CreateFastSimulationModel();
+    }
+
     return physiWorld;
 
 }
diff --git a/Simulation/DetSimCore/src/DetectorConstruction.h b/Simulation/DetSimCore/src/DetectorConstruction.h
index 3e211205f782d3501addbb0ef055cd6383d0dd15..e8d992a30abc0caafe6afdcb75f457f9a66f80f4 100644
--- a/Simulation/DetSimCore/src/DetectorConstruction.h
+++ b/Simulation/DetSimCore/src/DetectorConstruction.h
@@ -3,6 +3,7 @@
 
 #include "GaudiKernel/ToolHandle.h"
 #include "DetSimInterface/IDetElemTool.h"
+#include "DetSimInterface/IFastSimG4Tool.h"
 
 #include "globals.hh"
 #include "G4VUserDetectorConstruction.hh"
@@ -16,7 +17,8 @@
 class DetectorConstruction: public G4VUserDetectorConstruction {
 
 public:
-    DetectorConstruction(ToolHandle<IDetElemTool>& root_elem);
+    DetectorConstruction(ToolHandle<IDetElemTool>& root_elem,
+                         ToolHandleArray<IFastSimG4Tool>& fast_simtools);
     ~DetectorConstruction();
 public:
     G4VPhysicalVolume* Construct() override;
@@ -24,6 +26,7 @@ public:
 
 private:
     ToolHandle<IDetElemTool>& m_root_detelem;
+    ToolHandleArray<IFastSimG4Tool>& m_fast_simtools;
 };
 
 #endif
diff --git a/Simulation/DetSimFastModel/CMakeLists.txt b/Simulation/DetSimFastModel/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3f968544a0953d2def1653b6d176c4992a65bd7b
--- /dev/null
+++ b/Simulation/DetSimFastModel/CMakeLists.txt
@@ -0,0 +1,24 @@
+gaudi_subdir(DetSimFastModel v0r0)
+
+gaudi_depends_on_subdirs(
+    k4FWCore
+    Simulation/DetSimInterface
+)
+
+find_package(Geant4 REQUIRED ui_all vis_all)
+include(${Geant4_USE_FILE})
+find_package(DD4hep COMPONENTS DDG4 REQUIRED)
+
+set(DetSimFastModel_srcs
+    src/DummyFastSimG4Tool.cpp
+    src/DummyFastSimG4Model.cpp
+)
+
+gaudi_add_module(DetSimFastModel ${DetSimFastModel_srcs}
+    INCLUDE_DIRS
+    LINK_LIBRARIES
+        DD4hep
+        ${DD4hep_COMPONENT_LIBRARIES}
+        GaudiKernel
+)
+
diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Model.cpp b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0e7f7da425a2c8af576b2c69e8a8198ada98c03e
--- /dev/null
+++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.cpp
@@ -0,0 +1,37 @@
+#include "DummyFastSimG4Model.h"
+
+#include "G4Track.hh"
+#include "G4FastTrack.hh"
+
+DummyFastSimG4Model::DummyFastSimG4Model(G4String aModelName, G4Region* aEnvelope)
+    : G4VFastSimulationModel(aModelName, aEnvelope) {
+
+}
+
+DummyFastSimG4Model::~DummyFastSimG4Model() {
+
+}
+
+G4bool DummyFastSimG4Model::IsApplicable(const G4ParticleDefinition& aParticle) {
+    return aParticle.GetPDGCharge() != 0;
+}
+
+G4bool DummyFastSimG4Model::ModelTrigger(const G4FastTrack& aFastTrack) {
+    // G4cout << __FILE__ << __LINE__ << ": ModelTrigger." << G4endl;
+
+    bool istrigged = false;
+
+    // only select the secondaries
+    const G4Track* track = aFastTrack.GetPrimaryTrack();
+    // secondaries
+    if (track->GetParentID() != 0) {
+        istrigged = true;
+    }
+    return istrigged;
+}
+
+void DummyFastSimG4Model::DoIt(const G4FastTrack& aFastTrack, G4FastStep& aFastStep) {
+    // G4cout << __FILE__ << __LINE__ << ": DoIt." << G4endl;
+
+    aFastStep.ProposeTrackStatus(fStopAndKill);
+}
diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Model.h b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.h
new file mode 100644
index 0000000000000000000000000000000000000000..fca5093f8574d8529df72b9e74e0bcbcdcc4414a
--- /dev/null
+++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.h
@@ -0,0 +1,19 @@
+#ifndef DummyFastSimG4Model_h
+#define DummyFastSimG4Model_h
+
+#include "G4VFastSimulationModel.hh"
+
+class DummyFastSimG4Model: public G4VFastSimulationModel {
+public:
+
+    DummyFastSimG4Model(G4String aModelName, G4Region* aEnvelope);
+    ~DummyFastSimG4Model();
+
+    virtual G4bool IsApplicable( const G4ParticleDefinition& aParticle );
+    virtual G4bool ModelTrigger( const G4FastTrack& aFastTrack );
+    virtual void DoIt( const G4FastTrack& aFastTrack, G4FastStep& aFastStep );
+
+};
+
+#endif
+
diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.cpp b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..47420ae38d180150f29e5ed9f65edfb4ccf1d612
--- /dev/null
+++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.cpp
@@ -0,0 +1,40 @@
+#include "DummyFastSimG4Tool.h"
+
+#include "G4Region.hh"
+#include "G4RegionStore.hh"
+
+#include "G4VFastSimulationModel.hh"
+#include "DummyFastSimG4Model.h"
+
+DECLARE_COMPONENT(DummyFastSimG4Tool);
+
+StatusCode DummyFastSimG4Tool::initialize() {
+    StatusCode sc;
+
+    return sc;
+}
+
+StatusCode DummyFastSimG4Tool::finalize() {
+    StatusCode sc;
+
+    return sc;
+}
+
+bool DummyFastSimG4Tool::CreateFastSimulationModel() {
+    // In this method:
+    // * Retrieve the G4Region
+    // * Create Model
+    // * Associate model and region
+
+    G4String model_name = "DummyFastSimG4Model";
+    G4String region_name = "DriftChamberRegion";
+    G4Region* aEnvelope = G4RegionStore::GetInstance()->GetRegion(region_name);
+    if (!aEnvelope) {
+        error() << "Failed to find G4Region '" << region_name << "'" << endmsg;
+        return false;
+    }
+
+    DummyFastSimG4Model* model = new DummyFastSimG4Model(model_name, aEnvelope);
+    info() << "Create Model " << model_name << " for G4Region " << region_name << endmsg;
+    return true;
+}
diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.h b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.h
new file mode 100644
index 0000000000000000000000000000000000000000..2254d892cacce2110bf5ed61ebf4cde234480acb
--- /dev/null
+++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.h
@@ -0,0 +1,20 @@
+#ifndef DummyFastSimG4Tool_h
+#define DummyFastSimG4Tool_h
+
+#include "GaudiKernel/AlgTool.h"
+#include "DetSimInterface/IFastSimG4Tool.h"
+
+class DummyFastSimG4Tool: public extends<AlgTool, IFastSimG4Tool> {
+public:
+    using extends::extends;
+
+    StatusCode initialize() override;
+    StatusCode finalize() override;
+
+    bool CreateFastSimulationModel() override;
+
+private:
+
+};
+
+#endif
diff --git a/Simulation/DetSimInterface/DetSimInterface/IFastSimG4Tool.h b/Simulation/DetSimInterface/DetSimInterface/IFastSimG4Tool.h
new file mode 100644
index 0000000000000000000000000000000000000000..12d9c421f3a06f1fc4b2637e5284c3373cba471a
--- /dev/null
+++ b/Simulation/DetSimInterface/DetSimInterface/IFastSimG4Tool.h
@@ -0,0 +1,20 @@
+#ifndef IFastSimG4Tool_h
+#define IFastSimG4Tool_h
+
+// IFastSimG4Tool is to associate the G4Region and Fast simulation model in G4.
+// It is recommended to create one fast simulation model in one tool.
+// -- Tao Lin <lintao@ihep.ac.cn>, 7 Dec 2020
+
+#include "GaudiKernel/IAlgTool.h"
+
+class IFastSimG4Tool: virtual public IAlgTool {
+public:
+    DeclareInterfaceID(IFastSimG4Tool, 0, 1);
+
+    virtual ~IFastSimG4Tool() {}
+
+    // Build the association between G4Region and G4 Fast simulation model
+    virtual bool CreateFastSimulationModel() = 0;
+};
+
+#endif