diff --git a/Detector/DetCEPCv4/CMakeLists.txt b/Detector/DetCEPCv4/CMakeLists.txt
index c273799ff5c77a71140dafd9ba011b56a4b28f15..19046a6924f3b444505c0389300cc71c283fafeb 100644
--- a/Detector/DetCEPCv4/CMakeLists.txt
+++ b/Detector/DetCEPCv4/CMakeLists.txt
@@ -29,6 +29,7 @@ gaudi_add_module(DetCEPCv4
                          src/calorimeter/SEcal05_Endcaps.cpp
                          src/calorimeter/SEcal05_ECRing.cpp
                          src/calorimeter/SHcalRpc01_Barrel.cpp
+                         src/calorimeter/SHcalRpc02_Barrel.cpp
                          src/calorimeter/SHcalRpc01_Endcaps.cpp
                          src/calorimeter/SHcalRpc01_EndcapRing.cpp
 			 src/calorimeter/Yoke05_Barrel.cpp
diff --git a/Detector/DetCEPCv4/src/calorimeter/SHcalRpc02_Barrel.cpp b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc02_Barrel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5d22cfcebe2dded2800c2f787e5cbe0b11b8e188
--- /dev/null
+++ b/Detector/DetCEPCv4/src/calorimeter/SHcalRpc02_Barrel.cpp
@@ -0,0 +1,349 @@
+//====================================================================
+//  SHcalRpc02 - update fixed 8 staves to optinal staves, FU Chengdong 
+//  SHcalRpc01 - Implementation from ILCSoft's Mokka version                              
+//====================================================================
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/DD4hepUnits.h"
+#include "DD4hep/DetType.h"
+#include "DDSegmentation/TiledLayerGridXY.h"
+
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "XML/Utilities.h"
+
+using namespace std;
+
+using dd4hep::Ref_t;
+using dd4hep::BUILD_ENVELOPE;
+using dd4hep::DetElement;
+using dd4hep::Detector;
+using dd4hep::SensitiveDetector;
+using dd4hep::Segmentation;
+using dd4hep::Readout;
+using dd4hep::Material;
+using dd4hep::Volume;
+using dd4hep::PlacedVolume;
+using dd4hep::Position;
+using dd4hep::RotationZYX;
+using dd4hep::RotationZ;
+using dd4hep::Transform3D;
+using dd4hep::Box;
+using dd4hep::Tube;
+using dd4hep::PolyhedraRegular;
+using dd4hep::SubtractionSolid;
+using dd4hep::_toString;
+using dd4hep::pi;
+using dd4hep::rec::LayeredCalorimeterData;
+
+/** Construction of SHcalRpc01 detector, ported from Mokka driver SHcalRpc01.cc
+ *
+ *  Mokka History:
+ * - first implementation from ILCSoft
+ * - http://cepcgit.ihep.ac.cn/cepcsoft/MokkaC
+ */
+static Ref_t create_detector(Detector& theDetector, xml_h element, SensitiveDetector sens)  {
+  cout << "--------------------------" << endl;
+  cout << "creating SHcalRpc01_Barrel" << endl;
+  cout << "--------------------------" << endl;
+
+  xml_det_t    x_det  = element;
+  string       name   = x_det.nameStr();
+  int          det_id = x_det.id();
+  DetElement   det(name, det_id);
+
+  Volume envelope = dd4hep::xml::createPlacedEnvelope(theDetector, element , det ) ;
+  envelope.setVisAttributes(theDetector, "GrayVis");
+  dd4hep::xml::setDetectorTypeFlag(element, det) ;
+
+  if( theDetector.buildType() == BUILD_ENVELOPE ) return det ;
+
+  xml_comp_t    x_staves          = x_det.staves();
+  string   Hcal_radiator_material = x_staves.materialStr();
+  Material      stavesMaterial    = theDetector.material(Hcal_radiator_material);
+  Material      air               = theDetector.air();
+
+  sens.setType("calorimeter");
+
+  Readout readout = sens.readout();
+  Segmentation seg = readout.segmentation();
+  dd4hep::DDSegmentation::TiledLayerGridXY* tiledSeg = dynamic_cast<dd4hep::DDSegmentation::TiledLayerGridXY*> (seg.segmentation());
+  assert(tiledSeg && "no TiledLayerGridXY found" );
+
+  std::vector<double> cellSizeVector = seg.segmentation()->cellDimensions(0);
+  double cell_sizeX      = cellSizeVector[0];
+  double cell_sizeZ      = cellSizeVector[1];
+
+  double Hcal_inner_radius            = theDetector.constant<double>("Hcal_inner_radius");
+  double Hcal_outer_radius_set        = theDetector.constant<double>("Hcal_outer_radius");
+  double Hcal_half_length             = theDetector.constant<double>("Hcal_half_length");
+  int    Hcal_inner_symmetry          = theDetector.constant<int>("Hcal_inner_symmetry");
+  int    Hcal_outer_symmetry          = 0;
+  double Hcal_lateral_plate_thickness = theDetector.constant<double>("Hcal_lateral_structure_thickness");
+  double Hcal_modules_gap             = theDetector.constant<double>("Hcal_modules_gap");
+  double Ecal_outer_radius            = theDetector.constant<double>("Ecal_outer_radius");
+  int    Hcal_barrel_number_modules   = theDetector.constant<int>("Hcal_barrel_number_modules");
+  
+  double hPrime   = Ecal_outer_radius + theDetector.constant<double>("Hcal_Ecal_gap");
+  Hcal_inner_radius = hPrime / cos(pi/Hcal_inner_symmetry);
+  
+  double Hcal_normal_dim_z = (2*Hcal_half_length - (Hcal_barrel_number_modules-1)*Hcal_modules_gap)/Hcal_barrel_number_modules;
+
+  xml_coll_t c(x_det,_U(layer));
+  xml_comp_t x_layer = c;
+  int         Hcal_nlayers = x_layer.repeat();
+
+  double Hcal_radiator_thickness = 0;
+  double layerThickness = 0.0;
+  for(xml_coll_t k(x_layer,_U(slice)); k; ++k)  {
+    xml_comp_t x_slice = k;
+    layerThickness += x_slice.thickness();
+    if(x_slice.materialStr()==Hcal_radiator_material) Hcal_radiator_thickness = x_slice.thickness();
+  }
+  cout << " inner symmetry = " << Hcal_inner_symmetry << endl;
+  cout << " Hcal_inner_radius = " << hPrime << endl;
+  cout << " cell size xy = " <<  cell_sizeX << " cell size z = " << cell_sizeZ << endl;
+  cout << " layer_thickness (from slices) = " << layerThickness << " and radiator_thickness = " << Hcal_radiator_thickness << endl;
+  double Hcal_chamber_thickness = layerThickness - Hcal_radiator_thickness; 
+
+  int MinNumCellsInTransvPlane  = theDetector.constant<int>("Hcal_MinNumCellsInTransvPlane");
+  double RPC_EdgeWidth          = theDetector.constant<double>("Hcal_gas_edge_width");
+  double RPCGazInletInnerRadius = theDetector.constant<double>("Hcal_gasInlet_inner_radius");
+  double RPCGazInletOuterRadius = theDetector.constant<double>("Hcal_gasInlet_outer_radius");
+  double RPCGazInletLength      = theDetector.constant<double>("Hcal_gasInlet_length");
+  double RPC_PadSeparation      = theDetector.constant<double>("Hcal_pad_separation");
+  double Hcal_spacer_thickness  = theDetector.constant<double>("Hcal_spacer_thickness");
+  double Hcal_spacer_separation = theDetector.constant<double>("Hcal_spacer_separation");
+
+  //========== fill data for reconstruction ============================
+  LayeredCalorimeterData* caloData = new LayeredCalorimeterData ;
+  caloData->layoutType = LayeredCalorimeterData::BarrelLayout ;
+  caloData->inner_symmetry = Hcal_inner_symmetry  ;
+  caloData->outer_symmetry = Hcal_outer_symmetry  ;
+  caloData->phi0 = 0 ; // fg: also hardcoded below
+
+  // general calculated parameters
+  double AngleRatio=tan(dd4hep::pi/Hcal_inner_symmetry);
+  double d_InnerOctoSize=2*AngleRatio*Hcal_inner_radius;//"d"
+  double LMin = 2*RPC_EdgeWidth+cell_sizeX*MinNumCellsInTransvPlane+(MinNumCellsInTransvPlane+1)*RPC_PadSeparation;
+  cout << "LMin=" << LMin << endl;
+  double Ynl = 0.5*d_InnerOctoSize - Hcal_nlayers*layerThickness/tan(dd4hep::twopi/Hcal_inner_symmetry);
+  double Hcal_outer_radius = sqrt((LMin-Ynl)*(LMin-Ynl) + (hPrime + Hcal_nlayers*layerThickness)*(hPrime + Hcal_nlayers*layerThickness));
+  if(Hcal_outer_radius!=Hcal_outer_radius_set){
+    cout << "calculated Hcal_outer_radius != input, will impact HcalEndcap and HcalEndcapRing. Hcal_outer_radius = " << Hcal_outer_radius
+	 << " but set as " << Hcal_outer_radius_set << " difference = " << Hcal_outer_radius-Hcal_outer_radius_set << endl;
+    cout << "if Coil put inside of Hcal, it is possible!" << endl;  
+  }
+
+  /// extent of the calorimeter in the r-z-plane [ rmin, rmax, zmin, zmax ] in cm.
+  caloData->extent[0] = Hcal_inner_radius ;
+  caloData->extent[1] = Hcal_outer_radius ;
+  caloData->extent[2] = 0. ; // Barrel zmin is "0" by default.
+  caloData->extent[3] = Hcal_half_length ;
+
+  double Hcal_total_dim_y = Hcal_outer_radius - hPrime;
+  
+  // the  y_dim1_for_z kept as the original value in TDR
+  double Hcal_regular_chamber_dim_z = Hcal_normal_dim_z - 2 *(Hcal_lateral_plate_thickness);
+  //int N_cells_z =  static_cast <int> ( (Hcal_regular_chamber_dim_z - 2*RPC_EdgeWidth - RPC_PadSeparation) / (Hcal_cell_dim_x + RPC_PadSeparation) );
+  //  Hcal_cell_dim_z=(Hcal_regular_chamber_dim_z-RPC_PadSeparation )/N_cells_z
+  //                      - RPC_PadSeparation;
+  Tube solidCaloTube(0, Hcal_outer_radius, Hcal_half_length);
+
+  PolyhedraRegular solidOctogon(Hcal_inner_symmetry, 0, hPrime, 4*Hcal_half_length);
+  RotationZYX rotOctogon(dd4hep::twopi/2/Hcal_inner_symmetry,0,0);
+  SubtractionSolid solidCalo(solidCaloTube, solidOctogon, rotOctogon);
+  Volume logicCalo(name+"_radiator", solidCalo, stavesMaterial);
+  logicCalo.setAttributes(theDetector,x_det.regionStr(),x_det.limitsStr(),x_det.visStr());
+  PlacedVolume calo_pv = envelope.placeVolume(logicCalo, Position(0,0,0));
+  DetElement calo(det, "envelope", det_id);
+  calo.setPlacement(calo_pv);
+  if(tiledSeg) tiledSeg->setOffsetY(-(Hcal_regular_chamber_dim_z/2.-RPC_EdgeWidth)+0.5*cell_sizeZ);
+  for(int layer_id=1; layer_id<=Hcal_nlayers; layer_id++){
+    double yn = sqrt(Hcal_outer_radius*Hcal_outer_radius - (hPrime + layer_id*layerThickness)*(hPrime + layer_id*layerThickness));
+    double Yn = 0.5*d_InnerOctoSize - layer_id*layerThickness/tan(dd4hep::twopi/Hcal_inner_symmetry);
+
+    double halfX = Hcal_chamber_thickness/2.;
+    double halfY = (yn+Yn)/2.;
+    
+    LayeredCalorimeterData::Layer caloLayer ;
+    caloLayer.cellSize0 = cell_sizeX;
+    caloLayer.cellSize1 = cell_sizeZ;
+
+    //double halfZ = Hcal_normal_dim_z / 2.;
+    double halfZ = Hcal_regular_chamber_dim_z / 2.;
+    
+    double localXPos = hPrime + Hcal_radiator_thickness + Hcal_chamber_thickness/2. + (layer_id-1)*layerThickness;
+    double localYPos = -Yn + 0.5*(Yn + yn);
+
+    Box chamberSolid(halfY, halfZ, halfX);
+    string chamberLogical_name      = name+_toString(layer_id,"_layer%d");
+    Volume chamberLogical(chamberLogical_name, chamberSolid, air);
+    chamberLogical.setAttributes(theDetector, x_layer.regionStr(), x_layer.limitsStr(), x_layer.visStr());
+
+    if(tiledSeg) tiledSeg->setLayerOffsetX((-(halfY-RPC_EdgeWidth)+0.5*cell_sizeX)*2/cell_sizeX);
+
+    string layer_name      = name+_toString(layer_id,"_layer%d");
+
+    double nRadiationLengths=0.;
+    double nInteractionLengths=0.;
+    double thickness_sum=0;
+
+    nRadiationLengths   = Hcal_radiator_thickness/(stavesMaterial.radLength());
+    nInteractionLengths = Hcal_radiator_thickness/(stavesMaterial.intLength());
+
+    double slice_pos_z = -halfX;
+    int slice_number = 0;
+    for(xml_coll_t k(x_layer,_U(slice)); k; ++k)  {
+      xml_comp_t x_slice = k;
+      if(x_slice.materialStr()==Hcal_radiator_material) continue;
+      string   slice_name      = layer_name + _toString(slice_number,"_slice%d");
+      double   slice_thickness = x_slice.thickness();
+      Material slice_material  = theDetector.material(x_slice.materialStr());
+      if(layer_id==1) cout<<"  Layer_slice:  "<<  slice_name<<" slice_thickness:  "<< slice_thickness<< endl;
+      
+      slice_pos_z += slice_thickness/2.;
+      nRadiationLengths   += slice_thickness/(2.*slice_material.radLength());
+      nInteractionLengths += slice_thickness/(2.*slice_material.intLength());
+      thickness_sum       += slice_thickness/2;
+
+      // Slice volume & box
+      Box sliceSolid(halfY, halfZ, slice_thickness/2.);
+      Volume sliceVol(slice_name, sliceSolid, slice_material);
+      
+      if ( x_slice.isSensitive() ) {
+	sliceVol.setSensitiveDetector(sens);
+	if(RPC_EdgeWidth>0){
+	  double RPC_GazInlet_In_Z  = halfZ - RPC_EdgeWidth - RPCGazInletOuterRadius;
+	  double RPC_GazInlet_In_Y  = halfY - RPC_EdgeWidth/2;
+	  double RPC_GazInlet_Out_Z = -RPC_GazInlet_In_Z;
+	  double RPC_GazInlet_Out_Y =  RPC_GazInlet_In_Y;
+
+	  string mateialName = x_slice.attr<string>(_Unicode(edge_material));
+	  Material edge_material = theDetector.material(mateialName);
+	  Box solidRPCEdge1(halfY, halfZ, slice_thickness/2.);
+	  Box solidRPCEdge2(halfY-RPC_EdgeWidth, halfZ-RPC_EdgeWidth, slice_thickness/2.);
+	  SubtractionSolid solidRPCEdge(solidRPCEdge1, solidRPCEdge2, Position(0,0,0));
+	  Volume logicRPCEdge(slice_name+"_edge", solidRPCEdge, edge_material);
+	  logicRPCEdge.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+	  sliceVol.placeVolume(logicRPCEdge);
+
+	  RotationZYX rotGaz(0, pi/2., 0);
+	  Tube solidRPCGazInlet(RPCGazInletInnerRadius,RPCGazInletOuterRadius,RPC_EdgeWidth/*RPCGazInletLength*//2);
+	  Volume logicRPCGazInlet(slice_name+"_GazInlet", solidRPCGazInlet, edge_material);
+	  logicRPCGazInlet.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+	  logicRPCEdge.placeVolume(logicRPCGazInlet, Transform3D(rotGaz, Position(RPC_GazInlet_In_Y,RPC_GazInlet_In_Z, 0)));
+	  logicRPCEdge.placeVolume(logicRPCGazInlet, Transform3D(rotGaz, Position(RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z, 0)));
+	  
+	  Tube solidRPCGazInsideInlet(0,RPCGazInletInnerRadius,RPC_EdgeWidth/*RPCGazInletLength*//2);
+	  Volume logicRPCGazInsideInlet(slice_name+"_GazInsideInlet", solidRPCGazInsideInlet, slice_material);
+	  logicRPCGazInsideInlet.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),"SeeThrough");
+	  logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Transform3D(rotGaz, Position(RPC_GazInlet_In_Y,RPC_GazInlet_In_Z, 0)));
+	  logicRPCEdge.placeVolume(logicRPCGazInsideInlet, Transform3D(rotGaz,Position(RPC_GazInlet_Out_Y,RPC_GazInlet_Out_Z, 0)));
+	}
+	if(Hcal_spacer_thickness>0){
+	  Tube solidRPCSpacer(0,Hcal_spacer_thickness/2,slice_thickness/2);
+	  Material space_material = theDetector.material(x_slice.attr<string>(_Unicode(spacer_material)));
+	  Volume logicRPCSpacer(slice_name+"_spacer", solidRPCSpacer, space_material);
+	  logicRPCSpacer.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+	  RotationZYX rotSpacer(0, 0, 0);
+	  
+	  double gap_hZ = halfZ-RPC_EdgeWidth;
+	  double gap_hY = halfY-RPC_EdgeWidth;
+	  int y_number_of_separations = (int)(2*gap_hY/Hcal_spacer_separation);
+	  int z_number_of_separations = (int)(2*gap_hZ/Hcal_spacer_separation);
+	  double y_lateral_space = (2*gap_hY - y_number_of_separations*Hcal_spacer_separation)/2;
+	  double z_lateral_space = (2*gap_hZ - z_number_of_separations*Hcal_spacer_separation)/2;
+	  if(y_lateral_space < Hcal_spacer_thickness/2.){
+	    y_number_of_separations = (int)((2*gap_hY-Hcal_spacer_thickness)/Hcal_spacer_separation);
+	    y_lateral_space = (2*gap_hY - y_number_of_separations*Hcal_spacer_separation)/2;
+	  }
+	  if(z_lateral_space < Hcal_spacer_thickness/2.){
+	    z_number_of_separations = (int)((2*gap_hZ-Hcal_spacer_thickness)/Hcal_spacer_separation);
+	    z_lateral_space = (2*gap_hZ - z_number_of_separations*Hcal_spacer_separation)/2;
+	  }
+	  for(int y_counter = 0; y_counter <=y_number_of_separations; y_counter++){
+	    double SpacerY = gap_hY - y_lateral_space - y_counter*Hcal_spacer_separation;
+	    for(int z_counter = 0; z_counter <=z_number_of_separations; z_counter++){
+	      double SpacerZ = gap_hZ - z_lateral_space - z_counter*Hcal_spacer_separation;
+	      PlacedVolume space_pv = sliceVol.placeVolume(logicRPCSpacer, Transform3D(rotSpacer, Position(SpacerY,SpacerZ,0)));
+	    }
+	  }
+	}
+
+	caloLayer.inner_nRadiationLengths = nRadiationLengths;
+	caloLayer.inner_nInteractionLengths = nInteractionLengths;
+	caloLayer.inner_thickness = thickness_sum;
+	if(layer_id==1) cout<<"Hcal_Barrel:  inner_thickness= "<<thickness_sum<<endl;
+        //Store readout gasgap thickness
+	caloLayer.sensitive_thickness = slice_thickness;
+        //Reset counters to measure "outside" quantitites
+	nRadiationLengths=0.;
+	nInteractionLengths=0.;
+	thickness_sum = 0.;
+	
+	sliceVol.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),"SeeThrough");
+      }
+      else{
+	sliceVol.setAttributes(theDetector,x_slice.regionStr(),x_slice.limitsStr(),x_slice.visStr());
+      }
+      nRadiationLengths += slice_thickness/(2.*slice_material.radLength());
+      nInteractionLengths += slice_thickness/(2.*slice_material.intLength());
+      thickness_sum += slice_thickness/2;
+
+      // slice PlacedVolume
+      PlacedVolume slice_phv = chamberLogical.placeVolume(sliceVol,Position(0,0,slice_pos_z));
+      if ( x_slice.isSensitive() ) {
+	int slice_id  = (layer_id > Hcal_nlayers)? 1:-1;
+	slice_phv.addPhysVolID("layer",layer_id).addPhysVolID("slice",slice_id);
+      }
+      DetElement sliceDetE(layer_name,_toString(slice_number,"slice%d"),x_det.id());
+      sliceDetE.setPlacement(slice_phv);
+      // Increment x position for next slice.
+      slice_pos_z += slice_thickness/2.;
+      // Increment slice number.
+      ++slice_number;
+    }
+    caloLayer.outer_nRadiationLengths = nRadiationLengths;
+    caloLayer.outer_nInteractionLengths = nInteractionLengths;
+    caloLayer.outer_thickness = thickness_sum;
+    if(layer_id==1) cout << "Hcal_Barrel:  outer_thickness= " << thickness_sum << endl;
+    
+    double chamber_y_offset = -(-Hcal_total_dim_y/2. + (layer_id-1)*layerThickness + layerThickness/2.);
+
+    caloLayer.distance = Hcal_inner_radius + Hcal_total_dim_y/2.0 + chamber_y_offset ;
+    caloLayer.absorberThickness = Hcal_radiator_thickness ;
+
+    caloData->layers.push_back( caloLayer ) ;
+    
+    double stave_phi_offset, module_z_offset;
+    
+    //stave_phi_offset = pi/Hcal_inner_symmetry;
+    stave_phi_offset = pi*0.5;
+    for(int stave_id = 1; stave_id <= Hcal_inner_symmetry; stave_id++){
+      double phirot = stave_phi_offset+(stave_id-1)*pi/Hcal_inner_symmetry*2;
+
+      RotationZYX rot(pi/2, pi/2, 0); //phirot);
+      RotationZ rotZ(phirot);
+      RotationZYX rotAll = rotZ*rot;
+      RotationZYX rotInverse(phirot, 0, 0);
+      for(int module_id = 1; module_id <= Hcal_barrel_number_modules; module_id++){
+        module_z_offset = - Hcal_half_length + Hcal_normal_dim_z/2. + (module_id-1)*(Hcal_normal_dim_z+Hcal_modules_gap);
+	
+        Position localPos(localXPos,localYPos,module_z_offset);
+        Position newPos = rotInverse*localPos;
+
+	Transform3D tran3D(rotAll, newPos);
+	PlacedVolume pv = logicCalo.placeVolume(chamberLogical, tran3D);
+	pv.addPhysVolID("stave",stave_id).addPhysVolID("module",module_id);//.addPhysVolID("layer",layer_id);
+	DetElement layer(calo, name+_toString(stave_id,"_stave%d")+_toString(module_id,"_module%d")+_toString(layer_id,"_layer%d"), det_id);
+	layer.setPlacement(pv);
+      }
+    }
+  }
+
+  det.addExtension< LayeredCalorimeterData >( caloData ) ;
+
+  return det;
+}
+
+DECLARE_DETELEMENT(SHcalRpc02_Barrel, create_detector)
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml
index 58c49be508361d1e5241bf4e77fda26bb9d177ba..9f9aa7edc209ad3be8bcffea20edb0399dac3303 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Beampipe_v01_01.xml
@@ -15,7 +15,7 @@
   <detectors>        
     <detector name="BeamPipe" type="DD4hep_CRDBeamPipe_v01" vis="BeamPipeVis">
       <parameter crossingangle="CrossingAngle" />
