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 9a57883b5def4a8cb4624a97a956372379697b87..c5b069092f6f808b2a08982923b874af9b6b9c69 100644
--- a/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v02/ITK_EndCap_v01.xml
@@ -28,7 +28,7 @@
         <slice name="Carbon_fiber_back" material="CF_ITK" thickness="150*um" vis="GrayVis"/>
       </support>
 
-      <sensor>
+      <sensor size="20*mm" side="0.3*mm" dead="2.0*mm">
 	<slice name="GlueF" material="CER_ITK" thickness="200*um" vis="SeeThrough"/>
         <slice name="Sensor" material="G4_Si" thickness="150*um" sensitive="true" vis="OrangeVis"/>
 	<slice name="GlueB" material="CER_ITK" thickness="100*um" vis="SeeThrough"/>
@@ -64,7 +64,7 @@
 
   <readouts>
     <readout name="ITKEndcapCollection">
-      <id>system:5,side:-2,layer:9,module:8,sensor:8</id>
+      <id>system:5,side:-2,layer:9,module:8,ring:3,sensor:5</id>
     </readout>
   </readouts>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v02/VXD_Composite_v01_03.xml b/Detector/DetCRD/compact/CRD_common_v02/VXD_Composite_v01_03.xml
index e9279e6149e92fdd8222c0398568a2485d3a2715..94c7777413009dcac4da514272e37ef4701b7fdf 100644
--- a/Detector/DetCRD/compact/CRD_common_v02/VXD_Composite_v01_03.xml
+++ b/Detector/DetCRD/compact/CRD_common_v02/VXD_Composite_v01_03.xml
@@ -44,7 +44,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
           <flex vis="GrayVis">
             <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+45*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+57.3*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
 	  <driver thickness="50*um" width="1.385*mm" material="Kapton" vis="BlueVis"/>
@@ -55,7 +55,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
           <flex vis="GrayVis">
             <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+45*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+57.3*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
           <driver thickness="50*um" width="1.385*mm" material="Kapton" vis="BlueVis"/>
@@ -68,7 +68,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
           <flex vis="GrayVis">
             <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+32*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+33.7*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
           <driver thickness="50*um" width="1.385*mm" material="Kapton" vis="BlueVis"/>
@@ -79,7 +79,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
           <flex vis="GrayVis">
             <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+32*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+33.7*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
           <driver thickness="50*um" width="1.385*mm" material="Kapton" vis="BlueVis"/>
@@ -92,7 +92,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
 	  <flex vis="GrayVis">
             <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+31*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+31.8*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
           <driver thickness="50*um" width="4.155*mm" material="Kapton" vis="BlueVis"/>
@@ -103,7 +103,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
           <flex vis="GrayVis">
             <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+31*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+31.8*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
           <driver thickness="50*um" width="4.155*mm" material="Kapton" vis="BlueVis"/>
@@ -116,7 +116,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
           <flex vis="GrayVis">
             <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+29*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+40*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
           <driver thickness="50*um" width="4.155*mm" material="Kapton" vis="BlueVis"/>
@@ -127,7 +127,7 @@
           <sensor thickness="50*um" width="8.409*mm" length="3.296*mm" material="G4_Si" vis="VXDVis"/>
           <flex vis="GrayVis">
 	    <!--slice thickness="0.4*um" material="G4_Al"/-->
-            <slice thickness="VXD_flex_thickness+29*um" material="CFRP_CMS"/>
+            <slice thickness="VXD_flex_thickness+40*um" material="CFRP_CMS"/>
           </flex>
           <readout thickness="50*um" width="4.155*mm" material="Kapton" vis="RedVis"/>
           <driver thickness="50*um" width="4.155*mm" material="Kapton" vis="BlueVis"/>
diff --git a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
index 67bff0788a10e2f3d92b24f56fea55225a55d901..a8f9e8ed8fdd92013c3f696a5a944e5d50c319ab 100644
--- a/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
+++ b/Detector/DetCRD/src/Tracker/ITK_EndCap_v01.cpp
@@ -38,6 +38,11 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
 
   const xml::Component supports = x_det.child("support");
   const xml::Component sensor   = x_det.child("sensor");
