diff --git a/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt b/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt
index 59715098c31f3df1087004edb8fb89774f652097..38082b667f9f6fb9d93f3a398859dfc11a3b00f0 100644
--- a/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt
+++ b/DetectorDescription/GeoModel/GeoModelTest/CMakeLists.txt
@@ -11,6 +11,7 @@ atlas_depends_on_subdirs( PRIVATE
                           DetectorDescription/GeoModel/GeoModelInterfaces
                           DetectorDescription/GeoModel/GeoModelUtilities
                           Scintillator/ScintDetDescr/ScintReadoutGeometry
+                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
                         )
 
 # External dependencies:
@@ -21,7 +22,7 @@ atlas_add_component( GeoModelTest
                      src/GeoModelTestAlg.cxx
                      src/components/GeoModelTest_entries.cxx
                      INCLUDE_DIRS ${GEOMODEL_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${GEOMODEL_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry )
+                     LINK_LIBRARIES ${GEOMODEL_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry TrackerReadoutGeometry )
 
 atlas_add_test( GeoModelCheck
                 SCRIPT python/GeoModelTestConfig.py
diff --git a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx
index 219082c599f8ff2214ab500f17809dfe3698673e..0566551950f73ca1e15c93bc1c99a27d94c50979 100644
--- a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx
+++ b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.cxx
@@ -4,8 +4,13 @@
 #include "GeoModelUtilities/GeoModelExperiment.h"
 
 #include "ScintReadoutGeometry/VetoDetectorManager.h"
+#include "TrackerReadoutGeometry/SCT_DetectorManager.h"
+
 #include "ScintReadoutGeometry/ScintDetectorElement.h"
+#include "TrackerReadoutGeometry/SiDetectorElement.h"
+
 #include "ScintIdentifier/VetoID.h"
+#include "TrackerIdentifier/FaserSCT_ID.h"
 
 
 GeoModelTestAlg::GeoModelTestAlg(const std::string& name, ISvcLocator* pSvcLocator)
@@ -51,6 +56,349 @@ StatusCode GeoModelTestAlg::execute()
 
     ATH_CHECK(testVeto());
 
+    ATH_CHECK(testSCT());
+
+    return StatusCode::SUCCESS;
+}
+
+StatusCode GeoModelTestAlg::testSCT()
+{
+    // Test retrieval of helper object directly from store
+    const FaserSCT_ID* helper = nullptr;
+    ATH_CHECK(detStore()->retrieve(helper, "FaserSCT_ID"));
+    if (helper != nullptr)
+    {
+        // Test neighbors with helper function
+        const IdContext& context = helper->wafer_context();
+        ATH_MSG_ALWAYS("Retrieved FaserSCT_ID helper from DetStore.");
+        for (int iStation = -m_numSctStations/2; iStation <= m_numSctStations/2; iStation++)
+        {
+            if (m_numSctStations%2 == 0 && iStation == 0) continue;
+            for (int iPlane = 0; iPlane < m_numSctPlanesPerStation; iPlane++)
+            {
+                for (int iRow = 0; iRow < m_numSctRowsPerPlane; iRow++)
+                {
+                    for (int iModule = -m_numSctModulesPerRow/2; iModule <= m_numSctModulesPerRow/2; iModule++)
+                    {
+                        if (m_numSctModulesPerRow%2 == 0 && iModule == 0) continue;
+                        for (int iSensor = 0; iSensor < 2; iSensor++)
+                        {
+                            Identifier thisId = helper->wafer_id(iStation, iPlane, iRow, iModule, iSensor, true);
+                            IdentifierHash thisHash = helper->wafer_hash(thisId);
+                            IdentifierHash prevHash;
+                            IdentifierHash nextHash;
+                            IdentifierHash flipHash;
+                            Identifier prevId;
+                            Identifier nextId;
+                            Identifier flipId;
+                            const int INVALID = std::numeric_limits<int>::min();
+                            int prevPhiStation { INVALID };
+                            int nextPhiStation { INVALID };
+                            int prevPhiPlane   { INVALID };
+                            int nextPhiPlane   { INVALID };
+                            int prevPhiRow     { INVALID };
+                            int nextPhiRow     { INVALID };
+                            int prevPhiModule  { INVALID };
+                            int nextPhiModule  { INVALID };
+                            int prevPhiSensor  { INVALID };
+                            int nextPhiSensor  { INVALID };
+                            int prevPhiStat = helper->get_prev_in_phi(thisHash, prevHash);
+                            if (prevPhiStat == 0) 
+                            {
+                                IdentifierHash testHash;
+                                int nextPhiStat = helper->get_next_in_phi(prevHash, testHash);
+                                if (nextPhiStat != 0 || testHash != thisHash)
+                                {
+                                    ATH_MSG_FATAL("Next SCT module in phi (" << testHash << ") of previous in phi (" << prevHash << ") is not the original (" << thisHash <<")" );
+                                    return StatusCode::FAILURE;
+                                }
+                                prevPhiStat = helper->get_id(prevHash, prevId, &context);
+                                if (prevPhiStat == 0)
+                                {
+                                    prevPhiStation = helper->station(prevId);
+                                    prevPhiPlane   = helper->layer(prevId);
+                                    prevPhiRow     = helper->phi_module(prevId);
+                                    prevPhiModule  = helper->eta_module(prevId);
+                                    prevPhiSensor  = helper->side(prevId);
+                                }
+                            }
+                            int nextPhiStat = helper->get_next_in_phi(thisHash, nextHash);
+                            if (nextPhiStat == 0) 
+                            {
+                                IdentifierHash testHash;
+                                prevPhiStat = helper->get_prev_in_phi(nextHash, testHash);
+                                if (prevPhiStat != 0 || testHash != thisHash)
+                                {
+                                    ATH_MSG_FATAL("Previous SCT Module in phi (" << testHash << ") of next in phi (" << nextHash << ") is not the original (" << thisHash <<")" );
+                                    return StatusCode::FAILURE;
+                                }
+                                nextPhiStat = helper->get_id(nextHash, nextId, &context);
+                                if (nextPhiStat == 0)
+                                {
+                                    nextPhiStation = helper->station(nextId);
+                                    nextPhiPlane   = helper->layer(nextId);
+                                    nextPhiRow     = helper->phi_module(nextId);
+                                    nextPhiModule  = helper->eta_module(nextId);
+                                    nextPhiSensor  = helper->side(nextId);
+                                }
+                            }
+                            int prevEtaStation { INVALID };
+                            int nextEtaStation { INVALID };
+                            int prevEtaPlane   { INVALID };
+                            int nextEtaPlane   { INVALID };
+                            int prevEtaRow     { INVALID };
+                            int nextEtaRow     { INVALID };
+                            int prevEtaModule  { INVALID };
+                            int nextEtaModule  { INVALID };
+                            int prevEtaSensor  { INVALID };
+                            int nextEtaSensor  { INVALID };
+                            int prevEtaStat = helper->get_prev_in_eta(thisHash, prevHash);
+                            if (prevEtaStat == 0) 
+                            {
+                                IdentifierHash testHash;
+                                int nextEtaStat = helper->get_next_in_eta(prevHash, testHash);
+                                if (nextEtaStat != 0 || testHash != thisHash)
+                                {
+                                    ATH_MSG_FATAL("Next SCT module in eta (" << testHash << ") of previous in eta (" << prevHash << ") is not the original (" << thisHash <<")" );
+                                    return StatusCode::FAILURE;
+                                }
+                                prevEtaStat = helper->get_id(prevHash, prevId, &context);
+                                if (prevEtaStat == 0)
+                                {
+                                    prevEtaStation = helper->station(prevId);
+                                    prevEtaPlane   = helper->layer(prevId);
+                                    prevEtaRow     = helper->phi_module(prevId);
+                                    prevEtaModule  = helper->eta_module(prevId);
+                                    prevEtaSensor  = helper->side(prevId);
+                                }
+                            }
+                            int nextEtaStat = helper->get_next_in_eta(thisHash, nextHash);
+                            if (nextEtaStat == 0) 
+                            {
+                                IdentifierHash testHash;
+                                prevEtaStat = helper->get_prev_in_eta(nextHash, testHash);
+                                if (prevEtaStat != 0 || testHash != thisHash)
+                                {
+                                    ATH_MSG_FATAL("Previous SCT Module in eta (" << testHash << ") of next in eta (" << nextHash << ") is not the original (" << thisHash <<")" );
+                                    return StatusCode::FAILURE;
+                                }
+                                nextEtaStat = helper->get_id(nextHash, nextId, &context);
+                                if (nextEtaStat == 0)
+                                {
+                                    nextEtaStation = helper->station(nextId);
+                                    nextEtaPlane   = helper->layer(nextId);
+                                    nextEtaRow     = helper->phi_module(nextId);
+                                    nextEtaModule  = helper->eta_module(nextId);
+                                    nextEtaSensor  = helper->side(nextId);
+                                }
+                            }
+                            int flipStation { INVALID };
+                            int flipPlane   { INVALID };
+                            int flipRow     { INVALID };
+                            int flipModule  { INVALID };
+                            int flipSensor  { INVALID };
+                            int flipStat = helper->get_other_side(thisHash, flipHash);
+                            if (flipStat == 0) 
+                            {
+                                IdentifierHash testHash;
+                                int flipStat = helper->get_other_side(flipHash, testHash);
+                                if (flipStat != 0 || testHash != thisHash)
+                                {
+                                    ATH_MSG_FATAL("Flip side of SCT sensor (" << testHash << ") of flip side (" << flipHash << ") is not the original (" << thisHash <<")" );
+                                    return StatusCode::FAILURE;
+                                }
+                                flipStat = helper->get_id(flipHash, prevId, &context);
+                                if (flipStat == 0)
+                                {
+                                    flipStation = helper->station(prevId);
+                                    flipPlane   = helper->layer(prevId);
+                                    flipRow     = helper->phi_module(prevId);
+                                    flipModule  = helper->eta_module(prevId);
+                                    flipSensor  = helper->side(prevId);
+                                }
+                            }
+                            else
+                            {
+                                ATH_MSG_FATAL("SCT sensor " << thisHash << " has no other side!");
+                                return StatusCode::FAILURE;
+                            }
+                            ATH_MSG_ALWAYS("Sct Sensor " << iStation << "/" << iPlane << "/" << iRow << "/" << iModule << "/" << iSensor <<
+                                        " (" << thisHash << ") " <<
+                                         ": prev phi = " << (prevPhiStation == INVALID ? "-" : std::to_string(prevPhiStation)) << "/" << 
+                                                        (prevPhiPlane == INVALID ? "-" : std::to_string(prevPhiPlane)) << "/" << 
+                                                        (prevPhiRow == INVALID ? "-": std::to_string(prevPhiRow)) << "/" << 
+                                                        (prevPhiModule == INVALID ? "-" : std::to_string(prevPhiModule)) << "/" <<
+                                                        (prevPhiSensor == INVALID ? "-" : std::to_string(prevPhiSensor)) <<
+                                        " , next phi = " << (nextPhiStation == INVALID ? "-" : std::to_string(nextPhiStation)) << "/" << 
+                                                        (nextPhiPlane == INVALID ? "-" : std::to_string(nextPhiPlane)) << "/" << 
+                                                        (nextPhiRow == INVALID ? "-": std::to_string(nextPhiRow)) << "/" << 
+                                                        (nextPhiModule == INVALID ? "-" : std::to_string(nextPhiModule)) << "/" <<
+                                                        (nextPhiSensor == INVALID ? "-" : std::to_string(nextPhiSensor)) <<
+                                       " , prev eta = " << (prevEtaStation == INVALID ? "-" : std::to_string(prevEtaStation)) << "/" << 
+                                                        (prevEtaPlane == INVALID ? "-" : std::to_string(prevEtaPlane)) << "/" << 
+                                                        (prevEtaRow == INVALID ? "-": std::to_string(prevEtaRow)) << "/" << 
+                                                        (prevEtaModule == INVALID ? "-" : std::to_string(prevEtaModule)) << "/" <<
+                                                        (prevEtaSensor == INVALID ? "-" : std::to_string(prevEtaSensor)) <<
+                                        " , next eta = " << (nextEtaStation == INVALID ? "-" : std::to_string(nextEtaStation)) << "/" << 
+                                                        (nextEtaPlane == INVALID ? "-" : std::to_string(nextEtaPlane)) << "/" << 
+                                                        (nextEtaRow == INVALID ? "-": std::to_string(nextEtaRow)) << "/" << 
+                                                        (nextEtaModule == INVALID ? "-" : std::to_string(nextEtaModule)) << "/" <<
+                                                        (nextEtaSensor == INVALID ? "-" : std::to_string(nextEtaSensor)) <<
+                                        " , other side = " << flipStation << "/" <<
+                                                              flipPlane << "/" <<
+                                                              flipRow << "/" <<
+                                                              flipModule << "/" <<
+                                                              flipSensor
+                                                        );
+
+                        }
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        ATH_MSG_FATAL("Failed to retrieve FaserSCT_ID helper from DetStore.");
+        return StatusCode::FAILURE;
+    }
+
+    // Test direct retrieval of typed managers from DetStore
+    const TrackerDD::SCT_DetectorManager* sctMgr = nullptr;
+    ATH_CHECK(detStore()->retrieve(sctMgr, "SCT"));
+    if (sctMgr != nullptr)
+    {
+        ATH_MSG_ALWAYS("Retrieved (typed) SCT detector manager with " << sctMgr->getNumTreeTops() << " treetops directly from DetStore.");
+        // Compare numerology with the "right" answers from our properties
+        if (sctMgr->numerology().numStations() != m_numSctStations || sctMgr->getNumTreeTops() != m_numSctStations)
+        {
+            ATH_MSG_FATAL("Disagreement in number of SCT stations.");
+            return StatusCode::FAILURE;
+        }
+        if (sctMgr->numerology().numLayers() != m_numSctPlanesPerStation)
+        {
+            ATH_MSG_FATAL("Disagreement in number of layers per SCT station.");
+            return StatusCode::FAILURE;
+        }
+        if (sctMgr->numerology().numPhiModulesForLayer() != m_numSctRowsPerPlane)
+        {
+            ATH_MSG_FATAL("Disagreement in number of rows per SCT plane.");
+            return StatusCode::FAILURE;
+        }
+        if (sctMgr->numerology().numEtaModulesForLayer() != m_numSctModulesPerRow)
+        {
+            ATH_MSG_FATAL("Disagreement in number of modules per SCT row.");
+            return StatusCode::FAILURE;
+        }
+        if (sctMgr->numerology().maxNumStrips() != m_numSctStripsPerSensor)
+        {
+            ATH_MSG_FATAL("Disagreement in number of strips per SCT sensor.");
+            return StatusCode::FAILURE;
+        }
+
+        // Test detector elements
+        const TrackerDD::SiDetectorElementCollection* elements = sctMgr->getDetectorElementCollection();
+        for (int station = -m_numSctStations/2; station <= m_numSctStations/2; station++)
+        {
+            if (m_numSctStations%2 == 0 && station == 0) continue;
+            for (int plane = 0; plane < m_numSctPlanesPerStation; plane++)
+            {
+                for (int row = 0; row < m_numSctRowsPerPlane; row++)
+                {
+                    for (int module = -m_numSctModulesPerRow/2; module <= m_numSctModulesPerRow/2; module++)
+                    {
+                        if (m_numSctModulesPerRow%2 == 0 && module == 0) continue;
+                        for (int sensor = 0; sensor < 2; sensor++)
+                        {
+                            Identifier id = helper->wafer_id(station, plane, row, module, sensor, true);
+                            if (!sctMgr->identifierBelongs(id))
+                            {
+                                ATH_MSG_FATAL("Valid SCT sensor identifier does not pass identifierBelongs.");
+                                return StatusCode::FAILURE;
+                            }
+                            IdentifierHash hash = helper->wafer_hash(id);
+                            TrackerDD::SiDetectorElement* elementByLevels = sctMgr->getDetectorElement(station, plane, row, module, sensor);
+                            TrackerDD::SiDetectorElement* elementById = sctMgr->getDetectorElement(id);
+                            TrackerDD::SiDetectorElement* elementByHash = sctMgr->getDetectorElement(hash);
+                            TrackerDD::SiDetectorElement* element = (*elements)[hash];
+                            if (elementByLevels != element || elementById != element || elementByHash != element)
+                            {
+                                ATH_MSG_FATAL("Inconsistent retrieval of SCT detector elements");
+                                return StatusCode::FAILURE;
+                            }
+                            ATH_MSG_ALWAYS("Found SCT sensor (" << station << "/" << plane << "/" << row << "/" << module << "/" << sensor << ") with global center at (" << 
+                                element->center().x() << ", " <<
+                                element->center().y() << ", " <<
+                                element->center().z() << ")."
+                                );
+                            const TrackerDD::SiDetectorElement* nextPhi = element->nextInPhi();
+                            if (nextPhi != nullptr)
+                            {
+                                if (nextPhi->prevInPhi() != element)
+                                {
+                                    ATH_MSG_FATAL("Previous phi neighbor of next SCT element is not this element.");
+                                    return StatusCode::FAILURE;
+                                }
+                            }
+                            const TrackerDD::SiDetectorElement* prevPhi = element->prevInPhi();
+                            if (prevPhi != nullptr)
+                            {
+                                if (prevPhi->nextInPhi() != element)
+                                {
+                                    ATH_MSG_FATAL("Next phi neighbor of previous SCT element is not this element.");
+                                    return StatusCode::FAILURE;
+                                }
+                            }
+                            if (nextPhi == nullptr && prevPhi == nullptr)
+                            {
+                                ATH_MSG_FATAL("SCT element " << hash << " has no previous OR next phi neighbor.");
+                                return StatusCode::FAILURE;
+                            }
+                            const TrackerDD::SiDetectorElement* nextEta = element->nextInEta();
+                            if (nextEta != nullptr)
+                            {
+                                if (nextEta->prevInEta() != element)
+                                {
+                                    ATH_MSG_FATAL("Previous eta neighbor of next SCT element is not this element.");
+                                    return StatusCode::FAILURE;
+                                }
+                            }
+                            const TrackerDD::SiDetectorElement* prevEta = element->prevInEta();
+                            if (prevEta != nullptr)
+                            {
+                                if (prevEta->nextInEta() != element)
+                                {
+                                    ATH_MSG_FATAL("Next eta neighbor of previous SCT element is not this element.");
+                                    return StatusCode::FAILURE;
+                                }
+                            }
+                            if (nextEta == nullptr && prevEta == nullptr)
+                            {
+                                ATH_MSG_FATAL("SCT element " << hash << " has no previous OR next eta neighbor.");
+                                return StatusCode::FAILURE;
+                            }
+                            const TrackerDD::SiDetectorElement* flip = element->otherSide();
+                            if (flip == nullptr)
+                            {
+                                ATH_MSG_FATAL("SCT element " << hash << " has no other side.");
+                                return StatusCode::FAILURE;
+                            }
+                            if (flip->otherSide() != element)
+                            {
+                                ATH_MSG_FATAL("Other side of other side of SCT sensor is not this sensor.");
+                                return StatusCode::FAILURE;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        ATH_MSG_FATAL("Failed to retrieve (typed) SCT detector manager directly from DetStore.");
+        return StatusCode::FAILURE;
+    }
     return StatusCode::SUCCESS;
 }
 
@@ -64,9 +412,9 @@ StatusCode GeoModelTestAlg::testVeto()
         // Test neighbors with helper function
         const IdContext& context = helper->plate_context();
         ATH_MSG_ALWAYS("Retrieved VetoID helper from DetStore.");
-        for (int iStation = 0; iStation < 2; iStation++)
+        for (int iStation = 0; iStation < m_numVetoStations; iStation++)
         {
-            for (int iPlate = 0; iPlate < 2; iPlate++)
+            for (int iPlate = 0; iPlate < m_numVetoPlatesPerStation; iPlate++)
             {
                 Identifier thisId = helper->plate_id(iStation, iPlate, true);
                 IdentifierHash thisHash = helper->plate_hash(thisId);
@@ -85,7 +433,7 @@ StatusCode GeoModelTestAlg::testVeto()
                     int nextStat = helper->get_next_in_z(prevHash, testHash);
                     if (nextStat != 0 || testHash != thisHash)
                     {
-                        ATH_MSG_FATAL("Next (" << testHash << ") of previous (" << prevHash << ") is not the original (" << thisHash <<")" );
+                        ATH_MSG_FATAL("Next Veto plate (" << testHash << ") of previous (" << prevHash << ") is not the original (" << thisHash <<")" );
                         return StatusCode::FAILURE;
                     }
                     prevStat = helper->get_id(prevHash, prevId, &context);
@@ -102,7 +450,7 @@ StatusCode GeoModelTestAlg::testVeto()
                     prevStat = helper->get_prev_in_z(nextHash, testHash);
                     if (prevStat != 0 || testHash != thisHash)
                     {
-                        ATH_MSG_FATAL("Previous (" << testHash << ") of next (" << nextHash << ") is not the original (" << thisHash <<")" );
+                        ATH_MSG_FATAL("Previous veto plate (" << testHash << ") of next (" << nextHash << ") is not the original (" << thisHash <<")" );
                         return StatusCode::FAILURE;
                     }
                     nextStat = helper->get_id(nextHash, nextId, &context);
diff --git a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h
index f70dd6fb837b1649a4eeab465e9505cf0b186654..c1a3a56841183663d11252ef229ca374f9540586 100644
--- a/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h
+++ b/DetectorDescription/GeoModel/GeoModelTest/src/GeoModelTestAlg.h
@@ -15,9 +15,16 @@ class GeoModelTestAlg : public AthAlgorithm
 
     private:  
     StatusCode testVeto();
+    StatusCode testSCT();
 
     // Independently specify the "right" number of elements, for comparison with what we get from detector store
     Gaudi::Property<int>            m_numVetoStations           {this, "NumVetoStations", 2, "Number of stations in the Veto detector"};
     Gaudi::Property<int>            m_numVetoPlatesPerStation   {this, "NumVetoPlatesPerStation", 2, "Number of plates per station in the Veto detector"};
     Gaudi::Property<int>            m_numVetoPmtsPerPlate       {this, "NumVetoPmtsPerPlate", 1, "Number of pmts per plate in the Veto detector"};
+
+    Gaudi::Property<int>            m_numSctStations            {this, "NumSCTStations", 3, "Number of stations in the SCT detector"};
+    Gaudi::Property<int>            m_numSctPlanesPerStation    {this, "NumSCTPlanesPerStation", 3, "Number of planes per station in the SCT detector"};
+    Gaudi::Property<int>            m_numSctRowsPerPlane        {this, "NumSCTRowsPerPlane", 4, "Number of rows of modules per plane in the SCT detector"};
+    Gaudi::Property<int>            m_numSctModulesPerRow       {this, "NumSCTModulesPerRow", 2, "Number of modules per row in the SCT detector"};
+    Gaudi::Property<int>            m_numSctStripsPerSensor     {this, "NumSCTStripsPerSensor", 768,"Number of readout strips per sensor in the SCT detector"};
 };
\ No newline at end of file
diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h
index eaa3dbba0343a04082eb48e8243120d22a783862..90ee8ca9ec8767b5c7f928b4d7c46f1848de0f0a 100755
--- a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h
+++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.h
@@ -36,27 +36,41 @@ namespace TrackerDD {
       
       /** Number of barrels. Normally 3. */
       int numBarrels() const; 
+
+      int numStations() const;
            
       // /** Barrel/endcap identifier for each barrel. Normally barrelId(0) = -1 */
       int barrelId(int index) const;
+
+      int stationId(int index) const;
            
       /** Number of layers */
       int numLayers() const; 
       
       /** Number of sectors in phi for a layer */
       int numPhiModulesForLayer(int layer) const;
+
+      int numPhiModulesForLayer() const;
       
       /** Number of sectors in phi for a ring in a disk */
       int numEtaModulesForLayer(int layer) const;
       
+      int numEtaModulesForLayer() const;
+
       /** First eta_module number for a layer */
       int beginEtaModuleForLayer(int layer) const;
       
+      int beginEtaModuleForLayer() const;
+
       /** Last eta_module number + 1 */
       int endEtaModuleForLayer(int layer) const;
       
+      int endEtaModuleForLayer() const;
+
       /** Check if eta_module=0 exists */
       bool skipEtaZeroForLayer(int layer) const;
+
+      bool skipEtaZeroForLayer() const;
       
       // Check presence of layer/disk
       /** Check if layer exists */
diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc
index 360d98650b8cc6a0ac8ffd5683cb8450da7b8492..fe2c2ba5cb21c7d3e8f70e4bf07270f69d8c123a 100644
--- a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc
+++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/TrackerReadoutGeometry/SiNumerology.icc
@@ -9,11 +9,21 @@ inline int SiNumerology::numBarrels() const
   return m_barrelIds.size();
 }
 
+inline int SiNumerology::numStations() const
+{
+  return m_barrelIds.size();
+}
+
 inline int SiNumerology::barrelId(int index) const
 {
   return m_barrelIds[index];
 }
 
+inline int SiNumerology::stationId(int index) const
+{
+  return m_barrelIds[index];
+}
+
 inline int SiNumerology::numLayers() const
 {
   return m_numLayers;
@@ -24,22 +34,42 @@ inline int SiNumerology::numPhiModulesForLayer(int layer) const
   return m_phiModulesForLayer[layer];
 }
 
+inline int SiNumerology::numPhiModulesForLayer() const
+{
+  return m_maxNumBarrelPhiModules;
+}
+
 inline int SiNumerology::numEtaModulesForLayer(int layer) const
 {
   return m_etaModulesForLayer[layer];
 }
 
+inline int SiNumerology::numEtaModulesForLayer() const
+{
+  return m_maxNumBarrelEta;
+}
+
 inline int SiNumerology::beginEtaModuleForLayer(int layer) const
 {
   // Assume symmetric about zero.
   return -m_etaModulesForLayer[layer]/2;
 }
 
+inline int SiNumerology::beginEtaModuleForLayer() const
+{
+  return -m_maxNumBarrelEta/2;
+}
+// these are both 1 past the end, like an iterator ::end()
 inline int SiNumerology::endEtaModuleForLayer(int layer) const
 {
   // Assume symmetric about zero.
   return m_etaModulesForLayer[layer]/2+1;
 }
+
+inline int SiNumerology::endEtaModuleForLayer() const
+{
+  return m_maxNumBarrelEta/2 + 1;
+}
   
 inline bool SiNumerology::skipEtaZeroForLayer(int layer) const
 {
@@ -47,6 +77,11 @@ inline bool SiNumerology::skipEtaZeroForLayer(int layer) const
   return !(m_etaModulesForLayer[layer]%2);
 }
 
+inline bool SiNumerology::skipEtaZeroForLayer() const
+{
+  return !(m_maxNumBarrelEta%2);
+}
+
 inline int SiNumerology::maxNumBarrelEta() const
 {
   return m_maxNumBarrelEta;