diff --git a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp
index 01bd3572b8d3fdf99fd4068d8f14999ea8fa31ea..51aaaabe534bcf50aac95705ae7b7b4126a3e297 100644
--- a/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp
+++ b/Detector/DetCEPCv4/src/tracker/SIT_Simple_Pixel_geo.cpp
@@ -126,7 +126,11 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
   dd4hep::Material sensitiveMat = theDetector.material(db->fetchString("sensitive_mat"));  
   dd4hep::Material supportMat   = theDetector.material(db->fetchString("support_mat"));  
   
-  
+  db = XMLHandlerDB(  x_det.child( _Unicode( display ) ) ) ;
+  std::string ladderVis  = db->fetchString("ladder");
+  std::string supportVis = db->fetchString("support");
+  std::string sensEnvVis = db->fetchString("sens_env");
+  std::string sensVis    = db->fetchString("sens");
   // // // setup the encoder 
   // // UTIL::BitField64 encoder( LCTrackerCellID::encoding_string() ) ; 
   
@@ -286,7 +290,7 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
                                 layer_geom.ladder_width / 2.0,
                                 layer_geom.half_z);
 
-    dd4hep::Volume sitLadderLogical( dd4hep::_toString( layer_id,"SIT_LadderLogical_%02d"), sitLadderSolid, air ) ; 
+    dd4hep::Volume sitLadderLogical( name + dd4hep::_toString( layer_id,"_LadderLogical_%02d"), sitLadderSolid, air ) ; 
         
     // now create an envelope volume to represent the sensitive area, which will be divided up into individual sensors         
         
@@ -295,7 +299,7 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
                                      layer_geom.half_z);
     
     //fixme: material ???    Volume sitSenEnvelopeLogical( _toString( layer_id,"SIT_SenEnvelopeLogical_%02d"), sitSenEnvelopeSolid, sensitiveMat )  ;
-    dd4hep::Volume sitSenEnvelopeLogical( dd4hep::_toString( layer_id,"SIT_SenEnvelopeLogical_%02d"),
+    dd4hep::Volume sitSenEnvelopeLogical( name + dd4hep::_toString( layer_id,"_SenEnvelopeLogical_%02d"),
                                           sitSenEnvelopeSolid, air )  ;
     
     // create the sensor volumes and place them in the senstive envelope volume 
@@ -304,7 +308,7 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
                              layer_geom.ladder_width  / 2.0,
                              (layer_geom.sensor_length / 2.0 ) - 1.e-06 * dd4hep::mm ); // added tolerance to avoid false overlap detection
     
-    dd4hep::Volume sitSenLogical( dd4hep::_toString( layer_id,"SIT_SenLogical_%02d"), sitSenSolid,sensitiveMat ) ; 
+    dd4hep::Volume sitSenLogical( name + dd4hep::_toString( layer_id,"_SenLogical_%02d"), sitSenSolid,sensitiveMat ) ; 
     
     sitSenLogical.setSensitiveDetector(sens);
 
@@ -371,10 +375,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
       pvV[isensor] = pv ;
     }					      
     
-    sit.setVisAttributes(theDetector, "SeeThrough",  sitLadderLogical ) ;
-    sit.setVisAttributes(theDetector, "SeeThrough",  sitSenEnvelopeLogical ) ;
+    sit.setVisAttributes(theDetector, ladderVis,  sitLadderLogical ) ;
+    sit.setVisAttributes(theDetector, sensEnvVis,  sitSenEnvelopeLogical ) ;
 
-    sit.setVisAttributes(theDetector, "BlueVis",       sitSenLogical ) ;
+    sit.setVisAttributes(theDetector, sensVis,       sitSenLogical ) ;
     
     
     // encoder.reset() ;  // reset to 0
@@ -398,10 +402,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
 		     layer_geom.ladder_width / 2.0,
 		     layer_geom.half_z);
     