-      <envelope vis="BlueVis">
+      <envelope>
 	<shape type="Assembly"/>
       </envelope>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml
index a135d6eda279f136833d95e3c959db1a00520fbe..de8a6218ce18f1ea3e3780a9486b0343012001c3 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Coil_Simple_v01_01.xml
@@ -1,21 +1,34 @@
 <lccdd>
   <detectors>
-    <detector name="Coil" type="SCoil02" vis="SOLVis" id="DetID_COIL" insideTrackingVolume="false" readout="COILCollection">
-      <envelope vis="SeeThrough">
-	<shape type="Tube" rmin="Solenoid_inner_radius" rmax="Solenoid_outer_radius" dz="Solenoid_half_length" material="Air"/>
+    <detector name="Coil" type="DD4hep_Solenoid_o1_v01" id="DetID_COIL" insideTrackingVolume="false" readout="COILCollection">
+      <envelope>
+	<shape type="Tube" rmin="Solenoid_inner_radius" rmax="Solenoid_outer_radius" dz="Solenoid_half_length" material="Vacuum"/>
       </envelope>
   
       <type_flags type=" DetType_SUPPORT + DetType_COIL " />
-  
-      <!--fg: for now only a simple aluminum cylinder is created inside the envelope -->
-      <tube rmin="Solenoid_inner_radius" rmax="Solenoid_outer_radius" dz="Solenoid_half_length" material="G4_Al"/>
       
