diff --git a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py
index 675f61f5b77cea6bc6fac3c42eb01f17bfc492b8..00f4b9c37cce80a4ca7cb4c669f48d102a199fd4 100644
--- a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py
+++ b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser01.py
@@ -5,7 +5,7 @@ import sys
 from AthenaCommon.Constants import VERBOSE, INFO
 from AthenaConfiguration.ComponentFactory import CompFactory
 
-def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs):
+def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", alignmentConstants={}, **kwargs):
 
     # Initialize GeoModel
     from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
@@ -32,7 +32,12 @@ def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs):
                                                                     PoolContainerPrefix="ConditionsContainer", 
                                                                     TopLevelContainerName = "<type>",
                                                                     SubLevelBranchName= "<key>" )
-    kwargs.setdefault("AlignDbTool", CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, OutputLevel=VERBOSE))
+
+    trackerAlignDBTool = CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, 
+                                                                       OutputLevel=VERBOSE,
+                                                                       AlignmentConstants = {}) 
+    kwargs.setdefault("AlignDbTool", trackerAlignDBTool)
+    trackerAlignDBTool.AlignmentConstants = alignmentConstants 
     a.addEventAlgo(WriteAlignmentAlg(name, **kwargs))
 
     return a
@@ -53,6 +58,10 @@ if __name__ == "__main__":
     ConfigFlags.IOVDb.DBConnection        = "sqlite://;schema=" + ConfigFlags.GeoModel.FaserVersion + "_ALLP200.db;dbname=OFLP200"
     ConfigFlags.GeoModel.Align.Disable = True          # Hack to avoid loading alignment when we want to create it from scratch
     ConfigFlags.addFlag("WriteAlignment.PoolFileName", ConfigFlags.GeoModel.FaserVersion + "_Align.pool.root") 
+
+# Parse flags from command line and lock
+    ConfigFlags.addFlag("AlignDbTool.AlignmentConstants", {}) 
+    ConfigFlags.fillFromArgs(sys.argv[1:])
     ConfigFlags.lock()
 
 # Configure components
@@ -60,7 +69,7 @@ if __name__ == "__main__":
     acc = MainServicesCfg(ConfigFlags)
 
 # Set things up to create a conditions DB with neutral Tracker alignment transforms
-    acc.merge(WriteAlignmentCfg(ConfigFlags, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN")))
+    acc.merge(WriteAlignmentCfg(ConfigFlags, alignmentConstants=ConfigFlags.AlignDbTool.AlignmentConstants, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"), ))
 
 # Configure verbosity    
     # ConfigFlags.dump()
@@ -71,3 +80,4 @@ if __name__ == "__main__":
     
 # Execute and finish
     sys.exit(int(acc.run(maxEvents=1).isFailure()))
+
diff --git a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py
index b05c15632415e873e301a08d9f63332175ebfe20..2e944e3fc88b76d6794a7df7b9ce4469fc763d51 100644
--- a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py
+++ b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_Faser02.py
@@ -5,7 +5,7 @@ import sys
 from AthenaCommon.Constants import VERBOSE, INFO
 from AthenaConfiguration.ComponentFactory import CompFactory
 
-def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs):
+def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", alignmentConstants={}, **kwargs):
 
     # Initialize GeoModel
     from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
@@ -32,7 +32,12 @@ def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs):
                                                                     PoolContainerPrefix="ConditionsContainer", 
                                                                     TopLevelContainerName = "<type>",
                                                                     SubLevelBranchName= "<key>" )
-    kwargs.setdefault("AlignDbTool", CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, OutputLevel=VERBOSE))
+
+    trackerAlignDBTool = CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, 
+                                                                       OutputLevel=VERBOSE,
+                                                                       AlignmentConstants = {}) 
+    kwargs.setdefault("AlignDbTool", trackerAlignDBTool)
+    trackerAlignDBTool.AlignmentConstants = alignmentConstants 
     a.addEventAlgo(WriteAlignmentAlg(name, **kwargs))
 
     return a
@@ -53,6 +58,10 @@ if __name__ == "__main__":
     ConfigFlags.IOVDb.DBConnection        = "sqlite://;schema=" + ConfigFlags.GeoModel.FaserVersion + "_ALLP200.db;dbname=OFLP200"
     ConfigFlags.GeoModel.Align.Disable = True          # Hack to avoid loading alignment when we want to create it from scratch
     ConfigFlags.addFlag("WriteAlignment.PoolFileName", ConfigFlags.GeoModel.FaserVersion + "_Align.pool.root") 
+
+# Parse flags from command line and lock
+    ConfigFlags.addFlag("AlignDbTool.AlignmentConstants", {}) 
+    ConfigFlags.fillFromArgs(sys.argv[1:])
     ConfigFlags.lock()
 
 # Configure components
@@ -60,7 +69,7 @@ if __name__ == "__main__":
     acc = MainServicesCfg(ConfigFlags)
 
 # Set things up to create a conditions DB with neutral Tracker alignment transforms