-    Volume sitSupLogical(   _toString( layer_id,"SIT_SupLogical_%02d"),  sitSupSolid, supportMat ) ;
+    Volume sitSupLogical( name + _toString( layer_id,"_SupLogical_%02d"),  sitSupSolid, supportMat ) ;
     
     
-    sit.setVisAttributes(theDetector, "RedVis",  sitSupLogical ) ;
+    sit.setVisAttributes(theDetector, supportVis,  sitSupLogical ) ;
     
     
     pv = sitLadderLogical.placeVolume( sitSupLogical, Transform3D( RotationY( 0.), 
@@ -472,6 +476,10 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
   //--------------------------------------
   
   sit.setVisAttributes( theDetector, x_det.visStr(), envelope );
+
+  if ( x_det.hasAttr(_U(combineHits)) ) {
+    sit.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  }
   
   return sit;
 }
diff --git a/Detector/DetCRD/CMakeLists.txt b/Detector/DetCRD/CMakeLists.txt
index 55e3317890aa2f7420ac0b7298a9bcb66b631004..4a92fed45c70d5483398dc43e4e8abecd79ef302 100644
--- a/Detector/DetCRD/CMakeLists.txt
+++ b/Detector/DetCRD/CMakeLists.txt
@@ -16,8 +16,10 @@ find_package(ROOT COMPONENTS MathCore GenVector Geom REQUIRED)
 # install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/compact DESTINATION Detector/DetCRD)
 
 gaudi_add_module(DetCRD
-                 SOURCES src/Calorimeter/CRDEcal.cpp
+                 SOURCES src/Calorimeter/CRDEcal_v01.cpp
                          src/Other/CRDBeamPipe_v01_geo.cpp
+                         src/Tracker/SiTrackerSkewRing_v01_geo.cpp
+
 		 LINK ${DD4hep_COMPONENT_LIBRARIES}
 )
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml
index 6d3b3a7fd640577efeb8d5b56930e0ea551d06a7..99930c35d8b086bf160b5e53c925eb1589a1d342 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml
@@ -12,7 +12,7 @@
   </regions>
 
   <detectors>
-    <detector id="DetID_ECAL" name="CaloDetector" type="CRDEcalBarrel" readout="EcalBarrelCollection" vis="Invisible" sensitive="true" region="EcalBarrelRegion">
+    <detector id="DetID_ECAL" name="CaloDetector" type="CRDEcalBarrel_v01" readout="EcalBarrelCollection" vis="Invisible" sensitive="true" region="EcalBarrelRegion">
       <!-- Use cm as unit if you want to use Pandora for reconstruction -->
     </detector>
   </detectors>
@@ -25,7 +25,7 @@
                     grid_size_x="1*cm"
                     grid_size_y="1*cm"
                     grid_size_z="1*cm"/-->
-      <id>system:4,layer:6,block:8,bar:10</id>
+      <id>system:5,module:3,stave:4,dlayer:5,part:3,slayer:32:2,bar:6</id>
     </readout>
   </readouts>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bb9f361b4ae675201e9a5aeb4d35ab4ead476576
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_01.xml
@@ -0,0 +1,54 @@
+<lccdd>
+  <define>
+    <constant name="SiliconThickness" value="0.2*mm"/>
+    <constant name="SupportThickness" value="1.0*mm"/>
+    <constant name="ModuleZGap"       value="1.0*mm"/>
+    <constant name="ModuleRPhiGap"    value="-10*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_FTD" name="FTD" type="SiTrackerSkewRing_v01" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true" reflect="true">
+      <envelope>
+	<shape type="Assembly"/>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER +  DetType_ENDCAP  + DetType_PIXEL "/>
+
+      <reconstruction strip_width="0.05*mm" strip_length="92*mm" strip_pitch="0" strip_angle="0"/>
+
+      <layer id="0" z="SiTracker_endcap_z1" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z1*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius1"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+	<component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+	<component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="1" z="SiTracker_endcap_z2" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z2*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius2"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="2" z="SiTracker_endcap_z3" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z3*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius3"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="3" z="SiTracker_endcap_z4" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z4*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius4"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="4" z="SiTracker_endcap_z5" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z5*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius5"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="FTDCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..198426b4266fdfe0cfcdf4e530b2b83162e3dc0a
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SkewRing_v01_02.xml
@@ -0,0 +1,49 @@
+<lccdd>
+  <define>
+    <constant name="SiliconThickness" value="0.2*mm"/>
+    <constant name="SupportThickness" value="1.0*mm"/>
+    <constant name="ModuleZGap"       value="1.0*mm"/>
+    <constant name="ModuleRPhiGap"    value="-10*mm"/>
+  </define>
+
+  <detectors>
+    <detector id="DetID_FTD" name="FTD" type="SiTrackerSkewRing_v01" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true" reflect="true">
+      <envelope>
+	<shape type="Assembly"/>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER +  DetType_ENDCAP  + DetType_PIXEL "/>
+
+      <reconstruction strip_width="0.05*mm" strip_length="92*mm" strip_pitch="0" strip_angle="0"/>
+
+      <layer id="0" z="SiTracker_endcap_z1" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z1*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius1"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+	<component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+	<component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="1" z="SiTracker_endcap_z2" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z2*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius2"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="2" z="SiTracker_endcap_z3" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z3*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius3"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+      <layer id="3" z="SiTracker_endcap_z4" dz="0.5*ModuleZGap" inner_r="SiTracker_endcap_z4*tan(acos(Global_endcap_costheta))*cos(pi/16)" outer_r="SiTracker_endcap_outer_radius4"
+	     phi0="0" gap="ModuleRPhiGap" is_pixel="true" nmodules="16" vis="SeeThrough">
+        <component material="G4_Si"       thickness="SiliconThickness" vis="FTDSensitiveVis" sensitive="yes"/>
+        <component material="CarbonFiber" thickness="SupportThickness" vis="FTDSupportVis"/>
+      </layer>
+
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="FTDCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePixel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePixel_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f40a2f2286171dcc90791c7613c29d34afde7c95
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePixel_v01_01.xml
@@ -0,0 +1,43 @@
+<lccdd>
+  <define>
+    <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0--> 
+    <constant name="SET_sensitive_thickness" value="0.17*mm"/>
+    <constant name="SET_support_thickness"   value="1.0*mm"/> 
+    <constant name="SET_sensor_length"       value="92*mm"/>
+    <constant name="SET_ladder_number"       value="2*pi*SET_inner_radius/SIT_sensor_length"/>
+    <constant name="SET_outer_radius" value="(SET_inner_radius+SET_sensitive_thickness+SET_support_thickness)/cos(pi/SET_ladder_number) + env_safety"/>
+    <constant name="SET_half_length"  value="OuterTracker_half_length"/>
+    <!--constant name="SET_distance_from_tpc" value="SET_inner_radius-OuterTracker_outer_radius+0.5*SET_sensitive_thickness"/-->
+  </define>
+  
+  <detectors>
+    <!--detector id="DetID_SET" name="SET" type="SET_Simple_Planar" vis="SETVis" readout="SETCollection" insideTrackingVolume="true"-->
+    <detector id="DetID_SET" name="SET" type="SIT_Simple_Pixel" vis="SETVis" readout="SETCollection" insideTrackingVolume="true">
+      <envelope>
+	<shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length"  material = "Air" />
+      </envelope>
+      
+      <type_flags type="DetType_TRACKER +  DetType_BARREL + DetType_PIXEL "/>
+      
+      <reconstruction strip_width="0." strip_length="0." strip_pitch="0." strip_angle="0*deg"  />
+
+      <global sensitive_thickness="SET_sensitive_thickness" support_thickness="SET_support_thickness" sensor_length="SIT_sensor_length" sensitive_mat="G4_Si"
+              support_mat="G4_C" sensitive_threshold_KeV="64*keV"  />
+      <display ladder="SeeThrough" support="SETSupportVis" sens_env="SeeThrough" sens="SETSensitiveVis" />
+      
+      <!--layer layer_id="0" sensitive_distance_from_tpc="SET_distance_from_tpc" coverage_of_TPC_Ecal_Hcal_barrel="1.0"
+             n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="1"  /-->
+      <layer layer_id="0" sensitive_radius="SET_inner_radius+0.5*SET_sensitive_thickness" n_sensors_per_ladder="SET_half_length*2/SIT_sensor_length"
+	     n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="0"  />
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="SETCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+    </readout>
+  </readouts>
+
+
+</lccdd>
+
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_01.xml
index 82071ac2591c17718373cb53e88abbb6313702bd..1c9ec38ccd46841dde89ef090ab4ab9dee316751 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_01.xml
@@ -1,34 +1,31 @@
 <lccdd>
   <define>
-    <constant name="SET_inner_radius" value="OuterTracker_outer_radius + env_safety"/>
-    <constant name="SET_outer_radius" value="Ecal_barrel_inner_radius - env_safety "/>
-    <constant name="SET_half_length"  value="DC_half_length"/>
+    <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0-->
+    <constant name="SET_sensitive_thickness" value="0.17*mm"/>
+    <constant name="SET_support_thickness"   value="1.0*mm"/>
+    <constant name="SET_ladder_number"       value="24"/>
+    <constant name="SET_outer_radius" value="(SET_inner_radius+SET_sensitive_thickness*2+SET_support_thickness*2)/cos(pi/SET_ladder_number) + env_safety"/>
+    <constant name="SET_half_length"  value="OuterTracker_half_length"/>
+    <constant name="SET_distance_from_tpc" value="SET_inner_radius-OuterTracker_outer_radius+0.5*SET_sensitive_thickness"/>
   </define>
 
   <detectors>
     <detector id="DetID_SET" name="SET" type="SET_Simple_Planar" vis="SETVis" readout="SETCollection" insideTrackingVolume="true">
-      <envelope vis="SETVis">
-        <shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length"  material = "Air" />
+      <envelope>
+	<shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length"  material = "Air" />
       </envelope>
 
       <type_flags type="DetType_TRACKER +  DetType_BARREL + DetType_STRIP "/>
 
-      <!-- database : set_simple_planar_sensors_01 -->
-
-      <!-- SQL command: "select * from extended_reconstruction_parameters;"  -->
       <reconstruction strip_width="0.0125*mm" strip_length="92*mm" strip_pitch="0.05*mm" strip_angle="7*deg"  />
 
-      <!-- SQL command: "select * from global;"  -->
-      <global sensitive_thickness="0.2*mm" support_thickness="1*mm" sensor_length="92*mm" sensitive_mat="G4_Si"
+      <global sensitive_thickness="SET_sensitive_thickness" support_thickness="SET_support_thickness" sensor_length="92*mm" sensitive_mat="G4_Si"
               support_mat="G4_C" sensitive_threshold_KeV="64*keV"  />
 
-      <!-- SQL command: "select * from set_layers;"  -->
-
-      <layer layer_id="0" sensitive_distance_from_tpc="3*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98"
-             n_ladders="24" ladder_clearance="0.1*mm" faces_IP="1"  />
-
-      <layer layer_id="1" sensitive_distance_from_tpc="5.5*mm" coverage_of_TPC_Ecal_Hcal_barrel="0.98"
-             n_ladders="24" ladder_clearance="0.1*mm" faces_IP="0"  />
+      <layer layer_id="0" sensitive_distance_from_tpc="SET_distance_from_tpc" coverage_of_TPC_Ecal_Hcal_barrel="1.0"
+             n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="1"  />
+      <layer layer_id="1" sensitive_distance_from_tpc="SET_distance_from_tpc+SET_support_thickness*2+SET_sensitive_thickness" coverage_of_TPC_Ecal_Hcal_barrel="1.0"
+             n_ladders="SET_ladder_number" ladder_clearance="0.1*mm" faces_IP="0"  />
 
     </detector>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml
index 02a49d5eaa5a5fd32f68e2d51987d7c64505680f..92dd20c92d72dea5686e258a334253743347ec86 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_01.xml
@@ -1,42 +1,46 @@
 <lccdd>
   <define>
-    <constant name="SIT_sensitive_thickness" value="0.2*mm"/>
-    <constant name="SIT_inner_radius"   value="SIT1_inner_radius"/>
+    <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0-->
+    <constant name="SIT_sensitive_thickness" value="0.17*mm"/>
+    <constant name="SIT_support_thickness"   value="1*mm"/>
+    <constant name="SIT_sensor_length"       value="92*mm"/>
+    <!--constant name="SIT_inner_radius"   value="SIT1_inner_radius"/>
     <constant name="SIT_inner_radius_1"   value="SIT_inner_radius + env_safety"/>
     <constant name="SIT_outer_radius_1" value="SIT_inner_radius_1/cos(pi/8)"/>
     <constant name="SIT_inner_radius_2" value="SIT2_inner_radius"/>
     <constant name="SIT_outer_radius"   value="OuterTracker_inner_radius"/>
     <constant name="SIT_half_length"    value="SIT2_half_length"/>
     <constant name="SIT_half_length_1"  value="SIT1_half_length"/>
-    <constant name="SIT_layer_gap" value="2.5*mm"/>
+    <constant name="SIT_layer_gap" value="2.5*mm"/-->
   </define>
 
   <detectors>
-    <detector id="DetID_SIT" name="SIT" type="SIT_Simple_Planar" vis="SITVis" readout="SITCollection" insideTrackingVolume="true">
-      <envelope vis="SeeThrough">
-        <shape type="BooleanShape" operation="Union" material="Air" >
+    <detector id="DetID_SIT" name="SIT" type="SIT_Simple_Pixel" vis="SITVis" readout="SITCollection" insideTrackingVolume="true">
+      <envelope>
+	<shape type="Assembly"/>
+        <!--shape type="BooleanShape" operation="Union" material="Air" >
           <shape type="Tube" rmin="SIT_inner_radius"   rmax="SIT_outer_radius_1" dz="SIT_half_length_1" />
           <shape type="Tube" rmin="SIT_inner_radius_2" rmax="SIT_outer_radius"   dz="SIT_half_length" />
-        </shape>
+        </shape-->
       </envelope>
 
-      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/>
+      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_PIXEL "/>
 
-      <!-- database : sit_simple_planar_sensors_03 -->
-      
-      <!-- SQL command: "select * from extended_reconstruction_parameters;"  -->
-      <reconstruction strip_width="0." strip_length="92*mm" strip_pitch="0." strip_angle="0*deg"  />
+      <reconstruction strip_width="0." strip_length="0." strip_pitch="0." strip_angle="0*deg"  />
 
-      <!-- SQL command: "select * from global;"  -->
-      <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="1*mm" sensor_length="92*mm"
+      <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="SIT_support_thickness" sensor_length="SIT_sensor_length"
               sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV"  />
+      <display ladder="SeeThrough" support="SITSupportVis" sens_env="SeeThrough" sens="SITSensitiveVis" />
 
-      <!-- SQL command: "select * from sit_layers;"  -->
-      <layer layer_id="0" sensitive_radius="SIT_inner_radius_1+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="8" n_ladders="10"
-             ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="1" is_SIT2="0"  />
+      <layer layer_id="0" sensitive_radius="SIT1_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT1_half_length*2/SIT_sensor_length"
+	     n_ladders="2*pi*SIT1_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="1" is_SIT2="0"  />
+      <layer layer_id="1" sensitive_radius="SIT2_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT2_half_length*2/SIT_sensor_length"
+             n_ladders="2*pi*SIT2_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="1"  />
+      <layer layer_id="2" sensitive_radius="SIT3_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT3_half_length*2/SIT_sensor_length"
+             n_ladders="2*pi*SIT3_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="0"  />
+      <layer layer_id="3" sensitive_radius="SIT4_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT4_half_length*2/SIT_sensor_length"
+             n_ladders="2*pi*SIT4_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="0"  />
 
-      <layer layer_id="1" sensitive_radius="SIT_inner_radius_2+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="48" n_ladders="16"
-             ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="1"  />
     </detector>
   </detectors>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..01b0759976b96223fb1938c4679d728d386891d3
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePixel_v01_02.xml
@@ -0,0 +1,51 @@
+<lccdd>
+  <define>
+    <!--0.17mm silicon + 1.0mm carbon -> 0.65% of X0-->
+    <constant name="SIT_sensitive_thickness" value="0.17*mm"/>
+    <constant name="SIT_support_thickness"   value="1*mm"/>
+    <constant name="SIT_sensor_length"       value="92*mm"/>
+    <!--constant name="SIT_inner_radius"   value="SIT1_inner_radius"/>
+    <constant name="SIT_inner_radius_1"   value="SIT_inner_radius + env_safety"/>
+    <constant name="SIT_outer_radius_1" value="SIT_inner_radius_1/cos(pi/8)"/>
+    <constant name="SIT_inner_radius_2" value="SIT2_inner_radius"/>
+    <constant name="SIT_outer_radius"   value="OuterTracker_inner_radius"/>
+    <constant name="SIT_half_length"    value="SIT2_half_length"/>
+    <constant name="SIT_half_length_1"  value="SIT1_half_length"/>
+    <constant name="SIT_layer_gap" value="2.5*mm"/-->
+  </define>
+
+  <detectors>
+    <detector id="DetID_SIT" name="SIT" type="SIT_Simple_Pixel" vis="SITVis" readout="SITCollection" insideTrackingVolume="true">
+      <envelope>
+	<shape type="Assembly"/>
+        <!--shape type="BooleanShape" operation="Union" material="Air" >
+          <shape type="Tube" rmin="SIT_inner_radius"   rmax="SIT_outer_radius_1" dz="SIT_half_length_1" />
+          <shape type="Tube" rmin="SIT_inner_radius_2" rmax="SIT_outer_radius"   dz="SIT_half_length" />
+        </shape-->
+      </envelope>
+
+      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_PIXEL "/>
+
+      <reconstruction strip_width="0." strip_length="0." strip_pitch="0." strip_angle="0*deg"  />
+
+      <global sensitive_thickness="SIT_sensitive_thickness" support_thickness="SIT_support_thickness" sensor_length="SIT_sensor_length"
+              sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV"  />
+      <display ladder="SeeThrough" support="SITSupportVis" sens_env="SeeThrough" sens="SITSensitiveVis" />
+
+      <layer layer_id="0" sensitive_radius="SIT1_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT1_half_length*2/SIT_sensor_length"
+	     n_ladders="2*pi*SIT1_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="1" is_SIT2="0"  />
+      <layer layer_id="1" sensitive_radius="SIT2_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT2_half_length*2/SIT_sensor_length"
+             n_ladders="2*pi*SIT2_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="1"  />
+      <layer layer_id="2" sensitive_radius="SIT3_inner_radius+0.5*SIT_sensitive_thickness" n_sensors_per_ladder="SIT3_half_length*2/SIT_sensor_length"
+             n_ladders="2*pi*SIT3_inner_radius/SIT_sensor_length" ladder_clearance="0.1*mm" faces_IP="1" is_SIT1="0" is_SIT2="0"  />
+
+    </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="SITCollection">
+      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+    </readout>
+  </readouts>
+  
+</lccdd>
diff --git a/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f75648822cdf44352cd3cec502d292c1157b7d2c
--- /dev/null
+++ b/Detector/DetCRD/src/Calorimeter/CRDEcal_v01.cpp
@@ -0,0 +1,193 @@
+//====================================================================
+//  Detector description for CEPC Reference Detector ECal Barrel.
+//--------------------------------------------------------------------
+//
+//  Author: Fangyi Guo    email: guofangyi@ihep.ac.cn
+//  Ecal cosists of long crystal bar 1cm*1cm*~40cm 
+//  8 parts cover 2pi phi range. Inner radius, height, z-length can change from xml.
+//  In each part, crystal bar crosses in odd-even layer. 
+//
+//  v0r0: nothing but BGO crystal
+//  v01: use double-layer as basic block, for cross-location in reconstruction. 
+//		layout: 8 module 
+//						->14 double-layer(dlayer) in R-direction 
+//						->10 part along Z-direction
+//						->4 block along phi-direction   (4*10*14 blocks in each module).
+//						->2 sub-layer (bars in 0 sub-layer along phi direction, in 1 sub-layer along z direction).
+//						->N bar. 
+//====================================================================
+#include "DD4hep/DetFactoryHelper.h"
+#include "XML/Layering.h"
+#include "XML/Utilities.h"
+#include "DDRec/DetectorData.h"
+#include "DDSegmentation/Segmentation.h"
+
+#define MYDEBUG(x) std::cout << __FILE__ << ":" << __LINE__ << ": " << x << std::endl;
+#define MYDEBUGVAL(x) std::cout << __FILE__ << ":" << __LINE__ << ": " << #x << ": " << x << std::endl;
+
+using dd4hep::rec::LayeredCalorimeterData;
+using namespace dd4hep;
+using namespace std;
+static dd4hep::Ref_t create_detector(dd4hep::Detector& theDetector,
+                                     xml_h e,
+                                     dd4hep::SensitiveDetector sens) {
+
+  xml_det_t x_det = e;
+  
+  std::string det_name = x_det.nameStr();
+  std::string det_type = x_det.typeStr();
+  MYDEBUGVAL(det_name);
+  MYDEBUGVAL(det_type);
+  int detid = x_det.id();
+  
+  //Global geometry
+  double R0 = theDetector.constant<double>("ecalbarrel_inner_radius");
+  double h0 = theDetector.constant<double>("ecalbarrel_thickness");
+  double Z0 = theDetector.constant<double>("ecalbarrel_zlength");
+  double barx = theDetector.constant<double>("bar_x");   //Crystal size in R direction. 
+  double bary = theDetector.constant<double>("bar_y");   //Crystal size in z/phi direction (z for odd layer, phi for even layer).
+  
+  double dim_x1 = R0*tan(22.5*degree) + sqrt(2)*h0/2.;
+  double dim_x2 = dim_x1 - h0;
+  double dim_y = Z0/2.;
+  double dim_z = h0/2.;		                 
+  double dx = dim_x1 - R0*tan(22.5*degree);  //transport distance in x-axis
+  double r0 = R0+h0/2.;                      //rotation radius 
+  
+  //Crystal bar size
+  int Nlayers = (int)h0/(2*barx);         //14 double-layers. 
+  int Nblock_z   = 11;                    //block number in z direction
+  int Nblock_phi = 4;                     //block number in phi direction
+  double barz_s0;                         //Crystal bar lenghth in sub-layer 0(phi direction). Depends on layer number. 
+  double barz_s1 = Z0/Nblock_z;           //Crystal bar lenghth in sub-layer 1(z direction, 46cm).
+  int Nbar_phi;                           //Crystal bar number in each block, in phi direction.
+  int Nbar_z = (int)barz_s1/bary;         //Crystal bar number in each block, in z direction.
+  
+  //Define detector and motherVolume(world)
+  dd4hep::DetElement ECAL(det_name, detid);
+  dd4hep::Volume motherVol = theDetector.pickMotherVolume(ECAL);
+  
+  // Create a Tube-like envelope representing the whole detector volume
+  dd4hep::PolyhedraRegular envelope(8, 22.5*degree, R0, (R0+h0), Z0);
+  dd4hep::Material	air(theDetector.material("Air"));
+  dd4hep::Volume	   envelopeVol(det_name, envelope, air);
+  dd4hep::PlacedVolume	envelopePlv = motherVol.placeVolume(envelopeVol, Position(0,0,0));
+  envelopePlv.addPhysVolID("system",x_det.id());
+  envelopeVol.setVisAttributes(theDetector, "InvisibleWithChildren" );
+  ECAL.setPlacement(envelopePlv);
+
+  //Define specific material and volumen for detElement
+  dd4hep::Material mat_BGO(theDetector.material("G4_BGO"));
+  dd4hep::Trapezoid trap(dim_x1, dim_x2, dim_y, dim_y, dim_z);
+  dd4hep::Volume det_vol("trap_vol", trap, mat_BGO);
+  det_vol.setVisAttributes(theDetector, "InvisibleWithChildren");
+
+  dd4hep::Trapezoid subtrap(dim_x1, dim_x2, dim_y/Nblock_z, dim_y/Nblock_z, dim_z);
+  dd4hep::Volume det_stave("stave_vol", subtrap, mat_BGO);
+  det_stave.setVisAttributes(theDetector, "InvisibleWithChildren");  
+
+  // Create extension objects for reconstruction
+  LayeredCalorimeterData* caloData = new LayeredCalorimeterData ;
+  for(int il=0;il<Nlayers; il++){
+    //used for reconstruction, so write a 1*1*2 layer cell size. No absorber or dead-meaterial.
+    dd4hep::rec::LayeredCalorimeterData::Layer _caloLayer;
+    _caloLayer.distance                        = R0+il*2*barx;
+    _caloLayer.phi0                               = 0;
+    _caloLayer.absorberThickness            = 0;
+    _caloLayer.inner_nRadiationLengths   = 0.01;
+    _caloLayer.inner_nInteractionLengths = 0.01;
+    _caloLayer.outer_nRadiationLengths   = 0.01;
+    _caloLayer.outer_nInteractionLengths = 0.01;
+    _caloLayer.inner_thickness              = barx;    //1cm
+    _caloLayer.outer_thickness              = barx;    //1cm
+    _caloLayer.sensitive_thickness       = 2*barx; //2cm
+    _caloLayer.cellSize0                         = barx;    //1cm
+    _caloLayer.cellSize1                         = barx;    //1cm
+  caloData->layers.push_back(_caloLayer);
+  }
+
+  caloData->layoutType = LayeredCalorimeterData::BarrelLayout ;
+  caloData->inner_symmetry = 8  ;
+  caloData->outer_symmetry = 8  ;
+  caloData->phi0 = 0 ; // hardcoded
+
+  // extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in mm.
+  caloData->extent[0] = R0 ;
+  caloData->extent[1] = R0+h0;
+  caloData->extent[2] = 0. ;
+  caloData->extent[3] = Z0 ;
+
+
+  //Loop to place crystalls in one part
+  //Outer loop: layer (odd layer). 
+  dd4hep::Volume bar_s1("bar_s1", dd4hep::Box(bary/2, barz_s1/2, barx/2), mat_BGO);
+  bar_s1.setVisAttributes(theDetector, "VisibleRed");
+  bar_s1.setSensitiveDetector(sens);
+
+  dd4hep::DetElement stavedet(ECAL, "trap",detid);
+  for(int ilayer=1; ilayer<=Nlayers; ilayer++){
+    double lx = dim_x1 - ilayer*2*barx;
+    barz_s0 = floor(2*lx/Nblock_phi);
+    Nbar_phi = (int)barz_s0/bary;
+    dd4hep::Volume bar_s0("bar_s0", dd4hep::Box(barz_s0/2, bary/2, barx/2), mat_BGO);
+    bar_s0.setVisAttributes(theDetector, "VisibleGreen");
+    bar_s0.setSensitiveDetector(sens);
+    for(int iphi=1; iphi<=Nblock_phi; iphi++){
+    	  dd4hep::Volume block("block", dd4hep::Box(barz_s0/2, barz_s1/2, barx), mat_BGO);
+    	  block.setVisAttributes(theDetector, "VisibleGreen");
+    	  //std::string blockname = "Block_"+std::to_string(ilayer)+"_"+std::to_string(iphi)+"_"+std::to_string(iz);
+    	  std::string blockname = "Block_"+std::to_string(ilayer)+"_"+std::to_string(iphi);
+    	  dd4hep::DetElement sd(stavedet, blockname, detid);
+    
+        //sub-layer 0: bars along phi. length=barz_s0. Bar num=Nbar_z
+      for(int ibar0=1;ibar0<=Nbar_z;ibar0++){
+    	    dd4hep::PlacedVolume plv_bar0 = block.placeVolume(bar_s0, Position(0,(2*ibar0-1)*bary/2-barz_s1/2, -barx/2));
+    	    plv_bar0.addPhysVolID("slayer",0).addPhysVolID("bar",ibar0);
+    	    std::string barname0 = "CrystalBar_s0_"+std::to_string(ibar0);	
+    	    dd4hep::DetElement bardet0(sd, barname0, detid);
+    	    bardet0.setPlacement(plv_bar0);
+    	  }
+    
+    	  //sub-layer1 
+    	  for(int ibar1=1;ibar1<=Nbar_phi;ibar1++){
+    	    dd4hep::PlacedVolume plv_bar1 = block.placeVolume(bar_s1, Position((2*ibar1-1)*bary/2-barz_s0/2, 0, barx/2));
+    	  	 plv_bar1.addPhysVolID("slayer",1).addPhysVolID("bar",ibar1);
+    	  	 std::string barname1 = "CrystalBar_s1_"+std::to_string(ibar1);
+    	  	 dd4hep::DetElement bardet1(sd, barname1, detid);
+    	  	 bardet1.setPlacement(plv_bar1);
+    	  }
+    
+    	  //dd4hep::PlacedVolume plv = det_vol.placeVolume(block, Position(lx-(2*iphi-1)*barz_s0/2, (2*iz-1)*barz_s1/2-dim_y, (2*ilayer-1)*bary-dim_z));
+    	  dd4hep::PlacedVolume plv = det_stave.placeVolume(block, Position(lx-(2*iphi-1)*barz_s0/2, 0, (2*ilayer-1)*bary-dim_z));
+    	  plv.addPhysVolID("dlayer", ilayer).addPhysVolID("part", iphi);
+    	  sd.setPlacement(plv);
+    
+      }
+    }
+
+  for(int iz=1; iz<=Nblock_z; iz++){
+    dd4hep::PlacedVolume plv = det_vol.placeVolume(det_stave, Position(0, (2*iz-1)*barz_s1/2-dim_y, 0) );
+    plv.addPhysVolID("stave", iz);
+    DetElement sd(stavedet, _toString(iz,"stave%3d"), detid);
+    sd.setPlacement(plv);    
+  }
+  
+  for(int i=0;i<8;i++){
+    double rotAngle = 45*i*degree;
+    double posx = -r0*sin(rotAngle) - dx*cos(rotAngle);
+  	 double posy = r0*cos(rotAngle) - dx*sin(rotAngle);
+  	 dd4hep::Transform3D transform(dd4hep::RotationZ(rotAngle)*dd4hep::RotationX(-90*degree),  dd4hep::Position(posx, posy, 0.));
+  	 dd4hep::PlacedVolume plv = envelopeVol.placeVolume(det_vol, transform);
+  	 plv.addPhysVolID("module", i);
+  	 DetElement sd(ECAL, _toString(i,"trap%3d"), detid);
+  	 sd.setPlacement(plv);
+  }
+  
+  sens.setType("calorimeter");
+  ECAL.addExtension< LayeredCalorimeterData >( caloData ) ; 
+
+  MYDEBUG("create_detector DONE. ");
+  return ECAL;
+}
+
+DECLARE_DETELEMENT(CRDEcalBarrel_v01, create_detector)
diff --git a/Detector/DetCRD/src/Tracker/SiTrackerSkewRing_v01_geo.cpp b/Detector/DetCRD/src/Tracker/SiTrackerSkewRing_v01_geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4f768ac8ef312b020f5f1b6f0bb023cabc470a4d
--- /dev/null
+++ b/Detector/DetCRD/src/Tracker/SiTrackerSkewRing_v01_geo.cpp
@@ -0,0 +1,227 @@
+// $Id: $
+//==========================================================================
+//  Detector description implementation for CEPC
+//--------------------------------------------------------------------------
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+// 
+// Author     : FU Chengdong
+//==========================================================================
+// Specialized generic detector constructor for skew planar
+//              _______________
+//              \      |      /
+//               \     |     /
+//                \    |    /
+//                 \   |   /
+//                  \__|__/
+//                  center                       
+//
+// z       :      z position at maximum radius of center
+// dz      :      z gap between odd and even modules
+// gap     :      rphi gap between neighbouring modules
+// rmin    :      minimum radius at center
+// rmax    :      maximum radius at center
+// phi0    :      start phi for #0 module
+// skew    :      skew angle
+// nmodules:      module number at phi direction
+// is_pixel:      pixel tag for reconstruction
+//==========================================================================
+#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 std;
+
+using dd4hep::DetElement;
+using dd4hep::Detector;
+using dd4hep::Material;
+using dd4hep::PlacedVolume;
+using dd4hep::SensitiveDetector;
+using dd4hep::Volume;
+using dd4hep::Trap;
+using dd4hep::_toString;
+using dd4hep::Position;
+using dd4hep::Transform3D;
+using dd4hep::Rotation3D;
+using dd4hep::RotationZYX;
+
+static dd4hep::Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens){
+  typedef vector<PlacedVolume> Placements;
+  xml_det_t   x_det     = e;
+  Material    air       = description.air();
+  int         det_id    = x_det.id();
+  string      name      = x_det.nameStr();
+  bool        reflect   = x_det.reflect(false);
+  DetElement  tracker(name, det_id);
+
+  Volume envelope = dd4hep::xml::createPlacedEnvelope(description, e, tracker);
+  dd4hep::xml::setDetectorTypeFlag(e, tracker) ;
+  if(description.buildType()==dd4hep::BUILD_ENVELOPE) return tracker;
+  envelope.setVisAttributes(description.visAttributes("SeeThrough"));
+
+  sens.setType("tracker");
+  std::cout << " ** building SiTrackerEndcapRing_v01 ..." << std::endl ;
+
+  dd4hep::rec::ZDiskPetalsData*  zDiskPetalsData = new dd4hep::rec::ZDiskPetalsData;
+
+  PlacedVolume pv;
+
+  for(xml_coll_t li(x_det,_U(layer)); li; ++li)  {
+    xml_comp_t  x_layer(li);
+    int layer_id    = x_layer.id();
+
+    double zstart   = x_layer.z();
+    double dz       = x_layer.dz();
+    double rmin     = x_layer.inner_r();
+    double rmax     = x_layer.outer_r();
+    double phi0     = x_layer.phi0(0);
+    double skew     = x_layer.skew(0);
+    double gap      = x_layer.gap();
+    bool   is_pixel = x_layer.attr<bool>(_Unicode(is_pixel)); 
+    int    nmodules = x_layer.nmodules();
+
+    double dphi       = 2*M_PI/nmodules;
+    double phi        = phi0;
+    double x1         = rmin*tan(0.5*dphi) - 0.5*gap;
+    double x2         = rmax*tan(0.5*dphi) - 0.5*gap;
+    double half_width = (rmax-rmin)/2/cos(skew);
+    double rpos       = (rmax+rmin)/2;
+    double zpos       = zstart + half_width*sin(skew);
+
+    double layer_thickness        = 0.;
+    double sensitive_thickness[2] = {0.,0.};
+    double support_thickness      = 0.;
+    int    nsensor                = 0;
+    for(xml_coll_t ci(x_layer,_U(component)); ci; ++ci){
+      xml_comp_t c     = ci;
+      double thickness = c.thickness();
+      layer_thickness  += thickness;
+      if(c.isSensitive()){
+	sensitive_thickness[nsensor] = thickness;
+	nsensor++;
+      }
+      else      support_thickness   += thickness;
+    }
+    double half_thickness = layer_thickness/2;
+    double zshift_support = dz + 0.5*(sensitive_thickness[0] + sensitive_thickness[1] + support_thickness);
+
+    //std::cout << " ****Layer: " << layer_id << " nmodules = " << nmodules << " z = " << zpos << " zshift = " << zshift_support
+    //	      << " rmin = " << rmin << " rmax = " << rmax << " x1 = " << x1 << " x2 = " << x2 << " thickness = " << layer_thickness << std::endl;    
+    
+    Trap   moduleSolid(half_thickness, 0, 0, half_width, x1, x2, 0, half_width, x1, x2, 0);
+    Volume moduleVol(_toString(layer_id,"layer%d"), moduleSolid, air);
+    moduleVol.setVisAttributes(description.visAttributes(x_layer.visStr()));
+    
+    Placements sensitives;
+    int    sensor_id = 1;
+    int    c_id      = 0;
+    double c_pos     = -half_thickness;
+    for(xml_coll_t ci(x_layer,_U(component)); ci; ++ci, c_id++){
+      xml_comp_t c       = ci;
+      double     c_thickness = c.thickness();
+      Material   c_mat   = description.material(c.materialStr());
+      string     c_name  = _toString(c_id,"component%d");
+      Trap       c_solid(c_thickness/2, 0, 0, half_width, x1, x2, 0, half_width, x1, x2, 0);
+      Volume     c_vol(c_name, c_solid, c_mat);
+      c_vol.setVisAttributes(description.visAttributes(c.visStr()));
+      pv = moduleVol.placeVolume(c_vol,Position(0,0,c_pos+c_thickness/2));
+      if(c.isSensitive()){
+        tracker.check(sensor_id > 2," fromCompact: "+c_name+" Max of 2 modules allowed!");
+        pv.addPhysVolID("sensor", sensor_id);
+        c_vol.setSensitiveDetector(sens);
+	sensitives.push_back(pv);
+        ++sensor_id;
+      }
+      c_pos += c_thickness;
+    }
+    
+    for(int module_id=0; module_id<nmodules; module_id++){
+      
+      string m_base = _toString(layer_id,"layer%d") + _toString(module_id,"_module%d");
+      
+      double x = rpos*std::cos(phi);
+      double y = rpos*std::sin(phi);
+      double zshift_layer   = zshift_support - 0.5*sensitive_thickness[0] + 0.5*sensitive_thickness[1];
+      //std::cout << "****** module_id = " << module_id << " phi = " << phi << " x = " << x << " y = " << y
+      //	<< " zsup = " << zpos+zshift_support << " zsens = " << zpos+zshift_support-0.5*sensitive_thickness[0]-0.5*support_thickness << std::endl;
+      DetElement module(tracker, m_base+"_pos", det_id);
+      Rotation3D rot = Rotation3D(ROOT::Math::AxisAngle(dd4hep::PositionPolar(1,M_PI/2,-M_PI/2+phi),-skew))*Rotation3D(RotationZYX(-M_PI/2+phi,0,0));
+      pv = envelope.placeVolume(moduleVol, Transform3D(rot, Position(x,y,zpos+zshift_layer)));
+      pv.addPhysVolID("side",1).addPhysVolID("layer", layer_id).addPhysVolID("module",module_id);
+      module.setPlacement(pv);
+      for(size_t ic=0; ic<sensitives.size(); ++ic)  {
+	PlacedVolume sens_pv = sensitives[ic];
+	DetElement comp_elt(module, sens_pv.volume().name(), module_id);
+	comp_elt.setPlacement(sens_pv);
+      }
+
+      if(reflect){
+	Rotation3D rotRef = Rotation3D(ROOT::Math::AxisAngle(dd4hep::PositionPolar(1,M_PI/2,-M_PI/2+phi),skew))*Rotation3D(RotationZYX(M_PI/2-phi,M_PI,0));
+	pv = envelope.placeVolume(moduleVol, Transform3D(rotRef, Position(x,y,-zpos-zshift_layer)));
+	pv.addPhysVolID("side",-1).addPhysVolID("layer",layer_id).addPhysVolID("module",module_id);
+	DetElement r_module(tracker, m_base+"_neg", det_id);
+	r_module.setPlacement(pv);
+	for(size_t ic=0; ic<sensitives.size(); ++ic)  {
+	  PlacedVolume sens_pv = sensitives[ic];
+	  DetElement comp_elt(r_module, sens_pv.volume().name(), module_id);
+	  comp_elt.setPlacement(sens_pv);
+	}
+      }
+      zshift_support = -zshift_support;
+      phi   +=  dphi;
+    }
+
+    dd4hep::rec::ZDiskPetalsData::LayerLayout thisLayer;
+    thisLayer.typeFlags[ dd4hep::rec::ZDiskPetalsData::SensorType::DoubleSided ] = bool(sensor_id>2);
+    thisLayer.typeFlags[ dd4hep::rec::ZDiskPetalsData::SensorType::Pixel ]       = is_pixel;
+    thisLayer.petalHalfAngle      = dphi/2;
+    thisLayer.alphaPetal          = skew;
+    thisLayer.zPosition           = zpos;
+    thisLayer.petalNumber         = nmodules;
+    thisLayer.sensorsPerPetal     = sensor_id-1;
+    thisLayer.phi0                = phi0;
+    thisLayer.zOffsetSupport      = fabs(zshift_support);
+    thisLayer.distanceSupport     = rmin;
+    thisLayer.thicknessSupport    = support_thickness;
+    thisLayer.widthInnerSupport   = 2.*x1;
+    thisLayer.widthOuterSupport   = 2.*x2;
+    thisLayer.lengthSupport       = 2.*half_width;
+    thisLayer.zOffsetSensitive    = fabs(zshift_support) - 0.5*support_thickness - 0.5*sensitive_thickness[0];
+    thisLayer.distanceSensitive   = rmin;
+    thisLayer.thicknessSensitive  = sensitive_thickness[0];
+    thisLayer.widthInnerSensitive = 2.*x1;
+    thisLayer.widthOuterSensitive = 2.*x2;
+    thisLayer.lengthSensitive     = 2.*half_width;
+
+    zDiskPetalsData->layers.push_back(thisLayer);
+  }
+
+  dd4hep::xml::Component recPar = x_det.child(_Unicode(reconstruction));
+  const double strip_width  = recPar.attr< double >(_Unicode(strip_width));
+  const double strip_length = recPar.attr< double >(_Unicode(strip_length));
+  const double strip_pitch  = recPar.attr< double >(_Unicode(strip_pitch));
+  const double strip_angle  = recPar.attr< double >(_Unicode(strip_angle));
+
+  zDiskPetalsData->widthStrip  = strip_width;
+  zDiskPetalsData->lengthStrip = strip_length;
+  zDiskPetalsData->pitchStrip  = strip_pitch;
+  zDiskPetalsData->angleStrip  = strip_angle;
+
+  std::cout << (*zDiskPetalsData) << std::endl;
+  tracker.addExtension<dd4hep::rec::ZDiskPetalsData>( zDiskPetalsData );
+  
+  if ( x_det.hasAttr(_U(combineHits)) ) {
+    tracker.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+  }
+  
+  return tracker;
+}
+
+DECLARE_DETELEMENT(SiTrackerSkewRing_v01, create_detector)
diff --git a/Detector/DetSegmentation/src/GridDriftChamber.cpp b/Detector/DetSegmentation/src/GridDriftChamber.cpp
index cd161c13aeee0397eb925fc055a8b7f993fbe39e..30d5dccff6ac7c11754147fbeed747688e80d3e8 100644
--- a/Detector/DetSegmentation/src/GridDriftChamber.cpp
+++ b/Detector/DetSegmentation/src/GridDriftChamber.cpp
@@ -128,6 +128,5 @@ double GridDriftChamber::distanceTrackWire(const CellID& cID, const TVector3& hi
 }
 
 