+      <!-- slice can put as sensitive (tracker type), currently without sensitive, so COILCollection is null -->
+      <layer id="0" inner_r="Solenoid_inner_radius" outer_z="Solenoid_half_length" vis="SeeThrough">
+	<slice material="g10" thickness="3*mm" vis="SOLVis"/>
+	<slice material="Vacuum" thickness="6*mm" vis="Invisible"/>
+	<slice material="G4_Al" thickness="6*mm" vis="SOLVis"/>
+      </layer>
+
+      <layer id="1" inner_r="SolenoidCoil_radius" outer_z="Solenoid_half_length" vis="SeeThrough">
+	<slice material="G4_Al" thickness="55*mm" vis="SOLVis"/>
+      </layer>
+
+      <layer id="2" inner_r="Solenoid_outer_radius-27*mm" outer_z="Solenoid_half_length" vis="SeeThrough">
+        <slice material="G4_Al" thickness="6*mm" vis="SOLVis"/>
+        <slice material="Vacuum" thickness="6*mm" vis="Invisible"/>
+        <slice material="G4_Al" thickness="15*mm" vis="SOLVis"/>
+      </layer>
     </detector>
   </detectors>
 
   <readouts>
     <readout name="COILCollection">
-      <id>system:5,side:-2,layer:9,module:8,sensor:8,barrelside:-2</id>
+      <id>system:5,side:-2,layer:9,slice:8,sensor:8,barrelside:-2</id>
     </readout>
   </readouts>
 </lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml
