diff --git a/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml
index 5ae78d9b320c95859b8f8465c27905aea5662940..bdc66337e19e134179c27a99fca82325c26d0572 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v02.xml
@@ -26,7 +26,7 @@
 
     <detectors>
         <detector id="DetID_OTKBarrel" name="OTKBarrel" type="SiTracker_otkbarrel_v02" vis="OTKBarrelVis"
-                  readout="OTKBarrelCollection" insideTrackingVolume="true">
+                  readout="OTKBarrelCollection" combineHits="true" insideTrackingVolume="true">
             <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/>
             <envelope vis="SeeThrough">
                 <shape type="Tube" rmin="OTKBarrel_inner_radius" rmax="OTKBarrel_outer_radius"
@@ -40,23 +40,23 @@
                     <module name="OTKBarrel_module" thickness="OTKBarrel_module_thickness" repeat="4"
                             width="OTKBarrel_module_width" length_inner="OTKBarrel_module_length_inner"
                             length_outer="OTKBarrel_module_length_outer" vis="SeeThrough">
-                        <layer name="glue" width="100.40*mm" thickness="300*um" material="Air" vis="BlackVis"/>
-                        <layer name="carbon_fiber_plane_inner" width="100.40*mm" thickness="0.3*mm" material="CarbonFiber" vis="BlackVis"/>
-                        <layer name="carbon_fiber_honeycomb" width="100.40*mm" thickness="6000*um" material="CarbonFiber" vis="BlackVis"/>
+                        <layer name="carbon_fiber_plane_inner" width="100.40*mm" thickness="0.3*mm" material="CF_ITK" vis="BlackVis"/>
+                        <layer name="carbon_fiber_honeycomb" width="100.40*mm" thickness="6000*um" material="GraphiteFoam_OTK" vis="BlackVis"/>
                         <layer name="cooling_fluid" width="100.40*mm" thickness="35.76*0.105*100*um" material="G4_WATER" vis="BlackVis"/>
                         <layer name="cooling_tube_wall" width="100.40*mm" thickness="3.560*0.169*100*um" material="G4_Ti" vis="BlackVis"/>
-                        <layer name="carbon_fiber_plane_outer" width="100.40*mm" thickness="0.3*mm" material="CarbonFiber" vis="BlackVis"/>
-                        <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/>
-                        <layer name="glue_2" width="100.40*mm" thickness="100*um" material="Air" vis="BlackVis"/>
-                        <layer name="sensor" sensitive="True" width="OTKBarrel_module_width" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/>
-                        <layer name="pcb_insulating_layers" width="100.40*mm" thickness="28.41*0.07*100*um" material="Polyimide" vis="BlackVis"/>
+                        <layer name="carbon_fiber_plane_outer" width="100.40*mm" thickness="0.3*mm" material="CF_ITK" vis="BlackVis"/>
+			<layer name="glue" width="100.40*mm" thickness="300*um" material="CER_ITK" vis="BlackVis"/>
+			<layer name="sensor" sensitive="True" width="OTKBarrel_module_width" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/>
+			<layer name="glue_2" width="100.40*mm" thickness="100*um" material="CER_ITK" vis="BlackVis"/>
+			<layer name="pcb_insulating_layers" width="100.40*mm" thickness="28.41*0.07*100*um" material="Polyimide_ITK" vis="BlackVis"/>
                         <layer name="pcb_metal_layers" width="100.40*mm" thickness="1.436*0.2*100*um" material="G4_Cu" vis="BlackVis"/>
-                        <data_aggregation name="first_data_aggregation" width="104*mm" thickness="0*mm" length="7.0*mm" vis="SeeThrough">
-                            <layer name="PCB" thickness="0*mm" width="OTKBarrel_module_width" length="7.0*mm" vis="GreenVis"/>
-                            <DC name="DC-DC" thickness="0*mm" width="10.0*mm" length="3.0*mm" vis="YellowVis"/>
+                        <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/>
+                        <data_aggregation name="first_data_aggregation" width="104*mm" thickness="2*mm" length="7.0*mm" vis="SeeThrough">
+                            <layer name="PCB" thickness="1*mm" width="OTKBarrel_module_width" length="7.0*mm" vis="GreenVis"/>
+                            <DC name="DC-DC" thickness="1*mm" width="10.0*mm" length="3.0*mm" vis="YellowVis"/>
                         </data_aggregation>
                     </module>
-                    <data_aggregation name="second_data_aggregation" thickness="0*mm" width="20.0*mm" length="10.0*mm" vis="YellowVis"/>
+                    <data_aggregation name="second_data_aggregation" thickness="1*mm" width="20.0*mm" length="10.0*mm" vis="YellowVis"/>
                 </ladder>
             </stave>
         </detector>
@@ -64,7 +64,7 @@
 
     <readouts>
         <readout name="OTKBarrelCollection">
-            <id>system:5,side:-2,layer:4,module:8,iladder:3,oladder:-4,mmodule:-6</id>
+            <id>system:5,side:-2,layer:9,module:8,iladder:32:4,oladder:-4,mmodule:-6</id>
         </readout>
     </readouts>
-</lccdd>
\ No newline at end of file
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml b/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml
index 6990e85f50077516b26159f5fd745dc47e559c4d..d79d5cedb6e3aba841f031e29600ebf676d092a6 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/OTKEndcap_v02.xml
@@ -9,16 +9,16 @@
         <comment>CepC Outer Tracker</comment>
     </info>
     <define>
-        <constant name="OTKEndcap_inner_radius" value="400*mm"/>
+        <!--constant name="OTKEndcap_inner_radius" value="400*mm"/>
         <constant name="OTKEndcap_outer_radius" value="1820*mm"/>
         <constant name="OTKEndcap_zmin" value="2910*mm"/>
-        <constant name="OTKEndcap_zmax" value="2930*mm"/>
+        <constant name="OTKEndcap_zmax" value="2930*mm"/-->
     </define>
 
     <detectors>
         <type_flags type="DetType_TRACKER +  DetType_ENDCAP  + DetType_PIXEL "/>
         <detector id="DetID_OTKEndcap" name="OTKEndcap" type="SiTracker_otkendcap_v02" vis="OTKEndcapVis"
-                  readout="OTKEndcapCollection" insideTrackingVolume="true">
+                  readout="OTKEndcapCollection" combineHits="true" insideTrackingVolume="true">
             <type_flags type="DetType_TRACKER + DetType_ENDCAP "/>
             <envelope vis="SeeThrough">
                 <shape type="BooleanShape" operation="Subtraction" material="Air">
@@ -44,24 +44,24 @@
                 <ring name="D4" inner_radius="1668*mm" outer_radius="(1816-0.2)*mm" repeat="16*14" aggregation="2" vis="SeeThrough"/>
             </rings>
             <layers thickness="11.4*mm">
+	        <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/>
                 <layer name="PCB_metal_layers" thickness="1.436*0.2*100*um" material="G4_Cu" vis="FTDSupportVis"/>
-                <layer name="PCB_insulating_layers" thickness="28.41*0.07*100*um" material="Polyimide" vis="FTDSupportVis"/>
+                <layer name="PCB_insulating_layers" thickness="28.41*0.07*100*um" material="Polyimide_ITK" vis="FTDSupportVis"/>
+		<layer name="glue_1" thickness="100*um" material="CER_ITK" vis="FTDSupportVis"/>
                 <layer name="sensor" sensitive="True" thickness="0.3*mm" material="G4_Si" vis="FTDSensitiveVis"/>
-                <layer name="glue_1" thickness="100*um" material="Air" vis="FTDSupportVis"/>
-                <layer name="other_electronic" width="100.40*mm" thickness="32.6437*0.1*100*um" material="Kapton" vis="BlackVis"/>
-                <layer name="carbon_fiber_plane" thickness="0.3*mm" material="CarbonFiber" vis="FTDSupportVis"/>
+		<layer name="glue_2" thickness="200*um" material="Polyimide_ITK" vis="FTDSupportVis"/>
+                <layer name="carbon_fiber_plane" thickness="0.3*mm" material="CF_ITK" vis="FTDSupportVis"/>
                 <layer name="cooling_tube_wall" thickness="3.560*0.169*100*um" material="G4_Ti" vis="FTDSupportVis"/>
                 <layer name="cooling_fluid" thickness="35.76*0.105*100*um" material="G4_WATER" vis="FTDSupportVis"/>
-                <layer name="graphite_foam_Honeycom" thickness="6000*um" material="Air" vis="FTDSupportVis"/>
-                <layer name="carbon_fiber_back_plate" thickness="0.3*mm" material="CarbonFiber" vis="FTDSupportVis"/>
-                <layer name="glue_2" thickness="200*um" material="Air" vis="FTDSupportVis"/>
+                <layer name="graphite_foam_Honeycom" thickness="6000*um" material="GraphiteFoam_OTK" vis="FTDSupportVis"/>
+                <layer name="carbon_fiber_back_plate" thickness="0.3*mm" material="CF_ITK" vis="FTDSupportVis"/>
             </layers>
         </detector>
     </detectors>
 
     <readouts>
         <readout name="OTKEndcapCollection">
-            <id>system:5,side:-2,layer:4,module:8,sensor:13</id>
+            <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
         </readout>
     </readouts>
-</lccdd>
\ No newline at end of file
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml
index 16f918abbf357e0d5f83c08f20f8117f83cffe91..11318e835f77396b4f25ce21f8d0cf8bc5558c28 100644
--- a/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml
@@ -9,56 +9,54 @@
     <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">
+    <detector id="DetID_ITKEndcap" name="ITKEndcap" type="ITK_EndCap_v01" vis="FTDVis" readout="ITKEndcapCollection" combineHits="true" 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"/>
+      <support>
+        <slice name="Carbon_fiber_front" material="CF_ITK" 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"/>
+        <slice name="Graphite_foam_Honeycomb" material="GraphiteFoam_OTK" thickness="2000*um" vis="YellowVis"/>
+        <slice name="Carbon_fiber_back" material="CF_ITK" thickness="150*um" vis="GrayVis"/>
       </support>
 
-      <sensor thickness="SiliconThickness">
-        <slice name="Glue" material="Air" thickness="100*um" vis="SeeThrough"/>
+      <sensor>
+	<slice name="GlueF" material="CER_ITK" thickness="200*um" vis="YellowVis"/>
         <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="GlueB" material="CER_ITK" thickness="100*um" vis="SeeThrough"/>
+        <slice name="FPC_Insulating_layers" material="Polyimide_ITK" thickness="100*um" vis="SeeThrough"/>
         <slice name="FPC_metal_layer" material="G4_Al" thickness="50*um" vis="SeeThrough"/>
+	<slice name="Other_electronics" material="Kapton" thickness="32.6437*0.05*100*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>
+	<layer id="0" z="505*mm" inner_r="81.5*mm" outer_r="245*mm" phi0="90*degree" 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" inner_r="110.5*mm" outer_r="355*mm" phi0="90*degree" 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" inner_r="160.5*mm" outer_r="565*mm" phi0="90*degree" 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" inner_r="220.3*mm" outer_r="565*mm" phi0="90*degree" 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>
diff --git a/Detector/DetCRD/compact/CRD_common_v02/materials.xml b/Detector/DetCRD/compact/CRD_common_v02/materials.xml
index e30604a0373f7e3e8f6cfbd691807c960e5e8297..8f2954d596cf23b7ea42d9990b4cef6fb0c3d4f7 100644
--- a/Detector/DetCRD/compact/CRD_common_v02/materials.xml
+++ b/Detector/DetCRD/compact/CRD_common_v02/materials.xml
@@ -867,6 +867,13 @@
       <D type="density" value="2" unit="g/cm3"/>
       <fraction n="1.0" ref="G4_WATER"/>
     </material>
+
+    <material name="GraphiteFoam_OTK">
+      <D type="density" value="0.113776" unit="g/cm3"/>
+      <fraction n="1.0" ref="Graphite_ITK"/>
+      <fraction n="1.0" ref="CF_ITK"/>
+    </material>
+    Graphite_ITK
   </materials>
 
   <surfaces>
diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml
index 3d1d7cec9456717dc9be6194ae01879ca50d8c9f..d004669fdb53742918229c37c235bad75a699f61 100644
--- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml
+++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_Dimensions_v01_01.xml
@@ -35,7 +35,7 @@
     <constant name="DetID_SET"          value="  5"/>
     <constant name="DetID_ETD"          value="  6"/>
     <constant name="DetID_ITKBarrel"    value="  2"/>
-    <constant name="DetID_ITKEndCap"    value="  3"/>
+    <constant name="DetID_ITKEndcap"    value="  3"/>
     <constant name="DetID_OTKBarrel"    value="  5"/>
     <constant name="DetID_OTKEndcap"    value="  6"/>
     
@@ -130,20 +130,25 @@
     <constant name="ITKBarrel1_inner_radius"   value="235*mm"/>
     <constant name="ITKBarrel2_inner_radius"   value="345*mm"/>
     <constant name="ITKBarrel3_inner_radius"   value="555.6*mm"/>
-    <constant name="ITKBarrel1_half_length"    value="500.5*mm"/>
-    <constant name="ITKBarrel2_half_length"    value="715*mm"/>
-    <constant name="ITKBarrel3_half_length"    value="1001*mm"/>
+    <constant name="ITKBarrel1_half_length"    value="493.3*mm"/>
+    <constant name="ITKBarrel2_half_length"    value="704.8*mm"/>
+    <constant name="ITKBarrel3_half_length"    value="986.6*mm"/>
 
     <!-- Parameters of time of flight tracker -->
     <constant name="OTKBarrel_inner_radius" value="1800*mm"/>
     <constant name="OTKBarrel_outer_radius" value="1830*mm"/>
-    <!--constant name="OTKBarrel_half_length" value="2940*mm"/--><!--reach Ecal edge, wait mechanical design update-->
     <constant name="OTKBarrel_half_length" value="2930*mm"/>
     <constant name="OTKBarrelLayer1_half_length" value="OTKBarrel_half_length"/>
     <constant name="OTKBarrelLayer2_half_length" value="OTKBarrel_half_length"/>
     <constant name="OTKBarrel1_inner_radius" value="1805*mm"/>
     <constant name="OTKBarrel2_inner_radius" value="1820*mm"/>
 
+    <constant name="OTKEndcap_zmin"         value="2910*mm"/>
+    <constant name="OTKEndcap_zmax"         value="2930*mm"/>
+    <constant name="OTKEndcap_outer_radius" value="1820*mm"/>
+    <constant name="OTKEndcap_inner_radius" value="400*mm"/>
+
+    <!-- obselete -->
     <constant name="SET_inner_radius"    value="1800*mm"/>
 
     <constant name="SiTracker_endcap_barrel_zgap" value="5*mm"/>
diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml
index 85bfb00dc61a5135d49efdc1b43fe8fd10231e24..6089c532a61e803eec7068752ea583920879efa9 100644
--- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml
+++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01-onlyTracker.xml
@@ -30,17 +30,19 @@
   <!--preliminary vertex and tracker, to update/-->
   <!--include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/-->
   <include ref="../CRD_common_v02/VXD_Composite_v01_02.xml"/>
-  <include ref="../CRD_common_v02/FTD_SkewRing_v01_07.xml"/>
+  <!--include ref="../CRD_common_v02/FTD_SkewRing_v01_09.xml"/-->
   <!--include ref="../CRD_common_v02/SIT_SimplePixel_v01_04.xml"/-->
   <!--include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/-->
   <include ref="../CRD_common_v02/ITK_StaggeredStave_v03_01.xml"/>
+  <include ref="../CRD_common_v02/ITK_EndCap_v01.xml"/>
   <!--include ref="../CRD_common_v01/TPC_Simple_v10_02.xml"/-->
   <!-- use 10 rows clustering version-->
   <include ref="../CRD_common_v02/TPC_ModularEndcap_o1_v02.xml"/>
   <!--include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/-->
-  <include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/>
-
+  <!--include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/OTKBarrel_v02.xml"/>
   <!--include ref="../CRD_common_v01/OTKEndcap_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/OTKEndcap_v02.xml"/>
 
   <fields>
     <field name="InnerSolenoid" type="solenoid"
diff --git a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml
index b71b5dffe28db7b801a2c8157b9f10aaa2eefe92..b862ef97adf01852f3a8479ab20f04deb4e0a27e 100644
--- a/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml
+++ b/Detector/DetCRD/compact/TDR_o1_v01/TDR_o1_v01.xml
@@ -31,16 +31,19 @@
   <!--preliminary vertex and tracker, to update/-->
   <!--include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/-->
   <include ref="../CRD_common_v02/VXD_Composite_v01_02.xml"/>
-  <include ref="../CRD_common_v02/FTD_SkewRing_v01_07.xml"/>
+  <!--include ref="../CRD_common_v02/FTD_SkewRing_v01_07.xml"/-->
   <!--include ref="../CRD_common_v02/SIT_SimplePixel_v01_04.xml"/-->
   <!--include ref="../CRD_common_v02/SIT_StaggeredStave_v02.xml"/-->
   <include ref="../CRD_common_v02/ITK_StaggeredStave_v03_01.xml"/>
+  <include ref="../CRD_common_v02/ITK_EndCap_v01.xml"/>
   <!--include ref="../CRD_common_v01/TPC_Simple_v10_02.xml"/-->
-  <!--use 10 rows clustering version/-->
+  <!-- use 10 rows clustering version-->
   <include ref="../CRD_common_v02/TPC_ModularEndcap_o1_v02.xml"/>
   <!--include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/-->
-  <include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/>
+  <!--include ref="../CRD_common_v01/OTKBarrel_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/OTKBarrel_v02.xml"/>
   <!--include ref="../CRD_common_v01/OTKEndcap_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/OTKEndcap_v02.xml"/>
 
   <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v02_02.xml"/>
   <include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v02_01.xml"/>
diff --git a/Detector/DetCRD/scripts/TDR_o1_v01/sim.py b/Detector/DetCRD/scripts/TDR_o1_v01/sim.py
index 75d5e97c2399877d441b7550127b12a90491d456..fa0e1eadfdff61dff65657f4ff9718898cba56b0 100644
--- a/Detector/DetCRD/scripts/TDR_o1_v01/sim.py
+++ b/Detector/DetCRD/scripts/TDR_o1_v01/sim.py
@@ -66,6 +66,11 @@ genalg.GenTools = ["GtGunTool"]
 from Configurables import DetSimSvc
 detsimsvc = DetSimSvc("DetSimSvc")
 
+from Configurables import Edm4hepWriterAnaElemTool
+edm4hep_writer = Edm4hepWriterAnaElemTool("Edm4hepWriterAnaElemTool")
+#edm4hep_writer.TrackerCollections = ["VXD", "ITKBarrel", "ITKEndcap", "TPC", "TPCLowPt", "TPCSpacePoint",
+#                                     "OTKBarrel", "OTKEndcap", "COIL", "MuonBarrel", "MuonEndcap"]
+
 from Configurables import DetSimAlg
 detsimalg = DetSimAlg("DetSimAlg")
 detsimalg.RandomSeeds = seed
@@ -83,7 +88,7 @@ detsimalg.RootDetElem = "WorldDetElemTool"
 from Configurables import TimeProjectionChamberSensDetTool
 tpc_sensdettool = TimeProjectionChamberSensDetTool("TimeProjectionChamberSensDetTool")
 tpc_sensdettool.TypeOption = 1