+  const double sensor_size   = sensor.attr<double>("size");
+  const double sensor_side   = sensor.attr<double>("side");
+  const double sensor_dead   = sensor.attr<double>("dead");
+  const double sensor_width  = sensor_size - sensor_dead - sensor_side;
+  const double sensor_length = sensor_size - sensor_side * 2;
 
   const xml::Component layers_xml = x_det.child("layers");
   for (xml_coll_t layer(layers_xml, "layer"); layer; ++layer)
@@ -115,6 +120,11 @@ 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");
 
+      int nrow    = std::floor(module_dr/sensor_size);
+      int ncolumn = std::floor(module_dphi/sensor_size);
+      double gap_dr   = (module_dr - sensor_size*nrow) / (nrow - 1);
+      double gap_dphi = (module_dphi - sensor_size*ncolumn) / (ncolumn - 1);
+
       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 ringPosF_vol(ring_vol_name + "PF", ring_tube, air);
@@ -131,58 +141,80 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
       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 + "_petal";
-      Volume sensor_vol(sensor_name, sensor_box, air);
-      DetElement sensor_det(sensor_name, det_id);
-      sensor_vol = sensor_vol.setVisAttributes(description.visAttributes(vis));
+      Box module_box(module_dr / 2.0, module_dphi / 2.0, SiliconThickness / 2.0);
+      std::string module_name = ring_vol_name + "_petal";
+      Volume module_vol(module_name, module_box, air);
+      DetElement module_det(module_name, det_id);
+      module_vol = module_vol.setVisAttributes(description.visAttributes(vis));
 
       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;