index d810f8d33ad9ce5bacf9a3fed36de49befee1943..a1da4667959fef300391a3b19fc1b2642ea7afc4 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_01.xml
@@ -54,7 +54,7 @@
   <detectors>
     <detector id="DetID_DC" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="DCVis" sensitive="true" region="DriftChamberRegion" limits="DC_limits">
       <chamber id="0"/>
-      <envelope vis="SeeThrough">
+      <envelope>
         <shape type="BooleanShape" operation="Union" material="Air">
           <shape type="Tube" rmin="SDT_radius_min" rmax="SDT_radius_max" dz="SDT_half_length" />
         </shape>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_02.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ae4ccbe02f9e834bf72b242e8ee9ca15c839449a
--- /dev/null
+++ b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_02.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+
+  <info name="DriftChamber"
+    title="Test with Drift Chamber"
+    author="Tao Lin"
+    url="http://github.com/cepc/CEPCSW"
+    status="development"
+    version="v0">
+    <comment>Test with Drift Chamber</comment>
+  </info>
+
+  <define>
+
+    <!-- SDT -->
+    <constant name="SDT_radius_min" value="DC_inner_radius"/>
+    <constant name="SDT_radius_max" value="DC_outer_radius"/>
+
+    <constant name="SDT_half_length" value="MainTracker_half_length"/>
+    <constant name="DC_length" value="DC_half_length*2"/>
+    <constant name="SDT_length" value="SDT_half_length*2"/>
+
+    <constant name="SDT_chamber_radius_min" value="DC_chamber_layer_rbegin-DC_safe_distance"/>
+    <constant name="SDT_chamber_radius_max" value="DC_chamber_layer_rend+DC_safe_distance"/>
+    <constant name="SDT_chamber_half_length" value="DC_half_length"/>
+
+    <constant name="SDT_chamber_layer_width" value="10*mm"/>
+    <constant name="SDT_chamber_cell_width" value="10*mm"/>
+    <constant name="Epsilon" value="0*deg"/>
+
+    <constant name="SDT_chamber_inner_wall_radius_min" value="SDT_chamber_radius_min-SDT_inner_wall_thickness"/>
+    <constant name="SDT_chamber_inner_wall_radius_max" value="SDT_chamber_radius_min"/>
+    <constant name="SDT_chamber_outer_wall_radius_min" value="SDT_chamber_radius_max"/>
+    <constant name="SDT_chamber_outer_wall_radius_max" value="SDT_chamber_radius_max+SDT_outer_wall_thickness"/>
+
+    <constant name="DC_Endcap_rmin" value="SDT_radius_min"/>
+    <constant name="DC_Endcap_rmax" value="SDT_radius_max"/>
+
+  </define>
+
+  <limits>
+    <limitset name="DC_limits">
+      <limit name="step_length_max" particles="*" value="10" unit="mm" />
+    </limitset>
+  </limits>
+
+  <regions>
+    <region name="DriftChamberRegion">
+      <limitsetref name="DC_limits"/>
+    </region>
+  </regions>
+
+  <detectors>
+    <detector id="DetID_DC" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="DCVis" sensitive="true" insideTrackingVolume="true" limits="DC_limits">
+      <chamber id="0"/>
+      <envelope>
+        <shape type="BooleanShape" operation="Union" material="Air">
+          <shape type="Tube" rmin="SDT_radius_min" rmax="SDT_radius_max" dz="SDT_half_length" />
+        </shape>
+      </envelope>
+
+      <module id="0" name="SignalWire" type="Tube" rmin="0*mm" rmax="0.01*mm" vis="RedVis">
+          <tubs name="W" type="Tube" rmin="0*mm" rmax="0.007*mm" material="Tungsten"/>
+          <tubs name="Au" type="Tube" rmin="0.007*mm" rmax="0.01*mm" material="Gold"/>
+      </module>
+
+      <module id="1" name="FieldWire" type="Tube" rmin="0*mm" rmax="0.02*mm" vis="GreenVis">
+          <tubs name="Al" type="Tube" rmin="0*mm" rmax="0.017*mm" material="Aluminum"/>
+          <tubs name="Ag" type="Tube" rmin="0.017*mm" rmax="0.02*mm" material="Silver"/>
+      </module>
+
+      <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_GASEOUS + DetType_WIRE"/>
+      <!-- Use cm as unit if you want to use Pandora for reconstruction -->
+     <sensitive type="SimpleDriftChamber"/>
+     </detector>
+  </detectors>
+
+  <readouts>
+    <readout name="DriftChamberHitsCollection">
+      <segmentation type="GridDriftChamber" cell_size="SDT_chamber_cell_width" epsilon0="Epsilon" detector_length="DC_length" identifier_phi="cellID" DC_rbegin="DC_chamber_layer_rbegin" DC_rend="DC_chamber_layer_rend" DC_rmin="SDT_chamber_radius_min" DC_rmax="SDT_chamber_radius_max" safe_distance="DC_safe_distance" layerID="layer" layer_width="SDT_chamber_layer_width"/>
+
+      <!-- <id>system:8,chamber:1,layer:8,cellID:16</id> -->
+      <id>system:5,layer:7:9,chamber:8,cellID:32:16</id>
+    </readout>
+  </readouts>
+
+</lccdd>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml
index f6f865ea47763225fcef3ab8065db1a2a386fe17..e2a87e6638e864da3d20068616e396ff8101ca66 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_01.xml
@@ -22,7 +22,7 @@
 
   <detectors>
     <detector id="DetID_FTD" name="FTD" type="FTD_Simple_Staggered" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true">