-    acc.merge(WriteAlignmentCfg(ConfigFlags, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN")))
+    acc.merge(WriteAlignmentCfg(ConfigFlags, alignmentConstants=ConfigFlags.AlignDbTool.AlignmentConstants, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"), ))
 
 # Configure verbosity    
     # ConfigFlags.dump()
diff --git a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py
index d57092f2dd8b8c1dcb3bd6568fdb3dac636d3cf2..84fb1b02e855907c7c525c64498b7d4d8b015f18 100644
--- a/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py
+++ b/Control/CalypsoExample/WriteAlignment/python/WriteAlignmentConfig_FaserTB00.py
@@ -5,7 +5,7 @@ import sys
 from AthenaCommon.Constants import VERBOSE, INFO
 from AthenaConfiguration.ComponentFactory import CompFactory
 
-def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs):
+def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", alignmentConstants={}, **kwargs):
 
     # Initialize GeoModel
     from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
@@ -32,7 +32,12 @@ def WriteAlignmentCfg(flags, name="WriteAlignmentAlg", **kwargs):
                                                                     PoolContainerPrefix="ConditionsContainer", 
                                                                     TopLevelContainerName = "<type>",
                                                                     SubLevelBranchName= "<key>" )
-    kwargs.setdefault("AlignDbTool", CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, OutputLevel=VERBOSE))
+
+    trackerAlignDBTool = CompFactory.TrackerAlignDBTool("AlignDbTool", OutputTool = outputTool, 
+                                                                       OutputLevel=VERBOSE,
+                                                                       AlignmentConstants = {})
+    kwargs.setdefault("AlignDbTool", trackerAlignDBTool)
+    trackerAlignDBTool.AlignmentConstants = alignmentConstants 
     a.addEventAlgo(WriteAlignmentAlg(name, **kwargs))
 
     return a
@@ -53,6 +58,10 @@ if __name__ == "__main__":
     ConfigFlags.IOVDb.DBConnection        = "sqlite://;schema=" + ConfigFlags.GeoModel.FaserVersion + "_ALLP200.db;dbname=OFLP200"
     ConfigFlags.GeoModel.Align.Disable = True          # Hack to avoid loading alignment when we want to create it from scratch
     ConfigFlags.addFlag("WriteAlignment.PoolFileName", ConfigFlags.GeoModel.FaserVersion + "_Align.pool.root") 
+
+# Parse flags from command line and lock
+    ConfigFlags.addFlag("AlignDbTool.AlignmentConstants", {})
+    ConfigFlags.fillFromArgs(sys.argv[1:])
     ConfigFlags.lock()
 
 # Configure components
@@ -60,7 +69,7 @@ if __name__ == "__main__":
     acc = MainServicesCfg(ConfigFlags)
 
 # Set things up to create a conditions DB with neutral Tracker alignment transforms
-    acc.merge(WriteAlignmentCfg(ConfigFlags, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN")))
+    acc.merge(WriteAlignmentCfg(ConfigFlags, alignmentConstants=ConfigFlags.AlignDbTool.AlignmentConstants, ValidRunStart=1, ValidEvtStart=0, ValidRunEnd=9999999, ValidEvtEnd=9999999, CondTag=ConfigFlags.GeoModel.FaserVersion.replace("FASER", "TRACKER-ALIGN"), ))
 
 # Configure verbosity    
     # ConfigFlags.dump()
diff --git a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx
index 77714ac0974d54b0f6292a74a174cc86a6c7cf29..4483eb5b4cd52b31aa70cb915ba6500641297685 100644
--- a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx
+++ b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.cxx
@@ -1,6 +1,6 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
+   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+   */
 
 // TrackerAlignDBTool.cxx
 // AlgTool to manage the SCT AlignableTransforms in the conditions store
@@ -12,6 +12,9 @@
 #include "AthenaPoolUtilities/CondAttrListCollection.h"
 #include "AthenaPoolUtilities/AthenaAttributeList.h"
 
+#include <string>
+#include <set>
+#include <exception>
 #include <fstream>
 #include <iostream>
 
@@ -35,16 +38,16 @@
 #define TRACKER_ALIGN "/Tracker/Align"
 
 TrackerAlignDBTool::TrackerAlignDBTool(const std::string& type,
-           const std::string& name, const IInterface* parent)
+    const std::string& name, const IInterface* parent)
   : AthAlgTool(type,name,parent),
-    p_toolsvc("ToolSvc",name),
-    m_sctid(nullptr),
-    m_sctman(nullptr),
-    m_par_scttwoside(false),
-    m_par_dbroot( TRACKER_ALIGN ),
-    m_par_dbkey( TRACKER_ALIGN ),
-    m_dynamicDB(false),
-    m_forceUserDBConfig(false)
+  p_toolsvc("ToolSvc",name),
+  m_sctid(nullptr),
+  m_sctman(nullptr),
+  m_par_scttwoside(false),
+  m_par_dbroot( TRACKER_ALIGN ),
+  m_par_dbkey( TRACKER_ALIGN ),
+  m_dynamicDB(false),
+  m_forceUserDBConfig(false)
 {
   declareInterface<ITrackerAlignDBTool>(this);
   declareProperty("IToolSvc",    p_toolsvc);
@@ -59,76 +62,76 @@ TrackerAlignDBTool::~TrackerAlignDBTool()
 
 StatusCode TrackerAlignDBTool::initialize() 
 {
-  
-    ATH_MSG_DEBUG("initializing");
-  
-    m_alignobjs.clear();
-    m_alignchans.clear();
-    int ndet {0};
 
-    // get storegate access to conditions store
-    ATH_CHECK(detStore().retrieve());
+  ATH_MSG_DEBUG("initializing");
 
-    ATH_CHECK( p_toolsvc.retrieve() );
+  m_alignobjs.clear();
+  m_alignchans.clear();
+  int ndet {0};
 
-    // attempt to get ID helpers from detector store 
-    // (relying on GeoModel to put them)
+  // get storegate access to conditions store
+  ATH_CHECK(detStore().retrieve());
 
-    ATH_CHECK(detStore()->retrieve(m_sctman,"SCT"));
+  ATH_CHECK( p_toolsvc.retrieve() );
 
-    if (m_sctman->m_alignfoldertype == TrackerDD::static_run1 && 
-        !m_forceUserDBConfig)
-    {
-        m_par_dbroot = "/Tracker/Align";
-        m_dynamicDB = false;
-    } 
-    else if (m_sctman->m_alignfoldertype == TrackerDD::timedependent_run2 && 
-            !m_forceUserDBConfig)
-    {
-        m_par_dbroot = "/Tracker/AlignL3";
-        m_dynamicDB = true;
-    }  
-    m_par_dbkey = m_par_dbroot;
+  // attempt to get ID helpers from detector store 
+  // (relying on GeoModel to put them)
+
+  ATH_CHECK(detStore()->retrieve(m_sctman,"SCT"));
 
-    ATH_CHECK(detStore()->retrieve(m_sctid));
+  if (m_sctman->m_alignfoldertype == TrackerDD::static_run1 && 
+      !m_forceUserDBConfig)
+  {
+    m_par_dbroot = "/Tracker/Align";
+    m_dynamicDB = false;
+  } 
+  else if (m_sctman->m_alignfoldertype == TrackerDD::timedependent_run2 && 
+      !m_forceUserDBConfig)
+  {
+    m_par_dbroot = "/Tracker/AlignL3";
+    m_dynamicDB = true;
+  }  
+  m_par_dbkey = m_par_dbroot;
 
-    // setup list of alignable transforms from geometry
-    int chan[3];
-    int TransfLevel_low = 0; // depending on alignfolder sheme; 0 for old, 2 for new
-    if (m_dynamicDB) TransfLevel_low = 2;
+  ATH_CHECK(detStore()->retrieve(m_sctid));
 
-    for (int i=0;i<3;++i) chan[i]=100*i;
+  // setup list of alignable transforms from geometry
+  int chan[3];
+  int TransfLevel_low = 0; // depending on alignfolder sheme; 0 for old, 2 for new
+  if (m_dynamicDB) TransfLevel_low = 2;
 
-    std::string man_name;
-    for (const TrackerDD::SiDetectorElement* element : *(m_sctman->getDetectorElementCollection())) 
+  for (int i=0;i<3;++i) chan[i]=100*i;
+
+  std::string man_name;
+  for (const TrackerDD::SiDetectorElement* element : *(m_sctman->getDetectorElementCollection())) 
+  {
+    if (element!=0) 
     {
-        if (element!=0) 
-        {
-          const Identifier ident=element->identify();
-          int station, layer, eta, phi, side;
-          if (idToDetSet(ident, station, layer, eta, phi, side)) 
-          {
-              std::string level[3];
-              for (int i=TransfLevel_low; i<3; ++i) 
-              {  
-                m_stations.insert(station);
-                level[i]=dirkey(station, layer, 1+i, phi);
-                // add this to list if not seen already
-                std::vector<std::string>::const_iterator ix =
-                    find(m_alignobjs.begin(), m_alignobjs.end(), level[i]);
-                if (ix==m_alignobjs.end()) 
-                {
-                  m_alignobjs.push_back(level[i]);
-                  m_alignchans.push_back(chan[i]++);
-                }
-              }
-              ++ndet;
-          } 
-          else 
-          {
-              ATH_MSG_ERROR("Error translating element identifier." );
-          }
-        }
+      const Identifier ident=element->identify();
+      int station, layer, eta, phi, side;
+      if (idToDetSet(ident, station, layer, eta, phi, side)) 
+      {
+	std::string level[3];
+	for (int i=TransfLevel_low; i<3; ++i) 
+	{  
+	  m_stations.insert(station);
+	  level[i]=dirkey(station, layer, 1+i, phi);
+	  // add this to list if not seen already
+	  std::vector<std::string>::const_iterator ix =
+	    find(m_alignobjs.begin(), m_alignobjs.end(), level[i]);
+	  if (ix==m_alignobjs.end()) 
+	  {
+	    m_alignobjs.push_back(level[i]);
+	    m_alignchans.push_back(chan[i]++);
+	  }
+	}
+	++ndet;
+      } 
+      else 
+      {
+	ATH_MSG_ERROR("Error translating element identifier." );
+      }
+    }
   }
   ATH_CHECK(m_outputTool.retrieve());
 
@@ -136,12 +139,12 @@ StatusCode TrackerAlignDBTool::initialize()
   {
     ATH_MSG_DEBUG( "Database root folder " << m_par_dbroot );
     ATH_MSG_DEBUG( "Geometry initialisation sees " << ndet << 
-        " SCT modules giving " << m_alignobjs.size() << " alignment keys" );
+	" SCT modules giving " << m_alignobjs.size() << " alignment keys" );
     ATH_MSG_DEBUG("Keys/channels are:");
-    
+
     for (unsigned int i=0; i < m_alignobjs.size(); ++i)
       ATH_MSG_DEBUG( " " << m_alignobjs[i] << " [" << m_alignchans[i] << "]" );
-    
+
   }
 
   return StatusCode::SUCCESS;
@@ -155,7 +158,7 @@ StatusCode TrackerAlignDBTool::finalize()
 
 StatusCode TrackerAlignDBTool::createDB() const
 {
-  
+
   ATH_MSG_DEBUG("createDB method called");
   AlignableTransform* pat = nullptr;
 
@@ -167,8 +170,8 @@ StatusCode TrackerAlignDBTool::createDB() const
 
   if (detStore()->contains<AlignableTransformContainer>(m_par_dbroot)) 
   {
-      ATH_MSG_WARNING("createDB: AlignableTransformContainer already exists" );
-      return StatusCode::FAILURE;
+    ATH_MSG_WARNING("createDB: AlignableTransformContainer already exists" );
+    return StatusCode::FAILURE;
   }
 
   // put them in a collection /Indet/Align
@@ -187,7 +190,7 @@ StatusCode TrackerAlignDBTool::createDB() const
   }
 
   // record collection in SG
- 
+
   ATH_CHECK( detStore()->record(patc, m_par_dbroot) );
   ATH_MSG_DEBUG( "Collection has size " <<  patc->size() );
 
@@ -195,78 +198,133 @@ StatusCode TrackerAlignDBTool::createDB() const
   std::vector<std::string> level2;
   for (const TrackerDD::SiDetectorElement* element : *(m_sctman->getDetectorElementCollection()) )
   {
-      if (element != 0) 
+    if (element != 0) 
+    {
+      const Identifier ident = element->identify();
+      std::string key = dirkey(ident,3);
+      // do not produce AlignableTrasnforms for SCT side 1 if option set
+      if (!(m_sctid->side(ident)==1) || m_par_scttwoside) 
       {
-        const Identifier ident = element->identify();
-        std::string key = dirkey(ident,3);
-        // do not produce AlignableTrasnforms for SCT side 1 if option set
-        if (!(m_sctid->side(ident)==1) || m_par_scttwoside) 
-        {
-            if ((pat=getTransPtr(key))) 
-            {
-                pat->add(ident,Amg::EigenTransformToCLHEP( Amg::Transform3D::Identity() ) );
-            } 
-            else 
-            {
-                ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key );
-            }
-            // add level 2 transform if needed - do this the first time a module
-            // for this level 3 key is seen
-            std::vector<std::string>::const_iterator ix=
-                find(level2.begin(),level2.end(),key);
-            if (ix==level2.end()) 
-            {
-                level2.push_back(key);
-                // construct identifier of level 2 transform
-                Identifier ident2;
-                ident2=m_sctid->wafer_id(m_sctid->station(ident),
-                                        m_sctid->layer(ident),
-                                        0, 0, 0);
-                std::string key2 = dirkey(ident, 2);
-                if ((pat = getTransPtr(key2))) 
-                {
-                    pat->add(ident2, 
-                             Amg::EigenTransformToCLHEP( Amg::Transform3D::Identity() ) );
-                } 
-                else 
-                {
-                    ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key2 );
-                }
-            }
-        }
+	if ((pat=getTransPtr(key))) 
+	{
+	  const auto iStation = m_sctid->station(ident);
+	  const auto iLayer = m_sctid->layer(ident); 
+      const auto iModuleEta = m_sctid->eta_module(ident);
+      const auto iModulePhi = m_sctid->phi_module(ident);
+	  int iModule = iModulePhi;
+	  if (iModuleEta < 0) iModule +=4;
+
+      const auto buildKey = [](auto iStation, auto iLayer, auto iModule) {
+          std::stringstream ss;
+          ss << iStation << iLayer << iModule; 
+          return ss.str();
+      };
+      
+      const auto key = buildKey(iStation, iLayer, iModule); 
+      if (not (m_alignment.find(key) == m_alignment.end())) {
+        const std::vector<double> c = m_alignment.value().find(key)->second;
+        ATH_MSG_VERBOSE("Applying correction for " << key);
+        ATH_MSG_VERBOSE(c[0] << " " << c[1] << " " << c[2] << " " << c[3] << " " << c[4] << " " << c[5]);
+        Amg::Translation3D newtranslation(c[0], c[1], c[2]);
+        Amg::Transform3D alignment = newtranslation * Amg::RotationMatrix3D::Identity();
+        alignment *= Amg::AngleAxis3D(c[5], Amg::Vector3D(0.,0.,1.));
+        alignment *= Amg::AngleAxis3D(c[4], Amg::Vector3D(0.,1.,0.));
+        alignment *= Amg::AngleAxis3D(c[3], Amg::Vector3D(1.,0.,0.));
+
+        pat->add(ident, Amg::EigenTransformToCLHEP(alignment));
+	  } else {
+        ATH_MSG_VERBOSE("No correction given for " << key);
+	  }
+	} 
+	else 
+	{
+	  ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key );
+	}
+	// add level 2 transform if needed - do this the first time a module
+	// for this level 3 key is seen
+	std::vector<std::string>::const_iterator ix=
+	  find(level2.begin(),level2.end(),key);
+	if (ix==level2.end()) 
+	{
+	  level2.push_back(key);
+	  // construct identifier of level 2 transform
+	  Identifier ident2;
+	  ident2=m_sctid->wafer_id(m_sctid->station(ident),
+	      m_sctid->layer(ident),
+	      0, 0, 0);
+	  std::string key2 = dirkey(ident, 2);
+	  if ((pat = getTransPtr(key2))) 
+	  {
+	    auto iStation = m_sctid->station(ident);
+	    auto iLayer = m_sctid->layer(ident);
+
+        const auto buildKey = [](auto iStation, auto iLayer) {
+            std::stringstream ss;
+            ss << iStation << iLayer; 
+            return ss.str();
+        };
+        
+        const auto key = buildKey(iStation, iLayer); 
+        if (not (m_alignment.find(key) == m_alignment.end())) {
+          const std::vector<double> c = m_alignment.value().find(key)->second;
+          ATH_MSG_VERBOSE("Applying correction for " << key);
+          ATH_MSG_VERBOSE(c[0] << " " << c[1] << " " << c[2] << " " << c[3] << " " << c[4] << " " << c[5]);
+          Amg::Translation3D newtranslation(c[0], c[1], c[2]);
+          Amg::Transform3D alignment = newtranslation * Amg::RotationMatrix3D::Identity();
+          alignment *= Amg::AngleAxis3D(c[5], Amg::Vector3D(0.,0.,1.));
+          alignment *= Amg::AngleAxis3D(c[4], Amg::Vector3D(0.,1.,0.));
+          alignment *= Amg::AngleAxis3D(c[3], Amg::Vector3D(1.,0.,0.));
+
+	      pat->add(ident2, Amg::EigenTransformToCLHEP(alignment));
+	    } else {
+          ATH_MSG_VERBOSE("No correction given for " << key);
+	    }
+	  } 
+	  else 
+	  {
+	    ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key2 );
+	  }
+	}
       }
     }
