diff --git a/DDCore/include/DD4hep/DetElement.h b/DDCore/include/DD4hep/DetElement.h
index 909d1ad4d268a7545043b8c4d94d3a0484f26e1d..3fcff9d4537240355576b38323d01ecb898acb37 100644
--- a/DDCore/include/DD4hep/DetElement.h
+++ b/DDCore/include/DD4hep/DetElement.h
@@ -332,6 +332,8 @@ namespace dd4hep {
 
     /// Reflect (Deep copy) the DetElement structure with a new name and new identifier
     std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id) const;
+    /// Reflect (Deep copy) the DetElement structure with a new name and new identifier and new sensitive detector
+    std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id, SensitiveDetector sd) const;
 
     /// Add an extension object to the detector element
     void* addExtension(ExtensionEntry* entry) const;
diff --git a/DDCore/include/DD4hep/MatrixHelpers.h b/DDCore/include/DD4hep/MatrixHelpers.h
index 78e801e4b008d0c08188627b189e880ac0d13228..54bd8c8042f6a9b75ee17ad3156f4734f9c245c8 100644
--- a/DDCore/include/DD4hep/MatrixHelpers.h
+++ b/DDCore/include/DD4hep/MatrixHelpers.h
@@ -65,6 +65,14 @@ namespace dd4hep {
       Transform3D      _transform(const TGeoMatrix* matrix);
       Transform3D      _transform(const TGeoMatrix& matrix);
 
+      /// Decompose a generic ROOT Matrix into a translation (Position) and a Rotation3D        \ingroup DD4HEP \ingroup DD4HEP_CORE
+      void _decompose(const TGeoMatrix& trafo, Position& pos, Rotation3D& rot);
+      /// Decompose a generic ROOT Matrix into a translation (Position) and a RotationZYX       \ingroup DD4HEP \ingroup DD4HEP_CORE
+      void _decompose(const TGeoMatrix& trafo, Position& pos, RotationZYX& rot);
+      /// Decompose a generic ROOT Matrix into a translation (Position) and XYZAngles           \ingroup DD4HEP \ingroup DD4HEP_CORE
+      void _decompose(const TGeoMatrix& trafo, Position& pos, XYZAngles& rot);
+      /// Decompose a generic Transform3D into a translation (Position) and a Rotation3D        \ingroup DD4HEP \ingroup DD4HEP_CORE
+      void _decompose(const Transform3D& trafo, Position& pos, Rotation3D& rot);
       /// Decompose a generic Transform3D into a translation (Position) and a RotationZYX       \ingroup DD4HEP \ingroup DD4HEP_CORE
       void _decompose(const Transform3D& trafo, Position& pos, RotationZYX& rot);
       /// Decompose a generic Transform3D into a translation (Position) and XYZAngles \ingroup DD4HEP \ingroup DD4HEP_CORE
diff --git a/DDCore/include/DD4hep/Volumes.h b/DDCore/include/DD4hep/Volumes.h
index 1b382fcd5e6d002a546bdd791fba0d1776c1048b..981df2f9a847f48413689bfef5d1fc7f51650ab6 100644
--- a/DDCore/include/DD4hep/Volumes.h
+++ b/DDCore/include/DD4hep/Volumes.h
@@ -320,8 +320,13 @@ namespace dd4hep {
     /// Check if placement is properly instrumented
     Object* data() const;
 
-    /// Create a reflected volume. The reflected volume has left-handed coordinates
+    /// Create a reflected volume tree. The reflected volume has left-handed coordinates
     Volume reflect()  const;
+
+    /// Create a reflected volume tree. The reflected volume has left-handed coordinates.
+    /** Swap the sensitive detector - if valid - on all sensitive sub-volumes
+     */
+    Volume reflect(SensitiveDetector sd)  const;
     
     /// If we import volumes from external sources, we have to attach the extensions to the tree
     Volume& import();
diff --git a/DDCore/include/DD4hep/detail/DetectorInterna.h b/DDCore/include/DD4hep/detail/DetectorInterna.h
index c383fe225658db292619eda788d49096c7c21b05..e64a1658679bb74097687f98b705c53ac62b857a 100644
--- a/DDCore/include/DD4hep/detail/DetectorInterna.h
+++ b/DDCore/include/DD4hep/detail/DetectorInterna.h
@@ -179,7 +179,7 @@ namespace dd4hep {
     /// Revalidate the caches
     void revalidate();
     /// Reflect all volumes in a DetElement sub-tree and re-attach the placements
-    std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id);
+    std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id, SensitiveDetector sd);
   };
 
   /// Data class with properties of a detector element