-      <envelope vis="FTDVis">
+      <envelope>
         <shape type="BooleanShape" operation="Subtraction" material="Air" >
           <shape type="BooleanShape" operation="Subtraction" material="Air" >
             <shape type="BooleanShape" operation="Subtraction" material="Air" >
diff --git a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml
index afbb943147743d9a783c886da870c60feab9ee60..056bbd1d28db66d3912016297974f74d0dbef394 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/FTD_SimpleStaggered_v01_02.xml
@@ -21,7 +21,7 @@
 
   <detectors>
     <detector id="DetID_FTD" name="FTD" type="FTD_Simple_Staggered" vis="FTDVis" readout="FTDCollection" insideTrackingVolume="true">
-      <envelope vis="FTDVis">
+      <envelope>
         <shape type="BooleanShape" operation="Subtraction" material="Air" >
           <shape type="BooleanShape" operation="Subtraction" material="Air" >
             <shape type="BooleanShape" operation="Subtraction" material="Air" >
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml
index a65ff1dc17fcceb0db7f2e97ba6c5d0220e9f054..3b44ce6bd968c02a20b85d055e5932ae3b211970 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml
@@ -4,12 +4,13 @@
     <constant name="Hcal_inner_radius" value="Hcal_barrel_inner_radius"/>
     <constant name="Hcal_half_length" value="Hcal_barrel_half_length"/>
     <constant name="Hcal_inner_symmetry" value="Hcal_barrel_symmetry"/>
-    <constant name="Hcal_nlayers" value="40"/>
+    <!--40->35, if 40 and symmetry=12, out radius will exceed the Hcal_barrel_outer_radius, or change layer thickness in future-->
+    <constant name="Hcal_nlayers" value="35"/>
     <constant name="Hcal_Ecal_gap" value="Hcal_barrel_inner_radius-Ecal_barrel_outer_radius"/>
     <constant name="Ecal_outer_radius" value="Ecal_barrel_outer_radius"/>
     
     <constant name="Hcal_radiator_thickness" value="20.0*mm"/>
-    <constant name="Hcal_airgap_thickness" value="1*mm"/>
+    <constant name="Hcal_airgap_thickness" value="0.88*mm"/>
     <constant name="Hcal_mylar_cathode_thickness" value="0.18*mm"/>
     <constant name="Hcal_graphite_cathode_thickness" value="0.05*mm"/>
     <constant name="Hcal_glass_cathode_thickness" value="1.1*mm"/>
@@ -21,7 +22,7 @@
     <constant name="Hcal_electronics_mask_thickness" value="1.6*mm"/>
     
     <constant name="Hcal_gas_edge_width" value="1*mm"/>
-    <constant name="Hcal_MinNumCellsInTransvPlane" value="11"/>
+    <constant name="Hcal_MinNumCellsInTransvPlane" value="1"/>
     <constant name="Hcal_barrel_number_modules" value="5"/>
     <constant name="Hcal_chamber_thickness" value="6.73*mm"/>
     <constant name="Hcal_back_plate_thickness" value="15*mm"/>
@@ -38,15 +39,15 @@
   </define>
 
   <detectors>
-    <detector name="HcalBarrel" type="SHcalRpc01_Barrel" id="DetID_HCAL" readout="HcalBarrelCollection" vis="GreenVis" insideTrackingVolume="false" >
+    <detector name="HcalBarrel" type="SHcalRpc02_Barrel" id="DetID_HCAL" readout="HcalBarrelCollection" vis="GreenVis" insideTrackingVolume="false" >
       <comment>Hadron Calorimeter Barrel</comment>
-      <envelope vis="HCALVis">
+      <envelope>
         <shape type="BooleanShape" operation="Subtraction" material="Air" >
           <shape type="Cone" z="Hcal_barrel_half_length + env_safety/2" rmin1="0.0" rmax1="Hcal_barrel_outer_radius + env_safety"
 		 rmin2="0.0" rmax2="Hcal_barrel_outer_radius + env_safety"/>
           <shape type="PolyhedraRegular"  numsides="Hcal_barrel_symmetry" rmin="0.0"
                  rmax="Hcal_barrel_inner_radius - env_safety" dz="2*(Hcal_barrel_half_length + env_safety)"/>
-	  <rotation x="0" y="0" z="-180*deg/Hcal_barrel_symmetry"/>
+	  <!--rotation x="0" y="0" z="-180*deg/Hcal_barrel_symmetry"/-->
         </shape>
       </envelope>
       <type_flags type=" DetType_CALORIMETER + DetType_BARREL + DetType_HADRONIC " />
@@ -71,8 +72,8 @@
 
   <readouts>
     <readout name="HcalBarrelCollection">
-      <segmentation type="CartesianGridYZ" grid_size_y="Hcal_cells_size" grid_size_z="Hcal_cells_size"/>
-      <id>system:5,module:3,stave:3,tower:5,layer:6,slice:4,y:32:-16,z:-16</id>
+      <segmentation type="TiledLayerGridXY" grid_size_x="Hcal_cells_size" grid_size_y="Hcal_cells_size"/>
+      <id>system:5,module:3,stave:4,tower:5,layer:6,slice:4,x:32:-16,y:-16</id>
     </readout>
   </readouts>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml
index 7d23b43cd6a4db765c393b568c0a2ed13ba1b9da..8ac66d440ac60ace53a3b95d77df36b8bb65276b 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml
@@ -1,12 +1,12 @@
 <lccdd>
   <define>
     <constant name="Hcal_endcap_nlayers" value="Hcal_nlayers"/>
-    <constant name="Hcal_endcap_center_box_size" value="700*mm"/>
+    <constant name="Hcal_endcap_center_box_size" value="Hcal_endcap_inner_radius*2"/>
   </define>
   <detectors>
     <detector id="DetID_HCAL_ENDCAP" name="HcalEndcap" type="SHcalRpc01_Endcaps" readout="HcalEndcapsCollection"  vis="SeeThrough" calorimeterType="HAD_ENDCAP">
       <comment>Hadron Calorimeter Endcap</comment>