-tpc_sensdettool.DoHeedSim = True
+tpc_sensdettool.DoHeedSim = False #True
 dedxoption = "TrackHeedSimTool"
 tpc_sensdettool.DedxSimTool = dedxoption
 
diff --git a/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py b/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py
index 15c8e1c942aa69ff3d61edc1b4f03a1461c179d0..2341b085a0758d8b07e4302e5fc2446aab9e15b3 100644
--- a/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py
+++ b/Detector/DetCRD/scripts/TDR_o1_v01/tracking.py
@@ -50,9 +50,10 @@ podioinput = PodioInput("PodioReader", collections=[
     "MCParticle",
     "VXDCollection",
     "ITKBarrelCollection",
+    "ITKEndcapCollection",
     "TPCCollection",
     "OTKBarrelCollection",
-    "FTDCollection",
+    "OTKEndcapCollection",
     "MuonBarrelCollection",
     "MuonEndcapCollection"
     ])
@@ -65,11 +66,10 @@ podioinput = PodioInput("PodioReader", collections=[
 ## Config ##
 vxdhitname  = "VXDTrackerHits"
 sithitname  = "ITKBarrelTrackerHits"
+ftdhitname  = "ITKEndcapTrackerHits"
 gashitname  = "TPCTrackerHits"
 sethitname  = "OTKBarrelTrackerHits"
-setspname   = "OTKBarrelSpacePoints"
-ftdhitname  = "FTDTrackerHits"
-ftdspname   = "FTDSpacePoints"
+etdhitname  = "OTKEndcapTrackerHits"
 from Configurables import SmearDigiTool,SiTrackerDigiAlg
 
 ## VXD ##
@@ -98,6 +98,19 @@ digiITKB.TrackerHitAssociationCollection = "ITKBarrelTrackerHitAssociation"
 digiITKB.DigiTool = "SmearDigiTool/ITKBarrel"
 #digiITKB.OutputLevel = DEBUG
 
+## ITKEndcap ##
+itketool = SmearDigiTool("ITKEndcap")
+itketool.ResolutionU = [0.008]
+itketool.ResolutionV = [0.040]
+#itketool.OutputLevel = DEBUG
+
+digiITKE = SiTrackerDigiAlg("ITKEndcapDigi")
+digiITKE.SimTrackHitCollection = "ITKEndcapCollection"
+digiITKE.TrackerHitCollection = ftdhitname
+digiITKE.TrackerHitAssociationCollection = "ITKEndcapTrackerHitAssociation"
+digiITKE.DigiTool = "SmearDigiTool/ITKEndcap"
+#digiITKE.OutputLevel = DEBUG
+
 ## OTKBarrel ##
 otkbtool = SmearDigiTool("OTKBarrel")
 otkbtool.ResolutionU = [0.010]
@@ -111,18 +124,18 @@ digiOTKB.TrackerHitAssociationCollection = "OTKBarrelTrackerHitAssociation"
 digiOTKB.DigiTool = "SmearDigiTool/OTKBarrel"
 #digiOTKB.OutputLevel = DEBUG
 
-## FTD ##
-ftdtool = SmearDigiTool("FTD")
-ftdtool.ResolutionU = [0.0072]
-ftdtool.ResolutionV = [0.086]
-#ftdtool.OutputLevel = DEBUG
+## OTKEndcap ##
+otketool = SmearDigiTool("OTKEndcap")
+otketool.ResolutionU = [0.010]
+otketool.ResolutionV = [1.000]
+#otketool.OutputLevel = DEBUG
 
-digiFTD = SiTrackerDigiAlg("FTDDigi")
-digiFTD.SimTrackHitCollection = "FTDCollection"
-digiFTD.TrackerHitCollection = ftdhitname
-digiFTD.TrackerHitAssociationCollection = "FTDTrackerHitAssociation"
-digiFTD.DigiTool = "SmearDigiTool/FTD"
-#digiFTD.OutputLevel = DEBUG
+digiOTKE = SiTrackerDigiAlg("OTKEndcapDigi")
+digiOTKE.SimTrackHitCollection = "OTKEndcapCollection"
+digiOTKE.TrackerHitCollection = etdhitname
+digiOTKE.TrackerHitAssociationCollection = "OTKEndcapTrackerHitAssociation"
+digiOTKE.DigiTool = "SmearDigiTool/OTKEndcap"
+#digiOTKE.OutputLevel = DEBUG
 
 ## TPC ##
 from Configurables import TPCDigiAlg
@@ -195,7 +208,6 @@ tracking.HeaderCol = "EventHeader"
 tracking.VTXHitCollection = vxdhitname
 tracking.SITHitCollection = sithitname
 tracking.FTDPixelHitCollection = ftdhitname
-tracking.FTDSpacePointCollection = ftdspname
 tracking.SITRawHitCollection = "NotNeedForPixelSIT"
 tracking.FTDRawHitCollection = ftdhitname
 tracking.UseSIT = True
@@ -217,7 +229,7 @@ tracking.Chi2WZSeptet  = 0.1
 from Configurables import ForwardTrackingAlg
 forward = ForwardTrackingAlg("ForwardTracking")
 forward.FTDPixelHitCollection = ftdhitname
-forward.FTDSpacePointCollection = ftdspname
+#forward.FTDSpacePointCollection = ftdspname
 forward.FTDRawHitCollection = ftdhitname
 forward.Chi2ProbCut = 0.0
 forward.HitsPerTrackMin = 3
@@ -232,7 +244,7 @@ forward.CriteriaMax = [30, 1.02, 10, 1.015, 20, 1.3, 1.0, 150, 1.08,  99999999,
 from Configurables import TrackSubsetAlg
 subset = TrackSubsetAlg("TrackSubset")
 subset.TrackInputCollections = ["ForwardTracks", "SiTracks"]
-subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname, ftdspname]
+subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname]
 subset.TrackSubsetCollection = "SubsetTracks"
 #subset.FitterTool = "KalTestTool/KalTest111"
 #subset.OutputLevel = DEBUG
@@ -249,7 +261,8 @@ full.SITTrackerHits = sithitname
 full.TPCTrackerHits = gashitname
 full.SETTrackerHits = sethitname
 full.FTDPixelTrackerHits = ftdhitname
-full.FTDSpacePoints = ftdspname
+#full.FTDSpacePoints = ftdspname
+full.ETDTrackerHits = etdhitname
 full.SITRawHits     = "NotNeedForPixelSIT"
 full.SETRawHits     = "NotNeedForPixelSET"
 full.FTDRawHits     = ftdhitname
@@ -259,6 +272,7 @@ full.OutputTracks  = "CompleteTracks" # default name
 full.FTDHitToTrackDistance = 5.
 full.SITHitToTrackDistance = 3.
 full.SETHitToTrackDistance = 5.
+full.ETDHitToTrackDistance = 15.
 full.MinChi2ProbForSiliconTracks = 0
 full.MaxChi2PerHit = 200
 full.ForceSiTPCMerging = True
@@ -277,7 +291,8 @@ from Configurables import TrackParticleRelationAlg
 tpr = TrackParticleRelationAlg("Track2Particle")
 tpr.MCParticleCollection = "MCParticle"
 tpr.TrackList = ["CompleteTracks"]
-tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation"]
+tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation",
+                              "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation"]
 #tpr.OutputLevel = DEBUG
 
 
@@ -285,7 +300,8 @@ from Configurables import TrueMuonTagAlg
 tmt = TrueMuonTagAlg("TrueMuonTag")
 tmt.MCParticleCollection = "MCParticle"
 tmt.TrackList = ["CompleteTracks"]
-tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation", "TPCTrackerHitAss"]
+tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation",
+                              "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation", "TPCTrackerHitAss"]
 tmt.MuonTagEfficiency = 0.95 # muon true tag efficiency, default is 1.0 (100%)
 tmt.MuonDetTanTheta = 1.2 # muon det barrel/endcap separation tan(theta)
 #tmt.OutputLevel = DEBUG
@@ -299,7 +315,7 @@ out.outputCommands = ["keep *"]
 # ApplicationMgr
 from Configurables import ApplicationMgr
 mgr = ApplicationMgr(
-    TopAlg = [podioinput, digiVXD, digiITKB, digiOTKB, digiFTD, digiTPC, digiMuon, tracking, forward, subset, clupatra, full, tpr, tpc_dndx, tof, tmt, out],
+    TopAlg = [podioinput, digiVXD, digiITKB, digiITKE, digiOTKB, digiOTKE, digiTPC, digiMuon, tracking, clupatra, full, tpr, tpc_dndx, tof, tmt, out],
     EvtSel = 'NONE',
     EvtMax = 50,
     ExtSvc = [rndmengine, rndmgensvc, dsvc, evtseeder, geosvc, gearsvc, tracksystemsvc, pidsvc],
diff --git a/Detector/DetCRD/scripts/TDR_o1_v02/sim.py b/Detector/DetCRD/scripts/TDR_o1_v02/sim.py
index c1e91891d6b60fd78f065731e9721e3901253c08..034f7ef93b68c6a4e527d387fb0cf6494f758c96 100644
--- a/Detector/DetCRD/scripts/TDR_o1_v02/sim.py
+++ b/Detector/DetCRD/scripts/TDR_o1_v02/sim.py
@@ -64,6 +64,11 @@ genalg.GenTools = ["GtGunTool"]
 from Configurables import DetSimSvc
 detsimsvc = DetSimSvc("DetSimSvc")
 
+from Configurables import Edm4hepWriterAnaElemTool
+edm4hep_writer = Edm4hepWriterAnaElemTool("Edm4hepWriterAnaElemTool")
+edm4hep_writer.TrackerCollections = ["VXD", "SIT", "FTD", "TPC", "TPCLowPt", "TPCSpacePoint",
+                                     "SET", "COIL", "MuonBarrel", "MuonEndcap"]
+
 from Configurables import DetSimAlg
 detsimalg = DetSimAlg("DetSimAlg")
 detsimalg.RandomSeeds = seed
diff --git a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
index 1074364c98c85391e15c44e82a867779733b7e3d..52215d513fdbe261ed83a38329a4d9bfffba4ed5 100644
--- a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
+++ b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
@@ -2,7 +2,7 @@
 #include "DD4hep/DetFactoryHelper.h"
 #include "XML/Utilities.h"
 #include "DDRec/Surface.h"
-#include "DDRec/DetectorData.h"
+#include "DetIdentifier/CEPCDetectorData.h"
 #include "Math/AxisAngle.h"
 #include <map>
 
@@ -34,29 +34,50 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
   }
   std::cout << " ** building ITK_EndCap_v01 ... " << sens.type() << std::endl;
 
+  dd4hep::rec::MultiRingsZDiskData* diskData = new dd4hep::rec::MultiRingsZDiskData;
+
+  const xml::Component supports = x_det.child("support");
+  const xml::Component sensor   = x_det.child("sensor");
+
   const xml::Component layers_xml = x_det.child("layers");
   for (xml_coll_t layer(layers_xml, "layer"); layer; ++layer)
   {
+    dd4hep::rec::MultiRingsZDiskData::LayerLayout disk;
     //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 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 phi0 = layer.attr<double>("phi0");
     const auto layer_vis = layer.attr<std::string>("vis");
     const auto z = layer.attr<double>("z");
-    std::string layer_name = name + "_layer_" + layer_id;
+    std::string layer_name = "layer" + layer_id;
 
-    const auto SiliconThickness = description.constant<double>("SiliconThickness");
-    const auto SupportThickness = description.constant<double>("SupportThickness");
+    double SiliconThickness = 0;
+    double SupportThickness = 0;
+    for (xml_coll_t sensor_layer(sensor, "slice"); sensor_layer; ++sensor_layer)
+    {
+      const auto slice_thickness = sensor_layer.attr<double>("thickness");
+      SiliconThickness += slice_thickness;
+    }
+    for (xml_coll_t support(supports, "slice"); support; ++support)
+    {
+      const auto slice_thickness = support.attr<double>("thickness");
+      SupportThickness += slice_thickness;
+    }
+    const auto dz = 2*SiliconThickness + 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));
+    Volume layer_vol(layer_name + "P", layer_tube, air);
+    Volume layerNeg_vol(layer_name + "N", layer_tube, air);
+    DetElement layer_det(layer_name + "P", det_id);
+    DetElement layerNeg_det(layer_name + "N", det_id);
+    layer_vol.setVisAttributes(description.visAttributes(layer_vis));
+    layerNeg_vol.setVisAttributes(description.visAttributes(layer_vis));
 
     // populate support
     double support_z = -SupportThickness / 2.0;
-    const xml::Component supports = x_det.child("support");
+    //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");
@@ -67,19 +88,22 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
       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);
+      DetElement supportNeg_det(support_vol_name + "N", 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)));
+      supportNeg_det.setPlacement(layerNeg_vol.placeVolume(support_vol, Position(0, 0, - support_z - support_thickness / 2.0)));
       support_z += support_thickness;
       layer_det.add(support_det);
+      layerNeg_det.add(supportNeg_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,
+      rec::Vector3D v(0., 1., 0.);
+      rec::Vector3D n(0., 0., 1.);
+      rec::VolPlane surf(support_vol, rec::SurfaceType::Helper, support_thickness / 2.0, support_thickness / 2.0, u, v,
                          n);
-      rec::volSurfaceList(layer_det)->push_back(surf);
+      rec::volSurfaceList(support_det)->push_back(surf);
+      rec::volSurfaceList(supportNeg_det)->push_back(surf);
     }
 
-
     // populate sensor
     for (xml_coll_t ring(layer, "ring"); ring; ++ring)
     {
@@ -91,19 +115,32 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
       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;
+      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));
+      Volume ringPosF_vol(ring_vol_name + "PF", ring_tube, air);
+      Volume ringPosR_vol(ring_vol_name + "PR", ring_tube, air);
+      Volume ringNegF_vol(ring_vol_name + "NF", ring_tube, air);
+      Volume ringNegR_vol(ring_vol_name + "NR", ring_tube, air);
+      DetElement ringPosF_det(ring_vol_name + "PF", det_id);
+      DetElement ringPosR_det(ring_vol_name + "PR", det_id);
+      DetElement ringNegF_det(ring_vol_name + "NF", det_id);
+      DetElement ringNegR_det(ring_vol_name + "NR", det_id);
+      ringPosF_vol.setVisAttributes(description.visAttributes(vis));
+      ringPosR_vol.setVisAttributes(description.visAttributes(vis));
+      ringNegF_vol.setVisAttributes(description.visAttributes(vis));
+      ringNegR_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";
+      std::string sensor_name = ring_vol_name + "_petal";
       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 sensitive_thickness = 0;
+      double glue_thickness      = 0;
+      double service_thickness   = 0;
+      //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)
       {
@@ -122,72 +159,163 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
         {
           sensor_layer_vol = sensor_layer_vol.setSensitiveDetector(sens);
           surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive,rec::SurfaceType::Plane);
+	  sensitive_thickness += sensor_layer_thickness;
         }
         else
         {
           surf_type = rec::SurfaceType(rec::SurfaceType::Helper,rec::SurfaceType::Plane);
+	  if (sensitive_thickness==0) glue_thickness    += sensor_layer_thickness;
+          else                        service_thickness += sensor_layer_thickness;
         }
         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 u(0.,-1., 0.);
+        rec::Vector3D v(1., 0., 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);
+        rec::volSurfaceList(sensor_layer_det)->push_back(surf);
       }
 
+      PlacedVolume pv;
       // place all the sensors into ring
+      double r_offset = ring_inner_r + module_dr / 2.0;
       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);
+        double angle = phi0 - i * 2 * M_PI / nmodule;
+	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 negative_even_sensor_det = i > 0 ? sensor_det.clone(ring_vol_name + "_petalN" + std::to_string(2 * i)) : sensor_det;
+	pv = ringNegF_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i);
+        negative_even_sensor_det.setPlacement(pv);
+        ringNegF_det.add(negative_even_sensor_det);
+
+        transform = Transform3D(RotationZYX(-angle, 0, M_PI), Position(rotated_x, rotated_y, 0));
+	DetElement positive_even_sensor_det = sensor_det.clone(ring_vol_name + "_petalP" + std::to_string(2 * i));
+        pv = ringPosF_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i);
+        positive_even_sensor_det.setPlacement(pv);
+        ringPosF_det.add(positive_even_sensor_det);
+
+	angle -= M_PI / nmodule;
+        rotated_x = r_offset * cos(angle);
+        rotated_y = r_offset * sin(angle);
+	transform = Transform3D(RotationZ(angle), Position(rotated_x, rotated_y, 0));
+
+	DetElement positive_odd_sensor_det = sensor_det.clone(ring_vol_name + "_petalP" + std::to_string(2 * i));
+        pv = ringPosR_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i + 1);
+        positive_odd_sensor_det.setPlacement(pv);
+        ringPosR_det.add(positive_odd_sensor_det);
+
+	transform = Transform3D(RotationZYX(-angle, 0, M_PI), Position(rotated_x, rotated_y, 0));
+	DetElement negative_odd_sensor_det = sensor_det.clone(ring_vol_name + "_petalN" + std::to_string(2 * i));
+	pv = ringNegR_vol.placeVolume(sensor_vol, transform).addPhysVolID("module", 2 * i + 1);
+        negative_odd_sensor_det.setPlacement(pv);
+        ringNegR_det.add(negative_odd_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);
+      pv = layer_vol.placeVolume(ringPosR_vol, Position(0, 0, +(SupportThickness + SiliconThickness) / 2.0));
+      pv = pv.addPhysVolID("sensor", std::stoi(ring_id));
+      ringPosR_det.setPlacement(pv);
+      layer_det.add(ringPosR_det);
+
+      pv = layer_vol.placeVolume(ringPosF_vol, Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0));
+      pv = pv.addPhysVolID("sensor", std::stoi(ring_id));
+      ringPosF_det.setPlacement(pv);
+      layer_det.add(ringPosF_det);
+
+      pv = layerNeg_vol.placeVolume(ringNegR_vol, Position(0, 0, +(SupportThickness + SiliconThickness) / 2.0));
+      pv = pv.addPhysVolID("sensor", std::stoi(ring_id));
+      ringNegR_det.setPlacement(pv);
+      layerNeg_det.add(ringNegR_det);
+
+      pv = layerNeg_vol.placeVolume(ringNegF_vol, Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0));
+      pv = pv.addPhysVolID("sensor", std::stoi(ring_id));
+      ringNegF_det.setPlacement(pv);
+      layerNeg_det.add(ringNegF_det);
       // rotate and reflect ring