+      double module_z = -SiliconThickness / 2.0;
       for (xml_coll_t sensor_layer(sensor, "slice"); sensor_layer; ++sensor_layer)
       {
-        const auto sensor_layer_name = sensor_layer.attr<std::string>("name");
-        const auto sensor_layer_material = sensor_layer.attr<std::string>("material");
-        const auto sensor_layer_thickness = sensor_layer.attr<double>("thickness");
-        const auto sensor_layer_vis = sensor_layer.attr<std::string>("vis");
+        const auto module_layer_name      = sensor_layer.attr<std::string>("name");
+        const auto module_layer_material  = sensor_layer.attr<std::string>("material");
+        const auto module_layer_thickness = sensor_layer.attr<double>("thickness");
+        const auto module_layer_vis       = sensor_layer.attr<std::string>("vis");
         auto is_sensitive = sensor_layer.hasAttr(_U(sensitive));
-        std::string sensor_layer_vol_name = sensor_name + "_" + sensor_layer_name;
-        Box sensor_layer_box(module_dr / 2.0, module_dphi / 2.0, sensor_layer_thickness / 2.0);
-        Volume sensor_layer_vol(sensor_layer_vol_name, sensor_layer_box, description.material(sensor_layer_material));
-        DetElement sensor_layer_det(sensor_layer_vol_name, det_id);
-        sensor_layer_vol = sensor_layer_vol.setVisAttributes(description.visAttributes(sensor_layer_vis));
+        std::string module_layer_vol_name = module_name + "_" + module_layer_name;
+        Box    module_layer_box(module_dr / 2.0, module_dphi / 2.0, module_layer_thickness / 2.0);
+        Volume module_layer_vol(module_layer_vol_name, module_layer_box, description.material(module_layer_material));
+        DetElement module_layer_det(module_layer_vol_name, det_id);
+        module_layer_vol = module_layer_vol.setVisAttributes(description.visAttributes(module_layer_vis));
         rec::SurfaceType surf_type;
+	rec::Vector3D u(0.,-1., 0.);
+        rec::Vector3D v(1., 0., 0.);
+        rec::Vector3D n(0., 0., 1.);
         if (is_sensitive)
         {
-          sensor_layer_vol = sensor_layer_vol.setSensitiveDetector(sens);
-          surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive,rec::SurfaceType::Plane);
-	  sensitive_thickness += sensor_layer_thickness;
+	  surf_type = rec::SurfaceType(rec::SurfaceType::Sensitive,rec::SurfaceType::Plane);
+
+	  Box    sensor_box(sensor_length / 2.0, sensor_width / 2.0, module_layer_thickness / 2.0);
+          Volume sensor_vol(module_layer_vol_name + "_sensor", sensor_box, description.material(module_layer_material));
+	  sensor_vol = sensor_vol.setVisAttributes(description.visAttributes(module_layer_vis));
+          sensor_vol = sensor_vol.setSensitiveDetector(sens);
+	  for (int irow = 0; irow < nrow; irow++) {
+	    for (int icolumn = 0; icolumn < ncolumn; icolumn++) {
+	      int sensor_id = icolumn*nrow + irow;
+	      double xpos = -module_dr/2.0 + (irow+0.5)*sensor_size + (irow-1)*gap_dr;
+	      double ypos = -module_dphi/2.0 + sensor_dead + (icolumn+0.5)*sensor_width + icolumn*(gap_dphi+sensor_side*2);
+	      DetElement sensor_det(module_layer_det, module_layer_vol_name + "_sensor" + std::to_string(sensor_id), det_id);
+	      auto pv = module_layer_vol.placeVolume(sensor_vol, Position(xpos, ypos, 0));
+	      pv.addPhysVolID("sensor", sensor_id);
+	      sensor_det.setPlacement(pv);
+
+	      rec::VolPlane surf(sensor_vol, surf_type, module_layer_thickness / 2.0, module_layer_thickness / 2.0, u, v, n);
+	      rec::volSurfaceList(sensor_det)->push_back(surf);
+	    }
+	  }
+
+	  sensitive_thickness += module_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;
+	  rec::VolPlane surf(module_layer_vol, surf_type, module_layer_thickness / 2.0, module_layer_thickness / 2.0, u, v, n);
+	  rec::volSurfaceList(module_layer_det)->push_back(surf);
+
+	  if (sensitive_thickness==0) glue_thickness    += module_layer_thickness;
+          else                        service_thickness += module_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;
+        module_layer_det.setPlacement(
+          module_vol.placeVolume(module_layer_vol, Position(0, 0, module_z + module_layer_thickness / 2.0)));
+        module_z += module_layer_thickness;
 
-        sensor_det.add(sensor_layer_det);
-        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_layer_det)->push_back(surf);
+        module_det.add(module_layer_det);
+        //rec::VolPlane surf(module_layer_vol, surf_type, module_layer_thickness / 2.0,
+	//                 module_layer_thickness / 2.0, u, v,
+	//                 n);
+        //rec::volSurfaceList(module_layer_det)->push_back(surf);
       }
 
       PlacedVolume pv;
-      // place all the sensors into ring
+      // place all the modules into ring
       double r_offset = ring_inner_r + module_dr / 2.0;
       for (int i = 0; i < nmodule; ++i)
       {
@@ -191,52 +223,52 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
 	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);
+        DetElement negative_even_module_det = i > 0 ? module_det.clone(ring_vol_name + "_petalN" + std::to_string(2 * i)) : module_det;
+	pv = ringNegF_vol.placeVolume(module_vol, transform).addPhysVolID("module", 2 * i);
+        negative_even_module_det.setPlacement(pv);
+        ringNegF_det.add(negative_even_module_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);
+	DetElement positive_even_module_det = module_det.clone(ring_vol_name + "_petalP" + std::to_string(2 * i));
+        pv = ringPosF_vol.placeVolume(module_vol, transform).addPhysVolID("module", 2 * i);
+        positive_even_module_det.setPlacement(pv);
+        ringPosF_det.add(positive_even_module_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);
+	DetElement positive_odd_module_det = module_det.clone(ring_vol_name + "_petalP" + std::to_string(2 * i));
+        pv = ringPosR_vol.placeVolume(module_vol, transform).addPhysVolID("module", 2 * i + 1);
+        positive_odd_module_det.setPlacement(pv);
+        ringPosR_det.add(positive_odd_module_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);
+	DetElement negative_odd_module_det = module_det.clone(ring_vol_name + "_petalN" + std::to_string(2 * i));
+	pv = ringNegR_vol.placeVolume(module_vol, transform).addPhysVolID("module", 2 * i + 1);
+        negative_odd_module_det.setPlacement(pv);
+        ringNegR_det.add(negative_odd_module_det);
       }
 
       // place ring into layer
       pv = layer_vol.placeVolume(ringPosR_vol, Position(0, 0, +(SupportThickness + SiliconThickness) / 2.0));