-      <envelope vis="HCALVis">    
+      <envelope>
 	<shape type="BooleanShape" operation="Subtraction" material="Air">
           <shape type="BooleanShape" operation="Subtraction" material="Air">
             <shape type="Tube" rmin="0.0" rmax="Hcal_endcap_outer_radius + env_safety" dz="Hcal_endcap_zmax + env_safety"/>
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml
index 22db7614e332a8be3d62397dc7489255deb4e34a..c081495b3a878693e807c4da5be918cb12918327 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/SET_SimplePlanar_v01_02.xml
@@ -8,7 +8,7 @@
 
   <detectors>
     <detector id="DetID_SET" name="SET" type="SET_Simple_Planar" vis="SETVis" readout="SETCollection" insideTrackingVolume="true">
-      <envelope vis="SETVis">
+      <envelope>
 	<shape type="BooleanShape" operation="Union" material="Air" >
 	  <shape type="Tube" rmin="InnerTracker_outer_radius" rmax="OuterTracker_inner_radius" dz="SET_half_length"  material = "Air" />
 	  <shape type="Tube" rmin="SET_inner_radius" rmax="SET_outer_radius" dz="SET_half_length"  material = "Air" />
diff --git a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml
index 3a9df414610a95791f1d1a9bb0616d4d255465d9..5a0d8e52eb943860c21a9e463fdcbdc8eedcb8d1 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/SIT_SimplePlanar_v01_01.xml
@@ -13,7 +13,7 @@
 
   <detectors>
     <detector id="DetID_SIT" name="SIT" type="SIT_Simple_Planar" vis="SITVis" readout="SITCollection" insideTrackingVolume="true">
-      <envelope vis="SeeThrough">
+      <envelope>
         <shape type="BooleanShape" operation="Union" material="Air" >
           <shape type="Tube" rmin="SIT_inner_radius"   rmax="SIT_outer_radius_1" dz="SIT_half_length_1" />
           <shape type="Tube" rmin="SIT_inner_radius_2" rmax="SIT_outer_radius"   dz="SIT_half_length" />
diff --git a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml
index 07298268222aa5f6381b550a256519b5f3d01732..d5bf5a5e8e3ec510077cb7796d13568b8db24585 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/VXD_v01_01.xml
@@ -16,7 +16,7 @@
 
   <detectors>
     <detector id="DetID_VXD" name="VXD" type="VXD04" vis="VXDVis" readout="VXDCollection" insideTrackingVolume="true">
-      <envelope vis="VXDVis">
+      <envelope>
 	<shape type="BooleanShape" operation="Subtraction" material="Air" >
 	  <shape type="BooleanShape" operation="Subtraction" material="Air" >
 	    <shape type="BooleanShape" operation="Subtraction" material="Air" >
@@ -72,7 +72,7 @@
       <!-- SQL command: "SELECT * FROM cryostat;"  -->
       <cryostat id="1" alu_skin_inner_radious="100*mm" alu_skin_tickness="0.5*mm" foam_inner_radious="90*mm" foam_tickness="10*mm" foam_half_z="166.6*mm" 
 		endplate_inner_radious="VXD_inner_radius_1" 
-		cryostat_option="1" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm"  />
+		cryostat_option="0" cryostat_apperture="30*mm" cryostat_apperture_radius="1.5*mm"  />
       <!-- SQL command: "select * from support_shell;"  -->
       <support_shell id="0" inner_radious="65*mm" half_z="145*mm" thickess="0.49392*mm" endplate_inner_radious="30*mm" endplate_inner_radius_L1="15.7*mm" endplate_outer_radius_L1="20*mm" 
 		     offset_ladder_block="0.28224*mm" beryllium_ladder_block_length="5*mm" beryllium_ladder_block_thickness="0.25*mm" shell_endplate_thickness="2*mm" forward_shell_half_z="6.5*mm"  />
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml
index 8960b15c2c9931e19b398d049673328950dbd7ff..e91c63b64cde2bab1d6dffc873425668e3380f01 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Barrel_v01_01.xml
@@ -3,35 +3,35 @@
     <constant name="Yoke_cells_size" value="30*mm"/>
   </define>
   <detectors>
-    <detector name="YokeBarrel" type="Yoke05_Barrel" id="DetID_YOKE" readout="MuonBarrelCollection" vis="YellowVis" insideTrackingVolume="false">
-      <envelope vis="YOKEVis">
-        <shape type="BooleanShape" operation="Intersection" material="Air" >
+    <detector name="YokeBarrel" type="DD4hep_RotatedPolyhedraBarrelCalorimeter_v01" id="DetID_YOKE" readout="MuonBarrelCollection" vis="YellowVis" insideTrackingVolume="false">
+      <envelope>
+        <!--shape type="BooleanShape" operation="Intersection" material="Air" >
           <shape type="Box" dx="Yoke_barrel_outer_radius + env_safety" dy="Yoke_barrel_outer_radius + env_safety" dz="Yoke_barrel_half_length + env_safety"/>
           <shape type="PolyhedraRegular" numsides="Yoke_barrel_symmetry"  rmin="Yoke_barrel_inner_radius" rmax="Yoke_barrel_outer_radius"
 		 dz="2.0*Yoke_barrel_half_length" material = "Air" />
           <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/Yoke_barrel_symmetry"/>
-        </shape>
+        </shape-->
+	<shape type="Assembly"/>
       </envelope>
       
       <type_flags type=" DetType_CALORIMETER + DetType_BARREL + DetType_MUON " />
 
-      <dimensions numsides="Yoke_barrel_symmetry" rmin="Yoke_barrel_inner_radius" rmax="Yoke_barrel_outer_radius" zhalf="Yoke_barrel_half_length"  material="Air"/>
-      <position x="0*mm" y="0*mm" z="0*mm"/>
-      <rotation x="0*deg" y="0*deg" z="0*deg"/>
-      <staves  material = "Iron"  vis="BlueVis"/>
-      <!--TODO Yoke05_Barrel fixed 14 layers, should be updated as optional-->
-      <layer repeat="14" vis="SeeThrough">
+      <dimensions numsides="Yoke_barrel_symmetry" rmin="Yoke_barrel_inner_radius" rmax="Yoke_barrel_outer_radius" zhalf="Yoke_barrel_half_length"
+		  zpos="0"  phi0="0*deg" gap="10.0*mm"/>
+      <staves material="Air" vis="SeeThrough"/>
+      <layer repeat="6" vis="SeeThrough">
         <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
         <slice material = "G4_POLYSTYRENE" thickness = "10.0*mm" sensitive = "yes"  vis="CyanVis"   />
         <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
+	<slice material = "Iron"           thickness = "60.0*mm"                    vis="YOKEVis" />
       </layer>
     </detector>
   </detectors>
   
   <readouts>
     <readout name="MuonBarrelCollection">
-      <segmentation type="CartesianGridXZ" grid_size_x="Yoke_cells_size" grid_size_z="Yoke_cells_size"/>
-      <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,z:-16</id>
+      <segmentation type="CartesianGridXY" grid_size_x="Yoke_cells_size" grid_size_y="Yoke_cells_size"/>
+      <id>system:5,side:-2,module:3,stave:4,layer:6,slice:4,x:32:-16,y:-16</id>
     </readout>
   </readouts>
 
diff --git a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml
index 6e49c15cb0b3c68bedf66c2f0b468689720ed70d..ca2ae5baa156975b6839e712a7cfedba99608179 100644
--- a/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_common_v01/Yoke_Endcaps_v01_01.xml
@@ -4,35 +4,26 @@
     <constant name="YokeEndcapPlug_symmetry" value="Yoke_endcap_outer_symmetry"/>
   </define>
   <detectors>