+      // fucd: error while use Rotation3D(1, 0, 0, 0, 1, 0, 0, 0, -1)
+      // Geant4VolumeManager INFO  +++   Bad volume Geant4 Path
+      /*
       std::string reflect_ring_name = ring_vol_name + "_reflect";
-      auto reflect_ring_det = ring_det.clone(reflect_ring_name);
+      auto reflect_ring_det = ring_det.clone(reflect_ring_name, det_id);
       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));
+                              Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0)))
+				    .addPhysVolID("sensor", std::stoi(ring_id)).addPhysVolID("face", 1));
       layer_det.add(reflect_ring_det);
+      */
+      // fucd: also error
+      /*
+      std::pair<DetElement,Volume> reflected_ring = ring_det.reflect(ring_vol_name + "_reflect");
+      auto pv = layer_vol.placeVolume(reflected_ring.second, Position(0, 0, -(SupportThickness + SiliconThickness) / 2.0))
+	                 .addPhysVolID("sensor", std::stoi(ring_id))
+	                 .addPhysVolID("face", 1);
+      reflected_ring.first.setPlacement(pv);
+      layer_det.add(reflected_ring.first);
+      */
+      dd4hep::rec::MultiRingsZDiskData::Ring ringData;
+      ringData.petalNumber        = 2 * nmodule;
+      ringData.sensorsPerPetal    = 1;
+      ringData.phi0               = phi0;
+      ringData.phiOffsetOdd       = 2 * M_PI / nmodule;
+      ringData.distance           = ring_inner_r;
+      ringData.widthInner         = module_dphi;
+      ringData.widthOuter         = module_dphi;
+      ringData.length             = module_dr;
+      ringData.thicknessSensitive = SiliconThickness - glue_thickness - service_thickness;
+      ringData.thicknessGlue      = glue_thickness;
+      ringData.thicknessService   = service_thickness;
+      disk.rings.push_back(ringData);
     }
 
-
     // put layer into envelope
-    layer_det.setPlacement(envelope.placeVolume(layer_vol, Position(0, 0, z)).
-                                    addPhysVolID("side", 1).addPhysVolID("layer", std::stoi(layer_id)));
+    layer_det.setPlacement(envelope.placeVolume(layer_vol, Position(0, 0, z))
+			   .addPhysVolID("layer", std::stoi(layer_id)).addPhysVolID("side", 1));
     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);
+      auto reflect_layer_det = layer_det.clone(reflect_layer_name, det_id);
       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);
+      */
+      /*
+      std::pair<DetElement,Volume> reflected_layer = layer_det.reflect(layer_name + "_reflect");
+      auto pv = envelope.placeVolume(reflected_layer.second, Position(0, 0, -z))
+	                .addPhysVolID("side", -1).addPhysVolID("layer", std::stoi(layer_id));
+      reflected_layer.first.setPlacement(pv);
+      tracker.add(reflected_layer.first);
+      */
+      layerNeg_det.setPlacement(envelope.placeVolume(layerNeg_vol, Position(0, 0, -z))
+				.addPhysVolID("layer", std::stoi(layer_id)).addPhysVolID("side", -1));
+      tracker.add(layerNeg_det);
     }
+
+    disk.typeFlags[dd4hep::rec::MultiRingsZDiskData::SensorType::DoubleSided] = 1;
+    disk.typeFlags[dd4hep::rec::MultiRingsZDiskData::SensorType::Pixel]       = 1;
+    disk.alphaPetal       = 0;
+    disk.zPosition        = z;
+    disk.zOffsetSupport   = 0;
+    disk.rminSupport      = inner_r;
+    disk.rmaxSupport      = outer_r;
+    disk.thicknessSupport = SupportThickness;
+    diskData->layers.push_back(disk);
   }
 
+  std::cout << (*diskData) << std::endl;
+  tracker.addExtension<dd4hep::rec::MultiRingsZDiskData>(diskData);
+
   if (x_det.hasAttr(_U(combineHits)))
   {
     tracker.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
diff --git a/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
index b0aebb608bf8ebfcd451dca4f29ee4cbd7181037..511a34d7bfd034960645bcb0a8831ef221be0c2b 100644
--- a/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
+++ b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v02_geo.cpp
@@ -202,7 +202,7 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
     }
     else
     {
-      thickness_support += layer_thickness;
+      if (thickness_sensitive == 0) thickness_support += layer_thickness;
       surf_type = rec::SurfaceType(rec::SurfaceType::Helper, rec::SurfaceType::Plane, rec::SurfaceType::ParallelToZ);
     }
 
@@ -307,7 +307,7 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
     double z_position = -ladder_length_inner * (ladder_repeat_inner / 2.0) - (i + 0.5) * ladder_length_outer;
     Position pos(0, 0, z_position);
     auto cloned_outer_ladder_det = outer_ladder_det.clone("outer_" + ladder_name + std::to_string(-i - 1));
-    cloned_outer_ladder_det.setPlacement(stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID("module", i));
+    cloned_outer_ladder_det.setPlacement(stave_vol.placeVolume(outer_ladder_vol, pos).addPhysVolID("oladder", -i - 1));
     stave_det.add(cloned_outer_ladder_det);
   }
 
@@ -327,28 +327,26 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
       envelope.placeVolume(stave_vol, Transform3D(RotationZ(angle), Position(rotated_x, rotated_y, 0.0))).
                addPhysVolID("module", i));
     otk_barrel.add(cloned_stave_det);
-
-    rec::ZPlanarData::LayerLayout otk_barrel_layer;
-    otk_barrel_layer.phi0 = angle;
-    otk_barrel_layer.ladderNumber = ladder_repeat_outer + ladder_repeat_inner;
-    otk_barrel_layer.thicknessSensitive = thickness_sensitive;
-    otk_barrel_layer.thicknessSupport = thickness_support;
-    otk_barrel_layer.distanceSensitive = otk_inner_radius + thickness_support;
-    otk_barrel_layer.distanceSupport = otk_inner_radius;
-    otk_barrel_layer.offsetSensitive = stave_y_offset;
-    otk_barrel_layer.offsetSupport = stave_y_offset;
-    otk_barrel_layer.widthSensitive = module_width;
-    otk_barrel_layer.widthSupport = module_width;
-    otk_barrel_layer.sensorsPerLadder = module_repeat * 4;
-    double z_half = ladder_length_inner * ladder_repeat_inner / 2.0 + ladder_length_outer * ladder_repeat_outer /
-      2.0;
-    otk_barrel_layer.zHalfSensitive = z_half;
-    otk_barrel_layer.zHalfSupport = z_half;
-    z_planar_data->layers.push_back(otk_barrel_layer);
   }
-
+  rec::ZPlanarData::LayerLayout otk_barrel_layer;
+  otk_barrel_layer.phi0 = 0;
+  otk_barrel_layer.ladderNumber = stave_repeat;
+  otk_barrel_layer.thicknessSensitive = thickness_sensitive;
+  otk_barrel_layer.thicknessSupport = thickness_support;
+  otk_barrel_layer.distanceSensitive = otk_inner_radius + thickness_support;
+  otk_barrel_layer.distanceSupport = otk_inner_radius;
+  otk_barrel_layer.offsetSensitive = stave_y_offset;
+  otk_barrel_layer.offsetSupport = stave_y_offset;
+  otk_barrel_layer.widthSensitive = module_width;
+  otk_barrel_layer.widthSupport = module_width;
+  otk_barrel_layer.sensorsPerLadder = module_repeat * 4;
+  double z_half = ladder_length_inner * ladder_repeat_inner / 2.0 + ladder_length_outer * ladder_repeat_outer / 2.0;
+  otk_barrel_layer.zHalfSensitive = z_half;
+  otk_barrel_layer.zHalfSupport = z_half;
+  z_planar_data->layers.push_back(otk_barrel_layer);
   // check_det_element(otk_barrel);
 
+  std::cout << (*z_planar_data) << std::endl;
   otk_barrel.addExtension<rec::ZPlanarData>(z_planar_data);
   if (x_det.hasAttr(_U(combineHits)))
   {
diff --git a/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp b/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp
index 12c866acd437ecc4a6769f8159c48ee6eaa80947..c68a93b4ecf3f14aaba2987d4fe4c9b8c451f9a3 100644
--- a/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp
+++ b/Detector/DetCRD/src/Tracker/SiTracker_otkendcap_v02_geo.cpp
@@ -96,14 +96,23 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
     const double trapezoid_height = ring_outer_radius - ring_inner_radius;
     const double trapezoid_inner_length = calculate_polygon_side_length(ring_inner_radius, repeat);
     const double trapezoid_outer_length = calculate_polygon_side_length(ring_outer_radius, repeat);
-    const auto layers_thickness = layers_xml.attr<double>("thickness");
-    const double layers_base_thickness = layers_thickness;
+
+    double layers_base_thickness = 0;
+    for (xml_coll_t layers(layers_xml, "layer"); layers; ++layers)
+    {
+      const xml::Component layer = xml::Handle_t(layers);
+      const auto layer_thickness = layer.attr<double>("thickness");
+      layers_base_thickness += layer_thickness;
+    }
 
     Trapezoid layer_base_shape(trapezoid_inner_length / 2.0, trapezoid_outer_length / 2.0,
                                layers_base_thickness / 2.0, layers_base_thickness / 2.0, trapezoid_height / 2.0);
     Volume layer_base_vol(ring_name, layer_base_shape, air);
     layer_base_vol = layer_base_vol.setVisAttributes(theDetector, ring.attr<std::string>("vis"));
 
+    double sensitive_thickness = 0;
+    double support_thickness   = 0;
+    double service_thickness   = 0;
     double y_offset = -layers_base_thickness / 2.0;
     for (xml_coll_t layers(layers_xml, "layer"); layers; ++layers)
     {
@@ -124,10 +133,13 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
       {
         layer_vol = layer_vol.setSensitiveDetector(sens);
         surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive, rec::SurfaceType::Plane);
+	sensitive_thickness += layer_thickness;
       }
       else
       {
         surf_type = rec::SurfaceType(rec::SurfaceType::Helper, rec::SurfaceType::Plane);
+	if (sensitive_thickness==0) service_thickness += layer_thickness;
+	else                        support_thickness += layer_thickness;
       }
       rec::Vector3D u(1., 0., 0.);
       rec::Vector3D v(0., 0., 1.);
@@ -163,30 +175,37 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
       auto cloned_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(i + 1));
       auto cloned_neg_ring_piece_det = ring_piece_det.clone(ring_name + std::to_string(-(i + 1)));
       auto pv = envelope.placeVolume(layer_base_vol, transform).addPhysVolID("side", 1).addPhysVolID("module", i)
-                        .addPhysVolID("sensor", ring_num);
+                        .addPhysVolID("layer", ring_num);
       auto neg_pv = envelope.placeVolume(layer_base_vol, neg_transform).addPhysVolID("side", -1).
-                             addPhysVolID("module", i).addPhysVolID("sensor", ring_num);
+                             addPhysVolID("module", i).addPhysVolID("layer", ring_num);
       cloned_ring_piece_det.setPlacement(pv);
       cloned_neg_ring_piece_det.setPlacement(neg_pv);
       otk_endcaps.add(cloned_ring_piece_det);
       otk_endcaps.add(cloned_neg_ring_piece_det);
     }
+
+    rec::ZDiskPetalsData::LayerLayout otk_endcap_layer;
+    otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::DoubleSided] = false;
+    otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::Pixel] = true;
+    otk_endcap_layer.phi0                = angle_step / 2.0;
+    otk_endcap_layer.distanceSupport     = ring_inner_radius;
+    otk_endcap_layer.distanceSensitive   = ring_inner_radius;
+    otk_endcap_layer.lengthSupport       = trapezoid_height;
+    otk_endcap_layer.lengthSensitive     = trapezoid_height;
+    otk_endcap_layer.thicknessSensitive  = sensitive_thickness;
+    otk_endcap_layer.thicknessSupport    = service_thickness; // front regard as support in KF, ignore rear material
+    otk_endcap_layer.widthInnerSupport   = trapezoid_inner_length;
+    otk_endcap_layer.widthInnerSensitive = trapezoid_inner_length;
+    otk_endcap_layer.widthOuterSupport   = trapezoid_outer_length;
+    otk_endcap_layer.widthOuterSensitive = trapezoid_outer_length;
+    otk_endcap_layer.zPosition           = zmax - support_thickness - 0.5*sensitive_thickness;
+    otk_endcap_layer.sensorsPerPetal     = 1;
+    otk_endcap_layer.petalNumber         = repeat;
+    otk_endcap_layer.petalHalfAngle      = angle_step / 2.0;
+    zDiskPetalsData->layers.push_back(otk_endcap_layer);
   }
 
-  rec::ZDiskPetalsData::LayerLayout otk_endcap_layer;
-  otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::DoubleSided] = false;
-  otk_endcap_layer.typeFlags[rec::ZDiskPetalsData::SensorType::Pixel] = true;
-  otk_endcap_layer.phi0 = 0;
-  otk_endcap_layer.distanceSupport = 406 * mm;
-  otk_endcap_layer.distanceSensitive = 406 * mm;
-  otk_endcap_layer.lengthSupport = 1410 * mm;
-  otk_endcap_layer.lengthSensitive = 1410 * mm;
-  otk_endcap_layer.thicknessSensitive = 0.3 * mm;
-  otk_endcap_layer.thicknessSupport = 3.6 * mm;
-  otk_endcap_layer.zPosition = zmax - 3.6 * mm;
-  otk_endcap_layer.sensorsPerPetal = 127;
-  otk_endcap_layer.petalNumber = 16;
-  zDiskPetalsData->layers.push_back(otk_endcap_layer);
+  std::cout << (*zDiskPetalsData) << std::endl;
   otk_endcaps.addExtension<rec::ZDiskPetalsData>(zDiskPetalsData);
 
   // #ifdef DET_ELEMENT_DEBUG
@@ -196,6 +215,7 @@ static Ref_t create_element(Detector& theDetector, xml_h e, SensitiveDetector se
   {
     otk_endcaps.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
   }
+
   return otk_endcaps;
 }
 
diff --git a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
index 6de9c474f3bff216ffdc4edc9229027fbdc8162d..d2bc8272d6e872d8734bc34d68f48cb2cde86de4 100644
--- a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
+++ b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h
@@ -56,6 +56,14 @@ namespace CEPCConf{
     static const int GOOD                 = 27;
   };
 