-REGISTER_SEGMENTATION(GridDriftChamber)
 }
 }
diff --git a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
index 06822bb910b8138d387f1a85e24aebf690941e8b..88d71d3c05c70a4e57d64454cc8f2ed7847d44e3 100644
--- a/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/SiliconTrackingAlg.cpp
@@ -3,6 +3,7 @@
 #include "EventSeeder/IEventSeeder.h"
 #include "TrackSystemSvc/ITrackSystemSvc.h"
 #include "DataHelper/Navigation.h"
+#include "DataHelper/TrackerHitHelper.h"
 #include "edm4hep/MCParticle.h"
 #include "edm4hep/TrackerHit.h"
 //#include "edm4hep/TrackerHitPlane.h"
@@ -420,7 +421,7 @@ int SiliconTrackingAlg::InitialiseFTD() {
   }
   catch ( GaudiException &e ) {
     debug() << "Collection " << _inFTDPixelColHdl.fullKey() << " is unavailable in event " << _nEvt << endmsg;
-    success = 0;
+    //success = 0;
   }
   
   if(hitFTDPixelCol){
@@ -520,7 +521,7 @@ int SiliconTrackingAlg::InitialiseFTD() {
   }
   catch ( GaudiException &e ) {
     debug() << "Collection " << _inFTDSpacePointColHdl.fullKey() << " is unavailable in event " << _nEvt << endmsg;
-    success = 0;
+    //success = 0;
   }
 
   const edm4hep::TrackerHitCollection* rawHitCol = nullptr;
@@ -626,6 +627,8 @@ int SiliconTrackingAlg::InitialiseFTD() {
     }
     
   }