-    <detector name="YokeEndcap" type="Yoke05_Endcaps" id="DetID_YOKE_ENDCAP" readout="MuonEndcapsCollection" vis="YellowVis" insideTrackingVolume="false" >
-      <envelope vis="YOKEVis">
-        <shape type="BooleanShape" operation="Subtraction" material="Air">
-          <shape type="BooleanShape" operation="Subtraction" material="Air">
-            <shape type="BooleanShape" operation="Intersection" material="Air">
-              <shape type="Box" dx="Yoke_endcap_outer_radius + 1.5*env_safety" dy="Yoke_endcap_outer_radius + 1.5*env_safety"
-                     dz="Yoke_endcap_zmax + env_safety"/>
-              <shape type="PolyhedraRegular" numsides="Yoke_endcap_outer_symmetry"  rmin="Yoke_endcap_inner_radius - env_safety"
-                     rmax="Yoke_endcap_outer_radius + env_safety" dz="2.*Yoke_endcap_zmax + env_safety" />
-              <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/Yoke_endcap_outer_symmetry"/>
-            </shape>
-            <shape type="Box" dx="Yoke_endcap_outer_radius + 1.5*env_safety" dy="Yoke_endcap_outer_radius + 1.5*env_safety"
-                   dz="HcalEndcap_max_z + Hcal_Yoke_plug_gap - env_safety"/>
-          </shape>
-	  <!--without Yoke_plug--> 
-          <!--shape type="PolyhedraRegular" numsides="YokeEndcapPlug_symmetry"  rmin="Hcal_barrel_outer_radius*cos(pi/Hcal_endcap_outer_symmetry) + env_safety"
-                 rmax="Yoke_endcap_outer_radius + 2.0*env_safety" dz="2.*Yoke_endcap_zmin - env_safety" />
-          <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/YokeEndcapPlug_symmetry"/-->
-        </shape>
+    <detector name="YokeEndcap" type="DD4hep_PolyhedraEndcapCalorimeter2" id="DetID_YOKE_ENDCAP" readout="MuonEndcapsCollection" vis="YellowVis" insideTrackingVolume="false" >
+      <envelope>
+        <!--shape type="BooleanShape" operation="Intersection" material="Air">
+          <shape type="Box" dx="Yoke_endcap_outer_radius + 1.5*env_safety" dy="Yoke_endcap_outer_radius + 1.5*env_safety"
+                 dz="Yoke_endcap_zmax + env_safety"/>
+          <shape type="PolyhedraRegular" numsides="Yoke_endcap_outer_symmetry"  rmin="Yoke_endcap_inner_radius - env_safety"
+                 rmax="Yoke_endcap_outer_radius + env_safety" dz="2.*Yoke_endcap_zmax + env_safety" />
+          <rotation x="0*deg" y="0*deg" z="90*deg-180*deg/Yoke_endcap_outer_symmetry"/>
+        </shape-->
+	<shape type="Assembly"/>
       </envelope>
 
       <type_flags type=" DetType_CALORIMETER + DetType_ENDCAP + DetType_MUON " />
 
-      <dimensions numsides="Yoke_endcap_outer_symmetry" rmin="Yoke_endcap_inner_radius" z="Yoke_barrel_half_length" />
-      <material name="Iron"/>
-      <layer repeat="12" vis="SeeThrough">
+      <dimensions numsides="Yoke_endcap_outer_symmetry" rmin="Yoke_endcap_inner_radius" rmax="Yoke_endcap_outer_radius/cos(pi/Yoke_endcap_outer_symmetry)" zmin="Yoke_endcap_zmin" />
+      <layer repeat="8" vis="SeeThrough">
         <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
         <slice material = "G4_POLYSTYRENE" thickness = "10.0*mm" sensitive = "yes"  vis="CyanVis"   />
         <slice material = "Air"            thickness = "15.0*mm"                    vis="YellowVis" />
+	<slice material = "Iron"           thickness = "60.0*mm"                    vis="YOKEVis"   />
       </layer>
     </detector>
   </detectors>
@@ -40,7 +31,7 @@
   <readouts>
     <readout name="MuonEndcapsCollection">
       <segmentation type="CartesianGridXY" grid_size_x="Yoke_cells_size" grid_size_y="Yoke_cells_size"/>
-      <id>system:5,module:3,stave:4,tower:3,layer:6,x:32:-16,y:-16</id>
+      <id>system:5,side:2,module:3,stave:4,barrel:3,layer:6,slice:4,x:32:-16,y:-16</id>
     </readout>
   </readouts>
 
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml
index 5d5689bec298796f9ce85c07e6fbabca05adc5ae..4f631eb52d4fd73583c61db951c78630eab0e816 100644
--- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml
@@ -147,7 +147,7 @@
     <constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/>
     <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/-->
 
-    <constant name="Ecal_barrel_inner_radius" value="1900*mm"/>
+    <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code-->
     <constant name="Ecal_barrel_thickness"    value="280*mm"/>
     <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/>
     <constant name="Ecal_barrel_half_length"  value="3350*mm"/>
@@ -171,17 +171,17 @@
     <constant name="Hcal_barrel_inner_radius" value="2530*mm"/>
     <constant name="Hcal_barrel_outer_radius" value="3610*mm"/>
     <constant name="Hcal_barrel_half_length"  value="4480*mm"/>
-    <constant name="Hcal_barrel_symmetry"    value="8"/>
+    <constant name="Hcal_barrel_symmetry"    value="12"/>
     
     <constant name="Hcal_endcap_inner_radius" value="400*mm"/>
-    <constant name="Hcal_endcap_outer_radius" value="Hcal_barrel_outer_radius"/>
+    <constant name="Hcal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/>
     <constant name="Hcal_endcap_zmin" value="3400*mm"/>
     <constant name="Hcal_endcap_zmax" value="4480*mm"/>
-    <constant name="Hcal_endcap_symmetry" value="8"/>
+    <constant name="Hcal_endcap_symmetry" value="12"/>
     <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
     <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/>
     <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/>
-    <constant name="Hcal_outer_radius" value="Hcal_barrel_outer_radius"/>
+    <constant name="Hcal_outer_radius" value="Hcal_endcap_outer_radius"/>
 
     <!--constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/>
     <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/>
@@ -192,13 +192,13 @@
     <constant name="Yoke_barrel_inner_radius" value="3660*mm"/>
     <constant name="Yoke_barrel_outer_radius" value="4260*mm"/>
     <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/>
-    <constant name="Yoke_barrel_symmetry" value="8"/>
+    <constant name="Yoke_barrel_symmetry" value="12"/>
     
     <constant name="Yoke_endcap_inner_radius" value="400*mm"/>
     <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/>
     <constant name="Yoke_endcap_zmin" value="4660*mm"/>
     <constant name="Yoke_endcap_zmax" value="5460*mm"/>
-    <constant name="Yoke_endcap_outer_symmetry" value="8"/>
+    <constant name="Yoke_endcap_outer_symmetry" value="Yoke_barrel_symmetry"/>
     <constant name="Yoke_endcap_inner_symmetry" value="0"/>
     <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
     <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/>
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 a393055486d50b0e6c87fa51cdc5a435b2963b3b..9ede81b793e785ed44b1eb97b12b69af9ee48716 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
@@ -13,6 +13,7 @@
   
   <includes>
     <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <!--gdmlFile  ref="../CRD_common_v01/materials-woIsotope.xml"/-->
     <gdmlFile  ref="../CRD_common_v01/materials.xml"/>
   </includes>
   
@@ -31,7 +32,7 @@
   <include ref="../CRD_common_v01/VXD_v01_01.xml"/>
   <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/>
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
-  <include ref="../CRD_common_v01/DC_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
   
   <fields>
diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml
index f100e6f6ae9e924f5a6ab73a894f6654c3cf081e..dda851d69ee604bbd25b5b1a68c63c879ab246fc 100644
--- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01.xml
@@ -31,15 +31,15 @@
   <include ref="../CRD_common_v01/VXD_v01_01.xml"/>
   <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/>
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
-  <include ref="../CRD_common_v01/DC_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
   <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/>
   <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/>
   <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/-->
