diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3cba605b33ce3adcd9ad6a604170521570005156..0aef82debb458e44c3b9bfa1dceb4d2f79548bee 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -25,7 +25,7 @@ build_image:
     - mkdir build
     - cd build
     - set +e && source ${ATLAS_LOCAL_ROOT_BASE}/user/atlasLocalSetup.sh; set -e
-    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.40; set -e
+    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.49; set -e
     - cmake ../../calypso
     - make -j 3
   artifacts:
@@ -41,7 +41,7 @@ test_unittest:
     - yum -y install man
     - cd build
     - set +e && source ${ATLAS_LOCAL_ROOT_BASE}/user/atlasLocalSetup.sh; set -e
-    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.40; set -e 
+    - set +e && asetup --input=../../calypso/asetup.faser Athena,22.0.49; set -e 
     - set +e && source `find . -name 'setup.sh'`; set -e
     - ctest -j3
   dependencies:
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.cxx b/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.cxx
index 2ac860d86c8f3c42b3c5f1382f36e905bc17371c..6abec9240110bcc60b27a2afec12a9a7029fa242 100644
--- a/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.cxx
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.cxx
@@ -18,12 +18,16 @@ CaloHitCollection_PERS* CaloHitCollectionCnv::createPersistent(CaloHitCollection
 CaloHitCollection* CaloHitCollectionCnv::createTransient() {
     MsgStream mlog(msgSvc(), "CaloHitCollectionConverter" );
     CaloHitCollectionCnv_p1   converter_p1;
+    CaloHitCollectionCnv_p1a   converter_p1a;
 
     static const pool::Guid   p1_guid("134E8045-AB99-43EF-9AD1-324C48830B64");
-    // static const pool::Guid   p1_guid("B2573A16-4B46-4E1E-98E3-F93421680779");
+    static const pool::Guid   p1a_guid("02C108EE-0AD9-4444-83BD-D5273FCDEF6F");
 
     CaloHitCollection       *trans_cont(0);
-    if( this->compareClassGuid(p1_guid)) {
+    if( this->compareClassGuid(p1a_guid)) {
+      std::unique_ptr< CaloHitCollection_p1a >   col_vect( this->poolReadObject< CaloHitCollection_p1a >() );
+      trans_cont = converter_p1a.createTransient( col_vect.get(), mlog );
+    } else if( this->compareClassGuid(p1_guid)) {
       std::unique_ptr< CaloHitCollection_p1 >   col_vect( this->poolReadObject< CaloHitCollection_p1 >() );
       trans_cont = converter_p1.createTransient( col_vect.get(), mlog );
     }  else {
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.h b/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.h
index b46894c5ffe1f96fe91451b9206269b2f8e44b53..1de7cc3e08b9d75f340646ee1c4007e78211a6bb 100644
--- a/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.h
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventAthenaPool/src/CaloHitCollectionCnv.h
@@ -8,12 +8,14 @@
 #include "FaserCaloSimEvent/CaloHitCollection.h"
 #include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1.h"
 #include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1.h"
+#include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1a.h"
+#include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1a.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h"
 // Gaudi
 #include "GaudiKernel/MsgStream.h"
 // typedef to the latest persistent version
-typedef CaloHitCollection_p1     CaloHitCollection_PERS;
-typedef CaloHitCollectionCnv_p1  CaloHitCollectionCnv_PERS;
+typedef CaloHitCollection_p1a     CaloHitCollection_PERS;
+typedef CaloHitCollectionCnv_p1a  CaloHitCollectionCnv_PERS;
 
 class CaloHitCollectionCnv  : public T_AthenaPoolCustomCnv<CaloHitCollection, CaloHitCollection_PERS > {
   friend class CnvFactory<CaloHitCollectionCnv>;
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/CMakeLists.txt b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/CMakeLists.txt
index dbbd1a372aa26fde66a58aee80ce3bf30f758812..ef770c2b59d440fe41bc1c63893f49ecd0d49439 100644
--- a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/CMakeLists.txt
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/CMakeLists.txt
@@ -22,5 +22,5 @@ atlas_add_dictionary( FaserCaloSimEventTPCnvDict
                       FaserCaloSimEventTPCnv/CaloSimEventTPCnvDict.h
                       FaserCaloSimEventTPCnv/selection.xml
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv FaserCaloSimEvent TestTools StoreGateLib SGtests Identifier FaserCaloSimEventTPCnv )
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv FaserCaloSimEvent TestTools StoreGateLib SGtests Identifier FaserCaloSimEventTPCnv AthenaKernel)
 
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1a.h b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1a.h
new file mode 100644
index 0000000000000000000000000000000000000000..80534aae7aaff3b32ca4bb1aff9105296859e05a
--- /dev/null
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1a.h
@@ -0,0 +1,41 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef CALOHITCOLLECTIONCNV_P1A_H
+#define CALOHITCOLLECTIONCNV_P1A_H
+
+// CaloHitCollectionCnv_p1, T/P separation of Calo Hits
+// author D.Costanzo <davide.costanzo@cern.ch>
+// author O.Arnaez <olivier.arnaez@cern.ch>
+
+#include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
+#include "FaserCaloSimEvent/CaloHitCollection.h"
+#include "CaloHitCollection_p1a.h"
+
+
+class CaloHitCollectionCnv_p1a : public T_AthenaPoolTPCnvBase<CaloHitCollection, CaloHitCollection_p1a>
+{
+ public:
+
+  CaloHitCollectionCnv_p1a()  {};
+
+  virtual CaloHitCollection* createTransient(const CaloHitCollection_p1a* persObj, MsgStream &log);
+
+  virtual void	persToTrans(const CaloHitCollection_p1a* persCont,
+                            CaloHitCollection* transCont,
+                            MsgStream &log) ;
+  virtual void	transToPers(const CaloHitCollection* transCont,
+                            CaloHitCollection_p1a* persCont,
+                            MsgStream &log) ;
+
+ private:
+
+  static const double m_persEneUnit;
+  static const double m_persLenUnit;
+  static const double m_persAngUnit;
+  static const double m_2bHalfMaximum;
+  static const int m_2bMaximum;
+};
+
+#endif
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1a.h b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1a.h
new file mode 100644
index 0000000000000000000000000000000000000000..7dc511d9d281c6223c6a6209f0b6778ddb399703
--- /dev/null
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1a.h
@@ -0,0 +1,59 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef CALOHITCOLLECTION_P1A_H
+#define CALOHITCOLLECTION_P1A_H
+
+/*
+
+Authors: Davide Costanzo Rob Duxfield
+Modified for FASER by D. Casper - change internal unsigned short counters to unsigned long
+p2, p3, etc reserved for possible future ATLAS changes
+
+*/
+
+#include <vector>
+#include <string>
+
+class CaloHitCollection_p1a
+{
+ public:
+/// Default constructor
+  CaloHitCollection_p1a ();
+  //private:
+
+  std::vector<float>          m_hit1_meanTime;   //  1 element per string
+  std::vector<float>          m_hit1_x0;         //
+  std::vector<float>          m_hit1_y0;         //
+  std::vector<float>          m_hit1_z0;         //
+  std::vector<float>          m_hit1_theta;      //
+  std::vector<float>          m_hit1_phi;        //
+  std::vector<unsigned long>  m_nHits;           //
+
+  std::vector<unsigned short> m_hitEne_2b;       //  1 element per hit
+  std::vector<unsigned short> m_hitLength_2b;    //
+
+  std::vector<unsigned short> m_dTheta;          //  1 element per hit except for first hit in string
+  std::vector<unsigned short> m_dPhi;            //
+
+  std::vector<float>          m_hitEne_4b;       //  1 element per hit with  m_hitEne_2b[i] == 2**16
+
+  std::vector<float>          m_hitLength_4b;    //  1 element per hit with  m_hitLength_2b[i] == 2**16
+
+  std::vector<unsigned long>  m_barcode;
+  std::vector<unsigned long>  m_mcEvtIndex;
+  std::vector<char>           m_evtColl;
+  std::vector<unsigned long>  m_nBC;
+
+  std::vector<unsigned long>  m_id;
+  std::vector<unsigned long>  m_nId;
+};
+
+
+// inlines
+
+inline
+CaloHitCollection_p1a::CaloHitCollection_p1a () {}
+
+#endif
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloSimEventTPCnvDict.h b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloSimEventTPCnvDict.h
index 80937ffc825a51c8dc4611a559507fcd0e7e30b5..de24c20ac134a200e6de30114da8ea2d2ed56210 100644
--- a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloSimEventTPCnvDict.h
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/CaloSimEventTPCnvDict.h
@@ -15,6 +15,8 @@
 #include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCnv_p1.h"
 #include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1.h"
 #include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1.h"
+#include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1a.h"
+#include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1a.h"
 #include "FaserCaloSimEventTPCnv/CaloHits/CaloHit_p1.h"
 
 #endif // CALOEVENTTPCNV_CALOSIMEVENTTPCNVDICT_H
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/selection.xml b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/selection.xml
index d73b5ce1a258bce7766b3278358530e5a99b4fbc..e90551988f46845a79383bb3ec830265715ea73e 100644
--- a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/selection.xml
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/FaserCaloSimEventTPCnv/selection.xml
@@ -4,4 +4,6 @@
     <class name="CaloHit_p1" />
     <class name="std::vector<CaloHit_p1>" />
     <class name="CaloHitCollection_p1" id="134E8045-AB99-43EF-9AD1-324C48830B64" />     
+    <class name="CaloHitCollection_p1a" id="02C108EE-0AD9-4444-83BD-D5273FCDEF6F" />     
+
 </lcgdict>
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/src/CaloHits/CaloHitCollectionCnv_p1.cxx b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/src/CaloHits/CaloHitCollectionCnv_p1.cxx
index c54f8765abfcbeda9b8c72b67717608c9c8b21ef..0568ff080b1e634023284128efdd7909dbc85af2 100644
--- a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/src/CaloHits/CaloHitCollectionCnv_p1.cxx
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/src/CaloHits/CaloHitCollectionCnv_p1.cxx
@@ -14,7 +14,10 @@
 #include "CLHEP/Geometry/Point3D.h"
 // Gaudi
 #include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+
 // Athena
+#include "AthenaKernel/ExtendedEventContext.h"
 #include "StoreGate/StoreGateSvc.h"
 
 //  * * *  stolen from eflowRec  * * *  //
@@ -60,7 +63,7 @@ const double CaloHitCollectionCnv_p1::m_2bHalfMaximum = pow(2.0, 15.0);
 const int CaloHitCollectionCnv_p1::m_2bMaximum = (unsigned short)(-1);
 
 
-void CaloHitCollectionCnv_p1::transToPers(const CaloHitCollection* transCont, CaloHitCollection_p1* persCont, MsgStream &/*log*/)
+void CaloHitCollectionCnv_p1::transToPers(const CaloHitCollection* transCont, CaloHitCollection_p1* persCont, MsgStream &log)
 {
   // Finds hits belonging to a "string" (in which the end point of one hit is the same as the start point of the next) and
   // persistifies the end point of each hit plus the start point of the first hit in each string.
@@ -77,6 +80,8 @@ void CaloHitCollectionCnv_p1::transToPers(const CaloHitCollection* transCont, Ca
   static const double dRcut = 1.0e-7;
   static const double dTcut = 1.0;
 
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+  const IProxyDict* proxy = Atlas::getExtendedEventContext(ctx).proxy();
   const HepMcParticleLink * lastLink=nullptr;
   int lastId = -1;
   double stringFirstTheta = 0.0;
@@ -98,11 +103,23 @@ void CaloHitCollectionCnv_p1::transToPers(const CaloHitCollection* transCont, Ca
 
     if ( !lastLink || (siHit->particleLink() != *lastLink) ) {
 
-      // store barcode once for set of consecutive hits with same barcode
+      // store barcode, eventIndex and McEventCollection once for set of consecutive hits with same barcode
 
       lastLink = &(siHit->particleLink());
       persCont->m_barcode.push_back(lastLink->barcode());
-      persCont->m_mcEvtIndex.push_back(lastLink->eventIndex());
+      log << MSG::ALWAYS << "TP: Event collection from link: " << lastLink->getEventCollection() << " ; char value: " << lastLink->getEventCollectionAsChar() << " barcode: " << lastLink->barcode() << endmsg;
+      unsigned short index{0};
+      const HepMcParticleLink::index_type position =
+        HepMcParticleLink::getEventPositionInCollection(lastLink->eventIndex(),
+                                                        lastLink->getEventCollection(),
+                                                        proxy).at(0);
+      if (position!=0) {
+        index = lastLink->eventIndex();
+        if(lastLink->eventIndex()!=static_cast<HepMcParticleLink::index_type>(index)) {
+          log << MSG::WARNING << "Attempting to persistify an eventIndex larger than max unsigned short!" << endmsg;
+        }
+      }
+      persCont->m_mcEvtIndex.push_back(index);
       persCont->m_evtColl.push_back(lastLink->getEventCollectionAsChar());
 
       if (idx > 0) {
@@ -238,18 +255,29 @@ void CaloHitCollectionCnv_p1::transToPers(const CaloHitCollection* transCont, Ca
   persCont->m_nBC.push_back(idx - endBC);
   persCont->m_nId.push_back(idx - endId);
   persCont->m_nHits.push_back(idx - endHit);
+
+  log << MSG::ALWAYS << "nBC: " << persCont->m_nBC << endmsg;
+  log << MSG::ALWAYS << "nId: " << persCont->m_nId << endmsg;
+  log << MSG::ALWAYS << "nHits:" << persCont->m_nHits << endmsg;
 }
 
 
 CaloHitCollection* CaloHitCollectionCnv_p1::createTransient(const CaloHitCollection_p1* persObj, MsgStream &log) {
+  for (size_t i = 0; i < persObj->m_evtColl.size(); i++)
+  {
+    if (persObj->m_evtColl[i] != 'a')
+      log << MSG::ALWAYS << "Corrupted in createTransient: " << persObj->m_evtColl[i] << endmsg;
+  }
   std::unique_ptr<CaloHitCollection> trans(std::make_unique<CaloHitCollection>("DefaultCollectionName",persObj->m_nHits.size()));
   persToTrans(persObj, trans.get(), log);
   return(trans.release());
 }
 
 
-void CaloHitCollectionCnv_p1::persToTrans(const CaloHitCollection_p1* persCont, CaloHitCollection* transCont, MsgStream &/*log*/)
+void CaloHitCollectionCnv_p1::persToTrans(const CaloHitCollection_p1* persCont, CaloHitCollection* transCont, MsgStream &log)
 {
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+
   unsigned int hitCount = 0;
   unsigned int angleCount = 0;
   unsigned int idxBC = 0;
@@ -260,12 +288,15 @@ void CaloHitCollectionCnv_p1::persToTrans(const CaloHitCollection_p1* persCont,
   unsigned int endBC = 0;
   unsigned int endId = 0;
 
+  log << MSG::ALWAYS << "nHits.size(): " << persCont->m_nHits.size() << " nBC.size(): " << persCont->m_nBC.size() << endmsg;
+  log << MSG::ALWAYS << " nBC: " << persCont->m_nBC << endmsg;
+
   for (unsigned int i = 0; i < persCont->m_nHits.size(); i++) {
 
     if (persCont->m_nHits[i]) {
-
       const unsigned int start = endHit;
       endHit += persCont->m_nHits[i];
+      log << MSG::ALWAYS << "i: " << i << " persCont->m_nHits[i]: " << persCont->m_nHits[i] << " start: " << start << " endHit: " << endHit << endmsg;
 
       const double t0 = persCont->m_hit1_meanTime[i];
       const double theta0 = persCont->m_hit1_theta[i];
@@ -273,7 +304,6 @@ void CaloHitCollectionCnv_p1::persToTrans(const CaloHitCollection_p1* persCont,
       HepGeom::Point3D<double> endLast(persCont->m_hit1_x0[i], persCont->m_hit1_y0[i], persCont->m_hit1_z0[i]);
 
       for (unsigned int j = start; j < endHit; j++) {
-
         if (j >= endBC + persCont->m_nBC[idxBC])
           endBC += persCont->m_nBC[idxBC++];
 
@@ -299,7 +329,13 @@ void CaloHitCollectionCnv_p1::persToTrans(const CaloHitCollection_p1* persCont,
 
         HepGeom::Point3D<double> endThis( endLast + r );
 
-        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), HepMcParticleLink::IS_INDEX );
+        HepMcParticleLink::PositionFlag flag = HepMcParticleLink::IS_INDEX;
+        if (persCont->m_mcEvtIndex[idxBC] == 0) {
+          flag = HepMcParticleLink::IS_POSITION;
+        }
+        log << MSG::ALWAYS << "PT: Event collection from persCont: " << persCont->m_evtColl[idxBC] << " ; idxBC: " << idxBC << " evtColl.size(): " << persCont->m_evtColl.size() << " evtIndex.size(): " << persCont->m_mcEvtIndex.size() << endmsg;
+
+        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), flag, ctx );
         transCont->Emplace( endLast, endThis, eneLoss, meanTime, partLink, persCont->m_id[idxId]);
 
         endLast = endThis;
@@ -309,4 +345,5 @@ void CaloHitCollectionCnv_p1::persToTrans(const CaloHitCollection_p1* persCont,
       }
     }
   }
+  log << MSG::ALWAYS << "hitCount: " << hitCount << endmsg;
 }
diff --git a/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/src/CaloHits/CaloHitCollectionCnv_p1a.cxx b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/src/CaloHits/CaloHitCollectionCnv_p1a.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d1d6ec53b9250c1b184c5b78f5af4b85711409bd
--- /dev/null
+++ b/Calorimeter/CaloEventCnv/FaserCaloSimEventTPCnv/src/CaloHits/CaloHitCollectionCnv_p1a.cxx
@@ -0,0 +1,339 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "FaserCaloSimEvent/CaloHit.h"
+#include "FaserCaloSimEvent/CaloHitCollection.h"
+#include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollection_p1a.h"
+#include "FaserCaloSimEventTPCnv/CaloHits/CaloHitCollectionCnv_p1a.h"
+#include "GeneratorObjects/HepMcParticleLink.h"
+
+#include <cmath>
+
+//CLHEP
+#include "CLHEP/Geometry/Point3D.h"
+// Gaudi
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+
+// Athena
+#include "AthenaKernel/ExtendedEventContext.h"
+#include "StoreGate/StoreGateSvc.h"
+
+//  * * *  stolen from eflowRec  * * *  //
+inline double phicorr(double a)
+{
+  if (a <= -M_PI)
+    {
+      return a+(2*M_PI*floor(-(a-M_PI)/(2*M_PI)));
+    }
+  else if (a > M_PI)
+    {
+      return a-(2*M_PI*floor((a+M_PI)/(2*M_PI)));
+    }
+  else
+    {
+      return a;
+    }
+}
+
+//  * * *  stolen from eflowRec  * * *  //
+inline double cycle(double a, double b)
+{
+  double del = b-a;
+  if (del > M_PI)
+    {
+      return a+2.0*M_PI;
+    }
+  else if (del < -M_PI)
+    {
+      return a-2.0*M_PI;
+    }
+  else
+    {
+      return a;
+    }
+}
+
+
+const double CaloHitCollectionCnv_p1a::m_persEneUnit = 1.0e-5;
+const double CaloHitCollectionCnv_p1a::m_persLenUnit = 1.0e-5;
+const double CaloHitCollectionCnv_p1a::m_persAngUnit = 1.0e-5;
+const double CaloHitCollectionCnv_p1a::m_2bHalfMaximum = pow(2.0, 15.0);
+const int CaloHitCollectionCnv_p1a::m_2bMaximum = (unsigned short)(-1);
+
+
+void CaloHitCollectionCnv_p1a::transToPers(const CaloHitCollection* transCont, CaloHitCollection_p1a* persCont, MsgStream &log)
+{
+  // Finds hits belonging to a "string" (in which the end point of one hit is the same as the start point of the next) and
+  // persistifies the end point of each hit plus the start point of the first hit in each string.
+  //
+  // Further compression is achieved by optimising the storage of the position vectors:- start (x,y,z) and (theta,phi) of
+  // first hit are stored as floats, (delta_theta,delta_phi) relative to the fisrst hit are stored as 2 byte numbers and
+  // used to specify the hit direction. All hit lengths are stored as 2 byte numbers.
+  //
+  // Additional savings are achieved by storing the energy loss for each hit as a 2 byte number and only storing the mean
+  // time of the first hit per string.
+  //
+  // See http://indico.cern.ch/getFile.py/access?contribId=11&resId=2&materialId=slides&confId=30893 for more info.
+
+  static const double dRcut = 1.0e-7;
+  static const double dTcut = 1.0;
+
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+  const IProxyDict* proxy = Atlas::getExtendedEventContext(ctx).proxy();
+  const HepMcParticleLink * lastLink=nullptr;
+  int lastId = -1;
+  double stringFirstTheta = 0.0;
+  double stringFirstPhi = 0.0;
+  double lastT = 0.0;
+  double persSumE = 0.0;
+  double transSumE = 0.0;
+  unsigned int idx = 0;
+  unsigned int endBC = 0;
+  unsigned int endId = 0;
+  unsigned int endHit = 0;
+  HepGeom::Point3D<double> lastTransEnd(0.0, 0.0, 0.0);
+  HepGeom::Point3D<double> lastPersEnd(0.0, 0.0, 0.0);
+
+  for (CaloHitCollection::const_iterator it = transCont->begin(); it != transCont->end(); ++it) {
+
+    CaloHitCollection::const_iterator siHit = it;
+
+
+    if ( !lastLink || (siHit->particleLink() != *lastLink) ) {
+
+      // store barcode, eventIndex and McEventCollection once for set of consecutive hits with same barcode
+
+      lastLink = &(siHit->particleLink());
+      persCont->m_barcode.push_back(lastLink->barcode());
+      unsigned short index{0};
+      const HepMcParticleLink::index_type position =
+        HepMcParticleLink::getEventPositionInCollection(lastLink->eventIndex(),
+                                                        lastLink->getEventCollection(),
+                                                        proxy).at(0);
+      if (position!=0) {
+        index = lastLink->eventIndex();
+        if(lastLink->eventIndex()!=static_cast<HepMcParticleLink::index_type>(index)) {
+          log << MSG::WARNING << "Attempting to persistify an eventIndex larger than max unsigned short!" << endmsg;
+        }
+      }
+      persCont->m_mcEvtIndex.push_back(index);
+      persCont->m_evtColl.push_back(lastLink->getEventCollectionAsChar());
+
+      if (idx > 0) {
+        persCont->m_nBC.push_back(idx - endBC);
+        endBC = idx;
+      }
+    }
+
+    if ( (int)siHit->identify() != lastId ) {
+
+      // store id once for set of consecutive hits with same barcode
+
+      lastId = siHit->identify();
+      persCont->m_id.push_back(lastId);
+
+      if (idx > 0) {
+        persCont->m_nId.push_back(idx - endId);
+        endId = idx;
+      }
+    }
+
+    HepGeom::Point3D<double> st = siHit->localStartPosition();
+    HepGeom::Point3D<double> en = siHit->localEndPosition();
+
+    const double dx = st.x() - lastTransEnd.x();
+    const double dy = st.y() - lastTransEnd.y();
+    const double dz = st.z() - lastTransEnd.z();
+    const double t = siHit->meanTime();
+
+    const double dRLast = sqrt(dx * dx + dy * dy + dz * dz);  // dR between end of previous hit and start of current one
+    const double dTLast = fabs(t - lastT);
+
+    CLHEP::Hep3Vector direction(0.0, 0.0, 0.0);
+    double theta = 0.0;
+    double phi = 0.0;
+    bool startNewString = false;
+
+    if (dRLast < dRcut && dTLast < dTcut) {
+
+      // hit is part of existing string
+
+      direction = CLHEP::Hep3Vector( en.x() - lastPersEnd.x(), en.y() - lastPersEnd.y(), en.z() - lastPersEnd.z() );
+
+      theta = direction.theta();
+      phi = phicorr( direction.phi() );
+
+      const int dTheta_2b = (int)( (theta - stringFirstTheta) / m_persAngUnit + m_2bHalfMaximum + 0.5 );
+      const int dPhi_2b = (int)( (cycle(phi, stringFirstPhi) - stringFirstPhi) / m_persAngUnit + m_2bHalfMaximum + 0.5 );
+
+      if ( dTheta_2b < m_2bMaximum && dTheta_2b >= 0 && dPhi_2b < m_2bMaximum && dPhi_2b >= 0) {
+        persCont->m_dTheta.push_back(dTheta_2b);
+        persCont->m_dPhi.push_back(dPhi_2b);
+        theta = stringFirstTheta + ( (double)dTheta_2b - m_2bHalfMaximum ) * m_persAngUnit;
+        phi = stringFirstPhi + ( (double)dPhi_2b - m_2bHalfMaximum ) * m_persAngUnit;
+        phi = phicorr(phi);
+      }
+      else {
+        startNewString = true;
+      }
+    }
+
+    if (startNewString || dRLast >= dRcut || dTLast >= dTcut) {
+
+      // begin new hit string
+
+      direction = CLHEP::Hep3Vector( en.x() - st.x(), en.y() - st.y(), en.z() - st.z() );
+
+      theta = direction.theta();
+      phi = phicorr( direction.phi() );
+
+      persCont->m_hit1_meanTime.push_back(t);
+      persCont->m_hit1_x0.push_back(st.x());
+      persCont->m_hit1_y0.push_back(st.y());
+      persCont->m_hit1_z0.push_back(st.z());
+      persCont->m_hit1_theta.push_back(theta);
+      persCont->m_hit1_phi.push_back(phi);
+
+      lastPersEnd = HepGeom::Point3D<double>(st.x(), st.y(), st.z());
+
+      stringFirstTheta = theta;
+      stringFirstPhi = phi;
+
+      if (idx > 0) {
+        persCont->m_nHits.push_back(idx - endHit);
+        endHit = idx;
+      }
+    }
+
+    lastTransEnd = HepGeom::Point3D<double>(en.x(), en.y(), en.z());
+    transSumE += siHit->energyLoss();
+
+    const int eneLoss_2b = (int)((transSumE - persSumE) / m_persEneUnit + 0.5);  // calculated to allow recovery sum over
+                                                                                 // whole hit string to chosen precision
+
+    const int hitLength_2b = (int)(direction.mag() / m_persLenUnit + 0.5);  // calculated to give the correct position to
+                                                                            // the chosen precision, NOT the length of the
+                                                                            // hit (small difference in practice).
+    double eneLoss = 0.0;
+
+    if (eneLoss_2b >= m_2bMaximum) {
+      eneLoss = siHit->energyLoss();
+      persCont->m_hitEne_2b.push_back(m_2bMaximum);
+      persCont->m_hitEne_4b.push_back(eneLoss);
+    }
+    else {
+      eneLoss = eneLoss_2b * m_persEneUnit;
+      persCont->m_hitEne_2b.push_back(eneLoss_2b);
+    }
+
+    double length = 0.0;
+
+    if (hitLength_2b >= m_2bMaximum) {
+      length = direction.mag();
+      persCont->m_hitLength_2b.push_back(m_2bMaximum);
+      persCont->m_hitLength_4b.push_back(direction.mag());
+    }
+    else {
+      length = hitLength_2b * m_persLenUnit;
+      persCont->m_hitLength_2b.push_back(hitLength_2b);
+    }
+
+    CLHEP::Hep3Vector persDir(length, 0.0, 0.0);
+    persDir.setTheta(theta);
+    persDir.setPhi(phi);
+
+    lastPersEnd = (CLHEP::Hep3Vector)lastPersEnd + persDir;
+    persSumE += eneLoss;
+    lastT = t;
+
+    ++idx;
+  }
+
+  persCont->m_nBC.push_back(idx - endBC);
+  persCont->m_nId.push_back(idx - endId);
+  persCont->m_nHits.push_back(idx - endHit);
+}
+
+
+CaloHitCollection* CaloHitCollectionCnv_p1a::createTransient(const CaloHitCollection_p1a* persObj, MsgStream &log) {
+  for (size_t i = 0; i < persObj->m_evtColl.size(); i++)
+  {
+    if (persObj->m_evtColl[i] != 'a')
+      log << MSG::ALWAYS << "Corrupted in createTransient: " << persObj->m_evtColl[i] << endmsg;
+  }
+  std::unique_ptr<CaloHitCollection> trans(std::make_unique<CaloHitCollection>("DefaultCollectionName",persObj->m_nHits.size()));
+  persToTrans(persObj, trans.get(), log);
+  return(trans.release());
+}
+
+
+void CaloHitCollectionCnv_p1a::persToTrans(const CaloHitCollection_p1a* persCont, CaloHitCollection* transCont, MsgStream &/*log*/)
+{
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+
+  unsigned int hitCount = 0;
+  unsigned int angleCount = 0;
+  unsigned int idxBC = 0;
+  unsigned int idxId = 0;
+  unsigned int idxEne4b = 0;
+  unsigned int idxLen4b = 0;
+  unsigned int endHit = 0;
+  unsigned int endBC = 0;
+  unsigned int endId = 0;
+
+
+  for (unsigned int i = 0; i < persCont->m_nHits.size(); i++) {
+
+    if (persCont->m_nHits[i]) {
+      const unsigned int start = endHit;
+      endHit += persCont->m_nHits[i];
+
+      const double t0 = persCont->m_hit1_meanTime[i];
+      const double theta0 = persCont->m_hit1_theta[i];
+      const double phi0 = persCont->m_hit1_phi[i];
+      HepGeom::Point3D<double> endLast(persCont->m_hit1_x0[i], persCont->m_hit1_y0[i], persCont->m_hit1_z0[i]);
+
+      for (unsigned int j = start; j < endHit; j++) {
+        if (j >= endBC + persCont->m_nBC[idxBC])
+          endBC += persCont->m_nBC[idxBC++];
+
+        if (j >= endId + persCont->m_nId[idxId])
+          endId += persCont->m_nId[idxId++];
+
+        const double eneLoss_2b = persCont->m_hitEne_2b[hitCount];
+        const double hitLength_2b = persCont->m_hitLength_2b[hitCount];
+
+        const double eneLoss = (eneLoss_2b < m_2bMaximum) ? eneLoss_2b * m_persEneUnit : persCont->m_hitEne_4b[idxEne4b++];
+        const double length = (hitLength_2b < m_2bMaximum) ? hitLength_2b * m_persLenUnit : persCont->m_hitLength_4b[idxLen4b++];
+
+        const double dTheta = (j > start) ? ((double)persCont->m_dTheta[angleCount] - m_2bHalfMaximum) * m_persAngUnit : 0.0;
+        const double dPhi = (j > start) ? ((double)persCont->m_dPhi[angleCount] - m_2bHalfMaximum) * m_persAngUnit : 0.0;
+
+        const double meanTime = t0;
+        const double theta = theta0 + dTheta;
+        const double phi = phicorr(phi0 + dPhi);
+
+        CLHEP::Hep3Vector r(length, 0.0, 0.0);
+        r.setTheta(theta);
+        r.setPhi(phi);
+
+        HepGeom::Point3D<double> endThis( endLast + r );
+
+        HepMcParticleLink::PositionFlag flag = HepMcParticleLink::IS_INDEX;
+        if (persCont->m_mcEvtIndex[idxBC] == 0) {
+          flag = HepMcParticleLink::IS_POSITION;
+        }
+
+        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), flag, ctx );
+        transCont->Emplace( endLast, endThis, eneLoss, meanTime, partLink, persCont->m_id[idxId]);
+
+        endLast = endThis;
+
+        ++hitCount;
+        if (j > start) ++angleCount;
+      }
+    }
+  }
+}
diff --git a/Calorimeter/CaloG4/EcalG4_SD/python/EcalG4_SDToolConfig.py b/Calorimeter/CaloG4/EcalG4_SD/python/EcalG4_SDToolConfig.py
index e679d7fca9c93e9341a87c61685f6bd2d9d00b6c..293f2057dd710cc2edb3f5cd29d049f619a127df 100644
--- a/Calorimeter/CaloG4/EcalG4_SD/python/EcalG4_SDToolConfig.py
+++ b/Calorimeter/CaloG4/EcalG4_SD/python/EcalG4_SDToolConfig.py
@@ -17,5 +17,7 @@ def EcalSensorSDCfg(ConfigFlags, name="EcalSensorSD", **kwargs):
     kwargs.setdefault("LogicalVolumeNames", ["Ecal::_dd_Geometry_DownstreamRegion_Ecal_Modules_OutCell"])
     kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    # result.merge(acc)
-    return result, EcalSensorSDTool(name, **kwargs)
+    result = ComponentAccumulator()
+    result.setPrivateTools(CompFactory.EcalSensorSDTool(name, **kwargs))
+    return result
+
diff --git a/Control/CalypsoExample/Reconstruction/scripts/submit_faser_reco.sh b/Control/CalypsoExample/Reconstruction/scripts/submit_faser_reco.sh
index 6bb4b895732639182709dc0d237458704ddeb4fe..64cca5567690c0680a4966b7e64f1d8ea869b1ca 100755
--- a/Control/CalypsoExample/Reconstruction/scripts/submit_faser_reco.sh
+++ b/Control/CalypsoExample/Reconstruction/scripts/submit_faser_reco.sh
@@ -89,7 +89,7 @@ asetup
 source build/x8*/setup.sh
 #
 # Do this by hand
-# asetup --input="$release_directory/calypso/asetup.faser" Athena,22.0.40
+# asetup --input="$release_directory/calypso/asetup.faser" Athena,22.0.49
 # source "$release_directory/build/x8*/setup.sh"
 #
 #
diff --git a/Generators/FaserCosmicGenerator/README.md b/Generators/FaserCosmicGenerator/README.md
index 512c32c60d6d875dba083a0fc2e5dc34e7dc8499..49199a3cef6173c5f4fed4c41de452ef7713c6ff 100644
--- a/Generators/FaserCosmicGenerator/README.md
+++ b/Generators/FaserCosmicGenerator/README.md
@@ -2,7 +2,7 @@
 
 ## Setup
 
-In Athena 22.0.40, the scipy module is missing from the LCG environment for some reason.
+In Athena 22.0.49, the scipy module is missing from the LCG environment for some reason.
 
 To use the generator, the following command is required after the usual steps to setup the release:
 
diff --git a/Generators/ReadGenie/CMakeLists.txt b/Generators/ReadGenie/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ff0644758447f0e7ca305bf8de76bf07b0165e70
--- /dev/null
+++ b/Generators/ReadGenie/CMakeLists.txt
@@ -0,0 +1,11 @@
+################################################################################
+# Package: ReadGenie
+################################################################################
+
+# Declare the package name:
+atlas_subdir( ReadGenie )
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+
+atlas_install_joboptions( share/*.py )
\ No newline at end of file
diff --git a/Generators/ReadGenie/python/GenieReader.py b/Generators/ReadGenie/python/GenieReader.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc1cb184f0016fe4f73599a9f1eb1edab209f5f1
--- /dev/null
+++ b/Generators/ReadGenie/python/GenieReader.py
@@ -0,0 +1,59 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+from GeneratorModules.EvgenAlg import EvgenAlg
+from AthenaPython.PyAthena import StatusCode
+import ROOT
+
+__author__ = "Dave Caser <dcasper@uci.edu>"
+
+class GenieReader(EvgenAlg):
+    def __init__(self, name="GenieReader", MCEventKey="BeamTruthEvent"):
+        super(GenieReader,self).__init__(name=name)
+        self.McEventKey = MCEventKey
+        return
+
+    def fillEvent(self, evt):
+        try:
+          from AthenaPython.PyAthena import HepMC3  as HepMC
+        except ImportError:
+          from AthenaPython.PyAthena import HepMC   as HepMC
+        evt.weights().push_back(1.0)
+
+        pos = HepMC.FourVector(self.evtStore["vx"]*1000, self.evtStore["vy"]*1000, self.evtStore["vz"]*1000, 0)
+        gv = HepMC.GenVertex(pos)
+        ROOT.SetOwnership(gv, False)
+        evt.add_vertex(gv)
+
+        nParticles = self.evtStore["n"]
+        pdgc = list(self.evtStore["pdgc"])
+        status = list(self.evtStore["status"])
+        px = list(self.evtStore["px"])
+        py = list(self.evtStore["py"])
+        pz = list(self.evtStore["pz"])
+        E = list(self.evtStore["E"])
+        M = list(self.evtStore["M"])
+
+        for i in range(nParticles):
+            gp = HepMC.GenParticle()
+            mom = HepMC.FourVector(px[i], py[i], pz[i], E[i])            
+            gp.set_momentum(mom)
+            gp.set_generated_mass(M[i])
+            gp.set_pdg_id(pdgc[i])
+            genie_status = status[i]
+            if (genie_status == 0):   # initial particle
+                hepmc_status = 4
+            elif (genie_status == 1): # stable final particle
+                hepmc_status = 1
+            elif (genie_status == 3): # decayed particle
+                hepmc_status = 2
+            else:                     # catch-all informational particle
+                hepmc_status = 3
+            gp.set_status(hepmc_status)
+            ROOT.SetOwnership(gp, False)
+            if (hepmc_status == 4):
+                gv.add_particle_in(gp)
+            else:
+                gv.add_particle_out(gp)    
+
+        return StatusCode.Success
diff --git a/Generators/ReadGenie/python/__init__.py b/Generators/ReadGenie/python/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d13ae164caa4e93bf2899cea4e67d0ec515784a2
--- /dev/null
+++ b/Generators/ReadGenie/python/__init__.py
@@ -0,0 +1 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
diff --git a/Generators/ReadGenie/share/ReadGenie_jobOptions.py b/Generators/ReadGenie/share/ReadGenie_jobOptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..12fd88776a1e3554c972ee55910565a3ab18fb69
--- /dev/null
+++ b/Generators/ReadGenie/share/ReadGenie_jobOptions.py
@@ -0,0 +1,39 @@
+#
+#  Usage: athena.py -c'INPUT=["faser.1.gfaser.root","faser.2.gfaser.root"]; OUTPUT="gFaser.EVNT.pool.root"; EVTMAX=100' ReadGenie_jobOptions.py
+#
+#  INPUT and OUTPUT are mandatory (INPUT can be a list, as shown above)
+#  EVTMAX can be omitted; then all input files are read to the end
+#
+
+if not 'INPUT' in dir():
+    print("Missing INPUT parameter")
+    exit()
+
+if not isinstance(INPUT, (list,tuple)):
+    INPUT = [INPUT]
+    pass
+
+if not 'OUTPUT' in dir():
+    print("Missing OUTPUT parameter")
+    exit()
+
+import AthenaRootComps.ReadAthenaRoot
+
+svcMgr.EventSelector.InputCollections = INPUT
+svcMgr.EventSelector.TupleName = "gFaser"
+
+from ReadGenie.GenieReader import GenieReader
+
+from AthenaCommon.AlgSequence import AlgSequence
+job = AlgSequence()
+job += GenieReader()
+
+from AthenaPoolCnvSvc.WriteAthenaPool import AthenaPoolOutputStream
+ostream = AthenaPoolOutputStream( "StreamEVGEN" , OUTPUT, noTag=True )
+ostream.ItemList += [ "xAOD::EventInfo#*", "xAOD::EventAuxInfo#*",
+                      "EventInfo#*", 
+                      "McEventCollection#*" ]
+if not 'EVTMAX' in dir():
+    EVTMAX = -1
+
+theApp.EvtMax = EVTMAX
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.cxx b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.cxx
index 36ff6569e3c56cd9551bae75145d1c3d5a610f2e..715a49b37efc4f942c879339debf9f67993aef39 100644
--- a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.cxx
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.cxx
@@ -4,6 +4,7 @@
 
 #include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1.h"
 #include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHit_p1.h"
+#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.h"
 #include "NeutrinoHitCollectionCnv.h"
 
 
@@ -18,12 +19,16 @@ NeutrinoHitCollection_PERS* NeutrinoHitCollectionCnv::createPersistent(NeutrinoH
 NeutrinoHitCollection* NeutrinoHitCollectionCnv::createTransient() {
     MsgStream mlog(msgSvc(), "NeutrinoHitCollectionConverter" );
     NeutrinoHitCollectionCnv_p1   converter_p1;
+    NeutrinoHitCollectionCnv_p1a  converter_p1a;
 
     static const pool::Guid   p1_guid("2CA7AF71-1494-4378-BED4-AFB5C54398AA");
-    // static const pool::Guid   p1_guid("B2573A16-4B46-4E1E-98E3-F93421680779");
+    static const pool::Guid   p1a_guid("0A3CD37D-64CE-405D-98CF-595D678B14B7");
 
     NeutrinoHitCollection       *trans_cont(0);
-    if( this->compareClassGuid(p1_guid)) {
+    if( this->compareClassGuid(p1a_guid)) {
+      std::unique_ptr< NeutrinoHitCollection_p1a >   col_vect( this->poolReadObject< NeutrinoHitCollection_p1a >() );
+      trans_cont = converter_p1a.createTransient( col_vect.get(), mlog );
+    } else if( this->compareClassGuid(p1_guid)) {
       std::unique_ptr< NeutrinoHitCollection_p1 >   col_vect( this->poolReadObject< NeutrinoHitCollection_p1 >() );
       trans_cont = converter_p1.createTransient( col_vect.get(), mlog );
     }  else {
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.h b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.h
index 5ccd3e1bb8675b5f5542032781af7d737aa1a378..a8158c01a6ef7b93b6e32915d758aa9bcad984ed 100644
--- a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.h
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventAthenaPool/src/NeutrinoHitCollectionCnv.h
@@ -6,14 +6,14 @@
 #define NEUTRINOHITCOLLECTIONCNV
 
 #include "NeutrinoSimEvent/NeutrinoHitCollection.h"
-#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1.h"
-#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1.h"
+#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1a.h"
+#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h"
 // Gaudi
 #include "GaudiKernel/MsgStream.h"
 // typedef to the latest persistent version
-typedef NeutrinoHitCollection_p1     NeutrinoHitCollection_PERS;
-typedef NeutrinoHitCollectionCnv_p1  NeutrinoHitCollectionCnv_PERS;
+typedef NeutrinoHitCollection_p1a     NeutrinoHitCollection_PERS;
+typedef NeutrinoHitCollectionCnv_p1a  NeutrinoHitCollectionCnv_PERS;
 
 class NeutrinoHitCollectionCnv  : public T_AthenaPoolCustomCnv<NeutrinoHitCollection, NeutrinoHitCollection_PERS > {
   friend class CnvFactory<NeutrinoHitCollectionCnv>;
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/CMakeLists.txt b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/CMakeLists.txt
index defef98b76adfaf00e4b4c1da37c685cee6e2d7c..332a16c77b33035a064668b13fe3fe41ad4061ff 100644
--- a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/CMakeLists.txt
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/CMakeLists.txt
@@ -22,5 +22,5 @@ atlas_add_dictionary( NeutrinoSimEventTPCnvDict
                       NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnvDict.h
                       NeutrinoSimEventTPCnv/selection.xml
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv NeutrinoSimEvent TestTools StoreGateLib SGtests Identifier NeutrinoSimEventTPCnv )
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv NeutrinoSimEvent TestTools StoreGateLib SGtests Identifier NeutrinoSimEventTPCnv AthenaKernel )
 
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.h b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.h
new file mode 100644
index 0000000000000000000000000000000000000000..5666f66e7e644581cc53cf2ec88a4a0f9f54fb83
--- /dev/null
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.h
@@ -0,0 +1,41 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef NEUTRINOHITCOLLECTIONCNV_P1A_H
+#define NEUTRINOHITCOLLECTIONCNV_P1A_H
+
+// NeutrinoHitCollectionCnv_p1a, T/P separation of Neutrino Hits
+// author D.Costanzo <davide.costanzo@cern.ch>
+// author O.Arnaez <olivier.arnaez@cern.ch>
+
+#include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
+#include "NeutrinoSimEvent/NeutrinoHitCollection.h"
+#include "NeutrinoHitCollection_p1a.h"
+
+
+class NeutrinoHitCollectionCnv_p1a : public T_AthenaPoolTPCnvBase<NeutrinoHitCollection, NeutrinoHitCollection_p1a>
+{
+ public:
+
+  NeutrinoHitCollectionCnv_p1a()  {};
+
+  virtual NeutrinoHitCollection* createTransient(const NeutrinoHitCollection_p1a* persObj, MsgStream &log);
+
+  virtual void	persToTrans(const NeutrinoHitCollection_p1a* persCont,
+                            NeutrinoHitCollection* transCont,
+                            MsgStream &log) ;
+  virtual void	transToPers(const NeutrinoHitCollection* transCont,
+                            NeutrinoHitCollection_p1a* persCont,
+                            MsgStream &log) ;
+
+ private:
+
+  static const double m_persEneUnit;
+  static const double m_persLenUnit;
+  static const double m_persAngUnit;
+  static const double m_2bHalfMaximum;
+  static const int m_2bMaximum;
+};
+
+#endif
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1a.h b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1a.h
new file mode 100644
index 0000000000000000000000000000000000000000..639ff984017e9c002a4d5317c652744751fa1f76
--- /dev/null
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1a.h
@@ -0,0 +1,57 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef NEUTRINOHITCOLLECTION_P1A_H
+#define NEUTRINOHITCOLLECTION_P1A_H
+
+/*
+
+Authors: Davide Costanzo Rob Duxfield
+
+*/
+
+#include <vector>
+#include <string>
+
+class NeutrinoHitCollection_p1a
+{
+ public:
+/// Default constructor
+  NeutrinoHitCollection_p1a ();
+  //private:
+
+  std::vector<float>          m_hit1_meanTime;   //  1 element per string
+  std::vector<float>          m_hit1_x0;         //
+  std::vector<float>          m_hit1_y0;         //
+  std::vector<float>          m_hit1_z0;         //
+  std::vector<float>          m_hit1_theta;      //
+  std::vector<float>          m_hit1_phi;        //
+  std::vector<unsigned long>  m_nHits;           //
+
+  std::vector<unsigned short> m_hitEne_2b;       //  1 element per hit
+  std::vector<unsigned short> m_hitLength_2b;    //
+
+  std::vector<unsigned short> m_dTheta;          //  1 element per hit except for first hit in string
+  std::vector<unsigned short> m_dPhi;            //
+
+  std::vector<float>          m_hitEne_4b;       //  1 element per hit with  m_hitEne_2b[i] == 2**16
+
+  std::vector<float>          m_hitLength_4b;    //  1 element per hit with  m_hitLength_2b[i] == 2**16
+
+  std::vector<unsigned long>  m_barcode;
+  std::vector<unsigned short> m_mcEvtIndex;
+  std::vector<char>           m_evtColl;
+  std::vector<unsigned long>  m_nBC;
+
+  std::vector<unsigned long>  m_id;
+  std::vector<unsigned long>  m_nId;
+};
+
+
+// inlines
+
+inline
+NeutrinoHitCollection_p1a::NeutrinoHitCollection_p1a () {}
+
+#endif
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnvDict.h b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnvDict.h
index 064ad71ac526d7f0a0d826df691f65f1ae648f98..15b7afc5bd3fc0d02690b6edbb5f6fab2012f1d5 100644
--- a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnvDict.h
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnvDict.h
@@ -15,6 +15,9 @@
 #include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCnv_p1.h"
 #include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1.h"
 #include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1.h"
+#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.h"
+#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1a.h"
+
 #include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHit_p1.h"
 
 #endif // NEUTRINOEVENTTPCNV_NEUTRINOSIMEVENTTPCNVDICT_H
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/selection.xml b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/selection.xml
index 6808c217a9a651ba26b4147a58409380ea0cc49b..3332a0a0c69d1929fd89b854102086d5b6745af0 100644
--- a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/selection.xml
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/NeutrinoSimEventTPCnv/selection.xml
@@ -4,4 +4,5 @@
     <class name="NeutrinoHit_p1" />
     <class name="std::vector<NeutrinoHit_p1>" />
     <class name="NeutrinoHitCollection_p1" id="2CA7AF71-1494-4378-BED4-AFB5C54398AA" />
+    <class name="NeutrinoHitCollection_p1a" id="0A3CD37D-64CE-405D-98CF-595D678B14B7" />
 </lcgdict>
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/src/NeutrinoHits/NeutrinoHitCollectionCnv_p1.cxx b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/src/NeutrinoHits/NeutrinoHitCollectionCnv_p1.cxx
index 3b85676a61cd4235918207a9deb82659ed1bc5bc..444ad41777263c39b68a5e7a3cd613d787f25e32 100644
--- a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/src/NeutrinoHits/NeutrinoHitCollectionCnv_p1.cxx
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/src/NeutrinoHits/NeutrinoHitCollectionCnv_p1.cxx
@@ -14,7 +14,10 @@
 #include "CLHEP/Geometry/Point3D.h"
 // Gaudi
 #include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+
 // Athena
+#include "AthenaKernel/ExtendedEventContext.h"
 #include "StoreGate/StoreGateSvc.h"
 
 //  * * *  stolen from eflowRec  * * *  //
@@ -60,7 +63,7 @@ const double NeutrinoHitCollectionCnv_p1::m_2bHalfMaximum = pow(2.0, 15.0);
 const int NeutrinoHitCollectionCnv_p1::m_2bMaximum = (unsigned short)(-1);
 
 
-void NeutrinoHitCollectionCnv_p1::transToPers(const NeutrinoHitCollection* transCont, NeutrinoHitCollection_p1* persCont, MsgStream &/*log*/)
+void NeutrinoHitCollectionCnv_p1::transToPers(const NeutrinoHitCollection* transCont, NeutrinoHitCollection_p1* persCont, MsgStream &log)
 {
   // Finds hits belonging to a "string" (in which the end point of one hit is the same as the start point of the next) and
   // persistifies the end point of each hit plus the start point of the first hit in each string.
@@ -77,6 +80,8 @@ void NeutrinoHitCollectionCnv_p1::transToPers(const NeutrinoHitCollection* trans
   static const double dRcut = 1.0e-7;
   static const double dTcut = 1.0;
 
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+  const IProxyDict* proxy = Atlas::getExtendedEventContext(ctx).proxy();
   const HepMcParticleLink * lastLink=nullptr;
   int lastId = -1;
   double stringFirstTheta = 0.0;
@@ -102,7 +107,18 @@ void NeutrinoHitCollectionCnv_p1::transToPers(const NeutrinoHitCollection* trans
 
       lastLink = &(siHit->particleLink());
       persCont->m_barcode.push_back(lastLink->barcode());
-      persCont->m_mcEvtIndex.push_back(lastLink->eventIndex());
+      unsigned short index{0};
+      const HepMcParticleLink::index_type position =
+        HepMcParticleLink::getEventPositionInCollection(lastLink->eventIndex(),
+                                                        lastLink->getEventCollection(),
+                                                        proxy).at(0);
+      if (position!=0) {
+        index = lastLink->eventIndex();
+        if(lastLink->eventIndex()!=static_cast<HepMcParticleLink::index_type>(index)) {
+          log << MSG::WARNING << "Attempting to persistify an eventIndex larger than max unsigned short!" << endmsg;
+        }
+      }
+      persCont->m_mcEvtIndex.push_back(index);
       persCont->m_evtColl.push_back(lastLink->getEventCollectionAsChar());
 
       if (idx > 0) {
@@ -113,7 +129,7 @@ void NeutrinoHitCollectionCnv_p1::transToPers(const NeutrinoHitCollection* trans
 
     if ( (int)siHit->identify() != lastId ) {
 
-      // store id once for set of consecutive hits with same barcode
+      // store barcode, eventIndex and McEventCollection once for set of consecutive hits with same barcode
 
       lastId = siHit->identify();
       persCont->m_id.push_back(lastId);
@@ -250,6 +266,8 @@ NeutrinoHitCollection* NeutrinoHitCollectionCnv_p1::createTransient(const Neutri
 
 void NeutrinoHitCollectionCnv_p1::persToTrans(const NeutrinoHitCollection_p1* persCont, NeutrinoHitCollection* transCont, MsgStream &/*log*/)
 {
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+
   unsigned int hitCount = 0;
   unsigned int angleCount = 0;
   unsigned int idxBC = 0;
@@ -299,7 +317,11 @@ void NeutrinoHitCollectionCnv_p1::persToTrans(const NeutrinoHitCollection_p1* pe
 
         HepGeom::Point3D<double> endThis( endLast + r );
 
-        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), HepMcParticleLink::IS_INDEX );
+        HepMcParticleLink::PositionFlag flag = HepMcParticleLink::IS_INDEX;
+        if (persCont->m_mcEvtIndex[idxBC] == 0) {
+          flag = HepMcParticleLink::IS_POSITION;
+        }
+        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), flag, ctx );
         transCont->Emplace( endLast, endThis, eneLoss, meanTime, partLink, persCont->m_id[idxId]);
 
         endLast = endThis;
diff --git a/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/src/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.cxx b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/src/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..6ef0bb107e46e922ad7b667bf2ae239dfe8cd695
--- /dev/null
+++ b/Neutrino/NeutrinoEventCnv/NeutrinoSimEventTPCnv/src/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.cxx
@@ -0,0 +1,334 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "NeutrinoSimEvent/NeutrinoHit.h"
+#include "NeutrinoSimEvent/NeutrinoHitCollection.h"
+#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollection_p1a.h"
+#include "NeutrinoSimEventTPCnv/NeutrinoHits/NeutrinoHitCollectionCnv_p1a.h"
+#include "GeneratorObjects/HepMcParticleLink.h"
+
+#include <cmath>
+
+//CLHEP
+#include "CLHEP/Geometry/Point3D.h"
+// Gaudi
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+
+// Athena
+#include "AthenaKernel/ExtendedEventContext.h"
+#include "StoreGate/StoreGateSvc.h"
+
+//  * * *  stolen from eflowRec  * * *  //
+inline double phicorr(double a)
+{
+  if (a <= -M_PI)
+    {
+      return a+(2*M_PI*floor(-(a-M_PI)/(2*M_PI)));
+    }
+  else if (a > M_PI)
+    {
+      return a-(2*M_PI*floor((a+M_PI)/(2*M_PI)));
+    }
+  else
+    {
+      return a;
+    }
+}
+
+//  * * *  stolen from eflowRec  * * *  //
+inline double cycle(double a, double b)
+{
+  double del = b-a;
+  if (del > M_PI)
+    {
+      return a+2.0*M_PI;
+    }
+  else if (del < -M_PI)
+    {
+      return a-2.0*M_PI;
+    }
+  else
+    {
+      return a;
+    }
+}
+
+
+const double NeutrinoHitCollectionCnv_p1a::m_persEneUnit = 1.0e-5;
+const double NeutrinoHitCollectionCnv_p1a::m_persLenUnit = 1.0e-5;
+const double NeutrinoHitCollectionCnv_p1a::m_persAngUnit = 1.0e-5;
+const double NeutrinoHitCollectionCnv_p1a::m_2bHalfMaximum = pow(2.0, 15.0);
+const int NeutrinoHitCollectionCnv_p1a::m_2bMaximum = (unsigned short)(-1);
+
+
+void NeutrinoHitCollectionCnv_p1a::transToPers(const NeutrinoHitCollection* transCont, NeutrinoHitCollection_p1a* persCont, MsgStream &log)
+{
+  // Finds hits belonging to a "string" (in which the end point of one hit is the same as the start point of the next) and
+  // persistifies the end point of each hit plus the start point of the first hit in each string.
+  //
+  // Further compression is achieved by optimising the storage of the position vectors:- start (x,y,z) and (theta,phi) of
+  // first hit are stored as floats, (delta_theta,delta_phi) relative to the fisrst hit are stored as 2 byte numbers and
+  // used to specify the hit direction. All hit lengths are stored as 2 byte numbers.
+  //
+  // Additional savings are achieved by storing the energy loss for each hit as a 2 byte number and only storing the mean
+  // time of the first hit per string.
+  //
+  // See http://indico.cern.ch/getFile.py/access?contribId=11&resId=2&materialId=slides&confId=30893 for more info.
+
+  static const double dRcut = 1.0e-7;
+  static const double dTcut = 1.0;
+
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+  const IProxyDict* proxy = Atlas::getExtendedEventContext(ctx).proxy();
+  const HepMcParticleLink * lastLink=nullptr;
+  int lastId = -1;
+  double stringFirstTheta = 0.0;
+  double stringFirstPhi = 0.0;
+  double lastT = 0.0;
+  double persSumE = 0.0;
+  double transSumE = 0.0;
+  unsigned int idx = 0;
+  unsigned int endBC = 0;
+  unsigned int endId = 0;
+  unsigned int endHit = 0;
+  HepGeom::Point3D<double> lastTransEnd(0.0, 0.0, 0.0);
+  HepGeom::Point3D<double> lastPersEnd(0.0, 0.0, 0.0);
+
+  for (NeutrinoHitCollection::const_iterator it = transCont->begin(); it != transCont->end(); ++it) {
+
+    NeutrinoHitCollection::const_iterator siHit = it;
+
+
+    if ( !lastLink || (siHit->particleLink() != *lastLink) ) {
+
+      // store barcode once for set of consecutive hits with same barcode
+
+      lastLink = &(siHit->particleLink());
+      persCont->m_barcode.push_back(lastLink->barcode());
+      unsigned short index{0};
+      const HepMcParticleLink::index_type position =
+        HepMcParticleLink::getEventPositionInCollection(lastLink->eventIndex(),
+                                                        lastLink->getEventCollection(),
+                                                        proxy).at(0);
+      if (position!=0) {
+        index = lastLink->eventIndex();
+        if(lastLink->eventIndex()!=static_cast<HepMcParticleLink::index_type>(index)) {
+          log << MSG::WARNING << "Attempting to persistify an eventIndex larger than max unsigned short!" << endmsg;
+        }
+      }
+      persCont->m_mcEvtIndex.push_back(index);
+      persCont->m_evtColl.push_back(lastLink->getEventCollectionAsChar());
+
+      if (idx > 0) {
+        persCont->m_nBC.push_back(idx - endBC);
+        endBC = idx;
+      }
+    }
+
+    if ( (int)siHit->identify() != lastId ) {
+
+      // store barcode, eventIndex and McEventCollection once for set of consecutive hits with same barcode
+
+      lastId = siHit->identify();
+      persCont->m_id.push_back(lastId);
+
+      if (idx > 0) {
+        persCont->m_nId.push_back(idx - endId);
+        endId = idx;
+      }
+    }
+
+    HepGeom::Point3D<double> st = siHit->localStartPosition();
+    HepGeom::Point3D<double> en = siHit->localEndPosition();
+
+    const double dx = st.x() - lastTransEnd.x();
+    const double dy = st.y() - lastTransEnd.y();
+    const double dz = st.z() - lastTransEnd.z();
+    const double t = siHit->meanTime();
+
+    const double dRLast = sqrt(dx * dx + dy * dy + dz * dz);  // dR between end of previous hit and start of current one
+    const double dTLast = fabs(t - lastT);
+
+    CLHEP::Hep3Vector direction(0.0, 0.0, 0.0);
+    double theta = 0.0;
+    double phi = 0.0;
+    bool startNewString = false;
+
+    if (dRLast < dRcut && dTLast < dTcut) {
+
+      // hit is part of existing string
+
+      direction = CLHEP::Hep3Vector( en.x() - lastPersEnd.x(), en.y() - lastPersEnd.y(), en.z() - lastPersEnd.z() );
+
+      theta = direction.theta();
+      phi = phicorr( direction.phi() );
+
+      const int dTheta_2b = (int)( (theta - stringFirstTheta) / m_persAngUnit + m_2bHalfMaximum + 0.5 );
+      const int dPhi_2b = (int)( (cycle(phi, stringFirstPhi) - stringFirstPhi) / m_persAngUnit + m_2bHalfMaximum + 0.5 );
+
+      if ( dTheta_2b < m_2bMaximum && dTheta_2b >= 0 && dPhi_2b < m_2bMaximum && dPhi_2b >= 0) {
+        persCont->m_dTheta.push_back(dTheta_2b);
+        persCont->m_dPhi.push_back(dPhi_2b);
+        theta = stringFirstTheta + ( (double)dTheta_2b - m_2bHalfMaximum ) * m_persAngUnit;
+        phi = stringFirstPhi + ( (double)dPhi_2b - m_2bHalfMaximum ) * m_persAngUnit;
+        phi = phicorr(phi);
+      }
+      else {
+        startNewString = true;
+      }
+    }
+
+    if (startNewString || dRLast >= dRcut || dTLast >= dTcut) {
+
+      // begin new hit string
+
+      direction = CLHEP::Hep3Vector( en.x() - st.x(), en.y() - st.y(), en.z() - st.z() );
+
+      theta = direction.theta();
+      phi = phicorr( direction.phi() );
+
+      persCont->m_hit1_meanTime.push_back(t);
+      persCont->m_hit1_x0.push_back(st.x());
+      persCont->m_hit1_y0.push_back(st.y());
+      persCont->m_hit1_z0.push_back(st.z());
+      persCont->m_hit1_theta.push_back(theta);
+      persCont->m_hit1_phi.push_back(phi);
+
+      lastPersEnd = HepGeom::Point3D<double>(st.x(), st.y(), st.z());
+
+      stringFirstTheta = theta;
+      stringFirstPhi = phi;
+
+      if (idx > 0) {
+        persCont->m_nHits.push_back(idx - endHit);
+        endHit = idx;
+      }
+    }
+
+    lastTransEnd = HepGeom::Point3D<double>(en.x(), en.y(), en.z());
+    transSumE += siHit->energyLoss();
+
+    const int eneLoss_2b = (int)((transSumE - persSumE) / m_persEneUnit + 0.5);  // calculated to allow recovery sum over
+                                                                                 // whole hit string to chosen precision
+
+    const int hitLength_2b = (int)(direction.mag() / m_persLenUnit + 0.5);  // calculated to give the correct position to
+                                                                            // the chosen precision, NOT the length of the
+                                                                            // hit (small difference in practice).
+    double eneLoss = 0.0;
+
+    if (eneLoss_2b >= m_2bMaximum) {
+      eneLoss = siHit->energyLoss();
+      persCont->m_hitEne_2b.push_back(m_2bMaximum);
+      persCont->m_hitEne_4b.push_back(eneLoss);
+    }
+    else {
+      eneLoss = eneLoss_2b * m_persEneUnit;
+      persCont->m_hitEne_2b.push_back(eneLoss_2b);
+    }
+
+    double length = 0.0;
+
+    if (hitLength_2b >= m_2bMaximum) {
+      length = direction.mag();
+      persCont->m_hitLength_2b.push_back(m_2bMaximum);
+      persCont->m_hitLength_4b.push_back(direction.mag());
+    }
+    else {
+      length = hitLength_2b * m_persLenUnit;
+      persCont->m_hitLength_2b.push_back(hitLength_2b);
+    }
+
+    CLHEP::Hep3Vector persDir(length, 0.0, 0.0);
+    persDir.setTheta(theta);
+    persDir.setPhi(phi);
+
+    lastPersEnd = (CLHEP::Hep3Vector)lastPersEnd + persDir;
+    persSumE += eneLoss;
+    lastT = t;
+
+    ++idx;
+  }
+
+  persCont->m_nBC.push_back(idx - endBC);
+  persCont->m_nId.push_back(idx - endId);
+  persCont->m_nHits.push_back(idx - endHit);
+}
+
+
+NeutrinoHitCollection* NeutrinoHitCollectionCnv_p1a::createTransient(const NeutrinoHitCollection_p1a* persObj, MsgStream &log) {
+  std::unique_ptr<NeutrinoHitCollection> trans(std::make_unique<NeutrinoHitCollection>("DefaultCollectionName",persObj->m_nHits.size()));
+  persToTrans(persObj, trans.get(), log);
+  return(trans.release());
+}
+
+
+void NeutrinoHitCollectionCnv_p1a::persToTrans(const NeutrinoHitCollection_p1a* persCont, NeutrinoHitCollection* transCont, MsgStream &/*log*/)
+{
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+
+  unsigned int hitCount = 0;
+  unsigned int angleCount = 0;
+  unsigned int idxBC = 0;
+  unsigned int idxId = 0;
+  unsigned int idxEne4b = 0;
+  unsigned int idxLen4b = 0;
+  unsigned int endHit = 0;
+  unsigned int endBC = 0;
+  unsigned int endId = 0;
+
+  for (unsigned int i = 0; i < persCont->m_nHits.size(); i++) {
+
+    if (persCont->m_nHits[i]) {
+
+      const unsigned int start = endHit;
+      endHit += persCont->m_nHits[i];
+
+      const double t0 = persCont->m_hit1_meanTime[i];
+      const double theta0 = persCont->m_hit1_theta[i];
+      const double phi0 = persCont->m_hit1_phi[i];
+      HepGeom::Point3D<double> endLast(persCont->m_hit1_x0[i], persCont->m_hit1_y0[i], persCont->m_hit1_z0[i]);
+
+      for (unsigned int j = start; j < endHit; j++) {
+
+        if (j >= endBC + persCont->m_nBC[idxBC])
+          endBC += persCont->m_nBC[idxBC++];
+
+        if (j >= endId + persCont->m_nId[idxId])
+          endId += persCont->m_nId[idxId++];
+
+        const double eneLoss_2b = persCont->m_hitEne_2b[hitCount];
+        const double hitLength_2b = persCont->m_hitLength_2b[hitCount];
+
+        const double eneLoss = (eneLoss_2b < m_2bMaximum) ? eneLoss_2b * m_persEneUnit : persCont->m_hitEne_4b[idxEne4b++];
+        const double length = (hitLength_2b < m_2bMaximum) ? hitLength_2b * m_persLenUnit : persCont->m_hitLength_4b[idxLen4b++];
+
+        const double dTheta = (j > start) ? ((double)persCont->m_dTheta[angleCount] - m_2bHalfMaximum) * m_persAngUnit : 0.0;
+        const double dPhi = (j > start) ? ((double)persCont->m_dPhi[angleCount] - m_2bHalfMaximum) * m_persAngUnit : 0.0;
+
+        const double meanTime = t0;
+        const double theta = theta0 + dTheta;
+        const double phi = phicorr(phi0 + dPhi);
+
+        CLHEP::Hep3Vector r(length, 0.0, 0.0);
+        r.setTheta(theta);
+        r.setPhi(phi);
+
+        HepGeom::Point3D<double> endThis( endLast + r );
+
+        HepMcParticleLink::PositionFlag flag = HepMcParticleLink::IS_INDEX;
+        if (persCont->m_mcEvtIndex[idxBC] == 0) {
+          flag = HepMcParticleLink::IS_POSITION;
+        }
+        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), flag, ctx );
+        transCont->Emplace( endLast, endThis, eneLoss, meanTime, partLink, persCont->m_id[idxId]);
+
+        endLast = endThis;
+
+        ++hitCount;
+        if (j > start) ++angleCount;
+      }
+    }
+  }
+}
diff --git a/Neutrino/NeutrinoG4/EmulsionG4_SD/python/EmulsionG4_SDToolConfig.py b/Neutrino/NeutrinoG4/EmulsionG4_SD/python/EmulsionG4_SDToolConfig.py
index 391e572abaef8cc7df72ec56a692c694aab32d74..e61195b70b006059df083bb30ff93b0bd4769daf 100644
--- a/Neutrino/NeutrinoG4/EmulsionG4_SD/python/EmulsionG4_SDToolConfig.py
+++ b/Neutrino/NeutrinoG4/EmulsionG4_SD/python/EmulsionG4_SDToolConfig.py
@@ -17,5 +17,7 @@ def EmulsionSensorSDCfg(ConfigFlags, name="EmulsionSensorSD", **kwargs):
     kwargs.setdefault("LogicalVolumeNames", ["Emulsion::FrontFilm", "Emulsion::BackFilm"])
     kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    # result.merge(acc)
-    return result, EmulsionSensorSDTool(name, **kwargs)
+    result = ComponentAccumulator()
+    result.setPrivateTools(CompFactory.EmulsionSensorSDTool(name, **kwargs))
+    return result
+
diff --git a/README.md b/README.md
index c2900525af586a7660cc4740ce93547fee008dc2..0b334b19690dd56d1a0bae23fd5c0849c1cd83dd 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ git clone --recursive https://:@gitlab.cern.ch:8443/$USERNAME/calypso.git
 #The next three lines are used to setup the ATLAS release environment
 export ATLAS_LOCAL_ROOT_BASE=/cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase 
 source ${ATLAS_LOCAL_ROOT_BASE}/user/atlasLocalSetup.sh
-asetup --input=calypso/asetup.faser Athena,22.0.40
+asetup --input=calypso/asetup.faser Athena,22.0.49
 
 #create build directory
 mkdir build
@@ -31,6 +31,15 @@ Don't omit the dot in the `source ./setup.sh` command!
 
 It can be convenient to alias the "asetup --input=calypso/asetup.faser" to something like "fsetup"
 
+**Lxplus/afs setup**
+
+If afs is used to host and run calypso, the user should do so with an afs workspace.
+
+Instructions for setting up a workspace can be found here: https://resources.web.cern.ch/resources/Help/?kbid=067040
+
+When compiling, CERN IT recommends using condor to submit batch jobs. The basics of running condor are found here: https://batchdocs.web.cern.ch/local/quick.html 
+
+
 ## Known issues:
 
 * It is now essential to use the tags `ConfigFlags.GeoModel.FaserVersion` and `ConfigFlags.IOVDb.GlobalTag` in a consistent way.  If nothing is specified the first option (baseline) should be chosen by default.
@@ -43,6 +52,4 @@ It can be convenient to alias the "asetup --input=calypso/asetup.faser" to somet
 
 ** `ConfigFlags.GeoModel.FaserVersion = "FASER-TB00"` and `ConfigFlags.IOVDb.GlobalTag = OFLCOND-FASER-TB00` enables the 2021 Test-beam setup.
 
-* The "FaserActsKalmanFilter" package is temporarily disabled.
-
 * The command `lsetup "lcgenv -p LCG_98python3_ATLAS_8 x86_64-centos7-gcc8-opt sqlite"` may be necessary to avoid errors when generating a database
diff --git a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt
index 89c0c08d0204d449808531439e227498cc824a1a..04ca202da817c0f95b4942bfc62b4c5159a47679 100644
--- a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt
+++ b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt
@@ -22,5 +22,5 @@ atlas_add_dictionary( ScintSimEventTPCnvDict
                       ScintSimEventTPCnv/ScintSimEventTPCnvDict.h
                       ScintSimEventTPCnv/selection.xml
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv ScintSimEvent TestTools StoreGateLib SGtests Identifier ScintSimEventTPCnv )
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv ScintSimEvent TestTools StoreGateLib SGtests Identifier ScintSimEventTPCnv AthenaKernel )
 
diff --git a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/src/ScintHits/ScintHitCollectionCnv_p1.cxx b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/src/ScintHits/ScintHitCollectionCnv_p1.cxx
index 08e4c55e910be26cd47735c49a11bcebad82f446..42b4160a2176e95919d5930140c5abcd7c0e8dfb 100644
--- a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/src/ScintHits/ScintHitCollectionCnv_p1.cxx
+++ b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/src/ScintHits/ScintHitCollectionCnv_p1.cxx
@@ -14,7 +14,10 @@
 #include "CLHEP/Geometry/Point3D.h"
 // Gaudi
 #include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+
 // Athena
+#include "AthenaKernel/ExtendedEventContext.h"
 #include "StoreGate/StoreGateSvc.h"
 
 //  * * *  stolen from eflowRec  * * *  //
@@ -60,7 +63,7 @@ const double ScintHitCollectionCnv_p1::m_2bHalfMaximum = pow(2.0, 15.0);
 const int ScintHitCollectionCnv_p1::m_2bMaximum = (unsigned short)(-1);
 
 
-void ScintHitCollectionCnv_p1::transToPers(const ScintHitCollection* transCont, ScintHitCollection_p1* persCont, MsgStream &/*log*/)
+void ScintHitCollectionCnv_p1::transToPers(const ScintHitCollection* transCont, ScintHitCollection_p1* persCont, MsgStream &log)
 {
   // Finds hits belonging to a "string" (in which the end point of one hit is the same as the start point of the next) and
   // persistifies the end point of each hit plus the start point of the first hit in each string.
@@ -77,6 +80,8 @@ void ScintHitCollectionCnv_p1::transToPers(const ScintHitCollection* transCont,
   static const double dRcut = 1.0e-7;
   static const double dTcut = 1.0;
 
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+  const IProxyDict* proxy = Atlas::getExtendedEventContext(ctx).proxy();
   const HepMcParticleLink * lastLink=nullptr;
   int lastId = -1;
   double stringFirstTheta = 0.0;
@@ -98,11 +103,22 @@ void ScintHitCollectionCnv_p1::transToPers(const ScintHitCollection* transCont,
 
     if ( !lastLink || (siHit->particleLink() != *lastLink) ) {
 
-      // store barcode once for set of consecutive hits with same barcode
+      // store barcode, eventIndex and McEventCollection once for set of consecutive hits with same barcode
 
       lastLink = &(siHit->particleLink());
       persCont->m_barcode.push_back(lastLink->barcode());
-      persCont->m_mcEvtIndex.push_back(lastLink->eventIndex());
+      unsigned short index{0};
+      const HepMcParticleLink::index_type position =
+        HepMcParticleLink::getEventPositionInCollection(lastLink->eventIndex(),
+                                                        lastLink->getEventCollection(),
+                                                        proxy).at(0);
+      if (position!=0) {
+        index = lastLink->eventIndex();
+        if(lastLink->eventIndex()!=static_cast<HepMcParticleLink::index_type>(index)) {
+          log << MSG::WARNING << "Attempting to persistify an eventIndex larger than max unsigned short!" << endmsg;
+        }
+      }
+      persCont->m_mcEvtIndex.push_back(index);
       persCont->m_evtColl.push_back(lastLink->getEventCollectionAsChar());
 
       if (idx > 0) {
@@ -250,6 +266,8 @@ ScintHitCollection* ScintHitCollectionCnv_p1::createTransient(const ScintHitColl
 
 void ScintHitCollectionCnv_p1::persToTrans(const ScintHitCollection_p1* persCont, ScintHitCollection* transCont, MsgStream &/*log*/)
 {
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+
   unsigned int hitCount = 0;
   unsigned int angleCount = 0;
   unsigned int idxBC = 0;
@@ -299,7 +317,11 @@ void ScintHitCollectionCnv_p1::persToTrans(const ScintHitCollection_p1* persCont
 
         HepGeom::Point3D<double> endThis( endLast + r );
 
-        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), HepMcParticleLink::IS_INDEX );
+        HepMcParticleLink::PositionFlag flag = HepMcParticleLink::IS_INDEX;
+        if (persCont->m_mcEvtIndex[idxBC] == 0) {
+          flag = HepMcParticleLink::IS_POSITION;
+        }
+        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), flag, ctx );
         transCont->Emplace( endLast, endThis, eneLoss, meanTime, partLink, persCont->m_id[idxId]);
 
         endLast = endThis;
diff --git a/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py b/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py
index 96b90c45b32b2b96a801ee724f348004b59cc5a5..8dc2325ffc0a104762b605912b7232cad3f88b40 100644
--- a/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py
+++ b/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py
@@ -18,5 +18,7 @@ def PreshowerSensorSDCfg(ConfigFlags, name="PreshowerSensorSD", **kwargs):
     kwargs.setdefault("LogicalVolumeNames", ["Preshower::Plate"])
     kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    # result.merge(acc)
-    return result, PreshowerSensorSDTool(name, **kwargs)
+    result = ComponentAccumulator()
+    result.setPrivateTools(CompFactory.PreshowerSensorSDTool(name, **kwargs))
+    return result
+
diff --git a/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py b/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py
index dae6ba9784424a43377d5fa2d9d321d0befbdd38..2d049e14e2d104ad36b9dfffcd6b5a0a23aa1ff4 100644
--- a/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py
+++ b/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py
@@ -18,5 +18,7 @@ def TriggerSensorSDCfg(ConfigFlags, name="TriggerSensorSD", **kwargs):
     kwargs.setdefault("LogicalVolumeNames", ["Trigger::Plate"])
     kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    # result.merge(acc)
-    return result, TriggerSensorSDTool(name, **kwargs)
+    result = ComponentAccumulator()
+    result.setPrivateTools(CompFactory.TriggerSensorSDTool(name, **kwargs))
+    return result
+
diff --git a/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py b/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py
index ccc50ce9930063c2354d4d6f5d17688295ef9802..95000f8608cacc3b16dd0adf294370cdd80f1207 100644
--- a/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py
+++ b/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py
@@ -18,5 +18,7 @@ def VetoSensorSDCfg(ConfigFlags, name="VetoSensorSD", **kwargs):
     kwargs.setdefault("LogicalVolumeNames", ["Veto::Plate"])
     kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    # result.merge(acc)
-    return result, VetoSensorSDTool(name, **kwargs)
+    result = ComponentAccumulator()
+    result.setPrivateTools(CompFactory.VetoSensorSDTool(name, **kwargs))
+    return result
+
diff --git a/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx b/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx
index 3ce528b032fd0ce76494e114623aa753dbc0345c..69ff7cfd61bceff6cebf6a01043012c78c0a379b 100644
--- a/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx
+++ b/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.cxx
@@ -30,6 +30,9 @@
 #include "G4VModularPhysicsList.hh"
 #include "G4ParallelWorldPhysics.hh"
 
+#include "G4LogicalVolumeStore.hh"
+#include "G4GDMLParser.hh"
+
 // CLHEP includes
 #include "CLHEP/Random/RandomEngine.h"
 
@@ -197,6 +200,14 @@ void G4FaserAlg::initializeOnce()
   if(m_userLimitsSvc.retrieve().isFailure()) {
     throw std::runtime_error("Could not initialize ATLAS UserLimitsSvc!");
   }
+  
+  if (!m_gdmlFilename.empty())
+  {
+    G4LogicalVolumeStore* store = G4LogicalVolumeStore::GetInstance();
+    G4LogicalVolume* world = store->GetVolume("Faser::Faser");
+    G4GDMLParser parser {};
+    parser.Write(m_gdmlFilename.value(), world);
+  }
 
   if (m_activateParallelGeometries) {
     G4VModularPhysicsList* thePhysicsList=dynamic_cast<G4VModularPhysicsList*>(m_physListSvc->GetPhysicsList());
diff --git a/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.h b/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.h
index 420e23f7154244d03d1645aeeddcdf95e7c08ba4..1dbadf47ac6ed83bd5012ead048d077d951e624f 100644
--- a/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.h
+++ b/Simulation/G4Faser/G4FaserAlg/src/G4FaserAlg.h
@@ -120,6 +120,8 @@ private:
   /// Activate multi-threading configuration
   Gaudi::Property<bool> m_useMT{this,"MultiThreading",  false, "Multi-threading specific settings"};
   Gaudi::Property<bool> m_activateParallelGeometries{this, "ActivateParallelWorlds", false, "Toggle on/off the G4 parallel geometry system"};
+  /// Dump GDML file
+  Gaudi::Property<std::string> m_gdmlFilename{this, "GDMLfile", "", "GDML geometry file to write"};
   /// Random number service
   ServiceHandle<IAthRNGSvc> m_rndmGenSvc{this, "AtRndmGenSvc", "AthRNGSvc", ""}; // TODO rename property
   /// Random Stream Name
diff --git a/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py b/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py
index 3520b26d0df3e3bc948c8b69cedf4de6cc5aecb6..f4bb4333d7b62b77b377663d9181e30e64b9f2f8 100644
--- a/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py
+++ b/Simulation/G4Faser/G4FaserTools/python/G4FaserToolsConfigNew.py
@@ -2,7 +2,6 @@
 from __future__ import print_function
 from AthenaConfiguration.ComponentFactory import CompFactory
 
-
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaCommon import CfgMgr
 SensitiveDetectorMasterTool=CompFactory.SensitiveDetectorMasterTool
@@ -21,103 +20,78 @@ def FastSimulationMasterToolCfg(ConfigFlags, **kwargs):
     result.setPrivateTools(FastSimulationMasterTool(name="FastSimulationMasterTool", **kwargs))
     return result
 
-from EmulsionG4_SD.EmulsionG4_SDToolConfig import EmulsionSensorSDCfg
-from VetoG4_SD.VetoG4_SDToolConfig import VetoSensorSDCfg
-from TriggerG4_SD.TriggerG4_SDToolConfig import TriggerSensorSDCfg
-from PreshowerG4_SD.PreshowerG4_SDToolConfig import PreshowerSensorSDCfg
-from FaserSCT_G4_SD.FaserSCT_G4_SDToolConfig import SctSensorSDCfg
-from EcalG4_SD.EcalG4_SDToolConfig import EcalSensorSDCfg
+def NeutrinoSensitiveDetectorListCfg(ConfigFlags):
+    result = ComponentAccumulator()
+    tools = []
+
+    if ConfigFlags.Detector.EnableEmulsion:
+        from EmulsionG4_SD.EmulsionG4_SDToolConfig import EmulsionSensorSDCfg
+        tools += [ result.popToolsAndMerge(EmulsionSensorSDCfg(ConfigFlags)) ]
+
+    result.setPrivateTools(tools)
+    return result
 
-def generateNeutrinoSensitiveDetectorList(ConfigFlags):
 
+def CaloSensitiveDetectorListCfg(ConfigFlags):
     result = ComponentAccumulator()
-    SensitiveDetectorList=[]
+    tools = []
 
-    if ConfigFlags.Detector.EnableEmulsion:
-        accEmulsion,toolEmulsion = EmulsionSensorSDCfg(ConfigFlags)
-        SensitiveDetectorList += [ toolEmulsion ]
-        result.merge(accEmulsion)
-    
-    return result, SensitiveDetectorList #List of tools here now! (CALL IT TOOL LIST?)
+    if ConfigFlags.Detector.EnableEcal:
+        from EcalG4_SD.EcalG4_SDToolConfig import EcalSensorSDCfg
+        tools += [ result.popToolsAndMerge(EcalSensorSDCfg(ConfigFlags)) ]
 
-def generateScintSensitiveDetectorList(ConfigFlags):
+    result.setPrivateTools(tools)
+    return result
 
+def ScintSensitiveDetectorListCfg(ConfigFlags):
     result = ComponentAccumulator()
-    SensitiveDetectorList=[]
+    tools = []
 
     if ConfigFlags.Detector.EnableVeto:
-        accVeto,toolVeto = VetoSensorSDCfg(ConfigFlags)
-        SensitiveDetectorList += [ toolVeto ]
-        result.merge(accVeto)
-    
+        from VetoG4_SD.VetoG4_SDToolConfig import VetoSensorSDCfg
+        tools += [ result.popToolsAndMerge(VetoSensorSDCfg(ConfigFlags)) ]
     if ConfigFlags.Detector.EnableTrigger:
-        accTrigger,toolTrigger = TriggerSensorSDCfg(ConfigFlags)
-        SensitiveDetectorList += [ toolTrigger ]
-        result.merge(accTrigger)
-    
+        from TriggerG4_SD.TriggerG4_SDToolConfig import TriggerSensorSDCfg
+        tools += [ result.popToolsAndMerge(TriggerSensorSDCfg(ConfigFlags)) ]
     if ConfigFlags.Detector.EnablePreshower:
-        accPreshower,toolPreshower = PreshowerSensorSDCfg(ConfigFlags)
-        SensitiveDetectorList += [ toolPreshower ]
-        result.merge(accPreshower)
-    
-    return result, SensitiveDetectorList #List of tools here now! (CALL IT TOOL LIST?)
+        from PreshowerG4_SD.PreshowerG4_SDToolConfig import PreshowerSensorSDCfg
+        tools += [ result.popToolsAndMerge(PreshowerSensorSDCfg(ConfigFlags)) ]
 
-def generateTrackerSensitiveDetectorList(ConfigFlags):
+    result.setPrivateTools(tools)
+    return result
 
+def TrackerSensitiveDetectorListCfg(ConfigFlags):
     result = ComponentAccumulator()
-    SensitiveDetectorList=[]
+    tools = []
 
     if ConfigFlags.Detector.EnableFaserSCT:
-        accSCT,toolSCT = SctSensorSDCfg(ConfigFlags)
-        SensitiveDetectorList += [ toolSCT ]
-        result.merge(accSCT)
-        
-    return result, SensitiveDetectorList #List of tools here now! (CALL IT TOOL LIST?)
-
-def generateCaloSensitiveDetectorList(ConfigFlags):
+        from FaserSCT_G4_SD.FaserSCT_G4_SDToolConfig import SctSensorSDCfg
+        tools += [ result.popToolsAndMerge(SctSensorSDCfg(ConfigFlags)) ]
 
-    result = ComponentAccumulator()
-    SensitiveDetectorList=[]
-
-    if ConfigFlags.Detector.EnableEcal:
-        accEcal,toolEcal = EcalSensorSDCfg(ConfigFlags)
-        SensitiveDetectorList += [ toolEcal ]
-        result.merge(accEcal)
-    
-    return result, SensitiveDetectorList #List of tools here now! (CALL IT TOOL LIST?)
+    result.setPrivateTools(tools)
+    return result
 
-def generateSensitiveDetectorList(ConfigFlags):
+def SensitiveDetectorListCfg(ConfigFlags):
     result = ComponentAccumulator()
-    SensitiveDetectorList=[]
-    # SensitiveDetectorList += generateEnvelopeSensitiveDetectorList(ConfigFlags) # to update
-
-    acc_NeutrinoSensitiveDetector, NeutrinoSensitiveDetectorList = generateNeutrinoSensitiveDetectorList(ConfigFlags)
-    SensitiveDetectorList += NeutrinoSensitiveDetectorList
+    tools = []
 
-    acc_ScintSensitiveDetector, ScintSensitiveDetectorList = generateScintSensitiveDetectorList(ConfigFlags)
-    SensitiveDetectorList += ScintSensitiveDetectorList
+    tools += result.popToolsAndMerge(CaloSensitiveDetectorListCfg(ConfigFlags))
+    tools += result.popToolsAndMerge(ScintSensitiveDetectorListCfg(ConfigFlags))
+    tools += result.popToolsAndMerge(TrackerSensitiveDetectorListCfg(ConfigFlags))
+    tools += result.popToolsAndMerge(NeutrinoSensitiveDetectorListCfg(ConfigFlags))
 
-    acc_TrackerSensitiveDetector, TrackerSensitiveDetectorList = generateTrackerSensitiveDetectorList(ConfigFlags)
-    SensitiveDetectorList += TrackerSensitiveDetectorList
-
-    acc_CaloSensitiveDetector, CaloSensitiveDetectorList = generateCaloSensitiveDetectorList(ConfigFlags)
-    SensitiveDetectorList += CaloSensitiveDetectorList
-
-    result.merge(acc_NeutrinoSensitiveDetector)
-    result.merge(acc_ScintSensitiveDetector)
-    result.merge(acc_TrackerSensitiveDetector)
-    result.merge(acc_CaloSensitiveDetector)
-
-    result.setPrivateTools(SensitiveDetectorList)
+    result.setPrivateTools(tools)
     return result
 
 def SensitiveDetectorMasterToolCfg(ConfigFlags, name="SensitiveDetectorMasterTool", **kwargs):
     result = ComponentAccumulator()
-    accSensitiveDetector = generateSensitiveDetectorList(ConfigFlags)
-    kwargs.setdefault("SensitiveDetectors", result.popToolsAndMerge(accSensitiveDetector)) #list of tools
+    kwargs.setdefault("SensitiveDetectors", result.popToolsAndMerge(SensitiveDetectorListCfg(ConfigFlags)))
 
-    result.setPrivateTools(SensitiveDetectorMasterTool(name, **kwargs)) #note -this is still a public tool
+    result.setPrivateTools(CompFactory.SensitiveDetectorMasterTool(name, **kwargs))
     return result
 
 def getEmptySensitiveDetectorMasterTool(name="EmptySensitiveDetectorMasterTool", **kwargs):
-    return CfgMgr.SensitiveDetectorMasterTool(name, **kwargs)
+    result = ComponentAccumulator()
+    tool = result.popToolsAndMerge(CompFactory.SensitiveDetectorMasterTool(name, **kwargs))
+    result.setPrivateTools(tool)
+    return result
diff --git a/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py b/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py
index 992cfbe4fe506841adbbaa052540dc50168f1155..064cde911986868ace4708e37374a17e20a6de16 100644
--- a/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py
+++ b/Simulation/G4Faser/G4FaserTools/python/G4GeometryToolConfig.py
@@ -1,4 +1,5 @@
 # Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+from __future__ import print_function
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
@@ -11,6 +12,8 @@ from G4FaserTools.G4PhysicsRegionConfigNew import NeutrinoPhysicsRegionToolCfg,
 #the field config tools
 from G4FaserTools.G4FieldConfigNew import FASERFieldManagerToolCfg, EmulsionFieldManagerToolCfg, VetoFieldManagerToolCfg, TriggerFieldManagerToolCfg, PreshowerFieldManagerToolCfg, TrackerFieldManagerToolCfg, DipoleFieldManagerToolCfg, EcalFieldManagerToolCfg
 
+from G4FaserTools.G4FaserToolsConfigNew import SensitiveDetectorMasterToolCfg
+
 GeoDetectorTool=CompFactory.GeoDetectorTool
 from EmulsionGeoModel.EmulsionGeoModelConfig import EmulsionGeometryCfg
 from VetoGeoModel.VetoGeoModelConfig import VetoGeometryCfg
@@ -20,7 +23,7 @@ from FaserSCT_GeoModel.FaserSCT_GeoModelConfig import FaserSCT_GeometryCfg
 from DipoleGeoModel.DipoleGeoModelConfig import DipoleGeometryCfg
 from EcalGeoModel.EcalGeoModelConfig import EcalGeometryCfg
 
-BoxEnvelope, MaterialDescriptionTool, SmartlessnessTool, G4AtlasDetectorConstructionTool = CompFactory.getComps("BoxEnvelope", "MaterialDescriptionTool", "SmartlessnessTool", "G4AtlasDetectorConstructionTool",)
+BoxEnvelope, MaterialDescriptionTool, VoxelDensityTool, G4AtlasDetectorConstructionTool = CompFactory.getComps("BoxEnvelope", "MaterialDescriptionTool", "VoxelDensityTool", "G4AtlasDetectorConstructionTool",)
 
 from AthenaCommon.SystemOfUnits import mm
 
@@ -163,10 +166,20 @@ def MaterialDescriptionToolCfg(ConfigFlags, name="MaterialDescriptionTool", **kw
     return result
 
 
-def SmartlessnessToolCfg(ConfigFlags, name="SmartlessnessTool", **kwargs):
+def VoxelDensityToolCfg(ConfigFlags, name="VoxelDensityTool", **kwargs):
     ## kwargs.setdefault("SomeProperty", aValue)
+    voxelDensitySettings = {}
+    # if ConfigFlags.Detector.GeometryITkPixel:
+    #     voxelDensitySettings["ITkPixelDetector"] = 0.05
+    # if ConfigFlags.Detector.GeometryITkStrip:
+    #     voxelDensitySettings["ITkStrip::Barrel"] = 0.05
+    #     voxelDensitySettings["ITkStrip::ITkStrip_Forward"] = 0.05
+    #     ##The below is only needed temporarily, while we wait for
+    #     ##improved naming to be propagated to all necessary geo tags
+    #     voxelDensitySettings["ITkStrip::SCT_Forward"] = 0.05
+    kwargs.setdefault("VolumeVoxellDensityLevel",voxelDensitySettings)
     result = ComponentAccumulator()
-    result.setPrivateTools(SmartlessnessTool(name, **kwargs))
+    result.setPrivateTools(VoxelDensityTool(name, **kwargs))
     return result
 
 def getFASER_RegionCreatorList(ConfigFlags):
@@ -238,7 +251,7 @@ def getGeometryConfigurationTools(ConfigFlags):
     # package containing each tool, so G4FaserTools in this case
     result =ComponentAccumulator()
     geoConfigToolList += [result.popToolsAndMerge(MaterialDescriptionToolCfg(ConfigFlags))]
-    geoConfigToolList += [result.popToolsAndMerge(SmartlessnessToolCfg(ConfigFlags))]
+    geoConfigToolList += [result.popToolsAndMerge(VoxelDensityToolCfg(ConfigFlags))]
     return result, geoConfigToolList
 
 
@@ -251,7 +264,9 @@ def G4AtlasDetectorConstructionToolCfg(ConfigFlags, name="G4FaserDetectorConstru
     kwargs.setdefault("GeometryConfigurationTools", listOfGeoConfTools)
 
     # Getting this tool by name works, but not if you use getSensitiveDetectorMasterTool()
-    kwargs.setdefault('SenDetMasterTool', "SensitiveDetectorMasterTool" )
+    tool = result.popToolsAndMerge(SensitiveDetectorMasterToolCfg(ConfigFlags))
+    result.addPublicTool(tool)
+    kwargs.setdefault("SenDetMasterTool", result.getPublicTool(tool.name))
 
     toolGeo = result.popToolsAndMerge(FASEREnvelopeCfg(ConfigFlags))
     kwargs.setdefault("World", toolGeo)
diff --git a/Simulation/ISF/ISF_Core/FaserISF_Services/src/FaserTruthSvc.cxx b/Simulation/ISF/ISF_Core/FaserISF_Services/src/FaserTruthSvc.cxx
index c3e0607252a06e4d439cf298851b6d2884cef3b9..b1a64408271187de69318c448fb727056c66f704 100644
--- a/Simulation/ISF/ISF_Core/FaserISF_Services/src/FaserTruthSvc.cxx
+++ b/Simulation/ISF/ISF_Core/FaserISF_Services/src/FaserTruthSvc.cxx
@@ -270,7 +270,7 @@ void ISF::FaserTruthSvc::recordIncidentToMCTruth( ISF::IFaserTruthIncident& ti)
     if (m_ignoreUndefinedBarcodes) {
       ATH_MSG_WARNING("Unable to generate new Particle Barcode. Continuing due to 'IgnoreUndefinedBarcodes'==True");
     } else {
-      ATH_MSG_FATAL("Unable to generate new Particle Barcode in region " << ti.geoID() << ". Aborting");
+      ATH_MSG_FATAL("Unable to generate new Particle Barcode in region " << ti.geoID() << ", at vertex (" <<  vtx->position().x() << ", " << vtx->position().y() << ", " << vtx->position().z() << "). Aborting");
       abort();
     }
   }
diff --git a/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/python/FaserISF_HepMC_ToolsConfigNew.py b/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/python/FaserISF_HepMC_ToolsConfigNew.py
index a49c04991034dd011d9066b5b9116d317a1cd042..0f251682c98dfba7a08fd7e9a7427fb6a330e91b 100644
--- a/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/python/FaserISF_HepMC_ToolsConfigNew.py
+++ b/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/python/FaserISF_HepMC_ToolsConfigNew.py
@@ -163,7 +163,8 @@ def FaserDipoleTruthStrategyCfg(ConfigFlags, name="ISF_FaserDipoleTruthStrategy"
     # Save truth in Dipole region
     #
     kwargs.setdefault('Regions', [FaserRegion.fFaserDipole,
-                                  FaserRegion.fFaserNeutrino])
+                                  FaserRegion.fFaserNeutrino,
+                                  FaserRegion.fFaserCavern])
     kwargs.setdefault('ParentMinEkin', 1000.0*MeV)
     kwargs.setdefault('ChildMinEkin', 1000.0*MeV)
     result.setPrivateTools(ISF__FaserTruthStrategy(name, **kwargs))
@@ -182,10 +183,10 @@ def FaserTruthStrategyCfg(ConfigFlags, name="ISF_FaserTruthStrategy", **kwargs):
     kwargs.setdefault('Regions', [
                                 #   FaserRegion.fFaserNeutrino,
                                   FaserRegion.fFaserScintillator,
-                                  FaserRegion.fFaserTracker,
+                                  FaserRegion.fFaserTracker])
                                 #   FaserRegion.fFaserDipole,
                                 #   FaserRegion.fFaserCalorimeter,
-                                  FaserRegion.fFaserCavern])
+                                #   FaserRegion.fFaserCavern])
     # kwargs.setdefault('ParentMinEkin', 0.1*MeV)
     # kwargs.setdefault('ChildMinEkin', 0.1*MeV)
     result.setPrivateTools(ISF__FaserTruthStrategy(name, **kwargs))
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.cxx b/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.cxx
index a4725975ac05e81da114e34f703a482c8df7fbf5..51514fb5b599630e9c32d04c406439c5ea891991 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.cxx
+++ b/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.cxx
@@ -2,8 +2,8 @@
   Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p1.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p1.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p3.h"
+//#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p2.h"
 #include "FaserSiHitCollectionCnv.h"
 
 
@@ -17,14 +17,14 @@ FaserSiHitCollection_PERS* FaserSiHitCollectionCnv::createPersistent(FaserSiHitC
 
 FaserSiHitCollection* FaserSiHitCollectionCnv::createTransient() {
     MsgStream mlog(msgSvc(), "FaserSiHitCollectionConverter" );
-    FaserSiHitCollectionCnv_p1   converter_p1;
+    FaserSiHitCollectionCnv_p3   converter_p3;
 
-    static const pool::Guid   p1_guid("FF9508DE-3E25-425D-9556-16D319DCE0E1");
+    static const pool::Guid   p3_guid("FF9508DE-3E25-425D-9556-16D319DCE0E1");
 
     FaserSiHitCollection       *trans_cont(0);
-    if( this->compareClassGuid(p1_guid)) {
-      std::unique_ptr< FaserSiHitCollection_p1 >   col_vect( this->poolReadObject< FaserSiHitCollection_p1 >() );
-      trans_cont = converter_p1.createTransient( col_vect.get(), mlog );
+    if( this->compareClassGuid(p3_guid)) {
+      std::unique_ptr< FaserSiHitCollection_p3 >   col_vect( this->poolReadObject< FaserSiHitCollection_p3 >() );
+      trans_cont = converter_p3.createTransient( col_vect.get(), mlog );
     }  else {
       throw std::runtime_error("Unsupported persistent version of Data container");
     }
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.h b/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.h
index 1467731fec80812428550f9c75cc3393dcf07047..3a81e19fa0671a028948f7217aa256c06e94c9a1 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.h
+++ b/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/src/FaserSiHitCollectionCnv.h
@@ -6,14 +6,14 @@
 #define FASERSIHITCOLLECTIONCNV
 
 #include "TrackerSimEvent/FaserSiHitCollection.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p1.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p1.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p3.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p3.h"
 #include "AthenaPoolCnvSvc/T_AthenaPoolCustomCnv.h"
 // Gaudi
 #include "GaudiKernel/MsgStream.h"
 // typedef to the latest persistent version
-typedef FaserSiHitCollection_p1     FaserSiHitCollection_PERS;
-typedef FaserSiHitCollectionCnv_p1  FaserSiHitCollectionCnv_PERS;
+typedef FaserSiHitCollection_p3     FaserSiHitCollection_PERS;
+typedef FaserSiHitCollectionCnv_p3  FaserSiHitCollectionCnv_PERS;
 
 class FaserSiHitCollectionCnv  : public T_AthenaPoolCustomCnv<FaserSiHitCollection, FaserSiHitCollection_PERS > {
   friend class CnvFactory<FaserSiHitCollectionCnv>;
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt
index f18b094587235a28640989f322dd66b1a65d284b..7e51dca0f68d6ec72f510b641c9ab535094db6ba 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt
@@ -22,5 +22,5 @@ atlas_add_dictionary( TrackerSimEventTPCnvDict
                       TrackerSimEventTPCnv/TrackerSimEventTPCnvDict.h
                       TrackerSimEventTPCnv/selection.xml
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv TrackerSimEvent TestTools StoreGateLib SGtests Identifier TrackerSimEventTPCnv )
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaPoolCnvSvcLib GaudiKernel GeneratorObjectsTPCnv TrackerSimEvent TestTools StoreGateLib SGtests Identifier TrackerSimEventTPCnv AthenaKernel )
 
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p1.h b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p2.h
similarity index 60%
rename from Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p1.h
rename to Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p2.h
index 3a4bec3cdaca91575a51d5589310e9b89306c395..791df726101c1e4178b3d9ceb1248174a91b7fd0 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p1.h
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p2.h
@@ -2,30 +2,30 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef FASERSIHITCNV_P1_H
-#define FASERSIHITCNV_P1_H
+#ifndef FASERSIHITCNV_P2_H
+#define FASERSIHITCNV_P2_H
 
 /*
 Transient/Persistent converter for FaserSiHit class
 */
 
 #include "TrackerSimEvent/FaserSiHit.h"
-#include "FaserSiHit_p1.h"
+#include "FaserSiHit_p2.h"
 
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 
 class MsgStream;
 
 
-class FaserSiHitCnv_p1  : public T_AthenaPoolTPCnvBase<FaserSiHit, FaserSiHit_p1>
+class FaserSiHitCnv_p2  : public T_AthenaPoolTPCnvBase<FaserSiHit, FaserSiHit_p2>
 {
 public:
 
-  FaserSiHitCnv_p1() {}
+  FaserSiHitCnv_p2() {}
 
-  virtual void          persToTrans(const FaserSiHit_p1* persObj, FaserSiHit*
+  virtual void          persToTrans(const FaserSiHit_p2* persObj, FaserSiHit*
 transObj, MsgStream &log);
-  virtual void          transToPers(const FaserSiHit* transObj, FaserSiHit_p1*
+  virtual void          transToPers(const FaserSiHit* transObj, FaserSiHit_p2*
 persObj, MsgStream &log);
 };
 
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p1.h b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p3.h
similarity index 61%
rename from Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p1.h
rename to Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p3.h
index 488221edc81c645ae56e453a2cafb18195f1242d..3f2eb8610682ccf021f0c57904dd9487d35e559e 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p1.h
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p3.h
@@ -2,31 +2,31 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef FASERSIHITCOLLECTIONCNV_P1_H
-#define FASERSIHITCOLLECTIONCNV_P1_H
+#ifndef FASERSIHITCOLLECTIONCNV_P3_H
+#define FASERSIHITCOLLECTIONCNV_P3_H
 
-// FaserSiHitCollectionCnv_p1, T/P separation of FaserSi Hits
+// FaserSiHitCollectionCnv_p3, T/P separation of FaserSi Hits
 // author D.Costanzo <davide.costanzo@cern.ch>
 // author O.Arnaez <olivier.arnaez@cern.ch>
 
 #include "AthenaPoolCnvSvc/T_AthenaPoolTPConverter.h"
 #include "TrackerSimEvent/FaserSiHitCollection.h"
-#include "FaserSiHitCollection_p1.h"
+#include "FaserSiHitCollection_p3.h"
 
 
-class FaserSiHitCollectionCnv_p1 : public T_AthenaPoolTPCnvBase<FaserSiHitCollection, FaserSiHitCollection_p1>
+class FaserSiHitCollectionCnv_p3 : public T_AthenaPoolTPCnvBase<FaserSiHitCollection, FaserSiHitCollection_p3>
 {
  public:
 
-  FaserSiHitCollectionCnv_p1()  {};
+  FaserSiHitCollectionCnv_p3()  {};
 
-  virtual FaserSiHitCollection* createTransient(const FaserSiHitCollection_p1* persObj, MsgStream &log);
+  virtual FaserSiHitCollection* createTransient(const FaserSiHitCollection_p3* persObj, MsgStream &log);
 
-  virtual void	persToTrans(const FaserSiHitCollection_p1* persCont,
+  virtual void	persToTrans(const FaserSiHitCollection_p3* persCont,
                             FaserSiHitCollection* transCont,
                             MsgStream &log) ;
   virtual void	transToPers(const FaserSiHitCollection* transCont,
-                            FaserSiHitCollection_p1* persCont,
+                            FaserSiHitCollection_p3* persCont,
                             MsgStream &log) ;
 
  private:
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p1.h b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p3.h
similarity index 88%
rename from Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p1.h
rename to Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p3.h
index fa4018a016b99d2bc7baf9e46a8711fa6278e787..b07b2e3810eaed573449bd4c389befee571bea7f 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p1.h
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p3.h
@@ -2,8 +2,8 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef FASERSIHITCOLLECTION_P1_H
-#define FASERSIHITCOLLECTION_P1_H
+#ifndef FASERSIHITCOLLECTION_P3_H
+#define FASERSIHITCOLLECTION_P3_H
 
 /*
 
@@ -14,11 +14,11 @@ Authors: Davide Costanzo Rob Duxfield
 #include <vector>
 #include <string>
 
-class FaserSiHitCollection_p1
+class FaserSiHitCollection_p3
 {
  public:
 /// Default constructor
-  FaserSiHitCollection_p1 ();
+  FaserSiHitCollection_p3 ();
   //private:
 
   std::vector<float>          m_hit1_meanTime;   //  1 element per string
@@ -52,6 +52,6 @@ class FaserSiHitCollection_p1
 // inlines
 
 inline
-FaserSiHitCollection_p1::FaserSiHitCollection_p1 () {}
+FaserSiHitCollection_p3::FaserSiHitCollection_p3 () {}
 
 #endif
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p1.h b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p2.h
similarity index 83%
rename from Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p1.h
rename to Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p2.h
index 159caf56dd047bd4d7d7fa505b3076dd96b07534..fa8e50a85a8fceafa20e4dbed50f60c052510d0e 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p1.h
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p2.h
@@ -2,12 +2,12 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef FASERSIHIT_P1_H
-#define FASERSIHIT_P1_H
+#ifndef FASERSIHIT_P2_H
+#define FASERSIHIT_P2_H
 
 #include "GeneratorObjectsTPCnv/HepMcParticleLink_p2.h"
 
-class FaserSiHit_p1 {
+class FaserSiHit_p2 {
  public:
   float m_stX, m_stY, m_stZ;
   float m_enX, m_enY, m_enZ;
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnvDict.h b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnvDict.h
index 6146be90a917d1eaf49b9a7c9996f5cc4eb66262..a730fca90074a9da71420e41651384173aa298cf 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnvDict.h
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnvDict.h
@@ -7,14 +7,14 @@
 
 //-----------------------------------------------------------------------------
 //
-// file:   TrackerSimEventTPCnvDict_p1.h
+// file:   TrackerSimEventTPCnvDict.h
 //
 //-----------------------------------------------------------------------------
 
 
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p1.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p1.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p1.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p1.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p2.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p3.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p3.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p2.h"
 
 #endif // TRACKERSIMEVENTTPCNV_TRACKERSIMEVENTTPCNVDICT_H
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/selection.xml b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/selection.xml
index 72a04265e6367e090af8a543dd0a550d4e948af5..7684404421c37267df94656b57ff9067dcce9503 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/selection.xml
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/TrackerSimEventTPCnv/selection.xml
@@ -1,6 +1,6 @@
 <lcgdict>
     <!-- FaserSiHits -->
-    <class name="FaserSiHit_p1" />
-    <class name="std::vector<FaserSiHit_p1>" />
-    <class name="FaserSiHitCollection_p1" id="FF9508DE-3E25-425D-9556-16D319DCE0E1" />     
+    <class name="FaserSiHit_p2" />
+    <class name="std::vector<FaserSiHit_p2>" />
+    <class name="FaserSiHitCollection_p3" id="FF9508DE-3E25-425D-9556-16D319DCE0E1" />     
 </lcgdict>
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCnv_p1.cxx b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCnv_p2.cxx
similarity index 85%
rename from Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCnv_p1.cxx
rename to Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCnv_p2.cxx
index a6e9c320e1118143f505e4f3ad3f7234a3afd498..5dde908345fee67f41b4f7f5c4b71407d25c926e 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCnv_p1.cxx
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCnv_p2.cxx
@@ -6,12 +6,12 @@
 #include "Identifier/Identifier.h"
 #include "GeneratorObjectsTPCnv/HepMcParticleLinkCnv_p2.h"
 
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p1.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p1.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHit_p2.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCnv_p2.h"
 
 
 void
-FaserSiHitCnv_p1::persToTrans(const FaserSiHit_p1* persObj, FaserSiHit* transObj, MsgStream &log)
+FaserSiHitCnv_p2::persToTrans(const FaserSiHit_p2* persObj, FaserSiHit* transObj, MsgStream &log)
 {
   HepMcParticleLinkCnv_p2 HepMcPLCnv;
   HepMcParticleLink link;
@@ -32,7 +32,7 @@ FaserSiHitCnv_p1::persToTrans(const FaserSiHit_p1* persObj, FaserSiHit* transObj
 
 
 void
-FaserSiHitCnv_p1::transToPers(const FaserSiHit* transObj, FaserSiHit_p1* persObj, MsgStream &log)
+FaserSiHitCnv_p2::transToPers(const FaserSiHit* transObj, FaserSiHit_p2* persObj, MsgStream &log)
 {
 //     if (log.level() <= MSG::DEBUG) log << MSG::DEBUG << "FaserSiHitCnv_p1::transToPers called " << endmsg;
    HepMcParticleLinkCnv_p2 HepMcPLCnv;
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCollectionCnv_p1.cxx b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCollectionCnv_p3.cxx
similarity index 82%
rename from Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCollectionCnv_p1.cxx
rename to Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCollectionCnv_p3.cxx
index c31eed267329943e8a0627881057281bcb7248df..ee4b293a83af7fbb970f12a48d63ce67285e476d 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCollectionCnv_p1.cxx
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/src/TrackerHits/FaserSiHitCollectionCnv_p3.cxx
@@ -4,8 +4,8 @@
 
 #include "TrackerSimEvent/FaserSiHit.h"
 #include "TrackerSimEvent/FaserSiHitCollection.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p1.h"
-#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p1.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollection_p3.h"
+#include "TrackerSimEventTPCnv/TrackerHits/FaserSiHitCollectionCnv_p3.h"
 #include "GeneratorObjects/HepMcParticleLink.h"
 
 #include <cmath>
@@ -14,8 +14,12 @@
 #include "CLHEP/Geometry/Point3D.h"
 // Gaudi
 #include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+
 // Athena
 #include "StoreGate/StoreGateSvc.h"
+#include "AthenaKernel/ExtendedEventContext.h"
+
 
 //  * * *  stolen from eflowRec  * * *  //
 inline double phicorr(double a)
@@ -53,14 +57,14 @@ inline double cycle(double a, double b)
 }
 
 
-const double FaserSiHitCollectionCnv_p1::m_persEneUnit = 1.0e-5;
-const double FaserSiHitCollectionCnv_p1::m_persLenUnit = 1.0e-5;
-const double FaserSiHitCollectionCnv_p1::m_persAngUnit = 1.0e-5;
-const double FaserSiHitCollectionCnv_p1::m_2bHalfMaximum = pow(2.0, 15.0);
-const int FaserSiHitCollectionCnv_p1::m_2bMaximum = (unsigned short)(-1);
+const double FaserSiHitCollectionCnv_p3::m_persEneUnit = 1.0e-5;
+const double FaserSiHitCollectionCnv_p3::m_persLenUnit = 1.0e-5;
+const double FaserSiHitCollectionCnv_p3::m_persAngUnit = 1.0e-5;
+const double FaserSiHitCollectionCnv_p3::m_2bHalfMaximum = pow(2.0, 15.0);
+const int FaserSiHitCollectionCnv_p3::m_2bMaximum = (unsigned short)(-1);
 
 
-void FaserSiHitCollectionCnv_p1::transToPers(const FaserSiHitCollection* transCont, FaserSiHitCollection_p1* persCont, MsgStream &/*log*/)
+void FaserSiHitCollectionCnv_p3::transToPers(const FaserSiHitCollection* transCont, FaserSiHitCollection_p3* persCont, MsgStream &log)
 {
   // Finds hits belonging to a "string" (in which the end point of one hit is the same as the start point of the next) and
   // persistifies the end point of each hit plus the start point of the first hit in each string.
@@ -77,6 +81,8 @@ void FaserSiHitCollectionCnv_p1::transToPers(const FaserSiHitCollection* transCo
   static const double dRcut = 1.0e-7;
   static const double dTcut = 1.0;
 
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+  const IProxyDict* proxy = Atlas::getExtendedEventContext(ctx).proxy();
   const HepMcParticleLink * lastLink=nullptr;
   int lastId = -1;
   double stringFirstTheta = 0.0;
@@ -98,11 +104,22 @@ void FaserSiHitCollectionCnv_p1::transToPers(const FaserSiHitCollection* transCo
 
     if ( !lastLink || (siHit->particleLink() != *lastLink) ) {
 
-      // store barcode once for set of consecutive hits with same barcode
+      // store barcode, eventIndex and McEventCollection once for set of consecutive hits with same barcode
 
       lastLink = &(siHit->particleLink());
       persCont->m_barcode.push_back(lastLink->barcode());
-      persCont->m_mcEvtIndex.push_back(lastLink->eventIndex());
+      unsigned short index{0};
+      const HepMcParticleLink::index_type position =
+        HepMcParticleLink::getEventPositionInCollection(lastLink->eventIndex(),
+                                                        lastLink->getEventCollection(),
+                                                        proxy).at(0);
+      if (position!=0) {
+        index = lastLink->eventIndex();
+        if(lastLink->eventIndex()!=static_cast<HepMcParticleLink::index_type>(index)) {
+          log << MSG::WARNING << "Attempting to persistify an eventIndex larger than max unsigned short!" << endmsg;
+        }
+      }
+      persCont->m_mcEvtIndex.push_back(index);
       persCont->m_evtColl.push_back(lastLink->getEventCollectionAsChar());
 
       if (idx > 0) {
@@ -241,15 +258,17 @@ void FaserSiHitCollectionCnv_p1::transToPers(const FaserSiHitCollection* transCo
 }
 
 
-FaserSiHitCollection* FaserSiHitCollectionCnv_p1::createTransient(const FaserSiHitCollection_p1* persObj, MsgStream &log) {
+FaserSiHitCollection* FaserSiHitCollectionCnv_p3::createTransient(const FaserSiHitCollection_p3* persObj, MsgStream &log) {
   std::unique_ptr<FaserSiHitCollection> trans(std::make_unique<FaserSiHitCollection>("DefaultCollectionName",persObj->m_nHits.size()));
   persToTrans(persObj, trans.get(), log);
   return(trans.release());
 }
 
 
-void FaserSiHitCollectionCnv_p1::persToTrans(const FaserSiHitCollection_p1* persCont, FaserSiHitCollection* transCont, MsgStream &/*log*/)
+void FaserSiHitCollectionCnv_p3::persToTrans(const FaserSiHitCollection_p3* persCont, FaserSiHitCollection* transCont, MsgStream &/*log*/)
 {
+  const EventContext& ctx = Gaudi::Hive::currentContext();
+
   unsigned int hitCount = 0;
   unsigned int angleCount = 0;
   unsigned int idxBC = 0;
@@ -299,7 +318,11 @@ void FaserSiHitCollectionCnv_p1::persToTrans(const FaserSiHitCollection_p1* pers
 
         HepGeom::Point3D<double> endThis( endLast + r );
 
-        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), HepMcParticleLink::IS_INDEX );
+        HepMcParticleLink::PositionFlag flag = HepMcParticleLink::IS_INDEX;
+        if (persCont->m_mcEvtIndex[idxBC] == 0) {
+          flag = HepMcParticleLink::IS_POSITION;
+        }
+        HepMcParticleLink partLink( persCont->m_barcode[idxBC], persCont->m_mcEvtIndex[idxBC], HepMcParticleLink::ExtendedBarCode::eventCollectionFromChar(persCont->m_evtColl[idxBC]), flag, ctx );
         transCont->Emplace( endLast, endThis, eneLoss, meanTime, partLink, persCont->m_id[idxId]);
 
         endLast = endThis;
diff --git a/Tracker/TrackerG4/FaserSCT_G4_SD/python/FaserSCT_G4_SDToolConfig.py b/Tracker/TrackerG4/FaserSCT_G4_SD/python/FaserSCT_G4_SDToolConfig.py
index eb4fb53749d2a8e01bfd52992421322e91115cbd..1e4fa355daf2e1a9c381b80aa5a2ad8002dbc881 100644
--- a/Tracker/TrackerG4/FaserSCT_G4_SD/python/FaserSCT_G4_SDToolConfig.py
+++ b/Tracker/TrackerG4/FaserSCT_G4_SD/python/FaserSCT_G4_SDToolConfig.py
@@ -18,5 +18,7 @@ def SctSensorSDCfg(ConfigFlags, name="SctSensorSD", **kwargs):
     kwargs.setdefault("LogicalVolumeNames", ["SCT::BRLSensor"])
     kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    # result.merge(acc)
-    return result, FaserSctSensorSDTool(name, **kwargs)
+    result = ComponentAccumulator()
+    result.setPrivateTools(CompFactory.FaserSctSensorSDTool(name, **kwargs))
+    return result
+
diff --git a/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.cxx b/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.cxx
index 98b1c29f1f14f6f217b27d6223f7112e286e2111..6902a70138cdad5f8957f0f7e0886d36e6d8213e 100755
--- a/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.cxx
+++ b/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.cxx
@@ -73,6 +73,38 @@ namespace Tracker
       , m_chi2(0)
       , m_edm(0)
       , m_ndf(0)
+      , m_preYhistX_s1l1m0(0)
+      , m_preYhistY_s1l1m0(0)
+      , m_preXhistX_s1l1m0(0)
+      , m_preXhistY_s1l1m0(0)
+      , m_preYhistX_s1l1m1(0)
+      , m_preYhistY_s1l1m1(0)
+      , m_preXhistX_s1l1m1(0)
+      , m_preXhistY_s1l1m1(0)
+      , m_preYhistX_s1l1m2(0)
+      , m_preYhistY_s1l1m2(0)
+      , m_preXhistX_s1l1m2(0)
+      , m_preXhistY_s1l1m2(0)
+      , m_preYhistX_s1l1m3(0)
+      , m_preYhistY_s1l1m3(0)
+      , m_preXhistX_s1l1m3(0)
+      , m_preXhistY_s1l1m3(0)
+      , m_preYhistX_s1l1m4(0)
+      , m_preYhistY_s1l1m4(0)
+      , m_preXhistX_s1l1m4(0)
+      , m_preXhistY_s1l1m4(0)
+      , m_preYhistX_s1l1m5(0)
+      , m_preYhistY_s1l1m5(0)
+      , m_preXhistX_s1l1m5(0)
+      , m_preXhistY_s1l1m5(0)
+      , m_preYhistX_s1l1m6(0)
+      , m_preYhistY_s1l1m6(0)
+      , m_preXhistX_s1l1m6(0)
+      , m_preXhistY_s1l1m6(0)
+      , m_preYhistX_s1l1m7(0)
+      , m_preYhistY_s1l1m7(0)
+      , m_preXhistX_s1l1m7(0)
+      , m_preXhistY_s1l1m7(0)
       , m_thistSvc("THistSvc", name)
   { 
     declareProperty("MaxChi2", m_maxchi2=20);
@@ -149,7 +181,71 @@ namespace Tracker
     m_chi2=new TH1D("chi2","chi2",100,0,100);
     m_edm=new TH1D("edm","edm",100,0,0.01);
     m_ndf=new TH1D("ndf","ndf",10,0,10);
+    m_preYhistX_s1l1m0=new TProfile("YvsX_s1l1m0","residual vs x for staion 1 layer 1 module 0",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m0=new TProfile("XvsX_s1l1m0","residual vs x for staion 1 layer 1 module 0",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m0=new TProfile("XvsY_s1l1m0","residual vs x for staion 1 layer 1 module 0",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m0=new TProfile("YvsY_s1l1m0","residual vs x for staion 1 layer 1 module 0",100,-150,150,-0.1,0.1);
+    m_preYhistX_s1l1m1=new TProfile("YvsX_s1l1m1","residual vs x for staion 1 layer 1 module 1",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m1=new TProfile("XvsX_s1l1m1","residual vs x for staion 1 layer 1 module 1",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m1=new TProfile("XvsY_s1l1m1","residual vs x for staion 1 layer 1 module 1",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m1=new TProfile("YvsY_s1l1m1","residual vs x for staion 1 layer 1 module 1",100,-150,150,-0.1,0.1);
+    m_preYhistX_s1l1m2=new TProfile("YvsX_s1l1m2","residual vs x for staion 1 layer 1 module 2",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m2=new TProfile("XvsX_s1l1m2","residual vs x for staion 1 layer 1 module 2",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m2=new TProfile("XvsY_s1l1m2","residual vs x for staion 1 layer 1 module 2",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m2=new TProfile("YvsY_s1l1m2","residual vs x for staion 1 layer 1 module 2",100,-150,150,-0.1,0.1);
+    m_preYhistX_s1l1m3=new TProfile("YvsX_s1l1m3","residual vs x for staion 1 layer 1 module 3",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m3=new TProfile("XvsX_s1l1m3","residual vs x for staion 1 layer 1 module 3",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m3=new TProfile("XvsY_s1l1m3","residual vs x for staion 1 layer 1 module 3",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m3=new TProfile("YvsY_s1l1m3","residual vs x for staion 1 layer 1 module 3",100,-150,150,-0.1,0.1);
+    m_preYhistX_s1l1m4=new TProfile("YvsX_s1l1m4","residual vs x for staion 1 layer 1 module 4",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m4=new TProfile("XvsX_s1l1m4","residual vs x for staion 1 layer 1 module 4",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m4=new TProfile("XvsY_s1l1m4","residual vs x for staion 1 layer 1 module 4",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m4=new TProfile("YvsY_s1l1m4","residual vs x for staion 1 layer 1 module 4",100,-150,150,-0.1,0.1);
+    m_preYhistX_s1l1m5=new TProfile("YvsX_s1l1m5","residual vs x for staion 1 layer 1 module 5",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m5=new TProfile("XvsX_s1l1m5","residual vs x for staion 1 layer 1 module 5",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m5=new TProfile("XvsY_s1l1m5","residual vs x for staion 1 layer 1 module 5",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m5=new TProfile("YvsY_s1l1m5","residual vs x for staion 1 layer 1 module 5",100,-150,150,-0.1,0.1);
+    m_preYhistX_s1l1m6=new TProfile("YvsX_s1l1m6","residual vs x for staion 1 layer 1 module 6",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m6=new TProfile("XvsX_s1l1m6","residual vs x for staion 1 layer 1 module 6",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m6=new TProfile("XvsY_s1l1m6","residual vs x for staion 1 layer 1 module 6",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m6=new TProfile("YvsY_s1l1m6","residual vs x for staion 1 layer 1 module 6",100,-150,150,-0.1,0.1);
+    m_preYhistX_s1l1m7=new TProfile("YvsX_s1l1m7","residual vs x for staion 1 layer 1 module 7",100,-150,150,-0.1,0.1);
+    m_preXhistX_s1l1m7=new TProfile("XvsX_s1l1m7","residual vs x for staion 1 layer 1 module 7",100,-150,150,-0.1,0.1);
+    m_preXhistY_s1l1m7=new TProfile("XvsY_s1l1m7","residual vs x for staion 1 layer 1 module 7",100,-150,150,-0.1,0.1);
+    m_preYhistY_s1l1m7=new TProfile("YvsY_s1l1m7","residual vs x for staion 1 layer 1 module 7",100,-150,150,-0.1,0.1);
     CHECK(m_thistSvc->regTree("/TrackerSPFit/spfit",m_tree));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m0",m_preYhistX_s1l1m0));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m0",m_preXhistX_s1l1m0));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m0",m_preXhistY_s1l1m0));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m0",m_preYhistY_s1l1m0));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m1",m_preYhistX_s1l1m1));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m1",m_preXhistX_s1l1m1));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m1",m_preXhistY_s1l1m1));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m1",m_preYhistY_s1l1m1));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m2",m_preYhistX_s1l1m2));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m2",m_preXhistX_s1l1m2));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m2",m_preXhistY_s1l1m2));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m2",m_preYhistY_s1l1m2));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m3",m_preYhistX_s1l1m3));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m3",m_preXhistX_s1l1m3));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m3",m_preXhistY_s1l1m3));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m3",m_preYhistY_s1l1m3));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m4",m_preYhistX_s1l1m4));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m4",m_preXhistX_s1l1m4));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m4",m_preXhistY_s1l1m4));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m4",m_preYhistY_s1l1m4));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m5",m_preYhistX_s1l1m5));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m5",m_preXhistX_s1l1m5));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m5",m_preXhistY_s1l1m5));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m5",m_preYhistY_s1l1m5));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m6",m_preYhistX_s1l1m6));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m6",m_preXhistX_s1l1m6));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m6",m_preXhistY_s1l1m6));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m6",m_preYhistY_s1l1m6));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_x_s1l1m7",m_preYhistX_s1l1m7));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_x_s1l1m7",m_preXhistX_s1l1m7));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualX_y_s1l1m7",m_preXhistY_s1l1m7));
+    CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_residualY_y_s1l1m7",m_preYhistY_s1l1m7));
     CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_x",m_hist_x));
     CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_y",m_hist_y));
     CHECK(m_thistSvc->regHist("/TrackerSPFit/sp/sp_z",m_hist_z));
@@ -220,6 +316,7 @@ namespace Tracker
     m_tree->Branch("track_p2",&m_track_p2);
     m_tree->Branch("track_p3",&m_track_p3);
     if(m_saveallcluster){
+      m_tree->Branch("cluster_all_identify",&m_cluster_all_identify);
       m_tree->Branch("cluster_all_local_x",&m_cluster_all_local_x);
       m_tree->Branch("cluster_all_local_y",&m_cluster_all_local_y);
       m_tree->Branch("cluster_global_x",&m_cluster_all_global_x);
@@ -234,21 +331,26 @@ namespace Tracker
       m_tree->Branch("cluster_all_strip",&m_cluster_all_strip);
     }
     if(m_saveallsp){
+      m_tree->Branch("sp_all_identify0", &m_sp_all_identify0);
+      m_tree->Branch("sp_all_identify1", &m_sp_all_identify1);
+      m_tree->Branch("sp_all_x_local", &m_sp_all_x_local);
+      m_tree->Branch("sp_all_y_local", &m_sp_all_y_local);
       m_tree->Branch("sp_all_x", &m_sp_all_x);
       m_tree->Branch("sp_all_y", &m_sp_all_y);
       m_tree->Branch("sp_all_z", &m_sp_all_z);
       m_tree->Branch("sp_all_station", &m_sp_all_station);
       m_tree->Branch("sp_all_layer", &m_sp_all_layer);
       m_tree->Branch("sp_all_module", &m_sp_all_module);
-//      if(m_saveallcluster){
-//	m_tree->Branch("sp_all_clus1_index", &m_sp_all_clus1_index);
-//	m_tree->Branch("sp_all_clus2_index", &m_sp_all_clus2_index);
-//      }
+      //      if(m_saveallcluster){
+      //	m_tree->Branch("sp_all_clus1_index", &m_sp_all_clus1_index);
+      //	m_tree->Branch("sp_all_clus2_index", &m_sp_all_clus2_index);
+      //      }
     }
   }
   //-------------------------------------------------------------------------
   void TrackerSPFit::clearVariables() const {
     if(m_saveallcluster){
+      m_cluster_all_identify.clear();
       m_cluster_all_local_x.clear();
       m_cluster_all_local_y.clear();
       m_cluster_all_global_x.clear();
@@ -263,13 +365,17 @@ namespace Tracker
       m_cluster_all_strip.clear();
     }
     if(m_saveallsp){
+      m_sp_all_identify0.clear();
+      m_sp_all_identify1.clear();
+      m_sp_all_x_local.clear();
+      m_sp_all_y_local.clear();
       m_sp_all_x.clear();
       m_sp_all_y.clear();
       m_sp_all_z.clear();
-//      if(m_saveallcluster){
-//	m_sp_all_clus1_index.clear();
-//	m_sp_all_clus2_index.clear();
-//      }
+      //      if(m_saveallcluster){
+      //	m_sp_all_clus1_index.clear();
+      //	m_sp_all_clus2_index.clear();
+      //      }
       m_sp_all_station.clear();
       m_sp_all_layer.clear();
       m_sp_all_module.clear();
@@ -337,23 +443,24 @@ namespace Tracker
 	  ++m_numberOfCluster;
 	  const Tracker::FaserSCT_Cluster* clus=&(**clusters);
 	  m_cluster_all_global_x.push_back(clus->globalPosition().x());
-	   m_cluster_all_global_y.push_back(clus->globalPosition().y());
-	   m_cluster_all_global_z.push_back(clus->globalPosition().z());
-	   m_cluster_all_local_x.push_back(clus->localPosition().x());
-	   m_cluster_all_local_y.push_back(clus->localPosition().y());
-	   m_cluster_all_phiwidth.push_back(clus->width().phiR());
-	   Identifier elementID = clus->identify();
-	   m_cluster_all_station.push_back( m_idHelper->station(elementID));
-	   m_cluster_all_layer.push_back( m_idHelper->layer(elementID));
-	   int ietamodule = m_idHelper->eta_module(elementID);
-	   int iphimodule = m_idHelper->phi_module(elementID);
-	   if(ietamodule<0)iphimodule+=4;
-	   m_cluster_all_module.push_back(iphimodule);
-	   m_cluster_all_side.push_back(m_idHelper->side(elementID));
-	   m_cluster_all_strip.push_back(m_idHelper->strip(elementID));
-	   m_cluster_all_size.push_back(clus->rdoList().size());
-	 }
-       }
+	  m_cluster_all_global_y.push_back(clus->globalPosition().y());
+	  m_cluster_all_global_z.push_back(clus->globalPosition().z());
+	  m_cluster_all_local_x.push_back(clus->localPosition().x());
+	  m_cluster_all_local_y.push_back(clus->localPosition().y());
+	  m_cluster_all_phiwidth.push_back(clus->width().phiR());
+	  Identifier elementID = clus->identify();
+	  m_cluster_all_station.push_back( m_idHelper->station(elementID));
+	  m_cluster_all_identify.push_back( elementID.get_compact());
+	  m_cluster_all_layer.push_back( m_idHelper->layer(elementID));
+	  int ietamodule = m_idHelper->eta_module(elementID);
+	  int iphimodule = m_idHelper->phi_module(elementID);
+	  if(ietamodule<0)iphimodule+=4;
+	  m_cluster_all_module.push_back(iphimodule);
+	  m_cluster_all_side.push_back(m_idHelper->side(elementID));
+	  m_cluster_all_strip.push_back(m_idHelper->strip(elementID));
+	  m_cluster_all_size.push_back(clus->rdoList().size());
+	}
+      }
 
     }
 
@@ -380,23 +487,28 @@ namespace Tracker
 	for (; sp_begin != sp_end; ++sp_begin){
 	  ++m_numberOfSP;
 	  const Tracker::FaserSCT_SpacePoint* sp=&(**sp_begin);
+	  m_sp_all_x_local.push_back(sp->localParameters().x());
+	  m_sp_all_y_local.push_back(sp->localParameters().y());
 	  m_sp_all_x.push_back(sp->globalPosition().x());
 	  m_sp_all_y.push_back(sp->globalPosition().y());
 	  m_sp_all_z.push_back(sp->globalPosition().z());
 	  m_sp_all_station.push_back(m_idHelper->station(elementID));
 	  m_sp_all_layer.push_back(m_idHelper->layer(elementID));
+	  m_sp_all_identify0.push_back(sp->clusterList().first->identify().get_compact());
+	  m_sp_all_identify1.push_back(sp->clusterList().second->identify().get_compact());
 	  int ietamodule = m_idHelper->eta_module(elementID);
 	  int iphimodule = m_idHelper->phi_module(elementID);
 	  if(ietamodule<0)iphimodule+=4;
 	  m_sp_all_module.push_back(iphimodule);
+	  ATH_MSG_DEBUG( "SCT spacepoint found: " << sp->globalPosition().x()<<" , "<<sp->globalPosition().y()<<" , "<<sp->globalPosition().z()<<" , "<<m_idHelper->station(elementID)<<" , "<<m_idHelper->layer(elementID)<<" , "<<m_idHelper->eta_module(elementID)<<" , "<<m_idHelper->phi_module(elementID) );
 	  /* to be updated
-	  if(m_saveallcluster){
-	    const Tracker::FaserSCT_ClusterCollection *ptr1 = sct_clcontainer->indexFindPtr(sp->elemIDList().first());
-	    const Tracker::FaserSCT_ClusterCollection *ptr2 = sct_clcontainer->indexFindPtr(sp->elemIDList().second());
-	    m_sp_all_clus1_index.push_back(findClusterIndex(sp,ptr1));
-	    m_sp_all_clus2_index.push_back(findClusterIndex(sp,ptr2));
-	  }
-	  */
+	     if(m_saveallcluster){
+	     const Tracker::FaserSCT_ClusterCollection *ptr1 = sct_clcontainer->indexFindPtr(sp->elemIDList().first());
+	     const Tracker::FaserSCT_ClusterCollection *ptr2 = sct_clcontainer->indexFindPtr(sp->elemIDList().second());
+	     m_sp_all_clus1_index.push_back(findClusterIndex(sp,ptr1));
+	     m_sp_all_clus2_index.push_back(findClusterIndex(sp,ptr2));
+	     }
+	     */
 	}
       }
     }
@@ -444,11 +556,12 @@ namespace Tracker
 	  m_hist_eta->Fill(sp->eta());
 	  m_hist_phi->Fill(sp->phi());
 	  Amg::Vector3D gloPos=sp->globalPosition();
+	  Amg::Vector3D newgloPos;
 	  m_hist_x->Fill(gloPos.x());
 	  m_hist_y->Fill(gloPos.y());
 	  m_hist_z->Fill(gloPos.z());
 	  struct SP_Seed tmp{gloPos,sp->globCovariance(),ilayer,imodule};
-	ATH_MSG_DEBUG( "TrackerSPFit algorithm found no space points" );
+	  ATH_MSG_DEBUG( "TrackerSPFit algorithm found no space points" );
 	  if(istation==1)
 	    sp_sta0.push_back(tmp);
 	  else if(istation==2)
@@ -477,6 +590,7 @@ namespace Tracker
       ATH_MSG_INFO( "TrackerSPFit found "<<tracks_sta0.size()<<" track segments in station 0 " );
       if(tracks_sta0.size()>0){
 	ifTrack=true;
+	ATH_MSG_DEBUG( "TrackerSPFit fill the track info0 " );
 	for(auto track:tracks_sta0){
 	  auto pre=track.predicted;
 	  auto pos=track.pos;
@@ -495,9 +609,11 @@ namespace Tracker
 	  m_sp_track_y_residual.push_back(pre.y()-pos.y());
 	  m_sp_track_z_residual.push_back(pre.z()-pos.z());
 	  ATH_MSG_DEBUG(" fill the result "<<pre.x()<<" "<<pre.y()<<"  "<<pre.z()<<" "<<pos.x()<<" "<<pos.y()<<" "<<pos.z());
+	  ATH_MSG_DEBUG(" Station/layer/module =1"<<"/"<<track.layer<<"/"<<track.module<<" , and track ID "<<m_numberOfTrack/3);
 	  m_sp_track_station.push_back(0);
 	  m_sp_track_layer.push_back(track.layer);
 	  m_sp_track_module.push_back(track.module);
+
 	  if(m_bias){
 	    m_track_chi2.push_back(track.chi2);
 	    m_track_edm.push_back(track.edm);
@@ -510,6 +626,59 @@ namespace Tracker
 	  if(track.layer==0){ m_residual_x_plane0->Fill(pre.x()-pos.x());m_residual_y_plane0->Fill(pre.y()-pos.y());}
 	  if(track.layer==1){ m_residual_x_plane1->Fill(pre.x()-pos.x());m_residual_y_plane1->Fill(pre.y()-pos.y());}
 	  if(track.layer==2){ m_residual_x_plane2->Fill(pre.x()-pos.x());m_residual_y_plane2->Fill(pre.y()-pos.y());}
+	  if(track.layer==1){
+	    ATH_MSG_DEBUG(" only fill the layer 1, module =  "<<track.module);
+	    ATH_MSG_DEBUG(" measured =  "<<pos.x()<<" , "<<pos.y()<<" , "<<pos.z());
+	    ATH_MSG_DEBUG(" predicted =  "<<pre.x()<<" , "<<pre.y()<<" , "<<pre.z());
+	    if(track.module==0){
+	      m_preYhistX_s1l1m0->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m0->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m0->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m0->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	    if(track.module==1){
+	      m_preYhistX_s1l1m1->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m1->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m1->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m1->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	    if(track.module==2){
+	      m_preYhistX_s1l1m2->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m2->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m2->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m2->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	    if(track.module==3){
+	      m_preYhistX_s1l1m3->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m3->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m3->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m3->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	    if(track.module==4){
+	      m_preYhistX_s1l1m4->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m4->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m4->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m4->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	    if(track.module==5){
+	      m_preYhistX_s1l1m5->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m5->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m5->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m5->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	    if(track.module==6){
+	      m_preYhistX_s1l1m6->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m6->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m6->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m6->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	    if(track.module==7){
+	      m_preYhistX_s1l1m7->Fill(pos.x(),pos.y()-pre.y());
+	      m_preYhistY_s1l1m7->Fill(pos.y(),pos.y()-pre.y());
+	      m_preXhistX_s1l1m7->Fill(pos.x(),pos.x()-pre.x());
+	      m_preXhistY_s1l1m7->Fill(pos.y(),pos.x()-pre.x());
+	    }
+	  }
 	}
       }
     }
@@ -610,6 +779,26 @@ namespace Tracker
     ATH_MSG_INFO( m_numberOfCluster<< " sct Cluster processed" );
     ATH_MSG_INFO( m_numberOfSPCol<< " sct SP collections processed" );
     ATH_MSG_INFO( m_numberOfSP<< " sct SP processed" );
+
+
+    //do a fitting
+    TF1* fpol1=new TF1("fpol1","pol1(0)");
+    m_preYhistX_s1l1m0->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 0 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
+    m_preYhistX_s1l1m1->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 1 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
+    m_preYhistX_s1l1m2->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 2 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
+    m_preYhistX_s1l1m3->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 3 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
+    m_preYhistX_s1l1m4->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 4 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
+    m_preYhistX_s1l1m5->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 5 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
+    m_preYhistX_s1l1m6->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 6 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
+    m_preYhistX_s1l1m7->Fit(fpol1);
+    ATH_MSG_INFO("Fitting the residualY vs X for module 7 : parameter = "<<fpol1->GetParameter(0)<<" "<<fpol1->GetParameter(1));
     return StatusCode::SUCCESS;
   }
 
@@ -630,15 +819,17 @@ namespace Tracker
       for(unsigned int i0=0;i0<layer0.size();i0++){
 	for(unsigned int i1=0;i1<layer1.size();i1++){
 	  for(unsigned int i2=0;i2<layer2.size();i2++){
-	    if(m_bias){
-	      //for biased residual
-	      auto tmp=makeTrackSeg(layer0[i0],layer1[i1],layer2[i2],maxchi2);
-	      tracks.insert(tracks.end(),tmp.begin(),tmp.end());
-	    }
-	    else{
-	      //for un-biased residual
-	      auto tmp=makeTrackSeg(layer0[i0],layer1[i1],layer2[i2]);
-	      tracks.insert(tracks.end(),tmp.begin(),tmp.end());
+	    auto tmp_bias=makeTrackSeg(layer0[i0],layer1[i1],layer2[i2],maxchi2);
+	    if(tmp_bias.size()>0){
+	      if(m_bias){
+		//for biased residual
+		tracks.insert(tracks.end(),tmp_bias.begin(),tmp_bias.end());
+	      }
+	      else{
+		//for un-biased residual
+		auto tmp=makeTrackSeg(layer0[i0],layer1[i1],layer2[i2]);
+		tracks.insert(tracks.end(),tmp.begin(),tmp.end());
+	      }
 	    }
 	  }
 	}
@@ -716,7 +907,7 @@ namespace Tracker
       m_ndf->Fill(ndf);
 
       if(chi2<maxchi2){
-//	result.Print(std::cout);
+	//	result.Print(std::cout);
 	const double *fitParam=result.GetParams();
 	ATH_MSG_DEBUG(" fit status: ook "<<chi2<<" "<<edm<<" "<<ndf<<" "<<fitParam[0]<<" "<<fitParam[1]<<" "<<fitParam[2]<<" "<<fitParam[3]);
 	Amg::Vector3D err0(sqrt((sp0.cov)(0,0)),sqrt((sp0.cov)(1,1)),sqrt((sp0.cov)(2,2)));
@@ -738,20 +929,21 @@ namespace Tracker
     return Amg::Vector3D(p[0]+p[1]*z,p[2]+p[3]*z,z);
   }
 
+
   /*
    * need to be updated
-  int TrackerSPFit::findClusterIndex(const Tracker::FaserSCT_SpacePoint* sp, const Tracker::FaserSCT_ClusterCollection* ptr)const {
-    if (ptr!=nullptr) {
-      //loop though collection to find matching PRD.
-      Tracker::FaserSCT_ClusterCollection::const_iterator collIt    = ptr->begin();
-      Tracker::FaserSCT_ClusterCollection::const_iterator collItEnd = ptr->end();
-      for ( ; collIt!=collItEnd; collIt++) {
-	if ( (*collIt)->identify()==id1 ) 
-	  clus1= &(**collIt);
-      }
-    }
+   int TrackerSPFit::findClusterIndex(const Tracker::FaserSCT_SpacePoint* sp, const Tracker::FaserSCT_ClusterCollection* ptr)const {
+   if (ptr!=nullptr) {
+//loop though collection to find matching PRD.
+Tracker::FaserSCT_ClusterCollection::const_iterator collIt    = ptr->begin();
+Tracker::FaserSCT_ClusterCollection::const_iterator collItEnd = ptr->end();
+for ( ; collIt!=collItEnd; collIt++) {
+if ( (*collIt)->identify()==id1 ) 
+clus1= &(**collIt);
+}
+}
 
-  }
-  */
+}
+*/
 
 }
diff --git a/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.h b/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.h
index ae76af9941ae8b6b6480699108d0ebf48b1125b7..3db42689651f647cb465eb6f671346780ec96940 100755
--- a/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.h
+++ b/Tracker/TrackerRecAlgs/TrackerSPFit/src/TrackerSPFit.h
@@ -27,6 +27,7 @@
 #include <vector>
 #include "TH1.h"
 #include "TH2.h"
+#include "TF1.h"
 #include "TTree.h"
 #include "TGraph2DErrors.h"
 #include "TMath.h"
@@ -161,6 +162,39 @@ namespace Tracker
       TH1* m_edm;
       TH1* m_ndf;
       ServiceHandle<ITHistSvc>  m_thistSvc;
+      //for alignment constants
+      TProfile* m_preYhistX_s1l1m0;
+      TProfile* m_preYhistY_s1l1m0;
+      TProfile* m_preXhistX_s1l1m0;
+      TProfile* m_preXhistY_s1l1m0;
+      TProfile* m_preYhistX_s1l1m1;
+      TProfile* m_preYhistY_s1l1m1;
+      TProfile* m_preXhistX_s1l1m1;
+      TProfile* m_preXhistY_s1l1m1;
+      TProfile* m_preYhistX_s1l1m2;
+      TProfile* m_preYhistY_s1l1m2;
+      TProfile* m_preXhistX_s1l1m2;
+      TProfile* m_preXhistY_s1l1m2;
+      TProfile* m_preYhistX_s1l1m3;
+      TProfile* m_preYhistY_s1l1m3;
+      TProfile* m_preXhistX_s1l1m3;
+      TProfile* m_preXhistY_s1l1m3;
+      TProfile* m_preYhistX_s1l1m4;
+      TProfile* m_preYhistY_s1l1m4;
+      TProfile* m_preXhistX_s1l1m4;
+      TProfile* m_preXhistY_s1l1m4;
+      TProfile* m_preYhistX_s1l1m5;
+      TProfile* m_preYhistY_s1l1m5;
+      TProfile* m_preXhistX_s1l1m5;
+      TProfile* m_preXhistY_s1l1m5;
+      TProfile* m_preYhistX_s1l1m6;
+      TProfile* m_preYhistY_s1l1m6;
+      TProfile* m_preXhistX_s1l1m6;
+      TProfile* m_preXhistY_s1l1m6;
+      TProfile* m_preYhistX_s1l1m7;
+      TProfile* m_preYhistY_s1l1m7;
+      TProfile* m_preXhistX_s1l1m7;
+      TProfile* m_preXhistY_s1l1m7;
 
       mutable int m_eventNumber;
       mutable std::vector<double> m_sp_track_x;
@@ -195,6 +229,7 @@ namespace Tracker
       mutable std::vector<double> m_cluster_all_local_x;
       mutable std::vector<double> m_cluster_all_local_y;
       mutable std::vector<double> m_cluster_all_phiwidth;
+      mutable std::vector<long long int> m_cluster_all_identify;
       mutable std::vector<int> m_cluster_all_size;
       mutable std::vector<int> m_cluster_all_station;
       mutable std::vector<int> m_cluster_all_layer;
@@ -202,12 +237,16 @@ namespace Tracker
       mutable std::vector<int> m_cluster_all_side;
       mutable std::vector<int> m_cluster_all_strip;
       bool m_saveallsp;
+      mutable std::vector<double> m_sp_all_x_local;
+      mutable std::vector<double> m_sp_all_y_local;
       mutable std::vector<double> m_sp_all_x;
       mutable std::vector<double> m_sp_all_y;
       mutable std::vector<double> m_sp_all_z;
       mutable std::vector<int> m_sp_all_station;
       mutable std::vector<int> m_sp_all_layer;
       mutable std::vector<int> m_sp_all_module;
+      mutable std::vector<long long int> m_sp_all_identify0;
+      mutable std::vector<long long int> m_sp_all_identify1;
 
   };
 
diff --git a/Tracker/TrackerSimEvent/src/SiCharge.cxx b/Tracker/TrackerSimEvent/src/SiCharge.cxx
index f24f342adb044ab4f6c79708207efff3b7193f2b..7d089dc004420ab9759be31c3f2bf3e90738c752 100644
--- a/Tracker/TrackerSimEvent/src/SiCharge.cxx
+++ b/Tracker/TrackerSimEvent/src/SiCharge.cxx
@@ -35,7 +35,7 @@ SiCharge::SiCharge(const double& charge,const double& time,
   m_charge(charge),
   m_time(time),
   m_processType(processType),
-  m_partLink(HepMcParticleLink((unsigned int) 0, 0))
+  m_partLink(HepMcParticleLink())
 {}
 
 
diff --git a/Tracker/TrackerSimEvent/src/SiTotalCharge.cxx b/Tracker/TrackerSimEvent/src/SiTotalCharge.cxx
index 2d17b4d1144e899f7d098bb3657f2d27ab669b98..f04abd9f70130ca4d77cf6293d9bf94c86ebecbb 100644
--- a/Tracker/TrackerSimEvent/src/SiTotalCharge.cxx
+++ b/Tracker/TrackerSimEvent/src/SiTotalCharge.cxx
@@ -18,14 +18,14 @@
 SiTotalCharge::SiTotalCharge(const alloc_t& alloc) :
   m_charge(0),
   m_chargeComposition(alloc),
-  m_emptyLink((unsigned int) 0, 0)
+  m_emptyLink()
 {}
 
 // Copy constructor:
 SiTotalCharge::SiTotalCharge(const SiTotalCharge &totalCharge) :
   m_charge(totalCharge.m_charge),
   m_chargeComposition(totalCharge.m_chargeComposition),
-  m_emptyLink((unsigned int) 0, 0)
+  m_emptyLink()
 {}
 
 // Assignment operator:
diff --git a/Tracking/Acts/FaserActsGeometry/CMakeLists.txt b/Tracking/Acts/FaserActsGeometry/CMakeLists.txt
index bd4c0658954dc8c5e1fb0adde80e36c2e2b0583d..a121316e188cc27c35f3d90f9a81b569089b9d19 100755
--- a/Tracking/Acts/FaserActsGeometry/CMakeLists.txt
+++ b/Tracking/Acts/FaserActsGeometry/CMakeLists.txt
@@ -17,7 +17,7 @@ atlas_add_library( FaserActsGeometryLib
 		    src/FaserActsDetectorElement.cxx
 		    src/FaserActsLayerBuilder.cxx
 		    src/CuboidVolumeBuilder.cxx
-			src/FaserActsJsonGeometryConverter.cxx
+#			src/FaserActsJsonGeometryConverter.cxx
 		    src/util/*.cxx
 		    PUBLIC_HEADERS FaserActsGeometry
 		    INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${BOOST_INCLUDE_DIRS}
@@ -51,8 +51,8 @@ atlas_add_component( FaserActsGeometry
 ##src/*.cxx
 			    src/FaserActsSurfaceMappingTool.cxx
 				src/FaserActsMaterialMapping.cxx
-				src/FaserActsMaterialJsonWriterTool.cxx
-				src/FaserActsJsonGeometryConverter.cxx
+#				src/FaserActsMaterialJsonWriterTool.cxx
+#				src/FaserActsJsonGeometryConverter.cxx
 		        src/FaserActsTrackingGeometrySvc.cxx
 		        src/FaserActsTrackingGeometryTool.cxx
                 src/FaserActsWriteTrackingGeometry.cxx
diff --git a/Tracking/Acts/FaserActsGeometry/src/components/FaserActsGeometry_entries.cxx b/Tracking/Acts/FaserActsGeometry/src/components/FaserActsGeometry_entries.cxx
index 9be7649a9397fa25de520848ede7ecad3bcc4cc7..7beb0342f184a3c72a4fa4c154fdc00cc5bd9522 100755
--- a/Tracking/Acts/FaserActsGeometry/src/components/FaserActsGeometry_entries.cxx
+++ b/Tracking/Acts/FaserActsGeometry/src/components/FaserActsGeometry_entries.cxx
@@ -17,7 +17,7 @@
 //#include "FaserActsGeometry/GeomShiftCondAlg.h"
 //#include "FaserActsGeometry/FaserActsWriteTrackingGeometryTransforms.h"
 #include "FaserActsGeometry/FaserActsVolumeMappingTool.h"
-#include "FaserActsGeometry/FaserActsMaterialJsonWriterTool.h"
+//#include "FaserActsGeometry/FaserActsMaterialJsonWriterTool.h"
 #include "FaserActsGeometry/FaserActsMaterialMapping.h"
 #include "FaserActsGeometry/FaserActsSurfaceMappingTool.h"
 
@@ -36,6 +36,6 @@ DECLARE_COMPONENT( FaserActsAlignmentCondAlg )
 //DECLARE_COMPONENT( FaserActsWriteTrackingGeometryTransforms )
 //DECLARE_COMPONENT( FaserGeomShiftCondAlg )
 DECLARE_COMPONENT( FaserActsVolumeMappingTool )
-DECLARE_COMPONENT( FaserActsMaterialJsonWriterTool )
+//DECLARE_COMPONENT( FaserActsMaterialJsonWriterTool )
 DECLARE_COMPONENT( FaserActsMaterialMapping )
 DECLARE_COMPONENT( FaserActsSurfaceMappingTool )
diff --git a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
index a59281e363f8fd5dde3136a6b753d0eed8c0d0d6..21e5ed799d3caeaf33d4fc85102b9be48e18e599 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
+++ b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
@@ -22,10 +22,24 @@ atlas_add_library( FaserActsKalmanFilterLib
 )
 
 atlas_add_component(FaserActsKalmanFilter
-    src/*.cxx
-    src/components/*.cxx
-    FaserActsKalmanFilter/*.h
-    FaserActsKalmanFilter/src/*.cxx
+    FaserActsKalmanFilter/CombinatorialKalmanFilterAlg.h
+    FaserActsKalmanFilter/FaserActsGeometryContainers.h
+    FaserActsKalmanFilter/FaserActsRecMultiTrajectory.h
+    FaserActsKalmanFilter/IndexSourceLink.h
+    FaserActsKalmanFilter/Measurement.h
+    FaserActsKalmanFilter/SimWriterTool.h
+    FaserActsKalmanFilter/SPSeedBasedInitialParameterTool.h
+    FaserActsKalmanFilter/SPSimpleInitialParameterTool.h
+    FaserActsKalmanFilter/TrajectoryWriterTool.h
+    FaserActsKalmanFilter/TruthBasedInitialParameterTool.h
+    src/CombinatorialKalmbanFilterAlg.cxx
+    src/SimWriterTool.cxx
+    src/SPSeedBasedInitialParameterTool.cxx
+    src/SPSimpleInitialParameterTool.cxx
+    src/TrackFindingAlgorithmFunction.cxx
+    src/TrajectoryWriterTool.cxx
+    src/TruthBasedInitialParameterTool.cxx
+    src/components/FaserActsKalmanFilter_entries.cxx
     PUBLIC_HEADERS FaserActsKalmanFilter
     INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${BOOST_INCLUDE_DIRS}
     LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES}
diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/CombinatorialKalmanFilterAlg.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/CombinatorialKalmanFilterAlg.h
index db3f086debf367530d61ba47c58bb6602a84ff3e..4b750614a3f496a9cabef0352c223d9b9e5a9658 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/CombinatorialKalmanFilterAlg.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/CombinatorialKalmanFilterAlg.h
@@ -63,8 +63,8 @@ class CombinatorialKalmanFilterAlg : public AthReentrantAlgorithm {
 
   ToolHandle<IFaserActsTrackingGeometryTool> m_trackingGeometryTool{this, "TrackingGeometryTool", "FaserActsTrackingGeometryTool"};
 //  ToolHandle<SPSeedBasedInitialParameterTool> m_initialParameterTool{this, "InitialParameterTool", "SPSeedBasedInitialParameterTool"};
-  ToolHandle<SPSimpleInitialParameterTool> m_initialParameterTool{this, "InitialParameterTool", "SPSimpleInitialParameterTool"};
-  //ToolHandle<TruthBasedInitialParameterTool> m_initialParameterTool{this, "InitialParameterTool", "TruthBasedInitialParameterTool"};
+//  ToolHandle<SPSimpleInitialParameterTool> m_initialParameterTool{this, "InitialParameterTool", "SPSimpleInitialParameterTool"};
+  ToolHandle<TruthBasedInitialParameterTool> m_initialParameterTool{this, "InitialParameterTool", "TruthBasedInitialParameterTool"};
   ToolHandle<TrajectoryWriterTool> m_trajectoryWriterTool{this, "OutputTool", "TrajectoryWriterTool"};
   SG::ReadCondHandleKey<FaserFieldCacheCondObj> m_fieldCondObjInputKey {this, "FaserFieldCacheCondObj", "fieldCondObj", "Name of the Magnetic Field conditions object key"};
   SG::ReadHandleKey<FaserSCT_SpacePointContainer> m_SpacePointContainerKey{this, "SpacePointsSCTName", "SCT_SpacePointContainer", "SCT space point container"};
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CombinatorialKalmbanFilterAlg.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CombinatorialKalmbanFilterAlg.cxx
index 08e9f2b2283089fbcda678d65234c3cce03c3c7e..f5c547e61418ca7d5d0e4eb8b1cbdb9651e9316b 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CombinatorialKalmbanFilterAlg.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CombinatorialKalmbanFilterAlg.cxx
@@ -127,10 +127,10 @@ return StatusCode::RECOVERABLE;
   std::vector<Identifier> sp_ids;
   std::vector<Tracker::FaserSCT_SpacePoint> sps;
 
-  std::vector<Acts::Vector3> pos1;
-  std::vector<Acts::Vector3> pos2;
-  std::vector<Acts::Vector3> pos3;
-  pos1.clear();pos2.clear();pos3.clear();
+//  std::vector<Acts::Vector3> pos1;
+//  std::vector<Acts::Vector3> pos2;
+//  std::vector<Acts::Vector3> pos3;
+//  pos1.clear();pos2.clear();pos3.clear();
   std::vector<int> layer1;
   layer1.clear();
   FaserSCT_SpacePointContainer::const_iterator coll_it = spcontainer->begin();
@@ -148,12 +148,12 @@ return StatusCode::RECOVERABLE;
       ThisMeasurement meas(sourceLink, indices, sp->localParameters(), sp->localCovariance());
       measurements.emplace_back(std::move(meas));
 
-      if(m_idHelper->station(sp->clusterList().first->identify())==1){
-	pos1.push_back(Acts::Vector3(sp->globalPosition().x(),sp->globalPosition().y(),sp->globalPosition().z()));
-	layer1.push_back(m_idHelper->layer(sp->clusterList().first->identify()));
-      }
-      if(m_idHelper->station(sp->clusterList().first->identify())==2)pos2.push_back(Acts::Vector3(sp->globalPosition().x(),sp->globalPosition().y(),sp->globalPosition().z()));
-      if(m_idHelper->station(sp->clusterList().first->identify())==3)pos3.push_back(Acts::Vector3(sp->globalPosition().x(),sp->globalPosition().y(),sp->globalPosition().z()));
+//      if(m_idHelper->station(sp->clusterList().first->identify())==1) {
+//	      pos1.push_back(Acts::Vector3(sp->globalPosition().x(),sp->globalPosition().y(),sp->globalPosition().z()));
+//	      layer1.push_back(m_idHelper->layer(sp->clusterList().first->identify()));
+//      }
+//      if(m_idHelper->station(sp->clusterList().first->identify())==2)pos2.push_back(Acts::Vector3(sp->globalPosition().x(),sp->globalPosition().y(),sp->globalPosition().z()));
+//      if(m_idHelper->station(sp->clusterList().first->identify())==3)pos3.push_back(Acts::Vector3(sp->globalPosition().x(),sp->globalPosition().y(),sp->globalPosition().z()));
       sp_ids.push_back(sp->clusterList().first->identify());
       sps.push_back(*sp);
       }
@@ -161,25 +161,24 @@ return StatusCode::RECOVERABLE;
 
       // Get initial parameters
       // FIXME: Get initial parameters from clusterFitter or SeedFinder not MC!
-      //  std::vector<Acts::CurvilinearTrackParameters> initialParameters;
-      //  auto initialParameter = m_initialParameterTool->getInitialParameters(sp_ids);
-      //  initialParameters.push_back(initialParameter);
-      //std::cout<<"n spacepoints in stations : "<<pos1.size()<<" "<<pos2.size()<<" "<<pos3.size()<<std::endl;
+        std::vector<Acts::CurvilinearTrackParameters> initialParameters;
+        auto initialParameter = m_initialParameterTool->getInitialParameters(sp_ids);
+        initialParameters.push_back(initialParameter);
 //      if(pos1.size()<1||pos2.size()<1||pos3.size()<1) return StatusCode::SUCCESS;
-      std::vector<Acts::CurvilinearTrackParameters> initialParameters;
-      initialParameters.clear();
-      Acts::Vector3 pos1a(0,0,0);
-      Acts::Vector3 pos2a(0,0,0);
-      Acts::Vector3 pos3a(0,0,0);
-      for(long unsigned int i1=0;i1<pos1.size();i1++)pos1a+=pos1[i1];
-      for(long unsigned int i1=0;i1<pos2.size();i1++)pos2a+=pos2[i1];
-      for(long unsigned int i1=0;i1<pos3.size();i1++)pos3a+=pos3[i1];
-      pos1a/=pos1.size();
-      pos2a/=pos2.size();
-      pos3a/=pos3.size();
-      m_nsp1+=pos1.size();
-      m_nsp2+=pos2.size();
-      m_nsp3+=pos3.size();
+//      std::vector<Acts::CurvilinearTrackParameters> initialParameters;
+//      initialParameters.clear();
+//      Acts::Vector3 pos1a(0,0,0);
+//      Acts::Vector3 pos2a(0,0,0);
+//      Acts::Vector3 pos3a(0,0,0);
+//      for(long unsigned int i1=0;i1<pos1.size();i1++)pos1a+=pos1[i1];
+//      for(long unsigned int i1=0;i1<pos2.size();i1++)pos2a+=pos2[i1];
+//      for(long unsigned int i1=0;i1<pos3.size();i1++)pos3a+=pos3[i1];
+//      pos1a/=pos1.size();
+//      pos2a/=pos2.size();
+//      pos3a/=pos3.size();
+//      m_nsp1+=pos1.size();
+//      m_nsp2+=pos2.size();
+//      m_nsp3+=pos3.size();
 //      for(int i1=0;i1<pos1.size();i1++){
 //      for(int i2=0;i2<pos2.size();i2++){
 //      for(int i3=0;i3<pos3.size();i3++){
@@ -196,19 +195,19 @@ return StatusCode::RECOVERABLE;
       initialParameters.push_back(initialParameter);
       */
  // for one stations
-      if(pos1.size()>2) {
-      std::vector<Acts::Vector3> pos10;
-      std::vector<Acts::Vector3> pos11;
-      std::vector<Acts::Vector3> pos12;
-      pos10.clear();pos11.clear();pos12.clear();
-	for(std::size_t ipos=0;ipos<pos1.size();ipos++){
-	  if(layer1[ipos]==0)pos10.push_back(pos1[ipos]);
-	  if(layer1[ipos]==1)pos11.push_back(pos1[ipos]);
-	  if(layer1[ipos]==2)pos12.push_back(pos1[ipos]);
-	}
-	if(pos10.size()>0&&pos11.size()>0&&pos12.size()>0){
-      auto initialParameter=m_initialParameterTool->getInitialParameters_1station(pos10,pos11,pos12);
-      initialParameters.insert(initialParameters.end(),initialParameter.begin(),initialParameter.end());
+//      if(pos1.size()>2) {
+//      std::vector<Acts::Vector3> pos10;
+//      std::vector<Acts::Vector3> pos11;
+//      std::vector<Acts::Vector3> pos12;
+//      pos10.clear();pos11.clear();pos12.clear();
+//	for(std::size_t ipos=0;ipos<pos1.size();ipos++){
+//	  if(layer1[ipos]==0)pos10.push_back(pos1[ipos]);
+//	  if(layer1[ipos]==1)pos11.push_back(pos1[ipos]);
+//	  if(layer1[ipos]==2)pos12.push_back(pos1[ipos]);
+//	}
+//	if(pos10.size()>0&&pos11.size()>0&&pos12.size()>0){
+//      auto initialParameter=m_initialParameterTool->getInitialParameters_1station(pos10,pos11,pos12);
+//      initialParameters.insert(initialParameters.end(),initialParameter.begin(),initialParameter.end());
       /*
        //for two stations
       if(pos1.size()>1&&pos2.size()>0) {
@@ -263,7 +262,7 @@ return StatusCode::RECOVERABLE;
     {Acts::GeometryIdentifier(), {chi2Max, nMax}},
   };
   std::unique_ptr<const Acts::Logger> logger
-      = Acts::getDefaultLogger("CombinatorialKalmanFilter", Acts::Logging::VERBOSE);
+      = Acts::getDefaultLogger("CombinatorialKalmanFilter", Acts::Logging::INFO);
 
   // Set the CombinatorialKalmanFilter options
   CombinatorialKalmanFilterAlg::TrackFinderOptions options(
@@ -292,10 +291,11 @@ return StatusCode::RECOVERABLE;
       const auto& trackFindingOutput = result.value();
       std::unique_ptr<Trk::Track> track = makeTrack(geoContext, result,sps);
       m_ntracks++;
-      if(track!=nullptr)
-	outputTracks->push_back(std::move(track));
-      else
-	ATH_MSG_DEBUG("No Trk::Track is created" );
+      if(track!=nullptr) {
+        outputTracks->push_back(std::move(track));
+      } else {
+        ATH_MSG_DEBUG("No Trk::Track is created" );
+      }
       // Create a Trajectories result struct
       trajectories.emplace_back(std::move(trackFindingOutput.fittedStates),
                                 std::move(trackFindingOutput.lastMeasurementIndices),
@@ -310,16 +310,16 @@ return StatusCode::RECOVERABLE;
   }
 
   m_trajectoryWriterTool->writeout(trajectories, geoContext,initialParameters);
-      }
-      }
+//  }
+//      }
 
-  if(outputTracks->size()>0)                                              
-    ATH_MSG_DEBUG("Found "<<outputTracks->size()<<" tracks");
-  else
+  if(outputTracks->size()>0) {
+    ATH_MSG_DEBUG("Found " << outputTracks->size() << " tracks");
+  } else {
     ATH_MSG_WARNING("No track is found");
+  }
 
   ATH_CHECK(trackContainer.record(std::move(outputTracks)));
-
   return StatusCode::SUCCESS;
 }
 
@@ -327,8 +327,8 @@ return StatusCode::RECOVERABLE;
 StatusCode CombinatorialKalmanFilterAlg::finalize() {
   ATH_MSG_INFO("CombinatorialKalmanFilterAlg::finalize");
   ATH_MSG_INFO("Summary info");
-  ATH_MSG_INFO("In taotal, "<<m_nevents<<" events, and "<<m_nseeds<<" seeds, and "<<m_ntracks<<" tracks");
-  ATH_MSG_INFO("In taotal, "<<m_nsp1<<" , "<<m_nsp2<<" , "<<m_nsp3<<" ,"<<m_nsp10<<" , "<<m_nsp11<<" , "<<m_ncom);
+  ATH_MSG_INFO("In total, "<<m_nevents<<" events, and "<<m_nseeds<<" seeds, and "<<m_ntracks<<" tracks");
+  ATH_MSG_INFO("In total, "<<m_nsp1<<" , "<<m_nsp2<<" , "<<m_nsp3<<" ,"<<m_nsp10<<" , "<<m_nsp11<<" , "<<m_ncom);
 
   return StatusCode::SUCCESS;
 }
@@ -346,149 +346,77 @@ Acts::MagneticFieldContext CombinatorialKalmanFilterAlg::getMagneticFieldContext
   return Acts::MagneticFieldContext(fieldCondObj);
 }
 
-/*
-void CombinatorialKalmanFilterAlg::makeTrack(Acts::GeometryContext& tgContext, TrajectoryiesContainer trajectories,
-      const FaserSCT_SpacePointContainer*  seed_spcollection, TrackCollection* outputTracks
-    ) const {
-  // Loop over the trajectories
-  int iTraj = 0;
-  for (const auto& traj : trajectories) {
-
-    // The trajectory entry indices and the multiTrajectory
-    const auto& [trackTips, mj] = traj.trajectory();
-    if (trackTips.empty()) {
-      ATH_MSG_WARNING("Empty multiTrajectory.");
-      continue;
-    }
-    // Get the entry index for the single trajectory
-    auto& trackTip = trackTips.front();
-    std::cout<<"trackTip = "<<trackTip<<std::endl;
-
-    // Collect the trajectory summary info
-    auto trajState =
-      Acts::MultiTrajectoryHelpers::trajectoryState(mj, trackTip);
-      if (traj.hasTrackParameters(trackTip))
-	{
-	  242     mj.visitBackwards(trackTip, [&](const auto &state) {
-	      243       /// Only fill the track states with non-outlier measurement
-	      244       auto typeFlags = state.typeFlags();
-	      245       if (not typeFlags.test(Acts::TrackStateFlag::MeasurementFlag))
-	      246       {
-	      247         return true;
-	      248       }
-	      252       /// Get the geometry ID
-	      253       auto geoID = state.referenceSurface().geometryId();
-	      254       m_volumeID.push_back(geoID.volume());
-	      255       m_layerID.push_back(geoID.layer());
-	      256       m_moduleID.push_back(geoID.sensitive());
-	      257 
-	      258       // expand the local measurements into the full bound space
-	      259       Acts::BoundVector meas =
-	      260           state.projector().transpose() * state.calibrated();
-	      261 
-	      262       // extract local and global position
-	      263       Acts::Vector2 local(meas[Acts::eBoundLoc0], meas[Acts::eBoundLoc1]);
-	      264       Acts::Vector3 mom(1, 1, 1);
-	         Acts::Vector3 global =
-		   266           surface.localToGlobal(geoContext, local, mom);
-		 jjjjj
-	}
-}
-
-*/
 std::unique_ptr<Trk::Track>
-//CombinatorialKalmanFilterAlg::makeTrack(Acts::GeometryContext& tgContext, FitterResult& fitResult, std::vector<Tracker::FaserSCT_Cluster> sps
-CombinatorialKalmanFilterAlg::makeTrack(Acts::GeometryContext& tgContext, FitterResult& fitResult, std::vector<Tracker::FaserSCT_SpacePoint> sps
-    ) const {
+CombinatorialKalmanFilterAlg::makeTrack(Acts::GeometryContext& tgContext, FitterResult& fitResult, std::vector<Tracker::FaserSCT_SpacePoint> sps) const {
   std::unique_ptr<Trk::Track> newtrack = nullptr;
   //Get the fit output object
   const auto& fitOutput = fitResult.value();
-//  if (fitOutput.result) 
   if (fitOutput.fittedParameters.size()>0) {
-    DataVector<const Trk::TrackStateOnSurface>* finalTrajectory=new DataVector<const Trk::TrackStateOnSurface>{};
+    DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{};
     std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam;
     ATH_MSG_DEBUG("makeTrack : trackTip "<<fitOutput.lastMeasurementIndices.size());
     // Loop over all the output state to create track state
     fitOutput.fittedStates.visitBackwards(fitOutput.lastMeasurementIndices.front(), [&](const auto &state) {
-	auto flag = state.typeFlags();
-	if (state.referenceSurface().associatedDetectorElement() != nullptr) {
-//	const auto* actsElement = dynamic_cast<const FaserActsDetectorElement*>(state.referenceSurface().associatedDetectorElement());
-//	if (actsElement != nullptr ){
-	// We need to determine the type of state 
-	std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
-	const Trk::TrackParameters *parm;
-
-	// State is a hole (no associated measurement), use predicted para     meters      
-	if (flag[Acts::TrackStateFlag::HoleFlag] == true){ 
-	const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-	    state.predicted(),
-	    state.predictedCovariance());
-	parm = ConvertActsTrackParameterToATLAS(actsParam, tgContext);
-	//      auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*p     arm);
-	typePattern.set(Trk::TrackStateOnSurface::Hole);
-	}
-	// The state was tagged as an outlier, use filtered parameters
-	else if (flag[Acts::TrackStateFlag::OutlierFlag] == true){
-	  const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-	      state.filtered(),
-	      state.filteredCovariance());
-	  parm = ConvertActsTrackParameterToATLAS(actsParam, tgContext);
-	  typePattern.set(Trk::TrackStateOnSurface::Outlier);
-	} 
-	// The state is a measurement state, use smoothed parameters 
-	else{
-	  const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-	      state.smoothed(),
-	      state.smoothedCovariance());
-
-	  actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam)));
-	  //  const auto& psurface=actsParam.referenceSurface();
-	  //  std::cout<<"position "<<psurface.center(tgContext)<<std::endl;
-	  //  std::cout<<"position "<<psurface.associatedDetectorElement()->thickness()<<std::endl;
-	  //  std::cout<<"geometry "<<psurface.geometryId().volume()<<" "<<psurface.geometryId().layer()<<" "<<psurface.geometryId().sensitive()<<std::endl;
-	  Acts::Vector2 local(actsParam.parameters()[Acts::eBoundLoc0], actsParam.parameters()[Acts::eBoundLoc1]);
-//	  const Acts::Vector3 dir = Acts::makeDirectionUnitFromPhiTheta(actsParam.parameters()[Acts::eBoundPhi], actsParam.parameters()[Acts::eBoundTheta]);
-//	  auto pos=actsParam.position(tgContext);
-
-	  parm = ConvertActsTrackParameterToATLAS(actsParam, tgContext);
-	  typePattern.set(Trk::TrackStateOnSurface::Measurement);   
-	}
-
-	Tracker::FaserSCT_ClusterOnTrack* measState = nullptr;
-	if (state.hasUncalibrated()){
-	  auto sp= sps.at(state.uncalibrated().index());
-	  //const Tracker::FaserSCT_Cluster* fitCluster=&sp;
-	  const Tracker::FaserSCT_Cluster* fitCluster=sp.clusterList().first;
-	  if(fitCluster !=nullptr){
-	    measState = new Tracker::FaserSCT_ClusterOnTrack{ fitCluster, Trk::LocalParameters { Trk::DefinedParameter { fitCluster->localPosition()[0], Trk::loc1 }, Trk::DefinedParameter { fitCluster->localPosition()[1], Trk::loc2 } }, fitCluster->localCovariance(), m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())};
-	  }
-	}
-	double nDoF = state.calibratedSize();
-	const Trk::FitQualityOnSurface *quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF);
-	const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(measState, parm, quality, nullptr, typePattern);
-	// If a state was succesfully created add it to the trajectory 
-	if (perState) {
-	  finalTrajectory->insert(finalTrajectory->begin(), perState);
-
-	}
-	//	}
-	}
-	return;
+      auto flag = state.typeFlags();
+      if (state.referenceSurface().associatedDetectorElement() != nullptr) {
+        //	const auto* actsElement = dynamic_cast<const FaserActsDetectorElement*>(state.referenceSurface().associatedDetectorElement());
+        //	if (actsElement != nullptr ){
+        // We need to determine the type of state
+        std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
+        const Trk::TrackParameters *parm;
+
+        // State is a hole (no associated measurement), use predicted para meters
+        if (flag[Acts::TrackStateFlag::HoleFlag] == true) {
+          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+          state.predicted(),
+          state.predictedCovariance());
+          parm = ConvertActsTrackParameterToATLAS(actsParam, tgContext);
+          // auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*p arm);
+          typePattern.set(Trk::TrackStateOnSurface::Hole);
+        }
+        // The state was tagged as an outlier, use filtered parameters
+        else if (flag[Acts::TrackStateFlag::OutlierFlag] == true) {
+          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                     state.filtered(), state.filteredCovariance());
+          parm = ConvertActsTrackParameterToATLAS(actsParam, tgContext);
+          typePattern.set(Trk::TrackStateOnSurface::Outlier);
+        }
+        // The state is a measurement state, use smoothed parameters
+        else {
+          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                     state.smoothed(), state.smoothedCovariance());
+          actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam)));
+          //  const auto& psurface=actsParam.referenceSurface();
+          Acts::Vector2 local(actsParam.parameters()[Acts::eBoundLoc0], actsParam.parameters()[Acts::eBoundLoc1]);
+          //  const Acts::Vector3 dir = Acts::makeDirectionUnitFromPhiTheta(actsParam.parameters()[Acts::eBoundPhi], actsParam.parameters()[Acts::eBoundTheta]);
+          //  auto pos=actsParam.position(tgContext);
+          parm = ConvertActsTrackParameterToATLAS(actsParam, tgContext);
+          typePattern.set(Trk::TrackStateOnSurface::Measurement);
+        }
+        Tracker::FaserSCT_ClusterOnTrack* measState = nullptr;
+        if (state.hasUncalibrated()) {
+          auto sp= sps.at(state.uncalibrated().index());
+          //const Tracker::FaserSCT_Cluster* fitCluster=&sp;
+          const Tracker::FaserSCT_Cluster* fitCluster=sp.clusterList().first;
+          if(fitCluster !=nullptr) {
+            measState = new Tracker::FaserSCT_ClusterOnTrack{ fitCluster, Trk::LocalParameters { Trk::DefinedParameter { fitCluster->localPosition()[0], Trk::loc1 }, Trk::DefinedParameter { fitCluster->localPosition()[1], Trk::loc2 } }, fitCluster->localCovariance(), m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())};
+          }
+        }
+        double nDoF = state.calibratedSize();
+        const Trk::FitQualityOnSurface *quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF);
+        const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(measState, parm, quality, nullptr, typePattern);
+        // If a state was succesfully created add it to the trajectory
+        if (perState) {
+          finalTrajectory->insert(finalTrajectory->begin(), perState);
+        }
+      }
+      return;
     });
-/*
-    //    Convert the perigee state and add it to the trajectory
-    const Acts::BoundTrackParameters actsPer = fitOutput.fittedParameters.value();
-    const Trk::TrackParameters *per  = ConvertActsTrackParameterToATLAS(actsPer, tgContext);
-    std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
-    typePattern.set(Trk::TrackStateOnSurface::Perigee);
-    const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(nullptr, per, nullptr, nullptr, typePattern);
-    if (perState) finalTrajectory->insert(finalTrajectory->begin(), perState);
-    */
 
     // Create the track using the states
     const Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon);
-//     Trk::FitQuality* q = nullptr;
-    //        newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::KalmanFitter     ); //Mark the fitter as KalmanFitter
+    // Trk::FitQuality* q = nullptr;
+    // newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::KalmanFitter     ); //Mark the fitter as KalmanFitter
     newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), nullptr); 
   }
   return newtrack;
@@ -499,7 +427,7 @@ CombinatorialKalmanFilterAlg ::ConvertActsTrackParameterToATLAS(const Acts::Boun
   using namespace Acts::UnitLiterals;
   std::optional<AmgSymMatrix(5)> cov = std::nullopt;
   if (actsParameter.covariance()){
-    AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner<5, 5> (0, 0));
+    AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner(5, 5));
     // Convert the covariance matrix to GeV
     for(int i=0; i < newcov.rows(); i++){
       newcov(i, 4) = newcov(i, 4)*1_MeV;
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TrajectoryWriterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TrajectoryWriterTool.cxx
index f742348b0197db4f89a164acee6067aecf9dfe07..aca7bd57a3df15bfbecffc5e6afb996daffb7020 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/TrajectoryWriterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/TrajectoryWriterTool.cxx
@@ -237,7 +237,6 @@ void TrajectoryWriterTool::writeout(TrajectoriesContainer trajectories,
 
     // Get the entry index for the single trajectory
     auto& trackTip = trackTips.front();
-    std::cout<<"trackTip = "<<trackTip<<std::endl;
 
     // Collect the trajectory summary info
     auto trajState =
@@ -250,12 +249,7 @@ void TrajectoryWriterTool::writeout(TrajectoriesContainer trajectories,
     m_nHoles = trajState.nHoles;
     m_chi2_fit = trajState.chi2Sum;
     m_ndf_fit = trajState.NDF;
-    std::cout << "Track has " << trajState.nMeasurements
-              << " measurements and " << trajState.nHoles
-              << " holes and " << trajState.nOutliers
-              << " outliers and " << trajState.nStates
-              << " states " << std::endl;
-    
+
     /// If it has track parameters, fill the values
     if (traj.hasTrackParameters(trackTip))
     {
@@ -311,10 +305,6 @@ void TrajectoryWriterTool::writeout(TrajectoriesContainer trajectories,
       // expand the local measurements into the full bound space
       Acts::BoundVector meas =
           state.projector().transpose() * state.calibrated();
-      std::cout<<state.projector()<<std::endl;
-      std::cout<<state.projector().transpose()<<std::endl;
-      std::cout<<state.calibrated()<<std::endl;
-      std::cout<<meas<<std::endl;
 
       // extract local and global position
       Acts::Vector2 local(meas[Acts::eBoundLoc0], meas[Acts::eBoundLoc1]);
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx
index bb963dd1927d09d03fa2661efb5913f1c33e4dd4..0b86d895fdd266b4df4bb9ba6ecb3b928581c9db 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/components/FaserActsKalmanFilter_entries.cxx
@@ -2,7 +2,7 @@
   Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 */
 
-#include "FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h"
+//#include "FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h"
 #include "FaserActsKalmanFilter/CombinatorialKalmanFilterAlg.h"
 #include "FaserActsKalmanFilter/TruthBasedInitialParameterTool.h"
 #include "FaserActsKalmanFilter/SPSeedBasedInitialParameterTool.h"
@@ -11,7 +11,7 @@
 #include "FaserActsKalmanFilter/SimWriterTool.h"
 
 
-DECLARE_COMPONENT(FaserActsKalmanFilterAlg)
+//DECLARE_COMPONENT(FaserActsKalmanFilterAlg)
 DECLARE_COMPONENT(CombinatorialKalmanFilterAlg)
 DECLARE_COMPONENT(TruthBasedInitialParameterTool)
 DECLARE_COMPONENT(SPSeedBasedInitialParameterTool)
diff --git a/Tracking/Acts/FaserActsKalmanFilter/test/CombinatorialKalmanFilterAlg.py b/Tracking/Acts/FaserActsKalmanFilter/test/CombinatorialKalmanFilterAlg.py
index ab47c4719fcb7ed6b420ddcd691965a82570b600..eef29095e39bc064e2dde11149be503b0d0d79ea 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/test/CombinatorialKalmanFilterAlg.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/test/CombinatorialKalmanFilterAlg.py
@@ -34,14 +34,14 @@ acc.merge(TrackerSpacePointFinderCfg(ConfigFlags))
 acc.merge(TrackerSeedFinderCfg(ConfigFlags))
 acc.merge(CombinatorialKalmanFilterCfg(ConfigFlags))
 
-logging.getLogger('forcomps').setLevel(INFO)
-acc.foreach_component("*").OutputLevel = INFO
-acc.foreach_component("*ClassID*").OutputLevel = INFO
-acc.getService("StoreGateSvc").Dump = True
-acc.getService("ConditionStore").Dump = True
-acc.printConfig(withDetails=True)
-ConfigFlags.dump()
-
-sc = acc.run(maxEvents=-1)
+# logging.getLogger('forcomps').setLevel(INFO)
+# acc.foreach_component("*").OutputLevel = INFO
+# acc.foreach_component("*ClassID*").OutputLevel = INFO
+# acc.getService("StoreGateSvc").Dump = True
+# acc.getService("ConditionStore").Dump = True
+# acc.printConfig(withDetails=True)
+# ConfigFlags.dump()
+
+sc = acc.run(maxEvents=1000)
 
 sys.exit(not sc.isSuccess())
diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/VTI12TrackSystems/TrackHandleBase.h b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/VTI12TrackSystems/TrackHandleBase.h
index af1985583ddd4ead227901aca0586270e8b20c83..0dcde264b470b19dc82f306d4eacb3b5542f98af 100644
--- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/VTI12TrackSystems/TrackHandleBase.h
+++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/VTI12TrackSystems/TrackHandleBase.h
@@ -29,6 +29,7 @@
 #include <QTreeWidgetItem>
 #include <vector>
 #include <set>
+#include <optional>
 #include <QList>
 #include <QFlags>
 
diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx
index f5545c729ec9007f9f2823ec2f5e968ceac35b17..49444e861d8ffa69c07a6b6857447cb4e93b8c9b 100644
--- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx
+++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/src/TrackPropagationHelper.cxx
@@ -303,7 +303,9 @@ bool TrackPropagationHelper::makePointsCharged( std::vector<Amg::Vector3D >& poi
     //get individual surfaces
 
     //TODO - optimise this!
-    const std::vector< const Trk::Surface * > * bsurfs = volume->volumeBounds ().decomposeToSurfaces (volume->transform ());
+    const std::vector<const Trk::Surface*>* bsurfs =
+      const_cast<Trk::VolumeBounds&>(volume->volumeBounds())
+        .decomposeToSurfaces(volume->transform());
 
     if (bsurfs){
       messageVerbose("Has this many surfaces:"+str(bsurfs->size()));
diff --git a/version.txt b/version.txt
index cdbc15874e55b47fb45012cbf75daefe3196299b..140125644054770fe54c322164c33e7cd9395b79 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-22.0.40
+22.0.49