+  }
 
-    // create the global object with positions for the stations
-    Identifier ident1;
-    std::string key1 = dirkey(ident1, 1);
-    if ((pat = getTransPtr(key1))) 
-    {
-        Amg::Transform3D globshift;
-        globshift.setIdentity();
-        for (int station : m_stations)
-        {
-          ident1 = m_sctid->wafer_id(station, 0, 0, 0, 0);
-          pat->add(ident1, Amg::EigenTransformToCLHEP(globshift));
-        }
-    } 
-    else
+  // create the global object with positions for the stations
+  Identifier ident1;
+  std::string key1 = dirkey(ident1, 1);
+  if ((pat = getTransPtr(key1))) 
+  {
+    //	Amg::Translation3D translation(0.1,0.2,0.3);
+    //Amg::Transform3D globshift=translation*Amg::RotationMatrix3D::Identity();
+    //std::cout<<"rotation"<<std::endl;
+    //std::cout<<globshift.rotation()(0,0)<<" , "<<globshift.rotation()(1,1)<<" , "<<globshift.rotation()(2,2)<<std::endl;
+    //std::cout<<"translation"<<std::endl;
+    //std::cout<<globshift.translation()(0,0)<<" , "<<globshift.translation()(1,1)<<" , "<<globshift.translation()(2,2)<<std::endl;
+    Amg::Transform3D globshift;
+    globshift.setIdentity();
+    for (int station : m_stations)
     {
-        ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key1 );
-    } 
+      ident1 = m_sctid->wafer_id(station, 0, 0, 0, 0);
+      pat->add(ident1, Amg::EigenTransformToCLHEP(globshift));
+    }
+  } 
+  else
+  {
+    ATH_MSG_ERROR( "Cannot retrieve AlignableTransform for key " << key1 );
+  } 
 