-  <!--include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
   <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/>
   <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/>
   <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/>
-  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/>
   <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/-->
   
   <fields>
diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
index 5d5689bec298796f9ce85c07e6fbabca05adc5ae..4f631eb52d4fd73583c61db951c78630eab0e816 100644
--- a/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_Dimensions_v01_02.xml
@@ -147,7 +147,7 @@
     <constant name="TUBE_IPOuterBulge_end_radius" value="BeamPipe_Crotch_zmax*tan(CrossingAngle/2)+BeamPipe_Dnstream_inner_radius+BeamPipe_Cu_thickness"/>
     <!--"BeamPipe_Expanded_inner_radius+BeamPipe_Al_thickness+5*mm"/-->
 
-    <constant name="Ecal_barrel_inner_radius" value="1900*mm"/>
+    <constant name="Ecal_barrel_inner_radius" value="1860*mm"/><!--1900->1860, since 1900-2180 is range for symmetry=12, but now fixed as 8 in constructor code-->
     <constant name="Ecal_barrel_thickness"    value="280*mm"/>
     <constant name="Ecal_barrel_outer_radius" value="(Ecal_barrel_inner_radius+Ecal_barrel_thickness)/cos(pi/8)"/>
     <constant name="Ecal_barrel_half_length"  value="3350*mm"/>
@@ -171,17 +171,17 @@
     <constant name="Hcal_barrel_inner_radius" value="2530*mm"/>
     <constant name="Hcal_barrel_outer_radius" value="3610*mm"/>
     <constant name="Hcal_barrel_half_length"  value="4480*mm"/>
-    <constant name="Hcal_barrel_symmetry"    value="8"/>
+    <constant name="Hcal_barrel_symmetry"    value="12"/>
     
     <constant name="Hcal_endcap_inner_radius" value="400*mm"/>
-    <constant name="Hcal_endcap_outer_radius" value="Hcal_barrel_outer_radius"/>
+    <constant name="Hcal_endcap_outer_radius" value="Ecal_barrel_outer_radius"/>
     <constant name="Hcal_endcap_zmin" value="3400*mm"/>
     <constant name="Hcal_endcap_zmax" value="4480*mm"/>
-    <constant name="Hcal_endcap_symmetry" value="8"/>
+    <constant name="Hcal_endcap_symmetry" value="12"/>
     <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
     <constant name="HcalEndcap_max_z" value="Hcal_endcap_zmax"/>
     <constant name="Hcal_endcap_outer_symmetry" value="Hcal_endcap_symmetry"/>
-    <constant name="Hcal_outer_radius" value="Hcal_barrel_outer_radius"/>
+    <constant name="Hcal_outer_radius" value="Hcal_endcap_outer_radius"/>
 
     <!--constant name="Hcal_ring_inner_radius" value="Hcal_endcap_inner_radius"/>
     <constant name="Hcal_ring_outer_radius" value="Solenoid_inner_radius"/>
@@ -192,13 +192,13 @@
     <constant name="Yoke_barrel_inner_radius" value="3660*mm"/>
     <constant name="Yoke_barrel_outer_radius" value="4260*mm"/>
     <constant name="Yoke_barrel_half_length" value="Hcal_endcap_zmax"/>
-    <constant name="Yoke_barrel_symmetry" value="8"/>
+    <constant name="Yoke_barrel_symmetry" value="12"/>
     
     <constant name="Yoke_endcap_inner_radius" value="400*mm"/>
     <constant name="Yoke_endcap_outer_radius" value="Yoke_barrel_outer_radius"/>
     <constant name="Yoke_endcap_zmin" value="4660*mm"/>
     <constant name="Yoke_endcap_zmax" value="5460*mm"/>
-    <constant name="Yoke_endcap_outer_symmetry" value="8"/>
+    <constant name="Yoke_endcap_outer_symmetry" value="Yoke_barrel_symmetry"/>
     <constant name="Yoke_endcap_inner_symmetry" value="0"/>
     <!--obseleted constance, used by old construct, should be removed while creating new constrcut-->
     <constant name="Yoke_Z_start_endcaps" value="Yoke_endcap_zmin"/>
diff --git a/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml
index efa213d61c3f4e34ce87362c4b1f70e6f574afe0..a508958484d0bd9cce4c894bd6d520d1ad15124e 100644
--- a/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml
+++ b/Detector/DetCRD/compact/CRD_o1_v02/CRD_o1_v02.xml
@@ -31,15 +31,15 @@
   <include ref="../CRD_common_v01/VXD_v01_01.xml"/>
   <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/>
   <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/>
-  <include ref="../CRD_common_v01/DC_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/DC_Simple_v01_02.xml"/>
   <include ref="../CRD_common_v01/SET_SimplePlanar_v01_01.xml"/>
   <include ref="../CRD_common_v01/Ecal_Crystal_Barrel_v01_01.xml"/>
   <!--include ref="../CRD_common_v01/Ecal_Crystal_Endcap_v01_01.xml"/-->
-  <!--include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
+  <include ref="../CRD_common_v01/Coil_Simple_v01_01.xml"/>
   <include ref="../CRD_common_v01/Hcal_Rpc_Barrel_v01_01.xml"/>
   <include ref="../CRD_common_v01/Hcal_Rpc_Endcaps_v01_01.xml"/>
   <include ref="../CRD_common_v01/Yoke_Barrel_v01_01.xml"/>
-  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/-->
+  <include ref="../CRD_common_v01/Yoke_Endcaps_v01_01.xml"/>
   <!--include ref="../CRD_common_v01/Lcal_v01_01.xml"/-->
 
   <fields>
diff --git a/Detector/DetCRD/compact/README.md b/Detector/DetCRD/compact/README.md
index 0d1511b8f125931cd869e0c8fcac459504390335..f4a0aefb6796ed3cdeafb1b7aeb84d24cf32ed3a 100644
--- a/Detector/DetCRD/compact/README.md
+++ b/Detector/DetCRD/compact/README.md
@@ -35,9 +35,10 @@ The following CRD detector models are available in CEPCSW
          - with RPC readout
          - creates two sets of hit collections
  - Coil
-         - CEPC_v4 like
+         - Al layers using DD4hep_Solenoid_o1_v01
  - Yoke
-         - CEPC_v4 like
+         - Barrel:  Detector/DetCRD/src/Calorimeter/RotatedPolyhedraBarrelCalorimeter_v01_geo.cpp
+	 - Endcaps: DD4hep_PolyhedraEndcapCalorimeter2
  - compact files:
          - [./CRD_o1_v01/CRD_o1_v01.xml](./CRD_o1_v01/CRD_o1_v01.xml)
 
diff --git a/Detector/DetCRD/src/Calorimeter/RotatedPolyhedraBarrelCalorimeter_v01_geo.cpp b/Detector/DetCRD/src/Calorimeter/RotatedPolyhedraBarrelCalorimeter_v01_geo.cpp
index 723766ef891efba33ddd4bc357a81de5ea73760d..0e4b9a50c6dd9930481b926f029662125059e2d3 100644
--- a/Detector/DetCRD/src/Calorimeter/RotatedPolyhedraBarrelCalorimeter_v01_geo.cpp
+++ b/Detector/DetCRD/src/Calorimeter/RotatedPolyhedraBarrelCalorimeter_v01_geo.cpp
@@ -159,7 +159,7 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
     PlacedVolume pv = envelope.placeVolume(staveOuterVol, trafo);
     pv.addPhysVolID("stave", istave);
     pv.addPhysVolID("system", cal.id());
-    pv.addPhysVolID("barrel", 0);
+    pv.addPhysVolID("side", 0);
     stave.setPlacement(pv);
   }