diff --git a/compact/definitions.xml b/compact/definitions.xml
index d52994d6e32cc2daa293963423dcb78ac4215263..80e58e2824fb5882f63a4aa1cd70c22f313eb1de 100644
--- a/compact/definitions.xml
+++ b/compact/definitions.xml
@@ -205,6 +205,7 @@
     <constant name="ForwardRICH_ID"     value="121"/>
     <constant name="ci_GEM_id"          value="122"/>
     <constant name="ForwardTRD_ID"      value="123"/>
+    <constant name="GEMTrackerEndcap_ID" value="124"/>
 
     <comment> 
       =====================================
diff --git a/compact/gem_tracker_endcap.xml b/compact/gem_tracker_endcap.xml
new file mode 100644
index 0000000000000000000000000000000000000000..516405f371769bc34e7a28abcfcc12d36b66d68a
--- /dev/null
+++ b/compact/gem_tracker_endcap.xml
@@ -0,0 +1,69 @@
+<lccdd>
+
+  <comment> Central Barrel Tracker Silicon </comment>        
+
+  <define>
+    <comment> Si layer opiton </comment>
+    <constant name="GEMTrackerEndcapFoilX1"           value="43.0 * mm"/>
+    <constant name="GEMTrackerEndcapFoilY"            value="1020.0 * mm"/>
+    <constant name="GEMTrackerEndcapFoilOpeningAngle" value="30.1*degree"/>
+    <constant name="GEMTrackerEndcapFoilX2"           value="2*GEMTrackerEndcapFoilY*tan(GEMTrackerEndcapFoilOpeningAngle/2.0) +  GEMTrackerEndcapFoilX1"/>
+    <constant name="GEMTrackerEndcapFoil_rmin"        value="GEMTrackerEndcapFoilX1/(tan(GEMTrackerEndcapFoilOpeningAngle/2.0)*2.0)"/>
+    <constant name="GEMTrackerEndcapFoil_rmax"        value="(GEMTrackerEndcapFoilY+GEMTrackerEndcapFoil_rmin)/(cos(GEMTrackerEndcapFoilOpeningAngle/2.0))"/>
+  </define>
+
+  <limits>
+  </limits>
+
+  <regions>
+  </regions>
+
+  <display>
+  </display>
+
+  <detectors>
+    <detector
+      id="GEMTrackerEndcap_ID"
+      name="GEMTrackerEndcap"
+      type="refdet_GEMTrackerEndcap"
+      readout="GEMTrackerEndcapHits"
+      vis="Argonne_Red"
+      reflect="false">
+      <module name="GEMModule1" vis="Argonne_Process_Blue">
+        <trd x1="GEMTrackerEndcapFoilX1/2.0" x2="GEMTrackerEndcapFoilX2/2.0" z="GEMTrackerEndcapFoilY/2"/>
+        <comment> Going from HV side to readout side</comment>
+        <module_component thickness="1.127 * mm" material="Mylar"/>
+        <module_component thickness="3*mm" material="Ar10CO2"/>
+        <module_component thickness="0.127 * mm" material="Mylar"/>
+        <module_component thickness="2*mm" material="Ar10CO2"/>
+        <module_component thickness="0.127 * mm" material="Mylar"/>
+        <module_component thickness="2*mm" material="Ar10CO2"/>
+        <module_component thickness="0.127 * mm" material="Mylar"/>
+        <module_component thickness="2*mm" material="Ar10CO2"/>
+        <module_component thickness="0.175 * mm" material="Epoxy" sensitive="true" vis="Argonne_Process_Blue"/>
+      </module>
+      <layer id="1" >
+        <envelope vis="Argonne_Red"
+          rmin="GEMTrackerEndcapFoil_rmin" rmax="GEMTrackerEndcapFoil_rmax"
+          zstart="SiliconTrackerOuterBarrelLength/2+15*mm" length="30.0*mm"  />
+        <ring r="GEMTrackerEndcapFoil_rmin+GEMTrackerEndcapFoilY/2.0"
+          zstart="SiliconTrackerOuterBarrelLength/2+20*mm"
+          nmodules="12" dz="10 * mm" module="GEMModule1" />
+      </layer>
+    </detector>
+
+  </detectors>
+
+  <readouts>
+    <readout name="GEMTrackerEndcapHits">
+      <segmentation type="CartesianGridXY" grid_size_x="1.0*mm" grid_size_y="1.0*mm" />
+      <id>system:8,barrel:2,layer:4,module:12,sensor:2,x:32:-16,y:-16</id>
+    </readout>
+  </readouts>
+
+  <plugins>
+  </plugins>
+
+  <fields>
+  </fields>
+</lccdd>
diff --git a/compact/materials.xml b/compact/materials.xml
index d8955f0bc9a4010381ca72f136c8eb2ee5950794..26ee6989605c1de6cc831d77186db58486cb01cb 100644
--- a/compact/materials.xml
+++ b/compact/materials.xml
@@ -192,5 +192,11 @@
     <composite n="0.036" ref="C"/>	    
     <composite n="0.073" ref="O"/>	    
   </material>
