diff --git a/Detector/DetCRD/CMakeLists.txt b/Detector/DetCRD/CMakeLists.txt
index 21f4684c74db701fc0589e39dde33946c988556c..7dcd2a1d15f3ed97bf9739b4e5a436ddcb737dd5 100644
--- a/Detector/DetCRD/CMakeLists.txt
+++ b/Detector/DetCRD/CMakeLists.txt
@@ -20,6 +20,7 @@ gaudi_add_module(DetCRD
                          src/Tracker/SiTrackerStaggeredLadder_v01_geo.cpp
                          src/Tracker/TPC_Simple_o1_v01.cpp
                          src/Tracker/TPC_ModularEndcap_o1_v01.cpp
+        src/Tracker/SiTracker_otkbarrel_v01_geo.cpp
 
 		 LINK ${DD4hep_COMPONENT_LIBRARIES}
 )
diff --git a/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v01_01.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0996e56bd4d1a3f0fd9771dee2e01cdc5e3f438d
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/OTKBarrel_v01_01.xml
@@ -0,0 +1,91 @@
+<lccdd>
+  <info name="OTKBarrel_v01_01"
+        title="CepC OTKBarrel"
+        author="D.Yu, "
+        url="http://cepc.ihep.ac.cn"
+        contact="yudian2002@sjtu.edu.cn"
+        status="developing"
+        version="v01">
+    <comment>CepC vertex detector based on MOST2 project </comment>
+  </info>
+  <define>
+    <constant name="OTKBarrel_total_length" value="2*OTKBarrel_half_length" />
+    <constant name="OTKBarrel_ladder_total_thickness" value="15*mm" />
+    <constant name="OTKBarrel_ladder_total_width" value="160*mm" />
+    <constant name="OTKBarrel_ladder_total_length" value="OTKBarrel_total_length" />
+    <constant name="OTKBarrel_ladder_support_thickness" value="1*mm" />
+    <constant name="OTKBarrel_ladder_support_width" value="160*mm" />
+    <constant name="OTKBarrel_ladder_support_length" value="OTKBarrel_total_length" />
+    <constant name="OTKBarrel_ladder_support_height" value="OTKBarrel_ladder_support_thickness" />
+    <constant name="OTKBarrel_flex_width" value="15*mm" />
+    <constant name="OTKBarrel_sensor_length" value="140*mm" />
+    <constant name="OTKBarrel_sensor_thickness" value="500*um" />
+    <constant name="OTKBarrel_sensor_active_width" value="132*mm" />
+    <constant name="OTKBarrel_sensor_dead_width" value="28*mm" />
+    <constant name="OTKBarrel_pcb_thickness" value="500*um" />
+    <constant name="OTKBarrel_pcb_width" value="130*mm" />
+    <constant name="OTKBarrel_pcb_length" value="10*mm" />
+    <constant name="OTKBarrel_pcb_zgap" value="1*mm" />
+    <constant name="OTKBarrel_asic_thickness" value="500*um" />
+    <constant name="OTKBarrel_asic_width" value="130*mm" />
+    <constant name="OTKBarrel_asic_length" value="5*mm" />
+    <constant name="OTKBarrel_asic_zgap" value="1*mm" />
+    
+  </define>
+
+  <detectors>
+    <detector id="DetID_OTKBarrel" name="OTKBarrel" type="SiTracker_otkbarrel_v01" vis="OTKBarrelVis" readout="OTKBarrelCollection" insideTrackingVolume="true">
+      <envelope>
+      <shape type="BooleanShape" operation="Union" material="Air" >
+        <shape type="Tube" rmin="OTKBarrel_inner_radius" rmax="OTKBarrel_outer_radius" dz="OTKBarrel_half_length" />
+      </shape>
+      </envelope>
+
+      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_STRIP "/>
+
+      <global sensitive_mat="G4_Si" support_mat="G4_C" sensitive_threshold_KeV="64*keV" ladder_offset="0*mm"/>
+      <display ladder="SeeThrough" support="VXDSupportVis" flex="VXDFlexVis" sens_env="SeeThrough" sens="GrayVis" deadsensor="GreenVis"
+      pcb="GreenVis" asic="yellowVis"/>
+
+      <layer layer_id="0" ladder_radius="OTKBarrel1_inner_radius" n_ladders="45" ladder_offset="0*mm" ladder_thickness="OTKBarrel_ladder_total_thickness"
+      ladder_width="OTKBarrel_ladder_total_width" ladder_length="OTKBarrel_ladder_total_length">
+        <ladder isDoubleSided="false">
+          <ladderSupport height="OTKBarrel_ladder_support_height" length="OTKBarrel_ladder_support_length" thickness="OTKBarrel_ladder_support_thickness"
+          width="OTKBarrel_ladder_support_width" mat="CarbonFiber"/>
+          <flex n_slices="3">
+            <slice length="OTKBarrel_total_length" thickness="60*um" width="OTKBarrel_flex_width" mat="epoxy"/>
+            <slice length="OTKBarrel_total_length" thickness="74*um" width="OTKBarrel_flex_width" mat="Kapton"/>
+            <slice length="OTKBarrel_total_length" thickness="26.8*um" width="OTKBarrel_flex_width" mat="G4_Al"/>
+          </flex>
+          <sensor n_sensors="42" gap="0*mm" thickness="OTKBarrel_sensor_thickness" length="OTKBarrel_sensor_length" active_width="OTKBarrel_sensor_active_width" sensor_mat="G4_Si"
+          dead_width="OTKBarrel_sensor_dead_width"/>
+          <other pcb_thickness="OTKBarrel_pcb_thickness" pcb_width="OTKBarrel_pcb_width" pcb_length="OTKBarrel_pcb_length" pcb_zgap="OTKBarrel_pcb_zgap" pcb_mat="epoxy"
+          asic_thickness="OTKBarrel_asic_thickness" asic_width="OTKBarrel_asic_width" asic_length="OTKBarrel_asic_length" asic_zgap="OTKBarrel_asic_zgap" asic_mat="G4_Si"/>
+        </ladder>
+      </layer>
+      <layer layer_id="1" ladder_radius="OTKBarrel2_inner_radius" n_ladders="45" ladder_offset="0*mm" ladder_thickness="OTKBarrel_ladder_total_thickness"
+      ladder_width="OTKBarrel_ladder_total_width" ladder_length="OTKBarrel_ladder_total_length">
+        <ladder isDoubleSided="false">
+          <ladderSupport height="OTKBarrel_ladder_support_height" length="OTKBarrel_ladder_support_length" thickness="OTKBarrel_ladder_support_thickness"
+          width="OTKBarrel_ladder_support_width" mat="CarbonFiber"/>
+          <flex n_slices="3">
+            <slice length="OTKBarrel_total_length" thickness="60*um" width="OTKBarrel_flex_width" mat="epoxy"/>
+            <slice length="OTKBarrel_total_length" thickness="74*um" width="OTKBarrel_flex_width" mat="Kapton"/>
+            <slice length="OTKBarrel_total_length" thickness="26.8*um" width="OTKBarrel_flex_width" mat="G4_Al"/>
+          </flex>
+          <sensor n_sensors="42" gap="0*mm" thickness="OTKBarrel_sensor_thickness" length="OTKBarrel_sensor_length" active_width="OTKBarrel_sensor_active_width" sensor_mat="G4_Si"
+          dead_width="OTKBarrel_sensor_dead_width"/>
+          <other pcb_thickness="OTKBarrel_pcb_thickness" pcb_width="OTKBarrel_pcb_width" pcb_length="OTKBarrel_pcb_length" pcb_zgap="OTKBarrel_pcb_zgap" pcb_mat="epoxy"
+          asic_thickness="OTKBarrel_asic_thickness" asic_width="OTKBarrel_asic_width" asic_length="OTKBarrel_asic_length" asic_zgap="OTKBarrel_asic_zgap" asic_mat="G4_Si"/>
+        </ladder>
+      </layer>
+    </detector>
+  </detectors>
+  
+  <readouts>
+    <readout name="OTKBarrelCollection">
+      <id>system:5,side:-2,layer:9,module:8,active:8,sensor:8</id>
+    </readout>
+  </readouts>
+</lccdd>
+
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml
index 738e55c4dcdf9f950f9e033778bda8e9f5f819af..528fa0959b303e787e32e45ae02f4b2f52c0b7a7 100644
--- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml
@@ -33,7 +33,7 @@
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
   <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/>
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
-  
+
   <fields>
     <field name="InnerSolenoid" type="solenoid"
            inner_field="Field_nominal_value"
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 7d08004963535cf3a786af739e5822c285350c74..c7bfa391d977ea3f7d47d7ae76690111f8cf960f 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
@@ -34,6 +34,7 @@
     <constant name="DetID_TPC"          value="  4"/>
     <constant name="DetID_SET"          value="  5"/>
     <constant name="DetID_ETD"          value="  6"/>
