diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c650eaaf0cdda579bcf4bd1c1a719eb016f1d9f7..3ecac4dc62a72e66c0465bf3314be719bdfa30e4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -118,8 +118,10 @@ dump_geometry:
     ## disable fibers in SciFi endcap ECAL for better performance
     ## not needed, as we have no fibers in the current setup
     #- sed -i '/<fiber/,+4d' ${DETECTOR_PATH}/compact/ci_ecal_scfi.xml
-    ## subsystem views
+    ## finally: remove tracking subassemblies as they lower the display priority
+    ##          of some tracking detectors
     - |
+      sed -i -e '/<detectors>/,/<\/detectors>/d' ${DETECTOR_PATH}/compact/tracking_config*.xml
       mv ${DETECTOR_PATH}/compact/display_geoviewer.xml ${DETECTOR_PATH}/compact/display.xml
       mv ${DETECTOR_PATH}/compact/colors_geoviewer.xml ${DETECTOR_PATH}/compact/colors.xml
       for xml in ${DETECTOR_PATH}/compact/subsystem_views/*.xml; do
@@ -196,6 +198,8 @@ overlap_check_tgeo:
   needs: 
     - ["common:detector"]
   script:
+    ## disable fibers in ECAL for normal overlap check
+    - sed -i '/<fiber/,+6d' ${DETECTOR_PATH}/compact/ecal_barrel_interlayers.xml
     - checkOverlaps -c ${DETECTOR_PATH}/athena.xml  | tee doc/overlap_check_tgeo.out 
     - echo "$(cat doc/overlap_check_tgeo.out | grep ovlp | wc -l) overlaps..."
     - if [[ "$(cat doc/overlap_check_tgeo.out | grep ovlp | wc -l)" -gt "0" ]] ; then echo "Overlaps exist!" && false ; fi
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6f12b924f5e359549ad5ac730aa25f40ee8c0880..219d944a012a3f75a9963864de2fbde1d735ecb1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,6 +34,7 @@ dd4hep_add_plugin(${a_lib_name} SOURCES
   src/CylinderTrackerBarrel_geo.cpp
   src/DIRC_geo.cpp
   src/DRich_geo.cpp
+  src/ERich_geo.cpp
   src/FieldMapBrBz.cpp
   src/GaseousRICH_geo.cpp
   src/GeometryHelpers.cpp
diff --git a/compact/central_tracker_hybrid_v2.xml b/compact/central_tracker_hybrid_v2.xml
index 76e2f935b0926171ac1f9c5c18c39c20eccdc9ae..2530df0a74f2d5ec178d5bb7579e75006c62f5bc 100644
--- a/compact/central_tracker_hybrid_v2.xml
+++ b/compact/central_tracker_hybrid_v2.xml
@@ -2,15 +2,25 @@
 <lccdd>
   <comment>
     Master tracker parameters
+
+      Central Tracking region consists of:
+      |----------------------------------------------------------------------------|
+      |         |                       OuterBarrel                      |         |
+      |         |--------------------------------------------------------|         |
+      |         |         |            MedialBarrel            |         |         |
+      |         |         |------------------------------------|         |         |
+      |         |         |         |  InnerBarrel   |         |         |         |
+      |         |         |         |----------------|         |         |         |
+      |  Outer  | Medial  |  Inner  | Vertex Tracker |  Inner  | Medial  |  Outer  |
+      | EndcapN | EndcapN | EndcapN | Vertex Tracker | EndcapP | EndcapP | EndcapP |
+      |----------------------------------------------------------------------------|
+      ^                                                                            ^
+      CentralTrackingRegionN_zmax                          CentralTrackingRegionP_zmax
+
   </comment>
   <define>
     <comment> Main diagonal direction for barrel/endcap transitions </comment>
-    <constant name="TrackerMainDiagonal_tantheta"           value="Eta1_1_tantheta"/>
-
-    <comment> Outer tracker endcap radial limits (somewhat adjusted in the parametrization).</comment>
-    <constant name="TrackerEndcapP_tanthetamax"             value="Eta3_8_tantheta"/>
-    <constant name="TrackerEndcapN_tanthetamax"             value="Eta4_0_tantheta"/>
-    <constant name="TrackerForward_tanthetamax"             value="Eta3_5_tantheta"/>
+    <constant name="TrackerMainDiagonal_tan"                value="Eta1_1_tan"/>
 
     <comment> Inner tracker setup </comment>
     <constant name="InnerTrackerBarrel_rmin"                value="13.38*cm"/>
@@ -137,11 +147,11 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="InnerTrackerBarrelCone_z"            value="(InnerTrackerBarrelCone_zmax + InnerTrackerBarrelCone_zmin)/2" />
     <constant name="InnerTrackerBarrelCone_thickness"    value="SiTrackerSupportConeCF_thickness + SiTrackerServiceConeAl_thickness" />
     <comment> Shorten Module (with non-zero thickness!) to avoid overlaps with support cone</comment>
-    <constant name="InnerTrackerBarrelMod1_length"       value="2 * InnerTrackerBarrelMod1_rmin / TrackerMainDiagonal_tantheta - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" /> 
-    <constant name="InnerTrackerBarrelMod2_length"       value="2 * InnerTrackerBarrelMod2_rmin / TrackerMainDiagonal_tantheta - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" /> 
-    <constant name="InnerTrackerBarrelServiceCone_rmin1" value="InnerTrackerBarrelCone_zmin * TrackerMainDiagonal_tantheta" />
+    <constant name="InnerTrackerBarrelMod1_length"       value="2 * InnerTrackerBarrelMod1_rmin / TrackerMainDiagonal_tan - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" /> 
+    <constant name="InnerTrackerBarrelMod2_length"       value="2 * InnerTrackerBarrelMod2_rmin / TrackerMainDiagonal_tan - 0.5*cm - 2. * InnerTrackerBarrelCone_thickness" /> 
+    <constant name="InnerTrackerBarrelServiceCone_rmin1" value="InnerTrackerBarrelCone_zmin * TrackerMainDiagonal_tan" />
     <constant name="InnerTrackerBarrelServiceCone_rmax1" value="InnerTrackerBarrelServiceCone_rmin1 + SiTrackerServiceConeAl_thickness" />
-    <constant name="InnerTrackerBarrelServiceCone_rmin2" value="InnerTrackerBarrelCone_zmax * TrackerMainDiagonal_tantheta" />
+    <constant name="InnerTrackerBarrelServiceCone_rmin2" value="InnerTrackerBarrelCone_zmax * TrackerMainDiagonal_tan" />
     <constant name="InnerTrackerBarrelServiceCone_rmax2" value="InnerTrackerBarrelServiceCone_rmin2 + SiTrackerServiceConeAl_thickness" />
     <constant name="InnerTrackerBarrelSupportCone_rmin1" value="InnerTrackerBarrelServiceCone_rmax1" />
     <constant name="InnerTrackerBarrelSupportCone_rmax1" value="InnerTrackerBarrelSupportCone_rmin1 + SiTrackerSupportConeCF_thickness" />
@@ -274,14 +284,14 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <comment> Inner Si endcap setup </comment>
     <constant name="InnerTrackerEndcapMod1_zmin"  value="InnerTrackerEndcap_zmin" />
     <constant name="InnerTrackerEndcapMod1_rmin"  value="InnerTrackerEndcap_rmin" />
-    <constant name="InnerTrackerEndcapMod1_rmax"  value="min(InnerTrackerEndcapMod1_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
+    <constant name="InnerTrackerEndcapMod1_rmax"  value="min(InnerTrackerEndcapMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
     <constant name="InnerTrackerEndcapMod1_x1"    value="2 * InnerTrackerEndcapMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod1_x2"    value="2 * InnerTrackerEndcapMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod1_y"     value="InnerTrackerEndcapMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - InnerTrackerEndcapMod1_rmin" />
 
     <constant name="InnerTrackerEndcapMod2_zmin"  value="InnerTrackerEndcapMod1_zmin + 1 * InnerTrackerEndcap_offset" />
     <constant name="InnerTrackerEndcapMod2_rmin"  value="InnerTrackerEndcap_rmin" />
-    <constant name="InnerTrackerEndcapMod2_rmax"  value="min(InnerTrackerEndcapMod2_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
+    <constant name="InnerTrackerEndcapMod2_rmax"  value="min(InnerTrackerEndcapMod2_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
     <constant name="InnerTrackerEndcapMod2_x1"    value="2 * InnerTrackerEndcapMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod2_x2"    value="2 * InnerTrackerEndcapMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="InnerTrackerEndcapMod2_y"     value="InnerTrackerEndcapMod2_rmax * cos(SiTrackerEndcapMod_angle/2) - InnerTrackerEndcapMod2_rmin" />
@@ -294,11 +304,11 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="InnerTrackerEndcapLayer2_zmin"        value="InnerTrackerEndcapMod2_zmin - SiTrackerEndcapLayer_thickness/2" />
 
     <constant name="InnerTrackerEndcapCone_zmin"          value="InnerTrackerBarrelCone_zmax" />
-    <constant name="InnerTrackerEndcapServiceCone_rmin1"  value="InnerTrackerEndcapCone_zmin * TrackerMainDiagonal_tantheta" />
+    <constant name="InnerTrackerEndcapServiceCone_rmin1"  value="InnerTrackerEndcapCone_zmin * TrackerMainDiagonal_tan" />
     <constant name="InnerTrackerEndcapServiceCone_rmax1"  value="InnerTrackerEndcapServiceCone_rmin1 + SiTrackerServiceConeAl_thickness" />
     <constant name="InnerTrackerEndcapServiceCone_rmin2"  value="SiTrackerServiceCyl_rmin" />
     <constant name="InnerTrackerEndcapServiceCone_rmax2"  value="SiTrackerServiceCyl_rmax" />
-    <constant name="InnerTrackerEndcapCone_zmax"          value="InnerTrackerEndcapServiceCone_rmin2 / TrackerMainDiagonal_tantheta" />
+    <constant name="InnerTrackerEndcapCone_zmax"          value="InnerTrackerEndcapServiceCone_rmin2 / TrackerMainDiagonal_tan" />
     <constant name="InnerTrackerEndcapCone_z"             value="(InnerTrackerEndcapCone_zmax + InnerTrackerEndcapCone_zmin)/2" />
     <constant name="InnerTrackerEndcapCone_length"        value="InnerTrackerEndcapCone_zmax - InnerTrackerEndcapCone_zmin" />
     <constant name="InnerTrackerEndcapSupportCone_rmin1"  value="InnerTrackerEndcapServiceCone_rmax1" />
@@ -307,7 +317,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="InnerTrackerEndcapSupportCone_rmax2"  value="SiTrackerSupportCyl_rmax" />
 
     <comment> The tracker endcap ends at the same place as the medial tracker barrel that sits around it </comment>
-    <constant name="InnerTrackerEndcap_zmax"              value="MedialTrackerBarrel_rmin / TrackerMainDiagonal_tantheta" />
+    <constant name="InnerTrackerEndcap_zmax"              value="MedialTrackerBarrel_rmin / TrackerMainDiagonal_tan" />
     <constant name="InnerTrackerEndcapCyl_zmin"           value="InnerTrackerEndcapCone_zmax" />
     <constant name="InnerTrackerEndcapCyl_zmax"           value="InnerTrackerEndcap_zmax" />
     <constant name="InnerTrackerEndcapCyl_z"              value="(InnerTrackerEndcapCyl_zmin + InnerTrackerEndcapCyl_zmax)/2" />
@@ -569,7 +579,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <comment> Medial Si endcap setup </comment>
     <constant name="MedialTrackerEndcapPMod1_zmin"  value="MedialTrackerEndcap_zmin" />
     <constant name="MedialTrackerEndcapPMod1_rmin"  value="MedialTrackerEndcapP_rmin" />
-    <constant name="MedialTrackerEndcapPMod1_rmax"  value="min(MedialTrackerEndcapPMod1_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
+    <constant name="MedialTrackerEndcapPMod1_rmax"  value="min(MedialTrackerEndcapPMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
     <constant name="MedialTrackerEndcapPMod1_x1"    value="2 * MedialTrackerEndcapPMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapPMod1_x2"    value="2 * MedialTrackerEndcapPMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapPMod1_y"     value="MedialTrackerEndcapPMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - MedialTrackerEndcapPMod1_rmin" />
@@ -580,7 +590,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
 
     <constant name="MedialTrackerEndcapNMod1_zmin"  value="MedialTrackerEndcap_zmin" />
     <constant name="MedialTrackerEndcapNMod1_rmin"  value="MedialTrackerEndcapN_rmin" />
-    <constant name="MedialTrackerEndcapNMod1_rmax"  value="min(MedialTrackerEndcapNMod1_zmin * TrackerMainDiagonal_tantheta * 0.995, SiTrackerCyl_rmin)" />
+    <constant name="MedialTrackerEndcapNMod1_rmax"  value="min(MedialTrackerEndcapNMod1_zmin * TrackerMainDiagonal_tan * 0.995, SiTrackerCyl_rmin)" />
     <constant name="MedialTrackerEndcapNMod1_x1"    value="2 * MedialTrackerEndcapNMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapNMod1_x2"    value="2 * MedialTrackerEndcapNMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="MedialTrackerEndcapNMod1_y"     value="MedialTrackerEndcapNMod1_rmax * cos(SiTrackerEndcapMod_angle/2) - MedialTrackerEndcapNMod1_rmin" />
@@ -590,7 +600,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="MedialTrackerEndcapNLayer1_zmin"  value="MedialTrackerEndcapNMod1_zmin - SiTrackerEndcapLayer_thickness/2" />
 
     <comment> The tracker endcap ends at the same place as the outer tracker barrel that sits around it </comment>
-    <constant name="MedialTrackerEndcap_zmax"              value="OuterTrackerBarrel_rmin / TrackerMainDiagonal_tantheta" />
+    <constant name="MedialTrackerEndcap_zmax"              value="OuterTrackerBarrel_rmin / TrackerMainDiagonal_tan" />
     <constant name="MedialTrackerEndcapCyl_zmin"           value="InnerTrackerEndcap_zmax" />
     <constant name="MedialTrackerEndcapCyl_zmax"           value="MedialTrackerEndcap_zmax" />
     <constant name="MedialTrackerEndcapCyl_z"              value="(MedialTrackerEndcapCyl_zmin + MedialTrackerEndcapCyl_zmax)/2" />
@@ -766,7 +776,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
   <define>
     <comment> Positive disks </comment>
     <constant name="OuterTrackerEndcapPMod1_zmin" value="OuterTrackerEndcapP_zmin" />
-    <constant name="OuterTrackerEndcapPMod1_rmin" value="OuterTrackerEndcapPMod1_zmin * TrackerEndcapP_tanthetamax * 1.07" />
+    <constant name="OuterTrackerEndcapPMod1_rmin" value="OuterTrackerEndcapPMod1_zmin * CentralTrackingRegionP_tan * 0.99" />
     <constant name="OuterTrackerEndcapPMod1_rmax"  value="SiTrackerCyl_rmin" />
     <constant name="OuterTrackerEndcapPMod1_x1"    value="2 * OuterTrackerEndcapPMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod1_x2"    value="2 * OuterTrackerEndcapPMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
@@ -776,7 +786,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapPLayer1_zmin"  value="OuterTrackerEndcapPMod1_zmin - SiTrackerEndcapLayer_thickness/2" />
 
     <constant name="OuterTrackerEndcapPMod2_zmin" value="OuterTrackerEndcapP_zmin + 1 * OuterTrackerEndcapP_offset" />
-    <constant name="OuterTrackerEndcapPMod2_rmin" value="OuterTrackerEndcapPMod2_zmin * TrackerEndcapP_tanthetamax * 1.08" />
+    <constant name="OuterTrackerEndcapPMod2_rmin" value="OuterTrackerEndcapPMod2_zmin * CentralTrackingRegionP_tan * 0.99" />
     <constant name="OuterTrackerEndcapPMod2_rmax"  value="SiTrackerCyl_rmin" />
     <constant name="OuterTrackerEndcapPMod2_x1"    value="2 * OuterTrackerEndcapPMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod2_x2"    value="2 * OuterTrackerEndcapPMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
@@ -786,7 +796,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapPLayer2_zmin"  value="OuterTrackerEndcapPMod2_zmin - SiTrackerEndcapLayer_thickness/2" />
 
     <constant name="OuterTrackerEndcapPMod3_zmin" value="OuterTrackerEndcapP_zmin + 2 * OuterTrackerEndcapP_offset" />
-    <constant name="OuterTrackerEndcapPMod3_rmin" value="OuterTrackerEndcapPMod3_zmin * TrackerEndcapP_tanthetamax * 1.09" />
+    <constant name="OuterTrackerEndcapPMod3_rmin" value="OuterTrackerEndcapPMod3_zmin * CentralTrackingRegionP_tan * 1.00" />
     <constant name="OuterTrackerEndcapPMod3_rmax"  value="SiTrackerCyl_rmin" />
     <constant name="OuterTrackerEndcapPMod3_x1"    value="2 * OuterTrackerEndcapPMod3_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapPMod3_x2"    value="2 * OuterTrackerEndcapPMod3_rmax * sin(SiTrackerEndcapMod_angle/2)" />
@@ -804,7 +814,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
 
     <comment> Negative disks </comment>
     <constant name="OuterTrackerEndcapNMod1_zmin" value="OuterTrackerEndcapN_zmin" />
-    <constant name="OuterTrackerEndcapNMod1_rmin" value="OuterTrackerEndcapNMod1_zmin * TrackerEndcapN_tanthetamax * 0.99" />
+    <constant name="OuterTrackerEndcapNMod1_rmin" value="OuterTrackerEndcapNMod1_zmin * CentralTrackingRegionN_tan * 1.00" />
     <constant name="OuterTrackerEndcapNMod1_rmax"  value="SiTrackerCyl_rmin" />
     <constant name="OuterTrackerEndcapNMod1_x1"    value="2 * OuterTrackerEndcapNMod1_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapNMod1_x2"    value="2 * OuterTrackerEndcapNMod1_rmax * sin(SiTrackerEndcapMod_angle/2)" />
@@ -814,7 +824,7 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="OuterTrackerEndcapNLayer1_zmin"  value="OuterTrackerEndcapNMod1_zmin - SiTrackerEndcapLayer_thickness/2" />
 
     <constant name="OuterTrackerEndcapNMod2_zmin" value="OuterTrackerEndcapN_zmin + 1 * OuterTrackerEndcapN_offset" />
-    <constant name="OuterTrackerEndcapNMod2_rmin" value="OuterTrackerEndcapNMod2_zmin * TrackerEndcapN_tanthetamax * 0.98" />
+    <constant name="OuterTrackerEndcapNMod2_rmin" value="OuterTrackerEndcapNMod2_zmin * CentralTrackingRegionN_tan * 1.00" />
     <constant name="OuterTrackerEndcapNMod2_rmax"  value="SiTrackerCyl_rmin" />
     <constant name="OuterTrackerEndcapNMod2_x1"    value="2 * OuterTrackerEndcapNMod2_rmin * sin(SiTrackerEndcapMod_angle/2)" />
     <constant name="OuterTrackerEndcapNMod2_x2"    value="2 * OuterTrackerEndcapNMod2_rmax * sin(SiTrackerEndcapMod_angle/2)" />
@@ -1022,14 +1032,14 @@ total X0 0.24% per disk layer (4 sectors per disk):
     <constant name="GEMEndcapPMod3_zmin"            value="GEMEndcapPDisk3_zmin" />
     <constant name="GEMEndcapPLayer3_zmin"          value="GEMEndcapPMod3_zmin - GEMEndcapLayer_thickness/2" />
 
-    <constant name="GEMEndcapLargeModBotFrame_rmin"  value="GEMEndcapPMod3_zmin * TrackerForward_tanthetamax" />
+    <constant name="GEMEndcapLargeModBotFrame_rmin"  value="GEMEndcapPMod3_zmin * ForwardTrackingRegion_tan" />
     <constant name="GEMEndcapLargeModBotFrame_y"     value="GEMFrameBotEdge_width" />
     <constant name="GEMEndcapLargeModBotFrame_rmax"  value="(GEMEndcapLargeModBotFrame_rmin + GEMEndcapLargeModBotFrame_y)/cos(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapLargeModBotFrame_x1"    value="2 * GEMEndcapLargeModBotFrame_rmin * sin(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapLargeModBotFrame_x2"    value="2 * GEMEndcapLargeModBotFrame_rmax * sin(GEMEndcapMod_angle/2)" />
-    <constant name="GEMEndcapLargeMod_rmin"          value="GEMEndcapPMod3_zmin * TrackerForward_tanthetamax + GEMFrameBotEdge_width" />
+    <constant name="GEMEndcapLargeMod_rmin"          value="GEMEndcapPMod3_zmin * ForwardTrackingRegion_tan + GEMFrameBotEdge_width" />
     <comment> Ensure there's always the length of the service gap in space available above the large GEM (top frame can extend into this at the corners). </comment>
-    <constant name="GEMEndcapLargeMod_rmax"          value="min(GEMEndcapPMod3_zmin * TrackerMainDiagonal_tantheta, Solenoid_rmax-ForwardServiceGap_length)" />
+    <constant name="GEMEndcapLargeMod_rmax"          value="min(GEMEndcapPMod3_zmin * TrackerMainDiagonal_tan, Solenoid_rmax-ForwardServiceGap_length)" />
     <constant name="GEMEndcapLargeMod_x1"            value="2 * GEMEndcapLargeMod_rmin * sin(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapLargeMod_x2"            value="2 * GEMEndcapLargeMod_rmax * sin(GEMEndcapMod_angle/2)" />
     <constant name="GEMEndcapLargeMod_y"             value="GEMEndcapLargeMod_rmax * cos(GEMEndcapMod_angle/2) - GEMEndcapLargeMod_rmin" />
diff --git a/compact/definitions.xml b/compact/definitions.xml
index 63d43c68b3b40c0ad2953be927f1f94ff87cdc03..126272780c6509a686ac3eff8c9a84ea0f470861 100644
--- a/compact/definitions.xml
+++ b/compact/definitions.xml
@@ -301,11 +301,15 @@ Examples:
     <documentation>
       ## Rapidity constants
     </documentation>
-    <constant name="Eta1_1_tantheta"       value="tan(2*atan(exp(-1.1)))" />
-    <constant name="Eta1_4_tantheta"       value="tan(2*atan(exp(-1.4)))" />
-    <constant name="Eta3_5_tantheta"       value="tan(2*atan(exp(-3.5)))" />
-    <constant name="Eta3_8_tantheta"       value="tan(2*atan(exp(-3.8)))" />
-    <constant name="Eta4_0_tantheta"       value="tan(2*atan(exp(-4.0)))" />
+    <constant name="Eta1_1_tan"       value="tan(2*atan(exp(-1.1)))" />
+    <constant name="Eta1_4_tan"       value="tan(2*atan(exp(-1.4)))" />
+    <constant name="Eta3_5_tan"       value="tan(2*atan(exp(-3.5)))" />
+    <constant name="Eta3_6_tan"       value="tan(2*atan(exp(-3.6)))" />
+    <constant name="Eta3_7_tan"       value="tan(2*atan(exp(-3.7)))" />
+    <constant name="Eta3_8_tan"       value="tan(2*atan(exp(-3.8)))" />
+    <constant name="Eta3_9_tan"       value="tan(2*atan(exp(-3.9)))" />
+    <constant name="Eta4_0_tan"       value="tan(2*atan(exp(-4.0)))" />
+    <constant name="Eta4_1_tan"       value="tan(2*atan(exp(-4.1)))" />
 
     <comment>Solenoid option</comment>
 
@@ -351,16 +355,23 @@ Examples:
     <constant name="VertexTrackingRegion_length"  value="VertexTrackingRegionP_zmax + VertexTrackingRegionN_zmax" />
 
     <documentation>
-      ### Central Tracker Region
+      ### Central Tracking Region
       TrackerBarrel_rmax: also the rmin for the barrel PID system (DIRC)
       Note: The barrel rmax and endcap lengths are the maximum extent allowed for
       the barrel and endcap layers, not the position of the final layer.
+
+
     </documentation>
 
     <constant name="CentralTrackingRegion_rmax"   value="950.0*mm" />
     <constant name="CentralTrackingRegionP_zmax"  value="1900.0*mm" />
-    <constant name="CentralTrackingRegionN_zmax"  value="1370.0*mm" />
+    <constant name="CentralTrackingRegionN_zmax"  value="1500.0*mm" />
     <constant name="CentralTrackingRegion_length" value="CentralTrackingRegionP_zmax + CentralTrackingRegionN_zmax" />
+    <comment>
+      tan(theta) to determine rmin in the outer tracking region (due to tapered beampipe)
+    </comment>
+    <constant name="CentralTrackingRegionP_tan"   value="Eta3_7_tan * 1.00" />
+    <constant name="CentralTrackingRegionN_tan"   value="Eta4_0_tan * 0.99" />
 
     <documentation level="0">
 ### PID Detector Region Parameters
@@ -368,11 +379,13 @@ Examples:
 
     <constant name="ForwardPIDRegion_zmin"        value="CentralTrackingRegionP_zmax" />
     <constant name="ForwardPIDRegion_length"      value="140.0*cm" />
-    <constant name="ForwardPIDRegion_rmin1"       value="Beampipe_rmax + 90*mm" />
-    <constant name="ForwardPIDRegion_rmin2"       value="18.0*cm" />
+    <comment> tangent of the opening angle at the front and back of the RICH </comment>
+    <constant name="ForwardPIDRegion_tan1"        value="CentralTrackingRegionP_tan * 1.00" />
+    <constant name="ForwardPIDRegion_tan2"        value="Eta3_6_tan * 1.01" />
 
     <constant name="BackwardPIDRegion_zmin"       value="CentralTrackingRegionN_zmax" />
-    <constant name="BackwardPIDRegion_length"     value="40.0*cm" />
+    <constant name="BackwardPIDRegion_tan"        value="CentralTrackingRegionN_tan" />
+    <constant name="BackwardPIDRegion_length"     value="60.0*cm" />
     <constant name="BackwardPIDRegion_rmax"       value="CentralTrackingRegion_rmax" />
 
     <comment> Note: PID has space for DIRC, ExtraSpace sits past the PID</comment>
@@ -383,10 +396,12 @@ Examples:
     ## Forward/backward tracking region behind the PID detectors
     </documentation>
 
-    <constant name="BackwardTrackingRegion_zmin"         value="BackwardPIDRegion_zmin + BackwardPIDRegion_length" />
-    <constant name="ForwardTrackingRegion_zmin"          value="ForwardPIDRegion_zmin + ForwardPIDRegion_length" />
-    <constant name="ForwardTrackingRegion_length"        value="10.0*cm" />
-    <constant name="BackwardTrackingRegion_length"       value="8.0*cm" />
+    <constant name="BackwardTrackingRegion_tan"     value="CentralTrackingRegionN_tan" />
+    <constant name="BackwardTrackingRegion_zmin"    value="BackwardPIDRegion_zmin + BackwardPIDRegion_length" />
+    <constant name="ForwardTrackingRegion_tan"      value="ForwardPIDRegion_tan2" />
+    <constant name="ForwardTrackingRegion_zmin"     value="ForwardPIDRegion_zmin + ForwardPIDRegion_length" />
+    <constant name="ForwardTrackingRegion_length"   value="10.0*cm" />
+    <constant name="BackwardTrackingRegion_length"  value="0.0*cm" />
 
     <comment> Total length of the endcap detectors in front of the calorimeter</comment>
     <constant name="BackwardInnerEndcapRegion_length"    value="BackwardPIDRegion_length + BackwardTrackingRegion_length"/>
diff --git a/compact/display.xml b/compact/display.xml
index 01a2d888813324a12b3a71aa1060c685f3c76de1..3175dd744031017204565150ad3ffd288042cadb 100644
--- a/compact/display.xml
+++ b/compact/display.xml
@@ -20,7 +20,8 @@
     <vis name="TrackerGEMModuleVis"  ref="TrackerMPGDVis"  visible="true"  showDaughters="false" />
     <vis name="TrackerMMGASLayerVis" ref="TrackerMPGDVis"  visible="true"  showDaughters="false" />
 
-    <vis name="VertexSupportVis" ref="AnlBlue"         showDaughters="false" />
+    <vis name="VertexSupportLayerVis" ref="AnlBlue"         visible="true"  showDaughters="false" />
+    <vis name="VertexSupportVis"      ref="VertexSupportLayerVis" visible="true"  showDaughters="true" />
     <vis name="VertexLayerVis"   ref="AnlGray"         visible="true"  showDaughters="true" />
     <vis name="VertexModuleVis"  ref="TrackerLayerVis" visible="true"  showDaughters="false" />
 
diff --git a/compact/display_geoviewer.xml b/compact/display_geoviewer.xml
index 217351bda9360f16d4f69112d2148bbb94803ee9..83f8b19b807b7a3916900a42f36e0dc294694eaf 100644
--- a/compact/display_geoviewer.xml
+++ b/compact/display_geoviewer.xml
@@ -17,21 +17,22 @@
     <vis name="TrackerModuleVis"  ref="TrackerLayerVis" visible="true"  showDaughters="true" />
     <vis name="TrackerMPGDVis"    ref="AnlRed"          visible="true"  showDaughters="true" />
     <comment> Simple visualization for Barrel MMGAS (apply to layers) and GEM endcap (apply to modules) for better performance </comment>
-    <vis name="TrackerGEMModuleVis"  ref="TrackerMPGDVis"  visible="true"  showDaughters="false" />
-    <vis name="TrackerMMGASLayerVis" ref="TrackerMPGDVis"  visible="true"  showDaughters="false" />
+    <vis name="TrackerGEMModuleVis"  ref="TrackerMPGDVis"   visible="true"  showDaughters="false" />
+    <vis name="TrackerMMGASLayerVis" ref="TrackerMPGDVis"   visible="true"  showDaughters="false" />
 
-    <vis name="VertexSupportVis" ref="AnlBlue"         visible="true"  showDaughters="true" />
-    <vis name="VertexLayerVis"   ref="AnlGray"         visible="true"  showDaughters="true" />
-    <vis name="VertexModuleVis"  ref="TrackerLayerVis" visible="true"  showDaughters="true" />
+    <vis name="VertexLayerVis"        ref="AnlGray"         visible="true"  showDaughters="false" />
+    <vis name="VertexSupportLayerVis" ref="AnlBlue"         visible="true"  showDaughters="false" />
+    <vis name="VertexSupportVis"      ref="VertexSupportLayerVis" visible="true"  showDaughters="true" />
+    <vis name="VertexModuleVis"       ref="TrackerLayerVis" visible="true"  showDaughters="true" />
 
     <vis name="TOFVis" ref="AnlTeal" showDaughters="true" visible="true"/>
 
     <comment>
       ECal Vis
     </comment>
-    <vis name="EcalBarrelLayerVis"      ref="AnlGold"/>
+    <vis name="EcalBarrelLayerVis"      ref="AnlGold"   showDaughters="false" visible="true"/>
     <vis name="EcalBarrelEnvelopeVis"   ref="AnlGold"   showDaughters="true" visible="false" />
-    <vis name="EcalBarrelStaveVis"      ref="AnlOrange" showDaughters="true" visible="false" />
+    <vis name="EcalBarrelStaveVis"      ref="AnlGold"   showDaughters="true" visible="true" />
     <vis name="EcalBarrelFiberLayerVis" ref="AnlGold"   showDaughters="false" visible="true" />
     <vis name="EcalBarrelSliceVis"      ref="AnlGray"/>
     <vis name="EcalBarrelSupportVis"    ref="AnlOrange"/>
@@ -69,7 +70,7 @@
     <vis name="RICHVis"         ref="AnlTeal"       showDaughters="true"/>
 
     <vis name="DIRCVis"         ref="AnlTeal"       showDaughters="true" visible="true"/>
-    <vis name="DIRCLayerVis"    ref="AnlTeal"       showDaughters="true" visible="true"/>
+    <vis name="DIRCLayerVis"    ref="AnlTeal"       showDaughters="false" visible="true"/>
     <vis name="DIRCModuleVis"   ref="AnlTeal"       showDaughters="true" visible="true"/>
     <vis name="DIRCSupportVis"  ref="AnlTeal"       showDaughters="true" visible="true"/>
     <vis name="DIRCFrameVis"    ref="AnlOrange"     showDaughters="true" visible="true"/>
diff --git a/compact/drich.xml b/compact/drich.xml
index f3950cba183ee9908fbad1507527e2085e81d184..61c303d86e2861005d4ee8a9cdfb2371f5d3d0b9 100644
--- a/compact/drich.xml
+++ b/compact/drich.xml
@@ -5,8 +5,8 @@
 <!-- vessel (=snout+tank) geometry -->
 <constant name="DRICH_zmin"               value="ForwardPIDRegion_zmin"/> <!-- vessel front -->
 <constant name="DRICH_Length"             value="ForwardPIDRegion_length"/>  <!-- overall vessel length (including snout) -->
-<constant name="DRICH_rmin0"              value="ForwardPIDRegion_rmin1"/>  <!-- bore radius at dRICh vessel frontplane -->
-<constant name="DRICH_rmin1"              value="ForwardPIDRegion_rmin2"/>  <!-- bore radius at dRICh vessel backplane -->
+<constant name="DRICH_rmin0"              value="ForwardPIDRegion_zmin * ForwardPIDRegion_tan1"/>  <!-- bore radius at dRICh vessel frontplane -->
+<constant name="DRICH_rmin1"              value="(ForwardPIDRegion_zmin + ForwardPIDRegion_length) * ForwardPIDRegion_tan2"/>  <!-- bore radius at dRICh vessel backplane -->
 <constant name="DRICH_wall_thickness"     value="0.5*cm"/>  <!-- thickness of radial walls -->
 <constant name="DRICH_window_thickness"   value="0.1*cm"/>  <!-- thickness of entrance and exit walls -->
 <!-- tank geometry: cylinder, holding the majority of detector components -->
diff --git a/compact/erich.xml b/compact/erich.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fb58dcb660a2f482fd6ed448dc1f1af5999f37ff
--- /dev/null
+++ b/compact/erich.xml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lccdd>
+
+<define>
+<!-- vessel geometry -->
+<constant name="ERICH_Length"             value="BackwardPIDRegion_length"/>  <!-- vessel z-length -->
+<constant name="ERICH_zmin"               value="-BackwardPIDRegion_zmin"/> <!-- vessel front -->
+<constant name="ERICH_zmax"               value="ERICH_zmin - ERICH_Length"/>  <!-- vessel back -->
+<constant name="ERICH_rmin0"              value="BackwardPIDRegion_tan * BackwardPIDRegion_zmin"/>  <!-- bore radius at vessel frontplane -->
+<constant name="ERICH_rmin1"              value="BackwardPIDRegion_tan * (BackwardPIDRegion_zmin + BackwardPIDRegion_length)"/>  <!-- bore radius at vessel backplane -->
+<constant name="ERICH_rmax"               value="BackwardPIDRegion_rmax - 2*cm"/>  <!-- vessel backplane radius -->
+<constant name="ERICH_wall_thickness"     value="0.5*cm"/>  <!-- thickness of radial walls -->
+<constant name="ERICH_window_thickness"   value="0.1*cm"/>  <!-- thickness of entrance and exit walls -->
+<!-- additional parameters -->
+<constant name="ERICH_aerogel_thickness"  value="3.0*cm"/>  <!-- aerogel thickness -->
+<constant name="ERICH_sensor_active_size" value="2*24.0*mm"/> <!-- sensor side length (effective area) -->
+<constant name="ERICH_sensor_full_size"   value="2*25.8*mm"/> <!-- sensor side length (full size, with enclosure) -->
+<constant name="ERICH_sensor_thickness"   value="1.5*mm"/> <!-- sensor thickness -->
+<constant name="ERICH_num_px"             value="2*8"/> <!-- number of pixels along one side of the sensor -->
+<!-- debugging switches -->
+<comment>
+- `ERICH_debug_optics`:  1 = all components become vacuum; test opticalphotons from IP
+                         2 = all components become vacuum, except for `gasvol`, test charged particles from IP
+                         0 = off
+</comment>
+<constant name="ERICH_debug_optics"  value="0"/>
+</define>
+
+
+<detectors>
+
+
+<!-- /detectors/detector -->
+<documentation level="10">
+### eRICH: Electron Endcap RICH (name TBD)
+</documentation>
+<detector
+  id="BackwardRICH_ID"
+  name="ERICH"
+  type="athena_ERICH"
+  readout="ERICHHits"
+  gas="C4F10_ERICH"
+  material="Aluminum"
+  vis_vessel="DRICH_vessel_vis"
+  vis_gas="DRICH_gas_vis"
+  debug_optics="ERICH_debug_optics"
+  >
+
+
+<!-- /detectors/detector/dimensions -->
+<documentation level="10">
+#### Vessel
+- dimensions:
+  - `zmin`: z-position of vessel front plane
+  - `length`: overall z-length of the full vessel
+  - `rmin0` and `rmin1`: bore radius at front plane and back plane, respectively
+  - `rmax0` and `rmax1`: outer radius of vessel, at front plane and back plane, respectively
+  - `nsectors`: number of azimuthal sectors
+  - `wall_thickness`: thickness of radial walls
+  - `window_thickness`: thickness of entrance and exit disks
+</documentation>
+<dimensions
+  zmin="ERICH_zmin"
+  zmax="ERICH_zmax"
+  length="ERICH_Length"
+  rmin0="ERICH_rmin0"
+  rmin1="ERICH_rmin1"
+  rmax0="ERICH_rmax"
+  rmax1="ERICH_rmax"
+  nsectors="6"
+  wall_thickness="ERICH_wall_thickness"
+  window_thickness="ERICH_window_thickness"
+  />
+
+
+<!-- /detectors/detector/radiator -->
+<documentation level="10">
+#### Radiator
+- radiator is defined in a wedge of azimuthal space, composed of aerogel and a
+  filter; the filter is applied to the back of the aerogel, so that it separates
+  the aerogel and gas radiators
+- dimensions:
+  - `frontplane`: front of the aerogel, w.r.t. front plane of the vessel envelope
+  - `rmin` and `rmax`: inner and outer radius
+  - `phiw`: azimuthal width of wedge
+  - `thickness`: radiator thickness, defined separately for aerogel and filter
+  - `pitch`: controls the angle of the radiator (0=vertical)
+</documentation>
+<radiator
+  frontplane="-ERICH_window_thickness"
+  rmin="ERICH_rmin0 + ERICH_wall_thickness + 0.5*cm"
+  rmax="(ERICH_rmax/ERICH_zmax)*ERICH_zmin + 8.0*cm"
+  phiw="60*degree"
+  pitch="0*degree"
+  >
+  <aerogel
+    material="Aerogel_DRICH"
+    vis="DRICH_aerogel_vis"
+    thickness="ERICH_aerogel_thickness"
+    />
+  <filter
+    material="Acrylic_DRICH"
+    vis="DRICH_filter_vis"
+    thickness="0.3*mm"
+    />
+</radiator>
+
+
+
+<!-- /detectors/detector/sensors -->
+<documentation level="10">
+#### Sensors
+</documentation>
+<sensors>
+
+
+<!-- /detectors/detector/sensors/module -->
+<documentation level="10">
+##### Sensor module
+- based on Hamamatsu S13361-3050AE-08
+  - effective area: 24.0 x 24.0 mm
+  - enclosure size: 25.8 x 25.8 mm
+  - pixel size: 3x3 mm (8x8 matrix)
+  - thickness: 1.5 mm
+- dimensions:
+  - `side`: side length of the square module
+  - `thickness`: thickness of the sensor module
+  - `gap`: provides room between the squares, to help prevent them from overlapping
+  - note: the values of `side` and `gap` will determine how many sensors there are, since the
+    sensor placement algorithm will try to place as many as it can in the specified region
+</documentation>
+<module
+  material="Silicon"
+  surface="SensorSurface_DRICH"
+  vis="DRICH_sensor_vis"
+  side="ERICH_sensor_active_size"
+  thickness="ERICH_sensor_thickness"
+  gap="0.5*(ERICH_sensor_full_size-ERICH_sensor_active_size) + 0.5*mm"
+  />
+
+
+<!-- /detectors/detector/sensors/plane -->
+<documentation level="10">
+##### Sensor plane
+- sensors will be placed on a plane
+  - plane dimensions:
+    - `frontplane`: z-position of the sensor plane active surface (e.g., photocathode), w.r.t aerogel backplane;
+      absolute value of this number is the distance between aerogel/filter boundary and sensor surface
+    - `rmin`: minimum radial position of a sensor's centroid
+    - `rmax`: maximum radial position of a sensor's centroid
+</documentation>
+<plane
+  frontplane="-40*cm"
+  rmin="ERICH_rmin1 + 2*cm"
+  rmax="ERICH_rmax  - 4*cm"
+  />
+
+
+</sensors>
+</detector>
+</detectors>
+
+<documentation level="10">
+#### Readout
+- segmentation: square matrix of pixels
+  - `grid_size_x,y`: size of each sensor, but note we must divide sensor size
+    by 1 less than the number of pixels, to account for fenceposting
+  - `offset_x,y`: specified such that the `x` and `y` indicators are unsigned
+- indicators and `cellID` bits:
+
+  | indicator | offset | length |
+  |-----------|--------|--------|
+  | eRICH ID  | 0      | 8      |
+  | sensor    | 8      | 12     |
+  | x pixel   | 20     | 16     |
+  | y pixel   | 36     | 16     |
+
+</documentation>
+<readouts>
+  <readout name="ERICHHits">
+    <segmentation
+      type="CartesianGridXY"
+      grid_size_x="ERICH_sensor_active_size/(ERICH_num_px-1)"
+      grid_size_y="ERICH_sensor_active_size/(ERICH_num_px-1)"
+      offset_x="-ERICH_sensor_active_size/2.0"
+      offset_y="-ERICH_sensor_active_size/2.0"
+      />
+    <id>system:8,module:12,x:20:16,y:16</id>
+  </readout>
+</readouts>
+
+
+</lccdd>
diff --git a/compact/optical_materials.xml b/compact/optical_materials.xml
index 31bedaefffeb78eb6885162e84794b96cc61ed23..00fe17cb860fde7ea9ad021d484aff334a9f9335 100644
--- a/compact/optical_materials.xml
+++ b/compact/optical_materials.xml
@@ -373,7 +373,7 @@
       1240*eV/210  10*mm
       1240*eV/200  0*mm
       "/>
-    <!-- BEGIN dRICh material properties
+    <!-- BEGIN dRICh and eRICh material properties
          - dumped from fun4all implementation
          - see https://github.com/cisbani/dRICh/blob/main/share/source/g4dRIChOptics.hh
          -->
@@ -402,6 +402,31 @@
       4.85156*eV  10.0*m
       6.19921*eV  10.0*m
       "/>
+    <!-- eRICh gas -->
+    <matrix name="RINDEX__C4F10_ERICH" coldim="2" values="
+      1.7712*eV   1.0013
+      1.92389*eV  1.0013
+      2.10539*eV  1.00131
+      2.3247*eV   1.00131
+      2.59502*eV  1.00132
+      2.93647*eV  1.00133
+      3.38139*eV  1.00134
+      3.98521*eV  1.00136
+      4.85156*eV  1.0014
+      6.19921*eV  1.00149
+      "/>
+    <matrix name="ABSLENGTH__C4F10_ERICH" coldim="2" values="
+      1.7712*eV   6.0*m
+      1.92389*eV  6.0*m
+      2.10539*eV  6.0*m
+      2.3247*eV   6.0*m
+      2.59502*eV  6.0*m
+      2.93647*eV  6.0*m
+      3.38139*eV  6.0*m
+      3.98521*eV  6.0*m
+      4.85156*eV  6.0*m
+      6.19921*eV  6.0*m
+      "/>
     <!-- dRICh aerogel -->
     <matrix name="RINDEX__Aerogel_DRICH" coldim="2" values="
       1.87855*eV  1.01638
@@ -713,7 +738,7 @@
       <property name="RINDEX" ref="RINDEX__Acrylic"/>
       <property name="ABSLENGTH" ref="ABSLENGTH__Acrylic"/>
     </material>
-    <!-- BEGIN dRICh material definitions -->
+    <!-- BEGIN dRICh and eRICh material definitions -->
     <material name="C2F6_DRICH">
       <D type="density" value="0.005734" unit="g/cm3"/>
       <composite n="2" ref="C"/>
@@ -721,6 +746,13 @@
       <property name="RINDEX"    ref="RINDEX__C2F6_DRICH"/>
       <property name="ABSLENGTH" ref="ABSLENGTH__C2F6_DRICH"/>
     </material>
+    <material name="C4F10_ERICH">
+      <D type="density" value="0.009935" unit="g/cm3"/>
+      <composite n="4" ref="C"/>
+      <composite n="10" ref="F"/>
+      <property name="RINDEX"    ref="RINDEX__C4F10_ERICH"/>
+      <property name="ABSLENGTH" ref="ABSLENGTH__C4F10_ERICH"/>
+    </material>
     <material name="Aerogel_DRICH">
       <D type="density" value="0.1" unit="g/cm3"/>
       <comment> n_air = [dens(Si02)-dens(aerogel)] / [dens(Si02)-dens(Air) ] </comment>
diff --git a/compact/pid_config_acadia.xml b/compact/pid_config_acadia.xml
index 48a099cdc81b120b2aed2061d2fdb5aefee1fc63..55d18ec5dba2b4c7ed515aa666dd48f9cbfb616d 100644
--- a/compact/pid_config_acadia.xml
+++ b/compact/pid_config_acadia.xml
@@ -6,4 +6,3 @@
 <include ref="drich.xml"/>
 
 </lccdd>
-
diff --git a/compact/pid_config_canyonlands.xml b/compact/pid_config_canyonlands.xml
index fb98490f6f4a1c4eb8522552be572793c48a08a5..136efd6a06c97e5dd855e9faf1afaeaa9c01ce14 100644
--- a/compact/pid_config_canyonlands.xml
+++ b/compact/pid_config_canyonlands.xml
@@ -4,5 +4,6 @@
 <!--include ref="dirc.xml"/-->
 <!--include ref="mrich.xml"/-->
 <include ref="drich.xml"/>
+<include ref="erich.xml"/>
 
 </lccdd>
diff --git a/compact/subsystem_views/drich_only.xml b/compact/subsystem_views/drich_only.xml
index 3b72487488dafc90364b39b7dd3b7d3c9b9d124a..d85dad6a539987fa9d58d79b2a39d74fa04f42d4 100644
--- a/compact/subsystem_views/drich_only.xml
+++ b/compact/subsystem_views/drich_only.xml
@@ -59,104 +59,15 @@
 
   <display>
   <include ref="compact/colors.xml" />
-  <!--include ref="compact/colors2.xml"/-->
   <include ref="compact/display.xml" />
-  <!--include ref="compact/display_detailed.xml"/-->
   </display>
 
-  <documentation level="0">
-    ## Detector Subsystems
-
-    ### IP Subsystems
-
-    The interaction point subsystems are included before the central detector subsystems.
-    This is becuase the IP subsystems, for exmaple the beampipe, will define paramters
-    which are subsquently used in the central detector construction -- e.g. the vertex tracker
-    uses the beampipe OD to help define its placement. 
-
-    The IP subsystems include the Far forward and backward regions. The list of subsystem includes:
-     - Interaction region beampipe 
-     - B0 tracker
-     - Off-momentum tracker
-     - Far forward roman pots
-     - Zero Degree Calorimeter
-     - Beam line magnets.
-     - and more...
-  </documentation>
 
   <documentation level="10">
-  ### dRICh only
+    ## dRICh only
   </documentation>
-  <include ref="compact/drich.xml" />
 
-  <fields>
-    <field name="B0PF_Magnet" type="MultipoleMagnet">
-      <position x="B0PF_XPosition" y="0" z="B0PF_CenterPosition"/>
-      <rotation x="0" y="B0PF_RotationAngle" z="0"/>
-      <shape type="Tube" rmin="0.0" rmax="B0PF_InnerRadius" dz="B0PF_Length*0.5"/>
-      <coefficient coefficient="B0PF_Bmax" skew="0.0*tesla"/>
-      <!--<coefficient coefficient="2.0*tesla/cm" skew="0.2*tesla/cm"/> -->
-    </field>
-    <field name="B0APF_Magnet" type="MultipoleMagnet">
-      <position x="B0APF_XPosition" y="0" z="B0APF_CenterPosition"/>
-      <rotation x="0" y="B0APF_RotationAngle" z="0"/>
-      <shape type="Tube" rmin="0.0" rmax="B0APF_InnerRadius" dz="B0APF_Length*0.5"/>
-      <coefficient coefficient="B0APF_Bmax" skew="0.0*tesla"/>
-      <!--<coefficient coefficient="2.0*tesla/cm" skew="0.2*tesla/cm"/> -->
-    </field>
-    <field name="Q1APF_Magnet" type="MultipoleMagnet">
-      <position x="Q1APF_XPosition" y="0" z="Q1APF_CenterPosition"/>
-      <rotation x="0" y="Q1APF_RotationAngle" z="0"/>
-      <shape type="Tube" rmin="0.0" rmax="Q1APF_InnerRadius" dz="Q1APF_Length*0.5"/>
-      <coefficient coefficient="Q1APF_Bmax" skew="0.0*tesla"/>
-      <coefficient coefficient="Q1APF_GradientMax" skew="0.0*tesla/cm"/>
-    </field>
-    <field name="Q1BPF_Magnet" type="MultipoleMagnet">
-      <position x="Q1BPF_XPosition" y="0" z="Q1BPF_CenterPosition"/>
-      <rotation x="0" y="Q1BPF_RotationAngle" z="0"/>
-      <shape type="Tube" rmin="0.0" rmax="Q1BPF_InnerRadius" dz="Q1BPF_Length*0.5"/>
-      <coefficient coefficient="Q1BPF_Bmax" skew="0.0*tesla"/>
-      <coefficient coefficient="Q1BPF_GradientMax" skew="0.0*tesla/cm"/>
-    </field>
-    <field name="Q2PF_Magnet" type="MultipoleMagnet">
-      <position x="Q2PF_XPosition" y="0" z="Q2PF_CenterPosition"/>
-      <rotation x="0" y="Q2PF_RotationAngle" z="pi/2.0"/>
-      <shape type="Tube" rmin="0.0" rmax="Q2PF_InnerRadius" dz="Q2PF_Length*0.5"/>
-      <coefficient coefficient="Q2PF_Bmax" skew="0.0*tesla"/>
-      <coefficient coefficient="Q2PF_GradientMax" skew="0.0*tesla/cm"/>
-    </field>
-    <field name="B1PF_Magnet" type="MultipoleMagnet">
-      <position x="B1PF_XPosition" y="0" z="B1PF_CenterPosition"/>
-      <rotation x="0" y="B1PF_RotationAngle" z="0"/>
-      <shape type="Tube" rmin="0.0" rmax="B1PF_InnerRadius" dz="B1PF_Length*0.5"/>
-      <coefficient coefficient="B1PF_Bmax" skew="0.0*tesla"/>
-      <coefficient coefficient="B1PF_GradientMax" skew="0.0*tesla/cm"/>
-    </field>
-    <field name="B1APF_Magnet" type="MultipoleMagnet">
-      <position x="B1APF_XPosition" y="0" z="B1APF_CenterPosition"/>
-      <rotation x="0" y="B1APF_RotationAngle" z="0"/>
-      <shape type="Tube" rmin="0.0" rmax="B1APF_InnerRadius" dz="B1APF_Length*0.5"/>
-      <coefficient coefficient="B1APF_Bmax" skew="0.0*tesla"/>
-      <coefficient coefficient="B1APF_GradientMax" skew="0.0*tesla/cm"/>
-    </field>
-    <field name="B2PF_Magnet" type="MultipoleMagnet">
-      <position x="B2PF_XPosition" y="0" z="B2PF_CenterPosition"/>
-      <rotation x="0" y="B2PF_RotationAngle" z="0"/>
-      <shape type="Tube" rmin="0.0" rmax="B2PF_InnerRadius" dz="B2PF_Length*0.5"/>
-      <coefficient coefficient="B2PF_Bmax" skew="0.0*tesla"/>
-      <coefficient coefficient="B2PF_GradientMax" skew="0.0*tesla/cm"/>
-    </field>
-  </fields>
-
-  <comment>
-      FB elements
-      -----------
-      None (TODO)
-
-      What is FB?
-  </comment>
-
-  <readouts>
-  </readouts>
+  <include ref="ip6/beampipe.xml" /> 
+  <include ref="compact/drich.xml" />
 
 </lccdd>
diff --git a/compact/subsystem_views/erich_only.xml b/compact/subsystem_views/erich_only.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b97787622871c8397dfa68e287454c023cad4ea9
--- /dev/null
+++ b/compact/subsystem_views/erich_only.xml
@@ -0,0 +1,71 @@
+<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">
+
+       <debug>
+         <type name="surface"       value="0"/>
+         <type name="material"      value="0"/>
+         <type name="readout"       value="0"/>
+         <type name="segmentation"  value="0"/>
+         <type name="limits"        value="0"/>
+         <type name="region"        value="0"/>
+         <type name="includes"      value="0"/>
+       </debug>
+
+  <documentation level="-1">
+  # Athena Detector 
+  - https://eicweb.phy.anl.gov/EIC/detectors/athena.git 
+  - https://eicweb.phy.anl.gov/EIC/detectors/ip6.git
+  </documentation>
+
+  <!-- Some information about detector  -->
+  <info name="Athena Detector" title="Athena Detector"
+        author="Athena Collaboration"
+	url="https://eicweb.phy.anl.gov/EIC/detectors/athena.git"
+	status="development"
+	version="v1 2021-03-16">
+  <comment> Athena </comment>
+  </info>
+  <define>
+  <documentation level="2">
+      ## Main Constant Definitions
+
+      The ip6 (or other ip) defines should be included first.
+      These files have only a define tags.
+  </documentation>
+    <include ref="ip6/ip6_defs.xml" /> 
+    <include ref="ip6/far_forward_fields_275.xml" />
+    <include ref="compact/definitions.xml" />
+  </define>
+
+  <includes>
+    <gdmlFile ref="compact/elements.xml"/>
+    <gdmlFile ref="compact/materials.xml"/>
+    <file     ref="compact/optical_materials.xml"/>
+  </includes>
+
+  <limits>
+    <limitset name="EICBeamlineLimits">
+      <limit name="step_length_max" particles="*" value="1.0" unit="mm" />
+      <limit name="track_length_max" particles="*" value="1.0" unit="mm" />
+      <limit name="time_max" particles="*" value="0.1" unit="ns" />
+      <limit name="ekin_min" particles="*" value="0.001" unit="MeV" />
+      <limit name="range_min" particles="*" value="0.1" unit="mm" />
+    </limitset>
+    <limitset name="cal_limits">
+      <limit name="step_length_max" particles="*" value="5.0" unit="mm"/>
+    </limitset>
+  </limits>
+
+  <display>
+  <include ref="compact/colors.xml" />
+  <include ref="compact/display.xml" />
+  </display>
+
+  <documentation level="10">
+    ## eRICH only
+  </documentation>
+  <include ref="ip6/beampipe.xml" />
+  <include ref="compact/erich.xml" />
+
+</lccdd>
diff --git a/compact/vertex_tracker_3layers.xml b/compact/vertex_tracker_3layers.xml
index 20327d9ad979d9325bb6f3c56bce8875fd1ca7f6..ceef79c338075df0a7bcb180bf86d9fd534f5ce3 100644
--- a/compact/vertex_tracker_3layers.xml
+++ b/compact/vertex_tracker_3layers.xml
@@ -32,7 +32,7 @@ Simple carbon fiber support shell.
     </documentation>
 
     <constant name="VertexBarrelEnvelope_length"    value="VertexTrackingRegion_length"/>
-    <constant name="VertexBarrelLayer_length"       value="VertexBarrelEnvelope_length - 1*mm"/>
+    <constant name="VertexBarrelLayer_length"       value="VertexBarrelMod_length + 1*um"/>
 
     <constant name="VertexBarrelLayer_thickness"    value="0.2*cm"/>
     <constant name="VertexBarrelMod_thickness"      value="0.1*cm"/>
@@ -163,7 +163,7 @@ Simple carbon fiber support shell.
         <rphi_layout phi_tilt="0.0*degree" nphi="VertexBarrelStave_count" phi0="0.0" rc="VertexBarrelMod3_rmin" dr="0.0 * mm"/>
         <z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
       </layer>
-      <layer module="SupportShell" id="VertexBarrelMod_count + 1" vis="VertexSupportVis">
+      <layer module="SupportShell" id="VertexBarrelMod_count + 1" vis="VertexSupportLayerVis">
         <barrel_envelope
           inner_r="VertexBarrelSupport_rmin"
           outer_r="VertexBarrelSupport_rmax"
diff --git a/src/ERich_geo.cpp b/src/ERich_geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e010ed19bca34de4ac4b746ecb67c5dfd307e462
--- /dev/null
+++ b/src/ERich_geo.cpp
@@ -0,0 +1,281 @@
+//----------------------------------
+//  eRICH: Electron endcap RICH
+//  Author: C. Dilks
+//----------------------------------
+
+#include <XML/Helper.h>
+#include "TMath.h"
+#include "TString.h"
+#include "GeometryHelpers.h"
+#include "Math/Point2D.h"
+#include "DDRec/Surface.h"
+#include "DDRec/DetectorData.h"
+#include "DD4hep/OpticalSurfaces.h"
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Printout.h"
+
+using namespace dd4hep;
+using namespace dd4hep::rec;
+
+// create the detector
+static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetector sens) {
+  xml::DetElement detElem = handle;
+  std::string detName = detElem.nameStr();
+  int detID = detElem.id();
+
+  DetElement det(detName, detID);
+  xml::Component dims = detElem.dimensions();
+  OpticalSurfaceManager surfMgr = desc.surfaceManager();
+
+  // attributes -----------------------------------------------------------
+  // - vessel
+  double  vesselLength     =  dims.attr<double>(_Unicode(length));
+  double  vesselZmin       =  dims.attr<double>(_Unicode(zmin));
+  double  vesselZmax       =  dims.attr<double>(_Unicode(zmax));
+  double  vesselRmin0      =  dims.attr<double>(_Unicode(rmin0));
+  double  vesselRmin1      =  dims.attr<double>(_Unicode(rmin1));
+  double  vesselRmax0      =  dims.attr<double>(_Unicode(rmax0));
+  double  vesselRmax1      =  dims.attr<double>(_Unicode(rmax1));
+  int     nSectors         =  dims.attr<int>(_Unicode(nsectors));
+  double  wallThickness    =  dims.attr<double>(_Unicode(wall_thickness));
+  double  windowThickness  =  dims.attr<double>(_Unicode(window_thickness));
+  auto    vesselMat        =  desc.material(detElem.attr<std::string>(_Unicode(material)));
+  auto    gasvolMat        =  desc.material(detElem.attr<std::string>(_Unicode(gas)));
+  auto    vesselVis        =  desc.visAttributes(detElem.attr<std::string>(_Unicode(vis_vessel)));
+  auto    gasvolVis        =  desc.visAttributes(detElem.attr<std::string>(_Unicode(vis_gas)));
+  // - radiator (applies to aerogel and filter)
+  auto    radiatorElem        =  detElem.child(_Unicode(radiator));
+  double  radiatorRmin        =  radiatorElem.attr<double>(_Unicode(rmin));
+  double  radiatorRmax        =  radiatorElem.attr<double>(_Unicode(rmax));
+  double  radiatorPhiw        =  radiatorElem.attr<double>(_Unicode(phiw));
+  double  radiatorPitch       =  radiatorElem.attr<double>(_Unicode(pitch));
+  double  radiatorFrontplane  =  radiatorElem.attr<double>(_Unicode(frontplane));
+  // - aerogel
+  auto    aerogelElem       =  radiatorElem.child(_Unicode(aerogel));
+  auto    aerogelMat        =  desc.material(aerogelElem.attr<std::string>(_Unicode(material)));
+  auto    aerogelVis        =  desc.visAttributes(aerogelElem.attr<std::string>(_Unicode(vis)));
+  double  aerogelThickness  =  aerogelElem.attr<double>(_Unicode(thickness));
+  // - filter
+  auto    filterElem       =  radiatorElem.child(_Unicode(filter));
+  auto    filterMat        =  desc.material(filterElem.attr<std::string>(_Unicode(material)));
+  auto    filterVis        =  desc.visAttributes(filterElem.attr<std::string>(_Unicode(vis)));
+  double  filterThickness  =  filterElem.attr<double>(_Unicode(thickness));
+  // - sensor module
+  auto    sensorElem       =  detElem.child(_Unicode(sensors)).child(_Unicode(module));
+  auto    sensorMat        =  desc.material(sensorElem.attr<std::string>(_Unicode(material)));
+  auto    sensorVis        =  desc.visAttributes(sensorElem.attr<std::string>(_Unicode(vis)));
+  auto    sensorSurf       =  surfMgr.opticalSurface(sensorElem.attr<std::string>(_Unicode(surface)));
+  double  sensorSide       =  sensorElem.attr<double>(_Unicode(side));
+  double  sensorGap        =  sensorElem.attr<double>(_Unicode(gap));
+  double  sensorThickness  =  sensorElem.attr<double>(_Unicode(thickness));
+  // - sensor plane
+  auto    sensorPlaneElem        =  detElem.child(_Unicode(sensors)).child(_Unicode(plane));
+  double  sensorPlaneFrontplane  =  sensorPlaneElem.attr<double>(_Unicode(frontplane));
+  double  sensorPlaneRmin        =  sensorPlaneElem.attr<double>(_Unicode(rmin));
+  double  sensorPlaneRmax        =  sensorPlaneElem.attr<double>(_Unicode(rmax));
+  // - debugging switches
+  int   debug_optics_mode  =  detElem.attr<int>(_Unicode(debug_optics));
+
+  // if debugging optics, override some settings
+  bool debug_optics = debug_optics_mode > 0;
+  if(debug_optics) {
+    printout(WARNING,"ERich_geo","DEBUGGING ERICH OPTICS");
+    switch(debug_optics_mode) {
+      case 1: vesselMat = aerogelMat = filterMat = sensorMat = gasvolMat = desc.material("VacuumOptical"); break;
+      case 2: vesselMat = aerogelMat = filterMat = sensorMat = desc.material("VacuumOptical"); break;
+      default: printout(FATAL,"ERich_geo","UNKNOWN debug_optics_mode"); return det;
+    };
+    aerogelVis = sensorVis;
+    gasvolVis = vesselVis = desc.invisible();
+  };
+
+
+  // BUILD VESSEL //////////////////////////////////////
+  /* - `vessel`: aluminum enclosure, the mother volume of the eRICh
+   * - `gasvol`: gas volume, which fills `vessel`; all other volumes defined below
+   *   are children of `gasvol`
+   */
+
+  // tank solids
+  Cone vesselTank(
+      vesselLength/2.0,
+      vesselRmin1,
+      vesselRmax1,
+      vesselRmin0,
+      vesselRmax0
+      );
+  Cone gasvolTank(
+      vesselLength/2.0 - windowThickness,
+      vesselRmin1 + wallThickness,
+      vesselRmax1 - wallThickness,
+      vesselRmin0 + wallThickness,
+      vesselRmax0 - wallThickness
+      );
+
+  //  extra solids for `debug_optics` only
+  Box vesselBox(1001,1001,1001);
+  Box gasvolBox(1000,1000,1000);
+
+  // choose vessel and gasvol solids (depending on `debug_optics_mode` (0=disabled))
+  Solid vesselSolid, gasvolSolid;
+  switch(debug_optics_mode) {
+    case 0:  vesselSolid=vesselTank;   gasvolSolid=gasvolTank;   break; // `!debug_optics`
+    case 1:  vesselSolid=vesselBox;    gasvolSolid=gasvolBox;    break;
+    case 2:  vesselSolid=vesselBox;    gasvolSolid=gasvolTank;   break;
+  };
+
+  // volumes
+  Volume vesselVol(detName, vesselSolid, vesselMat);
+  Volume gasvolVol(detName+"_gas", gasvolSolid, gasvolMat);
+  vesselVol.setVisAttributes(vesselVis);
+  gasvolVol.setVisAttributes(gasvolVis);
+
+  // reference positions
+  // - the vessel is created such that the center of the cylindrical tank volume
+  //   coincides with the origin; this is called the "origin position" of the vessel
+  // - when the vessel (and its children volumes) is placed, it is translated in
+  //   the z-direction to be in the proper ATHENA-integration location
+  // - these reference positions are for the frontplane and backplane of the vessel,
+  //   with respect to the vessel origin position
+  auto originFront = Position(0., 0.,  vesselLength/2.0 );
+  auto originBack =  Position(0., 0., -vesselLength/2.0 );
+
+
+  // sensitive detector type
+  sens.setType("photoncounter");
+
+
+  // SECTOR LOOP //////////////////////////////////
+  for(int isec=0; isec<nSectors; isec++) {
+
+    // debugging filters, limiting the number of sectors
+    //if( debug_optics && isec!=0) continue;
+
+    // sector rotation about z axis
+    double sectorRotation = isec * 360/nSectors * degree;
+    std::string secName = "sec" + std::to_string(isec);
+
+
+    // BUILD RADIATOR //////////////////////////////////////
+
+    // solid and volume: create aerogel and filter sectors
+    Tube aerogelSolid(radiatorRmin, radiatorRmax, aerogelThickness/2, -radiatorPhiw/2.0, radiatorPhiw/2.0);
+    Tube filterSolid( radiatorRmin, radiatorRmax, filterThickness/2,  -radiatorPhiw/2.0, radiatorPhiw/2.0);
+    Volume aerogelVol( detName+"_aerogel_"+secName, aerogelSolid, aerogelMat );
+    Volume filterVol(  detName+"_filter_"+secName,  filterSolid,  filterMat );
+    aerogelVol.setVisAttributes(aerogelVis);
+    filterVol.setVisAttributes(filterVis);
+
+    // aerogel placement and surface properties
+    // TODO [low-priority]: define skin properties for aerogel and filter
+    auto radiatorPos = Position(0., 0., radiatorFrontplane-0.5*aerogelThickness) + originFront;
+    auto aerogelPV = gasvolVol.placeVolume(aerogelVol,
+          RotationZ(sectorRotation) // rotate about beam axis to sector
+        * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
+        * RotationY(radiatorPitch) // change polar angle to specified pitch
+        );
+    DetElement aerogelDE(det, Form("aerogel_de%d", isec), isec);
+    aerogelDE.setPlacement(aerogelPV);
+    //SkinSurface aerogelSkin(desc, aerogelDE, Form("mirror_optical_surface%d", isec), aerogelSurf, aerogelVol);
+    //aerogelSkin.isValid();
+
+    // filter placement and surface properties
+    if(!debug_optics) {
+      auto filterPV = gasvolVol.placeVolume(filterVol,
+            RotationZ(sectorRotation) // rotate about beam axis to sector
+          * Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
+          * RotationY(radiatorPitch) // change polar angle
+          * Translation3D(0., 0., -(aerogelThickness+filterThickness)/2.) // move to aerogel backplane
+          );
+      DetElement filterDE(det, Form("filter_de%d", isec), isec);
+      filterDE.setPlacement(filterPV);
+      //SkinSurface filterSkin(desc, filterDE, Form("mirror_optical_surface%d", isec), filterSurf, filterVol);
+      //filterSkin.isValid();
+    };
+
+  }; // END SECTOR LOOP //////////////////////////
+
+
+
+  // BUILD SENSORS ///////////////////////
+
+  // solid and volume: single sensor module
+  Box sensorSolid(sensorSide/2., sensorSide/2., sensorThickness/2.);
+  Volume sensorVol(detName+"_sensor", sensorSolid, sensorMat);
+  sensorVol.setVisAttributes(sensorVis);
+
+  // sensitivity
+  if(!debug_optics) sensorVol.setSensitiveDetector(sens);
+
+  // sensor plane positioning: we want |`sensorPlaneFrontplane`| to be the distance between the
+  // aerogel backplane (i.e., aerogel/filter boundary) and the sensor active surface (e.g, photocathode)
+  double sensorZpos = radiatorFrontplane - aerogelThickness + sensorPlaneFrontplane - 0.5*sensorThickness;
+  auto sensorPlanePos = Position(0., 0., sensorZpos) + originFront; // reference position
+  // miscellaneous
+  int imod=0; // module number
+  double tBoxMax = vesselRmax1; // sensors will be tiled in tBox, within annular limits
+
+  // SENSOR MODULE LOOP ------------------------
+  /* cartesian tiling loop
+   * - start at (x=0,y=0), to center the grid
+   * - loop over positive-x positions; for each, place the corresponding negative-x sensor too
+   * - nested similar loop over y positions
+   */
+  double sx,sy;
+  for(double usx=0; usx<=tBoxMax; usx+=sensorSide+sensorGap) {
+    for(int sgnx=1; sgnx>=(usx>0?-1:1); sgnx-=2) {
+      for(double usy=0; usy<=tBoxMax; usy+=sensorSide+sensorGap) {
+        for(int sgny=1; sgny>=(usy>0?-1:1); sgny-=2) {
+
+          // sensor (x,y) center
+          sx = sgnx*usx;
+          sy = sgny*usy;
+
+          // annular cut
+          if(std::hypot(sx,sy)<sensorPlaneRmin || std::hypot(sx,sy)>sensorPlaneRmax) continue;
+
+          // placement (note: transformations are in reverse order)
+          auto sensorPV = gasvolVol.placeVolume(sensorVol,Transform3D(
+                Translation3D(sensorPlanePos.x(), sensorPlanePos.y(), sensorPlanePos.z()) // move to reference position
+              * Translation3D(sx, sy, 0.) // move to grid position
+              ));
+
+          // generate LUT for module number -> sensor position, for readout mapping tests
+          //printf("%d %f %f\n",imod,sensorPV.position().x(),sensorPV.position().y());
+
+          // properties
+          sensorPV.addPhysVolID("module", imod);
+          DetElement sensorDE(det, Form("sensor_de_%d", imod), 10000*imod); // TODO: what is this 10000?
+          sensorDE.setPlacement(sensorPV);
+          if(!debug_optics) {
+            SkinSurface sensorSkin(desc, sensorDE, "sensor_optical_surface", sensorSurf, sensorVol); // TODO: 3rd arg needs `imod`?
+            sensorSkin.isValid();
+          };
+
+          // increment sensor module number
+          imod++;
+        };
+      };
+    };
+  };
+  // END SENSOR MODULE LOOP ------------------------
+
+
+  // place gas volume
+  PlacedVolume gasvolPV = vesselVol.placeVolume(gasvolVol,Position(0, 0, 0));
+  DetElement gasvolDE(det, "gasvol_de", 0);
+  gasvolDE.setPlacement(gasvolPV);
+
+  // place mother volume (vessel)
+  Volume motherVol = desc.pickMotherVolume(det);
+  PlacedVolume vesselPV = motherVol.placeVolume(vesselVol,
+      Position(0, 0, vesselZmin) - originFront
+      );
+  vesselPV.addPhysVolID("system", detID);
+  det.setPlacement(vesselPV);
+
+  return det;
+};
+
+// clang-format off
+DECLARE_DETELEMENT(athena_ERICH, createDetector)