+  <material name="Mylar">
+    <D type="density" value="1.39" unit="g/cm3" />
+    <fraction n="0.62502108" ref="C"/>
+    <fraction n="0.041960452" ref="H"/>
+    <fraction n="0.33301847" ref="O"/>
+  </material>
 
 </materials>
diff --git a/reference_detector.xml b/reference_detector.xml
index 6a31c0a191c1ed05a85efb2dfec820d74a1e3201..99b3e96684b1297108ef828e0ed951c96060fae1 100644
--- a/reference_detector.xml
+++ b/reference_detector.xml
@@ -121,14 +121,15 @@
   <include ref="compact/cb_CTD_Si.xml"/>
   <include ref="compact/ce_mrich.xml"/>
   <include ref="compact/ce_GEM.xml"/>
-  <include ref="compact/ci_GEM.xml"/>
   <include ref="compact/hcal.xml"/>
   <include ref="compact/forward_trd.xml"/>
   <include ref="compact/B0_tracker.xml"/>
   <include ref="compact/forward_romanpot.xml"/>
   <include ref="compact/forward_offM_tracker.xml"/>
   <include ref="compact/vertex_tracker.xml"/>
+  <include ref="compact/gem_tracker_endcap.xml"/>
   <!--
+  <include ref="compact/ci_GEM.xml"/>
   <include ref="compact/cb_VTX_Barrel.xml"/>
   <include ref="compact/ci_HCAL.xml"/>
   <include ref="compact/forward_rich.xml"/>