-    // sort the created objects (in case, usually come out sorted from GeoModel)
-    ATH_CHECK(sortTrans());
-    // list out size of all created objects
-    ATH_MSG_DEBUG( "Dumping size of created AlignableTransform objects");
-    for (unsigned int i = 0; i < m_alignobjs.size(); ++i)
-        if ((pat = getTransPtr(m_alignobjs[i]))) pat->print();
+  // sort the created objects (in case, usually come out sorted from GeoModel)
+  ATH_CHECK(sortTrans());
+  // list out size of all created objects
+  ATH_MSG_DEBUG( "Dumping size of created AlignableTransform objects");
+  for (unsigned int i = 0; i < m_alignobjs.size(); ++i)
+    if ((pat = getTransPtr(m_alignobjs[i]))) pat->print();
 
-    return StatusCode::SUCCESS;
+  return StatusCode::SUCCESS;
 }
 
 bool TrackerAlignDBTool::idToDetSet(const Identifier ident, int& station,
-          int& layer, int& eta, int& phi, int& side) const 
+    int& layer, int& eta, int& phi, int& side) const 
 {
   // transform Identifier to list of integers specifiying station,layer
   // eta, phi, side
@@ -280,7 +338,7 @@ bool TrackerAlignDBTool::idToDetSet(const Identifier ident, int& station,
 }
 
 std::string TrackerAlignDBTool::dirkey(const Identifier& ident,
-             const int level) const 
+    const int level) const 
 {
   // given SCT identifier, and level (1, 2 or 3) return
   // directory key name for associated alignment data
@@ -290,9 +348,9 @@ std::string TrackerAlignDBTool::dirkey(const Identifier& ident,
 }
 
 std::string TrackerAlignDBTool::dirkey(const int station, 
-                                     const int layer, 
-                                     const int level, 
-                                     const int ) const 
+    const int layer, 
+    const int level, 
+    const int ) const 
 {
   // channel info and level (1,2 or 3) return
   // directory key name for associated alignment data
@@ -307,17 +365,17 @@ std::string TrackerAlignDBTool::dirkey(const int station,
   {
     result << m_par_dbkey << "/" ;
   }
-  
+
   if (level==1) {
     result << "Stations";
   } else {
     if (level==2) result << "Planes";
     if (level==3) {
-        if (station == 3 ) result << "Downstream";
-        if (station == 2 ) result << "Central";
-        if (station == 1 ) result << "Upstream";
-        if (station == 0 ) result << "Interface";
-        result << 1+layer;
+      if (station == 3 ) result << "Downstream";
+      if (station == 2 ) result << "Central";
+      if (station == 1 ) result << "Upstream";
+      if (station == 0 ) result << "Interface";
+      result << 1+layer;
     }
   }
   return result.str();
@@ -327,7 +385,7 @@ std::string TrackerAlignDBTool::dirkey(const int station,
 //                                  const int layer,const int ring, const int sector,
 //                                  const float rphidisp, const float rdisp, const float zdisp, 
 //                                  const int syst, const int level, const int skip) const {
- 
+
 //   ATH_MSG_DEBUG( "dispGroup called: level " << level << " syst " << syst);
 //   int nmod=0;
 //   // random number service
@@ -438,7 +496,7 @@ std::string TrackerAlignDBTool::dirkey(const int station,
 //             }
 //             // update, adding to any existing shift
 //             if (update) {
-            
+
 //               Amg::Transform3D shift =   Amg::Translation3D(xd,yd,zd) * Amg::RotationMatrix3D::Identity(); 
 //               pat->tweak(ident2,Amg::EigenTransformToCLHEP(shift));
 //               ATH_MSG_VERBOSE( "Updated module " << mdet << "," << mbec 
@@ -495,13 +553,13 @@ std::string TrackerAlignDBTool::dirkey(const int station,
 // bool InDetAlignDBTool::setTrans(const Identifier& ident, const int level,
 //         const Amg::Vector3D& translate, double alpha, double beta, double gamma) const
 // {
-  
+
 //   Amg::Translation3D  newtranslation(translate);    
 //   Amg::Transform3D newtrans = newtranslation * Amg::RotationMatrix3D::Identity();
 //   newtrans *= Amg::AngleAxis3D(gamma, Amg::Vector3D(0.,0.,1.));
 //   newtrans *= Amg::AngleAxis3D(beta, Amg::Vector3D(0.,1.,0.));
 //   newtrans *= Amg::AngleAxis3D(alpha, Amg::Vector3D(1.,0.,0.));
-  
+
 //   return setTrans(ident, level,  newtrans);
 // }
 
@@ -543,13 +601,13 @@ std::string TrackerAlignDBTool::dirkey(const int station,
 // bool InDetAlignDBTool::tweakTrans(const Identifier& ident, const int level,
 //           const Amg::Vector3D& translate, double alpha, double beta, double gamma) const
 // {
-  
+
 //   Amg::Translation3D  newtranslation(translate);    
 //   Amg::Transform3D newtrans = newtranslation * Amg::RotationMatrix3D::Identity();
 //   newtrans *= Amg::AngleAxis3D(gamma, Amg::Vector3D(0.,0.,1.));
 //   newtrans *= Amg::AngleAxis3D(beta, Amg::Vector3D(0.,1.,0.));
 //   newtrans *= Amg::AngleAxis3D(alpha, Amg::Vector3D(1.,0.,0.));
-  
+
 //   return tweakTrans(ident, level, newtrans);
 // }
 
@@ -586,7 +644,7 @@ std::string TrackerAlignDBTool::dirkey(const int station,
 
 // /** get cumulative L1, L2, L3 trafo for (L3-) module */
 // Amg::Transform3D InDetAlignDBTool::getTransL123( const Identifier& ident ) const {
- 
+
 //   Amg::Transform3D result ;
 //   InDetDD::SiDetectorElement* element = m_pixman->getDetectorElement( ident ) ;
 //   if( !element ) {
@@ -623,14 +681,14 @@ std::string TrackerAlignDBTool::dirkey(const int station,
 // }
 
 StatusCode TrackerAlignDBTool::outputObjs() const {
-  
+
   ATH_MSG_DEBUG( "Output AlignableTranform objects to stream" << m_outputTool );
   // get the AthenaOutputStream tool
-//   IAthenaOutputStreamTool* optool {nullptr};
+  //   IAthenaOutputStreamTool* optool {nullptr};
+
+  //   ATH_CHECK(p_toolsvc->retrieveTool("AthenaOutputStreamTool", m_par_condstream, optool));
 
-//   ATH_CHECK(p_toolsvc->retrieveTool("AthenaOutputStreamTool", m_par_condstream, optool));
-  
-//   ATH_CHECK(optool->connectOutput("myAlignFile.pool.root"));
+  //   ATH_CHECK(optool->connectOutput("myAlignFile.pool.root"));
   ATH_CHECK(m_outputTool->connectOutput());
 
   // construct list of objects to be written out, either 
@@ -638,13 +696,13 @@ StatusCode TrackerAlignDBTool::outputObjs() const {
   int npairs=1;
   IAthenaOutputStreamTool::TypeKeyPairs typekeys(npairs);
   typekeys[0]=
-      IAthenaOutputStreamTool::TypeKeyPair("AlignableTransformContainer",
-             m_par_dbroot);
+    IAthenaOutputStreamTool::TypeKeyPair("AlignableTransformContainer",
+	m_par_dbroot);
   if (!(detStore()->contains<AlignableTransformContainer>(m_par_dbroot)))
     ATH_MSG_ERROR(
-        "Expected " << m_par_dbroot << " object not found" );
+	"Expected " << m_par_dbroot << " object not found" );
   // write objects to stream
-//   ATH_CHECK(optool->streamObjects(typekeys, "myAlignFile.pool.root"));
+  //   ATH_CHECK(optool->streamObjects(typekeys, "myAlignFile.pool.root"));
   ATH_CHECK(m_outputTool->streamObjects(typekeys));
 
   // commit output
@@ -654,10 +712,10 @@ StatusCode TrackerAlignDBTool::outputObjs() const {
 }
 
 StatusCode TrackerAlignDBTool::fillDB(const std::string tag, 
-            const unsigned int run1, const unsigned int event1,
-            const unsigned int run2, const unsigned int event2) const 
+    const unsigned int run1, const unsigned int event1,
+    const unsigned int run2, const unsigned int event2) const 
 {
-  
+
   ATH_MSG_DEBUG( "fillDB: Data tag " << tag );
   ATH_MSG_DEBUG( "Run/evt1 [" << run1 << "," << event1 << "]" );
   ATH_MSG_DEBUG( "Run/evt2 [" << run2 << "," << event2 << "]" );
@@ -669,7 +727,7 @@ StatusCode TrackerAlignDBTool::fillDB(const std::string tag,
   // loop over all AlignableTransform objects created earlier and save them
 
   ATH_CHECK(regsvc->registerIOV(
-             "AlignableTransformContainer",m_par_dbroot, tag, run1, run2, event1, event2));
+	"AlignableTransformContainer",m_par_dbroot, tag, run1, run2, event1, event2));
 
   ATH_MSG_DEBUG( "Stored AlignableTransform object " << m_par_dbroot );
   ATH_MSG_DEBUG( " Wrote one AlignableTransformContainer objects to conditions database" );
@@ -678,12 +736,12 @@ StatusCode TrackerAlignDBTool::fillDB(const std::string tag,
 
 StatusCode TrackerAlignDBTool::printDB(const int level) const 
 {
-  
+
   ATH_MSG_DEBUG("Printout TrackerAlign database contents, detail level" << level );
 
   for (std::vector<std::string>::const_iterator iobj = m_alignobjs.begin();
-       iobj != m_alignobjs.end();
-       ++iobj) 
+      iobj != m_alignobjs.end();
+      ++iobj) 
   {
     const AlignableTransform* pat;
     if ((pat = cgetTransPtr(*iobj))) 
@@ -691,31 +749,31 @@ StatusCode TrackerAlignDBTool::printDB(const int level) const
       ATH_MSG_DEBUG( "AlignableTransform object " << *iobj );
       int nobj = 0;
       for (AlignableTransform::AlignTransMem_citr cit = pat->begin();
-        cit!=pat->end();
-        ++cit) 
+	  cit!=pat->end();
+	  ++cit) 
       {
-        const Identifier& ident = cit->identify();
-        const Amg::Transform3D& trans = Amg::CLHEPTransformToEigen( cit->transform() );
-        Amg::Vector3D shift = trans.translation();
-        //Amg::RotationMatrix3D rot=trans.rotation();
-        int station, layer, eta, phi, side;
-        if (idToDetSet(ident, station, layer, eta, phi, side)) 
-        {
-          if (level > 1) 
-          {
-            double alpha, beta, gamma;
-            extractAlphaBetaGamma(trans, alpha, beta, gamma);
-            ATH_MSG_DEBUG( "Tracker [" << station << "," << layer << 
-                              "," << eta << "," << phi << "," << side << "] Trans:(" <<
-                                shift.x() << "," << shift.y() << "," << shift.z() << ") Rot:{"
-                                << alpha << "," << beta << "," << gamma << "}");
-          }
-          ++nobj;
-        } 
-        else 
-        {
-          ATH_MSG_ERROR("Unknown identifier in AlignableTransform" );
-        }
+	const Identifier& ident = cit->identify();
+	const Amg::Transform3D& trans = Amg::CLHEPTransformToEigen( cit->transform() );
+	Amg::Vector3D shift = trans.translation();
+	//Amg::RotationMatrix3D rot=trans.rotation();
+	int station, layer, eta, phi, side;
+	if (idToDetSet(ident, station, layer, eta, phi, side)) 
+	{
+	  if (level > 1) 
+	  {
+	    double alpha, beta, gamma;
+	    extractAlphaBetaGamma(trans, alpha, beta, gamma);
+	    ATH_MSG_DEBUG( "Tracker [" << station << "," << layer << 
+		"," << eta << "," << phi << "," << side << "] Trans:(" <<
+		shift.x() << "," << shift.y() << "," << shift.z() << ") Rot:{"
+		<< alpha << "," << beta << "," << gamma << "}");
+	  }
+	  ++nobj;
+	} 
+	else 
+	{
+	  ATH_MSG_ERROR("Unknown identifier in AlignableTransform" );
+	}
       }
       ATH_MSG_DEBUG( "Object contains " << nobj << " transforms" );
     } 
@@ -731,28 +789,28 @@ StatusCode TrackerAlignDBTool::printDB(const int level) const
 
 AlignableTransform* TrackerAlignDBTool::getTransPtr(const std::string key) 
   const {
-  // look in collection to retrieve pointer to AlignableTransform object of 
-  // given key and return it, return 0 if not collection or key value not found
-  AlignableTransformContainer* patc;
-  AlignableTransform* pat {nullptr};
+    // look in collection to retrieve pointer to AlignableTransform object of 
+    // given key and return it, return 0 if not collection or key value not found
+    AlignableTransformContainer* patc;
+    AlignableTransform* pat {nullptr};
 
-  if(detStore()->retrieve(patc,m_par_dbroot ).isFailure())
-  {
+    if(detStore()->retrieve(patc,m_par_dbroot ).isFailure())
+    {
       ATH_MSG_ERROR("Unable to retrieve alignment container from DetStore.");
       return nullptr;
-  }
+    }
 
-  for (DataVector<AlignableTransform>::iterator dva=patc->begin();
-            dva!=patc->end();++dva) 
-  {
-    if ((*dva)->tag()==key) 
+    for (DataVector<AlignableTransform>::iterator dva=patc->begin();
+	dva!=patc->end();++dva) 
     {
-        pat=*dva;
-        break;
+      if ((*dva)->tag()==key) 
+      {
+	pat=*dva;
+	break;
+      }
     }
+    return pat;
   }
-  return pat;
-}
 
 const AlignableTransform* TrackerAlignDBTool::cgetTransPtr(const std::string key) const 
 {
@@ -764,18 +822,18 @@ const AlignableTransform* TrackerAlignDBTool::cgetTransPtr(const std::string key
 
   if(detStore()->retrieve(patc, m_par_dbroot ).isFailure())
   {
-      ATH_MSG_ERROR("Unable to retrieve alignment container from DetStore.");
-      return nullptr;
+    ATH_MSG_ERROR("Unable to retrieve alignment container from DetStore.");
+    return nullptr;
   }
 
   for (DataVector<AlignableTransform>::const_iterator dva=patc->begin();
-            dva!=patc->end(); 
-            ++dva) 
+      dva!=patc->end(); 
+      ++dva) 
   {
     if ((*dva)->tag() == key) 
     {
-          pat=*dva;
-          break;
+      pat=*dva;
+      break;
     }
   }
   return pat;
@@ -784,7 +842,7 @@ const AlignableTransform* TrackerAlignDBTool::cgetTransPtr(const std::string key
 StatusCode TrackerAlignDBTool::sortTrans() const 
 {
   // loop through all the AlignableTransform objects and sort them
-  
+
   ATH_MSG_DEBUG( "Sorting all AlignableTransforms in TDS" );
   AlignableTransform* pat;
   // use cget and a const cast to allow containers that have been read in
@@ -796,7 +854,7 @@ StatusCode TrackerAlignDBTool::sortTrans() const
 }
 
 void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans, 
-               double& alpha, double& beta, double &gamma) const 
+    double& alpha, double& beta, double &gamma) const 
 {
   double siny = trans(0,2);
   beta = asin(siny);
@@ -832,14 +890,14 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans,
 //   idToDetSet(ident,det,bec,layer,ring,sector,side);
 //   const unsigned int DBident=det*10000+2*bec*1000+layer*100+ring*10+sector;  
 //   // so far not a very fancy DB identifier, but seems elaborate enough for this simple structure
-  
+
 //   if (StatusCode::SUCCESS==detStore()->retrieve(atrlistcol1,key)) {
 //     // loop over objects in collection                                    
 //     //atrlistcol1->dump();
 //     atrlistcol2 = const_cast<CondAttrListCollection*>(atrlistcol1);
 //     if (atrlistcol2!=0){
 //       for (CondAttrListCollection::const_iterator citr=atrlistcol2->begin(); citr!=atrlistcol2->end();++citr) {
-	
+
 // 	const coral::AttributeList& atrlist=citr->second;
 // 	coral::AttributeList& atrlist2  = const_cast<coral::AttributeList&>(atrlist);
 
@@ -865,7 +923,7 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans,
 // 	  oldtrans *= Amg::AngleAxis3D(atrlist2["Rz"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,0.,1.));
 // 	  oldtrans *= Amg::AngleAxis3D(atrlist2["Ry"].data<float>()*CLHEP::mrad, Amg::Vector3D(0.,1.,0.));
 // 	  oldtrans *= Amg::AngleAxis3D(atrlist2["Rx"].data<float>()*CLHEP::mrad, Amg::Vector3D(1.,0.,0.));
-	  
+
 // 	  // get the new transform
 // 	  Amg::Transform3D newtrans = trans*oldtrans;
 
@@ -880,7 +938,7 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans,
 // 	  atrlist2["Rx"].data<float>() = alpha/CLHEP::mrad ;
 // 	  atrlist2["Ry"].data<float>() = beta/CLHEP::mrad ;
 // 	  atrlist2["Rz"].data<float>() = gamma/CLHEP::mrad ;
-	  
+
 // 	  result = true;
 // 	  msg(MSG::DEBUG) << "Tweak New global DB -- channel: " << citr->first
 //                           << " ,det: "    << atrlist2["det"].data<int>()
@@ -894,7 +952,7 @@ void TrackerAlignDBTool::extractAlphaBetaGamma(const Amg::Transform3D & trans,
 //                           << " ,Rx: "     << atrlist2["Rx"].data<float>()
 //                           << " ,Ry: "     << atrlist2["Ry"].data<float>()
 //                           << " ,Rz: "     << atrlist2["Rz"].data<float>() << endmsg;
-	  
+
 // 	}	
 //       }
 //     }
diff --git a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h
index 2c82c20a10baffab0b01d6c00af036b6adabaa11..6ee1a190427d31b683aa946fe54726e8b04079ba 100644
--- a/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h
+++ b/Tracker/TrackerAlignTools/TrackerAlignGenTools/src/TrackerAlignDBTool.h
@@ -186,6 +186,8 @@ class TrackerAlignDBTool: virtual public ITrackerAlignDBTool, public AthAlgTool
   bool m_dynamicDB;
   bool m_forceUserDBConfig;
   std::set<int> m_stations;
+  Gaudi::Property<std::map<std::string, std::vector<double>>> m_alignment{ this, "AlignmentConstants", {}, "Alignment constants."};
+
   
   mutable  ToolHandle<IAthenaOutputStreamTool> m_outputTool { this, "OutputTool", "AthenaOutputStreamTool/CondStream1"} ;