+  struct DetCellID{
+    static const int system = 0;
+    static const int side   = 1;
+    static const int layer  = 2;
+    static const int module = 3;
+    static const int sensor = 4;
+  };
+
   struct DetEncoderString{
     static const int system = 5;
     static const int side = -2;
diff --git a/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h b/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h
index b466c10cfa3ed9f293727546673aa02d60dc7591..a790a2a156c5c9f23934b5f32ab19826170875c2 100644
--- a/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h
+++ b/Detector/DetIdentifier/include/DetIdentifier/CEPCDetectorData.h
@@ -191,6 +191,136 @@ namespace dd4hep {
       return io;
     };
 
+    /** Simple data structure with key parameters for
+     *  zdisk by multi rings
+     *
+     * @author
+     * @date Feb, 26, 2025
+     * @version $Id: $
+     */
+    struct MultiRingsZDiskStruct {
+      /// width of the strips (if applicable )
+      double widthStrip;
+      /// length of the strips (if applicable )
+      double lengthStrip;
+      /// strip pitch  (if applicable )
+      double pitchStrip;
+      /// strip stereo angle  (if applicable )
+      double angleStrip;
+
+      /// enum for encoding the sensor type in typeFlags
+      struct SensorType{
+	enum {
+	  DoubleSided=0,
+	  Pixel
+	};
+      };
+
+      /** Internal helper struct for defining the layer layout. Layers are defined
+       *  with a sensitive part, flex/cable/service part and a support part.
+       */
+      struct Ring {
+	Ring() :
+	  petalNumber(0),
+	  sensorsPerPetal(0),
+	  phi0(0),
+	  phiOffsetOdd(0),
+	  distance(0),
+	  widthInner(0),
+	  widthOuter(0),
+	  length(0),
+	  thicknessSensitive(0),
+	  thicknessGlue(0),
+	  thicknessService(0) {
+	}
+
+	int    petalNumber;
+	int    sensorsPerPetal;
+	double phi0;
+	double phiOffsetOdd;
+	double distance;
+	double widthInner;
+	double widthOuter;
+	double length;
+	double thicknessSensitive;
+	double thicknessGlue;
+	double thicknessService;
+      };
+
+      struct LayerLayout {
+	LayerLayout() :
+	  typeFlags(0),
+	  alphaPetal(0),
+	  zPosition(0),
+	  zOffsetSupport(0),
+	  rminSupport(0),
+	  rmaxSupport(0),
+	  thicknessSupport(0) {
+	}
+	std::bitset<32> typeFlags;
+	double alphaPetal;
+	double zPosition;
+	double zOffsetSupport;
+	double rminSupport;
+	double rmaxSupport;
+	double thicknessSupport;
+
+	std::vector<Ring> rings;
+      };
+
+      std::vector<LayerLayout> layers;
+    };
+    typedef StructExtension<MultiRingsZDiskStruct> MultiRingsZDiskData;
+
+    static std::ostream& operator<<( std::ostream& io , const MultiRingsZDiskData& d ) {
+      boost::io::ios_base_all_saver ifs(io);
+
+      io <<  " -- MultiRingsZDiskData: "  << std::scientific << std::endl;
+      io <<  "  widthStrip  : " <<  d.widthStrip  << std::endl;
+      io <<  "  lengthStrip : " <<  d.lengthStrip << std::endl;
+      io <<  "  pitchStrip  : " <<  d.pitchStrip  << std::endl;
+      io <<  "  angleStrip  : " <<  d.angleStrip  << std::endl;
+
+      std::vector<MultiRingsZDiskData::LayerLayout> layers = d.layers;
+      io << " Layers : alphaPetal  zPosition    d p   zOffsetSup  rminSupport  rmaxSupport thicknessSupport nRing" << std::endl;
+      io << "               np    ns  phi0    phiOffsetOdd distance widthInner widthOuter length   thicknessSensitive thicknessGlue thicknessService" << std::endl;   
+
+      for (unsigned i=0,N=layers.size(); i<N; ++i) {
+	MultiRingsZDiskData::LayerLayout l = layers[i];
+
+	std::vector<MultiRingsZDiskData::Ring> rings = l.rings;
+	io << "        " << l.alphaPetal
+	   << " " << l.zPosition
+	   << " " << l.typeFlags[ MultiRingsZDiskData::SensorType::DoubleSided ]
+	   << " " << l.typeFlags[ MultiRingsZDiskData::SensorType::Pixel ]
+	   << " " << l.zOffsetSupport
+	   << " " << l.rminSupport
+	   << " " << l.rmaxSupport
+	   << " " << l.thicknessSupport
+	   << " " << rings.size()
+	   << std::endl;
+
+	for (unsigned ir=0,NR=rings.size(); ir<NR; ++ir) {
+	  MultiRingsZDiskData::Ring r = rings[ir];
+
+	  io << "               " << r.petalNumber
+	     << " " << r.sensorsPerPetal
+	     << " " << r.phi0
+	     << " " << r.phiOffsetOdd
+	     << " " << r.distance
+	     << " " << r.widthInner
+	     << " " << r.widthOuter
+	     << " " << r.length
+	     << " " << r.thicknessSensitive
+	     << " " << r.thicknessGlue
+	     << " " << r.thicknessService
+	     << std::endl;
+	}
+      }
+
+      return io;
+    };
+
     /** Simple data structure with key parameters for
      *  reconstruction of long crystal bar ECAL
      *
diff --git a/Digitization/DigiSimple/src/SmearDigiTool.cpp b/Digitization/DigiSimple/src/SmearDigiTool.cpp
index 64e52e6a28c4d5f35f143d1c3790d4c015e01bc9..6362ae3d4bce8f2a650dab4398c7ee35e4473a9c 100644
--- a/Digitization/DigiSimple/src/SmearDigiTool.cpp
+++ b/Digitization/DigiSimple/src/SmearDigiTool.cpp
@@ -94,11 +94,11 @@ StatusCode SmearDigiTool::Call(edm4hep::SimTrackerHit simhit, edm4hep::TrackerHi
   auto t = simhit.getTime();
 
   auto cellId = simhit.getCellID();
-  int system  = m_decoder->get(cellId, "system");
-  int side    = m_decoder->get(cellId, "side"  );
-  int layer   = m_decoder->get(cellId, "layer" );
-  int module  = m_decoder->get(cellId, "module");
-  int sensor  = m_decoder->get(cellId, "sensor");
+  int system  = m_decoder->get(cellId, CEPCConf::DetCellID::system);
+  int side    = m_decoder->get(cellId, CEPCConf::DetCellID::side);
+  int layer   = m_decoder->get(cellId, CEPCConf::DetCellID::layer);
+  int module  = m_decoder->get(cellId, CEPCConf::DetCellID::module);
+  int sensor  = m_decoder->get(cellId, CEPCConf::DetCellID::sensor);
 
   auto& pos   = simhit.getPosition();
   auto& mom   = simhit.getMomentum();
@@ -277,6 +277,7 @@ StatusCode SmearDigiTool::Call(edm4hep::SimTrackerHit simhit, edm4hep::TrackerHi
 	    << localPointSmeared.u()/dd4hep::mm << " " << localPointSmeared.v()/dd4hep::mm << ")" << endmsg;
 
     auto outhit = hitCol->create();
+
     outhit.setCellID(cellId);
 
     edm4hep::Vector3d smearedPos(globalPointSmeared.x()/dd4hep::mm,
diff --git a/Reconstruction/RecPFACyber/script/digi.py b/Reconstruction/RecPFACyber/script/digi.py
index 78c790b0eb166cd0ec3f1f2b5c725f00e33da10c..3a7f2ae76c43612f8abcfcaddc04d780d5fc5733 100644
--- a/Reconstruction/RecPFACyber/script/digi.py
+++ b/Reconstruction/RecPFACyber/script/digi.py
@@ -159,9 +159,10 @@ out.outputCommands = ["drop *",
     "keep MCParticle",
     "keep VXDCollection",
     "keep ITKBarrelCollection",
+    "keep ITKEndcapCollection",
     "keep TPCCollection",
     "keep OTKBarrelCollection",
-    "keep FTDCollection",
+    "keep OTKEndcapCollection",
     "keep MuonBarrelCollection",
     "keep MuonEndcapCollection",
     "keep ECALBarrel",
diff --git a/Reconstruction/RecPFACyber/script/tracking.py b/Reconstruction/RecPFACyber/script/tracking.py
index 1ee381d1303dd91a6e86d53f60a350b2e707ca86..deedf267ed48d611b94ff83475287542dbff5990 100644
--- a/Reconstruction/RecPFACyber/script/tracking.py
+++ b/Reconstruction/RecPFACyber/script/tracking.py
@@ -50,9 +50,10 @@ podioinput = PodioInput("PodioReader", collections=[
     "MCParticle",
     "VXDCollection",
     "ITKBarrelCollection",
+    "ITKEndcapCollection",
     "TPCCollection",
     "OTKBarrelCollection",
-    "FTDCollection",
+    "OTKEndcapCollection",
     "MuonBarrelCollection",
     "MuonEndcapCollection"
     ])
@@ -65,11 +66,10 @@ podioinput = PodioInput("PodioReader", collections=[
 ## Config ##
 vxdhitname  = "VXDTrackerHits"
 sithitname  = "ITKBarrelTrackerHits"
+ftdhitname  = "ITKEndcapTrackerHits"
 gashitname  = "TPCTrackerHits"
 sethitname  = "OTKBarrelTrackerHits"
-setspname   = "OTKBarrelSpacePoints"
-ftdhitname  = "FTDTrackerHits"
-ftdspname   = "FTDSpacePoints"
+etdhitname  = "OTKEndcapTrackerHits"
 from Configurables import SmearDigiTool,SiTrackerDigiAlg
 
 ## VXD ##
@@ -98,6 +98,19 @@ digiITKB.TrackerHitAssociationCollection = "ITKBarrelTrackerHitAssociation"
 digiITKB.DigiTool = "SmearDigiTool/ITKBarrel"
 #digiITKB.OutputLevel = DEBUG
 
+## ITKEndcap ##
+itketool = SmearDigiTool("ITKEndcap")
+itketool.ResolutionU = [0.008]
+itketool.ResolutionV = [0.040]
+#itketool.OutputLevel = DEBUG
+
+digiITKE = SiTrackerDigiAlg("ITKEndcapDigi")
+digiITKE.SimTrackHitCollection = "ITKEndcapCollection"
+digiITKE.TrackerHitCollection = ftdhitname
+digiITKE.TrackerHitAssociationCollection = "ITKEndcapTrackerHitAssociation"
+digiITKE.DigiTool = "SmearDigiTool/ITKEndcap"
+#digiITKE.OutputLevel = DEBUG
+
 ## OTKBarrel ##
 otkbtool = SmearDigiTool("OTKBarrel")
 otkbtool.ResolutionU = [0.010]
@@ -111,18 +124,18 @@ digiOTKB.TrackerHitAssociationCollection = "OTKBarrelTrackerHitAssociation"
 digiOTKB.DigiTool = "SmearDigiTool/OTKBarrel"
 #digiOTKB.OutputLevel = DEBUG
 
-## FTD ##
-ftdtool = SmearDigiTool("FTD")
-ftdtool.ResolutionU = [0.0072]
-ftdtool.ResolutionV = [0.086]
-#ftdtool.OutputLevel = DEBUG
+## OTKEndcap ##
+otketool = SmearDigiTool("OTKEndcap")
+otketool.ResolutionU = [0.010]
+otketool.ResolutionV = [1.000]
+#otketool.OutputLevel = DEBUG
 
-digiFTD = SiTrackerDigiAlg("FTDDigi")
-digiFTD.SimTrackHitCollection = "FTDCollection"
-digiFTD.TrackerHitCollection = ftdhitname
-digiFTD.TrackerHitAssociationCollection = "FTDTrackerHitAssociation"
-digiFTD.DigiTool = "SmearDigiTool/FTD"
-#digiFTD.OutputLevel = DEBUG
+digiOTKE = SiTrackerDigiAlg("OTKEndcapDigi")
+digiOTKE.SimTrackHitCollection = "OTKEndcapCollection"
+digiOTKE.TrackerHitCollection = etdhitname
+digiOTKE.TrackerHitAssociationCollection = "OTKEndcapTrackerHitAssociation"
+digiOTKE.DigiTool = "SmearDigiTool/OTKEndcap"
+#digiOTKE.OutputLevel = DEBUG
 
 ## TPC ##
 from Configurables import TPCDigiAlg
@@ -149,6 +162,10 @@ digiMuon.MuonBarrelTrackerHits = "MuonBarrelTrackerHits"
 digiMuon.MuonEndcapTrackerHits = "MuonEndcapTrackerHits"
 digiMuon.WriteNtuple = 0
 digiMuon.OutFileName = "Digi_MUON.root"
+digiMuon.SiPMEff = 1
+digiMuon.EdepMin = 0.0001
+digiMuon.HitEdepMin = 0.000001
+digiMuon.HitEdepMax = 0.1
 #########################################
 
 ################
@@ -191,7 +208,6 @@ tracking.HeaderCol = "EventHeader"
 tracking.VTXHitCollection = vxdhitname
 tracking.SITHitCollection = sithitname
 tracking.FTDPixelHitCollection = ftdhitname
-tracking.FTDSpacePointCollection = ftdspname
 tracking.SITRawHitCollection = "NotNeedForPixelSIT"
 tracking.FTDRawHitCollection = ftdhitname
 tracking.UseSIT = True
@@ -213,7 +229,7 @@ tracking.Chi2WZSeptet  = 0.1
 from Configurables import ForwardTrackingAlg
 forward = ForwardTrackingAlg("ForwardTracking")
 forward.FTDPixelHitCollection = ftdhitname
-forward.FTDSpacePointCollection = ftdspname
+#forward.FTDSpacePointCollection = ftdspname
 forward.FTDRawHitCollection = ftdhitname
 forward.Chi2ProbCut = 0.0
 forward.HitsPerTrackMin = 3
@@ -228,7 +244,7 @@ forward.CriteriaMax = [30, 1.02, 10, 1.015, 20, 1.3, 1.0, 150, 1.08,  99999999,
 from Configurables import TrackSubsetAlg
 subset = TrackSubsetAlg("TrackSubset")
 subset.TrackInputCollections = ["ForwardTracks", "SiTracks"]
-subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname, ftdspname]
+subset.RawTrackerHitCollections = [vxdhitname, sithitname, ftdhitname]
 subset.TrackSubsetCollection = "SubsetTracks"
 #subset.FitterTool = "KalTestTool/KalTest111"
 #subset.OutputLevel = DEBUG
@@ -245,7 +261,8 @@ full.SITTrackerHits = sithitname
 full.TPCTrackerHits = gashitname
 full.SETTrackerHits = sethitname
 full.FTDPixelTrackerHits = ftdhitname
-full.FTDSpacePoints = ftdspname
+#full.FTDSpacePoints = ftdspname
+full.ETDTrackerHits = etdhitname
 full.SITRawHits     = "NotNeedForPixelSIT"
 full.SETRawHits     = "NotNeedForPixelSET"
 full.FTDRawHits     = ftdhitname
@@ -255,6 +272,7 @@ full.OutputTracks  = "CompleteTracks" # default name
 full.FTDHitToTrackDistance = 5.
 full.SITHitToTrackDistance = 3.
 full.SETHitToTrackDistance = 5.
+full.ETDHitToTrackDistance = 15.
 full.MinChi2ProbForSiliconTracks = 0
 full.MaxChi2PerHit = 200
 full.ForceSiTPCMerging = True
@@ -273,7 +291,8 @@ from Configurables import TrackParticleRelationAlg
 tpr = TrackParticleRelationAlg("Track2Particle")
 tpr.MCParticleCollection = "MCParticle"
 tpr.TrackList = ["CompleteTracks"]
-tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation"]
+tpr.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation",
+                              "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation"]
 #tpr.OutputLevel = DEBUG
 
 
@@ -281,7 +300,8 @@ from Configurables import TrueMuonTagAlg
 tmt = TrueMuonTagAlg("TrueMuonTag")
 tmt.MCParticleCollection = "MCParticle"
 tmt.TrackList = ["CompleteTracks"]
-tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "OTKBarrelTrackerHitAssociation", "FTDTrackerHitAssociation", "TPCTrackerHitAss"]
+tmt.TrackerAssociationList = ["VXDTrackerHitAssociation", "ITKBarrelTrackerHitAssociation", "ITKEndcapTrackerHitAssociation",
+                              "OTKBarrelTrackerHitAssociation", "OTKEndcapTrackerHitAssociation", "TPCTrackerHitAss"]
 tmt.MuonTagEfficiency = 0.95 # muon true tag efficiency, default is 1.0 (100%)
 tmt.MuonDetTanTheta = 1.2 # muon det barrel/endcap separation tan(theta)
 #tmt.OutputLevel = DEBUG
@@ -295,7 +315,7 @@ out.outputCommands = ["keep *"]
 # ApplicationMgr
 from Configurables import ApplicationMgr
 mgr = ApplicationMgr(
-    TopAlg = [podioinput, digiVXD, digiITKB, digiOTKB, digiFTD, digiTPC, digiMuon, tracking, forward, subset, clupatra, full, tpr, tpc_dndx, tof, tmt, out],
+    TopAlg = [podioinput, digiVXD, digiITKB, digiITKE, digiOTKB, digiOTKE, digiTPC, digiMuon, tracking, clupatra, full, tpr, tpc_dndx, tof, tmt, out],
     EvtSel = 'NONE',
     EvtMax = 10,
     ExtSvc = [rndmengine, rndmgensvc, dsvc, evtseeder, geosvc, gearsvc, tracksystemsvc, pidsvc],
diff --git a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp
index 831aa8c8be3a5ba2b41950129bbf6e6778eb57b4..2bef32666ab54fc3c2a1f334f0b7fbb05caf6770 100644
--- a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp
+++ b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp
@@ -28,6 +28,7 @@
 #include "gear/FTDLayerLayout.h"
 #else
 #include "DetInterface/IGeomSvc.h"
+#include "DetIdentifier/CEPCDetectorData.h"
 #endif
 
 //----From KiTrack-----------------------------
@@ -172,19 +173,39 @@ StatusCode ForwardTrackingAlg::initialize(){
 
   int nLayers(0), nModules(0), nSensors(0);
   try {
-    auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
-    auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>();
-    auto ftdlayers = ftdData->layers;
+    auto  ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
+    auto  ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>();
+    auto& ftdlayers = ftdData->layers;
 
     nLayers = ftdlayers.size() + 1;
-    for (int layer = 0; layer < ftdlayers.size(); layer++) {
+    for (int layer = 0, N = ftdlayers.size(); layer < N; layer++) {
       auto& ftdlayer = ftdlayers[layer];
       if (ftdlayer.petalNumber > nModules) nModules = ftdlayer.petalNumber;
       if (ftdlayer.sensorsPerPetal > nSensors)    nSensors = ftdlayer.sensorsPerPetal;
     }
   } catch(std::runtime_error& e) {
-    fatal() << e.what() << endmsg;
-    return StatusCode::FAILURE;
+    info() << e.what() << endmsg;
+    try {
+      auto  ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
+      auto  ftdData = ftdDet.extension<dd4hep::rec::MultiRingsZDiskData>();
+      auto& ftdlayers = ftdData->layers;
+
+      nLayers = ftdlayers.size() + 1;
+      for (int layer = 0; layer < ftdlayers.size(); layer++) {
+	auto& ftdlayer = ftdlayers[layer];
+	auto& rings = ftdlayer.rings;
+	int ns = 0;
+	for (int iring = 0, N = rings.size(); iring < N; iring++) {
+	  auto& ring = rings[iring];
+	  if (ring.petalNumber > nModules) nModules = ring.petalNumber;
+	  ns += ring.sensorsPerPetal;
+	}
+	if (ns > nSensors) nSensors = ns;
+      }
+    } catch(std::runtime_error& e) {
+      fatal() << e.what() << endmsg;
+      return StatusCode::FAILURE;
+    }
   }
 #endif
   
diff --git a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp
index f5316ac5f45d68ff8c551c7933c35831df36c2e8..4839b7eaf2c1bc6b77b444589db3e770e5aa87c9 100644
--- a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp
+++ b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp
@@ -3204,8 +3204,29 @@ StatusCode SiliconTrackingAlg::setupGeom() {
       }
     }
     _nlayersFTD =_zLayerFTD.size();
-  } catch(std::runtime_error& e){
-    warning() << e.what() << endmsg;
+  } catch(std::runtime_error& e1){
+    info() << "try ZDiskPetalsData: " << e1.what() << endmsg;
+    try {
+      auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
+      auto ftdData = ftdDet.extension<dd4hep::rec::MultiRingsZDiskData>();
+      auto ftdlayers = ftdData->layers;
+      for (int layer = 0; layer < ftdlayers.size(); layer++) {
+	dd4hep::rec::MultiRingsZDiskData::LayerLayout& ftdlayer = ftdlayers[layer];
+	auto& ring = ftdlayer.rings[0];
+	// front petal even numbered
+	_zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm - 0.5*ftdlayer.thicknessSupport/dd4hep::mm
+			     - ring.thicknessGlue/dd4hep::mm - 0.5*ring.thicknessSensitive/dd4hep::mm);
+	if (ring.petalNumber > 0) {
+	  // front petal odd numbered
+	  _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm + 0.5*ftdlayer.thicknessSupport/dd4hep::mm
+			       + ring.thicknessGlue/dd4hep::mm + 0.5*ring.thicknessSensitive/dd4hep::mm);
+	  _petalBasedFTDWithOverlaps = true;
+	}
+      }
+      _nlayersFTD =_zLayerFTD.size();
+    } catch(std::runtime_error& e2) {
+      warning() << "try MultiRingsZDiskData: " << e2.what() << endmsg;
+    }
   }
 #endif
 
diff --git a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
index 001971edfbba00611f1319dd1237153fd0ac48b1..a5e8f1038152cd8d2bff3f57fa63e57cf0b946f5 100755
--- a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
+++ b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp
@@ -483,10 +483,14 @@ fitstart:
       else {
 	error_code = m_fitTool->Fit(track, trkHits, covMatrix, maxChi2PerHit, fit_backwards);
       }
+    } catch (std::runtime_error& e) {
+      error() << e.what() << endmsg;
+      throw std::runtime_error("Need more check");
+    } catch (MarlinTrk::Exception& e) {
+      error() << e.what() << endmsg;
+      throw std::runtime_error("Need more check");
     } catch (...) {
-      //      delete track;
-      //      delete marlinTrk;
-      error() << "exception happened while createFinalisedLCIOTrack!" << endmsg;
+      error() << "unknown exception happened while createFinalisedLCIOTrack!" << endmsg;
       throw std::runtime_error("Need more check");
     }
     debug() << "createFinalisedLCIOTrack finished" << endmsg;
@@ -3516,7 +3520,7 @@ void FullLDCTrackingAlg::AddNotAssignedHits() {
       }
       for (int iL=0; iL<_nLayersETD; ++iL) { // loop over ETD layers
         TrackerHitExtendedVec hitVec = ETDHits[iL];
-        int refit = 0;
+        int refit = 1;
         if (hitVec.empty() == false) AssignOuterHitsToTracks(hitVec, _distCutForETDHits, refit);
       }
     }
@@ -3719,7 +3723,7 @@ void FullLDCTrackingAlg::CleanUpExtrapolations() {
 
 void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, float dcut, int refit) {
 
-  debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks dcut = " << dcut << endmsg;
+  debug() << " AssignOuterHitsToTracks dcut = " << dcut << endmsg;
   
   // get the number of hits to try, and the number of final tracks to which the tracks will be attached
   int nHits = int(hitVec.size());
@@ -3763,25 +3767,22 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
         
         // skip if the extrapolations failed
         if (helix==0) {
-          debug() << "helix extrapolation failed for trkExt" << endmsg;
+          debug() << " **helix extrapolation failed for trkExt" << endmsg;
           continue;
         }
         
         float distance = helix->getDistanceToPoint(pos,dcut);
         
-        debug() << "for helix extrapolation " << helix << " distance = " << distance << endmsg;
+        debug() << " **for helix extrapolation " << helix << " distance = " << distance << endmsg;
         
         // check the distance is less than the steerable cut ...
         if (distance<dcut) {
-          debug() << "for helix extrapolation " << helix << " distance = " << distance << endmsg;
-          
           // ... if so create the association and flag the hit and track
           TrackHitPair * trkHitPair =
           new TrackHitPair(trkExt,trkHitExt,distance);
           pairs.push_back(trkHitPair);
           flagTrack[trkExt] = true;
           flagHit[trkHitExt] = true;
-
         }
       }
     }
@@ -3789,7 +3790,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
   
   int nPairs = int(pairs.size());
 
-  debug() << "AssignOuterHitsToTracks : Number of track hit pairs to try =  " << nPairs << endmsg;
+  debug() << " AssignOuterHitsToTracks : Number of track hit pairs to try =  " << nPairs << endmsg;
   
   if (nPairs>0) {
 
@@ -3881,7 +3882,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
             trkHits.push_back(it->second);
           }
                     
-          debug() << "AssignOuterHitsToTracks: Start Fitting: AddHits: number of hits to fit " << trkHits.size() << endmsg;
+          debug() << " **Start Fitting: AddHits: number of hits to fit " << trkHits.size() << endmsg;
 
           MarlinTrk::IMarlinTrack* marlin_trk = _trksystem->createTrack();
 	  //std::auto_ptr<MarlinTrk::IMarlinTrack> marlin_trk_autop(_trksystem->createTrack());
@@ -3914,11 +3915,11 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
           covMatrix[14] = ( _initialTrackError_tanL  ); //sigma_tanl^2
           
           pre_fit.covMatrix = covMatrix;
-	  debug() << "AssignOuterHitsToTracks: before createFit " << pre_fit << endmsg;
+	  debug() << " **createFit from pre_fit TrackState " << pre_fit << endmsg;
           int error = MarlinTrk::createFit( trkHits, marlin_trk, &pre_fit, _bField, IMarlinTrack::forward/*backward*/, _maxChi2PerHit );