+  if(hitFTDPixelCol==nullptr&&hitFTDSpacePointCol==nullptr) success = 0;
+
   debug() << "FTD initialized" << endmsg;
   return success;
 }
@@ -771,7 +774,6 @@ int SiliconTrackingAlg::InitialiseVTX() {
         //    v)   Must be standard TrackerHit
         
 	//const edm4hep::ConstTrackerHit trkhit = hitSITCol->at(ielem);
-        
         int layer = getLayerID(trkhit);
         
         // VXD and SIT are treated as one system so SIT layers start from _nLayersVTX
@@ -2671,7 +2673,7 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) {
         // check if the hit has been rejected as being on the same layer and further from the helix lh==0
         if (lh[i] == 1) {
 	  edm4hep::ConstTrackerHit trkHit = hitVec[i]->getTrackerHit();
-	  debug() << "TrackerHit " << i << " address = " << trkHit << endmsg;
+	  debug() << "TrackerHit " << i << " id = " << trkHit.id() << endmsg;
           nFit++;
           if(trkHit.isAvailable()) { 
             trkHits.push_back(trkHit);   
@@ -2791,7 +2793,7 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) {
       marlinTrk->getHitsInFit(hits_in_fit);
       
       for ( unsigned ihit = 0; ihit < hits_in_fit.size(); ++ihit) {
-	debug() << "Hit address=" << hits_in_fit[ihit].first << endmsg;
+	debug() << "Hit id =" << hits_in_fit[ihit].first.id() << endmsg;
 	edm4hep::ConstTrackerHit trk = hits_in_fit[ihit].first;
         all_hits.push_back(trk);//hits_in_fit[ihit].first);
       }
diff --git a/Service/GearSvc/CMakeLists.txt b/Service/GearSvc/CMakeLists.txt
index 248cf3dfebc8ce42bca6f4e45c1803293989f853..a70dae702f0d31a63bd831d083bde979ad2e31eb 100644
--- a/Service/GearSvc/CMakeLists.txt
+++ b/Service/GearSvc/CMakeLists.txt
@@ -8,6 +8,7 @@ gaudi_add_module(GearSvcPlugins
                       ${GEAR_LIBRARIES}
                       ${DD4hep_COMPONENT_LIBRARIES}
                       DetInterface
+		      DetSegmentation
 )
 
 install(TARGETS GearSvc GearSvcPlugins
diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp
index 274479f5d47ec58bae73034a6596cd50ba91ac3d..5e4f21754ade341c5b4f241891f185fef2618ba2 100644
--- a/Service/GearSvc/src/GearSvc.cpp
+++ b/Service/GearSvc/src/GearSvc.cpp
@@ -1,5 +1,7 @@
 #include "GearSvc.h"
 #include "DetInterface/IGeomSvc.h"
+#include "DetSegmentation/GridDriftChamber.h"
+
 #include "gearxml/GearXML.h"
 #include "gearimpl/GearMgrImpl.h"
 #include "gearimpl/ConstantBField.h"
@@ -93,6 +95,9 @@ StatusCode GearSvc::initialize()
       else if(it->first=="TPC"){
 	sc = convertTPC(sub);
       }
+      else if(it->first=="DriftChamber"){
+        sc = convertDC(sub);
+      }
       else if(it->first=="SET"){
 	sc = convertSET(sub);
       }
@@ -101,6 +106,7 @@ StatusCode GearSvc::initialize()
       }
       if(sc==StatusCode::FAILURE) return sc;
     }
+
     gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(1847.415655, 2350., 8, 0.);
     gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 2088.8, 2450., 2, 0.);
     for(int i=0;i<29;i++){
@@ -200,7 +206,7 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){
   double phi0=0;
   helpLayer thisLadder;
   double beryllium_ladder_block_length=0,end_electronics_half_z=0,side_band_electronics_width=0;
-  double rAlu, drAlu, rSty, drSty, dzSty, rInner, aluEndcapZ, aluHalfZ, alu_RadLen, Cryostat_dEdx;
+  double rAlu=0, drAlu, rSty, drSty, dzSty, rInner, aluEndcapZ, aluHalfZ, alu_RadLen, Cryostat_dEdx;
   double VXDSupportDensity, VXDSupportZeff, VXDSupportAeff, VXDSupportRadLen, VXDSupportIntLen=0;
   double styDensity, styZeff, styAeff, styRadLen, styIntLen; 
   dd4hep::Volume vxd_vol = vxd.volume();
@@ -558,14 +564,17 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){
            << helpSensitives[i].thickness*2 << ", " << helpSensitives[i].length << ", " << helpSensitives[i].width*2 << ", " << helpSensitives[i].radLength << endmsg;
   }
   m_gearMgr->setVXDParameters(vxdParameters) ;
-  gear::GearParametersImpl* gearParameters = new gear::GearParametersImpl;
-  //CryostatAlRadius, CryostatAlThickness, CryostatAlInnerR, CryostatAlZEndCap, CryostatAlHalfZ
-  gearParameters->setDoubleVal("CryostatAlRadius",    rAlu);
-  gearParameters->setDoubleVal("CryostatAlThickness", drAlu);
-  gearParameters->setDoubleVal("CryostatAlInnerR",    rInner);
-  gearParameters->setDoubleVal("CryostatAlZEndCap",   aluEndcapZ = dzSty+drSty+drAlu/2);
-  gearParameters->setDoubleVal("CryostatAlHalfZ",     dzSty+drSty);
-  m_gearMgr->setGearParameters("VXDInfra", gearParameters);
+  if(rAlu!=0){
+    // rAlu=0, denote no cryostat 
+    gear::GearParametersImpl* gearParameters = new gear::GearParametersImpl;
+    //CryostatAlRadius, CryostatAlThickness, CryostatAlInnerR, CryostatAlZEndCap, CryostatAlHalfZ
+    gearParameters->setDoubleVal("CryostatAlRadius",    rAlu);
+    gearParameters->setDoubleVal("CryostatAlThickness", drAlu);
+    gearParameters->setDoubleVal("CryostatAlInnerR",    rInner);
+    gearParameters->setDoubleVal("CryostatAlZEndCap",   aluEndcapZ = dzSty+drSty+drAlu/2);
+    gearParameters->setDoubleVal("CryostatAlHalfZ",     dzSty+drSty);
+    m_gearMgr->setGearParameters("VXDInfra", gearParameters);
+  }
   //effective A different with what in Mokka, fix them as Mokka's
   gear::SimpleMaterialImpl* VXDFoamShellMaterial_old = new gear::SimpleMaterialImpl("VXDFoamShellMaterial_old", 1.043890843e+01, 5.612886646e+00, 2.500000000e+01, 1.751650267e+04, 0);
   m_gearMgr->registerSimpleMaterial(VXDFoamShellMaterial_old);
@@ -721,6 +730,149 @@ StatusCode GearSvc::convertTPC(dd4hep::DetElement& tpc){
   return StatusCode::SUCCESS;
 }
 
+StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){
+  dd4hep::rec::FixedPadSizeTPCData* dcData = nullptr;
+  try{
+    dcData = dc.extension<dd4hep::rec::FixedPadSizeTPCData>();
+  }
+  catch(std::runtime_error& e){
+    warning() << e.what() << " " << dcData << ", to search volume" << endmsg;
+    // before extension ready, force to convert from volumes
+    auto geomSvc = service<IGeomSvc>("GeomSvc");
+    dd4hep::Readout readout = geomSvc->lcdd()->readout("DriftChamberHitsCollection");
+    dd4hep::Segmentation seg = readout.segmentation();
+    dd4hep::DDSegmentation::GridDriftChamber* grid = dynamic_cast< dd4hep::DDSegmentation::GridDriftChamber* > ( seg.segmentation() ) ;
+    
+    dcData = new dd4hep::rec::FixedPadSizeTPCData;
+    dcData->rMinReadout = 99999;
+    dcData->rMaxReadout = 0;
+    std::vector<double> innerRadiusWalls,outerRadiusWalls;
+    bool is_convert = true;
+    dd4hep::Volume dc_vol = dc.volume();
+    for(int i=0;i<dc_vol->GetNdaughters();i++){
+      TGeoNode* daughter = dc_vol->GetNode(i);
+      std::string nodeName = daughter->GetName();
+      //info << nodeName << endmsg;
+      if(nodeName.find("chamber_vol")!=-1||nodeName.find("assembly")!=-1){
+	if(grid){
+	  // if more than one chamber, just use the outer, TODO
+	  dcData->rMinReadout = grid->DC_outer_rbegin();
+	  dcData->rMaxReadout = grid->DC_outer_rend();
+	  dcData->driftLength = grid->detectorLength();
+	  dcData->maxRow      = grid->DC_outer_layer_number();
+	  dcData->padHeight   = grid->layer_width();
+          dcData->padWidth    = dcData->padHeight;
+	}
+	else{
+	  TGeoNode* next = daughter;
+	  if(nodeName.find("assembly")!=-1){
+	    // if more than one chamber, just use the outer, TODO 
+	    next = daughter->GetDaughter(1);
+	    std::string s = next->GetName();
+	    if(s.find("chamber_vol")==-1){
+	      error() << s << " not chamber_vol" << endmsg;
+	      is_convert = false;
+	    }
+	  }
+	  
+	  //info() << next->GetName() << endmsg;
+	  
+	  const TGeoShape* chamber_shape = next->GetVolume()->GetShape();
+	  if(chamber_shape->TestShapeBit(TGeoTube::kGeoTube)){
+	    const TGeoTube* tube = (const TGeoTube*) chamber_shape;
+	    double innerRadius = tube->GetRmin();
+	    double outerRadius = tube->GetRmax();
+	    double halfLength  = tube->GetDz();
+	    dcData->driftLength = halfLength;
+	  }
+	  else{
+	    error() << next->GetName() << " not TGeoTube::kGeoTube" << endmsg;
+	    is_convert = false;
+	  }
+	  
+	  dcData->maxRow = next->GetNdaughters();
+	  if(dcData->maxRow>512){
+	    error() << " layer number > 512, something wrong!" << endmsg;
+	    is_convert = false;
+	  }
+	  for(int i=0;i<next->GetNdaughters();i++){
+	    TGeoNode* layer = next->GetDaughter(i);
+	    const TGeoShape* shape = layer->GetVolume()->GetShape();
+	    if(shape->TestShapeBit(TGeoTube::kGeoTube)){
+	      const TGeoTube* tube = (const TGeoTube*) shape;
+	      double innerRadius = tube->GetRmin();
+	      double outerRadius = tube->GetRmax();
+	      double halfLength  = tube->GetDz();
+	      if(innerRadius<dcData->rMinReadout) dcData->rMinReadout = innerRadius;
+	      if(outerRadius>dcData->rMaxReadout) dcData->rMaxReadout = outerRadius;
+	    }
+	    else{
+	      error() << layer->GetName() << " not TGeoTube::kGeoTube" << endmsg;
+	      is_convert = false;
+	    }
+	  }
+	  dcData->padHeight = (dcData->rMaxReadout-dcData->rMinReadout)/dcData->maxRow;
+	  dcData->padWidth  = dcData->padHeight;
+	}
+      }
+      else if(nodeName.find("wall_vol")!=-1){
+	const TGeoShape* wall_shape = daughter->GetVolume()->GetShape();
+        if(wall_shape->TestShapeBit(TGeoTube::kGeoTube)){
+          const TGeoTube* tube = (const TGeoTube*) wall_shape;
+          double innerRadius = tube->GetRmin();
+          double outerRadius = tube->GetRmax();
+          double halfLength  = tube->GetDz();
+          innerRadiusWalls.push_back(innerRadius);
+	  outerRadiusWalls.push_back(outerRadius);
+        }
+	else{
+	  error() << nodeName << " not TGeoTube::kGeoTube" << endmsg;
+	  is_convert = false;
+	}
+      }
+    }
+    if(innerRadiusWalls.size()<2||outerRadiusWalls.size()<2){
+      error() << "wall number < 2" << endmsg;
+      is_convert = false;
+    }
+    if(!is_convert){
+      error() << "Cannot convert DC volume to extension data!" << endmsg;
+      delete dcData;
+      return StatusCode::FAILURE;
+    }
+    if(innerRadiusWalls[0]<innerRadiusWalls[innerRadiusWalls.size()-1]){
+      dcData->rMin = innerRadiusWalls[0];
+      dcData->rMax = outerRadiusWalls[outerRadiusWalls.size()-1];
+      dcData->innerWallThickness = outerRadiusWalls[0]-innerRadiusWalls[0];
+      dcData->outerWallThickness = outerRadiusWalls[outerRadiusWalls.size()-1]-innerRadiusWalls[innerRadiusWalls.size()-1];
+    }
+    else{
+      dcData->rMin = innerRadiusWalls[innerRadiusWalls.size()-1];
+      dcData->rMax = outerRadiusWalls[0];
+      dcData->innerWallThickness = outerRadiusWalls[outerRadiusWalls.size()-1]-innerRadiusWalls[innerRadiusWalls.size()-1];
+      dcData->outerWallThickness = outerRadiusWalls[0]-innerRadiusWalls[0];
+    }
+    info() << (*dcData) << endmsg;
+  }
+
+  // regard as TPCParameters, TODO: drift chamber parameters
+  gear::TPCParametersImpl *tpcParameters = new gear::TPCParametersImpl();
+  gear::PadRowLayout2D *padLayout = new gear::FixedPadSizeDiskLayout(dcData->rMinReadout*CLHEP::cm, dcData->rMaxReadout*CLHEP::cm,
+                                                                     dcData->padHeight*CLHEP::cm, dcData->padWidth*CLHEP::cm, dcData->maxRow, 0.0);
+  tpcParameters->setPadLayout(padLayout);
+  tpcParameters->setMaxDriftLength(dcData->driftLength*CLHEP::cm);
+  tpcParameters->setDriftVelocity(    0.0);
+  tpcParameters->setReadoutFrequency( 0.0);
+  tpcParameters->setDoubleVal( "tpcOuterRadius" , dcData->rMax*CLHEP::cm ) ;
+  tpcParameters->setDoubleVal( "tpcInnerRadius",  dcData->rMin*CLHEP::cm ) ;
+  tpcParameters->setDoubleVal( "tpcInnerWallThickness",  dcData->innerWallThickness*CLHEP::cm ) ;
+  tpcParameters->setDoubleVal( "tpcOuterWallThickness",  dcData->outerWallThickness*CLHEP::cm ) ;
+
+  m_gearMgr->setTPCParameters(tpcParameters);
+
+  return StatusCode::SUCCESS;
+}
+
 StatusCode GearSvc::convertSET(dd4hep::DetElement& set){
   dd4hep::rec::ZPlanarData* setData = nullptr;
   try{
@@ -773,7 +925,7 @@ TGeoNode* GearSvc::FindNode(TGeoNode* mother, char* name){
     for(int i=0;i<mother->GetNdaughters();i++){
       TGeoNode* daughter = mother->GetDaughter(i);
       std::string s = daughter->GetName();
-      //info() << "current: " << s << " search for" << name << endmsg;                                                                                                                      
+      //info() << "current: " << s << " search for" << name << endmsg;
       if(s.find(name)!=-1){
         next = daughter;
         break;
diff --git a/Service/GearSvc/src/GearSvc.h b/Service/GearSvc/src/GearSvc.h
index fcd5bcc8a63bb6710221f31a4dacf0bfe26e17f5..ad0e82b68a1ed605f06487d78b9a63ac519defb2 100644
--- a/Service/GearSvc/src/GearSvc.h
+++ b/Service/GearSvc/src/GearSvc.h
@@ -23,6 +23,7 @@ class GearSvc : public extends<Service, IGearSvc>
 	StatusCode convertVXD(dd4hep::DetElement& vxd);
 	StatusCode convertSIT(dd4hep::DetElement& sit);
 	StatusCode convertTPC(dd4hep::DetElement& tpc);
+	StatusCode convertDC (dd4hep::DetElement& dc);
 	StatusCode convertSET(dd4hep::DetElement& set);
 	StatusCode convertFTD(dd4hep::DetElement& ftd);
 	TGeoNode* FindNode(TGeoNode* mother, char* name);
diff --git a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp
index 9d12dde315b8f45e1deb2606999598e69c0161c2..4300de813cb9adc29b3be2ac3da555d5eafb2118 100644
--- a/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp
+++ b/Simulation/DetSimSD/src/DDG4SensitiveDetector.cpp
@@ -1,6 +1,5 @@
 #include "DetSimSD/DDG4SensitiveDetector.h"
 
-#include "DDG4/Geant4SensitiveDetector.h"
 #include "DDG4/Geant4Converter.h"
 #include "DDG4/Geant4Hits.h"
 #include "DD4hep/Segmentations.h"