diff --git a/src/TrapEndcapTracker_geo.cpp b/src/TrapEndcapTracker_geo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ea0c961ceffb7afc2bc913199c922306c724841d
--- /dev/null
+++ b/src/TrapEndcapTracker_geo.cpp
@@ -0,0 +1,140 @@
+//==========================================================================
+//  AIDA Detector description implementation
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+// Author     : M.Frank
+//
+//==========================================================================
+//
+// Specialized generic detector constructor
+//
+//==========================================================================
+#include <map>
+#include "DD4hep/DetFactoryHelper.h"
+
+using namespace std;
+using namespace dd4hep;
+using namespace dd4hep::detail;
+
+static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) {
+    typedef vector<PlacedVolume> Placements;
+    xml_det_t x_det = e;
+    Material vacuum = description.vacuum();
+    int det_id = x_det.id();
+    string det_name = x_det.nameStr();
+    bool reflect = x_det.reflect(false);
+    DetElement sdet(det_name, det_id);
+    Assembly assembly(det_name);
+    // Volume      assembly    (det_name,Box(10000,10000,10000),vacuum);
+    Volume motherVol = description.pickMotherVolume(sdet);
+    int m_id = 0, c_id = 0, n_sensor = 0;
+    map<string, Volume> modules;
+    map<string, Placements> sensitives;
+    PlacedVolume pv;
+
+    assembly.setVisAttributes(description.invisible());
+    sens.setType("tracker");
+
+    for (xml_coll_t mi(x_det, _U(module)); mi; ++mi, ++m_id) {
+        xml_comp_t x_mod = mi;
+        string m_nam = x_mod.nameStr();
+        xml_comp_t trd = x_mod.trd();
+        double posY;
+        double x1 = trd.x1();
+        double x2 = trd.x2();
+        double z = trd.z();
+        double y1, y2, total_thickness = 0.;
+        xml_coll_t ci(x_mod, _U(module_component));
+        for (ci.reset(), total_thickness = 0.0; ci; ++ci) total_thickness += xml_comp_t(ci).thickness();
+
+        y1 = y2 = total_thickness / 2;
+        Volume m_volume(m_nam, Trapezoid(x1, x2, y1, y2, z), vacuum);
+        m_volume.setVisAttributes(description.visAttributes(x_mod.visStr()));
+
+        for (ci.reset(), n_sensor = 1, c_id = 0, posY = -y1; ci; ++ci, ++c_id) {
+            xml_comp_t c = ci;
+            double c_thick = c.thickness();
+            Material c_mat = description.material(c.materialStr());
+            string c_name = _toString(c_id, "component%d");
+            Volume c_vol(c_name, Trapezoid(x1, x2, c_thick / 2e0, c_thick / 2e0, z), c_mat);
+
+            c_vol.setVisAttributes(description.visAttributes(c.visStr()));
+            pv = m_volume.placeVolume(c_vol, Position(0, posY + c_thick / 2, 0));
+            if (c.isSensitive()) {
+                sdet.check(n_sensor > 2,
+                           "SiTrackerEndcap2::fromCompact: " + c_name + " Max of 2 modules allowed!");
+                pv.addPhysVolID("sensor", n_sensor);
+                c_vol.setSensitiveDetector(sens);
+                sensitives[m_nam].push_back(pv);
+                ++n_sensor;
+            }
+            posY += c_thick;
+        }
+        modules[m_nam] = m_volume;
+    }
+
+    for (xml_coll_t li(x_det, _U(layer)); li; ++li) {
+        xml_comp_t x_layer(li);
+        int l_id = x_layer.id();
+        int mod_num = 1;
+        for (xml_coll_t ri(x_layer, _U(ring)); ri; ++ri) {
+            xml_comp_t x_ring = ri;
+            double r = x_ring.r();
+            double phi0 = x_ring.phi0(0);
+            double zstart = x_ring.zstart();
+            double dz = x_ring.dz(0);
+            int nmodules = x_ring.nmodules();
+            string m_nam = x_ring.moduleStr();
+            Volume m_vol = modules[m_nam];
+            double iphi = 2 * M_PI / nmodules;
+            double phi = phi0;
+            Placements& sensVols = sensitives[m_nam];
+
+            for (int k = 0; k < nmodules; ++k) {
+                string m_base = _toString(l_id, "layer%d") + _toString(mod_num, "_module%d");
+                double x = -r * std::cos(phi);
+                double y = -r * std::sin(phi);
+                DetElement module(sdet, m_base + "_pos", det_id);
+                pv = assembly.placeVolume(m_vol, Transform3D(RotationZYX(0, -M_PI / 2 - phi, -M_PI / 2),
+                                                             Position(x, y, zstart + dz)));
+                pv.addPhysVolID("barrel", 1).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
+                module.setPlacement(pv);
+                for (size_t ic = 0; ic < sensVols.size(); ++ic) {
+                    PlacedVolume sens_pv = sensVols[ic];
+                    DetElement comp_elt(module, sens_pv.volume().name(), mod_num);
+                    comp_elt.setPlacement(sens_pv);
+                }
+
+                if (reflect) {
+                    pv =
+                        assembly.placeVolume(m_vol, Transform3D(RotationZYX(M_PI, -M_PI / 2 - phi, -M_PI / 2),
+                                                                Position(x, y, -zstart - dz)));
+                    pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
+                    DetElement r_module(sdet, m_base + "_neg", det_id);
+                    r_module.setPlacement(pv);
+                    for (size_t ic = 0; ic < sensVols.size(); ++ic) {
+                        PlacedVolume sens_pv = sensVols[ic];
+                        DetElement comp_elt(r_module, sens_pv.volume().name(), mod_num);
+                        comp_elt.setPlacement(sens_pv);
+                    }
+                }
+                dz = -dz;
+                phi += iphi;
+                ++mod_num;
+            }
+        }
+    }
+    pv = motherVol.placeVolume(assembly);
+    pv.addPhysVolID("system", det_id);
+    sdet.setPlacement(pv);
+    return sdet;
+}
+
+// clang-format off
+DECLARE_DETELEMENT(refdet_TrapEndcapTracker, create_detector)
+DECLARE_DETELEMENT(refdet_GEMTrackerEndcap, create_detector)