+    <constant name="DetID_OTKBarrel"          value="  8"/>
     
     <constant name="DetID_ECAL"         value=" 20"/>
     <constant name="DetID_ECAL_PLUG"    value=" 21"/>
@@ -113,6 +114,15 @@
     <constant name="SIT2_half_length"    value="405*mm"/>
     <constant name="SIT3_half_length"    value="810*mm"/>
 
+    <!-- Parameters of time of flight tracker -->
+    <constant name="OTKBarrel_inner_radius" value="1800*mm"/>
+    <constant name="OTKBarrel_outer_radius" value="1860*mm"/>
+    <constant name="OTKBarrel_half_length" value="TPC_half_length"/>
+    <constant name="OTKBarrelLayer1_half_length" value="TPC_half_length"/>
+    <constant name="OTKBarrelLayer2_half_length" value="TPC_half_length"/>
+    <constant name="OTKBarrel1_inner_radius" value="1825*mm"/>
+    <constant name="OTKBarrel2_inner_radius" value="1845*mm"/>
+
     <constant name="SET_inner_radius"    value="1800*mm"/>
 
     <constant name="SiTracker_region1_costheta"   value="0.85"/>
diff --git a/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v01_geo.cpp b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v01_geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0f55e8efac34243f0edd9eba435b1d438930dbe4
--- /dev/null
+++ b/Detector/DetCRD/src/Tracker/SiTracker_otkbarrel_v01_geo.cpp
@@ -0,0 +1,374 @@
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/DD4hepUnits.h"
+#include "DD4hep/DetType.h"
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "XML/Utilities.h"
+#include <cmath>
+
+using namespace std;
+
+using dd4hep::Box;
+using dd4hep::DetElement;
+using dd4hep::Material;
+using dd4hep::Position;
+using dd4hep::RotationY;
+using dd4hep::RotationZYX;
+using dd4hep::Transform3D;
+using dd4hep::Rotation3D;
+using dd4hep::Volume;
+using dd4hep::_toString;
+using dd4hep::rec::volSurfaceList;
+using dd4hep::rec::ZPlanarData;
+using dd4hep::mm;
+
+
+static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4hep::SensitiveDetector sens)  {
+
+    xml_det_t  x_det    = e;
+    Material   air      = theDetector.air();
+    int        det_id   = x_det.id();
+    string     name     = x_det.nameStr();
+    DetElement otkbarrel(name, det_id);
+
+    Volume envelope = dd4hep::xml::createPlacedEnvelope(theDetector, e, otkbarrel);
+    dd4hep::xml::setDetectorTypeFlag(e, otkbarrel) ;
+    if(theDetector.buildType()==dd4hep::BUILD_ENVELOPE) return otkbarrel;
+    envelope.setVisAttributes(theDetector.visAttributes("SeeThrough"));
+
+    if (x_det.hasAttr(_U(sensitive))) {
+        xml_dim_t sd_typ = x_det.child(_U(sensitive));
+        sens.setType(sd_typ.typeStr());
+    }
+    else {
+        sens.setType("tracker");
+    }
+    std::cout << " ** building SiTracker_otkbarrel ..." << std::endl ;
+
+    dd4hep::rec::ZPlanarData* zPlanarData = new dd4hep::rec::ZPlanarData;
+    //*****************************************************************//
+
+    // Reading parameters from the .xml file
+
+    //*****************************************************************//
+
+    //fetch the display parameters
+    xml_comp_t x_display(x_det.child(_Unicode(display)));
+    std::string ladderVis      = x_display.attr<string>(_Unicode(ladder));
+    std::string supportVis     = x_display.attr<string>(_Unicode(support));
+    std::string flexVis        = x_display.attr<string>(_Unicode(flex));
+    std::string sensEnvVis     = x_display.attr<string>(_Unicode(sens_env));
+    std::string sensVis        = x_display.attr<string>(_Unicode(sens));
+    std::string deadsensVis    = x_display.attr<string>(_Unicode(deadsensor));
+    std::string pcbVis         = x_display.attr<string>(_Unicode(pcb));
+    std::string asicVis        = x_display.attr<string>(_Unicode(asic));
+
+
+    for(xml_coll_t layer_i(x_det,_U(layer)); layer_i; ++layer_i){
+        //fetch the ladder overall parameters of this layer
+        xml_comp_t x_layer(layer_i);
+
+        dd4hep::PlacedVolume pv;
+        int layer_id                 = x_layer.attr<int>(_Unicode(layer_id));
+
+        std::cout << "layer_id: " << layer_id << endl;
+
+        double sensitive_radius      = x_layer.attr<double>(_Unicode(ladder_radius));
+        int n_ladders                = x_layer.attr<int>(_Unicode(n_ladders)) ;
+        double ladder_offset         = x_layer.attr<double>(_Unicode(ladder_offset));
+        double ladder_radius         = sqrt(ladder_offset*ladder_offset + sensitive_radius*sensitive_radius);
+        double ladder_phi0           = -atan(ladder_offset/sensitive_radius);
+        double ladder_total_thickness         = x_layer.attr<double>(_Unicode(ladder_thickness));
+        double ladder_total_width         = x_layer.attr<double>(_Unicode(ladder_width));
+        double ladder_total_length         = x_layer.attr<double>(_Unicode(ladder_length));
+        std::cout << "ladder_radius: " << ladder_radius/mm <<" mm" << endl;
+        std::cout << "sensitive_radius: " << sensitive_radius/mm << " mm" << endl;
+        std::cout << "ladder_thickness: " << ladder_total_thickness/mm << " mm" << endl;
+        std::cout << "ladder_width: " << ladder_total_width/mm << " mm" << endl;
+        std::cout << "ladder_length: " << ladder_total_length/mm << " mm" << endl;
+
+        std::string layerName = dd4hep::_toString( layer_id , "layer_%d"  );
+        dd4hep::Assembly layer_assembly( layerName ) ;
+        pv = envelope.placeVolume( layer_assembly ) ;
+        dd4hep::DetElement layerDE( otkbarrel , layerName  , x_det.id() );
+        layerDE.setPlacement( pv ) ;
+
+        const double ladder_dphi = ( dd4hep::twopi / n_ladders ) ;
+        std::cout << "ladder_dphi: " << ladder_dphi << endl;
+
+
+        //fetch the ladder parameters
+        xml_comp_t x_ladder(x_layer.child(_Unicode(ladder)));
+
+        //fetch the ladder support parameters
+        xml_comp_t x_ladder_support(x_ladder.child(_Unicode(ladderSupport)));
+        double support_height        = x_ladder_support.attr<double>(_Unicode(height));
+        double support_length        = x_ladder_support.attr<double>(_Unicode(length));
+        double support_thickness     = x_ladder_support.attr<double>(_Unicode(thickness));
+        double support_width         = x_ladder_support.attr<double>(_Unicode(width));
+        Material support_mat;
+        if(x_ladder_support.hasAttr(_Unicode(mat)))
+        {
+            support_mat = theDetector.material(x_ladder_support.attr<string>(_Unicode(mat)));
+        }
+        else
+        {
+            support_mat = theDetector.material(x_ladder_support.materialStr());
+        }
+        std::cout << "support_length: " << support_length/mm << " mm" << endl;
+        std::cout << "support_thickness: " << support_thickness/mm << " mm" << endl;
+        std::cout << "support_width: " << support_width/mm << " mm" << endl;
+
+
+        //fetch the flex parameters
+        double flex_thickness(0);
+        double flex_width(0);
+        double flex_length(0);
+        xml_comp_t x_flex(x_ladder.child(_Unicode(flex)));
+        for(xml_coll_t flex_i(x_flex,_U(slice)); flex_i; ++flex_i){
+            xml_comp_t x_flex_slice(flex_i);
+            double x_flex_slice_thickness = x_flex_slice.attr<double>(_Unicode(thickness));
+            double x_flex_slice_width = x_flex_slice.attr<double>(_Unicode(width));
+            double x_flex_slice_length = x_flex_slice.attr<double>(_Unicode(length));
+            flex_thickness += x_flex_slice_thickness;
+            if (x_flex_slice_width > flex_width) flex_width = x_flex_slice_width;
+            if (x_flex_slice_length > flex_length) flex_length = x_flex_slice_length;
+            std::cout << "x_flex_slice_thickness: " << x_flex_slice_thickness/mm << " mm" << endl;
+        }
+        std::cout << "flex_thickness: " << flex_thickness/mm << " mm" << endl;
+        std::cout << "flex_width: " << flex_width/mm << " mm" << endl;
+        std::cout << "flex_length: " << flex_length/mm << " mm" << endl;
+
+
+        //fetch the sensor parameters
+        xml_comp_t x_sensor(x_ladder.child(_Unicode(sensor)));
+        int n_sensors_per_side                  = x_sensor.attr<int>(_Unicode(n_sensors));
+        double dead_gap                         = x_sensor.attr<double>(_Unicode(gap));
+        double sensor_thickness                 = x_sensor.attr<double>(_Unicode(thickness));
+        double sensor_length                    = x_sensor.attr<double>(_Unicode(length));
+        double sensor_active_width              = x_sensor.attr<double>(_Unicode(active_width));
+        double sensor_dead_width                = x_sensor.attr<double>(_Unicode(dead_width));
+        double sensor_total_width               = sensor_active_width + sensor_dead_width;
+        Material sensor_mat                     = theDetector.material(x_sensor.attr<string>(_Unicode(sensor_mat)));
+
+        std::cout << "n_sensors_per_side: " << n_sensors_per_side << endl;
+        std::cout << "dead_gap: " << dead_gap/mm << " mm" << endl;
+        std::cout << "sensor_thickness: " << sensor_thickness/mm << " mm" << endl;
+        std::cout << "sensor_length: " << sensor_length/mm << " mm" << endl;
+        std::cout << "sensor_active_width: " << sensor_active_width/mm << " mm" << endl;
+        std::cout << "sensor_dead_width: " << sensor_dead_width/mm << " mm" << endl;
+        std::cout << "sensor_total_width: " << sensor_total_width/mm << " mm" << endl;
+
+        //fetch parameters for the pcb and asic parts
+        xml_comp_t x_other(x_ladder.child(_Unicode(other)));
+        double pcb_thickness               = x_other.attr<double>(_Unicode(pcb_thickness));
+        double pcb_width                   = x_other.attr<double>(_Unicode(pcb_width));
+        double pcb_length                  = x_other.attr<double>(_Unicode(pcb_length));
+        double pcb_zgap                    = x_other.attr<double>(_Unicode(pcb_zgap));
+        double asic_thickness              = x_other.attr<double>(_Unicode(asic_thickness));
+        double asic_width                  = x_other.attr<double>(_Unicode(asic_width));
+        double asic_length                 = x_other.attr<double>(_Unicode(asic_length));
+        double asic_zgap                   = x_other.attr<double>(_Unicode(asic_zgap));
+        Material pcb_mat                   = theDetector.material(x_other.attr<string>(_Unicode(pcb_mat)));
+        Material asic_mat                  = theDetector.material(x_other.attr<string>(_Unicode(asic_mat)));
+
+        std::cout << "pcb_thickness: " << pcb_thickness/mm << " mm" << endl;
+        std::cout << "pcb_width: " << pcb_width/mm << " mm" << endl;
+        std::cout << "pcb_length: " << pcb_length/mm << " mm" << endl;
+        std::cout << "pcb_zgap: " << pcb_zgap/mm << " mm" << endl;
+        std::cout << "asic_thickness: " << asic_thickness/mm << " mm" << endl;    std::cout << "asic_width: " << asic_width/mm << " mm" << endl;
+        std::cout << "asic_length: " << asic_length/mm << " mm" << endl;
+        std::cout << "asic_zgap: " << asic_zgap/mm << " mm" << endl;
+
+        //*****************************************************************//
+
+        // Creating objects
+
+        //*****************************************************************//
+
+
+        //create ladder logical volume
+        Box LadderSolid(ladder_total_thickness / 2.0,
+                        ladder_total_width / 2.0,
+                        ladder_total_length / 2.0);
+        Volume LadderLogical(name + dd4hep::_toString( layer_id, "_LadderLogical_%02d"),
+                             LadderSolid, air);
+        // create flex envelope logical volume
+        Box FlexEnvelopeSolid(flex_thickness / 2.0, flex_width / 2.0, flex_length / 2.0);
+        Volume FlexEnvelopeLogical(name + dd4hep::_toString( layer_id, "_FlexEnvelopeLogical_%02d"), FlexEnvelopeSolid, air);
+        FlexEnvelopeLogical.setVisAttributes(theDetector.visAttributes("SeeThrough"));
+        //otkbarrel.setVisAttributes(theDetector, flexVis, FlexEnvelopeLogical);
+
+        //create the flex layers inside the flex envelope
+        double flex_start_height(-flex_thickness/2.);
+        int index = 0;
+        for(xml_coll_t flex_i(x_flex,_U(slice)); flex_i; ++flex_i){
+            xml_comp_t x_flex_slice(flex_i);
+            double x_flex_slice_thickness = x_flex_slice.attr<double>(_Unicode(thickness));
+            double x_flex_slice_width = x_flex_slice.attr<double>(_Unicode(width));
+            double x_flex_slice_length = x_flex_slice.attr<double>(_Unicode(length));
+            Material x_flex_slice_mat;
+            if(x_flex_slice.hasAttr(_Unicode(mat)))
+            {
+                x_flex_slice_mat = theDetector.material(x_flex_slice.attr<string>(_Unicode(mat)));
+            }
+            else
+            {
+                x_flex_slice_mat = theDetector.material(x_flex_slice.materialStr());
+            }
+            // Material x_flex_slice_mat = theDetector.material(x_flex_slice.attr<string>(_Unicode(mat)));
+            Box FlexLayerSolid(x_flex_slice_thickness/2.0, x_flex_slice_width/2.0, x_flex_slice_length/2.0);
+            Volume FlexLayerLogical(name + dd4hep::_toString( layer_id, "_FlexLayerLogical_%02d") + dd4hep::_toString( index, "index_%02d"), FlexLayerSolid, x_flex_slice_mat);
+            FlexLayerLogical.setVisAttributes(theDetector.visAttributes(flexVis));
+            double flex_slice_height = flex_start_height + x_flex_slice_thickness/2.;
+            pv = FlexEnvelopeLogical.placeVolume(FlexLayerLogical, Position(flex_slice_height, 0., 0.));
+            std::cout << "flex thickness = " << x_flex_slice_thickness << std::endl;
+            std::cout << "flex width = " << x_flex_slice_width << std::endl;
+            std::cout << "flex length = " << x_flex_slice_length << std::endl;
+            // std::cout << "flex material: " << x_flex_slice_mat << std::endl;
+            flex_start_height += x_flex_slice_thickness;
+            index++;
+        }
+
+        //place the flex envelope inside the ladder envelope
+        pv = LadderLogical.placeVolume(FlexEnvelopeLogical, Position((support_height+flex_thickness)/2.0+sensor_thickness, (-support_width+flex_width)/2.0, 0.));
+
+        //create sensor envelope logical volume
+        Box SensorEnvelopeSolid((sensor_thickness+pcb_thickness+asic_thickness) / 2.0, sensor_total_width / 2.0, support_length / 2.0);
+        Volume SensorEnvelopeLogical(name + dd4hep::_toString( layer_id, "_SensorEnvelopeLogical_%02d"), SensorEnvelopeSolid, air);
+        SensorEnvelopeLogical.setVisAttributes(theDetector.visAttributes(sensEnvVis));
+
+        //create sensor logical volume
+        Box SensorSolid(sensor_thickness / 2.0, sensor_active_width / 2.0, sensor_length / 2.0);
+        Volume SensorLogical(name + dd4hep::_toString( layer_id, "_SensorLogical_%02d"), SensorSolid, sensor_mat);
+        SensorLogical.setSensitiveDetector(sens);
+        if (x_det.hasAttr(_U(limits))) SensorLogical.setLimitSet(theDetector, x_det.limitsStr());
+        //otkbarrel.setVisAttributes(theDetector, deadsensVis, SensorDeadLogical);
+        SensorLogical.setVisAttributes(theDetector.visAttributes(sensVis));
+
+        //create dead sensor logical volume
+        Box SensorDeadSolid(sensor_thickness / 2.0, sensor_dead_width / 2.0, sensor_length / 2.0);
+        Volume SensorDeadLogical(name + dd4hep::_toString( layer_id, "_SensorDeadLogical_%02d"), SensorDeadSolid, sensor_mat);
+        SensorDeadLogical.setVisAttributes(theDetector.visAttributes(deadsensVis));
+
+        //create pcb sensor logical volume
+        Box PcbSolid(pcb_thickness / 2.0, pcb_width / 2.0, pcb_length / 2.0);
+        Volume PcbLogical(name + dd4hep::_toString( layer_id, "_PcbLogical_%02d"), PcbSolid, pcb_mat);
+        PcbLogical.setVisAttributes(theDetector.visAttributes(pcbVis));
+
+        //create asic sensor logical volume
+        Box AsicSolid(asic_thickness / 2.0, asic_width / 2.0, asic_length / 2.0);
+        Volume AsicLogical(name + dd4hep::_toString( layer_id, "_AsicLogical_%02d"), AsicSolid, asic_mat);
+        AsicLogical.setVisAttributes(theDetector.visAttributes(asicVis));
+
+        // place the active sensor, dead sensor, pcb and asic inside the sensor envelope
+        std::vector<dd4hep::PlacedVolume> Sensor_pv;
+        for(int isensor=0;isensor<n_sensors_per_side;++isensor){
+            double sensor_total_z = n_sensors_per_side*sensor_length + dead_gap*n_sensors_per_side;
+            double sensor_xpos = -(pcb_thickness+asic_thickness)/2.0;
+            double sensor_ypos_active = (sensor_total_width-sensor_active_width)/2.0;
+            double sensor_ypos_dead = (-sensor_total_width+sensor_dead_width)/ 2.0;
+            double sensor_zpos = -sensor_total_z/2.0 + (sensor_length + dead_gap)/2.0 + isensor*(sensor_length + dead_gap);
+            double pcb_xpos = (sensor_thickness-asic_thickness)/2.0;
+            double pcb_ypos = sensor_ypos_active;
+            double pcb_zpos_0 = sensor_zpos-(sensor_length/2.0-pcb_zgap-pcb_length/2.0);
+            double pcb_zpos_1 = sensor_zpos+(sensor_length/2.0-pcb_zgap-pcb_length/2.0);
+            double asic_xpos = (sensor_thickness+pcb_thickness)/2.0;
+            double asic_ypos = pcb_ypos;
+            double asic_zpos_0 = sensor_zpos-(sensor_length/2.0-asic_zgap-asic_length/2.0);
+            double asic_zpos_1 = sensor_zpos+(sensor_length/2.0-asic_zgap-asic_length/2.0);
+            pv = SensorEnvelopeLogical.placeVolume(SensorLogical, Position(sensor_xpos,sensor_ypos_active,sensor_zpos));
+            pv.addPhysVolID("layer", layer_id).addPhysVolID("active", 0).addPhysVolID("sensor", isensor) ;
+            Sensor_pv.push_back(pv);
+            pv = SensorEnvelopeLogical.placeVolume(SensorDeadLogical, Position(sensor_xpos,sensor_ypos_dead,sensor_zpos));
+            pv = SensorEnvelopeLogical.placeVolume(PcbLogical, Position(pcb_xpos,pcb_ypos,pcb_zpos_0));
+            pv = SensorEnvelopeLogical.placeVolume(PcbLogical, Position(pcb_xpos,pcb_ypos,pcb_zpos_1));
+            pv = SensorEnvelopeLogical.placeVolume(AsicLogical, Position(asic_xpos,asic_ypos,asic_zpos_0));
+            pv = SensorEnvelopeLogical.placeVolume(AsicLogical, Position(asic_xpos,asic_ypos,asic_zpos_1));
+        }
+
+        //place the sensor envelope inside the ladder envelope
+        pv = LadderLogical.placeVolume(SensorEnvelopeLogical,
+                                       Position(support_height/2.0+(sensor_thickness+pcb_thickness+asic_thickness)/2.0,0.,0.));
+
+        //create the ladder support envelope
+        Box LadderSupportEnvelopeSolid(support_height/2.0, support_width/2.0, support_length/2.0);
+        Volume LadderSupportEnvelopeLogical(name + _toString( layer_id,"_SupEnvLogical_%02d"), LadderSupportEnvelopeSolid, air);
+        otkbarrel.setVisAttributes(theDetector, "seeThrough", LadderSupportEnvelopeLogical);
+
+        //create ladder support volume
+        Box LadderSupportSolid(support_thickness / 2.0 , support_width / 2.0 , support_length / 2.0);
+        Volume LadderSupportLogical(name + _toString( layer_id,"_SupLogical_%02d"), LadderSupportSolid, support_mat);
+        LadderSupportLogical.setVisAttributes(theDetector.visAttributes(supportVis));
+
+        pv = LadderSupportEnvelopeLogical.placeVolume(LadderSupportLogical);
+        pv = LadderLogical.placeVolume(LadderSupportEnvelopeLogical);
+
+        for(int i = 0; i < n_ladders; i++){
+            float rot = layer_id*0.5;
+            std::stringstream ladder_enum;
+            ladder_enum << "otkbarrel_ladder_" << layer_id << "_" << i;
+            DetElement ladderDE(layerDE, ladder_enum.str(), x_det.id());
+            // std::cout << "start building " << ladder_enum.str() << ":" << endl;
+
+
+
+            //====== create the meassurement surface ===================
+            dd4hep::rec::Vector3D o(0,0,0);
+            dd4hep::rec::Vector3D u( 0., 0., 1.);
+            dd4hep::rec::Vector3D v( 0., 1., 0.);
+            dd4hep::rec::Vector3D n( 1., 0., 0.);
+            double inner_thick = sensor_thickness/2.0;
+            double outer_thick = (support_height + sensor_thickness)/2.0;
+            dd4hep::rec::VolPlane surfSens( SensorLogical ,
+                                            dd4hep::rec::SurfaceType(dd4hep::rec::SurfaceType::Sensitive),
+                                            inner_thick, outer_thick , u,v,n,o ) ;
+
+
+            for(int isensor=0; isensor < n_sensors_per_side; ++isensor){
+                std::stringstream sensor_str;
+                sensor_str << ladder_enum.str() << "_" << isensor;
+                // std::cout << "\tstart building " << sensor_str.str() << ":" << endl;
+                DetElement sensorDE(ladderDE, sensor_str.str(), x_det.id());
+                sensorDE.setPlacement(Sensor_pv[isensor]);
+                volSurfaceList(sensorDE)->push_back(surfSens);
+                // std::cout << "\t" << sensor_str.str() << " done." << endl;
+            }
+            Transform3D tr (RotationZYX(ladder_dphi*(i+rot),0.,0.),Position(ladder_radius*cos(ladder_phi0+ladder_dphi*(i+rot)), ladder_radius*sin(ladder_phi0+ladder_dphi*(i+rot)), 0.));
+            pv = layer_assembly.placeVolume(LadderLogical,tr);
+            pv.addPhysVolID("module", i ) ;
+            ladderDE.setPlacement(pv);
+            std::cout << ladder_enum.str() << " done." << endl;
+            if(i==0) std::cout << "xy=" << ladder_radius*cos(ladder_phi0) << " " << ladder_radius*sin(ladder_phi0) << std::endl;
+        }
+
+        // package the reconstruction data
+        dd4hep::rec::ZPlanarData::LayerLayout otkbarrelLayer;
+
+        otkbarrelLayer.ladderNumber         = n_ladders;
+        otkbarrelLayer.phi0                 = ladder_phi0;
+        otkbarrelLayer.sensorsPerLadder     = n_sensors_per_side;
+        otkbarrelLayer.lengthSensor         = sensor_length;
+        otkbarrelLayer.distanceSupport      = sensitive_radius;
+        otkbarrelLayer.thicknessSupport     = support_thickness / 2.0;
+        otkbarrelLayer.offsetSupport        = -ladder_offset;
+        otkbarrelLayer.widthSupport         = support_width;
+        otkbarrelLayer.zHalfSupport         = support_length / 2.0;
+        otkbarrelLayer.distanceSensitive    = sensitive_radius + support_height / 2.0 + flex_thickness;
+        otkbarrelLayer.thicknessSensitive   = sensor_thickness;
+        otkbarrelLayer.offsetSensitive      = -ladder_offset + (support_width/2.0 - sensor_active_width/2.0);
+        otkbarrelLayer.widthSensitive       = sensor_active_width;
+        otkbarrelLayer.zHalfSensitive       = (n_sensors_per_side*(sensor_length + dead_gap) - dead_gap) / 2.0;
+
+        zPlanarData->layers.push_back(otkbarrelLayer);
+    }
+    std::cout << (*zPlanarData) << endl;
+    otkbarrel.addExtension< ZPlanarData >(zPlanarData);
+    if ( x_det.hasAttr(_U(combineHits)) ) {
+        otkbarrel.setCombineHits(x_det.attr<bool>(_U(combineHits)),sens);
+    }
+    std::cout << "otkbarrel done." << endl;
+    return otkbarrel;
+}
+DECLARE_DETELEMENT(SiTracker_otkbarrel_v01,create_element)
+
diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp
index 7ac6e5bda88c6b99cbecad53628c103f85e656e8..25968ec70baf76650f9fa9d57ebd0e83c703dc9b 100644
--- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp
+++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.cpp
@@ -113,6 +113,7 @@ Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) {
     auto sitcols = m_SITCol.createAndPut();
     auto tpccols = m_TPCCol.createAndPut();
     auto setcols = m_SETCol.createAndPut();
+    auto otkbarrelcols = m_OTKBarrelCol.createAndPut();
 
     auto ecalbarrelcol            = m_EcalBarrelCol.createAndPut();
     auto ecalbarrelcontribcols    = m_EcalBarrelContributionCol.createAndPut();
@@ -188,6 +189,8 @@ Edm4hepWriterAnaElemTool::EndOfEventAction(const G4Event* anEvent) {
             tracker_col_ptr = setcols;
         } else if (collect->GetName() == "SETCollection") {
             tracker_col_ptr = setcols;
+        } else if (collect->GetName() == "OTKBarrelCollection") {
+            tracker_col_ptr = otkbarrelcols;
         } else if (collect->GetName() == "CaloHitsCollection") {
             calo_col_ptr = calorimetercols;
             calo_contrib_col_ptr = calocontribcols;
diff --git a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
index 13b43c9d03dfdfaa2b78c254e791abaaf8dc3109..ea6922d3ded4c73ec161e0555f7540c03340aaa5 100644
--- a/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
+++ b/Simulation/DetSimAna/src/Edm4hepWriterAnaElemTool.h
@@ -72,6 +72,8 @@ private:
             Gaudi::DataHandle::Writer, this};
     DataHandle<edm4hep::SimTrackerHitCollection> m_SETCol{"SETCollection", 
             Gaudi::DataHandle::Writer, this};
+    DataHandle<edm4hep::SimTrackerHitCollection> m_OTKBarrelCol{"OTKBarrelCollection",
+            Gaudi::DataHandle::Writer, this};
 
     // Ecal
     DataHandle<edm4hep::SimCalorimeterHitCollection> m_EcalBarrelCol{"EcalBarrelCollection", 
diff --git a/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp b/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp
index 1e11da48b5c8872ff1553c95025597a2a7db251c..bffa2119cd5bef1d2879316fbed6026553ef24f6 100644
--- a/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp
+++ b/Simulation/DetSimAna/src/ExampleAnaElemTool.cpp
@@ -44,6 +44,7 @@ ExampleAnaElemTool::EndOfEventAction(const G4Event* anEvent) {
     auto sitcols = m_SITCol.createAndPut();
     auto tpccols = m_TPCCol.createAndPut();
     auto setcols = m_SETCol.createAndPut();
+    auto otkbarrelcols = m_OTKBarrelCol.createAndPut();
 
     // readout defined in DD4hep
     auto lcdd = &(dd4hep::Detector::getInstance());
@@ -92,6 +93,8 @@ ExampleAnaElemTool::EndOfEventAction(const G4Event* anEvent) {
             tracker_col_ptr = setcols;
         } else if (collect->GetName() == "SETCollection") {
             tracker_col_ptr = setcols;
+        } else if (collect->GetName() == "OTKBarrelCollection") {
+            tracker_col_ptr = otkbarrelcols;
         } else if (collect->GetName() == "CaloHitsCollection") {
             calo_col_ptr = calorimetercols;
         } else {
diff --git a/Simulation/DetSimAna/src/ExampleAnaElemTool.h b/Simulation/DetSimAna/src/ExampleAnaElemTool.h
index cdf5e2b20a6042ba1af9d875b606370e3a037c48..cda8ff16c02b8289b939feca86664891552b9e86 100644
--- a/Simulation/DetSimAna/src/ExampleAnaElemTool.h
+++ b/Simulation/DetSimAna/src/ExampleAnaElemTool.h
@@ -61,6 +61,8 @@ private:
             Gaudi::DataHandle::Writer, this};
     DataHandle<plcio::SimTrackerHitCollection> m_SETCol{"SETCollection", 
             Gaudi::DataHandle::Writer, this};
+    DataHandle<plcio::SimTrackerHitCollection> m_OTKBarrelCol{"OTKBarrelCollection",
+            Gaudi::DataHandle::Writer, this};
 
 };