diff --git a/DDCore/src/DetElement.cpp b/DDCore/src/DetElement.cpp
index 89b41922c39c582ee5f8b407a4cbad0dd2f00da7..2fdaea5e51839b585e9919f83ecbc3387c864c63 100644
--- a/DDCore/src/DetElement.cpp
+++ b/DDCore/src/DetElement.cpp
@@ -278,8 +278,12 @@ pair<DetElement,Volume> DetElement::reflect(const string& new_name) const {
 }
 
 pair<DetElement,Volume> DetElement::reflect(const string& new_name, int new_id) const {
+  return reflect(new_name, new_id, SensitiveDetector(0));
+}
+
+pair<DetElement,Volume> DetElement::reflect(const string& new_name, int new_id, SensitiveDetector sd) const {
   if ( placement().isValid() )   {
-    return m_element->reflect(new_name, new_id);
+    return m_element->reflect(new_name, new_id, sd);
   }
   except("DetElement","reflect: Only placed DetElement objects can be reflected: %s",
          path().c_str());
diff --git a/DDCore/src/DetectorInterna.cpp b/DDCore/src/DetectorInterna.cpp
index 915a52e07d168e9824c3cb836065c7ea42ba87b5..ed5dd5cbd2838258590669b1d2c00e7dfadb21aa 100644
--- a/DDCore/src/DetectorInterna.cpp
+++ b/DDCore/src/DetectorInterna.cpp
@@ -134,7 +134,7 @@ DetElementObject* DetElementObject::clone(int new_id, int flg) const {
 }
 
 /// Reflect all volumes in a DetElement sub-tree and re-attach the placements
-pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, int new_id)   {
+pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, int new_id, SensitiveDetector sd)   {
   struct ChildMapper  {
     std::map<TGeoNode*,TGeoNode*> nodes;
     void match(DetElement de)   {
@@ -148,7 +148,7 @@ pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, i
         match(c.second);
     }
     void map(TGeoNode* n1, TGeoNode* n2)   {
-      if ( nodes.find(n1) != nodes.end() )   {
+      if ( nodes.find(n1) == nodes.end() )   {
         TGeoVolume* v1 = n1->GetVolume();
         TGeoVolume* v2 = n2->GetVolume();
         nodes.insert(make_pair(n1,n2));
@@ -161,7 +161,7 @@ pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, i
   DetElement  det_ref   = det.clone(new_name, new_id);
   Volume      vol       = det.volume();
   TGeoVolume* vol_det   = vol.ptr();
-  TGeoVolume* vol_ref   = vol.reflect();
+  TGeoVolume* vol_ref   = vol.reflect(sd);
   const auto& childrens = det.children();
 
   for(Int_t i=0; i<vol_det->GetNdaughters(); ++i)
diff --git a/DDCore/src/MatrixHelpers.cpp b/DDCore/src/MatrixHelpers.cpp
index 27a4121f498e66eaf6a12e36d2ed8705dff92dbf..3df683bfd43b4543a910b408749b0d4d570f9391 100644
--- a/DDCore/src/MatrixHelpers.cpp
+++ b/DDCore/src/MatrixHelpers.cpp
@@ -144,8 +144,24 @@ dd4hep::XYZAngles dd4hep::detail::matrix::_xyzAngles(const double* r) {
   return XYZAngles(atan2(-r[7], r[4]),atan2(-r[2], cosb),0);
 }
 
+void dd4hep::detail::matrix::_decompose(const TGeoMatrix& trafo, Position& pos, Rotation3D& rot)  {
+  _decompose(_transform(trafo), pos, rot);
+}
+
+void dd4hep::detail::matrix::_decompose(const TGeoMatrix& trafo, Position& pos, RotationZYX& rot)   {
+  _decompose(_transform(trafo), pos, rot);
+}
+
+void dd4hep::detail::matrix::_decompose(const TGeoMatrix& trafo, Position& pos, XYZAngles& rot)   {
+  _decompose(_transform(trafo), pos, rot);
+}
+
+void dd4hep::detail::matrix::_decompose(const Transform3D& trafo, Position& pos, Rotation3D& rot)  {
+  trafo.GetDecomposition(rot, pos);  
+}
+
 void dd4hep::detail::matrix::_decompose(const Transform3D& trafo, Translation3D& pos, RotationZYX& rot)   {
-  trafo.GetDecomposition(rot,pos);
+  trafo.GetDecomposition(rot, pos);
 }
 
 void dd4hep::detail::matrix::_decompose(const Transform3D& trafo, Translation3D& pos, XYZAngles& rot)   {
diff --git a/DDCore/src/Volumes.cpp b/DDCore/src/Volumes.cpp
index 4ad085f5c00e15b8f15acdb0f96f466265d376c1..14d532fb4426f0c490c5128d63ceb31eabaabfa0 100644
--- a/DDCore/src/Volumes.cpp
+++ b/DDCore/src/Volumes.cpp
@@ -120,7 +120,7 @@ namespace {
       }
     }
     /// Callback for clone imports, where the user extension should be copied
-    void operator()(TGeoVolume* new_v, TGeoVolume* old_v, int set_bit)   {
+    void operator()(TGeoVolume* new_v, TGeoVolume* old_v, SensitiveDetector sd, int set_bit)   {
       if ( !new_v || !old_v )  {
         except("dd4hep","VolumeImport: ERROR: The refected volume is INVALID!");        
       }
@@ -131,6 +131,9 @@ namespace {
         TClass* c = new_v->IsA();
         Volume old_vol(old_v);
         Volume new_vol(new_v);
+        if ( sd.isValid() && old_vol.isSensitive() )   {
+          new_vol.setSensitiveDetector(sd);
+        }
         if ( c == geo_volume_t::Class() )  {
           Volume::Object *new_e, *old_e = (Volume::Object*)_data(old_vol);
           old_e->reflected = new_v;
@@ -151,7 +154,7 @@ namespace {
           old_e->reflected = new_v;
           new_e->reflected = old_v;
           for(int i=0, n=new_mv->GetNvolumes(); i<n; ++i)
-            (*this)(new_mv->GetVolume(i), old_mv->GetVolume(i), set_bit);
+            (*this)(new_mv->GetVolume(i), old_mv->GetVolume(i), sd, set_bit);
         }
         else
           except("dd4hep","VolumeImport: Unknown TGeoVolume sub-class: %s",new_v->IsA()->GetName());
@@ -169,7 +172,7 @@ namespace {
             auto* e = (PlacedVolume::Object*)ov->geo_node_t::GetUserExtension();
             pv->geo_node_t::SetUserExtension(new PlacedVolume::Object(*e));
           }
-          (*this)(pv->GetVolume(), ov->GetVolume(), set_bit);
+          (*this)(pv->GetVolume(), ov->GetVolume(), sd, set_bit);
         }
       }
     }
@@ -178,8 +181,7 @@ namespace {
   TGeoVolume *MakeReflection(TGeoVolume* v, const char *newname=0)  {
     static TMap map(100);
     TGeoVolume *vol = (TGeoVolume*)map.GetValue(v);
-    if (vol) {
-      if (newname && newname[0]) vol->SetName(newname);
+    if ( vol ) {
       return vol;
     }
     vol = v->CloneVolume();
@@ -188,7 +190,15 @@ namespace {
       return nullptr;
     }
     map.Add((TObject*)v, vol);
-    if (newname && newname[0]) vol->SetName(newname);
+    string nam;
+    if (newname && newname[0])  {
+      nam = newname;
+      vol->SetName(newname);
+    }
+    else   {
+      nam = v->GetName();
+      vol->SetName((nam+"_refl").c_str());
+    }
     delete vol->GetNodes();
     vol->SetNodes(NULL);
     vol->SetBit(TGeoVolume::kVolumeImportNodes, kFALSE);
@@ -198,7 +208,7 @@ namespace {
     if (v->GetShape())   {
       TGeoScale* scale = new TGeoScale( 1., 1.,-1.);
       TGeoShape *reflected_shape =
-        TGeoScaledShape::MakeScaledShape("", v->GetShape(), scale);
+        TGeoScaledShape::MakeScaledShape((nam+"_shape_refl").c_str(), v->GetShape(), scale);
       vol->SetShape(reflected_shape);
     }
     // Reflect the daughters.
@@ -484,16 +494,19 @@ Volume::Object* Volume::data() const   {
   return o;
 }
 
-/// Create a reflected volume. The reflected volume has left-handed coordinates
+/// Create a reflected volume tree. The reflected volume has left-handed coordinates
 Volume Volume::reflect()  const   {
+  return reflect(SensitiveDetector(0));
+}
+    
+/// Create a reflected volume tree. The reflected volume has left-handed coordinates
+Volume Volume::reflect(SensitiveDetector sd)  const   {
   if ( m_element )   {
     VolumeImport imp;
-    string nam = name();
-    nam       += "_refl";
     Object* o = data();
     if ( !o->reflected.isValid() )  {
-      TGeoVolume* vol = MakeReflection(m_element, nam.c_str());
-      imp(vol, m_element, Volume::REFLECTED);
+      TGeoVolume* vol = MakeReflection(m_element);
+      imp(vol, m_element, sd, Volume::REFLECTED);
       o->reflected = vol;
     }
     return o->reflected;
diff --git a/DDDetectors/compact/SiD.xml b/DDDetectors/compact/SiD.xml
index 63e96b33dedf13d584aa5e6766632fa344607678..3effefbea5d245c7dd9b2bffbc92200556213575 100644
--- a/DDDetectors/compact/SiD.xml
+++ b/DDDetectors/compact/SiD.xml
@@ -17,165 +17,7 @@
   </includes>
   
   <define>
-    <constant name="world_side" value="30000*mm"/>
-    <constant name="world_x" value="world_side"/>
-    <constant name="world_y" value="world_side"/>
-    <constant name="world_z" value="world_side"/>
-    
-    <constant name="CrossingAngle" value="0.020*rad"/>
-    
-    <constant name="CaloSides" value="12"/>
-    <constant name="MuonSides" value="8"/>
-    
-    <constant name="EcalBarrel_ID" value="6"/>
-    <constant name="EcalBarrel_rmin" value="126.50*cm + world_side - world_side"/>
-    <constant name="EcalBarrel_rmin" value="126.50*cm"/>
-    <constant name="EcalBarrel_zmax" value="176.50*cm"/>
-
-    <constant name="EcalEndcap_ID" value="7"/>
-    <constant name="EcalEndcap_rmin" value="21.0*cm"/>
-    <!-- Correction from going from inner circle to outer circle -->
-    <constant name="EcalEndcap_rmax" value="(EcalBarrel_rmin - 1.5*cm) / (cos(pi/CaloSides))"/> 
-    <constant name="EcalEndcap_zmin" value="165.70*cm"/>
-    
-    <constant name="HcalBarrel_ID" value="8"/>
-    <constant name="HcalBarrel_rmin" value="141.90*cm"/>
-    <constant name="HcalBarrel_layers" value="(int) 75"/>
-    <constant name="HcalBarrel_layer_thickness" value="1.0*cm + 0.65*cm"/>
-
-    <constant name="HcalEndcap_ID" value="9"/>
-    <constant name="HcalEndcap_zmin" value="EcalBarrel_zmax + 4.0*cm"/> <!-- Gap for cables -->
-    <constant name="HcalEndcap_rmin" value="50.0*cm"/>
-    <!-- Correction from going from inner circle to outer circle -->
-    <constant name="HcalEndcap_rmax" value="(HcalBarrel_rmin + HcalBarrel_layers * HcalBarrel_layer_thickness) / (cos(pi/CaloSides))"/>
-    <constant name="HcalEndcap_layers" value="60"/>
-    <constant name="HcalEndcap_layer_thickness" value="2.0*cm + 0.65*cm"/>
-    <constant name="HcalEndcap_zmax" value="HcalEndcap_zmin + HcalEndcap_layers * HcalEndcap_layer_thickness"/>
-
-    <constant name="HcalPlug_ID" value="10"/>
-
-    
-    <constant name="tracking_region_radius" value="EcalBarrel_rmin - 1.0*mm"/>
-    <constant name="tracking_region_zmax" value="EcalEndcap_zmin - 1.0*mm"/>
-    <constant name="VXD_CF_sensor" value="0.026*cm"/>
-    <constant name="VXD_CF_support" value="0.05*cm"/>
-    
-    <constant name="SolenoidBarrelInnerRadius" value="HcalEndcap_rmax + 2.0*cm"/>
-    <constant name="SolenoidCoilOuterZ" value="HcalEndcap_zmax"/> <!-- Aligned with HCAL endcap -->
-    <constant name="SolenoidBarrelInnerCryostatThickness" value="3.0*cm"/>
-    <constant name="SolenoidBarrelInnerAirgapThickness" value="11.0*cm"/>
-    <constant name="SolenoidBarrelAlConductorThickness" value="38.4*cm"/>
-    <constant name="SolenoidBarrelQuenchbackThickness" value="5.0*cm"/>
-    <constant name="SolenoidBarrelOuterAirgapThickness" value="18.7*cm"/>
-    <constant name="SolenoidBarrelOuterCryostatThickness" value="4.0*cm"/>
-    <constant name="SolenoidEndcapCryostatThickness" value="6.0*cm"/>
-    <constant name="SolenoidEndcapAirgapThickness" value="12.0*cm"/>
-    <constant name="SolenoidBarrelOuterZ" value="SolenoidCoilOuterZ+SolenoidEndcapAirgapThickness"/>
-    <constant name="SolenoidBarrelConductorInnerRadius" value="SolenoidBarrelInnerRadius + SolenoidBarrelInnerCryostatThickness + SolenoidBarrelInnerAirgapThickness"/>
-    <constant name="SolenoidBarrelOuterCryostatInnerRadius" value="SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/>
-    <constant name="SolenoidBarrelOuterRadius" value="SolenoidBarrelOuterCryostatInnerRadius + SolenoidBarrelOuterAirgapThickness + SolenoidBarrelOuterCryostatThickness"/>
-    <constant name="SolenoidalFieldRadius" value="(SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness / 2.0)"/>
-    
-
-    <constant name="MuonBarrel_ID" value="11"/>
-    <constant name="MuonBarrel_rmin" value="SolenoidBarrelOuterRadius + 1.0*cm"/>
-    <constant name="MuonBarrel_zmax" value="SolenoidBarrelOuterZ + SolenoidEndcapCryostatThickness"/>
-    <constant name="MuonBarrel_layers" value="15"/>
-    <constant name="MuonBarrel_layer_thickness" value="10.0*cm + 4.0*cm"/>
-
-    <constant name="MuonEndcap_ID" value="12"/>
-    <constant name="MuonEndcap_zmin" value="MuonBarrel_zmax + 10.0*cm"/> <!-- Space for cables etc. -->
-    <constant name="MuonEndcap_rmin" value="69.0*cm"/> <!-- Space for QD0 and anti-solenoid-->
-    <!-- Correction from going from inner circle to outer circle -->
-    <constant name="MuonEndcap_rmax" value="(MuonBarrel_rmin + 57.0*cm + MuonBarrel_layers*MuonBarrel_layer_thickness) / (cos(pi/MuonSides))"/> 
-    <constant name="MuonEndcap_layers" value="18"/>
-    <constant name="MuonEndcap_layer_thickness" value="10.0*cm + 4.0*cm"/>
-    <constant name="MuonEndcap_zmax" value="MuonEndcap_zmin + MuonEndcap_layers * MuonEndcap_layer_thickness"/>
-    
-    <constant name="LumiCal_rmin" value="6.4*cm"/>
-    <constant name="LumiCal_rmax" value="EcalEndcap_rmin + 3.0*cm"/>
-    <constant name="LumiCal_zmin" value="HcalEndcap_zmin"/>
-    <constant name="LumiCal_thickness" value="20*0.371*cm + 15*0.643*cm"/>
-    <constant name="LumiCal_zmax" value="LumiCal_zmin + LumiCal_thickness"/>
-    <constant name="LumiCalElectronics_rmax" value="LumiCal_rmax+5.0*cm"/>
-    
-    <constant name="SupportTube_thickness" value="1.0*cm"/>
-    <constant name="ForwardVacuumValve_thickness" value="36.0*cm"/>
-    <constant name="ForwardShielding_thickness" value="5.0*cm"/>
-    <constant name="ForwardMask_thickness" value="10.0*cm"/>
-    <constant name="ForwardMask_zmin" value="LumiCal_zmax + ForwardShielding_thickness + ForwardVacuumValve_thickness"/>
-    
-    <constant name="VertexSupport_r1" value="16.87*cm"/>
-    <constant name="VertexSupport_r2" value="18.42*cm"/>
-    <constant name="VertexSupport_zmax" value="89.48*cm"/>
-    
-
-    <constant name="VertexBarrel_ID" value="1"/>
-    <constant name="VertexBarrel_zmax" value="10.0*cm"/>
-    <constant name="VertexBarrel_r1" value="2.7*cm"/>
-    <constant name="VertexBarrel_r2" value="3.8*cm"/>
-    <constant name="VertexBarrel_r3" value="5.1*cm"/>
-    <constant name="VertexBarrel_r4" value="6.4*cm"/>
-    <constant name="VertexBarrel_r5" value="7.7*cm"/>
-
-    
-    <constant name="CentralBeamPipe_zmax" value="23.0*cm"/>
-    <constant name="CentralBeamPipe_rmax" value="VertexBarrel_r1 - 0.2*cm"/>
-    <constant name="CentralBeamPipe_thickness" value="CentralBeamPipe_rmax * 0.02"/> <!-- 1% of the diameter -->
-    <constant name="CentralBeamPipe_rmin" value="CentralBeamPipe_rmax - CentralBeamPipe_thickness"/>
-    <constant name="BeamPipe_thickness" value="0.4*cm"/>
-    <constant name="BeamPipe_endThickness" value="0.1*cm"/>
-    <constant name="BeamPipe_zmax" value="LumiCal_zmin - 0.5*cm"/>
-    <constant name="BeamPipe_rmax" value="19.0*cm"/>
-    <constant name="BeamPipe_rmin" value="BeamPipe_rmax - BeamPipe_thickness"/>
-    <constant name="bp_cone_slope" value="(BeamPipe_rmax-CentralBeamPipe_rmax)/(tracking_region_zmax-CentralBeamPipe_zmax)"/>
-    <constant name="BeamPipe_zmin" value="CentralBeamPipe_zmax + (BeamPipe_thickness - CentralBeamPipe_thickness)/bp_cone_slope"/>
-    <constant name="BeamPipeLiner_thickness" value="0.0*cm"/>
-
-    <constant name="VertexEndcap_ID" value="2"/>
-    <constant name="VertexEndcap_rmax" value="11.5*cm"/>
-    <constant name="VertexEndcap_z1" value="12.0*cm"/>
-    <constant name="VertexEndcap_z2" value="16.0*cm"/>
-    <constant name="VertexEndcap_z3" value="20.0*cm"/>
-    <constant name="VertexEndcap_z4" value="24.0*cm"/>
-    <constant name="VertexEndcap_offset" value="0.2*cm"/>
-    <constant name="VertexEndcapModules" value="16"/>
-    <constant name="VertexEndcap_rmin1" value="CentralBeamPipe_rmax + VertexEndcap_offset"/>
-    <constant name="VertexEndcap_rmin2" value="CentralBeamPipe_rmax + VertexEndcap_offset"/>
-    <constant name="VertexEndcap_rmin3" value="CentralBeamPipe_rmax + VertexEndcap_offset"/>
-    <constant name="VertexEndcap_rmin4" value="(VertexEndcap_z4 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + VertexEndcap_offset"/>
-    
-    <constant name="SiTrackerBarrel_ID" value="3"/>
-    <constant name="SiTrackerEndcap_ID" value="4"/>
-
-    <constant name="ForwardTracker_ID" value="5"/>
-    <constant name="ForwardTrackerModules" value="16"/>
-    <constant name="ForwardTracker_rmax" value="16.87*cm"/>
-    <constant name="ForwardTracker_z1" value="28.0*cm"/>
-    <constant name="ForwardTracker_z2" value="50.0*cm"/>
-    <constant name="ForwardTracker_z3" value="83.0*cm"/>
-    <constant name="ForwardTracker_offset" value="0.2*cm"/>
-    <constant name="ForwardTracker_rmin1" value="(ForwardTracker_z1 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/>
-    <constant name="ForwardTracker_rmin2" value="(ForwardTracker_z2 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/>
-    <constant name="ForwardTracker_rmin3" value="(ForwardTracker_z3 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/>
-    
-    <constant name="VertexService_zmin" value="ForwardTracker_z1 + 1.0*cm"/>
-    <constant name="VertexService_zmax" value="VertexService_zmin + 2.0*cm"/>
-    <constant name="VertexServiceThickness" value="0.3*cm"/>
-    <constant name="VertexCableThickness" value="0.005*cm"/>
-    
-    <constant name="BeamCal_rmax" value="13.0*cm"/>
-    <constant name="BeamCal_zmin" value="ForwardMask_zmin + ForwardMask_thickness"/>
-
-    <constant name="IncomingBP_radius" value="0.25*cm"/>
-    <constant name="IncomingBP_thickness" value="0.05*cm"/>
-    <constant name="OutgoingBP_radius" value="tan(CrossingAngle/2/rad)*BeamCal_zmin"/>
-    <constant name="OutgoingBP_thickness" value="0.1*cm"/>    
-
-    <constant name="BeamCal_crossingAngle" value="CrossingAngle"/>    
-    <constant name="BeamCal_outgoing_r" value="OutgoingBP_radius + 0.05*cm"/>    
-    <constant name="BeamCal_incoming_r" value="IncomingBP_radius + 0.05*cm"/>    
-
+    <include ref="SiDConstants.xml"/>
   </define>
 
 
diff --git a/DDDetectors/compact/SiD/SiD_HcalEndcap.xml b/DDDetectors/compact/SiD/SiD_HcalEndcap.xml
index ec64195ee377d6b98f41e614f1269bc0073a9c4a..95f1b16f3c442e1c9b2ad8b8f45c293b9f65a12d 100644
--- a/DDDetectors/compact/SiD/SiD_HcalEndcap.xml
+++ b/DDDetectors/compact/SiD/SiD_HcalEndcap.xml
@@ -6,13 +6,13 @@
 <!-- ====================================================================== -->
 
 <detectors>
-  <detector id="9" name="HcalEndcap" type="DD4hep_PolyhedraEndcapCalorimeter2" readout="HcalEndcapHits" vis="HcalEndcapVis" calorimeterType="HAD_ENDCAP">
+  <detector id="HcalEndcap_ID" name="HcalEndcap" type="DD4hep_PolyhedraEndcapCalorimeter2" readout="HcalEndcapHits" reflect="true" vis="HcalEndcapVis" calorimeterType="HAD_ENDCAP">
 
     <comment>Hadron Calorimeter Endcaps</comment>
 
     <dimensions numsides="(int) CaloSides" zmin="HcalEndcap_zmin" rmin="HcalEndcap_rmin" rmax="HcalEndcap_rmax" />
     <layer repeat="(int) HcalEndcap_layers">
-      <slice material = "Steel235" thickness = "2.0*cm" />
+      <slice material = "Steel235"    thickness = "2.0*cm" />
       <slice material = "Polystyrene" thickness = "0.50*cm" sensitive = "yes" limits="cal_limits" />        
       <slice material = "Air" thickness = "0.15*cm" />
     </layer>
diff --git a/DDDetectors/compact/SiDConstants.xml b/DDDetectors/compact/SiDConstants.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ce549d5e46efbc71976285e1b3bcad7502bbe294
--- /dev/null
+++ b/DDDetectors/compact/SiDConstants.xml
@@ -0,0 +1,159 @@
+  <define>
+    <constant name="world_side" value="30000*mm"/>
+    <constant name="world_x" value="world_side"/>
+    <constant name="world_y" value="world_side"/>
+    <constant name="world_z" value="world_side"/>
+
+    <constant name="CrossingAngle" value="0.020*rad"/>
+    
+    <constant name="CaloSides" value="12"/>
+    <constant name="MuonSides" value="8"/>
+    
+    <constant name="EcalBarrel_ID" value="6"/>
+    <constant name="EcalBarrel_rmin" value="126.50*cm"/>
+    <constant name="EcalBarrel_zmax" value="176.50*cm"/>
+
+    <constant name="EcalEndcap_ID" value="7"/>
+    <constant name="EcalEndcap_rmin" value="21.0*cm"/>
+    <!-- Correction from going from inner circle to outer circle -->
+    <constant name="EcalEndcap_rmax" value="(EcalBarrel_rmin - 1.5*cm) / (cos(pi/CaloSides))"/> 
+    <constant name="EcalEndcap_zmin" value="165.70*cm"/>
+    
+    <constant name="HcalBarrel_ID" value="8"/>
+    <constant name="HcalBarrel_rmin" value="141.90*cm"/>
+    <constant name="HcalBarrel_layers" value="(int) 75"/>
+    <constant name="HcalBarrel_layer_thickness" value="1.0*cm + 0.65*cm"/>
+
+    <constant name="HcalEndcap_ID" value="9"/>
+    <constant name="HcalEndcap_zmin" value="EcalBarrel_zmax + 4.0*cm"/> <!-- Gap for cables -->
+    <constant name="HcalEndcap_rmin" value="50.0*cm"/>
+    <!-- Correction from going from inner circle to outer circle -->
+    <constant name="HcalEndcap_rmax" value="(HcalBarrel_rmin + HcalBarrel_layers * HcalBarrel_layer_thickness) / (cos(pi/CaloSides))"/>
+    <constant name="HcalEndcap_layers" value="60"/>
+    <constant name="HcalEndcap_layer_thickness" value="2.0*cm + 0.65*cm"/>
+    <constant name="HcalEndcap_zmax" value="HcalEndcap_zmin + HcalEndcap_layers * HcalEndcap_layer_thickness"/>
+
+    <constant name="HcalPlug_ID" value="10"/>
+
+    
+    <constant name="tracking_region_radius" value="EcalBarrel_rmin - 1.0*mm"/>
+    <constant name="tracking_region_zmax" value="EcalEndcap_zmin - 1.0*mm"/>
+    <constant name="VXD_CF_sensor" value="0.026*cm"/>
+    <constant name="VXD_CF_support" value="0.05*cm"/>
+    
+    <constant name="SolenoidBarrelInnerRadius" value="HcalEndcap_rmax + 2.0*cm"/>
+    <constant name="SolenoidCoilOuterZ" value="HcalEndcap_zmax"/> <!-- Aligned with HCAL endcap -->
+    <constant name="SolenoidBarrelInnerCryostatThickness" value="3.0*cm"/>
+    <constant name="SolenoidBarrelInnerAirgapThickness" value="11.0*cm"/>
+    <constant name="SolenoidBarrelAlConductorThickness" value="38.4*cm"/>
+    <constant name="SolenoidBarrelQuenchbackThickness" value="5.0*cm"/>
+    <constant name="SolenoidBarrelOuterAirgapThickness" value="18.7*cm"/>
+    <constant name="SolenoidBarrelOuterCryostatThickness" value="4.0*cm"/>
+    <constant name="SolenoidEndcapCryostatThickness" value="6.0*cm"/>
+    <constant name="SolenoidEndcapAirgapThickness" value="12.0*cm"/>
+    <constant name="SolenoidBarrelOuterZ" value="SolenoidCoilOuterZ+SolenoidEndcapAirgapThickness"/>
+    <constant name="SolenoidBarrelConductorInnerRadius" value="SolenoidBarrelInnerRadius + SolenoidBarrelInnerCryostatThickness + SolenoidBarrelInnerAirgapThickness"/>
+    <constant name="SolenoidBarrelOuterCryostatInnerRadius" value="SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/>
+    <constant name="SolenoidBarrelOuterRadius" value="SolenoidBarrelOuterCryostatInnerRadius + SolenoidBarrelOuterAirgapThickness + SolenoidBarrelOuterCryostatThickness"/>
+    <constant name="SolenoidalFieldRadius" value="(SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness / 2.0)"/>
+    
+
+    <constant name="MuonBarrel_ID" value="11"/>
+    <constant name="MuonBarrel_rmin" value="SolenoidBarrelOuterRadius + 1.0*cm"/>
+    <constant name="MuonBarrel_zmax" value="SolenoidBarrelOuterZ + SolenoidEndcapCryostatThickness"/>
+    <constant name="MuonBarrel_layers" value="15"/>
+    <constant name="MuonBarrel_layer_thickness" value="10.0*cm + 4.0*cm"/>
+
+    <constant name="MuonEndcap_ID" value="12"/>
+    <constant name="MuonEndcap_zmin" value="MuonBarrel_zmax + 10.0*cm"/> <!-- Space for cables etc. -->
+    <constant name="MuonEndcap_rmin" value="69.0*cm"/> <!-- Space for QD0 and anti-solenoid-->
+    <!-- Correction from going from inner circle to outer circle -->
+    <constant name="MuonEndcap_rmax" value="(MuonBarrel_rmin + 57.0*cm + MuonBarrel_layers*MuonBarrel_layer_thickness) / (cos(pi/MuonSides))"/> 
+    <constant name="MuonEndcap_layers" value="18"/>
+    <constant name="MuonEndcap_layer_thickness" value="10.0*cm + 4.0*cm"/>
+    <constant name="MuonEndcap_zmax" value="MuonEndcap_zmin + MuonEndcap_layers * MuonEndcap_layer_thickness"/>
+    
+    <constant name="LumiCal_rmin" value="6.4*cm"/>
+    <constant name="LumiCal_rmax" value="EcalEndcap_rmin + 3.0*cm"/>
+    <constant name="LumiCal_zmin" value="HcalEndcap_zmin"/>
+    <constant name="LumiCal_thickness" value="20*0.371*cm + 15*0.643*cm"/>
+    <constant name="LumiCal_zmax" value="LumiCal_zmin + LumiCal_thickness"/>
+    <constant name="LumiCalElectronics_rmax" value="LumiCal_rmax+5.0*cm"/>
+    
+    <constant name="SupportTube_thickness" value="1.0*cm"/>
+    <constant name="ForwardVacuumValve_thickness" value="36.0*cm"/>
+    <constant name="ForwardShielding_thickness" value="5.0*cm"/>
+    <constant name="ForwardMask_thickness" value="10.0*cm"/>
+    <constant name="ForwardMask_zmin" value="LumiCal_zmax + ForwardShielding_thickness + ForwardVacuumValve_thickness"/>
+    
+    <constant name="VertexSupport_r1" value="16.87*cm"/>
+    <constant name="VertexSupport_r2" value="18.42*cm"/>
+    <constant name="VertexSupport_zmax" value="89.48*cm"/>
+    
+
+    <constant name="VertexBarrel_ID" value="1"/>
+    <constant name="VertexBarrel_zmax" value="10.0*cm"/>
+    <constant name="VertexBarrel_r1" value="2.7*cm"/>
+    <constant name="VertexBarrel_r2" value="3.8*cm"/>
+    <constant name="VertexBarrel_r3" value="5.1*cm"/>
+    <constant name="VertexBarrel_r4" value="6.4*cm"/>
+    <constant name="VertexBarrel_r5" value="7.7*cm"/>
+
+    
+    <constant name="CentralBeamPipe_zmax" value="23.0*cm"/>
+    <constant name="CentralBeamPipe_rmax" value="VertexBarrel_r1 - 0.2*cm"/>
+    <constant name="CentralBeamPipe_thickness" value="CentralBeamPipe_rmax * 0.02"/> <!-- 1% of the diameter -->
+    <constant name="CentralBeamPipe_rmin" value="CentralBeamPipe_rmax - CentralBeamPipe_thickness"/>
+    <constant name="BeamPipe_thickness" value="0.4*cm"/>
+    <constant name="BeamPipe_endThickness" value="0.1*cm"/>
+    <constant name="BeamPipe_zmax" value="LumiCal_zmin - 0.5*cm"/>
+    <constant name="BeamPipe_rmax" value="19.0*cm"/>
+    <constant name="BeamPipe_rmin" value="BeamPipe_rmax - BeamPipe_thickness"/>
+    <constant name="bp_cone_slope" value="(BeamPipe_rmax-CentralBeamPipe_rmax)/(tracking_region_zmax-CentralBeamPipe_zmax)"/>
+    <constant name="BeamPipe_zmin" value="CentralBeamPipe_zmax + (BeamPipe_thickness - CentralBeamPipe_thickness)/bp_cone_slope"/>
+    <constant name="BeamPipeLiner_thickness" value="0.0*cm"/>
+
+    <constant name="VertexEndcap_ID" value="2"/>
+    <constant name="VertexEndcap_rmax" value="11.5*cm"/>
+    <constant name="VertexEndcap_z1" value="12.0*cm"/>
+    <constant name="VertexEndcap_z2" value="16.0*cm"/>
+    <constant name="VertexEndcap_z3" value="20.0*cm"/>
+    <constant name="VertexEndcap_z4" value="24.0*cm"/>
+    <constant name="VertexEndcap_offset" value="0.2*cm"/>
+    <constant name="VertexEndcapModules" value="16"/>
+    <constant name="VertexEndcap_rmin1" value="CentralBeamPipe_rmax + VertexEndcap_offset"/>
+    <constant name="VertexEndcap_rmin2" value="CentralBeamPipe_rmax + VertexEndcap_offset"/>
+    <constant name="VertexEndcap_rmin3" value="CentralBeamPipe_rmax + VertexEndcap_offset"/>
+    <constant name="VertexEndcap_rmin4" value="(VertexEndcap_z4 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + VertexEndcap_offset"/>
+    
+    <constant name="SiTrackerBarrel_ID" value="3"/>
+    <constant name="SiTrackerEndcap_ID" value="4"/>
+
+    <constant name="ForwardTracker_ID" value="5"/>
+    <constant name="ForwardTrackerModules" value="16"/>
+    <constant name="ForwardTracker_rmax" value="16.87*cm"/>
+    <constant name="ForwardTracker_z1" value="28.0*cm"/>
+    <constant name="ForwardTracker_z2" value="50.0*cm"/>
+    <constant name="ForwardTracker_z3" value="83.0*cm"/>
+    <constant name="ForwardTracker_offset" value="0.2*cm"/>
+    <constant name="ForwardTracker_rmin1" value="(ForwardTracker_z1 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/>
+    <constant name="ForwardTracker_rmin2" value="(ForwardTracker_z2 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/>
+    <constant name="ForwardTracker_rmin3" value="(ForwardTracker_z3 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/>
+    
+    <constant name="VertexService_zmin" value="ForwardTracker_z1 + 1.0*cm"/>
+    <constant name="VertexService_zmax" value="VertexService_zmin + 2.0*cm"/>
+    <constant name="VertexServiceThickness" value="0.3*cm"/>
+    <constant name="VertexCableThickness" value="0.005*cm"/>
+    
+    <constant name="BeamCal_rmax" value="13.0*cm"/>
+    <constant name="BeamCal_zmin" value="ForwardMask_zmin + ForwardMask_thickness"/>
+
+    <constant name="IncomingBP_radius" value="0.25*cm"/>
+    <constant name="IncomingBP_thickness" value="0.05*cm"/>
+    <constant name="OutgoingBP_radius" value="tan(CrossingAngle/2/rad)*BeamCal_zmin"/>
+    <constant name="OutgoingBP_thickness" value="0.1*cm"/>    
+
+    <constant name="BeamCal_crossingAngle" value="CrossingAngle"/>    
+    <constant name="BeamCal_outgoing_r" value="OutgoingBP_radius + 0.05*cm"/>    
+    <constant name="BeamCal_incoming_r" value="IncomingBP_radius + 0.05*cm"/>
+  </define>
diff --git a/DDDetectors/src/ReflectedDetector_geo.cpp b/DDDetectors/src/ReflectedDetector_geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cb717643eb34ee1d3dc84038d56d5feb4d8fbb42
--- /dev/null
+++ b/DDDetectors/src/ReflectedDetector_geo.cpp
@@ -0,0 +1,80 @@
+//==========================================================================
+//  AIDA Detector description implementation 
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+// Author     : M.Frank
+//
+//==========================================================================
+//
+// Specialized generic detector constructor
+// 
+//==========================================================================
+#include "DD4hep/Printout.h"
+#include "DD4hep/DD4hepUnits.h"
+#include "DD4hep/MatrixHelpers.h"
+#include "DD4hep/DetFactoryHelper.h"
+
+using namespace std;
+using namespace dd4hep;
+using namespace dd4hep::detail;
+
+static Ref_t create_element(Detector& description, xml_h e, Ref_t sens)  {
+  xml_det_t  x_det  (e);
+  SensitiveDetector sd = sens;
+  xml_dim_t  pos     = x_det.child(_U(position),false);
+  xml_dim_t  rot     = x_det.child(_U(rotation),false);
+  string     ref_nam = x_det.attr<string>(_U(sdref));
+  DetElement ref_det = description.detector(ref_nam);
+  auto       refl    = ref_det.reflect(x_det.nameStr(), x_det.id(), sd);
+  Volume     vol     = refl.second;
+  DetElement sdet    = refl.first;
+
+  if ( !x_det.visStr().empty() )
+    vol.setVisAttributes(description, x_det.visStr());
+  if ( !x_det.limitsStr().empty() )
+    vol.setLimitSet(description, x_det.limitsStr());
+  if ( !x_det.regionStr().empty() )
+    vol.setRegion(description, x_det.regionStr());
+  if ( x_det.isSensitive() )   {
+    xml_dim_t sd_typ = x_det.child(_U(sensitive));
+    sd.setType(sd_typ.typeStr());
+  }
+  PlacedVolume pv;
+  Volume       mother = description.pickMotherVolume(sdet);
+  if ( pos && rot )   {
+    pv = mother.placeVolume(vol,Transform3D(RotationZYX(rot.z(0),rot.y(0),rot.x(0)),Position(pos.x(0),pos.y(0),pos.z(0))));
+    printout(INFO,"ReflectedDet","Transform3D placement at pos: %f %f %f rot: %f %f %f",
+             pos.x(0),pos.y(0),pos.z(0), rot.x(0),rot.y(0),rot.z(0));
+  }
+  else if ( rot )   {
+    printout(INFO,"ReflectedDet","Rotation placement at %f %f %f",rot.x(0),rot.y(0),rot.z(0));
+    pv = mother.placeVolume(vol,RotationZYX(rot.z(0),rot.y(0),rot.x(0)));
+  }
+  else if ( pos )   {
+    printout(INFO,"ReflectedDet","Positional placing at %f %f %f",pos.x(0),pos.y(0),pos.z(0));
+    pv = mother.placeVolume(vol,Position(pos.x(0),pos.y(0),pos.z(0)));
+  }
+  else   {
+    auto ref_pv = ref_det.placement();
+    RotationZYX rot3D;
+    Position    tr3D;
+    matrix::_decompose(ref_pv.matrix(), tr3D, rot3D);
+    tr3D = tr3D * (-1.0 / dd4hep::mm);
+    rot3D = rot3D * RotationZ();
+    pv = mother.placeVolume(vol, Transform3D(rot3D, tr3D));
+    printout(INFO,"ReflectedDet","Transform3D placement at pos: %f %f %f rot: %f %f %f",
+             tr3D.X(),tr3D.Y(),tr3D.Z(), rot3D.Phi(),rot3D.Theta(),rot3D.Psi());
+  }
+  if ( x_det.hasAttr(_U(id)) )  {
+    pv.addPhysVolID("system",x_det.id());
+  }
+  sdet.setPlacement(pv);
+  return sdet;
+}
+
+DECLARE_DETELEMENT(DD4hep_ReflectedDetector,create_element)
diff --git a/DDG4/CMakeLists.txt b/DDG4/CMakeLists.txt
index ff705904a21b4e455cdc6a984923f60111515dba..d7a97e4154db4f7a33039a3509e7abca2dc639d0 100644
--- a/DDG4/CMakeLists.txt
+++ b/DDG4/CMakeLists.txt
@@ -101,7 +101,8 @@ IF(TARGET LCIO::LCIO)
   set_target_properties(DDG4LCIO PROPERTIES VERSION ${DD4hep_VERSION} SOVERSION ${DD4hep_SOVERSION})
 
 ENDIF()
-# #---------------------------  DDRec dependent Plugins  -----------------------------
+#
+#---------------------------  DDRec dependent Plugins  -----------------------------
 #This does not compile at the moment
 # IF(TARGET DDRec)
 #   dd4hep_add_plugin(DDG4Reco
diff --git a/examples/ClientTests/CMakeLists.txt b/examples/ClientTests/CMakeLists.txt
index bd6c6b7f1d79cd363ef02985fbb41dfe49baef41..efd651a6a409a38f16a27bada3c62a37cb4416a9 100644
--- a/examples/ClientTests/CMakeLists.txt
+++ b/examples/ClientTests/CMakeLists.txt
@@ -183,7 +183,7 @@ dd4hep_add_test_reg( ClientTests_Save_ROOT_MiniTel_LONGTEST
 #
 #  Test basic shapes by comparing mesh vertices with reference file
 foreach (test Box Cone ConeSegment Tube ElTube
-    CutTube Hyperboloid Paraboloid EightPointSolid
+    CutTube Hyperboloid Paraboloid EightPointSolid Eightpoint_Reflect_Volume Eightpoint_Reflect_DetElement
     Polycone PseudoTrap PseudoTrap2 Sphere Torus
     Trap Trd1 Trd2 TruncatedTube ExtrudedPolygon)
   dd4hep_add_test_reg( ClientTests_Check_Shape_${test}
@@ -204,7 +204,7 @@ dd4hep_add_test_reg( ClientTests_Check_VolumeDivisionTest
 #
 # only if root version > 6.19: MaterialTester
 #
-foreach (test Assemblies BoxTrafos IronCylinder LheD_tracker MagnetFields  
+foreach (test Assemblies BoxTrafos CaloEndcapReflection IronCylinder LheD_tracker MagnetFields  
     MiniTel SectorBarrelCalorimeter SiliconBlock NestedSimple NestedDetectors 
     MultiCollections MultiSegmentations )
 
@@ -239,7 +239,7 @@ endforeach()
 # IronCylinder has no segmentation!
 # MaterialTester no geometry
 # SectorBarrelCalorimeter is bad
-foreach (test Assemblies BoxTrafos LheD_tracker MagnetFields MiniTel SiliconBlock 
+foreach (test Assemblies BoxTrafos CaloEndcapReflection LheD_tracker MagnetFields MiniTel SiliconBlock 
          NestedSimple NestedDetectors MultiCollections )
   #
   # Test material scans in [origine to 10 meters in y]
@@ -261,7 +261,7 @@ endforeach()
 #
 #
 #
-foreach (test BoxTrafos IronCylinder MiniTel SiliconBlock NestedSimple MultiCollections )
+foreach (test BoxTrafos CaloEndcapReflection IronCylinder MiniTel SiliconBlock NestedSimple MultiCollections )
   #
   #  Read data from XML file. Then parse the pure XML string.
   dd4hep_add_test_reg( ClientTests_parse_xml_string_${test}
diff --git a/examples/ClientTests/compact/CaloEndcapReflection.xml b/examples/ClientTests/compact/CaloEndcapReflection.xml
new file mode 100644
index 0000000000000000000000000000000000000000..547f2d53d84c3278907ffed0a11cd0091d504541
--- /dev/null
+++ b/examples/ClientTests/compact/CaloEndcapReflection.xml
@@ -0,0 +1,115 @@
+<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="clic_sid_cdr"
+        title="CLIC Silicon Detector CDR"
+        author="Markus Frank"
+        url="https://twiki.cern.ch/twiki/bin/view/CLIC/ClicSidCdr"
+        status="development"
+        version="1.0">
+    <comment>Test for reflections with left handed coordinates of the ECAL/HCAL encap</comment>
+  </info>
+
+  <define>
+    <include ref="${DD4hepINSTALL}/DDDetectors/compact/SiDConstants.xml"/>
+  </define>
+
+  <includes>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/>
+    <gdmlFile  ref="${DD4hepINSTALL}/DDDetectors/compact/materials.xml"/>
+  </includes>
+  
+  <comment>Common Generic visualization attributes</comment>
+  <display>
+    <vis name="InvisibleNoDaughters"      showDaughters="false" visible="false"/>
+    <vis name="InvisibleWithDaughters"    showDaughters="true" visible="false"/>
+    <vis name="GreenVis"   alpha="1" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/>
+    <vis name="RedVis"     alpha="1" r="1.0" g="0.0" b="0.0" showDaughters="true" visible="true"/>
+    <vis name="BlueVis"    alpha="1" r="0.0" g="0.0" b="1.0" showDaughters="true" visible="true"/>
+    <vis name="YellowVis"  alpha="1" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true"/>
+    <vis name="PinkVis"    alpha="1" r="0.9" g="0.3" b="0.8" showDaughters="true" visible="true"/>
+  </display>
+
+  <detectors>
+    <detector id="EcalEndcap_ID" name="EcalEndcapA" type="DD4hep_PolyhedraEndcapCalorimeter2" reflect="false" readout="EcalEndcapAHits" vis="InvisibleWithDaughters" calorimeterType="EM_ENDCAP">
+
+      <dimensions numsides="(int) CaloSides" zmin="EcalEndcap_zmin" rmin="EcalEndcap_rmin" rmax="EcalEndcap_rmax" />
+      <layer repeat="3" vis="YellowVis">
+        <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>
+      </layer>       
+      <layer repeat="3" vis="RedVis">
+        <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>
+      </layer>
+      <layer repeat="3" vis="BlueVis">
+        <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>
+      </layer>
+      <layer repeat="3" vis="PinkVis">
+        <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>
+      </layer>
+    </detector>
+    <detector id="EcalEndcap_ID+100" name="EcalEndcapB" type="DD4hep_ReflectedDetector"
+              sensitive="true" sdref="EcalEndcapA"    readout="EcalEndcapBHits">
+      <sensitive type="calorimeter"/>
+    </detector>
+
+  </detectors>
+
+  <!--  Definition of the readout segmentation/definition  -->
+  <readouts>
+    <readout name="EcalEndcapAHits">
+      <segmentation type="CartesianGridXY" grid_size_x="3.5" grid_size_y="3.5" />
+      <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id>
+    </readout>
+    <readout name="EcalEndcapBHits">
+      <segmentation type="CartesianGridXY" grid_size_x="3.5" grid_size_y="3.5" />
+      <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id>
+    </readout>
+  </readouts>
+
+  <detectors>
+    <detector id="HcalEndcap_ID" name="HcalEndcapA" type="DD4hep_PolyhedraEndcapCalorimeter2" readout="HcalEndcapAHits" reflect="false" vis="InvisibleWithDaughters" calorimeterType="HAD_ENDCAP">
+      <dimensions numsides="(int) CaloSides" zmin="HcalEndcap_zmin" rmin="HcalEndcap_rmin" rmax="HcalEndcap_rmax" />
+      <layer repeat="2" vis="YellowVis">
+        <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>        
+      </layer>
+      <layer repeat="2" vis="RedVis">
+        <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>        
+      </layer>
+      <layer repeat="2" vis="BlueVis">
+        <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>        
+      </layer>
+      <layer repeat="2" vis="PinkVis">
+        <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/>        
+      </layer>
+    </detector>
+    <detector id="HcalEndcap_ID+100" name="HcalEndcapB" type="DD4hep_ReflectedDetector"
+              sensitive="true" sdref="HcalEndcapA"    readout="HcalEndcapBHits">
+      <sensitive type="calorimeter"/>
+    </detector>
+  </detectors>
+
+  <!--  Definition of the readout segmentation/definition  -->
+  <readouts>
+    <readout name="HcalEndcapAHits">
+      <segmentation type="CartesianGridXY" grid_size_x="3.0*cm" grid_size_y="3.0*cm" />
+      <id>system:8,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id>
+    </readout>
+    <readout name="HcalEndcapBHits">
+      <segmentation type="CartesianGridXY" grid_size_x="3.0*cm" grid_size_y="3.0*cm" />
+      <id>system:8,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id>
+    </readout>
+  </readouts>
+
+  <comment>Beampipe</comment>
+  <include ref="${DD4hepINSTALL}/DDDetectors/compact/SiD/SiD_Beampipe.xml"/>
+  
+  <fields>
+    <field name="GlobalSolenoid" type="solenoid" 
+	   inner_field="5.0*tesla"
+	   outer_field="-1.5*tesla" 
+	   zmax="SolenoidCoilOuterZ"
+	   outer_radius="SolenoidalFieldRadius">
+    </field>
+  </fields>
+</lccdd>
diff --git a/examples/ClientTests/compact/Check_Shape_Eightpoint_Reflect_DetElement.xml b/examples/ClientTests/compact/Check_Shape_Eightpoint_Reflect_DetElement.xml
new file mode 100644
index 0000000000000000000000000000000000000000..540a149e72ba1c125588ec043dd4bf9674f2e3ae
--- /dev/null
+++ b/examples/ClientTests/compact/Check_Shape_Eightpoint_Reflect_DetElement.xml
@@ -0,0 +1,26 @@
+<lccdd>
+  <includes>
+    <gdmlFile ref="CheckShape.xml"/>
+  </includes>
+
+  <detectors>
+    <detector id="1" name="Shape_Trapezoid" type="DD4hep_TestShape_Creator">
+      <check vis="Shape1_vis">
+        <shape type="EightPointSolid" dz="30*cm">
+           <vertex x="-30*cm" y="-25*cm"/>
+           <vertex x="-25*cm" y=" 25*cm"/>
+           <vertex x="  5*cm" y=" 25*cm"/>
+           <vertex x=" 25*cm" y="-25*cm"/>
+           <vertex x="-28*cm" y="-23*cm"/>
+           <vertex x="-23*cm" y=" 27*cm"/>
+           <vertex x="-23*cm" y=" 27*cm"/>
+           <vertex x=" 13*cm" y="-27*cm"/>
+        </shape>
+        <position x="0"  y="0" z="100"/>
+        <rotation x="0"  y="0" z="0"/>
+      </check>
+      <reflect vis="Shape2_vis"/>
+      <test  type="DD4hep_Mesh_Verifier" ref="${DD4hepExamplesINSTALL}/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt" create="CheckShape_create"/>
+    </detector>
+  </detectors>
+</lccdd>
diff --git a/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt b/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d7712f2ff954800211f618621615d8d68284f528
--- /dev/null
+++ b/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt
@@ -0,0 +1,24 @@
+ShapeCheck[0] TGeoArb8         8 Mesh-points:
+TGeoArb8         EightPointSolid N(mesh)=8  N(vert)=8  N(seg)=12  N(pols)=6
+TGeoArb8         0   Local  ( -30.00,  -25.00,  -30.00) Global ( -30.00,  -25.00,   70.00)
+TGeoArb8         1   Local  ( -25.00,   25.00,  -30.00) Global ( -25.00,   25.00,   70.00)
+TGeoArb8         2   Local  (   5.00,   25.00,  -30.00) Global (   5.00,   25.00,   70.00)
+TGeoArb8         3   Local  (  25.00,  -25.00,  -30.00) Global (  25.00,  -25.00,   70.00)
+TGeoArb8         4   Local  ( -28.00,  -23.00,   30.00) Global ( -28.00,  -23.00,  130.00)
+TGeoArb8         5   Local  ( -23.00,   27.00,   30.00) Global ( -23.00,   27.00,  130.00)
+TGeoArb8         6   Local  ( -23.00,   27.00,   30.00) Global ( -23.00,   27.00,  130.00)
+TGeoArb8         7   Local  (  13.00,  -27.00,   30.00) Global (  13.00,  -27.00,  130.00)
+TGeoArb8         Bounding box:  dx=  27.50 dy=  27.00 dz=  30.00 Origin: x=  -2.50 y=   0.00 z=   0.00
+
+ShapeCheck[1] TGeoScaledShape  8 Mesh-points:
+TGeoScaledShape  Shape_Trapezoid_vol_0_shape_refl N(mesh)=8  N(vert)=8  N(seg)=12  N(pols)=6
+TGeoScaledShape  0   Local  ( -30.00,  -25.00,   30.00) Global ( -30.00,  -25.00,  -70.00)
+TGeoScaledShape  1   Local  ( -25.00,   25.00,   30.00) Global ( -25.00,   25.00,  -70.00)
+TGeoScaledShape  2   Local  (   5.00,   25.00,   30.00) Global (   5.00,   25.00,  -70.00)
+TGeoScaledShape  3   Local  (  25.00,  -25.00,   30.00) Global (  25.00,  -25.00,  -70.00)
+TGeoScaledShape  4   Local  ( -28.00,  -23.00,  -30.00) Global ( -28.00,  -23.00, -130.00)
+TGeoScaledShape  5   Local  ( -23.00,   27.00,  -30.00) Global ( -23.00,   27.00, -130.00)
+TGeoScaledShape  6   Local  ( -23.00,   27.00,  -30.00) Global ( -23.00,   27.00, -130.00)
+TGeoScaledShape  7   Local  (  13.00,  -27.00,  -30.00) Global (  13.00,  -27.00, -130.00)
+TGeoScaledShape  Bounding box:  dx=  27.50 dy=  27.00 dz=  30.00 Origin: x=  -2.50 y=   0.00 z=  -0.00
+
diff --git a/examples/ClientTests/scripts/Check_shape.py b/examples/ClientTests/scripts/Check_shape.py
new file mode 100644
index 0000000000000000000000000000000000000000..0672f99fc72c8674fa4ee71d0966ca2bf3b2fb73
--- /dev/null
+++ b/examples/ClientTests/scripts/Check_shape.py
@@ -0,0 +1,43 @@
+from __future__ import absolute_import, unicode_literals
+import os, sys, DDG4
+#
+"""
+   dd4hep example setup using the python configuration
+
+   \author  M.Frank
+   \version 1.0
+
+"""
+
+
+def run():
+  kernel = DDG4.Kernel()
+  install_dir = os.environ['DD4hepExamplesINSTALL']
+  # Configure UI
+  geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction')
+  geant4.setupCshUI(vis=True)
+  if len(sys.argv) >= 2 and sys.argv[1] == "batch":
+    kernel.UI = ''
+  elif len(sys.argv) >= 3 and (sys.argv[1] == "batch" or sys.argv[2] == "batch"):
+    kernel.UI = ''
+  elif len(sys.argv) == 2 and sys.argv[1] != "batch":
+    kernel.loadGeometry(sys.argv[1])
+  elif len(sys.argv) == 3 and sys.argv[1] != "batch":
+    kernel.loadGeometry(sys.argv[2])
+  elif len(sys.argv) == 3 and sys.argv[2] != "batch":
+    kernel.loadGeometry(sys.argv[1])
+  #
+  # Configure field
+  geant4.setupTrackingField(prt=True)
+  # Now build the physics list:
+  phys = kernel.physicsList()
+  phys.extends = 'QGSP_BERT'
+  phys.enableUI()
+  phys.dump()
+
+  DDG4.setPrintLevel(DDG4.OutputLevel.DEBUG)
+  geant4.execute()
+
+
+if __name__ == "__main__":
+  run()
diff --git a/examples/ClientTests/scripts/Check_shape_vis.mac b/examples/ClientTests/scripts/Check_shape_vis.mac
new file mode 100644
index 0000000000000000000000000000000000000000..484297ba4fa8cbd13ea280bfd4e5dbd7a779d50c
--- /dev/null
+++ b/examples/ClientTests/scripts/Check_shape_vis.mac
@@ -0,0 +1,9 @@
+/control/verbose 2
+/run/initialize
+/vis/open OGL
+/vis/verbose errors
+/vis/drawVolume
+/vis/viewer/set/viewpointThetaPhi 55. 45.
+/vis/scene/add/axes 0 0 0 1 m
+/vis/viewer/refresh
+