-      pv = pv.addPhysVolID("sensor", std::stoi(ring_id));
+      pv = pv.addPhysVolID("ring", 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));
+      pv = pv.addPhysVolID("ring", 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));
+      pv = pv.addPhysVolID("ring", 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));
+      pv = pv.addPhysVolID("ring", std::stoi(ring_id));
       ringNegF_det.setPlacement(pv);
       layerNeg_det.add(ringNegF_det);
       // rotate and reflect ring
@@ -262,7 +294,7 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
       */
       dd4hep::rec::MultiRingsZDiskData::Ring ringData;
       ringData.petalNumber        = 2 * nmodule;
-      ringData.sensorsPerPetal    = 1;
+      ringData.sensorsPerPetal    = nrow*ncolumn;
       ringData.phi0               = phi0;
       ringData.phiOffsetOdd       = 2 * M_PI / nmodule;
       ringData.distance           = ring_inner_r;
diff --git a/Detector/DetCRD/src/Tracker/SiTrackerStaggeredLadder_v03_geo.cpp b/Detector/DetCRD/src/Tracker/SiTrackerStaggeredLadder_v03_geo.cpp
index 9a268d299b1d6190a6380b4a0bd90f5b3d239eb9..eea42eb38d2e44518722dda3c1854fdc5f55cc4d 100644
--- a/Detector/DetCRD/src/Tracker/SiTrackerStaggeredLadder_v03_geo.cpp
+++ b/Detector/DetCRD/src/Tracker/SiTrackerStaggeredLadder_v03_geo.cpp
@@ -254,7 +254,7 @@ static dd4hep::Ref_t create_element(dd4hep::Detector& theDetector, xml_h e, dd4h
     for (int sensor_id = 0; sensor_id < sensor_n; sensor_id++) {
       int irow            = std::floor(sensor_id/sensor_column_n);
       int icolumn         = sensor_id%sensor_column_n;
-      double ypos = module_y0 - module_width/2.0 + sensor_dead + sensor_side + irow*sensor_gap + (irow + 0.5)*sensor_width;
+      double ypos = module_y0 - module_width/2.0 + sensor_dead + irow*(sensor_gap + sensor_side*2) + (irow + 0.5)*sensor_width;
       double zpos = module_z0 - sensor_total_length/2.0 + sensor_side + icolumn*(sensor_gap + sensor_side*2) + (icolumn + 0.5)*sensor_length;
       pv = moduleLogical.placeVolume(sensorLogical, Position(0, ypos, zpos));
       pv.addPhysVolID("sensor", sensor_id);
diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp
index 9d0fab4cc9dc28a48c8cdaefdfa4662f8e29157f..66bc402b1e668ddaeb576d49068f91a70cb85bad 100644
--- a/Service/GearSvc/src/GearSvc.cpp
+++ b/Service/GearSvc/src/GearSvc.cpp
@@ -474,7 +474,7 @@ StatusCode GearSvc::convertMultiRingsZDisk(dd4hep::DetElement& ftd) {
 
   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;
+  std::vector<std::string> petalParNames, petalNSensorNames, phi0ParNames, distanceParNames, widthInnerParNames, widthOuterParNames, lengthParNames;
   for (int layer = 0; layer < nLayers; layer++) {
     dd4hep::rec::MultiRingsZDiskData::LayerLayout& ftdlayer = ftdlayers[layer];
 
@@ -489,19 +489,20 @@ StatusCode GearSvc::convertMultiRingsZDisk(dd4hep::DetElement& ftd) {
     auto& rings = ftdlayer.rings;
 
     petalParNames.push_back(std::string("PetalNumber_")+std::to_string(layer));
+    petalNSensorNames.push_back(std::string("PetalNSensor_")+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<int>    petalNumbers, petalNSensors;
     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;
+      petalNSensors.push_back(ring.sensorsPerPetal);
       phi0s.push_back(ring.phi0);
       //double phiOffsetOdd;
       distances.push_back(ring.distance*CLHEP::cm);
@@ -516,6 +517,7 @@ StatusCode GearSvc::convertMultiRingsZDisk(dd4hep::DetElement& ftd) {
       }
     }
     ftdParam->setIntVals(std::string("PetalNumber_")+std::to_string(layer), petalNumbers);
+    ftdParam->setIntVals(std::string("PetalNSensor_")+std::to_string(layer), petalNSensors);
     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);
@@ -554,6 +556,7 @@ StatusCode GearSvc::convertMultiRingsZDisk(dd4hep::DetElement& ftd) {
   ftdParam->setDoubleVals("ThicknessGlues", thicknessGlues);
   ftdParam->setDoubleVals("ThicknessServices", thicknessServices);
   ftdParam->setStringVals("PetalNumberNames", petalParNames);
+  ftdParam->setStringVals("PetalNSensorNames", petalNSensorNames);
   ftdParam->setStringVals("PetalPhi0Names", phi0ParNames);
   ftdParam->setStringVals("PetalDistanceNames", distanceParNames);
   ftdParam->setStringVals("PetalInnerWidthNames", widthInnerParNames);
diff --git a/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc b/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc
index 22d54a1fb8ab3903e293e1de8005bdd240634833..10ef634effd0b9ca46635a0ecc89b6af2a8b4b2f 100644
--- a/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc
+++ b/Utilities/KalDet/src/ild/ftd/CEPCITKEndcapKalDetector.cc
@@ -159,17 +159,25 @@ void CEPCITKEndcapKalDetector::create_segmented_disk_layers(int idisk, int iring
   int zsign       = zpos > 0 ? 1 : -1;
   int start_index = even_petals ? 0 : 1;
 
+  int nsensor = _disksData.layers[idisk].rings[iring].sensorsPerPetal;
+  std::vector<int> module_ids;
   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());
+    if (nsensor == 1) {
+      encoder[CEPCConf::DetCellID::sensor] = iring;
+      module_ids.push_back(encoder.lowWord());
+    }
+    else {
+      for (int isensor = 0; isensor < nsensor; isensor++) {
+        encoder[CEPCConf::DetCellID::sensor] = iring + (isensor<<3);
+        module_ids.push_back(encoder.lowWord());
+      }
+    }
   }
   
   // create segmented disk
@@ -241,6 +249,7 @@ void CEPCITKEndcapKalDetector::setupGearGeom(const gear::GearMgr& gearMgr) {
     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> petalNSenParNames  = params.getStringVals("PetalNSensorNames");
     std::vector<std::string> phi0ParNames       = params.getStringVals("PetalPhi0Names");
     std::vector<std::string> distanceParNames   = params.getStringVals("PetalDistanceNames");
     std::vector<std::string> widthInnerParNames = params.getStringVals("PetalInnerWidthNames");
@@ -261,7 +270,8 @@ void CEPCITKEndcapKalDetector::setupGearGeom(const gear::GearMgr& gearMgr) {
       //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<int>    petals      = params.getIntVals(petalParNames[idisk]);
+      std::vector<int>    nsensors    = params.getIntVals(petalNSenParNames[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]);
@@ -270,15 +280,16 @@ void CEPCITKEndcapKalDetector::setupGearGeom(const gear::GearMgr& gearMgr) {
       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.petalNumber        = petals[iring];
+	ring.sensorsPerPetal    = nsensors[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];
+	ring.thicknessGlue      = tGlues[idisk];
+	ring.thicknessService   = tServices[idisk];
 	disk.rings.push_back(ring);
       }
       _disksData.layers.push_back(disk);