diff --git a/Detector/DetCRD/CMakeLists.txt b/Detector/DetCRD/CMakeLists.txt
index f4092924d8d53c31575634b0dcc1612e96cb5c0d..6a7038dafc81bd50d290e5cb303db8627e0873f0 100644
--- a/Detector/DetCRD/CMakeLists.txt
+++ b/Detector/DetCRD/CMakeLists.txt
@@ -21,6 +21,7 @@ gaudi_add_module(DetCRD
                          src/Muon/Muon_Barrel_v01_04.cpp
                          src/Muon/Muon_Endcap_v01_02.cpp
                          src/Tracker/SiTrackerSkewRing_v01_geo.cpp
+                         src/Tracker/ITK_EndCap_v01.cpp
                          src/Tracker/SiTrackerStitching_v01_geo.cpp
                          src/Tracker/SiTrackerStaggeredLadder_v01_geo.cpp
                          src/Tracker/SiTrackerStaggeredLadder_v02_geo.cpp
diff --git a/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..16f918abbf357e0d5f83c08f20f8117f83cffe91
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml
@@ -0,0 +1,73 @@
+<lccdd>
+  <info name="ITKEndcap_v01"
+        title="CepC ITKEndcap"
+        author="Li Zhihao"
+        url="http://cepc.ihep.ac.cn"
+        contact="lizhihao@ihep.ac.cn"
+        status="developing"
+        version="v01">
+    <comment>CepC Inner Tracker EndCap</comment>
+  </info>
+  <define>
+    <constant name="SiliconThickness" value="400*um"/>
+    <constant name="SupportThickness" value="3.5*mm"/>
+    <constant name="ITKModuleLengthPhi" value="40.1*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_ITKEndCap" name="ITK_EndCap" type="ITK_EndCap_v01" vis="FTDVis" readout="ITKEndcapCollection" insideTrackingVolume="true" reflect="true">
+      <envelope>
+	<shape type="Assembly"/>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER +  DetType_ENDCAP  + DetType_PIXEL "/>
+
+      <support thickness="SupportThickness">
+        <slice name="Carbon_fiber_front" material="CarbonFiber" thickness="150*um" vis="GrayVis"/>
+        <slice name="Cooling_tube_wall" material="G4_Ti" thickness="3.560*0.013*100*um" vis="GrayVis"/>
+        <slice name="Cooling_fluid" material="G4_WATER" thickness="35.76*0.105*100*um" vis="GrayVis"/>
+        <slice name="Graphite_foam_Honeycomb" material="Air" thickness="2000*um" vis="YellowVis"/>
+        <slice name="Carbon_fiber_back" material="CarbonFiber" thickness="150*um" vis="GrayVis"/>
+        <slice name="Glue" material="Air" thickness="200*um" vis="YellowVis"/>
+        <slice name="Other_electronics" material="Kapton" thickness="32.6437*0.05*100*um" vis="SeeThrough"/>
+      </support>
+
+      <sensor thickness="SiliconThickness">
+        <slice name="Glue" material="Air" thickness="100*um" vis="SeeThrough"/>
+        <slice name="Sensor" material="G4_Si" thickness="150*um" sensitive="true" vis="GreenVis"/>
+        <slice name="FPC_Insulating_layers" material="Polyimide" thickness="100*um" vis="SeeThrough"/>
+        <slice name="FPC_metal_layer" material="G4_Al" thickness="50*um" vis="SeeThrough"/>
+      </sensor>
+
+      <layers>
+      <layer id="0" z="505*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="81.5*mm" outer_r="245*mm" vis="SeeThrough">
+	    <ring id="0" inner_r="81.5*mm"  outer_r="(163.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="13" vis="SeeThrough" />
+        <ring id="1" inner_r="163.4*mm" outer_r="245*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="20" vis="SeeThrough"/>
+      </layer>
+      <layer id="1" z="718.5*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="110.5*mm" outer_r="355*mm" vis="SeeThrough">
+        <ring id="0" inner_r="110.5*mm" outer_r="(192.2-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="16" vis="SeeThrough"/>
+        <ring id="1" inner_r="192.2*mm" outer_r="(273.4-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/>
+        <ring id="2" inner_r="273.4*mm" outer_r="355*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="28" vis="SeeThrough"/>
+      </layer>
+      <layer id="2" z="1000.3*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="160.5*mm" outer_r="565*mm" vis="SeeThrough">
+        <ring id="0" inner_r="160.5*mm" outer_r="(282-0.1)*mm" module_dr="120.5*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/>
+        <ring id="1" inner_r="282*mm"   outer_r="(423.4-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/>
+        <ring id="2" inner_r="423.4*mm" outer_r="565*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="44" vis="SeeThrough"/>
+      </layer>
+      <layer id="3" z="1489*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="220.3*mm" outer_r="565*mm" vis="SeeThrough">
+        <ring id="0" inner_r="220.3*mm" outer_r="(301.6-0.1)*mm" module_dr="80.3*mm" module_dphi="40.1*mm" nmodule="24" vis="SeeThrough"/>
+        <ring id="1" inner_r="301.6*mm" outer_r="(443.1-0.1)*mm" module_dr="140.6*mm" module_dphi="40.1*mm" nmodule="36" vis="SeeThrough"/>
+        <ring id="2" inner_r="443.1*mm" outer_r="565*mm" module_dr="120.5*mm" module_dphi="40.1*mm"  nmodule="44" vis="SeeThrough"/>
+      </layer>
+      </layers>
+
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="ITKEndcapCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml
index 0f3023e7c48370b1e37cf4c80bc801da4640e99a..0b386f6448aa179147fe0707c04707f765023af4 100644
--- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml
+++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlySIT.xml
@@ -25,11 +25,11 @@
   </define>
 
   <include ref="./TDR_Dimensions_v01_01.xml"/>
-  <include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/>
+<!--  <include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/>-->
   <!--include ref="../CRD_common_v02/SIT_StaggeredStave_v01.xml"/-->
-  <!--include ref="../CRD_common_v02/FTD_SkewRing_v01_05.xml"/>
-      <include ref="../CRD_common_v02/SIT_SimplePixel_v01_03.xml"/>
-  <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/-->
+  <include ref="../CRD_common_v02/ITK_EndCap_v01.xml"/>
+<!--      <include ref="../CRD_common_v02/SIT_SimplePixel_v01_03.xml"/>-->
+<!--  <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/&ndash;&gt;-->
   
   <fields>
     <field name="InnerSolenoid" type="solenoid"
diff --git a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1074364c98c85391e15c44e82a867779733b7e3d
--- /dev/null
+++ b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
@@ -0,0 +1,199 @@
+#include <DD4hep/Detector.h>
+#include "DD4hep/DetFactoryHelper.h"
+#include "XML/Utilities.h"
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "Math/AxisAngle.h"
+#include <map>
+
+using namespace dd4hep;
+
+static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens)
+{
+  xml_det_t x_det = e;
+  Material air = description.air();
+  int det_id = x_det.id();
+  std::string name = x_det.nameStr();
+  bool reflect = x_det.reflect(false);
+  DetElement tracker(name, det_id);
+
+  Volume envelope = createPlacedEnvelope(description, e, tracker);
+  setDetectorTypeFlag(e, tracker);
+  if (description.buildType() == BUILD_ENVELOPE)
+    return tracker;
+  envelope = envelope.setVisAttributes(description.visAttributes("SeeThrough"));
+
+  if (x_det.hasChild(_U(sensitive)))
+  {
+    xml_dim_t sd_typ = x_det.child(_U(sensitive));
+    sens.setType(sd_typ.typeStr());
+  }
+  else
+  {
+    sens.setType("tracker");
+  }
+  std::cout << " ** building ITK_EndCap_v01 ... " << sens.type() << std::endl;
+
+  const xml::Component layers_xml = x_det.child("layers");
+  for (xml_coll_t layer(layers_xml, "layer"); layer; ++layer)
+  {
+    //id="0" z="505*mm" dz="SiliconThickness*2 + SupportThickness" inner_r="81.5*mm" outer_r="242.5*mm" vis="SeeThrough"
+    const auto layer_id = layer.attr<std::string>("id");
+    const auto dz = layer.attr<double>("dz");
+    const auto inner_r = layer.attr<double>("inner_r");
+    const auto outer_r = layer.attr<double>("outer_r");
+    const auto layer_vis = layer.attr<std::string>("vis");
+    const auto z = layer.attr<double>("z");
+    std::string layer_name = name + "_layer_" + layer_id;
+
+    const auto SiliconThickness = description.constant<double>("SiliconThickness");
+    const auto SupportThickness = description.constant<double>("SupportThickness");
+
+    Tube layer_tube(inner_r, outer_r, dz / 2.0, 0.0, 2 * M_PI);
+    Volume layer_vol(layer_name, layer_tube, air);
+    DetElement layer_det(layer_name, det_id);
+    layer_vol = layer_vol.setVisAttributes(description.visAttributes(layer_vis));
+
+    // populate support
+    double support_z = -SupportThickness / 2.0;
+    const xml::Component supports = x_det.child("support");
+    for (xml_coll_t support(supports, "slice"); support; ++support)
+    {
+      const auto support_name = support.attr<std::string>("name");
+      const auto support_material = support.attr<std::string>("material");
+      const auto support_thickness = support.attr<double>("thickness");
+      const auto support_vis = support.attr<std::string>("vis");
+      std::string support_vol_name = layer_name + "_" + support_name;
+      Tube support_tube(inner_r, outer_r, support_thickness / 2.0, 0.0, 2 * M_PI);
+      Volume support_vol(support_vol_name, support_tube, description.material(support_material));
+      DetElement support_det(support_vol_name, det_id);
+      support_vol = support_vol.setVisAttributes(description.visAttributes(support_vis));
+      support_det.setPlacement(layer_vol.placeVolume(support_vol, Position(0, 0, support_z + support_thickness / 2.0)));
+      support_z += support_thickness;
+      layer_det.add(support_det);
+      rec::Vector3D u(1., 0., 0.);
+      rec::Vector3D v(0., 0., 1.);
+      rec::Vector3D n(0., 1., 0.);
+      rec::VolPlane surf(support_vol, rec::SurfaceType::Plane, support_thickness / 2.0, support_thickness / 2.0, u, v,
+                         n);
+      rec::volSurfaceList(layer_det)->push_back(surf);
+    }
+
+
+    // populate sensor
+    for (xml_coll_t ring(layer, "ring"); ring; ++ring)
+    {
+      const auto ring_id = ring.attr<std::string>("id");
+      const auto ring_inner_r = ring.attr<double>("inner_r");
+      const auto ring_outer_r = ring.attr<double>("outer_r");
+      const auto module_dr = ring.attr<double>("module_dr");
+      const auto module_dphi = ring.attr<double>("module_dphi");
+      const auto nmodule = ring.attr<double>("nmodule");
+      const auto vis = ring.attr<std::string>("vis");
+
+      std::string ring_vol_name = layer_name + "_ring_" + ring_id;
+      Tube ring_tube(ring_inner_r, ring_outer_r, SiliconThickness / 2.0, 0.0, 2 * M_PI);
+      Volume ring_vol(ring_vol_name, ring_tube, air);
+      DetElement ring_det(ring_vol_name, det_id);
+      ring_vol = ring_vol.setVisAttributes(description.visAttributes(vis));
+
+      // populate sensor
+      Box sensor_box(module_dr / 2.0, module_dphi / 2.0, SiliconThickness / 2.0);
+      std::string sensor_name = ring_vol_name + "_sensor";
+      Volume sensor_vol(sensor_name, sensor_box, air);
+      DetElement sensor_det(sensor_name, det_id);
+      sensor_vol = sensor_vol.setVisAttributes(description.visAttributes("SeeThrough"));
+      const xml::Component sensor = x_det.child("sensor");
+      double sensor_z = -SiliconThickness / 2.0;
+      for (xml_coll_t sensor_layer(sensor, "slice"); sensor_layer; ++sensor_layer)
+      {
+        const auto sensor_layer_name = sensor_layer.attr<std::string>("name");
+        const auto sensor_layer_material = sensor_layer.attr<std::string>("material");
+        const auto sensor_layer_thickness = sensor_layer.attr<double>("thickness");
+        const auto sensor_layer_vis = sensor_layer.attr<std::string>("vis");
+        auto is_sensitive = sensor_layer.hasAttr(_U(sensitive));
+        std::string sensor_layer_vol_name = sensor_name + "_" + sensor_layer_name;
+        Box sensor_layer_box(module_dr / 2.0, module_dphi / 2.0, sensor_layer_thickness / 2.0);
+        Volume sensor_layer_vol(sensor_layer_vol_name, sensor_layer_box, description.material(sensor_layer_material));
+        DetElement sensor_layer_det(sensor_layer_vol_name, det_id);
+        sensor_layer_vol = sensor_layer_vol.setVisAttributes(description.visAttributes(sensor_layer_vis));
+        rec::SurfaceType surf_type;
+        if (is_sensitive)
+        {
+          sensor_layer_vol = sensor_layer_vol.setSensitiveDetector(sens);
+          surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive,rec::SurfaceType::Plane);
+        }
+        else
+        {
+          surf_type = rec::SurfaceType(rec::SurfaceType::Helper,rec::SurfaceType::Plane);
+        }
+        sensor_layer_det.setPlacement(
+          sensor_vol.placeVolume(sensor_layer_vol, Position(0, 0, sensor_z + sensor_layer_thickness / 2.0)));
+        sensor_z += sensor_layer_thickness;
+
+        sensor_det.add(sensor_layer_det);
+        rec::Vector3D u(1., 0., 0.);
+        rec::Vector3D v(0., 1., 0.);
+        rec::Vector3D n(0., 0., 1.);
+        rec::VolPlane surf(sensor_layer_vol, surf_type, sensor_layer_thickness / 2.0,
+                           sensor_layer_thickness / 2.0, u, v,
+                           n);
+        rec::volSurfaceList(sensor_det)->push_back(surf);
+      }
+
+      // place all the sensors into ring
+      for (int i = 0; i < nmodule; ++i)
+      {
+        double angle = i * 2 * M_PI / nmodule;
+        double r_offset = ring_inner_r + module_dr / 2.0;
+        double rotated_x = r_offset * cos(angle);
+        double rotated_y = r_offset * sin(angle);
+        auto transform = Transform3D(
+          RotationZ(angle),
+          Position(rotated_x, rotated_y, 0));
+
+        DetElement rotated_sensor_det = sensor_det.clone(sensor_name + "_rotated_" + std::to_string(i));
+        rotated_sensor_det.setPlacement(
+          ring_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", i));
+        ring_det.add(rotated_sensor_det);
+      }
+
+      // place ring into layer
+      ring_det.setPlacement(
+        layer_vol.placeVolume(ring_vol, Position(0, 0, (SupportThickness + SiliconThickness) / 2.0)).addPhysVolID("sensor", 2*std::stoi(ring_id)));
+      layer_det.add(ring_det);
+      // rotate and reflect ring
+      std::string reflect_ring_name = ring_vol_name + "_reflect";
+      auto reflect_ring_det = ring_det.clone(reflect_ring_name);
+      reflect_ring_det.setPlacement(layer_vol.placeVolume(
+        ring_vol, Transform3D(RotationZ(M_PI / nmodule) * Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1) ,
+                              Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0))).addPhysVolID("sensor", 2*std::stoi(ring_id)+1));
+      layer_det.add(reflect_ring_det);
+    }
+
+
+    // put layer into envelope
+    layer_det.setPlacement(envelope.placeVolume(layer_vol, Position(0, 0, z)).
+                                    addPhysVolID("side", 1).addPhysVolID("layer", std::stoi(layer_id)));
+    tracker.add(layer_det);
+    // copy layer_vol and put reflect
+    if (reflect)
+    {
+      std::string reflect_layer_name = layer_name + "_reflect";
+      auto reflect_layer_det = layer_det.clone(reflect_layer_name);
+      reflect_layer_det.setPlacement(
+        envelope.placeVolume(layer_vol, Transform3D(Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1), Position(0, 0, -z))).addPhysVolID("side", -1).
+                 addPhysVolID("layer", std::stoi(layer_id)));
+      tracker.add(reflect_layer_det);
+    }
+  }
+
+  if (x_det.hasAttr(_U(combineHits)))
+  {
+    tracker.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
+  }
+
+  return tracker;
+}
+
+DECLARE_DETELEMENT(ITK_EndCap_v01, create_detector)