diff --git a/Service/GearSvc/src/GearSvc.cpp b/Service/GearSvc/src/GearSvc.cpp
index 274479f5d47ec58bae73034a6596cd50ba91ac3d..9b3a6ade809ab87a17daa00401ba0706732446cb 100644
--- a/Service/GearSvc/src/GearSvc.cpp
+++ b/Service/GearSvc/src/GearSvc.cpp
@@ -93,6 +93,9 @@ StatusCode GearSvc::initialize()
       else if(it->first=="TPC"){
 	sc = convertTPC(sub);
       }
+      else if(it->first=="DriftChamber"){
+        sc = convertDC(sub);
+      }
       else if(it->first=="SET"){
 	sc = convertSET(sub);
       }
@@ -101,6 +104,7 @@ StatusCode GearSvc::initialize()
       }
       if(sc==StatusCode::FAILURE) return sc;
     }
+
     gear::CalorimeterParametersImpl* barrelParam = new gear::CalorimeterParametersImpl(1847.415655, 2350., 8, 0.);
     gear::CalorimeterParametersImpl* endcapParam = new gear::CalorimeterParametersImpl(400., 2088.8, 2450., 2, 0.);
     for(int i=0;i<29;i++){
@@ -200,7 +204,7 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){
   double phi0=0;
   helpLayer thisLadder;
   double beryllium_ladder_block_length=0,end_electronics_half_z=0,side_band_electronics_width=0;
-  double rAlu, drAlu, rSty, drSty, dzSty, rInner, aluEndcapZ, aluHalfZ, alu_RadLen, Cryostat_dEdx;
+  double rAlu=0, drAlu, rSty, drSty, dzSty, rInner, aluEndcapZ, aluHalfZ, alu_RadLen, Cryostat_dEdx;
   double VXDSupportDensity, VXDSupportZeff, VXDSupportAeff, VXDSupportRadLen, VXDSupportIntLen=0;
   double styDensity, styZeff, styAeff, styRadLen, styIntLen; 
   dd4hep::Volume vxd_vol = vxd.volume();
@@ -558,14 +562,17 @@ StatusCode GearSvc::convertVXD(dd4hep::DetElement& vxd){
            << helpSensitives[i].thickness*2 << ", " << helpSensitives[i].length << ", " << helpSensitives[i].width*2 << ", " << helpSensitives[i].radLength << endmsg;
   }
   m_gearMgr->setVXDParameters(vxdParameters) ;
-  gear::GearParametersImpl* gearParameters = new gear::GearParametersImpl;
-  //CryostatAlRadius, CryostatAlThickness, CryostatAlInnerR, CryostatAlZEndCap, CryostatAlHalfZ
-  gearParameters->setDoubleVal("CryostatAlRadius",    rAlu);
-  gearParameters->setDoubleVal("CryostatAlThickness", drAlu);
-  gearParameters->setDoubleVal("CryostatAlInnerR",    rInner);
-  gearParameters->setDoubleVal("CryostatAlZEndCap",   aluEndcapZ = dzSty+drSty+drAlu/2);
-  gearParameters->setDoubleVal("CryostatAlHalfZ",     dzSty+drSty);
-  m_gearMgr->setGearParameters("VXDInfra", gearParameters);
+  if(rAlu!=0){
+    // rAlu=0, denote no cryostat 
+    gear::GearParametersImpl* gearParameters = new gear::GearParametersImpl;
+    //CryostatAlRadius, CryostatAlThickness, CryostatAlInnerR, CryostatAlZEndCap, CryostatAlHalfZ
+    gearParameters->setDoubleVal("CryostatAlRadius",    rAlu);
+    gearParameters->setDoubleVal("CryostatAlThickness", drAlu);
+    gearParameters->setDoubleVal("CryostatAlInnerR",    rInner);
+    gearParameters->setDoubleVal("CryostatAlZEndCap",   aluEndcapZ = dzSty+drSty+drAlu/2);
+    gearParameters->setDoubleVal("CryostatAlHalfZ",     dzSty+drSty);
+    m_gearMgr->setGearParameters("VXDInfra", gearParameters);
+  }
   //effective A different with what in Mokka, fix them as Mokka's
   gear::SimpleMaterialImpl* VXDFoamShellMaterial_old = new gear::SimpleMaterialImpl("VXDFoamShellMaterial_old", 1.043890843e+01, 5.612886646e+00, 2.500000000e+01, 1.751650267e+04, 0);
   m_gearMgr->registerSimpleMaterial(VXDFoamShellMaterial_old);
@@ -721,6 +728,116 @@ StatusCode GearSvc::convertTPC(dd4hep::DetElement& tpc){
   return StatusCode::SUCCESS;
 }
 
+StatusCode GearSvc::convertDC(dd4hep::DetElement& dc){
+  dd4hep::rec::FixedPadSizeTPCData* dcData = nullptr;
+  try{
+    dcData = dc.extension<dd4hep::rec::FixedPadSizeTPCData>();
+  }
+  catch(std::runtime_error& e){
+    warning() << e.what() << " " << dcData << ", to search volume" << endmsg;
+    // before extension ready, force to convert from volumes
+    dcData = new dd4hep::rec::FixedPadSizeTPCData;
+    dcData->rMinReadout = 99999;
+    dcData->rMaxReadout = 0;
+    std::vector<double> innerRadiusWalls,outerRadiusWalls;
+    bool is_convert = true;
+    dd4hep::Volume dc_vol = dc.volume();
+    for(int i=0;i<dc_vol->GetNdaughters();i++){
+      TGeoNode* daughter = dc_vol->GetNode(i);
+      std::string nodeName = daughter->GetName();
+      std::cout << nodeName << std::endl;
+      if(nodeName.find("chamber_vol")!=-1){
+	const TGeoShape* chamber_shape = daughter->GetVolume()->GetShape();
+	if(chamber_shape->TestShapeBit(TGeoTube::kGeoTube)){
+	  const TGeoTube* tube = (const TGeoTube*) chamber_shape;
+	  double innerRadius = tube->GetRmin();
+	  double outerRadius = tube->GetRmax();
+	  double halfLength  = tube->GetDz();
+	  dcData->driftLength = halfLength;
+	}
+	else{
+	  error() << nodeName << " not TGeoTube::kGeoTube" << endmsg;
+	  is_convert = false;
+	}
+
+	dcData->maxRow = daughter->GetNdaughters();
+	for(int i=0;i<daughter->GetNdaughters();i++){
+	  TGeoNode* layer = daughter->GetDaughter(i);
+	  const TGeoShape* shape = layer->GetVolume()->GetShape();
+	  if(shape->TestShapeBit(TGeoTube::kGeoTube)){
+	    const TGeoTube* tube = (const TGeoTube*) shape;
+	    double innerRadius = tube->GetRmin();
+	    double outerRadius = tube->GetRmax();
+	    double halfLength  = tube->GetDz();
+	    if(innerRadius<dcData->rMinReadout) dcData->rMinReadout = innerRadius;
+	    if(outerRadius>dcData->rMaxReadout) dcData->rMaxReadout = outerRadius;
+	  }
+	  else{
+	    error() << layer->GetName() << " not TGeoTube::kGeoTube" << endmsg;
+	    is_convert = false;
+	  }
+	}
+	dcData->padHeight = (dcData->rMaxReadout-dcData->rMinReadout)/dcData->maxRow;
+	dcData->padWidth  = dcData->padHeight;
+      }
+      else if(nodeName.find("wall_vol")!=-1){
+	const TGeoShape* wall_shape = daughter->GetVolume()->GetShape();
+        if(wall_shape->TestShapeBit(TGeoTube::kGeoTube)){
+          const TGeoTube* tube = (const TGeoTube*) wall_shape;
+          double innerRadius = tube->GetRmin();
+          double outerRadius = tube->GetRmax();
+          double halfLength  = tube->GetDz();
+          innerRadiusWalls.push_back(innerRadius);
+	  outerRadiusWalls.push_back(outerRadius);
+        }
+	else{
+	  error() << nodeName << " not TGeoTube::kGeoTube" << endmsg;
+	  is_convert = false;
+	}
+      }
+    }
+    if(innerRadiusWalls.size()<2||outerRadiusWalls.size()<2){
+      error() << "wall number < 2" << endmsg;
+      is_convert = false;
+    }
+    if(!is_convert){
+      error() << "Cannot convert DC volume to extension data!" << endmsg;
+      delete dcData;
+      return StatusCode::FAILURE;
+    }
+    if(innerRadiusWalls[0]<innerRadiusWalls[innerRadiusWalls.size()-1]){
+      dcData->rMin = innerRadiusWalls[0];
+      dcData->rMax = outerRadiusWalls[outerRadiusWalls.size()-1];
+      dcData->innerWallThickness = outerRadiusWalls[0]-innerRadiusWalls[0];
+      dcData->outerWallThickness = outerRadiusWalls[outerRadiusWalls.size()-1]-innerRadiusWalls[innerRadiusWalls.size()-1];
+    }
+    else{
+      dcData->rMin = innerRadiusWalls[innerRadiusWalls.size()-1];
+      dcData->rMax = outerRadiusWalls[0];
+      dcData->innerWallThickness = outerRadiusWalls[outerRadiusWalls.size()-1]-innerRadiusWalls[innerRadiusWalls.size()-1];
+      dcData->outerWallThickness = outerRadiusWalls[0]-innerRadiusWalls[0];
+    }
+    info() << (*dcData) << endmsg;
+  }
+
+  // regard as TPCParameters, TODO: drift chamber parameters
+  gear::TPCParametersImpl *tpcParameters = new gear::TPCParametersImpl();
+  gear::PadRowLayout2D *padLayout = new gear::FixedPadSizeDiskLayout(dcData->rMinReadout*CLHEP::cm, dcData->rMaxReadout*CLHEP::cm,
+                                                                     dcData->padHeight*CLHEP::cm, dcData->padWidth*CLHEP::cm, dcData->maxRow, 0.0);
+  tpcParameters->setPadLayout(padLayout);
+  tpcParameters->setMaxDriftLength(dcData->driftLength*CLHEP::cm);
+  tpcParameters->setDriftVelocity(    0.0);
+  tpcParameters->setReadoutFrequency( 0.0);
+  tpcParameters->setDoubleVal( "tpcOuterRadius" , dcData->rMax*CLHEP::cm ) ;
+  tpcParameters->setDoubleVal( "tpcInnerRadius",  dcData->rMin*CLHEP::cm ) ;
+  tpcParameters->setDoubleVal( "tpcInnerWallThickness",  dcData->innerWallThickness*CLHEP::cm ) ;
+  tpcParameters->setDoubleVal( "tpcOuterWallThickness",  dcData->outerWallThickness*CLHEP::cm ) ;
+
+  m_gearMgr->setTPCParameters(tpcParameters);
+
+  return StatusCode::SUCCESS;
+}
+
 StatusCode GearSvc::convertSET(dd4hep::DetElement& set){
   dd4hep::rec::ZPlanarData* setData = nullptr;
   try{
@@ -773,7 +890,7 @@ TGeoNode* GearSvc::FindNode(TGeoNode* mother, char* name){
     for(int i=0;i<mother->GetNdaughters();i++){
       TGeoNode* daughter = mother->GetDaughter(i);
       std::string s = daughter->GetName();
-      //info() << "current: " << s << " search for" << name << endmsg;                                                                                                                      
+      //info() << "current: " << s << " search for" << name << endmsg;
       if(s.find(name)!=-1){
         next = daughter;
         break;
diff --git a/Service/GearSvc/src/GearSvc.h b/Service/GearSvc/src/GearSvc.h
index fcd5bcc8a63bb6710221f31a4dacf0bfe26e17f5..ad0e82b68a1ed605f06487d78b9a63ac519defb2 100644
--- a/Service/GearSvc/src/GearSvc.h
+++ b/Service/GearSvc/src/GearSvc.h
@@ -23,6 +23,7 @@ class GearSvc : public extends<Service, IGearSvc>
 	StatusCode convertVXD(dd4hep::DetElement& vxd);
 	StatusCode convertSIT(dd4hep::DetElement& sit);
 	StatusCode convertTPC(dd4hep::DetElement& tpc);
+	StatusCode convertDC (dd4hep::DetElement& dc);
 	StatusCode convertSET(dd4hep::DetElement& set);
 	StatusCode convertFTD(dd4hep::DetElement& ftd);
 	TGeoNode* FindNode(TGeoNode* mother, char* name);