-          debug() << "AssignOuterHitsToTracks: after createFit" << endmsg;
+          debug() << " **createFit finished, error code = " << error << endmsg;
           if ( error != IMarlinTrack::success ) {
-	    debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: creation of fit fails with error " << error << endmsg;
+	    debug() << " **creation of fit fails with error " << MarlinTrk::errorCode(error) << endmsg;
             
             delete marlin_trk ;
             continue ;
@@ -3929,14 +3930,14 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
           
           float outlier_pct = outliers.size()/float(trkHits.size()) ;
           
-          debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: percentage of outliers " << outlier_pct << endmsg;
+          debug() << " **percentage of outliers " << outlier_pct << endmsg;
           
           if ( outlier_pct > _maxAllowedPercentageOfOutliersForTrackCombination) {
-	    debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg;
+	    debug() << " **percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg;
             delete marlin_trk ;
             continue ;
           }
-	  debug() << "AssignOuterHitsToTracks: before propagate" << endmsg;
+	  debug() << " **before propagate" << endmsg;
 	  std::vector<std::pair<edm4hep::TrackerHit, double> > hitsInFit;
 	  marlin_trk->getHitsInFit(hitsInFit);
 	  auto firstHit = hitsInFit.begin()->first;
@@ -3948,21 +3949,21 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
           return_code = marlin_trk->propagate(point, firstHit, trkState, chi2_D, ndf);
           
           delete marlin_trk ;
-          debug() << "AssignOuterHitsToTracks: after delete" << endmsg;
+          debug() << " **after delete" << endmsg;
           if ( error != IMarlinTrack::success ) {
-	    debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: propagate to IP fails with error " << error << endmsg;
+	    debug() << " **propagate to IP fails with error " << MarlinTrk::errorCode(error) << endmsg;
 	    continue ;
 	  }
           
           if ( ndf < 0  ) {
-	    debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: Fit failed : NDF is less that zero  " << ndf << endmsg;
+	    debug() << " **Fit failed : NDF is less that zero  " << ndf << endmsg;
 	    continue ;
 	  }
           
           float chi2Fit = chi2_D/float(ndf);
           
           if ( chi2Fit > _chi2FitCut ) {
-	    debug() << "FullLDCTrackingAlg::AssignOuterHitsToTracks: track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " <<  chi2Fit << endmsg;
+	    debug() << " **track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " <<  chi2Fit << endmsg;
 	    //why not continue? FIXME, by fucd
 	    return ;
 	  }
@@ -3990,7 +3991,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
           flagTrack[trkExt] = false;
           flagHit[trkHitExt] = false;
                     
-          debug() << "AssignOuterHitsToTracks: Hit " << trkHitExt << " successfully assigned to track " << trkExt << endmsg;
+          debug() << " **Hit " << trkHitExt << " successfully assigned to track " << trkExt << endmsg;
 	}
       }
     }
@@ -4006,7 +4007,7 @@ void FullLDCTrackingAlg::AssignOuterHitsToTracks(TrackerHitExtendedVec hitVec, f
 
 HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) {
   
-  debug() << "FullLDCTrackingAlg::GetExtrapolationHelix called for track " << track << endmsg;
+  debug() << "GetExtrapolationHelix called for track " << track << endmsg;
   
   HelixClass * helix = 0;
   
@@ -4021,7 +4022,7 @@ HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) {
   ts_at_calo.location = -1;
   float z_ref_max = 0;
   
-  debug() << "FullLDCTrackingAlg::GetExtrapolationHelix number of tracks associated = " << trk_vec.size() << endmsg;
+  debug() << "GetExtrapolationHelix number of tracks associated = " << trk_vec.size() << endmsg;
   
   for (unsigned itrk=0; itrk<trk_vec.size(); ++itrk) {
 
@@ -4030,19 +4031,23 @@ HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) {
     if (trk_lcio.isAvailable()) {
   
       // use the tracks state at the calorimeter because that will have accounted for energy loss already
-      if (hasTrackStateAt(trk_lcio, edm4hep::TrackState::AtCalorimeter)) {
-        
-        TrackState ts_at_last_hit = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtLastHit);
-        float z_ref = ts_at_last_hit.referencePoint[2];
-
-        // make sure we use the one closest to the calo face
-        if ( fabs(z_ref) >  z_ref_max) {
-          z_ref_max = fabs(z_ref);
-          ts_at_calo = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtCalorimeter);
-
-          debug() << "GetExtrapolationHelix set ts_at_calo with ref_z = " << z_ref << endmsg;
-          debug() << "TrackState at calo: " << ts_at_calo << endmsg;
+      edm4hep::TrackState ts = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtCalorimeter);
+      edm4hep::TrackState ts_at_last_hit = getTrackStateAt(trk_lcio, edm4hep::TrackState::AtLastHit);
+      float z_ref = ts_at_last_hit.referencePoint[2];
+      // make sure we use the one closest to the calo face
+      // fucd FIXME: why use ts_at_calo not ts_at_last_hit
+      if ( fabs(z_ref) >  z_ref_max) {
+	z_ref_max = fabs(z_ref);
+
+	if (ts.omega!=0) {
+	  ts_at_calo = ts;
+	}
+	else if (ts_at_calo.location!=edm4hep::TrackState::AtCalorimeter) {
+	  ts_at_calo = ts_at_last_hit;
 	}
+
+	debug() << "GetExtrapolationHelix set ts_at_calo with ref_z = " << z_ref << endmsg;
+	debug() << "TrackState at calo: " << ts_at_calo << endmsg;
       }
     }
   }
@@ -4064,7 +4069,7 @@ HelixClass * FullLDCTrackingAlg::GetExtrapolationHelix( TrackExtended * track) {
                                 ts_at_calo_forIP.tanLambda,
                                 _bField);
     
-    debug() << "FullLDCTrackingAlg::GetExtrapolationHelix helix created at IP" << endmsg;
+    debug() << "GetExtrapolationHelix helix created at IP, TrackState " << ts_at_calo_forIP << endmsg;
   }
   
   return helix;
@@ -4434,7 +4439,7 @@ void FullLDCTrackingAlg::AssignSiHitsToTracks(TrackerHitExtendedVec hitVec,
         int error = MarlinTrk::createFit( trkHits, marlin_trk, &pre_fit, _bField, !IMarlinTrack::backward , _maxChi2PerHit );
         
         if ( error != IMarlinTrack::success ) {
-          debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: creation of fit fails with error " << error << endmsg;
+          debug() << "AssignSiHitsToTracks: creation of fit fails with error " << error << endmsg;
           
           delete marlin_trk ;
           continue ;
@@ -4445,10 +4450,10 @@ void FullLDCTrackingAlg::AssignSiHitsToTracks(TrackerHitExtendedVec hitVec,
         
         float outlier_pct = outliers.size()/float(trkHits.size());
         
-        debug()<< "FullLDCTrackingAlg::AssignSiHitsToTracks: percentage of outliers " << outlier_pct << endmsg;
+        debug()<< "AssignSiHitsToTracks: percentage of outliers " << outlier_pct << endmsg;
         
         if ( outlier_pct > _maxAllowedPercentageOfOutliersForTrackCombination) {
-	  debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg;
+	  debug() << "AssignSiHitsToTracks: percentage of outliers " << outlier_pct << " is greater than cut maximum: " << _maxAllowedPercentageOfOutliersForTrackCombination << endmsg;
           delete marlin_trk ;
           continue ;
           
@@ -4463,19 +4468,19 @@ void FullLDCTrackingAlg::AssignSiHitsToTracks(TrackerHitExtendedVec hitVec,
         delete marlin_trk ;
         
         if ( error != IMarlinTrack::success ) {
-	  debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: propagate to IP fails with error " << error << endmsg;
+	  debug() << "AssignSiHitsToTracks: propagate to IP fails with error " << error << endmsg;
 	  continue ;
 	}
         
         if ( ndf < 0  ) {
-	  debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: Fit failed : NDF is less that zero  " << ndf << endmsg;
+	  debug() << "AssignSiHitsToTracks: Fit failed : NDF is less that zero  " << ndf << endmsg;
 	  continue ;
 	}
         
         float chi2Fit = chi2_D/float(ndf);
         
         if ( chi2Fit > _chi2FitCut ) {
-	  debug() << "FullLDCTrackingAlg::AssignSiHitsToTracks: track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " <<  chi2Fit << endmsg;
+	  debug() << "AssignSiHitsToTracks: track fail Chi2 cut of " << _chi2FitCut << " chi2 of track = " <<  chi2Fit << endmsg;
 	  continue ;
 	}
                 
@@ -5005,7 +5010,7 @@ int FullLDCTrackingAlg::SegmentRadialOverlap(TrackExtended* first, TrackExtended
 
 bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended* secondTrackExt){
     
-  debug() << "FullLDCTrackingAlg::VetoMerge called for " << firstTrackExt << " and " << secondTrackExt << endmsg;
+  debug() << "VetoMerge called for " << firstTrackExt << " and " << secondTrackExt << endmsg;
   
   const float d0First = firstTrackExt->getD0();
   const float z0First = firstTrackExt->getZ0();
@@ -5034,7 +5039,7 @@ bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended*
   const float pSecond = sqrt(pxSecond*pxSecond+pySecond*pySecond+pzSecond*pzSecond);
   
   if(pFirst<_vetoMergeMomentumCut || pSecond<_vetoMergeMomentumCut) {
-    debug() << "FullLDCTrackingAlg::VetoMerge do not veto as below momentum cut of 2.5 : pFirst = " << pFirst << " pSecond = " << pSecond << endmsg;
+    debug() << "VetoMerge do not veto as below momentum cut of 2.5 : pFirst = " << pFirst << " pSecond = " << pSecond << endmsg;
     return false;
   }
 
@@ -5046,7 +5051,7 @@ bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended*
   if(combinedTrack!=NULL){
     //SJA:FIXME hardcoded cut: here the check is that no more than 7 hits have been rejected in the combined fit.
     if( combinedTrack->getNDF()+15 < firstTrackExt->getNDF() + secondTrackExt->getNDF()+5 ) {
-      debug() << "FullLDCTrackingAlg::VetoMerge fails NDF cut " << endmsg;
+      debug() << "VetoMerge fails NDF cut " << endmsg;
       veto=true ;
     }
   
@@ -5055,12 +5060,12 @@ bool FullLDCTrackingAlg::VetoMerge(TrackExtended* firstTrackExt, TrackExtended*
 
   }
   else {
-    debug() << "FullLDCTrackingAlg::VetoMerge fails CombineTracks(firstTrackExt,secondTrackExt,true) test" << endmsg;
+    debug() << "VetoMerge fails CombineTracks(firstTrackExt,secondTrackExt,true) test" << endmsg;
     veto = true;
   }
   
   if(SegmentRadialOverlap(firstTrackExt,secondTrackExt)>10) {
-    debug() << "FullLDCTrackingAlg::VetoMerge fails SegmentRadialOverlap test " << endmsg;
+    debug() << "VetoMerge fails SegmentRadialOverlap test " << endmsg;
     veto=true;
   }
 
@@ -5129,7 +5134,7 @@ StatusCode FullLDCTrackingAlg::setupGeom(){
       _nLayersSIT = SIT_r.size();
       
       if (_nLayersSIT != SIT_r.size() || _nLayersSIT != SIT_hl.size()) {
-	fatal() << "FullLDCTrackingAlg Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__  << endmsg;
+	fatal() << "Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__  << endmsg;
         exit(1);
       }
     }
@@ -5189,7 +5194,7 @@ StatusCode FullLDCTrackingAlg::setupGeom(){
       _nLayersSET = SET_r.size() ;
       
       if (_nLayersSET != SET_r.size() || _nLayersSET != SET_hl.size()) {
-	fatal() << "FullLDCTrackingAlg Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__  << endmsg;
+	fatal() << "Miss-match between DoubleVec and nlayers exit(1) called from file " << __FILE__ << " line " << __LINE__  << endmsg;
         exit(1);
       }
     }
@@ -5334,8 +5339,29 @@ StatusCode FullLDCTrackingAlg::setupGeom(){
       }
     }
     _nLayersFTD =_zLayerFTD.size();
-  } catch(std::runtime_error& e){
-    warning() << e.what() << endmsg;
+  } catch(std::runtime_error& e1) {
+    info() << "try ZDiskPetalsData: " << e1.what() << endmsg;
+    try {
+      auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD));
+      auto ftdData = ftdDet.extension<dd4hep::rec::MultiRingsZDiskData>();
+      auto ftdlayers = ftdData->layers;
+      for (int layer = 0; layer < ftdlayers.size(); layer++) {
+	dd4hep::rec::MultiRingsZDiskData::LayerLayout& ftdlayer = ftdlayers[layer];
+	auto& ring = ftdlayer.rings[0];
+	// front petal even numbered
+	_zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm - 0.5*ftdlayer.thicknessSupport/dd4hep::mm
+			     - ring.thicknessGlue/dd4hep::mm - 0.5*ring.thicknessSensitive/dd4hep::mm);
+	if (ring.petalNumber > 0) {
+	  // front petal odd numbered
+	  _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm + ftdlayer.zOffsetSupport/dd4hep::mm + 0.5*ftdlayer.thicknessSupport/dd4hep::mm
+			       + ring.thicknessGlue/dd4hep::mm + 0.5*ring.thicknessSensitive/dd4hep::mm);
+	  _petalBasedFTDWithOverlaps = true;
+	}
+      }
+      _nLayersFTD =_zLayerFTD.size();
+    } catch(std::runtime_error& e2) {
+      warning() << "try MultiRingsZDiskData: " << e2.what() << endmsg;
+    }
   }
 
   _nLayersETD = 0;
diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp
index 9de3f481170a69256f9059ac0f2eb73e13d6d69d..267a6c6c9bd2510347c01a6b1bea78185cc716ec 100644
--- a/Service/GearSvc/src/GearSvc.cpp
+++ b/Service/GearSvc/src/GearSvc.cpp
@@ -92,6 +92,10 @@ StatusCode GearSvc::initialize()
       }
       else if(it->first=="FTD" || it->first=="ITKEndcap"){
         sc = convertFTD(sub);
+	if (sc.isRecoverable()) sc = convertMultiRingsZDisk(sub);
+	if (!sc.isSuccess()) {
+          error() << it->first << " extension not read" << endmsg;
+        }
       }
       else if(it->first=="SIT" || it->first=="ITKBarrel"){
 	sc = convertSIT(sub);
@@ -125,7 +129,7 @@ StatusCode GearSvc::initialize()
     }
     catch (...) {
       info() << "EcalBarrelParameters not create! create fake parameters (big size) now" << endmsg;
-      gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(2500, 4500, 8, 0.);
+      gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(1860, 2900, 32, 0.);
       barrelParam->layerLayout().positionLayer(0, 5.25, 10, 10, 2.1);
       m_gearMgr->setEcalBarrelParameters(barrelParam);
     }
@@ -134,7 +138,7 @@ StatusCode GearSvc::initialize()
     }
     catch (...) {
       info() << "EcalEndcapsParameters not create! create fake parameters (big size) now" << endmsg;
-      gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 3000, 4510, 2, 0.);
+      gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 2500, 2930, 2, 0.);
       endcapParam->layerLayout().positionLayer(0, 5.25, 10, 10, 2.1);
       m_gearMgr->setEcalEndcapParameters(endcapParam);
     }
