diff --git a/GeoModelTools/CMakeLists.txt b/GeoModelTools/CMakeLists.txt
index 4b37b9c10258c341ccbf4fffda443456d8b0db3f..3c29cb7ad5912aa19e24997da70da49269d0bd1c 100644
--- a/GeoModelTools/CMakeLists.txt
+++ b/GeoModelTools/CMakeLists.txt
@@ -48,6 +48,7 @@ endif()
 include( GNUInstallDirs )
 
 # Set up the build of the libraries of the project.
+add_subdirectory( GeoModelXML )
 add_subdirectory( GeoModelXMLParser )
 add_subdirectory( GeoModelJSONParser )
 add_subdirectory( ExpressionEvaluator )
diff --git a/GeoModelTools/GeoModelXML/CMakeLists.txt b/GeoModelTools/GeoModelXML/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c125601ae0f93a1a6b1bdb1276131b2b17718278
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/CMakeLists.txt
@@ -0,0 +1,6 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+# --- Add sub-projects ---
+add_subdirectory(GeoModelXml)
+add_subdirectory(GMXPlugin)
+
diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/CMakeLists.txt b/GeoModelTools/GeoModelXML/GMXPlugin/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b3b922ecc2c5ea7eab9f5269cc76c9364559ce73
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GMXPlugin/CMakeLists.txt
@@ -0,0 +1,44 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+# Find the header and source files.
+file( GLOB SOURCES src/*.cxx )
+
+# Create the library.
+add_library( GMXPlugin SHARED ${SOURCES} )
+target_link_libraries( GMXPlugin PUBLIC GeoModelCore::GeoModelKernel XercesC::XercesC GeoModelXml )
+target_include_directories( GMXPlugin PUBLIC 
+   $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+   $<INSTALL_INTERFACE:include> )
+source_group( "GMXPlugin" FILES ${HEADERS} )
+source_group( "src" FILES ${SOURCES} )
+set_target_properties( GMXPlugin PROPERTIES
+   VERSION ${PROJECT_VERSION}
+   SOVERSION ${PROJECT_VERSION_MAJOR} )
+
+# Set up an alias with the same name that you would get by "finding" a pre-built
+# version of the library.
+add_library( GeoModelTools::GMXPlugin ALIAS GMXPlugin )
+
+# Install the library.
+install(TARGETS GMXPlugin
+    EXPORT ${PROJECT_NAME}-export
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+            COMPONENT Runtime
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            COMPONENT          Runtime
+            NAMELINK_COMPONENT Development   # Requires CMake 3.12
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            COMPONENT Development
+            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GMXPlugin
+            COMPONENT Development
+    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+)
+
+install( FILES ${HEADERS}
+    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GMXPlugin
+   COMPONENT Development )
+
+# set ( PLUGIN_NAME  "GMXPlugin.so" )
+# ADD_CUSTOM_TARGET( GMX_plugin ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ${GMXPlugin} ${PLUGIN_NAME} )
+
+
diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/data/HelloWorld.gmx b/GeoModelTools/GeoModelXML/GMXPlugin/data/HelloWorld.gmx
new file mode 100644
index 0000000000000000000000000000000000000000..05f18b33194aafaad110a9fe61b00cd436e727b2
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GMXPlugin/data/HelloWorld.gmx
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE geomodel SYSTEM "geomodel.dtd" []>
+
+<geomodel name="Hello World" version="1.0"
+  xmlns="http://www.nikhef.nl/%7Er29/gmx">
+
+  <materials>
+    <element name="Carbon"      shortname="C"  Z="6"  A="12.011"/>
+    <material name="Diamond" density="3.515">
+      <elementref fraction="1.0" ref="Carbon"/>
+    </material>
+  </materials>
+
+  <shapes>
+    <tube name="ShapeOneMeterCylinder"    rmin="0.2"    rmax="0.5"      zhalflength="0.5"/> 
+  </shapes>
+
+  <addbranch>
+    <logvol name="DiamondCylinder" shape="ShapeOneMeterCylinder" material="Diamond"/>
+  </addbranch>
+
+</geomodel>
diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/data/StripBlobRev_5433bf5.xml b/GeoModelTools/GeoModelXML/GMXPlugin/data/StripBlobRev_5433bf5.xml
new file mode 100644
index 0000000000000000000000000000000000000000..21aade7c2125f0d4f897135ee64a32676066269c
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GMXPlugin/data/StripBlobRev_5433bf5.xml
@@ -0,0 +1,7279 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- If you want to run totally locally, use:
+<!DOCTYPE geomodel SYSTEM "/user/r29/localdisk/athena/apr/InnerDetector/InDetDetDescr/GmxLayouts/data/ITk/Strip/LTF/geomodel.dtd" [
+-->
+<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [
+<!ENTITY materials SYSTEM "Materials.gmx">
+<!ENTITY commondefines SYSTEM "CommonDefines.gmx">
+<!ENTITY itk SYSTEM "ITk.gmx">
+<!ENTITY sensordefines SYSTEM "SensorDefines.gmx">
+<!ENTITY sensors SYSTEM "Sensors.gmx">
+<!ENTITY chips SYSTEM "Chips.gmx">
+<!ENTITY dcdc SYSTEM "DCDC.gmx">
+<!ENTITY stave SYSTEM "Stave.gmx">
+<!ENTITY petalplank SYSTEM "PetalPlank.gmx">
+<!ENTITY barrelhybrids SYSTEM "BarrelHybrids.gmx">
+<!ENTITY barrel SYSTEM "Barrel.gmx">
+<!ENTITY barreldefines SYSTEM "BarrelDefines.gmx">
+<!ENTITY barrelsupports SYSTEM "BarrelSupports.gmx">
+<!ENTITY eos SYSTEM "EOS.gmx">
+<!ENTITY pp1 SYSTEM "PP1.gmx">
+<!ENTITY endcaps SYSTEM "Endcaps.gmx">
+<!ENTITY endcaphybrids SYSTEM "EndcapHybrids.gmx">
+<!ENTITY endcapdefines SYSTEM "EndcapDefines.gmx">
+<!ENTITY endcapsupports SYSTEM "EndcapSupports.gmx">
+<!ENTITY services SYSTEM "LTFStripServices.gmx">
+]>
+<geomodel xmlns="http://www.nikhef.nl/%7Er29/gmx" name="LTF Strip layout" version="1.1">
+
+<!-- 
+     Materials description file for use in gmx to build up GeoModel materials.
+     Please report errors, updates, improvements, requests for new materials to 
+     nigel.hessey@cern.ch
+
+     Densities are in g/cm3 or kg/l or ton/m3; they are converted internally into g/mm3. 
+     Fractions are by weight 
+-->
+
+  <materials> 
+
+    <!-- First 32 elements from Particle Physics Booklet 2002 or http://www.webelements.com/ -->
+    <element name="Hydrogen" shortname="H" Z="1" A="1.00794"/>
+    <element name="Deuterium" shortname="D" Z="1" A="2.0140"/>
+    <element name="Helium" shortname="He" Z="2" A="4.002602"/>
+    <element name="Lithium" shortname="Li" Z="3" A="6.941"/>
+    <element name="Berylium" shortname="Be" Z="4" A="9.012182"/>
+    <element name="Boron" shortname="B" Z="5" A="10.811"/>
+    <element name="Carbon" shortname="C" Z="6" A="12.011"/>
+    <element name="Nitrogen" shortname="N" Z="7" A="14.00674"/>
+    <element name="Oxygen" shortname="O" Z="8" A="15.9994"/>
+    <element name="Fluorine" shortname="F" Z="9" A="18.9984032"/>
+    <element name="Neon" shortname="Ne" Z="10" A="20.1797"/>
+    <element name="Sodium" shortname="Na" Z="11" A="22.98976928"/>
+    <element name="Magnesium" shortname="Mg" Z="12" A="24.3050"/>
+    <element name="Aluminium" shortname="Al" Z="13" A="26.981539"/>
+    <element name="Silicon" shortname="Si" Z="14" A="28.0855"/>
+    <element name="Phosphorous" shortname="P" Z="15" A="30.973762"/>
+    <element name="Sulphur" shortname="S" Z="16" A="32.065"/>
+    <element name="Chlorine" shortname="Cl" Z="17" A="35.453"/>
+    <element name="Argon" shortname="Ar" Z="18" A="39.948"/>
+    <element name="Potassium" shortname="K" Z="19" A="39.0983"/>
+    <element name="Calcium" shortname="Ca" Z="20" A="40.078"/>
+    <element name="Scandium" shortname="Sc" Z="21" A="44.955912"/>
+    <element name="Titanium" shortname="Ti" Z="22" A="47.867"/>
+    <element name="Vanadium" shortname="V" Z="23" A="50.9415"/>
+    <element name="Chromium" shortname="Cr" Z="24" A="51.9961"/>
+    <element name="Manganese" shortname="Mn" Z="25" A="54.938045"/>
+    <element name="Iron" shortname="Fe" Z="26" A="55.845"/>
+    <element name="Cobalt" shortname="Co" Z="27" A="58.93319"/>
+    <element name="Nickel" shortname="Ni" Z="28" A="58.6934"/>
+    <element name="Copper" shortname="Cu" Z="29" A="63.546"/>
+    <element name="Zinc" shortname="Zn" Z="30" A="65.38"/>
+    <element name="Gallium" shortname="Ga" Z="31" A="69.723"/>
+    <element name="Germanium" shortname="Ge" Z="32" A="72.61"/>
+
+    <!-- Other elements used in detectors -->
+
+    <element name="Niobium" shortname="Nb" Z="41" A="92.90638"/>
+    <element name="Molybdenum" shortname="Mo" Z="42" A="95.96"/>
+    <element name="Rhenium" shortname="Rh" Z="45" A="102.90550"/>
+    <element name="Silver" shortname="Ag" Z="47" A="107.8682"/>
+    <element name="Tin" shortname="Sn" Z="50" A="118.710"/>
+    <element name="Xenon" shortname="Xe" Z="54" A="131.29"/>
+    <element name="Cesium" shortname="Cs" Z="55" A="132.9054519"/>
+    <element name="Barium" shortname="Ba" Z="56" A="137.327"/>
+    <element name="Tungsten" shortname="W" Z="74" A="183.84"/>
+    <element name="Platinum" shortname="Pt" Z="78" A="195.08"/>
+    <element name="Gold" shortname="Au" Z="79" A="196.966569"/>
+    <element name="Lead" shortname="Pb" Z="82" A="207.2"/>
+    <element name="Uranium" shortname="U" Z="92" A="238.0289"/>
+
+    <!-- Fractions are by mass; density in g/cm3 -->
+
+    <!-- Pure Metals -->
+
+    <material name="BeMetal" density="1.848">
+      <elementref fraction="1.00000" ref="Berylium"/>
+    </material>
+    <material name="AlMetal" density="2.700">
+      <elementref fraction="1.00000" ref="Aluminium"/>
+    </material>
+    <material name="SiMetal" density="2.3290">
+      <elementref fraction="1.00000" ref="Silicon"/>
+    </material>
+    <material name="TiMetal" density="4.507">
+      <elementref fraction="1.00000" ref="Titanium"/>
+    </material>
+    <material name="VaMetal" density="6.110">
+      <elementref fraction="1.00000" ref="Vanadium"/>
+    </material>
+    <material name="FeMetal" density="7.874">
+      <elementref fraction="1.00000" ref="Iron"/>
+    </material>
+    <material name="NiMetal" density="8.900">
+      <elementref fraction="1.00000" ref="Nickel"/>
+    </material>
+    <material name="CuMetal" density="8.960">
+      <elementref fraction="1.00000" ref="Copper"/>
+    </material>
+    <material name="GeMetal" density="5.323">
+      <elementref fraction="1.00000" ref="Germanium"/>
+    </material>
+    <material name="SnMetal" density="7.310">
+      <elementref fraction="1.00000" ref="Tin"/>
+    </material>
+    <material name="AgMetal" density="10.490">
+      <elementref fraction="1.00000" ref="Silver"/>
+    </material>
+    <material name="AuMetal" density="19.300">
+      <elementref fraction="1.00000" ref="Gold"/>
+    </material>
+    <material name="WMetal" density="19.250">
+      <elementref fraction="1.00000" ref="Tungsten"/>
+    </material>
+    <material name="PtMetal" density="21.090">
+      <elementref fraction="1.00000" ref="Platinum"/>
+    </material>
+    <material name="PbMetal" density="11.340">
+      <elementref fraction="1.00000" ref="Lead"/>
+    </material>
+    <material name="UMetal" density="19.050">
+      <elementref fraction="1.00000" ref="Uranium"/>
+    </material>
+
+    <!-- Alloys -->
+
+    <material name="SS304" density="7.95">
+      <elementref fraction="0.6855" ref="Iron"/>
+      <elementref fraction="0.18" ref="Chromium"/>
+      <elementref fraction="0.08" ref="Nickel"/>
+      <elementref fraction="0.015" ref="Carbon"/>
+      <elementref fraction="0.02" ref="Manganese"/>
+      <elementref fraction="0.01" ref="Silicon"/>
+      <elementref fraction="0.002" ref="Phosphorous"/>
+      <elementref fraction="0.0015" ref="Sulphur"/>
+      <elementref fraction="0.006" ref="Molybdenum"/>
+    </material>
+    <material name="SS316" density="8.0"> <!-- E.g. Swagelok -->
+      <elementref fraction="0.65225" ref="Iron"/>
+      <elementref fraction="0.17" ref="Chromium"/>
+      <elementref fraction="0.12" ref="Nickel"/>
+      <elementref fraction="0.0008" ref="Carbon"/>
+      <elementref fraction="0.02" ref="Manganese"/>
+      <elementref fraction="0.0075" ref="Silicon"/>
+      <elementref fraction="0.00045" ref="Phosphorous"/>
+      <elementref fraction="0.003" ref="Sulphur"/>
+      <elementref fraction="0.001" ref="Nitrogen"/>
+      <elementref fraction="0.025" ref="Molybdenum"/>
+    </material>
+
+    <!-- Other pure solids -->
+
+    <material name="Graphite" density="2.267"> <!-- Wikipedia Carbon -->
+      <elementref fraction="1.0" ref="Carbon"/>
+    </material>
+    <material name="Diamond" density="3.515"> 
+      <elementref fraction="1.0" ref="Carbon"/>
+    </material>
+    <material name="CFoam" density="0.3"> 
+      <elementref fraction="1.0" ref="Carbon"/>
+    </material>
+<material name="k9Allcomp" density="0.23"> 
+      <elementref fraction="1.0" ref="Carbon"/>
+    </material>
+
+    <!-- Liquids -->
+    <chemical name="CO2">
+      <elemcontent ref="Carbon" quantity="1"/>
+      <elemcontent ref="Oxygen" quantity="2"/>
+    </chemical>
+    <material name="H_Liquid" density="0.0708"> 
+      <elementref fraction="1.0" ref="Hydrogen"/>
+    </material>
+    <material name="D_Liquid" density="0.169"> 
+      <elementref fraction="1.0" ref="Deuterium"/>
+    </material>
+    <material name="HeLiquid" density="0.1249">
+      <elementref fraction="1.0" ref="Helium"/>
+    </material>
+    <!-- CO2 density from http://encyclopedia.airliquide.com/Encyclopedia.asp?GasID=26 -20C and 20 bar -->
+    <material name="CO2Liquid" density="1.03"> 
+      <chemicalref fraction="1" ref="CO2"/>
+    </material>
+    <material name="CO2Mixed" density="0.41"> <!-- 40 % liquid by mass -->
+      <chemicalref fraction="1" ref="CO2"/>
+    </material>
+
+    <!-- Gases -->
+
+    <material name="N2atMinus20" density="1.307e-3"> <!-- g/cm3 N2 at -20 degC -->
+      <elementref fraction="1.00000" ref="Nitrogen"/>
+    </material>
+    <material name="N2" density="1.2504e-3 * 273.15/293.15 * 96265/100000"> 
+      <!-- Wiki for N2 at STP adjusted to 20 degC and CERN altitude --> 
+      <elementref fraction="1.00000" ref="Nitrogen"/>
+    </material>
+    <material name="Air" density="1.205e-3"> <!-- 78 % N2 + 21 % O2 + 1 % Ar by mass A = 2*14, 2*16, 40 -->
+      <elementref fraction="0.7541" ref="Nitrogen"/>
+      <elementref fraction="0.2321" ref="Oxygen"/>
+      <elementref fraction="0.0138" ref="Argon"/>
+    </material>
+
+    <!-- Adhesives -->
+
+    <material name="Bisphenol-A" density="1.2">
+      <elementref fraction="0.03" ref="Hydrogen"/>
+      <elementref fraction="0.75" ref="Carbon"/>
+      <elementref fraction="0.10" ref="Nitrogen"/>
+      <elementref fraction="0.12" ref="Oxygen"/>
+    </material>
+    <material name="CyanateEster" density="1.2">
+       <materialref fraction="1.0" ref="Bisphenol-A"/> <!-- It's a secret what they use --> 
+    </material>
+
+    <!-- Ref Product Information Sheet, Dow Corning, for SE4445 CV Gel, and SDS sheet (Canada) for fraction Alumina, 
+         given as 77-78 % for B, range 70 - 86 ^% for A, so we take midrange 78. Ignore 0.77 % carbon. Ignore 
+         Octamethylcyclotetrasiloxane 0.11 %  -->
+    <!-- Ref: Wikipedia Polydimethylsiloxane for formula -->
+    <chemical name="C2H6OSi"> <!-- AKA Polydimethylsiloxane -->
+      <elemcontent quantity="2" ref="Carbon"/>
+      <elemcontent quantity="6" ref="Hydrogen"/>
+      <elemcontent quantity="1" ref="Oxygen"/>
+      <elemcontent quantity="1" ref="Silicon"/>
+    </chemical>
+    <material name="SE4445" density="2.36">
+      <chemicalref fraction="0.78" ref="Al2O3"/>
+      <chemicalref fraction="0.22" ref="C2H6OSi"/>
+    </material>
+
+    <!-- Plastics -->
+
+    <material name="Nylon" density="1.14">
+      <elementref fraction="0.636853" ref="Carbon"/>
+      <elementref fraction="0.097980" ref="Hydrogen"/>
+      <elementref fraction="0.141388" ref="Nitrogen"/>
+      <elementref fraction="0.123779" ref="Oxygen"/>
+    </material>
+    <material name="Lexan" density="1.2">
+      <elementref fraction="0.755749" ref="Carbon"/>
+      <elementref fraction="0.055493" ref="Hydrogen"/>
+      <elementref fraction="0.188757" ref="Nitrogen"/>
+    </material>
+    <material name="Mylar" density="1.39">
+      <elementref fraction="0.625016" ref="Carbon"/>
+      <elementref fraction="0.041960" ref="Hydrogen"/>
+      <elementref fraction="0.333024" ref="Nitrogen"/>
+    </material>
+    <material name="Polyethylene" density="0.935">
+      <elementref fraction="0.856285" ref="Carbon"/>
+      <elementref fraction="0.143715" ref="Hydrogen"/>
+    </material>
+    <material name="Kapton" density="1.42"> <!-- Aka polyimide -->
+      <elementref fraction="0.691133" ref="Carbon"/>
+      <elementref fraction="0.026363" ref="Hydrogen"/>
+      <elementref fraction="0.209234" ref="Nitrogen"/>
+      <elementref fraction="0.073270" ref="Oxygen"/>
+    </material>
+    <material name="Plexiglas" density="1.18"> <!-- aka poly methyl-methacrylate, acrylate -->
+      <elementref fraction="0.599846" ref="Carbon"/>
+      <elementref fraction="0.080541" ref="Hydrogen"/>
+      <elementref fraction="0.319613" ref="Nitrogen"/>
+    </material>
+    <material name="PolystyreneScintillator" density="1.032">
+      <elementref fraction="0.922579" ref="Carbon"/>
+      <elementref fraction="0.077421" ref="Hydrogen"/>
+    </material>
+    <material name="Teflon" density="2.2">
+      <elementref fraction="0.240183" ref="Carbon"/>
+      <elementref fraction="0.759817" ref="Fluorine"/>
+    </material>
+    <material name="PolyvinyltolueneScintillator" density="1.032">
+      <elementref fraction="0.914710" ref="Carbon"/>
+      <elementref fraction="0.085290" ref="Hydrogen"/>
+    </material>
+    <material name="BoratedPolyethylene" density="1.112"> <!-- Ref. www.marshield.com/borated-polyethylene -->
+      <elementref fraction="0.050" ref="Boron"/>         <!-- 5 % by weight -->
+      <elementref fraction="0.111" ref="Oxygen"/>        <!-- (3 * Awt O) / (2 * Awt B) * 0.05 --> 
+      <materialref fraction="0.839" ref="Polyethylene"/>  <!-- The rest -->
+    </material>
+
+
+    <!-- From Stephen Haywood et al spreadsheet Materials.xls at 
+         http://hepwww.rl.ac.uk/atlas-sct/engineering/material_budget/ 
+         But: ignore the densities there, they are nonsense? -->
+    <chemical name="C18O3H20">
+      <elemcontent quantity="18" ref="Carbon"/>
+      <elemcontent quantity="20" ref="Hydrogen"/>
+      <elemcontent quantity="3" ref="Oxygen"/>
+    </chemical>
+    <material name="Epoxy" density="1.2"> <!-- Density for Araldite 2011 at 25 degC, from hazard sheet -->
+      <chemicalref fraction="1.0" ref="C18O3H20"/>
+    </material>
+
+    <chemical name="H2O">
+      <elemcontent quantity="1" ref="Oxygen"/>
+      <elemcontent quantity="2" ref="Hydrogen"/>
+    </chemical>
+    <material name="Water" density="1.0">
+      <chemicalref fraction="1.0" ref="H2O"/>
+    </material>
+
+    <chemical name="C19O3H12">
+      <elemcontent quantity="19" ref="Carbon"/>
+      <elemcontent quantity="12" ref="Hydrogen"/>
+      <elemcontent quantity="3" ref="Oxygen"/>
+    </chemical>
+    <material name="Peek" density="1.32"> <!-- Wikipedia -->
+      <chemicalref fraction="1.0" ref="C19O3H12"/>
+    </material>
+    <material name="Torlon" density="1.45"> <!-- Wikipedia -->
+      <chemicalref fraction="1.0" ref="C19O3H12"/>
+    </material>
+    <chemical name="C37O4H24N2">
+      <elemcontent quantity="37" ref="Carbon"/>
+      <elemcontent quantity="24" ref="Hydrogen"/>
+      <elemcontent quantity="4" ref="Oxygen"/>
+      <elemcontent quantity="2" ref="Nitrogen"/>
+    </chemical>
+    <material name="PEI" density="1.27"> <!-- aka Ultem, density taken from Quadrant -->
+      <chemicalref fraction="1.0" ref="C37O4H24N2"/>
+    </material>
+
+    <chemical name="BN">
+      <elemcontent quantity="1" ref="Boron"/>
+      <elemcontent quantity="1" ref="Nitrogen"/>
+    </chemical>
+    <material name="BoronNitride" density="2.28"> <!-- Density is amorphous form; see Wikipedia for others -->
+      <chemicalref fraction="1.0" ref="BN"/>
+    </material>
+
+    <chemical name="B2O3">
+      <elemcontent quantity="2" ref="Boron"/>
+      <elemcontent quantity="3" ref="Oxygen"/>
+    </chemical>
+    <material name="BoronOxide" density="2.46"> <!-- B2O3; other oxides exist. Amorphous/liquid form density -->
+      <chemicalref fraction="1.0" ref="B2O3"/>
+    </material>
+
+    <chemical name="Al2O3">
+      <elemcontent quantity="2" ref="Aluminium"/>
+      <elemcontent quantity="3" ref="Oxygen"/>
+    </chemical>
+    <material name="AluminiumOxide" density="4.00">
+      <chemicalref fraction="1.0" ref="Al2O3"/>
+    </material>
+
+    <chemical name="AlN">
+      <elemcontent quantity="1" ref="Aluminium"/>
+      <elemcontent quantity="1" ref="Nitrogen"/>
+    </chemical>
+    <material name="AluminiumNitride" density="3.26">
+      <chemicalref fraction="1.0" ref="AlN"/>
+    </material>
+
+    <material name="SolderSnPb" density="8.52"> <!-- http://www.efunda.com/materials/solders/tin_lead.cfm for density -->
+      <elementref fraction="0.6" ref="Tin"/>
+      <elementref fraction="0.4" ref="Lead"/>
+    </material>
+
+    <material name="SolderSnPbAg" density="8.41"> <!-- Alloy 104; http://alasir.com/reference/solder_alloys/ -->
+      <elementref fraction="0.625" ref="Tin"/>
+      <elementref fraction="0.361" ref="Lead"/>
+      <elementref fraction="0.014" ref="Silver"/>
+    </material>
+
+    <material name="BoronNitrideEpoxy" density="1.4"> <!-- 1/(0.7/ density epoxy + 0.3/ density BN) -->
+      <materialref fraction="0.70" ref="Epoxy"/>
+      <materialref fraction="0.30" ref="BoronNitride"/>
+    </material>
+    <material name="BoronNitrideEpoxyEC" density="1.49"> <!-- 1/(0.8/ density epoxy + 0.2/ density BN) -->
+      <materialref fraction="0.80" ref="Epoxy"/>
+      <materialref fraction="0.20" ref="BoronNitride"/>
+    </material>
+    <material name="SilverEpoxy" density="3.23"> <!-- From material densities --> 
+      <elementref fraction="0.71" ref="Silver"/>
+      <materialref fraction="0.29" ref="Epoxy"/>
+    </material>
+
+    <!-- Ref http://www.camglassblowing.co.uk/gproperties.htm -->
+    <material name="Glass" density="2.20"> <!-- AKA Silica and Quartz -->
+      <elementref fraction="0.5326" ref="Oxygen"/>
+      <elementref fraction="0.4674" ref="Silicon"/>
+    </material>
+    <!-- Ref http://www.camglassblowing.co.uk/gproperties.htm -->
+    <material name="BorosilicateGlass" density="2.23">
+      <elementref fraction="0.5422" ref="Oxygen"/>
+      <elementref fraction="0.3633" ref="Silicon"/>
+      <elementref fraction="0.0451" ref="Boron"/>
+      <elementref fraction="0.0295" ref="Sodium"/>
+      <elementref fraction="0.0199" ref="Aluminium"/>
+    </material>
+
+    <material name="FR4" density="1.85"> <!-- Wikipedia density -->
+      <materialref fraction="0.229" ref="Epoxy"/>
+      <materialref fraction="0.771" ref="Glass"/>
+    </material>
+
+    <!-- Others -->
+
+    <material name="K13D2U" density="1.820">
+      <materialref fraction="0.721" ref="Graphite"/>
+      <materialref fraction="0.279" ref="CyanateEster"/>
+    </material>
+
+<material name="K13C2U" density="1.6">
+      <materialref fraction="0.57" ref="Graphite"/>
+      <materialref fraction="0.43" ref="CyanateEster"/>
+    </material>
+
+    <material name="CFRP" density="1.7">
+      <materialref fraction="0.721" ref="Graphite"/>
+      <materialref fraction="0.279" ref="CyanateEster"/>
+    </material>
+
+    <material name="T300CF" density="1.52"> <!--density from Sergio-->
+      <materialref fraction="0.93" ref="Graphite"/><!--fraction from www.toraycfa.com/pdfs/T300DataSheet.pdf -->
+      <materialref fraction="0.07" ref="CyanateEster"/>
+    </material>
+
+    <material name="CCAW" density="3.322"> <!-- 10 % by volume Cu -->
+      <elementref fraction="0.7315" ref="Aluminium"/>
+      <elementref fraction="0.2685" ref="Copper"/>
+    </material>
+
+    <!-- Honeycombs -->
+    <material name="Honeycomb2pcf" density="0.032037">
+        <materialref fraction="1.0" ref="CFRP"/>
+    </material>
+    <material name="Honeycomb3pcf" density="0.048">
+        <materialref fraction="1.0" ref="CFRP"/>
+    </material>
+    <material name="Honeycomb5pcf" density="0.080092">
+        <materialref fraction="1.0" ref="CFRP"/>
+    </material>
+
+    <material name="Honeycomb10pcf" density="0.160185">
+        <materialref fraction="1.0" ref="CFRP"/>
+    </material>
+
+    <material name="Polymethacrylamide" density="1.11">
+        <elementref fraction=".5645" ref="Carbon"/>
+        <elementref fraction=".1645" ref="Nitrogen"/>
+        <elementref fraction=".1880" ref="Oxygen"/>
+        <elementref fraction=".0829" ref="Hydrogen"/>
+    </material>
+
+<!--
+    <material name="Polymethacrylimide" density="1.0"> 
+        <elementref fraction=".4805" ref="Carbon"/>
+        <elementref fraction=".0578" ref="Nitrogen"/>
+        <elementref fraction=".3531" ref="Oxygen"/>
+        <elementref fraction=".1084" ref="Hydrogen"/>
+    </material>
+-->
+    <!-- Found one picture with C29 N3 O16 H78 Density unknown -->
+    <chemical name="Polymethacrylimide">
+        <elemcontent ref="Carbon" quantity="29"/>
+        <elemcontent ref="Nitrogen" quantity="3"/>
+        <elemcontent ref="Oxygen" quantity="16"/>
+        <elemcontent ref="Hydrogen" quantity="78"/>
+    </chemical>
+
+    <material name="Rohacell110A" density="0.110">
+        <chemicalref fraction="1.0" ref="Polymethacrylimide"/>
+    </material>
+
+    <material name="Rohacell71A" density="0.075">
+        <chemicalref fraction="1.0" ref="Polymethacrylimide"/>
+    </material>
+
+    <material name="Rohacell51A" density="0.052">
+        <chemicalref fraction="1.0" ref="Polymethacrylimide"/>
+    </material>
+
+    <material name="Rohacell31A" density="0.032">
+        <chemicalref fraction="1.0" ref="Polymethacrylimide"/>
+    </material>
+
+<material name="TiMetal_heat" density="0.33333">
+      <elementref fraction="1.00000" ref="Titanium"/>
+    </material>
+<material name="PVC" density="1.38">
+        <elementref fraction="0.384" ref="Carbon"/>
+        <elementref fraction="0.048" ref="Hydrogen"/>
+	<elementref fraction="0.568" ref="Chlorine"/>	
+    </material>
+<material name="PE" density="0.935">
+        <elementref fraction="0.86" ref="Carbon"/>
+        <elementref fraction="0.14" ref="Hydrogen"/>
+	
+    </material>
+<material name="Poliax" density="1.42*1.19"> <!-- Aka polyimide -->
+      <elementref fraction="0.691133" ref="Carbon"/>
+      <elementref fraction="0.026363" ref="Hydrogen"/>
+      <elementref fraction="0.209234" ref="Nitrogen"/>
+      <elementref fraction="0.073270" ref="Oxygen"/>
+    </material>
+  </materials>
+
+
+<!-- Inner Tracker dimensions and things common to barrel and endcap. -->
+<defines>
+  <var name="PI" value="acos(-1.0)"/>
+  <var name="DEG" value="PI/180."/> <!-- Use as value="10*DEG" so it converts to radians for you -->
+  <var name="EPS" value="2.e-3"/>  <!-- 2 micron to subtract from touching volumes to avoid G4 errors -->
+
+  <vector name="CNL" value="0 0 0 0 0 0 0 0 0"/> <!-- Special for indexes; length >= no. levels -->
+
+  <!--
+      ITk (defined in C++ code) contains Strip (aka SCT) + Pixel + Beampipe
+      SCT contains PolymoderatorOC and StripB + StripB_ServicesGap + StripB_ServicesEC and StripEC + StripEC_Services + StripPP1
+      Numbers mostly from EDMS 1530699 v1.3   
+  -->
+  
+  <var name="ITkOuterRadius" value="1130."/> <!-- Cryo inner r is 1150. mm, ref. blue book ATLAS exp at LHC -->
+  <var name="ITkHalfLength" value="3404"/> <!-- ITk env. v 1.4 has 3505 but reduced to 3475 to make space for HGTD 
+                                                                 E-mail Simon Viel, 18/10/2016 -->
+
+  <!-- E-mail Sabine 2015-10-26 for next three numbers -->
+  <var name="StripOuterRadius" value="ITkOuterRadius"/> 
+  <var name="StripInnerRadius" value="346.701"/> <!-- Previously 361.751, now 346.701 -->
+  <var name="StripHalfLength" value="3326.-150"/>  
+
+  <var name="PolymoderatorOCOuterRadius" value="StripOuterRadius"/>
+  <var name="PolymoderatorOCInnerRadius" value="1045."/>
+ <!-- <var name="PolymoderatorOCLength"         value="2*3170.+0.1"/> -->
+ <!-- DeGeorge envelope drawing -->
+ <var name="PolymoderatorOCLength" value="2*3020.+0.1"/> <!-- DeGeorge envelope drawing -->	
+
+  <var name="StripB_OuterRadius" value="PolymoderatorOCInnerRadius"/>
+  <var name="StripB_InnerRadius" value="StripInnerRadius"/>
+  <var name="StripB_HalfLength" value="1455."/> <!-- 14 modules * 98 mm pitch + 4 mm spare + 75 mm for z-brace + 4mm spare -->
+
+  <var name="StripB_ServicesGapOuterRadius" value="1015."/>
+  <var name="StripB_ServicesGapInnerRadius" value="StripInnerRadius"/>
+  <var name="StripB_ServicesGapZ_Start" value="StripB_HalfLength"/>
+  <var name="StripB_ServicesGapZ_End" value="StripB_ServicesGapZ_Start + 25."/> <!-- Was 100, shrink by 75 to test -->
+  <var name="StripB_ServicesGapHalfLength" value="(StripB_ServicesGapZ_End - StripB_ServicesGapZ_Start) / 2."/> 
+
+  <var name="StripB_ServicesEC_OuterRadius" value="StripB_OuterRadius"/>
+  <var name="StripB_ServicesEC_InnerRadius" value="StripB_ServicesGapOuterRadius"/>
+  <var name="StripB_ServicesEC_Z_Start" value="StripB_ServicesGapZ_Start"/>
+  <var name="StripB_ServicesEC_Z_End" value="StripHalfLength"/>
+  <var name="StripB_ServicesEC_HalfLength" value="(StripB_ServicesEC_Z_End - StripB_ServicesEC_Z_Start) / 2."/> 
+
+  <var name="StripEC_OuterRadius" value="989."/> <!-- Was 985. Increased to accommodate M. Doets wheel design. --> 
+  <var name="StripEC_InnerRadius" value="StripInnerRadius"/>
+  <var name="StripEC_Z_Start" value="StripB_ServicesGapZ_End"/>   
+  <var name="StripEC_Z_End" value="3130.-150. - 1."/>   
+  <var name="StripEC_HalfLength" value="(StripEC_Z_End - StripEC_Z_Start) / 2."/>
+
+  <var name="StripEC_ServicesOuterRadius" value="1011"/> <!-- Env. def v1.4 -->
+  <var name="StripEC_ServicesInnerRadius" value="StripEC_OuterRadius"/>
+  <var name="StripEC_ServicesZ_Start" value="StripEC_Z_Start"/>
+  <var name="StripEC_ServicesZ_End" value="StripEC_Z_End - 2."/>
+  <var name="StripEC_ServicesHalfLength" value="(StripEC_ServicesZ_End - StripEC_ServicesZ_Start) / 2."/>
+
+  <var name="StripEC_PP1OuterRadius" value="StripB_ServicesEC_InnerRadius"/>
+  <var name="StripEC_PP1InnerRadius" value="StripInnerRadius"/>
+  <var name="StripEC_PP1Z_Start" value="StripEC_Z_End"/>
+  <var name="StripEC_PP1Z_End" value="StripHalfLength"/>
+  <var name="StripEC_PP1HalfLength" value="(StripEC_PP1Z_End - StripEC_PP1Z_Start) / 2."/>
+
+</defines>
+
+
+<transformation name="IdentityTransform">
+  <translation/>
+</transformation>
+
+<positionindex>
+  <addindex name="barrel_endcap"/>
+  <addindex name="layer_wheel"/>
+  <addindex name="phi_module"/>
+  <addindex name="eta_module"/>
+  <addindex name="side"/>
+</positionindex>
+
+<!-- Material mixture for sensor local supports. Used in SS, LS and petal cores, 
+     with density scaled to give required radiation length. -->
+<materials>
+  <material name="MatStaveSupport" density="1.0"> 
+    <elementref ref="Carbon" fraction="0.70"/>
+    <elementref ref="Aluminium" fraction="0.20"/>
+    <elementref ref="Hydrogen" fraction="0.06"/>
+    <elementref ref="Oxygen" fraction="0.03"/>
+    <elementref ref="Copper" fraction="0.01"/>
+  </material>
+</materials>
+
+
+<!-- Inner Tracker common items like polythene moderator, outer cyl support etc. -->
+
+<defines>
+
+  <!-- Ref EDMS 1516118, Viehhauser, p. 10; deGeorge envelope model for length -->
+  <var name="OC_Length" value="PolymoderatorOCLength - 1."/>
+  <var name="OC_SkinThickness" value="2.5"/>
+  <var name="OC_CoreThickness" value="30."/>
+  <var name="OC_OuterSkinOuterR" value="1101."/>
+  <var name="OC_OuterSkinInnerR" value="OC_OuterSkinOuterR - OC_SkinThickness"/>
+  <var name="OC_InnerSkinOuterR" value="OC_OuterSkinInnerR - OC_CoreThickness"/>
+  <var name="OC_InnerR" value="OC_InnerSkinOuterR - OC_SkinThickness"/>
+  <var name="PolyModOuterR" value="PolymoderatorOCOuterRadius"/>
+  <var name="PolyModThickness" value="25."/> <!-- ref LoI p. 101 -->
+  <var name="PolyModInnerR" value="PolymoderatorOCOuterRadius - PolyModThickness"/>
+
+  <var name="BulkheadRI" value="StripInnerRadius + 5"/>
+  <var name="BulkheadRO" value="StripEC_ServicesInnerRadius - 25."/>
+  <var name="BulkheadT" value="6"/> <!-- Guess, 3 May 2016: two facesheets of 3 mm CF -->
+  <var name="BulkheadTranslation" value="OC_Length/2 - BulkheadT/2 - 2"/>
+
+  <var name="EC_PolyModRI" value="StripInnerRadius"/>           <!-- To continue from Pixel polyM -->
+  <var name="EC_PolyModRO" value="PolymoderatorOCInnerRadius"/> <!-- Bit arbitrary. Space for type II limits it -->
+  <var name="EC_PolyModT" value="70."/>                        <!-- Ben Smart choice for pixel part -->
+
+  <!-- We put PP1's here because they are attached to the supports rather than barrel or endcap -->
+  <var name="B_PP1_Z_Start" value="OC_Length / 2 + 1."/>
+  <var name="B_PP1_Z_End" value="StripHalfLength - 1."/>
+  <var name="B_PP1_RI" value="StripB_ServicesEC_OuterRadius + 1."/>
+  <var name="B_PP1_RO" value="OC_OuterSkinOuterR - 1."/>
+  <var name="B_PP1_L" value="B_PP1_Z_End - B_PP1_Z_Start"/>
+<!--
+  <var name="EC_PP1_Z_Start"     value="3170 + 1."/>
+  <var name="EC_PP1_Z_End"       value="3270 - 1."/>
+-->
+  <var name="EC_PP1_Z_Start" value="3020 + 1."/>
+  <var name="EC_PP1_Z_End" value="3120 - 1."/>
+  <var name="EC_PP1_RI" value="750."/>
+  <var name="EC_PP1_RO" value="1000+EPS"/><!--BulkheadRO"/>-->
+  <var name="EC_PP1_L" value="EC_PP1_Z_End - EC_PP1_Z_Start"/>
+<!--
+  <var name="Pix_PP1_middle_Z_Start"     value="3175.8 + EPS"/>      
+  <var name="Pix_PP1_middle_Z_End"       value="3242.8"/>
+  <var name="Pix_PP1_middle_RI"          value="347."/>
+  <var name="Pix_PP1_middle_RO"          value="420."/>
+  <var name="Pix_PP1_middle_L"           value="Pix_PP1_middle_Z_End - Pix_PP1_middle_Z_Start"/>
+
+  <var name="Pix_PP1_outer_Z_Start"     value="3020 + EPS"/>          
+  <var name="Pix_PP1_outer_Z_End"       value="3175.8"/>
+  <var name="Pix_PP1_outer_RI"          value="347."/>
+  <var name="Pix_PP1_outer_RO"          value="700."/>
+  <var name="Pix_PP1_outer_L"           value="Pix_PP1_outer_Z_End - Pix_PP1_outer_Z_Start"/>
+
+  <var name="HeatExchanger_w"    value="50"/>
+  <var name="HeatExchanger_t"    value="HeatExchanger_w"/>
+  <var name="HeatExchanger_l"    value="120"/>
+<var name="HeatExchanger_z"    value="3070"/>
+     <var name="HeatExchanger_Ri"    value="400"/>
+-->
+</defines>
+
+<shapes>
+  <tube name="shPolyModOCEnvelope" rmin="PolymoderatorOCInnerRadius" rmax="PolymoderatorOCOuterRadius - 2*EPS" zhalflength="PolymoderatorOCLength/2"/>
+
+  <tube name="shOC_InnerFace" rmin="OC_InnerR" rmax="OC_InnerSkinOuterR" zhalflength="OC_Length/2"/> 
+  <tube name="shOC_Core" rmin="OC_InnerSkinOuterR + EPS" rmax="OC_OuterSkinInnerR - EPS" zhalflength="OC_Length/2"/> 
+  <tube name="shOC_OuterFace" rmin="OC_OuterSkinInnerR" rmax="OC_OuterSkinOuterR" zhalflength="OC_Length/2"/> 
+  <tube name="shBulkhead" rmin="BulkheadRI" rmax="BulkheadRO" zhalflength="BulkheadT/2"/>
+
+  <tube name="shPolyMod" rmin="PolyModInnerR" rmax="PolyModOuterR - 3*EPS" zhalflength="OC_Length/2"/>
+  <tube name="shEC_PolyMod" rmin="EC_PolyModRI + EPS" rmax="EC_PolyModRO - EPS" zhalflength="EC_PolyModT/2"/>
+
+  <tube name="shB_PP1" rmin="B_PP1_RI" rmax="B_PP1_RO" zhalflength="B_PP1_L/2"/>
+  <tube name="shEC_PP1" rmin="EC_PP1_RI" rmax="EC_PP1_RO" zhalflength="EC_PP1_L/2"/>
+
+  <!--<tube name="shPixPP1Envelope"      rmin="Pix_PP1_middle_RI"                rmax="B_PP1_RO"              zhalflength="Pix_PP1_middle_L/2"/>-->
+  <!--<tube name="shPix_PP1_middle"      rmin="Pix_PP1_middle_RI"                rmax="Pix_PP1_middle_RO"              zhalflength="Pix_PP1_middle_L/2"/>
+  <tube name="shPix_PP1_outer"       rmin="Pix_PP1_outer_RI"                rmax="Pix_PP1_outer_RO"                zhalflength="Pix_PP1_outer_L/2"/>
+  <box name="shHeatExTriplet" xhalflength="HeatExchanger_l/2"  yhalflength="3*HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/>
+<box name="shHeatExSingle" xhalflength="HeatExchanger_l/2"  yhalflength="HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/> 
+
+<union name="pixPP1union">
+    <shaperef ref="shPix_PP1_outer"/>
+    <transformation name="PlacePixPP1middle">
+      <translation z="Pix_PP1_outer_L+Pix_PP1_middle_L/2"/>
+    </transformation>
+    <shaperef ref="shPix_PP1_middle"/>
+  </union>-->
+</shapes>
+
+<logvol name="EC_PolyMod" shape="shEC_PolyMod" material="BoratedPolyethylene"/>
+
+<logvol name="PolyModOCEnvelope" shape="shPolyModOCEnvelope" material="N2">
+
+  <logvol name="OC_InnerFace" shape="shOC_InnerFace" material="CFRP"/>
+  <logvol name="OC_OuterFace" shape="shOC_OuterFace" material="CFRP"/>
+  <logvol name="OC_Core" shape="shOC_Core" material="Honeycomb10pcf"/>
+
+  <logvol name="PolyMod" shape="shPolyMod" material="BoratedPolyethylene"/>
+
+</logvol>
+
+<logvol name="Bulkhead" shape="shBulkhead" material="CFRP"/>
+
+
+
+
+<materials>
+  <material name="MatB_PP1" density="0.356"> <!-- Hand calc to give 20 kg; logbook UG20 May 13th 2016 -->
+    <materialref ref="MatStaveSupport" fraction="1.0"/>
+  </material>
+  <material name="MatEC_PP1" density="0.177"> <!-- Density from hand calc. to give 20 kg -->
+    <materialref ref="MatStaveSupport" fraction="1.0"/>
+  </material>
+</materials>
+
+<logvol name="B_PP1" shape="shB_PP1" material="MatB_PP1"/>
+<logvol name="EC_PP1" shape="shEC_PP1" material="MatEC_PP1"/>
+<logvol name="Pix_PP1_middle" shape="shPix_PP1_middle" material="Air"/>
+<logvol name="Pix_PP1_outer" shape="shPix_PP1_outer" material="Air"/>
+<!--<logvol name="pixPP1" shape="pixPP1union" material="Air"></logvol>
+<assembly name="PixPP1"> 
+  <logvolref ref="pixPP1"/>
+</assembly>
+-->
+
+
+
+
+<defines>
+  <!-- Endcap sensor dimensions from apr15/small.geom -->
+  <!-- Wafer cut dimensions AX AY BX BY CX CY DX DY -->
+  <matrix name="E_SensorVtx" coldim="8" value="     -56.6118 -39.6071  47.9166 -47.8979  47.7066  49.9845 -56.4013  37.5210     -47.8155 -49.8880  37.2181 -56.6409  37.0474  58.3384 -47.6446  48.1909     -37.2139 -58.2059  25.1307 -63.1617  25.0056  64.4064 -37.0887  56.9616     -60.6002 -33.1240  57.1708 -36.5666  57.0531  38.9200 -60.4823  30.7708     -57.0256 -38.9917  53.0158 -42.2263  52.9057  44.4253 -56.9153  36.7930     -52.8785 -44.4755  48.3267 -47.4636  48.2253  49.4860 -52.7770  42.4533   "/>
+  <!-- R_i, R, R_o (cut values) -->
+  <matrix name="E_SensorRadius" coldim="3" value="      384.050  438.614  488.873      489.373  534.639  574.644      575.144  609.405  637.659      638.159  697.899  755.951      756.451  812.471  866.512      867.012  918.749  968.235   "/>
+  <vector name="SensorRotation" value=" 0.0000000e+00 0.0000000e+00 0.0000000e+00 5.0397041e-02 5.0376915e-02 5.0381140e-02  "/>
+  <!-- End of definess from small.geom -->
+</defines>
+
+<defines>
+
+  <!-- Endcap -->
+
+  <var name="SensorThickness" value="0.320"/>
+
+  <vector name="N_InRing" value="32 32 32 64 64 64"/>
+
+  <var name="ScaleAngleBy" value="1.05"/>
+  <var name="SensorPhiWidth_0" value="2 * PI / N_InRing_0 * ScaleAngleBy"/>
+  <var name="SensorPhiWidth_1" value="2 * PI / N_InRing_1 * ScaleAngleBy"/>
+  <var name="SensorPhiWidth_2" value="2 * PI / N_InRing_2 * ScaleAngleBy"/>
+  <var name="SensorPhiWidth_3" value="2 * PI / N_InRing_3 * ScaleAngleBy"/>
+  <var name="SensorPhiWidth_4" value="2 * PI / N_InRing_4 * ScaleAngleBy"/>
+  <var name="SensorPhiWidth_5" value="2 * PI / N_InRing_5 * ScaleAngleBy"/>
+
+  <!-- We have to stretch the trapezoid corners so the intersection includes the curved part -->
+  <var name="ScaleTrapBy" value="1.05"/>
+
+  <var name="E_VtxStr0Bx" value="ScaleTrapBy * (E_SensorVtx_0_2 - E_SensorVtx_0_0) + E_SensorVtx_0_0"/>
+  <var name="E_VtxStr0By" value="ScaleTrapBy * (E_SensorVtx_0_3 - E_SensorVtx_0_1) + E_SensorVtx_0_1"/>
+  <var name="E_VtxStr0Cx" value="ScaleTrapBy * (E_SensorVtx_0_4 - E_SensorVtx_0_6) + E_SensorVtx_0_6"/>
+  <var name="E_VtxStr0Cy" value="ScaleTrapBy * (E_SensorVtx_0_5 - E_SensorVtx_0_7) + E_SensorVtx_0_7"/>
+
+  <var name="E_VtxStr1Bx" value="ScaleTrapBy * (E_SensorVtx_1_2 - E_SensorVtx_1_0) + E_SensorVtx_1_0"/>
+  <var name="E_VtxStr1By" value="ScaleTrapBy * (E_SensorVtx_1_3 - E_SensorVtx_1_1) + E_SensorVtx_1_1"/>
+  <var name="E_VtxStr1Cx" value="ScaleTrapBy * (E_SensorVtx_1_4 - E_SensorVtx_1_6) + E_SensorVtx_1_6"/>
+  <var name="E_VtxStr1Cy" value="ScaleTrapBy * (E_SensorVtx_1_5 - E_SensorVtx_1_7) + E_SensorVtx_1_7"/>
+
+  <var name="E_VtxStr2Bx" value="ScaleTrapBy * (E_SensorVtx_2_2 - E_SensorVtx_2_0) + E_SensorVtx_2_0"/>
+  <var name="E_VtxStr2By" value="ScaleTrapBy * (E_SensorVtx_2_3 - E_SensorVtx_2_1) + E_SensorVtx_2_1"/>
+  <var name="E_VtxStr2Cx" value="ScaleTrapBy * (E_SensorVtx_2_4 - E_SensorVtx_2_6) + E_SensorVtx_2_6"/>
+  <var name="E_VtxStr2Cy" value="ScaleTrapBy * (E_SensorVtx_2_5 - E_SensorVtx_2_7) + E_SensorVtx_2_7"/>
+
+  <var name="E_VtxStr3Bx" value="ScaleTrapBy * (E_SensorVtx_3_2 - E_SensorVtx_3_0) + E_SensorVtx_3_0"/>
+  <var name="E_VtxStr3By" value="ScaleTrapBy * (E_SensorVtx_3_3 - E_SensorVtx_3_1) + E_SensorVtx_3_1"/>
+  <var name="E_VtxStr3Cx" value="ScaleTrapBy * (E_SensorVtx_3_4 - E_SensorVtx_3_6) + E_SensorVtx_3_6"/>
+  <var name="E_VtxStr3Cy" value="ScaleTrapBy * (E_SensorVtx_3_5 - E_SensorVtx_3_7) + E_SensorVtx_3_7"/>
+
+  <var name="E_VtxStr4Bx" value="ScaleTrapBy * (E_SensorVtx_4_2 - E_SensorVtx_4_0) + E_SensorVtx_4_0"/>
+  <var name="E_VtxStr4By" value="ScaleTrapBy * (E_SensorVtx_4_3 - E_SensorVtx_4_1) + E_SensorVtx_4_1"/>
+  <var name="E_VtxStr4Cx" value="ScaleTrapBy * (E_SensorVtx_4_4 - E_SensorVtx_4_6) + E_SensorVtx_4_6"/>
+  <var name="E_VtxStr4Cy" value="ScaleTrapBy * (E_SensorVtx_4_5 - E_SensorVtx_4_7) + E_SensorVtx_4_7"/>
+
+  <var name="E_VtxStr5Bx" value="ScaleTrapBy * (E_SensorVtx_5_2 - E_SensorVtx_5_0) + E_SensorVtx_5_0"/>
+  <var name="E_VtxStr5By" value="ScaleTrapBy * (E_SensorVtx_5_3 - E_SensorVtx_5_1) + E_SensorVtx_5_1"/>
+  <var name="E_VtxStr5Cx" value="ScaleTrapBy * (E_SensorVtx_5_4 - E_SensorVtx_5_6) + E_SensorVtx_5_6"/>
+  <var name="E_VtxStr5Cy" value="ScaleTrapBy * (E_SensorVtx_5_5 - E_SensorVtx_5_7) + E_SensorVtx_5_7"/>
+
+  <!-- And we allow an increase in the tubs thickness just to improve VP1 shading/colouring -->
+  <!-- Which changes it, but never fixes it, so leave at 1 * -->
+  <var name="E_TubsThick" value="1 * SensorThickness"/>
+
+  <!-- Barrel: Updated to April 2019 tender document
+https://edms.cern.ch/document/2135101-->
+  <var name="B_SensorLength" value="97.621"/> <!-- Along strips direction, x, eta -->
+  <var name="B_SensorWidth" value="97.950"/> <!-- Across-strips direction, y, phi -->
+                                                 <!-- Historically it was square and the distinction didn't matter. -->
+
+</defines>
+
+<readoutgeometry>
+
+  <param name="thickness" value="0.320"/>
+  <param name="carrierType" value="electrons"/>
+  <param name="readoutSide" value="+"/>
+  <param name="fieldDirection" value="z"/>
+  <param name="stripDirection" value="x"/>
+
+  <sensorclass name="SiStripBox">
+    <param name="nStrips" value="1280"/>
+    <!-- Ref: New thin-guard design from Nobu -->
+    <param name="pitch" value="0.0755"/>
+    <!-- Start and end positions are Sensitive Size (= 96.734 mm) divided by 2 or 4 -->
+<!-- sensitive size = 97621-2*450 (edge distance) = 96721-->
+    <sensortype name="RG_ISB_SS">
+      <param name="nRows" value="4"/>
+      <param name="stripLength" value="24.18025"/>
+    </sensortype>
+    <sensortype name="RG_ISB_MS">
+      <param name="nRows" value="2"/>
+      <param name="stripLength" value="48.3605"/>
+    </sensortype>
+  </sensorclass>
+
+  <sensorclass name="StereoAnnulus">
+    <param name="stereoAngle" value=" 0.020"/>
+    <sensortype name="RG_ISE_0">
+      <param name="centreR" value="438.614"/>
+      <param name="nRows" value="4"/>
+      <param name="nStrips" value="1024 1024 1152 1152 "/>
+      <param name="phiPitch" value="1.930863e-04 1.930863e-04 1.716880e-04 1.716880e-04 "/>
+      <param name="startR" value="384.500 403.481 427.462 456.442 "/>
+      <param name="endR" value="403.481 427.462 456.442 488.423 "/>
+    </sensortype>
+    <sensortype name="RG_ISE_1">
+      <param name="centreR" value="534.639"/>
+      <param name="nRows" value="4"/>
+      <param name="nStrips" value="1280 1280 1408 1408 "/>
+      <param name="phiPitch" value="1.547122e-04 1.547122e-04 1.406774e-04 1.406774e-04 "/>
+      <param name="startR" value="489.823 507.916 535.009 559.101 "/>
+      <param name="endR" value="507.916 535.009 559.101 574.194 "/>
+    </sensortype>
+    <sensortype name="RG_ISE_2">
+      <param name="centreR" value="609.405"/>
+      <param name="nRows" value="2"/>
+      <param name="nStrips" value="1536 1536 "/>
+      <param name="phiPitch" value="1.290774e-04 1.290774e-04 "/>
+      <param name="startR" value="575.594 606.402 "/>
+      <param name="endR" value="606.402 637.209 "/>
+    </sensortype>
+    <sensortype name="RG_ISE_3">
+      <param name="centreR" value="697.899"/>
+      <param name="nRows" value="4"/>
+      <param name="nStrips" value="896 896 896 896 "/>
+      <param name="phiPitch" value="1.095053e-04 1.095053e-04 1.095053e-04 1.095053e-04 "/>
+      <param name="startR" value="638.609 664.832 697.055 729.278 "/>
+      <param name="endR" value="664.832 697.055 729.278 755.501 "/>
+    </sensortype>
+    <sensortype name="RG_ISE_4">
+      <param name="centreR" value="812.471"/>
+      <param name="nRows" value="2"/>
+      <param name="nStrips" value="1024 1024 "/>
+      <param name="phiPitch" value="9.617533e-05 9.617533e-05 "/>
+      <param name="startR" value="756.901 811.482 "/>
+      <param name="endR" value="811.482 866.062 "/>
+    </sensortype>
+    <sensortype name="RG_ISE_5">
+      <param name="centreR" value="918.749"/>
+      <param name="nRows" value="2"/>
+      <param name="nStrips" value="1152 1152 "/>
+      <param name="phiPitch" value="8.574294e-05 8.574294e-05 "/>
+      <param name="startR" value="867.462 907.623 "/>
+      <param name="endR" value="907.623 967.785 "/>
+    </sensortype>
+  </sensorclass>
+</readoutgeometry>
+
+
+<shapes>
+
+  <generictrap name="TrapSensor0" x0="E_SensorVtx_0_6" y0="E_SensorVtx_0_7" x1="E_VtxStr0Cx" y1="E_VtxStr0Cy" x2="E_VtxStr0Bx" y2="E_VtxStr0By" x3="E_SensorVtx_0_0" y3="E_SensorVtx_0_1" x4="E_SensorVtx_0_6" y4="E_SensorVtx_0_7" x5="E_VtxStr0Cx" y5="E_VtxStr0Cy" x6="E_VtxStr0Bx" y6="E_VtxStr0By" x7="E_SensorVtx_0_0" y7="E_SensorVtx_0_1" zhalflength="SensorThickness / 2."/>
+  
+  <generictrap name="TrapSensor1" x0="E_SensorVtx_1_6" y0="E_SensorVtx_1_7" x1="E_VtxStr1Cx" y1="E_VtxStr1Cy" x2="E_VtxStr1Bx" y2="E_VtxStr1By" x3="E_SensorVtx_1_0" y3="E_SensorVtx_1_1" x4="E_SensorVtx_1_6" y4="E_SensorVtx_1_7" x5="E_VtxStr1Cx" y5="E_VtxStr1Cy" x6="E_VtxStr1Bx" y6="E_VtxStr1By" x7="E_SensorVtx_1_0" y7="E_SensorVtx_1_1" zhalflength="SensorThickness / 2."/>
+
+  <generictrap name="TrapSensor2" x0="E_SensorVtx_2_6" y0="E_SensorVtx_2_7" x1="E_VtxStr2Cx" y1="E_VtxStr2Cy" x2="E_VtxStr2Bx" y2="E_VtxStr2By" x3="E_SensorVtx_2_0" y3="E_SensorVtx_2_1" x4="E_SensorVtx_2_6" y4="E_SensorVtx_2_7" x5="E_VtxStr2Cx" y5="E_VtxStr2Cy" x6="E_VtxStr2Bx" y6="E_VtxStr2By" x7="E_SensorVtx_2_0" y7="E_SensorVtx_2_1" zhalflength="SensorThickness / 2."/>
+
+  <generictrap name="TrapSensor3" x0="E_SensorVtx_3_6" y0="E_SensorVtx_3_7" x1="E_VtxStr3Cx" y1="E_VtxStr3Cy" x2="E_VtxStr3Bx" y2="E_VtxStr3By" x3="E_SensorVtx_3_0" y3="E_SensorVtx_3_1" x4="E_SensorVtx_3_6" y4="E_SensorVtx_3_7" x5="E_VtxStr3Cx" y5="E_VtxStr3Cy" x6="E_VtxStr3Bx" y6="E_VtxStr3By" x7="E_SensorVtx_3_0" y7="E_SensorVtx_3_1" zhalflength="SensorThickness / 2."/>
+  
+  <generictrap name="TrapSensor4" x0="E_SensorVtx_4_6" y0="E_SensorVtx_4_7" x1="E_VtxStr4Cx" y1="E_VtxStr4Cy" x2="E_VtxStr4Bx" y2="E_VtxStr4By" x3="E_SensorVtx_4_0" y3="E_SensorVtx_4_1" x4="E_SensorVtx_4_6" y4="E_SensorVtx_4_7" x5="E_VtxStr4Cx" y5="E_VtxStr4Cy" x6="E_VtxStr4Bx" y6="E_VtxStr4By" x7="E_SensorVtx_4_0" y7="E_SensorVtx_4_1" zhalflength="SensorThickness / 2."/>
+  
+  <generictrap name="TrapSensor5" x0="E_SensorVtx_5_6" y0="E_SensorVtx_5_7" x1="E_VtxStr5Cx" y1="E_VtxStr5Cy" x2="E_VtxStr5Bx" y2="E_VtxStr5By" x3="E_SensorVtx_5_0" y3="E_SensorVtx_5_1" x4="E_SensorVtx_5_6" y4="E_SensorVtx_5_7" x5="E_VtxStr5Cx" y5="E_VtxStr5Cy" x6="E_VtxStr5Bx" y6="E_VtxStr5By" x7="E_SensorVtx_5_0" y7="E_SensorVtx_5_1" zhalflength="SensorThickness / 2."/>
+  
+  <tubs name="TubeSensor0" rmin="E_SensorRadius_0_0" rmax="E_SensorRadius_0_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_0 / 2" dphi="SensorPhiWidth_0"/>
+  
+  <tubs name="TubeSensor1" rmin="E_SensorRadius_1_0" rmax="E_SensorRadius_1_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_1 / 2" dphi="SensorPhiWidth_1"/>
+  
+  <tubs name="TubeSensor2" rmin="E_SensorRadius_2_0" rmax="E_SensorRadius_2_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_2 / 2" dphi="SensorPhiWidth_2"/>
+  
+  <tubs name="TubeSensor3" rmin="E_SensorRadius_3_0" rmax="E_SensorRadius_3_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_3 / 2" dphi="SensorPhiWidth_3"/>
+  
+  <tubs name="TubeSensor4" rmin="E_SensorRadius_4_0" rmax="E_SensorRadius_4_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_4 / 2" dphi="SensorPhiWidth_4"/>
+  
+  <tubs name="TubeSensor5" rmin="E_SensorRadius_5_0" rmax="E_SensorRadius_5_2" zhalflength="E_TubsThick / 2." sphi="-SensorPhiWidth_5 / 2" dphi="SensorPhiWidth_5"/>
+
+  <intersection name="ShE_Sensor0">
+    <shaperef ref="TubeSensor0"/>
+    <transformation name="PlaceTrapInTubs0">
+      <translation x="E_SensorRadius_0_1"/>
+    </transformation>
+    <shaperef ref="TrapSensor0"/>
+  </intersection>
+
+  <intersection name="ShE_Sensor1">
+    <shaperef ref="TubeSensor1"/>
+    <transformation name="PlaceTrapInTubs1">
+      <translation x="E_SensorRadius_1_1"/>
+    </transformation>
+    <shaperef ref="TrapSensor1"/>
+  </intersection>
+
+  <intersection name="ShE_Sensor2">
+    <shaperef ref="TubeSensor2"/>
+    <transformation name="PlaceTrapInTubs2">
+      <translation x="E_SensorRadius_2_1"/>
+    </transformation>
+    <shaperef ref="TrapSensor2"/>
+  </intersection>
+
+  <intersection name="ShE_Sensor3">
+    <shaperef ref="TubeSensor3"/>
+    <transformation name="PlaceTrapInTubs3">
+      <translation x="E_SensorRadius_3_1"/>
+    </transformation>
+    <shaperef ref="TrapSensor3"/>
+  </intersection>
+
+  <intersection name="ShE_Sensor4">
+    <shaperef ref="TubeSensor4"/>
+    <transformation name="PlaceTrapInTubs4">
+      <translation x="E_SensorRadius_4_1"/>
+    </transformation>
+    <shaperef ref="TrapSensor4"/>
+  </intersection>
+
+  <intersection name="ShE_Sensor5">
+    <shaperef ref="TubeSensor5"/>
+    <transformation name="PlaceTrapInTubs5">
+      <translation x="E_SensorRadius_5_1"/>
+    </transformation>
+    <shaperef ref="TrapSensor5"/>
+  </intersection>
+
+  <box name="ShBarrelSensor" xhalflength="B_SensorLength / 2" yhalflength="B_SensorWidth / 2" zhalflength="SensorThickness / 2"/>
+
+</shapes>
+
+<!-- NB Sensor names use a convention; they are used in atlas_idet.py. Need to add ECSensor4 and 5 -->
+
+<logvol name="ECSensor0" shape="ShE_Sensor0" material="SiMetal" sensitive="RG_ISE_0" alignable="true">
+  <index ref="eta_module" value="0"/>
+</logvol>
+<logvol name="ECSensor1" shape="ShE_Sensor1" material="SiMetal" sensitive="RG_ISE_1" alignable="true">
+  <index ref="eta_module" value="1"/>
+</logvol>
+<logvol name="ECSensor2" shape="ShE_Sensor2" material="SiMetal" sensitive="RG_ISE_2" alignable="true">
+  <index ref="eta_module" value="2"/>
+</logvol>
+<logvol name="ECSensor3" shape="ShE_Sensor3" material="SiMetal" sensitive="RG_ISE_3" alignable="true">
+  <index ref="eta_module" value="3"/>
+</logvol>
+<logvol name="ECSensor4" shape="ShE_Sensor4" material="SiMetal" sensitive="RG_ISE_4" alignable="true">
+  <index ref="eta_module" value="4"/>
+</logvol>
+<logvol name="ECSensor5" shape="ShE_Sensor5" material="SiMetal" sensitive="RG_ISE_5" alignable="true">
+  <index ref="eta_module" value="5"/>
+</logvol>
+
+<logvol name="BRLSensorSS" shape="ShBarrelSensor" material="SiMetal" sensitive="RG_ISB_SS" alignable="true"/>
+<logvol name="BRLSensorMS" shape="ShBarrelSensor" material="SiMetal" sensitive="RG_ISB_MS" alignable="true"/>
+
+
+
+<defines>
+  <!-- ABC chip ref. np49-01-104.pdf -->
+  <var name="ChipT" value="0.31"/>
+
+  <!-- Ref Laura Gonella Intro Talk https://indico.cern.ch/event/676645 -->
+  <var name="ABC_W" value="7.0"/>
+  <var name="ABC_L" value="7.9"/>
+  <var name="ABC_T" value="ChipT"/>
+
+  <var name="HCC_W" value="5.2"/>
+  <var name="HCC_L" value="3.5"/>
+  <var name="HCC_T" value="ChipT"/>
+
+  <var name="AMAC_W" value="5.2"/>
+  <var name="AMAC_L" value="3.5"/>
+  <var name="AMAC_T" value="ChipT"/>
+  <!-- Laura G -->
+
+  <!-- Ref. Paulo Moreira GBT status talk, 20?? -->
+  <var name="GBT_W" value="5.5"/>
+  <var name="GBT_L" value="5.5"/>
+  <var name="GBT_T" value="ChipT"/>
+
+  <!-- Ref. Complete guess. Smaller than GBT. -->
+  <var name="GBT_SCA_W" value="2.5"/>
+  <var name="GBT_SCA_L" value="2.5"/>
+  <var name="GBT_SCA_T" value="ChipT"/>
+
+</defines>
+
+<shapes>
+  <box name="shABC_Chip" xhalflength="ABC_W/2" yhalflength="ABC_L/2" zhalflength="ABC_T/2 - EPS"/>
+  <box name="shHCC_Chip" xhalflength="HCC_W/2" yhalflength="HCC_L/2" zhalflength="HCC_T/2 - EPS"/>
+  <box name="shGBT_Chip" xhalflength="GBT_W/2" yhalflength="GBT_L/2" zhalflength="GBT_T/2 - EPS"/>
+  <box name="shGBT_SCA_Chip" xhalflength="GBT_SCA_W/2" yhalflength="GBT_SCA_L/2" zhalflength="GBT_SCA_T/2 - EPS"/>
+</shapes>
+
+<logvol name="ABC_Chip" shape="shABC_Chip" material="SiMetal"/>
+<logvol name="HCC_Chip" shape="shHCC_Chip" material="SiMetal"/>
+<logvol name="GBT_Chip" shape="shGBT_Chip" material="SiMetal"/>
+<logvol name="GBT_SCA_Chip" shape="shGBT_SCA_Chip" material="SiMetal"/>
+
+
+<defines>
+  <!-- Ref: NP49-01-104.pdf Ver. C 24 June 2014-->
+  <var name="DCDC_PCB_W" value="8.0"/>
+  <var name="DCDC_PCB_L" value="53.85"/>
+  <var name="DCDC_PCB_T" value="0.66"/>
+
+  <var name="E_DCDC_PCB_RadiusMinR0" value="425"/>
+  <var name="E_DCDC_PCB_RadiusMaxR0" value="435"/>
+  <var name="E_DCDC_PCB_LengthR0" value="49.0"/>
+  <var name="E_DCDC_PCB_RadiusMinR1" value="529.1"/>
+  <var name="E_DCDC_PCB_RadiusMaxR1" value="538.3"/>
+  <var name="E_DCDC_PCB_LengthR1" value="67.3"/>
+  <var name="E_DCDC_PCB_RadiusMinR2" value="625.9"/>
+  <var name="E_DCDC_PCB_RadiusMaxR2" value="634.5"/>
+  <var name="E_DCDC_PCB_LengthR2" value="67.3"/>
+  <var name="E_DCDC_PCB_RadiusMinR3" value="693"/>
+  <var name="E_DCDC_PCB_RadiusMaxR3" value="701.5"/>
+  <var name="E_DCDC_PCB_LengthR3" value="67.3"/>
+  <var name="E_DCDC_PCB_RadiusMinR4" value="841.8"/>
+  <var name="E_DCDC_PCB_RadiusMaxR4" value="850.5"/>
+  <var name="E_DCDC_PCB_LengthR4" value="67.0"/>
+  <var name="E_DCDC_PCB_RadiusMinR5" value="934.5"/>
+  <var name="E_DCDC_PCB_RadiusMaxR5" value="943.0"/>
+  <var name="E_DCDC_PCB_LengthR5" value="67.0"/>
+  <var name="E_DCDC_PCB_dPhiR0" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR0"/>
+  <var name="E_DCDC_PCB_dPhiR1" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR1"/>
+  <var name="E_DCDC_PCB_dPhiR2" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR2"/>
+  <var name="E_DCDC_PCB_dPhiR3" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR3"/>
+  <var name="E_DCDC_PCB_dPhiR4" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR4"/>
+  <var name="E_DCDC_PCB_dPhiR5" value="E_DCDC_PCB_LengthR0/E_DCDC_PCB_RadiusMinR5"/>
+
+
+  <var name="DCDC_dist_from_PCBend" value="5.1"/>
+
+  <!-- modified to follow Tony Affolder values from his spreadsheet powering-X-calculator-01011v10.xls -->
+  <var name="DCDC_BoxW" value="8.5"/>
+  <var name="DCDC_BoxL" value="19.0"/>
+  <var name="DCDC_BoxT" value="4.5"/>
+
+ 
+
+  <var name="DCDC_EC_BoxW" value="DCDC_BoxL"/>
+  <var name="DCDC_EC_BoxL" value="DCDC_BoxW"/>
+  <var name="DCDC_EC_BoxT" value="DCDC_BoxT"/>
+
+  <var name="DCDC_R0_PCB_R" value="424.9"/>	
+  <var name="DCDC_R0_PCB_dphi" value="0"/>
+  <var name="DCDC_R0_Box_R" value="424.9"/>	
+  <var name="DCDC_R0_Box_dphi" value="0"/>
+
+  <var name="DCDC_R1_PCB_R" value="424.9"/>	
+  <var name="DCDC_R1_PCB_dphi" value="0"/>
+  <var name="DCDC_R1_Box_R" value="424.9"/>	
+  <var name="DCDC_R1_Box_dphi" value="0"/>
+
+  <var name="DCDC_R2_PCB_R" value="424.9"/>	
+  <var name="DCDC_R2_PCB_dphi" value="0"/>
+  <var name="DCDC_R2_Box_R" value="424.9"/>	
+  <var name="DCDC_R2_Box_dphi" value="0"/>
+
+  <var name="DCDC_R3_PCB_R" value="424.9"/>	
+  <var name="DCDC_R3_PCB_dphi" value="0"/>
+  <var name="DCDC_R3_Box_R" value="424.9"/>	
+  <var name="DCDC_R3_Box_dphi" value="0"/>
+
+  <var name="DCDC_R4_PCB_R" value="424.9"/>	
+  <var name="DCDC_R4_PCB_dphi" value="0"/>
+  <var name="DCDC_R4_Box_R" value="424.9"/>	
+  <var name="DCDC_R4_Box_dphi" value="0"/>
+
+  <var name="DCDC_R5_PCB_R" value="424.9"/>	
+  <var name="DCDC_R5_PCB_dphi" value="0"/>
+  <var name="DCDC_R5_Box_R" value="424.9"/>	
+  <var name="DCDC_R5_Box_dphi" value="0"/>
+   
+</defines>
+
+
+<materials>
+  <!-- GeoModelXml input created by ConsolidX version 1.1 for DCDC_CoilShield, version 1.0. --> 
+  
+  <material name="matDCDC_PCB" density="4.928691"> 
+    <elementref ref="Aluminium" fraction="0.000974"/>
+    <elementref ref="Barium" fraction="0.139637"/>
+    <elementref ref="Carbon" fraction="0.114105"/>
+    <elementref ref="Copper" fraction="0.259533"/>
+    <elementref ref="Gold" fraction="0.001686"/>
+    <elementref ref="Hydrogen" fraction="0.010639"/>
+    <elementref ref="Lead" fraction="0.015838"/>
+    <elementref ref="Nickel" fraction="0.026116"/>
+    <elementref ref="Oxygen" fraction="0.215126"/>
+    <elementref ref="Silicon" fraction="0.122968"/>
+    <elementref ref="Silver" fraction="0.000614"/>
+    <elementref ref="Tin" fraction="0.044091"/>
+    <elementref ref="Titanium" fraction="0.048672"/>
+  </material>
+
+
+
+  <!-- GeoModelXml input created by ConsolidX for DCDC_CoilShield, version 1.0. -->
+  <material name="matDCDC_Box" density="0.850484">      
+  <elementref ref="Aluminium" fraction="0.178664"/>   
+  <elementref ref="Carbon" fraction="0.254920"/>  
+  <elementref ref="Copper" fraction="0.523632"/>             
+  <elementref ref="Hydrogen" fraction="0.042785"/> 
+  </material>                                                                                                   
+</materials>
+
+<shapes>
+  <box name="shDCDC_PCB" xhalflength="DCDC_PCB_W/2" yhalflength="DCDC_PCB_L/2" zhalflength="DCDC_PCB_T/2 - EPS"/>
+  <box name="shDCDC_Box" xhalflength="DCDC_BoxW/2" yhalflength="DCDC_BoxL/2" zhalflength="DCDC_BoxT/2 - EPS"/>
+  <tubs name="shDCDC_EC_PCBR0" rmin="E_DCDC_PCB_RadiusMinR0" rmax="E_DCDC_PCB_RadiusMaxR0" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_0 / 2" dphi="E_DCDC_PCB_dPhiR0"/>
+<tubs name="shDCDC_EC_PCBR1" rmin="E_DCDC_PCB_RadiusMinR1" rmax="E_DCDC_PCB_RadiusMaxR1" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_1 / 2" dphi="E_DCDC_PCB_dPhiR1"/>
+
+<tubs name="shDCDC_EC_PCBR2" rmin="E_DCDC_PCB_RadiusMinR2" rmax="E_DCDC_PCB_RadiusMaxR2" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_2 / 2" dphi="E_DCDC_PCB_dPhiR2"/>
+  <tubs name="shDCDC_EC_PCBR3" rmin="E_DCDC_PCB_RadiusMinR3" rmax="E_DCDC_PCB_RadiusMaxR3" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_3 / 2" dphi="E_DCDC_PCB_dPhiR3"/>
+<tubs name="shDCDC_EC_PCBR4" rmin="E_DCDC_PCB_RadiusMinR4" rmax="E_DCDC_PCB_RadiusMaxR4" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_4 / 2" dphi="E_DCDC_PCB_dPhiR4"/>
+<tubs name="shDCDC_EC_PCBR5" rmin="E_DCDC_PCB_RadiusMinR5" rmax="E_DCDC_PCB_RadiusMaxR5" zhalflength="DCDC_PCB_T / 2." sphi="-SensorPhiWidth_5 / 2" dphi="E_DCDC_PCB_dPhiR5"/>
+  <box name="shDCDC_EC_Box" xhalflength="DCDC_EC_BoxW/2" yhalflength="DCDC_EC_BoxL/2" zhalflength="DCDC_EC_BoxT/2 "/>
+</shapes>
+
+<logvol name="DCDC_PCB" shape="shDCDC_PCB" material="matDCDC_PCB"/>
+<logvol name="DCDC_Box" shape="shDCDC_Box" material="matDCDC_Box"/>
+<logvol name="DCDC_EC_PCBR0" shape="shDCDC_EC_PCBR0" material="matDCDC_PCB"/>
+<logvol name="DCDC_EC_PCBR1" shape="shDCDC_EC_PCBR1" material="matDCDC_PCB"/>
+<logvol name="DCDC_EC_PCBR2" shape="shDCDC_EC_PCBR2" material="matDCDC_PCB"/>
+<logvol name="DCDC_EC_PCBR3" shape="shDCDC_EC_PCBR3" material="matDCDC_PCB"/>
+<logvol name="DCDC_EC_PCBR4" shape="shDCDC_EC_PCBR4" material="matDCDC_PCB"/>
+<logvol name="DCDC_EC_PCBR5" shape="shDCDC_EC_PCBR5" material="matDCDC_PCB"/>
+<logvol name="DCDC_EC_Box" shape="shDCDC_EC_Box" material="matDCDC_Box"/>
+
+
+<defines>
+  <var name="StereoAngle" value="-26.0e-3"/>
+
+  <var name="B_N_SensorsPerFace" value="14"/>
+
+  <!-- Most dimensions from NP49-01-100.pdf, 27-AUG-2014 -->
+  <var name="B_SensorGap" value="98.0 - B_SensorLength"/> 
+
+  <var name="StaveCoreWidth" value="115."/>
+  <var name="StaveCoreExtraLength" value="3.0"/>
+  <var name="StaveCoreLength" value="B_N_SensorsPerFace * (B_SensorLength + B_SensorGap) + StaveCoreExtraLength"/>
+
+  <var name="CoreToSiDistAtEta0" value="0.0"/> <!-- Overhangs!! Or you need a very special shape at the end. -->
+  <var name="StaveFaceTranslation" value="-((B_N_SensorsPerFace - 1) / 2 * (B_SensorLength + B_SensorGap) +                                                    StaveCoreExtraLength / 2) + CoreToSiDistAtEta0"/> 
+
+  <!-- Stave core thickness built up in following order: -->
+  <var name="StaveHoneycombT" value="5.2 + 0.078"/> <!-- Small correction to make Si-Si mid dist. 6.42. 
+                                                                    NPH logbook UG20 29/4/2016 -->
+  <var name="StaveFacesheetT" value="0.15"/>
+  <var name="StaveBusGlueT" value="2 * 0.025 + 0.1"/>  <!-- Includes module-to-bus glue, 0.1 mm -->
+  <var name="StaveBusKaptonT" value="3 * 0.025"/>
+  <var name="StaveCoreT" value="StaveHoneycombT + 2 * (StaveFacesheetT + StaveBusGlueT + StaveBusKaptonT)"/> 
+  <var name="StaveBusCuT" value="0.018"/> 
+  <var name="StavePlankT" value="StaveCoreT + 4 * StaveBusCuT"/>
+
+  <var name="EOSCoreWidth" value="50."/> 
+  <var name="EOSCoreLength" value="100."/>
+  <var name="EOSCoreT" value="StaveCoreT"/>
+
+  <var name="StaveCloseoutFarEndL" value="StaveCoreWidth"/>
+  <var name="StaveCloseoutFarEndT" value="StaveHoneycombT"/>
+  <!-- Reference e-mail from Peter Sutcliffe to Nigel, 13 Jan 2016 -->
+  <var name="StaveCloseoutFarEndW" value="(1754. + 328.) / StaveCloseoutFarEndL / StaveCloseoutFarEndT"/>
+
+  <var name="StaveCloseoutEOS_EndL" value="StaveCoreWidth + EOSCoreWidth"/>
+  <var name="StaveCloseoutEOS_EndT" value="StaveHoneycombT"/>
+  <var name="StaveCloseoutEOS_EndW" value="10.0"/> <!-- Temp. Guessed! -->
+
+  <var name="StaveCloseoutLongL" value="StaveCoreLength - StaveCloseoutEOS_EndW - StaveCloseoutFarEndW"/>
+  <var name="StaveCloseoutLongT" value="2 * 0.05"/> <!-- We do the C as a | of double thickness -->
+  <var name="StaveCloseoutLongW" value="StaveHoneycombT"/>
+
+  <var name="StaveCloseoutLongEOS_L" value="StaveCoreLength - EOSCoreLength - StaveCloseoutFarEndW"/>
+
+  <!-- Center, Intermediate, End stavemounts: Masses are 19g, 13.1g, 10g from Stephanie Yang 15/05/2018 -->
+  <var name="StaveMountL" value="20.0"/>
+  <var name="StaveMountR" value="12.5"/> <!-- Must be small to miss support cylinder and next stave -->
+  <var name="NumStaveMounts" value="5"/>
+  <vector name="StaveMountThickness" value="35. 33. 35."/>
+  <vector name="StaveMountHeight" value="8. 8. 8."/>
+  <vector name="StaveMountLength" value="21. 28.13 21.5"/>
+  <var name="NumStaveMountsI" value="4"/><!-- Center and End have 1 each, Intermediate has 4 -->
+  <var name="StaveMountIGap" value="294."/><!-- Based on drawings, may not be accurate? -->
+
+  <!-- Stave Bus Copper dimensions Ref LB. UG20, 7/1/2016: -->
+  <var name="StaveTrackWidth" value="0.100"/>
+  <var name="StaveI2C_Width" value="0.200"/>
+
+  <var name="StaveGroundEOS_L" value="92."/>
+  <var name="StaveGroundEOS_W" value="12.5"/>
+  <var name="StaveGroundEOS_FromEnd" value="10.5"/>
+  <var name="StaveGroundEOS_FromTop" value="4.2"/>
+
+  <var name="StaveGroundPowerL_Corr" value="48."/>
+  <var name="StaveGroundPowerL" value="B_N_SensorsPerFace * (B_SensorLength + B_SensorGap) - StaveGroundPowerL_Corr"/>
+  <var name="StaveGroundPowerW" value="12.0 + StaveI2C_Width + B_N_SensorsPerFace * 71.3 / StaveGroundPowerL"/>
+  <var name="StaveGroundPowerFromEnd" value="StaveGroundEOS_FromEnd + StaveGroundEOS_W"/>
+  <var name="StaveGroundPowerFromTop" value="StaveGroundEOS_FromTop + StaveGroundEOS_L - StaveGroundPowerW"/>
+
+  <var name="StaveGroundSignalL" value="StaveGroundPowerL"/>
+  <var name="StaveGroundSignalW" value="11.5"/>
+  <var name="StaveGroundSignalFromEnd" value="StaveGroundEOS_FromEnd + StaveGroundEOS_W"/>
+  <var name="StaveGroundSignalFromTop" value="1.0"/>
+
+  <var name="StaveSignalEOS_L" value="95."/>
+  <var name="StaveSignalEOS_W" value="13.15"/>
+  <var name="StaveSignalEOS_FromEnd" value="9.0"/>
+  <var name="StaveSignalEOS_FromTop" value="1.4"/>
+
+  <var name="StaveSignalPowerL_Corr" value="48."/>
+  <var name="StaveSignalPowerL" value="B_N_SensorsPerFace * (B_SensorLength + B_SensorGap) - StaveSignalPowerL_Corr"/>
+  <var name="StaveSignalPowerW" value="13.15 + B_N_SensorsPerFace * 89.3 / StaveSignalPowerL"/>
+  <var name="StaveSignalPowerFromEnd" value="StaveSignalEOS_FromEnd + StaveSignalEOS_W"/>
+  <var name="StaveSignalPowerFromTop" value="StaveSignalEOS_FromTop + StaveSignalEOS_L - StaveSignalPowerW"/>
+
+  <var name="StaveSignalSignalL" value="StaveSignalPowerL"/>
+  <var name="StaveSignalSSSignalBigW" value="(3 + 2 * B_N_SensorsPerFace) * 2 * StaveTrackWidth"/>
+  <var name="StaveSignalSSSignalSmallW" value="(3 + 2) * 2 * StaveTrackWidth"/>
+  <var name="StaveSignalMSSignalBigW" value="(3 + B_N_SensorsPerFace) * 2 * StaveTrackWidth"/>
+  <var name="StaveSignalMSSignalSmallW" value="(3 + 1) * 2 * StaveTrackWidth"/>
+  <var name="StaveSignalSignalFromEnd" value="StaveSignalEOS_FromEnd + StaveSignalEOS_W"/>
+  <var name="StaveSignalSignalFromTop" value="StaveSignalEOS_FromTop"/>
+
+  <var name="StaveCFoamT" value="StaveHoneycombT"/>
+  <var name="StaveCFoamW" value="10.0"/>
+  <var name="StaveCoolingL" value="StaveCoreLength - StaveCloseoutEOS_EndW - StaveCloseoutFarEndW"/>
+  <var name="StaveCoolingOffset" value="25."/>
+  <var name="StaveCoolingPipeOD" value="2.275"/> 
+  <var name="StaveCoolingPipeID" value="1.975"/> <!-- 0.1 mm wall thickness on drawing, but not yet achieved so thicker -->
+
+  <var name="StaveEOS_CFoamL" value="60.0"/> <!-- Ref: np49-01-141.pdf 1/3/2016 -->
+  <var name="StaveEOS_CFoamW" value="73.5"/> <!-- Ref: np49-01-141.pdf 1/3/2016 -->
+
+  <vector name="N_StavesInCyl" value="28 40 56 72"/>
+  <vector name="CylRadius" value="399. 562. 762. 1000."/><!-- B0 405 to 399, E-mail Charles Evans 2018-08-10 -->
+  <vector name="TiltAngle" value="0.22689280 0.20943951 0.20943951 0.191986"/>
+    <!-- 13 12 12 11 degrees converted to radians, E-mail Ian Wilmut 2018-03-15 and Charles Evans (B0) 2018-08-10 -->
+  
+  <var name="CylEnvelopeThO" value="55."/> <!-- coreT/2 + EOS_T + rotation + spare ~ 3 + 5 + 24 + 10  currently 44-->
+
+
+  <var name="StaveGapZ0" value="0.1"/> <!-- each stave shifted this much at z = 0 -->
+
+  <var name="StaveSupportCylLength" value="2. * StaveCoreLength"/>
+  <var name="StaveHeightAboveCyl" value="21."/> <!-- Must not push top-hats inwards beyond inner radius of Strip env. UPDATE 05/02/2018: Parameter currently deprecated -->
+  <var name="StaveSupportCylThickness" value="0.6"/> <!-- Constant throughout the barrel layers -->
+  
+  <var name="StaveCylHatThickness" value="0.7"/>
+  <var name="StaveCylHatFootWidth" value="10."/>
+  <vector name="StaveCylHatWallHeight" value="14. 35. 35. 35."/> <!-- Top Hats not uniform between layers -->
+  <vector name="StaveCylHatTopWidth" value="8. 7. 7. 7."/>
+  <var name="NumberOfHatsPerCyl" value="9"/>
+  <vector name="StaveCylWallWidth" value="16. 16.5 16.5 16.5"/>
+  <var name="StaveCylHatGap" value="0.4"/><!-- Does this parameter exist? 21/02/2018: Currently does not-->
+
+  <vector name="BarrelRadius" value="347. 496. 685. 923."/> <!-- "347.6 502.4 702.9 923.9"/> From the INNER DIAMETER -->
+
+  <var name="InnerPolyModThickness" value="20."/>
+  <var name="InnerPolyModHalfLength" value="1150.0"/><!-- Was "StaveCoreLength - EOSCoreLength - 50.0" try 1150." -->
+
+  <var name="ZBraceLength" value="PolymoderatorOCInnerRadius - BarrelRadius_0 - 3."/> <!-- Drawing is 713.02 -->
+  <vector name="ZBraceWidth" value="33. 42."/> <!-- Total Width is 75, split into two pieces -->
+  <vector name="ZBraceThickness" value="8. 1."/>
+  <vector name="ZBraceTooth" value="18.98 128.5 145.5 98. 22.4"/>
+  <var name="ZBraceToothSpace" value="75."/>
+  <var name="NumberOfZBraces" value="4"/>
+
+  
+  <var name="FlangeFootLength" value="17.2"/>
+  <var name="FlangeThickness" value="2."/>
+  <vector name="FlangeHeight" value="20.4 35. 35. 35."/>
+  <var name="FlangeSubLength" value="20."/>
+  <var name="FlangeSlantLength" value="18."/>
+
+  <vector name="InterlinkSurfaceArea" value="5869.44 7844.48 7058.43 4477.66"/> 
+
+  <var name="InterlinkThickness" value="2."/>
+  <vector name="InterlinkFootHeight" value="11. 16. 16. 16."/>
+  <vector name="InterlinkFootWidth" value="49.94 54.8 58.46 56.08"/>
+  <vector name="InterlinkFootAngle" value="0.698132 0.837758 0.77230819 0.64786622"/>
+  <vector name="InterlinkBridgeLength" value="148.16 113.86 177.3 97.21"/>
+  <var name="InterlinkBridgeWidth" value="19."/>
+  <var name="InterlinkHatHeight" value="16."/> <!-- Barrel 4 interlink differs in hat parameters -->
+  <vector name="InterlinkHatWidth" value="54.27 78.59 57.32"/>
+  <vector name="InterlinkHatAngle" value="2.16421 2.09526777 2.197195 2.6267205"/>
+
+</defines>
+
+
+<!-- CNL_n meanings for barrel:
+
+    n    Meaning  Range
+===================================  
+    0    SCT         0
+    1    SCTBarrel   0
+    2    StripB      0
+    3    Cylinder    0 (! All cylinders are unique, never copied)
+    4    StavePair   0 - 72; depends on which barrel
+    5    Stave       0 - 1 
+    6    StaveFace   0 - 1 
+    7    Module      0 - 13
+    8    Sensor      0
+-->
+
+<shapes>
+  <tube name="shStripB_Cyl0" rmin="BarrelRadius_0 + EPS" rmax="BarrelRadius_0 + StaveSupportCylThickness - EPS" zhalflength="StaveSupportCylLength / 2.0"/>
+  <!-- For top-hats on inside of cylinder: -->
+  <tube name="shStaveCylHatFoot0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/>
+  <cons name="shStaveCylHatWall0" rmin1="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatWallHeight_0" rmax1="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_0" rmin2="BarrelRadius_0 + StaveSupportCylThickness" rmax2="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_0 / 2."/>
+  <tube name="shStaveCylHatTop0" rmin="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatWallHeight_0" rmax="BarrelRadius_0 + StaveSupportCylThickness + StaveCylHatWallHeight_0 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_0 / 2."/>
+
+  <tube name="shStripB_Cyl1" rmin="BarrelRadius_1" rmax="BarrelRadius_1 + StaveSupportCylThickness" zhalflength="StaveSupportCylLength / 2.0"/>
+  <tube name="shStaveCylHatFoot1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/>
+  <cons name="shStaveCylHatWall1" rmin1="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatWallHeight_1" rmax1="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_1" rmin2="BarrelRadius_1 + StaveSupportCylThickness" rmax2="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_1 / 2."/>
+  <tube name="shStaveCylHatTop1" rmin="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatWallHeight_1" rmax="BarrelRadius_1 + StaveSupportCylThickness + StaveCylHatWallHeight_1 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_1 / 2."/>
+
+  <tube name="shStripB_Cyl2" rmin="BarrelRadius_2" rmax="BarrelRadius_2 + StaveSupportCylThickness" zhalflength="StaveSupportCylLength / 2.0"/>
+  <tube name="shStaveCylHatFoot2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/>
+  <cons name="shStaveCylHatWall2" rmin1="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatWallHeight_2" rmax1="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_2" rmin2="BarrelRadius_2 + StaveSupportCylThickness" rmax2="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_2 / 2."/>
+  <tube name="shStaveCylHatTop2" rmin="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatWallHeight_2" rmax="BarrelRadius_2 + StaveSupportCylThickness + StaveCylHatWallHeight_2 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_2 / 2."/>
+
+  <tube name="shStripB_Cyl3" rmin="BarrelRadius_3" rmax="BarrelRadius_3 + StaveSupportCylThickness" zhalflength="StaveSupportCylLength / 2.0"/>
+  <tube name="shStaveCylHatFoot3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatThickness" zhalflength="StaveCylHatFootWidth / 2."/>
+  <cons name="shStaveCylHatWall3" rmin1="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatWallHeight_3" rmax1="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatThickness + StaveCylHatWallHeight_3" rmin2="BarrelRadius_3 + StaveSupportCylThickness" rmax2="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatThickness" sphi="0." dphi="2*PI" dz="StaveCylWallWidth_0 / 2."/>
+  <tube name="shStaveCylHatTop3" rmin="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatWallHeight_3" rmax="BarrelRadius_3 + StaveSupportCylThickness + StaveCylHatWallHeight_3 + StaveCylHatThickness" zhalflength="StaveCylHatTopWidth_3 / 2."/>
+
+  <tube name="shFlangeWall0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0" zhalflength="FlangeThickness"/>
+  <cons name="shFlangeWallSlant0" rmin1="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0 - FlangeThickness" rmax1="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0" rmin2="BarrelRadius_0 + StaveSupportCylThickness" rmax2="BarrelRadius_0 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/>
+  <tube name="shFlangeFoot0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/>
+  <tube name="shFlangeHat0" rmin="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0 - FlangeThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeHeight_0 - EPS" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/>
+  <tube name="shFlangeFloor0" rmin="BarrelRadius_0 + StaveSupportCylThickness" rmax="BarrelRadius_0 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/>
+
+  <tube name="shFlangeWall1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1" zhalflength="FlangeThickness"/>
+  <cons name="shFlangeWallSlant1" rmin1="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1 - FlangeThickness" rmax1="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1" rmin2="BarrelRadius_1 + StaveSupportCylThickness" rmax2="BarrelRadius_1 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/>
+  <tube name="shFlangeFoot1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/>
+  <tube name="shFlangeHat1" rmin="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1 - FlangeThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeHeight_1" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/>
+  <tube name="shFlangeFloor1" rmin="BarrelRadius_1 + StaveSupportCylThickness" rmax="BarrelRadius_1 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/>
+
+  <tube name="shFlangeWall2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2" zhalflength="FlangeThickness"/>
+  <cons name="shFlangeWallSlant2" rmin1="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2 - FlangeThickness" rmax1="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2" rmin2="BarrelRadius_2 + StaveSupportCylThickness" rmax2="BarrelRadius_2 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/>
+  <tube name="shFlangeFoot2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/>
+  <tube name="shFlangeHat2" rmin="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2 - FlangeThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeHeight_2" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/>
+  <tube name="shFlangeFloor2" rmin="BarrelRadius_2 + StaveSupportCylThickness" rmax="BarrelRadius_2 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/>                                  
+
+  <tube name="shFlangeWall3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3" zhalflength="FlangeThickness"/>
+  <cons name="shFlangeWallSlant3" rmin1="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3 - FlangeThickness" rmax1="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3" rmin2="BarrelRadius_3 + StaveSupportCylThickness" rmax2="BarrelRadius_3 + StaveSupportCylThickness + FlangeThickness" sphi="0." dphi="2*PI" dz="FlangeSlantLength / 2."/>
+  <tube name="shFlangeFoot3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeFootLength / 2. - FlangeThickness"/>
+  <tube name="shFlangeHat3" rmin="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3 - FlangeThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeHeight_3" zhalflength="FlangeSubLength / 2. - FlangeThickness / 2."/>
+  <tube name="shFlangeFloor3" rmin="BarrelRadius_3 + StaveSupportCylThickness" rmax="BarrelRadius_3 + StaveSupportCylThickness + FlangeThickness" zhalflength="FlangeSubLength / 2."/>
+
+  <!-- Capital i for Inner, capital o for outer -->
+  <box name="shZBraceSpineI" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceLength / 2." zhalflength="ZBraceWidth_0 / 2."/>
+                                  
+  <box name="shZBraceTeeth0I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_0 / 2." zhalflength="ZBraceWidth_1 / 2."/> 
+                                  
+  <box name="shZBraceTeeth1I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_1 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <box name="shZBraceTeeth2I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_2 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <box name="shZBraceTeeth3I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_3 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <box name="shZBraceTeeth4I" xhalflength="ZBraceThickness_0 / 2." yhalflength="ZBraceTooth_4 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <tube name="TestCircle" rmin="0." rmax="10." zhalflength="20."/>
+
+  <!-- Adding teeth one at a time-->
+  <union name="shZBrace1TeethI">
+    <shaperef ref="shZBraceSpineI"/>
+    <transformation name="PlaceZBraceTooth0dI">
+      <translation y="ZBraceLength / 2. - ZBraceTooth_0 / 2."/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth0I"/>
+  </union>
+
+  <union name="shZBrace2TeethI">
+    <shaperef ref="shZBrace1TeethI"/>
+    <transformation name="PlaceZBraceTooth1dI">
+      <translation y="ZBraceLength / 2. - ZBraceTooth_0 - ZBraceToothSpace - ZBraceTooth_1 / 2."/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth1I"/>
+  </union>
+
+  <union name="shZBrace3TeethI">
+    <shaperef ref="shZBrace2TeethI"/>
+    <transformation name="PlaceZBraceTooth2dI">
+      <translation y="ZBraceLength / 2. - ZBraceTooth_0  - ZBraceToothSpace - ZBraceTooth_1 - ZBraceToothSpace - ZBraceTooth_2 / 2."/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth2I"/>
+  </union>
+
+  <union name="shZBrace4TeethI">
+    <shaperef ref="shZBrace3TeethI"/>
+    <transformation name="PlaceZBraceTooth3dI">
+      <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 - ZBraceToothSpace - ZBraceTooth_3 / 2.)"/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth3I"/>
+  </union>
+
+  <union name="shZBrace5TeethI">
+    <shaperef ref="shZBrace4TeethI"/>
+    <transformation name="PlaceZBraceTooth4dI">
+      <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 / 2.)"/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth4I"/>
+  </union>
+
+
+
+  <box name="shZBraceSpineO" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceLength / 2." zhalflength="ZBraceWidth_0 / 2."/>
+                                  
+  <box name="shZBraceTeeth0O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_0 / 2." zhalflength="ZBraceWidth_1 / 2."/> 
+                                  
+  <box name="shZBraceTeeth1O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_1 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <box name="shZBraceTeeth2O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_2 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <box name="shZBraceTeeth3O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_3 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <box name="shZBraceTeeth4O" xhalflength="ZBraceThickness_1 / 2." yhalflength="ZBraceTooth_4 / 2." zhalflength="ZBraceWidth_1 / 2."/>
+
+  <union name="shZBrace1TeethO">
+    <shaperef ref="shZBraceSpineO"/>
+    <transformation name="PlaceZBraceTooth0dO">
+      <translation y="ZBraceLength / 2. - ZBraceTooth_0 / 2."/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth0O"/>
+  </union>
+
+  <union name="shZBrace2TeethO">
+    <shaperef ref="shZBrace1TeethO"/>
+    <transformation name="PlaceZBraceTooth1dO">
+      <translation y="ZBraceLength / 2. - ZBraceTooth_0 - ZBraceToothSpace - ZBraceTooth_1 / 2."/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth1O"/>
+  </union>
+
+  <union name="shZBrace3TeethO">
+    <shaperef ref="shZBrace2TeethO"/>
+    <transformation name="PlaceZBraceTooth2dO">
+      <translation y="ZBraceLength / 2. - ZBraceTooth_0 - ZBraceToothSpace - ZBraceTooth_1 - ZBraceToothSpace - ZBraceTooth_2 / 2."/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth2O"/>
+  </union>
+
+  <union name="shZBrace4TeethO">
+    <shaperef ref="shZBrace3TeethO"/>
+    <transformation name="PlaceZBraceTooth3dO">
+      <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 - ZBraceToothSpace - ZBraceTooth_3 / 2.)"/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth3O"/>
+  </union>
+
+  <union name="shZBrace5TeethO">
+    <shaperef ref="shZBrace4TeethO"/>
+    <transformation name="PlaceZBraceTooth4dO">
+      <translation y="-(ZBraceLength / 2. - ZBraceTooth_4 / 2.)"/>
+      <translation z="-(ZBraceWidth_0 / 2. + ZBraceWidth_1 / 2.)"/>
+    </transformation>
+    <shaperef ref="shZBraceTeeth4O"/>
+  </union>
+
+
+  <trap name="shInterlinkCuboid0" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_0 / ( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0) / sin( InterlinkFootAngle_0) ) ) / 2." dxdyndzn="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." dxdypdzn="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." angleydzn="InterlinkFootAngle_0" dydzp="(InterlinkSurfaceArea_0 / ( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) ) / 2." dxdyndzp="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." dxdypdzp="( (BarrelRadius_1 - BarrelRadius_0 - FlangeHeight_0 / 2.) / sin( InterlinkFootAngle_0) ) / 2." angleydzp="InterlinkFootAngle_0"/>
+
+  <trap name="shInterlinkCuboid1" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_1 / ( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) ) / 2." dxdyndzn="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." dxdypdzn="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." angleydzn="InterlinkFootAngle_1" dydzp="(InterlinkSurfaceArea_1 / ( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) ) / 2." dxdyndzp="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." dxdypdzp="( (BarrelRadius_2 - BarrelRadius_1 - FlangeHeight_1 / 4.) / sin( InterlinkFootAngle_1) ) / 2." angleydzp="InterlinkFootAngle_1"/>
+
+  <trap name="shInterlinkCuboid2" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_2 / ( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) ) / 2." dxdyndzn="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." dxdypdzn="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." angleydzn="InterlinkFootAngle_2" dydzp="(InterlinkSurfaceArea_2 / ( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) ) / 2." dxdyndzp="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." dxdypdzp="( (BarrelRadius_3 - BarrelRadius_2 - FlangeHeight_2 / 2.) / sin( InterlinkFootAngle_2) ) / 2." angleydzp="InterlinkFootAngle_2"/>
+
+  <trap name="shInterlinkCuboid3" zhalflength="InterlinkThickness / 2." theta="0." phi="0." dydzn="(InterlinkSurfaceArea_3 / ( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) ) / 2." dxdyndzn="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." dxdypdzn="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." angleydzn="InterlinkFootAngle_3" dydzp="(InterlinkSurfaceArea_3 / ( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) ) / 2." dxdyndzp="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." dxdypdzp="( (PolymoderatorOCInnerRadius - BarrelRadius_3 - 1.5 * FlangeHeight_3) / sin( InterlinkFootAngle_3) ) / 2." angleydzp="InterlinkFootAngle_3"/>
+
+
+</shapes>
+
+<logvol name="StaveCylHatFoot0" shape="shStaveCylHatFoot0" material="CFRP"/>
+<logvol name="StaveCylHatWall0" shape="shStaveCylHatWall0" material="CFRP"/>
+<logvol name="StaveCylHatTop0" shape="shStaveCylHatTop0" material="CFRP"/>
+
+<logvol name="StaveCylHatFoot1" shape="shStaveCylHatFoot1" material="CFRP"/>
+<logvol name="StaveCylHatWall1" shape="shStaveCylHatWall1" material="CFRP"/>
+<logvol name="StaveCylHatTop1" shape="shStaveCylHatTop1" material="CFRP"/>
+
+<logvol name="StaveCylHatFoot2" shape="shStaveCylHatFoot2" material="CFRP"/>
+<logvol name="StaveCylHatWall2" shape="shStaveCylHatWall2" material="CFRP"/>
+<logvol name="StaveCylHatTop2" shape="shStaveCylHatTop2" material="CFRP"/>
+
+<logvol name="StaveCylHatFoot3" shape="shStaveCylHatFoot3" material="CFRP"/>
+<logvol name="StaveCylHatWall3" shape="shStaveCylHatWall3" material="CFRP"/>
+<logvol name="StaveCylHatTop3" shape="shStaveCylHatTop3" material="CFRP"/>
+
+<logvol name="ZBraceI" shape="shZBrace5TeethI" material="Honeycomb2pcf"/><!-- Not totally accurate, density is about 0.038 not 0.032 -->
+<logvol name="ZBraceO" shape="shZBrace5TeethO" material="CFRP"/>
+
+<logvol name="FlangeFoot0" shape="shFlangeFoot0" material="CFRP"/>
+<logvol name="FlangeHat0" shape="shFlangeHat0" material="CFRP"/>
+<logvol name="FlangeFloor0" shape="shFlangeFloor0" material="CFRP"/>
+<logvol name="FlangeWall0" shape="shFlangeWall0" material="CFRP"/>
+<logvol name="FlangeWallSlant0" shape="shFlangeWallSlant0" material="CFRP"/>
+
+<logvol name="FlangeFoot1" shape="shFlangeFoot1" material="CFRP"/>
+<logvol name="FlangeHat1" shape="shFlangeHat1" material="CFRP"/>
+<logvol name="FlangeFloor1" shape="shFlangeFloor1" material="CFRP"/>
+<logvol name="FlangeWall1" shape="shFlangeWall1" material="CFRP"/>
+<logvol name="FlangeWallSlant1" shape="shFlangeWallSlant1" material="CFRP"/>
+
+<logvol name="FlangeFoot2" shape="shFlangeFoot2" material="CFRP"/>
+<logvol name="FlangeHat2" shape="shFlangeHat2" material="CFRP"/>
+<logvol name="FlangeFloor2" shape="shFlangeFloor2" material="CFRP"/>
+<logvol name="FlangeWall2" shape="shFlangeWall2" material="CFRP"/>
+<logvol name="FlangeWallSlant2" shape="shFlangeWallSlant2" material="CFRP"/>
+
+<logvol name="FlangeFoot3" shape="shFlangeFoot3" material="CFRP"/>
+<logvol name="FlangeHat3" shape="shFlangeHat3" material="CFRP"/>
+<logvol name="FlangeFloor3" shape="shFlangeFloor3" material="CFRP"/>
+<logvol name="FlangeWall3" shape="shFlangeWall3" material="CFRP"/>
+<logvol name="FlangeWallSlant3" shape="shFlangeWallSlant3" material="CFRP"/>
+
+<logvol name="Interlink0" shape="shInterlinkCuboid0" material="CFRP"/>
+<logvol name="Interlink1" shape="shInterlinkCuboid1" material="CFRP"/>
+<logvol name="Interlink2" shape="shInterlinkCuboid2" material="CFRP"/>
+<logvol name="Interlink3" shape="shInterlinkCuboid3" material="CFRP"/>
+ 
+
+
+<assembly name="Flange0">
+  <logvolref ref="FlangeWall0"/>
+
+  <transform name="PutFlangeFoot0">
+    <transformation name="PlaceFlangeFoot0">
+      <translation z="FlangeFootLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFoot0"/>
+  </transform>
+
+  <transform name="PutFlangeHat0">
+    <transformation name="PlaceFlangeHat0">
+      <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/>
+    </transformation>
+  <logvolref ref="FlangeHat0"/>
+  </transform>
+
+  <transform name="PutFlangeSlant0">
+    <transformation name="PlaceFlangeSlant0">
+      <translation z="FlangeSubLength + FlangeSlantLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeWallSlant0"/>
+  </transform>
+
+  <transform name="PutFlangeFloor0">
+    <transformation name="PlaceFlangeFloor0">
+      <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFloor0"/>
+  </transform>
+</assembly>
+
+<assembly name="Flange1">
+  <logvolref ref="FlangeWall1"/>
+
+  <transform name="PutFlangeFoot1">
+    <transformation name="PlaceFlangeFoot1">
+      <translation z="FlangeFootLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFoot1"/>
+  </transform>
+
+  <transform name="PutFlangeHat1">
+    <transformation name="PlaceFlangeHat1">
+      <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/>
+    </transformation>
+  <logvolref ref="FlangeHat1"/>
+  </transform>
+
+  <transform name="PutFlangeSlant1">
+    <transformation name="PlaceFlangeSlant1">
+      <translation z="FlangeSubLength + FlangeSlantLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeWallSlant1"/>
+  </transform>
+
+  <transform name="PutFlangeFloor1">
+    <transformation name="PlaceFlangeFloor1">
+      <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFloor1"/>
+  </transform>
+</assembly>
+
+<assembly name="Flange2">
+  <logvolref ref="FlangeWall2"/>
+
+  <transform name="PutFlangeFoot2">
+    <transformation name="PlaceFlangeFoot2">
+      <translation z="FlangeFootLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFoot2"/>
+  </transform>
+
+  <transform name="PutFlangeHat2">
+    <transformation name="PlaceFlangeHat2">
+      <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/>
+    </transformation>
+  <logvolref ref="FlangeHat2"/>
+  </transform>
+
+  <transform name="PutFlangeSlant2">
+    <transformation name="PlaceFlangeSlant2">
+      <translation z="FlangeSubLength + FlangeSlantLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeWallSlant2"/>
+  </transform>
+
+  <transform name="PutFlangeFloor2">
+    <transformation name="PlaceFlangeFloor2">
+      <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFloor2"/>
+  </transform>
+</assembly>
+
+<assembly name="Flange3">
+  <logvolref ref="FlangeWall3"/>
+
+  <transform name="PutFlangeFoot3">
+    <transformation name="PlaceFlangeFoot3">
+      <translation z="FlangeFootLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFoot3"/>
+  </transform>
+
+  <transform name="PutFlangeHat3">
+    <transformation name="PlaceFlangeHat3">
+      <translation z="FlangeSubLength / 2. + FlangeThickness / 2."/>
+    </transformation>
+  <logvolref ref="FlangeHat3"/>
+  </transform>
+
+  <transform name="PutFlangeSlant3">
+    <transformation name="PlaceFlangeSlant3">
+      <translation z="FlangeSubLength + FlangeSlantLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeWallSlant3"/>
+  </transform>
+
+  <transform name="PutFlangeFloor3">
+    <transformation name="PlaceFlangeFloor3">
+      <translation z="FlangeSubLength + FlangeSlantLength + FlangeSubLength / 2."/>
+    </transformation>
+  <logvolref ref="FlangeFloor3"/>
+  </transform>
+</assembly>
+
+<assembly name="ZBrace"> <!-- Single ZBrace panel, shifted upwards -->
+  <transform name="ShiftedZBrace">
+    <transformation name="ShiftZBraceUp">
+      <translation y="BarrelRadius_0 + ZBraceLength / 2."/>
+    </transformation>
+  <logvolref ref="ZBraceI"/>
+  </transform>
+
+  <transform name="ZBraceL">
+    <transformation name="PutZBraceL">
+      <translation x="ZBraceThickness_0 / 2. + ZBraceThickness_1 / 2."/>
+      <translation y="BarrelRadius_0 + ZBraceLength / 2."/>
+    </transformation>
+  <logvolref ref="ZBraceO"/>
+  </transform>
+
+  <transform name="ZBraceR">
+    <transformation name="PutZBraceR">
+      <translation x="-(ZBraceThickness_0 / 2. + ZBraceThickness_1 / 2.)"/>
+      <translation y="BarrelRadius_0 + ZBraceLength / 2."/>
+    </transformation>
+  <logvolref ref="ZBraceO"/>
+  </transform>
+</assembly>
+
+<assembly name="ZBraceCap"> <!-- Multicopied, to be placed -->
+  <multicopy name="PlaceZBraces" n="NumberOfZBraces">
+    <transformation name="RotateZBraces">
+	<rotation zcos="1." angle="2*PI / NumberOfZBraces"/>
+    </transformation>
+    <assemblyref ref="ZBrace"/>
+  </multicopy>
+</assembly>
+
+<assembly name="TempInterlink0">
+  <transform>
+    <transformation name="PlaceInterlinkTest0Pos">
+      <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/>
+      <translation x="BarrelRadius_0 + ( (BarrelRadius_1 - BarrelRadius_0) / 2. + FlangeHeight_0 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_0"/>
+    </transformation>
+    <logvolref ref="Interlink0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceInterlinkTest0Neg">
+      <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/>
+      <translation x="BarrelRadius_0 + ( (BarrelRadius_1 - BarrelRadius_0) / 2. + FlangeHeight_0 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_0"/>
+    </transformation>
+    <logvolref ref="Interlink0"/>
+  </transform>
+</assembly>
+
+<assembly name="TempInterlink1">
+  <transform>
+    <transformation name="PlaceInterlinkTest1Pos">
+      <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/>
+      <translation x="BarrelRadius_1 + ( (BarrelRadius_2 - BarrelRadius_1) / 2. + FlangeHeight_1 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_1"/>
+    </transformation>
+    <logvolref ref="Interlink1"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceInterlinkTest1Neg">
+      <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/>
+      <translation x="BarrelRadius_1 + ( (BarrelRadius_2 - BarrelRadius_1) / 2. + FlangeHeight_1 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_1"/>
+    </transformation>
+    <logvolref ref="Interlink1"/>
+  </transform>
+</assembly>
+
+<assembly name="TempInterlink2">
+  <transform>
+    <transformation name="PlaceInterlinkTest2Pos">
+      <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/>
+      <translation x="BarrelRadius_2 + ( (BarrelRadius_3 - BarrelRadius_2) / 2. + FlangeHeight_2 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_2"/>
+    </transformation>
+    <logvolref ref="Interlink2"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceInterlinkTest2Neg">
+      <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/>
+      <translation x="BarrelRadius_2 + ( (BarrelRadius_3 - BarrelRadius_2) / 2. + FlangeHeight_2 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_2"/>
+    </transformation>
+    <logvolref ref="Interlink2"/>
+  </transform>
+</assembly>
+
+<assembly name="TempInterlink3">
+  <transform>
+    <transformation name="PlaceInterlinkTest3Pos">
+      <translation z="StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1"/>
+      <translation x="BarrelRadius_3 + ( (PolymoderatorOCInnerRadius - BarrelRadius_3) / 2. + FlangeHeight_3 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_3"/>
+    </transformation>
+    <logvolref ref="Interlink3"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceInterlinkTest3Neg">
+      <translation z="-(StaveSupportCylLength / 2. + InterlinkThickness / 2. + 1)"/>
+      <translation x="BarrelRadius_3 + ( (PolymoderatorOCInnerRadius - BarrelRadius_3) / 2. + FlangeHeight_3 / 4.)"/>
+      <rotation zcos="1." angle="InterlinkFootAngle_3"/>
+    </transformation>
+    <logvolref ref="Interlink3"/>
+  </transform>
+</assembly>
+
+<assembly name="StaveCylHat0">
+  <logvolref ref="StaveCylHatTop0"/>
+
+  <transform>
+    <transformation name="PlaceStaveCylHatWall0Low">
+        <translation z="-(StaveCylHatTopWidth_0 / 2. + StaveCylWallWidth_0 / 2.)"/>
+        <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall0"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatWall0High">
+        <translation z="StaveCylHatTopWidth_0 / 2. + StaveCylWallWidth_0 / 2."/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall0"/>
+  </transform> 
+
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot0Low">
+        <translation z="-(StaveCylHatTopWidth_0 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_0)"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot0"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot0High">
+        <translation z="StaveCylHatTopWidth_0 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_0"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot0"/>
+  </transform> 
+</assembly>
+
+<assembly name="StaveCylHat1">
+  <logvolref ref="StaveCylHatTop1"/>
+
+  <transform>
+    <transformation name="PlaceStaveCylHatWall1Low">
+        <translation z="-(StaveCylHatTopWidth_1 / 2. + StaveCylWallWidth_1 / 2.)"/>
+        <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall1"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatWall1High">
+        <translation z="StaveCylHatTopWidth_1 / 2. + StaveCylWallWidth_1 / 2."/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall1"/>
+  </transform> 
+
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot1Low">
+        <translation z="-(StaveCylHatTopWidth_1 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_1)"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot1"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot1High">
+        <translation z="StaveCylHatTopWidth_1 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_1"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot1"/>
+  </transform> 
+</assembly>
+
+<assembly name="StaveCylHat2">
+  <logvolref ref="StaveCylHatTop2"/>
+
+  <transform>
+    <transformation name="PlaceStaveCylHatWall2Low">
+        <translation z="-(StaveCylHatTopWidth_2 / 2. + StaveCylWallWidth_2 / 2.)"/>
+        <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall2"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatWall2High">
+        <translation z="StaveCylHatTopWidth_2 / 2. + StaveCylWallWidth_2 / 2."/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall2"/>
+  </transform> 
+
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot2Low">
+        <translation z="-(StaveCylHatTopWidth_2 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_2)"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot2"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot2High">
+        <translation z="StaveCylHatTopWidth_2 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_2"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot2"/>
+  </transform> 
+</assembly>
+
+<assembly name="StaveCylHat3">
+  <logvolref ref="StaveCylHatTop3"/>
+
+  <transform>
+    <transformation name="PlaceStaveCylHatWall3Low">
+        <translation z="-(StaveCylHatTopWidth_3 / 2. + StaveCylWallWidth_3 / 2.)"/>
+        <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall3"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatWall3High">
+        <translation z="StaveCylHatTopWidth_3 / 2. + StaveCylWallWidth_3 / 2."/>
+    </transformation>
+    <logvolref ref="StaveCylHatWall3"/>
+  </transform> 
+
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot3Low">
+        <translation z="-(StaveCylHatTopWidth_3 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_3)"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot3"/>
+  </transform> 
+  <transform>
+    <transformation name="PlaceStaveCylHatFoot3High">
+        <translation z="StaveCylHatTopWidth_3 / 2. +  StaveCylHatFootWidth / 2. + StaveCylWallWidth_3"/>
+    </transformation>
+    <logvolref ref="StaveCylHatFoot3"/>
+  </transform> 
+</assembly>
+
+<assembly name="Barrel0Support">
+  <logvol name="StripB_Cyl0" shape="shStripB_Cyl0" material="CFRP"/>
+
+  <multicopy name="PlaceHatsCyl0" n="NumberOfHatsPerCyl">
+    <transformation name="TranslateHatsCyl0">
+      <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceTopHatAtLowEnd0">
+        <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+      </transformation>
+      <assemblyref ref="StaveCylHat0"/>
+    </transform>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceFlangeAtPosEnd0">
+      <translation z="StaveSupportCylLength / 2. - FlangeThickness"/>
+      <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <assemblyref ref="Flange0"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFlangeAtNegEnd0">
+      <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/>
+    </transformation>
+    <assemblyref ref="Flange0"/>
+  </transform>
+
+</assembly>
+
+<assembly name="Barrel1Support">
+  <logvol name="StripB_Cyl1" shape="shStripB_Cyl1" material="CFRP"/>
+
+  <multicopy name="PlaceHatsCyl1" n="NumberOfHatsPerCyl">
+    <transformation name="TranslateHatsCyl1">
+      <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceTopHatAtLowEnd1">
+        <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+      </transformation>
+      <assemblyref ref="StaveCylHat1"/>
+    </transform>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceFlangeAtPosEnd1">
+      <translation z="StaveSupportCylLength / 2. - FlangeThickness"/>
+      <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <assemblyref ref="Flange1"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFlangeAtNegEnd1">
+      <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/>
+    </transformation>
+    <assemblyref ref="Flange1"/>
+  </transform>
+
+</assembly>
+
+<assembly name="Barrel2Support">
+  <logvol name="StripB_Cyl2" shape="shStripB_Cyl2" material="CFRP"/>
+
+  <multicopy name="PlaceHatsCyl2" n="NumberOfHatsPerCyl">
+    <transformation name="TranslateHatsCyl2">
+      <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceTopHatAtLowEnd2">
+        <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+      </transformation>
+      <assemblyref ref="StaveCylHat2"/>
+    </transform>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceFlangeAtPosEnd2">
+      <translation z="StaveSupportCylLength / 2. - FlangeThickness"/>
+      <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <assemblyref ref="Flange2"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFlangeAtNegEnd2">
+      <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/>
+    </transformation>
+    <assemblyref ref="Flange2"/>
+  </transform>
+
+
+</assembly>
+
+<assembly name="Barrel3Support">
+  <logvol name="StripB_Cyl3" shape="shStripB_Cyl3" material="CFRP"/>
+
+  <multicopy name="PlaceHatsCyl3" n="NumberOfHatsPerCyl">
+    <transformation name="TranslateHatsCyl3">
+      <translation z="StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceTopHatAtLowEnd3">
+        <translation z="-StaveSupportCylLength / 2. + StaveSupportCylLength / (NumberOfHatsPerCyl + 1)"/>
+      </transformation>
+      <assemblyref ref="StaveCylHat3"/>
+    </transform>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceFlangeAtPosEnd3">
+      <translation z="StaveSupportCylLength / 2. - FlangeThickness"/>
+      <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <assemblyref ref="Flange3"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFlangeAtNegEnd3">
+      <translation z="-(StaveSupportCylLength / 2. - FlangeThickness)"/>
+    </transformation>
+    <assemblyref ref="Flange3"/>
+  </transform>
+
+
+</assembly>
+
+<!-- To be included in Barrel.gmx. Builds up the SS and MS staves cores (including bus tape copper) -->
+
+<shapes>
+  <box name="shStaveCoreMain" xhalflength="StaveCoreLength/2" yhalflength="StaveCoreWidth/2" zhalflength="StaveCoreT/2 - EPS"/>
+  <box name="shEOSCore" xhalflength="EOSCoreLength/2" yhalflength="EOSCoreWidth/2" zhalflength="EOSCoreT/2 - EPS"/>
+  <union name="shStaveCore">
+    <shaperef ref="shStaveCoreMain"/>
+    <transformation name="MoveEOS_ToCore">
+      <translation x="(StaveCoreLength - EOSCoreLength)/2" y="(StaveCoreWidth + EOSCoreWidth)/2"/>
+    </transformation>
+    <shaperef ref="shEOSCore"/>
+  </union>
+
+  <box name="shStaveFacesheet" xhalflength="StaveCoreLength/2 - EPS" yhalflength="StaveCoreWidth/2 - EPS" zhalflength="StaveFacesheetT/2 - EPS"/> 
+  <box name="shEOS_Facesheet" xhalflength="EOSCoreLength/2 - EPS" yhalflength="EOSCoreWidth/2 - EPS" zhalflength="StaveFacesheetT/2 - EPS"/>
+  <union name="shStaveFacesheetAll">
+    <shaperef ref="shStaveFacesheet"/>
+    <transformation name="MoveEOS_Facesheet">
+      <translation x="(StaveCoreLength - EOSCoreLength)/2" y="(StaveCoreWidth + EOSCoreWidth)/2"/>
+    </transformation>
+    <shaperef ref="shEOS_Facesheet"/>
+  </union>
+
+  <box name="shStaveCloseoutLong" xhalflength="StaveCloseoutLongL/2 - EPS" yhalflength="StaveCloseoutLongT/2" zhalflength="StaveCloseoutLongW/2 - EPS"/>
+
+  <box name="shStaveCloseoutLongEOS" xhalflength="StaveCloseoutLongEOS_L/2 - EPS" yhalflength="StaveCloseoutLongT/2" zhalflength="StaveCloseoutLongW/2 - EPS"/>
+
+  <box name="shStaveCloseoutFarEnd" xhalflength="StaveCloseoutFarEndW/2" yhalflength="StaveCloseoutFarEndL/2" zhalflength="StaveCloseoutFarEndT/2 - EPS"/>
+
+  <box name="shStaveCloseoutEOS_End" xhalflength="StaveCloseoutEOS_EndW/2" yhalflength="StaveCloseoutEOS_EndL/2" zhalflength="StaveCloseoutEOS_EndT/2 - EPS"/>
+
+  <tube name="shStaveMount" rmin="0.0" rmax="StaveMountR - EPS" zhalflength="StaveMountL/2"/>
+
+  <trap name="shStaveMountC" zhalflength="StaveMountLength_0 / 2." theta="atan( (tan(TiltAngle_3) ) / 2.)" phi="PI / 2." dydzn="StaveMountHeight_0 / 2." dxdyndzn="StaveMountThickness_0 / 2." dxdypdzn="StaveMountThickness_0 / 2." angleydzn="0." dydzp="(StaveMountHeight_0 + (tan(TiltAngle_3) * StaveMountLength_0)) / 2." dxdyndzp="StaveMountThickness_0 / 2." dxdypdzp="StaveMountThickness_0 / 2." angleydzp="0."/>
+
+  <trap name="shStaveMountI" zhalflength="StaveMountLength_1 / 2." theta="atan( (tan(TiltAngle_3) ) / 2.)" phi="PI / 2." dydzn="StaveMountHeight_1 / 2." dxdyndzn="StaveMountThickness_1 / 2." dxdypdzn="StaveMountThickness_1 / 2." angleydzn="0." dydzp="(StaveMountHeight_1 + (tan(TiltAngle_3) * StaveMountLength_1)) / 2." dxdyndzp="StaveMountThickness_1 / 2." dxdypdzp="StaveMountThickness_1 / 2." angleydzp="0."/>
+
+
+  <trap name="shStaveMountE" zhalflength="StaveMountLength_2 / 2." theta="atan( (tan(TiltAngle_3) ) / 2.)" phi="PI / 2." dydzn="StaveMountHeight_2 / 2." dxdyndzn="StaveMountThickness_2 / 2." dxdypdzn="StaveMountThickness_2 / 2." angleydzn="0." dydzp="(StaveMountHeight_2 + (tan(TiltAngle_3) * StaveMountLength_2)) / 2." dxdyndzp="StaveMountThickness_2 / 2." dxdypdzp="StaveMountThickness_2 / 2." angleydzp="0."/>
+
+  <box name="shStaveBusKapton" xhalflength="StaveCoreLength/2 - EPS" yhalflength="StaveCoreWidth/2 - EPS" zhalflength="StaveBusKaptonT/2 - EPS"/> 
+  <box name="shStaveBusGlue" xhalflength="StaveCoreLength/2 - EPS" yhalflength="StaveCoreWidth/2 - EPS" zhalflength="StaveBusGlueT/2 - EPS"/> 
+
+  <box name="shStaveGroundEOS_Cu" xhalflength="StaveGroundEOS_W/2" yhalflength="StaveGroundEOS_L/2" zhalflength="StaveBusCuT/2 - EPS"/> 
+  <box name="shStaveGroundPowerCu" xhalflength="StaveGroundPowerL/2" yhalflength="StaveGroundPowerW/2" zhalflength="StaveBusCuT/2 - EPS"/> 
+  <box name="shStaveGroundSignalCu" xhalflength="StaveGroundSignalL/2" yhalflength=" StaveGroundSignalW/2" zhalflength="StaveBusCuT/2 - EPS"/>
+  <union name="shStaveGroundU1">
+    <shaperef ref="shStaveGroundSignalCu"/>
+    <transformation name="AddPowerCu">
+      <translation y="-(StaveGroundEOS_L + (StaveGroundEOS_FromTop - StaveGroundSignalFromTop) -                        (StaveGroundSignalW + StaveGroundPowerW)/2)"/>
+    </transformation>
+    <shaperef ref="shStaveGroundPowerCu"/>
+  </union>
+  <union name="shStaveGround">
+    <shaperef ref="shStaveGroundU1"/>
+    <transformation name="AddEOS_Cu">
+      <translation x="(StaveGroundSignalL + StaveGroundEOS_W)/2" y="-((StaveGroundEOS_L - StaveGroundSignalW)/2 + (StaveGroundEOS_FromTop - StaveGroundSignalFromTop))"/>
+    </transformation>
+    <shaperef ref="shStaveGroundEOS_Cu"/>
+  </union>
+
+  <box name="shStaveSignalEOS_Cu" xhalflength="StaveSignalEOS_W/2" yhalflength="StaveSignalEOS_L/2" zhalflength="StaveBusCuT/2 - EPS"/> 
+  <box name="shStaveSignalPowerCu" xhalflength="StaveSignalPowerL/2" yhalflength="StaveSignalPowerW/2" zhalflength="StaveBusCuT/2 - EPS"/>
+  <!-- Trap has to be made with z in length direction; thickness is y direction; width changes in x direction -->  
+  <trd name="shStaveSignalSSSignalCu" xhalflength1="StaveSignalSSSignalBigW/2" xhalflength2="StaveSignalSSSignalSmallW/2" yhalflength1="StaveBusCuT/2" yhalflength2="StaveBusCuT/2" zhalflength="StaveSignalSignalL/2"/>
+  <trd name="shStaveSignalMSSignalCu" xhalflength1="StaveSignalMSSignalBigW/2" xhalflength2="StaveSignalMSSignalSmallW/2" yhalflength1="StaveBusCuT/2" yhalflength2="StaveBusCuT/2" zhalflength="StaveSignalSignalL/2"/>
+  <union name="shStaveSignalU1">
+    <shaperef ref="shStaveSignalEOS_Cu"/>
+    <transformation name="AddSignalPowerCu">
+      <translation x="-(StaveSignalEOS_W/2 + StaveSignalPowerL/2)" y="-(StaveSignalEOS_L/2 - StaveSignalPowerW/2)"/>
+    </transformation>
+    <shaperef ref="shStaveSignalPowerCu"/>
+  </union>
+  <union name="shStaveSignalSS">
+    <shaperef ref="shStaveSignalU1"/>
+    <transformation name="AddSignalSS_SignalCu">
+      <translation x="-(StaveSignalEOS_W/2 + StaveSignalSignalL/2)" y="B_SensorWidth/2 - StaveSignalSSSignalBigW/2 -                       ((StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop)"/> <!-- Leave all copper below Si sensor -->
+      <rotation ycos="1" angle="-PI/2"/>
+      <rotation zcos="1" angle="PI/2"/>
+    </transformation>
+    <shaperef ref="shStaveSignalSSSignalCu"/>
+  </union>
+  <union name="shStaveSignalMS">
+    <shaperef ref="shStaveSignalU1"/>
+    <transformation name="AddSignalMS_SignalCu">
+      <translation x="-(StaveSignalEOS_W/2 + StaveSignalSignalL/2)" y="B_SensorWidth/2 - StaveSignalSSSignalBigW/2 -                       ((StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop)"/> <!-- Leave all copper below Si sensor -->
+      <rotation ycos="1" angle="-PI/2"/>
+      <rotation zcos="1" angle="PI/2"/>
+    </transformation>
+    <shaperef ref="shStaveSignalMSSignalCu"/>
+  </union>
+
+  <box name="shStaveCFoam" xhalflength="StaveCoolingL/2" yhalflength="StaveCFoamW/2" zhalflength="StaveCFoamT/2 - EPS"/>
+
+  <box name="shStaveEOS_CFoam" xhalflength="StaveEOS_CFoamL/2" yhalflength="StaveEOS_CFoamW/2" zhalflength="StaveCFoamT/2 - EPS"/>
+
+  <tube name="shStaveCoolingTube" rmin="0.0" rmax="StaveCoolingPipeOD" zhalflength="StaveCoolingL/2 - 2 * EPS"/>
+  <tube name="shStaveCoolingCO2" rmin="0.0" rmax="StaveCoolingPipeID" zhalflength="StaveCoolingL/2 - 3 * EPS"/>
+
+</shapes>
+
+<logvol name="StaveFacesheetAll" shape="shStaveFacesheetAll" material="K13D2U"/>
+<logvol name="StaveCloseoutLong" shape="shStaveCloseoutLong" material="CFRP"/>
+<logvol name="StaveCloseoutLongEOS" shape="shStaveCloseoutLongEOS" material="CFRP"/>
+<logvol name="StaveCloseoutFarEnd" shape="shStaveCloseoutFarEnd" material="Peek"/>
+<logvol name="StaveCloseoutEOS_End" shape="shStaveCloseoutEOS_End" material="Peek"/>
+<logvol name="StaveMountC" shape="shStaveMountC" material="Peek"/>
+<logvol name="StaveMountI" shape="shStaveMountI" material="Peek"/>
+<logvol name="StaveMountE" shape="shStaveMountE" material="Peek"/>
+
+<logvol name="StaveBusKapton" shape="shStaveBusKapton" material="Kapton"/>
+<logvol name="StaveBusGlue" shape="shStaveBusGlue" material="BoronNitrideEpoxy"/> 
+<logvol name="StaveGround" shape="shStaveGround" material="CuMetal"/>
+<logvol name="StaveSignalSS" shape="shStaveSignalSS" material="CuMetal"/> 
+<logvol name="StaveSignalMS" shape="shStaveSignalMS" material="CuMetal"/> 
+
+
+<logvol name="StaveCoolingUnit" shape="shStaveCFoam" material="CFoam">
+  <transform>
+    <transformation name="PlaceTubeInStaveCFoam">
+      <rotation ycos="1" angle="PI / 2."/>
+    </transformation>
+      <logvol name="StaveCoolingTube" shape="shStaveCoolingTube" material="TiMetal">
+        <logvol name="StaveCoolingCO2" shape="shStaveCoolingCO2" material="CO2Liquid"/>
+      </logvol>
+  </transform>
+</logvol>
+
+<logvol name="StaveEOS_CFoam" shape="shStaveEOS_CFoam" material="CFoam"/>
+
+<logvol name="StaveCore" shape="shStaveCore" material="Honeycomb2pcf">
+
+  <transform>
+    <transformation name="PlaceLowZ_Facesheet">
+      <translation z="-((StaveHoneycombT + StaveFacesheetT)/2)"/>
+    </transformation>
+    <logvolref ref="StaveFacesheetAll"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHighZ_Facesheet">
+      <translation z="(StaveHoneycombT + StaveFacesheetT)/2"/>
+    </transformation>
+    <logvolref ref="StaveFacesheetAll"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceCloseoutLongUp">
+      <translation x="(-StaveCoreLength + StaveCloseoutLongEOS_L)/2 + StaveCloseoutFarEndW" y="StaveCoreWidth/2 - 2."/>
+    </transformation>
+    <logvolref ref="StaveCloseoutLongEOS"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceCloseoutLongDown">
+      <translation x="(StaveCoreLength - StaveCloseoutLongL)/2 - StaveCloseoutEOS_EndW" y="-(StaveCoreWidth/2 - 2.)"/>
+    </transformation>
+    <logvolref ref="StaveCloseoutLong"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceCloseoutFarEnd">
+      <translation x="-(StaveCoreLength - StaveCloseoutFarEndW)/2"/>
+    </transformation>
+    <logvolref ref="StaveCloseoutFarEnd"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceCloseoutEOS_End">
+      <translation x="(StaveCoreLength - StaveCloseoutEOS_EndW)/2" y="EOSCoreWidth/2"/>
+    </transformation>
+    <logvolref ref="StaveCloseoutEOS_End"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceLowZ_BusGlue">
+      <translation z="-((StaveHoneycombT + StaveBusGlueT)/2 + StaveFacesheetT)"/>
+    </transformation>
+    <logvolref ref="StaveBusGlue"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHighZ_BusGlue">
+      <translation z="(StaveHoneycombT + StaveBusGlueT)/2 + StaveFacesheetT"/>
+    </transformation>
+    <logvolref ref="StaveBusGlue"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceLowZ_BusKapton">
+      <translation z="-((StaveHoneycombT + StaveBusKaptonT)/2 + StaveFacesheetT + StaveBusGlueT)"/>
+    </transformation>
+    <logvolref ref="StaveBusKapton"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHighZ_BusKapton">
+      <translation z="(StaveHoneycombT + StaveBusKaptonT)/2 + StaveFacesheetT + StaveBusGlueT"/>
+    </transformation>
+    <logvolref ref="StaveBusKapton"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceLowY_Cooling">
+      <translation x="(StaveCoreLength - StaveCoolingL)/2 - StaveCloseoutEOS_EndW" y="-StaveCoolingOffset"/>
+    </transformation>
+    <logvolref ref="StaveCoolingUnit"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHighY_Cooling">
+      <translation x="(StaveCoreLength - StaveCoolingL)/2 - StaveCloseoutEOS_EndW" y="StaveCoolingOffset"/>
+    </transformation>
+    <logvolref ref="StaveCoolingUnit"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceStaveEOS_CFoam">
+      <translation x="(StaveCoreLength - EOSCoreLength)/2" y="StaveCoolingOffset + (StaveCFoamW + StaveEOS_CFoamW)/2"/>
+    </transformation>
+    <logvolref ref="StaveEOS_CFoam"/>
+  </transform>
+
+</logvol>
+
+<assembly name="StaveCoreSS"> <!-- A core plus the Cu in the cable bus plus mounts -->
+  <logvolref ref="StaveCore"/>
+  <transform>
+    <transformation name="PlaceLowZ_SignalCu">
+      <translation x="(StaveCoreLength - StaveSignalEOS_W)/2 - StaveSignalEOS_FromEnd" y="(StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop" z="-((StaveCoreT + StaveBusCuT)/2 + StaveBusCuT)"/>
+    </transformation>
+    <logvolref ref="StaveSignalSS"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHighZ_SignalCu">
+      <translation x="(StaveCoreLength - StaveSignalEOS_W)/2 - StaveSignalEOS_FromEnd" y="(StaveCoreWidth - StaveSignalEOS_L)/2 - StaveSignalEOS_FromTop" z="(StaveCoreT + StaveBusCuT)/2 + StaveBusCuT"/>
+    </transformation>
+    <logvolref ref="StaveSignalSS"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceLowZ_GroundCu">
+      <translation x="(StaveCoreLength - (StaveGroundSignalL + StaveGroundEOS_W))/2 - StaveGroundEOS_FromEnd" y="(StaveCoreWidth - StaveGroundSignalW)/2 - StaveGroundSignalFromTop" z="-((StaveCoreT + StaveBusCuT)/2)"/>
+    </transformation>
+    <logvolref ref="StaveGround"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHighZ_GroundCu">
+      <translation x="(StaveCoreLength - (StaveGroundSignalL + StaveGroundEOS_W))/2 - StaveGroundEOS_FromEnd" y="(StaveCoreWidth - StaveGroundSignalW)/2 - StaveGroundSignalFromTop" z="(StaveCoreT + StaveBusCuT)/2"/>
+    </transformation>
+    <logvolref ref="StaveGround"/>
+  </transform>
+
+</assembly>
+
+<assembly name="StaveCoreMS"> <!-- A core plus the Cu in the cable bus plus mounts -->
+  <logvolref ref="StaveCore"/>
+  <transform>
+    <transformationref ref="PlaceLowZ_SignalCu"/>
+    <logvolref ref="StaveSignalMS"/>
+  </transform>
+  <transform>
+    <transformationref ref="PlaceHighZ_SignalCu"/>
+    <logvolref ref="StaveSignalMS"/>
+  </transform>
+  <transform>
+    <transformationref ref="PlaceLowZ_GroundCu"/>
+    <logvolref ref="StaveGround"/>
+  </transform>
+  <transform>
+    <transformationref ref="PlaceHighZ_GroundCu"/>
+    <logvolref ref="StaveGround"/>
+  </transform>
+
+</assembly>
+
+<!-- Build up SS and MS barrel hybrids -->
+<defines>
+  <!-- Ref. np49-01-104.pdf, Rev C June 2014, ignore extension for HCC -->
+  <var name="B_HybridW" value="15.5"/>
+  <var name="B_HybridL" value="B_SensorWidth"/>
+  <var name="B_HybridT" value="0.120 + 0.240 + 0.080"/>
+
+  <var name="HCC_OffsetX" value="B_HybridW/2 - (3.55 + 0.5 + ABC_W + HCC_L/2)"/>
+  <var name="HCC_OffsetY" value="36.41 + HCC_W/2"/>
+  <var name="NumABC_PerB_Hybrid" value="10"/>
+  <var name="ABC_Pitch" value="1.64 + ABC_L"/>
+  <var name="ABC_ToHybridEdgeGap" value="0.5"/>
+  <var name="B_HybridX_Offset" value="5.535"/>
+
+</defines>
+
+<shapes>
+  <box name="shB_HybridPCB" xhalflength="B_HybridW/2" yhalflength="B_HybridL/2" zhalflength="B_HybridT/2 - EPS"/>
+</shapes>
+
+<!-- GeoModelXml input created by ConsolidX version 1.100000 for B_HybridPCB, version 1.0. -->
+
+<materials>
+
+  <material name="matB_HybridPCB" density="2.165382">
+    <elementref ref="Aluminium" fraction="0.008079"/>
+    <elementref ref="Barium" fraction="0.057375"/>
+    <elementref ref="Carbon" fraction="0.250888"/>
+    <elementref ref="Copper" fraction="0.421377"/>
+    <elementref ref="Gold" fraction="0.004799"/>
+    <elementref ref="Hydrogen" fraction="0.014609"/>
+    <elementref ref="Lead" fraction="0.023518"/>
+    <elementref ref="Nickel" fraction="0.020306"/>
+    <elementref ref="Nitrogen" fraction="0.048265"/>
+    <elementref ref="Oxygen" fraction="0.058161"/>
+    <elementref ref="Silver" fraction="0.024977"/>
+    <elementref ref="Tin" fraction="0.047647"/>
+    <elementref ref="Titanium" fraction="0.019999"/>
+  </material>
+
+</materials>
+
+<!-- End of ConsolidX output -->
+
+<logvol name="B_HybridPCB" shape="shB_HybridPCB" material="matB_HybridPCB"/>
+
+<assembly name="B_HybridNear"> <!-- As in near to EOS -->
+  <logvolref ref="B_HybridPCB"/>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_Hybrid">
+      <translation x="HCC_OffsetX" y="HCC_OffsetY" z="(B_HybridT + HCC_T) / 2"/>
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <multicopy name="PlaceABCsOnB_Hybrid" n="NumABC_PerB_Hybrid">
+    <transformation name="PlaceABCOnHybrid">
+      <translation y="ABC_Pitch"/>
+    </transformation>
+    <transform>
+      <transformation name="ABC_ReadyForCopyingToB_Hybrid">
+        <translation x="B_HybridW/2 - ABC_ToHybridEdgeGap - ABC_W/2" y="-((NumABC_PerB_Hybrid - 1) * ABC_Pitch / 2.)" z="(B_HybridT + ABC_T) / 2"/>
+      </transformation>
+      <logvolref ref="ABC_Chip"/>
+    </transform>
+  </multicopy>
+
+</assembly>
+
+<assembly name="B_HybridFar">
+  <logvolref ref="B_HybridPCB"/>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_HybridF">
+      <translation x="-HCC_OffsetX" y="HCC_OffsetY" z="(B_HybridT + HCC_T) / 2"/>
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <multicopy name="PlaceABCsOnB_HybridF" n="NumABC_PerB_Hybrid">
+    <transformation name="PlaceABCOnHybridF">
+      <translation y="ABC_Pitch"/>
+    </transformation>
+    <transform>
+      <transformation name="ABC_ReadyForCopyingToB_HybridF">
+        <translation x="-(B_HybridW/2 - ABC_ToHybridEdgeGap - ABC_W/2)" y="-((NumABC_PerB_Hybrid - 1) * ABC_Pitch / 2.)" z="(B_HybridT + ABC_T) / 2"/>
+      </transformation>
+      <logvolref ref="ABC_Chip"/>
+    </transform>
+  </multicopy>
+
+</assembly>
+
+<shapes>
+
+  <tube name="shInnerPolyMod" rmin="StripB_OuterRadius - InnerPolyModThickness" rmax="StripB_OuterRadius - 3 * EPS" zhalflength="InnerPolyModHalfLength"/>
+
+  <tube name="shBarrel0" rmin="BarrelRadius_0" rmax="CylRadius_0 + CylEnvelopeThO" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/>
+  <tube name="shBarrel1" rmin="BarrelRadius_1" rmax="CylRadius_1 + CylEnvelopeThO" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/> <!-- Offset of + 1 to avoid Stavecore overlap in Barrel 2 -->
+  <tube name="shBarrel2" rmin="BarrelRadius_2" rmax="CylRadius_2 + CylEnvelopeThO" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/> <!-- Why though? -->
+  <tube name="shBarrel3" rmin="BarrelRadius_3" rmax="StripB_OuterRadius - 2 * EPS" zhalflength="StaveSupportCylLength / 2. + 1. / 2."/> <!-- Originally StripB_HalfLength - EPS -->
+
+</shapes>
+
+<transformation name="StereoRot">
+  <rotation zcos="1" angle="StereoAngle"/>
+</transformation>
+
+<transformation name="RotateModulePowerEnd">
+  <rotation zcos="1" angle="PI + StereoAngle"/>
+</transformation>
+
+<!-- GeoModelXml input created by ConsolidX version 1.100000 for BarrelEOSBoard, version 1.0. -->
+
+<materials>
+
+  <material name="matEOS" density="1.052352">
+    <elementref ref="Carbon" fraction="0.103183"/>
+    <elementref ref="Copper" fraction="0.393132"/>
+    <elementref ref="Hydrogen" fraction="0.009621"/>
+    <elementref ref="Oxygen" fraction="0.266262"/>
+    <elementref ref="Silicon" fraction="0.215452"/>
+    <elementref ref="Tin" fraction="0.012349"/>
+  </material>
+
+</materials>
+
+<shapes>
+    <box name="shEOS" xhalflength="100/2" yhalflength="45/2" zhalflength="5/2"/>
+</shapes>
+
+<logvol name="EOS" shape="shEOS" material="matEOS"/>
+
+<assembly name="SS_Module">
+
+  <transform alignable="0">
+    <transformation name="BRLSensorSSdummy" alignable="true">
+      <translation/>
+    </transformation>
+    <logvolref ref="BRLSensorSS"/>
+  </transform>  
+
+  <transform>
+    <transformation name="PlaceNearHybridSS">
+      <translation x="B_HybridX_Offset + B_HybridW / 2" z="(SensorThickness + B_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="B_HybridNear"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFarHybridSS">
+      <translation x="-(B_HybridX_Offset + B_HybridW / 2)" z="(SensorThickness + B_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="B_HybridFar"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceDCDC_PCB_SS">
+      <translation y="-(B_SensorWidth - DCDC_PCB_L) / 2." z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_PCB"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceDCDC_Box_SS">
+      <translation y="-(B_SensorWidth - DCDC_PCB_L - DCDC_PCB_L + DCDC_BoxL) / 2." z="(SensorThickness + DCDC_BoxT) / 2. + DCDC_PCB_T"/>
+    </transformation>
+    <logvolref ref="DCDC_Box"/>
+  </transform>
+
+</assembly>
+
+<assembly name="MS_Module">
+
+
+  <transform alignable="0">
+    <transformation name="BRLSensorMSdummy" alignable="true">
+      <translation/>
+    </transformation>
+    <logvolref ref="BRLSensorMS"/>
+  </transform>  
+
+  <transform>
+    <transformation name="PlaceNearHybridMS">
+      <translation x="B_HybridX_Offset + B_HybridW / 2" z="(SensorThickness + B_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="B_HybridNear"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceDCDC_PCB_MS">
+      <translation y="-(B_SensorWidth - DCDC_PCB_L) / 2." z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_PCB"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceDCDC_Box_MS">
+      <translation y="-(B_SensorWidth - DCDC_PCB_L - DCDC_PCB_L + DCDC_BoxL) / 2." z="(SensorThickness + DCDC_BoxT) / 2. + DCDC_PCB_T"/>
+    </transformation>
+    <logvolref ref="DCDC_Box"/>
+  </transform>
+
+</assembly>
+
+<assembly name="SS_FaceL">
+  <index ref="side" value="CNL_5"/> 
+  <multicopy name="CopySS_InStereoFaceL" n="B_N_SensorsPerFace">
+    <transformation name="PlaceSS_InStereoFaceL">
+      <translation x="B_SensorGap + B_SensorLength"/>
+    </transformation>
+    <transform>
+      <transformationref ref="StereoRot"/>
+      <assemblyref ref="SS_Module"/>
+    </transform>
+  </multicopy>
+</assembly>
+
+<assembly name="SS_FaceR"> <!-- Modules rotated 180 deg cf L version -->
+  <index ref="side" value="1 - CNL_5"/> 
+  <multicopy name="CopySS_InStereoFaceR" n="B_N_SensorsPerFace">
+    <transformation name="PlaceSS_InStereoFaceR">
+      <translation x="B_SensorGap + B_SensorLength"/>
+    </transformation>
+    <transform>
+      <transformationref ref="RotateModulePowerEnd"/>
+      <assemblyref ref="SS_Module"/>
+    </transform>
+  </multicopy>
+</assembly>
+
+<assembly name="MS_FaceL">
+  <index ref="side" value="CNL_5"/> 
+  <multicopy name="CopyMS_InStereoFaceL" n="B_N_SensorsPerFace">
+    <transformation name="PlaceMS_InStereoFaceL">
+      <translation x="B_SensorGap + B_SensorLength"/>
+    </transformation>
+    <transform>
+      <transformationref ref="StereoRot"/>
+      <assemblyref ref="MS_Module"/>
+    </transform>
+  </multicopy>
+</assembly>
+
+<assembly name="MS_FaceR">
+  <index ref="side" value="1 - CNL_5"/> 
+  <multicopy name="CopyMS_InStereoFaceR" n="B_N_SensorsPerFace">
+    <transformation name="PlaceMS_InStereoFaceR">
+      <translation x="B_SensorGap + B_SensorLength"/>
+    </transformation>
+    <transform>
+      <transformationref ref="RotateModulePowerEnd"/>
+      <assemblyref ref="MS_Module"/>
+    </transform>
+  </multicopy>
+</assembly>
+
+<assembly name="SS_Stave"> 
+  <assemblyref ref="StaveCoreSS"/>
+  <transform>
+    <transformation name="PlaceFirstSS_FaceOnCore">
+      <translation x="StaveFaceTranslation" z="-(StavePlankT + SensorThickness)/2"/>
+      <rotation xcos="1" angle="PI"/> <!-- Strips on low-z side -->
+    </transformation>
+    <assemblyref ref="SS_FaceR" zeroid="true"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceSecondSS_FaceOnCore">
+      <translation x="StaveFaceTranslation" z="+(StavePlankT + SensorThickness)/2"/>
+    </transformation>
+    <assemblyref ref="SS_FaceL"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFirstEOS_OnSS_Core">
+      <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="-(StavePlankT + 5.)/2"/>
+    </transformation>
+    <logvolref ref="EOS"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceSecondEOS_OnSS_Core">
+      <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="+(StavePlankT + 5.)/2"/>
+    </transformation>
+    <logvolref ref="EOS"/>
+  </transform>
+
+</assembly>
+
+<assembly name="MS_Stave"> 
+  <assemblyref ref="StaveCoreMS"/>
+
+  <transform>
+    <transformation name="PlaceFirstMS_FaceOnCore">
+      <translation x="StaveFaceTranslation" z="-(StavePlankT + SensorThickness)/2"/>
+      <rotation xcos="1" angle="PI"/> <!-- Strips on low-z side -->
+    </transformation>
+    <assemblyref ref="MS_FaceR" zeroid="true"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceSecondMS_FaceOnCore">
+      <translation x="StaveFaceTranslation" z="+(StavePlankT + SensorThickness)/2"/>
+    </transformation>
+    <assemblyref ref="MS_FaceL"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFirstEOS_OnMS_Core">
+      <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="-(StavePlankT + 5.)/2"/>
+    </transformation>
+    <logvolref ref="EOS"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceSecondEOS_OnMS_Core">
+      <translation x="(StaveCoreLength - 100.)/2" y="(StaveCoreWidth + EOSCoreWidth)/2" z="+(StavePlankT + 5.)/2"/>
+    </transformation>
+    <logvolref ref="EOS"/>
+  </transform>
+
+</assembly>
+
+<assembly name="StavePairSS">
+
+  <index ref="eta_module" value="CNL_7 + 1"/> 
+  <transform>
+    <transformation name="PlacePlusZ_SS_Stave">
+      <translation x="StaveGapZ0 + StaveCoreLength/2"/>
+    </transformation>
+    <assemblyref ref="SS_Stave" zeroid="true"/>
+  </transform>
+
+  <multicopy name="CopyStaveMountsSS_Plus" n="NumStaveMountsI">
+    <transformation name="PlaceStaveMountsSS_Plus">
+      <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceStaveMountReadySS_PlusForCopying">
+        <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountR/2"/>
+        <rotation xcos="1" angle="-PI/2"/>
+      </transformation>
+      <logvolref ref="StaveMountI"/>
+    </transform>
+  </multicopy>
+
+  <index ref="eta_module" value="-(CNL_7 + 1)"/> 
+  <transform>
+    <transformation name="PlaceMinusZ_SS_Stave">
+      <translation x="-(StaveGapZ0 + StaveCoreLength/2)"/>
+      <rotation ycos="1" angle="PI"/>
+    </transformation>
+    <assemblyref ref="SS_Stave"/>
+  </transform>
+
+  <multicopy name="CopyStaveMountsSS_Minus" n="NumStaveMountsI">
+    <transformation name="PlaceStaveMountsSS_Minus">
+      <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceStaveMountSS_MinusReadyForCopying">
+        <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountHeight_1 / 2."/>
+        <rotation xcos="1" angle="-PI/2"/>
+      </transformation>
+      <logvolref ref="StaveMountI"/>
+    </transform>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceStaveMountCSS_Plus">
+      <translation x="StaveMountThickness_0 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountC"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceStaveMountCSS_Minus">
+      <translation x="-(StaveMountThickness_0 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountC"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceStaveMountESS_Plus">
+      <translation x="StaveCoreLength - StaveMountThickness_2 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountE"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceStaveMountESS_Minus">
+      <translation x="-(StaveCoreLength - StaveMountThickness_2 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountE"/>
+  </transform>
+
+</assembly>
+
+<assembly name="StavePairMS">
+
+  <index ref="eta_module" value="CNL_7 + 1"/> 
+  <transform>
+    <transformation name="PlacePlusZ_MS_Stave">
+      <translation x="StaveGapZ0 + StaveCoreLength/2"/>
+    </transformation>
+    <assemblyref ref="MS_Stave" zeroid="true"/>
+  </transform>
+
+  <multicopy name="CopyStaveMountsMS_Plus" n="NumStaveMountsI">
+    <transformation name="PlaceStaveMountsMS_Plus">
+      <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceStaveMountReadyMS_PlusForCopying">
+        <translation x="StaveSupportCylLength/(NumberOfHatsPerCyl + 1)" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountHeight_1 / 2."/>
+        <rotation xcos="1" angle="-PI/2"/>
+      </transformation>
+      <logvolref ref="StaveMountI"/>
+    </transform>
+  </multicopy>
+
+  <index ref="eta_module" value="-(CNL_7 + 1)"/>
+  <transform>
+    <transformation name="PlaceMinusZ_MS_Stave">
+      <translation x="-(StaveGapZ0 + StaveCoreLength/2)"/>
+      <rotation ycos="1" angle="PI"/>
+    </transformation>
+    <assemblyref ref="MS_Stave"/>
+  </transform>
+
+  <multicopy name="CopyStaveMountsMS_Minus" n="NumStaveMountsI">
+    <transformation name="PlaceStaveMountsMS_Minus">
+      <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))"/>
+    </transformation>
+    <transform>
+      <transformation name="PlaceStaveMountMS_MinusReadyForCopying">
+        <translation x="-(StaveSupportCylLength/(NumberOfHatsPerCyl + 1))" y="-(StaveCoreWidth/2 + StaveMountLength_1/2)" z="StaveMountHeight_1 / 2."/>
+        <rotation xcos="1" angle="-PI/2"/>
+      </transformation>
+      <logvolref ref="StaveMountI"/>
+    </transform>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceStaveMountCMS_Plus">
+      <translation x="StaveMountThickness_0 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountC"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceStaveMountCMS_Minus">
+      <translation x="-(StaveMountThickness_0 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_0/2)" z="StaveMountHeight_0 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountC"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceStaveMountEMS_Plus">
+      <translation x="StaveCoreLength - StaveMountThickness_2 / 2." y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountE"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceStaveMountEMS_Minus">
+      <translation x="-(StaveCoreLength - StaveMountThickness_2 / 2.)" y="-(StaveCoreWidth/2 + StaveMountLength_2/2)" z="StaveMountHeight_2 / 2."/>
+      <rotation xcos="1" angle="-PI/2"/>
+    </transformation>
+    <logvolref ref="StaveMountE"/>
+  </transform>
+
+
+</assembly>
+
+<logvol name="Barrel0" shape="shBarrel0" material="N2" alignable="true">
+  <index ref="layer_wheel" value="0"/>
+  <multicopy name="PlaceStavesB0" n="N_StavesInCyl_0">
+    <transformation name="XfStavesB0">
+      <rotation zcos="1" angle="2 * PI / N_StavesInCyl_0"/>
+    </transformation>
+    <transform>
+      <transformation name="XfStave0ReadyForCopying">
+        <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> 
+        <rotation zcos="1" angle="PI / N_StavesInCyl_0"/>
+        <translation x="CylRadius_0"/>
+        <rotation zcos="1" angle="-TiltAngle_0"/> 
+        <rotation ycos="1" angle="-PI/2"/>       
+      </transformation>
+      <assemblyref ref="StavePairSS"/>
+    </transform>
+  </multicopy>
+
+  <assemblyref ref="Barrel0Support"/>
+
+</logvol>
+
+<logvol name="Barrel1" shape="shBarrel1" material="N2" alignable="true">
+  <index ref="layer_wheel" value="1"/>
+  <multicopy name="PlaceStavesB1" n="N_StavesInCyl_1">
+    <transformation name="XfStavesB1">
+      <rotation zcos="1" angle="2 * PI / N_StavesInCyl_1"/>
+    </transformation>
+    <transform>
+      <transformation name="XfStave1ReadyForCopying">
+        <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> 
+        <rotation zcos="1" angle="PI / N_StavesInCyl_1"/>
+        <translation x="CylRadius_1"/>
+        <rotation zcos="1" angle="-TiltAngle_1"/> 
+        <rotation ycos="1" angle="-PI/2"/>       
+      </transformation>
+      <assemblyref ref="StavePairSS"/>
+    </transform>
+  </multicopy>
+
+  <assemblyref ref="Barrel1Support"/>
+
+</logvol>
+
+<logvol name="Barrel2" shape="shBarrel2" material="N2" alignable="true">
+  <index ref="layer_wheel" value="2"/>
+  <multicopy name="PlaceStavesB2" n="N_StavesInCyl_2">
+    <transformation name="XfStavesB2">
+      <rotation zcos="1" angle="2 * PI / N_StavesInCyl_2"/>
+    </transformation>
+    <transform>
+      <transformation name="XfStave2ReadyForCopying">
+        <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> 
+        <rotation zcos="1" angle="PI / N_StavesInCyl_2"/>
+        <translation x="CylRadius_2"/>
+        <rotation zcos="1" angle="-TiltAngle_2"/> 
+        <rotation ycos="1" angle="-PI/2"/>       
+      </transformation>
+      <assemblyref ref="StavePairMS"/>
+    </transform>
+  </multicopy>
+
+  <assemblyref ref="Barrel2Support"/>
+
+</logvol>
+
+<logvol name="Barrel3" shape="shBarrel3" material="N2" alignable="true">
+  <index ref="layer_wheel" value="3"/>
+  <multicopy name="PlaceStavesB3" n="N_StavesInCyl_3">
+    <transformation name="XfStavesB3">
+      <rotation zcos="1" angle="2 * PI / N_StavesInCyl_3"/>
+    </transformation>
+    <transform>
+      <transformation name="XfStave3ReadyForCopying">
+        <!-- Rotate half a notch so x = 0 passes through edges not centres (as in standard LoI) --> 
+        <rotation zcos="1" angle="PI / N_StavesInCyl_3"/>
+        <translation x="CylRadius_3"/>
+        <rotation zcos="1" angle="-TiltAngle_3"/> 
+        <rotation ycos="1" angle="-PI/2"/>       
+      </transformation>
+      <assemblyref ref="StavePairMS"/>
+    </transform>
+  </multicopy>
+  <logvol name="InnerPolyMod" shape="shInnerPolyMod" material="BoratedPolyethylene"/>
+
+  <assemblyref ref="Barrel3Support"/>
+
+</logvol>
+
+<assembly name="StripB">
+  <index ref="phi_module" value="CNL_4"/>
+  
+  <transform alignable="2">
+    <transformation name="Barrel0dummy" alignable="true">
+      <translation/>
+    </transformation>
+    <logvolref ref="Barrel0"/>
+  </transform>
+  
+  <transform alignable="2">
+    <transformation name="Barrel1dummy" alignable="true">
+      <translation/>
+    </transformation>
+    <logvolref ref="Barrel1"/>
+  </transform>
+  
+  <transform alignable="2">
+    <transformation name="Barrel2dummy" alignable="true">
+      <translation/>
+    </transformation>
+    <logvolref ref="Barrel2"/>
+  </transform>
+  
+  <transform alignable="2">
+    <transformation name="Barrel3dummy" alignable="true">
+      <translation/>
+    </transformation>
+    <logvolref ref="Barrel3"/>
+  </transform>
+
+  <transform name="ZBraceCapFC">
+    <transformation name="PlaceZBraceCapFC">
+      <translation z="StaveSupportCylLength / 2. + ZBraceWidth_0 / 2. + ZBraceWidth_1 + InterlinkThickness + 1"/>
+    </transformation>
+  <assemblyref ref="ZBraceCap"/>
+  </transform>
+  
+
+  <transform name="ZBraceCapEC">
+    <transformation name="PlaceZBraceCapEC">
+      <rotation ycos="1." angle="PI"/>
+      <translation z="StaveSupportCylLength / 2. + ZBraceWidth_0 / 2. + ZBraceWidth_1 + InterlinkThickness + 1"/>
+    </transformation>
+  <assemblyref ref="ZBraceCap"/>
+  </transform>
+
+  <multicopy name="MultipleInterlinks0" n="N_StavesInCyl_0">
+    <transformation name="PlaceMultipleInterlinks0">
+      <rotation zcos="1." angle="2*PI / N_StavesInCyl_0"/>
+    </transformation>
+    <assemblyref ref="TempInterlink0"/>
+  </multicopy>
+
+  <multicopy name="MultipleInterlinks1" n="N_StavesInCyl_1">
+    <transformation name="PlaceMultipleInterlinks1">
+      <rotation zcos="1." angle="2*PI / N_StavesInCyl_1"/>
+    </transformation>
+    <assemblyref ref="TempInterlink1"/>
+  </multicopy>
+
+  <multicopy name="MultipleInterlinks2" n="N_StavesInCyl_2">
+    <transformation name="PlaceMultipleInterlinks2">
+      <rotation zcos="1." angle="2*PI / N_StavesInCyl_2"/>
+    </transformation>
+    <assemblyref ref="TempInterlink2"/>
+  </multicopy>
+
+  <multicopy name="MultipleInterlinks3" n="N_StavesInCyl_3">
+    <transformation name="PlaceMultipleInterlinks3">
+      <rotation zcos="1." angle="2*PI / N_StavesInCyl_3"/>
+    </transformation>
+    <assemblyref ref="TempInterlink3"/>
+  </multicopy>
+
+
+  
+<!--  
+  <logvolref ref="Barrel0"/>
+  <logvolref ref="Barrel1"/>
+  <logvolref ref="Barrel2"/>
+  <logvolref ref="Barrel3"/>
+-->  
+
+</assembly>
+
+
+<!-- CNL_n meanings:
+  n Meaning          Range
+  0 SCT Envelope      0
+  1 Endcap - or +     0 - 1
+  2 Endcap            0 - 0
+  3 Wheel             0 - 5
+  4 Pair              0 - 15
+  5 Petal             0 - 1
+  6 Face              0 - 1
+  7 Module 	      0 - big; not used and not zeroed
+  8 Sensor            0 - big; not used and not zeroed
+
+-->
+
+<defines>
+  <var name="N_Wheels" value="6"/>
+  <vector name="WheelZ" value="1512 1702 1952 2237 2532 2850"/>
+  <vector name="WheelZOdd" value="1512 1952 2532"/>
+  <vector name="WheelZEven" value="1702 2237 2850"/>
+  <var name="NPetalsInWheel" value="32"/>
+  <var name="CastellationOffset" value="7.5"/>
+  <var name="PetalCoreInnerRadius" value="380"/>
+  <var name="PetalCoreOuterRadius" value="975"/>
+  <var name="PetalCoreExtraWidth" value="41"/>
+  <!-- Extra width at outer edges for bus-tape -->
+  <var name="PetalCoreAngle" value="2*PI/NPetalsInWheel + 2 * PetalCoreExtraWidth / PetalCoreOuterRadius"/>
+  <var name="PetalEarLength" value="150"/>
+  <var name="PetalEarWidth" value="28.8"/>
+  <var name="PetalEarAngle" value="PetalEarWidth / PetalCoreOuterRadius"/>
+  <var name="PetalEarInnerRadius" value="PetalCoreOuterRadius - PetalEarLength"/>
+  <var name="PetalEarOuterRadius" value="PetalCoreOuterRadius"/>
+  <var name="PetalFaceRotation" value="-3.5e-3"/> <!-- 3.5 mrad, clockwise. See e-mail 2016-08-02 layout -->
+  <!-- Pixel core thickness built up in following order: -->
+  <var name="PetalHoneycombT" value="5.2 + 0.078"/>
+  <!-- Small correction to make Si-Si mid dist. 6.42. NPH logbook UG20 29/4/2016 This increases the thickness of honeycomb, Allcomp foam, and the closeouts. To be revised. -->
+  <var name="PetalFaceSheetT" value="0.15"/>
+  <var name="PetalBusGlueT" value="0.1"/>
+  <!-- Includes module-to-bus glue, 0.1 mm -->
+  <var name="PetalBusKaptonT" value="0.2"/>
+  <var name="PetalCoreT" value="PetalHoneycombT + 2 * (PetalFaceSheetT + PetalBusGlueT + PetalBusKaptonT)"/>
+  <var name="PetalBusCuT" value="0.018"/>
+  <var name="PetalPlankT" value="PetalCoreT + 4 * PetalBusCuT"/>
+
+  <var name="PetalCoreThickness" value="PetalCoreT"/>
+  <var name="PetalCloseoutW" value="8.0"/>
+  <var name="PetalCloseoutT" value="PetalHoneycombT"/>
+  <var name="PetalCchannelLongL" value="(PetalCoreOuterRadius-PetalCoreInnerRadius)-2*PetalCloseoutW"/>
+  <var name="PetalCchannelShortL" value="(PetalEarInnerRadius-PetalCoreInnerRadius)-PetalCloseoutW"/>
+  <var name="PetalCchannelW" value="4"/>
+  <var name="PetalCchannelInnerW" value="PetalCchannelW-0.5"/>	
+  <var name="PetalCchannelInnerT" value="PetalHoneycombT-0.9-2*EPS"/>	
+  <!-- Cooling-->
+  <var name="PetalCFoamT" value="PetalHoneycombT"/>
+  <var name="PetalCFoamW" value="10.0"/>
+  <var name="PetalCooling1L" value="510"/>
+  <var name="PetalCooling2L" value="440"/>
+  <var name="PetalCooling3L" value="173.9"/>
+  <var name="PetalCoolingOffset" value="25."/>
+  <var name="PetalCoolingPipeOD" value="2.275"/>
+  <var name="PetalCoolingPipeID" value="1.975"/>
+  <!-- 0.1 mm wall thickness on drawing, but not yet achieved so thicker -->
+  <var name="EC_InnerCylLength" value="2. * StripEC_HalfLength - 2."/>
+  <var name="EC_InnerCylThickness" value="0.6"/>
+  <var name="EC_InnerCylInnerR" value="367."/>
+  <var name="EC_InnerCylOuterR" value="EC_InnerCylInnerR + EC_InnerCylThickness"/>
+  <var name="WheelSupportOffset" value="40."/>
+  <var name="WheelInnerT_ShimThickness" value="1.0"/>
+  <var name="WheelInnerT_BaseThickness" value="2.0 + WheelInnerT_ShimThickness"/>
+  <var name="WheelInnerT_BaseWidth" value="20.0"/>
+  <var name="WheelInnerT_BaseOuterR" value="EC_InnerCylOuterR + WheelInnerT_BaseThickness "/>
+  <var name="WheelInnerT_UprightThickness" value="3.0"/>
+  <var name="WheelInnerT_UprightHeight" value="30.0"/>
+  <var name="WheelInnerT_UprightOuterR" value="WheelInnerT_BaseOuterR + WheelInnerT_UprightHeight"/>
+  <var name="WheelOuterT_OuterR" value="988.0"/>
+  <var name="WheelOuterT_BaseThickness" value="2.0"/>
+  <var name="WheelOuterT_BaseWidth" value="20.0"/>
+  <var name="WheelOuterT_BaseInnerR" value="WheelOuterT_OuterR - WheelOuterT_BaseThickness"/>
+  <var name="WheelOuterT_UprightThickness" value="3.0"/>
+  <var name="WheelOuterT_UprightHeight" value="50.0"/>
+  <var name="WheelOuterT_UprightInnerR" value="WheelOuterT_BaseInnerR - WheelOuterT_UprightHeight"/>
+  <!-- Cone modelled as tubes. See layout/LTF/services/StiffDisc.ods -->
+  <var name="StiffDiscRI" value="EC_InnerCylOuterR + 1."/>
+  <var name="StiffDiscRO" value="988.0"/>
+  <var name="StiffDiscCF_T" value="0.9"/>
+  <var name="StiffDiscFoamT" value="54.5"/>
+  <var name="StiffDiscTranslation" value="StripEC_HalfLength - StiffDiscFoamT/ 2. - StiffDiscCF_T - 1."/>
+  <!-- Word of mouth and guesses for the tubes at outer radius of wheels which control their z positions -->
+  <var name="ZtubeRI" value="2.0"/><!-- originally 3.0 -->
+  <var name="ZtubeRO" value="4.0"/><!-- originally 5.0 -->
+  <var name="ZtubeRadialPosition" value="WheelOuterT_OuterR - WheelOuterT_BaseThickness - ZtubeRO - EPS"/>
+  <var name="nZtubes" value="8"/>
+
+  <!-- Blade Supports -->
+  <vector name="BladeHoleDiameter" value="11. 26.58 39.07 55.3 76.41 103.86 139.54"/>
+  <var name="BladeHoleThickness" value="20."/>
+  <var name="BladeHoleGap" value="15."/>
+  <var name="BladeHoleOffset" value="480."/>
+  <var name="BladeAngle" value="15. * DEG"/>
+  <var name="BladeOuterEndWidth" value="38.09"/>
+  <var name="BladeLength" value="985."/>
+  <var name="BladeRodOuterEdge" value="8."/>
+  <var name="BladeRodInnerEdge" value="6."/>
+  <var name="BladeFaceSheetThickness" value="0.2"/>
+  <var name="BladeBarrelR" value="373."/>
+  <var name="BladeBaseHeight" value="15."/>
+  <var name="BladeBaseWidth" value="100."/>
+
+  <var name="LockBaseHHeight" value="26.5"/>
+  <var name="LockBaseHWidth" value="22.5"/>
+  <var name="LockBaseHThickness" value="5.77"/>
+  <var name="LockBaseLHeight" value="9.5"/>
+  <var name="LockBaseLWidth" value="22.5"/>
+  <var name="LockBaseLThickness" value="6.45"/>
+  <var name="LockBaseTAngleOffset" value="0.9375 * DEG"/>
+  <var name="LockBaseTAngle" value="11.25 * DEG"/>
+  <var name="LockBaseTAssemblyN" value="16."/>
+  <var name="LockBaseBAngleOffset" value="5.625 * DEG"/> <!-- was 3.91 * DEG -->
+  <var name="LockBaseBAssemblyN" value="16."/>
+  <var name="LockBaseOffset" value="3."/>
+
+  <!-- Blade Rails -->
+  <var name="RailRadius" value="998."/>
+  <var name="RailShelfLength" value="1479."/>
+  <var name="RailShelfWidth" value="40."/>
+  <var name="RailShelfHeight" value="10."/>
+  <var name="RailBoltHeight" value="25."/>
+  <var name="RailBoltRadius" value="3."/>
+  <var name="RailBoltGap" value="152."/>
+  <var name="RailBoltOffset" value="80."/>
+  <var name="RailBoltNumber" value="10."/>
+  <var name="RailWallLength" value="1434."/>
+  <var name="RailWallWidth" value="10."/>
+  <var name="RailWallHeight" value="50."/>
+  <var name="RailLength" value="1479."/>
+  <vector name="RailLengthS" value="155. 100. 1224."/>
+  <vector name="RailSquareTAngle" value="0.01999 0.009999"/>
+  <var name="RailCircleRadius" value="8."/>
+  <var name="RailSquareEdge" value="8."/>
+  <var name="RailWheelLength" value="20."/>
+  <var name="RailWheelRadius" value="25."/>
+  <var name="RailWheelOffsetClose" value="118."/>
+  <var name="RailWheelOffsetFar" value="187."/>
+  <vector name="RailWedgeHeight" value="12. 17."/>
+  <var name="RailWedgeLength" value="60"/>
+  <var name="RailWedgeWidth" value="14."/>
+  <var name="RailWedgeAngle" value="0.08314"/>
+  <var name="RailWedgeOffset" value="30."/>
+
+  <var name="ECPSTLength" value="1482."/><!-- Original value is 1632, revert when proper interfaces exist -->
+  <var name="ECPSTHatGap" value="300."/>
+  <var name="ECPSTHatHeight" value="15."/>
+  <var name="ECPSTOffset" value="216."/>
+  <var name="ECPSTHatNumber" value="5"/>
+
+</defines>
+
+<!--Build up EC hybrids-->
+<defines>
+  <var name="E_HybridT" value="0.120 + 0.240 + 0.080"/>
+  <var name="E_HybridRadiusMinR0H0" value="404.749"/>
+  <var name="E_HybridRadiusMaxR0H0" value="421.944"/>
+  <var name="E_HybridRadiusMinR0H1" value="437.406"/>
+  <var name="E_HybridRadiusMaxR0H1" value="454.601"/>
+  <var name="E_HybridRadiusMinR1H0" value="508.8"/>
+  <var name="E_HybridRadiusMaxR1H0" value="524.32"/>
+  <var name="E_HybridRadiusMinR1H1" value="542.769"/>
+  <var name="E_HybridRadiusMaxR1H1" value="557.523"/>
+  <var name="E_HybridRadiusMinR2H0" value="603.67"/>
+  <var name="E_HybridRadiusMaxR2H0" value="624.433"/>
+  <var name="E_HybridRadiusMinR3H0" value="671.918"/>
+  <var name="E_HybridRadiusMaxR3H0" value="688.336"/>
+  <var name="E_HybridRadiusMinR3H2" value="705.934"/>
+  <var name="E_HybridRadiusMaxR3H2" value="721.732"/>
+  <var name="E_HybridRadiusMinR3H1" value="E_HybridRadiusMinR3H0"/>
+  <var name="E_HybridRadiusMaxR3H1" value="E_HybridRadiusMaxR3H0"/>
+  <var name="E_HybridRadiusMinR3H3" value="E_HybridRadiusMinR3H2"/>
+  <var name="E_HybridRadiusMaxR3H3" value="E_HybridRadiusMaxR3H2"/>
+  <var name="E_HybridRadiusMinR4H0" value="812.573"/>
+  <var name="E_HybridRadiusMaxR4H0" value="834.485"/>
+  <var name="E_HybridRadiusMinR4H1" value="E_HybridRadiusMinR4H0"/>
+  <var name="E_HybridRadiusMaxR4H1" value="E_HybridRadiusMaxR4H0"/>
+  <var name="E_HybridRadiusMinR5H0" value="908.56"/>
+  <var name="E_HybridRadiusMaxR5H0" value="934.4"/>
+  <var name="E_HybridRadiusMinR5H1" value="E_HybridRadiusMinR5H0"/>
+  <var name="E_HybridRadiusMaxR5H1" value="E_HybridRadiusMaxR5H0"/>
+  <var name="E_HCCRadiusR0H0" value="419.6"/>
+  <var name="E_HCCRadiusR0H1" value="437.2"/>
+  <var name="E_HCCRadiusR1H0" value="520.02"/>
+  <var name="E_HCCRadiusR1H1" value="540.905"/>
+  <var name="E_HCCRadiusR2H0" value="618.3"/>  
+  <var name="E_HCCRadiusR2H0a" value="627.14"/>
+  <var name="E_HCCRadiusR3H1" value="686.509"/>	 
+  <var name="E_HCCRadiusR3H1a" value="690.503"/>
+  <var name="E_HCCRadiusR3H3" value="700.993"/>	 
+  <var name="E_HCCRadiusR3H3a" value="704.779"/>
+  <var name="E_HCCRadiusR4H1" value="830.651"/>	 
+  <var name="E_HCCRadiusR4H1a" value="833.607"/>
+  <var name="E_HCCRadiusR5H1" value="926.664"/>	 
+  <var name="E_HCCRadiusR5H1a" value="931.488"/>
+  <var name="N_ABC_R0" value="8"/>
+  <var name="N_ABC_R1" value="10"/>
+  <var name="N_ABC_R2" value="12"/>
+  <var name="N_ABC_R3" value="7"/>
+  <var name="N_ABC_R4" value="8"/>
+  <var name="N_ABC_R5" value="9"/>
+  <var name="ABC_ToEHybridEdgeGap" value="0.31"/>
+  <var name="HCC_R0H0_OffsetX" value="B_HybridW/2 - (3.55 + 0.5 + ABC_W + HCC_L/2)"/>
+  <var name="HCC_R0H0_OffsetY" value="36.41 + HCC_W/2"/>
+</defines>
+
+<shapes>
+  <tubs name="ShE_HybridR0H0" rmin="E_HybridRadiusMinR0H0" rmax="E_HybridRadiusMaxR0H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_0 / 2" dphi="SensorPhiWidth_0"/>
+  <tubs name="ShE_HybridR0H1" rmin="E_HybridRadiusMinR0H1" rmax="E_HybridRadiusMaxR0H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_0 / 2" dphi="SensorPhiWidth_0"/>
+  <tubs name="ShE_HybridR1H0" rmin="E_HybridRadiusMinR1H0" rmax="E_HybridRadiusMaxR1H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_1 / 2" dphi="SensorPhiWidth_1"/>
+  <tubs name="ShE_HybridR1H1" rmin="E_HybridRadiusMinR1H1" rmax="E_HybridRadiusMaxR1H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_1 / 2" dphi="SensorPhiWidth_1"/>
+  <tubs name="ShE_HybridR2H0" rmin="E_HybridRadiusMinR2H0" rmax="E_HybridRadiusMaxR2H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_2 / 2" dphi="SensorPhiWidth_2"/>
+  <tubs name="ShE_HybridR3H0" rmin="E_HybridRadiusMinR3H0" rmax="E_HybridRadiusMaxR3H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/>
+  <tubs name="ShE_HybridR3H2" rmin="E_HybridRadiusMinR3H2" rmax="E_HybridRadiusMaxR3H2" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/>
+  <tubs name="ShE_HybridR3H1" rmin="E_HybridRadiusMinR3H1" rmax="E_HybridRadiusMaxR3H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/>
+  <tubs name="ShE_HybridR3H3" rmin="E_HybridRadiusMinR3H3" rmax="E_HybridRadiusMaxR3H3" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_3*0.49" dphi="SensorPhiWidth_3*0.975"/>
+  <tubs name="ShE_HybridR4H0" rmin="E_HybridRadiusMinR4H0" rmax="E_HybridRadiusMaxR4H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_4*0.49" dphi="SensorPhiWidth_4*0.975"/>
+  <tubs name="ShE_HybridR5H0" rmin="E_HybridRadiusMinR5H0" rmax="E_HybridRadiusMaxR5H0" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_5*0.49" dphi="SensorPhiWidth_5*0.975"/>
+  <tubs name="ShE_HybridR4H1" rmin="E_HybridRadiusMinR4H1" rmax="E_HybridRadiusMaxR4H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_4*0.49" dphi="SensorPhiWidth_4*0.975"/>
+  <tubs name="ShE_HybridR5H1" rmin="E_HybridRadiusMinR5H1" rmax="E_HybridRadiusMaxR5H1" zhalflength="E_HybridT / 2." sphi="-SensorPhiWidth_5*0.49" dphi="SensorPhiWidth_5*0.975"/>
+    <!--sphi="-SensorPhiWidth_5*0.49" dphi="SensorPhiWidth_5*0.97" />   enough clearance - can i reduce? 0.98 is not enough. 0.975 looks perfect in vp1/Debugger -->
+</shapes>
+
+<materials>
+
+  <!-- GeoModelXml input created by ConsolidX for EC_HybridPCB, version 1.0. -->
+  <material name="matEC_HybridPCB" density="0.002165*1000">
+    <elementref ref="Aluminium" fraction="0.008079"/>
+    <elementref ref="Barium" fraction="0.057375"/>
+    <elementref ref="Carbon" fraction="0.250888"/>
+    <elementref ref="Copper" fraction="0.421377"/>
+    <elementref ref="Gold" fraction="0.004799"/>
+    <elementref ref="Hydrogen" fraction="0.014609"/>
+    <elementref ref="Lead" fraction="0.023518"/>
+    <elementref ref="Nickel" fraction="0.020306"/>
+    <elementref ref="Nitrogen" fraction="0.048265"/>
+    <elementref ref="Oxygen" fraction="0.058161"/>
+    <elementref ref="Silver" fraction="0.024977"/>
+    <elementref ref="Tin" fraction="0.047647"/>
+    <elementref ref="Titanium" fraction="0.019999"/>
+  </material>
+
+  <material name="matEC_HybridR0H0" density="0.002283*1000">
+    <elementref ref="Aluminium" fraction="0.016242"/>
+    <elementref ref="Barium" fraction="0.056974"/>
+    <elementref ref="Carbon" fraction="0.232673"/>
+    <elementref ref="Copper" fraction="0.387344"/>
+    <elementref ref="Gold" fraction="0.004411"/>
+    <elementref ref="Hydrogen" fraction="0.013620"/>
+    <elementref ref="Lead" fraction="0.040407"/>
+    <elementref ref="Nickel" fraction="0.021053"/>
+    <elementref ref="Nitrogen" fraction="0.044367"/>
+    <elementref ref="Oxygen" fraction="0.064096"/>
+    <elementref ref="Silver" fraction="0.020835"/>
+    <elementref ref="Tin" fraction="0.078118"/>
+    <elementref ref="Titanium" fraction="0.019859"/>
+  </material>
+
+  <material name="matEC_HybridR0H1" density="0.002276*1000">
+    <elementref ref="Aluminium" fraction="0.015741"/>
+    <elementref ref="Barium" fraction="0.057777"/>
+    <elementref ref="Carbon" fraction="0.230008"/>
+    <elementref ref="Copper" fraction="0.388521"/>
+    <elementref ref="Gold" fraction="0.004425"/>
+    <elementref ref="Hydrogen" fraction="0.013347"/>
+    <elementref ref="Lead" fraction="0.040916"/>
+    <elementref ref="Nickel" fraction="0.021079"/>
+    <elementref ref="Nitrogen" fraction="0.044502"/>
+    <elementref ref="Oxygen" fraction="0.063062"/>
+    <elementref ref="Silver" fraction="0.021489"/>
+    <elementref ref="Tin" fraction="0.078995"/>
+    <elementref ref="Titanium" fraction="0.020139"/>
+  </material>
+
+  <material name="matEC_HybridR1H0" density="0.002291*1000">
+    <elementref ref="Aluminium" fraction="0.015573"/>
+    <elementref ref="Barium" fraction="0.059492"/>
+    <elementref ref="Carbon" fraction="0.226923"/>
+    <elementref ref="Copper" fraction="0.386042"/>
+    <elementref ref="Gold" fraction="0.004397"/>
+    <elementref ref="Hydrogen" fraction="0.013111"/>
+    <elementref ref="Lead" fraction="0.042078"/>
+    <elementref ref="Nickel" fraction="0.021198"/>
+    <elementref ref="Nitrogen" fraction="0.044218"/>
+    <elementref ref="Oxygen" fraction="0.062647"/>
+    <elementref ref="Silver" fraction="0.022440"/>
+    <elementref ref="Tin" fraction="0.081145"/>
+    <elementref ref="Titanium" fraction="0.020737"/>
+  </material>
+
+  <material name="matEC_HybridR1H1" density="0.002329*1000">
+    <elementref ref="Aluminium" fraction="0.015723"/>
+    <elementref ref="Barium" fraction="0.062244"/>
+    <elementref ref="Carbon" fraction="0.223189"/>
+    <elementref ref="Copper" fraction="0.379731"/>
+    <elementref ref="Gold" fraction="0.004325"/>
+    <elementref ref="Hydrogen" fraction="0.012895"/>
+    <elementref ref="Lead" fraction="0.043978"/>
+    <elementref ref="Nickel" fraction="0.021420"/>
+    <elementref ref="Nitrogen" fraction="0.043495"/>
+    <elementref ref="Oxygen" fraction="0.062818"/>
+    <elementref ref="Silver" fraction="0.023760"/>
+    <elementref ref="Tin" fraction="0.084726"/>
+    <elementref ref="Titanium" fraction="0.021696"/>
+  </material>
+  <material name="matEC_HybridR2H0" density="0.002217*1000">
+    <elementref ref="Aluminium" fraction="0.011959"/>
+    <elementref ref="Barium" fraction="0.074836"/>
+    <elementref ref="Carbon" fraction="0.216346"/>
+    <elementref ref="Copper" fraction="0.398835"/>
+    <elementref ref="Gold" fraction="0.004542"/>
+    <elementref ref="Hydrogen" fraction="0.011858"/>
+    <elementref ref="Lead" fraction="0.035170"/>
+    <elementref ref="Nickel" fraction="0.023559"/>
+    <elementref ref="Nitrogen" fraction="0.045683"/>
+    <elementref ref="Oxygen" fraction="0.063084"/>
+    <elementref ref="Silver" fraction="0.017340"/>
+    <elementref ref="Tin" fraction="0.070704"/>
+    <elementref ref="Titanium" fraction="0.026085"/>
+  </material>
+
+  <material name="matEC_HybridR3H0" density="0.001911*1000">
+    <elementref ref="Aluminium" fraction="0.011684"/>
+    <elementref ref="Barium" fraction="0.029534"/>
+    <elementref ref="Carbon" fraction="0.253875"/>
+    <elementref ref="Copper" fraction="0.462759"/>
+    <elementref ref="Gold" fraction="0.005270"/>
+    <elementref ref="Hydrogen" fraction="0.014025"/>
+    <elementref ref="Lead" fraction="0.025363"/>
+    <elementref ref="Nickel" fraction="0.018224"/>
+    <elementref ref="Nitrogen" fraction="0.053005"/>
+    <elementref ref="Oxygen" fraction="0.053494"/>
+    <elementref ref="Silver" fraction="0.014008"/>
+    <elementref ref="Tin" fraction="0.048465"/>
+    <elementref ref="Titanium" fraction="0.010294"/>
+  </material>
+
+  <material name="matEC_HybridR3H1" density="0.002005*1000">
+    <elementref ref="Aluminium" fraction="0.011138"/>
+    <elementref ref="Barium" fraction="0.046565"/>
+    <elementref ref="Carbon" fraction="0.242011"/>
+    <elementref ref="Copper" fraction="0.441134"/>
+    <elementref ref="Gold" fraction="0.005024"/>
+    <elementref ref="Hydrogen" fraction="0.013370"/>
+    <elementref ref="Lead" fraction="0.027924"/>
+    <elementref ref="Nickel" fraction="0.020280"/>
+    <elementref ref="Nitrogen" fraction="0.050528"/>
+    <elementref ref="Oxygen" fraction="0.057430"/>
+    <elementref ref="Silver" fraction="0.013499"/>
+    <elementref ref="Tin" fraction="0.054867"/>
+    <elementref ref="Titanium" fraction="0.016231"/>
+  </material>
+
+  <material name="matEC_HybridR3H2" density="0.001907*1000">
+    <elementref ref="Aluminium" fraction="0.011594"/>
+    <elementref ref="Barium" fraction="0.029306"/>
+    <elementref ref="Carbon" fraction="0.254014"/>
+    <elementref ref="Copper" fraction="0.463746"/>
+    <elementref ref="Gold" fraction="0.005282"/>
+    <elementref ref="Hydrogen" fraction="0.014018"/>
+    <elementref ref="Lead" fraction="0.025167"/>
+    <elementref ref="Nickel" fraction="0.018203"/>
+    <elementref ref="Nitrogen" fraction="0.053118"/>
+    <elementref ref="Oxygen" fraction="0.053348"/>
+    <elementref ref="Silver" fraction="0.013900"/>
+    <elementref ref="Tin" fraction="0.048091"/>
+    <elementref ref="Titanium" fraction="0.010215"/>
+  </material>
+
+  <material name="matEC_HybridR3H3" density="0.002000*1000">
+    <elementref ref="Aluminium" fraction="0.011056"/>
+    <elementref ref="Barium" fraction="0.046222"/>
+    <elementref ref="Carbon" fraction="0.242231"/>
+    <elementref ref="Copper" fraction="0.442234"/>
+    <elementref ref="Gold" fraction="0.005037"/>
+    <elementref ref="Hydrogen" fraction="0.013367"/>
+    <elementref ref="Lead" fraction="0.027719"/>
+    <elementref ref="Nickel" fraction="0.020245"/>
+    <elementref ref="Nitrogen" fraction="0.050654"/>
+    <elementref ref="Oxygen" fraction="0.057261"/>
+    <elementref ref="Silver" fraction="0.013399"/>
+    <elementref ref="Tin" fraction="0.054464"/>
+    <elementref ref="Titanium" fraction="0.016111"/>
+  </material>
+
+  <material name="matEC_HybridR4H0" density="0.001775*1000">
+    <elementref ref="Aluminium" fraction="0.008135"/>
+    <elementref ref="Barium" fraction="0.022302"/>
+    <elementref ref="Carbon" fraction="0.256947"/>
+    <elementref ref="Copper" fraction="0.498279"/>
+    <elementref ref="Gold" fraction="0.005675"/>
+    <elementref ref="Hydrogen" fraction="0.013571"/>
+    <elementref ref="Lead" fraction="0.018727"/>
+    <elementref ref="Nickel" fraction="0.017545"/>
+    <elementref ref="Nitrogen" fraction="0.057074"/>
+    <elementref ref="Oxygen" fraction="0.047715"/>
+    <elementref ref="Silver" fraction="0.010489"/>
+    <elementref ref="Tin" fraction="0.035768"/>
+    <elementref ref="Titanium" fraction="0.007774"/>
+  </material>
+
+  <material name="matEC_HybridR4H1" density="0.001835*1000">
+    <elementref ref="Aluminium" fraction="0.007868"/>
+    <elementref ref="Barium" fraction="0.034268"/>
+    <elementref ref="Carbon" fraction="0.248501"/>
+    <elementref ref="Copper" fraction="0.481900"/>
+    <elementref ref="Gold" fraction="0.005488"/>
+    <elementref ref="Hydrogen" fraction="0.013125"/>
+    <elementref ref="Lead" fraction="0.020926"/>
+    <elementref ref="Nickel" fraction="0.018974"/>
+    <elementref ref="Nitrogen" fraction="0.055198"/>
+    <elementref ref="Oxygen" fraction="0.050585"/>
+    <elementref ref="Silver" fraction="0.010253"/>
+    <elementref ref="Tin" fraction="0.040968"/>
+    <elementref ref="Titanium" fraction="0.011945"/>
+  </material>
+
+  <material name="matEC_HybridR5H0" density="0.001724*1000">
+    <elementref ref="Aluminium" fraction="0.006621"/>
+    <elementref ref="Barium" fraction="0.019448"/>
+    <elementref ref="Carbon" fraction="0.257935"/>
+    <elementref ref="Copper" fraction="0.512994"/>
+    <elementref ref="Gold" fraction="0.005842"/>
+    <elementref ref="Hydrogen" fraction="0.013356"/>
+    <elementref ref="Lead" fraction="0.016038"/>
+    <elementref ref="Nickel" fraction="0.017274"/>
+    <elementref ref="Nitrogen" fraction="0.058759"/>
+    <elementref ref="Oxygen" fraction="0.045248"/>
+    <elementref ref="Silver" fraction="0.009086"/>
+    <elementref ref="Tin" fraction="0.030619"/>
+    <elementref ref="Titanium" fraction="0.006779"/>
+  </material>
+
+  <material name="matEC_HybridR5H1" density="0.001769*1000">
+    <elementref ref="Aluminium" fraction="0.006450"/>
+    <elementref ref="Barium" fraction="0.028926"/>
+    <elementref ref="Carbon" fraction="0.251272"/>
+    <elementref ref="Copper" fraction="0.499742"/>
+    <elementref ref="Gold" fraction="0.005692"/>
+    <elementref ref="Hydrogen" fraction="0.013011"/>
+    <elementref ref="Lead" fraction="0.017835"/>
+    <elementref ref="Nickel" fraction="0.018404"/>
+    <elementref ref="Nitrogen" fraction="0.057241"/>
+    <elementref ref="Oxygen" fraction="0.047568"/>
+    <elementref ref="Silver" fraction="0.008937"/>
+    <elementref ref="Tin" fraction="0.034839"/>
+    <elementref ref="Titanium" fraction="0.010083"/>
+  </material>
+
+</materials>
+
+<logvol name="ECHybridPCBR0H0" shape="ShE_HybridR0H0" material="matEC_HybridR0H0">
+  <index ref="eta_module" value="0"/>
+</logvol>
+<assembly name="ECHybridR0H0">
+  <logvolref ref="ECHybridPCBR0H0"/>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*(N_ABC_R0-1.5))"/>		
+      <translation y="E_HCCRadiusR0H0+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*1)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*2)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*3)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceABC4OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*4)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*5)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*6)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+<transform>
+    <transformation name="PlaceABC7OnE_HybridR0H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*7)"/>	
+      <translation y="E_HybridRadiusMinR0H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+</assembly>
+
+<logvol name="ECHybridPCBR0H1" shape="ShE_HybridR0H1" material="matEC_HybridR0H1">
+  <index ref="eta_module" value="0"/>
+</logvol>
+<assembly name="ECHybridR0H1">
+  <logvolref ref="ECHybridPCBR0H1"/>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*(N_ABC_R0-1.5))"/>		
+      <translation y="E_HCCRadiusR0H1+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*1)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*2)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*3)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*4)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*5)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*6)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR0H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_0/(2*N_ABC_R0)*(1-N_ABC_R0+2*7)"/>	
+      <translation y="E_HybridRadiusMaxR0H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+</assembly>
+<logvol name="ECHybridPCBR1H0" shape="ShE_HybridR1H0" material="matEC_HybridR1H0">
+  <index ref="eta_module" value="1"/>
+</logvol>
+<assembly name="ECHybridR1H0">
+  <logvolref ref="ECHybridPCBR1H0"/>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*(N_ABC_R1-1.5))"/>		
+      <translation y="E_HCCRadiusR1H0+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*1)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*2)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*3)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*4)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*5)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*6)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*7)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC8OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*8)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC9OnE_HybridR1H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*9)"/>	
+      <translation y="E_HybridRadiusMinR1H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+</assembly>
+
+<logvol name="ECHybridPCBR1H1" shape="ShE_HybridR1H1" material="matEC_HybridR1H1">
+  <index ref="eta_module" value="1"/>
+</logvol>
+
+<assembly name="ECHybridR1H1">
+  <logvolref ref="ECHybridPCBR1H1"/>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*(N_ABC_R1-1.5))"/>		
+      <translation y="E_HCCRadiusR1H1+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*1)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*2)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*3)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*4)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*5)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*6)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*7)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC8OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*8)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC9OnE_HybridR1H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R1)*(1-N_ABC_R1+2*9)"/>	
+      <translation y="E_HybridRadiusMaxR1H1-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<logvol name="ECHybridPCBR2H0" shape="ShE_HybridR2H0" material="matEC_HybridR2H0">
+  <index ref="eta_module" value="2"/>
+</logvol>
+
+<assembly name="ECHybridR2H0">
+  <logvolref ref="ECHybridPCBR2H0"/>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*(N_ABC_R2-1.5))"/>		
+      <translation y="E_HCCRadiusR2H0+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceHCCOnB_HybridR2H0a">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*(N_ABC_R2-1.5))"/>		
+      <translation y="E_HCCRadiusR2H0a+HCC_L/2" z="(E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*0)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR2H0a">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*1)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*2)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*3)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*4)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*5)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*6)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*7)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC8OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*8)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC9OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*9)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC10OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*10)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC11OnE_HybridR2H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_2/(2*N_ABC_R2)*(1-N_ABC_R2+2*11)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+<!--  <multicopy name="PlaceABCsOnR2_Hybrid" n="N_ABC_R2">  
+    <transformation name="ABC_ReadyForCopyingToR2_Hybrid">
+      <rotation zcos="1.0" angle="SensorPhiWidth_1/(2*N_ABC_R2)*(1-N_ABC_R2+2*N_ABC_R2)"/>	
+      <translation y="E_HybridRadiusMinR2H0+ABC_ToEHybridEdgeGap+ABC_L/2"  z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>
+    <logvolref ref="ABC_Chip"/>
+  </multicopy>
+-->
+</assembly>
+
+<logvol name="ECHybridPCBR3H0" shape="ShE_HybridR3H0" material="matEC_HybridR3H0">
+  <index ref="eta_module" value="3"/>
+</logvol>
+
+<assembly name="ECHybridR3H0">
+  <logvolref ref="ECHybridPCBR3H0"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR3H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/>	
+      <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR3H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/>	
+      <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR3H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/>	
+      <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR3H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/>	
+      <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR3H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/>	
+      <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR3H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/>	
+      <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR3H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/>	
+      <translation y="E_HybridRadiusMinR3H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<logvol name="ECHybridPCBR3H2" shape="ShE_HybridR3H2" material="matEC_HybridR3H2">
+  <index ref="eta_module" value="3"/>
+</logvol>
+<assembly name="ECHybridR3H2">
+  <logvolref ref="ECHybridPCBR3H2"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR3H2">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/>	
+      <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR3H2">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/>	
+      <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR3H2">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/>	
+      <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR3H2">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/>	
+      <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR3H2">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/>	
+      <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR3H2">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/>	
+      <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR3H2">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/>	
+      <translation y="E_HybridRadiusMaxR3H2-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<logvol name="ECHybridPCBR3H1" shape="ShE_HybridR3H1" material="matEC_HybridR3H1">
+  <index ref="eta_module" value="3"/>
+</logvol>
+
+<assembly name="ECHybridR3H1">
+  <logvolref ref="ECHybridPCBR3H1"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR3H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/>	
+      <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR3H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/>	
+      <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR3H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/>	
+      <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR3H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/>	
+      <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR3H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/>	
+      <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR3H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/>	
+      <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR3H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/>	
+      <translation y="E_HybridRadiusMinR3H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<logvol name="ECHybridPCBR3H3" shape="ShE_HybridR3H3" material="matEC_HybridR3H3">
+  <index ref="eta_module" value="3"/>
+</logvol>
+
+<assembly name="ECHybridR3H3">
+  <logvolref ref="ECHybridPCBR3H3"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR3H3">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*0)"/>	
+      <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR3H3">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*1)"/>	
+      <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR3H3">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*2)"/>	
+      <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR3H3">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*3)"/>	
+      <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR3H3">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*4)"/>	
+      <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR3H3">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*5)"/>	
+      <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR3H3">
+      <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*6)"/>	
+      <translation y="E_HybridRadiusMaxR3H3-ABC_ToEHybridEdgeGap-ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<logvol name="ECHybridPCBR4H0" shape="ShE_HybridR4H0" material="matEC_HybridR4H0">
+  <index ref="eta_module" value="4"/>
+</logvol>
+<assembly name="ECHybridR4H0">
+  <logvolref ref="ECHybridPCBR4H0"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*0)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*1)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*2)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*3)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*4)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*5)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*6)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR4H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*7)"/>	
+      <translation y="E_HybridRadiusMinR4H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+</assembly>
+
+<logvol name="ECHybridPCBR4H1" shape="ShE_HybridR4H1" material="matEC_HybridR4H1">
+  <index ref="eta_module" value="4"/>
+</logvol>
+
+<assembly name="ECHybridR4H1">
+  <logvolref ref="ECHybridPCBR4H1"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*0)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*1)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*2)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*3)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*4)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*5)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*6)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR4H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*7)"/>	
+      <translation y="E_HybridRadiusMinR4H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<logvol name="ECHybridPCBR5H0" shape="ShE_HybridR5H0" material="matEC_HybridR5H0">
+  <index ref="eta_module" value="5"/>
+</logvol>
+<assembly name="ECHybridR5H0">
+  <logvolref ref="ECHybridPCBR5H0"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*0)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*1)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*2)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*3)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*4)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*5)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*6)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*7)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC8OnE_HybridR5H0">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*8)"/>	
+      <translation y="E_HybridRadiusMinR5H0+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<logvol name="ECHybridPCBR5H1" shape="ShE_HybridR5H1" material="matEC_HybridR5H1">
+  <index ref="eta_module" value="5"/>
+</logvol>
+
+<assembly name="ECHybridR5H1">
+  <logvolref ref="ECHybridPCBR5H1"/>
+
+  <transform>
+    <transformation name="PlaceABC0OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*0)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC1OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*1)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC2OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*2)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC3OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*3)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC4E_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*4)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC5OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*5)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC6OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*6)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC7OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*7)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceABC8OnE_HybridR5H1">
+      <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*8)"/>	
+      <translation y="E_HybridRadiusMinR5H1+ABC_ToEHybridEdgeGap+ABC_L/2" z="(E_HybridT + ABC_T) / 2"/>
+    </transformation>  
+    <logvolref ref="ABC_Chip"/>
+  </transform>
+</assembly>
+
+<!-- To be included in Endcaps.gmx. Builds up the Petal Plank cores (including bus tape copper) -->
+<!-- GeoModelXml input created by ConsolidX for BusTape, version 1.0. -->
+
+<materials>
+  <material name="matPetalBusKapton" density="1.180">
+    <elementref ref="Carbon" fraction="0.524968"/>
+    <elementref ref="Copper" fraction="0.266830"/>
+    <elementref ref="Hydrogen" fraction="0.031077"/>
+    <elementref ref="Nitrogen" fraction="0.098203"/>
+    <elementref ref="Oxygen" fraction="0.078922"/>
+  </material>
+</materials>
+
+<shapes>
+
+  <tubs name="ShPetalCore" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalCoreThickness/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/>
+  <tubs name="ShPetalEOS" rmin="PetalEarInnerRadius" rmax="PetalEarOuterRadius" zhalflength="PetalCoreThickness/2" sphi="-PetalEarAngle/2" dphi="PetalEarAngle"/>
+  <union name="shPetalCore">
+    <shaperef ref="ShPetalCore"/>
+    <transformation name="PlaceFirstEOS">
+      <rotation zcos="1" angle="(PetalCoreAngle + PetalEarAngle)/2"/>
+    </transformation>
+    <shaperef ref="ShPetalEOS"/>
+  </union>
+
+  <tubs name="ShPetalFaceSheet" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalFaceSheetT/2 - EPS" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/>
+
+  <tubs name="ShPetalEOS_FaceSheet" rmin="PetalEarInnerRadius" rmax="PetalEarOuterRadius" zhalflength="PetalFaceSheetT/2 - EPS" sphi="-PetalEarAngle/2" dphi="PetalEarAngle"/>
+
+  <union name="shPetalFaceSheet">
+    <shaperef ref="ShPetalFaceSheet"/>
+    <transformation name="PlaceFirstEOS_FaceSheet">
+      <rotation zcos="1" angle="(PetalCoreAngle + PetalEarAngle)/2"/>
+    </transformation>
+    <shaperef ref="ShPetalEOS_FaceSheet"/>
+  </union>
+
+  <tubs name="shPetalCloseoutFar" rmin="PetalCoreOuterRadius-PetalCloseoutW" rmax="PetalCoreOuterRadius" zhalflength="PetalCloseoutT/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle+PetalEarAngle"/> 
+  <tubs name="shPetalCloseoutNear" rmin="PetalCoreInnerRadius" rmax="PetalCoreInnerRadius+PetalCloseoutW" zhalflength="PetalCloseoutT/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/> 
+  <box name="shPetalCloseoutLong" xhalflength="PetalCchannelLongL/2 -2*EPS" yhalflength="PetalCchannelW/2" zhalflength="PetalCFoamT/2 - EPS"/>
+  <box name="shPetalCloseoutLongSpace" xhalflength="(PetalCchannelLongL-1)/2" yhalflength="PetalCchannelInnerW/2" zhalflength="PetalCchannelInnerT/2"/>
+  <box name="shPetalCloseoutShort" xhalflength="PetalCchannelShortL/2 - EPS" yhalflength="PetalCchannelW/2" zhalflength="PetalCFoamT/2 - EPS"/>
+  <box name="shPetalCloseoutShortSpace" xhalflength="(PetalCchannelShortL-1)/2" yhalflength="PetalCchannelInnerW/2" zhalflength="PetalCchannelInnerT/2"/>
+  <tubs name="shPetalBusKapton" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalBusKaptonT/2" sphi="-PetalCoreAngle/2" dphi="PetalCoreAngle"/> 
+
+  <tubs name="shPetalBusGlue" rmin="PetalCoreInnerRadius" rmax="PetalCoreOuterRadius" zhalflength="PetalBusGlueT/2" sphi="-SensorPhiWidth_0/2" dphi="SensorPhiWidth_0"/>
+
+  <box name="shPetalCFoam1" xhalflength="PetalCooling1L/2" yhalflength="PetalCFoamW/2" zhalflength="PetalCFoamT/2 - EPS"/>
+
+  <tube name="shPetalCooling1Tube" rmin="0.0" rmax="PetalCoolingPipeOD" zhalflength="PetalCooling1L/2 - 2 * EPS"/>
+
+  <tube name="shPetalCooling1CO2" rmin="0.0" rmax="PetalCoolingPipeID" zhalflength="PetalCooling1L/2 - 3 * EPS"/>
+
+  <box name="shPetalCFoam2" xhalflength="PetalCooling2L/2" yhalflength="PetalCFoamW/2" zhalflength="PetalCFoamT/2 - EPS"/>  
+
+  <tube name="shPetalCooling2Tube" rmin="0.0" rmax="PetalCoolingPipeOD" zhalflength="PetalCooling2L/2 - 2 * EPS"/>
+
+  <tube name="shPetalCooling2CO2" rmin="0.0" rmax="PetalCoolingPipeID" zhalflength="PetalCooling2L/2 - 3 * EPS"/>
+
+  <box name="shPetalCFoam3" xhalflength="PetalCooling3L/2" yhalflength="PetalCFoamW/2" zhalflength="PetalCFoamT/2 - EPS"/>
+
+  <tube name="shPetalCooling3Tube" rmin="0.0" rmax="PetalCoolingPipeOD" zhalflength="PetalCooling3L/2 - 2 * EPS"/>
+
+  <tube name="shPetalCooling3CO2" rmin="0.0" rmax="PetalCoolingPipeID" zhalflength="PetalCooling3L/2 - 3 * EPS"/>
+
+</shapes>
+
+<logvol name="PetalFaceSheetAll" shape="shPetalFaceSheet" material="K13C2U"/>
+<logvol name="PetalBusKapton" shape="shPetalBusKapton" material="matPetalBusKapton"/>
+<logvol name="PetalBusGlue" shape="shPetalBusGlue" material="SE4445"/> 
+<logvol name="PetalCloseoutFar" shape="shPetalCloseoutFar" material="Torlon"/>
+<logvol name="PetalCloseoutNear" shape="shPetalCloseoutNear" material="Torlon"/>
+<logvol name="PetalCloseoutLong" shape="shPetalCloseoutLong" material="T300CF">
+<transform>
+    <transformation name="Place_PetalCloseoutLongSpace">   
+    <translation y="-(PetalCchannelW-PetalCchannelInnerW)/2+EPS"/>			 
+    </transformation>
+<logvol name="PetalCloseoutLongSpace" shape="shPetalCloseoutLongSpace" material="Air"/>
+  
+  </transform>
+</logvol>
+<logvol name="PetalCloseoutShort" shape="shPetalCloseoutShort" material="T300CF">
+<transform>
+<transformation name="Place_PetalCloseoutShortSpace">
+        <translation y="((PetalCchannelW-PetalCchannelInnerW)/2-EPS)"/>			 
+    </transformation>
+<logvol name="PetalCloseoutShortSpace" shape="shPetalCloseoutShortSpace" material="Air"/>
+  </transform>
+</logvol>
+
+
+<logvol name="PetalCooling1Unit" shape="shPetalCFoam1" material="k9Allcomp">
+  <transform>
+    <transformation name="PlaceTubeInPetalCFoam1">
+      <rotation ycos="1" angle="PI / 2."/>
+    </transformation>
+      <logvol name="PetalCoolingTube" shape="shPetalCooling1Tube" material="TiMetal">
+        <logvol name="PetalCoolingCO2" shape="shPetalCooling1CO2" material="CO2Liquid"/>
+      </logvol>
+  </transform>
+</logvol>
+
+<logvol name="PetalCooling2Unit" shape="shPetalCFoam2" material="k9Allcomp">
+  <transform>
+    <transformation name="PlaceTubeInPetalCFoam2">
+      <rotation ycos="1" angle="PI / 2."/>
+    </transformation>
+      <logvol name="PetalCooling2Tube" shape="shPetalCooling2Tube" material="TiMetal">
+        <logvol name="PetalCooling2CO2" shape="shPetalCooling2CO2" material="CO2Liquid"/>
+      </logvol>
+  </transform>
+</logvol>
+
+<logvol name="PetalCooling3Unit" shape="shPetalCFoam3" material="k9Allcomp">
+  <transform>
+    <transformation name="PlaceTubeInPetalCFoam3">
+      <rotation ycos="1" angle="PI / 2."/>
+    </transformation>
+      <logvol name="PetalCooling3Tube" shape="shPetalCooling3Tube" material="TiMetal">
+        <logvol name="PetalCooling3CO2" shape="shPetalCooling3CO2" material="CO2Liquid"/>
+      </logvol>
+  </transform>
+</logvol>
+
+<logvol name="PetalCore" shape="shPetalCore" material="Honeycomb3pcf">
+
+  <transform>
+    <transformation name="Place_PetalCloseoutFar">
+      <translation x="0.00"/>
+    </transformation>
+    <logvolref ref="PetalCloseoutFar"/>
+  </transform>
+
+  <transform>
+    <transformation name="Place_PetalCloseoutNear">
+      <translation x="0.00"/>
+    </transformation>
+    <logvolref ref="PetalCloseoutNear"/>
+  </transform>
+
+<transform>
+    <transformation name="Place_PetalCloseoutShort">
+    <rotation zcos="1" angle="+0.962*PetalCoreAngle/2"/>	
+    <translation x="PetalCoreInnerRadius +PetalCchannelShortL/2+PetalCloseoutW "/>
+      
+    </transformation>
+    <logvolref ref="PetalCloseoutShort"/>
+  </transform>
+
+  <transform>
+    <transformation name="Place_PetalCloseoutLong">
+    <rotation zcos="1" angle="-0.962*PetalCoreAngle/2"/>
+    <translation x="PetalCoreInnerRadius + (PetalCchannelLongL)/2+PetalCloseoutW "/>	
+
+    </transformation>
+    <logvolref ref="PetalCloseoutLong"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceLowZ_PetalFacesheet">
+      <translation z="-((PetalHoneycombT + PetalFaceSheetT)/2)"/>
+    </transformation>
+    <logvolref ref="PetalFaceSheetAll"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceHighZ_PetalFacesheet">
+      <translation z="(PetalHoneycombT + PetalFaceSheetT)/2"/>
+    </transformation>
+    <logvolref ref="PetalFaceSheetAll"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceLowZ_PetalBusGlue">
+      <translation z="-((PetalHoneycombT + PetalBusGlueT)/2 + PetalFaceSheetT)"/>
+    </transformation>
+    <logvolref ref="PetalBusGlue"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceHighZ_PetalBusGlue">
+      <translation z="(PetalHoneycombT + PetalBusGlueT)/2 + PetalFaceSheetT"/>
+    </transformation>
+    <logvolref ref="PetalBusGlue"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceLowZ_PetalBusKapton">
+      <translation z="-((PetalHoneycombT + PetalBusKaptonT)/2 + PetalFaceSheetT + PetalBusGlueT)"/>
+    </transformation>
+    <logvolref ref="PetalBusKapton"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceHighZ_PetalBusKapton">
+      <translation z="(PetalHoneycombT + PetalBusKaptonT)/2 + PetalFaceSheetT + PetalBusGlueT"/>
+    </transformation>
+    <logvolref ref="PetalBusKapton"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlacePetal_Cooling1">
+      <rotation zcos="1" angle="-4*PI/180"/>	
+      <translation x="(PetalCoreInnerRadius + PetalCooling1L/2+PetalCloseoutW) "/>
+          </transformation>
+    <logvolref ref="PetalCooling1Unit"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlacePetal_Cooling2">
+      <rotation zcos="1" angle="+4*PI/180"/>
+      <translation x="(PetalCoreInnerRadius + PetalCooling2L/2+PetalCloseoutW) "/>
+    </transformation>
+    <logvolref ref="PetalCooling2Unit"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlacePetal_Cooling3">
+      <translation x="(PetalCoreOuterRadius-40) "/>
+      <translation y="(30) "/>			
+      <rotation zcos="1" angle="+PI/2"/>
+    </transformation>
+    <logvolref ref="PetalCooling3Unit"/>
+  </transform>
+
+</logvol>
+
+<assembly name="PetalPlank"> <!-- A core plus the Cu in the cable bus plus mounts -->
+  <logvolref ref="PetalCore"/>
+</assembly>
+
+<shapes>
+  <tube name="shEC_InnerCyl" rmin="EC_InnerCylInnerR" rmax="EC_InnerCylOuterR - EPS" zhalflength="EC_InnerCylLength / 2."/>
+
+  <tube name="shWheelInnerT_Base" rmin="EC_InnerCylOuterR" rmax="WheelInnerT_BaseOuterR" zhalflength="WheelInnerT_BaseWidth / 2."/>
+  <tube name="shWheelInnerT_Upright" rmin="WheelInnerT_BaseOuterR" rmax="WheelInnerT_UprightOuterR" zhalflength="WheelInnerT_UprightThickness / 2."/>
+  <union name="shWheelInnerT">
+    <shaperef ref="shWheelInnerT_Base"/>
+    <transformationref ref="IdentityTransform"/>
+    <shaperef ref="shWheelInnerT_Upright"/>
+  </union>
+
+  <tube name="shWheelOuterT_Base" rmin="WheelOuterT_BaseInnerR" rmax="WheelOuterT_OuterR" zhalflength="WheelOuterT_BaseWidth / 2.0"/>
+  <tube name="shWheelOuterT_Upright" rmin="WheelOuterT_UprightInnerR" rmax="WheelOuterT_BaseInnerR" zhalflength="WheelOuterT_UprightThickness / 2.0"/>
+  <union name="shWheelOuterT">
+    <shaperef ref="shWheelOuterT_Base"/>
+    <transformationref ref="IdentityTransform"/>
+    <shaperef ref="shWheelOuterT_Upright"/>
+  </union>
+
+  <tube name="shStiffDiscCF" rmin="StiffDiscRI" rmax="StiffDiscRO" zhalflength="StiffDiscCF_T / 2."/>
+  <tube name="shStiffDiscFoam" rmin="StiffDiscRI" rmax="StiffDiscRO" zhalflength="StiffDiscFoamT / 2. - 2. * EPS"/>
+
+  <tube name="shZtubeD0D1" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_1 - WheelZ_0 - WheelOuterT_UprightThickness) / 2. - EPS"/>
+  <tube name="shZtubeD1D2" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_2 - WheelZ_1 - WheelOuterT_UprightThickness) / 2. - EPS"/>
+  <tube name="shZtubeD2D3" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_3 - WheelZ_2 - WheelOuterT_UprightThickness) / 2. - EPS"/>
+  <tube name="shZtubeD3D4" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_4 - WheelZ_3 - WheelOuterT_UprightThickness) / 2. - EPS"/>
+  <tube name="shZtubeD4D5" rmin="ZtubeRI" rmax="ZtubeRO" zhalflength="(WheelZ_5 - WheelZ_4 - WheelOuterT_UprightThickness) / 2. - EPS"/>
+
+
+
+
+
+  <trd name="BladeFaceSheet" xhalflength1="BladeFaceSheetThickness / 2." xhalflength2="BladeFaceSheetThickness / 2." yhalflength1="BladeOuterEndWidth / 2. + BladeLength * tan( BladeAngle / 2. )" yhalflength2="BladeOuterEndWidth / 2." zhalflength="BladeLength / 2."/>
+
+  <trd name="BladeCoreTrap" xhalflength1="BladeRodOuterEdge / 2. - 0.05" xhalflength2="BladeRodOuterEdge / 2. - 0.05" yhalflength1="BladeOuterEndWidth / 2. + BladeLength * tan( BladeAngle / 2. ) - 0.05" yhalflength2="BladeOuterEndWidth / 2. - 0.05" zhalflength="BladeLength / 2."/>
+
+  <trap name="BladeRodCore" zhalflength="(BladeLength / 2. ) + 1" theta="-BladeAngle / 2." phi="PI / 2." dydzn="BladeRodInnerEdge / 2." dxdyndzn="BladeRodInnerEdge / 2." dxdypdzn="BladeRodInnerEdge / 2." angleydzn="0." dydzp="BladeRodInnerEdge / 2." dxdyndzp="BladeRodInnerEdge / 2." dxdypdzp="BladeRodInnerEdge / 2." angleydzp="0."/>
+
+  <trap name="BladeRodShell" zhalflength="(BladeLength / 2. )" theta="-BladeAngle / 2." phi="PI / 2." dydzn="BladeRodOuterEdge / 2." dxdyndzn="BladeRodOuterEdge / 2." dxdypdzn="BladeRodOuterEdge / 2." angleydzn="0." dydzp="BladeRodOuterEdge / 2." dxdyndzp="BladeRodOuterEdge / 2." dxdypdzp="BladeRodOuterEdge / 2." angleydzp="0."/>
+
+  <tube name="BladeCircle0" rmin="0." rmax="BladeHoleDiameter_0 / 2." zhalflength="BladeHoleThickness"/>
+
+  <tube name="BladeCircle1" rmin="0." rmax="BladeHoleDiameter_1 / 2." zhalflength="BladeHoleThickness"/>
+
+  <tube name="BladeCircle2" rmin="0." rmax="BladeHoleDiameter_2 / 2." zhalflength="BladeHoleThickness"/>
+
+  <tube name="BladeCircle3" rmin="0." rmax="BladeHoleDiameter_3 / 2." zhalflength="BladeHoleThickness"/>
+
+  <tube name="BladeCircle4" rmin="0." rmax="BladeHoleDiameter_4 / 2." zhalflength="BladeHoleThickness"/>
+
+  <tube name="BladeCircle5" rmin="0." rmax="BladeHoleDiameter_5 / 2." zhalflength="BladeHoleThickness"/>
+
+  <tube name="BladeCircle6" rmin="0." rmax="BladeHoleDiameter_6 / 2." zhalflength="BladeHoleThickness"/>
+
+  <tubs name="BladeCircle7" rmin="0." rmax="BladeBarrelR" sphi="PI / 2." dphi="PI" zhalflength="BladeHoleThickness"/>
+
+  <tube name="BladeBarrelCore" rmin="0." rmax="BladeBarrelR" zhalflength="BladeHoleThickness"/>
+
+  <box name="BladeBaseHole" xhalflength="BladeBaseHeight" yhalflength="BladeBaseWidth / 2." zhalflength="BladeHoleThickness"/>
+
+  <tube name="shECPSTube" rmin="BarrelRadius_0 + EPS" rmax="BarrelRadius_0 + StaveSupportCylThickness - EPS" zhalflength="ECPSTLength / 2."/>
+
+
+
+  <union name="BarrelBase">
+    <shaperef ref="BladeBarrelCore"/>
+    <transformation name="AddBase">
+      <translation y="BladeBarrelR"/>
+      <rotation zcos="1." angle="PI / 2."/>
+    </transformation>
+    <shaperef ref="BladeBaseHole"/>
+  </union>
+
+  <union name="BarrelBase1Hole">
+    <shaperef ref="BarrelBase"/>
+    <transformation name="AddCircle1">
+      <translation y="BladeHoleOffset"/>
+    </transformation>
+    <shaperef ref="BladeCircle6"/>
+  </union>
+
+  <union name="BarrelBase2Hole">
+    <shaperef ref="BarrelBase1Hole"/>
+    <transformation name="AddCircle2">
+      <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + BladeHoleGap  + BladeHoleDiameter_5 / 2."/>
+    </transformation>
+    <shaperef ref="BladeCircle5"/>
+  </union>
+
+  <union name="BarrelBase3Hole">
+    <shaperef ref="BarrelBase2Hole"/>
+    <transformation name="AddCircle3">
+      <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (2 * BladeHoleGap)  + BladeHoleDiameter_5 + BladeHoleDiameter_4 / 2."/>
+    </transformation>
+    <shaperef ref="BladeCircle4"/>
+  </union>
+
+  <union name="BarrelBase4Hole">
+    <shaperef ref="BarrelBase3Hole"/>
+    <transformation name="AddCircle4">
+      <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (3 * BladeHoleGap)  + BladeHoleDiameter_5 + BladeHoleDiameter_4 + BladeHoleDiameter_3 / 2."/>
+    </transformation>
+    <shaperef ref="BladeCircle3"/>
+  </union>
+
+  <union name="BarrelBase5Hole">
+    <shaperef ref="BarrelBase4Hole"/>
+    <transformation name="AddCircle5">
+      <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (4 * BladeHoleGap)  + BladeHoleDiameter_5 + BladeHoleDiameter_4 + BladeHoleDiameter_3 + BladeHoleDiameter_2 / 2."/>
+    </transformation>
+    <shaperef ref="BladeCircle2"/>
+  </union>
+
+  <union name="BarrelBase6Hole">
+    <shaperef ref="BarrelBase5Hole"/>
+    <transformation name="AddCircle6">
+      <translation y="BladeHoleOffset + BladeHoleDiameter_6 / 2. + (5 * BladeHoleGap)  + BladeHoleDiameter_5 + BladeHoleDiameter_4 + BladeHoleDiameter_3 + BladeHoleDiameter_2 + BladeHoleDiameter_1 /2."/>
+    </transformation>
+    <shaperef ref="BladeCircle1"/>
+  </union>
+
+  <union name="BarrelBase7Hole">
+    <shaperef ref="BarrelBase6Hole"/>
+    <transformation name="AddCircle7">
+      <translation y="BladeLength - 3"/>
+    </transformation>
+    <shaperef ref="BladeCircle0"/>
+  </union>
+
+  <subtraction name="BladeFaceSheetComplete">
+    <shaperef ref="BladeFaceSheet"/>
+    <transformation name="BladeFSRemoveShapes">
+      <translation z="-(BladeLength / 2.)"/>
+      <rotation ycos="1." angle="-(PI / 2.)"/>
+      <rotation zcos="1." angle="-(PI / 2.)"/>
+    </transformation>
+    <shaperef ref="BarrelBase7Hole"/>
+  </subtraction>
+
+  <subtraction name="BladeCore7HoleNoBarrel">
+    <shaperef ref="BladeCoreTrap"/>
+    <transformation name="BladeCoreRemoveShapes">
+      <translation z="-(BladeLength / 2.)"/>
+      <rotation ycos="1." angle="-(PI / 2.)"/>
+      <rotation zcos="1." angle="-(PI / 2.)"/>
+    </transformation>
+    <shaperef ref="BarrelBase7Hole"/>
+  </subtraction>
+
+
+  <subtraction name="BladeCoreminusL">
+    <shaperef ref="BladeCore7HoleNoBarrel"/>
+    <transformation name="BladeCRemoveLRod">
+      <translation y="(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/>
+    </transformation>
+    <shaperef ref="BladeRodShell"/>
+  </subtraction>
+
+  <subtraction name="BladeCoreComplete">
+    <shaperef ref="BladeCoreminusL"/>
+    <transformation name="BladeCRemoveRRod">
+      <translation y="-(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/>
+      <rotation zcos="1." angle="PI"/>
+    </transformation>
+    <shaperef ref="BladeRodShell"/>
+  </subtraction>
+
+  <!-- Blade Siderods -->
+  <subtraction name="BladeSideRodRemoveCore">
+    <shaperef ref="BladeRodShell"/>
+    <transformation name="BladeSideRodHollow">
+      <rotation ycos="1." angle="0."/>
+    </transformation>
+    <shaperef ref="BladeRodCore"/>
+  </subtraction>
+  
+  <subtraction name="BladeSideRodComplete">
+    <shaperef ref="BladeSideRodRemoveCore"/>
+    <transformation name="BladeSideRodRemoveBarrel">
+      <translation y="-(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/>
+      <translation z="-(BladeLength / 2.)"/>
+      <rotation ycos="1." angle="PI / 2."/>
+    </transformation>
+    <shaperef ref="BladeBarrelCore"/>
+  </subtraction>
+
+  <box name="shLockBaseH" xhalflength="LockBaseHWidth / 2." yhalflength="LockBaseHHeight / 2." zhalflength="LockBaseHThickness / 2."/>
+
+  <box name="shLockBaseL" xhalflength="LockBaseLWidth / 2." yhalflength="LockBaseLHeight / 2." zhalflength="LockBaseLThickness / 2."/>
+
+  <tube name="shRailWheel" rmin="0." rmax="RailWheelRadius / 2." zhalflength="RailWheelLength / 2."/>
+
+  <tube name="shRailBolt" rmin="0." rmax="RailBoltRadius / 2." zhalflength="RailBoltHeight / 2."/>
+
+  <tube name="shRailBoltCore" rmin="0." rmax="RailBoltRadius / 2." zhalflength="RailShelfHeight / 2."/>
+
+  <box name="shRailShelf" xhalflength="RailShelfWidth / 2." yhalflength="RailShelfHeight / 2." zhalflength="RailShelfLength / 2."/>
+
+  <box name="shRailWall" xhalflength="RailWallWidth / 2." yhalflength="RailWallHeight / 2." zhalflength="RailWallLength / 2."/>
+
+  <box name="shRailSquare1" xhalflength="RailSquareEdge / 2." yhalflength="RailSquareEdge / 2." zhalflength="RailLengthS_0 / 2."/>
+
+  <trap name="shRailSquareT" zhalflength="RailLengthS_1 / 2." theta="RailSquareTAngle_1" phi="0." dydzn="RailSquareEdge / 2." dxdyndzn="(RailSquareEdge + 2) / 2." dxdypdzn="(RailSquareEdge + 2) / 2." angleydzn="0." dydzp="RailSquareEdge / 2." dxdyndzp="RailSquareEdge / 2." dxdypdzp="RailSquareEdge / 2." angleydzp="0."/>
+
+  <box name="shRailSquare2" xhalflength="RailSquareEdge / 2." yhalflength="(RailSquareEdge + 2) / 2." zhalflength="RailLengthS_2 / 2."/>
+
+  <tube name="shRailCircle" rmin="0." rmax="RailCircleRadius / 2." zhalflength="RailLength / 2."/>
+
+  <trap name="shRailWedge" zhalflength="RailWedgeLength / 2." theta="RailWedgeAngle / 2." phi="0." dydzn="RailWedgeWidth / 2." dxdyndzn="RailWedgeHeight_0 / 2." dxdypdzn="RailWedgeHeight_0 / 2." angleydzn="0." dydzp="RailWedgeWidth / 2." dxdyndzp="RailWedgeHeight_1 / 2." dxdypdzp="RailWedgeHeight_1 / 2." angleydzp="0."/>
+
+  <subtraction name="shRailBoltNoCore">
+    <shaperef ref="shRailBolt"/>
+    <transformation name="BoltSub">
+      <translation z="0."/>
+    </transformation>
+    <shaperef ref="shRailBoltCore"/>
+  </subtraction>
+
+</shapes>
+
+<logvol name="EC_InnerCyl" shape="shEC_InnerCyl" material="CFRP"/>
+<logvol name="WheelInnerT" shape="shWheelInnerT" material="CFRP"/>
+<logvol name="WheelOuterT" shape="shWheelOuterT" material="CFRP"/>
+
+<logvol name="StiffDiscCF" shape="shStiffDiscCF" material="CFRP"/>
+<logvol name="StiffDiscFoam" shape="shStiffDiscFoam" material="Rohacell110A"/>
+
+<logvol name="ZtubeD0D1" shape="shZtubeD0D1" material="CFRP"/>
+<logvol name="ZtubeD1D2" shape="shZtubeD1D2" material="CFRP"/>
+<logvol name="ZtubeD2D3" shape="shZtubeD2D3" material="CFRP"/>
+<logvol name="ZtubeD3D4" shape="shZtubeD3D4" material="CFRP"/>
+<logvol name="ZtubeD4D5" shape="shZtubeD4D5" material="CFRP"/>
+
+<logvol name="BladeFace" shape="BladeFaceSheetComplete" material="CFRP"/> <!-- Placeholder material -->
+<logvol name="BladeCore" shape="BladeCoreComplete" material="Honeycomb10pcf"/>
+<logvol name="BladeSideRod" shape="BladeSideRodComplete" material="CFRP"/>
+
+<logvol name="LockBaseH" shape="shLockBaseH" material="Torlon"/>
+<logvol name="LockBaseL" shape="shLockBaseL" material="Torlon"/>
+
+<logvol name="RailWall" shape="shRailWall" material="CFRP"/>
+<logvol name="RailShelf" shape="shRailShelf" material="CFRP"/>
+<logvol name="RailBolt" shape="shRailBoltNoCore" material="SS304"/>
+<logvol name="RailWheel" shape="shRailWheel" material="SS304"/>
+<logvol name="RailCircle" shape="shRailCircle" material="SS304"/>
+<logvol name="RailSquare1" shape="shRailSquare1" material="SS304"/>
+<logvol name="RailSquareT" shape="shRailSquareT" material="SS304"/>
+<logvol name="RailSquare" shape="shRailSquare2" material="SS304"/>
+<logvol name="RailWedge" shape="shRailWedge" material="SS304"/> <!-- Change to Bronze equivalent -->
+
+<logvol name="ECPSTube" shape="shECPSTube" material="CFRP"/>
+ 
+<assembly name="RailSquareComplete">
+  <transform>
+    <transformation name="AlignRailSquare">
+      <translation y="1."/>
+    </transformation>
+  <logvolref ref="RailSquare"/>
+  </transform>
+
+  <transform>
+    <transformation name="AttachRailT">
+      <translation z="RailLengthS_2 / 2. + RailLengthS_1 / 2. + EPS"/>
+      <translation y="tan(RailSquareTAngle_1) * RailLengthS_1 / 2. + EPS"/>
+      <rotation zcos="1." angle="-(PI / 2.)"/>
+    </transformation>
+    <logvolref ref="RailSquareT"/>
+  </transform>
+
+  <transform>
+    <transformation name="AttachRail1">
+      <translation z="RailLengthS_2 / 2. + RailLengthS_1 + RailLengthS_0 / 2. + EPS"/>
+    </transformation>
+    <logvolref ref="RailSquare1"/>
+  </transform>
+
+  <transform>
+    <transformation name="AttachWedge">
+      <translation z="RailLengthS_2 / 2. + RailLengthS_1 + RailLengthS_0 - RailWedgeOffset - RailWedgeLength / 2."/>
+      <translation y="RailSquareEdge / 2. + (RailWedgeHeight_0 + RailWedgeHeight_1) / 4. + 3*EPS"/>
+      <rotation zcos="1." angle="(PI / 2.)"/>
+    </transformation>
+  <logvolref ref="RailWedge"/>
+  </transform>
+</assembly>
+
+<assembly name="RailBoltReady">
+  <transform>
+    <transformation name="PrepareRailBolt">
+      <rotation xcos="1." angle="PI / 2."/>
+    </transformation>
+  <logvolref ref="RailBolt"/>
+  </transform>
+</assembly>
+
+<assembly name="RailWheelReady">
+  <transform>
+    <transformation name="PrepareRailWheel">
+      <rotation ycos="1." angle="PI / 2."/>
+    </transformation>
+  <logvolref ref="RailWheel"/>
+  </transform>
+</assembly>
+
+
+<assembly name="RailShelfWithBoltsSquare">
+  <multicopy name="AddBoltsToRail" n="RailBoltNumber">
+    <transformation name="PlaceRailBolts">
+      <translation z="RailBoltGap"/>
+    </transformation>
+    <assemblyref ref="RailBoltReady"/>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceRailShelf">
+      <translation z="RailShelfLength / 2. - RailBoltOffset"/>
+    </transformation>
+  <logvolref ref="RailShelf"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceRailSquare">
+      <translation x="-(RailShelfWidth / 2. - RailSquareEdge)"/>
+      <translation y="(RailShelfHeight + RailSquareEdge) / 2."/>
+      <translation z="RailLengthS_2 / 2. - RailBoltOffset"/>
+    </transformation>
+  <assemblyref ref="RailSquareComplete"/>
+  </transform>
+</assembly>
+
+
+<assembly name="RailShelfSquareComplete">
+  <logvolref ref="RailWall"/>
+  
+  <transform>
+    <transformation name="PlaceRailShelfWithBoltsSquare">
+      <translation x="RailWallWidth / 2. + RailShelfWidth / 2."/>
+      <translation y="-(RailWallHeight /2.) + RailShelfHeight"/>
+      <translation z="-(RailShelfLength / 2. - RailBoltOffset) + (RailShelfLength - RailWallLength) / 2."/>
+    </transformation>
+  <assemblyref ref="RailShelfWithBoltsSquare"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceWheelClose">
+      <translation x="(RailWallWidth + RailWheelLength) / 2."/>
+      <translation y="RailWheelRadius / 2."/>
+      <translation z="-(RailShelfLength / 2. - RailWheelOffsetClose)"/>
+    </transformation>
+  <assemblyref ref="RailWheelReady"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceWheelFar">
+      <translation x="(RailWallWidth + RailWheelLength) / 2."/>
+      <translation y="RailWheelRadius / 2."/>
+      <translation z="RailShelfLength / 2. - RailWheelOffsetFar"/>
+    </transformation>
+  <assemblyref ref="RailWheelReady"/>
+  </transform>
+
+</assembly>
+
+<assembly name="RailShelfWithBoltsCircle">
+  <multicopy name="AddBoltsToRail2" n="RailBoltNumber">
+    <transformation name="PlaceRailBolts2">
+      <translation z="RailBoltGap"/>
+    </transformation>
+    <assemblyref ref="RailBoltReady"/>
+  </multicopy>
+
+  <transform>
+    <transformation name="PlaceRailShelf2">
+      <translation z="RailShelfLength / 2. - RailBoltOffset"/>
+    </transformation>
+  <logvolref ref="RailShelf"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceRailCircle">
+      <translation x="RailShelfWidth / 2. - RailCircleRadius"/>
+      <translation y="(RailShelfHeight + RailCircleRadius) / 2."/>
+      <translation z="RailLengthS_2 / 2. - RailBoltOffset"/>
+    </transformation>
+  <logvolref ref="RailCircle"/>
+  </transform>
+</assembly>
+
+
+<assembly name="RailShelfCircleComplete">
+  <logvolref ref="RailWall"/>
+  
+  <transform>
+    <transformation name="PlaceRailShelfWithBoltsCircle">
+      <translation x="-(RailWallWidth / 2. + RailShelfWidth / 2.)"/>
+      <translation y="-(RailWallHeight /2.) + RailShelfHeight"/>
+      <translation z="-(RailShelfLength / 2. - RailBoltOffset) + (RailShelfLength - RailWallLength) / 2."/>
+    </transformation>
+  <assemblyref ref="RailShelfWithBoltsSquare"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceWheelClose2">
+      <translation x="-(RailWallWidth + RailWheelLength) / 2."/>
+      <translation y="RailWheelRadius / 2."/>
+      <translation z="-(RailShelfLength / 2. - RailWheelOffsetClose)"/>
+    </transformation>
+  <assemblyref ref="RailWheelReady"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceWheelFar2">
+      <translation x="-(RailWallWidth + RailWheelLength) / 2."/>
+      <translation y="RailWheelRadius / 2."/>
+      <translation z="RailShelfLength / 2. - RailWheelOffsetFar"/>
+    </transformation>
+  <assemblyref ref="RailWheelReady"/>
+  </transform>
+
+</assembly>
+
+
+
+<assembly name="Ztubes">
+  <!-- We place each tube midway between discs, remembering how much the whole endcap will be shifted when placed -->
+  <transform>
+    <transformation name="PlaceZtubeD0D1">
+      <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_0 + WheelZ_1) / 2.0 + WheelSupportOffset"/>
+    </transformation>
+    <logvolref ref="ZtubeD0D1"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceZtubeD1D2">
+      <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_1 + WheelZ_2) / 2.0 + WheelSupportOffset"/>
+    </transformation>
+    <logvolref ref="ZtubeD1D2"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceZtubeD2D3">
+      <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_2 + WheelZ_3) / 2.0 + WheelSupportOffset"/>
+    </transformation>
+    <logvolref ref="ZtubeD2D3"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceZtubeD3D4">
+      <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_3 + WheelZ_4) / 2.0 + WheelSupportOffset"/>
+    </transformation>
+    <logvolref ref="ZtubeD3D4"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceZtubeD4D5">
+      <translation z="-(StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2.) + (WheelZ_4 + WheelZ_5) / 2.0 + WheelSupportOffset"/>
+    </transformation>
+    <logvolref ref="ZtubeD4D5"/>
+  </transform>
+</assembly>
+
+<assembly name="StiffDisc">
+
+  <logvolref ref="StiffDiscFoam"/>
+
+  <transform>
+    <transformation name="PlaceNearFaceSheetStiffDisc">
+      <translation z="-(StiffDiscFoamT + StiffDiscCF_T) / 2.0"/>
+    </transformation>
+    <logvolref ref="StiffDiscCF"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFarFaceSheetStiffDisc">
+      <translation z="(StiffDiscFoamT + StiffDiscCF_T) / 2.0"/>
+    </transformation>
+    <logvolref ref="StiffDiscCF"/>
+  </transform>
+
+</assembly>
+
+<assembly name="BladeSupport">
+  <logvolref ref="BladeCore"/>
+  <transform>
+    <transformation name="BladeFace1">
+      <translation x="BladeFaceSheetThickness / 2. + BladeRodOuterEdge / 2."/>
+    </transformation>  
+  <logvolref ref="BladeFace"/>
+  </transform>
+  <transform>
+    <transformation name="BladeFace2">
+      <translation x="-(BladeFaceSheetThickness / 2. + BladeRodOuterEdge / 2.)"/>
+    </transformation>  
+  <logvolref ref="BladeFace"/>
+  </transform>
+  <transform>
+    <transformation name="BladeRod1">
+      <translation y="(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/>
+    </transformation>
+  <logvolref ref="BladeSideRod"/>
+  </transform>
+  <transform>
+    <transformation name="BladeRod2">
+      <translation y="-(BladeLength * tan( BladeAngle / 2. ) + BladeOuterEndWidth - BladeRodOuterEdge) / 2."/>
+      <rotation zcos="1." angle="PI"/>
+    </transformation>
+  <logvolref ref="BladeSideRod"/>
+  </transform>
+</assembly>
+
+<assembly name="BladeSingle">
+  <transform>
+    <transformation name="ShiftBlade">
+      <translation x="BladeLength / 2."/>
+      <rotation ycos="1." angle="PI / 2."/>
+    </transformation>
+  <assemblyref ref="BladeSupport"/>
+  </transform>
+</assembly>
+
+<assembly name="BladeSupportWheel">
+  <multicopy name="AddBlades" n="8">
+    <transformation name="WheelsGoRound">
+      <rotation zcos="1." angle="PI / 4."/>
+    </transformation>
+    <assemblyref ref="BladeSingle"/>
+  </multicopy>
+</assembly>
+
+<assembly name="LockPointTH">
+  <transform>
+    <transformation name="MoveLockPointTH">
+      <translation y="WheelOuterT_OuterR - LockBaseHHeight / 2. - LockBaseOffset"/>
+    </transformation>
+  <logvolref ref="LockBaseH"/>
+  </transform>
+</assembly>
+
+<assembly name="LockPointTL">
+  <transform>
+    <transformation name="MoveLockPointTL">
+      <translation y="WheelOuterT_OuterR - LockBaseLHeight / 2. - LockBaseOffset"/>
+    </transformation>
+  <logvolref ref="LockBaseL"/>
+  </transform>
+</assembly>
+
+<assembly name="LockPointBH">
+  <transform>
+    <transformation name="MoveLockPointBH">
+      <translation y="WheelInnerT_BaseOuterR + LockBaseHHeight / 2."/>
+    </transformation>
+  <logvolref ref="LockBaseH"/>
+  </transform>
+</assembly>
+
+<assembly name="LockPointBL">
+  <transform>
+    <transformation name="MoveLockPointBL">
+      <translation y="WheelInnerT_BaseOuterR + LockBaseLHeight / 2."/>
+    </transformation>
+  <logvolref ref="LockBaseL"/>
+  </transform>
+</assembly>
+
+<assembly name="LockPointTModule1">
+  <transform>
+    <transformation name="LockPointTH1">
+      <rotation zcos="1." angle="LockBaseTAngleOffset"/>
+    </transformation>
+  <assemblyref ref="LockPointTH"/>
+  </transform>
+  <transform>
+    <transformation name="LockPointTL1">
+      <rotation zcos="1." angle="-LockBaseTAngleOffset"/>
+    </transformation>
+  <assemblyref ref="LockPointTL"/>
+  </transform>
+</assembly>
+
+<assembly name="LockPointTModule2">
+  <transform>
+    <transformation name="LockPointTH2">
+      <rotation zcos="1." angle="-LockBaseTAngleOffset + LockBaseTAngle"/>
+    </transformation>
+  <assemblyref ref="LockPointTH"/>
+  </transform>
+  <transform>
+    <transformation name="LockPointTL2">
+      <rotation zcos="1." angle="LockBaseTAngleOffset + LockBaseTAngle"/>
+    </transformation>
+  <assemblyref ref="LockPointTL"/>
+  </transform>
+</assembly>
+
+<assembly name="LockPointBModule">
+  <transform>
+    <transformation name="LockPointModuleBH">
+      <rotation zcos="1." angle="LockBaseBAngleOffset"/>
+    </transformation>
+  <assemblyref ref="LockPointBH"/>
+  </transform>
+  <transform>
+    <transformation name="LockPointModuleBL">
+      <rotation zcos="1." angle="-(LockBaseBAngleOffset)"/>
+    </transformation>
+  <assemblyref ref="LockPointBL"/>
+  </transform>
+</assembly>
+
+
+
+<assembly name="LockPointWheel">
+  <multicopy name="LockBaseTWheel1" n="LockBaseTAssemblyN">
+    <transformation name="PlaceLockBaseTMod1">
+      <rotation zcos="1." angle="2 * PI / LockBaseTAssemblyN"/>
+    </transformation>
+    <assemblyref ref="LockPointTModule1"/>
+  </multicopy>
+
+  <multicopy name="LockBaseTWheel2" n="LockBaseTAssemblyN">
+    <transformation name="PlaceLockBaseTMod2">
+      <rotation zcos="1." angle="2 * PI / LockBaseTAssemblyN"/>
+    </transformation>
+    <assemblyref ref="LockPointTModule2"/>
+  </multicopy>
+
+  <multicopy name="LockBaseBWheel" n="LockBaseTAssemblyN">
+    <transformation name="PlaceLockBaseBMod">
+      <rotation zcos="1." angle="2 * PI / LockBaseTAssemblyN"/>
+    </transformation>
+    <assemblyref ref="LockPointBModule"/>
+  </multicopy>
+</assembly>
+
+<assembly name="WheelSupport">
+  <logvolref ref="WheelInnerT"/>
+  <logvolref ref="WheelOuterT"/>
+ <transform>
+    <transformation name="AddLockPoints">
+      <translation z="WheelInnerT_BaseWidth / 4. + WheelInnerT_UprightThickness / 2."/>
+    </transformation>
+  <assemblyref ref="LockPointWheel"/>
+  </transform>
+</assembly>
+
+<assembly name="EndcapPSTHats">
+  <multicopy name="CopyECPSTHats" n="ECPSTHatNumber">
+    <transformation name="PlaceECHats">
+      <translation z="ECPSTHatGap"/>
+    </transformation>
+    <assemblyref ref="StaveCylHat0"/>
+  </multicopy>
+</assembly>
+
+
+<assembly name="EndcapPST">
+  <logvolref ref="ECPSTube"/>
+  
+  <transform>
+    <transformation name="AssemblePST">
+      <translation z="-( ECPSTLength / 2. ) + ECPSTOffset"/>
+    </transformation>
+  <assemblyref ref="EndcapPSTHats"/>
+  </transform>
+</assembly>
+
+
+<assembly name="EC_Support">
+  <logvolref ref="EC_InnerCyl"/>
+<!-- For now, add support wheels with wheel-of-petals
+  <multicopy name="AddSupportWheels" loopvar="WheelZ" n="N_Wheels" >
+     ????
+  </multicopy>
+--> 
+
+<!--
+  <transform>
+    <transformation name="PlaceRailShelfSquareComplete">
+      <translation x="RailRadius"/>
+    </transformation>
+  <assemblyref ref="RailShelfSquareComplete"/>
+  </transform>
+-->
+
+
+  <transform>
+    <transformation name="PlaceStiffDisc">
+      <translation z="StiffDiscTranslation"/>
+    </transformation>
+    <assemblyref ref="StiffDisc"/>
+  </transform>
+
+  <multicopy name="AddZtubes" n="nZtubes">
+    <transformation name="PlaceZtubes">
+      <rotation zcos="1." angle="2. * PI / nZtubes"/> 
+    </transformation>
+    <transform>
+      <transformation name="PlaceZtubesReadyForRotation">
+        <translation x="ZtubeRadialPosition"/>
+      </transformation>
+      <assemblyref ref="Ztubes"/>
+    </transform>
+  </multicopy>
+
+</assembly>
+
+
+<assembly name="ECModule0">
+  
+  <logvolref ref="ECSensor0"/>
+  <transform>
+    <transformation name="PlaceR0H0">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR0H0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceR0H1">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR0H1"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceDCDC_R0_PCB">
+      <translation z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_EC_PCBR0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R0_Box">
+      <rotation zcos="1.0" angle="-SensorPhiWidth_0/2+E_DCDC_PCB_dPhiR0"/>	
+      <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR0+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T + DCDC_BoxT)/2+EPS"/>
+    </transformation>
+    <logvolref ref="DCDC_EC_Box"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule1">
+  <logvolref ref="ECSensor1"/>
+  <transform>
+    <transformation name="PlaceR1H0">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR1H0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceR1H1">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR1H1"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R1_PCB">
+      <translation z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_EC_PCBR1"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R1_Box">
+      <rotation zcos="1.0" angle="-SensorPhiWidth_1/2+E_DCDC_PCB_dPhiR1"/> 
+<!-- need to subtract half the length of DCDC  DCDC_EC_BoxL/(2*E_DCDC_PCB_RadiusMinR1)"/>-->
+      <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR1+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/>
+    </transformation>
+    <logvolref ref="DCDC_EC_Box"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule2">
+  <logvolref ref="ECSensor2"/>
+  <transform>
+    <transformation name="PlaceR2H0">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR2H0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R2_PCB">
+      <translation z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_EC_PCBR2"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R2_Box">
+      <rotation zcos="1.0" angle="-SensorPhiWidth_2/2+E_DCDC_PCB_dPhiR2"/>	
+      <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR2+0.5*DCDC_BoxW" z="+(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/>
+    </transformation>
+    <logvolref ref="DCDC_EC_Box"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule3Plus">
+  <logvolref ref="ECSensor3"/>
+  <transform>
+    <transformation name="PlaceR3H1">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR3H1"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceR3H3">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR3H3"/>
+  </transform>
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR3H1">
+     <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-1.5))"/>		
+      <translation y="E_HCCRadiusR3H1+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR3H1a">
+     <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-2.5))"/>		
+      <translation y="E_HCCRadiusR3H1a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR3H3">
+     <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-2.5))"/>		
+      <translation y="E_HCCRadiusR3H3+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR3H3a">
+     <rotation zcos="1.0" angle="SensorPhiWidth_3/(2*N_ABC_R3)*(1-N_ABC_R3+2*(N_ABC_R3-1.5))"/>		
+      <translation y="E_HCCRadiusR3H3a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule3Minus">
+  <logvolref ref="ECSensor3"/>
+  <transform>
+    <transformation name="PlaceR3H0Minus">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR3H0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceR3H2Minus">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR3H2"/>
+  </transform>
+
+
+
+  <transform>
+    <transformation name="PlaceDCDC_R3_PCB">
+      <translation z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_EC_PCBR3"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceDCDC_R3_Box">
+      <rotation zcos="1.0" angle="-SensorPhiWidth_3/2+E_DCDC_PCB_dPhiR3"/>	
+      <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR3+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/>
+    </transformation>
+    <logvolref ref="DCDC_EC_Box"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule4Plus">
+  <logvolref ref="ECSensor4"/>
+  <transform>
+    <transformation name="PlaceR4H1">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR4H1"/>
+  </transform>
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR4H1">
+     <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*(N_ABC_R4-1.5))"/>		
+      <translation y="E_HCCRadiusR4H1+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR4H1a">
+     <rotation zcos="1.0" angle="SensorPhiWidth_4/(2*N_ABC_R4)*(1-N_ABC_R4+2*(N_ABC_R4-2.5))"/>		
+      <translation y="E_HCCRadiusR4H1a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule4Minus">
+  <logvolref ref="ECSensor4"/>
+  <transform>
+    <transformation name="PlaceR4H0">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR4H0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R4_PCB">
+      <translation z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_EC_PCBR4"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R4_Box">
+      <rotation zcos="1.0" angle="-SensorPhiWidth_4/2+E_DCDC_PCB_dPhiR4"/>	
+      <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR4+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/>
+    </transformation>
+    <logvolref ref="DCDC_EC_Box"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule5Plus">
+  <logvolref ref="ECSensor5"/>
+  <transform>
+    <transformation name="PlaceR5H1">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR5H1"/>
+  </transform>
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR5H1">
+     <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*(N_ABC_R5-1.5))"/>		
+      <translation y="E_HCCRadiusR5H1+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+<transform>
+    <transformation name="PlaceHCCOnB_HybridR5H1a">
+     <rotation zcos="1.0" angle="SensorPhiWidth_5/(2*N_ABC_R5)*(1-N_ABC_R5+2*(N_ABC_R5-2.5))"/>		
+      <translation y="E_HCCRadiusR5H1a+HCC_L/2" z="(SensorThickness+2*E_HybridT + HCC_T) / 2"/>     
+    </transformation>
+    <logvolref ref="HCC_Chip"/>
+  </transform>
+</assembly>
+
+<assembly name="ECModule5Minus">
+  <logvolref ref="ECSensor5"/>
+  <transform>
+    <transformation name="PlaceR5H0">
+      <translation z="(SensorThickness + E_HybridT) / 2."/>
+    </transformation>
+    <assemblyref ref="ECHybridR5H0"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R5_PCB">
+      <translation z="(SensorThickness + DCDC_PCB_T) / 2."/>
+    </transformation>
+    <logvolref ref="DCDC_EC_PCBR5"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceDCDC_R5_Box">
+      <rotation zcos="1.0" angle="-SensorPhiWidth_5/2+E_DCDC_PCB_dPhiR5"/>	
+      <translation x="DCDC_EC_BoxL+DCDC_dist_from_PCBend" y="E_DCDC_PCB_RadiusMinR5+0.5*DCDC_BoxW" z="(SensorThickness + 2*DCDC_PCB_T+DCDC_BoxT)/2+EPS"/>
+    </transformation>
+    <logvolref ref="DCDC_EC_Box"/>
+  </transform>
+</assembly>
+
+<assembly name="PetalFace">
+  <index ref="phi_module" value="2*CNL_4 + CNL_5"/> <!-- 0 to 31. -->
+
+ <transform alignable="0">		 
+  <transformation name="ESensor0dummy" alignable="true">
+    <translation/>
+  </transformation>
+  <assemblyref ref="ECModule0" zeroid="true"/>
+</transform>
+<transform alignable="0">
+  <transformation name="ESensor1dummy" alignable="true">
+    <translation/>
+  </transformation>
+  <assemblyref ref="ECModule1" zeroid="true"/>
+</transform>
+<transform alignable="0">
+  <transformation name="ESensor2dummy" alignable="true">
+    <translation/>
+  </transformation>
+  <assemblyref ref="ECModule2" zeroid="true"/>
+</transform>
+
+
+  <!-- For outer rings, we have to add 1 half the time; when? Depends which way round the face is in the wheel. 0 - 63. -->
+  <index ref="phi_module" value="2*(2*CNL_4 + CNL_5) + (CNL_5 == 0 &amp;&amp; CNL_6 == 0) + (CNL_5 == 1 &amp;&amp; CNL_6 == 1) "/>
+  <transform alignable="0">
+    <transformation name="PlaceFaceRing3Minus" alignable="true">
+      <rotation zcos="1.0" angle="-SensorRotation_3"/>
+    </transformation>
+    <assemblyref ref="ECModule3Minus"/>
+  </transform>
+
+  <transform alignable="0">
+    <transformation name="PlaceFaceRing4Minus" alignable="true">
+      <rotation zcos="1.0" angle="-SensorRotation_4"/>
+    </transformation>
+    <assemblyref ref="ECModule4Minus"/>
+  </transform>
+
+  <transform alignable="0">
+    <transformation name="PlaceFaceRing5Minus" alignable="true">
+      <rotation zcos="1.0" angle="-SensorRotation_5"/>
+    </transformation>
+    <assemblyref ref="ECModule5Minus"/>
+  </transform>
+<index ref="phi_module" value="2*(2*CNL_4 + CNL_5) + (CNL_5 == 0 &amp;&amp; CNL_6 == 1) + (CNL_5 == 1 &amp;&amp; CNL_6 == 0)"/>
+  <transform alignable="0">
+    <transformation name="PlaceFaceRing3Plus" alignable="true">
+      <rotation zcos="1.0" angle="+SensorRotation_3"/>
+    </transformation>
+    <assemblyref ref="ECModule3Plus"/>
+  </transform>
+
+  <transform alignable="0">
+    <transformation name="PlaceFaceRing4Plus" alignable="true">
+      <rotation zcos="1.0" angle="+SensorRotation_4"/>
+    </transformation>
+    <assemblyref ref="ECModule4Plus"/>
+  </transform>
+
+  <transform alignable="0">
+    <transformation name="PlaceFaceRing5Plus" alignable="true">
+      <rotation zcos="1.0" angle="+SensorRotation_5"/>
+    </transformation>
+    <assemblyref ref="ECModule5Plus"/>
+  </transform>
+</assembly>
+
+
+<assembly name="Petal">
+  <assemblyref ref="PetalPlank"/>
+
+  <transform name="NearFace">
+    <transformation name="PlacePetalFaceNear">
+      <translation z="-(PetalCoreThickness + SensorThickness)/2"/>
+      <rotation xcos="1." angle="PI"/> 
+      <rotation zcos="1." angle="PetalFaceRotation"/>
+    </transformation>
+    <assemblyref ref="PetalFace" zeroid="true"/>
+  </transform>
+
+  <transform name="FarFace">
+      <transformation name="PlacePetalFaceFar">
+        <translation z="(PetalCoreThickness + SensorThickness)/2"/>
+        <rotation zcos="1." angle="PetalFaceRotation"/>
+      </transformation>
+      <assemblyref ref="PetalFace"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceFirstEOS_OnPetalCore">
+      <rotation zcos="1.0" angle="+(PetalCoreAngle+PetalEarAngle)/2"/>
+      <translation x="(PetalEarOuterRadius -100)" z="+(PetalCoreThickness+5)/2" y="-17"/>
+    </transformation>
+    <logvolref ref="EOS"/>
+  </transform>
+
+  <transform>
+    <transformation name="PlaceSecondEOS_OnPetalCore">
+     <rotation zcos="1.0" angle="+(PetalCoreAngle+PetalEarAngle)/2"/>	      
+     <translation x="(PetalEarOuterRadius -100)" z="-(PetalCoreThickness+5)/2" y="-17"/>
+      
+    </transformation>
+    <logvolref ref="EOS"/>
+  </transform>
+
+</assembly>
+
+<assembly name="PetalPair">
+  <index ref="side" value="CNL_6"/>
+  <transform name="Near">
+    <transformation name="PlaceCastleNear">
+      <translation z="-CastellationOffset"/>
+    </transformation>
+    <assemblyref ref="Petal" zeroid="true"/>
+  </transform>
+
+  <index ref="side" value="1 - CNL_6"/>
+  <transform name="Far">
+    <transformation name="PlaceCastleFar">
+      <translation z="+CastellationOffset"/>
+      <rotation zcos="1." angle="2*PI/NPetalsInWheel"/>
+      <rotation xcos="1." angle="2*PI/2"/>
+    </transformation>
+    <assemblyref ref="Petal"/>
+  </transform>
+
+</assembly>
+
+
+<assembly name="Wheel" alignable="true">
+  <index ref="layer_wheel" value="CNL_3"/>
+  <multicopy name="AddPetalPairsToWheel" n="NPetalsInWheel/2">
+    <transformation name="PlacePetalPairsToWheel">
+      <rotation zcos="1." angle="2*PI/(NPetalsInWheel/2)"/>
+    </transformation>
+    <assemblyref ref="PetalPair"/>
+  </multicopy>
+  <transform>
+    <transformation name="PlaceWheelSupport">
+      <translation z="WheelSupportOffset"/>
+    </transformation>
+    <assemblyref ref="WheelSupport"/>
+  </transform>
+</assembly>
+
+
+<assembly name="SCT_Forward" alignable="true">
+  <multicopy name="AddWheelsToEndcap" n="N_Wheels" loopvar="WheelZ" alignable="2">
+    <transformation name="PlaceWheelsOdd" alignable="true">
+      <translation z="WheelZ"/>
+    </transformation>
+    <assemblyref ref="Wheel"/>
+  </multicopy>
+  <multicopy name="AddBladesToEndcapOdd" n="N_Wheels / 2." loopvar="WheelZOdd">
+    <transformation name="AddWheelBladesOdd">
+      <translation z="WheelZOdd -(WheelInnerT_BaseWidth / 4. + WheelInnerT_UprightThickness / 2.) + WheelSupportOffset"/>
+    </transformation>
+  <assemblyref ref="BladeSupportWheel"/>
+  </multicopy>
+  <multicopy name="AddBladesToEndcapEven" n="N_Wheels / 2." loopvar="WheelZEven">
+    <transformation name="AddWheelBladesEven">
+      <translation z="WheelZEven -(WheelInnerT_BaseWidth / 4. + WheelInnerT_UprightThickness / 2.) + WheelSupportOffset"/>
+      <rotation zcos="1." angle="PI / 8."/>
+    </transformation>
+  <assemblyref ref="BladeSupportWheel"/>
+  </multicopy>
+  <transform>
+    <transformation name="PlaceEC_Support">
+      <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/>
+    </transformation>
+    <assemblyref ref="EC_Support"/>
+  </transform>
+
+<!--
+    <transform>
+      <transformation name="PlacePST">
+        <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. - 30."/>
+      </transformation>
+    <assemblyref ref="EndcapPST"/>
+    </transform>
+-->
+
+</assembly>
+
+<!-- GeoModelXml input created by ServMat. Detector "LoI Strip" version 2018-10-15 -->
+
+<!-- Masses of interlinks scaled by interlinkSF = 1.200000 -->
+
+
+  <materials>
+
+    <material name="matSV_Barrel01" density="0.103698">
+      <elementref ref="Aluminium" fraction="0.203153"/>
+      <elementref ref="Carbon" fraction="0.308931"/>
+      <elementref ref="Copper" fraction="0.110710"/>
+      <elementref ref="Hydrogen" fraction="0.011784"/>
+      <elementref ref="Nickel" fraction="0.025469"/>
+      <elementref ref="Nitrogen" fraction="0.093526"/>
+      <elementref ref="Oxygen" fraction="0.033535"/>
+      <elementref ref="Silicon" fraction="0.000688"/>
+      <elementref ref="Titanium" fraction="0.212203"/>
+    </material>
+
+    <material name="matSV_Barrel12" density="0.178647">
+      <elementref ref="Aluminium" fraction="0.207867"/>
+      <elementref ref="Carbon" fraction="0.316098"/>
+      <elementref ref="Copper" fraction="0.113279"/>
+      <elementref ref="Hydrogen" fraction="0.012057"/>
+      <elementref ref="Nickel" fraction="0.026060"/>
+      <elementref ref="Nitrogen" fraction="0.095696"/>
+      <elementref ref="Oxygen" fraction="0.034313"/>
+      <elementref ref="Silicon" fraction="0.000704"/>
+      <elementref ref="Titanium" fraction="0.193926"/>
+    </material>
+
+    <material name="matSV_Barrel23" density="0.240794">
+      <elementref ref="Aluminium" fraction="0.211315"/>
+      <elementref ref="Carbon" fraction="0.321342"/>
+      <elementref ref="Copper" fraction="0.115158"/>
+      <elementref ref="Hydrogen" fraction="0.012257"/>
+      <elementref ref="Nickel" fraction="0.026492"/>
+      <elementref ref="Nitrogen" fraction="0.097283"/>
+      <elementref ref="Oxygen" fraction="0.034882"/>
+      <elementref ref="Silicon" fraction="0.000716"/>
+      <elementref ref="Titanium" fraction="0.180553"/>
+    </material>
+
+    <material name="matSV_Barrel3Out" density="0.798240">
+      <elementref ref="Aluminium" fraction="0.088150"/>
+      <elementref ref="Carbon" fraction="0.134048"/>
+      <elementref ref="Copper" fraction="0.048038"/>
+      <elementref ref="Hydrogen" fraction="0.005113"/>
+      <elementref ref="Nickel" fraction="0.011051"/>
+      <elementref ref="Nitrogen" fraction="0.040582"/>
+      <elementref ref="Oxygen" fraction="0.014551"/>
+      <elementref ref="Silicon" fraction="0.000299"/>
+      <elementref ref="Titanium" fraction="0.658168"/>
+    </material>
+
+    <material name="matSV_BarrelPastEndcap" density="0.456011">
+      <elementref ref="Aluminium" fraction="0.228508"/>
+      <elementref ref="Carbon" fraction="0.347487"/>
+      <elementref ref="Copper" fraction="0.124527"/>
+      <elementref ref="Hydrogen" fraction="0.013255"/>
+      <elementref ref="Nickel" fraction="0.028648"/>
+      <elementref ref="Nitrogen" fraction="0.105198"/>
+      <elementref ref="Oxygen" fraction="0.037720"/>
+      <elementref ref="Silicon" fraction="0.000774"/>
+      <elementref ref="Titanium" fraction="0.113883"/>
+    </material>
+
+    <material name="matSV_Endcap01" density="0.253309">
+      <elementref ref="Aluminium" fraction="0.206755"/>
+      <elementref ref="Carbon" fraction="0.314407"/>
+      <elementref ref="Copper" fraction="0.112673"/>
+      <elementref ref="Hydrogen" fraction="0.011993"/>
+      <elementref ref="Nickel" fraction="0.025921"/>
+      <elementref ref="Nitrogen" fraction="0.095184"/>
+      <elementref ref="Oxygen" fraction="0.034130"/>
+      <elementref ref="Silicon" fraction="0.000700"/>
+      <elementref ref="Titanium" fraction="0.198239"/>
+    </material>
+
+    <material name="matSV_Endcap12" density="0.493606">
+      <elementref ref="Aluminium" fraction="0.212205"/>
+      <elementref ref="Carbon" fraction="0.322695"/>
+      <elementref ref="Copper" fraction="0.115643"/>
+      <elementref ref="Hydrogen" fraction="0.012309"/>
+      <elementref ref="Nickel" fraction="0.026604"/>
+      <elementref ref="Nitrogen" fraction="0.097693"/>
+      <elementref ref="Oxygen" fraction="0.035029"/>
+      <elementref ref="Silicon" fraction="0.000719"/>
+      <elementref ref="Titanium" fraction="0.177105"/>
+    </material>
+
+    <material name="matSV_Endcap23" density="0.732819">
+      <elementref ref="Aluminium" fraction="0.214402"/>
+      <elementref ref="Carbon" fraction="0.326037"/>
+      <elementref ref="Copper" fraction="0.116840"/>
+      <elementref ref="Hydrogen" fraction="0.012437"/>
+      <elementref ref="Nickel" fraction="0.026880"/>
+      <elementref ref="Nitrogen" fraction="0.098705"/>
+      <elementref ref="Oxygen" fraction="0.035392"/>
+      <elementref ref="Silicon" fraction="0.000726"/>
+      <elementref ref="Titanium" fraction="0.168582"/>
+    </material>
+
+    <material name="matSV_Endcap34" density="0.974642">
+      <elementref ref="Aluminium" fraction="0.214941"/>
+      <elementref ref="Carbon" fraction="0.326857"/>
+      <elementref ref="Copper" fraction="0.117134"/>
+      <elementref ref="Hydrogen" fraction="0.012468"/>
+      <elementref ref="Nickel" fraction="0.026947"/>
+      <elementref ref="Nitrogen" fraction="0.098953"/>
+      <elementref ref="Oxygen" fraction="0.035481"/>
+      <elementref ref="Silicon" fraction="0.000728"/>
+      <elementref ref="Titanium" fraction="0.166491"/>
+    </material>
+
+    <material name="matSV_Endcap45" density="1.211989">
+      <elementref ref="Aluminium" fraction="0.216061"/>
+      <elementref ref="Carbon" fraction="0.328559"/>
+      <elementref ref="Copper" fraction="0.117744"/>
+      <elementref ref="Hydrogen" fraction="0.012533"/>
+      <elementref ref="Nickel" fraction="0.027087"/>
+      <elementref ref="Nitrogen" fraction="0.099468"/>
+      <elementref ref="Oxygen" fraction="0.035666"/>
+      <elementref ref="Silicon" fraction="0.000732"/>
+      <elementref ref="Titanium" fraction="0.162149"/>
+    </material>
+
+    <material name="matSV_Endcap5Out" density="1.600535">
+      <elementref ref="Aluminium" fraction="0.196332"/>
+      <elementref ref="Carbon" fraction="0.298558"/>
+      <elementref ref="Copper" fraction="0.106993"/>
+      <elementref ref="Hydrogen" fraction="0.011388"/>
+      <elementref ref="Nickel" fraction="0.024614"/>
+      <elementref ref="Nitrogen" fraction="0.090386"/>
+      <elementref ref="Oxygen" fraction="0.032409"/>
+      <elementref ref="Silicon" fraction="0.000665"/>
+      <elementref ref="Titanium" fraction="0.238655"/>
+    </material>
+
+  </materials>
+
+  <shapes>
+    <tube name="shSV_Barrel01" rmin="399.000 + EPS" rmax="561.998 - EPS" zhalflength="4.000 - EPS"/>
+    <tube name="shSV_Barrel12" rmin="562.000 + EPS" rmax="761.998 - EPS" zhalflength="4.000 - EPS"/>
+    <tube name="shSV_Barrel23" rmin="762.000 + EPS" rmax="999.998 - EPS" zhalflength="4.000 - EPS"/>
+    <tube name="shSV_Barrel3Out" rmin="1000.000 + EPS" rmax="1013.998 - EPS" zhalflength="4.000 - EPS"/>
+    <tubs name="shSV_BarrelPastEndcap" rmin="1016.000 + EPS" rmax="1024.000 - EPS" zhalflength="860.498 - EPS" sphi="0.1308998" dphi="0.5235986"/>
+    <tubs name="shSV_Endcap01" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="94.999 - EPS" sphi="0.3054327" dphi="0.1745327"/>
+    <tubs name="shSV_Endcap12" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="124.999 - EPS" sphi="0.3054327" dphi="0.1745327"/>
+    <tubs name="shSV_Endcap23" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="142.499 - EPS" sphi="0.3054327" dphi="0.1745327"/>
+    <tubs name="shSV_Endcap34" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="147.499 - EPS" sphi="0.3054327" dphi="0.1745327"/>
+    <tubs name="shSV_Endcap45" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="158.999 - EPS" sphi="0.3054327" dphi="0.1745327"/>
+    <tubs name="shSV_Endcap5Out" rmin="990.000 + EPS" rmax="998.000 - EPS" zhalflength="63.499 - EPS" sphi="0.3054327" dphi="0.1745327"/>
+    <tube name="shSV_Barrel" rmin="346.701 + EPS" rmax="1015.000 - EPS" zhalflength="12.500 - EPS"/>
+    <tubs name="shSV_BarrelAtEC" rmin="1015.000 + EPS" rmax="1045.000 - EPS" zhalflength="860.500 - EPS" sphi="0.1308997" dphi="0.5235988"/>
+    <tubs name="shSV_Endcap" rmin="989.000 + EPS" rmax="1011.000 - EPS" zhalflength="748.500 - EPS" sphi="0.3054326" dphi="0.1745329"/>
+  </shapes>
+
+  <logvol name="SV_Barrel01" shape="shSV_Barrel01" material="matSV_Barrel01"/>
+  <logvol name="SV_Barrel12" shape="shSV_Barrel12" material="matSV_Barrel12"/>
+  <logvol name="SV_Barrel23" shape="shSV_Barrel23" material="matSV_Barrel23"/>
+  <logvol name="SV_Barrel3Out" shape="shSV_Barrel3Out" material="matSV_Barrel3Out"/>
+  <logvol name="SV_BarrelPastEndcap" shape="shSV_BarrelPastEndcap" material="matSV_BarrelPastEndcap"/>
+  <logvol name="SV_Endcap01" shape="shSV_Endcap01" material="matSV_Endcap01"/>
+  <logvol name="SV_Endcap12" shape="shSV_Endcap12" material="matSV_Endcap12"/>
+  <logvol name="SV_Endcap23" shape="shSV_Endcap23" material="matSV_Endcap23"/>
+  <logvol name="SV_Endcap34" shape="shSV_Endcap34" material="matSV_Endcap34"/>
+  <logvol name="SV_Endcap45" shape="shSV_Endcap45" material="matSV_Endcap45"/>
+  <logvol name="SV_Endcap5Out" shape="shSV_Endcap5Out" material="matSV_Endcap5Out"/>
+
+  <logvol name="SV_Barrel_lv" shape="shSV_Barrel" material="N2">
+    <transform>
+      <transformation name="placeSV_Barrel01">
+        <translation z="-7.500"/>
+      </transformation>
+      <logvolref ref="SV_Barrel01"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Barrel12">
+        <translation z="-7.500"/>
+      </transformation>
+      <logvolref ref="SV_Barrel12"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Barrel23">
+        <translation z="-7.500"/>
+      </transformation>
+      <logvolref ref="SV_Barrel23"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Barrel3Out">
+        <translation z="-7.500"/>
+      </transformation>
+      <logvolref ref="SV_Barrel3Out"/>
+    </transform>
+  </logvol>
+
+  <logvol name="SV_BarrelAtEC_lv" shape="shSV_BarrelAtEC" material="N2">
+    <transform>
+      <transformation name="placeSV_BarrelPastEndcap">
+        <translation z="0.000"/>
+      </transformation>
+      <logvolref ref="SV_BarrelPastEndcap"/>
+    </transform>
+  </logvol>
+
+  <logvol name="SV_Endcap_lv" shape="shSV_Endcap" material="N2">
+    <transform>
+      <transformation name="placeSV_Endcap01">
+        <translation z="-621.501"/>
+      </transformation>
+      <logvolref ref="SV_Endcap01"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Endcap12">
+        <translation z="-401.501"/>
+      </transformation>
+      <logvolref ref="SV_Endcap12"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Endcap23">
+        <translation z="-134.001"/>
+      </transformation>
+      <logvolref ref="SV_Endcap23"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Endcap34">
+        <translation z="155.999"/>
+      </transformation>
+      <logvolref ref="SV_Endcap34"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Endcap45">
+        <translation z="462.499"/>
+      </transformation>
+      <logvolref ref="SV_Endcap45"/>
+    </transform>
+    <transform>
+      <transformation name="placeSV_Endcap5Out">
+        <translation z="684.999"/>
+      </transformation>
+      <logvolref ref="SV_Endcap5Out"/>
+    </transform>
+  </logvol>
+
+
+  <assembly name="SV_Barrel">
+    <logvolref ref="SV_Barrel_lv"/>
+  </assembly>
+
+  <assembly name="SV_BarrelAtEC">
+    <multicopy name="placeContentsOfSV_BarrelAtEC" n="8">
+      <transformation name="rotate_SV_BarrelAtEC">
+        <rotation zcos="1.0" angle="0.785"/>
+      </transformation>
+      <logvolref ref="SV_BarrelAtEC_lv"/>
+    </multicopy>
+  </assembly>
+
+  <assembly name="SV_Endcap">
+    <multicopy name="placeContentsOfSV_Endcap" n="8">
+      <transformation name="rotate_SV_Endcap">
+        <rotation zcos="1.0" angle="0.785"/>
+      </transformation>
+      <logvolref ref="SV_Endcap_lv"/>
+    </multicopy>
+  </assembly>
+
+
+
+<!-- To be included in Endcaps.gmx. Builds up the PP1 volume (including type 2 services) -->
+<materials>
+<material name="matPixRed1" density="0.155179495"> <!--red-outer-->
+      <materialref fraction="0.447786132" ref="CuMetal"/>
+      <materialref fraction="0.139515455" ref="AlMetal"/>
+      <materialref fraction="0.248955723" ref="PE"/>
+      <materialref fraction="0.16374269" ref="PVC"/>
+    </material>
+<material name="matPixRed2" density="0.124194654"> <!--red-inner-->
+      <materialref fraction="0.447786132" ref="CuMetal"/>
+ <materialref fraction="0.139515455" ref="AlMetal"/>
+ <materialref fraction="0.248955723" ref="PE"/>
+ <materialref fraction="0.16374269" ref="PVC"/>
+ 
+    </material>
+<material name="matPixCoolingInner" density="0.688923717"> <!--red-inner-->
+      <!--<materialref fraction="0.16" ref="Chromium"/>-->
+      <materialref fraction="0.967853023" ref="SS316"/>      
+      <chemicalref fraction="0.032146977" ref="CO2"/>
+    </material>
+<material name="matPixCoolingOuter" density="0.541945371"> <!--red-inner-->
+      <!--<materialref fraction="0.16" ref="Chromium"/>-->
+      <materialref fraction="0.872747728" ref="SS316"/>
+      <chemicalref fraction="0.127252272" ref="CO2"/>
+    </material>
+<material name="matPixCoolingSum" density="0.91406121"> <!--red-inner-->
+      <!--<materialref fraction="0.16" ref="Chromium"/>-->
+      <materialref fraction="0.911465252" ref="SS316"/>      
+      <chemicalref fraction="0.088534748" ref="CO2"/>
+    </material>
+<material name="matPixType2D" density="0.293763408"> <!--just try with one Type 2 value for now.-->
+      <materialref fraction="0.67070062" ref="CuMetal"/>
+      <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton-->
+      
+    </material>
+<material name="matPixType2E" density="0.159322011"> <!--just try with one Type 2 value for now.-->
+      <materialref fraction="0.67070062" ref="CuMetal"/>
+      <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton-->
+      
+    </material>
+<material name="matPixType2F" density="0.44538827"> <!--just try with one Type 2 value for now.-->
+      <materialref fraction="0.67070062" ref="CuMetal"/>
+      <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton-->
+    </material>
+<material name="matPixType2G" density="0.465356131"> <!--just try with one Type 2 value for now.-->
+      <materialref fraction="0.67070062" ref="CuMetal"/>
+      <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton-->
+      
+    </material>
+<material name="matPixType2H" density="0.564667619"> <!--just try with one Type 2 value for now.-->
+      <materialref fraction="0.67070062" ref="CuMetal"/>
+      <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton-->
+    </material>
+<material name="matPixType2I" density="0.528960234"> <!--just try with one Type 2 value for now.-->
+      <materialref fraction="0.67070062" ref="CuMetal"/>
+      <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton-->
+    </material>
+
+<material name="matPixType2L" density="0.775606326"> <!--just try with one Type 2 value for now.-->
+      <materialref fraction="0.67070062" ref="CuMetal"/>
+      <materialref fraction="0.32929938" ref="Poliax"/><!--Poliax is 1.19 the density of Kapton-->
+    </material>
+<material name="matPP1Type1PixInner" density="0.060277165"> <!--just try with one Type 2 value for now.-->
+  
+  <materialref fraction="0.582454255" ref="CuMetal"/>
+  <materialref fraction="0.095137505" ref="AlMetal"/>
+  <materialref fraction="0.021627338" ref="Kapton"/>
+  <materialref fraction="0.167436662" ref="Polyethylene"/>
+  <materialref fraction="0.110149445" ref="PVC"/>
+  <materialref fraction="0.023194794" ref="TiMetal"/>
+</material>
+
+<material name="matPP1Type1PixOuter" density="0.216283525"> <!--just try with one Type 2 value for now.-->
+<materialref fraction="0.684427651" ref="CuMetal"/>	   
+<materialref fraction="0.124967982" ref="AlMetal"/>	   
+<materialref fraction="0.021199502" ref="Kapton"/>	   
+<materialref fraction="0.220348505" ref="Polyethylene"/>
+<materialref fraction="0.144957892" ref="PVC"/>	   
+<materialref fraction="0.204098467" ref="TiMetal"/>       
+
+    
+
+
+</material>
+<material name="matPP1InnerConnectors" density="1.654315985"> <!--just try with one Type 2 value for now.-->
+<materialref fraction="1.0" ref="AlMetal"/>
+</material>
+<material name="matPP1OuterConnectors" density="2.704150857"> <!--just try with one Type 2 value for now.-->
+<materialref fraction="1.0" ref="AlMetal"/>
+</material>
+
+<material name="matHeatExchanger" density="0.592*4.507"> <!--just try with one Type 2 value for now.-->
+<elementref fraction="1.0" ref="Titanium"/>
+</material>
+
+
+
+
+</materials>
+<defines>
+  
+  <var name="Pix_PP1_Z_Start" value="3020 + EPS"/>
+  <var name="Pix_PP1_middle_Z_Start" value="3020 + EPS"/>      
+  <var name="Pix_PP1_middle_Z_End" value="3020+210"/>
+  <var name="Pix_PP1_cooling_Z_End" value="Pix_PP1_middle_Z_End+60."/>	
+  <var name="Pix_PP1_middle_RI" value="347."/>
+  <var name="Pix_PP1_middle_RO" value="419."/>
+  <var name="HXcorrection" value="100"/>
+  <var name="Pix_PP1_middle_L" value="Pix_PP1_middle_Z_End - Pix_PP1_middle_Z_Start-HXcorrection"/>
+  <var name="ConnectorDepth" value="20"/>
+  <var name="Pix_PP1_outer_Z_Start" value="3020 + EPS"/>          
+  <var name="Pix_PP1_outer_Z_End" value="3020+143"/>
+  <var name="Pix_PP1_outer_RI" value="Pix_PP1_middle_RO"/>
+  <var name="Pix_PP1_outer_RO" value="699."/>
+  <var name="Pix_PP1_outer_L" value="Pix_PP1_outer_Z_End - Pix_PP1_outer_Z_Start-HXcorrection"/>
+  <var name="PixPP1Type2End" value="3404 +EPS"/>
+  <var name="PixPP1Type2Length" value="PixPP1Type2End-Pix_PP1_Z_Start"/>
+  <var name="HeatExchanger_w" value="50"/>
+  <var name="HeatExchanger_t" value="HeatExchanger_w"/>
+  <var name="HeatExchanger_l" value="120"/>
+  <var name="HeatExchanger_z" value="-(3020+PixPP1Type2Length/2-3070)"/><!--3070-->
+  <var name="HeatExchanger_Ri" value="400"/>
+  <var name="PixType2D_l" value="3400-3302.8"/><!--Pix_PP1_cooling_Z_End"/>-->
+  <var name="PixType2D_hl" value="PixType2D_l/2."/>
+  <var name="PixType2E_l" value="PixType2D_l"/>
+  <var name="PixType2E_hl" value="PixType2E_l/2."/>
+<var name="PixType2OutZ_w" value="35"/>  
+<var name="PixType2OutZ_start" value="PixPP1Type2End-PixType2OutZ_w"/>
+  
+  <var name="PixType2MaxR" value="1000"/> <!--place holder, until i can put this through the strip PP1-->
+  <var name="CoolingAngle" value="(45.-9)*PI/180"/>
+  <var name="RedAngle" value="-7.*PI/180"/>
+  <var name="Type2Angle" value="(21.5-14.5)*PI/180"/>
+  <var name="Type2Angle_b" value="(68.5-14.5)*PI/180"/>
+</defines>
+<shapes>
+  
+  <tube name="shPix_PP1_middle" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO" zhalflength="Pix_PP1_middle_L/2"/>
+  <tube name="shPix_PP1_outer" rmin="Pix_PP1_outer_RI" rmax="Pix_PP1_outer_RO" zhalflength="Pix_PP1_outer_L/2"/>
+  <tube name="shPix_PP1_outerskin_z" rmin="Pix_PP1_outer_RO-1" rmax="Pix_PP1_outer_RO" zhalflength="Pix_PP1_outer_L/2"/>  
+ <tube name="shPix_PP1_outerskin_r" rmin="375" rmax="Pix_PP1_outer_RO-1" zhalflength="0.5"/>  
+ <tube name="shPix_PP1InnerServices" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO-1.5" zhalflength="(Pix_PP1_middle_L-Pix_PP1_outer_L-25)/2"/>
+<tube name="shPix_PP1OuterServices" rmin="375" rmax="Pix_PP1_outer_RO-1.5" zhalflength="(Pix_PP1_outer_L*1.25-ConnectorDepth)/2"/>
+ <tube name="shPix_PP1_middleskin_z" rmin="Pix_PP1_middle_RO-1" rmax="Pix_PP1_middle_RO" zhalflength="Pix_PP1_middle_L/2-Pix_PP1_outer_L/2"/>
+  <tube name="shPix_PP1_middleskin_r" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO-1" zhalflength="0.5"/>
+  <!--<cons name="shPix_PP1_outercone"       rmin1="347"  rmin2="348"   rmax1="Pix_PP1_middle_RO-1"  rmax2="Pix_PP1_middle_RO-2"            dz="2" sphi="PI/4" dphi="2*PI"/>-->
+
+<cons name="shPix_PP1_outercone" rmin1="347" rmin2="375-2" rmax1="348" rmax2="375-1" dz="5" sphi="375/Pix_PP1_outer_Z_End" dphi="2*PI"/>
+
+  <box name="shHeatExTriplet" xhalflength="HeatExchanger_l/2" yhalflength="3*HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/>
+  <box name="shHeatExSingle" xhalflength="HeatExchanger_l/2" yhalflength="HeatExchanger_w/2" zhalflength="HeatExchanger_t/2"/> 
+  
+  <!--<tube name="shPixRed1" rmin="Pix_PP1_outer_RO" rmax="PixType2MaxR"   zhalflength="(Pix_PP1_outer_Z_End-Pix_PP1_outer_Z_Start)/2"/>-->
+  <tubs name="shOuterPP1Connectors" rmin="458.5" rmax="660" zhalflength="(ConnectorDepth-1)/2" sphi="0" dphi="0.45"/>
+<tubs name="shInnerPP1Connectors" rmin="Pix_PP1_middle_RI+EPS" rmax="395" zhalflength="(25)/2" sphi="0" dphi="0.45"/>
+  <tubs name="shPixRed1Q1" rmin="Pix_PP1_outer_RO" rmax="EC_PP1_RI" zhalflength="(Pix_PP1_outer_Z_End-Pix_PP1_outer_Z_Start)/2" sphi="0" dphi="14.*PI/180."/>
+
+  <!--<tube name="shPixRed2" rmin="Pix_PP1_outer_RI" rmax=""   zhalflength="(Pix_PP1_middle_Z_End-Pix_PP1_outer_Z_End)/2"/>-->
+  <tubs name="shPixRed2Q1" rmin="Pix_PP1_outer_RI" rmax="PixType2MaxR" zhalflength="(Pix_PP1_middle_Z_End-Pix_PP1_outer_Z_End)/2" sphi="0" dphi="14.*PI/180."/>
+  <!--<tube name="shPixCooling" rmin="Pix_PP1_middle_RI" rmax="PixType2MaxR"   zhalflength="(Pix_PP1_cooling_Z_End-Pix_PP1_middle_Z_End)/2"/>-->	
+  <tubs name="shPixCoolingInnerQ1" rmin="Pix_PP1_middle_RI" rmax="420-EPS" zhalflength="(Pix_PP1_cooling_Z_End-Pix_PP1_middle_Z_End)/2" sphi="0" dphi="18.*PI/180."/>	
+<tubs name="shPixCoolingOuterQ1" rmin="420" rmax="PixType2MaxR" zhalflength="(Pix_PP1_cooling_Z_End-Pix_PP1_middle_Z_End)/2" sphi="0" dphi="18.*PI/180."/>	
+
+  <!--<tube name="shPixType2D"      rmin="Pix_PP1_middle_RI"                rmax="Pix_PP1_middle_RO"              zhalflength="PixType2D_l/2"/>-->
+  <tubs name="shPixType2DQ1" rmin="Pix_PP1_middle_RI" rmax="Pix_PP1_middle_RO" zhalflength="PixType2D_l/2" sphi="0" dphi="29*PI/180"/> 
+  
+  <!--<tube name="shPixType2E"      rmin="Pix_PP1_middle_RO"                rmax="474"              zhalflength="PixType2E_l/2-EPS"/>-->
+  <tubs name="shPixType2EQ1" rmin="Pix_PP1_middle_RO" rmax="474" zhalflength="PixType2E_l/2-EPS" sphi="0" dphi="29*PI/180"/> 
+  
+  
+ <!--<tube name="shPixType2F"      rmin="474"                rmax="529"              zhalflength="PixType2E_hl-EPS"/>-->
+ <tubs name="shPixType2FQ1" rmin="474" rmax="529" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/>
+
+  <!--<tube name="shPixType2G"      rmin="529"                rmax="584"              zhalflength="PixType2E_hl-EPS"/>-->
+  <tubs name="shPixType2GQ1" rmin="529" rmax="584" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/>
+  <!--<tube name="shPixType2H"      rmin="584"                rmax="639"              zhalflength="PixType2E_hl-EPS"/>-->
+  <tubs name="shPixType2HQ1" rmin="584" rmax="639" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/>
+  <!--<tube name="shPixType2I"      rmin="639"                rmax="700"              zhalflength="PixType2E_hl-EPS"/>-->
+  <tubs name="shPixType2IQ1" rmin="639" rmax="Pix_PP1_outer_RO" zhalflength="PixType2E_hl-EPS" sphi="0" dphi="29*PI/180"/>
+
+  <!--<tube name="shPixType2L"      rmin="Pix_PP1_outer_RO"                rmax="PixType2MaxR"              zhalflength="17.5-EPS"/>-->
+  <tubs name="shPixType2LQ1" rmin="Pix_PP1_outer_RO" rmax="EC_PP1_RO" zhalflength="17.5-EPS" sphi="0" dphi="29*PI/180"/>
+  
+
+  
+  <union name="pixPP1outerskinunion">
+    <shaperef ref="shPix_PP1_outerskin_z"/>
+    <transformation name="PlacePixPP1skinr">
+      <translation z="Pix_PP1_outer_L/2-0.5"/>
+    </transformation>
+    <shaperef ref="shPix_PP1_outerskin_r"/>
+  </union>
+  <union name="pixPP1middleskinunion">
+    <shaperef ref="shPix_PP1_middleskin_z"/>
+    <transformation name="PlacePixmPP1skinr">
+      <translation z="(-Pix_PP1_outer_L/2+Pix_PP1_middle_L/2)"/>
+    </transformation>
+    <shaperef ref="shPix_PP1_middleskin_r"/>
+  </union>
+  <union name="pixPP1skin1">
+    <shaperef ref="pixPP1outerskinunion"/>
+      <transformation name="PlacePixPP1skinrz">
+	<!--<translation z="Pix_PP1_outer_L+(Pix_PP1_middle_L-Pix_PP1_outer_L)/2+0.5"/>-->
+	<translation z="Pix_PP1_middle_L/2+0.5"/>
+      </transformation>
+      <shaperef ref="pixPP1middleskinunion"/>
+    </union>
+<union name="pixPP1skin">
+    <shaperef ref="pixPP1skin1"/>
+      <transformation name="PlacePixPP1cone">
+	<translation z="Pix_PP1_outer_L/2-(Pix_PP1_outer_Z_End-3149.4)/2"/>
+<!--	<translation z="Pix_PP1_outer_L/4"/>-->
+      </transformation>
+      <shaperef ref="shPix_PP1_outercone"/>
+    </union>
+    
+
+  <tube name="ShPixPP1_Envelope" rmin="Pix_PP1_middle_RI" rmax="EC_PP1_RO+EPS" zhalflength="PixPP1Type2Length/2"/> <!-- rmin = StripEC_InnerRadius originally -->
+</shapes>
+
+<logvol name="HeatExchanger" shape="shHeatExTriplet" material="matHeatExchanger"/>
+<logvol name="HeatExchanger_single" shape="shHeatExSingle" material="matHeatExchanger"/>
+<assembly name="HeatExchanger_doublet">
+<multicopy name="AddHX" n="2">
+  <transformation name="PlaceHX">
+    <translation y="2*HeatExchanger_w"/>
+  </transformation>
+  <logvolref ref="HeatExchanger_single"/>
+</multicopy>
+</assembly>
+
+
+
+
+
+<logvol name="Pix_PP1InnerServices" shape="shPix_PP1InnerServices" material="matPP1Type1PixInner"/><!--Placeholder for visibility !!-->
+<logvol name="Pix_PP1OuterServices" shape="shPix_PP1OuterServices" material="matPP1Type1PixOuter"/><!--Placeholder for visibility !!-->
+<logvol name="OuterPP1Connectors" shape="shOuterPP1Connectors" material="matPP1OuterConnectors"/><!--Placeholder for visibility !!-->
+<logvol name="InnerPP1Connectors" shape="shInnerPP1Connectors" material="matPP1InnerConnectors"/><!--Placeholder for visibility !!-->
+<logvol name="pixSvc_PP1_T2_R700_R1000_Data" shape="shPixRed1Q1" material="matPixRed1"/>
+<logvol name="pixSvc_PP1_T2_R347_R1000_Data" shape="shPixRed2Q1" material="matPixRed2"/><!--Placeholder for visibility !!-->
+<logvol name="pixSvc_PP1_T2_R347_R420_CoolingInner" shape="shPixCoolingInnerQ1" material="matPixCoolingInner"/>
+<logvol name="pixSvc_PP1_T2_R420_R1000_CoolingOuter" shape="shPixCoolingOuterQ1" material="matPixCoolingOuter"/>
+<logvol name="pixSvc_PP1_T2_R420_R1000_CoolingSum" shape="shPixCoolingOuterQ1" material="matPixCoolingSum"/><!--Placeholder for visibility !!-->
+
+<assembly name="OuterPP1ConnectorWheel">
+  
+  <multicopy name="AddConnectorsToWheel" n="8">
+    <transformation name="PlaceConnectorsToWheel">
+      <rotation zcos="1." angle="PI/4"/>
+    </transformation>
+    <logvolref ref="OuterPP1Connectors"/>
+  </multicopy>
+  
+</assembly>
+
+<assembly name="InnerPP1ConnectorWheel">
+  
+  <multicopy name="AddIConnectorsToWheel" n="8">
+    <transformation name="PlaceIConnectorsToWheel">
+      <rotation zcos="1." angle="PI/4"/>
+    </transformation>
+    <logvolref ref="InnerPP1Connectors"/>
+  </multicopy>
+  
+</assembly>
+
+<assembly name="CoolingOuterWheel">
+  
+  <multicopy name="AddCoolingOuterToWheel" n="3">
+    <transformation name="PlaceCoolingOuterToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R420_R1000_CoolingOuter"/>
+  </multicopy>
+  
+</assembly>
+
+
+<assembly name="PixRed1Wheel">
+  
+  <multicopy name="AddPixRed1ToWheel" n="4">
+    <transformation name="PlacePixRed1ToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R700_R1000_Data"/>
+  </multicopy>
+  
+</assembly>
+<assembly name="PixRed2Wheel">
+  
+  <multicopy name="AddPixRed2ToWheel" n="4">
+    <transformation name="PlacePixRed2ToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R347_R1000_Data"/>
+  </multicopy>
+  
+</assembly>
+
+<!--<logvol name="PixType2DQ1" shape="shPixType2DQ1" material="matPixType2D"></logvol>-->
+<logvol name="pixSvc_PP1_T2_R347_R420_Power" shape="shPixType2DQ1" material="matPixType2D"/>
+
+
+
+<assembly name="PixType2DWheel">
+  <multicopy name="AddType2DaToWheel" n="4">
+    <transformation name="PlaceType2DaToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R347_R420_Power"/>
+  </multicopy>
+</assembly>
+
+<logvol name="pixSvc_PP1_T2_R420_R474_Power" shape="shPixType2EQ1" material="matPixType2E"/>
+
+
+<assembly name="PixType2EWheel">
+  <multicopy name="AddType2EbToWheel" n="4">
+    <transformation name="PlaceType2EbToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R420_R474_Power"/>
+  </multicopy>
+</assembly>
+
+<logvol name="pixSvc_PP1_T2_R474_R529_Power" shape="shPixType2FQ1" material="matPixType2F"/>
+
+
+<assembly name="PixType2FWheel">
+  
+  <multicopy name="AddType2FbToWheel" n="4">
+    <transformation name="PlaceType2FbToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R474_R529_Power"/>
+    </multicopy>
+  
+  </assembly>
+<!--<assembly name="PixType2FWheel">
+<assemblyref ref="PixType2aFWheel"/>
+<assemblyref ref="PixType2FbWheel"/>
+</assembly>-->
+
+
+
+<logvol name="pixSvc_PP1_T2_R529_R584_Power" shape="shPixType2GQ1" material="matPixType2G"/>
+<assembly name="PixType2GWheel">
+  
+  <multicopy name="AddType2GToWheel" n="4">
+    <transformation name="PlaceType2GToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R529_R584_Power"/>
+    </multicopy>
+  
+  </assembly>
+<logvol name="pixSvc_PP1_T2_R584_R639_Power" shape="shPixType2HQ1" material="matPixType2H"/>
+<assembly name="PixType2HWheel">
+  
+  <multicopy name="AddType2HToWheel" n="4">
+    <transformation name="PlaceType2HToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R584_R639_Power"/>
+    </multicopy>
+  
+  </assembly>
+<logvol name="pixSvc_PP1_T2_R639_R700_Power" shape="shPixType2IQ1" material="matPixType2I"/>
+<assembly name="PixType2IWheel">
+  
+  <multicopy name="AddType2IToWheel" n="4">
+    <transformation name="PlaceType2IToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R639_R700_Power"/>
+    </multicopy>
+  
+  </assembly>
+
+<logvol name="pixSvc_PP1_T2_R700_R1000_Power" shape="shPixType2LQ1" material="matPixType2L"/>
+<assembly name="PixType2LWheel">
+  
+  <multicopy name="AddType2LToWheel" n="4">
+    <transformation name="PlaceType2LToWheel">
+      <rotation zcos="1." angle="PI/2"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R700_R1000_Power"/>
+    </multicopy>
+  
+  </assembly>
+
+
+<!--<logvol name="pixPP1middle" shape="shPix_PP1_middle" material="AlMetal"/>-->
+<logvol name="pixPP1outer" shape="pixPP1skin" material="AlMetal"/><!--Placeholder for visibility !!-->
+<logvol name="pixPP1" shape="ShPixPP1_Envelope" material="Air">
+<!--
+  <transform>
+      <transformation  name="PlaceB_PP1A">
+        <translation z="-PixPP1Type2Length/2 + B_PP1_L/2"/>
+      </transformation>
+      <logvolref ref="B_PP1"/>
+    </transform>-->
+  <transform>
+	 <transformation name="PlaceEC_PP1A">
+           <translation z="-PixPP1Type2Length/2 + EC_PP1_L/2"/>
+	 </transformation>
+	 <logvolref ref="EC_PP1"/>
+       </transform>
+  <transform>
+
+    <transformation name="PlacePixPP1outer">
+      <translation z="Pix_PP1_outer_Z_Start-Pix_PP1_Z_Start+Pix_PP1_outer_L/2+HXcorrection-PixPP1Type2Length/2"/>
+    </transformation>
+    <logvolref ref="pixPP1outer"/>
+  </transform>
+  <!--<transform>
+    <transformation name="PlacePixPP1middle">
+      <translation z="Pix_PP1_middle_Z_Start-Pix_PP1_Z_Start+Pix_PP1_middle_L/2+HXcorrection-PixPP1Type2Length/2"/>
+    </transformation>
+    <logvolref ref="pixPP1middle"/>
+  </transform>-->
+  <!--place HX here-->
+<transform>  
+    <transformation name="PlacePixPP1OuterServices">
+
+      <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start -PixPP1Type2Length/2+(-Pix_PP1_outer_L*1.25)/2-0.5-ConnectorDepth"/>
+
+    </transformation>
+    <logvolref ref="Pix_PP1OuterServices"/>
+  </transform>
+<transform>  
+    <transformation name="PlacePixPP1Connectors">
+
+      <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start-PixPP1Type2Length/2-22/2"/>
+      <rotation zcos="1" angle="PI/16"/>
+    </transformation>
+    <assemblyref ref="OuterPP1ConnectorWheel"/>
+  </transform>
+
+<transform>  
+  <transformation name="PlacePixPP1IConnectors">
+    
+    <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start -PixPP1Type2Length/2-25/2"/>
+    <rotation zcos="1" angle="PI/16"/>
+  </transformation>
+  <assemblyref ref="InnerPP1ConnectorWheel"/>
+</transform>
+<transform>  
+  <transformation name="PlacePixPP1InnerServices">
+    
+    <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start + (Pix_PP1_middle_Z_End - Pix_PP1_outer_Z_End)/2-25/2-PixPP1Type2Length/2"/>
+    
+  </transformation>
+  <logvolref ref="Pix_PP1InnerServices"/>
+</transform>
+
+  <transform>  
+    <transformation name="PlaceHeatExchange_NC">
+      <rotation zcos="1." angle="0.785398"/>
+      <translation z="HeatExchanger_z"/>
+      <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+    </transformation>
+    <assemblyref ref="HeatExchanger_doublet"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHeatExchange_EC">
+      <rotation zcos="1." angle="2.35619"/>
+      <translation z="HeatExchanger_z"/>
+      <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+      <translation y="-HeatExchanger_w"/>
+    </transformation>
+    <logvolref ref="HeatExchanger"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHeatExchange_SC">
+      <rotation zcos="1." angle="3.92699"/>
+      <translation z="HeatExchanger_z"/>
+      <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+    </transformation>
+    <logvolref ref="HeatExchanger"/>
+  </transform>
+  <transform>
+    <transformation name="PlaceHeatExchange_WC">
+      <rotation zcos="1." angle="5.49779"/>
+      <translation z="HeatExchanger_z"/>
+      <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+    </transformation>
+    <logvolref ref="HeatExchanger"/>
+  </transform>
+  <!--now Type 2 service-->
+  
+  <transform>
+    <transformation name="PlacePixRed1">
+      
+      <translation z="(Pix_PP1_outer_Z_End - Pix_PP1_Z_Start)/2 -PixPP1Type2Length/2"/>
+      <rotation zcos="1." angle="RedAngle"/>
+    </transformation>
+    <assemblyref ref="PixRed1Wheel"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlacePixRed2">
+      
+      <translation z="Pix_PP1_outer_Z_End - Pix_PP1_Z_Start + (Pix_PP1_middle_Z_End - Pix_PP1_outer_Z_End)/2-PixPP1Type2Length/2"/>
+<rotation zcos="1." angle="RedAngle"/>
+    </transformation>
+    <assemblyref ref="PixRed2Wheel"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlacePixCoolingOuter">
+      
+      <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start + 30-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="CoolingAngle-3*PI/2"/>
+    </transformation>
+    <assemblyref ref="CoolingOuterWheel"/>
+  </transform>
+
+<transform>
+    <transformation name="PlacePixCoolingInner">
+      
+      <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start + 30-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="CoolingAngle"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R347_R420_CoolingInner"/>
+  </transform>
+
+<transform>
+    <transformation name="PlacePixCoolingSum">
+      
+      <translation z="Pix_PP1_middle_Z_End - Pix_PP1_Z_Start + 30-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="CoolingAngle"/>
+    </transformation>
+    <logvolref ref="pixSvc_PP1_T2_R420_R1000_CoolingSum"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2D">
+      
+      <translation z="Pix_PP1_cooling_Z_End - Pix_PP1_Z_Start + PixType2D_hl-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle"/>
+      
+    </transformation>
+    <assemblyref ref="PixType2DWheel"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2Da">
+      
+      <translation z="Pix_PP1_cooling_Z_End - Pix_PP1_Z_Start + PixType2D_hl-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle_b"/>
+    </transformation>
+    <assemblyref ref="PixType2DWheel"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2E">
+      
+      <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle"/>
+    </transformation>
+    <assemblyref ref="PixType2EWheel"/>
+  </transform>
+  
+  
+  
+  
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2Ea">
+      
+      <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle_b"/>
+    </transformation>
+    <assemblyref ref="PixType2EWheel"/>
+  </transform>
+    
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2F">
+      
+      <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle"/>
+    </transformation>
+    <assemblyref ref="PixType2FWheel"/>
+  </transform>
+  <transform>
+    <transformation name="PlacePixPP1Type2Fa">
+      
+      <translation z="(Pix_PP1_cooling_Z_End -Pix_PP1_Z_Start +PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle_b"/>
+      
+      
+    </transformation>
+    <assemblyref ref="PixType2FWheel"/>
+  </transform>
+  
+  
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2G">
+      
+      <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start+PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle"/>
+    </transformation>
+    <assemblyref ref="PixType2GWheel"/>
+  </transform>
+<transform>
+    <transformation name="PlacePixPP1Type2Ga">
+      
+      <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start+PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle_b"/>
+    </transformation>
+    <assemblyref ref="PixType2GWheel"/>
+  </transform>
+  
+  
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2H">
+      
+      <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle"/>
+    </transformation>
+    <assemblyref ref="PixType2HWheel"/>
+  </transform>
+  <transform>
+    <transformation name="PlacePixPP1Type2Ha">
+      
+      <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle_b"/>
+    </transformation>
+    <assemblyref ref="PixType2HWheel"/>
+  </transform>
+  
+  
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2I">
+      
+      <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle"/>
+    </transformation>
+    <assemblyref ref="PixType2IWheel"/>
+  </transform>
+<transform>
+    <transformation name="PlacePixPP1Type2Ia">
+      
+      <translation z="(Pix_PP1_cooling_Z_End-Pix_PP1_Z_Start + PixType2E_hl)-PixPP1Type2Length/2+4"/>
+      <rotation zcos="1." angle="Type2Angle_b"/>
+    </transformation>
+    <assemblyref ref="PixType2IWheel"/>
+  </transform>
+  
+  
+  
+  <transform>
+    <transformation name="PlacePixPP1Type2L">
+
+      <translation z="PixPP1Type2Length/2-35/2"/>
+      <rotation zcos="1." angle="Type2Angle"/>
+    </transformation>
+    <assemblyref ref="PixType2LWheel"/>
+  </transform>
+
+<transform>
+    <transformation name="PlacePixPP1Type2La">
+
+      <translation z="PixPP1Type2Length/2-35/2"/>
+      <rotation zcos="1." angle="Type2Angle_b"/>
+    </transformation>
+    <assemblyref ref="PixType2LWheel"/>
+  </transform>
+  
+  
+  
+  
+</logvol>
+<!--<logvol name="pixPP1" shape="shPix_PP1_outer" material="Air"></logvol>-->
+<assembly name="PixPP1"> <!-- pixPP1 plus HeatExchangers -->
+  <logvolref ref="pixPP1"/>
+</assembly>
+
+
+<shapes>
+
+  <tube name="ShStripEnvelope" rmin="StripInnerRadius" rmax="StripOuterRadius - EPS" zhalflength="ITkHalfLength"/> 
+  <tube name="ShStripB_Envelope" rmin="StripB_InnerRadius" rmax="StripB_OuterRadius - 2*EPS" zhalflength="StripB_HalfLength"/>
+  <tube name="ShStripEC_Envelope" rmin="365." rmax="StripEC_OuterRadius - 2*EPS" zhalflength="StripEC_HalfLength-EPS"/> <!-- rmin = StripEC_InnerRadius originally -->
+  
+</shapes>
+<logvol name="SCT_ForwardPlus" shape="ShStripEC_Envelope" material="N2" alignable="true">
+  <transform>
+    <transformation name="MoveEC1ToEnvelope">
+      <translation z="-(StripEC_Z_Start + StripEC_HalfLength)"/>
+    </transformation>
+    <assemblyref ref="SCT_Forward"/>
+  </transform>	
+</logvol>
+
+<!-- We make an identical logvol differing only in name for the other endcap, to fit with SCT_GeoModel convention -->
+<logvol name="SCT_ForwardMinus" shape="ShStripEC_Envelope" material="N2" alignable="true">
+  <transform>
+    <transformation name="MoveEC2ToEnvelope">
+      <translation z="-(StripEC_Z_Start + StripEC_HalfLength)"/>
+    </transformation>
+    <assemblyref ref="SCT_Forward"/>
+  </transform>
+</logvol>
+
+<!--log vol for pix pp1-->
+<!--
+<logvol name="SCT_PixPP1Plus" shape="ShPixPP1_Envelope" material="Air" alignable="true">
+  <transform>
+    <transformation name="MovePixPP11ToEnvelope">
+      
+      <translation z="-(Pix_PP1_outer_Z_Start+190)"/>
+    </transformation>
+    <assemblyref ref="PixPP1"/>
+  </transform>	
+</logvol>
+
+
+
+<logvol name="SCT_PixPP1Minus" shape="ShPixPP1_Envelope" material="Air" alignable="true">
+  <transform>
+    <transformation name="MovePixPP12ToEnvelope">
+      
+      <translation z="-(Pix_PP1_outer_Z_Start + 190)"/>
+    </transformation>
+   <assemblyref ref="PixPP1"/>
+  </transform>
+</logvol>
+-->
+<!--log vol for pix pp1-->
+
+<addbranch>
+
+  <logvol name="SCT" shape="ShStripEnvelope" material="N2">
+
+    <logvolref ref="PolyModOCEnvelope"/>
+
+    <transform>
+      <transformation name="PlaceBulkheadA">
+        <translation z="BulkheadTranslation"/>
+      </transformation>
+      <logvolref ref="Bulkhead"/>
+    </transform>
+    
+    <transform>
+      <transformation name="PlaceBulkheadC">
+        <translation z="-BulkheadTranslation"/>
+      </transformation>
+      <logvolref ref="Bulkhead"/>
+    </transform>
+    
+    <transform>
+      <transformation name="PlaceB_PP1A">
+        <translation z="B_PP1_Z_Start + B_PP1_L/2"/>
+      </transformation>
+      <logvolref ref="B_PP1"/>
+    </transform>
+    
+    <transform>
+      <transformation name="PlaceB_PP1C">
+        <translation z="-(B_PP1_Z_Start + B_PP1_L/2)"/>
+      </transformation>
+      <logvolref ref="B_PP1"/>
+    </transform>
+    <!--
+       <transform>
+	 <transformation  name="PlaceEC_PP1A">
+           <translation z="EC_PP1_Z_Start + EC_PP1_L/2"/>
+	 </transformation>
+	 <logvolref ref="EC_PP1"/>
+       </transform>
+       
+       <transform>
+	 <transformation  name="PlaceEC_PP1C">
+           <translation z="-(EC_PP1_Z_Start + EC_PP1_L/2)"/>
+	 </transformation>
+	 <logvolref ref="EC_PP1"/>
+       </transform>
+      
+       <transform>
+	 <transformation  name="PlacePix_PP1_middle_C">
+           <translation z="-(Pix_PP1_middle_Z_Start + Pix_PP1_middle_L/2)"/>
+	 </transformation>
+	 <logvolref ref="pixPP1"/>
+       </transform>
+       -->
+       
+       <!--
+       <transform>
+	 <transformation  name="PlaceHeatExchange_NA">
+	   <rotation  zcos="1." angle="0.785398"/>
+           <translation z="HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       <transform>
+	 <transformation  name="PlaceHeatExchange_EA">
+	   <rotation  zcos="1." angle="2.35619"/>
+           <translation z="HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       <transform>
+	 <transformation  name="PlaceHeatExchange_SA">
+	   <rotation  zcos="1." angle="3.92699"/>
+           <translation z="HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       <transform>
+	 <transformation  name="PlaceHeatExchange_WA">
+	   <rotation  zcos="1." angle="5.49779"/>
+           <translation z="HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       
+       <transform>
+	 <transformation  name="PlaceHeatExchange_NC">
+	   <rotation  zcos="1." angle="0.785398"/>
+           <translation z="-HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       <transform>
+	 <transformation  name="PlaceHeatExchange_EC">
+	   <rotation  zcos="1." angle="2.35619"/>
+           <translation z="-HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       <transform>
+	 <transformation  name="PlaceHeatExchange_SC">
+	   <rotation  zcos="1." angle="3.92699"/>
+           <translation z="-HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       <transform>
+	 <transformation  name="PlaceHeatExchange_WC">
+	   <rotation  zcos="1." angle="5.49779"/>
+           <translation z="-HeatExchanger_z"/>
+           <translation x="HeatExchanger_Ri+HeatExchanger_w/2"/>
+	 </transformation>
+	 <logvolref ref="HeatExchanger"/>
+       </transform>
+       -->
+    <index ref="barrel_endcap" value="0"/>
+    <transform alignable="3">
+      <transformation name="NoneButNeededForAlignable" alignable="true">
+	<translation/>
+      </transformation>
+      <logvol name="SCT_Barrel" shape="ShStripB_Envelope" material="N2" alignable="true">
+	<assemblyref ref="StripB"/>
+      </logvol>
+    </transform>
+    
+    <index ref="barrel_endcap" value="2"/>
+    <transform alignable="3">
+      <transformation name="PlaceEC_Plus" alignable="true">
+        <translation z="StripEC_Z_Start + StripEC_HalfLength"/>
+      </transformation>
+      <logvolref ref="SCT_ForwardPlus"/>
+    </transform>
+    
+    <index ref="barrel_endcap" value="-2"/>
+    <transform alignable="3">
+      <transformation name="TurnE_A_ToE_C" alignable="true">
+        <rotation ycos="1." angle="PI"/>
+        <translation z="StripEC_Z_Start + StripEC_HalfLength"/>
+      </transformation>
+      <logvolref ref="SCT_ForwardMinus"/>
+    </transform>
+    
+
+    <transform>
+      <transformation name="TurnPixPP1plus">
+	
+	<translation z="(Pix_PP1_Z_Start + 190)"/>
+      </transformation>
+      <logvolref ref="pixPP1"/>
+    </transform>
+
+    <transform>
+      <transformation name="TurnPixPP1minus">
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(Pix_PP1_Z_Start + 190)"/>
+      </transformation>
+      <logvolref ref="pixPP1"/>
+    </transform>
+
+<!--
+    <transform>
+      <transformation name="PlacePixPP1Type2D">
+	
+	<translation z="(Pix_PP1_middle_Z_End + PixType2D_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2D"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2D_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(Pix_PP1_middle_Z_End + PixType2D_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2D"/>
+    </transform>
+
+ <transform>
+      <transformation name="PlacePixPP1Type2E">
+	
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2E"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2E_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2E"/>
+    </transform>
+
+<transform>
+      <transformation name="PlacePixPP1Type2F">
+	
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2F"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2F_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2F"/>
+    </transform>
+
+<transform>
+      <transformation name="PlacePixPP1Type2G">
+	
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2G"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2G_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2G"/>
+    </transform>
+
+<transform>
+      <transformation name="PlacePixPP1Type2H">
+	
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2H"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2H_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2H"/>
+    </transform>
+
+<transform>
+      <transformation name="PlacePixPP1Type2I">
+	
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2I"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2I_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(Pix_PP1_outer_Z_End + PixType2E_hl)"/>
+      </transformation>
+      <logvolref ref="pixType2I"/>
+    </transform>
+
+<transform>
+      <transformation name="PlacePixPP1Type2J">
+	
+	<translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/>
+      </transformation>
+      <logvolref ref="pixType2J"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2J_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/>
+      </transformation>
+      <logvolref ref="pixType2J"/>
+    </transform>
+
+<transform>
+      <transformation name="PlacePixPP1Type2K">
+	
+	<translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/>
+      </transformation>
+      <logvolref ref="pixType2K"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2K_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/>
+      </transformation>
+      <logvolref ref="pixType2K"/>
+    </transform>
+
+<transform>
+      <transformation name="PlacePixPP1Type2L">
+	
+	<translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/>
+      </transformation>
+      <logvolref ref="pixType2L"/>
+    </transform>
+    
+    <transform>
+      <transformation name="TurnPixPP1Type2L_minus" >
+	<rotation ycos="1." angle="PI"/>
+	<translation z="(PixType2OutZ_start + PixType2OutZ_w/2)"/>
+      </transformation>
+      <logvolref ref="pixType2L"/>
+    </transform>
+-->
+    
+   
+
+    <!-- Service volumes -->
+    <transform>
+      <transformation name="PlaceBServicesPlus">
+	<translation z="StripB_ServicesGapZ_Start + StripB_ServicesGapHalfLength"/>
+      </transformation>
+      <assemblyref ref="SV_Barrel"/>
+    </transform>
+  
+  <transform>
+    <transformation name="PlaceBServicesMinus">
+      <rotation ycos="1." angle="PI"/>
+      <translation z="(StripB_ServicesGapZ_Start + StripB_ServicesGapHalfLength)"/>
+    </transformation>
+    <assemblyref ref="SV_Barrel"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceBServicesAtECPlus">
+      <translation z="StripB_ServicesEC_Z_Start + StripB_ServicesEC_HalfLength+EPS"/> <!-- Shrunk services by 10 halflength to fit SCT Barrel expansion -->
+    </transformation>
+    <assemblyref ref="SV_BarrelAtEC"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceBServicesAtECMinus">
+      <rotation ycos="1." angle="PI"/>
+      <translation z="StripB_ServicesEC_Z_Start + StripB_ServicesEC_HalfLength+EPS"/> <!-- Shrunk services by 10 halflength to fit SCT Barrel expansion -->
+    </transformation>
+    <assemblyref ref="SV_BarrelAtEC"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceECServicesPlus">
+      <translation z="StripEC_ServicesZ_Start + StripEC_ServicesHalfLength + EPS"/>
+    </transformation>
+    <assemblyref ref="SV_Endcap"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceECServicesMinus">
+      <rotation ycos="1." angle="PI"/>
+      <translation z="(StripEC_ServicesZ_Start + StripEC_ServicesHalfLength + EPS)"/>         
+      
+      
+    </transformation>
+    <assemblyref ref="SV_Endcap"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceRailShelfSquareCompleteA">
+      <translation x="RailRadius"/>
+      <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/>
+    </transformation>
+    <assemblyref ref="RailShelfSquareComplete"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceRailShelfCircleCompleteA">
+      <translation x="-RailRadius"/>
+      <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/>
+    </transformation>
+    <assemblyref ref="RailShelfCircleComplete"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlacePSTA">
+      <translation z="StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2."/>
+    </transformation>
+    <assemblyref ref="EndcapPST"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceRailShelfSquareCompleteC">
+      <translation x="-( RailRadius )"/>
+      <translation z="-( StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. )"/>
+      <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <assemblyref ref="RailShelfSquareComplete"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlaceRailShelfCircleCompleteC">
+      <translation x="RailRadius"/>
+      <translation z="-( StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. )"/>
+      <rotation ycos="1." angle="PI"/>
+    </transformation>
+    <assemblyref ref="RailShelfCircleComplete"/>
+  </transform>
+  
+  <transform>
+    <transformation name="PlacePSTC">
+      <translation z="-( StripEC_Z_Start + 0.5 + EC_InnerCylLength / 2. )"/>
+    </transformation>
+    <assemblyref ref="EndcapPST"/>
+  </transform>
+  
+</logvol>
+
+</addbranch>
+
+</geomodel>
diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/data/geomodel.dtd b/GeoModelTools/GeoModelXML/GMXPlugin/data/geomodel.dtd
new file mode 100644
index 0000000000000000000000000000000000000000..54cf5c59d9012e4dc64979e0f957d879f805f17a
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GMXPlugin/data/geomodel.dtd
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!-- Copyright N.P. Hessey, Nikhef, 2013 -->
+
+<!ELEMENT geomodel ((defines|materials|readoutgeometry|positionindex|shapes|logvol|transformation|assembly)+, addbranch)>
+  <!ATTLIST geomodel name    CDATA "Unnamed detector"
+                     version CDATA "0.0"
+                     xmlns   CDATA #FIXED "http://www.nikhef.nl/%7Er29/gmx">
+
+  <!ELEMENT defines (var|vector|matrix)+>
+
+    <!ELEMENT var EMPTY>
+      <!ATTLIST var name  ID    #REQUIRED
+                    value CDATA #REQUIRED>
+
+    <!ELEMENT vector EMPTY>
+      <!ATTLIST vector name  ID    #REQUIRED
+                       value CDATA #REQUIRED>
+
+    <!ELEMENT matrix EMPTY>
+      <!ATTLIST matrix name   ID    #REQUIRED
+                       coldim CDATA #REQUIRED
+                       value  CDATA #REQUIRED>
+
+  <!ELEMENT materials ((element|chemical|material)+)>
+    <!ATTLIST materials densitysf CDATA "1.0">
+
+    <!ELEMENT element EMPTY>
+      <!ATTLIST element name      ID      #REQUIRED
+                        shortname NMTOKEN #REQUIRED
+                        Z         CDATA   #REQUIRED
+                        A         CDATA   #REQUIRED>
+
+    <!ELEMENT chemical (elemcontent)+>
+      <!ATTLIST chemical name ID #REQUIRED>
+      <!ELEMENT elemcontent EMPTY>
+        <!ATTLIST elemcontent ref      IDREF #REQUIRED
+                              quantity CDATA #REQUIRED>
+
+    <!ELEMENT material (elementref|materialref|chemicalref)+>
+      <!ATTLIST material name    ID    #REQUIRED
+                         density CDATA #REQUIRED>
+
+      <!ELEMENT elementref EMPTY>
+        <!ATTLIST elementref ref      IDREF #REQUIRED
+                             fraction CDATA #REQUIRED>
+
+      <!ELEMENT materialref EMPTY>
+        <!ATTLIST materialref ref      IDREF #REQUIRED
+                              fraction CDATA #REQUIRED>
+
+      <!ELEMENT chemicalref EMPTY>
+        <!ATTLIST chemicalref ref      IDREF #REQUIRED
+                              fraction CDATA #REQUIRED>
+
+  <!ELEMENT readoutgeometry (param*, sensorclass+)>
+    <!ELEMENT param EMPTY>
+      <!ATTLIST param name  NMTOKEN #REQUIRED
+                      value CDATA   #REQUIRED>
+    <!ELEMENT sensorclass (param*, sensortype+)>
+    <!ATTLIST sensorclass name ID #REQUIRED>
+      <!ELEMENT sensortype (param*)>
+        <!ATTLIST sensortype name ID #REQUIRED>
+
+  <!ELEMENT positionindex (addindex+)>
+    <!ELEMENT addindex EMPTY>
+        <!ATTLIST addindex name ID #REQUIRED>
+
+  <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union)+)>
+    <!-- All shapes allowed in GeoModel manual. Same name, parameters, parameter order, but always lower case -->
+
+    <!ELEMENT box EMPTY>
+      <!ATTLIST box name        ID    #REQUIRED
+                    xhalflength CDATA #REQUIRED
+                    yhalflength CDATA #REQUIRED
+                    zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT cons EMPTY>
+      <!ATTLIST cons name  ID #REQUIRED
+                     rmin1 CDATA #REQUIRED
+                     rmin2 CDATA #REQUIRED
+                     rmax1 CDATA #REQUIRED
+                     rmax2 CDATA #REQUIRED
+                     dz    CDATA #REQUIRED
+                     sphi  CDATA #REQUIRED
+                     dphi  CDATA #REQUIRED>
+
+    <!ELEMENT generictrap EMPTY>
+      <!ATTLIST generictrap name        ID    #REQUIRED
+                            x0          CDATA #REQUIRED
+                            y0          CDATA #REQUIRED
+                            x1          CDATA #REQUIRED
+                            y1          CDATA #REQUIRED
+                            x2          CDATA #REQUIRED
+                            y2          CDATA #REQUIRED
+                            x3          CDATA #REQUIRED
+                            y3          CDATA #REQUIRED
+                            x4          CDATA #REQUIRED
+                            y4          CDATA #REQUIRED
+                            x5          CDATA #REQUIRED
+                            y5          CDATA #REQUIRED
+                            x6          CDATA #REQUIRED
+                            y6          CDATA #REQUIRED
+                            x7          CDATA #REQUIRED
+                            y7          CDATA #REQUIRED
+                            zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT para EMPTY>
+      <!ATTLIST para name        ID    #REQUIRED
+                     xhalflength CDATA #REQUIRED
+                     yhalflength CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     alpha       CDATA #REQUIRED
+                     theta       CDATA #REQUIRED
+                     phi         CDATA #REQUIRED>
+
+    <!ELEMENT pcon (addplane, addplane+)>
+      <!ELEMENT addplane EMPTY>
+        <!ATTLIST addplane zplane    CDATA #REQUIRED
+                           rminplane CDATA #REQUIRED
+                           rmaxplane CDATA #REQUIRED>
+ 
+      <!ATTLIST pcon name ID    #REQUIRED
+                     sphi CDATA #REQUIRED
+                     dphi CDATA #REQUIRED>
+
+    <!ELEMENT pgon (addplane, addplane+)>
+      <!ATTLIST pgon name   ID    #REQUIRED
+                     sphi   CDATA #REQUIRED
+                     dphi   CDATA #REQUIRED
+                     nsides CDATA #REQUIRED>
+
+    <!ELEMENT trap EMPTY>
+      <!ATTLIST trap name        ID    #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     theta       CDATA #REQUIRED
+                     phi         CDATA #REQUIRED
+                     dydzn       CDATA #REQUIRED
+                     dxdyndzn    CDATA #REQUIRED
+                     dxdypdzn    CDATA #REQUIRED
+                     angleydzn   CDATA #REQUIRED
+                     dydzp       CDATA #REQUIRED
+                     dxdyndzp    CDATA #REQUIRED
+                     dxdypdzp    CDATA #REQUIRED
+                     angleydzp   CDATA #REQUIRED>
+
+    <!ELEMENT tube EMPTY>
+      <!ATTLIST tube name        ID    #REQUIRED
+                     rmin        CDATA #REQUIRED
+                     rmax        CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT tubs EMPTY>
+      <!ATTLIST tubs name        ID    #REQUIRED
+                     rmin        CDATA #REQUIRED
+                     rmax        CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     sphi        CDATA #REQUIRED
+                     dphi        CDATA #REQUIRED>
+
+    <!ELEMENT trd EMPTY>
+      <!ATTLIST trd name         ID    #REQUIRED
+                    xhalflength1 CDATA #REQUIRED
+                    xhalflength2 CDATA #REQUIRED
+                    yhalflength1 CDATA #REQUIRED
+                    yhalflength2 CDATA #REQUIRED
+                    zhalflength  CDATA #REQUIRED>
+
+    <!ELEMENT intersection (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST intersection name ID #REQUIRED>
+
+    <!ELEMENT subtraction (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST subtraction name ID #REQUIRED>
+
+    <!ELEMENT union (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST union name ID #REQUIRED>
+
+  <!ELEMENT shaperef EMPTY>
+    <!ATTLIST shaperef ref IDREF #REQUIRED>
+
+  <!ELEMENT transform ((transformation|transformationref), (logvol|logvolref|assembly|assemblyref))>
+    <!ATTLIST transform name      ID    #IMPLIED
+                        alignable CDATA #IMPLIED> <!-- CDATA = alignment level-number -->
+
+    <!ELEMENT transformation (scaling|rotation|translation)+>
+
+      <!ELEMENT scaling EMPTY>
+        <!ATTLIST scaling x CDATA "1.0"
+                          y CDATA "1.0"
+                          z CDATA "1.0">
+
+      <!ELEMENT rotation EMPTY>
+        <!ATTLIST rotation xcos  CDATA "0.0"
+                           ycos  CDATA "0.0"
+                           zcos  CDATA "0.0"
+                           angle CDATA "0.0">
+
+      <!ELEMENT translation EMPTY>
+        <!ATTLIST translation x CDATA "0.0"
+                              y CDATA "0.0"
+                              z CDATA "0.0">
+
+      <!ATTLIST transformation name ID #REQUIRED>
+      <!ATTLIST transformation alignable (true|false) "false"> 
+
+    <!ELEMENT transformationref EMPTY>
+      <!ATTLIST transformationref ref IDREF #REQUIRED>
+
+  <!ELEMENT logvol (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)*>
+    <!-- If sensitive is not given, it is not sensitive. If given, it points to a digitization scheme -->
+    <!ATTLIST logvol name ID #REQUIRED
+                     shape IDREF #REQUIRED
+                     material IDREF #REQUIRED
+                     sensitive IDREF #IMPLIED 
+                     alignable (true|false) "false"> 
+
+  <!ELEMENT index EMPTY>
+    <!ATTLIST index ref   IDREF #REQUIRED
+                    value CDATA #REQUIRED>
+
+  <!ELEMENT logvolref EMPTY>
+    <!ATTLIST logvolref ref    IDREF         #REQUIRED
+                        zeroid (true|false) "false">
+
+  <!ELEMENT assembly (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)+>
+    <!ATTLIST assembly name      ID           #REQUIRED
+                       alignable (true|false) "false"> 
+
+  <!ELEMENT assemblyref EMPTY>
+    <!ATTLIST assemblyref ref    IDREF        #REQUIRED
+                          zeroid (true|false) "false">
+
+  <!ELEMENT multicopy (transformation, (transform|logvolref|assemblyref))>
+    <!-- Removed logvol and assembly from multicopy content. There is no particular reason 
+         why they shouldn't be allowed there. But in practice one uses refs, and forbidding them simplifies coding 
+         the index stuff. If you need them, put them back. Got rid of transformref; never used. -->
+    <!-- loopvar: Set to a vector variable name or omit; see manual -->
+    <!-- alignable: Value is the alignment level-number -->
+    <!ATTLIST multicopy name      ID    #REQUIRED
+                        n         CDATA #REQUIRED
+                        loopvar   CDATA #IMPLIED
+                        alignable CDATA #IMPLIED>
+    <!-- N.B. no zeroid attribute: the copy-number is always zeroed each time the multicopy is inserted; no choice -->
+
+  <!ELEMENT addbranch (transform|logvol|logvolref|assembly|assemblyref)+>
+
diff --git a/GeoModelTools/GeoModelXML/GMXPlugin/src/GMXPlugin.cxx b/GeoModelTools/GeoModelXML/GMXPlugin/src/GMXPlugin.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..1fcf13f1619a41d79578674753010ff2431b0410
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GMXPlugin/src/GMXPlugin.cxx
@@ -0,0 +1,107 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+
+#include "GeoModelKernel/GeoVGeometryPlugin.h"
+
+
+#include "GeoModelKernel/GeoNameTag.h"
+#include "GeoModelKernel/Units.h"
+#define SYSTEM_OF_UNITS GeoModelKernelUnits // so we will get, e.g., 'GeoModelKernelUnits::cm'
+
+#include "GeoModelXml/GmxInterface.h"
+#include "GeoModelXml/Gmx2Geo.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+class GMXPlugin : public GeoVGeometryPlugin  {
+
+ public:
+
+  // Constructor:
+  GMXPlugin();
+
+  // Destructor:
+  ~GMXPlugin();
+
+  // Creation of geometry:
+  virtual void create(GeoPhysVol *world, bool publish);
+
+ private:
+
+  // Illegal operations:
+  const GMXPlugin & operator=(const GMXPlugin &right)=delete;
+  GMXPlugin(const GMXPlugin &right) = delete;
+
+  bool exists (const std::string& name)
+  {
+    std::ifstream f(name.c_str());
+    return f.good();
+  }
+
+  std::vector<std::string> parseFiles(const std::string files, const char separator=';')
+  {
+  	 std::string parsed;
+	 std::istringstream iFiles(files);
+	 std::vector<std::string> fileList;
+	 while (iFiles>>parsed)
+	 {
+		std::cout<<" parsed string "<<parsed<<std::endl;
+		fileList.push_back(parsed);
+	 }
+	 return fileList;
+  }
+
+};
+
+
+
+
+
+GMXPlugin::GMXPlugin()
+{
+}
+
+
+GMXPlugin::~GMXPlugin()
+{
+}
+
+
+//## Other Operations (implementation)
+void GMXPlugin::create(GeoPhysVol *world, bool publish)
+{
+
+  std::cout<< "This is GMXPlugin: creating a GeoModelXml detector "<<std::endl;
+  std::vector<std::string> filesToParse;
+  char* fPath=getenv("GMX_FILES");
+  std::string fileName;
+  if (fPath!=NULL) {
+    std::cout<<" Environment variable GMX_FILES set to "<<fPath<<std::endl;
+    fileName=std::string(fPath);
+    filesToParse=parseFiles(fileName,':');
+  }
+  else {
+  	fileName="gmx.xml";
+	filesToParse.push_back(fileName);
+  }
+
+  for (auto f: filesToParse)
+  {
+    if (!exists(f)) {
+    	std::cout <<"GDMLtoGeo: input file "<<f<<
+      	" does not exist. quitting and returning nicely! "<<std::endl;
+   	return;
+    }
+    GmxInterface gmxInterface;
+    Gmx2Geo gmx2Geo(f, world, gmxInterface, 0);
+  }
+
+}
+
+extern "C" GMXPlugin *createGMXPlugin() {
+  return new GMXPlugin;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/CMakeLists.txt b/GeoModelTools/GeoModelXML/GeoModelXml/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5bfcae6907de16a3696b4b513535cda109044bd7
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/CMakeLists.txt
@@ -0,0 +1,51 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+# Find the header and source files.
+file( GLOB SOURCES src/*.cxx )
+file( GLOB HEADERS GeoModelXml/*.h )
+file( GLOB SHAPEHEADERS GeoModelXml/shape/*.h )
+
+# External dependencies
+find_package( ZLIB REQUIRED )
+
+
+# Create the library.
+add_library( GeoModelXml SHARED ${HEADERS} ${SOURCES} )
+# Add custom definitions
+target_compile_definitions( GeoModelXml PUBLIC -DSTANDALONE_GMX )
+# link libraries
+target_link_libraries( GeoModelXml PUBLIC GeoModelCore::GeoModelKernel GeoModelTools::ExpressionEvaluator XercesC::XercesC ZLIB::ZLIB  )
+target_include_directories( GeoModelXml PUBLIC 
+   $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+   $<INSTALL_INTERFACE:include> )
+source_group( "GeoModelXml" FILES ${HEADERS} )
+source_group( "src" FILES ${SOURCES} )
+set_target_properties( GeoModelXml PROPERTIES
+   VERSION ${PROJECT_VERSION}
+   SOVERSION ${PROJECT_VERSION_MAJOR} )
+
+# Set up an alias with the same name that you would get by "finding" a pre-built
+# version of the library.
+add_library( GeoModelTools::GeoModelXml ALIAS GeoModelXml )
+
+# Install the library.
+install(TARGETS GeoModelXml
+    EXPORT ${PROJECT_NAME}-export
+    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+            COMPONENT Runtime
+    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            COMPONENT          Runtime
+            NAMELINK_COMPONENT Development   # Requires CMake 3.12
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+            COMPONENT Development
+            PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GeoModelXml
+            COMPONENT Development
+    INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+)
+
+install( FILES ${HEADERS}
+    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GeoModelXml
+    COMPONENT Development )
+install( FILES ${SHAPEHEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GeoModelXml/shape)
+
+
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AddbranchProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AddbranchProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..c728cf248a0fabd79fb86199e40daa525df6373a
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AddbranchProcessor.h
@@ -0,0 +1,18 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_ADD_BRANCH_PROCESSOR_H
+#define GEO_MODEL_XML_ADD_BRANCH_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+//
+//   Processor for addbranch tags.
+//
+#include "GeoModelXml/ElementProcessor.h"
+
+class AddbranchProcessor: public ElementProcessor {
+public:
+    void process(const xercesc::DOMElement *element, GmxUtil &util, GeoNodeList &toAdd);
+};
+
+#endif // ADD_BRANCH_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..523204ece15ed2195eab0a9167d2b7e6a33a7247
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyProcessor.h
@@ -0,0 +1,31 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_ASSEMBLY_PROCESSOR_H
+#define GEO_MODEL_XML_ASSEMBLY_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+//
+//   Processor for assembly tags.
+//
+#include <string>
+#include <map>
+
+#include "GeoModelXml/ElementProcessor.h"
+class GmxUtil;
+class GeoNameTag;
+
+class AssemblyProcessor: public ElementProcessor {
+public:
+    typedef struct {
+        GeoNameTag *name;
+        int id;
+        bool alignable;
+    } AssemblyStore; 
+    void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
+    void zeroId(const xercesc::DOMElement *element);
+private:
+    std::map<std::string, AssemblyStore> m_map; 
+};
+
+#endif // ASSEMBLY_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..54e1a691202758fd4b45d4994f92c8e99435ffdf
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/AssemblyrefProcessor.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_ASSEMBLYREF_PROCESSOR_H
+#define GEO_MODEL_XML_ASSEMBLYREF_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+
+//
+//   Processor for assemblyref tags.
+//
+
+#include "GeoModelXml/ElementProcessor.h"
+class GmxUtil;
+
+class AssemblyrefProcessor: public ElementProcessor {
+public:
+    void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
+};
+
+#endif // ASSEMBLYREF_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItem.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItem.h
new file mode 100644
index 0000000000000000000000000000000000000000..01e8562de77412ad50bdccf8d37a6cfb72d67783
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItem.h
@@ -0,0 +1,36 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Base class to process one element (not its children).
+//    For each element-tag, create a class inheriting from this; and supply the process method.
+//    Register your processor with the BranchProcessor.
+//
+#ifndef GEO_MODEL_XML_ELEMENT2GEO_ITEM_H
+#define GEO_MODEL_XML_ELEMENT2GEO_ITEM_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include <map>
+#include <string>
+
+class RCBase;
+class GmxUtil;
+
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
+class ProcessorRegistry;
+namespace HepTool {class Evaluator;}
+
+class Element2GeoItem {
+
+public:
+    Element2GeoItem();
+    virtual ~Element2GeoItem();
+    const RCBase * process(const xercesc::DOMElement *element, GmxUtil &gmxUtil);
+    virtual const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+protected:
+    std::map<std::string, const RCBase *> m_map;  
+};
+#endif // ELEMENT2GEO_ITEM_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItemRegistry.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItemRegistry.h
new file mode 100644
index 0000000000000000000000000000000000000000..bb85bc1457b085f92e7d925d6120078ffe76bdb1
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Element2GeoItemRegistry.h
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Process an element followed by all its children.
+//    Element processors have to be registered with me so I know who to call.
+//    Any element tag with no registered processor will be handled by a default handler, which
+//    does nothing and stops processing of its children.
+//
+#ifndef GEO_MODEL_XML_ELEMENT2GEO_ITEM_REGISTRY_H
+#define GEO_MODEL_XML_ELEMENT2GEO_ITEM_REGISTRY_H
+#include <string>
+#include <map>
+
+class Element2GeoItem;
+
+class Element2GeoItemRegistry {
+public:
+    Element2GeoItemRegistry();
+    ~Element2GeoItemRegistry();
+    void enregister(const std::string tagName,  Element2GeoItem *processor); // register = keyword
+    Element2GeoItem *find(const std::string tagName);
+
+private:
+    Element2GeoItem *m_defaultProcessor;
+    std::map<std::string,  Element2GeoItem *> m_processor;
+};
+
+#endif // ELEMENT2GEO_ITEM_REGISTRY_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ElementProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ElementProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..08c92612ac39c52b926a019c51782981d34e7bb1
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ElementProcessor.h
@@ -0,0 +1,28 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Base class to process one element (not its children).
+//    For each element-tag, create a class inheriting from this; and supply the process method.
+//    Register your processor with the BranchProcessor.
+//
+#ifndef GEO_MODEL_XML_ELEMENT_PROCESSOR_H
+#define GEO_MODEL_XML_ELEMENT_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/GeoNodeList.h"
+
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
+class GmxUtil;
+
+class ElementProcessor {
+
+public:
+    ElementProcessor();
+    virtual void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, 
+                         GeoNodeList &toBeAdded);
+};
+#endif // ELEMENT_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GeoNodeList.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GeoNodeList.h
new file mode 100644
index 0000000000000000000000000000000000000000..eac3c942d3b64ab52b0b6b56bca4e949a4486ea3
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GeoNodeList.h
@@ -0,0 +1,8 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include <vector>
+#include "GeoModelKernel/GeoGraphNode.h"
+
+typedef std::vector<GeoGraphNode *> GeoNodeList;
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
new file mode 100644
index 0000000000000000000000000000000000000000..2690f137c6fdaac058cc8299dbe2854e751c6402
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/Gmx2Geo.h
@@ -0,0 +1,69 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_GMX2GEO_H
+#define GEO_MODEL_XML_GMX2GEO_H
+#include <xercesc/util/XercesDefs.hpp>
+
+/**
+ *  @brief Create a branch of a GeoModel Tree.
+ *
+ * @author Nigel Hessey, Nikhef
+@section GeoModelXmlOverview Class Overview
+  The GeoModelXml package contains the following classes:
+
+  - Gmx2Geo : Create an instance of a Gmx2Geo class to do all the work
+ * First parameter is the name of the file containing the xml
+ * Second parameter is the position in the ATLAS GeoModel tree at which your geometry is to be inserted
+ * Third parameter gives a set of call back routines for dealing with sensitive and alignable volumes.
+ *
+ */
+
+//
+//    Gmx2Geo is the main class needed to set-up a GeoModel graph branch using 
+//    xml (in a .gmx file).
+//    The user instantiates one of these, giving the name of the file and where in the 
+//    GeoModel graph the volumes are to be added, and a GmxInterface object. The constructor does the rest,
+//    adding solids and materials etc. according to the .gmx file.
+//
+//    Use:
+//        #include "GeoModelXml/Gmx2Geo.h"
+//        #include "GeoModelXml/GmxInterface.h"
+//            ...create your world volume and do all the Athena setup...
+//            ... get the filename with the xml in:
+//              std::string xmlfilename; some athena stuff to get filename from the job options...
+//            ...create your envelope GeoPhysVol...
+//            GeoPhysVol *sct(...);
+//            GmxInterface gmxInterface;
+//
+//            Gmx2Geo gmx2Geo(xmlfilename, sct, gmxInterface);   
+//
+#include <string>
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelXml/GmxInterface.h"
+
+class GeoPhysVol;
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMDocument;
+XERCES_CPP_NAMESPACE_END
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMNode;
+XERCES_CPP_NAMESPACE_END
+
+class Evaluator;
+
+class Gmx2Geo {
+public:
+    Gmx2Geo(const std::string gmxFile, GeoPhysVol *addHere, GmxInterface &gmxInterface, unsigned int flags = 0);
+private:
+// Disallow copying
+    Gmx2Geo(const Gmx2Geo &right);
+    Gmx2Geo & operator=(const Gmx2Geo &right);
+
+    int doDefines(xercesc::DOMDocument *doc, Evaluator &eval);
+    int doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil);
+    int doReadoutGeometry(xercesc::DOMDocument *doc, GmxUtil &gmxUtil);
+    void addParam(xercesc::DOMNode *node, std::map<std::string, std::string> &params);
+};
+#endif // GMX2GEO_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxInterface.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxInterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..7c64ebee49558473421ee9262d20068c6650c1bb
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxInterface.h
@@ -0,0 +1,35 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_GMX_INTERFACE_H
+#define GEO_MODEL_XML_GMX_INTERFACE_H
+//
+//    Interface between SCT_SLHC_GeoModel and GeoModelXml.
+//    Provides 4 call-back routines:
+//        (0) To get a copy number with which to label a sensitive ID. 
+//            ...gets copied to the G4 volume. Then SCT_G4_SD package uses this
+//            to get the position indexes or hashId
+//        (1) To add sensitive detector types
+//        (2) To add sensitive elements
+//        (3) To add alignable transforms
+//    - these get added to the detector manager.
+//
+#include <string>
+#include <vector>
+#include <map>
+#include "GeoModelKernel/GeoVFullPhysVol.h"
+#include "GeoModelKernel/GeoAlignableTransform.h"
+
+class GmxInterface {
+public:
+    virtual int sensorId(std::map<std::string, int> &index) const;
+    virtual int splitSensorId(std::map<std::string, int> &index, std::pair<std::string, int> &extraIndex, std::map<std::string, int> &updatedIndex) const; //For "artificially" adding to Identifiers; specify the field (e.g. "eta_module") and the value to add
+    virtual void addSensorType(std::string type, std::string name, std::map<std::string, std::string> parameters);
+    virtual void addSensor(std::string name, std::map<std::string, int> &index, int id, GeoVFullPhysVol *fpv);
+    virtual void addSplitSensor(std::string name, std::map<std::string, int> &index, std::pair<std::string, int> &extraIndex, int id, GeoVFullPhysVol *fpv);
+    virtual void addAlignable(int level, std::map<std::string, int> &index, 
+                              GeoVFullPhysVol *fpv, GeoAlignableTransform *transform);
+
+};
+#endif // GMX_INTERFACE_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
new file mode 100644
index 0000000000000000000000000000000000000000..74c8bdf717cb94c6c0fe8b628522bc6253f0b675
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/GmxUtil.h
@@ -0,0 +1,131 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_GMXUTIL_H
+#define GEO_MODEL_XML_GMXUTIL_H
+//
+//    Convenience class to hold Evaluator and registries. Allows one parameter to be passed
+//    to element handlers instead of a (changing??) list.
+//
+#include <string>
+#ifndef STANDALONE_GMX
+#include "CLHEP/Evaluator/Evaluator.h"
+#else
+#include "ExpressionEvaluator/Evaluator.h"
+#endif
+#include "GeoModelXml/ProcessorRegistry.h"
+#include "GeoModelXml/Element2GeoItemRegistry.h"
+
+#include "GeoModelXml/AddbranchProcessor.h"
+#include "GeoModelXml/LogvolProcessor.h"
+#include "GeoModelXml/LogvolrefProcessor.h"
+#include "GeoModelXml/AssemblyProcessor.h"
+#include "GeoModelXml/AssemblyrefProcessor.h"
+#include "GeoModelXml/TransformProcessor.h"
+#include "GeoModelXml/MulticopyProcessor.h"
+#include "GeoModelXml/IndexProcessor.h"
+
+#include "GeoModelXml/MakeElement.h"
+#include "GeoModelXml/MakeMaterial.h"
+#include "GeoModelXml/MakeTransformation.h"
+#include "GeoModelXml/MakeTransformationref.h"
+#include "GeoModelXml/MakeTranslation.h"
+#include "GeoModelXml/MakeRotation.h"
+#ifndef STANDALONE_GMX
+#include "GeoModelXml/MakeScaling.h"
+#endif
+
+#include "GeoModelXml/shape/MakeSimplePolygonBrep.h"
+#include "GeoModelXml/shape/MakeBox.h"
+#include "GeoModelXml/shape/MakeCons.h"
+#include "GeoModelXml/shape/MakeGenericTrap.h"
+#include "GeoModelXml/shape/MakePara.h"
+#include "GeoModelXml/shape/MakePcon.h"
+#include "GeoModelXml/shape/MakePgon.h"
+#include "GeoModelXml/shape/MakeTrap.h"
+#include "GeoModelXml/shape/MakeTrd.h"
+#include "GeoModelXml/shape/MakeTube.h"
+#include "GeoModelXml/shape/MakeTubs.h"
+#include "GeoModelXml/shape/MakeIntersection.h"
+#include "GeoModelXml/shape/MakeUnion.h"
+#include "GeoModelXml/shape/MakeSubtraction.h"
+#include "GeoModelXml/shape/MakeShaperef.h"
+#include "GeoModelXml/shape/AddPlane.h"
+
+#include "GeoModelXml/PositionIndex.h"
+//#include "GeoModelXml/SensitiveId.h"
+#include "GeoModelXml/GmxInterface.h"
+
+class GmxUtil {
+public:
+    GmxUtil(GmxInterface &gmxInterface);
+    ~GmxUtil();
+    GmxInterface *gmxInterface();
+    double evaluate(char const *expression);
+    std::string debracket(std::string expression);
+#ifndef STANDALONE_GMX
+    HepTool::Evaluator eval;
+#else
+    Evaluator eval;
+#endif
+    PositionIndex positionIndex;
+    ProcessorRegistry processorRegistry;
+    Element2GeoItemRegistry geoItemRegistry;
+    GeoLogVol * getAssemblyLV() {return m_assemblyLV;};
+    struct TagHandler {
+//
+//    Things creating a vector of nodes to be added to the tree
+//
+        AddbranchProcessor addbranch;
+        LogvolProcessor logvol;
+        LogvolrefProcessor logvolref;
+        AssemblyProcessor assembly;
+        AssemblyrefProcessor assemblyref;
+        TransformProcessor transform;
+        MulticopyProcessor multicopy;
+        IndexProcessor index;
+//
+//    Things creating an RCBase *
+//
+        MakeElement element;
+        MakeMaterial material;
+        MakeSimplePolygonBrep simplepolygonbrep;
+        MakeBox box;
+        MakeCons cons;
+        MakeGenericTrap generictrap;
+        MakePara para;
+        MakePcon pcon;
+        MakePgon pgon;
+        MakeTrap trap;
+        MakeTrd trd;
+        MakeTube tube;
+        MakeTubs tubs;
+        MakeIntersection intersection;
+        MakeUnion onion; // union is reserved
+        MakeSubtraction subtraction;
+        MakeShaperef shaperef;
+        MakeTransformation transformation;
+        MakeTransformationref transformationref;
+//
+//    Things creating HEP transforms
+//
+        MakeTranslation translation;
+        MakeRotation rotation;
+#ifndef STANDALONE_GMX
+        MakeScaling scaling;
+#endif
+//
+//    Other things
+//
+        AddPlane addplane;
+    } tagHandler;
+//    SensitiveId sensitiveId;
+private:
+    GeoLogVol *makeAssemblyLV();
+    GeoLogVol *m_assemblyLV; // Special logvol to be turned into an assembly-physical-volume. 
+                             // Achieved by filling it with special::ether material.
+    GmxInterface *m_gmxInterface; 
+};
+
+#endif // GMXUTIL_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/IndexProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/IndexProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..2e66b9576e339848c18e7a72c1faeac9817909fb
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/IndexProcessor.h
@@ -0,0 +1,18 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_INDEX_PROCESSOR_H
+#define GEO_MODEL_XML_INDEX_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+//
+//   Processor for index tags which change the formula for generating a position-index.
+//
+#include "GeoModelXml/ElementProcessor.h"
+
+class IndexProcessor: public ElementProcessor {
+public:
+    void process(const xercesc::DOMElement *element, GmxUtil &util, GeoNodeList &toAdd);
+};
+
+#endif // INDEX_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..a3b44e18f599c3ca959869433f2c75190ca92ddf
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h
@@ -0,0 +1,33 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_LOGVOL_PROCESSOR_H
+#define GEO_MODEL_XML_LOGVOL_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+//
+//   Processor for logvol tags.
+//
+#include <string>
+#include <map>
+
+#include "GeoModelXml/ElementProcessor.h"
+class GmxUtil;
+class GeoNameTag;
+class GeoLogVol;
+
+class LogvolProcessor: public ElementProcessor {
+public:
+    typedef struct {
+        GeoNameTag *name;
+        int id;
+        GeoLogVol *logVol;
+        bool alignable;
+    } LogVolStore; 
+    void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
+    void zeroId(const xercesc::DOMElement *element);
+private:
+    std::map<std::string, LogVolStore> m_map; 
+};
+
+#endif // LOGVOL_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolrefProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolrefProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..a3efbb9bd4157992bdadda0e6b9229f7a4783c2e
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolrefProcessor.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_LOGVOLREF_PROCESSOR_H
+#define GEO_MODEL_XML_LOGVOLREF_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+
+//
+//   Processor for logvolref tags.
+//
+
+#include "GeoModelXml/ElementProcessor.h"
+class GmxUtil;
+
+class LogvolrefProcessor: public ElementProcessor {
+public:
+    void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
+};
+
+#endif // LOGVOLREF_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeElement.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeElement.h
new file mode 100644
index 0000000000000000000000000000000000000000..f1494499f1af72106d71ab71a3a6892c6f7034e1
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeElement.h
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Handle material elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_ELEMENT_H
+#define GEO_MODEL_XML_MAKE_ELEMENT_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeElement: public Element2GeoItem {
+public:
+    MakeElement();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // MAKE_ELEMENT_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeMaterial.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeMaterial.h
new file mode 100644
index 0000000000000000000000000000000000000000..8d95e862226a72f8206a06620d6d430f7c0aaa8e
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeMaterial.h
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Handle material elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_MATERIAL_H
+#define GEO_MODEL_XML_MAKE_MATERIAL_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeMaterial: public Element2GeoItem {
+public:
+    MakeMaterial();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // MAKE_MATERIAL_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeRotation.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeRotation.h
new file mode 100644
index 0000000000000000000000000000000000000000..3a41d1ebbc8179c5d2537ee890a405e96a787194
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeRotation.h
@@ -0,0 +1,23 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_MAKE_ROTATION_H
+#define GEO_MODEL_XML_MAKE_ROTATION_H
+#include <xercesc/util/XercesDefs.hpp>
+//
+//    Create and return a HepRotation3d. Caller must delete it.
+//
+
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
+#include "GeoModelKernel/GeoDefinitions.h"
+class GmxUtil;
+
+class MakeRotation {
+public:
+    MakeRotation();
+    GeoTrf::Rotation3D getTransform(const xercesc::DOMElement *rotation, GmxUtil &gmxUtil);
+};
+#endif // MAKE_ROTATION_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformation.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformation.h
new file mode 100644
index 0000000000000000000000000000000000000000..c80e05c88c8f15581f75f6bd27f5358236eadf71
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformation.h
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Handle material elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_TRANSFORMATION_H
+#define GEO_MODEL_XML_MAKE_TRANSFORMATION_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeTransformation: public Element2GeoItem {
+public:
+    MakeTransformation();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // MAKE_TRANSFORMATION_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformationref.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformationref.h
new file mode 100644
index 0000000000000000000000000000000000000000..5c345f73663ddb943762f1ece8b883b0ee482730
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTransformationref.h
@@ -0,0 +1,19 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Handle material elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_TRANSFORMATIONREF_H
+#define GEO_MODEL_XML_MAKE_TRANSFORMATIONREF_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeTransformationref: public Element2GeoItem {
+public:
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // MAKE_TRANSFORMATIONREF_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTranslation.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTranslation.h
new file mode 100644
index 0000000000000000000000000000000000000000..3464308f791059a16548cd7fa36d0f89e52d299f
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MakeTranslation.h
@@ -0,0 +1,24 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_MAKE_TRANSLATION_H
+#define GEO_MODEL_XML_MAKE_TRANSLATION_H
+#include <xercesc/util/XercesDefs.hpp>
+//
+//    Create and return a HepRotation3d. Caller must delete it.
+//
+
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
+#include "GeoModelKernel/GeoDefinitions.h"
+class GmxUtil;
+
+
+class MakeTranslation {
+public:
+    MakeTranslation();
+    GeoTrf::Translate3D getTransform(const xercesc::DOMElement *rotation, GmxUtil &gmxUtil);
+};
+#endif // MAKE_TRANSLATION_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MulticopyProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MulticopyProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..d52033f4ea5ae1ca046ca83547b2d6696dab7808
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/MulticopyProcessor.h
@@ -0,0 +1,24 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_MULTICOPY_PROCESSOR_H
+#define GEO_MODEL_XML_MULTICOPY_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+//
+//   Processor for multicopy tags.
+//
+#include <string>
+#include <map>
+
+#include "GeoModelXml/ElementProcessor.h"
+class GmxUtil;
+
+class MulticopyProcessor: public ElementProcessor {
+public:
+    void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
+private:
+    std::map <std::string, GeoNodeList> m_map; 
+};
+
+#endif // MULTICOPY_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/OutputDirector.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/OutputDirector.h
new file mode 100644
index 0000000000000000000000000000000000000000..72b18bc2a3a2215504a4758c5ae35bf101f5aed9
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/OutputDirector.h
@@ -0,0 +1,44 @@
+/*
+    Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Use gaudi messaging service when in Athena; use cout when "stand-alone".
+//
+
+#ifndef OUTPUTDIRECTOR_H
+#define OUTPUTDIRECTOR_H
+
+//#define STANDALONE_GMX
+
+#ifdef STANDALONE_GMX
+  #include <iostream>
+  #include <string>
+
+  namespace MSG {
+    // enum((VERBOSE=1, DEBUG, INFO, WARNING, ERROR, FATAL, ALWAYS))}
+    const std::string PKG_NAME("GeoModelXML-");
+    const std::string VERBOSE(PKG_NAME + "VERBOSE: "); 
+    const std::string DEBUG(PKG_NAME + "DEBUG: "); 
+    const std::string INFO(PKG_NAME + "INFO: "); 
+    const std::string WARNING(PKG_NAME + "WARNING: "); 
+    const std::string ERROR(PKG_NAME + "ERROR: "); 
+    const std::string FATAL(PKG_NAME + "FATAL: "); 
+    const std::string ALWAYS(PKG_NAME + "ALWAYS: "); 
+  }
+  // Consider changing this to a longer, less clashing sort of name, in the code
+  #define msglog std::cout
+  #define endmsg std::endl
+  // Nothing to do for stand-alone output; cout is already available.
+  #define OUTPUT_STREAM 
+#else
+  #include "GaudiKernel/ServiceHandle.h"
+  #include "GaudiKernel/MsgStream.h"
+  #include "GaudiKernel/IMessageSvc.h"
+  // Macro OUTPUT_STREAM opens a MsgStream called log; can then write to it.
+  // Cannot get ServiceHandle directly into the macro; hide it with a typedef...
+  typedef ServiceHandle<IMessageSvc> SvcHndl;
+  #define OUTPUT_STREAM SvcHndl msgh("MessageSvc", "GeoModelXml"); MsgStream log(&(*msgh), "GeoModelXml")
+#endif
+
+#endif // OUTPUTDIRECTOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
new file mode 100644
index 0000000000000000000000000000000000000000..59a730ac5861a86125fa867409459fefc1c05931
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/PositionIndex.h
@@ -0,0 +1,52 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Deal with positional indices (layer number etc.)
+//
+#ifndef GEO_MODEL_XML_POSITIONINDEX_H
+#define GEO_MODEL_XML_POSITIONINDEX_H
+
+/**
+ * @brief Handle the position index names, formulae, and values
+ *
+ * Values are calculated strictly in the order that the index names are given in the xml file.
+ * This allows the user freedom to choose the order of evaluation, which matters when he is using
+ * the CNL_n values in her formulae.
+ */
+
+#include <vector>
+#include <map>
+#include <string>
+
+class Evaluator;
+
+class PositionIndex {
+public:
+    PositionIndex(); 
+    ~PositionIndex();
+
+    int level();
+    int incrementLevel();
+    int decrementLevel();
+    
+    int copyNo(int level);
+    int setCopyNo(int copyNo);
+
+    void addIndex(std::string name);
+    std::string name(int whichOne);
+    std::string formula(std::string name);
+    void setFormula(std::string name, std::string formula);
+
+    void indices(std::map<std::string, int> &index, Evaluator &eval);
+
+private:
+    int m_level;
+    std::vector <int> m_copyNo; // Size is always m_level+1
+/** @brief We keep a separate vector of the names as a way of preserving the order of evaluation
+ */
+    std::vector <std::string> m_name;
+    std::map <std::string, std::string> m_formula;
+};
+#endif // POSITIONINDEX_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ProcessorRegistry.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ProcessorRegistry.h
new file mode 100644
index 0000000000000000000000000000000000000000..ae15a9b024bb0112a9dfe5ff09542df90f6494fe
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/ProcessorRegistry.h
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Process an element followed by all its children.
+//    Element processors have to be registered with me so I know who to call.
+//    Any element tag with no registered processor will be handled by a default handler, which
+//    does nothing and stops processing of its children.
+//
+#ifndef GEO_MODEL_XML_PROCESSOR_REGISTRY_H
+#define GEO_MODEL_XML_PROCESSOR_REGISTRY_H
+
+#include <string>
+#include <map>
+
+class ElementProcessor;
+
+class ProcessorRegistry {
+public:
+    ProcessorRegistry();
+    void enregister(const std::string tagName, ElementProcessor *processor);
+    ElementProcessor *find(const std::string name);
+
+private:
+    ElementProcessor *m_defaultProcessor;
+    std::map<std::string, ElementProcessor *> m_processor;
+};
+
+#endif // PROCESSOR_REGISTRY_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/SensitiveId.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/SensitiveId.h
new file mode 100644
index 0000000000000000000000000000000000000000..58927237c71bd12a5172c1ffd9284c1009458059
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/SensitiveId.h
@@ -0,0 +1,18 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Class for generating unique id's for sensitive volumes (unique across 
+//    all sensitive detectors in the gmx file, so not unique across ATLAS!)
+//    Used in LogvolProcessor for GeoModel identifiers.
+//    Conceptually, the class has a stock of identifiers, and pop() returns the next one, like a stack.
+//    In fact, the identifiers are the sequence 0, 1, ...; suitable for use as an array index.
+//
+class SensitiveId {
+public:
+    SensitiveId() {m_id = 0;}
+    int pop() {return m_id++;}
+private:
+    int m_id;
+};
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/StrictErrorHandler.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/StrictErrorHandler.h
new file mode 100644
index 0000000000000000000000000000000000000000..09dc48d18c59b7578261776e5866f84924e8ff39
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/StrictErrorHandler.h
@@ -0,0 +1,40 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   Simple error handler
+//
+#ifndef GEO_MODEL_XML_STRICT_ERROR_HANDLER_H
+#define GEO_MODEL_XML_STRICT_ERROR_HANDLER_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include <xercesc/dom/DOMErrorHandler.hpp>
+#include <xercesc/util/XMLString.hpp>
+
+class StrictErrorHandler: public xercesc::DOMErrorHandler {
+
+public:
+    StrictErrorHandler();
+    ~StrictErrorHandler();
+    bool getSawErrors() const;
+    //
+    //  Implementation of the DOM ErrorHandler interface
+    //
+    bool handleError(const xercesc::DOMError &domError);
+
+private :
+    //
+    //  fSawErrors
+    //      This is set if we get any errors, and is queryable via a getter
+    //      method. It's used by the main code to suppress output if there are
+    //      errors.
+    //
+    bool    m_SawErrors;
+};
+
+inline bool StrictErrorHandler::getSawErrors() const {
+    return m_SawErrors;
+}
+
+#endif //STRICT_ERROR_HANDLER_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..7167379dd05e3b2f2cd38044090161d57a1574a3
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformProcessor.h
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_TRANSFORM_PROCESSOR_H
+#define GEO_MODEL_XML_TRANSFORM_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+
+//
+//   Processor for transform tags.
+//
+#include "GeoModelXml/ElementProcessor.h"
+class GmxUtil;
+
+class TransformProcessor: public ElementProcessor {
+public:
+    void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
+};
+
+#endif // TRANSFORM_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformrefProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformrefProcessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..3314c90ea9fff64e97be50daa1272a5a729ee735
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/TransformrefProcessor.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef GEO_MODEL_XML_TRANSFORMREF_PROCESSOR_H
+#define GEO_MODEL_XML_TRANSFORMREF_PROCESSOR_H
+#include <xercesc/util/XercesDefs.hpp>
+
+//
+//   Processor for logvolref tags.
+//
+
+#include "GeoModelXml/ElementProcessor.h"
+class GmxUtil;
+
+class TransformrefProcessor: public ElementProcessor {
+public:
+    void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
+};
+
+#endif // TRANSFORMREF_PROCESSOR_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/createdomdocument.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/createdomdocument.h
new file mode 100644
index 0000000000000000000000000000000000000000..bc7772436d8bc2b82967cd4b747fe7fdba93c7fb
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/createdomdocument.h
@@ -0,0 +1,16 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef CREATEDOMDOCUMENT_H
+#define CREATEDOMDOCUMENT_H
+#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/dom/DOM.hpp>
+#include <xercesc/dom/DOMLSParser.hpp>
+#include <iostream>
+
+using namespace std;
+using namespace xercesc;
+
+DOMDocument *createDOMDocument(string xmlFile, DOMLSParser *parser, unsigned int flags = 0);
+
+#endif // CREATEDOMDOCUMENT_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/AddPlane.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/AddPlane.h
new file mode 100644
index 0000000000000000000000000000000000000000..7bac7dfa87f5f188905b3dc88479a14ffe3b2968
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/AddPlane.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef ADDPLANE_H
+#define ADDPLANE_H
+#include <xercesc/util/XercesDefs.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+class DOMElement;
+XERCES_CPP_NAMESPACE_END
+
+class AddPlane {
+public:
+    AddPlane() {};
+    ~AddPlane() {};
+    void process(const xercesc::DOMElement *element, double &zPlane, double &rMinPlane, double &rMaxPlane);
+};
+
+
+#endif //ADDPLANE_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeBox.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeBox.h
new file mode 100644
index 0000000000000000000000000000000000000000..599abebcec3b07fd648e3a84ad280b2cfacc7c01
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeBox.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_BOX_H
+#define GEO_MODEL_XML_MAKE_BOX_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeBox: public Element2GeoItem {
+public:
+    MakeBox();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_BOX_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeCons.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeCons.h
new file mode 100644
index 0000000000000000000000000000000000000000..9283cfc20a0b8ac1d7b1f28e54b71f8cb0fb3329
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeCons.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_CONS_H
+#define GEO_MODEL_XML_MAKE_CONS_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeCons: public Element2GeoItem {
+public:
+    MakeCons();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_CONS_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h
new file mode 100644
index 0000000000000000000000000000000000000000..0eed6fe1193ef4c476cef6c33172c37190cb3ecc
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeGenericTrap.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_GENERICTRAP_H
+#define GEO_MODEL_XML_MAKE_GENERICTRAP_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeGenericTrap: public Element2GeoItem {
+public:
+    MakeGenericTrap();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_GENERICTRAP_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeIntersection.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeIntersection.h
new file mode 100644
index 0000000000000000000000000000000000000000..483a11e51fecc2285f66a949de54b0e743282abd
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeIntersection.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_INTERSECTION_H
+#define GEO_MODEL_XML_MAKE_INTERSECTION_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeIntersection: public Element2GeoItem {
+public:
+    MakeIntersection();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_INTERSECTION_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePara.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePara.h
new file mode 100644
index 0000000000000000000000000000000000000000..b354c986541eff1b35c55c6967c7c313224cd98d
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePara.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_PARA_H
+#define GEO_MODEL_XML_MAKE_PARA_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakePara: public Element2GeoItem {
+public:
+    MakePara();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_PARA_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePcon.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePcon.h
new file mode 100644
index 0000000000000000000000000000000000000000..aab86ab53367d9c6921110411baf9def6a9f9067
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePcon.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_PCON_H
+#define GEO_MODEL_XML_MAKE_PCON_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakePcon: public Element2GeoItem {
+public:
+    MakePcon();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_PCON_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePgon.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePgon.h
new file mode 100644
index 0000000000000000000000000000000000000000..df9fded68e5f2382b1c0f8018adb8eefcd87996d
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakePgon.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_PGON_H
+#define GEO_MODEL_XML_MAKE_PGON_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakePgon: public Element2GeoItem {
+public:
+    MakePgon();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_PGON_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeShaperef.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeShaperef.h
new file mode 100644
index 0000000000000000000000000000000000000000..905e5fe2c131f60890aece05f8f056631d8714be
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeShaperef.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_SHAPEREF_H
+#define GEO_MODEL_XML_MAKE_SHAPEREF_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeShaperef: public Element2GeoItem {
+public:
+//    MakeShaperef() {};
+    const RCBase * process(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_SHAPEREF_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h
new file mode 100644
index 0000000000000000000000000000000000000000..5ec995fb3fbc496de16e1970f01e2b6a14977ae4
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSimplePolygonBrep.h
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+#include <xercesc/util/XercesDefs.hpp>
+//
+//    Handle simplePolygonBrep shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H
+#define GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeSimplePolygonBrep: public Element2GeoItem {
+public:
+    MakeSimplePolygonBrep();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_SIMPLEPOLYGONBREP_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h
new file mode 100644
index 0000000000000000000000000000000000000000..5dcd328651f4438b568e0e67d090ebb9645a92d3
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeSubtraction.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_SUBTRACTION_H
+#define GEO_MODEL_XML_MAKE_SUBTRACTION_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeSubtraction: public Element2GeoItem {
+public:
+    MakeSubtraction();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_SUBTRACTION_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrap.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrap.h
new file mode 100644
index 0000000000000000000000000000000000000000..3e8794c8c2e9a4ea43b5189b6dd931a4d209fb2a
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrap.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_TRAP_H
+#define GEO_MODEL_XML_MAKE_TRAP_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeTrap: public Element2GeoItem {
+public:
+    MakeTrap();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_TRAP_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrd.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrd.h
new file mode 100644
index 0000000000000000000000000000000000000000..85ec542afa17852cf85ff6c18ccc06127950c612
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTrd.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_TRD_H
+#define GEO_MODEL_XML_MAKE_TRD_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeTrd: public Element2GeoItem {
+public:
+    MakeTrd();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_TRD_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTube.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTube.h
new file mode 100644
index 0000000000000000000000000000000000000000..8c6f45debeb43709523b3f688e52a84c549687b1
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTube.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_TUBE_H
+#define GEO_MODEL_XML_MAKE_TUBE_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeTube: public Element2GeoItem {
+public:
+    MakeTube();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_TUBE_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTubs.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTubs.h
new file mode 100644
index 0000000000000000000000000000000000000000..c414908e5ba65f6e63f3e65dc7fb0c693a59d621
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeTubs.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_TUBS_H
+#define GEO_MODEL_XML_MAKE_TUBS_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeTubs: public Element2GeoItem {
+public:
+    MakeTubs();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_TUBS_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeUnion.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeUnion.h
new file mode 100644
index 0000000000000000000000000000000000000000..e1a762fda56697a5488eb60225e8494565761213
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/shape/MakeUnion.h
@@ -0,0 +1,21 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+// Automatically generated from scripts in /home/hessey/prog/gmx2geo/makeshape
+//    Handle tube shape elements.
+//
+#ifndef GEO_MODEL_XML_MAKE_UNION_H
+#define GEO_MODEL_XML_MAKE_UNION_H
+#include <xercesc/util/XercesDefs.hpp>
+
+#include "GeoModelXml/Element2GeoItem.h"
+
+class MakeUnion: public Element2GeoItem {
+public:
+    MakeUnion();
+    const RCBase * make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const;
+};
+
+#endif // GEO_MODEL_XML_MAKE_UNION_H
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/data/geomodel.dtd b/GeoModelTools/GeoModelXML/GeoModelXml/data/geomodel.dtd
new file mode 100644
index 0000000000000000000000000000000000000000..8f7ae0c7fb2967da9051c206de57586d8790f70d
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/data/geomodel.dtd
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!-- Copyright N.P. Hessey, Nikhef, 2013 -->
+
+<!ELEMENT geomodel ((defines|materials|readoutgeometry|positionindex|shapes|logvol|transformation|assembly)+, addbranch)>
+  <!ATTLIST geomodel name    CDATA "Unnamed detector"
+                     version CDATA "0.0"
+                     xmlns   CDATA #FIXED "http://www.nikhef.nl/%7Er29/gmx">
+
+  <!ELEMENT defines (var|vector|matrix)+>
+
+    <!ELEMENT var EMPTY>
+      <!ATTLIST var name  ID    #REQUIRED
+                    value CDATA #REQUIRED>
+
+    <!ELEMENT vector EMPTY>
+      <!ATTLIST vector name  ID    #REQUIRED
+                       value CDATA #REQUIRED>
+
+    <!ELEMENT matrix EMPTY>
+      <!ATTLIST matrix name   ID    #REQUIRED
+                       coldim CDATA #REQUIRED
+                       value  CDATA #REQUIRED>
+
+  <!ELEMENT materials ((element|chemical|material)+)>
+    <!ATTLIST materials densitysf CDATA "1.0">
+
+    <!ELEMENT element EMPTY>
+      <!ATTLIST element name      ID      #REQUIRED
+                        shortname NMTOKEN #REQUIRED
+                        Z         CDATA   #REQUIRED
+                        A         CDATA   #REQUIRED>
+
+    <!ELEMENT chemical (elemcontent)+>
+      <!ATTLIST chemical name ID #REQUIRED>
+      <!ELEMENT elemcontent EMPTY>
+        <!ATTLIST elemcontent ref      IDREF #REQUIRED
+                              quantity CDATA #REQUIRED>
+
+    <!ELEMENT material (elementref|materialref|chemicalref)+>
+      <!ATTLIST material name    ID    #REQUIRED
+                         density CDATA #REQUIRED>
+
+      <!ELEMENT elementref EMPTY>
+        <!ATTLIST elementref ref      IDREF #REQUIRED
+                             fraction CDATA #REQUIRED>
+
+      <!ELEMENT materialref EMPTY>
+        <!ATTLIST materialref ref      IDREF #REQUIRED
+                              fraction CDATA #REQUIRED>
+
+      <!ELEMENT chemicalref EMPTY>
+        <!ATTLIST chemicalref ref      IDREF #REQUIRED
+                              fraction CDATA #REQUIRED>
+
+  <!ELEMENT readoutgeometry (param*, sensorclass+)>
+    <!ELEMENT param EMPTY>
+      <!ATTLIST param name  NMTOKEN #REQUIRED
+                      value CDATA   #REQUIRED>
+    <!ELEMENT sensorclass (param*, sensortype+)>
+    <!ATTLIST sensorclass name ID #REQUIRED>
+      <!ELEMENT sensortype (param*)>
+        <!ATTLIST sensortype name ID #REQUIRED>
+
+  <!ELEMENT positionindex (addindex+)>
+    <!ELEMENT addindex EMPTY>
+        <!ATTLIST addindex name ID #REQUIRED>
+
+  <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union|simplepolygonbrep)+)>
+    <!-- All shapes allowed in GeoModel manual. Same name, parameters, parameter order, but always lower case -->
+
+    <!ELEMENT simplepolygonbrep EMPTY>
+      <!ATTLIST simplepolygonbrep name        ID    #REQUIRED
+                                  xpoints     CDATA #REQUIRED
+                                  ypoints     CDATA #REQUIRED
+                                  zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT box EMPTY>
+      <!ATTLIST box name        ID    #REQUIRED
+                    xhalflength CDATA #REQUIRED
+                    yhalflength CDATA #REQUIRED
+                    zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT cons EMPTY>
+      <!ATTLIST cons name  ID #REQUIRED
+                     rmin1 CDATA #REQUIRED
+                     rmin2 CDATA #REQUIRED
+                     rmax1 CDATA #REQUIRED
+                     rmax2 CDATA #REQUIRED
+                     dz    CDATA #REQUIRED
+                     sphi  CDATA #REQUIRED
+                     dphi  CDATA #REQUIRED>
+
+    <!ELEMENT generictrap EMPTY>
+      <!ATTLIST generictrap name        ID    #REQUIRED
+                            x0          CDATA #REQUIRED
+                            y0          CDATA #REQUIRED
+                            x1          CDATA #REQUIRED
+                            y1          CDATA #REQUIRED
+                            x2          CDATA #REQUIRED
+                            y2          CDATA #REQUIRED
+                            x3          CDATA #REQUIRED
+                            y3          CDATA #REQUIRED
+                            x4          CDATA #REQUIRED
+                            y4          CDATA #REQUIRED
+                            x5          CDATA #REQUIRED
+                            y5          CDATA #REQUIRED
+                            x6          CDATA #REQUIRED
+                            y6          CDATA #REQUIRED
+                            x7          CDATA #REQUIRED
+                            y7          CDATA #REQUIRED
+                            zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT para EMPTY>
+      <!ATTLIST para name        ID    #REQUIRED
+                     xhalflength CDATA #REQUIRED
+                     yhalflength CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     alpha       CDATA #REQUIRED
+                     theta       CDATA #REQUIRED
+                     phi         CDATA #REQUIRED>
+
+    <!ELEMENT pcon (addplane, addplane+)>
+      <!ELEMENT addplane EMPTY>
+        <!ATTLIST addplane zplane    CDATA #REQUIRED
+                           rminplane CDATA #REQUIRED
+                           rmaxplane CDATA #REQUIRED>
+ 
+      <!ATTLIST pcon name ID    #REQUIRED
+                     sphi CDATA #REQUIRED
+                     dphi CDATA #REQUIRED>
+
+    <!ELEMENT pgon (addplane, addplane+)>
+      <!ATTLIST pgon name   ID    #REQUIRED
+                     sphi   CDATA #REQUIRED
+                     dphi   CDATA #REQUIRED
+                     nsides CDATA #REQUIRED>
+
+    <!ELEMENT trap EMPTY>
+      <!ATTLIST trap name        ID    #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     theta       CDATA #REQUIRED
+                     phi         CDATA #REQUIRED
+                     dydzn       CDATA #REQUIRED
+                     dxdyndzn    CDATA #REQUIRED
+                     dxdypdzn    CDATA #REQUIRED
+                     angleydzn   CDATA #REQUIRED
+                     dydzp       CDATA #REQUIRED
+                     dxdyndzp    CDATA #REQUIRED
+                     dxdypdzp    CDATA #REQUIRED
+                     angleydzp   CDATA #REQUIRED>
+
+    <!ELEMENT tube EMPTY>
+      <!ATTLIST tube name        ID    #REQUIRED
+                     rmin        CDATA #REQUIRED
+                     rmax        CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT tubs EMPTY>
+      <!ATTLIST tubs name        ID    #REQUIRED
+                     rmin        CDATA #REQUIRED
+                     rmax        CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     sphi        CDATA #REQUIRED
+                     dphi        CDATA #REQUIRED>
+
+    <!ELEMENT trd EMPTY>
+      <!ATTLIST trd name         ID    #REQUIRED
+                    xhalflength1 CDATA #REQUIRED
+                    xhalflength2 CDATA #REQUIRED
+                    yhalflength1 CDATA #REQUIRED
+                    yhalflength2 CDATA #REQUIRED
+                    zhalflength  CDATA #REQUIRED>
+
+    <!ELEMENT intersection (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST intersection name ID #REQUIRED>
+
+    <!ELEMENT subtraction (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST subtraction name ID #REQUIRED>
+
+    <!ELEMENT union (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST union name ID #REQUIRED>
+
+  <!ELEMENT shaperef EMPTY>
+    <!ATTLIST shaperef ref IDREF #REQUIRED>
+
+  <!ELEMENT transform ((transformation|transformationref), (logvol|logvolref|assembly|assemblyref))>
+    <!ATTLIST transform name      ID    #IMPLIED
+                        alignable CDATA #IMPLIED> <!-- CDATA = alignment level-number -->
+
+    <!ELEMENT transformation (scaling|rotation|translation)+>
+
+      <!ELEMENT scaling EMPTY>
+        <!ATTLIST scaling x CDATA "1.0"
+                          y CDATA "1.0"
+                          z CDATA "1.0">
+
+      <!ELEMENT rotation EMPTY>
+        <!ATTLIST rotation xcos  CDATA "0.0"
+                           ycos  CDATA "0.0"
+                           zcos  CDATA "0.0"
+                           angle CDATA "0.0">
+
+      <!ELEMENT translation EMPTY>
+        <!ATTLIST translation x CDATA "0.0"
+                              y CDATA "0.0"
+                              z CDATA "0.0">
+
+      <!ATTLIST transformation name ID #REQUIRED>
+      <!ATTLIST transformation alignable (true|false) "false"> 
+
+    <!ELEMENT transformationref EMPTY>
+      <!ATTLIST transformationref ref IDREF #REQUIRED>
+
+  <!ELEMENT logvol (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)*>
+    <!-- If sensitive is not given, it is not sensitive. If given, it points to a digitization scheme -->
+    <!ATTLIST logvol name ID #REQUIRED
+                     shape IDREF #REQUIRED
+                     material IDREF #REQUIRED
+                     sensitive IDREF #IMPLIED 
+                     alignable (true|false) "false"
+	             splitLevel CDATA #IMPLIED>
+
+  <!ELEMENT index EMPTY>
+    <!ATTLIST index ref   IDREF #REQUIRED
+                    value CDATA #REQUIRED>
+
+  <!ELEMENT logvolref EMPTY>
+    <!ATTLIST logvolref ref    IDREF         #REQUIRED
+                        zeroid (true|false) "false">
+
+  <!ELEMENT assembly (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)+>
+    <!ATTLIST assembly name      ID           #REQUIRED
+                       alignable (true|false) "false"> 
+
+  <!ELEMENT assemblyref EMPTY>
+    <!ATTLIST assemblyref ref    IDREF        #REQUIRED
+                          zeroid (true|false) "false">
+
+  <!ELEMENT multicopy (transformation, (transform|logvolref|assemblyref))>
+    <!-- Removed logvol and assembly from multicopy content. There is no particular reason 
+         why they shouldn't be allowed there. But in practice one uses refs, and forbidding them simplifies coding 
+         the index stuff. If you need them, put them back. Got rid of transformref; never used. -->
+    <!-- loopvar: Set to a vector variable name or omit; see manual -->
+    <!-- alignable: Value is the alignment level-number -->
+    <!ATTLIST multicopy name      ID    #REQUIRED
+                        n         CDATA #REQUIRED
+                        loopvar   CDATA #IMPLIED
+                        alignable CDATA #IMPLIED>
+    <!-- N.B. no zeroid attribute: the copy-number is always zeroed each time the multicopy is inserted; no choice -->
+
+  <!ELEMENT addbranch (transform|logvol|logvolref|assembly|assemblyref)+>
+
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/oldCMakeLists.txt b/GeoModelTools/GeoModelXML/GeoModelXml/oldCMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c474f1ea857484524cd598bb8b1093a6d077c8ce
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/oldCMakeLists.txt
@@ -0,0 +1,31 @@
+################################################################################
+# Package: GeoModelXml
+################################################################################
+
+# Declare the package name:
+atlas_subdir( GeoModelXml )
+
+# Declare the package's dependencies:
+atlas_depends_on_subdirs( PUBLIC
+                          AtlasPolicy
+                          DetectorDescription/GeoModel/GeoModelKernel
+                          PRIVATE
+                          Control/StoreGate
+                          DetectorDescription/GeoModel/GeoModelInterfaces
+                          GaudiKernel )
+
+# External dependencies:
+find_package( CLHEP )
+find_package( XercesC )
+find_package( ZLIB )
+
+# Component(s) in the package:
+atlas_add_library( GeoModelXml
+                   src/*.cxx
+                   PUBLIC_HEADERS GeoModelXml
+                   INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}
+                   DEFINITIONS ${CLHEP_DEFINITIONS}
+                   LINK_LIBRARIES ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} ${ZLIB_LIBRARIES} GeoModelKernel StoreGateLib SGtests
+                   PRIVATE_LINK_LIBRARIES GaudiKernel )
+
+atlas_install_runtime( data/*.dtd )
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AddPlane.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddPlane.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..77eb535070d9fb9f9adc151ac4c6dba28951928a
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddPlane.cxx
@@ -0,0 +1,26 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/shape/AddPlane.h"
+#include <string>
+#include <sstream>
+
+#include <xercesc/dom/DOM.hpp>
+#include "xercesc/util/XMLString.hpp"
+
+using namespace xercesc;
+
+void AddPlane::process(const xercesc::DOMElement *element, double &zPlane, double &rMinPlane, double &rMaxPlane) {
+
+  XMLCh * zplane_tmp = XMLString::transcode("zplane");
+  std::istringstream(XMLString::transcode(element->getAttribute(zplane_tmp))) >> zPlane;
+  XMLCh * rminplane_tmp = XMLString::transcode("rminplane");
+  std::istringstream(XMLString::transcode(element->getAttribute(rminplane_tmp))) >> rMinPlane;
+  XMLCh * rmaxplane_tmp = XMLString::transcode("rmaxplane");
+  std::istringstream(XMLString::transcode(element->getAttribute(rmaxplane_tmp))) >> rMaxPlane;
+  XMLString::release(&zplane_tmp);
+  XMLString::release(&rminplane_tmp);
+  XMLString::release(&rmaxplane_tmp);
+    return;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AddbranchProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddbranchProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..8a74efb97e724fbc4aa1bbd153487fb506bfb526
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AddbranchProcessor.cxx
@@ -0,0 +1,32 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   Processor for addbranch elements
+//
+//   Process children and get list of things to be added to the tree.
+//
+#include "GeoModelXml/AddbranchProcessor.h"
+#include <map>
+
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelXml/ProcessorRegistry.h"
+
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace std;
+using namespace xercesc;
+
+void AddbranchProcessor::process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
+            char *name2release = XMLString::transcode(child->getNodeName());
+            string name(name2release);
+            XMLString::release(&name2release);
+            gmxUtil.processorRegistry.find(name)->process(dynamic_cast<const DOMElement *>(child), gmxUtil, toAdd);
+        }
+    }
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..2ee8ec511fe3cb326e65d9a1a7ed1d50a3c30df9
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyProcessor.cxx
@@ -0,0 +1,121 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   Processor for assembly elements
+//
+//   Add name to list.
+//   Create a physvol using special logvol GmxUtil.getAssemblyLV() add it to list.
+//      ...by using material "special::ether" Geo2G4 turns this into a G4Assembly
+//   Process children and get list of things to be added to the physvol.
+//   Add them to the physvol.
+//
+#include "GeoModelXml/AssemblyProcessor.h"
+
+#include <map>
+
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/GeoNameTag.h"
+#include "GeoModelKernel/GeoIdentifierTag.h"
+#include "GeoModelKernel/GeoLogVol.h"
+#include "GeoModelKernel/GeoPhysVol.h"
+#include "GeoModelKernel/GeoFullPhysVol.h"
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelXml/GeoNodeList.h"
+#include "xercesc/util/XMLString.hpp"
+
+// using namespace CLHEP;
+
+using namespace std;
+using namespace xercesc;
+
+void AssemblyProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+GeoLogVol *lv;
+GeoNameTag *physVolName;
+
+    gmxUtil.positionIndex.incrementLevel();
+
+    XMLCh * name_tmp = XMLString::transcode("name");
+    char *name2release = XMLString::transcode(element->getAttribute(name_tmp));
+    string name(name2release);
+    XMLString::release(&name2release);
+    XMLString::release(&name_tmp);
+//
+//    Look for the assembly in the map; if not yet there, add it
+//
+    map<string, AssemblyStore>::iterator entry;
+    if ((entry = m_map.find(name)) == m_map.end()) { // Not in registry; make a new item
+//
+//    Name
+//
+        m_map[name] = AssemblyStore();
+        AssemblyStore *store = &m_map[name];
+        physVolName = new GeoNameTag(name); 
+        store->name = physVolName;
+        store->id = 0;
+    }
+    else { // Already in the registry; use it.
+        physVolName = entry->second.name;
+    }
+    lv = gmxUtil.getAssemblyLV();
+    toAdd.push_back(physVolName);
+    gmxUtil.positionIndex.setCopyNo(m_map[name].id);
+    toAdd.push_back(new GeoIdentifierTag(m_map[name].id++)); 
+//
+//    Process the assembly's children
+//
+    GeoNodeList childrenAdd;
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
+            DOMElement *el = dynamic_cast<DOMElement *> (child);
+            name2release = XMLString::transcode(el->getNodeName());
+            string name(name2release);
+            XMLString::release(&name2release);
+            gmxUtil.processorRegistry.find(name)->process(el, gmxUtil, childrenAdd);
+        }
+    }
+//
+//    Make a new PhysVol and add everything to it, then add it to the list of things for my caller to add
+//
+    XMLCh * alignable_tmp = XMLString::transcode("alignable");
+    char *toRelease = XMLString::transcode(element->getAttribute(alignable_tmp));
+    string alignable(toRelease);
+    XMLString::release(&toRelease);
+    XMLString::release(&alignable_tmp);
+    if (alignable.compare(string("true")) == 0) {
+        GeoFullPhysVol *pv = new GeoFullPhysVol(lv);
+        for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) {
+            pv->add(*node);
+        }
+        toAdd.push_back(pv); // NB: the *PV is third item added, so reference as toAdd[2].
+    }
+    else {
+        GeoPhysVol *pv = new GeoPhysVol(lv);
+        for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) {
+            pv->add(*node);
+        }
+        toAdd.push_back(pv);
+    }
+
+    gmxUtil.positionIndex.decrementLevel();
+
+    return;
+}
+
+void AssemblyProcessor::zeroId(const xercesc::DOMElement *element) {
+
+    XMLCh * name_tmp = XMLString::transcode("name");
+    char *name2release = XMLString::transcode(element->getAttribute(name_tmp));
+    string name(name2release);
+    XMLString::release(&name2release);
+    XMLString::release(&name_tmp);
+//
+//    Look for the assembly in the map; if not yet there, add it
+//
+    map<string, AssemblyStore>::iterator entry;
+    if ((entry = m_map.find(name)) != m_map.end()) {
+        entry->second.id = 0;
+    }
+/* else ... Not an error: it is usually just about to be made with id = 0; no action needed. */
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyrefProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyrefProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..185a6b2e7ad536ff63f4cd0b0f2e694013f726a6
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/AssemblyrefProcessor.cxx
@@ -0,0 +1,56 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Process assemblyref items: basically, just find the referenced assembly and call its processor.
+//
+#include "GeoModelXml/OutputDirector.h"
+#include "GeoModelXml/AssemblyrefProcessor.h"
+#include <string>
+
+#include "xercesc/util/XercesDefs.hpp"
+#include <xercesc/dom/DOM.hpp>
+#include "xercesc/util/XMLString.hpp"
+
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelXml/GeoNodeList.h"
+
+using namespace std;
+using namespace xercesc;
+
+void AssemblyrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+XMLCh *ref = XMLString::transcode("ref");
+const XMLCh *idref;
+DOMDocument *doc = element->getOwnerDocument();
+char *toRelease;
+//
+//    Get the referenced element
+//
+    idref = element->getAttribute(ref);
+    DOMElement *elem = doc->getElementById(idref);
+//
+//    Check it is the right sort
+//
+    toRelease = XMLString::transcode(elem->getNodeName());
+    string nodeName(toRelease);
+    XMLString::release(&toRelease);
+    if (nodeName != string("assembly")) {
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error in xml/gmx file: assemblyref " << XMLString::transcode(idref) << " referenced a " << 
+                              nodeName << " instead of an assembly.\n";
+        exit(999); // Should do better...
+    }
+//
+//    Process it
+//
+    XMLCh * zeroid_tmp = XMLString::transcode("zeroid");
+    const XMLCh *zeroid = element->getAttribute(zeroid_tmp);
+    if (XMLString::equals(zeroid, XMLString::transcode("true"))) {
+        gmxUtil.tagHandler.assembly.zeroId(elem);
+    }
+    gmxUtil.tagHandler.assembly.process(elem, gmxUtil, toAdd);
+    XMLString::release(&ref);
+    XMLString::release(&zeroid_tmp);
+    return;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItem.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItem.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a780a0d743288f0132b5d8e82066f4388aa98018
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItem.cxx
@@ -0,0 +1,56 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#include <string>
+
+#include "GeoModelXml/Element2GeoItem.h"
+#include "GeoModelXml/OutputDirector.h"
+
+#include "xercesc/util/XercesDefs.hpp"
+#include <xercesc/dom/DOM.hpp>
+#include "xercesc/util/XMLString.hpp"
+
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelKernel/RCBase.h"
+
+using namespace std;
+using namespace xercesc;
+
+Element2GeoItem::Element2GeoItem() {}
+
+Element2GeoItem::~Element2GeoItem() {}
+
+const RCBase * Element2GeoItem::process(const xercesc::DOMElement *element, GmxUtil &gmxUtil) {
+
+    char *name2release;
+    XMLCh * name_tmp = XMLString::transcode("name");
+
+    name2release = XMLString::transcode(element->getAttribute(name_tmp));
+    string name(name2release);
+    XMLString::release(&name2release);
+    XMLString::release(&name_tmp);
+
+    const RCBase *item;
+    map<string, const RCBase *>::iterator entry;
+    if (name == "") { // Unnamed item; cannot store in the map; make a new one 
+        item = make(element, gmxUtil);
+    }
+    else if ((entry = m_map.find(name)) == m_map.end()) { // Not in; make a new one
+        item = make(element, gmxUtil);
+        m_map[name] = item; // And put it in the map
+    }
+    else { // Get it from the map
+        item = entry->second; 
+    }
+
+    return item;
+}
+
+const RCBase * Element2GeoItem::make(const xercesc::DOMElement *element, GmxUtil & /* gmxUtil */) const {
+    char *name2release = XMLString::transcode(element->getNodeName());
+    OUTPUT_STREAM;
+    msglog << MSG::FATAL << "Oh oh: called base class make() method of Element2GeoType object; tag " << name2release << endmsg;
+    XMLString::release(&name2release);
+
+    exit(999); // Should improve on this 
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItemRegistry.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItemRegistry.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ab6dab041e19e8f5a7c3785361ba2078be44309e
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Element2GeoItemRegistry.cxx
@@ -0,0 +1,24 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/Element2GeoItemRegistry.h"
+#include "GeoModelXml/Element2GeoItem.h"
+
+Element2GeoItemRegistry::Element2GeoItemRegistry() {
+    m_defaultProcessor = new Element2GeoItem; 
+}
+
+Element2GeoItemRegistry::~Element2GeoItemRegistry() {
+    delete m_defaultProcessor; 
+}
+
+void Element2GeoItemRegistry::enregister(const std::string tagName, Element2GeoItem *processor) {
+    m_processor[tagName] = processor;
+}
+
+Element2GeoItem * Element2GeoItemRegistry::find(const std::string name) {
+    std::map<std::string, Element2GeoItem *>::iterator it = m_processor.find(name);
+
+    return it == m_processor.end()? m_defaultProcessor: it->second;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/ElementProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/ElementProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..881d970b72abb843752a59b6d97b91cc6350be01
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/ElementProcessor.cxx
@@ -0,0 +1,41 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   Example element processor. This is useful for debugging etc: it helps 
+//   get all elements processed, just printing out their name. Including 
+//   children of referenced tags. Can be used for example as the default element
+//   processor in the processor registry. 
+//
+//   Parameters: 
+//       The element to be processed;
+//       The GmxUtil for access to the Evaluator etc.
+//       A vector of *GeoGraphNode to add things to that need to be added to the GeoModel tree 
+//
+//
+#include "GeoModelXml/ElementProcessor.h"
+
+#include "GeoModelXml/OutputDirector.h"
+#include <string>
+#include "xercesc/util/XercesDefs.hpp"
+#include <xercesc/dom/DOM.hpp>
+
+
+#include "GeoModelXml/GeoNodeList.h"
+#include "GeoModelXml/ProcessorRegistry.h"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+ElementProcessor::ElementProcessor() {}
+
+void ElementProcessor::process(const DOMElement *element, GmxUtil & /* gmxUtil*/, GeoNodeList & /* toAdd */) {
+
+    char *name2release = XMLString::transcode(element->getNodeName());
+    std::string name(name2release);
+    XMLString::release(&name2release);
+
+    OUTPUT_STREAM;
+    msglog << MSG::FATAL << "Error!!! Default element processor called for tag-name " << name << endmsg;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..4315458a0306ee81b957285078293bfe8ba6c30c
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/Gmx2Geo.cxx
@@ -0,0 +1,346 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/Gmx2Geo.h"
+#include "GeoModelXml/OutputDirector.h"
+
+#include <string>
+#include <iomanip>
+#include <sstream>
+#include <stdlib.h>
+
+#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/dom/DOM.hpp>
+#include <xercesc/dom/DOMLSParser.hpp>
+#include <xercesc/util/PlatformUtils.hpp>
+
+#include "GeoModelKernel/GeoPhysVol.h"
+
+#include "ExpressionEvaluator/Evaluator.h"
+
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GeoNodeList.h"
+#include "GeoModelXml/ElementProcessor.h"
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelXml/GmxInterface.h"
+#include "GeoModelXml/createdomdocument.h"
+
+using namespace std;
+
+Gmx2Geo::Gmx2Geo(const string xmlFile, GeoPhysVol *addHere, GmxInterface &gmxInterface, unsigned int flags) {
+//
+//    Create the xml tree (DOMDocument)
+//
+
+// Logging: ref https://wiki.bnl.gov/dayabay/index.php?title=Logging
+// Turn on logging in job-options with: MessageSvc.setDebug += {"GeoModelXml"}
+    OUTPUT_STREAM;
+
+    DOMLSParser *parser = 0;
+    DOMDocument *doc = createDOMDocument(xmlFile, parser, flags);
+    if (!doc) {// Parsed badly
+        XMLPlatformUtils::Terminate();
+        msglog << MSG::FATAL << "Error in xml file " << xmlFile << ". Exiting athena." << endmsg;
+        exit(0);
+    }
+//
+//    Set up the CLHEP evaluator and the xml-tag processors, and store the GmxInterface:
+//
+    GmxUtil gmxUtil(gmxInterface); 
+//
+//    Process the xml tree, creating all the GeoModel items and adding to the GeoModel tree.
+//
+    const DOMElement *root = doc->getDocumentElement();
+//
+//    info message: name of detector
+//
+    if (flags & 0x1) {
+        msglog << MSG::INFO << "Set up detector geometry from db-string \nwhich adds sub-detector ";
+    }
+    else {
+        msglog << MSG::INFO << "Set up detector geometry from file " << xmlFile << " which adds sub-detector ";
+    }
+    const DOMElement *element = dynamic_cast<const DOMElement*>(root);
+    XMLCh * name_tmp = XMLString::transcode("name");
+    const XMLCh *attribute = element->getAttribute(name_tmp);
+    msglog << XMLString::transcode(attribute) << endmsg;
+//
+//    Add all constant definitions to the evaluator, so they are ready if needed.
+//
+    doDefines(doc, gmxUtil.eval);
+//
+//    Set up all sensitive detector types (readout geometry)
+//
+    doReadoutGeometry(doc, gmxUtil);
+//
+//    Add all index names
+//
+    doPositionIndex(doc, gmxUtil);
+//
+//   The xml file ends with an addbranch element. We start there, process it, 
+//   and it fills in the list of things to be added to the GeoModel graph. 
+//   There is one and only one addbranch element according to the DTD.
+//
+    XMLCh * addbranch_tmp = XMLString::transcode("addbranch"); 
+    xercesc::DOMNodeList *addbranchs = doc->getElementsByTagName(addbranch_tmp);
+    const DOMElement *addbranch = dynamic_cast<const DOMElement *> (addbranchs->item(0)); 
+    GeoNodeList toAdd;
+    gmxUtil.processorRegistry.find("addbranch")->process(addbranch, gmxUtil, toAdd);
+    for (GeoNodeList::iterator node = toAdd.begin(); node != toAdd.end(); ++node) {
+        addHere->add(*node);
+    }
+
+    XMLString::release(&name_tmp);
+    XMLString::release(&addbranch_tmp);
+    XMLPlatformUtils::Terminate();
+}
+
+int Gmx2Geo::doDefines(DOMDocument *doc, Evaluator &eval) {
+//
+//    Add all defines to the CLHEP::Evaluator
+//
+//
+//    It is better to store the evaluated number, not the expression 
+//      1: it avoids the parenthesis problem sum = a + b; 2 * sum != 2(a + b)
+//      2: it finds undefined constants sooner (helps debugging)
+//      3: anyway, everything is a constant so we might as well
+//    ...This means we need everything already defined before it is introduced
+//    ...Which means we must do matrices and vectors (which are only numbers) before vars.
+//    in case the user uses a vector-element when defining a var element
+//
+
+const DOMElement *element;
+//
+//-------------------------------------------------------------------------------------------
+//
+// Turn var printout on and off with message level
+    OUTPUT_STREAM;
+    msglog << MSG::DEBUG << "\n\nGmx2Geo GmxUtil matrix, vector and var values:\n";
+    msglog << MSG::DEBUG <<     "==============================================\n\n";
+
+    XMLCh * defines_tmp = XMLString::transcode("defines");
+    XMLCh * vector_tmp = XMLString::transcode("vector");
+    XMLCh * name_tmp = XMLString::transcode("name");
+    XMLCh * value_tmp = XMLString::transcode("value");
+    XMLCh * var_tmp = XMLString::transcode("var");
+    XMLCh * matrix_tmp = XMLString::transcode("matrix");
+    XMLCh * coldim_tmp = XMLString::transcode("coldim");
+    
+    DOMNodeList *defines = doc->getElementsByTagName(defines_tmp);
+    int nDefines = defines->getLength();
+    for (int i = 0; i < nDefines; ++i) {
+        element = dynamic_cast<DOMElement *>(defines->item(i));
+        DOMNodeList *vars;
+        DOMElement *var;
+        int nVars;
+//
+//   Vectors: a list of variables. Names subscripted by _k; values white-space separated numbers.
+//
+        msglog << "\n\n    Vectors\n    =======\n\n";
+
+        vars = element->getElementsByTagName(vector_tmp);
+        nVars = vars->getLength();
+        for (int j = 0; j < nVars; ++j) {
+            var = dynamic_cast<DOMElement*>(vars->item(j));
+            char *name = XMLString::transcode(var->getAttribute(name_tmp));
+            char *val = XMLString::transcode(var->getAttribute(value_tmp));
+            string fullname(name);
+            fullname += '_';
+            istringstream list(val);
+            double dble;
+            int k = 0;
+            do  {
+                list >> dble;
+                msglog << fullname + to_string(k) << " = " << dble << endl; 
+                eval.setVariable((fullname + to_string(k++)).c_str(), dble);
+            } while(list.good());
+            XMLString::release(&name);
+            XMLString::release(&val);
+        }
+//
+//   Matrices: a matrix of variables. Names subscripted by _j_k; values: white-space separated numbers.
+//
+        msglog << "\n\n    Matrices\n    ========\n\n";
+
+        vars = element->getElementsByTagName(matrix_tmp);
+        nVars = vars->getLength();
+        for (int j = 0; j < nVars; ++j) {
+            var = dynamic_cast<DOMElement*>(vars->item(j));
+            char *name = XMLString::transcode(var->getAttribute(name_tmp));
+            char *val = XMLString::transcode(var->getAttribute(value_tmp));
+            int coldim;
+            istringstream(XMLString::transcode(var->getAttribute(coldim_tmp))) >> coldim;
+            string fullname(name);
+            fullname += '_';
+            istringstream list(val);
+            double dble;
+            int k = 0;
+            do  {
+                for (int col = 0; col < coldim; ++col) {
+                        list >> dble;
+                        msglog << fullname + to_string(k) + '_' + to_string(col) << " = " << dble << endl; 
+                        eval.setVariable((fullname + to_string(k) + '_' + to_string(col)).c_str(), dble);
+                        if (!list.good()) break;
+                }
+                k++;
+            } while(list.good());
+            XMLString::release(&name);
+            XMLString::release(&val);
+        }
+//
+//    Vars: single variable
+//
+        msglog << "\n\n    Single variables\n    ================\n\n";
+
+        vars = element->getElementsByTagName(var_tmp);
+        nVars = vars->getLength();
+        for (int j = 0; j < nVars; ++j) {
+            var = dynamic_cast<DOMElement*>(vars->item(j));
+            char *name = XMLString::transcode(var->getAttribute(name_tmp));
+            char *val = XMLString::transcode(var->getAttribute(value_tmp));
+            double evaluated = eval.evaluate(val);
+            if (eval.status() != Evaluator::OK) {
+                msglog << MSG::FATAL << "GeoModelXml Error processing CLHEP Evaluator expression. Error name " <<
+                eval.error_name() << endl << "Message: ";
+                eval.print_error();
+                msglog << val << endl;
+                msglog << string(eval.error_position(), '-') << '^' << '\n';
+                msglog << "Exiting program." << endmsg;
+                exit(999); // Should do better...
+            }
+            eval.setVariable(name, evaluated);
+            msglog << name << "\t\t" << val << " = " << setprecision(10) << evaluated << endl;
+            XMLString::release(&name);
+            XMLString::release(&val);
+        }
+    }
+
+    XMLString::release(&defines_tmp);
+    XMLString::release(&vector_tmp);
+    XMLString::release(&name_tmp);
+    XMLString::release(&value_tmp);
+    XMLString::release(&var_tmp);
+    XMLString::release(&matrix_tmp);
+    XMLString::release(&coldim_tmp);
+
+    msglog << endmsg;
+    return 1;
+}
+
+int Gmx2Geo::doPositionIndex(xercesc::DOMDocument *doc, GmxUtil &gmxUtil) {
+    XMLCh * positionindex_tmp = XMLString::transcode("positionindex");
+    XMLCh * addindex_tmp = XMLString::transcode("addindex");
+    XMLCh * name_tmp = XMLString::transcode("name");
+
+    DOMNodeList *posIndex = doc->getElementsByTagName(positionindex_tmp);
+    int nPosIndex = posIndex->getLength(); // Probably limited to 0 or 1 by DTD
+    for (int i = 0; i < nPosIndex; ++i) {
+        const DOMElement *element = dynamic_cast<DOMElement *>(posIndex->item(i));
+        DOMNodeList *addindexs = element->getElementsByTagName(addindex_tmp);
+        int nIndexs = addindexs->getLength();
+        for (int j = 0; j < nIndexs; ++j) {
+            DOMElement *addindex = dynamic_cast<DOMElement*>(addindexs->item(j));
+            string name = string(XMLString::transcode(addindex->getAttribute(name_tmp)));
+            gmxUtil.positionIndex.addIndex(name);
+        }
+    }
+    XMLString::release(&positionindex_tmp);
+    XMLString::release(&addindex_tmp);
+    XMLString::release(&name_tmp);
+    return 1;
+}
+
+int Gmx2Geo::doReadoutGeometry(xercesc::DOMDocument *doc, GmxUtil &gmxUtil) {
+//
+//    We keep three parameter lists (each is a map of (parameter name, parameter value)), one at each
+//    level (readoutgeometry, sensorclass, sensortype). Currently just created new, copying previous one into
+//    it. In this way the sensortype parameter list has all parameters in it. Not efficient, but the list is always short?
+//
+char *name2release;
+string tagName;
+//
+//    Loop over all readoutgeometry elements
+//
+
+XMLCh * readoutgeometry_tmp = XMLString::transcode("readoutgeometry");
+XMLCh * name_tmp = XMLString::transcode("name");
+ 
+DOMNodeList *rgs = doc->getElementsByTagName(readoutgeometry_tmp);
+    int nRG = rgs->getLength(); 
+    for (int i = 0; i < nRG; ++i) {
+        map<string, string> rgParams; // New empty list
+        const DOMElement *rg = dynamic_cast<DOMElement *>(rgs->item(i));
+//
+//    Loop over readoutgeometry children
+//
+        for (DOMNode *rgChild = rg->getFirstChild(); rgChild != 0; rgChild = rgChild->getNextSibling()) {
+            if (rgChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data
+            name2release = XMLString::transcode(rgChild->getNodeName());
+            tagName = name2release;
+            XMLString::release(&name2release);
+            if (tagName == "param") {
+                addParam(rgChild, rgParams);
+            }
+            else if (tagName == "sensorclass") {
+                map<string, string> scParams(rgParams); // Initialised with all previous params
+                const DOMElement *sensorClass = dynamic_cast<DOMElement *>(rgChild);
+                name2release = XMLString::transcode(sensorClass->getAttribute(name_tmp));
+                string clas(name2release); // class is reserved word
+                XMLString::release(&name2release);
+//
+//    Loop over sensorclass children
+//
+                for (DOMNode *scChild = sensorClass->getFirstChild(); scChild != 0; scChild = scChild->getNextSibling()) {
+                    if (scChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data
+                    name2release = XMLString::transcode(scChild->getNodeName());
+                    tagName = name2release;
+                    XMLString::release(&name2release);
+                    if (tagName == "param") {
+                        addParam(scChild, scParams);
+                    }
+                    else if (tagName == "sensortype") {
+                        map<string, string> stParams(scParams); // Initialised with all previous params
+                        const DOMElement *sensorType = dynamic_cast<DOMElement *>(scChild);
+                        name2release = XMLString::transcode(sensorType->getAttribute(XMLString::transcode("name")));
+                        string name(name2release);
+                        XMLString::release(&name2release);
+//
+//    Loop over sensortype parameters
+//
+                        for (DOMNode *stChild = scChild->getFirstChild(); stChild != 0; stChild = stChild->getNextSibling()) {
+                            if (stChild->getNodeType() != DOMNode::ELEMENT_NODE) continue; // Skip char data
+                            addParam(stChild, stParams);
+                        }
+//
+//    Call the user's call back routine to add this sensor type with its specific parameters
+//
+                        gmxUtil.gmxInterface()->addSensorType(clas, name, stParams);
+                    }
+                }
+            }
+        }
+    }
+    
+    XMLString::release(&readoutgeometry_tmp);
+    XMLString::release(&name_tmp);
+
+    return 1;
+}
+
+void Gmx2Geo::addParam(DOMNode *node, map<string, string> &params) {
+  XMLCh * name_tmp = XMLString::transcode("name");
+  XMLCh * value_tmp = XMLString::transcode("value_tmp");
+
+    const DOMElement *param = dynamic_cast<DOMElement *>(node);
+    char *name2release = XMLString::transcode(param->getAttribute(XMLString::transcode("name")));
+    string name(name2release);
+    XMLString::release(&name2release);
+    name2release = XMLString::transcode(param->getAttribute(XMLString::transcode("value")));
+    string value(name2release);
+    XMLString::release(&name2release);
+    params[name] = value;
+
+    XMLString::release(&name_tmp);
+    XMLString::release(&value_tmp);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxInterface.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxInterface.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..bd3d222c99946cdea2b9b5712ad824fd3f26e7b1
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxInterface.cxx
@@ -0,0 +1,87 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Implement default GmxInterface, which just prints debug messages.
+//    User should over-ride all three methods.
+//    Use: create an instance of this, and pass a reference to it in the Gmx2Geo constructor.
+//
+#include "GeoModelXml/GmxInterface.h"
+#include "GeoModelXml/OutputDirector.h"
+#include "GeoModelKernel/GeoPVConstLink.h"
+#include "GeoModelKernel/Query.h"
+#include "GeoModelKernel/GeoPhysVol.h"
+#include "GeoModelKernel/GeoVFullPhysVol.h"
+using namespace std;
+
+int GmxInterface::sensorId(map<string, int> &/*index*/) const {
+    static int sequentialId;
+    return sequentialId++;
+}
+
+int GmxInterface::splitSensorId(map<string, int> &/*index*/, std::pair<std::string, int> &/*extraIndex*/, map<string, int> &/*updatedIndex*/) const {
+    static int sequentialId;
+    return sequentialId++;
+}
+
+void GmxInterface::addSensorType(string clas, string type, map<string, string> params) {
+    OUTPUT_STREAM;
+
+    msglog << MSG::DEBUG << "GmxInterface::addSensorType called for class " << clas << "; type " << type << 
+                         "\n    Parameter names and values:\n";
+    for (map<string, string>::iterator p = params.begin(); p != params.end(); ++p) {
+        msglog << "        " << p->first << " = " << p->second << endmsg;
+    }
+}
+
+void GmxInterface::addSensor(string name, map<string, int> &index, int sequentialId, GeoVFullPhysVol *fpv) {
+    OUTPUT_STREAM;
+
+    msglog << MSG::DEBUG << "GmxInterface::addSensor called for " << fpv->getLogVol()->getName() << ", type " << name << 
+                         ". Indices:   ";		
+    for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) {
+        msglog << i->second << "   ";
+    }
+    msglog << "\nSequential ID = " << sequentialId << endmsg;
+}
+
+void GmxInterface::addSplitSensor(string name, map<string, int> &index, std::pair<std::string, int> &extraIndex, int sequentialId, GeoVFullPhysVol *fpv) {
+    OUTPUT_STREAM;
+
+    msglog << MSG::DEBUG << "GmxInterface::addSensor called for " << fpv->getLogVol()->getName() << ", type " << name << 
+                         ". Indices:   ";		
+    for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) {
+        msglog << i->second << "   ";
+    }
+    msglog << "\n and additional Indices " << extraIndex.first << " : "<<
+      extraIndex.second;
+    msglog << "\nSequential ID = " << sequentialId << endmsg;
+}
+
+void GmxInterface::addAlignable(int level, map<std::string, int> &index, GeoVFullPhysVol *fpv, 
+                                GeoAlignableTransform */*transform*/) {
+//
+//    Logvol name is not very useful (usually == AssemblyLV). Get PhysVol name (seems surprisingly awkward way needed)
+//
+    OUTPUT_STREAM;
+/* Cannot get this to work.
+    string name("New name");
+    GeoPVConstLink parent = fpv->getParent();
+    Query<unsigned int> cIndex = parent->indexOf(fpv);
+    if (cIndex.isValid()) {
+        name = parent->getNameOfChildVol(cIndex);
+    }
+    else {
+        name = string("Something Wrong, fullPV not found in parent in GmxInterface::addAlignable");
+    }
+    msglog << MSG::DEBUG << "GmxInterface::addAlignable called for physvol name " << name << ".  Level = " << level << ". Indices:   ";
+*/
+
+    msglog << MSG::DEBUG << "GmxInterface::addAlignable called for a physvol. Logvol name " << fpv->getLogVol()->getName() << 
+            ". Level = " << level << ". Indices:   ";
+    for (map<string, int>::iterator i = index.begin(); i != index.end(); ++i) {
+        msglog << i->second << "   ";
+    }
+    msglog << endmsg;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ca4fc7166f9a8357ebc0c17968bf83043659cbcc
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/GmxUtil.cxx
@@ -0,0 +1,196 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/GmxUtil.h"
+
+#include "GeoModelXml/OutputDirector.h"
+
+#ifndef STANDALONE_GMX
+#include "StoreGate/StoreGateSvc.h"
+#include "GeoModelInterfaces/StoredMaterialManager.h"
+#endif
+
+#include "GeoModelKernel/GeoElement.h"
+#include "GeoModelKernel/GeoMaterial.h"
+#include "GeoModelKernel/GeoBox.h"
+#include "GeoModelKernel/GeoLogVol.h"
+#include "GeoModelXml/GmxInterface.h"
+
+#include <cstdlib>
+#include <sstream>
+#include <cctype>
+#include <limits>
+
+using namespace std;
+
+GmxUtil::GmxUtil(GmxInterface &gmxInterface) {
+    m_gmxInterface = &gmxInterface;
+//
+//    Initialise the CLHEP::Evaluator
+//
+    eval.setStdMath();
+//
+//    Fetch the material special::HyperUranium and make any shape with it to make a special logvol.
+//    When Geo2G4 finds any physvol using a logvol with material special::HyperUranium, it creates a G4Assembly
+//    instead of a G4Volume.
+//
+    m_assemblyLV = makeAssemblyLV();
+//
+//   Register tag handlers that produce a vector of items to add to the tree.
+//
+    processorRegistry.enregister("addbranch", &tagHandler.addbranch);
+    processorRegistry.enregister("logvol", &tagHandler.logvol);
+    processorRegistry.enregister("logvolref", &tagHandler.logvolref);
+    processorRegistry.enregister("assembly", &tagHandler.assembly);
+    processorRegistry.enregister("assemblyref", &tagHandler.assemblyref);
+    processorRegistry.enregister("transform", &tagHandler.transform);
+    processorRegistry.enregister("multicopy", &tagHandler.multicopy);
+    processorRegistry.enregister("index", &tagHandler.index);
+//
+//   Register tag handlers that produce GeoNodes. Only useful for those tags which
+//   can appear in a long list in any order. So certainly all shapes; maybe others.
+//
+    geoItemRegistry.enregister("simplepolygonbrep", (Element2GeoItem *) &tagHandler.simplepolygonbrep);
+    geoItemRegistry.enregister("box", (Element2GeoItem *) &tagHandler.box);
+    geoItemRegistry.enregister("cons", (Element2GeoItem *) &tagHandler.cons);
+    geoItemRegistry.enregister("generictrap", (Element2GeoItem *) &tagHandler.generictrap);
+    geoItemRegistry.enregister("para", (Element2GeoItem *) &tagHandler.para);
+    geoItemRegistry.enregister("pcon", (Element2GeoItem *) &tagHandler.pcon);
+    geoItemRegistry.enregister("pgon", (Element2GeoItem *) &tagHandler.pgon);
+    geoItemRegistry.enregister("trap", (Element2GeoItem *) &tagHandler.trap);
+    geoItemRegistry.enregister("trd", (Element2GeoItem *) &tagHandler.trd);
+    geoItemRegistry.enregister("tube", (Element2GeoItem *) &tagHandler.tube);
+    geoItemRegistry.enregister("tubs", (Element2GeoItem *) &tagHandler.tubs);
+    geoItemRegistry.enregister("intersection", (Element2GeoItem *) &tagHandler.intersection);
+    geoItemRegistry.enregister("union", (Element2GeoItem *) &tagHandler.onion); // union is reserved
+    geoItemRegistry.enregister("subtraction", (Element2GeoItem *) &tagHandler.subtraction);
+    geoItemRegistry.enregister("shaperef", (Element2GeoItem *) &tagHandler.shaperef);
+    geoItemRegistry.enregister("transformation", (Element2GeoItem *) &tagHandler.transformation);
+    geoItemRegistry.enregister("transformationref", (Element2GeoItem *) &tagHandler.transformationref);
+}
+
+GmxUtil::~GmxUtil() {
+}
+
+GmxInterface * GmxUtil::gmxInterface() {
+    return m_gmxInterface;
+}
+
+double GmxUtil::evaluate(char const *expression) {
+    static string lastGoodExpression("none"); // It is helpful for debugging to get some idea of where we had got to...
+    string strExpression(expression);
+
+    bool isWhiteSpace = true;
+    for(unsigned int i = 0; i < strExpression.length(); ++i){
+        if(!std::isspace(strExpression[i])) {
+            isWhiteSpace = false;
+            break;
+        }
+    }
+    if (isWhiteSpace) { // Catch a common error early and give best message possible
+#ifndef STANDALONE_GMX
+	OUTPUT_STREAM;
+        msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression: empty expression. Exiting program.\n" << 
+               endmsg;
+#endif
+        throw runtime_error(string("evaluate: empty or white space expression. Last good expression was " + lastGoodExpression));
+
+    }
+//
+//    Process any []s. Contents are evaluated to in integer, then the [...] are replaced by 
+//    string representation of that integer. Idea from Joakim Gradin. Re-coded by Nigel.
+//    Allows array elements to be accessed as array_[col-expression]_[row-expression]. 
+//
+    string noBrackets = debracket(strExpression);
+//
+//   And evaluate the result
+//
+    double result = eval.evaluate(noBrackets.c_str());
+#ifndef STANDALONE_GMX
+    if (eval.status() != HepTool::Evaluator::OK) {
+#else
+    if (eval.status() != Evaluator::OK) {
+#endif
+#ifndef STANDALONE_GMX
+	OUTPUT_STREAM;
+        msglog << MSG::FATAL << "GeoModelXml Error processing Evaluator expression. Error name <" <<
+         eval.error_name() << ">" << endl << "Message: <";
+        eval.print_error();
+        msglog << ">. Original expression <" << expression << ">; Expression after de-bracketing:\n";
+        msglog << noBrackets << endl;
+        msglog << string(eval.error_position(), '-') << '^' << '\n';
+        msglog << "Exiting program.\n" << endmsg;
+#endif
+        throw runtime_error(string("evaluate: invalid expression. Last good expression was <" + lastGoodExpression + ">"));
+    }
+    lastGoodExpression = strExpression;
+    return result;
+}
+
+std::string GmxUtil::debracket(std::string expression) {
+//
+//    Get the last brackets contents and evaluate it
+//
+    size_t lastOpen = expression.find_last_of('[');
+    if (lastOpen == string::npos) { // None found
+        return expression; // Done
+    }
+    size_t nextClose = expression.find_first_of(']', lastOpen);
+    if (nextClose == string::npos) {
+#ifndef STANDALONE_GMX
+	OUTPUT_STREAM;
+        msglog << MSG::ERROR << "debracket: unpaired opening [; expression was:\n    " << expression << endmsg; 
+#endif
+        return expression;
+    }
+    string toEvaluate = expression.substr(lastOpen + 1, nextClose - lastOpen - 1);
+//
+//    Evaluate it
+//
+    stringstream result;
+    result << (int) eval.evaluate(toEvaluate.c_str());
+//
+//    Replace [sub-expr] with result
+//
+    string newExpression = expression.substr(0, lastOpen) + result.str() + 
+                           expression.substr(nextClose + 1, string::npos);
+
+    return debracket(newExpression);
+}
+
+GeoLogVol * GmxUtil::makeAssemblyLV() {
+#ifndef STANDALONE_GMX
+    StoreGateSvc *pDetStore = 0;
+    ISvcLocator *svcLocator = Gaudi::svcLocator();
+
+    OUTPUT_STREAM;
+
+    StatusCode sc = svcLocator->service("DetectorStore", pDetStore);
+    if (sc.isFailure()) {
+            msglog << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Detector Store" << endmsg;
+    }
+    else {
+        DataHandle<StoredMaterialManager> theMaterialManager;
+        sc = pDetStore->retrieve(theMaterialManager, "MATERIALS");
+        if(sc.isFailure()) {
+                msglog << MSG::ERROR << "GmxUtil::makeAssemblyLV: Unable to access Material Manager" << endmsg;
+        }
+        else {
+            const GeoMaterial *assembly_material = theMaterialManager->getMaterial("special::HyperUranium");
+            GeoBox *box = new GeoBox(1., 1., 1.); // Simplest shape; it is irrelevant
+            GeoLogVol *lv = new GeoLogVol(string("AssemblyLV"), box, assembly_material);
+            return lv;
+        }
+    }
+    return 0;
+#else
+    GeoMaterial *assembly_material = new GeoMaterial("special::HyperUranium", 1.e-20);
+    GeoElement *vacuum = new GeoElement("vacuum", "Mt", 1, 1);
+    assembly_material->add(vacuum, 1.0);
+    assembly_material->lock();
+    GeoBox *box = new GeoBox(1., 1., 1.); // Simplest shape; it is irrelevant
+    GeoLogVol *lv = new GeoLogVol(string("AssemblyLV"), box, assembly_material);
+    return lv;
+#endif
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/IndexProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/IndexProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..34f123a92292e2677499327115e8d28a14f88fc3
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/IndexProcessor.cxx
@@ -0,0 +1,40 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   Processor for index elements
+//
+#include <map>
+
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelXml/IndexProcessor.h"
+
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace std;
+using namespace xercesc;
+
+void IndexProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &/* toAdd */) {
+
+    XMLCh * ref_tmp = XMLString::transcode("ref");
+    XMLCh * value_tmp = XMLString::transcode("value");
+
+    char *name2release;
+
+    name2release = XMLString::transcode(element->getAttribute(ref_tmp));
+    string name(name2release);
+    XMLString::release(&name2release);
+
+    name2release = XMLString::transcode(element->getAttribute(value_tmp));
+    string value(name2release);
+    XMLString::release(&name2release);
+
+    gmxUtil.positionIndex.setFormula(name, value);
+
+    XMLString::release(&ref_tmp);
+    XMLString::release(&value_tmp);
+
+    return;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..65a33e8a23f994768536c0f98c03ca5db43a8470
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx
@@ -0,0 +1,222 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   Processor for logvol elements
+//
+//   Add name to list.
+//   Create a physvol using my logvol; add it to list.
+//   Process children and get list of things to be added to the physvol.
+//   Add them to the physvol.
+//
+#include "GeoModelXml/LogvolProcessor.h"
+#include "GeoModelXml/OutputDirector.h"
+
+#include <map>
+
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/GeoNameTag.h"
+#include "GeoModelKernel/GeoIdentifierTag.h"
+#include "GeoModelKernel/GeoLogVol.h"
+#include "GeoModelKernel/GeoPhysVol.h"
+#include "GeoModelKernel/GeoFullPhysVol.h"
+#include "GeoModelKernel/GeoVFullPhysVol.h"
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelXml/GeoNodeList.h"
+#include "xercesc/util/XMLString.hpp"
+
+// using namespace CLHEP;
+
+using namespace std;
+using namespace xercesc;
+
+void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+GeoLogVol *lv;
+GeoNameTag *physVolName;
+
+    OUTPUT_STREAM;
+
+    gmxUtil.positionIndex.incrementLevel();
+
+    XMLCh * name_tmp = XMLString::transcode("name");
+    char *name2release = XMLString::transcode(element->getAttribute(name_tmp));
+    string name(name2release);
+    XMLString::release(&name2release);
+    XMLString::release(&name_tmp);
+//
+//    Look for the logvol in the map; if not yet there, add it
+//
+    map<string, LogVolStore>::iterator entry;
+    if ((entry = m_map.find(name)) == m_map.end()) { // Not in registry; make a new item
+//
+//    Name
+//
+        m_map[name] = LogVolStore();
+        LogVolStore *store = &m_map[name];
+        physVolName = new GeoNameTag(name); 
+        store->name = physVolName;
+        store->id = 0;
+//
+//    Get the shape.
+//
+        DOMDocument *doc = element->getOwnerDocument();
+	XMLCh * shape_tmp = XMLString::transcode("shape");
+        const XMLCh *shape = element->getAttribute(shape_tmp);
+        DOMElement *refShape = doc->getElementById(shape);
+        // Check it is a shape... its parent should be a <shapes>. DTD cannot do this for us.
+        DOMNode *parent = refShape->getParentNode();
+        if (XMLString::compareIString(parent->getNodeName(), XMLString::transcode("shapes")) != 0) {
+
+            msglog << MSG::FATAL << "Processing logvol " << name << 
+                    ". Error in gmx file. An IDREF for a logvol shape did not refer to a shape.\n" <<
+                    "Shape ref was " << shape << "; exiting" << endmsg;
+            exit (1); // Need to improve...
+        }
+//
+//    What sort of shape?
+//
+        name2release = XMLString::transcode(refShape->getNodeName());
+        string shapeType(name2release);
+        XMLString::release(&name2release);
+	XMLString::release(&shape_tmp);
+
+        GeoShape *s = (GeoShape *) gmxUtil.geoItemRegistry.find(shapeType)->process(refShape, gmxUtil);
+//
+//    Get the material
+//
+	XMLCh * material_tmp = XMLString::transcode("material");
+        const XMLCh *material = element->getAttribute(material_tmp);
+        DOMElement *refMaterial = doc->getElementById(material);
+        // Check it is a material... its parent should be a <materials>. DTD cannot do this for us.
+        parent = refMaterial->getParentNode();
+	XMLCh * materials_tmp = XMLString::transcode("materials");
+        if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) {
+            msglog << MSG::FATAL << "Processing logvol " << name << 
+                    ". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" <<
+                    "Material ref was " << material << "; exiting" << endmsg;
+            exit (1); // Need to improve...
+        }
+
+        GeoMaterial *m = (GeoMaterial *) gmxUtil.tagHandler.material.process(refMaterial, gmxUtil);
+
+//
+//    Make the LogVol and add it to the map ready for next time
+//
+        lv = new GeoLogVol(name, s, m);
+        store->logVol = lv;
+
+	XMLString::release(&material_tmp);
+	XMLString::release(&materials_tmp);
+    }
+    else { // Already in the registry; use it.
+        physVolName = entry->second.name;
+        lv = entry->second.logVol;
+    }
+ 
+
+//
+//    Process the logvol children (side effect: sets formulae for indexes before calculating them)
+//
+    GeoNodeList childrenAdd;
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
+            DOMElement *el = dynamic_cast<DOMElement *> (child);
+            name2release = XMLString::transcode(el->getNodeName());
+            string name(name2release);
+            XMLString::release(&name2release);
+            gmxUtil.processorRegistry.find(name)->process(el, gmxUtil, childrenAdd);
+        }
+    }
+//
+//   Make a list of things to be added
+//
+    toAdd.push_back(physVolName);
+    XMLCh * sensitive_tmp = XMLString::transcode("sensitive"); 
+    bool sensitive = element->hasAttribute(sensitive_tmp);
+    int sensId = 0;
+    //std::vector<int> extraSensIds;//extra Identfiers to be used in case we split this volume into multiple DetectorElements
+    map<string, int> index;
+    //map<string, int> updatedIndex;//extra indices to be used in case we split this volume
+    if (sensitive) {
+      gmxUtil.positionIndex.setCopyNo(m_map[name].id++);
+      gmxUtil.positionIndex.indices(index, gmxUtil.eval);
+      sensId = gmxUtil.gmxInterface()->sensorId(index);
+      //        toAdd.push_back(new GeoIdentifierTag(m_map[name].id)); // Normal copy number
+      toAdd.push_back(new GeoIdentifierTag(sensId)); 
+    }
+    else {
+      toAdd.push_back(new GeoIdentifierTag(m_map[name].id)); // Normal copy number
+      gmxUtil.positionIndex.setCopyNo(m_map[name].id++);
+    } 
+    XMLString::release(&sensitive_tmp);
+    //
+    //    Make a new PhysVol and add everything to it, then add it to the list of things for my caller to add
+    //
+    XMLCh * alignable_tmp = XMLString::transcode("alignable");
+    char *toRelease = XMLString::transcode(element->getAttribute(alignable_tmp));
+    string alignable(toRelease);
+    XMLString::release(&toRelease);
+    XMLString::release(&alignable_tmp);
+    if (sensitive || (alignable.compare(string("true")) == 0)) {
+      GeoFullPhysVol *pv = new GeoFullPhysVol(lv);
+      for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) {
+	pv->add(*node);
+      }
+      toAdd.push_back(pv); // NB: the *PV is third item added, so reference as toAdd[2].
+      //
+      //    Add sensitive volumes to detector manager via GmxInterface
+      //
+      if (sensitive) {
+	XMLCh * sensitive_tmp = XMLString::transcode("sensitive");
+	name2release = XMLString::transcode(element->getAttribute(sensitive_tmp));
+	string sensitiveName(name2release);
+	XMLString::release(&name2release);
+	XMLString::release(&sensitive_tmp);
+	//splitting sensors where we would like multiple DetectorElements per GeoVFullPhysVol (e.g.ITk Strips)
+	XMLCh * splitLevel_tmp = XMLString::transcode("splitLevel");
+	bool split = element->hasAttribute(splitLevel_tmp);
+	char* splitString;
+	int splitLevel = 1;
+	if (split) {
+	  splitString = XMLString::transcode(element->getAttribute(splitLevel_tmp));
+	  splitLevel = gmxUtil.evaluate(splitString);
+	  XMLString::release(&splitString);
+	  XMLString::release(&splitLevel_tmp);
+	  for(int i=0;i<splitLevel;i++){
+	    std::string field = "eta_module";//eventually specify in Xml the field to split in?
+	    std::pair<std::string,int> extraIndex(field,i);
+	    gmxUtil.gmxInterface()->addSplitSensor(sensitiveName, index,extraIndex, sensId, dynamic_cast<GeoVFullPhysVol *> (pv));
+	  }
+	}
+	else gmxUtil.gmxInterface()->addSensor(sensitiveName, index, sensId, dynamic_cast<GeoVFullPhysVol *> (pv));
+      }
+    }
+    else {
+      GeoPhysVol *pv = new GeoPhysVol(lv);
+      for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) {
+	pv->add(*node);
+      }
+      toAdd.push_back(pv);
+    }
+    
+    gmxUtil.positionIndex.decrementLevel();
+    return;
+}
+
+void LogvolProcessor::zeroId(const xercesc::DOMElement *element) {
+  
+  XMLCh * name_tmp = XMLString::transcode("name");
+  char *name2release = XMLString::transcode(element->getAttribute(name_tmp));
+  string name(name2release);
+  XMLString::release(&name2release);
+  XMLString::release(&name_tmp);
+  //
+  //    Look for the logvol in the map; if not yet there, add it
+  //
+  map<string, LogVolStore>::iterator entry;
+  if ((entry = m_map.find(name)) != m_map.end()) {
+    entry->second.id = 0;
+  }
+  /* else: Not an error: it is usually just about to be made with id = 0; no action needed. */
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolrefProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolrefProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7269b7ebc91fe35cc0b0e23a013ce0a871ab7671
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolrefProcessor.cxx
@@ -0,0 +1,57 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Process logvolref items: basically, just find the referenced logvol and call its processor.
+//
+#include "GeoModelXml/LogvolrefProcessor.h"
+#include "GeoModelXml/OutputDirector.h"
+#include <string>
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelXml/GeoNodeList.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace std;
+using namespace xercesc;
+
+void LogvolrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+XMLCh *ref = XMLString::transcode("ref");
+const XMLCh *idref;
+DOMDocument *doc = element->getOwnerDocument();
+char *toRelease;
+//
+//    Get the referenced element
+//
+    idref = element->getAttribute(ref);
+    DOMElement *elem = doc->getElementById(idref);
+//
+//    Check it is the right sort
+//
+    toRelease = XMLString::transcode(elem->getNodeName());
+    string nodeName(toRelease);
+    XMLString::release(&toRelease);
+    if (nodeName != string("logvol")) {
+	OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error in xml/gmx file: logvolref " << XMLString::transcode(idref) << " referenced a " << nodeName << 
+                " instead of a logvol." << endmsg;
+        exit(999); // Should do better...
+    }
+//
+//    Process it
+//
+    XMLCh * zeroid_tmp = XMLString::transcode("zeroid");
+    XMLCh * true_tmp = XMLString::transcode("true");
+    const XMLCh *zeroid = element->getAttribute(zeroid_tmp);
+    if (XMLString::equals(zeroid, true_tmp)) {
+        gmxUtil.tagHandler.logvol.zeroId(elem);
+    }
+
+    gmxUtil.tagHandler.logvol.process(elem, gmxUtil, toAdd);
+    XMLString::release(&ref);
+    XMLString::release(&zeroid_tmp);
+    XMLString::release(&true_tmp);
+
+    return;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeBox.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeBox.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..75a1e43c1c2d1aedf4e8e095bb12ac90dc2fcd5d
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeBox.cxx
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+#include "GeoModelXml/shape/MakeBox.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoBox.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakeBox::MakeBox() {}
+
+const RCBase * MakeBox::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 3; 
+char const *parName[nParams] = {"xhalflength", "yhalflength", "zhalflength"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    return new GeoBox(p[0], p[1], p[2]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeCons.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeCons.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7acac8dc1281530262a83902f003c92a50fe6b21
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeCons.cxx
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+#include "GeoModelXml/shape/MakeCons.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoCons.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakeCons::MakeCons() {}
+
+const RCBase * MakeCons::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 7; 
+char const *parName[nParams] = {"rmin1", "rmin2", "rmax1", "rmax2", "dz", "sphi", "dphi"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    return new GeoCons(p[0], p[1], p[2], p[3], p[4], p[5], p[6]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeElement.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeElement.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..f6b6742c876ae5422a8f42f74702c4d384ff438d
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeElement.cxx
@@ -0,0 +1,56 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/MakeElement.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/Units.h"
+#include "GeoModelKernel/GeoElement.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+using namespace GeoModelKernelUnits;
+
+MakeElement::MakeElement() {}
+
+const RCBase * MakeElement::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+  char *name, *shortname, *z,*a;
+  XMLCh *name_tmp,*shortname_tmp,*z_tmp,*a_tmp;
+  double zVal, aVal;
+//
+//   Get my Z
+//
+  z_tmp = XMLString::transcode("Z");
+  z = XMLString::transcode(element->getAttribute(z_tmp));
+  zVal = gmxUtil.evaluate(z);
+  XMLString::release(&z);
+  XMLString::release(&z_tmp);
+//
+//   Get my A
+//
+  a_tmp = XMLString::transcode("A");
+  a = XMLString::transcode(element->getAttribute(a_tmp));
+  aVal = gmxUtil.evaluate(a);
+  XMLString::release(&a);
+  XMLString::release(&a_tmp);
+  //
+  //    Get my names
+  //
+  name_tmp = XMLString::transcode("name");
+  name = XMLString::transcode(element->getAttribute(name_tmp));
+  shortname_tmp = XMLString::transcode("shortname");
+  shortname = XMLString::transcode(element->getAttribute(shortname_tmp));
+  //
+  //    Create it
+  //
+  aVal *= gram/mole;
+  GeoElement *el = new GeoElement(name, shortname, zVal, aVal);
+  XMLString::release(&name);
+  XMLString::release(&shortname);
+  XMLString::release(&name_tmp);
+  XMLString::release(&shortname_tmp);
+  
+  return (const RCBase *) el;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeGenericTrap.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeGenericTrap.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..df1a86fc8aa2e39b0cf75ca6ca88fa710cc36e2e
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeGenericTrap.cxx
@@ -0,0 +1,48 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// *NOT*!!! Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+// GenericTraps would have 17 params, so Vakho built up a vector instead.
+// So skeleton was automatically generated, then edited by hand.
+//
+#include "GeoModelXml/shape/MakeGenericTrap.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoGenericTrap.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+
+using namespace xercesc;
+
+MakeGenericTrap::MakeGenericTrap() {}
+
+const RCBase * MakeGenericTrap::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 17; 
+char const *parName[nParams] = {"x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", 
+                                "x4", "y4", "x5", "y5", "x6", "y6", "x7", "y7", "zhalflength"};
+double p;
+char *toRelease;
+std::vector<GeoTwoVector> vertices;
+double x;
+double y;
+
+    for (int i = 0; i < (nParams - 1) / 2; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2 * i])));
+        x = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2 * i + 1])));
+        y = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+        vertices.push_back(GeoTwoVector(x, y));
+    }
+//
+//    z-half-length
+//
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[16])));
+    p = gmxUtil.evaluate(toRelease);
+    XMLString::release(&toRelease);
+
+    return new GeoGenericTrap(p, vertices);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeIntersection.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeIntersection.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..49ab5599f6debe99b2d8b46e698ab6bea9cb2a3c
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeIntersection.cxx
@@ -0,0 +1,64 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+// Then heavily modified
+#include "GeoModelXml/shape/MakeIntersection.h"
+#include <string>
+#include "GeoModelXml/OutputDirector.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/GeoDefinitions.h"
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoShape.h"
+#include "GeoModelKernel/GeoTransform.h"
+
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+using namespace std;
+
+MakeIntersection::MakeIntersection() {}
+
+const RCBase * MakeIntersection::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+// 
+//    Process child elements; first is first shaperef; then transform; then second shaperef.
+//
+    GeoShape *first = 0;
+    GeoShape *second = 0;
+    GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); 
+    int elementIndex = 0;
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes
+            switch (elementIndex) {
+                case 0: { // First element is first shaperef
+                    first = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil);
+                    break;
+                }
+                case 1: { // Second element is transformation or transformationref
+                    char *toRelease = XMLString::transcode(child->getNodeName());
+                    string nodeName(toRelease);
+                    XMLString::release(&toRelease);
+                    GeoTransform *geoXf = nodeName == "transformation"? 
+(GeoTransform *) gmxUtil.tagHandler.transformation.process(dynamic_cast<DOMElement *>(child), gmxUtil):
+(GeoTransform *) gmxUtil.tagHandler.transformationref.process(dynamic_cast<DOMElement *>(child), gmxUtil);
+                    hepXf = geoXf->getTransform();
+                    break;
+                }
+                case 2: { // Third element is second shaperef
+                    second = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil);
+                    break;
+                }
+                default: // More than 3 elements?
+                    OUTPUT_STREAM;
+                    msglog << MSG::FATAL << "MakeIntersection: Incompatible DTD? got more than 3 child elements\n";
+            }
+            elementIndex++;
+        }
+    }
+
+    const GeoShapeIntersection *temp = &(first->intersect(*(GeoShape *) &(*(second) << hepXf)));
+
+    return (RCBase *) temp;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeMaterial.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeMaterial.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..48235001275144c763ec8b76dfc74c2af68d503e
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeMaterial.cxx
@@ -0,0 +1,202 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/MakeMaterial.h"
+#include "GeoModelXml/OutputDirector.h"
+#include <string>
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoMaterial.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelKernel/Units.h"
+
+using namespace xercesc;
+using namespace std;
+using namespace GeoModelKernelUnits;
+
+MakeMaterial::MakeMaterial() {}
+
+const RCBase * MakeMaterial::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+char *name;
+char *density;
+char *densitySF;
+double rho;
+char *fracString;
+double fraction;
+char *qString;
+XMLCh *ref = XMLString::transcode("ref");
+XMLCh *materials_tmp = XMLString::transcode("materials");
+XMLCh *density_tmp = XMLString::transcode("density");  
+XMLCh *densitysf_tmp = XMLString::transcode("densitysf");
+XMLCh *name_tmp = XMLString::transcode("name");
+XMLCh* elementref_tmp = XMLString::transcode("elementref");
+XMLCh *fraction_tmp = XMLString::transcode("fraction");
+XMLCh *chemicalref_tmp = XMLString::transcode("chemicalref");
+XMLCh *elemcontent_tmp = XMLString::transcode("elemcontent");
+XMLCh *quantity_tmp = XMLString::transcode("quantity");
+XMLCh *materialref_tmp = XMLString::transcode("materialref"); 
+const XMLCh *idref;
+DOMDocument *doc = element->getOwnerDocument();
+char *toRelease;
+
+    OUTPUT_STREAM;
+//
+//    Get material density scale-factor for the block of materials this one is in 
+//
+    DOMNode *parent = element->getParentNode();
+    if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) {
+        msglog << MSG::FATAL << "Asked to make a material for non-material element. Parent element was " << 
+                             XMLString::transcode(parent->getNodeName()) << "; error in gmx file; exiting" << endmsg;
+        exit(1);
+    }
+    double scaleFactor(1.0);
+    DOMElement *el = dynamic_cast<DOMElement *> (parent);
+//    if (el->hasAttribute(XMLString::transcode("densitysf"))) { // Guaranteed by DTD; don't recheck.
+        densitySF = XMLString::transcode(el->getAttribute(densitysf_tmp));
+        scaleFactor = gmxUtil.evaluate(densitySF);
+//    }
+//
+//    Get my name
+//
+    name = XMLString::transcode(element->getAttribute(name_tmp));
+//
+//   Get my density
+//
+    density = XMLString::transcode(element->getAttribute(density_tmp));
+    rho = gmxUtil.evaluate(density) * scaleFactor;
+    XMLString::release(&density);
+//
+//    Create it
+//
+    GeoMaterial *material = new GeoMaterial(name, rho * g/cm3);
+    XMLString::release(&name);
+//
+//   Add my element contents
+//
+    DOMNodeList *elRefs = element->getElementsByTagName(elementref_tmp);
+    int nElRefs = elRefs->getLength();
+    for (int i = 0; i < nElRefs; ++i) {
+        DOMElement *elRef = dynamic_cast<DOMElement *>(elRefs->item(i));
+        idref = elRef->getAttribute(ref);
+        DOMElement *elem = doc->getElementById(idref);
+
+        toRelease = XMLString::transcode(elem->getNodeName());
+        string nodeName(toRelease);
+        XMLString::release(&toRelease);
+        if (nodeName != string("element")) {
+            msglog << MSG::FATAL << "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." 
+                              << endmsg;
+            exit(999); // Should do better...
+        }
+
+        GeoElement *geoElem = (GeoElement *) gmxUtil.tagHandler.element.process(elem, gmxUtil);
+
+        fracString = XMLString::transcode(elRef->getAttribute(fraction_tmp));
+        fraction = gmxUtil.evaluate(fracString);
+        XMLString::release(&fracString);
+        material->add(geoElem, fraction);
+    }
+//
+//   Add my chemical contents
+//
+    DOMNodeList *chemRefs = element->getElementsByTagName(chemicalref_tmp);
+    int nChemRefs = chemRefs->getLength();
+    for (int i = 0; i < nChemRefs; ++i) {
+        DOMElement *chemRef = dynamic_cast<DOMElement *>(chemRefs->item(i));
+        idref = chemRef->getAttribute(ref);
+        DOMElement *chem = doc->getElementById(idref);
+
+        toRelease = XMLString::transcode(chem->getNodeName());
+        string nodeName(toRelease);
+        XMLString::release(&toRelease);
+        if (nodeName != string("chemical")) {
+            msglog << MSG::FATAL << "Error in xml/gmx file: A chemref referenced a " << nodeName << " instead of a chemical." << 
+                                  endmsg;
+            exit(999); // Should do better...
+        }
+
+        fracString = XMLString::transcode(chemRef->getAttribute(fraction_tmp));
+        fraction = gmxUtil.evaluate(fracString);
+        XMLString::release(&fracString);
+
+        // Loop over chemical contents, adding each element to this material
+        DOMNodeList *chemEls = chem->getElementsByTagName(elemcontent_tmp);
+        int nChemEls = chemEls->getLength();
+        vector<GeoElement *> geoElem;
+        vector<double> atomicWeight;
+        double molWeight = 0.0;
+        vector<double> formula;
+        for (int i = 0; i < nChemEls; ++i) {
+            DOMElement *chemEl = dynamic_cast<DOMElement *>(chemEls->item(i));
+            idref = chemEl->getAttribute(ref);
+            DOMElement *elem = doc->getElementById(idref);
+
+            toRelease = XMLString::transcode(elem->getNodeName());
+            string nodeName(toRelease);
+            XMLString::release(&toRelease);
+            if (nodeName != string("element")) {
+                msglog << MSG::FATAL << 
+                       "Error in xml/gmx file: An elementref referenced a " << nodeName << " instead of an element." << endmsg;
+                exit(999); // Should do better...
+            }
+
+            geoElem.push_back((GeoElement *) gmxUtil.tagHandler.element.process(elem, gmxUtil));
+            atomicWeight.push_back(geoElem.back()->getA());
+
+            qString = XMLString::transcode(chemEl->getAttribute(quantity_tmp));
+            formula.push_back(gmxUtil.evaluate(qString));
+            XMLString::release(&qString);
+
+            molWeight += atomicWeight.back() * formula.back();
+        }
+        for (int i = 0; i < nChemEls; ++i) {
+            material->add(geoElem[i], fraction * formula[i] * atomicWeight[i] / molWeight);
+        }
+    }
+
+//
+//   Add my material contents
+//
+    elRefs = element->getElementsByTagName(materialref_tmp);
+    nElRefs = elRefs->getLength();
+    for (int i = 0; i < nElRefs; ++i) {
+        DOMElement *elRef = dynamic_cast<DOMElement *>(elRefs->item(i));
+        idref = elRef->getAttribute(ref);
+        DOMElement *elem = doc->getElementById(idref);
+
+        toRelease = XMLString::transcode(elem->getNodeName());
+        string nodeName(toRelease);
+        XMLString::release(&toRelease);
+        if (nodeName != string("material")) {
+            msglog << MSG::FATAL << 
+                   "Error in xml/gmx file: A materialref referenced a " << nodeName << " instead of a material." << endmsg;
+            exit(999); // Should do better...
+        }
+
+        GeoMaterial *geoMaterial = (GeoMaterial *) gmxUtil.tagHandler.material.process(elem, gmxUtil);
+
+        fracString = XMLString::transcode(elRef->getAttribute(fraction_tmp));
+        fraction = gmxUtil.evaluate(fracString);
+        XMLString::release(&fracString);
+        material->add(geoMaterial, fraction);
+    }
+
+    material->lock(); // Calculate my params and prevent modification
+
+  XMLString::release(&ref);
+  XMLString::release(&materials_tmp);
+  XMLString::release(&density_tmp);  
+  XMLString::release(&densitysf_tmp);
+  XMLString::release(&name_tmp);
+  XMLString::release(&elementref_tmp);
+  XMLString::release(&fraction_tmp);
+  XMLString::release(&chemicalref_tmp);
+  XMLString::release(&elemcontent_tmp);
+  XMLString::release(&quantity_tmp);
+  XMLString::release(&materialref_tmp);
+
+
+    return (const RCBase *) material;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePara.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePara.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..e1aaef2b76e48c82cc6b633b9e9b9dab77eb57c4
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePara.cxx
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+#include "GeoModelXml/shape/MakePara.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoPara.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakePara::MakePara() {}
+
+const RCBase * MakePara::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 6; 
+char const *parName[nParams] = {"xhalflength", "yhalflength", "zhalflength", "alpha", "theta", "phi"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    return new GeoPara(p[0], p[1], p[2], p[3], p[4], p[5]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePcon.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePcon.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..f333f5fddbdad46207339c20b50526d14501e5c0
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePcon.cxx
@@ -0,0 +1,50 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+// But then edited for AddPlane stuff
+#include "GeoModelXml/shape/MakePcon.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoPcon.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakePcon::MakePcon() {}
+
+const RCBase * MakePcon::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 2; 
+char const *parName[nParams] = {"sphi", "dphi"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    GeoPcon *pcon = new GeoPcon(p[0], p[1]);
+//
+//    Add planes
+//
+    double zPlane = 0.;
+    double rMinPlane = 0.;
+    double rMaxPlane = 0.;
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
+            toRelease = XMLString::transcode(child->getNodeName());
+            std::string name(toRelease);
+            XMLString::release(&toRelease);
+            if (name == "addplane") {
+                gmxUtil.tagHandler.addplane.process(dynamic_cast<const DOMElement *>(child), zPlane, rMinPlane, rMaxPlane);
+                pcon->addPlane(zPlane, rMinPlane, rMaxPlane);
+            }
+        }
+    }
+
+    return pcon;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePgon.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePgon.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a57daf51291dc8d8c75c90ec78eb015d5997b4ff
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakePgon.cxx
@@ -0,0 +1,50 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+// But then edited for AddPlane stuff
+#include "GeoModelXml/shape/MakePgon.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoPgon.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakePgon::MakePgon() {}
+
+const RCBase * MakePgon::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 3; 
+char const *parName[nParams] = {"sphi", "dphi", "nsides"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    GeoPgon *pgon = new GeoPgon(p[0], p[1], p[2]);
+//
+//    Add planes
+//
+    double zPlane = 0.;
+    double rMinPlane = 0.;
+    double rMaxPlane = 0.;
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
+            toRelease = XMLString::transcode(child->getNodeName());
+            std::string name(toRelease);
+            XMLString::release(&toRelease);
+            if (name == "addplane") {
+                gmxUtil.tagHandler.addplane.process(dynamic_cast<const DOMElement *>(child), zPlane, rMinPlane, rMaxPlane);
+                pgon->addPlane(zPlane, rMinPlane, rMaxPlane);
+            }
+        }
+    }
+
+    return pgon;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeRotation.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeRotation.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..db97f3f0159be6d74f89d148e3e23be5ec59c265
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeRotation.cxx
@@ -0,0 +1,35 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/MakeRotation.h"
+#include <xercesc/dom/DOM.hpp>
+//  #include <CLHEP/Geometry/Transform3D.h>
+//  #include <CLHEP/Geometry/Vector3D.h>
+#include "GeoModelKernel/GeoDefinitions.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+MakeRotation::MakeRotation() {}
+
+using namespace xercesc;
+//  using namespace HepGeom;
+
+GeoTrf::Rotation3D MakeRotation::getTransform(const DOMElement *rotation, GmxUtil &gmxUtil) {
+
+const int nParams = 4; 
+char const *parName[nParams] = {"angle", "xcos", "ycos", "zcos"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(rotation->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+    GeoTrf::Rotation3D temp;
+    temp = GeoTrf::AngleAxis3D(p[0], GeoTrf::Vector3D(p[1], p[2], p[3]));
+
+    return temp;
+
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeShaperef.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeShaperef.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..fe8a6a1cf8120bbc05252acf96f7d324bde03da6
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeShaperef.cxx
@@ -0,0 +1,51 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Process transformationref items: basically, just find the referenced transform and call its processor.
+//
+#include "GeoModelXml/shape/MakeShaperef.h"
+#include "GeoModelXml/OutputDirector.h"
+#include <string>
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelXml/GmxUtil.h"
+#include "xercesc/util/XMLString.hpp"
+
+using namespace std;
+using namespace xercesc;
+
+const RCBase *MakeShaperef::process(const DOMElement *element, GmxUtil &gmxUtil) const {
+//
+//    Get the referenced shape
+//
+
+    XMLCh * ref_tmp = XMLString::transcode("ref");
+    XMLCh * shapes_tmp = XMLString::transcode("shapes");
+
+    const XMLCh *idref = element->getAttribute(ref_tmp);
+    DOMDocument *doc = element->getOwnerDocument();
+    DOMElement *shape = doc->getElementById(idref);
+//
+//    Check it is the right sort: it's parent should be a shapes
+//
+    DOMNode *parent = shape->getParentNode();
+    if (XMLString::compareIString(parent->getNodeName(), shapes_tmp) != 0) {
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error processing <shaperef> tag: An IDREF for a shape did not refer to a shape.\nShape ref was " << 
+               idref << "; exiting" << endmsg;
+        exit (1); // Need to improve...
+    }
+//
+//    Get what sort of shape
+//
+    char *toRelease = XMLString::transcode(shape->getNodeName());
+    string tag(toRelease);
+    XMLString::release(&toRelease);
+    XMLString::release(&ref_tmp);
+    XMLString::release(&shapes_tmp);
+//
+//    Find and return it
+//
+    return (RCBase *) gmxUtil.geoItemRegistry.find(tag)->process(shape, gmxUtil);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSimplePolygonBrep.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSimplePolygonBrep.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..5eee9181c2b86ab369b8e7c5e69d9679e1f5c3d5
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSimplePolygonBrep.cxx
@@ -0,0 +1,79 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+#include <string>
+#include <vector>
+#include <sstream>
+#include <stdexcept>
+
+#ifndef STANDALONE_GMX
+  #include "GeoModelXml/OutputDirector.h"
+  #include "GaudiKernel/IMessageSvc.h"
+#endif
+
+#include "GeoModelXml/shape/MakeSimplePolygonBrep.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoSimplePolygonBrep.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+using namespace xercesc;
+
+MakeSimplePolygonBrep::MakeSimplePolygonBrep() {}
+
+const RCBase * MakeSimplePolygonBrep::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 3; 
+char const *parName[nParams] = {"xpoints", "ypoints", "zhalflength"};
+double z;
+std::vector <double> x;
+std::vector <double> y;
+
+char *toRelease;
+
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[0])));
+    std::string xPoints(toRelease);
+    XMLString::release(&toRelease);
+
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[1])));
+    std::string yPoints(toRelease);
+    XMLString::release(&toRelease);
+
+    toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[2])));
+    z = gmxUtil.evaluate(toRelease);
+    XMLString::release(&toRelease);
+
+    GeoSimplePolygonBrep * poly = new GeoSimplePolygonBrep(z);
+
+    std::istringstream xSS(xPoints);
+    while (!xSS.eof()) {
+        std::string upToNextComma;
+        getline( xSS, upToNextComma, ';' );
+        x.push_back(gmxUtil.evaluate(upToNextComma.c_str()));
+    }
+
+    std::istringstream ySS(yPoints);
+    while (!ySS.eof()) {
+        std::string upToNextComma;
+        getline( ySS, upToNextComma, ';' );
+        y.push_back(gmxUtil.evaluate(upToNextComma.c_str()));
+    }
+
+    int nx = x.size();
+    int ny = y.size();
+  
+    if (nx < 3 || ny < 3 || nx != ny) {
+#ifndef STANDALONE_GMX
+        OUTPUT_STREAM;
+        msglog << MSG::ERROR << "MakeSimplePolygonBrep: Bad xpoints and/or ypoints\n";
+#endif
+        throw std::runtime_error(std::string("MakeSimplePolygonBrep: Unequal number of x and y points, or less than 3\n\n") +
+         "xpoints was:\n" + xPoints + "\nypoints was:\n" + yPoints + "\n\n");
+    }
+
+    for (int i = 0; i < nx; ++i) {
+        poly->addVertex(x[i], y[i]);
+    }
+
+    return poly;
+
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSubtraction.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSubtraction.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..699af4a9c7cbfb393be3dd61b14d86d934308c83
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeSubtraction.cxx
@@ -0,0 +1,65 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+// Then heavily modified
+#include "GeoModelXml/shape/MakeSubtraction.h"
+#include "GeoModelXml/OutputDirector.h"
+#include <string>
+#include <xercesc/dom/DOM.hpp>
+//   #include <CLHEP/Geometry/Transform3D.h>
+#include "GeoModelKernel/GeoDefinitions.h"
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoShape.h"
+#include "GeoModelKernel/GeoTransform.h"
+
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+using namespace std;
+
+MakeSubtraction::MakeSubtraction() {}
+
+const RCBase * MakeSubtraction::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+// 
+//    Process child elements; first is first shaperef; then transformation; then second shaperef.
+//
+    GeoShape *first = 0;
+    GeoShape *second = 0;
+    GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity();
+    int elementIndex = 0;
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes
+            switch (elementIndex) {
+                case 0: { // First element is first shaperef
+                    first = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil);
+                    break;
+                }
+                case 1: { // Second element is transformation or transformationref
+                    char *toRelease = XMLString::transcode(child->getNodeName());
+                    string nodeName(toRelease);
+                    XMLString::release(&toRelease);
+                    GeoTransform *geoXf = nodeName == "transformation"? 
+(GeoTransform *) gmxUtil.tagHandler.transformation.process(dynamic_cast<DOMElement *>(child), gmxUtil):
+(GeoTransform *) gmxUtil.tagHandler.transformationref.process(dynamic_cast<DOMElement *>(child), gmxUtil);
+                    hepXf = geoXf->getTransform();
+                    break;
+                }
+                case 2: { // Third element is second shaperef
+                    second = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil);
+                    break;
+                }
+                default: // More than 3 elements?
+                    OUTPUT_STREAM;
+                    msglog << MSG::FATAL  << "MakeSubtraction: Incompatible DTD? got more than 3 child elements" << endmsg;
+            }
+            elementIndex++;
+        }
+    }
+
+    const GeoShapeSubtraction *temp = &(first->subtract(*(GeoShape *) &(*(second) << hepXf)));
+
+    return (RCBase *) temp;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformation.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformation.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..603b094b619fc9b5ecd5ed8a984e5426b652981b
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformation.cxx
@@ -0,0 +1,61 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/MakeTransformation.h"
+#include <xercesc/dom/DOM.hpp>
+//   #include <CLHEP/Geometry/Transform3D.h>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoTransform.h"
+#include "GeoModelKernel/GeoAlignableTransform.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+#include "GeoModelKernel/GeoDefinitions.h"
+
+using namespace xercesc;
+using namespace std;
+
+MakeTransformation::MakeTransformation() {}
+
+const RCBase * MakeTransformation::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+char *name2release;
+ GeoTrf::Transform3D hepTransform=GeoTrf::Transform3D::Identity(); // Starts as Identity transform
+//
+//   Add my element contents
+//
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) {
+            name2release = XMLString::transcode(child->getNodeName());
+            string name(name2release);
+            DOMElement *el = dynamic_cast<DOMElement *>(child);
+            if (name == string("translation")) {
+                hepTransform = hepTransform * gmxUtil.tagHandler.translation.getTransform(el, gmxUtil); 
+            }
+            else if (name == "rotation") {
+                hepTransform = hepTransform * gmxUtil.tagHandler.rotation.getTransform(el, gmxUtil); 
+            }
+            else if (name == "scaling") {
+	    
+// TODO: figure out what to do in this case 	    
+//                hepTransform = hepTransform * gmxUtil.tagHandler.scaling.getTransform(el, gmxUtil); 
+            }
+            XMLString::release(&name2release);
+        }
+    }
+//
+//    Create and return GeoModel transform
+//
+
+    XMLCh * alignable_tmp = XMLString::transcode("alignable");
+    char *toRelease = XMLString::transcode(element->getAttribute(alignable_tmp));
+    string alignable(toRelease);
+    XMLString::release(&toRelease);
+    XMLString::release(&alignable_tmp);
+    if (alignable.compare(string("true")) == 0) {
+        return (const RCBase *) new GeoAlignableTransform(hepTransform);
+    }
+    else {
+        return (const RCBase *) new GeoTransform(hepTransform);
+    }
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformationref.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformationref.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d3054df9eff4ea06a52d6b816154dd553c42862d
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTransformationref.cxx
@@ -0,0 +1,47 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Process transformationref items: basically, just find the referenced transform and call its processor.
+//
+#include "GeoModelXml/MakeTransformationref.h"
+#include "GeoModelXml/OutputDirector.h"
+#include <string>
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelXml/GeoNodeList.h"
+#include "xercesc/util/XMLString.hpp"
+
+using namespace std;
+using namespace xercesc;
+
+const RCBase *MakeTransformationref::make(const DOMElement *element, GmxUtil &gmxUtil) const {
+XMLCh *ref = XMLString::transcode("ref");
+const XMLCh *idref;
+DOMDocument *doc = element->getOwnerDocument();
+char *toRelease;
+//
+//    Get the referenced element
+//
+    idref = element->getAttribute(ref);
+    DOMElement *elem = doc->getElementById(idref);
+//
+//    Check it is the right sort
+//
+    toRelease = XMLString::transcode(elem->getNodeName());
+    string nodeName(toRelease);
+    XMLString::release(&toRelease);
+    if (nodeName != string("transformation")) {
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL << "Error in xml/gmx file: transformationref " << XMLString::transcode(idref) << " referenced a " << nodeName << 
+                " instead of a transformation." << endmsg;
+        exit(999); // Should do better...
+    }
+//
+//    Process it
+//
+    XMLString::release(&ref);
+    
+    return gmxUtil.tagHandler.transformation.process(elem, gmxUtil);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTranslation.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTranslation.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7068dd222ffb8f1cfa57fe1c185eb8b26ba16235
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTranslation.cxx
@@ -0,0 +1,32 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/MakeTranslation.h"
+#include <xercesc/dom/DOM.hpp>
+//#include <CLHEP/Geometry/Transform3D.h>
+//#include <CLHEP/Geometry/Vector3D.h>
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+#include "GeoModelKernel/GeoDefinitions.h"
+
+MakeTranslation::MakeTranslation() {}
+
+using namespace xercesc;
+//using namespace HepGeom;
+
+GeoTrf::Translate3D MakeTranslation::getTransform(const DOMElement *translation, GmxUtil &gmxUtil) {
+
+const int nParams = 3; 
+char const *parName[nParams] = {"x", "y", "z"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(translation->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+    return GeoTrf::Translate3D(p[0], p[1], p[2]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrap.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrap.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c7c64b3eb5833b195c5eaf3dc4fd6ff9a9fc2f89
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrap.cxx
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+#include "GeoModelXml/shape/MakeTrap.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoTrap.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakeTrap::MakeTrap() {}
+
+const RCBase * MakeTrap::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 11; 
+char const *parName[nParams] = {"zhalflength", "theta", "phi", "dydzn", "dxdyndzn", "dxdypdzn", "angleydzn", "dydzp", "dxdyndzp", "dxdypdzp", "angleydzp"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    return new GeoTrap(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrd.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrd.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..afe9dd86a33b0f1c5eb78ba8f6cba940bc2d0347
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTrd.cxx
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+#include "GeoModelXml/shape/MakeTrd.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoTrd.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakeTrd::MakeTrd() {}
+
+const RCBase * MakeTrd::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 5; 
+char const *parName[nParams] = {"xhalflength1", "xhalflength2", "yhalflength1", "yhalflength2", "zhalflength"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    return new GeoTrd(p[0], p[1], p[2], p[3], p[4]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTube.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTube.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..b8690d063d92d65a539b3b2d769cf289510f81b8
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTube.cxx
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+#include "GeoModelXml/shape/MakeTube.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoTube.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakeTube::MakeTube() {}
+
+const RCBase * MakeTube::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 3; 
+char const *parName[nParams] = {"rmin", "rmax", "zhalflength"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    return new GeoTube(p[0], p[1], p[2]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTubs.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTubs.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..b0d4d79bfca7188f9ad57e7b06f1e2ee161a434c
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeTubs.cxx
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Automatically generated code from /home/hessey/prog/gmx2geo/makeshape
+#include "GeoModelXml/shape/MakeTubs.h"
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoTubs.h"
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+
+MakeTubs::MakeTubs() {}
+
+const RCBase * MakeTubs::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+const int nParams = 5; 
+char const *parName[nParams] = {"rmin", "rmax", "zhalflength", "sphi", "dphi"};
+double p[nParams];
+char *toRelease;
+
+    for (int i = 0; i < nParams; ++i) {
+        toRelease = XMLString::transcode(element->getAttribute(XMLString::transcode(parName[i])));
+        p[i] = gmxUtil.evaluate(toRelease);
+        XMLString::release(&toRelease);
+    }
+
+    return new GeoTubs(p[0], p[1], p[2], p[3], p[4]);
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeUnion.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeUnion.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d23afc4ffe60ca12ce28bdfec01d5527e397e4a4
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MakeUnion.cxx
@@ -0,0 +1,63 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/shape/MakeUnion.h"
+#include <string>
+#include "GeoModelXml/OutputDirector.h"
+#include <xercesc/dom/DOM.hpp>
+//   #include <CLHEP/Geometry/Transform3D.h>
+#include "GeoModelKernel/RCBase.h"
+#include "GeoModelKernel/GeoShape.h"
+#include "GeoModelKernel/GeoTransform.h"
+#include "GeoModelKernel/GeoDefinitions.h"
+
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GmxUtil.h"
+
+using namespace xercesc;
+using namespace std;
+
+MakeUnion::MakeUnion() {}
+
+const RCBase * MakeUnion::make(const xercesc::DOMElement *element, GmxUtil &gmxUtil) const {
+// 
+//    Process child elements; first is first shaperef; then transform; then second shaperef.
+//
+    GeoShape *first = 0;
+    GeoShape *second = 0;
+    GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity();
+    int elementIndex = 0;
+    for (DOMNode *child = element->getFirstChild(); child != 0; child = child->getNextSibling()) {
+        if (child->getNodeType() == DOMNode::ELEMENT_NODE) { // Skips text nodes
+            switch (elementIndex) {
+                case 0: { // First element is first shaperef
+                    first = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil);
+                    break;
+                }
+                case 1: { // Second element is transformation or transformationref
+                    char *toRelease = XMLString::transcode(child->getNodeName());
+                    string nodeName(toRelease);
+                    XMLString::release(&toRelease);
+                    GeoTransform *geoXf = nodeName == "transformation"? 
+(GeoTransform *) gmxUtil.tagHandler.transformation.process(dynamic_cast<DOMElement *>(child), gmxUtil):
+(GeoTransform *) gmxUtil.tagHandler.transformationref.process(dynamic_cast<DOMElement *>(child), gmxUtil);
+                    hepXf = geoXf->getTransform();
+                    break;
+                }
+                case 2: { // Third element is second shaperef
+                    second = (GeoShape *) gmxUtil.tagHandler.shaperef.process(dynamic_cast<DOMElement *> (child), gmxUtil);
+                    break;
+                }
+                default: // More than 3 elements?
+                    OUTPUT_STREAM;
+                    msglog << MSG::FATAL << "MakeUnion: Incompatible DTD? got more than 3 child elements" << endmsg;
+            }
+            elementIndex++;
+        }
+    }
+
+    const GeoShapeUnion *temp = &(first->add(*(GeoShape *) &(*(second) << hepXf)));
+
+    return (RCBase *) temp;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..abf291e834b3805108694bdde12e2ff169bd7341
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/MulticopyProcessor.cxx
@@ -0,0 +1,257 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   multicopy element processor.
+//
+//   First time round, a loop creates all the Geo-transforms needed and stores them. First and subsequent calls, 
+//   a second loop adds these to the toAdd list, along with copies of the object. The object-handler stores and 
+//   deals with the object. This si needed to make sure sensitive volumes and alignable volumes are always added 
+//   correctly. 
+//
+//   The copy number of the copied object can be zeroed each time the multicopy-element is processed if the 
+//   zeroid attribute is set true. This has to be done here - if the attribute is given on a logvol or assembly ref, 
+//   it would alwasy be zero.
+//
+//   There are two ways of making the n transformations:
+//        loopvar attribute not set:    The transformation is raised to the power i-1
+//        loopvar set to a vector name: In the loop, before each transformation is created, the vector generic name is set
+//                                      equal to the next element of the vector.
+//
+#include "GeoModelXml/MulticopyProcessor.h"
+
+#include "GeoModelXml/OutputDirector.h"
+#include <sstream>
+#include <string>
+#include <cstdlib>
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/GeoTransform.h"
+#include "GeoModelKernel/GeoIdentifierTag.h"
+#include "GeoModelKernel/GeoVFullPhysVol.h"
+#include "GeoModelKernel/GeoNameTag.h"
+#include "GeoModelKernel/GeoDefinitions.h"
+
+#include "xercesc/util/XMLString.hpp"
+#include "GeoModelXml/GeoNodeList.h"
+#include "GeoModelXml/ProcessorRegistry.h"
+#include "GeoModelXml/GmxUtil.h"
+
+
+using namespace xercesc;
+using namespace std;
+
+void MulticopyProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+char *toRelease;
+XMLCh *ref = XMLString::transcode("ref");
+XMLCh * alignable_tmp = XMLString::transcode("alignable");
+const XMLCh *idref;
+DOMDocument *doc = element->getOwnerDocument();
+
+    OUTPUT_STREAM;
+    
+    bool alignable = element->hasAttribute(alignable_tmp);
+//
+//    How many copies?
+//
+    int nCopies;
+    XMLCh * n_tmp = XMLString::transcode("n");
+    toRelease = XMLString::transcode(element->getAttribute(n_tmp));
+    nCopies = gmxUtil.evaluate(toRelease);
+    XMLString::release(&toRelease);
+    XMLString::release(&n_tmp);
+//
+//    See if it is in the map; if so, xfList is already done. If not, fill xfList.
+//
+    XMLCh * name_tmp = XMLString::transcode("name");
+    toRelease = XMLString::transcode(element->getAttribute(name_tmp));
+    string name(toRelease);
+    XMLString::release(&toRelease);
+    XMLString::release(&name_tmp);
+    map<string, GeoNodeList>::iterator entry;
+    GeoNodeList *xfList;
+    if ((entry = m_map.find(name)) == m_map.end()) { // Not in registry; make a new item
+//
+//    Add empty node list to the map
+//
+        m_map[name] = GeoNodeList();
+        xfList = &m_map[name];
+//
+//    Loopvar Variable name
+//
+        string varname, firstElement;
+	XMLCh * loopvar_tmp = XMLString::transcode("loopvar");
+        bool hasVarname = (element->getAttributeNode(loopvar_tmp) != 0);
+        if (hasVarname) {
+            toRelease = XMLString::transcode(element->getAttribute(loopvar_tmp));
+            varname = toRelease;
+            XMLString::release(&toRelease);
+	    XMLString::release(&loopvar_tmp);
+            // Check it is a vector
+            firstElement = varname + "_0";
+            if (!gmxUtil.eval.findVariable(firstElement.c_str())) {
+                msglog << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name << 
+                ". Found loopvar set to " << varname << ", but no vector with that name has been defined." << endmsg;
+                exit(999); // Should do better
+            }
+        }
+//
+//    Get the transformation-element
+//
+        DOMElement *elXf = element->getFirstElementChild();
+        toRelease = XMLString::transcode(elXf->getNodeName());
+        string nodeName(toRelease);
+        XMLString::release(&toRelease);
+        Element2GeoItem *xFormProcessor;
+        if (hasVarname) {
+            if (nodeName == "transformation") { // OK
+                xFormProcessor = (Element2GeoItem *) &(gmxUtil.tagHandler.transformation);
+            }
+            else { // Not OK
+                msglog << MSG::FATAL << "Error in .gmx file. Processing multicopy element with name " << name <<
+                ". \nIt gives loopvar therefore should have a <transformation> and not a <transformationref> (despite the DTD)\n";
+                exit(999); // Should do better
+            }
+        }
+        else {
+            xFormProcessor = nodeName == "transformation"?
+                             (Element2GeoItem *) &(gmxUtil.tagHandler.transformation):
+                             (Element2GeoItem *) &(gmxUtil.tagHandler.transformationref);
+        }
+//
+//    Produce all the transformations
+//
+        GeoAlignableTransform *geoAXf;
+        GeoTransform *geoXf;
+        if (hasVarname) {
+            for (int i = 0; i < nCopies; ++i) {
+                gmxUtil.eval.setVariable(varname.c_str(), (varname + "_" + to_string(i)).c_str());
+                if (alignable) {
+                    geoAXf = (GeoAlignableTransform *) xFormProcessor->make(elXf, gmxUtil);
+                    xfList->push_back((GeoGraphNode *) geoAXf);
+                }
+                else {
+                    geoXf = (GeoTransform *) xFormProcessor->make(elXf, gmxUtil);
+                    xfList->push_back((GeoGraphNode *) geoXf);
+                }
+                gmxUtil.eval.removeVariable(varname.c_str()); // Avoids a warning status in evaluator
+            }
+        }
+        else {
+//
+//    If varname not given, we get the CLHEP xForm and raise it to the power i, so NOT applied to first object.
+//    No transform (i.e. identity) for the first; so one less transform than objects
+//
+	  GeoTrf::Transform3D hepXf0=GeoTrf::Transform3D::Identity();
+            if (alignable) {
+                geoAXf = (GeoAlignableTransform *) xFormProcessor->make(elXf, gmxUtil);
+                hepXf0 = geoAXf->getTransform();
+            }
+            else {
+                geoXf = (GeoTransform *) xFormProcessor->make(elXf, gmxUtil);
+                hepXf0 = geoXf->getTransform();
+            }
+            GeoTrf::Transform3D hepXf=GeoTrf::Transform3D::Identity(); // Identity initially
+            for (int i = 0; i < nCopies; ++i) {
+                xfList->push_back((GeoGraphNode *) new GeoTransform(hepXf));
+                hepXf = hepXf0 * hepXf;
+            }
+        }
+    }
+    else {
+        xfList = &entry->second;
+    }
+//
+//    Get object to be copied
+//
+    DOMElement *object = element->getLastElementChild();
+    toRelease = XMLString::transcode(object->getNodeName());
+    string nodeName(toRelease);
+    XMLString::release(&toRelease);
+    ElementProcessor *objectProcessor = gmxUtil.processorRegistry.find(nodeName);
+//
+//    Zero its copy number. Only needed if an item is used in 2 or more multicopies;
+//    harmless in case of only one use.
+//
+    if (nodeName == "logvolref") {
+        idref = object->getAttribute(ref);
+        DOMElement *elem = doc->getElementById(idref);
+        gmxUtil.tagHandler.logvol.zeroId(elem);
+    }
+    else if (nodeName == "assemblyref") {
+        idref = object->getAttribute(ref);
+        DOMElement *elem = doc->getElementById(idref);
+        gmxUtil.tagHandler.assembly.zeroId(elem);
+    }
+    else if (nodeName == "transform") { // Object is either an assemlyref or logvolref, and there is only one of these
+      XMLCh * logvolref_tmp = XMLString::transcode("logvolref");
+      DOMNodeList *lvList = element->getElementsByTagName(logvolref_tmp);
+      if (lvList->getLength() > 0) {
+	const XMLCh *idref =  dynamic_cast<DOMElement *> (lvList->item(0))->getAttribute(ref);
+	DOMElement *lv = doc->getElementById(idref);
+	gmxUtil.tagHandler.logvol.zeroId(lv);
+	XMLString::release(&logvolref_tmp);
+      }
+      else {
+	XMLCh * assemblyref_tmp = XMLString::transcode("assemblyref") ;
+	DOMNodeList *asList = element->getElementsByTagName(assemblyref_tmp);
+	if (asList->getLength() > 0) {
+	  const XMLCh *idref =  dynamic_cast<DOMElement *> (asList->item(0))->getAttribute(ref);
+	  DOMDocument *doc = element->getOwnerDocument();
+	  DOMElement *as = doc->getElementById(idref);
+	  gmxUtil.tagHandler.assembly.zeroId(as);
+	  XMLString::release(&assemblyref_tmp);
+	}
+	else {
+	  msglog << MSG::FATAL << 
+	    "multicopyprocessor: error in " << name << ". <transform> object was neither assemblyref nor logvolref\n"
+                    << "Exiting Athena" << endmsg;
+	  exit(999); // Should do better
+	}
+      }
+    }
+//
+//    If alignable, add transformation to DetectorManager via GmxInterface.
+//    (NB. Alignable is messy because it involves both a transformation and an object as well as
+//    the multicopy or transform element to tell us when to insert it and what level of alignment 
+//    is wanted; and passing info from one routine to another when you try to keep a uniform interface is 
+//    difficult; and we only have partial GeoModel trees so we cannot use GeoModel tree traversal at this 
+//    moment (comes back to no way of knowing if we have a GeoFullPV or GeoPV)).
+//
+//    Also: no one is using it at the time of writing, so it is ***TOTALLY*** untested.
+//    It is done now to (i) make sure there ought to be a solution (ii) implement (imperfectly) 
+//    a way now while things are fresh in my mind.
+//
+    int level;
+    if (alignable) {
+        istringstream(XMLString::transcode(element->getAttribute(alignable_tmp))) >> level;
+    }
+//
+//    Add transforms and physvols etc. to list to be added
+//
+    map<string, int> index;
+    for (int copy = 0; copy < nCopies; ++copy) {
+        toAdd.push_back((*xfList)[copy]);
+        int lastTransform = toAdd.size() - 1;
+        objectProcessor->process(object, gmxUtil, toAdd);
+        if (alignable) {
+
+            cout << "copy = " << copy << "; level = " << level << endl;
+            cout << "\nAdd Alignable named " << endl;
+            cout << ((GeoNameTag *) (toAdd[lastTransform + 1]))->getName() << endl;
+            cout << " with id " << endl;
+            cout << ((GeoIdentifierTag *) (toAdd[lastTransform + 2]))->getIdentifier() << endl;
+
+            gmxUtil.positionIndex.incrementLevel(); // Logvol has unfortunately already decremented this; temp. restore it
+            gmxUtil.positionIndex.indices(index, gmxUtil.eval);
+            gmxUtil.gmxInterface()->addAlignable(level, index, (GeoVFullPhysVol *) toAdd[lastTransform + 3],
+                                                 (GeoAlignableTransform *) toAdd[lastTransform]);
+            gmxUtil.positionIndex.decrementLevel(); // Put it back where it was
+            index.clear();
+        }
+    }
+
+    XMLString::release(&ref);
+    XMLString::release(&alignable_tmp);
+
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..162528e4d2c97ce5afb3731600c5274e6e6f0086
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/PositionIndex.cxx
@@ -0,0 +1,115 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include <cstdlib>
+#include "GeoModelXml/OutputDirector.h"
+#include <vector>
+#include <string>
+#include "ExpressionEvaluator/Evaluator.h"
+#include "GeoModelXml/PositionIndex.h"
+
+using namespace std;
+
+PositionIndex::PositionIndex() {
+    m_level = -1; // Level -1 represents the "world" with no Copy Number
+}
+
+PositionIndex::~PositionIndex() {}
+
+int PositionIndex::level() {
+    return m_level;
+}
+
+int PositionIndex::incrementLevel()  {
+    ++m_level;
+    if ((int) m_copyNo.size() < m_level + 1)
+        m_copyNo.push_back(0);
+    return m_level;
+}
+
+int PositionIndex::decrementLevel() {
+    return --m_level;
+}
+
+int PositionIndex::copyNo(int level) {
+    if (level >= 0 && level <= m_level) {
+        return m_copyNo[level];
+    }
+    else {
+        return 0;
+    }
+}
+
+int PositionIndex::setCopyNo(int copyNo) {
+    m_copyNo[m_level] = copyNo;
+    return m_copyNo[m_level];
+}
+
+void PositionIndex::addIndex(std::string name) {
+    m_name.push_back(name);
+    m_formula[name] = "0";
+}
+
+string  PositionIndex::name(int whichOne) {
+    if (whichOne >= 0 && whichOne < (int) m_name.size()) {
+        return m_name[whichOne];
+    }
+    else {
+        return string("");
+    }
+}
+
+std::string PositionIndex::formula(std::string name) {
+    return m_formula[name];
+}
+
+void PositionIndex::setFormula(std::string name, std::string formula) {
+    m_formula[name] = formula;
+}
+
+void PositionIndex::indices(map<string, int> &index, Evaluator &eval) {
+    index.clear(); // In case caller uses it many times
+//
+//    Set Copy Number of each Level (CNL_i) up to current level
+//
+    string name("CNL_");
+    for (int i = 0; i <= m_level; ++i) {
+        eval.setVariable((name + to_string(i)).c_str(), m_copyNo[i]);
+    }
+//
+//    Set rest to zero
+//
+    for (int i = m_level + 1; true; ++i) {
+        string varName = name + to_string(i);
+        if (!eval.findVariable(varName.c_str())) break;
+        eval.setVariable(varName.c_str(), "0");
+    }
+//
+//    Evaluate each index in turn
+//
+//
+//   We loop over the vector of names to make sure we evaluate the CNL_n values in the order they
+//   are given in the <positionindex> element. Thus the user can select the order of evaluation, which is 
+//   important when CNL_n are used in the formulae. Looping directly over a map<>::iterator would process them
+//   in alphabetical order.
+//
+    for (vector <string>::iterator n = m_name.begin(); n < m_name.end(); ++n) {
+        string name = *n;
+        index[name] = (int) eval.evaluate(m_formula[name].c_str());
+        if (eval.status() != Evaluator::OK) {
+            OUTPUT_STREAM;
+            msglog << MSG::FATAL <<
+                   "GeoModelXml Error processing Evaluator expression for PositionIndex. Error name " <<
+                    eval.error_name() << endl << "Message: ";
+            eval.print_error();
+            msglog << m_formula[name] << endl << string(eval.error_position(), '-') << '^' << '\n' << "Exiting program." << 
+                   endmsg;
+            exit(999); // Should do better...
+        }
+//
+//    And create a CLHEP variable with the same index-name in case the user needs it 
+//
+        eval.setVariable(name.c_str(), (double) index[name]);
+    }
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/ProcessorRegistry.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/ProcessorRegistry.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..66ec8fb070810b8986e91eb9db2f57848cd479bd
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/ProcessorRegistry.cxx
@@ -0,0 +1,20 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/ProcessorRegistry.h"
+#include "GeoModelXml/ElementProcessor.h"
+
+ProcessorRegistry::ProcessorRegistry() {
+    m_defaultProcessor = new ElementProcessor(); 
+}
+
+void ProcessorRegistry::enregister(const std::string tagName, ElementProcessor *processor) {
+    m_processor[tagName] = processor;
+}
+
+ElementProcessor * ProcessorRegistry::find(const std::string name) {
+    std::map<std::string, ElementProcessor *>::iterator it = m_processor.find(name);
+
+    return it == m_processor.end()? m_defaultProcessor: it->second;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/StrictErrorHandler.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/StrictErrorHandler.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..49be4a154ea2b2b7c6b29a391004401ce33410e4
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/StrictErrorHandler.cxx
@@ -0,0 +1,39 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GeoModelXml/StrictErrorHandler.h"
+#include "xercesc/util/XMLString.hpp"
+#include <xercesc/dom/DOMError.hpp>
+#include <xercesc/dom/DOMLocator.hpp>
+#include "GeoModelXml/OutputDirector.h"
+
+StrictErrorHandler::StrictErrorHandler(): m_SawErrors(false) {}
+StrictErrorHandler::~StrictErrorHandler() {}
+
+using namespace xercesc;
+
+bool StrictErrorHandler::handleError(const xercesc::DOMError &domError) {
+
+    OUTPUT_STREAM;
+    msglog << MSG::ERROR << "StrictErrorHandler: Handle an error\n";
+
+    m_SawErrors = true;
+
+    switch (domError.getSeverity()) {
+    case (xercesc::DOMError::DOM_SEVERITY_WARNING):
+        msglog << "\nWarning at file \n";
+        break;
+    case (xercesc::DOMError::DOM_SEVERITY_ERROR):
+        msglog << "\nError at file \n";
+        break;
+    default:
+        msglog << "\nFatal Error at file \n";
+    }
+    msglog << XMLString::transcode(domError.getLocation()->getURI())
+         << ", line " << domError.getLocation()->getLineNumber()
+         << ", char " << domError.getLocation()->getColumnNumber()
+         << "\n  Message: " << XMLString::transcode(domError.getMessage()) << endmsg;
+
+    return true;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..55774d47102beb639fbc70574f195b30fd202117
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformProcessor.cxx
@@ -0,0 +1,79 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//   Processor for transform elements
+//
+//   Decide if I need alignable transforms from my second child
+//   Add transform from first child to list
+//   Create physvol using my second child; add it to list.
+//
+#include "GeoModelXml/TransformProcessor.h"
+
+#include <string>
+#include <sstream>
+#include <vector>
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelKernel/GeoNameTag.h"
+#include "GeoModelKernel/GeoIdentifierTag.h"
+#include "GeoModelKernel/GeoLogVol.h"
+#include "GeoModelKernel/GeoPhysVol.h"
+#include "GeoModelKernel/GeoVFullPhysVol.h"
+#include "GeoModelKernel/GeoAlignableTransform.h"
+#include "GeoModelXml/GmxUtil.h"
+#include "xercesc/util/XMLString.hpp"
+
+
+//  using namespace CLHEP;
+using namespace std;
+using namespace xercesc;
+
+void TransformProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+char *tagName;
+ XMLCh * alignable_tmp;
+
+ alignable_tmp = XMLString::transcode("alignable");
+ bool alignable = element->hasAttribute(alignable_tmp);
+ //
+ //    Do second element first, to find what sort of transform is needed (shape or logvol etc.?)
+ //
+ GeoNodeList objectsToAdd;
+ DOMElement *object = element->getLastElementChild();
+ tagName = XMLString::transcode(object->getTagName());
+ string objectName(tagName);
+ gmxUtil.processorRegistry.find(objectName)->process(object, gmxUtil, objectsToAdd);
+ XMLString::release(&tagName);
+ XMLString::release(&alignable_tmp);
+ //
+ //    Get the transformation
+ //
+ DOMElement *transformation = element->getFirstElementChild();
+ tagName = XMLString::transcode(transformation->getTagName()); // transformation or transformationref
+ //  ******* Should check here that an alignable transform is given an alignable transformation and object; to be done
+ toAdd.push_back((GeoGraphNode *)gmxUtil.geoItemRegistry.find(string(tagName))->process(transformation, gmxUtil));
+ XMLString::release(&tagName);
+ //
+ //    Add transformation to DetectorManager via GmxInterface, if it is alignable
+//
+    if (alignable) { 
+        int level;
+	alignable_tmp = XMLString::transcode("alignable");
+        istringstream(XMLString::transcode(element->getAttribute(alignable_tmp))) >> level;
+        map<string, int> index;
+        gmxUtil.positionIndex.incrementLevel(); // Logvol has unfortunately already decremented this; temp. restore it
+        gmxUtil.positionIndex.indices(index, gmxUtil.eval);
+// ****** Using "[2]" is an ugly way to reach the PV. Define const int in LogvolProcessor?
+        gmxUtil.gmxInterface()->addAlignable(level, index, (GeoVFullPhysVol *) objectsToAdd[2], 
+                                             (GeoAlignableTransform *) toAdd.back());
+
+        gmxUtil.positionIndex.decrementLevel(); 
+	XMLString::release(&alignable_tmp);
+    }
+//
+//    And add the name and physvol etc. after the transformation
+//
+    toAdd.insert(toAdd.end(), objectsToAdd.begin(), objectsToAdd.end());
+
+    return;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformrefProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformrefProcessor.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a375911755a98f56fd99b7882a66be0828642abe
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/TransformrefProcessor.cxx
@@ -0,0 +1,49 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Process transformref items: basically, just find the referenced transform and call its processor.
+//
+#include "GeoModelXml/TransformrefProcessor.h"
+#include "GeoModelXml/OutputDirector.h"
+#include <string>
+#include <xercesc/dom/DOM.hpp>
+#include "GeoModelXml/GmxUtil.h"
+#include "GeoModelXml/GeoNodeList.h"
+#include "xercesc/util/XMLString.hpp"
+
+using namespace std;
+using namespace xercesc;
+
+void TransformrefProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
+XMLCh *ref = XMLString::transcode("ref");
+const XMLCh *idref;
+DOMDocument *doc = element->getOwnerDocument();
+char *toRelease;
+//
+//    Get the referenced element
+//
+    idref = element->getAttribute(ref);
+    DOMElement *elem = doc->getElementById(idref);
+//
+//    Check it is the right sort
+//
+    toRelease = XMLString::transcode(elem->getNodeName());
+    string nodeName(toRelease);
+    XMLString::release(&toRelease);
+    if (nodeName != "transform") {
+        OUTPUT_STREAM;
+        msglog << MSG::FATAL<< "Error in xml/gmx file: transformref " << XMLString::transcode(idref) << " referenced a " << nodeName << 
+                " instead of a logvol." << endmsg;
+        exit(999); // Should do better...
+    }
+//
+//    Process it
+//
+    gmxUtil.tagHandler.transform.process(elem, gmxUtil, toAdd);
+
+    XMLString::release(&ref);
+
+    return;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/createdomdocument.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/createdomdocument.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..2222a0186da1850f4e637f6fcd5df38a2da84f87
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/createdomdocument.cxx
@@ -0,0 +1,119 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Read in the xml and create an in-memory copy of it.
+//    The first parameter is either the name of a file containing the xml, or a
+//    (possibly very long) string with the xml itself. The flags parameter indicates which.
+//
+//    flags = 0 (default): file-name
+//    flags & 1? xml
+//    flags & 2? compressed xml
+//
+#include "GeoModelXml/createdomdocument.h"
+#include <xercesc/util/PlatformUtils.hpp>
+#include <xercesc/dom/DOMImplementation.hpp>
+#include <xercesc/dom/DOMImplementationLS.hpp>
+#include <xercesc/dom/DOMImplementationRegistry.hpp>
+#include "GeoModelXml/StrictErrorHandler.h"
+#include "xercesc/util/XMLString.hpp"
+#include <iostream>
+#include <stdexcept>
+
+using namespace std;
+using namespace xercesc;
+
+string decompress(const string & compressed);
+
+DOMDocument *createDOMDocument(string xmlFile, DOMLSParser *parser, unsigned int flags) {
+//
+//    Initialise Xerces-C 
+//
+    try {
+        XMLPlatformUtils::Initialize();
+    }
+    catch (const xercesc::XMLException &toCatch) {
+        char *message = XMLString::transcode(toCatch.getMessage());
+        cout << "XercesC error during initialization: " << message << "\n";
+        XMLString::release(&message);
+        return 0;
+    }
+//
+//   Get a DOMLS parser (Document Object Model Load Save)
+//
+    static const XMLCh gLS[] = {chLatin_L, chLatin_S, chNull};
+    DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(gLS);
+    parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
+    DOMConfiguration  *config = parser->getDomConfig();
+
+    config->setParameter(XMLUni::fgDOMNamespaces, true);
+    config->setParameter(XMLUni::fgXercesSchema, true);
+    config->setParameter(XMLUni::fgXercesHandleMultipleImports, true);
+    config->setParameter(XMLUni::fgXercesSchemaFullChecking, true);
+    config->setParameter(XMLUni::fgDOMValidateIfSchema, true);
+    config->setParameter(XMLUni::fgDOMDatatypeNormalization, true);
+// The next is important if you want to insert elements into the tree. Without it, elements loaded 
+// from a file included via an !ENTITY are not writable. False should be the default, but for some reason the
+// following is still needed
+    config->setParameter(xercesc::XMLUni::fgDOMEntities, false);
+
+    // And create our error handler and install it
+    StrictErrorHandler errorHandler;
+    config->setParameter(XMLUni::fgDOMErrorHandler, &errorHandler);
+//
+//    Parse the file
+//
+    XMLCh *xmlCh(0); 
+    xercesc::DOMDocument *doc;
+    try {
+        if (!(flags & 0x1)) { // String is a file name
+            doc = parser->parseURI(xmlFile.c_str());
+        }
+        else {
+            string decompressed;
+            if (flags & 0x2) { // Decompress it
+                decompressed = decompress(xmlFile);
+cout << "Decompressed it\n";
+            }
+            else {
+                decompressed = xmlFile;
+            }
+            xmlCh = XMLString::transcode(decompressed.c_str());
+cout << "Transcoded it\n";
+            DOMLSInput *input = impl->createLSInput();
+            input->setStringData(xmlCh);            
+            doc = parser->parse(input);
+cout << "Parsed it\n";
+        }
+        if (errorHandler.getSawErrors()) {
+            cout << "Oh oh, saw errors. \n";
+if (flags & 0x1) cout << "\n\n\n" << XMLString::transcode(xmlCh) << "\n\n\n";
+            return 0;
+        }
+        else {
+            if (!(flags & 0x1)) {
+                std::cout << "File " << xmlFile << " successfully parsed.\n";
+            }
+            else {
+                std::cout << "Database string successfully parsed.\n";
+            }
+        }
+    }
+    catch (const XMLException &toCatch) {
+        char *message = XMLString::transcode(toCatch.getMessage());
+        cout << "Parse-file xml exception: \n" << message << "\n";
+        XMLString::release(&message);
+        return 0;
+    }
+    catch (const DOMException &toCatch) {
+        char *message = XMLString::transcode(toCatch.msg);
+        cout << "DOM exception: \n" << message << "\n";
+        XMLString::release(&message);
+        return 0;
+    }
+// You cannot delete the parser, even though you never refer to it again. It is needed 
+// to get DOMElement *root etc.
+//    delete parser;
+    return doc;
+}
diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/decompress.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/decompress.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..6566366cb7c54fd98645251aa43b0ed0c1126ba3
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/decompress.cxx
@@ -0,0 +1,60 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//
+//    Decompress a gzipped string to its original form 
+//
+#include <string>
+#include <sstream>
+#include <algorithm>
+#include <stdexcept>
+
+extern "C" {
+    #include <zlib.h>
+}
+
+using namespace std;
+
+string decompress(const string& str) {
+
+    z_stream zs;                        // z_stream is zlib's control structure
+//    std::fill_n(&zs, 1, 0);
+//    memset(&zs, 0, sizeof(zs));
+    zs.zalloc   = NULL;
+    zs.zfree    = NULL;
+    zs.opaque   = NULL;
+    zs.next_in  = (Bytef *)str.c_str();
+    zs.avail_in = str.size();
+
+    // According to the official manual, 2nd param is windowsBits and is max. 15. But a web page somewhere 
+    // said for gzip files, it should be 16 or'd (or added) to the usual windowsBits. By trial and error, the following works:
+    int returnCode = inflateInit2(&zs, 0x1f);
+    if (returnCode != Z_OK)
+        throw runtime_error(string("decompress: inflateInit2 failed, error code means: ") + string(zError(returnCode)));
+
+    char outBuffer[32768];
+    string output;
+    do {
+        zs.next_out = reinterpret_cast<Bytef*>(outBuffer);
+        zs.avail_out = sizeof(outBuffer);
+
+        returnCode = inflate(&zs, 0);
+
+        if (output.size() < zs.total_out) {
+            output.append(outBuffer, zs.total_out - output.size());
+        }
+
+    } while (returnCode == Z_OK);
+
+    inflateEnd(&zs);
+
+    if (returnCode != Z_STREAM_END) { // an error occurred that was not EOF
+        ostringstream oss;
+        oss << "decompress: Exception during zlib decompression (code: " << returnCode << "): "
+            << zs.msg;
+        throw runtime_error(oss.str());
+    }
+
+    return output;
+}
diff --git a/GeoModelTools/GeoModelXML/LICENSE b/GeoModelTools/GeoModelXML/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..c8f313a89ab99d4c3c3bda6be312aa07d2009497
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2019 GeoModelDev
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/GeoModelTools/GeoModelXML/README.md b/GeoModelTools/GeoModelXML/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..4b722b4c368de19cfd5653ae03847499a0a027b3
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/README.md
@@ -0,0 +1,68 @@
+# GeoModelXml
+
+This package contains a modernised version of Nigel Hessey's GeoModelXml to be 
+used with `gmex` (GeoModelExplorer) and the corresponding plugin (GMXPlugin)
+
+Installation requires that the [GeoModel](https://gitlab.cern.ch/GeoModelDev/GeoModel) suite is installed. Please refer to https://gitlab.cern.ch/GeoModelDev/GeoModel/-/blob/master/README.md for additional documentation.
+
+
+## Nigel's documentation
+
+https://twiki.atlas-canada.ca/pub/AtlasCanada/ITk/gmx2geo.pdf
+
+## How to build it
+
+If `GeoModel` is installed:
+
+```bash
+# Clone
+git clone ssh://git@gitlab.cern.ch:7999/atlas/geomodelatlas/GeoModelATLAS.git
+
+# Configure, build, install locally:
+mkdir build_geomodelatlas; cd build_geomodelatlas
+cmake -DCMAKE_INSTALL_PREFIX=../install/ -DGEOMODELATLAS_BUILD_GEOMODELXML=1 ../GeoModelATLAS
+make
+make install
+
+cd ..
+```
+
+### Post-build setup
+
+**NOTE:** This is needed **on macOS only**, and only when using a **local** `install` folder (instead of system folders like `usr/local/`). 
+
+This extra step tells the `GMXPlugin` where it can find the other libraries, when loaded as a plugin at runtime:
+
+```bash
+# EXTRA STEP: Add a rpath, only needed on macOS and when using a local 'install' folder 
+install_name_tool -add_rpath install/lib install/lib/libGMXPlugin.dylib
+```
+
+## How to run it
+
+Running the GMXPlugin executes the xerces parser to parse the xml file. The expression evaluator only works if the system language is set to USEnglish, thus do:
+
+```bash
+export LANG=en_US.UTF-8
+```
+
+From e.g. your home directory
+
+```bash
+cd install
+export GMX_FILES="../GeoModelATLAS/GeoModelXML/data/example1.xml"
+bin/gmex lib/libGMXPlugin.1.0.0.dylib (or .so on Linux)
+```
+
+Once `gmex` is open, click on the **Geo** tab, then check **DisplacedTube** and click on the "Eye" icon.
+
+
+You can also display several `.xml` files at once by exporting a space separated string:
+
+```bash
+cd install
+export GMX_FILES="../GeoModelATLAS/GeoModelXml/data/example1.xml ../GeoModelATLAS/GeoModelXml/data/example2.xml ../GeoModelATLAS/GeoModelXml/data/example3.xml"
+bin/gmex lib/libGMXPlugin.1.0.0.dylib (or .so on Linux)
+```
+
+Then, you see 3 items showing up in the **Geo** tab.
diff --git a/GeoModelTools/GeoModelXML/data/example1.xml b/GeoModelTools/GeoModelXML/data/example1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6047c5f833687f28fda24824c0918723638bcc51
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/data/example1.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [
+
+<!-- include the file where the materials are defined -->
+<!ENTITY materials SYSTEM "materials.gmx" >
+
+]>
+
+<geomodel name="ITk_Example" version="1.0"
+  xmlns="http://www.nikhef.nl/%7Er29/gmx">
+
+  <!-- Definition of materials -->
+  <!-- Load materials -->
+  &materials;
+
+  <!-- Definition of variables -->
+  <defines>
+    <var name="TubeInnerRadius" value="0" />
+    <var name="TubeOuterRadius" value="600." />
+    <var name="TubeHalfLength"  value="1200." />
+  </defines>
+
+  <!-- Definition of shapes -->
+  <shapes>
+    <tube name="Tube"  rmin="TubeInnerRadius"
+                       rmax="TubeOuterRadius"
+                       zhalflength="TubeHalfLength"/>
+
+    <!--box name="Box" xhalflength="100" yhalflength="100" zhalflength="100" /-->
+  </shapes>
+
+  <!-- Defining logical volumes -->
+  <!--logvol name="MyBox" shape="Box" material="N2"/-->
+  <logvol name="MyTube" shape="Tube" material="N2" />
+
+  <assembly name="DisplacedTube" >
+    <transform>
+      <transformation name="negativeShift">
+        <translation z="-3000."/>
+      </transformation>
+      <logvolref ref="MyTube"/>
+    </transform>
+  </assembly>
+
+
+
+  <!-- Adding volume branches -->
+  <addbranch>
+      <assemblyref ref="DisplacedTube" />
+  </addbranch>
+
+</geomodel>
diff --git a/GeoModelTools/GeoModelXML/data/example2.xml b/GeoModelTools/GeoModelXML/data/example2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..db8c48f609ce66b1f28e9b99f1f2ef1de02fd9eb
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/data/example2.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [
+
+<!-- include the file where the materials are defined -->
+<!ENTITY materials SYSTEM "materials.gmx" >
+
+]>
+
+<geomodel name="ITk_Example" version="1.0"
+  xmlns="http://www.nikhef.nl/%7Er29/gmx">
+
+  <!-- Definition of materials -->
+  <!-- Load materials -->
+  &materials;
+
+  <!-- Definition of variables -->
+  <defines>
+    <var name="TubeInnerRadius" value="0" />
+    <var name="TubeOuterRadius" value="600." />
+    <var name="TubeHalfLength"  value="1200." />
+  </defines>
+
+  <!-- Definition of shapes -->
+  <shapes>
+    <box name="Box" xhalflength="1000" yhalflength="2000" zhalflength="1500" />
+  </shapes>
+
+  <!-- Defining logical volumes -->
+  <logvol name="MyBox" shape="Box" material="N2"/>
+
+  <assembly name="DisplacedBox" >
+    <transform>
+      <transformation name="positiveShift">
+        <translation z="3000."/>
+      </transformation>
+      <logvolref ref="MyBox"/>
+    </transform>
+  </assembly>
+
+
+  <!-- Adding volume branches -->
+  <addbranch>
+      <assemblyref ref="DisplacedBox" />
+  </addbranch>
+
+</geomodel>
diff --git a/GeoModelTools/GeoModelXML/data/example3.xml b/GeoModelTools/GeoModelXML/data/example3.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f90fb06df457c05b845314e9e79b9dcf2ad9b022
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/data/example3.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE geomodel SYSTEM "geomodel.dtd" [
+
+<!-- include the file where the materials are defined -->
+<!ENTITY materials SYSTEM "materials.gmx" >
+
+]>
+
+<geomodel name="ITk_Example" version="1.0"
+  xmlns="http://www.nikhef.nl/%7Er29/gmx">
+
+  <!-- Definition of materials -->
+  <!-- Load materials -->
+  &materials;
+
+  <!-- Definition of variables -->
+  <defines>
+    <var name="TubeInnerRadius" value="0" />
+    <var name="TubeOuterRadius" value="600." />
+    <var name="TubeHalfLength"  value="1200." />
+  </defines>
+  
+  <!-- Definition of shapes -->  
+  <shapes>
+    <tube name="Tube"  rmin="TubeInnerRadius"
+                       rmax="TubeOuterRadius"
+                       zhalflength="TubeHalfLength"/>
+    
+    <box name="Box" xhalflength="100" yhalflength="100" zhalflength="100" />   
+  </shapes>
+  
+  <!-- Defining logical volumes -->
+  <logvol name="MyBox" shape="Box" material="N2"/>
+  <logvol name="MyTube" shape="Tube" material="Air" >
+    <transform>
+      <transformation name="MyBoxShift" >
+        <translation z="250" />
+      </transformation>
+      <logvolref ref="MyBox" />
+    </transform>
+  </logvol>
+  
+
+  <!-- Adding volume branches -->
+  <addbranch>
+      <logvolref ref="MyTube" />    
+  </addbranch>
+  
+</geomodel>
+
diff --git a/GeoModelTools/GeoModelXML/data/geomodel.dtd b/GeoModelTools/GeoModelXML/data/geomodel.dtd
new file mode 100644
index 0000000000000000000000000000000000000000..e0b0d314610b42f658d0c2bb244623168af97ea5
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/data/geomodel.dtd
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!-- Copyright N.P. Hessey, Nikhef, 2013 -->
+
+<!ELEMENT geomodel ((defines|materials|readoutgeometry|positionindex|shapes|logvol|transformation|assembly)+, addbranch)>
+  <!ATTLIST geomodel name    CDATA "Unnamed detector"
+                     version CDATA "0.0"
+                     xmlns   CDATA #FIXED "http://www.nikhef.nl/%7Er29/gmx">
+
+  <!ELEMENT defines (var|vector|matrix)+>
+
+    <!ELEMENT var EMPTY>
+      <!ATTLIST var name  ID    #REQUIRED
+                    value CDATA #REQUIRED>
+
+    <!ELEMENT vector EMPTY>
+      <!ATTLIST vector name  ID    #REQUIRED
+                       value CDATA #REQUIRED>
+
+    <!ELEMENT matrix EMPTY>
+      <!ATTLIST matrix name   ID    #REQUIRED
+                       coldim CDATA #REQUIRED
+                       value  CDATA #REQUIRED>
+
+  <!ELEMENT materials ((element|chemical|material)+)>
+    <!ATTLIST materials densitysf CDATA "1.0">
+
+    <!ELEMENT element EMPTY>
+      <!ATTLIST element name      ID      #REQUIRED
+                        shortname NMTOKEN #REQUIRED
+                        Z         CDATA   #REQUIRED
+                        A         CDATA   #REQUIRED>
+
+    <!ELEMENT chemical (elemcontent)+>
+      <!ATTLIST chemical name ID #REQUIRED>
+      <!ELEMENT elemcontent EMPTY>
+        <!ATTLIST elemcontent ref      IDREF #REQUIRED
+                              quantity CDATA #REQUIRED>
+
+    <!ELEMENT material (elementref|materialref|chemicalref)+>
+      <!ATTLIST material name    ID    #REQUIRED
+                         density CDATA #REQUIRED>
+
+      <!ELEMENT elementref EMPTY>
+        <!ATTLIST elementref ref      IDREF #REQUIRED
+                             fraction CDATA #REQUIRED>
+
+      <!ELEMENT materialref EMPTY>
+        <!ATTLIST materialref ref      IDREF #REQUIRED
+                              fraction CDATA #REQUIRED>
+
+      <!ELEMENT chemicalref EMPTY>
+        <!ATTLIST chemicalref ref      IDREF #REQUIRED
+                              fraction CDATA #REQUIRED>
+
+  <!ELEMENT readoutgeometry (param*, sensorclass+)>
+    <!ELEMENT param EMPTY>
+      <!ATTLIST param name  NMTOKEN #REQUIRED
+                      value CDATA   #REQUIRED>
+    <!ELEMENT sensorclass (param*, sensortype+)>
+    <!ATTLIST sensorclass name ID #REQUIRED>
+      <!ELEMENT sensortype (param*)>
+        <!ATTLIST sensortype name ID #REQUIRED>
+
+  <!ELEMENT positionindex (addindex+)>
+    <!ELEMENT addindex EMPTY>
+        <!ATTLIST addindex name ID #REQUIRED>
+
+  <!ELEMENT shapes ((box|cons|generictrap|para|pcon|pgon|trap|tube|tubs|trd|intersection|subtraction|union|simplepolygonbrep)+)>
+    <!-- All shapes allowed in GeoModel manual. Same name, parameters, parameter order, but always lower case -->
+
+    <!ELEMENT simplepolygonbrep EMPTY>
+      <!ATTLIST simplepolygonbrep name        ID    #REQUIRED
+                                  xpoints     CDATA #REQUIRED
+                                  ypoints     CDATA #REQUIRED
+                                  zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT box EMPTY>
+      <!ATTLIST box name        ID    #REQUIRED
+                    xhalflength CDATA #REQUIRED
+                    yhalflength CDATA #REQUIRED
+                    zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT cons EMPTY>
+      <!ATTLIST cons name  ID #REQUIRED
+                     rmin1 CDATA #REQUIRED
+                     rmin2 CDATA #REQUIRED
+                     rmax1 CDATA #REQUIRED
+                     rmax2 CDATA #REQUIRED
+                     dz    CDATA #REQUIRED
+                     sphi  CDATA #REQUIRED
+                     dphi  CDATA #REQUIRED>
+
+    <!ELEMENT generictrap EMPTY>
+      <!ATTLIST generictrap name        ID    #REQUIRED
+                            x0          CDATA #REQUIRED
+                            y0          CDATA #REQUIRED
+                            x1          CDATA #REQUIRED
+                            y1          CDATA #REQUIRED
+                            x2          CDATA #REQUIRED
+                            y2          CDATA #REQUIRED
+                            x3          CDATA #REQUIRED
+                            y3          CDATA #REQUIRED
+                            x4          CDATA #REQUIRED
+                            y4          CDATA #REQUIRED
+                            x5          CDATA #REQUIRED
+                            y5          CDATA #REQUIRED
+                            x6          CDATA #REQUIRED
+                            y6          CDATA #REQUIRED
+                            x7          CDATA #REQUIRED
+                            y7          CDATA #REQUIRED
+                            zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT para EMPTY>
+      <!ATTLIST para name        ID    #REQUIRED
+                     xhalflength CDATA #REQUIRED
+                     yhalflength CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     alpha       CDATA #REQUIRED
+                     theta       CDATA #REQUIRED
+                     phi         CDATA #REQUIRED>
+
+    <!ELEMENT pcon (addplane, addplane+)>
+      <!ELEMENT addplane EMPTY>
+        <!ATTLIST addplane zplane    CDATA #REQUIRED
+                           rminplane CDATA #REQUIRED
+                           rmaxplane CDATA #REQUIRED>
+ 
+      <!ATTLIST pcon name ID    #REQUIRED
+                     sphi CDATA #REQUIRED
+                     dphi CDATA #REQUIRED>
+
+    <!ELEMENT pgon (addplane, addplane+)>
+      <!ATTLIST pgon name   ID    #REQUIRED
+                     sphi   CDATA #REQUIRED
+                     dphi   CDATA #REQUIRED
+                     nsides CDATA #REQUIRED>
+
+    <!ELEMENT trap EMPTY>
+      <!ATTLIST trap name        ID    #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     theta       CDATA #REQUIRED
+                     phi         CDATA #REQUIRED
+                     dydzn       CDATA #REQUIRED
+                     dxdyndzn    CDATA #REQUIRED
+                     dxdypdzn    CDATA #REQUIRED
+                     angleydzn   CDATA #REQUIRED
+                     dydzp       CDATA #REQUIRED
+                     dxdyndzp    CDATA #REQUIRED
+                     dxdypdzp    CDATA #REQUIRED
+                     angleydzp   CDATA #REQUIRED>
+
+    <!ELEMENT tube EMPTY>
+      <!ATTLIST tube name        ID    #REQUIRED
+                     rmin        CDATA #REQUIRED
+                     rmax        CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED>
+
+    <!ELEMENT tubs EMPTY>
+      <!ATTLIST tubs name        ID    #REQUIRED
+                     rmin        CDATA #REQUIRED
+                     rmax        CDATA #REQUIRED
+                     zhalflength CDATA #REQUIRED
+                     sphi        CDATA #REQUIRED
+                     dphi        CDATA #REQUIRED>
+
+    <!ELEMENT trd EMPTY>
+      <!ATTLIST trd name         ID    #REQUIRED
+                    xhalflength1 CDATA #REQUIRED
+                    xhalflength2 CDATA #REQUIRED
+                    yhalflength1 CDATA #REQUIRED
+                    yhalflength2 CDATA #REQUIRED
+                    zhalflength  CDATA #REQUIRED>
+
+    <!ELEMENT intersection (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST intersection name ID #REQUIRED>
+
+    <!ELEMENT subtraction (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST subtraction name ID #REQUIRED>
+
+    <!ELEMENT union (shaperef, (transformation|transformationref), shaperef)>
+      <!ATTLIST union name ID #REQUIRED>
+
+  <!ELEMENT shaperef EMPTY>
+    <!ATTLIST shaperef ref IDREF #REQUIRED>
+
+  <!ELEMENT transform ((transformation|transformationref), (logvol|logvolref|assembly|assemblyref))>
+    <!ATTLIST transform name      ID    #IMPLIED
+                        alignable CDATA #IMPLIED> <!-- CDATA = alignment level-number -->
+
+    <!ELEMENT transformation (scaling|rotation|translation)+>
+
+      <!ELEMENT scaling EMPTY>
+        <!ATTLIST scaling x CDATA "1.0"
+                          y CDATA "1.0"
+                          z CDATA "1.0">
+
+      <!ELEMENT rotation EMPTY>
+        <!ATTLIST rotation xcos  CDATA "0.0"
+                           ycos  CDATA "0.0"
+                           zcos  CDATA "0.0"
+                           angle CDATA "0.0">
+
+      <!ELEMENT translation EMPTY>
+        <!ATTLIST translation x CDATA "0.0"
+                              y CDATA "0.0"
+                              z CDATA "0.0">
+
+      <!ATTLIST transformation name ID #REQUIRED>
+      <!ATTLIST transformation alignable (true|false) "false"> 
+
+    <!ELEMENT transformationref EMPTY>
+      <!ATTLIST transformationref ref IDREF #REQUIRED>
+
+  <!ELEMENT logvol (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)*>
+    <!-- If sensitive is not given, it is not sensitive. If given, it points to a digitization scheme -->
+    <!ATTLIST logvol name ID #REQUIRED
+                     shape IDREF #REQUIRED
+                     material IDREF #REQUIRED
+                     sensitive IDREF #IMPLIED 
+                     alignable (true|false) "false"> 
+
+  <!ELEMENT index EMPTY>
+    <!ATTLIST index ref   IDREF #REQUIRED
+                    value CDATA #REQUIRED>
+
+  <!ELEMENT logvolref EMPTY>
+    <!ATTLIST logvolref ref    IDREF         #REQUIRED
+                        zeroid (true|false) "false">
+
+  <!ELEMENT assembly (transform|logvol|logvolref|assembly|assemblyref|multicopy|index)+>
+    <!ATTLIST assembly name      ID           #REQUIRED
+                       alignable (true|false) "false"> 
+
+  <!ELEMENT assemblyref EMPTY>
+    <!ATTLIST assemblyref ref    IDREF        #REQUIRED
+                          zeroid (true|false) "false">
+
+  <!ELEMENT multicopy (transformation, (transform|logvolref|assemblyref))>
+    <!-- Removed logvol and assembly from multicopy content. There is no particular reason 
+         why they shouldn't be allowed there. But in practice one uses refs, and forbidding them simplifies coding 
+         the index stuff. If you need them, put them back. Got rid of transformref; never used. -->
+    <!-- loopvar: Set to a vector variable name or omit; see manual -->
+    <!-- alignable: Value is the alignment level-number -->
+    <!ATTLIST multicopy name      ID    #REQUIRED
+                        n         CDATA #REQUIRED
+                        loopvar   CDATA #IMPLIED
+                        alignable CDATA #IMPLIED>
+    <!-- N.B. no zeroid attribute: the copy-number is always zeroed each time the multicopy is inserted; no choice -->
+
+  <!ELEMENT addbranch (transform|logvol|logvolref|assembly|assemblyref)+>
+
diff --git a/GeoModelTools/GeoModelXML/data/gmexMatVisAttributes.json b/GeoModelTools/GeoModelXML/data/gmexMatVisAttributes.json
new file mode 100644
index 0000000000000000000000000000000000000000..4e58ddc467cf951c854350c5ecb16861064ef31d
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/data/gmexMatVisAttributes.json
@@ -0,0 +1,193 @@
+{
+    "MatVisAttributes": [
+        {
+            "ambient": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.3
+            },
+            "diffuse": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.3
+            },
+            "emissive": {
+                "B": 1.0,
+                "G": 0.0,
+                "R": 0.0
+            },
+            "name": [
+                "Air"
+            ],
+            "shininess": 0.900000166893005,
+            "specular": {
+                "B": 1.0,
+                "G": 0.0,
+                "R": 0.0
+            },
+            "transparency": 0.8
+        },
+        {
+            "ambient": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.3
+            },
+            "diffuse": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.3
+            },
+            "emissive": {
+                "B": 0.0,
+                "G": 0.5,
+                "R": 0.0
+            },
+            "name": [
+                "N2","ArCO2"
+            ],
+            "shininess": 0.900000166893005,
+            "specular": {
+                "B": 0.0,
+                "G": 1.0,
+                "R": 0.0
+            },
+            "transparency": 0.5
+        },
+        {
+            "ambient": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "diffuse": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "emissive": {
+                "B": 0.0,
+                "G": 0.0,
+                "R": 0.4
+            },
+            "name": [
+                "BeMetal"
+            ],
+            "shininess": 0.900000166893005,
+            "specular": {
+                "B": 0.0,
+                "G": 0.0,
+                "R": 1.0
+            },
+            "transparency": 0.5
+        },
+        {
+            "ambient": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "diffuse": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "emissive": {
+                "B": 0.7,
+                "G": 0.7,
+                "R": 0.0
+            },
+            "name": [
+                "SiliconMat"
+            ],
+            "shininess": 0.900000166893005,
+            "specular": {
+                "B": 1.0,
+                "G": 1.0,
+                "R": 0.0
+            },
+            "transparency": 0.0
+        },
+        {
+            "ambient": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "diffuse": {
+                "B": 0.7,
+                "G": 0.7,
+                "R": 0.6
+            },
+            "emissive": {
+                "B": 0.7,
+                "G": 0.7,
+                "R": 0.0
+            },
+            "name": [
+                "AlMetal"
+            ],
+            "shininess": 0.900000166893005,
+            "specular": {
+                "B": 1.0,
+                "G": 1.0,
+                "R": 0.0
+            },
+            "transparency": 0.0
+        },
+        {
+            "ambient": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "diffuse": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "emissive": {
+                "B": 0.0,
+                "G": 0.7,
+                "R": 0.7
+            },
+            "name": [
+                "HybridPCB","Teflon"
+            ],
+            "shininess": 0.900000166893005,
+            "specular": {
+                "B": 0.0,
+                "G": 1.0,
+                "R": 1.0
+            },
+            "transparency": 0.0
+        },
+	        {
+            "ambient": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "diffuse": {
+                "B": 0.3,
+                "G": 0.3,
+                "R": 0.6
+            },
+            "emissive": {
+                "B": 0.33,
+                "G": 0.0,
+                "R": 0.33
+            },
+            "name": [
+                "Bakelite"
+            ],
+            "shininess": 0.900000166893005,
+            "specular": {
+                "B": 0.0,
+                "G": 1.0,
+                "R": 1.0
+            },
+            "transparency": 0.0
+        }
+    ]
+}
diff --git a/GeoModelTools/GeoModelXML/data/materials.gmx b/GeoModelTools/GeoModelXML/data/materials.gmx
new file mode 100644
index 0000000000000000000000000000000000000000..b5591c0b084e912eea7615df7f1d5dfe0fef66d6
--- /dev/null
+++ b/GeoModelTools/GeoModelXML/data/materials.gmx
@@ -0,0 +1,61 @@
+<materials>
+
+  <element name="Hydrogen"    shortname="H"  Z="1"  A="1.00794"/>
+  <element name="Berylium"    shortname="Be" Z="4"  A="9.012182"/>
+  <element name="Carbon"      shortname="C"  Z="6"  A="12.011"/>
+  <element name="Nitrogen"    shortname="N"  Z="7"  A="14.00674"/>
+  <element name="Oxygen"      shortname="O"  Z="8"  A="15.9994"/>
+  <element name="Aluminium"   shortname="Al" Z="13" A="26.981539"/>
+  <element name="Silicon"     shortname="Si" Z="14" A="28.0855"/>
+  <element name="Argon"       shortname="Ar" Z="18" A="39.948"/>
+  <element name="Iron"        shortname="Fe" Z="26" A="55.845"/>
+  <element name="Copper"      shortname="Cu" Z="29" A="63.546"/>
+  <element name="Silver"      shortname="Ag" Z="47" A="107.8682"/>
+
+  
+  <material name="N2" density="1.2504e-3 * 273.15/293.15 * 96265/100000">
+    <elementref fraction="1.00000" ref="Nitrogen"/>
+  </material>
+
+  <material name="Air" density="1.205e-3">
+    <elementref fraction="0.7541" ref="Nitrogen"/>
+    <elementref fraction="0.2321" ref="Oxygen"/>
+    <elementref fraction="0.0138" ref="Argon"/>
+  </material>
+  
+  <material name="ArgonGas" density="1.789e-3" >
+    <elementref fraction="1.00000" ref="Argon"/>
+  </material>
+  
+  <chemical name="CO2">
+    <elemcontent ref="Carbon" quantity="1"/>
+    <elemcontent ref="Oxygen" quantity="2"/>
+  </chemical>
+  
+  <material name="CO2Gas" density="1.98e-3">
+    <chemicalref fraction="1" ref="CO2"/>
+  </material>
+  
+  <chemical name="Phenol">
+    <elemcontent ref="Carbon" quantity="6"/>
+    <elemcontent ref="Hydrogen" quantity="6"/>
+    <elemcontent ref="Oxygen" quantity="1"/>
+  </chemical>
+  
+  <chemical name="Formaldehyde">
+    <elemcontent ref="Carbon" quantity="1"/>
+    <elemcontent ref="Hydrogen" quantity="2"/>
+    <elemcontent ref="Oxygen" quantity="1"/>
+  </chemical>
+  
+  <material name="Bakelite" density="1.3" >
+    <chemicalref ref="Phenol" fraction="0.5" />
+    <chemicalref ref="Formaldehyde" fraction="0.5" />
+  </material>
+   
+  <material name="ArCO2" density="1.79e-3" >
+    <materialref ref="ArgonGas" fraction="0.93" />
+    <materialref ref="CO2Gas" fraction="0.7" />
+  </material>
+
+</materials>