@@ -178,7 +182,7 @@ StatusCode GearSvc::convertBeamPipe(dd4hep::DetElement& pipe){
   std::vector<double> gearValROuter;
   std::vector<double> gearValZ;
   const std::vector<dd4hep::rec::ConicalSupportData::Section>& sections = beamPipeData->sections;
-  for(int i=0;i<sections.size();i++){
+  for (unsigned i=0;i<sections.size();i++) {
     gearValZ.push_back(sections[i].zPos*CLHEP::cm );
     gearValRInner.push_back(sections[i].rInner*CLHEP::cm );
     gearValROuter.push_back(sections[i].rOuter*CLHEP::cm );
@@ -235,7 +239,7 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){
     }
 
     info() << vxdData->rInnerShell << " " << vxdData->rOuterShell << " " << vxdData->zHalfShell << " " << vxdData->gapShell << endmsg;
-    for(int i=0,n=vxdData->layers.size(); i<n; i++){
+    for (unsigned i=0,n=vxdData->layers.size(); i<n; i++) {
       const dd4hep::rec::ZPlanarData::LayerLayout& thisLayer = vxdData->layers[i];
       info() << i << ": " << thisLayer.ladderNumber << "," << thisLayer.phi0 << ","
 	     << thisLayer.distanceSupport/dd4hep::mm << "," << thisLayer.offsetSupport/dd4hep::mm << "," << thisLayer.thicknessSupport/dd4hep::mm << ","
@@ -395,7 +399,7 @@ StatusCode GearSvc::convertFTD(dd4hep::DetElement& ftd){
   }
   catch(std::runtime_error& e){
     warning() << e.what() << " " << ftdData << endmsg;
-    return StatusCode::FAILURE;
+    return StatusCode::RECOVERABLE;
   }
 
   std::vector<dd4hep::rec::ZDiskPetalsData::LayerLayout>& ftdlayers = ftdData->layers;
@@ -406,7 +410,7 @@ StatusCode GearSvc::convertFTD(dd4hep::DetElement& ftd){
   ftdParam->setDoubleVal("strip_length_mm", ftdData->lengthStrip*CLHEP::cm);
   ftdParam->setDoubleVal("strip_pitch_mm", ftdData->pitchStrip*CLHEP::cm);
   ftdParam->setDoubleVal("strip_angle_deg", ftdData->angleStrip*rad_to_deg);
-  for(int layer = 0; layer < nLayers; layer++){
+  for (int layer = 0; layer < nLayers; layer++) {
     dd4hep::rec::ZDiskPetalsData::LayerLayout& ftdlayer = ftdlayers[layer];
     int nPetals = ftdlayer.petalNumber;
     double dphi = CLHEP::twopi/nPetals;
@@ -443,6 +447,118 @@ StatusCode GearSvc::convertFTD(dd4hep::DetElement& ftd){
   return StatusCode::SUCCESS;
 }
 
+StatusCode GearSvc::convertMultiRingsZDisk(dd4hep::DetElement& ftd) {
+  dd4hep::rec::MultiRingsZDiskData* ftdData = nullptr;
+  try{
+    ftdData = ftd.extension<dd4hep::rec::MultiRingsZDiskData>();
+  }
+  catch(std::runtime_error& e){
+    warning() << e.what() << " " << ftdData << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  std::vector<dd4hep::rec::MultiRingsZDiskData::LayerLayout>& ftdlayers = ftdData->layers;
+  int nLayers = ftdlayers.size();
+
+  gear::GearParametersImpl* ftdParam = new gear::GearParametersImpl();
+  ftdParam->setDoubleVal("strip_width_mm", ftdData->widthStrip*CLHEP::cm);
+  ftdParam->setDoubleVal("strip_length_mm", ftdData->lengthStrip*CLHEP::cm);
+  ftdParam->setDoubleVal("strip_pitch_mm", ftdData->pitchStrip*CLHEP::cm);
+  ftdParam->setDoubleVal("strip_angle_deg", ftdData->angleStrip*rad_to_deg);
+
+  std::vector<double> alphaPetals, zPositions, zOffsetSupports, rminSupports, rmaxSupports, thicknessSupports;
+  std::vector<double> thicknessSensitives, thicknessGlues, thicknessServices;
+  std::vector<std::string> petalParNames, phi0ParNames, distanceParNames, widthInnerParNames, widthOuterParNames, lengthParNames;
+  for (int layer = 0; layer < nLayers; layer++) {
+    dd4hep::rec::MultiRingsZDiskData::LayerLayout& ftdlayer = ftdlayers[layer];
+
+    //std::bitset<32> typeFlags;
+    alphaPetals.push_back(ftdlayer.alphaPetal);
+    zPositions.push_back(ftdlayer.zPosition*CLHEP::cm);
+    zOffsetSupports.push_back(ftdlayer.zOffsetSupport*CLHEP::cm);
+    rminSupports.push_back(ftdlayer.rminSupport*CLHEP::cm);
+    rmaxSupports.push_back(ftdlayer.rmaxSupport*CLHEP::cm);
+    thicknessSupports.push_back(ftdlayer.thicknessSupport*CLHEP::cm);
+
+    auto& rings = ftdlayer.rings;
+
+    petalParNames.push_back(std::string("PetalNumber_")+std::to_string(layer));
+    phi0ParNames.push_back(std::string("PetalPhi0_")+std::to_string(layer));
+    distanceParNames.push_back(std::string("PetalDistance_")+std::to_string(layer));
+    widthInnerParNames.push_back(std::string("PetalInnerWidth_")+std::to_string(layer));
+    widthOuterParNames.push_back(std::string("PetalOuterWidth_")+std::to_string(layer));
+    lengthParNames.push_back(std::string("PetalLength_")+std::to_string(layer));
+
+    std::vector<int>    petalNumbers;
+    std::vector<double> phi0s, distances, widthInners, widthOuters, lengths;
+    for (unsigned iring = 0; iring < rings.size(); iring++) {
+      auto&  ring = rings[iring];
+
+      petalNumbers.push_back(ring.petalNumber);
+      //int    sensorsPerPetal;
+      phi0s.push_back(ring.phi0);
+      //double phiOffsetOdd;
+      distances.push_back(ring.distance*CLHEP::cm);
+      widthInners.push_back(ring.widthInner*CLHEP::cm);
+      widthOuters.push_back(ring.widthOuter*CLHEP::cm);
+      lengths.push_back(ring.length*CLHEP::cm);
+
+      if (iring==0) {
+	thicknessSensitives.push_back(ring.thicknessSensitive*CLHEP::cm);
+	thicknessGlues.push_back(ring.thicknessGlue*CLHEP::cm);
+	thicknessServices.push_back(ring.thicknessService*CLHEP::cm);
+      }
+    }
+    ftdParam->setIntVals(std::string("PetalNumber_")+std::to_string(layer), petalNumbers);
+    ftdParam->setDoubleVals(std::string("PetalPhi0_")+std::to_string(layer), phi0s);
+    ftdParam->setDoubleVals(std::string("PetalDistance_")+std::to_string(layer), distances);
+    ftdParam->setDoubleVals(std::string("PetalInnerWidth_")+std::to_string(layer), widthInners);
+    ftdParam->setDoubleVals(std::string("PetalOuterWidth_")+std::to_string(layer), widthOuters);
+    ftdParam->setDoubleVals(std::string("PetalLength_")+std::to_string(layer), lengths);
+
+    if (layer == 0) {
+      double zpos = ftdlayer.zPosition;
+      double zmin = zpos - 0.5*ftdlayer.thicknessSupport - rings[0].thicknessGlue - rings[0].thicknessSensitive - rings[0].thicknessService;
+
+      dd4hep::rec::Vector3D a1(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin);
+      dd4hep::rec::Vector3D b1(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin+rings[0].thicknessService);
+      gear::SimpleMaterialImpl* serviceMaterial = CreateGearMaterial(a1, b1, "ITKEndcapServiceMaterial");
+      m_gearMgr->registerSimpleMaterial(serviceMaterial);
+
+      zmin += rings[0].thicknessService + rings[0].thicknessSensitive;
+      dd4hep::rec::Vector3D a2(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin);
+      dd4hep::rec::Vector3D b2(rings[0].distance + 0.5*rings[0].length +2*dd4hep::mm, 2*dd4hep::mm, zmin+rings[0].thicknessGlue);
+      gear::SimpleMaterialImpl* glueMaterial = CreateGearMaterial(a2, b2, "ITKEndcapGlueMaterial");
+      m_gearMgr->registerSimpleMaterial(glueMaterial);
+
+      zmin += rings[0].thicknessGlue;
+      dd4hep::rec::Vector3D a3(0.5*(ftdlayer.rminSupport + ftdlayer.rmaxSupport), 0, zmin);
+      dd4hep::rec::Vector3D b3(0.5*(ftdlayer.rminSupport + ftdlayer.rmaxSupport), 0, zmin+ftdlayer.thicknessSupport);
+      gear::SimpleMaterialImpl* supportMaterial = CreateGearMaterial(a3, b3, "ITKEndcapSupportMaterial");
+      m_gearMgr->registerSimpleMaterial(supportMaterial);
+    }
+  }
+  ftdParam->setDoubleVals("AlphaPetals", alphaPetals);
+  ftdParam->setDoubleVals("ZPositions", zPositions);
+  ftdParam->setDoubleVals("ZOffsetSupport", zOffsetSupports);
+  ftdParam->setDoubleVals("RMinSupports", rminSupports);
+  ftdParam->setDoubleVals("RMaxSupports", rmaxSupports);
+  ftdParam->setDoubleVals("ThicknessSupports", thicknessSupports);
+  ftdParam->setDoubleVals("ThicknessSensitives", thicknessSensitives);
+  ftdParam->setDoubleVals("ThicknessGlues", thicknessGlues);
+  ftdParam->setDoubleVals("ThicknessServices", thicknessServices);
+  ftdParam->setStringVals("PetalNumberNames", petalParNames);
+  ftdParam->setStringVals("PetalPhi0Names", phi0ParNames);
+  ftdParam->setStringVals("PetalDistanceNames", distanceParNames);
+  ftdParam->setStringVals("PetalInnerWidthNames", widthInnerParNames);
+  ftdParam->setStringVals("PetalOuterWidthNames", widthOuterParNames);
+  ftdParam->setStringVals("PetalLengthNames", lengthParNames);
+
+  m_gearMgr->setGearParameters("ITKEndcapParameters", ftdParam);
+  info() << "nftd = " << nLayers << endmsg;
+  return StatusCode::SUCCESS;
+}
+
 StatusCode GearSvc::convertETD(dd4hep::DetElement& etd){
   dd4hep::rec::ZDiskPetalsData* etdData = nullptr;
   try{
@@ -464,7 +580,7 @@ StatusCode GearSvc::convertETD(dd4hep::DetElement& etd){
 
   std::vector<int> nPetals, nSensors;
   std::vector<double> petalangles, phi0s, alphas, zpositions, zoffsets, supRinners, supThicknesss, supHeights, senRinners, senThicknesss, senHeights;
-  for(int layer = 0; layer < nLayers; layer++){
+  for (int layer = 0; layer < nLayers; layer++) {
     dd4hep::rec::ZDiskPetalsData::LayerLayout& etdlayer = etdlayers[layer];
     nPetals.push_back(etdlayer.petalNumber);
     petalangles.push_back(etdlayer.petalHalfAngle*2);
@@ -504,7 +620,7 @@ StatusCode GearSvc::convertETD(dd4hep::DetElement& etd){
   m_gearMgr->registerSimpleMaterial(ETDSupportMaterial);
 
   m_gearMgr->setGearParameters("ETDParameters", etdParam);
-  info() << "nftd = " << nLayers << endmsg;
+  info() << "netd = " << nLayers << endmsg;
   return StatusCode::SUCCESS;
 }
 
@@ -699,7 +815,7 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){
       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(nodeName.find("chamber_vol")!=std::string::npos||nodeName.find("assembly")!=std::string::npos){
 	if(grid){
 	  // if more than one chamber, just use the outer, TODO
 	  dcData->rMinReadout = grid->DC_rbegin();
@@ -710,11 +826,11 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){
 	}
 	else{
 	  TGeoNode* next = daughter;
-	  if(nodeName.find("assembly")!=-1){
+	  if(nodeName.find("assembly")!=std::string::npos){
 	    // 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){
+	    if(s.find("chamber_vol")==std::string::npos){
 	      error() << s << " not chamber_vol" << endmsg;
 	      is_convert = false;
 	    }
@@ -760,7 +876,7 @@ StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){
 	  dcData->padWidth  = dcData->padHeight;
 	}
       }
-      else if(nodeName.find("wall_vol")!=-1){
+      else if(nodeName.find("wall_vol")!=std::string::npos){
 	const TGeoShape* wall_shape = daughter->GetVolume()->GetShape();
         if(wall_shape->TestShapeBit(TGeoTube::kGeoTube)){
           const TGeoTube* tube = (const TGeoTube*) wall_shape;
@@ -837,6 +953,12 @@ StatusCode GearSvc::convertSET(dd4hep::DetElement& set){
   setParams->setDoubleVal("strip_length_mm", setData->lengthStrip*CLHEP::cm);
   setParams->setDoubleVal("strip_pitch_mm",  setData->pitchStrip*CLHEP::cm);
   setParams->setDoubleVal("strip_angle_deg", strip_angle_deg);
+  if (set.path().find("OTKBarrel") != std::string::npos) {
+    m_presentSensorOTK = false;
+    setParams->setIntVal("OTKBarrel", 1);
+  }
+  else m_presentSensorOTK = true;
+
   std::vector<int> n_sensors_per_ladder;
   for( int layer=0; layer < nLayers; layer++){
     dd4hep::rec::ZPlanarData::LayerLayout& layout = setlayers[layer];
@@ -853,7 +975,7 @@ StatusCode GearSvc::convertSET(dd4hep::DetElement& set){
     double senThickness = layout.thicknessSensitive*CLHEP::cm;
     double senHalfLength = layout.zHalfSensitive*CLHEP::cm;
     double senWidth = layout.widthSensitive*CLHEP::cm;
-    int nSensorsPerLadder = layout.sensorsPerLadder;
+    int nSensorsPerLadder = m_presentSensorOTK ? layout.sensorsPerLadder : 1;
     double stripAngle = strip_angle_deg*CLHEP::degree;
     n_sensors_per_ladder.push_back(nSensorsPerLadder);
 
@@ -912,25 +1034,25 @@ StatusCode GearSvc::convertCal(dd4hep::DetElement& cal) {
       param->layerLayout().positionLayer(0, thickness, cellsize0, cellsize1, absorberThickness);
     }
     if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::BarrelLayout) {
-      if (name.find("Ecal")!=-1)      m_gearMgr->setEcalBarrelParameters(param);
-      else if (name.find("Hcal")!=-1) m_gearMgr->setHcalBarrelParameters(param);
-      else if (name.find("Yoke")!=-1) m_gearMgr->setYokeBarrelParameters(param);
+      if (name.find("Ecal")!=std::string::npos)      m_gearMgr->setEcalBarrelParameters(param);
+      else if (name.find("Hcal")!=std::string::npos) m_gearMgr->setHcalBarrelParameters(param);
+      else if (name.find("Yoke")!=std::string::npos) m_gearMgr->setYokeBarrelParameters(param);
       else m_gearMgr->setGearParameters("CoilParameters", param);
 
       info() << "BarrelParameters set " << name << endmsg;
     }
     else if (calData->layoutType==dd4hep::rec::LayeredCalorimeterData::EndcapLayout) {
       if (name.find("Endcap")) {
-	if (name.find("Ecal")!=-1)      m_gearMgr->setEcalEndcapParameters(param);
-	else if (name.find("Hcal")!=-1) m_gearMgr->setHcalEndcapParameters(param);
-	else if (name.find("Yoke")!=-1) m_gearMgr->setYokeEndcapParameters(param);
+	if (name.find("Ecal")!=std::string::npos)      m_gearMgr->setEcalEndcapParameters(param);
+	else if (name.find("Hcal")!=std::string::npos) m_gearMgr->setHcalEndcapParameters(param);
+	else if (name.find("Yoke")!=std::string::npos) m_gearMgr->setYokeEndcapParameters(param);
 
 	info() << "EndcapParameters set" << name << endmsg;
       }
       else {
-	if (name.find("Ecal")!=-1)      m_gearMgr->setEcalPlugParameters(param);
-	else if (name.find("Hcal")!=-1) m_gearMgr->setHcalRingParameters(param);
-	else if (name.find("Yoke")!=-1) m_gearMgr->setYokePlugParameters(param);
+	if (name.find("Ecal")!=std::string::npos)      m_gearMgr->setEcalPlugParameters(param);
+	else if (name.find("Hcal")!=std::string::npos) m_gearMgr->setHcalRingParameters(param);
+	else if (name.find("Yoke")!=std::string::npos) m_gearMgr->setYokePlugParameters(param);
 
 	info() << "Plug(Ring)Parameters set" << name << endmsg;
       }
@@ -950,7 +1072,7 @@ TGeoNode* GearSvc::FindNode(TGeoNode* mother, char* name) {
       TGeoNode* daughter = mother->GetDaughter(i);
       std::string s = daughter->GetName();
       //info() << "current: " << s << " search for" << name << endmsg;
-      if(s.find(name)!=-1){
+      if(s.find(name)!=std::string::npos){
         next = daughter;
         break;
       }
@@ -968,15 +1090,15 @@ gear::SimpleMaterialImpl* GearSvc::CreateGearMaterial(const dd4hep::rec::Vector3
   dd4hep::rec::MaterialManager matMgr( dd4hep::Detector::getInstance().world().volume() );
 
   // 0.0005 mm make sure don't loss material because of precision
-  dd4hep::rec::Vector3D safe_env = (a.z() == b.z()) ? dd4hep::rec::Vector3D(0.0005*dd4hep::mm, 0, 0) : dd4hep::rec::Vector3D(0, 0, 0.0005*dd4hep::mm);
+  dd4hep::rec::Vector3D safe_env = (a.z() == b.z()) ? dd4hep::rec::Vector3D(0.0005*dd4hep::mm, 0, 0) : dd4hep::rec::Vector3D(0, 0, 0.0001*dd4hep::mm);
   const dd4hep::rec::MaterialVec& materials = matMgr.materialsBetween(a-safe_env, b+safe_env);
   dd4hep::rec::MaterialData mat = (materials.size() > 1) ? matMgr.createAveragedMaterial(materials) : materials[0].first;
   
-  debug() << " ####### found materials between points : " << a << " and " << b << " ######" << endmsg;
+  debug() << "#### found materials between points : " << a << " and " << b << " ####" << endmsg;
   for (unsigned i=0,n=materials.size(); i<n; ++i) {
-    debug() <<  materials[i].first.name() << " [" <<   materials[i].second << "]" << endmsg;
+    debug() <<  "     " << materials[i].first.name() << " [" <<   materials[i].second << "]" << endmsg;
   }
-  debug() << "   averaged material : " << mat << endmsg;
+  debug() << "    -> averaged material : " << mat << endmsg;
   gear::SimpleMaterialImpl* gearMaterial = new gear::SimpleMaterialImpl(name.c_str(), mat.A(), mat.Z(),
 									mat.density()/(dd4hep::kg/(dd4hep::g*dd4hep::m3)),
 									mat.radiationLength()/dd4hep::mm,
diff --git a/Service/GearSvc/src/GearSvc.h b/Service/GearSvc/src/GearSvc.h
index eb15e19b5ebaffa5cc83453d08862f1e0bd5fe93..5af9be6469b4f679274e9f114e0743e0c7059c02 100644
--- a/Service/GearSvc/src/GearSvc.h
+++ b/Service/GearSvc/src/GearSvc.h
@@ -10,35 +10,37 @@ class TGeoNode;
 
 class GearSvc : public extends<Service, IGearSvc>
 {
-    public:
-        GearSvc(const std::string& name, ISvcLocator* svc);
-        virtual ~GearSvc();
-
-        gear::GearMgr* getGearMgr() override;
-
-        StatusCode initialize() override;
-        StatusCode finalize() override;
-
-    private:
-	StatusCode convertBeamPipe(dd4hep::DetElement& pipe);
-	StatusCode convertVXD(dd4hep::DetElement& vxd);
-	StatusCode convertStitching(dd4hep::DetElement& vtx);
-	StatusCode convertComposite(dd4hep::DetElement& vtx);
-	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);
-	StatusCode convertETD(dd4hep::DetElement& etd);
-	StatusCode convertCal(dd4hep::DetElement& cal);
-	TGeoNode* FindNode(TGeoNode* mother, char* name);
-	gear::SimpleMaterialImpl* CreateGearMaterial(const dd4hep::rec::Vector3D& a, const dd4hep::rec::Vector3D& b, const std::string name);
-
-        Gaudi::Property<std::string> m_gearFile{this, "GearXMLFile", ""};
-	Gaudi::Property<std::string> m_outputFile{this, "GearOutput", ""};
-        Gaudi::Property<float>       m_field{this, "MagneticField", 0};
-
-        gear::GearMgr* m_gearMgr;
+public:
+  GearSvc(const std::string& name, ISvcLocator* svc);
+  virtual ~GearSvc();
+
+  gear::GearMgr* getGearMgr() override;
+
+  StatusCode initialize() override;
+  StatusCode finalize() override;
+
+private:
+  StatusCode convertBeamPipe(dd4hep::DetElement& pipe);
+  StatusCode convertVXD(dd4hep::DetElement& vxd);
+  StatusCode convertStitching(dd4hep::DetElement& vtx);
+  StatusCode convertComposite(dd4hep::DetElement& vtx);
+  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);
+  StatusCode convertMultiRingsZDisk(dd4hep::DetElement& ftd);
+  StatusCode convertETD(dd4hep::DetElement& etd);
+  StatusCode convertCal(dd4hep::DetElement& cal);
+  TGeoNode* FindNode(TGeoNode* mother, char* name);
+  gear::SimpleMaterialImpl* CreateGearMaterial(const dd4hep::rec::Vector3D& a, const dd4hep::rec::Vector3D& b, const std::string name);
+
+  Gaudi::Property<std::string> m_gearFile{this, "GearXMLFile", ""};
+  Gaudi::Property<std::string> m_outputFile{this, "GearOutput", ""};
+  Gaudi::Property<float>       m_field{this, "MagneticField", 0};
+  Gaudi::Property<bool>        m_presentSensorOTK{this, "PresentSensor", false};
+
+  gear::GearMgr* m_gearMgr;
 };
 
 #endif
diff --git a/Service/TrackSystemSvc/src/MarlinKalTest.cc b/Service/TrackSystemSvc/src/MarlinKalTest.cc
index 8ff54501a3850f0f1c8386ac7a336b518a1248a3..36ba7c15b22d7410b00ba628b6eced2556f2ebea 100644
--- a/Service/TrackSystemSvc/src/MarlinKalTest.cc
+++ b/Service/TrackSystemSvc/src/MarlinKalTest.cc
@@ -12,6 +12,7 @@
 #include "kaldet/CEPCVTXKalDetector.h"
 #include "kaldet/ILDSITKalDetector.h"
 #include "kaldet/CEPCITKKalDetector.h"
+#include "kaldet/CEPCITKEndcapKalDetector.h"
 #include "kaldet/ILDSITCylinderKalDetector.h"
 #include "kaldet/ILDSETKalDetector.h"
 #include "kaldet/CEPCOTKKalDetector.h"
@@ -37,7 +38,7 @@
 
 #include <utility>
 
-//#include "streamlog/streamlog.h"
+#include "streamlog/streamlog.h"
 
 #include "kaldet/ILDMeasurementSurfaceStoreFiller.h"
 
@@ -48,7 +49,7 @@ namespace MarlinTrk{
   _gearMgr( &gearMgr ),
   _geoSvc(geoSvc){
     
-    //streamlog_out( DEBUG4 ) << "  MarlinKalTest - initializing the detector ..." << std::endl ;
+    streamlog_out( DEBUG4 ) << "  MarlinKalTest - initializing the detector ..." << std::endl ;
     
     _det = new TKalDetCradle ; // from kaltest. TKalDetCradle inherits from TObjArray ... 
     _det->SetOwner( true ) ; // takes care of deleting subdetector in the end ...
@@ -57,9 +58,7 @@ namespace MarlinTrk{
     
     this->registerOptions() ;
     
-    //streamlog_out( DEBUG4 ) << "  MarlinKalTest - established " << std::endl ;
-    
-    
+    streamlog_out( DEBUG4 ) << "  MarlinKalTest - established " << std::endl ;
   }
 
   MarlinKalTest::~MarlinKalTest(){
@@ -74,8 +73,7 @@ namespace MarlinTrk{
   
   void MarlinKalTest::init() {
     
-    //std::cout << "debug: MarlinKalTest - call  this init " << std::endl ;
-    //ILDSITKalDetector* sitdet = new ILDSITKalDetector( *_gearMgr, _geoSvc )  ;
+    streamlog_out( DEBUG4 ) << " MarlinKalTest - call  this init " << std::endl ;
     
     MeasurementSurfaceStore& surfstore = _gearMgr->getMeasurementSurfaceStore();
     
@@ -83,12 +81,13 @@ namespace MarlinTrk{
     if( surfstore.isFilled() == false ) {
 
       ILDMeasurementSurfaceStoreFiller filler( *_gearMgr );
-      //streamlog_out( DEBUG4 ) << "  MarlinKalTest - set up gear surface store using " << filler.getName() << std::endl ;
+      streamlog_out( DEBUG4 ) << "  MarlinKalTest - set up gear surface store using " << filler.getName() << std::endl ;
       surfstore.FillStore(&filler);
       
     }
     else {
-      //std::cout << "debug: MarlinKalTest - MeasurementSurfaceStore is already full. Using store as filled by MeasurementSurfaceStoreFiller " << surfstore.getFillerName() << std::endl ;
+      streamlog_out( DEBUG4 ) << "  MarlinKalTest - MeasurementSurfaceStore is already full. Using store as filled by MeasurementSurfaceStoreFiller "
+			      << surfstore.getFillerName() << std::endl ;
     }
     
     if (_gearMgr -> getDetectorName() == "LPTPC") {
@@ -99,7 +98,7 @@ namespace MarlinTrk{
         _det->Install( *tpcdet ) ;
       }
       catch( gear::UnknownParameterException& e){
-        //streamlog_out( MESSAGE ) << "  MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ;
+        streamlog_out( MESSAGE ) << "  MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ;
       }
     }
     else {
@@ -113,7 +112,7 @@ namespace MarlinTrk{
         _det->Install( *supportdet ) ;
       }
       catch( gear::UnknownParameterException& e){
-	std::cout << "Error: " << "MarlinKalTest - Support Material missing in gear file: Cannot proceed as propagations and extrapolations for cannonical track states are impossible: exit(1) called" << std::endl ;
+	streamlog_out( ERROR ) << "  MarlinKalTest - Support Material missing in gear file: Cannot proceed as propagations and extrapolations for cannonical track states are impossible: exit(1) called" << std::endl ;
         exit(1);
       }
 
@@ -125,7 +124,7 @@ namespace MarlinTrk{
         _det->Install( *vxddet ) ;
       }
       catch( gear::UnknownParameterException& e){
-	std::cout << "Warning: " << "  MarlinKalTest - VXD missing in gear file: VXD Material Not Built " << std::endl ;
+	streamlog_out( WARNING ) << "  MarlinKalTest - VXD missing in gear file: VXD Material Not Built " << std::endl ;
       }
       
       bool SIT_found = false ;
@@ -138,7 +137,7 @@ namespace MarlinTrk{
         SIT_found = true ;
       }
       catch( gear::UnknownParameterException& e){
-        //streamlog_out( MESSAGE ) << "  MarlinKalTest - SIT missing in gear file: SIT Not Built " << std::endl ;
+	streamlog_out( WARNING ) << "  MarlinKalTest - SIT missing in gear file: SIT Not Built " << std::endl ;
       }
 
       if( ! SIT_found ){
@@ -149,19 +148,32 @@ namespace MarlinTrk{
           _det->Install( *sitdet ) ;
         }
         catch( gear::UnknownParameterException& e){
-	  std::cout << "Warning: " << "  MarlinKalTest - Simple Cylinder Based SIT missing in gear file: Simple Cylinder Based SIT Not Built " << std::endl ;
+	  streamlog_out( WARNING ) << "  MarlinKalTest - Simple Cylinder Based SIT missing in gear file: Simple Cylinder Based SIT Not Built " << std::endl ;
         }
       }
 
+      bool SET_found = false;
       try{
-        //ILDSETKalDetector* setdet = new ILDSETKalDetector( *_gearMgr, _geoSvc );
 	CEPCOTKKalDetector* setdet = new CEPCOTKKalDetector(*_gearMgr, _geoSvc);
         // store the measurement layer id's for the active layers
         this->storeActiveMeasurementModuleIDs(setdet);
         _det->Install( *setdet ) ;
+	SET_found = true;
       }
       catch( gear::UnknownParameterException& e){
-	std::cout << "Warning: " << "  MarlinKalTest - SET missing in gear file: SET Not Built " << std::endl ;
+	streamlog_out( WARNING ) << "  MarlinKalTest - OTKBarrel missing in gear file: Not Built " << std::endl ;
+      }
+
+      if(!SET_found) {
+	try {
+	  ILDSETKalDetector* setdet = new ILDSETKalDetector( *_gearMgr, _geoSvc );
+	  this->storeActiveMeasurementModuleIDs(setdet);
+	  _det->Install( *setdet ) ;
+	  SET_found = true;
+	}
+	catch( gear::UnknownParameterException& e){
+	  streamlog_out( WARNING ) << "  MarlinKalTest - SET missing in gear file: SET Not Built " << std::endl ;
+	}
       }
 
       bool FTD_found = false ;
@@ -173,7 +185,18 @@ namespace MarlinTrk{
         FTD_found = true ;
       }
       catch( gear::UnknownParameterException& e){
-	std::cout << "Warning: " << "  MarlinKalTest - Petal Based FTD missing in gear file: Petal Based FTD Not Built " << std::endl ;
+	streamlog_out( WARNING ) << "  MarlinKalTest - Petal Based FTD missing in gear file: Petal Based FTD Not Built " << std::endl ;
+      }
+
+      try{
+        CEPCITKEndcapKalDetector* ftddet = new CEPCITKEndcapKalDetector(*_gearMgr, _geoSvc);
+	// store the measurement layer id's for the active layers
+        this->storeActiveMeasurementModuleIDs(ftddet);
+	_det->Install(*ftddet);
+        FTD_found = true;
+      }
+      catch( gear::UnknownParameterException& e){
+	streamlog_out( WARNING ) << "  MarlinKalTest - Multi Ring Based Discs missing in gear file: ITKEncap Not Built " << std::endl ;
       }
 
       if( ! FTD_found ){
@@ -184,7 +207,7 @@ namespace MarlinTrk{
           _det->Install( *ftddet ) ;
         }
         catch( gear::UnknownParameterException& e){
-	  std::cout << "Warning: " << "  MarlinKalTest - Simple Disc Based FTD missing in gear file: Simple Disc Based FTD Not Built " << std::endl ;
+	  streamlog_out( WARNING ) << "  MarlinKalTest - All three type FTD missing in gear file: FTD Not Built " << std::endl;
         }
       }
 
@@ -195,7 +218,7 @@ namespace MarlinTrk{
         _det->Install(*etddet);
       }
       catch( gear::UnknownParameterException& e){
-	std::cout << "Warning: " << "  MarlinKalTest - ETD missing in gear file: Petal Based ETD Not Built " << std::endl;
+	streamlog_out( WARNING ) << "  MarlinKalTest - ETD missing in gear file: Petal Based ETD Not Built " << std::endl;
       }
       
       try{
@@ -205,7 +228,7 @@ namespace MarlinTrk{
         _det->Install( *tpcdet ) ;
       }
       catch( gear::UnknownParameterException& e){   
-	std::cout << "Warning: " << "  MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ;
+	streamlog_out( WARNING ) << "  MarlinKalTest - TPC missing in gear file: TPC Not Built " << std::endl ;
       }
       
     }
@@ -213,20 +236,18 @@ namespace MarlinTrk{
     _det->Close() ;          // close the cradle
     _det->Sort() ;           // sort meas. layers from inside to outside
     
-    //streamlog_out( DEBUG4 ) << "  MarlinKalTest - number of layers = " << _det->GetEntriesFast() << std::endl ;
+    streamlog_out( DEBUG4 ) << "  MarlinKalTest - number of layers = " << _det->GetEntriesFast() << std::endl ;
     
-    //streamlog_out( DEBUG4 ) << "Options: " << std::endl << this->getOptions() << std::endl ;
+    streamlog_out( DEBUG4 ) << "Options: " << std::endl << this->getOptions() << std::endl ;
     
     this->includeMultipleScattering( getOption(IMarlinTrkSystem::CFG::useQMS) ) ;  
     this->includeEnergyLoss( getOption(IMarlinTrkSystem::CFG::usedEdx) ) ; 
     
-    
     is_initialised = true; 
-    
   }
   
   MarlinTrk::IMarlinTrack* MarlinKalTest::createTrack()  {
-    //std::cout << "fucd " << "creatTrack" << std::endl;
+
     if ( ! is_initialised ) {
       std::stringstream errorMsg;
       errorMsg << "MarlinKalTest::createTrack: Fitter not initialised. MarlinKalTest::init() must be called before MarlinKalTest::createTrack()" << std::endl ; 
@@ -268,16 +289,13 @@ namespace MarlinTrk{
       
     }
     
-    //streamlog_out( DEBUG0 ) << "MarlinKalTest::getSensitiveMeasurementModulesForLayer: layerID = " << layerID << std::endl;
+    streamlog_out( DEBUG0 ) << "MarlinKalTest::getSensitiveMeasurementModulesForLayer: layerID = " << layerID << std::endl;
     
     std::multimap<Int_t, const ILDVMeasLayer *>::const_iterator it; //Iterator to be used along with ii
     
-    
-    
-    //  for(it = _active_measurement_modules_by_layer.begin(); it != _active_measurement_modules_by_layer.end(); ++it) {
-    //    streamlog_out( DEBUG0 ) << "Key = "<< ttdecodeILD(it->first) <<"    Value = "<<it->second << std::endl ;
-    //  }
-    
+    for(it = _active_measurement_modules_by_layer.begin(); it != _active_measurement_modules_by_layer.end(); ++it) {
+      streamlog_out( DEBUG0 ) << "Key = "<< it->first <<"    Value = "<<it->second << std::endl ;
+    }
     
     std::pair<std::multimap<Int_t, const ILDVMeasLayer *>::const_iterator, std::multimap<Int_t, const ILDVMeasLayer *>::const_iterator> ii;  
     
@@ -291,7 +309,7 @@ namespace MarlinTrk{
     ii = this->_active_measurement_modules_by_layer.equal_range(layerID); // set the first and last entry in ii;
     
     for(it = ii.first; it != ii.second; ++it) {
-      //    streamlog_out( DEBUG0 ) <<"Key = "<< it->first <<"    Value = "<<it->second << std::endl ;
+      streamlog_out( DEBUG0 ) <<"Key = "<< it->first <<"    Value = "<<it->second << std::endl ;
       measmodules.push_back( it->second ) ; 
     }
     
@@ -314,7 +332,7 @@ namespace MarlinTrk{
     
     
     for(it = ii.first; it != ii.second; ++it) {
-      //      std::cout<<"Key = "<<it->first<<"    Value = "<<it->second << std::endl ;
+      streamlog_out( DEBUG0 ) <<"Key = "<<it->first<<"    Value = "<<it->second << std::endl ;
       measmodules.push_back( it->second ) ; 
     }
   }
@@ -374,8 +392,8 @@ namespace MarlinTrk{
     
     int mode = isfwd ? -1 : +1 ;
     
-    //  streamlog_out( DEBUG4 ) << "  MarlinKalTest - getLastMeasLayer deflection to point = " << deflection_to_point << " kappa = " << helix.GetKappa()  << "  mode = " << mode << std::endl ;
-    //  streamlog_out( DEBUG4 ) << " Point to move to:" << std::endl;
+    streamlog_out( DEBUG4 ) << "  MarlinKalTest - getLastMeasLayer deflection to point = " << deflection_to_point << " kappa = " << helix.GetKappa()  << "  mode = " << mode << std::endl ;
+    streamlog_out( DEBUG4 ) << " Point to move to:" << std::endl;
     //  point.Print();
     
     int nsufaces =  _det->GetEntriesFast();
@@ -401,17 +419,17 @@ namespace MarlinTrk{
         
         if( deflection < min_deflection ) {
           
-          //      streamlog_out( DEBUG4 ) << "  MarlinKalTest - crossing found for suface = " << ml.GetMLName() 
-          //                              << std::endl
-          //                              << "  min_deflection = " << min_deflection
-          //                              << "  deflection = " << deflection
-          //                              << "  deflection angle = " << defection_angle 
-          //                              << std::endl 
-          //                              << " x = " << crossing_point.X() 
-          //                              << " y = " << crossing_point.Y() 
-          //                              << " z = " << crossing_point.Z() 
-          //                              << " r = " << crossing_point.Perp() 
-          //                              << std::endl ;
+	  streamlog_out( DEBUG4 ) << "  MarlinKalTest - crossing found for suface = " << ml.GetName() 
+				  << std::endl
+				  << "  min_deflection = " << min_deflection
+				  << "  deflection = " << deflection
+				  << "  deflection angle = " << defection_angle 
+				  << std::endl 
+				  << " x = " << crossing_point.X() 
+				  << " y = " << crossing_point.Y() 
+				  << " z = " << crossing_point.Z() 
+				  << " r = " << crossing_point.Perp() 
+				  << std::endl ;
           
           min_deflection = deflection ;
           ml_retval = &ml ;
@@ -496,24 +514,22 @@ namespace MarlinTrk{
         
       }
       if( ! surf_found ){ // print out debug info
-	/*
+	
         streamlog_out(DEBUG1) << "MarlinKalTest::findMeasLayer point not found to be on any surface matching moduleID = "
-        << detElementID
-        << ": x = " << point.x()
-        << " y = " << point.y()
-        << " z = " << point.z()
-        << std::endl ;
-	*/
+			      << detElementID
+			      << ": x = " << point.x()
+			      << " y = " << point.y()
+			      << " z = " << point.z()
+			      << std::endl ;
       }
       else{
-	/*
+	
         streamlog_out(DEBUG1) << "MarlinKalTest::findMeasLayer point found to be on surface matching moduleID = "
-        << detElementID
-        << ": x = " << point.x()
-        << " y = " << point.y()
-        << " z = " << point.z()
-        << std::endl ;
-	*/
+			      << detElementID
+			      << ": x = " << point.x()
+			      << " y = " << point.y()
+			      << " z = " << point.z()
+			      << std::endl ;
       }
     }
     
diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
index 78ea5973add29bed6a9bd2ccd1621ad3baf81fc0..e98a208abcf19f5dc7f1e77b245194a38913a401 100644
--- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
+++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
@@ -63,8 +63,9 @@ private:
     // the name here is without suffix "Collection"
     Gaudi::Property<std::vector<std::string>> m_trackerColNames{this, 
         "TrackerCollections",
-        {"VXD", "FTD", "SIT", "TPC", "TPCLowPt", "TPCSpacePoint", "SET", 
-         "ITKBarrel", "OTKBarrel", "OTKEndcap", "COIL", "MuonBarrel", "MuonEndcap"}, 
+	{"VXD", "ITKBarrel", "ITKEndcap", "TPC", "TPCLowPt", "TPCSpacePoint",
+	 "OTKBarrel", "OTKEndcap", "COIL", "MuonBarrel", "MuonEndcap",
+	 "SIT", "SET", "FTD"},
         "Names of the Tracker collections (without suffix Collection)"};
     Gaudi::Property<std::vector<std::string>> m_calorimeterColNames{this, 
         "CalorimeterCollections",
diff --git a/Utilities/KalDet/include/kaldet/CEPCITKEndcapKalDetector.h b/Utilities/KalDet/include/kaldet/CEPCITKEndcapKalDetector.h
new file mode 100644
index 0000000000000000000000000000000000000000..2889dd9b9c2906adacc35e5389aaa0771cf15dfb
--- /dev/null
+++ b/Utilities/KalDet/include/kaldet/CEPCITKEndcapKalDetector.h
@@ -0,0 +1,40 @@
+#ifndef __CEPCITKENDCAPDETECTOR__
+#define __CEPCITKENDCAPDETECTOR__
+
+/** Multi rings by petals in each layer
+ * WARNING: Still very experimental
+ *
+ * @author C.D.Fu IHEP
+ */
+
+#include "kaltest/TVKalDetector.h"
+#include "DetIdentifier/CEPCDetectorData.h"
+
+class IGeomSvc;
+
+namespace gear{
+  class GearMgr ;
+}
+
+class CEPCITKEndcapKalDetector : public TVKalDetector {
+ public:
+  /** Initialize the ITKEndcap from GEAR or GeomSvc*/
+  CEPCITKEndcapKalDetector(const gear::GearMgr& gearMgr, IGeomSvc* geoSvc);
+
+ private:
+
+  void build();
+
+  /**
+   * @param zpos the z position of the center of support
+   */
+  void create_segmented_disk_layers(int idisk, int iring, int nsegments, bool even_petals, double phi0, double zpos);
+
+  void setupGearGeom(const gear::GearMgr& gearMgr);
+  void setupGearGeom(IGeomSvc* geoSvc);
+
+  double _bZ;
+
+  dd4hep::rec::MultiRingsZDiskData _disksData;
+};
+#endif
diff --git a/Utilities/KalDet/src/ild/common/MaterialDataBase.cc b/Utilities/KalDet/src/ild/common/MaterialDataBase.cc
index 35281e92cc8ac7ce184e491e22d7b2e9f81b27c6..49f04a4234588ee8721f465d51f93b21bb464133 100644
--- a/Utilities/KalDet/src/ild/common/MaterialDataBase.cc
+++ b/Utilities/KalDet/src/ild/common/MaterialDataBase.cc
@@ -324,6 +324,32 @@ void MaterialDataBase::createMaterials(const gear::GearMgr& gearMgr, IGeomSvc* g
     catch( gear::UnknownParameterException& e){
       std::cout << "Warning! cannot get material ITKEndcapSupportMaterial from GeomSvc! GearMgr=" << &gearMgr << std::endl;
     }
+    try {
+      const gear::SimpleMaterial& itk_glue_mat = gearMgr.getSimpleMaterial("ITKEndcapGlueMaterial");
+      A       = itk_glue_mat.getA();
+      Z       = itk_glue_mat.getZ();
+      density = itk_glue_mat.getDensity() * kg_m3TOg_cm3;
+      radlen  = itk_glue_mat.getRadLength() * mmTOcm;
+      name    = itk_glue_mat.getName() ;
+      TMaterial &itkglue = *new TMaterial(name.c_str(), "", A, Z, density, radlen, 0.);
+      this->addMaterial(&itkglue, name);
+    }
+    catch( gear::UnknownParameterException& e){
+      std::cout << "Warning! cannot get material ITKEndcapGlueMaterial from GeomSvc! GearMgr=" << &gearMgr << std::endl;
+    }
+    try {
+      const gear::SimpleMaterial& itk_service_mat = gearMgr.getSimpleMaterial("ITKEndcapServiceMaterial");
+      A       = itk_service_mat.getA();
+      Z       = itk_service_mat.getZ();
+      density = itk_service_mat.getDensity() * kg_m3TOg_cm3;
+      radlen  = itk_service_mat.getRadLength() * mmTOcm;
+      name    = itk_service_mat.getName() ;
+      TMaterial &itkservice = *new TMaterial(name.c_str(), "", A, Z, density, radlen, 0.);
+      this->addMaterial(&itkservice, name);
+    }
+    catch( gear::UnknownParameterException& e){
+      std::cout << "Warning! cannot get material ITKEndcapServiceMaterial from GeomSvc! GearMgr=" << &gearMgr << std::endl;
+    }
     try {
       const gear::SimpleMaterial& otk_support_mat = gearMgr.getSimpleMaterial("OTKBarrelSupportMaterial");
       A       = otk_support_mat.getA();
diff --git a/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc b/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc
new file mode 100644
index 0000000000000000000000000000000000000000..bb4b4c28bfebbeace3048dfdec6e12c0f414b94b
--- /dev/null
+++ b/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc
@@ -0,0 +1,261 @@
+
+#include "kaldet/CEPCITKEndcapKalDetector.h"
+#include "kaldet/MaterialDataBase.h"
+
+#include <sstream>
+
+#include "DetInterface/IGeomSvc.h"
+#include "DD4hep/Detector.h"
+#include "DD4hep/DD4hepUnits.h"
+#include "DDSegmentation/BitField64.h"
+
+#include "DetIdentifier/CEPCConf.h"
+
+#include "gear/GEAR.h"
+#include "gear/BField.h"
+#include "gearimpl/Util.h"
+
+#include "kaldet/ILDSegmentedDiscMeasLayer.h"
+#include "kaldet/ILDDiscMeasLayer.h"
+
+#include "streamlog/streamlog.h"
+#include "CLHEP/Units/SystemOfUnits.h"
+#include "TVector3.h"
+
+CEPCITKEndcapKalDetector::CEPCITKEndcapKalDetector( const gear::GearMgr& gearMgr, IGeomSvc* geoSvc ) : 
+TVKalDetector(300) {
+  streamlog_out(DEBUG1) << "CEPCITKEndcapKalDetector building ITKEndcap detector using GEAR " << std::endl;
+
+  MaterialDataBase::Instance().registerForService(gearMgr, geoSvc);
+  if(geoSvc){
+    setupGearGeom(geoSvc); 
+  }
+  else{
+    setupGearGeom(gearMgr);
+  }
+
+  this->build();
+
+  SetOwner();
+}
+
+void CEPCITKEndcapKalDetector::build() {
+  streamlog_out(DEBUG) << "CEPCITKEndcapKalDetector::build " << std::endl;
+
+  double eps = 1e-9;
+
+  int ndisks = _disksData.layers.size();
+  for (int idisk = 0; idisk < ndisks; idisk++) {
+    streamlog_out(DEBUG) << "CEPCITKEndcapKalDetector::build disk " << idisk << std::endl;
+
+    auto& disk  = _disksData.layers[idisk];
+    auto& rings = disk.rings;
+
+    double alphaPetal       = disk.alphaPetal;
+    double zPosition        = disk.zPosition;
+    double zOffset          = disk.zOffsetSupport;
+    double rminSupport      = disk.rminSupport;
+    double rmaxSupport      = disk.rmaxSupport;
+    double thicknessSupport = disk.thicknessSupport;
+    int nrings = rings.size();
+    for (int iring = 0; iring < nrings; iring++) {
+      auto& ring = rings[iring];
+
+      int npetals       = ring.petalNumber;
+      double phi0       = ring.phi0;
+      double distance   = ring.distance;
+      double widthInner = ring.widthInner;
+      double widthOuter = ring.widthOuter;
+      double length     = ring.length;
+
+      int nsegments = npetals/2;
+      this->create_segmented_disk_layers(idisk, iring, nsegments, true, phi0,  zPosition);
+      this->create_segmented_disk_layers(idisk, iring, nsegments, true, phi0, -zPosition);
+
+      // odd segements
+      // update phi0 by the angular distance of one petal
+      phi0 -= 2.0 * M_PI / npetals;
+      this->create_segmented_disk_layers(idisk, iring, nsegments, false, phi0,  zPosition);
+      this->create_segmented_disk_layers(idisk, iring, nsegments, false, phi0, -zPosition);
+    }
+    
+    TMaterial& air     = *MaterialDataBase::Instance().getMaterial("air");
+    TMaterial& support = *MaterialDataBase::Instance().getMaterial("ITKEndcapSupportMaterial");
+    
+    Bool_t dummy = false;
+
+    double z0 = zPosition - 0.5*thicknessSupport + eps;
+
+    streamlog_out(DEBUG) << "CEPCITKEndcapKalDetector::create air support disk at " << z0 << " sort_policy = " << fabs(z0) << std::endl;
+      
+    TVector3 xc0_fwd(0.0, 0.0, z0);
+    TVector3 normal0_fwd(xc0_fwd);
+    normal0_fwd.SetMag(1.0);
+    Add(new ILDDiscMeasLayer(air, support, xc0_fwd, normal0_fwd, _bZ, fabs(z0), rminSupport, rmaxSupport, dummy, -1, "ITKEAirSupportDiscPositiveZ"));
+    
+    TVector3 xc0_bwd(0.0, 0.0, -z0);
+    TVector3 normal0_bwd(xc0_bwd);
+    normal0_bwd.SetMag(1.0);
+    Add(new ILDDiscMeasLayer(support, air, xc0_bwd, normal0_bwd, _bZ, fabs(z0), rminSupport, rmaxSupport, dummy, -1, "ITKEAirSupportDiscNegativeZ"));
+
+    double z1 = zPosition + 0.5*thicknessSupport - eps;
+
+    TVector3 xc1_fwd(0.0, 0.0, z1);
+    TVector3 normal1_fwd(xc1_fwd);
+    normal1_fwd.SetMag(1.0);
+    Add(new ILDDiscMeasLayer(air, support, xc1_fwd, normal1_fwd, _bZ, fabs(z1), rminSupport, rmaxSupport, dummy, -1, "ITKESupportAirDiscPositiveZ"));
+
+    TVector3 xc1_bwd(0.0, 0.0, -z1);
+    TVector3 normal1_bwd(xc1_bwd);
+    normal1_bwd.SetMag(1.0);
+    Add(new ILDDiscMeasLayer(support, air, xc1_bwd, normal1_bwd, _bZ, fabs(z1), rminSupport, rmaxSupport, dummy, -1, "ITKESupportAirDiscNegativeZ"));
+  }
+  
+}
+
+void CEPCITKEndcapKalDetector::create_segmented_disk_layers(int idisk, int iring, int nsegments, bool even_petals, double phi0, double zpos) {
+  streamlog_out(DEBUG1) << "create_segmented_disk_layers idisk = " << idisk << " iring = " << iring << " nsegments = " << nsegments
+			<< " even = " << even_petals << " zpos = " << zpos << std::endl;
+  Bool_t active = true;
+  Bool_t dummy  = false;
+  
+  TMaterial& air     = *MaterialDataBase::Instance().getMaterial("air");
+  TMaterial& silicon = *MaterialDataBase::Instance().getMaterial("silicon");
+  TMaterial& service = *MaterialDataBase::Instance().getMaterial("ITKEndcapServiceMaterial");
+  TMaterial& glue    = *MaterialDataBase::Instance().getMaterial("ITKEndcapGlueMaterial");
+
+  int zsign       = zpos > 0 ? 1 : -1;
+  int start_index = even_petals ? 0 : 1;
+
+  dd4hep::DDSegmentation::BitField64 encoder("system:5,side:-2,layer:9,module:8,sensor:8");
+  encoder.reset();
+  encoder[CEPCConf::DetCellID::system] = CEPCConf::DetID::ITKEndcap;
+  encoder[CEPCConf::DetCellID::side]   = zsign;
+  encoder[CEPCConf::DetCellID::layer]  = idisk;
+  encoder[CEPCConf::DetCellID::sensor] = iring;
+
+  std::vector<int> module_ids;
+  for (int i = 0; i < nsegments; i++) {
+    encoder[CEPCConf::DetCellID::module] = even_petals ? 2*i : 2*i+1;
+    module_ids.push_back(encoder.lowWord());
+  }
+  
+  // create segmented disk
+
+  double eps1 = 1.0e-04; // ring  
+  double eps2 = 1.0e-05; // odd or even
+  double eps3 = 1.0e-06; // layer in disk
+  double eps4 = 1.0e-08; // forward or backwards
+  //double sort_policy = fabs(z);
+  //double sort_policy = rInner+height + eps1 * idisk + eps3 * 1 ;
+  double sort_policy = eps1 * iring;
+  if (!even_petals) sort_policy += eps2;
+  if (zpos < 0)     sort_policy += eps4;
+
+  double tSupport   = _disksData.layers[idisk].thicknessSupport;
+  double tSensitive = _disksData.layers[idisk].rings[iring].thicknessSensitive;
+  double tGlue      = _disksData.layers[idisk].rings[iring].thicknessGlue;
+  double tService   = _disksData.layers[idisk].rings[iring].thicknessService;
+  double rInner     = _disksData.layers[idisk].rings[iring].distance;
+  double height     = _disksData.layers[idisk].rings[iring].length;
+  double widthInner = _disksData.layers[idisk].rings[iring].widthInner;
+  double widthOuter = _disksData.layers[idisk].rings[iring].widthOuter;
+
+  double tFront = even_petals ? tService : tGlue;
+  double tRear  = even_petals ? tGlue : tService;
+  TMaterial& front = even_petals ? service : glue;
+  TMaterial& rear  = even_petals ? glue : service;
+
+  double z = even_petals ? zpos - zsign*(0.5*tSupport + tRear + tSensitive + tFront) : zpos + zsign*(0.5*tSupport);
+  streamlog_out(DEBUG1) << "CEPCITKEndcapKalDetector::create_segmented_disk add front face of sensitive at " << z << " sort_policy = " << fabs(z)+sort_policy << std::endl;
+
+  const char *name1 = z > 0 ? "ITKEFrontFacePositiveZ" : "ITKEFrontFaceNegativeZ";
+  Add(new ILDSegmentedDiscMeasLayer(air, front, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name1));
+
+  z += zsign*tFront;
+  const char *name2 = z > 0 ? "ITKEFrontPositiveZ" : "ITKEFrontNegativeZ";
+  Add(new ILDSegmentedDiscMeasLayer(front, silicon, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name2));
+
+  z += zsign*0.5*tSensitive;
+  const char *name3 = z > 0 ? "ITKESenPositiveZ" : "ITKESenNegativeZ";
+  Add( new ILDSegmentedDiscMeasLayer(silicon, silicon, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, active, module_ids, name3));
+
+  z += zsign*0.5*tSensitive;
+  const char *name4 = z > 0 ? "ITKERearPositiveZ" : "ITKERearNegativeZ";
+  Add( new ILDSegmentedDiscMeasLayer(silicon, rear, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name4));
+
+  z += zsign*tRear;
+  const char *name5 = z > 0 ? "ITKERearFacePositiveZ" : "ITKERearFaceNegativeZ";
+  Add(new ILDSegmentedDiscMeasLayer(rear, air, _bZ, fabs(z)+sort_policy, nsegments, z, phi0, rInner, height, widthInner, widthOuter, dummy, name5));
+}
+
+void CEPCITKEndcapKalDetector::setupGearGeom(const gear::GearMgr& gearMgr) {
+
+  const gear::GearParameters& params = gearMgr.getGearParameters("ITKEndcapParameters");
+  streamlog_out(DEBUG) << params << std::endl;
+
+  _bZ = gearMgr.getBField().at(gear::Vector3D(0.,0.,0.)).z();
+  try {
+    std::vector<double> alphas      = params.getDoubleVals("AlphaPetals");
+    std::vector<double> zpositions  = params.getDoubleVals("ZPositions");
+    std::vector<double> zoffsets    = params.getDoubleVals("ZOffsetSupport");
+    std::vector<double> rminSups    = params.getDoubleVals("RMinSupports");
+    std::vector<double> rmaxSups    = params.getDoubleVals("RMaxSupports");
+    std::vector<double> tSupports   = params.getDoubleVals("ThicknessSupports");
+    std::vector<double> tSensitives = params.getDoubleVals("ThicknessSensitives");
+    std::vector<double> tGlues      = params.getDoubleVals("ThicknessGlues");
+    std::vector<double> tServices   = params.getDoubleVals("ThicknessServices");
+    std::vector<std::string> petalParNames      = params.getStringVals("PetalNumberNames");
+    std::vector<std::string> phi0ParNames       = params.getStringVals("PetalPhi0Names");
+    std::vector<std::string> distanceParNames   = params.getStringVals("PetalDistanceNames");
+    std::vector<std::string> widthInnerParNames = params.getStringVals("PetalInnerWidthNames");
+    std::vector<std::string> widthOuterParNames = params.getStringVals("PetalOuterWidthNames");
+    std::vector<std::string> lengthParNames     = params.getStringVals("PetalLengthNames");
+
+    for (int idisk = 0, N = alphas.size(); idisk < N; idisk++) {
+      dd4hep::rec::MultiRingsZDiskData::LayerLayout disk;// = _disksData.layers[idisk];
+      disk.alphaPetal = alphas[idisk];
+      disk.zPosition  = zpositions[idisk];
+      disk.zOffsetSupport = zoffsets[idisk];
+      disk.rminSupport = rminSups[idisk];
+      disk.rmaxSupport = rmaxSups[idisk];
+      disk.thicknessSupport = tSupports[idisk];
+      //std::string petalParName = petalParNames[idisk];
+      //std::string phi0ParName = phi0ParNames[idisk];
+      //std::string distanceParName = distanceParNames[idisk];
+      //std::string widthInnerParName = widthInnerParNames[idisk];
+      //std::string widthOuterParName = widthOuterParNames[idisk];
+      //std::string lengthParName = lengthParNames[idisk];
+      std::vector<int> petals         = params.getIntVals(petalParNames[idisk]);
+      std::vector<double> phi0s       = params.getDoubleVals(phi0ParNames[idisk]);
+      std::vector<double> distances   = params.getDoubleVals(distanceParNames[idisk]);
+      std::vector<double> widthInners = params.getDoubleVals(widthInnerParNames[idisk]);
+      std::vector<double> widthOuters = params.getDoubleVals(widthOuterParNames[idisk]);
+      std::vector<double> lengths     = params.getDoubleVals(lengthParNames[idisk]);
+      int nrings = petals.size();
+      for (int iring = 0; iring < nrings; iring++) {
+	dd4hep::rec::MultiRingsZDiskData::Ring ring;
+	ring.petalNumber = petals[iring];
+	ring.phi0 = phi0s[iring];
+	ring.distance = distances[iring];
+	ring.widthInner = widthInners[iring];
+	ring.widthOuter = widthOuters[iring];
+	ring.length = lengths[iring];
+	ring.thicknessSensitive = tSensitives[idisk];
+	ring.thicknessGlue = tGlues[idisk];
+	ring.thicknessService = tServices[idisk];
+	disk.rings.push_back(ring);
+      }
+      _disksData.layers.push_back(disk);
+    }
+  } catch (gear::UnknownParameterException& e) {
+    std::cout << e.what() << std::endl;
+  }
+
+  streamlog_out(DEBUG) << _disksData << std::endl;
+}
+
+void CEPCITKEndcapKalDetector::setupGearGeom(IGeomSvc* geoSvc) {
+  std::cout << "CEPCITKEndcapKalDetector::setupGearGeom(IGeomSvc* geoSvc) TODO" << std::endl;
+  exit(1);
+}
diff --git a/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc b/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc
index b2848bd24b2405f41726cc2773276e63f5536b5a..9e56613e42c7dc95d846fab8f3053e54decf5778 100644
--- a/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc
+++ b/Utilities/KalDet/src/ild/set/CEPCOTKKalDetector.cc
@@ -208,6 +208,8 @@ void CEPCOTKKalDetector::setupGearGeom( const gear::GearMgr& gearMgr ){
   
   const gear::ZPlanarParameters& pOTKDetMain = gearMgr.getSETParameters();
   const gear::ZPlanarLayerLayout& pOTKLayerLayout = pOTKDetMain.getZPlanarLayerLayout();
+
+  int hasOTKBarrel = pOTKDetMain.getIntVal("OTKBarrel");
   
   _bZ = gearMgr.getBField().at( gear::Vector3D( 0.,0.,0.)  ).z() ;