From 58bf4a5b5bea66d178ea7f28411a32a4356eba81 Mon Sep 17 00:00:00 2001
From: Dave Casper <dcasper@uci.edu>
Date: Mon, 31 Aug 2020 19:41:57 +0000
Subject: [PATCH] Athena 22.0.18 compatibility and Cosmics-related development

---
 .gitmodules                                   |    3 +
 Control/CalypsoCommon/CMakeLists.txt          |    4 -
 Control/CalypsoConfiguration/CMakeLists.txt   |    2 -
 .../python/AllConfigFlags.py                  |   12 +-
 .../python/GeoModelConfigFlags.py             |   10 +
 .../GeoModelTest/CMakeLists.txt               |   19 +-
 .../RDOReadExample/CMakeLists.txt             |    9 -
 .../RDOReadExample/src/RDOReadAlg.cxx         |   14 +-
 .../SimHitExample/CMakeLists.txt              |    6 -
 .../TrackerDataAccessExample/CMakeLists.txt   |   13 +
 .../python/TrackerDataAccessExampleConfig.py  |   77 ++
 .../python/__init__.py                        |    1 +
 .../src/TrackerDataAccess.cxx                 |   66 ++
 .../src/TrackerDataAccess.h                   |   41 +
 .../components/TrackerDataAccess_entries.cxx  |    3 +
 .../TriggerDataAccessExample/CMakeLists.txt   |   13 +
 .../python/TriggerDataAccessExampleConfig.py  |   77 ++
 .../python/__init__.py                        |    1 +
 .../src/FaserTriggerDataAccess.cxx            |   54 +
 .../src/FaserTriggerDataAccess.h              |   37 +
 .../FaserTriggerDataAccess_entries.cxx        |    3 +
 .../WaveformDataAccessExample/CMakeLists.txt  |   13 +
 .../python/WaveformDataAccessExampleConfig.py |   76 ++
 .../python/__init__.py                        |    1 +
 .../src/ScintWaveformAccess.cxx               |   74 ++
 .../src/ScintWaveformAccess.h                 |   45 +
 .../components/WaveformDataAccess_entries.cxx |    3 +
 .../WriteAlignment/CMakeLists.txt             |   15 +-
 .../FaserAuthentication/CMakeLists.txt        |    3 +-
 .../DetDescrCnvSvc/CMakeLists.txt             |    6 -
 .../FaserDetDescr/CMakeLists.txt              |    8 -
 .../FaserReadoutGeometry/CMakeLists.txt       |   23 +-
 .../GeoModel/FaserGeoEditor/CMakeLists.txt    |    9 +-
 .../GeoModel/FaserGeoModel/data/geomDB.sql    |   74 +-
 .../python/FaserGeoModelConfig.py             |   33 +-
 .../GeoModel/GeoAdaptors/CMakeLists.txt       |   13 -
 .../GeoModelFaserUtilities/CMakeLists.txt     |   16 +-
 .../GeoModelInterfaces/CMakeLists.txt         |   14 +-
 .../GeoModel/GeoModelSvc/CMakeLists.txt       |   23 +-
 .../GeoModel/GeoModelSvc/src/GeoModelSvc.cxx  |    8 +-
 .../GeoModel/GeoModelSvc/src/GeoModelSvc.h    |    2 +-
 .../IdDictDetDescrCnv/CMakeLists.txt          |   16 -
 Event/FaserByteStreamCnvSvc/CMakeLists.txt    |   90 ++
 .../ByteStreamExceptions.h                    |   40 +
 .../FaserByteStreamCnvSvc.h                   |  102 ++
 .../FaserByteStreamInputSvc.h                 |  128 ++
 Event/FaserByteStreamCnvSvc/README.md         |   14 +
 .../python/FaserByteStreamCnvSvcConfig.py     |   69 ++
 .../python/ReadByteStream.py                  |   72 ++
 .../FaserByteStreamCnvSvc/python/__init__.py  |    2 +
 .../share/jobOptions_faserBSToRDO.py          |   82 ++
 Event/FaserByteStreamCnvSvc/src/DumpFrags.h   |  118 ++
 .../src/EventInfoByteStreamAuxCnv.cxx         |  292 +++++
 .../src/EventInfoByteStreamAuxCnv.h           |   60 +
 .../src/EventInfoByteStreamxAODCnv.cxx        |   81 ++
 .../src/EventInfoByteStreamxAODCnv.h          |   45 +
 .../src/FaserByteStreamCnvSvc.cxx             |  292 +++++
 .../src/FaserByteStreamInputSvc.cxx           |  470 ++++++++
 .../src/FaserEventContextByteStream.cxx       |   26 +
 .../src/FaserEventContextByteStream.h         |   38 +
 .../src/FaserEventSelectorByteStream.cxx      | 1045 +++++++++++++++++
 .../src/FaserEventSelectorByteStream.h        |  166 +++
 .../FaserByteStreamCnvSvc_entries.cxx         |   28 +
 .../FaserByteStreamCnvSvcBase/CMakeLists.txt  |   33 +
 .../FaserByteStreamAddress.h                  |   65 +
 .../FaserByteStreamAddressProviderSvc.h       |   58 +
 .../FaserByteStreamCnvSvcBase.h               |   52 +
 .../FaserROBDataProviderSvc.h                 |   91 ++
 .../IFaserByteStreamEventAccess.h             |   27 +
 .../IFaserROBDataProviderSvc.h                |  117 ++
 .../python/FaserByteStreamCnvSvcBaseConfig.py |   26 +
 .../python/__init__.py                        |    1 +
 .../share/BSAddProvSvc_jobOptions.py          |   30 +
 .../src/FaserByteStreamAddress.cxx            |   46 +
 .../src/FaserByteStreamAddressProviderSvc.cxx |  101 ++
 .../src/FaserByteStreamCnvSvcBase.cxx         |   89 ++
 .../src/FaserROBDataProviderSvc.cxx           |  166 +++
 .../FaserByteStreamCnvSvcBase_entries.cxx     |    8 +
 Event/FaserEventStorage/CMakeLists.txt        |   27 +
 .../FaserEventStorage/DRError.h               |   21 +
 .../FaserEventStorage/DataReader.h            |  146 +++
 .../FaserEventStorage/ESCompression.h         |   20 +
 .../FaserEventStorage/EventStorageIssues.h    |  134 +++
 .../FaserEventStorage/EventStorageRecords.h   |  126 ++
 .../FaserEventStorage/FileNameCallback.h      |   39 +
 .../FaserEventStorage/RawFileName.h           |  263 +++++
 .../FaserEventStorage/fRead.h                 |   70 ++
 .../FaserEventStorage/loadfRead.h             |   14 +
 .../FaserEventStorage/pickFaserDataReader.h   |   26 +
 Event/FaserEventStorage/README                |    4 +
 .../src/DataReaderController.cxx              |  681 +++++++++++
 .../src/DataReaderController.h                |  122 ++
 Event/FaserEventStorage/src/ESLMultiFile.cxx  |  167 +++
 Event/FaserEventStorage/src/ESLMultiFile.h    |   51 +
 .../FaserEventStorage/src/ESLOriginalFile.cxx |  656 +++++++++++
 Event/FaserEventStorage/src/ESLOriginalFile.h |  110 ++
 .../FaserEventStorage/src/EventStackLayer.cxx |  281 +++++
 Event/FaserEventStorage/src/EventStackLayer.h |  164 +++
 .../src/EventStorageInternalRecords.h         |   91 ++
 .../src/EventStorageRecords.cxx               |   59 +
 Event/FaserEventStorage/src/RawFileName.cxx   |  738 ++++++++++++
 Event/FaserEventStorage/src/fReadPlain.cxx    |  148 +++
 Event/FaserEventStorage/src/fReadPlain.h      |   35 +
 Event/FaserEventStorage/src/loadfRead.cxx     |   40 +
 .../src/pickFaserDataReader.cxx               |  132 +++
 Legacy/LegacyBase/CMakeLists.txt              |    8 -
 Legacy/LegacyConverter/CMakeLists.txt         |   12 -
 .../MagFieldConditions/CMakeLists.txt         |    9 -
 MagneticField/MagFieldElements/CMakeLists.txt |   20 +-
 MagneticField/MagFieldServices/CMakeLists.txt |   13 -
 Monitoring/CMakeLists.txt                     |   15 +
 Monitoring/python/LegacySelector.py           |   65 +
 Monitoring/python/Monitor1DValue.py           |  200 ++++
 Monitoring/python/MonitorValueBase.py         |  253 ++++
 Monitoring/python/MonitorValueManager.py      |  200 ++++
 Monitoring/python/README                      |   11 +
 Monitoring/python/__init__.py                 |    2 +
 Monitoring/share/simpleMonitoringTest.json    |  106 ++
 Monitoring/share/simpleMonitoringTest.py      |   41 +
 README.md                                     |    9 +-
 .../PreshowerGeoModel/CMakeLists.txt          |   24 +-
 .../ScintGeoModelUtils/CMakeLists.txt         |   15 +-
 .../ScintIdentifier/CMakeLists.txt            |   10 -
 .../ScintReadoutGeometry/CMakeLists.txt       |   24 +-
 .../TriggerGeoModel/CMakeLists.txt            |   24 +-
 .../ScintDetDescr/VetoGeoModel/CMakeLists.txt |   24 +-
 .../ScintIdCnv/CMakeLists.txt                 |    8 -
 .../ScintByteStream/CMakeLists.txt            |   19 +
 .../python/ScintByteStreamConfig.py           |    0
 .../ScintByteStream/python/__init__.py        |    1 +
 .../src/ScintByteStreamCnv.cxx                |  102 ++
 .../ScintByteStream/src/ScintByteStreamCnv.h  |   48 +
 .../src/ScintWaveformDecoderTool.cxx          |  147 +++
 .../src/ScintWaveformDecoderTool.h            |   45 +
 .../components/ScintByteStream_entries.cxx    |    6 +
 .../ScintSimEventAthenaPool/CMakeLists.txt    |   12 +-
 .../ScintSimEventTPCnv/CMakeLists.txt         |   11 -
 .../ScintG4/PreshowerG4_SD/CMakeLists.txt     |   14 -
 .../python/PreshowerG4_SDToolConfig.py        |   13 +-
 .../test/PreshowerG4_SDToolConfig_test.py     |   54 -
 .../ScintG4/TriggerG4_SD/CMakeLists.txt       |   14 -
 .../python/TriggerG4_SDToolConfig.py          |   13 +-
 .../test/TriggerG4_SDToolConfig_test.py       |   54 -
 Scintillator/ScintG4/VetoG4_SD/CMakeLists.txt |   14 -
 .../VetoG4_SD/python/VetoG4_SDToolConfig.py   |   13 +-
 .../test/VetoG4_SDToolConfig_test.py          |   54 -
 Scintillator/ScintRawEvent/CMakeLists.txt     |   27 +
 .../ScintRawEvent/ScintRawEventDict.h         |   10 +
 .../ScintRawEvent/ScintWaveform.h             |  134 +++
 .../ScintRawEvent/ScintWaveformContainer.h    |   24 +
 .../ScintRawEvent/ScintRawEvent/selection.xml |    7 +
 .../ScintRawEvent/src/ScintWaveform.cxx       |   65 +
 .../src/ScintWaveformContainer.cxx            |   14 +
 Scintillator/ScintSimEvent/CMakeLists.txt     |   12 -
 Simulation/G4Faser/G4FaserAlg/CMakeLists.txt  |   18 -
 Simulation/G4Faser/G4FaserAlg/test/runG4.py   |    2 +-
 .../G4Faser/G4FaserServices/CMakeLists.txt    |   13 +-
 .../python/G4FaserFieldServices.py            |    1 +
 .../G4Faser/G4FaserTools/CMakeLists.txt       |   11 +-
 Simulation/G4Sim/FaserMCTruth/CMakeLists.txt  |   10 -
 .../G4Sim/FaserMCTruthBase/CMakeLists.txt     |   20 +-
 .../G4Utilities/G4UserActions/CMakeLists.txt  |   24 +-
 Simulation/G4Utilities/Geo2G4/CMakeLists.txt  |   33 +-
 .../src/ExtParameterisedVolumeBuilder.cxx     |    4 +-
 .../src/ExtParameterisedVolumeBuilder.h       |    4 +-
 .../Geo2G4/src/GDMLDetectorTool.cxx           |   14 +-
 .../Geo2G4/src/Geo2G4AssemblyFactory.h        |    1 -
 .../Geo2G4/src/Geo2G4SolidFactory.cxx         |   57 +-
 .../Geo2G4/src/Geo2G4SolidFactory.h           |    4 +-
 .../G4Utilities/Geo2G4/src/Geo2G4Svc.cxx      |   53 +-
 Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.h |   18 +-
 .../Geo2G4/src/GeoDetectorTool.cxx            |   14 +-
 .../Geo2G4/src/InitializeBuilders.cxx         |   10 +-
 .../G4Utilities/Geo2G4/src/VolumeBuilder.h    |   16 +-
 .../Geo2G4/src/lcg_dict/selection.xml         |    3 -
 .../ISF_Core/FaserISF_Event/CMakeLists.txt    |   11 -
 .../FaserISF_Interfaces/CMakeLists.txt        |   15 -
 .../ISF_Core/FaserISF_Services/CMakeLists.txt |   29 +-
 .../FaserISF_Geant4Event/CMakeLists.txt       |   15 -
 .../FaserISF_HepMC_Interfaces/CMakeLists.txt  |   12 +-
 .../FaserISF_HepMC_Tools/CMakeLists.txt       |   16 +-
 .../TrackerAlignGenTools/CMakeLists.txt       |   47 +-
 .../CMakeLists.txt                            |   29 +-
 .../src/FaserSCT_DCSConditionsHVCondAlg.h     |    2 +-
 .../src/FaserSCT_DCSConditionsStatCondAlg.h   |    2 +-
 .../src/FaserSCT_DCSConditionsTempCondAlg.h   |    2 +-
 .../src/FaserSCT_ReadCalibChipGainCondAlg.h   |    2 +-
 .../src/FaserSCT_ReadCalibChipNoiseCondAlg.h  |    2 +-
 .../FaserSCT_ConditionsData/CMakeLists.txt    |    7 -
 .../FaserSCT_ConditionsTools/CMakeLists.txt   |   30 +-
 .../src/FaserSCT_DCSConditionsTool.h          |    2 +-
 .../FaserSiLorentzAngleTool/CMakeLists.txt    |   23 +-
 .../FaserSiPropertiesTool/CMakeLists.txt      |   19 +-
 .../DipoleGeoModel/CMakeLists.txt             |   20 +-
 .../FaserSCT_GeoModel/CMakeLists.txt          |   22 +-
 .../TrackerGeoModelUtils/CMakeLists.txt       |   17 +-
 .../TrackerIdDictFiles/data/IdDictCosmic.xml  |   51 +
 .../TrackerIdentifier/CMakeLists.txt          |   10 -
 .../TrackerReadoutGeometry/CMakeLists.txt     |   25 +-
 .../TrackerIdCnv/CMakeLists.txt               |    8 -
 .../FaserSCT_Digitization/CMakeLists.txt      |   31 +-
 .../src/FaserSCT_DigitizationTool.cxx         |    2 +-
 .../src/FaserSCT_DigitizationTool.h           |    2 +-
 .../FaserSiDigitization/CMakeLists.txt        |    9 -
 .../TrackerByteStream/CMakeLists.txt          |   15 +
 .../python/TrackerByteStreamConfig.py         |    9 +
 .../TrackerByteStream/python/__init__.py      |    1 +
 .../src/TrackerByteStreamCnv.cxx              |  105 ++
 .../src/TrackerByteStreamCnv.h                |   50 +
 .../src/TrackerDataDecoderTool.cxx            |  308 +++++
 .../src/TrackerDataDecoderTool.h              |   48 +
 .../components/TrackerByteStream_entries.cxx  |    6 +
 .../TrackerEventAthenaPool/CMakeLists.txt     |    2 +-
 .../TrackerEventTPCnv/CMakeLists.txt          |   40 +-
 .../TrackerSimEventAthenaPool/CMakeLists.txt  |   12 +-
 .../TrackerSimEventTPCnv/CMakeLists.txt       |   11 -
 .../TrackerG4/FaserSCT_G4_SD/CMakeLists.txt   |   14 -
 .../python/FaserSCT_G4_SDToolConfig.py        |   13 +-
 .../test/FaserSCT_G4_SDToolConfig_test.py     |   54 -
 .../TrackerRawData/CMakeLists.txt             |   11 -
 .../TrackerSimData/CMakeLists.txt             |    6 -
 .../CMakeLists.txt                            |   21 +-
 .../TrackerSpacePointFormation/CMakeLists.txt |   19 -
 .../TruthSeededTrackFinder/CMakeLists.txt     |   23 +-
 .../TrackerPrepRawData/CMakeLists.txt         |   17 +-
 .../TrackerPrepRawData/TrackerCluster.h       |   13 +-
 .../TrackerSpacePoint/CMakeLists.txt          |   12 -
 .../src/FaserSCT_SpacePoint.cxx               |    3 +-
 .../FaserSiClusterizationTool/CMakeLists.txt  |   32 +-
 .../FaserSiSpacePointTool/CMakeLists.txt      |   14 -
 Tracker/TrackerSimEvent/CMakeLists.txt        |   11 -
 .../TrkDetStripClusterImporter/CMakeLists.txt |   10 -
 .../FaserTriggerByteStream/CMakeLists.txt     |   18 +
 .../python/FaserTriggerByteStreamConfig.py    |    0
 .../FaserTriggerByteStream/python/__init__.py |    1 +
 .../src/FaserTriggerByteStreamAuxCnv.cxx      |  114 ++
 .../src/FaserTriggerByteStreamAuxCnv.h        |   56 +
 .../src/FaserTriggerByteStreamCnv.cxx         |   77 ++
 .../src/FaserTriggerByteStreamCnv.h           |   41 +
 .../src/FaserTriggerDecoderTool.cxx           |   96 ++
 .../src/FaserTriggerDecoderTool.h             |   35 +
 .../FaserTriggerByteStream_entries.cxx        |    8 +
 faser-common                                  |    1 +
 graphics/VTI12/VTI12Algs/CMakeLists.txt       |   14 +-
 graphics/VTI12/VTI12Algs/src/VTI12Alg.cxx     |   51 +-
 graphics/VTI12/VTI12Gui/CMakeLists.txt        |    9 +-
 .../VTI12FaserPlugin/CMakeLists.txt           |   11 -
 .../VTI12GeometryPlugin/CMakeLists.txt        |   12 +-
 .../VTI12GeometrySystems/CMakeLists.txt       |   20 +-
 .../VTI12GuideLineSystems/CMakeLists.txt      |   12 +-
 .../VTI12RawDataSystems/CMakeLists.txt        |   16 +-
 .../VTI12SimHitSystems/CMakeLists.txt         |   11 -
 .../VTI12TrackSystems/CMakeLists.txt          |   53 +-
 graphics/VTI12/VTI12Utils/CMakeLists.txt      |   27 +-
 xAOD/xAODFaserBase/CMakeLists.txt             |    8 -
 xAOD/xAODFaserTracking/CMakeLists.txt         |   11 -
 .../CMakeLists.txt                            |    9 -
 .../src/xAODStripClusterAuxContainerCnv.cxx   |    2 +-
 xAOD/xAODFaserTrigger/CMakeLists.txt          |   28 +
 .../Root/FaserTriggerDataAuxInfo_v1.cxx       |   26 +
 .../Root/FaserTriggerData_v1.cxx              |   63 +
 .../Root/xAODFaserTriggerCLIDs.cxx            |    8 +
 .../xAODFaserTrigger/FaserTriggerData.h       |   22 +
 .../FaserTriggerDataAuxInfo.h                 |   22 +
 .../xAODFaserTrigger/selection.xml            |   13 +
 .../versions/FaserTriggerDataAuxInfo_v1.h     |   58 +
 .../versions/FaserTriggerData_v1.h            |   81 ++
 .../xAODFaserTrigger/xAODFaserTriggerDict.h   |   28 +
 .../xAODFaserTriggerAthenaPool/CMakeLists.txt |   14 +
 .../src/xAODFaserTriggerDataAuxInfoCnv.cxx    |    5 +
 .../src/xAODFaserTriggerDataAuxInfoCnv.h      |   16 +
 .../src/xAODFaserTriggerDataCnv.cxx           |    5 +
 .../src/xAODFaserTriggerDataCnv.h             |   17 +
 xAOD/xAODFaserTruth/CMakeLists.txt            |   11 -
 274 files changed, 12522 insertions(+), 1775 deletions(-)
 create mode 100644 .gitmodules
 create mode 100644 Control/CalypsoConfiguration/python/GeoModelConfigFlags.py
 create mode 100644 Control/CalypsoExample/TrackerDataAccessExample/CMakeLists.txt
 create mode 100644 Control/CalypsoExample/TrackerDataAccessExample/python/TrackerDataAccessExampleConfig.py
 create mode 100644 Control/CalypsoExample/TrackerDataAccessExample/python/__init__.py
 create mode 100644 Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.cxx
 create mode 100644 Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.h
 create mode 100644 Control/CalypsoExample/TrackerDataAccessExample/src/components/TrackerDataAccess_entries.cxx
 create mode 100644 Control/CalypsoExample/TriggerDataAccessExample/CMakeLists.txt
 create mode 100644 Control/CalypsoExample/TriggerDataAccessExample/python/TriggerDataAccessExampleConfig.py
 create mode 100644 Control/CalypsoExample/TriggerDataAccessExample/python/__init__.py
 create mode 100644 Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.cxx
 create mode 100644 Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.h
 create mode 100644 Control/CalypsoExample/TriggerDataAccessExample/src/components/FaserTriggerDataAccess_entries.cxx
 create mode 100644 Control/CalypsoExample/WaveformDataAccessExample/CMakeLists.txt
 create mode 100644 Control/CalypsoExample/WaveformDataAccessExample/python/WaveformDataAccessExampleConfig.py
 create mode 100644 Control/CalypsoExample/WaveformDataAccessExample/python/__init__.py
 create mode 100644 Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.cxx
 create mode 100644 Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.h
 create mode 100644 Control/CalypsoExample/WaveformDataAccessExample/src/components/WaveformDataAccess_entries.cxx
 create mode 100644 Event/FaserByteStreamCnvSvc/CMakeLists.txt
 create mode 100644 Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/ByteStreamExceptions.h
 create mode 100644 Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc.h
 create mode 100644 Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h
 create mode 100644 Event/FaserByteStreamCnvSvc/README.md
 create mode 100644 Event/FaserByteStreamCnvSvc/python/FaserByteStreamCnvSvcConfig.py
 create mode 100644 Event/FaserByteStreamCnvSvc/python/ReadByteStream.py
 create mode 100644 Event/FaserByteStreamCnvSvc/python/__init__.py
 create mode 100644 Event/FaserByteStreamCnvSvc/share/jobOptions_faserBSToRDO.py
 create mode 100644 Event/FaserByteStreamCnvSvc/src/DumpFrags.h
 create mode 100644 Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx
 create mode 100644 Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.h
 create mode 100644 Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.cxx
 create mode 100644 Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.h
 create mode 100644 Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx
 create mode 100644 Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx
 create mode 100644 Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.cxx
 create mode 100644 Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.h
 create mode 100644 Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx
 create mode 100644 Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.h
 create mode 100644 Event/FaserByteStreamCnvSvc/src/components/FaserByteStreamCnvSvc_entries.cxx
 create mode 100644 Event/FaserByteStreamCnvSvcBase/CMakeLists.txt
 create mode 100644 Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h
 create mode 100644 Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddressProviderSvc.h
 create mode 100644 Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase.h
 create mode 100644 Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserROBDataProviderSvc.h
 create mode 100644 Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserByteStreamEventAccess.h
 create mode 100644 Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h
 create mode 100644 Event/FaserByteStreamCnvSvcBase/python/FaserByteStreamCnvSvcBaseConfig.py
 create mode 100644 Event/FaserByteStreamCnvSvcBase/python/__init__.py
 create mode 100644 Event/FaserByteStreamCnvSvcBase/share/BSAddProvSvc_jobOptions.py
 create mode 100644 Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddress.cxx
 create mode 100644 Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx
 create mode 100644 Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx
 create mode 100644 Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx
 create mode 100644 Event/FaserByteStreamCnvSvcBase/src/components/FaserByteStreamCnvSvcBase_entries.cxx
 create mode 100644 Event/FaserEventStorage/CMakeLists.txt
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/DRError.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/DataReader.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/ESCompression.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/EventStorageIssues.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/EventStorageRecords.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/FileNameCallback.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/RawFileName.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/fRead.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/loadfRead.h
 create mode 100644 Event/FaserEventStorage/FaserEventStorage/pickFaserDataReader.h
 create mode 100644 Event/FaserEventStorage/README
 create mode 100644 Event/FaserEventStorage/src/DataReaderController.cxx
 create mode 100644 Event/FaserEventStorage/src/DataReaderController.h
 create mode 100644 Event/FaserEventStorage/src/ESLMultiFile.cxx
 create mode 100644 Event/FaserEventStorage/src/ESLMultiFile.h
 create mode 100644 Event/FaserEventStorage/src/ESLOriginalFile.cxx
 create mode 100644 Event/FaserEventStorage/src/ESLOriginalFile.h
 create mode 100644 Event/FaserEventStorage/src/EventStackLayer.cxx
 create mode 100644 Event/FaserEventStorage/src/EventStackLayer.h
 create mode 100644 Event/FaserEventStorage/src/EventStorageInternalRecords.h
 create mode 100644 Event/FaserEventStorage/src/EventStorageRecords.cxx
 create mode 100644 Event/FaserEventStorage/src/RawFileName.cxx
 create mode 100644 Event/FaserEventStorage/src/fReadPlain.cxx
 create mode 100644 Event/FaserEventStorage/src/fReadPlain.h
 create mode 100644 Event/FaserEventStorage/src/loadfRead.cxx
 create mode 100644 Event/FaserEventStorage/src/pickFaserDataReader.cxx
 create mode 100644 Monitoring/CMakeLists.txt
 create mode 100644 Monitoring/python/LegacySelector.py
 create mode 100755 Monitoring/python/Monitor1DValue.py
 create mode 100644 Monitoring/python/MonitorValueBase.py
 create mode 100755 Monitoring/python/MonitorValueManager.py
 create mode 100644 Monitoring/python/README
 create mode 100644 Monitoring/python/__init__.py
 create mode 100644 Monitoring/share/simpleMonitoringTest.json
 create mode 100755 Monitoring/share/simpleMonitoringTest.py
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/CMakeLists.txt
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/python/ScintByteStreamConfig.py
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/python/__init__.py
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.cxx
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.h
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.cxx
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.h
 create mode 100644 Scintillator/ScintEventCnv/ScintByteStream/src/components/ScintByteStream_entries.cxx
 delete mode 100644 Scintillator/ScintG4/PreshowerG4_SD/test/PreshowerG4_SDToolConfig_test.py
 delete mode 100644 Scintillator/ScintG4/TriggerG4_SD/test/TriggerG4_SDToolConfig_test.py
 delete mode 100644 Scintillator/ScintG4/VetoG4_SD/test/VetoG4_SDToolConfig_test.py
 create mode 100644 Scintillator/ScintRawEvent/CMakeLists.txt
 create mode 100644 Scintillator/ScintRawEvent/ScintRawEvent/ScintRawEventDict.h
 create mode 100644 Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveform.h
 create mode 100644 Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveformContainer.h
 create mode 100644 Scintillator/ScintRawEvent/ScintRawEvent/selection.xml
 create mode 100644 Scintillator/ScintRawEvent/src/ScintWaveform.cxx
 create mode 100644 Scintillator/ScintRawEvent/src/ScintWaveformContainer.cxx
 delete mode 100644 Simulation/G4Utilities/Geo2G4/src/lcg_dict/selection.xml
 create mode 100644 Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictCosmic.xml
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/CMakeLists.txt
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/python/TrackerByteStreamConfig.py
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/python/__init__.py
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h
 create mode 100644 Tracker/TrackerEventCnv/TrackerByteStream/src/components/TrackerByteStream_entries.cxx
 delete mode 100644 Tracker/TrackerG4/FaserSCT_G4_SD/test/FaserSCT_G4_SDToolConfig_test.py
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/CMakeLists.txt
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/python/FaserTriggerByteStreamConfig.py
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/python/__init__.py
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.cxx
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.h
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.cxx
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.h
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.cxx
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.h
 create mode 100644 Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/components/FaserTriggerByteStream_entries.cxx
 create mode 160000 faser-common
 create mode 100644 xAOD/xAODFaserTrigger/CMakeLists.txt
 create mode 100644 xAOD/xAODFaserTrigger/Root/FaserTriggerDataAuxInfo_v1.cxx
 create mode 100644 xAOD/xAODFaserTrigger/Root/FaserTriggerData_v1.cxx
 create mode 100644 xAOD/xAODFaserTrigger/Root/xAODFaserTriggerCLIDs.cxx
 create mode 100644 xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerData.h
 create mode 100644 xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerDataAuxInfo.h
 create mode 100644 xAOD/xAODFaserTrigger/xAODFaserTrigger/selection.xml
 create mode 100644 xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerDataAuxInfo_v1.h
 create mode 100644 xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerData_v1.h
 create mode 100644 xAOD/xAODFaserTrigger/xAODFaserTrigger/xAODFaserTriggerDict.h
 create mode 100644 xAOD/xAODFaserTriggerAthenaPool/CMakeLists.txt
 create mode 100644 xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.cxx
 create mode 100644 xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.h
 create mode 100644 xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.cxx
 create mode 100644 xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.h

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..82b8e131
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "faser-common"]
+	   path = faser-common
+	   url = https://gitlab.cern.ch/faser/faser-common.git
diff --git a/Control/CalypsoCommon/CMakeLists.txt b/Control/CalypsoCommon/CMakeLists.txt
index c8a78238..9edf0462 100644
--- a/Control/CalypsoCommon/CMakeLists.txt
+++ b/Control/CalypsoCommon/CMakeLists.txt
@@ -5,10 +5,6 @@
 # Declare the package name:
 atlas_subdir( CalypsoCommon )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          TestPolicy )
-
 # External dependencies:
 find_package( six )
 
diff --git a/Control/CalypsoConfiguration/CMakeLists.txt b/Control/CalypsoConfiguration/CMakeLists.txt
index 717b71d0..034f47f1 100644
--- a/Control/CalypsoConfiguration/CMakeLists.txt
+++ b/Control/CalypsoConfiguration/CMakeLists.txt
@@ -5,8 +5,6 @@
 # Declare the package name:
 atlas_subdir( CalypsoConfiguration )
 
-atlas_depends_on_subdirs( Control/AthenaConfiguration )
-
 # External dependencies:
 find_package( six )
 
diff --git a/Control/CalypsoConfiguration/python/AllConfigFlags.py b/Control/CalypsoConfiguration/python/AllConfigFlags.py
index 3112efda..77951611 100644
--- a/Control/CalypsoConfiguration/python/AllConfigFlags.py
+++ b/Control/CalypsoConfiguration/python/AllConfigFlags.py
@@ -3,7 +3,7 @@
 from __future__ import print_function
 
 from AthenaConfiguration.AllConfigFlags import ConfigFlags as athenaConfigFlags
-from AthenaConfiguration.AllConfigFlags import GetFileMD
+# from AthenaConfiguration.AllConfigFlags import GetFileMD
 # from AthenaConfiguration.AthConfigFlags import AthConfigFlags
 # from AthenaCommon.SystemOfUnits import TeV
 # from AthenaConfiguration.AutoConfigFlags import GetFileMD, GetDetDescrInfo
@@ -118,6 +118,12 @@ def _createCfgFlags():
     # _addFlagsCategory(acf, "Overlay", __overlay, 'OverlayConfiguration' )
 
 #Geo Model Flags:
+    def __geomodel():
+        from CalypsoConfiguration.GeoModelConfigFlags import createGeoModelConfigFlags
+        return createGeoModelConfigFlags()
+    # _addFlagsCategory( fcf, "GeoModel", __geomodel )
+    fcf.join( __geomodel() )
+
     # acf.addFlag('GeoModel.Layout', 'atlas') # replaces global.GeoLayout
     # acf.addFlag("GeoModel.AtlasVersion", lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("GeoAtlas",None) or "ATLAS-R2-2016-01-00-01") #
     # acf.addFlag("GeoModel.Align.Dynamic", lambda prevFlags : (not prevFlags.Detector.Simulate))
@@ -125,9 +131,9 @@ def _createCfgFlags():
     # acf.addFlag("GeoModel.Run", lambda prevFlags : GetDetDescrInfo(prevFlags.GeoModel.AtlasVersion).get('Run',"RUN2")) # Based on CommonGeometryFlags.Run (InDetGeometryFlags.isSLHC replaced by GeoModel.Run=="RUN4")
     # acf.addFlag("GeoModel.Type", lambda prevFlags : GetDetDescrInfo(prevFlags.GeoModel.AtlasVersion).get('GeoType',"UNDEFINED")) # Geometry type in {ITKLoI, ITkLoI-VF, etc...}
     # acf.addFlag("GeoModel.IBLLayout", lambda prevFlags : GetDetDescrInfo(prevFlags.GeoModel.AtlasVersion).get('IBLlayout',"UNDEFINED")) # IBL layer layout  in {"planar", "3D", "noIBL", "UNDEFINED"}
-    fcf.addFlag("GeoModel.FaserVersion", lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("GeoFaser",None) or "FASER-01")
+    # fcf.addFlag("GeoModel.FaserVersion", lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("GeoFaser",None) or "FASER-01")
     # fcf.addFlag("GeoModel.FaserVersion", lambda prevFlags : "FASER-01")
-    fcf.addFlag("GeoModel.GeoExportFile","")
+    # fcf.addFlag("GeoModel.GeoExportFile","")
 
 #IOVDbSvc Flags:
     # acf.addFlag("IOVDb.GlobalTag",lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("IOVDbGlobalTag",None) or "CONDBR2-BLKPA-2017-05")
diff --git a/Control/CalypsoConfiguration/python/GeoModelConfigFlags.py b/Control/CalypsoConfiguration/python/GeoModelConfigFlags.py
new file mode 100644
index 00000000..9729f35a
--- /dev/null
+++ b/Control/CalypsoConfiguration/python/GeoModelConfigFlags.py
@@ -0,0 +1,10 @@
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.AthConfigFlags import AthConfigFlags
+
+def createGeoModelConfigFlags():
+    gcf=AthConfigFlags()
+    gcf.addFlag("GeoModel.FaserVersion", "FASER-01") #
+    gcf.addFlag("GeoModel.GeoExportFile","")
+
+    return gcf
diff --git a/Control/CalypsoExample/GeoModelTest/CMakeLists.txt b/Control/CalypsoExample/GeoModelTest/CMakeLists.txt
index b7e67685..011aae13 100644
--- a/Control/CalypsoExample/GeoModelTest/CMakeLists.txt
+++ b/Control/CalypsoExample/GeoModelTest/CMakeLists.txt
@@ -5,21 +5,6 @@
 # Declare the package name:
 atlas_subdir( GeoModelTest )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/AthenaBaseComps
-                          DetectorDescription/GeoModel/GeoModelSvc
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          Scintillator/ScintDetDescr/ScintReadoutGeometry
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          MagneticField/MagFieldInterfaces
-                          MagneticField/MagFieldConditions
-                          MagneticField/MagFieldElements
-                          MagneticField/MagFieldServices
-                          Tracker/TrackerAlignTools/TrackerAlignGenTools
-                        )
-
 # External dependencies:
 find_package( GeoModelCore )
 
@@ -27,8 +12,8 @@ find_package( GeoModelCore )
 atlas_add_component( GeoModelTest
                      src/GeoModelTestAlg.cxx
                      src/components/GeoModelTest_entries.cxx
-                     INCLUDE_DIRS ${GEOMODEL_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${GEOMODEL_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry TrackerReadoutGeometry MagFieldInterfaces MagFieldElements MagFieldConditions )
+                     INCLUDE_DIRS ${GEOMODELCORE_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${GEOMODELCORE_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry TrackerReadoutGeometry MagFieldInterfaces MagFieldElements MagFieldConditions )
 
 atlas_add_test( GeoModelCheck
                 SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/python/GeoModelTestConfig.py
diff --git a/Control/CalypsoExample/RDOReadExample/CMakeLists.txt b/Control/CalypsoExample/RDOReadExample/CMakeLists.txt
index 0e00e1e3..a7425499 100644
--- a/Control/CalypsoExample/RDOReadExample/CMakeLists.txt
+++ b/Control/CalypsoExample/RDOReadExample/CMakeLists.txt
@@ -1,14 +1,5 @@
 atlas_subdir( RDOReadExample )
 
-atlas_depends_on_subdirs( PRIVATE
-                    Generators/GeneratorObjects
-                    Control/AthenaBaseComps
-                    Tracker/TrackerSimEvent
-		    Tracker/TrackerRawEvent/TrackerRawData
-		    Tracker/TrackerRawEvent/TrackerSimData
-		    Tracker/TrackerDetDescr/TrackerIdentifier
-        )
-
 atlas_add_component( RDOReadExample
                     src/RDOReadAlg.cxx
                     src/components/RDOReadExample_entries.cxx
diff --git a/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.cxx b/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.cxx
index 3332ef84..7231e919 100644
--- a/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.cxx
+++ b/Control/CalypsoExample/RDOReadExample/src/RDOReadAlg.cxx
@@ -73,18 +73,28 @@ StatusCode RDOReadAlg::execute()
             //loop through deposits to find one w/ highest energy & get barcode
             float highestDep = 0;
             int barcode = 0;
+            HepMcParticleLink primary{};
             for( const auto& depositPair : deposits)
             {
                 if( depositPair.second > highestDep)
                 {
                     highestDep = depositPair.second;
                     barcode = depositPair.first->barcode();
+                    primary = depositPair.first;
                     depositPair.first->print(std::cout);
                     ATH_MSG_INFO("pdg id "<<depositPair.first->pdg_id());
                 }
             }
-            ATH_MSG_INFO("final barcode of: "<<barcode);
-
+            ATH_MSG_INFO("final barcode of: " << barcode << " with energy " << primary->momentum().e());
+            if (primary->end_vertex() != nullptr)
+            {
+                for (auto daughter : primary->particles_out())
+                {
+                    // TODO: Check that daughter->production_vertex() and daughter->end_vertex() exist, and bracket the point you're interested in
+                    if(daughter->barcode() % 1000000 == primary->barcode())
+                        ATH_MSG_INFO("    daughter barcode: " << daughter->barcode() << " with energy " << daughter->momentum().e()); 
+                }
+            }
 
             //Helper function to get hit location information from RDO identifier
             const FaserSCT_ID* pix;
diff --git a/Control/CalypsoExample/SimHitExample/CMakeLists.txt b/Control/CalypsoExample/SimHitExample/CMakeLists.txt
index 44195b2b..cf8ec563 100644
--- a/Control/CalypsoExample/SimHitExample/CMakeLists.txt
+++ b/Control/CalypsoExample/SimHitExample/CMakeLists.txt
@@ -1,11 +1,5 @@
 atlas_subdir( SimHitExample )
 
-atlas_depends_on_subdirs( PRIVATE
-                    Generators/GeneratorObjects
-                    Control/AthenaBaseComps
-                    Tracker/TrackerSimEvent
-        )
-
 atlas_add_component( SimHitExample
                     src/SimHitAlg.cxx
                     src/components/SimHitExample_entries.cxx
diff --git a/Control/CalypsoExample/TrackerDataAccessExample/CMakeLists.txt b/Control/CalypsoExample/TrackerDataAccessExample/CMakeLists.txt
new file mode 100644
index 00000000..365f884f
--- /dev/null
+++ b/Control/CalypsoExample/TrackerDataAccessExample/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+
+# Declare the package name:
+atlas_subdir( TrackerDataAccessExample )
+
+# Component(s) in the package:
+
+atlas_add_component( TrackerDataAccessExample
+                     src/*.cxx
+                     src/components/*.cxx
+                     LINK_LIBRARIES AthenaBaseComps TrackerRawData )
+
+atlas_install_python_modules( python/*.py )
diff --git a/Control/CalypsoExample/TrackerDataAccessExample/python/TrackerDataAccessExampleConfig.py b/Control/CalypsoExample/TrackerDataAccessExample/python/TrackerDataAccessExampleConfig.py
new file mode 100644
index 00000000..48ec2674
--- /dev/null
+++ b/Control/CalypsoExample/TrackerDataAccessExample/python/TrackerDataAccessExampleConfig.py
@@ -0,0 +1,77 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+#!/usr/bin/env python
+import sys
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaCommon.Constants import VERBOSE, INFO
+
+def TrackerDataAccessExampleCfg(flags, name="TrackerDataAccessExampleAlg", **kwargs):
+
+    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
+    a = FaserGeometryCfg(flags)
+
+    TrackerDataAccessExampleAlg = CompFactory.TrackerDataAccess
+    a.addEventAlgo(TrackerDataAccessExampleAlg(name, **kwargs))
+    
+    from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg
+    a.merge(FaserByteStreamCnvSvcCfg(flags))
+
+    # thistSvc = CompFactory.THistSvc()
+    # thistSvc.Output += ["HIST DATAFILE='rdoReadHist.root' OPT='RECREATE'"]
+    # a.addService(thistSvc)
+    
+    return a
+
+
+if __name__ == "__main__":
+    from AthenaCommon.Configurable import Configurable
+    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+
+    Configurable.configurableRun3Behavior = True
+    
+# Flags for this job
+    ConfigFlags.Input.isMC = False                               # Needed to bypass autoconfig
+    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-XXXX-XXX-XX"          # Needed to bypass autoconfig, only the "OFLCOND" matters at the moment
+    ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"               # Use MC conditions for now
+    ConfigFlags.GeoModel.FaserVersion     = "FASER-CR"           # FASER cosmic ray geometry (station 2 only)
+    ConfigFlags.Input.ProjectName = "data20"                     # Needed to bypass autoconfig
+    ConfigFlags.GeoModel.Align.Dynamic    = False
+    ConfigFlags.Input.Files = ["cosmics.raw"]
+    ConfigFlags.Output.RDOFileName = "tracker.RDO.pool.root"
+    ConfigFlags.lock()
+
+# Configure components
+    from AthenaConfiguration.MainServicesConfig import MainServicesCfg
+    from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+    
+    acc = MainServicesCfg(ConfigFlags)
+    acc.merge(PoolWriteCfg(ConfigFlags))
+
+# Configure output
+
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    itemList = [ "xAOD::EventInfo#*",
+                 "xAOD::EventAuxInfo#*",
+                 "FaserSCT_RDO_Container#*"
+               ]
+    acc.merge(OutputStreamCfg(ConfigFlags, "RDO", itemList))
+    ostream = acc.getEventAlgo("OutputStreamRDO")
+
+# Set up algorithm
+    acc.merge(TrackerDataAccessExampleCfg(ConfigFlags))
+
+# Configure verbosity    
+    # ConfigFlags.dump()
+    # logging.getLogger('forcomps').setLevel(VERBOSE)
+    acc.foreach_component("*").OutputLevel = VERBOSE
+    acc.foreach_component("*ClassID*").OutputLevel = INFO
+    # log.setLevel(VERBOSE)
+
+    acc.getService("FaserByteStreamInputSvc").DumpFlag = True
+    acc.getService("FaserEventSelector").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamInputSvc").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamCnvSvc").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamAddressProviderSvc").OutputLevel = VERBOSE
+    acc.getService("MessageSvc").Format = "% F%40W%S%7W%R%T %0W%M"
+# Execute and finish
+    sys.exit(int(acc.run(maxEvents=-1).isFailure()))
diff --git a/Control/CalypsoExample/TrackerDataAccessExample/python/__init__.py b/Control/CalypsoExample/TrackerDataAccessExample/python/__init__.py
new file mode 100644
index 00000000..a70dddf1
--- /dev/null
+++ b/Control/CalypsoExample/TrackerDataAccessExample/python/__init__.py
@@ -0,0 +1 @@
+#TrackerDataAccessExample
\ No newline at end of file
diff --git a/Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.cxx b/Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.cxx
new file mode 100644
index 00000000..6c64cb7b
--- /dev/null
+++ b/Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.cxx
@@ -0,0 +1,66 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+/*
+ * TrackerDataAccess.cxx
+ * 
+ * Simple algorithm to access Tracker RDO data from storegate.
+ * Try to write a proper thread-safe algorithm.
+ *
+ */
+
+#include "TrackerDataAccess.h"
+
+TrackerDataAccess::TrackerDataAccess(const std::string& name, ISvcLocator* pSvcLocator) : AthReentrantAlgorithm(name, pSvcLocator)
+{
+}
+
+TrackerDataAccess::~TrackerDataAccess()
+{
+}
+
+StatusCode
+TrackerDataAccess::initialize()
+{
+  ATH_MSG_DEBUG("TrackerDataAccess::initialize() called");
+
+  // Must initialize SG handles
+  ATH_CHECK( m_TrackerContainer.initialize() );
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+TrackerDataAccess::finalize()
+{
+  ATH_MSG_DEBUG("TrackerDataAccess::finalize() called");
+  ATH_MSG_ALWAYS("Found " << m_goodEvents << " good events out of " << m_events << " total events.");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+TrackerDataAccess::execute(const EventContext& ctx) const
+{
+  ATH_MSG_DEBUG("TrackerDataAccess::execute() called");
+  
+  m_events++;
+  // Try reading the data in the container
+  SG::ReadHandle<FaserSCT_RDO_Container> containerHandle(m_TrackerContainer, ctx);
+  if (containerHandle.isValid())
+  {
+    ATH_MSG_INFO("Found ReadHandle for SCT_RDOs size=" << containerHandle->size());
+    m_goodEvents++;
+    // Try printing out each collection stored in the container
+    // Works if operator<< is defined for the collection (and it should be)
+    for(auto coll: *containerHandle)
+      ATH_MSG_INFO(*coll);  
+  }
+  else
+  {
+    ATH_MSG_ERROR("Unable to retrieve SCT_RDOs");
+    return StatusCode::RECOVERABLE;
+  }
+
+  return StatusCode::SUCCESS;
+}
diff --git a/Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.h b/Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.h
new file mode 100644
index 00000000..55d3bc56
--- /dev/null
+++ b/Control/CalypsoExample/TrackerDataAccessExample/src/TrackerDataAccess.h
@@ -0,0 +1,41 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+/*
+ * TrackerByteStreamAccess.h
+ * 
+ * Simple algorithm to access TLB data from storegate.
+ * Try to write a proper thread-safe algorithm.
+ *
+ */
+
+#ifndef TRACKERBYTESTREAM_TRACKERDATAACCESS_H
+#define TRACKERBYTESTREAM_TRACKERDATAACCESS_H 
+
+#include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "StoreGate/ReadHandleKey.h"
+#include <atomic>
+
+#include "TrackerRawData/FaserSCT_RDO_Container.h"
+
+class TrackerDataAccess: public AthReentrantAlgorithm
+{
+ public:
+  TrackerDataAccess(const std::string& name, ISvcLocator* pSvcLocator);
+  virtual ~TrackerDataAccess();
+
+  virtual StatusCode initialize() override;
+  virtual StatusCode execute(const EventContext& ctx) const override;
+  virtual StatusCode finalize() override;
+
+ private:
+  mutable std::atomic<size_t> m_events{0};
+  mutable std::atomic<size_t> m_goodEvents{0};
+
+  /// StoreGate key
+  SG::ReadHandleKey<FaserSCT_RDO_Container> m_TrackerContainer
+    { this, "TrackerDataContainerKey", "SCT_RDOs", "ReadHandleKey for SCT_RDOs Container"};
+
+};
+#endif /* TRACKERBYTESTREAM_TRACKERDATAACCESS_H */
diff --git a/Control/CalypsoExample/TrackerDataAccessExample/src/components/TrackerDataAccess_entries.cxx b/Control/CalypsoExample/TrackerDataAccessExample/src/components/TrackerDataAccess_entries.cxx
new file mode 100644
index 00000000..fa20b6d5
--- /dev/null
+++ b/Control/CalypsoExample/TrackerDataAccessExample/src/components/TrackerDataAccess_entries.cxx
@@ -0,0 +1,3 @@
+#include "../TrackerDataAccess.h"
+
+DECLARE_COMPONENT( TrackerDataAccess )
diff --git a/Control/CalypsoExample/TriggerDataAccessExample/CMakeLists.txt b/Control/CalypsoExample/TriggerDataAccessExample/CMakeLists.txt
new file mode 100644
index 00000000..3f8b3f19
--- /dev/null
+++ b/Control/CalypsoExample/TriggerDataAccessExample/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+
+# Declare the package name:
+atlas_subdir( TriggerDataAccessExample )
+
+# Component(s) in the package:
+
+atlas_add_component( TriggerDataAccessExample
+                     src/*.cxx
+                     src/components/*.cxx
+                     LINK_LIBRARIES AthenaBaseComps xAODFaserTrigger )
+
+atlas_install_python_modules( python/*.py )
diff --git a/Control/CalypsoExample/TriggerDataAccessExample/python/TriggerDataAccessExampleConfig.py b/Control/CalypsoExample/TriggerDataAccessExample/python/TriggerDataAccessExampleConfig.py
new file mode 100644
index 00000000..70c2f3bf
--- /dev/null
+++ b/Control/CalypsoExample/TriggerDataAccessExample/python/TriggerDataAccessExampleConfig.py
@@ -0,0 +1,77 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+#!/usr/bin/env python
+import sys
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaCommon.Constants import VERBOSE, INFO
+
+def TriggerDataAccessExampleCfg(flags, name="TriggerDataAccessExampleAlg", **kwargs):
+
+    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
+    a = FaserGeometryCfg(flags)
+
+    TriggerDataAccessExampleAlg = CompFactory.FaserTriggerDataAccess
+    a.addEventAlgo(TriggerDataAccessExampleAlg(name, **kwargs))
+    
+    from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg
+    a.merge(FaserByteStreamCnvSvcCfg(flags))
+
+    # thistSvc = CompFactory.THistSvc()
+    # thistSvc.Output += ["HIST DATAFILE='rdoReadHist.root' OPT='RECREATE'"]
+    # a.addService(thistSvc)
+    
+    return a
+
+
+if __name__ == "__main__":
+    from AthenaCommon.Configurable import Configurable
+    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+
+    Configurable.configurableRun3Behavior = True
+    
+# Flags for this job
+    ConfigFlags.Input.isMC = False                               # Needed to bypass autoconfig
+    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-XXXX-XXX-XX"          # Needed to bypass autoconfig, only the "OFLCOND" matters at the moment
+    ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"               # Use MC conditions for now
+    ConfigFlags.GeoModel.FaserVersion     = "FASER-01"           # Default FASER geometry
+    ConfigFlags.Input.ProjectName = "data20"
+    ConfigFlags.GeoModel.Align.Dynamic    = False
+    ConfigFlags.Input.Files = ["cosmics.raw"]
+    ConfigFlags.Output.RDOFileName = "trigger.RDO.pool.root"
+    ConfigFlags.lock()
+
+# Configure components
+    from AthenaConfiguration.MainServicesConfig import MainServicesCfg
+    from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+    
+    acc = MainServicesCfg(ConfigFlags)
+    acc.merge(PoolWriteCfg(ConfigFlags))
+
+# Configure output
+
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    itemList = [ "xAOD::EventInfo#*",
+                 "xAOD::EventAuxInfo#*",
+                 "xAOD::FaserTriggerData#*",
+                 "xAOD::FaserTriggerDataAuxInfo#*" ]
+    acc.merge(OutputStreamCfg(ConfigFlags, "RDO", itemList))
+    ostream = acc.getEventAlgo("OutputStreamRDO")
+
+# Set up algorithm
+    acc.merge(TriggerDataAccessExampleCfg(ConfigFlags))
+
+# Configure verbosity    
+    # ConfigFlags.dump()
+    # logging.getLogger('forcomps').setLevel(VERBOSE)
+    acc.foreach_component("*").OutputLevel = VERBOSE
+    acc.foreach_component("*ClassID*").OutputLevel = INFO
+    # log.setLevel(VERBOSE)
+
+    # acc.getService("FaserByteStreamInputSvc").DumpFlag = True
+    acc.getService("FaserEventSelector").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamInputSvc").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamCnvSvc").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamAddressProviderSvc").OutputLevel = VERBOSE
+    acc.getService("MessageSvc").Format = "% F%40W%S%7W%R%T %0W%M"
+# Execute and finish
+    sys.exit(int(acc.run(maxEvents=-1).isFailure()))
diff --git a/Control/CalypsoExample/TriggerDataAccessExample/python/__init__.py b/Control/CalypsoExample/TriggerDataAccessExample/python/__init__.py
new file mode 100644
index 00000000..2a2bbccd
--- /dev/null
+++ b/Control/CalypsoExample/TriggerDataAccessExample/python/__init__.py
@@ -0,0 +1 @@
+#TriggerDataAccessExample
\ No newline at end of file
diff --git a/Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.cxx b/Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.cxx
new file mode 100644
index 00000000..6c65c994
--- /dev/null
+++ b/Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.cxx
@@ -0,0 +1,54 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+/*
+ * FaserTriggerDataAccess.cxx
+ * 
+ * Simple algorithm to access TLB data from storegate.
+ * Try to write a proper thread-safe algorithm.
+ *
+ */
+
+#include "FaserTriggerDataAccess.h"
+
+FaserTriggerDataAccess::FaserTriggerDataAccess(const std::string& name, ISvcLocator* pSvcLocator) : AthReentrantAlgorithm(name, pSvcLocator)
+{
+}
+
+FaserTriggerDataAccess::~FaserTriggerDataAccess()
+{
+}
+
+StatusCode
+FaserTriggerDataAccess::initialize()
+{
+  ATH_MSG_DEBUG("FaserTriggerDataAccess::initialize() called");
+
+  // Must initialize SG handles
+  ATH_CHECK( m_FaserTriggerData.initialize() );
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+FaserTriggerDataAccess::finalize()
+{
+  ATH_MSG_DEBUG("FaserTriggerDataAccess::finalize() called");
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+FaserTriggerDataAccess::execute(const EventContext& ctx) const
+{
+  ATH_MSG_DEBUG("FaserTriggerDataAccess::execute() called");
+
+  ATH_MSG_DEBUG("Looking for FaserTriggerData object at " + m_FaserTriggerData.key());
+
+  SG::ReadHandle<xAOD::FaserTriggerData> xaod(m_FaserTriggerData, ctx);
+  ATH_MSG_INFO("Found FaserTriggerData");
+  ATH_MSG_INFO(*xaod);
+
+  return StatusCode::SUCCESS;
+}
diff --git a/Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.h b/Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.h
new file mode 100644
index 00000000..23cca41a
--- /dev/null
+++ b/Control/CalypsoExample/TriggerDataAccessExample/src/FaserTriggerDataAccess.h
@@ -0,0 +1,37 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+/*
+ * FaserTriggerDataAccess.h
+ * 
+ * Simple algorithm to access TLB data from storegate.
+ * Try to write a proper thread-safe algorithm.
+ *
+ */
+
+#ifndef FASERTRIGGERDATAACCESS_H
+#define FASERTRIGGERDATAACCESS_H 
+
+#include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "StoreGate/ReadHandleKey.h"
+
+#include "xAODFaserTrigger/FaserTriggerData.h"
+
+class FaserTriggerDataAccess: public AthReentrantAlgorithm
+{
+ public:
+  FaserTriggerDataAccess(const std::string& name, ISvcLocator* pSvcLocator);
+  virtual ~FaserTriggerDataAccess();
+
+  virtual StatusCode initialize() override;
+  virtual StatusCode execute(const EventContext& ctx) const override;
+  virtual StatusCode finalize() override;
+
+ private:
+  /// StoreGate key
+  SG::ReadHandleKey<xAOD::FaserTriggerData> m_FaserTriggerData
+    { this, "FaserTriggerDataKey", "FaserTriggerData", "ReadHandleKey for xAOD::FaserTriggerData"};
+};
+
+#endif /* FASERTRIGGERDATAACCESS_H */
diff --git a/Control/CalypsoExample/TriggerDataAccessExample/src/components/FaserTriggerDataAccess_entries.cxx b/Control/CalypsoExample/TriggerDataAccessExample/src/components/FaserTriggerDataAccess_entries.cxx
new file mode 100644
index 00000000..851e5297
--- /dev/null
+++ b/Control/CalypsoExample/TriggerDataAccessExample/src/components/FaserTriggerDataAccess_entries.cxx
@@ -0,0 +1,3 @@
+#include "../FaserTriggerDataAccess.h"
+
+DECLARE_COMPONENT( FaserTriggerDataAccess )
diff --git a/Control/CalypsoExample/WaveformDataAccessExample/CMakeLists.txt b/Control/CalypsoExample/WaveformDataAccessExample/CMakeLists.txt
new file mode 100644
index 00000000..54626a0a
--- /dev/null
+++ b/Control/CalypsoExample/WaveformDataAccessExample/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+
+# Declare the package name:
+atlas_subdir( WaveformDataAccessExample )
+
+# Component(s) in the package:
+
+atlas_add_component( WaveformDataAccessExample
+                     src/*.cxx
+                     src/components/*.cxx
+                     LINK_LIBRARIES AthenaBaseComps ScintRawEvent )
+
+atlas_install_python_modules( python/*.py )
diff --git a/Control/CalypsoExample/WaveformDataAccessExample/python/WaveformDataAccessExampleConfig.py b/Control/CalypsoExample/WaveformDataAccessExample/python/WaveformDataAccessExampleConfig.py
new file mode 100644
index 00000000..ed97248d
--- /dev/null
+++ b/Control/CalypsoExample/WaveformDataAccessExample/python/WaveformDataAccessExampleConfig.py
@@ -0,0 +1,76 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+#!/usr/bin/env python
+import sys
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaCommon.Constants import VERBOSE, INFO
+
+def WaveformDataAccessExampleCfg(flags, name="WaveformDataAccessExampleAlg", **kwargs):
+
+    from FaserGeoModel.FaserGeoModelConfig import FaserGeometryCfg
+    a = FaserGeometryCfg(flags)
+
+    WaveformDataAccessExampleAlg = CompFactory.ScintWaveformAccess
+    a.addEventAlgo(WaveformDataAccessExampleAlg(name, **kwargs))
+    
+    from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg
+    a.merge(FaserByteStreamCnvSvcCfg(flags))
+
+    # thistSvc = CompFactory.THistSvc()
+    # thistSvc.Output += ["HIST DATAFILE='rdoReadHist.root' OPT='RECREATE'"]
+    # a.addService(thistSvc)
+    
+    return a
+
+
+if __name__ == "__main__":
+    from AthenaCommon.Configurable import Configurable
+    from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+
+    Configurable.configurableRun3Behavior = True
+    
+# Flags for this job
+    ConfigFlags.Input.isMC = False                               # Needed to bypass autoconfig
+    ConfigFlags.IOVDb.GlobalTag = "OFLCOND-XXXX-XXX-XX"          # Needed to bypass autoconfig, only the "OFLCOND" matters at the moment
+    ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"               # Use MC conditions for now
+    ConfigFlags.GeoModel.FaserVersion     = "FASER-01"           # Default FASER geometry
+    ConfigFlags.Input.ProjectName = "data20"
+    ConfigFlags.GeoModel.Align.Dynamic    = False
+    ConfigFlags.Input.Files = ["cosmics.raw"]
+    ConfigFlags.Output.RDOFileName = "waveform.RDO.pool.root"
+    ConfigFlags.lock()
+
+# Configure components
+    from AthenaConfiguration.MainServicesConfig import MainServicesCfg
+    from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+    
+    acc = MainServicesCfg(ConfigFlags)
+    acc.merge(PoolWriteCfg(ConfigFlags))
+
+# Configure output
+
+    from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+    itemList = [ "xAOD::EventInfo#*",
+                 "xAOD::EventAuxInfo#*"
+               ]
+    acc.merge(OutputStreamCfg(ConfigFlags, "RDO", itemList))
+    ostream = acc.getEventAlgo("OutputStreamRDO")
+
+# Set up algorithm
+    acc.merge(WaveformDataAccessExampleCfg(ConfigFlags))
+
+# Configure verbosity    
+    # ConfigFlags.dump()
+    # logging.getLogger('forcomps').setLevel(VERBOSE)
+    acc.foreach_component("*").OutputLevel = VERBOSE
+    acc.foreach_component("*ClassID*").OutputLevel = INFO
+    # log.setLevel(VERBOSE)
+
+    # acc.getService("FaserByteStreamInputSvc").DumpFlag = True
+    acc.getService("FaserEventSelector").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamInputSvc").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamCnvSvc").OutputLevel = VERBOSE
+    acc.getService("FaserByteStreamAddressProviderSvc").OutputLevel = VERBOSE
+    acc.getService("MessageSvc").Format = "% F%40W%S%7W%R%T %0W%M"
+# Execute and finish
+    sys.exit(int(acc.run(maxEvents=-1).isFailure()))
diff --git a/Control/CalypsoExample/WaveformDataAccessExample/python/__init__.py b/Control/CalypsoExample/WaveformDataAccessExample/python/__init__.py
new file mode 100644
index 00000000..2e1ed482
--- /dev/null
+++ b/Control/CalypsoExample/WaveformDataAccessExample/python/__init__.py
@@ -0,0 +1 @@
+#WaveformDataAccessExample
\ No newline at end of file
diff --git a/Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.cxx b/Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.cxx
new file mode 100644
index 00000000..4dc33c5f
--- /dev/null
+++ b/Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.cxx
@@ -0,0 +1,74 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+/*
+ * ScintWaveformAccess.cxx
+ * 
+ * Simple algorithm to access waveform data from storegate.
+ * Try to write a proper thread-safe algorithm.
+ *
+ */
+
+#include "ScintWaveformAccess.h"
+//#include "ScintRawEvent/ScintWaveform.h"
+
+ScintWaveformAccess::ScintWaveformAccess(const std::string& name, ISvcLocator* pSvcLocator) : AthReentrantAlgorithm(name, pSvcLocator)
+{
+}
+
+ScintWaveformAccess::~ScintWaveformAccess()
+{
+}
+
+StatusCode
+ScintWaveformAccess::initialize()
+{
+  ATH_MSG_DEBUG("ScintWaveformAccess::initialize() called");
+
+  // Must initialize SG handles
+  ATH_CHECK( m_CaloWaveformContainer.initialize() );
+  ATH_CHECK( m_VetoWaveformContainer.initialize() );
+  ATH_CHECK( m_TriggerWaveformContainer.initialize() );
+  ATH_CHECK( m_PreshowerWaveformContainer.initialize() );
+  ATH_CHECK( m_TestWaveformContainer.initialize() );
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+ScintWaveformAccess::finalize()
+{
+  ATH_MSG_DEBUG("ScintWaveformAccess::finalize() called");
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+ScintWaveformAccess::execute(const EventContext& ctx) const
+{
+  ATH_MSG_DEBUG("ScintWaveformAccess::execute() called");
+
+  // Try reading all of the different containers
+  SG::ReadHandle<ScintWaveformContainer> caloHandle(m_CaloWaveformContainer, ctx);
+  ATH_MSG_INFO("Found ReadHandle for CaloWaveforms");
+  ATH_MSG_INFO(*caloHandle);
+
+  SG::ReadHandle<ScintWaveformContainer> vetoHandle(m_VetoWaveformContainer, ctx);
+  ATH_MSG_INFO("Found ReadHandle for VetoWaveforms");
+  ATH_MSG_INFO(*vetoHandle);
+
+  SG::ReadHandle<ScintWaveformContainer> triggerHandle(m_TriggerWaveformContainer, ctx);
+  ATH_MSG_INFO("Found ReadHandle for TriggerWaveforms");
+  ATH_MSG_INFO(*triggerHandle);
+
+  SG::ReadHandle<ScintWaveformContainer> preshowerHandle(m_PreshowerWaveformContainer, ctx);
+  ATH_MSG_INFO("Found ReadHandle for PreshowerWaveforms");
+  ATH_MSG_INFO(*preshowerHandle);
+
+  SG::ReadHandle<ScintWaveformContainer> testHandle(m_TestWaveformContainer, ctx);
+  ATH_MSG_INFO("Found ReadHandle for TestWaveforms");
+  ATH_MSG_INFO(*testHandle);
+
+  return StatusCode::SUCCESS;
+}
diff --git a/Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.h b/Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.h
new file mode 100644
index 00000000..bea751f2
--- /dev/null
+++ b/Control/CalypsoExample/WaveformDataAccessExample/src/ScintWaveformAccess.h
@@ -0,0 +1,45 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+/*
+ * ScintWaveformAccess.h
+ * 
+ * Simple algorithm to access digitizer data from storegate.
+ * Try to write a proper thread-safe algorithm.
+ *
+ */
+
+#ifndef WAVEFORMDATAACCESSEXAMPLE_SCINTWAVEFORMACCESS_H
+#define WAVEFORMDATAACCESSEXAMPLE_SCINTWAVEFORMACCESS_H 
+
+#include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "StoreGate/ReadHandleKey.h"
+
+#include "ScintRawEvent/ScintWaveformContainer.h"
+
+class ScintWaveformAccess: public AthReentrantAlgorithm
+{
+ public:
+  ScintWaveformAccess(const std::string& name, ISvcLocator* pSvcLocator);
+  virtual ~ScintWaveformAccess();
+
+  virtual StatusCode initialize() override;
+  virtual StatusCode execute(const EventContext& ctx) const override;
+  virtual StatusCode finalize() override;
+
+ private:
+  /// StoreGate key
+  SG::ReadHandleKey<ScintWaveformContainer> m_CaloWaveformContainer
+    { this, "CaloWaveformContainerKey", "CaloWaveforms", "ReadHandleKey for CaloWaveforms Container"};
+  SG::ReadHandleKey<ScintWaveformContainer> m_VetoWaveformContainer
+    { this, "VetoWaveformContainerKey", "VetoWaveforms", "ReadHandleKey for CaloWaveforms Container"};
+  SG::ReadHandleKey<ScintWaveformContainer> m_TriggerWaveformContainer
+    { this, "TriggerWaveformContainerKey", "TriggerWaveforms", "ReadHandleKey for TriggerWaveforms Container"};
+  SG::ReadHandleKey<ScintWaveformContainer> m_PreshowerWaveformContainer
+    { this, "PreshowerWaveformContainerKey", "PreshowerWaveforms", "ReadHandleKey for PreshowerWaveforms Container"};
+  SG::ReadHandleKey<ScintWaveformContainer> m_TestWaveformContainer
+    { this, "TestWaveformContainerKey", "TestWaveforms", "ReadHandleKey for TestWaveforms Container"};
+};
+
+#endif /* WAVEFORMDATAACCESSEXAMPLE_SCINTWAVEFORMACCESS_H */
diff --git a/Control/CalypsoExample/WaveformDataAccessExample/src/components/WaveformDataAccess_entries.cxx b/Control/CalypsoExample/WaveformDataAccessExample/src/components/WaveformDataAccess_entries.cxx
new file mode 100644
index 00000000..41c3b845
--- /dev/null
+++ b/Control/CalypsoExample/WaveformDataAccessExample/src/components/WaveformDataAccess_entries.cxx
@@ -0,0 +1,3 @@
+#include "../ScintWaveformAccess.h"
+
+DECLARE_COMPONENT( ScintWaveformAccess )
diff --git a/Control/CalypsoExample/WriteAlignment/CMakeLists.txt b/Control/CalypsoExample/WriteAlignment/CMakeLists.txt
index cb20b727..751e8c0e 100644
--- a/Control/CalypsoExample/WriteAlignment/CMakeLists.txt
+++ b/Control/CalypsoExample/WriteAlignment/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( WriteAlignment )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/AthenaBaseComps
-                          DetectorDescription/GeoModel/GeoModelSvc
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          Scintillator/ScintDetDescr/ScintReadoutGeometry
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracker/TrackerAlignTools/TrackerAlignGenTools
-                        )
-
 # External dependencies:
 find_package( GeoModelCore )
 
@@ -23,8 +12,8 @@ find_package( GeoModelCore )
 atlas_add_component( WriteAlignment
                      src/WriteAlignmentAlg.cxx
                      src/components/WriteAlignment_entries.cxx
-                     INCLUDE_DIRS ${GEOMODEL_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${GEOMODEL_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry TrackerReadoutGeometry )
+                     INCLUDE_DIRS ${GEOMODELCORE_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${GEOMODELCORE_LIBRARIES} AthenaBaseComps GeoModelUtilities ScintReadoutGeometry TrackerReadoutGeometry TrackerAlignGenToolsLib )
 
 atlas_add_test( WriteAlignmentCheck
                 SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/python/WriteAlignmentConfig.py
diff --git a/Database/ConnectionManagement/FaserAuthentication/CMakeLists.txt b/Database/ConnectionManagement/FaserAuthentication/CMakeLists.txt
index afedc76b..ecf7b9bb 100644
--- a/Database/ConnectionManagement/FaserAuthentication/CMakeLists.txt
+++ b/Database/ConnectionManagement/FaserAuthentication/CMakeLists.txt
@@ -36,7 +36,8 @@ endif()
 set( FaserAuthentication_native_version "v18" )
 set( FaserAuthentication_home
    "${FASER_EXTERNAL}/FaserAuth/${FaserAuthentication_native_version}" )
-atlas_install_xmls( ${FaserAuthentication_home}/authentication.xml )
+# Apparently not needed, because we don't have it...
+#atlas_install_xmls( ${FaserAuthentication_home}/authentication.xml )
 
 # Configure the environment setup module:
 configure_file(
diff --git a/DetectorDescription/DetDescrCnvSvc/CMakeLists.txt b/DetectorDescription/DetDescrCnvSvc/CMakeLists.txt
index 4c554ff2..d109a125 100644
--- a/DetectorDescription/DetDescrCnvSvc/CMakeLists.txt
+++ b/DetectorDescription/DetDescrCnvSvc/CMakeLists.txt
@@ -5,12 +5,6 @@
 # Declare the package name:
 atlas_subdir( DetDescrCnvSvc )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          PRIVATE
-                          Control/StoreGate )
-
 # Component(s) in the package:
 atlas_add_library( DetDescrCnvSvcLib
                    src/*.cxx
diff --git a/DetectorDescription/FaserDetDescr/CMakeLists.txt b/DetectorDescription/FaserDetDescr/CMakeLists.txt
index c8572d14..02127277 100644
--- a/DetectorDescription/FaserDetDescr/CMakeLists.txt
+++ b/DetectorDescription/FaserDetDescr/CMakeLists.txt
@@ -5,14 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserDetDescr )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          DetectorDescription/IdDict
-                          DetectorDescription/Identifier
-                          PRIVATE
-                          GaudiKernel )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
diff --git a/DetectorDescription/FaserReadoutGeometry/CMakeLists.txt b/DetectorDescription/FaserReadoutGeometry/CMakeLists.txt
index df6eddbb..760e2a03 100644
--- a/DetectorDescription/FaserReadoutGeometry/CMakeLists.txt
+++ b/DetectorDescription/FaserReadoutGeometry/CMakeLists.txt
@@ -5,25 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserReadoutGeometry )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/StoreGate
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/Identifier
-                          GaudiKernel
-                          InnerDetector/InDetConditions/InDetCondTools
-                          Tracking/TrkDetDescr/TrkDetElementBase
-                          Tracking/TrkDetDescr/TrkSurfaces
-                          Tracking/TrkEvent/TrkEventPrimitives
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          PRIVATE
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/IdDictDetDescr )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Eigen )
@@ -33,8 +14,8 @@ find_package( GeoModelCore )
 atlas_add_library( FaserReadoutGeometry
                    src/*.cxx
                    PUBLIC_HEADERS FaserReadoutGeometry
-                   INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
+                   INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS}
                    DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel FaserDetDescr GeoModelUtilities GeoModelFaserUtilities GeoPrimitives Identifier GaudiKernel InDetCondTools TrkDetElementBase TrkSurfaces TrkEventPrimitives StoreGateLib SGtests AthenaBaseComps DetDescrConditions
+                   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel FaserDetDescr GeoModelUtilities GeoModelFaserUtilities GeoPrimitives Identifier GaudiKernel InDetCondTools TrkDetElementBase TrkSurfaces TrkEventPrimitives StoreGateLib SGtests AthenaBaseComps DetDescrConditions
                    PRIVATE_LINK_LIBRARIES AthenaPoolUtilities IdDictDetDescr )
 
diff --git a/DetectorDescription/GeoModel/FaserGeoEditor/CMakeLists.txt b/DetectorDescription/GeoModel/FaserGeoEditor/CMakeLists.txt
index c9276a52..619b8655 100644
--- a/DetectorDescription/GeoModel/FaserGeoEditor/CMakeLists.txt
+++ b/DetectorDescription/GeoModel/FaserGeoEditor/CMakeLists.txt
@@ -8,13 +8,6 @@
 # Declare the package name:
 atlas_subdir( FaserGeoEditor )
 
-# Declare the package's dependencies:
-#atlas_depends_on_subdirs(
-#   PUBLIC Event/xAOD/xAODBase
-#   PUBLIC graphics/VP1/VP1Base
-#   PUBLIC graphics/VP1/VP1UtilsBase 
-#   )
-
 # External dependencies:
 find_package( Qt5 COMPONENTS Core Sql OpenGL Gui Network PrintSupport Widgets REQUIRED )
 
@@ -41,5 +34,5 @@ atlas_add_executable( FaserGeoEditor FaserGeoEditor/*.h src/*.cxx src/*.h
 
 # Install files from the package:
 ##atlas_install_scripts( share/* ) # installs into bin/
-atlas_install_runtime( share/* ) # install into share/ //TODO: check if we still need this!
+##atlas_install_runtime( share/* ) # install into share/ //TODO: check if we still need this!
    
diff --git a/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql b/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql
index 888141d2..b31886dc 100644
--- a/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql
+++ b/DetectorDescription/GeoModel/FaserGeoModel/data/geomDB.sql
@@ -585,6 +585,7 @@ INSERT INTO "HVS_NODE" VALUES (4005, "CaloIdentifier", 4, 0, NULL);
 -- date -u --date '00:00 today' +%s
 INSERT INTO "HVS_TAG2NODE" VALUES (0, "FASER-00", 100000, NULL, 0, 0, 1549238400000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (0, "FASER-01", 100039, NULL, 0, 0, 1590796800000000000, NULL, 22);
+INSERT INTO "HVS_TAG2NODE" VALUES (0, "FASER-CR", 107784, NULL, 0, 0, 1598400000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (90,   "FaserCommon-00", 100013, NULL, 0, 0, 1549324800000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (9000, "Materials-00", 100005, NULL, 0, 0, 1549238400000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (9001, "StdMaterials-00", 100006, NULL, 0, 0, 1549238400000000000, NULL, 22);
@@ -598,16 +599,20 @@ INSERT INTO "HVS_TAG2NODE" VALUES (2, "Scintillator-00", 100001, NULL, 0, 0, 154
 INSERT INTO "HVS_TAG2NODE" VALUES (2, "Scintillator-01", 100042, NULL, 0, 0, 1590796800000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (3, "Tracker-00", 100002, NULL, 0, 0, 1549238400000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (3, "Tracker-01", 100038, NULL, 0, 0, 1590796800000000000, NULL, 22);
+INSERT INTO "HVS_TAG2NODE" VALUES (3, "Tracker-CR", 107783, NULL, 0, 0, 1598400000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (31, "SCT-00", 100026, NULL, 0, 0, 1567987200000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (31, "SCT-01", 100037, NULL, 0, 0, 1159079680000000000, NULL, 22);
+INSERT INTO "HVS_TAG2NODE" VALUES (31, "SCT-CR", 107781, NULL, 0, 0, 1598400000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (32, "Dipole-00", 100027, NULL, 0, 0, 1568678400000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (32, "Dipole-01", 100041, NULL, 0, 0, 1590796800000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (310, "SctTopLevel-00", 106788, NULL, 0, 0, 1567987200000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (310, "SctTopLevel-01", 106790, NULL, 0, 0, 1590796800000000000, NULL, 22);
+INSERT INTO "HVS_TAG2NODE" VALUES (310, "SctTopLevel-CR", 107786, NULL, 0, 0, 1598400000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (311, "SctBarrelModule-00", 107003, NULL, 0, 0, 1567987200000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (312, "SctBarrelSensor-00", 106730, NULL, 0, 0, 1567987200000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (313, "SctFaserGeneral-00", 106789, NULL, 0, 0, 1567987200000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (313, "SctFaserGeneral-01", 106791, NULL, 0, 0, 1567987200000000000, NULL, 22);
+INSERT INTO "HVS_TAG2NODE" VALUES (313, "SctFaserGeneral-CR", 107780, NULL, 0, 0, 1598400000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (314, "SctSwitches-00", 107782, NULL, 0, 0, 1567987200000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (315, "SctMaterials-00", 107777, NULL, 0, 0, 1567987200000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (316, "SctMatComponents-00", 107778, NULL, 0, 0, 1567987200000000000, NULL, 22);
@@ -656,12 +661,14 @@ INSERT INTO "HVS_TAG2NODE" VALUES (23, "Preshower-01", 100045, NULL, 0, 0, 15907
 INSERT INTO "HVS_TAG2NODE" VALUES (1005, "NeutrinoIdentifier-00", 100030, NULL, 0, 0, 1582416000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (2005, "ScintIdentifier-00", 100016, NULL, 0, 0, 1550448000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (3005, "TrackerIdentifier-00", 100017, NULL, 0, 0, 1550448000000000000, NULL, 22);
+INSERT INTO "HVS_TAG2NODE" VALUES (3005, "TrackerIdentifier-CR", 107785, NULL, 0, 0, 1598400000000000000, NULL, 22);
 INSERT INTO "HVS_TAG2NODE" VALUES (4005, "CaloIdentifier-00", 100018, NULL, 0, 0, 1550448000000000000, NULL, 22);
 -- Data for the HVS_LTAG2LTAG table
 INSERT INTO "HVS_LTAG2LTAG" VALUES (0,   100000, 2,    100001);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (0,   100039, 2,    100042);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (0,   100000, 3,    100002);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (0,   100039, 3,    100038);
+INSERT INTO "HVS_LTAG2LTAG" VALUES (0,   107784, 3,    107783);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (0,   100000, 4,    100003);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (0,   100039, 4,    100003);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (0,    100000, 9000,  100005);
@@ -703,8 +710,10 @@ INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   100038, 3003, 100021);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   100038, 3004, 100022);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   100002, 31,   100026);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   100038, 31,   100037);
+INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   107783, 31,   107781);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100026, 310,  106788);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100037, 310,  106790);
+INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100081, 310,  107786);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100026, 311,  107003);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100026, 312,  106730);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100026, 313,  106789);
@@ -716,6 +725,7 @@ INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100026, 318,  100053);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100037, 311,  107003);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100037, 312,  106730);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100037, 313,  106791);
+INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  107781, 313,  107780);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100037, 314,  107782);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100037, 315,  107777);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (31,  100037, 316,  107778);
@@ -752,6 +762,7 @@ INSERT INTO "HVS_LTAG2LTAG" VALUES (2,   100001, 2005, 100016);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (2,   100042, 2005, 100016);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   100002, 3005, 100017);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   100038, 3005, 100017);
+INSERT INTO "HVS_LTAG2LTAG" VALUES (3,   107781, 3005, 107785);
 INSERT INTO "HVS_LTAG2LTAG" VALUES (4,   100003, 4005, 100018);
 -- Data for the HVS_TAGCACHE table
 INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-00", "FASER",              "FASER-00",                100000);
@@ -866,7 +877,62 @@ INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-01", "NeutrinoIdentifier", "NeutrinoId
 INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-01", "ScintIdentifier",    "ScintIdentifier-00",      100016);
 INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-01", "TrackerIdentifier",  "TrackerIdentifier-00",    100017);
 INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-01", "CaloIdentifier",     "CaloIdentifier-00",       100018);
-
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "FASER",              "FASER-01",                100039);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "FaserCommon",        "FaserCommon-00",          100013);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Materials",          "Materials-00",            100005);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "StdMaterials",       "StdMaterials-00",         100006);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "StdMatComponents",   "StdMatComponents-00",     100007);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Elements",           "Elements-00",             100008);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Neutrino",           "Neutrino-00",             100031);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Emulsion",           "Emulsion-00",             100034);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "EmulsionTopLevel",   "EmulsionTopLevel-00",     100035);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "EmulsionSwitches",   "EmulsionSwitches-00",     100036);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Scintillator",       "Scintillator-01",         100042);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Tracker",            "Tracker-CR",              107783);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SCT",                "SCT-CR",                  107781);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctTopLevel",        "SCTTopLevel-CR",          107786);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctBrlModule",       "SCTBrlModule-00",         107003);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctBrlSensor",       "SCTBrlSensor-00",         106730);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctFaserGeneral",    "SCTFaserGeneral-CR",      107780);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctSwitches",        "SCTSwitches-00",          107782);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SCTMaterials",       "SCTMaterials-00",         107777);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SCTMatComponents",   "SCTMatComponents-00",     107778);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctConditions",      "SctConditions-00",        107779);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctFrame",           "SctFrame-00",             100053);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctFrameGeneral",    "SctFrameGeneral-00",      100054);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "SctFrameShape",      "SctFrameShape-00",        100055);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Dipole",             "Dipole-01",               100041);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "DipoleTopLevel",     "DipoleTopLevel-01",       100040);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "DipoleGeneral",      "DipoleGeneral-00",        100004);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "DipoleSwitches",     "DipoleSwitches-00",       100028);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Calorimeter",        "Calorimeter-00",          100003);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "VetoTopLevel",       "VetoTopLevel-01",         100046);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "VetoStationGeneral", "VetoStationGeneral-01",   100049);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "VetoPlateGeneral",   "VetoPlateGeneral-01",     100050);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "TriggerTopLevel",       "TriggerTopLevel-01",         100047);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "TriggerStationGeneral", "TriggerStationGeneral-01",   100051);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "TriggerPlateGeneral",   "TriggerPlateGeneral-00",     110025);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "PreshowerTopLevel",     "PreshowerTopLevel-01",         100048);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "PreshowerStationGeneral", "PreshowerStationGeneral-01",   100052);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "PreshowerPlateGeneral",   "PreshowerPlateGeneral-00",     120025);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "NeutrinoMaterials",     "NeutrinoMaterials-00",       100032);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "NeutrinoMatComponents", "NeutrinoMatComponents-00",   100033);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "ScintMaterials",     "ScintMaterials-00",       100011);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "ScintMatComponents", "ScintMatComponents-00",   100012);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "TrackerMaterials",     "TrackerMaterials-00",     100021);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "TrackerMatComponents", "TrackerMatComponents-00", 100022);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "CaloMaterials",     "CaloMaterials-00",         100023);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "CaloMatComponents", "CaloMatComponents-00",     100024);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "VetoSwitches",       "VetoSwitches-00",         100014);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "TriggerSwitches",    "TriggerSwitches-00",      110014);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "PreshowerSwitches",  "PreshowerSwitches-00",    120014);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Veto",               "Veto-01",                 100043);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Trigger",            "Trigger-01",              100044);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "Preshower",          "Preshower-01",            100045);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "NeutrinoIdentifier", "NeutrinoIdentifier-00",   100030);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "ScintIdentifier",    "ScintIdentifier-00",      100016);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "TrackerIdentifier",  "TrackerIdentifier-CR",    107785);
+INSERT INTO "HVS_TAGCACHE" VALUES ("FASER-CR", "CaloIdentifier",     "CaloIdentifier-00",       100018);
 -- 
 --
 -- Part 2b: Content (Leaf node) data
@@ -1505,7 +1571,9 @@ INSERT INTO "SCINTIDENTIFIER_DATA2TAG" VALUES (100016, 0);
 --
 --
 INSERT INTO "TRACKERIDENTIFIER_DATA" VALUES (0, "Tracker", "TrackerIdDictFiles/IdDictTracker.xml", "Baseline layout");
+INSERT INTO "TRACKERIDENTIFIER_DATA" VALUES (1, "Tracker", "TrackerIdDictFiles/IdDictCosmic.xml", "Cosmic ray test stand");
 INSERT INTO "TRACKERIDENTIFIER_DATA2TAG" VALUES (100017, 0);
+INSERT INTO "TRACKERIDENTIFIER_DATA2TAG" VALUES (107785, 1);
 --
 --
 INSERT INTO "CALOIDENTIFIER_DATA" VALUES (0, "Calorimeter", "CaloIdDictFiles/IdDictCalorimeter.xml", "Baseline layout");
@@ -1553,16 +1621,20 @@ INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106790,4);
 INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106790,5);
 INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106790,6);
 INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(106790,7);
+INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(107786,5);
+INSERT INTO "SCTTOPLEVEL_DATA2TAG" VALUES(107786,7);
 --
 --
 DROP TABLE IF EXISTS "SCTFASERGENERAL_DATA";
 CREATE TABLE "SCTFASERGENERAL_DATA" ("SCTFASERGENERAL_DATA_ID" SLONGLONG, "NUMLAYERS" INT, "LAYERPITCH" DOUBLE, "ETAHALFPITCH" DOUBLE, "PHIHALFPITCH" DOUBLE, "DEPTHHALFPITCH" DOUBLE, "SIDEHALFPITCH" DOUBLE, "PHISTAGGER" DOUBLE, UNIQUE ( "SCTFASERGENERAL_DATA_ID") );
 INSERT INTO "SCTFASERGENERAL_DATA" VALUES (0, 3, 65.0, 60.0, 30.0, 2.5, 5.0, 0.0);
 INSERT INTO "SCTFASERGENERAL_DATA" VALUES (1, 3, 31.5, 62.0, 31.87, 1.985, 3.9725, -5.0);
+INSERT INTO "SCTFASERGENERAL_DATA" VALUES (2, 3, 31.5, 62.0, 31.87, 1.985, 3.9725, 0.0);
 DROP TABLE IF EXISTS "SCTFASERGENERAL_DATA2TAG";
 CREATE TABLE "SCTFASERGENERAL_DATA2TAG" ( "SCTFASERGENERAL_TAG_ID" SLONGLONG ,"SCTFASERGENERAL_DATA_ID" SLONGLONG  );
 INSERT INTO "SCTFASERGENERAL_DATA2TAG" VALUES(106789, 0);
 INSERT INTO "SCTFASERGENERAL_DATA2TAG" VALUES(106791, 1);
+INSERT INTO "SCTFASERGENERAL_DATA2TAG" VALUES(107780, 2);
 --
 --
 DROP TABLE IF EXISTS "SCTSWITCHES_DATA";
diff --git a/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py b/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py
index e42d3c12..246ddced 100644
--- a/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py
+++ b/DetectorDescription/GeoModel/FaserGeoModel/python/FaserGeoModelConfig.py
@@ -3,26 +3,35 @@
 #
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-from AthenaConfiguration.ComponentFactory import CompFactory
+# from AthenaConfiguration.ComponentFactory import CompFactory
 
 def FaserGeometryCfg (flags):
     acc = ComponentAccumulator()
 
+    from FaserGeoModel.ScintGMConfig import ScintGeometryCfg
+    acc.merge(ScintGeometryCfg(flags))
+
+    from FaserGeoModel.SCTGMConfig import SctGeometryCfg
+    acc.merge(SctGeometryCfg(flags))
+
+    from FaserGeoModel.DipoleGMConfig import DipoleGeometryCfg
+    acc.merge(DipoleGeometryCfg(flags))
+
     # Hack to avoid randomly failing to find sqlite file
-    poolSvc = CompFactory.PoolSvc()
+    # poolSvc = CompFactory.PoolSvc()
     # poolSvc.SortReplicas = False
-    acc.addService(poolSvc)
+    # acc.addService(poolSvc)
 
-    if flags.Detector.SimulateScintillator or flags.Detector.GeometryScintillator:
-        from FaserGeoModel.ScintGMConfig import ScintGeometryCfg
-        acc.merge(ScintGeometryCfg(flags))
+    # if flags.Detector.SimulateScintillator or flags.Detector.GeometryScintillator:
+    #     from FaserGeoModel.ScintGMConfig import ScintGeometryCfg
+    #     acc.merge(ScintGeometryCfg(flags))
 
-    if flags.Detector.SimulateTracker or flags.Detector.GeometryTracker:
-        from FaserGeoModel.SCTGMConfig import SctGeometryCfg
-        acc.merge(SctGeometryCfg(flags))
+    # if flags.Detector.SimulateTracker or flags.Detector.GeometryTracker:
+    #     from FaserGeoModel.SCTGMConfig import SctGeometryCfg
+    #     acc.merge(SctGeometryCfg(flags))
 
-    if flags.Detector.SimulateDipole or flags.Detector.GeometryDipole:
-        from FaserGeoModel.DipoleGMConfig import DipoleGeometryCfg
-        acc.merge(DipoleGeometryCfg(flags))
+    # if flags.Detector.SimulateDipole or flags.Detector.GeometryDipole:
+    #     from FaserGeoModel.DipoleGMConfig import DipoleGeometryCfg
+    #     acc.merge(DipoleGeometryCfg(flags))
 
     return acc
diff --git a/DetectorDescription/GeoModel/GeoAdaptors/CMakeLists.txt b/DetectorDescription/GeoModel/GeoAdaptors/CMakeLists.txt
index 31028e32..44e57414 100644
--- a/DetectorDescription/GeoModel/GeoAdaptors/CMakeLists.txt
+++ b/DetectorDescription/GeoModel/GeoAdaptors/CMakeLists.txt
@@ -5,19 +5,6 @@
 # Declare the package name:
 atlas_subdir( GeoAdaptors )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/StoreGate
-                          DetectorDescription/Identifier
-			              DetectorDescription/GeoPrimitives
-                          Scintillator/ScintDetDescr/ScintIdentifier
-                          Scintillator/ScintDetDescr/ScintReadoutGeometry
-                          Scintillator/ScintSimEvent
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracker/TrackerSimEvent
-                           )
-
 # External dependencies:
 find_package( CLHEP )
 
diff --git a/DetectorDescription/GeoModel/GeoModelFaserUtilities/CMakeLists.txt b/DetectorDescription/GeoModel/GeoModelFaserUtilities/CMakeLists.txt
index f138e933..b058f0cd 100644
--- a/DetectorDescription/GeoModel/GeoModelFaserUtilities/CMakeLists.txt
+++ b/DetectorDescription/GeoModel/GeoModelFaserUtilities/CMakeLists.txt
@@ -10,26 +10,14 @@
 # Declare the package name:
 atlas_subdir( GeoModelFaserUtilities )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          PRIVATE
-                          GaudiKernel )
-
 # External dependencies:
-find_package( Boost COMPONENTS filesystem thread system )
 find_package( Eigen )
-find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
 find_package( GeoModelCore )
 
 # Component(s) in the package:
 atlas_add_library( GeoModelFaserUtilities
                    src/*.cxx
                    PUBLIC_HEADERS GeoModelFaserUtilities
-                   INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} ${GEOMODEL_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaBaseComps SGTools 
-                   PRIVATE_LINK_LIBRARIES GaudiKernel )
+                   INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS}
+                   LINK_LIBRARIES ${EIGEN_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaBaseComps AthenaKernel GaudiKernel GeoModelInterfaces RDBAccessSvcLib ) 
 
diff --git a/DetectorDescription/GeoModel/GeoModelInterfaces/CMakeLists.txt b/DetectorDescription/GeoModel/GeoModelInterfaces/CMakeLists.txt
index 9240ff54..e43403de 100644
--- a/DetectorDescription/GeoModel/GeoModelInterfaces/CMakeLists.txt
+++ b/DetectorDescription/GeoModel/GeoModelInterfaces/CMakeLists.txt
@@ -5,11 +5,9 @@
 # Declare the package name:
 atlas_subdir( GeoModelInterfaces )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          GaudiKernel )
-
-# Install files from the package:
-atlas_install_headers( GeoModelInterfaces )
-
+# Component(s) in the package:
+atlas_add_library (GeoModelInterfaces
+                   GeoModelInterfaces/*.h
+                   INTERFACE
+                   PUBLIC_HEADERS GeoModelInterfaces
+                   LINK_LIBRARIES AthenaKernel GaudiKernel )
diff --git a/DetectorDescription/GeoModel/GeoModelSvc/CMakeLists.txt b/DetectorDescription/GeoModel/GeoModelSvc/CMakeLists.txt
index 381aa7c5..f1d1eb48 100644
--- a/DetectorDescription/GeoModel/GeoModelSvc/CMakeLists.txt
+++ b/DetectorDescription/GeoModel/GeoModelSvc/CMakeLists.txt
@@ -5,28 +5,13 @@
 # Declare the package name:
 atlas_subdir( GeoModelSvc )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/SGTools
-                          Control/StoreGate
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/GeoModel/GeoModelDBManager
-                          DetectorDescription/GeoModel/GeoWrite
-                          Event/EventInfo
-                          Event/EventInfoMgt
-                          GaudiKernel )
-
 # External dependencies:
-find_package( Boost COMPONENTS filesystem thread system )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
 
 
 find_package( GeoModelCore )
+find_package( GeoModelIO COMPONENTS GeoModelWrite GeoModelDBManager)
+find_package( Qt5 COMPONENTS Core Sql )
 
 # Component(s) in the package:
 atlas_add_component( GeoModelSvc
@@ -34,8 +19,8 @@ atlas_add_component( GeoModelSvc
                      src/GeoDbTagSvc.cxx
                      src/RDBMaterialManager.cxx
                      src/components/GeoModelSvc_entries.cxx
-                     INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} ${GEOMODEL_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaBaseComps CxxUtils AthenaKernel SGTools StoreGateLib SGtests GeoModelUtilities GeoModelFaserUtilities GeoModelDBManager GeoWrite EventInfo GaudiKernel )
+                     INCLUDE_DIRS ${CORAL_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS} ${GEOMODELIO_INCLUDE_DIRS} ${QT5_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${CORAL_LIBRARIES} ${GEOMODELCORE_LIBRARIES} ${GEOMODELIO_LIBRARIES} ${QT5_LIBRARIES} AthenaBaseComps CxxUtils AthenaKernel SGTools StoreGateLib SGtests GeoModelUtilities GeoModelFaserUtilities EventInfo RDBAccessSvcLib EventInfoMgtLib GaudiKernel )
 
 # Install files from the package:
 #atlas_install_joboptions( share/*.py )
diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx
index 680717ba..b2218f45 100644
--- a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx
+++ b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.cxx
@@ -9,7 +9,7 @@
 #include "GeoModelKernel/GeoVolumeCursor.h"
 #include "GeoModelUtilities/GeoModelExperiment.h"
 #include "GeoModelDBManager/GMDBManager.h"
-#include "GeoWrite/DumpGeoModelActionLocal.h"
+#include "GeoModelWrite/WriteGeoModel.h"
 
 #include "GeoModelSvc.h"
 #include "RDBMaterialManager.h"
@@ -403,9 +403,9 @@ StatusCode GeoModelSvc::geoInit()
       GMDBManager db(m_geoExportFile.c_str());
       if (db.isOpen())
       {
-        DumpGeoModelActionLocal dumpGraph(db);
-        world->exec(&dumpGraph);
-        dumpGraph.saveToDB();
+        GeoModelIO::WriteGeoModel dump{db};
+        world->exec(&dump);
+        dump.saveToDB();
       }
     }
   }
diff --git a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h
index 94449b94..b03a87ad 100644
--- a/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h
+++ b/DetectorDescription/GeoModel/GeoModelSvc/src/GeoModelSvc.h
@@ -12,7 +12,7 @@
 #include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/IToolSvc.h"
 #include "GaudiKernel/ToolHandle.h"
-#include "GaudiKernel/Property.h"
+#include "Gaudi/Property.h"
 #include "AthenaBaseComps/AthService.h"
 #include "StoreGate/StoreGateSvc.h"
 #include "EventInfoMgt/ITagInfoMgr.h"
diff --git a/DetectorDescription/IdDictDetDescrCnv/CMakeLists.txt b/DetectorDescription/IdDictDetDescrCnv/CMakeLists.txt
index 49e87e4e..bbcc1218 100644
--- a/DetectorDescription/IdDictDetDescrCnv/CMakeLists.txt
+++ b/DetectorDescription/IdDictDetDescrCnv/CMakeLists.txt
@@ -5,22 +5,6 @@
 # Declare the package name:
 atlas_subdir( IdDictDetDescrCnv )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/AthenaBaseComps
-                          Control/StoreGate
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/DetDescrCnvSvc
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/IdDictDetDescr
-                          DetectorDescription/IdDictParser
-                          DetectorDescription/Identifier
-                          GaudiKernel )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
diff --git a/Event/FaserByteStreamCnvSvc/CMakeLists.txt b/Event/FaserByteStreamCnvSvc/CMakeLists.txt
new file mode 100644
index 00000000..bf68d3ac
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/CMakeLists.txt
@@ -0,0 +1,90 @@
+################################################################################
+# Package: FaserByteStreamCnvSvc
+################################################################################
+
+# Declare the package name:
+atlas_subdir( FaserByteStreamCnvSvc )
+
+# External dependencies:
+find_package( Boost COMPONENTS system )
+find_package( CORAL COMPONENTS CoralBase )
+#find_package( tdaq-common COMPONENTS eformat_old eformat_write RawFileName
+#   DataReader DataWriter )
+
+# Stupid hack to work around faser-common Logging header
+include_directories( ../../faser-common/Logging/include )
+
+# Libraries in the package:
+atlas_add_library( FaserByteStreamCnvSvcLib
+   FaserByteStreamCnvSvc/*.h src/*.h src/*.cxx
+   PUBLIC_HEADERS FaserByteStreamCnvSvc
+   PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} 
+   LINK_LIBRARIES AthenaBaseComps FaserEventStorageLib  GaudiKernel
+   StoreGateLib rt FaserByteStreamCnvSvcBaseLib
+   PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES}
+   AthenaKernel SGTools CollectionBase FileCatalog
+   AthenaPoolUtilities PersistentDataModel EventInfo  
+   xAODEventInfo xAODTrigger)
+
+atlas_add_component( FaserByteStreamCnvSvc
+   src/components/*.cxx
+   LINK_LIBRARIES FaserByteStreamCnvSvcBaseLib FaserByteStreamCnvSvcLib )
+
+# Executables in the package:
+# atlas_add_executable( AtlFindBSEvent test/AtlFindBSEvent.cxx
+#    INCLUDE_DIRS ${TDAQ-COMMON_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
+#    LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} ${Boost_LIBRARIES} )
+
+# atlas_add_executable( AtlCopyBSEvent test/AtlCopyBSEvent.cxx
+#    INCLUDE_DIRS ${CORAL_INCLUDE_DIRS} ${TDAQ-COMMON_INCLUDE_DIRS}
+#    ${Boost_INCLUDE_DIRS}
+#    LINK_LIBRARIES ${CORAL_LIBRARIES} ${TDAQ-COMMON_LIBRARIES} ${Boost_LIBRARIES}
+#    CollectionBase FileCatalog PersistentDataModel )
+
+# atlas_add_executable( AtlListBSEvents test/AtlListBSEvents.cxx
+#    INCLUDE_DIRS ${TDAQ-COMMON_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
+#    LINK_LIBRARIES ${TDAQ-COMMON_LIBRARIES} ${Boost_LIBRARIES} )
+
+
+# Test(s) in the package:
+# atlas_add_test( BSEventSelector
+#    SCRIPT "athena.py FaserByteStreamCnvSvc/BSEventSelector_test_jobOptions.py"
+#    LOG_SELECT_PATTERN "ByteStream.*Svc" )
+
+# atlas_add_test( AtlCopyBSEvent1_test
+#    PRE_EXEC_SCRIPT "rm -f test.data"
+#    SCRIPT "AtlCopyBSEvent -e 186882810,187403142,187404922,187419528 -o test.data /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1"
+#    PROPERTIES DEPENDS FaserByteStreamCnvSvc_BSEventSelector_ctest )
+
+# atlas_add_test( AtlFindBSEvent2_test
+#    SCRIPT "AtlFindBSEvent -e 187403142 test.data"
+#    PROPERTIES DEPENDS FaserByteStreamCnvSvc_AtlCopyBSEvent1_test_ctest )
+
+# atlas_add_test( AtlCopyBSEvent3_test
+#    PRE_EXEC_SCRIPT "rm -f test_defl.data"
+#    SCRIPT "AtlCopyBSEvent -d -e 186882810,187403142,187419528 -o test_defl.data test.data"
+#    PROPERTIES DEPENDS FaserByteStreamCnvSvc_AtlCopyBSEvent1_test_ctest )
+
+# atlas_add_test( AtlFindBSEvent4_test
+#    SCRIPT "AtlFindBSEvent -e 187403142 test_defl.data"
+#    LOG_IGNORE_PATTERN "+Timestamp"
+#    PROPERTIES DEPENDS FaserByteStreamCnvSvc_AtlCopyBSEvent3_test_ctest )
+
+# atlas_add_test( AtlCopyBSEvent5_test
+#    PRE_EXEC_SCRIPT "rm -f test_infl.data"
+#    SCRIPT "AtlCopyBSEvent -e 186882810,187403142,187419528 -o test_infl.data test_defl.data"
+#    PROPERTIES DEPENDS FaserByteStreamCnvSvc_AtlCopyBSEvent3_test_ctest )
+
+# atlas_add_test( AtlCopyBSEvent6_test
+#    PRE_EXEC_SCRIPT "rm -f empty*.data && python ${CMAKE_CURRENT_SOURCE_DIR}/test/create_empty_bsfile.py"
+#    SCRIPT "AtlCopyBSEvent -e all -o empty.data empty._0001.data"
+#    PROPERTIES DEPENDS FaserByteStreamCnvSvc_AtlCopyBSEvent5_test_ctest )
+
+# atlas_add_test( FaserByteStreamConfigTest
+#    SCRIPT python -m FaserByteStreamCnvSvc.FaserByteStreamConfig
+#    POST_EXEC_SCRIPT nopost.sh )
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+atlas_install_joboptions( share/*.py )
+# atlas_install_scripts( share/catalogBytestreamFiles.sh )
diff --git a/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/ByteStreamExceptions.h b/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/ByteStreamExceptions.h
new file mode 100644
index 00000000..2a946c78
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/ByteStreamExceptions.h
@@ -0,0 +1,40 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef BYTESTREAMCNVSVC_BYTESTREAMEXCEPTIONS_H
+#define BYTESTREAMCNVSVC_BYTESTREAMEXCEPTIONS_H
+
+/** @file ByteExceptions.h
+ *  $Id: ByteStreamInputSvc.h,v 1.51 2009-03-03 16:03:22 gemmeren Exp $
+ **/
+ 
+// EXCEPTIONS 
+namespace ByteStreamExceptions 
+{
+   class fileAccessError
+   {
+     virtual const char* what() const throw() {
+       return "Problem accessing file";
+     }
+   };  
+   class readError
+   { 
+     virtual const char* what() const throw() {
+       return "Problem during DataReader getData";
+     }
+   }; 
+   class badFragment
+   {
+     virtual const char* what() const throw() {
+       return "Unable to build RawEvent, fragment does not match known formats.";
+     }
+   }; 
+   class badFragmentData
+   {
+     virtual const char* what() const throw() {
+       return "RawEvent does not pass validation";
+     }
+   }; 
+} 
+#endif
diff --git a/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc.h b/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc.h
new file mode 100644
index 00000000..f3035103
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc.h
@@ -0,0 +1,102 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERBYTESTREAMCNVSVC_FASERBYTESTREAMCNVSVC_H
+#define FASERBYTESTREAMCNVSVC_FASERBYTESTREAMCNVSVC_H
+
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase.h"
+#include "StoreGate/StoreGateSvc.h"
+#include "GaudiKernel/ServiceHandle.h"
+
+#include <map>
+
+class ByteStreamOutputSvc;
+class FullEventAssemblerBase;
+
+/** @class FaserByteStreamCnvSvc
+    @brief Gaudi COnversion Service class for ByteStream Persistency
+
+    This class is responsible for converting data object to and from BS format
+    It inherits from ByteStreamCnvSvcBase, which is used by HLT in online.
+
+    When reading the ByteStream data, the ByteStream converters are called, which in turn call
+    IRODDataProviderSvc to retrieve the raw data.
+
+    When writing the object data to ByteStream, an FullEventFragment is assembled
+    from lower level fragments using FullEventAssembler, and writen out to BS in commitOutput
+    method through ByteStreamOutputSvc.
+*/
+
+class FaserByteStreamCnvSvc : public FaserByteStreamCnvSvcBase/*, virtual public IService*/ {
+
+public:
+   /// Standard Constructor
+   FaserByteStreamCnvSvc(const std::string& name, ISvcLocator* svc);
+
+   /// Standard Destructor
+   virtual ~FaserByteStreamCnvSvc();
+
+   /// Gaudi Service Interface method implementations:
+   virtual StatusCode initialize();
+   virtual StatusCode finalize();
+
+   /// Implements ConversionSvc's connectOutput
+   virtual StatusCode connectOutput(const std::string& t, const std::string& mode);
+   virtual StatusCode connectOutput(const std::string& t);
+
+   /// Implements ConversionSvc's commitOutput
+   virtual StatusCode commitOutput(const std::string& outputConnection, bool b);
+
+   /// @brief Access to FullEventAssembler
+   template <class T> StatusCode getFullEventAssembler(T*&t, std::string nm);
+
+private:
+   /// name of the service
+   std::string m_ioSvcName;
+
+   /// list of service names
+   Gaudi::Property<std::vector<std::string>> m_ioSvcNameList;
+
+   /// Services for writing output
+   std::map<std::string, ByteStreamOutputSvc*> m_ioSvcMap;
+
+   /// flags for Simulation EventType
+   Gaudi::Property<bool> m_isSimulation;
+   /// flags for TestBeam EventType
+   Gaudi::Property<bool> m_isTestbeam;
+   /// flags for Calibration EventType
+   Gaudi::Property<bool> m_isCalibration;
+   /// flags for getting Detector Mask from COOL
+   Gaudi::Property<bool> m_getDetectorMask;
+
+   /// Event store.
+   ServiceHandle<StoreGateSvc> m_evtStore;
+
+   /// user type
+   std::string m_userType;
+
+   /// @brief common FEA, indexed by string key
+   std::map<std::string, FullEventAssemblerBase*> m_feaMap;
+};
+
+// Implementation of template method:
+template <class T> StatusCode FaserByteStreamCnvSvc::getFullEventAssembler(T*& t, std::string nm) {
+   std::map<std::string, FullEventAssemblerBase*>::const_iterator it = m_feaMap.find(nm);
+   if (it != m_feaMap.end()) {
+      T* p = dynamic_cast<T*>((*it).second);
+      if (p == 0) {
+         ATH_MSG_WARNING(" Key = " << nm << " exists, but of different type");
+         return(StatusCode::FAILURE);
+      }
+      t = p;
+      return(StatusCode::SUCCESS);
+   }
+
+   // reach here if key does not exist
+   t = new T();
+   m_feaMap[nm] = t;
+   return(StatusCode::SUCCESS);
+}
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h b/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h
new file mode 100644
index 00000000..8428beed
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h
@@ -0,0 +1,128 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERBYTESTREAMINPUTSVC_H
+#define FASERBYTESTREAMINPUTSVC_H
+
+/** @file FaserByteStreaInputSvc.h
+ *  @brief This file contains the class definition for the FaserByteStreamInputSvc class.
+ *  @author Eric Torrence <torrence@uoregon.edu>
+ **/
+
+// Originally copied from ByteStreamEventStorageInputSvc
+
+// Include files.
+#include "FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h"
+#include "AthenaKernel/SlotSpecificObj.h"
+#include "FaserEventStorage/DataReader.h"
+
+// FrameWork includes
+#include "AthenaBaseComps/AthService.h"
+#include "GaudiKernel/ServiceHandle.h"
+
+#include "EventFormats/DAQFormats.hpp"
+#include <exception>
+
+class StoreGateSvc;
+class DataHeaderElement;
+
+/** @class ByteStreamFaserInputSvc
+ *  @brief This class is the ByteStreamInputSvc for reading events written by Faser.
+ **/
+class FaserByteStreamInputSvc : public ::AthService {
+
+public:
+   /// Constructors:
+   FaserByteStreamInputSvc(const std::string& name, ISvcLocator* svcloc);
+
+   /// Destructor.
+   virtual ~FaserByteStreamInputSvc();
+
+   /// Retrieve interface ID
+   static const InterfaceID& interfaceID();
+
+   /// Required of all Gaudi Services
+   virtual StatusCode initialize();
+   virtual StatusCode stop();
+   virtual StatusCode finalize();
+
+   /// Required of all Gaudi services:  see Gaudi documentation for details
+   StatusCode queryInterface(const InterfaceID& riid, void** ppvInterface);
+
+   /// Implementation of the ByteStreamInputSvc interface methods.
+   virtual const DAQFormats::EventFull* currentEvent() const;
+   virtual const DAQFormats::EventFull* nextEvent();            //!< ++, new
+   virtual const DAQFormats::EventFull* previousEvent();        //!< --, old
+   virtual void setEvent(void* data, unsigned int eventStatus);
+
+   /// Return the current event status
+   virtual unsigned int currentEventStatus() const;
+   virtual void validateEvent(); 
+
+   virtual long positionInBlock();
+   virtual std::pair<long,std::string> getBlockIterator(const std::string fileName);
+   void         closeBlockIterator(bool clearMetadata=true);
+   bool         setSequentialRead();
+   bool         ready() const;
+   StatusCode   generateDataHeader();
+
+private: // data
+   std::mutex m_readerMutex;
+
+   struct EventCache {
+     std::unique_ptr<DAQFormats::EventFull> rawEvent = NULL;
+     unsigned int       eventStatus = 0;   //!< check_tree() status of the current event
+     long long int      eventOffset = 0;   //!< event offset within a file, can be -1          
+     void               releaseEvent(); //!< deletes event
+     virtual            ~EventCache();  //!< calls releaseEvent
+   };
+
+   SG::SlotSpecificObj<EventCache> m_eventsCache;
+   std::unique_ptr<FaserEventStorage::DataReader>  m_reader; //!< DataReader from EventStorage
+
+   mutable std::vector<long long int> m_evtOffsets;  //!< offset for event i in that file
+   unsigned int                 m_evtInFile;
+   long long int      m_evtFileOffset = 0;   //!< last read in event offset within a file, can be -1     
+   // Event back navigation info
+   std::string        m_fileGUID;      //!< current file GUID
+
+
+private: // properties
+   ServiceHandle<StoreGateSvc>                m_storeGate;     //!< StoreGateSvc
+   //ServiceHandle<StoreGateSvc>                m_inputMetadata; //!< StoreGateSvc
+   ServiceHandle<IFaserROBDataProviderSvc>         m_robProvider;
+
+
+   Gaudi::Property<bool>                      m_sequential;    //!< enable sequential reading.
+   Gaudi::Property<bool>                      m_dump;
+   Gaudi::Property<float>                     m_wait;
+   Gaudi::Property<bool>                      m_valEvent;
+   Gaudi::Property<std::string>               m_eventInfoKey;
+
+private: // internal helper functions
+
+   // void buildFragment( EventCache* cache, void* data, uint32_t eventSize, bool validate ) const;
+   void buildEvent( EventCache* cache, DAQFormats::EventFull* theEvent, bool validate ) const;
+   bool readerReady() const;
+   unsigned validateEvent( const DAQFormats::EventFull* rawEvent ) const;
+   void setEvent( const EventContext& context, void* data, unsigned int eventStatus );
+   
+   enum Advance{ PREVIOUS = -1, NEXT = 1 };
+   const DAQFormats::EventFull* getEvent( Advance step );
+   std::unique_ptr<DataHeaderElement> makeBSProvenance() const;
+
+
+   template<typename T>
+     StatusCode deleteEntry(const std::string& key)
+     {
+       if (m_storeGate->contains<T>(key)) {
+	 const T* tmp = m_storeGate->tryConstRetrieve<T>(key);
+	 if (tmp != nullptr) ATH_CHECK(m_storeGate->remove<T>(tmp));
+       }
+       return StatusCode::SUCCESS;
+     }
+
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvc/README.md b/Event/FaserByteStreamCnvSvc/README.md
new file mode 100644
index 00000000..95b12364
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/README.md
@@ -0,0 +1,14 @@
+This package provides the infrastructure to read in FASER raw data files and convert the raw information to transient data classes.  Related packages include:
+
+Event/FaserByteStreamCnvSvcBase - home of the ROBDataProvider
+
+Event/FaserEventStorage - low-level file handling routines
+
+faser-common/EventFormats - bytestream formaat definition used online
+
+A test job to read in a raw data file and write Raw Data Objects to xAOD can be found in:
+
+Event/FaserByteStreamCnvSvc/share/jobOptions_faserBSToRDO.py
+
+Copy this file locally, update to point to a FASER raw data file, and run with:
+athena.py jobOptions_faserBSToRDO.py
diff --git a/Event/FaserByteStreamCnvSvc/python/FaserByteStreamCnvSvcConfig.py b/Event/FaserByteStreamCnvSvc/python/FaserByteStreamCnvSvcConfig.py
new file mode 100644
index 00000000..26ad046e
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/python/FaserByteStreamCnvSvcConfig.py
@@ -0,0 +1,69 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+
+def FaserEventSelectorByteStreamCfg(configFlags, **kwargs):
+    result = ComponentAccumulator()
+
+    # from xAODEventInfoCnv.xAODEventInfoCnvConf import xAODMaker__EventInfoSelectorTool 
+    infoTool = CompFactory.xAODMaker.EventInfoSelectorTool
+    xconv = infoTool()
+
+# Load ByteStreamCnvSvc
+    byteSvc = CompFactory.FaserByteStreamCnvSvc
+    byteSvcInstance = byteSvc(name = "FaserByteStreamCnvSvc")
+    byteSvcInstance.InitCnvs += [ "xAOD::FaserTriggerDataAuxInfo" , "xAOD::FaserTriggerData"  ]
+    result.addService(byteSvcInstance)
+
+# Load EventSelectorByteStream
+    bsSelector = CompFactory.FaserEventSelectorByteStream
+    selector = bsSelector("FaserEventSelector")
+    selector.ByteStreamInputSvc = "FaserByteStreamInputSvc"
+    selector.HelperTools += [xconv]
+    selector.Input = configFlags.Input.Files
+    result.addService(selector)
+    result.setAppProperty("EvtSel",selector.getFullJobOptName())
+
+    EvtPersistencySvc=CompFactory.EvtPersistencySvc
+    result.addService(EvtPersistencySvc("EventPersistencySvc",CnvServices=[byteSvcInstance.getFullJobOptName(),]))
+
+# Properties
+    # rn = configFlags.Input.RunNumber
+    # if isinstance(rn, type([])):
+    #     rn = rn[0]
+    # selector.RunNumber = rn
+    # selector.InitialTimeStamp = configFlags.Input.InitialTimeStamp
+
+    for k, v in kwargs.items():
+        setattr (selector, k, v)
+
+    return result
+
+def FaserByteStreamCnvSvcCfg(configFlags, **kwargs):
+    result=ComponentAccumulator()
+
+    from FaserByteStreamCnvSvcBase.FaserByteStreamCnvSvcBaseConfig import FaserByteStreamCnvSvcBaseCfg
+    result.merge(FaserByteStreamCnvSvcBaseCfg(configFlags))
+
+# Load ByteStreamEventStorageInputSvc
+    bsInputSvc = CompFactory.FaserByteStreamInputSvc
+    result.addService(bsInputSvc(name = "FaserByteStreamInputSvc"))
+
+# Load ROBDataProviderSvc
+    robProvider = CompFactory.FaserROBDataProviderSvc
+    result.addService(robProvider("FaserROBDataProviderSvc"))
+
+# Event selector
+    result.merge(FaserEventSelectorByteStreamCfg(configFlags))
+
+# Add in ByteStreamAddressProviderSvc
+    byteStreamAddress = CompFactory.FaserByteStreamAddressProviderSvc
+    result.addService(byteStreamAddress("FaserByteStreamAddressProviderSvc"))
+
+# Load ProxyProviderSvc
+    proxyProvider = CompFactory.ProxyProviderSvc
+    result.addService(proxyProvider(ProviderNames = ["FaserByteStreamAddressProviderSvc"]))
+
+    return result
+
diff --git a/Event/FaserByteStreamCnvSvc/python/ReadByteStream.py b/Event/FaserByteStreamCnvSvc/python/ReadByteStream.py
new file mode 100644
index 00000000..d4cb651a
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/python/ReadByteStream.py
@@ -0,0 +1,72 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+###############################################################
+#
+# module for reading EventStorage BS input file.
+#
+#  DEPRECATED - do not use or copy as an example
+#==============================================================
+
+from AthenaCommon import CfgMgr
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+from AthenaCommon.AppMgr import theApp
+
+# Load ByteStreamEventStorageInputSvc
+if not hasattr (svcMgr, 'FaserByteStreamInputSvc'):
+    svcMgr += CfgMgr.FaserByteStreamInputSvc ("FaserByteStreamInputSvc")
+
+# Load ROBDataProviderSvc
+if not hasattr (svcMgr, 'FaserROBDataProviderSvc'):
+    svcMgr += CfgMgr.FaserROBDataProviderSvc ("FaserROBDataProviderSvc")
+
+# Load EventSelectorByteStream
+if not hasattr (svcMgr, 'FaserEventSelector'):
+    svcMgr += CfgMgr.FaserEventSelectorByteStream ("FaserEventSelector")
+theApp.EvtSel = "FaserEventSelector"
+
+from xAODEventInfoCnv.xAODEventInfoCnvConf import xAODMaker__EventInfoSelectorTool 
+xconv = xAODMaker__EventInfoSelectorTool()
+svcMgr.FaserEventSelector.HelperTools += [xconv]
+
+# Load ByteStreamCnvSvc
+if not hasattr (svcMgr, 'FaserByteStreamCnvSvc'):
+    svcMgr += CfgMgr.FaserByteStreamCnvSvc ("FaserByteStreamCnvSvc")
+
+# Properties
+svcMgr.FaserEventSelector.ByteStreamInputSvc = "FaserByteStreamInputSvc"
+
+svcMgr.EventPersistencySvc.CnvServices += [ "FaserByteStreamCnvSvc" ]
+
+# Load ProxyProviderSvc
+if not hasattr (svcMgr, 'ProxyProviderSvc'):
+    svcMgr += CfgMgr.ProxyProviderSvc()
+
+# Add in ByteStreamAddressProviderSvc
+if not hasattr (svcMgr, 'FaserByteStreamAddressProviderSvc'):
+    svcMgr += CfgMgr.FaserByteStreamAddressProviderSvc ("FaserByteStreamAddressProviderSvc")
+svcMgr.ProxyProviderSvc.ProviderNames += [ "FaserByteStreamAddressProviderSvc" ]
+
+# Add in MetaDataSvc
+#if not hasattr (svcMgr, 'MetaDataSvc'):
+#    svcMgr += CfgMgr.MetaDataSvc ("MetaDataSvc")
+#svcMgr.ProxyProviderSvc.ProviderNames += [ "MetaDataSvc" ]
+
+# Add in MetaData Stores
+# from StoreGate.StoreGateConf import StoreGateSvc
+
+#if not hasattr (svcMgr, 'InputMetaDataStore'):
+#    svcMgr += StoreGateSvc( "InputMetaDataStore" )
+#if not hasattr (svcMgr, 'MetaDataStore'):
+#    svcMgr += StoreGateSvc( "MetaDataStore" )
+
+# enable IOVDbSvc to read metadata
+#svcMgr.MetaDataSvc.MetaDataContainer = "MetaDataHdr"
+#svcMgr.MetaDataSvc.MetaDataTools += [ "IOVDbMetaDataTool" ]
+
+#if not hasattr (svcMgr.ToolSvc, 'IOVDbMetaDataTool'):
+#    svcMgr.ToolSvc += CfgMgr.IOVDbMetaDataTool()
+
+# Enable ByteStream to read MetaData
+#svcMgr.MetaDataSvc.MetaDataTools += [ "ByteStreamMetadataTool" ]
+#if not hasattr (svcMgr.ToolSvc, 'ByteStreamMetadataTool'):
+#    svcMgr.ToolSvc += CfgMgr.ByteStreamMetadataTool()
diff --git a/Event/FaserByteStreamCnvSvc/python/__init__.py b/Event/FaserByteStreamCnvSvc/python/__init__.py
new file mode 100644
index 00000000..74583d36
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/python/__init__.py
@@ -0,0 +1,2 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
diff --git a/Event/FaserByteStreamCnvSvc/share/jobOptions_faserBSToRDO.py b/Event/FaserByteStreamCnvSvc/share/jobOptions_faserBSToRDO.py
new file mode 100644
index 00000000..5bb3864d
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/share/jobOptions_faserBSToRDO.py
@@ -0,0 +1,82 @@
+#
+#  DEPRECATED - do not use or copy this file for use
+#
+# Read in bytestream and write Raw Data Objects to xAOD
+#
+# Useful to set this to see ERS messages (low-level file reading):
+# export TDAQ_ERS_DEBUG_LEVEL=1
+#
+# Set debug level up to 5 for even more output
+#
+
+#
+# Configure ByteStream Input 
+from FaserByteStreamCnvSvc import ReadByteStream
+
+# Provide converters
+include( "FaserByteStreamCnvSvcBase/BSAddProvSvc_jobOptions.py" )
+
+# Read single file
+svcMgr.FaserEventSelector.Input = [ "cosmics.raw" ]
+
+# Read multiple files
+#svcMgr.FaserEventSelector.Input = [ "data/Faser-Physics-000000-00000.raw",
+#                                    "data/Faser-Physics-000000-00001.raw",
+#                                    "data/Faser-Physics-000000-00002.raw"]
+
+# Uncomment to dump out each raw event as read
+svcMgr.FaserByteStreamInputSvc.DumpFlag = True
+
+from AthenaCommon.AppMgr import theApp
+theApp.EvtMax = -1
+
+from AthenaCommon.AlgSequence import AthSequencer, AlgSequence
+topSequence = AthSequencer("AthAlgSeq")
+job = AlgSequence()
+
+# Produces lots of output...
+MessageSvc.OutputLevel = DEBUG
+
+svcMgr.FaserEventSelector.OutputLevel = DEBUG
+svcMgr.FaserByteStreamInputSvc.OutputLevel = DEBUG
+svcMgr.FaserByteStreamCnvSvc.OutputLevel = DEBUG
+svcMgr.FaserByteStreamAddressProviderSvc.OutputLevel = DEBUG
+
+svcMgr.FaserByteStreamCnvSvc.InitCnvs += [
+    "xAOD::FaserTriggerData"
+]
+
+from FaserTrigCnv.FaserTrigCnvConf import FaserTriggerDataAccess
+tda = FaserTriggerDataAccess("FaserTriggerDataAccess")
+tda.OutputLevel = DEBUG
+job += tda
+
+from ScintByteStream.ScintByteStreamConf import ScintWaveformAccess
+wfm = ScintWaveformAccess("ScintWaveformAccess")
+wfm.OutputLevel = DEBUG
+job += wfm
+
+from TrackerByteStream.TrackerByteStreamConf import TrackerDataAccess
+trk = TrackerDataAccess("TrackerDataAccess")
+trk.OutputLevel = DEBUG
+job += trk
+
+# For debugging CLID errors
+svcMgr.ClassIDSvc.OutputLevel = DEBUG
+
+# Try writing out xAOD
+from OutputStreamAthenaPool.MultipleStreamManager import MSMgr
+xaodStream = MSMgr.NewPoolRootStream( "StreamAOD", "xAOD_test.pool.root" )
+xaodStream.AddItem( "xAOD::EventInfo#*" )
+xaodStream.AddItem( "xAOD::EventAuxInfo#*" )
+# Currently, this doesn't write the Aux data...
+xaodStream.AddItem( "xAOD::FaserTriggerData#*")
+xaodStream.AddItem( "xAOD::FaserTriggerDataAuxInfo#*")
+# Tracker RDOs
+# xaodStream.AddItem( "FaserSCT_RDO_Container#*" )
+xaodStream.Print()
+
+#ServiceMgr.StoreGateSvc.Dump=True
+from AthenaServices.AthenaServicesConf import AthenaEventLoopMgr
+ServiceMgr += AthenaEventLoopMgr(EventPrintoutInterval = 100)
+ServiceMgr.MessageSvc.defaultLimit = 1000
diff --git a/Event/FaserByteStreamCnvSvc/src/DumpFrags.h b/Event/FaserByteStreamCnvSvc/src/DumpFrags.h
new file mode 100644
index 00000000..989f5b7c
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/DumpFrags.h
@@ -0,0 +1,118 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  -*-c++-*-
+*/
+
+/**
+   @class      DumpFrags
+   @brief      Dump header and payload fragments
+*/
+
+#ifndef BYTESTREAMCNVSVC_DUMPFRAGS
+#define BYTESTREAMCNVSVC_DUMPFRAGS
+
+#include <iostream> 
+#include "EventFormats/DAQFormats.hpp"
+#include "EventFormats/TLBDataFragment.hpp"
+#include "EventFormats/TLBMonitoringFragment.hpp"
+#include "EventFormats/TrackerDataFragment.hpp"
+#include "EventFormats/DigitizerDataFragment.hpp"
+
+using namespace DAQFormats;
+
+class DumpFrags {
+
+  public:
+    DumpFrags() {} 
+
+  /// dump fragments from FullEventFragment
+static void dump(const EventFull* re)
+  {
+
+    std::cout << " ---EventFull run number = " 
+	      << re->run_number() << " event number = " << re->event_counter()
+	      << " Size = " << re->size() << std::endl;
+    
+    std::cout<<" Event id  "<<re->event_id()<<std::endl;
+    std::cout<<" Event tag  "<<static_cast<uint32_t>(re->event_tag())<< " [";
+    switch (re->event_tag()) {
+      case PhysicsTag:
+        std::cout << "Physics]" << std::endl;
+        break;
+      case CalibrationTag:
+        std::cout << "Calibration]" << std::endl;
+        break;
+      case MonitoringTag:
+        std::cout << "Monitoring]" << std::endl;
+        break;
+      case TLBMonitoringTag:
+        std::cout << "TLBMonitoring]" << std::endl;
+        break;
+      case CorruptedTag:
+        std::cout << "Corrupted]" << std::endl;
+        break;
+      case IncompleteTag:
+        std::cout << "Incomplete]" << std::endl;
+        break;
+      case DuplicateTag:
+        std::cout << "Duplicate]" << std::endl;
+        break;
+      default:
+        std::cout << "Unknown]" << std::endl;
+    }
+
+    std::cout<<" Status   "<<static_cast<uint32_t>(re->status())<<std::endl;
+    std::cout<<" Bunch crossing id   "<<re->bc_id()<<std::endl;
+    std::cout<<" Timestamp in microseconds  "<<re->timestamp()<<std::endl;
+    std::cout<<" Trigger bits   " << std::hex << re->trigger_bits()<<std::dec << std::endl;
+
+    for(const auto &id : re->getFragmentIDs()) {
+      const EventFragment* frag=re->find_fragment(id);
+      std::cout << *frag << std::endl;
+      
+      switch (frag->source_id()&0xFFFF0000) {
+        case TriggerSourceID:
+          if (re->event_tag() == PhysicsTag ) {
+            std::cout<<"TLB data fragment:"<<std::endl;
+            TLBDataFragment tlb_data_frag = TLBDataFragment(frag->payload<const uint32_t*>(), frag->payload_size());
+            std::cout<<tlb_data_frag<<std::endl;
+          }
+          else if (re->event_tag() == TLBMonitoringTag ) {
+            TLBMonitoringFragment tlb_mon_frag = TLBMonitoringFragment(frag->payload<const uint32_t*>(), frag->payload_size());
+            std::cout<<"TLB monitoring fragment:"<<std::endl;
+            std::cout<<tlb_mon_frag<<std::endl;
+          }
+          break;
+        case TrackerSourceID: 
+          if (re->event_tag() == PhysicsTag) {
+            std::cout << "Tracker data fragment: " << (frag->source_id() & 0x0000FFFF) << std::endl;
+            // TrackerDataFragment::set_debug_on();
+            TrackerDataFragment tracker_data_frag {frag->payload<const uint32_t*>(), frag->payload_size()};
+            std::cout << tracker_data_frag << std::endl;
+          }
+          break;
+        case PMTSourceID:
+          if (re->event_tag() == PhysicsTag ) {
+            std::cout<<"Digitizer data fragment:"<<std::endl;
+            DigitizerDataFragment digitizer_data_frag = DigitizerDataFragment(frag->payload<const uint32_t*>(), frag->payload_size());
+            std::cout<<digitizer_data_frag<<std::endl;
+          }
+          break;
+        default:
+          const uint32_t* payload=frag->payload<const uint32_t *>();
+          unsigned int ii=0;
+          for(;ii<frag->payload_size()/4;ii++) {
+                  if (ii%8==0) std::cout<<" ";
+                  std::cout<<" 0x"<<std::setw(8)<<std::hex<<std::setfill('0')<<payload[ii];
+                  if (ii%8==7) std::cout<<std::endl;
+          }
+          if (ii%8!=0) std::cout<<std::endl;
+          std::cout<<std::dec<<std::setfill(' ');
+          break;
+      }
+    }
+  }  
+};
+  
+#endif 
+
diff --git a/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx
new file mode 100644
index 00000000..341fa8d7
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.cxx
@@ -0,0 +1,292 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "EventInfoByteStreamAuxCnv.h"
+#include "FaserByteStreamCnvSvc/FaserByteStreamCnvSvc.h"
+//#include "FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h"
+
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+#include "FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h"
+
+/*
+#include "ByteStreamData/RawEvent.h"
+#include "ByteStreamData/ByteStreamMetadata.h"
+#include "ByteStreamData/ByteStreamMetadataContainer.h"
+*/
+
+#include "EventFormats/DAQFormats.hpp"
+
+#include "AthenaKernel/errorcheck.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/DataObject.h"
+#include "GaudiKernel/IRegistry.h"
+
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODEventInfo/EventAuxInfo.h"
+
+#include "StoreGate/StoreGateSvc.h"
+
+//#include "eformat/StreamTag.h"
+
+#include <time.h>
+
+using DAQFormats::EventFull;
+
+EventInfoByteStreamAuxCnv::EventInfoByteStreamAuxCnv(ISvcLocator* svcloc)
+  : Converter(storageType(), classID(), svcloc)
+  , AthMessaging(svcloc != nullptr ? msgSvc() : nullptr, "EventInfoByteStreamAuxCnv")
+  , m_ByteStreamCnvSvc(nullptr)
+  , m_robDataProvider("FaserROBDataProviderSvc", "EventInfoByteStreamAuxCnv")
+    //  , m_mdSvc("InputMetaDataStore", "EventInfoByteStreamAuxCnv")
+  , m_isSimulation(false)
+  , m_isTestbeam(false)
+  , m_isCalibration(false)
+{
+}
+
+const CLID& EventInfoByteStreamAuxCnv::classID() 
+{
+  return ClassID_traits<xAOD::EventAuxInfo>::ID();
+}
+
+long EventInfoByteStreamAuxCnv::storageType() 
+{
+  return FaserByteStreamAddress::storageType();
+}
+
+StatusCode EventInfoByteStreamAuxCnv::initialize() 
+{
+  ATH_MSG_DEBUG("EventInfoByteStreamAuxCnv::Initialize()");
+
+  CHECK(Converter::initialize());
+
+  // Check ByteStreamCnvSvc
+  ATH_MSG_DEBUG("Find FaserByteStreamCnvSvc");
+  IService* svc{nullptr};
+  StatusCode sc = serviceLocator()->getService("FaserByteStreamCnvSvc", svc);
+  if (!sc.isSuccess()) {
+    ATH_MSG_ERROR("Cannot get FaserByteStreamCnvSvc ");
+    return sc;
+  } else {
+    ATH_MSG_DEBUG("Located FaserByteStreamCnvSvc");
+  }
+
+  // Don't need this as we no longer have an interface class, but OK
+  m_ByteStreamCnvSvc = dynamic_cast<FaserByteStreamCnvSvc*>(svc);
+  if (!m_ByteStreamCnvSvc) {
+    ATH_MSG_ERROR("Cannot cast to FaserByteStreamCnvSvc");
+    return StatusCode::FAILURE;
+  }
+
+  ATH_MSG_DEBUG("Find ROBDataProvider");
+  CHECK(m_robDataProvider.retrieve());
+  //CHECK(m_mdSvc.retrieve());
+
+  SimpleProperty<bool> propIsSimulation("IsSimulation", m_isSimulation);
+  sc = m_ByteStreamCnvSvc->getProperty(&propIsSimulation);
+  if (sc.isSuccess()) {
+    m_isSimulation = propIsSimulation.value();
+    ATH_MSG_INFO("IsSimulation : " << m_isSimulation);
+  } 
+  else {
+    ATH_MSG_ERROR("Cannot get IsSimulation");
+    return sc;
+  }
+
+  SimpleProperty<bool> propIsTestbeam("IsTestbeam", m_isTestbeam);
+  sc = m_ByteStreamCnvSvc->getProperty(&propIsTestbeam);
+  if (sc.isSuccess()) {
+    m_isTestbeam = propIsTestbeam.value();
+    ATH_MSG_INFO("IsTestbeam : " << m_isTestbeam);
+  } 
+  else {
+    ATH_MSG_ERROR("Cannot get IsTestbeam");
+    return sc;
+  }
+
+  SimpleProperty<bool> propIsCalibration("IsCalibration", m_isCalibration);
+  sc = m_ByteStreamCnvSvc->getProperty(&propIsCalibration);
+  if (sc.isSuccess()) {
+    m_isCalibration = propIsCalibration.value();
+    ATH_MSG_INFO("IsCalibration : " << m_isCalibration);
+  } 
+  else {
+    ATH_MSG_ERROR("Cannot get IsCalibration");
+    return sc;
+  }
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode EventInfoByteStreamAuxCnv::finalize() 
+{
+  ATH_MSG_DEBUG("Finalize");
+  
+  StatusCode sc = Converter::finalize();
+  if (sc.isFailure()) {
+    ATH_MSG_WARNING("Converter::finalize() failed");
+  }
+  return sc;
+}
+
+StatusCode EventInfoByteStreamAuxCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj) 
+{
+
+  ATH_MSG_DEBUG("EventInfoByteStreamAuxCnv::createObj() called");
+
+  FaserByteStreamAddress *pRE_Addr{nullptr};
+  pRE_Addr = dynamic_cast<FaserByteStreamAddress*>(pAddr);
+  if (!pRE_Addr) {
+    ATH_MSG_ERROR("Cannot cast to FaserByteStreamAddress ");
+    return StatusCode::FAILURE;
+  }
+
+
+  // get RawEvent
+  const EventFull* re = reinterpret_cast<const EventFull*>(m_robDataProvider->getEvent());
+
+  if (!re) {
+    ATH_MSG_ERROR("Can not get RawEvent ");
+    return StatusCode::FAILURE;
+  }
+
+  // Run Number
+  int runNumber = re->run_number();
+
+  // Event Number
+  uint64_t eventNumber = re->event_id();
+  
+  // Time Stamp
+  uint32_t bc_time_sec = re->timestamp()/1E6;  // timestamp is in usec
+  // Subtract off integer second and provide remainder in ns
+  uint32_t bc_time_ns  = 1E3 * (re->timestamp() - 1E6 * bc_time_sec);
+  // bc_time_ns should be lt 1e9.
+  if (bc_time_ns > 1000000000) {
+      // For later runs, the nanosecond clock sometimes is not reset, making it overrun 1e9. Round it off to 1e9
+      ATH_MSG_WARNING("bc_time nanosecond number larger than 1e9, it is " << bc_time_ns << ", reset it to 1 sec");
+      bc_time_ns = 1000000000;
+  }
+
+  // luminosity block number
+  uint16_t lumiBlock = 0;
+
+  // bunch crossing identifier
+  uint16_t bcID = re->bc_id();
+
+  // Unused
+  unsigned int detMask0 = 0xFFFFFFFF, 
+    detMask1 = 0xFFFFFFFF, 
+    detMask2 = 0xFFFFFFFF, 
+    detMask3 = 0xFFFFFFFF;
+
+  xAOD::EventInfo evtInfo;
+  xAOD::EventAuxInfo* pEvtInfoAux = new xAOD::EventAuxInfo();
+  evtInfo.setStore(pEvtInfoAux);
+
+  evtInfo.setRunNumber(runNumber);
+  evtInfo.setEventNumber(eventNumber);
+  evtInfo.setLumiBlock(lumiBlock);
+  evtInfo.setTimeStamp(bc_time_sec);
+  evtInfo.setTimeStampNSOffset(bc_time_ns);
+  evtInfo.setBCID(bcID);
+  evtInfo.setDetectorMask(detMask0,detMask1);
+  evtInfo.setDetectorMaskExt(detMask2,detMask3);
+
+  // The following values were implicitly set by the BS converter of the legacy EventInfo
+  // Setting them here too
+  evtInfo.setMCChannelNumber(0);
+  evtInfo.setMCEventNumber(0);
+  evtInfo.setMCEventWeights(std::vector<float>(1,1));
+
+  // Set Event Type
+  uint32_t eventTypeBitmask{0};
+  if (m_isSimulation) {
+    eventTypeBitmask |= xAOD::EventInfo::IS_SIMULATION;
+  }
+  if (m_isTestbeam) {
+    eventTypeBitmask |= xAOD::EventInfo::IS_TESTBEAM;
+  }
+  if (m_isCalibration) {
+    eventTypeBitmask |= xAOD::EventInfo::IS_CALIBRATION;
+  }
+  evtInfo.setEventTypeBitmask(eventTypeBitmask);
+
+  /*
+  // Trigger Info
+  const OFFLINE_FRAGMENTS_NAMESPACE::DataType* buffer;
+  // status element
+  re->status(buffer);
+  uint32_t statusElement = *buffer;
+
+  // extended LVL1ID
+  uint32_t extendedLevel1ID = re->lvl1_id();
+
+  // LVL1 trigger type
+  uint32_t level1TriggerType = re->lvl1_trigger_type();
+  */
+
+  // stream tag
+  /*
+  std::vector<xAOD::EventInfo::StreamTag> streamTags;
+  std::vector<eformat::helper::StreamTag> onl_streamTags;
+  re->stream_tag(buffer);
+  eformat::helper::decode(re->nstream_tag(), buffer, onl_streamTags);
+  for (const eformat::helper::StreamTag& onl_streamTag : onl_streamTags) {
+    std::set<uint32_t> tmp_off_dets = std::set<uint32_t>();
+    if (!onl_streamTag.dets.empty()) {
+      std::set<eformat::SubDetector> tmp_onl_dets = onl_streamTag.dets;
+      for (const eformat::SubDetector& subdet : tmp_onl_dets) {
+        tmp_off_dets.insert((uint32_t) subdet);
+      }
+    }
+    streamTags.push_back(xAOD::EventInfo::StreamTag(onl_streamTag.name
+						    , onl_streamTag.type
+						    , onl_streamTag.obeys_lumiblock
+						    , onl_streamTag.robs
+						    , tmp_off_dets)
+			 );
+  }
+
+  evtInfo.setStatusElement(statusElement);
+  evtInfo.setExtendedLevel1ID(extendedLevel1ID);
+  evtInfo.setLevel1TriggerType(level1TriggerType);
+  evtInfo.setStreamTags(streamTags);
+  */
+
+  // record EventInfo
+  evtInfo.setEventFlags(xAOD::EventInfo::Core, m_robDataProvider->getEventStatus());
+  pObj = StoreGateSvc::asStorable(pEvtInfoAux);
+
+  ATH_MSG_DEBUG(" New xAOD::EventAuxInfo made, run/event= " << runNumber 
+		<< "/" << eventNumber
+		<< "  Time stamp = " << ascTime(bc_time_sec) 
+		);
+
+  return StatusCode::SUCCESS;
+    
+}
+
+StatusCode EventInfoByteStreamAuxCnv::createRep(DataObject* /*pObj*/, IOpaqueAddress*& /*pAddr*/) 
+{
+  ATH_MSG_DEBUG("Nothing to be done for xAOD::EventAuxInfo createReps");
+  return StatusCode::SUCCESS;
+}
+
+const char* EventInfoByteStreamAuxCnv::ascTime(unsigned int tstamp) 
+{
+  struct tm t;
+  t.tm_sec   = tstamp;
+  t.tm_min   = 0;
+  t.tm_hour  = 0;
+  t.tm_mday  = 0;
+  t.tm_mon   = 0;
+  t.tm_year  = 70;
+  t.tm_wday  = 00;
+  t.tm_yday  = 00;
+  t.tm_isdst = 0;
+  time_t ct = mktime(&t);
+  tm* t2 = gmtime(&ct);
+  return(asctime(t2));
+}
diff --git a/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.h b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.h
new file mode 100644
index 00000000..a43006e1
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamAuxCnv.h
@@ -0,0 +1,60 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASEREVENTINFOBYTESTREAMAUXCNV_H
+#define FASEREVENTINFOBYTESTREAMAUXCNV_H
+
+/**
+ * @file EventInfoByteStreamAuxCnv.h
+ *
+ * @class EventInfoByteStreamAuxCnv
+ *
+ * @brief This is the class definition of ByteStream converter for xAOD::EventInfoAux
+ * Event Info is built from RawEvent when reading. Nothing is done when writing ByteStream
+ *
+ */ 
+
+#include "GaudiKernel/Converter.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "AthenaBaseComps/AthMessaging.h"
+
+class FaserByteStreamCnvSvc;
+class IFaserROBDataProviderSvc;
+class StoreGateSvc;
+
+// Abstract factory to create the converter
+template <class TYPE> class CnvFactory;
+
+class EventInfoByteStreamAuxCnv : public Converter, public AthMessaging
+{
+ public:
+  EventInfoByteStreamAuxCnv(ISvcLocator* svcloc);
+  virtual ~EventInfoByteStreamAuxCnv() override {}
+  
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  
+  /// converter method to create object
+  virtual StatusCode createObj(IOpaqueAddress* pAddr, DataObject*& pObj) override;
+  /// converter method to write object
+  virtual StatusCode createRep(DataObject* pObj, IOpaqueAddress*& pAddr) override;
+
+  /// Storage type and class ID
+  virtual long repSvcType() const override { return i_repSvcType(); }
+  static long storageType();
+  static const CLID& classID();
+
+ private:
+  const char* ascTime(unsigned int t);    //!< convert timestamp to ascii time.
+  FaserByteStreamCnvSvc* m_ByteStreamCnvSvc;   //!< pointer to BS CnvSvc
+  ServiceHandle<IFaserROBDataProviderSvc> m_robDataProvider; //!< RODDataProviderSvc handle
+  //ServiceHandle<StoreGateSvc> m_mdSvc;                  //!< TDS handle
+  
+  // flags for EventType
+  bool m_isSimulation;
+  bool m_isTestbeam;
+  bool m_isCalibration;
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.cxx b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.cxx
new file mode 100644
index 00000000..29feaa27
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.cxx
@@ -0,0 +1,81 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#include "EventInfoByteStreamxAODCnv.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+#include "AthenaKernel/errorcheck.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/DataObject.h"
+#include "GaudiKernel/IRegistry.h"
+
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODEventInfo/EventAuxInfo.h"
+
+#include "StoreGate/StoreGateSvc.h"
+
+EventInfoByteStreamxAODCnv::EventInfoByteStreamxAODCnv(ISvcLocator* svcloc)
+  : Converter(storageType(), classID(), svcloc)
+  , AthMessaging(svcloc != nullptr ? msgSvc() : nullptr, "EventInfoByteStreamxAODCnv")
+{
+}
+
+const CLID& EventInfoByteStreamxAODCnv::classID() 
+{
+  return ClassID_traits<xAOD::EventInfo>::ID();
+}
+
+long EventInfoByteStreamxAODCnv::storageType() 
+{
+  return FaserByteStreamAddress::storageType();
+}
+
+StatusCode EventInfoByteStreamxAODCnv::initialize() 
+{
+  ATH_MSG_DEBUG("EventInfoByteStreamxAODCnv::Initialize");
+  CHECK(Converter::initialize());
+  return StatusCode::SUCCESS;
+}
+
+StatusCode EventInfoByteStreamxAODCnv::finalize() 
+{
+  ATH_MSG_DEBUG("EventInfoByteStreamxAODCnv::Finalize");
+  
+  StatusCode sc = Converter::finalize();
+  if (sc.isFailure()) {
+    ATH_MSG_WARNING("Converter::finalize() failed");
+  }
+  return sc;
+}
+
+StatusCode EventInfoByteStreamxAODCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj) 
+{
+  FaserByteStreamAddress *pRE_Addr{nullptr};
+  pRE_Addr = dynamic_cast<FaserByteStreamAddress*>(pAddr);
+  if (!pRE_Addr) {
+    ATH_MSG_ERROR("Cannot cast to FaserByteStreamAddress ");
+    return StatusCode::FAILURE;
+  }
+               
+  ATH_MSG_DEBUG("EventInfoByteStreamxAODCnv::Creating Objects");
+
+  const std::string nm = *(pRE_Addr->par());
+  const std::string nmAux = nm + "Aux.";
+
+  xAOD::EventInfo* pEvtInfo = new xAOD::EventInfo();
+  DataLink<xAOD::EventAuxInfo> link(nmAux);
+  pEvtInfo->setStore(link);
+  pObj = StoreGateSvc::asStorable(pEvtInfo);
+
+  ATH_MSG_DEBUG(" New xAOD::EventInfo made, run/event= " << pEvtInfo->runNumber() << "/" << pEvtInfo->eventNumber());
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode EventInfoByteStreamxAODCnv::createRep(DataObject* /*pObj*/, IOpaqueAddress*& /*pAddr*/) 
+{
+  ATH_MSG_DEBUG("Nothing to be done for xAOD::EventInfo createReps");
+  return StatusCode::SUCCESS;
+}
diff --git a/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.h b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.h
new file mode 100644
index 00000000..a3ec402b
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/EventInfoByteStreamxAODCnv.h
@@ -0,0 +1,45 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASEREVENTINFOBYTESTREAMXAODCNV_H
+#define FASEREVENTINFOBYTESTREAMXAODCNV_H
+
+/**
+ * @file EventInfoByteStreamxAODCnv.h
+ *
+ * @class EventInfoByteStreamxAODCnv
+ *
+ * @brief This is the class definition of ByteStream converter for xAOD::EventInfo
+ * Event Info is built from RawEvent when reading. Nothing is done when writing ByteStream
+ *
+ */ 
+
+#include "GaudiKernel/Converter.h"
+#include "AthenaBaseComps/AthMessaging.h"
+
+// Abstract factory to create the converter
+template <class TYPE> class CnvFactory;
+
+class EventInfoByteStreamxAODCnv : public Converter, public AthMessaging
+{
+ public:
+  EventInfoByteStreamxAODCnv(ISvcLocator* svcloc);
+  virtual ~EventInfoByteStreamxAODCnv() override {}
+
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  
+  /// converter method to create object
+  virtual StatusCode createObj(IOpaqueAddress* pAddr, DataObject*& pObj) override;
+  /// converter method to write object
+  virtual StatusCode createRep(DataObject* pObj, IOpaqueAddress*& pAddr) override;
+
+  /// Storage type and class ID
+  virtual long repSvcType() const override { return i_repSvcType(); }
+  static long storageType();
+  static const CLID& classID();
+
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx
new file mode 100644
index 00000000..a28f22ff
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamCnvSvc.cxx
@@ -0,0 +1,292 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "FaserByteStreamCnvSvc/FaserByteStreamCnvSvc.h"
+//#include "ByteStreamCnvSvc/ByteStreamOutputSvc.h"
+//#include "ByteStreamCnvSvcBase/FullEventAssembler.h"
+//#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+#include "StoreGate/StoreGate.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODTrigger/TrigDecision.h"
+
+//#include "eformat/SourceIdentifier.h"
+//#include "eformat/StreamTag.h"
+
+#include "AthenaKernel/IClassIDSvc.h"
+
+#include "AthenaPoolUtilities/CondAttrListCollection.h"
+
+#include <algorithm>
+
+/// Standard constructor
+FaserByteStreamCnvSvc::FaserByteStreamCnvSvc(const std::string& name, ISvcLocator* pSvcLocator)
+  : FaserByteStreamCnvSvcBase(name, pSvcLocator),
+    m_evtStore ("StoreGateSvc", name)
+{
+  declareProperty("ByteStreamOutputSvc",     m_ioSvcName);
+  declareProperty("ByteStreamOutputSvcList", m_ioSvcNameList);
+  declareProperty("IsSimulation",  m_isSimulation = false);
+  declareProperty("IsTestbeam",    m_isTestbeam   = false);
+  declareProperty("IsCalibration", m_isCalibration= false);
+  declareProperty("GetDetectorMask", m_getDetectorMask = false);
+  declareProperty("UserType",      m_userType     = "RawEvent");
+  declareProperty("EventStore",    m_evtStore);
+}
+
+/// Standard Destructor
+FaserByteStreamCnvSvc::~FaserByteStreamCnvSvc() {
+}
+
+/// Initialize the service.
+StatusCode FaserByteStreamCnvSvc::initialize() {
+   if (!FaserByteStreamCnvSvcBase::initialize().isSuccess()) {
+      ATH_MSG_FATAL("FaserByteStreamCnvSvcBase::initialize() failed");
+      return(StatusCode::FAILURE);
+   }
+
+   ATH_CHECK( m_evtStore.retrieve() );
+
+   // get ready for output
+   std::vector<std::string> ioSvcNames = m_ioSvcNameList.value();
+   if (!m_ioSvcName.empty()) {
+      // add ioSvcName if ioSvcNameList is missing it
+      std::vector<std::string>::iterator it = find(ioSvcNames.begin(), ioSvcNames.end(), m_ioSvcName);
+      if (it == ioSvcNames.end()) {
+         ioSvcNames.push_back(m_ioSvcName);
+      }
+   }
+   
+   if (ioSvcNames.size() != 0) {
+      // Check FaserByteStreamCnvSvc
+      for (std::vector<std::string>::iterator itSvc = ioSvcNames.begin(), itSvcE = ioSvcNames.end();
+	      itSvc != itSvcE; ++itSvc) {
+         ATH_MSG_DEBUG("get " << *itSvc);
+
+	 ATH_MSG_WARNING("not doing anything with" << *itSvc);
+	 /*
+         // get service
+         IService* svc;
+         if (!service(*itSvc, svc).isSuccess()) {
+            ATH_MSG_FATAL("Cannot get ByteStreamOutputSvc");
+            return(StatusCode::FAILURE);
+         }
+         ByteStreamOutputSvc* ioSvc = dynamic_cast<ByteStreamOutputSvc*>(svc);
+         if (ioSvc == 0) {
+            ATH_MSG_FATAL("Cannot cast to  ByteStreamOutputSvc");
+            return(StatusCode::FAILURE);
+         }
+         // get stream name
+         std::string bsOutputStreamName;
+         SimpleProperty<std::string> propBSO("BSOutputStreamName", bsOutputStreamName);
+         if (!ioSvc->getProperty(&propBSO).isSuccess()) {
+            ATH_MSG_FATAL("Cannot get BSOutputStreamName from " << *itSvc);
+            return(StatusCode::FAILURE);
+         }
+         bsOutputStreamName = propBSO.value();
+         // append
+         m_ioSvcMap[bsOutputStreamName] = ioSvc;
+	 */
+      }
+   }
+   return(StatusCode::SUCCESS);
+}
+
+StatusCode FaserByteStreamCnvSvc::finalize() {
+  return(FaserByteStreamCnvSvcBase::finalize());
+}
+
+StatusCode FaserByteStreamCnvSvc::connectOutput(const std::string& t, const std::string& /*mode*/) {
+   return(connectOutput(t));
+}
+
+StatusCode FaserByteStreamCnvSvc::connectOutput(const std::string& /*t*/) {
+   ATH_MSG_DEBUG("In connectOutput");
+
+   /*
+   // Get the EventInfo obj for run/event number
+   const xAOD::EventInfo* evtInfo{nullptr};
+   ATH_CHECK( m_evtStore->retrieve(evtInfo) );
+   uint64_t event = evtInfo->eventNumber();
+   uint32_t run_no = evtInfo->runNumber();
+   uint32_t bc_time_sec = evtInfo->timeStamp();
+   uint32_t bc_time_ns = evtInfo->timeStampNSOffset();
+   uint32_t run_type = 0;
+   uint32_t lvl1_id = evtInfo->extendedLevel1ID();
+   if (lvl1_id == 0) {
+      lvl1_id = event;
+   }
+   uint32_t lvl1_type = evtInfo->level1TriggerType();
+   uint64_t global_id = event;
+   uint16_t lumi_block = evtInfo->lumiBlock();
+   uint16_t bc_id = evtInfo->bcid();
+   static uint8_t nevt = 0;
+   nevt = nevt%255;
+   // create an empty RawEvent
+   eformat::helper::SourceIdentifier sid = eformat::helper::SourceIdentifier(eformat::FULL_SD_EVENT, nevt);
+   m_rawEventWrite = new RawEventWrite(sid.code(), bc_time_sec, bc_time_ns, global_id, run_type, run_no, lumi_block, lvl1_id, bc_id, lvl1_type);
+   */
+   return(StatusCode::SUCCESS);
+}
+
+StatusCode FaserByteStreamCnvSvc::commitOutput(const std::string& outputConnection, bool /*b*/) {
+   ATH_MSG_DEBUG("In flushOutput " << outputConnection);
+
+   if (m_ioSvcMap.size() == 0) {
+      ATH_MSG_ERROR("FaserByteStreamCnvSvc not configure for output");
+      return(StatusCode::FAILURE);
+   }
+   /*
+   writeFEA();
+
+   // Get EventInfo
+   const xAOD::EventInfo* evtInfo{nullptr};
+   ATH_CHECK( m_evtStore->retrieve(evtInfo) );
+
+   // Try to get TrigDecision
+   const xAOD::TrigDecision* trigDecision{nullptr};
+   if(m_evtStore->retrieve(trigDecision)!=StatusCode::SUCCESS) {
+     ATH_MSG_WARNING("Failed to retrieve xAOD::TrigDecision. Will write empty trigger decision vectors");
+     trigDecision = nullptr;
+   }
+
+   // change trigger info in Header
+   uint32_t *l1Buff{nullptr};
+   uint32_t *l2Buff{nullptr};
+   uint32_t *efBuff{nullptr};
+   uint32_t *encTag{nullptr};
+
+   m_rawEventWrite->lvl1_id(evtInfo->extendedLevel1ID());
+   m_rawEventWrite->lvl1_trigger_type((uint8_t)(evtInfo->level1TriggerType()));
+
+   // LVL1 info
+   uint32_t l1Size{0};
+   if(trigDecision) {
+     const std::vector<uint32_t>& tbp = trigDecision->tbp();
+     const std::vector<uint32_t>& tap = trigDecision->tap();
+     const std::vector<uint32_t>& tav = trigDecision->tav();
+     size_t l1TotSize = tbp.size()+tap.size()+tav.size();
+     if(l1TotSize>0) {
+       l1Buff = new uint32_t[l1TotSize];
+       for(uint32_t tb : tbp) {
+	 l1Buff[l1Size++] = tb;
+       }
+       for(uint32_t tb : tap) {
+	 l1Buff[l1Size++] = tb;
+       }
+       for(uint32_t tb : tav) {
+	 l1Buff[l1Size++] = tb;
+       }
+     }
+   }
+   m_rawEventWrite->lvl1_trigger_info(l1Size, l1Buff);
+
+   // LVL2 info
+   uint32_t l2Size{0};
+   if(trigDecision) {
+     const std::vector<uint32_t>& lvl2PP = trigDecision->lvl2PassedPhysics();
+     if(lvl2PP.size()>0) {
+       l2Buff = new uint32_t[lvl2PP.size()];
+       for(uint32_t tb : lvl2PP) {
+	 l2Buff[l2Size++] = tb;
+       }
+     }
+   }
+   m_rawEventWrite->lvl2_trigger_info(l2Size, l2Buff);
+
+   // EF info
+   uint32_t efSize{0};
+   if(trigDecision) {
+     const std::vector<uint32_t>& efPP = trigDecision->efPassedPhysics();
+     if(efPP.size()>0) {
+       efBuff = new uint32_t[efPP.size()];
+       for(uint32_t tb : efPP) {
+	 efBuff[efSize++] = tb;
+       }
+     }
+   }
+   m_rawEventWrite->event_filter_info(efSize, efBuff);
+
+   // stream tag
+   std::vector<eformat::helper::StreamTag> on_streamTags;
+   const std::vector<xAOD::EventInfo::StreamTag>& off_streamTags = evtInfo->streamTags();
+   for(const auto& sTag : off_streamTags) {
+     // convert offline -> online
+     eformat::helper::StreamTag tmpTag;
+     tmpTag.name = sTag.name();
+     tmpTag.type = sTag.type();
+     tmpTag.obeys_lumiblock = sTag.obeysLumiblock();
+     for(uint32_t rob : sTag.robs()) {
+       tmpTag.robs.insert(rob);
+     }
+     for(uint32_t det : sTag.dets()) {
+       tmpTag.dets.insert((eformat::SubDetector)det);
+     }
+     on_streamTags.push_back(tmpTag);
+   }
+   // encode
+   uint32_t encSize = eformat::helper::size_word(on_streamTags);
+   encTag = new uint32_t[encSize];
+   eformat::helper::encode(on_streamTags, encSize, encTag);
+   m_rawEventWrite->stream_tag(encSize, encTag);
+
+   // convert RawEventWrite to RawEvent
+   uint32_t rawSize = m_rawEventWrite->size_word();
+   OFFLINE_FRAGMENTS_NAMESPACE::DataType* buffer = new OFFLINE_FRAGMENTS_NAMESPACE::DataType[rawSize];
+   uint32_t count = eformat::write::copy(*(m_rawEventWrite->bind()), buffer, rawSize);
+   if (count != rawSize) {
+      ATH_MSG_ERROR("Memcopy failed");
+      return(StatusCode::FAILURE);
+   }
+   RawEvent rawEvent(buffer);
+   // check validity
+   try {
+      rawEvent.check_tree();
+   } catch (...) {
+      ATH_MSG_ERROR("commitOutput failed, because FullEventFragment invalid");
+      return(StatusCode::FAILURE);
+   }
+   ATH_MSG_DEBUG("commitOutput: Size of Event (words) = " << rawEvent.fragment_size_word());
+   // put event to OutputSvc
+   if ((m_ioSvcMap.size() == 1) or (m_ioSvcMap.count(outputConnection) > 0)) {
+      std::map<std::string, ByteStreamOutputSvc*>::iterator itSvc = m_ioSvcMap.find(outputConnection);
+      // for backward compatibility
+      if (itSvc == m_ioSvcMap.end()) {
+         itSvc = m_ioSvcMap.begin();
+      }
+      // put
+      if (!itSvc->second->putEvent(&rawEvent)) {
+         ATH_MSG_ERROR("commitOutput failed to send output");
+         return(StatusCode::FAILURE);
+      }
+   }
+   // delete
+   delete [] buffer; buffer = 0;
+   delete m_rawEventWrite; m_rawEventWrite = 0;
+   delete [] l1Buff; l1Buff = 0;
+   delete [] l2Buff; l2Buff = 0;
+   delete [] efBuff; efBuff = 0;
+   delete [] encTag; encTag = 0;
+   // delete FEA
+   for (std::map<std::string, FullEventAssemblerBase*>::const_iterator it = m_feaMap.begin(),
+	   itE = m_feaMap.end(); it != itE; it++) {
+      delete it->second;
+   }
+   m_feaMap.clear();
+
+*/
+   return(StatusCode::SUCCESS);
+}
+
+/*
+void FaserByteStreamCnvSvc::writeFEA() {
+   ATH_MSG_DEBUG("before FEAMAP size = " << m_feaMap.size());
+   for (std::map<std::string, FullEventAssemblerBase*>::const_iterator it = m_feaMap.begin(),
+	   itE = m_feaMap.end(); it != itE; it++) {
+      MsgStream log(msgSvc(), name());
+      (*it).second->fill(m_rawEventWrite, log);
+   }
+   ATH_MSG_DEBUG("after FEAMAP size = " << m_feaMap.size());
+}
+*/
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx
new file mode 100644
index 00000000..d15e84c0
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/FaserByteStreamInputSvc.cxx
@@ -0,0 +1,470 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h"
+
+#include "DumpFrags.h"
+
+//#include "ByteStreamData/ByteStreamMetadataContainer.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+#include "FaserEventStorage/pickFaserDataReader.h"
+
+#include "GaudiKernel/IJobOptionsSvc.h"
+#include "Gaudi/Property.h"
+
+#include "PersistentDataModel/DataHeader.h"
+#include "PersistentDataModel/Token.h"
+#include "StoreGate/StoreGateSvc.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODEventInfo/EventAuxInfo.h"
+
+#include "EventFormats/DAQFormats.hpp"
+
+// Don't know what these do, comment for now
+// #include "eformat/HeaderMarker.h"
+// #include "eformat/SourceIdentifier.h"
+// #include "eformat/Issue.h"
+// #include "eformat/Problem.h"
+// #include "eformat/Version.h"
+// #include "eformat/Status.h"
+// #include "eformat/old/util.h"
+
+#include <cstdio>
+#include <string>
+#include <vector>
+#include <unistd.h>
+
+using DAQFormats::EventFull;
+
+// Constructor.
+FaserByteStreamInputSvc::FaserByteStreamInputSvc(
+       const std::string& name, ISvcLocator* svcloc) 
+  : AthService(name, svcloc)
+  , m_readerMutex()
+  , m_eventsCache()
+  , m_reader()
+  , m_evtOffsets()
+  , m_evtInFile(0)
+  , m_evtFileOffset(0)
+  , m_fileGUID("")
+  , m_storeGate    ("StoreGateSvc", name)
+    //, m_inputMetadata("StoreGateSvc/InputMetaDataStore", name)
+  , m_robProvider  ("FaserROBDataProviderSvc", name)
+  , m_sequential   (this, "EnableSequential",   false, "")
+  , m_dump         (this, "DumpFlag",           false, "Dump fragments")
+  , m_wait         (this, "WaitSecs",              0., "Seconds to wait if input is in wait state")
+  , m_valEvent     (this, "ValidateEvent",       true, "switch on check_tree when reading events")
+  , m_eventInfoKey (this, "EventInfoKey", "EventInfo", "Key of EventInfo in metadata store")
+
+{
+  assert(pSvcLocator != nullptr);
+
+  declareProperty("EventStore",    m_storeGate);
+  //declareProperty("MetaDataStore", m_inputMetadata);
+}
+//------------------------------------------------------------------------------
+FaserByteStreamInputSvc::~FaserByteStreamInputSvc() {  
+}
+//------------------------------------------------------------------------------
+StatusCode FaserByteStreamInputSvc::initialize() {
+   ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+
+   ATH_CHECK(m_storeGate.retrieve());
+   ATH_CHECK(m_robProvider.retrieve());
+
+   return(StatusCode::SUCCESS);
+}
+//________________________________________________________________________________
+StatusCode FaserByteStreamInputSvc::stop() {
+   ATH_MSG_DEBUG("Calling FaserByteStreamInputSvc::stop()");
+   // close moved to EventSelector for explicit coupling with incident
+   return(StatusCode::SUCCESS);
+}
+//------------------------------------------------------------------------------
+StatusCode FaserByteStreamInputSvc::finalize() {
+
+  ATH_CHECK(m_storeGate.release());
+  ATH_CHECK(m_robProvider.release()); 
+
+  return(StatusCode::SUCCESS);
+}
+//------------------------------------------------------------------------------
+long FaserByteStreamInputSvc::positionInBlock()
+{
+  return m_evtOffsets.size();
+}
+
+const EventFull* FaserByteStreamInputSvc::previousEvent() {
+  ATH_MSG_WARNING("previousEvent called, but not implemented!");
+  return NULL;
+}
+//------------------------------------------------------------------------------
+// Read the next event.
+const EventFull* FaserByteStreamInputSvc::nextEvent() {
+
+  ATH_MSG_DEBUG("FaserByteStreamInputSvc::nextEvent() called");
+
+  std::lock_guard<std::mutex> lock( m_readerMutex );
+  const EventContext context{ Gaudi::Hive::currentContext() };
+
+  // Load event from file
+  EventFull* theEvent=0;
+
+  if (readerReady()) {
+
+    m_evtInFile ++; // increment iterator
+
+    if (m_evtInFile+1 > m_evtOffsets.size()) { 
+      // get current event position (cast to long long until native tdaq implementation)
+      ATH_MSG_DEBUG("nextEvent _above_ high water mark");
+      m_evtFileOffset = (long long)m_reader->getPosition();
+      m_evtOffsets.push_back(m_evtFileOffset);
+      m_reader->getData(theEvent);
+    }
+
+    else {
+      // Load from previous offset
+      ATH_MSG_DEBUG("nextEvent below high water mark");
+      m_evtFileOffset = m_evtOffsets.at( m_evtInFile-1 );
+      m_reader->getData( theEvent, m_evtFileOffset );
+    }
+
+    ATH_MSG_DEBUG("Read Event:\n" << *theEvent);
+  }
+  else {
+    ATH_MSG_ERROR("DataReader not ready. Need to getBlockIterator first");
+    return 0;
+  }
+
+  
+  EventCache* cache = m_eventsCache.get(context);
+
+  // initialize before building RawEvent
+  cache->releaseEvent(); 
+   
+  // Use buffer to build FullEventFragment
+  try {
+    buildEvent( cache,  theEvent, true );
+  }
+  catch (...) {
+    // rethrow any exceptions
+    throw;
+  }
+
+  if ( cache->rawEvent == NULL ) {
+    ATH_MSG_ERROR("Failure to build fragment");
+    return NULL;
+  }
+
+  // Set it for the data provider
+  ATH_MSG_DEBUG( "call robProvider->setNextEvent ");
+  m_robProvider->setNextEvent(context, cache->rawEvent.get() );
+  m_robProvider->setEventStatus(context, cache->eventStatus );
+
+  // dump
+  if (m_dump) {
+    DumpFrags::dump(cache->rawEvent.get());
+  }
+
+  ATH_MSG_DEBUG( "switched to next event in slot " << context );
+  return( cache->rawEvent.get() );
+
+}
+
+void FaserByteStreamInputSvc::validateEvent() {
+  const EventContext& context{ Gaudi::Hive::currentContext() };
+  const EventFull* const event = m_eventsCache.get(context)->rawEvent.get();
+  m_eventsCache.get(context)->eventStatus = validateEvent( event );
+}
+
+unsigned FaserByteStreamInputSvc::validateEvent( const EventFull* const rawEvent ) const
+{
+  unsigned int status = 0;
+  if (m_valEvent) {
+    ATH_MSG_WARNING("validateEvent called, but not implemented");
+    ATH_MSG_INFO("event:\n" << *rawEvent);
+    /*
+    // check validity
+    std::vector<eformat::FragmentProblem> p;
+    rawEvent->problems(p);
+    if (!p.empty()) {
+      status += 0x01000000;
+      // bad event
+      ATH_MSG_WARNING("Failed to create FullEventFragment");
+      for (std::vector<eformat::FragmentProblem>::const_iterator i = p.begin(), iEnd = p.end();
+	        i != iEnd; i++) {
+        ATH_MSG_WARNING(eformat::helper::FragmentProblemDictionary.string(*i));
+      }
+      //      releaseCurrentEvent();
+      throw ByteStreamExceptions::badFragmentData();
+    }
+    if ( !ROBFragmentCheck( rawEvent ) ) {
+      status += 0x02000000;
+      // bad event
+      //      releaseCurrentEvent();
+      ATH_MSG_ERROR("Skipping bad event");
+      throw ByteStreamExceptions::badFragmentData();
+    }
+    */
+  } 
+  else {
+    ATH_MSG_DEBUG("Processing event without validating.");
+  }
+  return status;
+}
+
+void FaserByteStreamInputSvc::buildEvent(EventCache* cache, EventFull* theEvent, bool validate) const
+{
+  ATH_MSG_DEBUG("FaserByteStreamInputSvc::buildEvent() called");
+
+  if (validate) {
+    // Nothing to do
+  }
+
+  cache->eventStatus = 0;
+  //cache->rawEvent = std::make_unique<EventFull>();
+  cache->rawEvent.reset(theEvent);
+}
+
+//__________________________________________________________________________
+StatusCode FaserByteStreamInputSvc::generateDataHeader()
+{
+  ATH_MSG_DEBUG("FaserByteStreamInputSvc::generateDataHeader() called");
+
+  // get file GUID
+  m_fileGUID = m_reader->GUID();
+
+  // reader returns -1 when end of the file is reached
+  if (m_evtFileOffset != -1) {
+    ATH_MSG_DEBUG("ByteStream File GUID:" << m_fileGUID);
+    ATH_MSG_DEBUG("ByteStream Event Position in File: " << m_evtFileOffset);
+
+    // To accomodate for skipEvents option in EventSelector
+    // While skipping BS event Selector does not return SUCCESS code,
+    // just advances silently through events. So SG content is not refreshed
+    // Lets do refresh of the event header here
+    std::string key = "ByteStreamDataHeader";
+    ATH_CHECK(deleteEntry<DataHeader>(key));
+
+
+    // Created data header element with BS provenance information
+    std::unique_ptr<DataHeaderElement> dataHeaderElement = makeBSProvenance();
+    // Create data header itself
+    std::unique_ptr<DataHeader> dataHeader = std::make_unique<DataHeader>();
+    // Declare header primary
+    dataHeader->setStatus(DataHeader::Input);
+    //add the data header elenebt self reference to the object vector
+    dataHeader->insert(*std::move(dataHeaderElement));
+
+
+    // Clean up EventInfo from the previous event
+    key = m_eventInfoKey.value();
+    ATH_CHECK(deleteEntry<xAOD::EventInfo>(key));
+    // Now add ref to xAOD::EventInfo
+    std::unique_ptr<IOpaqueAddress> iopx = std::make_unique<FaserByteStreamAddress>(
+									       ClassID_traits<xAOD::EventInfo>::ID(), key, "");
+    ATH_CHECK(m_storeGate->recordAddress(key, iopx.release()));
+    const SG::DataProxy* ptmpx = m_storeGate->transientProxy(
+							     ClassID_traits<xAOD::EventInfo>::ID(), key);
+    if (ptmpx != nullptr) {
+      DataHeaderElement element(ptmpx, 0, key);
+      dataHeader->insert(element);
+    }
+
+    // Clean up auxiliary EventInfo from the previous event
+    key = m_eventInfoKey.value() + "Aux.";
+    ATH_CHECK(deleteEntry<xAOD::EventAuxInfo>(key));
+    // Now add ref to xAOD::EventAuxInfo
+    std::unique_ptr<IOpaqueAddress> iopaux = std::make_unique<FaserByteStreamAddress>(
+										 ClassID_traits<xAOD::EventAuxInfo>::ID(), key, "");
+    ATH_CHECK(m_storeGate->recordAddress(key, iopaux.release()));
+    const SG::DataProxy* ptmpaux = m_storeGate->transientProxy(
+							       ClassID_traits<xAOD::EventAuxInfo>::ID(), key);
+    if (ptmpaux !=0) {
+      DataHeaderElement element(ptmpaux, 0, key);
+      dataHeader->insert(element);
+    }
+
+    // Record new data header.Boolean flags will allow it's deletionin case
+    // of skipped events.
+    ATH_CHECK(m_storeGate->record<DataHeader>(dataHeader.release(),
+					      "ByteStreamDataHeader", true, false, true));
+  }
+  return StatusCode::SUCCESS;
+}
+
+/******************************************************************************/
+void
+FaserByteStreamInputSvc::EventCache::releaseEvent()
+{
+  // cleanup parts of previous event and re-init them
+  if(rawEvent) {
+    rawEvent.reset(nullptr);
+    eventStatus = 0;
+  }
+}
+
+/******************************************************************************/
+FaserByteStreamInputSvc::EventCache::~EventCache()
+{
+  releaseEvent();
+}
+
+
+
+/******************************************************************************/
+void
+FaserByteStreamInputSvc::closeBlockIterator(bool clearMetadata)
+{
+  if (clearMetadata) {
+    ATH_MSG_WARNING("Clearing input metadata store");
+    // StatusCode status = m_inputMetadata->clearStore();
+    // if (!status.isSuccess()) {
+    //   ATH_MSG_WARNING("Unable to clear Input MetaData Proxies");
+    // }
+  }
+
+  if (!readerReady()) {
+    ATH_MSG_INFO("No more events in this run, high water mark for this file = "
+		 << m_evtOffsets.size()-1);
+  }
+
+  m_reader.reset();
+}
+
+
+/******************************************************************************/
+bool
+FaserByteStreamInputSvc::setSequentialRead()
+{
+  // enable SequenceReading
+  m_reader->enableSequenceReading();
+  return true;
+}
+
+/******************************************************************************/
+bool
+FaserByteStreamInputSvc::ready() const
+{
+  return readerReady();
+}
+
+
+/******************************************************************************/
+std::pair<long,std::string>
+FaserByteStreamInputSvc::getBlockIterator(const std::string fileName)
+{
+  // open the file
+  if(m_reader != 0) closeBlockIterator();
+
+  m_reader = std::unique_ptr<FaserEventStorage::DataReader>(pickFaserDataReader(fileName));
+
+  if(m_reader == nullptr) {
+    ATH_MSG_ERROR("Failed to open file " << fileName);
+    closeBlockIterator();
+    return std::make_pair(-1,"END"); 
+  }
+
+  // Initilaize offset vector
+  m_evtOffsets.resize(m_reader->eventsInFile(), -1);
+  m_evtOffsets.clear();
+
+  m_evtInFile = 0;
+
+  // enable sequentialReading if multiple files
+  if(m_sequential) {
+    bool test = setSequentialRead();
+    if (!test) return std::make_pair(-1,"SEQ");
+  }
+
+  ATH_MSG_INFO("Picked valid file: " << m_reader->fileName());
+  // initialize offsets and counters
+  m_evtOffsets.push_back(static_cast<long long>(m_reader->getPosition()));
+  return std::make_pair(m_reader->eventsInFile(), m_reader->GUID());
+}
+
+
+//__________________________________________________________________________
+bool FaserByteStreamInputSvc::readerReady() const
+{
+  bool eofFlag(false);
+  if (m_reader!=0) eofFlag = m_reader->endOfFile();
+  else {
+    ATH_MSG_INFO("eformat reader object not initialized");
+    return false;
+  }
+  bool moreEvent = m_reader->good();
+  
+  return (!eofFlag)&&moreEvent;
+}
+//__________________________________________________________________________
+void FaserByteStreamInputSvc::setEvent(void* data, unsigned int eventStatus) {
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  return setEvent( context, data, eventStatus );
+}
+
+void FaserByteStreamInputSvc::setEvent( const EventContext& context, void* data, unsigned int eventStatus )
+{
+  ATH_MSG_DEBUG("FaserByteStreamInputSvc::setEvent() called");
+
+  EventCache* cache = m_eventsCache.get( context );
+  cache->releaseEvent();
+
+  EventFull* event = reinterpret_cast<EventFull*>(data);
+  cache->rawEvent.reset(event);
+  cache->eventStatus = eventStatus;
+
+  // Set it for the data provider
+  m_robProvider->setNextEvent(context, cache->rawEvent.get());
+  m_robProvider->setEventStatus(context, cache->eventStatus);
+
+  // Build a DH for use by other components
+  StatusCode rec_sg = generateDataHeader();
+  if (rec_sg != StatusCode::SUCCESS) {
+    ATH_MSG_ERROR("Fail to record BS DataHeader in StoreGate. Skipping events?! " << rec_sg);
+  }
+}
+
+//__________________________________________________________________________
+inline const InterfaceID& FaserByteStreamInputSvc::interfaceID() {
+  /// Declaration of the interface ID ( interface id, major version, minor version)
+  static const InterfaceID IID_ByteStreamInputSvc("ByteStreamInputSvc", 1, 0);
+  return(IID_ByteStreamInputSvc);
+}
+//__________________________________________________________________________
+const EventFull* FaserByteStreamInputSvc::currentEvent() const {
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  return m_eventsCache.get(context)->rawEvent.get();
+}
+//__________________________________________________________________________
+unsigned int FaserByteStreamInputSvc::currentEventStatus() const {
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  return m_eventsCache.get(context)->eventStatus;
+}
+//________________________________________________________________________________
+StatusCode FaserByteStreamInputSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) {
+   if (FaserByteStreamInputSvc::interfaceID().versionMatch(riid)) {
+      *ppvInterface = dynamic_cast<FaserByteStreamInputSvc*>(this);
+   } else {
+     // Interface is not directly available: try out a base class
+     return(::AthService::queryInterface(riid, ppvInterface));
+   }
+   addRef();
+   return(StatusCode::SUCCESS);
+}
+
+
+std::unique_ptr<DataHeaderElement>
+FaserByteStreamInputSvc::makeBSProvenance() const
+{
+  std::unique_ptr<Token> token = std::make_unique<Token>();
+  token->setDb(m_fileGUID);
+  token->setTechnology(0x00001000);
+  token->setOid(Token::OID_t(0LL, m_evtFileOffset));
+
+  // note: passing ownership of token to DataHeaderElement
+  return std::make_unique<DataHeaderElement>(ClassID_traits<DataHeader>::ID(),
+					     "StreamRAW", token.release());
+}
+
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.cxx b/Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.cxx
new file mode 100644
index 00000000..f7d24aa9
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.cxx
@@ -0,0 +1,26 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+/** @file FaserEventContextByteStream.cxx
+ *  @brief This file contains the implementation for the FaserEventContextByteStream class.
+ *  @author Peter van Gemmeren <gemmeren@bnl.gov>
+ *  @author Hong Ma <hma@bnl.gov>
+ **/
+
+#include "FaserEventContextByteStream.h"
+
+//________________________________________________________________________________
+FaserEventContextByteStream::FaserEventContextByteStream(const IEvtSelector* selector) : m_evtSelector(selector) {
+}
+//________________________________________________________________________________
+FaserEventContextByteStream::FaserEventContextByteStream(const FaserEventContextByteStream& ctxt) : IEvtSelector::Context(),
+										     m_evtSelector(ctxt.m_evtSelector) {
+}
+//________________________________________________________________________________
+FaserEventContextByteStream::~FaserEventContextByteStream() {
+}
+//________________________________________________________________________________
+void* FaserEventContextByteStream::identifier() const {
+  return((void*)(m_evtSelector));
+}
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.h b/Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.h
new file mode 100644
index 00000000..7e277a1b
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/FaserEventContextByteStream.h
@@ -0,0 +1,38 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef EVENTCONTEXTBYTESTREAM_H
+#define EVENTCONTEXTBYTESTREAM_H
+
+/** @file EventContextByteStream.h
+ *  @brief This file contains the class definition for the EventContextByteStream class.
+ *  @author Hong Ma <hma@bnl.gov>
+ **/
+
+#include "GaudiKernel/IEvtSelector.h"
+
+class FaserEventSelectorByteStream;
+class IOpaqueAddress;
+
+/** @class FaserEventContextByteStream
+ *  @brief This class provides the Context for EventSelectorByteStream
+ **/
+class FaserEventContextByteStream : virtual public IEvtSelector::Context {
+
+ public:
+  /// Constructor
+  FaserEventContextByteStream(const IEvtSelector* selector);
+  /// Copy constructor
+  FaserEventContextByteStream(const FaserEventContextByteStream& ctxt);
+  /// Destructor
+  virtual ~FaserEventContextByteStream();
+
+  /// Inequality operator.
+  virtual void* identifier() const;
+
+ private:
+  const IEvtSelector* m_evtSelector;
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx b/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx
new file mode 100644
index 00000000..e78b4025
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.cxx
@@ -0,0 +1,1045 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//====================================================================
+// FaserEventSelectorByteStream.cxx
+//====================================================================
+//
+// Include files.
+#include "FaserEventSelectorByteStream.h"
+#include "FaserEventContextByteStream.h"
+#include "FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h"
+#include "FaserByteStreamCnvSvc/ByteStreamExceptions.h"
+//#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+#include "EventFormats/DAQFormats.hpp"
+
+#include "GaudiKernel/ClassID.h"
+#include "GaudiKernel/FileIncident.h"
+#include "GaudiKernel/IIncidentSvc.h"
+#include "GaudiKernel/IIoComponentMgr.h"
+#include "GaudiKernel/IJobOptionsSvc.h"
+
+#include "AthenaKernel/IAthenaIPCTool.h"
+#include "EventInfo/EventInfo.h"
+#include "StoreGate/StoreGate.h"
+
+// EventInfoAttributeList includes
+#include "AthenaPoolUtilities/AthenaAttributeList.h"
+#include "EventInfo/TriggerInfo.h"
+#include "PersistentDataModel/DataHeader.h"
+#include "eformat/StreamTag.h"
+
+#include <vector>
+#include <algorithm>
+
+using DAQFormats::EventFull;
+
+// Constructor.
+FaserEventSelectorByteStream::FaserEventSelectorByteStream(const std::string& name, ISvcLocator* svcloc) : ::AthService(name, svcloc),
+												 m_fileCount(0),
+												 m_beginIter(0),
+												 m_endIter(0),
+												 m_eventSource(0),
+												 m_incidentSvc("IncidentSvc", name),
+  m_evtStore( "StoreGateSvc", name ),
+  m_firstFileFired(false),
+  m_beginFileFired(false),
+												 m_inputCollectionsFromIS(false),
+  m_NumEvents(0),
+  m_eventStreamingTool("", this),
+												 m_helperTools(this),
+  m_counterTool("", this) {
+  declareProperty("ByteStreamInputSvc",  m_eventSourceName);
+  declareProperty("Input",               m_inputCollectionsProp);
+  declareProperty("MaxBadEvents",        m_maxBadEvts = -1);
+  declareProperty("ProcessBadEvent",     m_procBadEvent = false);
+  declareProperty("SkipEvents",          m_SkipEvents = 0);
+  declareProperty("SkipEventSequence",   m_skipEventSequenceProp);
+
+  declareProperty("HelperTools",         m_helperTools);
+  declareProperty("CounterTool",         m_counterTool);
+  declareProperty("SharedMemoryTool",    m_eventStreamingTool);
+
+  // RunNumber, OldRunNumber and OverrideRunNumberFromInput are used
+  // to override the run number coming in on the input stream
+  declareProperty("RunNumber",           m_runNo = 0);
+  m_runNo.verifier().setLower(0);
+  // The following properties are only for compatibility with
+  // McEventSelector and are not really used anywhere
+  declareProperty("EventsPerRun",        m_eventsPerRun = 1000000);
+  m_eventsPerRun.verifier().setLower(0);
+  declareProperty("FirstEvent",          m_firstEventNo = 0);
+  m_firstEventNo.verifier().setLower(0);
+  declareProperty("FirstLB",             m_firstLBNo = 0);
+  m_firstLBNo.verifier().setLower(0);
+  declareProperty("EventsPerLB",         m_eventsPerLB = 1000);
+  m_eventsPerLB.verifier().setLower(0);
+  declareProperty("InitialTimeStamp",    m_initTimeStamp = 0);
+  m_initTimeStamp.verifier().setLower(0);
+  declareProperty("TimeStampInterval",   m_timeStampInterval = 0);
+  declareProperty("OverrideRunNumber",   m_overrideRunNumber = false);
+  declareProperty("OverrideEventNumber", m_overrideEventNumber = false);
+  declareProperty("OverrideTimeStamp",   m_overrideTimeStamp = false);
+  declareProperty("FileBased", m_filebased = true);
+
+  m_inputCollectionsProp.declareUpdateHandler(&FaserEventSelectorByteStream::inputCollectionsHandler, this);
+}
+//________________________________________________________________________________
+void FaserEventSelectorByteStream::inputCollectionsHandler(Gaudi::Details::PropertyBase&) {
+  if (this->FSMState() != Gaudi::StateMachine::OFFLINE) {
+    this->reinit().ignore();
+  }
+}
+//________________________________________________________________________________
+FaserEventSelectorByteStream::~FaserEventSelectorByteStream() {
+}
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::initialize() {
+  ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+  if (!::AthService::initialize().isSuccess()) {
+    ATH_MSG_FATAL("Cannot initialize AthService base class.");
+    return(StatusCode::FAILURE);
+  }
+
+  // Check for input setting
+  if (m_filebased && m_inputCollectionsProp.value().size() == 0) {
+    ATH_MSG_WARNING("InputCollections not properly set, checking EventStorageInputSvc properties");
+    ServiceHandle<IJobOptionsSvc> joSvc("JobOptionsSvc", name());
+    bool retrieve(false);
+    if (!joSvc.retrieve().isSuccess()) {
+      ATH_MSG_FATAL("Cannot get JobOptionsSvc.");
+    } else {
+      // Check if FullFileName is set in the InputSvc
+      typedef std::vector<const Gaudi::Details::PropertyBase*> Properties_t;
+      //const Properties_t* esProps = joSvc->getProperties("FaserByteStreamInputSvc");
+      const Properties_t* esProps = joSvc->getProperties(m_eventSourceName);
+
+      std::vector<const Gaudi::Details::PropertyBase*>::const_iterator ii = esProps->begin();
+      if (esProps != 0) {
+	while (ii != esProps->end()) {
+	  if ((*ii)->name() == "FullFileName") {
+	    StringArrayProperty temp;
+	    if ((*ii)->load(temp)) {
+	      retrieve = true;
+	      m_inputCollectionsProp.assign(temp);
+	      m_inputCollectionsFromIS = true;
+	      ATH_MSG_INFO("Retrieved InputCollections from InputSvc");
+	    }
+	  }
+	  if ((*ii)->name() == "EventStore") {
+	    StringProperty temp2;
+	    if ((*ii)->load(temp2)) {
+	      m_evtStore = ServiceHandle<StoreGateSvc>(temp2.value(),this->name());
+	      ATH_MSG_INFO("Retrieved StoreGateSvc name of " << temp2);
+	    }
+	  }
+	  ++ii;
+	}
+      } else {
+	ATH_MSG_WARNING("Did not find InputSvc jobOptions properties");
+      }
+    }
+    if (!retrieve) {
+      ATH_MSG_FATAL("Unable to retrieve valid input list");
+      return(StatusCode::FAILURE);
+    }
+  }
+  m_skipEventSequence = m_skipEventSequenceProp.value();
+  std::sort(m_skipEventSequence.begin(), m_skipEventSequence.end());
+
+  // Check ByteStreamCnvSvc
+  IService* svc;
+  if (!serviceLocator()->getService(m_eventSourceName, svc).isSuccess()) {
+    ATH_MSG_FATAL("Cannot get FaserByteStreamInputSvc");
+    return(StatusCode::FAILURE);
+  }
+  m_eventSource = dynamic_cast<FaserByteStreamInputSvc*>(svc);
+  if (m_eventSource == 0) {
+    ATH_MSG_FATAL("Cannot cast FaserByteStreamInputSvc");
+    return(StatusCode::FAILURE);
+  }
+  m_eventSource->addRef();
+  if (!m_evtStore.retrieve().isSuccess()) {
+    ATH_MSG_FATAL("Cannot get StoreGateSvc");
+    return(StatusCode::FAILURE);
+  }
+
+  // Get CounterTool (if configured)
+  if (!m_counterTool.empty()) {
+    if (!m_counterTool.retrieve().isSuccess()) {
+      ATH_MSG_FATAL("Cannot get CounterTool.");
+      return(StatusCode::FAILURE);
+    }
+  }
+  // Get HelperTools
+  if (!m_helperTools.empty()) {
+    if (!m_helperTools.retrieve().isSuccess()) {
+      ATH_MSG_FATAL("Cannot get " << m_helperTools);
+      return(StatusCode::FAILURE);
+    }
+  }
+  // Get SharedMemoryTool (if configured)
+  if (!m_eventStreamingTool.empty() && !m_eventStreamingTool.retrieve().isSuccess()) {
+    ATH_MSG_FATAL("Cannot get AthenaSharedMemoryTool");
+    return(StatusCode::FAILURE);
+  }
+
+  // Register this service for 'I/O' events
+  ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
+  if (!iomgr.retrieve().isSuccess()) {
+    ATH_MSG_FATAL("Cannot retrieve IoComponentMgr.");
+    return(StatusCode::FAILURE);
+  }
+  if (!iomgr->io_register(this).isSuccess()) {
+    ATH_MSG_FATAL("Cannot register myself with the IoComponentMgr.");
+    return(StatusCode::FAILURE);
+  }
+
+  // Register the input files with the iomgr
+  bool allGood = true;
+  const std::vector<std::string>& incol = m_inputCollectionsProp.value();
+  for (std::size_t icol = 0, imax = incol.size(); icol != imax; ++icol) {
+    if (!iomgr->io_register(this, IIoComponentMgr::IoMode::READ, incol[icol]).isSuccess()) {
+      ATH_MSG_FATAL("could not register [" << incol[icol] << "] for output !");
+      allGood = false;
+    } else {
+      ATH_MSG_VERBOSE("io_register[" << this->name() << "](" << incol[icol] << ") [ok]");
+    }
+  }
+  if (!allGood) {
+    return(StatusCode::FAILURE);
+  }
+
+  // For backward compatibility, check InputSvc properties for bad events
+  ServiceHandle<IJobOptionsSvc> joSvc("JobOptionsSvc", name());
+  if (!joSvc.retrieve().isSuccess()) {
+    ATH_MSG_FATAL("Cannot get JobOptionsSvc.");
+    return(StatusCode::FAILURE);
+  }
+  typedef std::vector<const Gaudi::Details::PropertyBase*> Properties_t;
+  //const Properties_t* esProps = joSvc->getProperties("FaserByteStreamInputSvc");
+  const Properties_t* esProps = joSvc->getProperties(m_eventSourceName);
+  if (esProps != 0) {
+    std::vector<const Gaudi::Details::PropertyBase*>::const_iterator ii = esProps->begin();
+    while (ii != esProps->end()) {
+      IntegerProperty temp;
+      if ((*ii)->name() == "MaxBadEvents") {     // find it
+	if ((*ii)->load(temp)) {                // load it
+	  if (temp.value() != -1) {            // check if it is set
+	    m_maxBadEvts = temp.value();
+	    ATH_MSG_INFO("Retrieved MaxBadEvents=" << m_maxBadEvts << " from ByteStreamInputSvc");
+	  }
+	}
+      }
+      BooleanProperty temp2;
+      if ((*ii)->name() == "ProcessBadEvents") {     // find it
+	if ((*ii)->load(temp)) {                // load it
+	  if (temp.value()) {            // check if it is set
+	    m_procBadEvent = temp.value();
+	    ATH_MSG_INFO("Retrieved ProcessBadEvents=" << m_procBadEvent << " from ByteStreamInputSvc");
+	  }
+	}
+      }
+      ++ii;
+    }
+  } else {
+    ATH_MSG_WARNING("Did not find FaserByteStreamInputSvc jobOptions properties");
+  }
+   
+  // Must happen before trying to open a file
+  StatusCode risc = this->reinit();
+
+  return risc;
+}
+//__________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::reinit() {
+  ATH_MSG_INFO("reinitialization...");
+  // reset markers
+  if (m_inputCollectionsProp.value().size()>0) {
+    m_numEvt.resize(m_inputCollectionsProp.value().size(), -1);
+    m_firstEvt.resize(m_inputCollectionsProp.value().size(), -1);
+  }
+  else {
+    m_numEvt.resize(1);
+    m_firstEvt.resize(1);
+  }
+
+  // Initialize InputCollectionsIterator
+  m_inputCollectionsIterator = m_inputCollectionsProp.value().begin();
+  m_NumEvents = 0;
+  bool retError = false;
+  if (!m_helperTools.empty()) {
+    for (std::vector<ToolHandle<IAthenaSelectorTool> >::iterator iter = m_helperTools.begin(),
+           last = m_helperTools.end(); iter != last; iter++) {
+      if (!(*iter)->postInitialize().isSuccess()) {
+	ATH_MSG_FATAL("Failed to postInitialize() " << (*iter)->name());
+	retError = true;
+      }
+    }
+  }
+  if (retError) {
+    ATH_MSG_FATAL("Failed to postInitialize() helperTools");
+    return(StatusCode::FAILURE);
+  }
+  return(StatusCode::SUCCESS);
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::start() {
+  ATH_MSG_DEBUG("Calling FaserEventSelectorByteStream::start()");
+  // If file based input then fire appropriate incidents
+  if (m_filebased) {
+    if (!m_firstFileFired) {
+      FileIncident firstInputFileIncident(name(), "FirstInputFile", "BSF:" + *m_inputCollectionsIterator);
+      m_incidentSvc->fireIncident(firstInputFileIncident);
+      m_firstFileFired = true;
+    }
+
+    // try to open a file
+    if (this->openNewRun().isFailure()) { 
+      ATH_MSG_FATAL("Unable to open any file in initialize"); 
+      return(StatusCode::FAILURE);
+    }
+    // should be in openNewRun, but see comment there
+    m_beginFileFired = true;
+  }
+
+  // Create the begin and end iterator's for this selector.
+  m_beginIter =  new FaserEventContextByteStream(this);
+  // Increment to get the new event in.
+  m_endIter   =  new FaserEventContextByteStream(0);
+
+  return(StatusCode::SUCCESS);
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::stop() {
+  ATH_MSG_DEBUG("Calling FaserEventSelectorByteStream::stop()");
+  // Handle open files
+  if (m_filebased) {
+    // Close the file
+    if (m_eventSource->ready()) { 
+      m_eventSource->closeBlockIterator(false);
+      FileIncident endInputFileIncident(name(), "EndInputFile", "stop");
+      m_incidentSvc->fireIncident(endInputFileIncident);
+    }
+    // Fire LastInputFile incident
+    FileIncident lastInputFileIncident(name(), "LastInputFile", "stop");
+    m_incidentSvc->fireIncident(lastInputFileIncident);
+  }
+  return(StatusCode::SUCCESS);
+}
+
+//__________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::finalize() {
+  if (!m_counterTool.empty()) {
+    if (!m_counterTool->preFinalize().isSuccess()) {
+      ATH_MSG_WARNING("Failed to preFinalize() CounterTool");
+    }
+  }
+  for (std::vector<ToolHandle<IAthenaSelectorTool> >::iterator iter = m_helperTools.begin(),
+	 last = m_helperTools.end(); iter != last; iter++) {
+    if (!(*iter)->preFinalize().isSuccess()) {
+      ATH_MSG_WARNING("Failed to preFinalize() " << (*iter)->name());
+    }
+  }
+  delete m_beginIter; m_beginIter = 0;
+  delete m_endIter; m_endIter = 0;
+  // Release AthenaSharedMemoryTool
+  if (!m_eventStreamingTool.empty() && !m_eventStreamingTool.release().isSuccess()) {
+    ATH_MSG_WARNING("Cannot release AthenaSharedMemoryTool");
+  }
+  // Release CounterTool
+  if (!m_counterTool.empty()) {
+    if (!m_counterTool.release().isSuccess()) {
+      ATH_MSG_WARNING("Cannot release CounterTool.");
+    }
+  }
+  // Release HelperTools
+  if (!m_helperTools.release().isSuccess()) {
+    ATH_MSG_WARNING("Cannot release " << m_helperTools);
+  }
+  if (m_eventSource) m_eventSource->release();
+  // Finalize the Service base class.
+  return(AthService::finalize());
+}
+
+void FaserEventSelectorByteStream::nextFile() const {
+  ATH_MSG_DEBUG("nextFile() called");
+  FileIncident endInputFileIncident(name(), "EndInputFile", "BSF:" + *m_inputCollectionsIterator);
+  m_incidentSvc->fireIncident(endInputFileIncident);
+  ++m_inputCollectionsIterator;
+  ++m_fileCount;
+}
+
+StatusCode FaserEventSelectorByteStream::openNewRun() const {
+  ATH_MSG_DEBUG("openNewRun() called");
+  // Should be protected upstream, but this is further protection
+  if (!m_filebased) {
+    ATH_MSG_ERROR("cannot open new run for non-filebased inputs");
+    return(StatusCode::FAILURE);
+  }
+  // Check for end of file list
+  if (m_inputCollectionsIterator == m_inputCollectionsProp.value().end()) {
+    ATH_MSG_INFO("End of input file list reached");
+    return(StatusCode::FAILURE);
+  }
+  std::string blockname = *m_inputCollectionsIterator;
+  // try to open a file, if failure go to next FIXME: PVG: silient failure?
+  //long nev = m_eventSource->getBlockIterator(blockname);
+  auto nevguid = m_eventSource->getBlockIterator(blockname);
+  long nev = nevguid.first;
+  if (nev == -1) {
+    ATH_MSG_FATAL("Unable to access file " << *m_inputCollectionsIterator << ", stopping here");
+    throw ByteStreamExceptions::fileAccessError();
+  }
+  // Fire the incident
+  if (!m_beginFileFired) {
+    FileIncident beginInputFileIncident(name(), "BeginInputFile", "BSF:" + *m_inputCollectionsIterator,nevguid.second);
+    m_incidentSvc->fireIncident(beginInputFileIncident);
+    //m_beginFileFired = true;   // Should go here, but can't because IEvtSelector next is const
+  }
+
+  // check if file is empty
+  if (nev == 0) {
+    ATH_MSG_WARNING("no events in file " << blockname << " try next");
+    if (m_eventSource->ready()) m_eventSource->closeBlockIterator(true);
+    this->nextFile();
+    return openNewRun();
+    // check if skipping all events in that file (minus events already skipped)
+  } else if (m_SkipEvents - m_NumEvents > nev) {
+    ATH_MSG_WARNING("skipping more events " << m_SkipEvents-m_NumEvents << "(" << nev <<") than in file " << *m_inputCollectionsIterator << ", try next");
+    m_NumEvents += nev;
+    m_numEvt[m_fileCount] = nev;
+    if (m_eventSource->ready()) m_eventSource->closeBlockIterator(true);
+    this->nextFile();
+    return openNewRun();
+  }
+
+  ATH_MSG_DEBUG("Opened block/file " << blockname); 
+  m_firstEvt[m_fileCount] = m_NumEvents;
+  m_numEvt[m_fileCount] = nev;
+
+  return(StatusCode::SUCCESS);
+}
+
+StatusCode FaserEventSelectorByteStream::createContext(IEvtSelector::Context*& it) const {
+  it = new FaserEventContextByteStream(this);
+  return(StatusCode::SUCCESS);
+}
+
+StatusCode FaserEventSelectorByteStream::next(IEvtSelector::Context& it) const {
+
+  static int n_bad_events = 0;   // cross loop counter of bad events
+  // Check if this is an athenaMP client process
+  if (!m_eventStreamingTool.empty() && m_eventStreamingTool->isClient()) {
+    ATH_MSG_DEBUG("FaserEventSelectorByteStream::next() called for MT");
+    void* source = 0;
+    unsigned int status = 0;
+    if (!m_eventStreamingTool->getLockedEvent(&source, status).isSuccess()) {
+      ATH_MSG_FATAL("Cannot get NextEvent from AthenaSharedMemoryTool");
+      return(StatusCode::FAILURE);
+    }
+    m_eventSource->setEvent(static_cast<char*>(source), status);
+    return(StatusCode::SUCCESS);
+  }
+
+  ATH_MSG_DEBUG("FaserEventSelectorByteStream::next() called for non-MT");
+
+  // Call all selector tool preNext before starting loop
+  for (std::vector<ToolHandle<IAthenaSelectorTool> >::const_iterator iter = m_helperTools.begin(),
+	 last = m_helperTools.end(); iter != last; iter++) {
+    if (!(*iter)->preNext().isSuccess()) {
+      ATH_MSG_WARNING("Failed to preNext() " << (*iter)->name());
+    }
+  }
+  if (!m_counterTool.empty()) {
+    if (!m_counterTool->preNext().isSuccess()) {
+      ATH_MSG_WARNING("Failed to preNext() CounterTool.");
+    }
+  }
+  // Find an event to return
+  for (;;) {
+    const EventFull* pre = 0; 
+    bool badEvent(false);
+    // if event source not ready from init, try next file
+    if (m_filebased && !m_eventSource->ready()) {
+      // next file
+      this->nextFile();
+      if (this->openNewRun().isFailure()) {
+	ATH_MSG_DEBUG("Event source found no more valid files left in input list");
+	m_NumEvents = -1;
+	return StatusCode::FAILURE; 
+      }
+    }
+    try { 
+      ATH_MSG_DEBUG("Call eventSource->nextEvent()");
+      pre = m_eventSource->nextEvent(); 
+    } 
+    catch (const ByteStreamExceptions::readError&) { 
+      ATH_MSG_FATAL("Caught ByteStreamExceptions::readError"); 
+      return StatusCode::FAILURE; 
+    } 
+    catch (const ByteStreamExceptions::badFragment&) { 
+      ATH_MSG_ERROR("badFragment encountered");
+      badEvent = true;
+    }
+    catch (const ByteStreamExceptions::badFragmentData&) { 
+      ATH_MSG_ERROR("badFragment data encountered");
+      badEvent = true;
+    }
+    // Check whether a RawEvent has actually been provided
+    if (pre == 0) {
+      ATH_MSG_INFO("No event built");
+      it = *m_endIter;
+      return(StatusCode::FAILURE);
+    }
+      
+    // increment that an event was found
+    ++m_NumEvents;
+
+    // check bad event flag and handle as configured 
+    if (badEvent) {
+      ++n_bad_events;
+      ATH_MSG_INFO("Bad event encountered, current count at " << n_bad_events);
+      bool toomany = (m_maxBadEvts >= 0 && n_bad_events > m_maxBadEvts);
+      if (toomany) {ATH_MSG_FATAL("too many bad events ");}
+      if (!m_procBadEvent || toomany) {
+	// End of file
+	it = *m_endIter;
+	return(StatusCode::FAILURE);
+      }
+      ATH_MSG_WARNING("Continue with bad event");
+    }
+
+    // Build a DH for use by other components
+    StatusCode rec_sg = m_eventSource->generateDataHeader();
+    if (rec_sg != StatusCode::SUCCESS) {
+      ATH_MSG_ERROR("Fail to record BS DataHeader in StoreGate. Skipping events?! " << rec_sg);
+    }
+
+    // Check whether properties or tools reject this event
+    if ( m_NumEvents > m_SkipEvents && 
+	 (m_skipEventSequence.empty() || m_NumEvents != m_skipEventSequence.front()) ) {
+      StatusCode status(StatusCode::SUCCESS);
+      // Build event info attribute list
+      ATH_MSG_DEBUG("FaserEventSelectorByteStream::next() calling buildEventAttributeList()");
+      if (buildEventAttributeList().isFailure()) ATH_MSG_WARNING("Unable to build event info att list");
+      for (std::vector<ToolHandle<IAthenaSelectorTool> >::const_iterator iter = m_helperTools.begin(),
+	     last = m_helperTools.end(); iter != last; iter++) {
+	StatusCode toolStatus = (*iter)->postNext();
+	if (toolStatus.isRecoverable()) {
+	  ATH_MSG_INFO("Request skipping event from: " << (*iter)->name());
+	  status = StatusCode::RECOVERABLE;
+	} else if (toolStatus.isFailure()) {
+	  ATH_MSG_WARNING("Failed to postNext() " << (*iter)->name());
+	  status = StatusCode::FAILURE;
+	}
+      }
+      if (status.isRecoverable()) {
+	ATH_MSG_INFO("skipping event " << m_NumEvents);
+      } else if (status.isFailure()) {
+	ATH_MSG_WARNING("Failed to postNext() HelperTool.");
+      } else {
+	if (!m_counterTool.empty()) {
+	  if (!m_counterTool->postNext().isSuccess()) {
+	    ATH_MSG_WARNING("Failed to postNext() CounterTool.");
+	  }
+	}
+	break;
+      }
+
+      ATH_MSG_DEBUG("FaserEventSelectorByteStream::next() calling eventSource->validateEvent()");
+      // Validate the event
+      try {
+	m_eventSource->validateEvent();
+      }
+      catch (const ByteStreamExceptions::badFragmentData&) { 
+	ATH_MSG_ERROR("badFragment data encountered");
+
+	++n_bad_events;
+	ATH_MSG_INFO("Bad event encountered, current count at " << n_bad_events);
+
+	bool toomany = (m_maxBadEvts >= 0 && n_bad_events > m_maxBadEvts);
+	if (toomany) {ATH_MSG_FATAL("too many bad events ");}
+	if (!m_procBadEvent || toomany) {
+	  // End of file
+	  it = *m_endIter;
+	  return(StatusCode::FAILURE);
+	}
+	ATH_MSG_WARNING("Continue with bad event");
+      }
+    } else {
+      if (!m_skipEventSequence.empty() && m_NumEvents == m_skipEventSequence.front()) {
+	m_skipEventSequence.erase(m_skipEventSequence.begin());
+      }
+      ATH_MSG_DEBUG("Skipping event " << m_NumEvents - 1);
+    }
+  } // for loop
+  ATH_MSG_DEBUG("FaserEventSelectorByteStream::next() done");
+  return(StatusCode::SUCCESS);
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::next(IEvtSelector::Context& ctxt, int jump) const {
+  if (jump > 0) {
+    if ( m_NumEvents+jump != m_SkipEvents) {
+      // Save initial event count
+      unsigned int cntr = m_NumEvents;
+      // In case NumEvents increments multiple times in a single next call
+      while (m_NumEvents+1 <= cntr + jump) {
+	if (!next(ctxt).isSuccess()) {
+	  return(StatusCode::FAILURE);
+	}
+      }
+    }
+    else ATH_MSG_DEBUG("Jump covered by skip event " << m_SkipEvents);
+    return(StatusCode::SUCCESS);
+  }
+  else { 
+    ATH_MSG_WARNING("Called jump next with non-multiple jump");
+  }
+  return(StatusCode::SUCCESS);
+}
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::previous(IEvtSelector::Context& /*ctxt*/) const {
+  ATH_MSG_DEBUG(" ... previous");
+  const EventFull* pre = 0; 
+  bool badEvent(false);
+  // if event source not ready from init, try next file
+  if (m_eventSource->ready()) {
+    try { 
+      pre = m_eventSource->previousEvent(); 
+    } 
+    catch (const ByteStreamExceptions::readError&) { 
+      ATH_MSG_FATAL("Caught ByteStreamExceptions::readError"); 
+      return StatusCode::FAILURE; 
+    } 
+    catch (const ByteStreamExceptions::badFragment&) { 
+      ATH_MSG_ERROR("badFragment encountered");
+      badEvent = true;
+    }
+    catch (const ByteStreamExceptions::badFragmentData&) { 
+      ATH_MSG_ERROR("badFragment data encountered");
+      badEvent = true;
+    }
+    // Check whether a RawEvent has actually been provided
+    if (pre == 0) {
+      ATH_MSG_ERROR("No event built");
+      //it = *m_endIter;
+      return(StatusCode::FAILURE);
+    }
+  }
+  else {
+    ATH_MSG_FATAL("Attempt to read previous data on invalid reader");
+    return(StatusCode::FAILURE);
+  }
+  // increment that an event was found
+  //++m_NumEvents;
+ 
+  // check bad event flag and handle as configured 
+  if (badEvent) {
+    ATH_MSG_ERROR("Called previous for bad event");
+    if (!m_procBadEvent) {
+      // End of file
+      //it = *m_endIter;
+      return(StatusCode::FAILURE);
+    }
+    ATH_MSG_WARNING("Continue with bad event");
+  }
+
+  // Build a DH for use by other components
+  StatusCode rec_sg = m_eventSource->generateDataHeader();
+  if (rec_sg != StatusCode::SUCCESS) {
+    ATH_MSG_ERROR("Fail to record BS DataHeader in StoreGate. Skipping events?! " << rec_sg);
+  }
+
+  return StatusCode::SUCCESS;
+}
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::previous(IEvtSelector::Context& ctxt, int jump) const {
+  if (jump > 0) {
+    for (int i = 0; i < jump; i++) {
+      if (!previous(ctxt).isSuccess()) {
+	return(StatusCode::FAILURE);
+      }
+    }
+    return(StatusCode::SUCCESS);
+  }
+  return(StatusCode::FAILURE);
+}
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::last(IEvtSelector::Context& it)const {
+  if (it.identifier() == m_endIter->identifier()) {
+    ATH_MSG_DEBUG("last(): Last event in InputStream.");
+    return(StatusCode::SUCCESS);
+  }
+  return(StatusCode::FAILURE);
+}
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::rewind(IEvtSelector::Context& /*it*/) const {
+  ATH_MSG_ERROR("rewind() not implemented");
+  return(StatusCode::FAILURE);
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::resetCriteria(const std::string& /*criteria*/, IEvtSelector::Context& /*ctxt*/) const {
+  return(StatusCode::SUCCESS);
+}
+
+//__________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::seek(Context& it, int evtNum) const {
+  // Check that input is seekable
+  if (!m_filebased) {
+    ATH_MSG_ERROR("Input not seekable, choose different input svc");
+    return StatusCode::FAILURE;
+  }
+  // find the file index with that event
+  long fileNum = findEvent(evtNum);
+  if (fileNum == -1 && evtNum >= m_firstEvt[m_fileCount] && evtNum < m_NumEvents) {
+    fileNum = m_fileCount;
+  }
+  // if unable to locate file, exit
+  if (fileNum == -1) {
+    ATH_MSG_INFO("seek: Reached end of Input.");
+    return(StatusCode::RECOVERABLE);
+  }
+  // check if it is the current file
+  if (fileNum != m_fileCount) { // event in different file
+    // Close input file if open
+    if (m_eventSource->ready()) m_eventSource->closeBlockIterator(true);
+    ATH_MSG_DEBUG("Seek to item: \"" << m_inputCollectionsProp.value()[fileNum] << "\" from the explicit file list.");
+    std::string fileName = m_inputCollectionsProp.value()[fileNum];
+    m_fileCount = fileNum;
+    // Open the correct file
+    auto nevguid = m_eventSource->getBlockIterator(fileName);
+    long nev = nevguid.first;
+    if (nev == -1) {
+      ATH_MSG_FATAL("Unable to open file with seeked event " << evtNum << " file " << fileName);
+      return StatusCode::FAILURE;
+    }
+    int delta = evtNum - m_firstEvt[m_fileCount];
+    if (delta > 0) {
+      if (next(*m_beginIter,delta).isFailure()) return StatusCode::FAILURE;
+    }
+    else return this->seek(it, evtNum);
+  } 
+  else { // event in current file
+    int delta = (evtNum - m_firstEvt[m_fileCount] + 1) - m_eventSource->positionInBlock();
+    ATH_MSG_DEBUG("Seeking event " << evtNum << " in current file wiht delta " << delta);
+    if ( delta == 0 ) { // current event
+      // nothing to do
+    } 
+    else if ( delta > 0 ) { // forward
+      if ( this->next(*m_beginIter, delta).isFailure() ) return StatusCode::FAILURE;
+    } 
+    else if ( delta < 0 ) { // backward
+      if ( this->previous(*m_beginIter, -1*delta).isFailure() ) return(StatusCode::FAILURE);
+    } 
+  }
+  return(StatusCode::SUCCESS);
+}
+
+StatusCode FaserEventSelectorByteStream::buildEventAttributeList() const
+{
+  //ServiceHandle<StoreGateSvc> m_evtStore("StoreGateSvc/StoreGateSvc",this->name());
+  //StatusCode sc = m_evtStore.retrieve();
+  //if (sc.isFailure()) return StatusCode::FAILURE;
+  std::string listName("EventInfoAtts");
+  //bool found  = m_evtStore->contains<AthenaAttributeList>(listName);
+  //if (found) {
+  if (m_evtStore->contains<AthenaAttributeList>(listName)) {
+    const AthenaAttributeList* oldAttrList = nullptr;
+    if (!m_evtStore->retrieve(oldAttrList, listName).isSuccess()) {
+      ATH_MSG_ERROR("Cannot retrieve old AttributeList from StoreGate.");
+      return(StatusCode::FAILURE);
+    }
+    if (!m_evtStore->removeDataAndProxy(oldAttrList).isSuccess()) {
+      ATH_MSG_ERROR("Cannot remove old AttributeList from StoreGate.");
+      return(StatusCode::FAILURE);
+    }
+    //ATH_MSG_ERROR("Event store not cleared properly after previous event");
+    //return StatusCode::FAILURE;
+  }
+  // build spec
+  // fill att list spec
+  coral::AttributeListSpecification* spec = new coral::AttributeListSpecification();
+  AthenaAttributeList* attlist = new AthenaAttributeList(*spec);
+  attlist->extend("RunNumber"  ,"long");
+  attlist->extend("EventNumber","long");
+  attlist->extend("Lumiblock"  ,"int");
+  attlist->extend("BunchID"    ,"int");
+  attlist->extend("CrossingTimeSec", "unsigned int");
+  attlist->extend("CrossingTimeNSec", "unsigned int");
+
+  // fill attribute list
+  const EventFull* event = m_eventSource->currentEvent();
+
+  (*attlist)["RunNumber"].data<long>() = event->run_number();
+  (*attlist)["EventNumber"].data<long>() = event->event_counter();
+  (*attlist)["Lumiblock"].data<int>() = 0;
+  (*attlist)["BunchID"].data<int>() = event->bc_id();
+
+  // Timestamp is in microseconds
+  unsigned int bc_time_sec = event->timestamp() / 1E6;
+  unsigned int bc_time_ns  = 1000 * (event->timestamp() - 1E6*bc_time_sec);
+  (*attlist)["CrossingTimeSec"].data<unsigned int>() = bc_time_sec;
+  (*attlist)["CrossingTimeNSec"].data<unsigned int>() = bc_time_ns;
+
+  // Not used
+  attlist->extend("TriggerStatus","unsigned int");
+  (*attlist)["TriggerStatus"].data<unsigned int>() = event->status();
+
+  // Not used
+  attlist->extend("ExtendedL1ID","unsigned int");
+  attlist->extend("L1TriggerType","unsigned int");
+  (*attlist)["ExtendedL1ID"].data<unsigned int>() = 0;
+  (*attlist)["L1TriggerType"].data<unsigned int>() = event->trigger_bits();
+
+  // Add our event tag
+  attlist->extend("EventTag", "unsigned int");
+  (*attlist)["EventTag"].data<unsigned int>() = event->event_tag();
+
+  attlist->extend("Timestamp", "unsigned long");
+  (*attlist)["Timestamp"].data<unsigned long>() = event->timestamp();
+
+  // And our us time
+
+  // Grab stream tags
+  /* Not sure what do do with this
+  event->stream_tag(buffer);
+  std::vector<eformat::helper::StreamTag> onl_streamTags;
+  eformat::helper::decode(event->nstream_tag(), buffer, onl_streamTags);
+  for (std::vector<eformat::helper::StreamTag>::const_iterator itS = onl_streamTags.begin(),
+	 itSE = onl_streamTags.end(); itS != itSE; ++itS) {
+    attlist->extend(itS->name,"string");
+    (*attlist)[itS->name].data<std::string>() = itS->type;
+  }
+  */
+
+  // Pur our own event_tag
+
+  // put result in event store
+  if (m_evtStore->record(attlist,"EventInfoAtts").isFailure()) return StatusCode::FAILURE;
+   
+  return(StatusCode::SUCCESS);
+}
+
+//__________________________________________________________________________
+int FaserEventSelectorByteStream::findEvent(int evtNum) const {
+  // Loop over file event counts
+  //ATH_MSG_INFO("try to find evnum = " << evtNum << " in " << m_numEvt.size() << " files");
+  for (size_t i = 0; i < m_inputCollectionsProp.value().size(); i++) {
+    if (m_inputCollectionsProp.value().size() != m_numEvt.size()) {
+      ATH_MSG_ERROR("vector size incompatibility");
+      break;
+    }
+    // if file not opened yet, check it
+    if (m_numEvt[i] == -1) {
+      std::string fileName = m_inputCollectionsProp.value()[i];
+      auto nevguid = m_eventSource->getBlockIterator(fileName);
+      long nev = nevguid.first;
+      // if failure on file open, exit
+      if (nev==-1) {
+	break;
+      }
+      // set initial event counter for that file
+      if (i > 0) {
+	m_firstEvt[i] = m_firstEvt[i - 1] + m_numEvt[i - 1];
+      } else {
+	m_firstEvt[i] = 0;
+      }
+      // log number of events in that file
+      m_numEvt[i] = nev;
+    }
+    // if sought event is in this file, then return the index of that file
+    if (evtNum >= m_firstEvt[i] && evtNum < m_firstEvt[i] + m_numEvt[i]) {
+      ATH_MSG_INFO("found " << evtNum << " in file " << i);
+      return(i);
+    }
+  }
+  ATH_MSG_INFO("did not find ev " << evtNum);
+  // return file not found marker
+  return(-1);
+}
+
+//__________________________________________________________________________
+int FaserEventSelectorByteStream::curEvent (const Context& /*it*/) const {
+  // event counter in IEvtSelectorSeek interface
+  return int(m_NumEvents);
+}
+
+//__________________________________________________________________________
+int FaserEventSelectorByteStream::size (Context& /*it*/) const {
+  return -1;
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::makeServer(int /*num*/) {
+  if (m_eventStreamingTool.empty()) {
+    return(StatusCode::FAILURE);
+  }
+  return(m_eventStreamingTool->makeServer(1));
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::makeClient(int /*num*/) {
+  if (m_eventStreamingTool.empty()) {
+    return(StatusCode::FAILURE);
+  }
+  return(m_eventStreamingTool->makeClient(0));
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::share(int evtNum) {
+  if (m_eventStreamingTool.empty()) {
+    return(StatusCode::FAILURE);
+  }
+  if (m_eventStreamingTool->isClient()) {
+    StatusCode sc = m_eventStreamingTool->lockEvent(evtNum);
+    while (sc.isRecoverable()) {
+      usleep(1000);
+      sc = m_eventStreamingTool->lockEvent(evtNum);
+    }
+    return(sc);
+  }
+  return(StatusCode::FAILURE);
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::readEvent(int maxevt) {
+  
+  if (m_eventStreamingTool.empty()) {
+    return(StatusCode::FAILURE);
+  }
+  ATH_MSG_VERBOSE("Called read Event " << maxevt);
+  for (int i = 0; i < maxevt || maxevt == -1; ++i) {
+    //const RawEvent* pre = m_eventSource->nextEvent();
+    const EventFull* pre = 0;
+    if (this->next(*m_beginIter).isSuccess()) {
+      pre = m_eventSource->currentEvent();
+    } else {
+      if (m_NumEvents == -1) {
+	ATH_MSG_VERBOSE("Called read Event and read last event from input: " << i);
+	break;
+      }
+      ATH_MSG_ERROR("Unable to retrieve next event for " << i << "/" << maxevt);
+      return(StatusCode::FAILURE);
+    }
+    if (pre == 0) {
+      // End of file, wait for last event to be taken
+      StatusCode sc = m_eventStreamingTool->putEvent(0, 0, 0, 0);
+      while (sc.isRecoverable()) {
+	usleep(1000);
+	sc = m_eventStreamingTool->putEvent(0, 0, 0, 0);
+      }
+      if (!sc.isSuccess()) {
+	ATH_MSG_ERROR("Cannot put last Event marker to AthenaSharedMemoryTool");
+      }
+      return(StatusCode::FAILURE);
+    }
+    if (m_eventStreamingTool->isServer()) {
+
+      ATH_MSG_WARNING("Called FaserEventSelectorByteStream::readEvent() in the eventStreamingTool->isServer() section, but not implemented!");
+
+      /*
+      StatusCode sc = m_eventStreamingTool->putEvent(m_NumEvents - 1, pre->start(), pre->fragment_size_word() * sizeof(uint32_t), m_eventSource->currentEventStatus());
+      while (sc.isRecoverable()) {
+	usleep(1000);
+	sc = m_eventStreamingTool->putEvent(m_NumEvents - 1, pre->start(), pre->fragment_size_word() * sizeof(uint32_t), m_eventSource->currentEventStatus());
+      }
+      if (!sc.isSuccess()) {
+	ATH_MSG_ERROR("Cannot put Event " << m_NumEvents - 1 << " to AthenaSharedMemoryTool");
+	return(StatusCode::FAILURE);
+      }
+      */
+    }
+  }
+  return(StatusCode::SUCCESS);
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::createAddress(const IEvtSelector::Context& /*it*/,
+						  IOpaqueAddress*& iop) const {
+  SG::DataProxy* proxy = m_evtStore->proxy(ClassID_traits<DataHeader>::ID(),"ByteStreamDataHeader");
+  if (proxy !=0) {
+    iop = proxy->address();
+    return(StatusCode::SUCCESS);
+  } else {
+    iop = 0;
+    return(StatusCode::FAILURE);
+  }
+}
+
+//________________________________________________________________________________
+StatusCode
+FaserEventSelectorByteStream::releaseContext(IEvtSelector::Context*& /*it*/) const {
+  return(StatusCode::SUCCESS);
+}
+
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::queryInterface(const InterfaceID& riid, void** ppvInterface) {
+  if (riid == IEvtSelector::interfaceID()) {
+    *ppvInterface = dynamic_cast<IEvtSelector*>(this);
+  } else if (riid == IIoComponent::interfaceID()) {
+    *ppvInterface = dynamic_cast<IIoComponent*>(this);
+  } else if (riid == IProperty::interfaceID()) {
+    *ppvInterface = dynamic_cast<IProperty*>(this);
+  } else if (riid == IEvtSelectorSeek::interfaceID()) {
+    *ppvInterface = dynamic_cast<IEvtSelectorSeek*>(this);
+  } else if (riid == IEventShare::interfaceID()) {
+    *ppvInterface = dynamic_cast<IEventShare*>(this);
+  } else {
+    return(Service::queryInterface(riid, ppvInterface));
+  }
+  addRef();
+  return(StatusCode::SUCCESS);
+}
+//________________________________________________________________________________
+StatusCode FaserEventSelectorByteStream::io_reinit() {
+  ATH_MSG_INFO("I/O reinitialization...");
+  ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
+  if (!iomgr.retrieve().isSuccess()) {
+    ATH_MSG_FATAL("Could not retrieve IoComponentMgr !");
+    return(StatusCode::FAILURE);
+  }
+  if (!iomgr->io_hasitem(this)) {
+    ATH_MSG_FATAL("IoComponentMgr does not know about myself !");
+    return(StatusCode::FAILURE);
+  }
+  if (m_inputCollectionsFromIS) {
+    /*   MN: don't copy the FullFileName again - rely on FileSchedulingTool
+           to modify the EventSelector Input property directly
+      IProperty* propertyServer = dynamic_cast<IProperty*>(m_eventSource);
+      std::vector<std::string> vect;
+      StringArrayProperty inputFileList("FullFileName", vect);
+      StatusCode sc = propertyServer->getProperty(&inputFileList);
+      if(sc.isFailure()) {
+         ATH_MSG_FATAL("Unable to retrieve ByteStreamInputSvc");
+         return(StatusCode::FAILURE);
+      }
+      m_inputCollectionsProp = inputFileList;
+    */
+  }
+  std::vector<std::string> inputCollections = m_inputCollectionsProp.value();
+  for (std::size_t i = 0, imax = inputCollections.size(); i != imax; ++i) {
+    ATH_MSG_INFO("I/O reinitialization, file = "  << inputCollections[i]);
+    std::string &fname = inputCollections[i];
+    if (!iomgr->io_contains(this, fname)) {
+      ATH_MSG_ERROR("IoComponentMgr does not know about [" << fname << "] !");
+      return(StatusCode::FAILURE);
+    }
+    if (!iomgr->io_retrieve(this, fname).isSuccess()) {
+      ATH_MSG_FATAL("Could not retrieve new value for [" << fname << "] !");
+      return(StatusCode::FAILURE);
+    }
+  }
+  // all good... copy over.
+  m_beginFileFired = false;
+  m_inputCollectionsProp = inputCollections;
+   
+  return(this->reinit());
+}
+
+
diff --git a/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.h b/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.h
new file mode 100644
index 00000000..ee7f38c5
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/FaserEventSelectorByteStream.h
@@ -0,0 +1,166 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASEREVENTSELECTORBYTESTREAM_H
+#define FASEREVENTSELECTORBYTESTREAM_H
+
+/**  @class  FaserEventSelectorByteStream
+     @brief  concrete implementation of IEvtSelector for ByteStream
+
+     An event selector service that steps through Event
+     Filter packed raw events by use of an event source
+     object and an iterator object called EventIteratorByteStream.
+     The type of event source is specified at run time. It
+     can be a single file, a set of files or the network.
+//---------------------------------------------------------------------
+*/
+
+#include "GaudiKernel/IEvtSelector.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/IIoComponent.h"
+
+#include "AthenaKernel/IAthenaSelectorTool.h"
+#include "AthenaKernel/IEvtSelectorSeek.h"
+#include "AthenaKernel/IEventShare.h"
+#include "AthenaBaseComps/AthService.h"
+
+// #include "ByteStreamData/RawEvent.h"
+
+// Forward declarations.
+class ISvcLocator;
+class IAthenaIPCTool;
+class FaserEventContextByteStream;
+class FaserByteStreamInputSvc;
+
+// Class EventSelectorByteStream.
+class FaserEventSelectorByteStream : public ::AthService,
+  virtual public IEvtSelector,
+  virtual public IEvtSelectorSeek,
+  virtual public IEventShare,
+  virtual public IIoComponent {
+ public:
+  /// Standard Constructor.
+  FaserEventSelectorByteStream(const std::string& name, ISvcLocator* svcloc);
+  /// Standard Destructor.
+  virtual ~FaserEventSelectorByteStream();
+
+  /// Implementation of Service base class methods.
+  virtual StatusCode initialize() override;
+  virtual StatusCode start() override;
+  virtual StatusCode stop() override;
+  virtual StatusCode finalize() override;
+
+  // Implementation of IInterface methods.
+  virtual StatusCode queryInterface(const InterfaceID& riid, void** ppvInterface) override;
+
+  /// Implementation of the IEvtSelector interface methods.
+  virtual StatusCode createContext(Context*& it) const override;
+  /// Implementation of the IEvtSelector interface methods.
+  virtual StatusCode next(Context& it) const override;
+  /// Implementation of the IEvtSelector interface methods.
+  virtual StatusCode next(Context& it, int jump) const override;
+  /// Implementation of the IEvtSelector interface methods.
+  virtual StatusCode previous(Context& it) const override;
+  /// Implementation of the IEvtSelector interface methods.
+  virtual StatusCode previous(Context& it, int jump) const override;
+
+  /// Implementation of the IEvtSelector interface methods.
+  virtual StatusCode last(Context& it) const override;
+  /// Implementation of the IEvtSelector interface methods.
+  virtual StatusCode rewind(Context& it) const override;
+
+  virtual StatusCode createAddress(const Context& it,IOpaqueAddress*& iop) const override;
+  virtual StatusCode releaseContext(Context*& it) const override;
+  virtual StatusCode resetCriteria(const std::string& criteria, Context& context) const override;
+
+  /// Seek to a given event number.
+  /// @param evtnum [IN]  The event number to which to seek.
+  virtual StatusCode seek (Context& it, int evtnum) const override;
+
+  /// Return the current event number.
+  virtual int curEvent (const Context& it) const override;
+
+  /// Always returns -1.
+  virtual int size (Context& it) const override;
+
+  /// Make this a server.
+  virtual StatusCode makeServer(int num) override;
+
+  /// Make this a client.
+  virtual StatusCode makeClient(int num) override;
+
+  /// Request to share a given event number.
+  /// @param evtnum [IN]  The event number to share.
+  virtual StatusCode share(int evtnum) override;
+
+  /// Read the next maxevt events.
+  /// @param evtnum [IN]  The number of events to read.
+  virtual StatusCode readEvent(int maxevt) override;
+
+  /// Callback method to reinitialize the internal state of the component for I/O purposes (e.g. upon @c fork(2))
+  virtual StatusCode io_reinit() override;
+
+ private: // internal member functions
+  /// reinitialize the service when a @c fork() occured/was-issued
+  StatusCode reinit();
+  StatusCode openNewRun() const;
+  void nextFile() const; 
+  int findEvent(int evtNum) const; //>! Search for event number evtNum.
+  StatusCode buildEventAttributeList() const;
+
+ private:
+  // property
+  std::string      m_eventSourceName;
+  Gaudi::Property<int>  m_maxBadEvts;    //!< number of bad events allowed before quitting.
+  mutable int              m_fileCount;     //!< number of files to process.
+
+  mutable std::vector<int>     m_numEvt;
+  mutable std::vector<int>     m_firstEvt;
+
+  FaserEventContextByteStream*  m_beginIter;
+  FaserEventContextByteStream*  m_endIter;
+  FaserByteStreamInputSvc*      m_eventSource;
+  Gaudi::Property<std::vector<std::string>> m_inputCollectionsProp;
+  mutable std::vector<std::string>::const_iterator m_inputCollectionsIterator;
+  void inputCollectionsHandler(Gaudi::Details::PropertyBase&);
+  ServiceHandle<IIncidentSvc> m_incidentSvc;
+  ServiceHandle<StoreGateSvc> m_evtStore;
+
+  long m_SkipEvents; // Number of events to skip at the beginning
+  Gaudi::Property<std::vector<long>> m_skipEventSequenceProp;
+  mutable std::vector<long> m_skipEventSequence;
+
+  bool m_firstFileFired;
+  bool m_beginFileFired;
+  bool m_inputCollectionsFromIS;
+  mutable long m_NumEvents; // Number of Events read so far.
+
+  mutable ToolHandle<IAthenaIPCTool> m_eventStreamingTool;
+
+  Gaudi::Property<bool>    m_procBadEvent;  //!< process bad events, which fail check_tree().
+
+  /// HelperTools, vector of names of AlgTools that are executed by the EventSelector
+  ToolHandleArray<IAthenaSelectorTool> m_helperTools;
+  ToolHandle<IAthenaSelectorTool> m_counterTool;
+         
+  /**@name Athena standard EventSelector properties */
+
+  /// Flags to indicate override of run/event/time
+  ///  These are almost always false.
+  Gaudi::Property<bool> m_overrideRunNumber;
+  Gaudi::Property<bool> m_overrideEventNumber;
+  Gaudi::Property<bool> m_overrideTimeStamp;
+  Gaudi::Property<bool> m_filebased;
+
+  Gaudi::CheckedProperty<int> m_runNo;
+  Gaudi::CheckedProperty<int> m_firstEventNo;
+  Gaudi::CheckedProperty<int> m_eventsPerRun;
+  Gaudi::CheckedProperty<int> m_firstLBNo;
+  Gaudi::CheckedProperty<int> m_eventsPerLB;
+  Gaudi::CheckedProperty<int> m_initTimeStamp;
+  Gaudi::Property<int> m_timeStampInterval;
+  };
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvc/src/components/FaserByteStreamCnvSvc_entries.cxx b/Event/FaserByteStreamCnvSvc/src/components/FaserByteStreamCnvSvc_entries.cxx
new file mode 100644
index 00000000..72174e55
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvc/src/components/FaserByteStreamCnvSvc_entries.cxx
@@ -0,0 +1,28 @@
+#include "FaserByteStreamCnvSvc/FaserByteStreamCnvSvc.h"
+#include "FaserByteStreamCnvSvc/FaserByteStreamInputSvc.h"
+#include "../FaserEventSelectorByteStream.h"
+#include "../EventInfoByteStreamxAODCnv.h"
+#include "../EventInfoByteStreamAuxCnv.h"
+/*
+#include "../ByteStreamMergeOutputSvc.h"
+#include "../ByteStreamRDP_OutputSvc.h"
+#include "../ByteStreamEventStorageInputSvc.h"
+#include "../ByteStreamEventStorageOutputSvc.h"
+#include "../ByteStreamOutputStreamCopyTool.h"
+#include "../ByteStreamMetadataTool.h"
+*/
+
+DECLARE_COMPONENT( FaserByteStreamCnvSvc )
+DECLARE_COMPONENT( FaserByteStreamInputSvc )
+DECLARE_COMPONENT( FaserEventSelectorByteStream )
+DECLARE_CONVERTER( EventInfoByteStreamxAODCnv )
+DECLARE_CONVERTER( EventInfoByteStreamAuxCnv )
+/*
+DECLARE_COMPONENT( ByteStreamMergeOutputSvc )
+DECLARE_COMPONENT( ByteStreamRDP_OutputSvc )
+DECLARE_COMPONENT( ByteStreamEventStorageInputSvc )
+DECLARE_COMPONENT( ByteStreamEventStorageOutputSvc )
+
+DECLARE_COMPONENT( ByteStreamOutputStreamCopyTool )
+DECLARE_COMPONENT( ByteStreamMetadataTool )
+*/
diff --git a/Event/FaserByteStreamCnvSvcBase/CMakeLists.txt b/Event/FaserByteStreamCnvSvcBase/CMakeLists.txt
new file mode 100644
index 00000000..ec01ad23
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/CMakeLists.txt
@@ -0,0 +1,33 @@
+################################################################################
+# Package: FaserByteStreamCnvSvcBase
+################################################################################
+
+# Declare the package name:
+atlas_subdir( FaserByteStreamCnvSvcBase )
+
+# External dependencies:
+# find_package( tdaq-common COMPONENTS eformat eformat_write )
+
+# Component(s) in the package:
+atlas_add_library( FaserByteStreamCnvSvcBaseLib
+                   src/*.cxx
+                   PUBLIC_HEADERS FaserByteStreamCnvSvcBase
+                   # INCLUDE_DIRS  ${TDAQ-COMMON_INCLUDE_DIRS}
+                   LINK_LIBRARIES AthenaBaseComps AthenaKernel GaudiKernel StoreGateLib SGtests EventFormats
+                   PRIVATE_LINK_LIBRARIES SGTools )
+
+atlas_add_component( FaserByteStreamCnvSvcBase
+                     src/components/*.cxx
+                     # INCLUDE_DIRS ${TDAQ-COMMON_INCLUDE_DIRS}
+                     LINK_LIBRARIES FaserByteStreamCnvSvcBaseLib )
+
+
+#atlas_add_test( ROBDataProviderSvcMT	
+#		 SCRIPT test/test_ROBDataProviderSvcMT.sh	 
+#		 PROPERTIES TIMEOUT 1200 )
+#
+
+# Install files from the package:
+#atlas_install_joboptions( share/*.py )
+atlas_install_python_modules( python/*.py )
+
diff --git a/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h
new file mode 100644
index 00000000..c2f608bf
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h
@@ -0,0 +1,65 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERBYTESTREAMCNVSVCBASE_FASERBYTESTREAMADDRESS_H
+#define FASERBYTESTREAMCNVSVCBASE_FASERBYTESTREAMADDRESS_H
+
+// Framework include files
+#include "GaudiKernel/GenericAddress.h"
+#include "GaudiKernel/EventContext.h"
+
+#include <stdint.h>
+#include <vector>
+
+/**
+ *  @class  ByteStreamAddress
+ *  @brief  IOpaqueAddress for ByteStreamCnvSvc, with ROB ids
+ *
+ *  Package     : ByteStreamCnvSvcBase
+ *
+ *  description : Definition of RawEvent address class
+ *                This class holds a vector of ROBIDs
+ *  @author     : H. Ma
+ *  Revision    : July 10, 2002, Use new eformat package
+ *  Revision    : Sept 19, 2002, Store ROB IDs, to be used with ROBDataProviderSvc
+ */
+
+class FaserByteStreamAddress : public GenericAddress {
+ public:
+  // @brief Constructor
+  FaserByteStreamAddress(const CLID& clid, const std::string& fname, const std::string& cname, int p1 = 0, int p2 = 0);
+  // @brief Constructor
+  FaserByteStreamAddress(const CLID& clid);
+
+  // @brief Destructor
+  virtual ~FaserByteStreamAddress() {}; //doesn't own event
+
+  // @brief Add a rob id
+  void add(uint32_t robid);
+
+  // @brief Add event id
+  void setEventContext(const EventContext& eid);
+
+  // @brief access the ROB fragment IDs
+  const std::vector<uint32_t>& getRobIDs() const;
+
+  // @brief get event id
+  const EventContext& getEventContext() const;
+
+  // @brief storage type to be used by all bytestream converters
+  static constexpr long storageType() { return 0x43; }
+
+ private:
+  // @brief it holds a vector of rob ids
+  std::vector<uint32_t> m_robIDs;
+  EventContext m_eid;
+};
+
+inline void FaserByteStreamAddress::setEventContext(const EventContext& eid) 
+{ m_eid = eid; }
+
+inline const EventContext& FaserByteStreamAddress::getEventContext() const
+{ return m_eid; }
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddressProviderSvc.h b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddressProviderSvc.h
new file mode 100644
index 00000000..7e62ffb8
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamAddressProviderSvc.h
@@ -0,0 +1,58 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERBYTESTREAMCNVSVCBASE_BYTESTREAMADDRESSPROVIDERSVC_H
+#define FASERBYTESTREAMCNVSVCBASE_BYTESTREAMADDRESSPROVIDERSVC_H
+
+#include "AthenaKernel/IAddressProvider.h"
+#include "AthenaBaseComps/AthService.h"
+#include "GaudiKernel/ServiceHandle.h"
+
+#include <vector>
+#include <string>
+#include <map>
+#include <set>
+
+class IClassIDSvc;
+
+template <class TYPE> class SvcFactory;
+
+/** @class FaserByteStreamAddressProviderSvc
+    @brief An concrete IAddressProvider
+*/
+class FaserByteStreamAddressProviderSvc : public ::AthService, public virtual IAddressProvider {
+   /// Allow the factory class access to the constructor
+   friend class SvcFactory<FaserByteStreamAddressProviderSvc>;
+
+public:
+   FaserByteStreamAddressProviderSvc(const std::string& name, ISvcLocator* pSvcLocator);
+   virtual ~FaserByteStreamAddressProviderSvc();
+
+   // Service initialize
+   virtual StatusCode initialize();
+   virtual StatusCode finalize();
+
+   // IAddressProvider interface.
+   // preload the address
+   virtual StatusCode preLoadAddresses(StoreID::type id, tadList& tlist);
+
+   /// update an existing transient Address
+   virtual StatusCode updateAddress(StoreID::type id,
+                                    SG::TransientAddress* tad,
+                                    const EventContext& ctx);
+
+private:
+   // type and name of the objects to create the address for.
+   Gaudi::Property<std::vector<std::string> > m_typeNames{this,"TypeNames",{},\
+       "Type and Name of objects to create the address for","OrderedSet<std::string>"};
+
+
+   ServiceHandle<IClassIDSvc> m_clidSvc;
+
+   std::map<unsigned int, std::set<std::string> > m_clidKey;
+
+   int m_storeID;
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase.h b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase.h
new file mode 100644
index 00000000..6496bf48
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase.h
@@ -0,0 +1,52 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERBYTESTREAMCNVSVCBASE_BYTESTREAMCNVSVCBASE_H
+#define FASERBYTESTREAMCNVSVCBASE_BYTESTREAMCNVSVCBASE_H
+
+#include "GaudiKernel/IIncidentListener.h"
+#include "AthenaBaseComps/AthCnvSvc.h"
+#include "FaserByteStreamCnvSvcBase/IFaserByteStreamEventAccess.h"
+
+/**
+  @class FaserByteStreamCnvSvcBase
+  @brief base class for ByteStream conversion service.
+
+  description
+         This class is used as a conversion service in online HLT
+	 and it is the base class for offline bytestream conversion service.
+*/
+class FaserByteStreamCnvSvcBase : public ::AthCnvSvc,
+		public virtual IIncidentListener,
+		public virtual IFaserByteStreamEventAccess {
+
+public:
+   /// Standard Service Constructor
+   FaserByteStreamCnvSvcBase(const std::string& name, ISvcLocator* pSvcLocator);
+   /// Destructor
+
+   virtual ~FaserByteStreamCnvSvcBase();
+   /// Required of all Gaudi Services
+   virtual StatusCode initialize() override;
+
+   /// Required of all Gaudi services:  see Gaudi documentation for details
+   virtual StatusCode queryInterface(const InterfaceID& riid, void** ppvInterface) override;
+
+   /// Checks whether an IOpaqueAddress is a GenericAddress
+   virtual StatusCode updateServiceState(IOpaqueAddress* pAddress) override;
+
+   /// Implementation of IByteStreamEventAccess: Get RawEvent
+   // virtual RawEventWrite* getRawEvent() override { return m_rawEventWrite; }
+
+   /// Implementation of IIncidentListener: Handle for EndEvent incidence
+   virtual void handle(const Incident&) override;
+
+protected: // data
+   // RawEventWrite* m_rawEventWrite;
+
+   std::vector<std::string> m_initCnvs;
+   std::vector<std::string> m_ROD2ROBmap;
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserROBDataProviderSvc.h b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserROBDataProviderSvc.h
new file mode 100644
index 00000000..2bf10dc2
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/FaserROBDataProviderSvc.h
@@ -0,0 +1,91 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERBYTESTREAMCNVSVCBASE_ROBDATAPROVIDERSVC_H
+#define FASERBYTESTREAMCNVSVCBASE_ROBDATAPROVIDERSVC_H
+
+/** ===============================================================
+ * @class    ROBDataProviderSvc.h
+ * @brief  ROBDataProvider class for accessing ROBData
+ *
+ *    Requirements: define a ROBData class in the scope
+ *                  provide a method
+ *       void getROBData(const vector<uint>& ids, vector<ROBData*>& v)
+ *    Implementation: Use an interal map to store all ROBs
+ *                    We can not assume any ROB/ROS relationship, no easy
+ *                    way to search.
+ *                    This implementation is used in offline
+ *
+ *    Created:      Sept 19, 2002
+ *         By:      Hong Ma
+ *    Modified:     Aug. 18  2003 (common class for Online/Offline)
+ *         By:      Werner Wiedenmann
+ *    Modified:     Apr  21  2005 (remove dependency on data flow repository)
+ *         By:      Werner Wiedenmann
+ */
+
+#include "FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h"
+#include "AthenaBaseComps/AthService.h"
+#include "AthenaKernel/SlotSpecificObj.h"
+
+#include <vector>
+#include <map>
+
+namespace DAQFormats {
+  class EventFull;
+}
+
+class FaserROBDataProviderSvc :  public extends<AthService, IFaserROBDataProviderSvc> {
+
+public:
+   /// ROB Fragment class
+   //typedef OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment ROBF;
+
+   /// Constructor
+   FaserROBDataProviderSvc(const std::string& name, ISvcLocator* svcloc);
+   /// Destructor
+   virtual ~FaserROBDataProviderSvc();
+
+   /// initialize the service
+   virtual StatusCode initialize() override;
+
+   /// Gaudi queryInterface method.
+   //   virtual StatusCode queryInterface(const InterfaceID& riid, void** ppvInterface);
+
+   /// Add all ROBFragments of a RawEvent to cache
+   virtual void setNextEvent(const DAQFormats::EventFull* re) override;
+
+   /// Retrieve the whole event.
+   virtual const DAQFormats::EventFull* getEvent() override;
+
+   /// Store the status for the event.
+   virtual void setEventStatus(uint32_t status) override;
+
+   /// Retrieve the status for the event.
+   virtual uint32_t getEventStatus() override;
+
+
+   /// MT variants 
+
+   virtual void setNextEvent(const EventContext& context, const DAQFormats::EventFull* re) override;
+   virtual const DAQFormats::EventFull* getEvent(const EventContext& context) override;
+   virtual void setEventStatus(const EventContext& context, uint32_t status) override;
+   virtual uint32_t getEventStatus(const EventContext& context) override;
+
+   virtual bool isEventComplete(const EventContext& /*context*/) const override { return true; }
+   virtual int collectCompleteEventData(const EventContext& /*context*/, const std::string_view /*callerName*/ ) override {  return 0; }
+
+protected:
+
+  struct EventCache {
+    ~EventCache();
+    const DAQFormats::EventFull* event = 0;
+    uint32_t eventStatus = 0;    
+    uint32_t currentLvl1ID = 0;    
+  };
+  SG::SlotSpecificObj<EventCache> m_eventsCache;
+
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserByteStreamEventAccess.h b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserByteStreamEventAccess.h
new file mode 100644
index 00000000..cfc5077f
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserByteStreamEventAccess.h
@@ -0,0 +1,27 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERBYTESTREAMCNVSVCBASE_IBYTESTREAMEVENTACCESS_H
+#define FASERBYTESTREAMCNVSVCBASE_IBYTESTREAMEVENTACCESS_H
+
+//#include "ByteStreamData/RawEvent.h"
+#include "GaudiKernel/IInterface.h"
+
+/** @class IByteStreamEventAccess
+ * @brief interface for accessing raw data .
+ */
+static const InterfaceID
+IID_IFaserByteStreamEventAccess("IFaserByteStreamEventAccess", 2 , 0);
+
+class IFaserByteStreamEventAccess: virtual public IInterface {
+ public:
+  /// Gaudi interface id
+  static const InterfaceID& interfaceID() { return IID_IFaserByteStreamEventAccess; }
+
+  /// pure virtual method for accessing RawEventWrite
+  //virtual RawEventWrite* getRawEvent() = 0;
+
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h
new file mode 100644
index 00000000..fa113740
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h
@@ -0,0 +1,117 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef IFASERROBDATAPROVIDERSVC_H
+#define IFASERROBDATAPROVIDERSVC_H
+
+#include "GaudiKernel/IInterface.h"
+#include "GaudiKernel/EventContext.h"
+
+#include <cstdint>
+#include <vector>
+#include <string>
+#include <string_view>
+#include <stdexcept>
+#include <functional>
+
+namespace DAQFormats {
+  class EventFull;
+}
+
+// Declaration of the interface ID ( interface id, major version, minor version)
+//static const InterfaceID IID_IROBDataProviderSvc("IROBDataProviderSvc", 1 , 0);
+
+/** @class IFaserROBDataProviderSvc
+    @brief Interface class for managing ROB for both online and offline.
+*/
+class IFaserROBDataProviderSvc : virtual public IInterface {
+
+public:
+  //typedef OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment ROBF;
+  //typedef std::vector<const ROBF*> VROBFRAG;
+
+   /// Retrieve interface ID
+  //   static const InterfaceID& interfaceID() { return IID_IFaserROBDataProviderSvc; }
+  DeclareInterfaceID(IFaserROBDataProviderSvc, 1, 1);
+
+   /// Add ROBFragments to cache for given ROB ids, ROB fragments may be retrieved with DataCollector
+   // virtual void addROBData(const std::vector<uint32_t>& robIds, const std::string_view callerName="UNKNOWN") = 0 ;
+
+   /// Add a given LVL1/LVL2 ROBFragment to cache
+   //virtual void setNextEvent(const std::vector<ROBF>& result) = 0 ;
+
+
+   /// Add all ROBFragments of a RawEvent to cache
+   virtual void setNextEvent(const DAQFormats::EventFull* re) = 0 ;
+
+
+   /// Retrieve ROBFragments for given ROB ids from cache
+   //virtual void getROBData(const std::vector<uint32_t>& robIds, VROBFRAG& robFragments, const std::string_view callerName="UNKNOWN") = 0;
+
+
+   /// Retrieve the whole event.
+   virtual const DAQFormats::EventFull* getEvent() = 0;
+
+
+   /// Store the status for the event.
+   virtual void setEventStatus(uint32_t status) = 0;
+
+
+   /// Retrieve the status for the event.
+   virtual uint32_t getEventStatus() = 0;
+
+
+   // variants for MT, it has an implementation for now in order not to require change in all implementations yet, they will all become pure virtual methods
+   //virtual void addROBData(const EventContext& /*context*/, const std::vector<uint32_t>& /*robIds*/, const std::string_view callerName="UNKNOWN") { 
+   //  throw std::runtime_error( std::string(callerName)+ std::string(" is using unimplemented ") + __FUNCTION__ ) ; 
+   // }
+   //virtual void setNextEvent(const EventContext& /*context*/, const std::vector<ROBF>& /*result*/) {
+   //  throw std::runtime_error( std::string("Unimplemented ") + __FUNCTION__ ); 
+   //}
+   virtual void setNextEvent( const EventContext& /*context*/, const DAQFormats::EventFull* /*re*/) {
+     throw std::runtime_error(std::string("Unimplemented ") + __FUNCTION__ ); 
+   }
+   //virtual void getROBData(const EventContext& /*context*/, const std::vector<uint32_t>& /*robIds*/, VROBFRAG& /*robFragments*/, 
+   //		   const std::string_view callerName="UNKNOWN") { 
+   //throw std::runtime_error( std::string(callerName)+ std::string(" is using unimplemented ") + __FUNCTION__ ) ; 
+   //}
+   virtual const DAQFormats::EventFull* getEvent(const EventContext& /*context*/) {
+     throw std::runtime_error(std::string("Unimplemented ") + __FUNCTION__ ); 
+   }
+   virtual void setEventStatus(const EventContext& /*context*/, uint32_t /*status*/) {
+     throw std::runtime_error(std::string("Unimplemented ") + __FUNCTION__ ); 
+   }
+   virtual uint32_t getEventStatus(const EventContext& /*context*/) {
+     throw std::runtime_error(std::string("Unimplemented ") + __FUNCTION__ ); 
+     return 0;
+   }
+   
+   /// @brief Interface to access cache of ROBs (it is a full event in case of offline)
+   /// In online implementation the cache will contain only a subset of ROBs. 
+   /// This method allows read access to the cache. 
+   /// @warning in case the cache is updated in the meantime the iteration is guaranteed to be safe 
+   /// but may not give access to all the ROBs available n the very moment
+   /// Example of counting: size_t counter = 0; svc->processCahcedROBs(ctx, [&](const ROBF*){ counter ++; })
+   /// Example of printout: svc->processCahcedROBs(ctx, [&](const ROBF* rob){ log() << MSG::DEBUG << "ROB " << rob->source_id() << endmsg; })
+   //   virtual void processCachedROBs(const EventContext& /*context*/, 
+   //				  const std::function< void(const ROBF* )>& /*fn*/ ) const {
+   //     throw std::runtime_error(std::string("Unimplemented ") + __FUNCTION__ ); 
+   //}
+  
+  /// Check if complete event data are already in cache
+  virtual bool isEventComplete(const EventContext& /*context*/) const {
+    throw std::runtime_error(std::string("Unimplemented ") + __FUNCTION__ );      
+  } 
+  
+  /// @brief Collect all data for an event from the ROS and put them into the cache
+  /// @return value: number of ROBs which were retrieved to complete the event
+  /// Optionally the name of the caller of this method can be specified for monitoring
+  virtual int collectCompleteEventData(const EventContext& /*context*/, const std::string_view callerName="UNKNOWN") {
+    throw std::runtime_error(std::string(callerName) + std::string(" is using unimplemented ") + __FUNCTION__ );
+    return 0;
+  }
+
+};
+
+#endif
diff --git a/Event/FaserByteStreamCnvSvcBase/python/FaserByteStreamCnvSvcBaseConfig.py b/Event/FaserByteStreamCnvSvcBase/python/FaserByteStreamCnvSvcBaseConfig.py
new file mode 100644
index 00000000..5f5f82f1
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/python/FaserByteStreamCnvSvcBaseConfig.py
@@ -0,0 +1,26 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+
+def FaserByteStreamCnvSvcBaseCfg(flags, **kwargs):
+    result=ComponentAccumulator()
+
+    adxProvider = CompFactory.FaserByteStreamAddressProviderSvc()
+    result.addService(adxProvider)
+
+    adxProvider.TypeNames += [ "xAOD::FaserTriggerData/FaserTriggerData",
+                               "xAOD::FaserTriggerDataAuxInfo/FaserTriggerDataAuxInfo." ]
+
+    adxProvider.TypeNames += [
+        "ScintWaveformContainer/CaloWaveforms",
+        "ScintWaveformContainer/VetoWaveforms",
+        "ScintWaveformContainer/TriggerWaveforms",
+        "ScintWaveformContainer/PreshowerWaveforms",
+        "ScintWaveformContainer/TestWaveforms"  
+    ]
+
+    adxProvider.TypeNames += [ "FaserSCT_RDO_Container/SCT_RDOs" ]
+
+    return result
+
diff --git a/Event/FaserByteStreamCnvSvcBase/python/__init__.py b/Event/FaserByteStreamCnvSvcBase/python/__init__.py
new file mode 100644
index 00000000..d47c36b5
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/python/__init__.py
@@ -0,0 +1 @@
+#FaserByteStreamCnvSvcBase
\ No newline at end of file
diff --git a/Event/FaserByteStreamCnvSvcBase/share/BSAddProvSvc_jobOptions.py b/Event/FaserByteStreamCnvSvcBase/share/BSAddProvSvc_jobOptions.py
new file mode 100644
index 00000000..ac692d56
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/share/BSAddProvSvc_jobOptions.py
@@ -0,0 +1,30 @@
+svcMgr = theApp.serviceMgr()
+if not hasattr( svcMgr, "FaserByteStreamAddressProviderSvc" ):
+    from FaserByteStreamCnvSvcBase.FaserByteStreamCnvSvcBaseConf import FaserByteStreamAddressProviderSvc
+    svcMgr += FaserByteStreamAddressProviderSvc()
+
+
+# Correnct syntax for non-containers
+svcMgr.FaserByteStreamAddressProviderSvc.TypeNames += [ 
+    "xAOD::FaserTriggerData/FaserTriggerData",
+    "xAOD::FaserTriggerDataAuxInfo/FaserTriggerDataAuxInfo."
+]
+
+# Add the different Scintillator containers
+# The assignemnt of digitizer channels to each container is done
+# in the ScintByteStream/ScintByteStreamCnv service
+# TestWaveforms is configurable for testing purposes
+svcMgr.FaserByteStreamAddressProviderSvc.TypeNames += [ 
+    "ScintWaveformContainer/CaloWaveforms",
+    "ScintWaveformContainer/VetoWaveforms",
+    "ScintWaveformContainer/TriggerWaveforms",
+    "ScintWaveformContainer/PreshowerWaveforms",
+    "ScintWaveformContainer/TestWaveforms"  
+]
+
+# Add tracker RDO containers
+svcMgr.FaserByteStreamAddressProviderSvc.TypeNames += [ 
+    "FaserSCT_RDO_Container/SCT_RDOs"
+]
+
+
diff --git a/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddress.cxx b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddress.cxx
new file mode 100644
index 00000000..96d9147a
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddress.cxx
@@ -0,0 +1,46 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+//====================================================================
+//FaserByteStreamAddress implementation
+//--------------------------------------------------------------------
+//
+//Package    : ByteStreamCnvSvcBase
+//
+//  Description:     BSCnvSvc address implementation
+//
+//Author     : Hong Ma
+//      created    : MAr 2, 2001
+//  History    :
+//  Revision:  Sept 19, 2002
+//             Store ROB IDs, to be used with ROBDataProviderSvc
+//====================================================================
+
+//own
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+// Framework include files
+#include "GaudiKernel/GenericAddress.h"
+
+/// Standard Constructor
+FaserByteStreamAddress::FaserByteStreamAddress(const CLID& clid,
+				     const std::string& fname , const std::string& cname, int p1, int p2)
+  : GenericAddress(storageType(), clid, fname, cname, p1, p2), m_eid(0,0) {
+}
+
+FaserByteStreamAddress::FaserByteStreamAddress(const CLID& clid)
+  : GenericAddress(storageType(), clid, "", "") {
+}
+
+/** Add ROBID
+ */
+void FaserByteStreamAddress::add( uint32_t robid) {
+  m_robIDs.push_back(robid);
+}
+
+/** access the fragment pointer
+ */
+const std::vector<uint32_t>&  FaserByteStreamAddress::getRobIDs() const {
+  return(m_robIDs);
+}
diff --git a/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx
new file mode 100644
index 00000000..9bbea53e
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamAddressProviderSvc.cxx
@@ -0,0 +1,101 @@
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Include files
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddressProviderSvc.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+#include "FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h"
+
+#include "StoreGate/StoreGate.h"
+#include "SGTools/TransientAddress.h"
+#include "GaudiKernel/ListItem.h"
+
+#include "AthenaKernel/IClassIDSvc.h"
+
+//#include "eformat/SourceIdentifier.h"
+
+/// Standard constructor
+FaserByteStreamAddressProviderSvc::FaserByteStreamAddressProviderSvc(const std::string& name, ISvcLocator* pSvcLocator) :
+	 ::AthService(name, pSvcLocator),
+	m_clidSvc("ClassIDSvc", name),
+	m_storeID(StoreID::EVENT_STORE) {
+  declareProperty("StoreID", m_storeID);
+}
+//________________________________________________________________________________
+FaserByteStreamAddressProviderSvc::~FaserByteStreamAddressProviderSvc() {
+}
+//________________________________________________________________________________
+StatusCode FaserByteStreamAddressProviderSvc::initialize() {
+   ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+   if (!::AthService::initialize().isSuccess()) {
+      ATH_MSG_FATAL("Cannot initialize AthService base class.");
+      return(StatusCode::FAILURE);
+   }
+
+   // Retrieve ClassIDSvc
+   if (!m_clidSvc.retrieve().isSuccess()) {
+      ATH_MSG_FATAL("Cannot get ClassIDSvc.");
+      return(StatusCode::FAILURE);
+   }
+   if (m_storeID < 0 || m_storeID > StoreID::UNKNOWN) {
+      ATH_MSG_FATAL("Invalid StoreID " << m_storeID);
+      return(StatusCode::FAILURE);
+   }
+   ATH_MSG_INFO("initialized ");
+   ATH_MSG_INFO("-- Will fill Store with id =  " << m_storeID);
+   return(StatusCode::SUCCESS);
+}
+//________________________________________________________________________________
+StatusCode FaserByteStreamAddressProviderSvc::finalize() {
+   // Release ClassIDSvc
+   if (!m_clidSvc.release().isSuccess()) {
+      ATH_MSG_WARNING("Cannot release ClassIDSvc.");
+   }
+   return(::AthService::finalize());
+}
+//________________________________________________________________________________
+StatusCode FaserByteStreamAddressProviderSvc::preLoadAddresses(StoreID::type id, tadList& tlist) {
+   ATH_MSG_DEBUG("in preLoadAddress");
+   if (id != m_storeID) {
+      ATH_MSG_DEBUG("StoreID = " << id << " does not match required id (" << m_storeID << ") skip");
+      return(StatusCode::SUCCESS);
+   }
+
+   for (std::vector<std::string>::const_iterator it = m_typeNames.begin(), it_e = m_typeNames.end();
+	   it != it_e; it++) {
+      ListItem item(*it);
+      const std::string& t = item.type();
+      const std::string& nm = item.name();
+      CLID classid;
+      if (!m_clidSvc->getIDOfTypeName(t, classid).isSuccess()) {
+         ATH_MSG_WARNING("Cannot create TAD for (type, name)" << " no CLID for " << t << " " << nm);
+      } else {
+         SG::TransientAddress* tad = new SG::TransientAddress(classid, nm);
+         tlist.push_back(tad);
+         ATH_MSG_DEBUG("Created TAD for (type, clid, name)" << t << " " << classid << " " << nm);
+         // save the clid and key.
+         m_clidKey[classid].insert(nm);
+      }
+   }
+   return(StatusCode::SUCCESS);
+}
+//________________________________________________________________________________
+StatusCode FaserByteStreamAddressProviderSvc::updateAddress(StoreID::type id,
+                                                       SG::TransientAddress* tad,
+                                                       const EventContext& ctx) {
+   if (id != m_storeID) {
+      return(StatusCode::FAILURE);
+   }
+   CLID clid = tad->clID();
+   std::string nm = tad->name();
+   std::map<CLID, std::set<std::string> >::const_iterator it = m_clidKey.find(clid);
+   if (it == m_clidKey.end() || (*it).second.count(nm) == 0) {
+      return(StatusCode::FAILURE);
+   }
+   ATH_MSG_DEBUG("Creating address for " << clid << " " << nm);
+   FaserByteStreamAddress* add = new FaserByteStreamAddress(clid, nm, "");
+   add->setEventContext(ctx);
+   tad->setAddress(add);
+   return(StatusCode::SUCCESS);
+}
diff --git a/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx
new file mode 100644
index 00000000..2c7bff28
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/src/FaserByteStreamCnvSvcBase.cxx
@@ -0,0 +1,89 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+#include "GaudiKernel/IOpaqueAddress.h"
+#include "GaudiKernel/GenericAddress.h"
+#include "GaudiKernel/IConverter.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "GaudiKernel/IIncidentSvc.h"
+
+#include "AthenaKernel/IClassIDSvc.h"
+#include "StoreGate/StoreGate.h" 
+
+//______________________________________________________________________________
+FaserByteStreamCnvSvcBase::FaserByteStreamCnvSvcBase(const std::string& name, ISvcLocator* pSvcLocator) :
+   ::AthCnvSvc(name, pSvcLocator, FaserByteStreamAddress::storageType())
+   // , m_rawEventWrite(0) 
+{
+   declareProperty("InitCnvs", m_initCnvs); 
+   // This property is used by Tile BS converter, not by this class.
+   declareProperty("ROD2ROBmap", m_ROD2ROBmap);
+}
+//______________________________________________________________________________
+/// Standard Destructor
+FaserByteStreamCnvSvcBase::~FaserByteStreamCnvSvcBase()   {
+}
+//______________________________________________________________________________
+/// Initialize the service.
+StatusCode FaserByteStreamCnvSvcBase::initialize()     {
+   if (!::AthCnvSvc::initialize().isSuccess()) {
+      ATH_MSG_FATAL("Cannot initialize AthCnvSvc base class.");
+      return(StatusCode::FAILURE);
+   }
+
+   ServiceHandle<IIncidentSvc> incsvc("IncidentSvc", this->name());
+   if (!incsvc.retrieve().isSuccess()) {
+      ATH_MSG_FATAL("Cannot get IncidentSvc.");
+      return(StatusCode::FAILURE);
+   }
+   incsvc->addListener(this, "BeginRun", 0, false, true); // true for singleshot
+   return(StatusCode::SUCCESS);
+}
+//_______________________________________________________________________
+StatusCode FaserByteStreamCnvSvcBase::queryInterface(const InterfaceID& riid, void** ppvInterface) {
+   if (IFaserByteStreamEventAccess::interfaceID().versionMatch(riid)) {
+      *ppvInterface = dynamic_cast<IFaserByteStreamEventAccess*>(this);
+   } else {
+      // Interface is not directly available: try out a base class
+      return(::AthCnvSvc::queryInterface(riid, ppvInterface));
+   }
+   addRef();
+   return(StatusCode::SUCCESS);
+}
+//______________________________________________________________________________
+StatusCode FaserByteStreamCnvSvcBase::updateServiceState(IOpaqueAddress* pAddress) {
+   if (pAddress != 0) {
+      GenericAddress* pAddr = dynamic_cast<GenericAddress*>(pAddress);
+      if (pAddr != 0) {
+         return(StatusCode::SUCCESS);
+      }
+   }
+   return(StatusCode::FAILURE);
+}
+//______________________________________________________________________________
+void FaserByteStreamCnvSvcBase::handle(const Incident& /*incident*/) {
+   ServiceHandle<IClassIDSvc> clidSvc("ClassIDSvc", name());
+   if (!clidSvc.retrieve().isSuccess()) {
+      ATH_MSG_ERROR("Cannot get ClassIDSvc.");
+      return;
+   }
+   // Initialize the converters
+   for (std::vector<std::string>::const_iterator it = m_initCnvs.begin(), it_e = m_initCnvs.end();
+		   it != it_e; it++) {
+      ATH_MSG_DEBUG("Accessing Converter for " << *it);
+      CLID id;
+      if (!clidSvc->getIDOfTypeName(*it, id).isSuccess()) {
+         ATH_MSG_WARNING("Cannot get CLID for " << *it);
+      } else {
+         IConverter* cnv = converter(id);
+         if (cnv == 0) {
+	    ATH_MSG_WARNING("Cannot get converter for " << *it);
+         } 
+      }
+   } 
+   return;
+}
diff --git a/Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx b/Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx
new file mode 100644
index 00000000..a897e516
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/src/FaserROBDataProviderSvc.cxx
@@ -0,0 +1,166 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+//===================================================================
+//  Implementation of ROBDataProviderSvc
+//  Revision: November 2017
+//      MT readiness
+//  Revision:  July 11, 2002
+//      Modified for eformat
+//  Revision:  Aug 18, 2003
+//      Modified to use ROBFragments directly and include methods
+//      for online
+//  Revision:  Apr 21, 2005
+//      Remove dependency on Level-2 Data Collector, create special
+//      version for online
+//  Revision:  Oct 29, 2006
+//      Increase MAX_ROBFRAGMENTS to 2048 to cover the special case
+//      when in a "localhost" partition the complete event is given
+//      to the Event Filter as one single ROS fragment (this case
+//      should not happen for normal running when several ROSes are
+//      used and the ROB fragments are grouped under different ROS
+//      fragments)
+//  Revision:  Nov 10, 2008
+//      Mask off the module ID from the ROB source identifier of the
+//      L2 and EF result when storing it in the ROB map. This is necessary
+//      when the L2/PT node ID is stored in the source identifier as
+//      module ID. With this modification the L2 and EF result can still be
+//      found as 0x7b0000 and 0x7c0000
+//  Revision:  Jan 12, 2009
+//      Allow removal of individual ROBs and ROBs from given subdetectors
+//      from the internal ROB map according to a given status code.
+//      This may be necessary when corrupted and incomplete ROB fragments
+//      are forwarded to the algorithms and the converters are not yet
+//      prepared to handle the specific cases.
+//      The filtering can be configured with job options as:
+//
+//      for individual ROBs as :
+//      ------------------------
+//      ROBDataProviderSvc.filterRobWithStatus = [ (ROB SourceId, StatusCode to remove),
+//                                                 (ROB SourceId 2, StatusCode to remove 2), ... ]
+//      and:
+//      ROBDataProviderSvc.filterRobWithStatus += [ (ROB SourceId n, StatusCode to remove n) ]
+//
+//      Example:
+//      ROBDataProviderSvc.filterRobWithStatus  = [ (0x42002a,0x0000000f), (0x42002e,0x00000008) ]
+//      ROBDataProviderSvc.filterRobWithStatus += [ (0x42002b,0x00000000) ]
+//
+//      for all ROBs of a given sub detector as :
+//      -----------------------------------------
+//      ROBDataProviderSvc.filterSubDetWithStatus = [ (Sub Det Id, StatusCode to remove),
+//                                                    (Sub Det Id 2, StatusCode to remove 2), ... ]
+//      and:
+//      ROBDataProviderSvc.filterSubDetWithStatus += [ (Sub Det Id n, StatusCode to remove n) ]
+//
+//      Example:
+//      ROBDataProviderSvc.filterSubDetWithStatus  = [ (0x41,0x00000000), (0x42,0x00000000) ]
+//      ROBDataProviderSvc.filterSubDetWithStatus += [ (0x41,0xcb0002) ]
+//
+//      For valid ROB Source Ids, Sub Det Ids and ROB Status elements see the event format
+//      document ATL-D-ES-0019 (EDMS)
+//  Revision:  Jan 28, 2014
+//      For Run 1 the module ID from the ROB source identifier of the
+//      L2 and EF result needed to be masked off before storing the ROB fragment 
+//      in the ROB map. The module ID for these fragments contained an identifier 
+//      of the machine on which they were produced. This produced as many different ROB IDs
+//      for these fragments as HLT processors were used. The module IDs were not useful 
+//      for analysis and needed to be masked off from these fragments in the ROB map in order 
+//      to allow the access to the L2 or the EF result with the generic identifiers  
+//      0x7b0000 and 0x7c0000. Also an event contained only one L2 and EF result.
+//      From Run 2 on (eformat version 5) the HLT processor identifier is not anymore
+//      stored in the module ID of the HLT result. Further there can be in one event several HLT result
+//      records with the source identifier 0x7c. The different HLT results are distinguished
+//      now with the module ID. A module ID 0 indicates a physiscs HLT result as before, while
+//      HLT results with module IDs different from zero are produced by data scouting chains. 
+//      In Run 2 the module ID should be therefore not any more masked.
+//      The masking of the moduleID is switched on when a L2 result is found in the event or the
+//      event header contains L2 trigger info words. This means the data were produced with run 1 HLT system.
+//
+//===================================================================
+
+// Include files.
+#include "FaserByteStreamCnvSvcBase/FaserROBDataProviderSvc.h"
+#include "EventFormats/DAQFormats.hpp"
+
+using DAQFormats::EventFull;
+
+// Constructor.
+FaserROBDataProviderSvc::FaserROBDataProviderSvc(const std::string& name, ISvcLocator* svcloc) 
+  : base_class(name, svcloc) {
+
+}
+
+// Destructor.
+FaserROBDataProviderSvc::~FaserROBDataProviderSvc() {
+  // the eventsCache take care of cleaaning itself
+}
+
+// Initialization
+StatusCode FaserROBDataProviderSvc::initialize() {
+   ATH_MSG_INFO("Initializing " << name() << " - package version " << PACKAGE_VERSION);
+   if (!::AthService::initialize().isSuccess()) {
+      ATH_MSG_FATAL("Cannot initialize AthService base class.");
+      return(StatusCode::FAILURE);
+   }
+   m_eventsCache = SG::SlotSpecificObj<EventCache>( SG::getNSlots() );
+
+   return(StatusCode::SUCCESS);
+}
+
+
+// - add a new Raw event
+void FaserROBDataProviderSvc::setNextEvent(const EventFull* re) {
+  // obtain context and redirect to the real implementation
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  return setNextEvent( context, re );
+}
+
+void FaserROBDataProviderSvc::setNextEvent( const EventContext& context, const EventFull* re ) {
+
+  EventCache* cache = m_eventsCache.get( context );
+  
+  cache->event = re;
+
+  ATH_MSG_DEBUG(" ---> setNextEvent offline for " << name() );
+  ATH_MSG_DEBUG("      current LVL1 id   = " << cache->currentLvl1ID );
+  
+  return;
+}
+
+/// Retrieve the whole event.
+const EventFull* FaserROBDataProviderSvc::getEvent() {
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  return getEvent( context );
+}
+
+const EventFull* FaserROBDataProviderSvc::getEvent( const EventContext& context ) {
+  return m_eventsCache.get( context )->event;
+}
+
+
+/// Set the status for the event.
+void FaserROBDataProviderSvc::setEventStatus(uint32_t status) {
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  setEventStatus( context, status );
+}
+
+void FaserROBDataProviderSvc::setEventStatus(const EventContext& context, uint32_t status) {
+  m_eventsCache.get(context)->eventStatus = status;
+}
+/// Retrieve the status for the event.
+uint32_t FaserROBDataProviderSvc::getEventStatus() {
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  return getEventStatus( context );
+}
+
+uint32_t FaserROBDataProviderSvc::getEventStatus( const EventContext& context ) {
+  return m_eventsCache.get( context )->eventStatus;
+}
+
+
+FaserROBDataProviderSvc::EventCache::~EventCache() {
+  delete event;
+  //FaserROBDataProviderSvc::robmapClear( robmap );
+}
+
diff --git a/Event/FaserByteStreamCnvSvcBase/src/components/FaserByteStreamCnvSvcBase_entries.cxx b/Event/FaserByteStreamCnvSvcBase/src/components/FaserByteStreamCnvSvcBase_entries.cxx
new file mode 100644
index 00000000..a31a4f6b
--- /dev/null
+++ b/Event/FaserByteStreamCnvSvcBase/src/components/FaserByteStreamCnvSvcBase_entries.cxx
@@ -0,0 +1,8 @@
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamCnvSvcBase.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddressProviderSvc.h"
+#include "FaserByteStreamCnvSvcBase/FaserROBDataProviderSvc.h"
+
+DECLARE_COMPONENT( FaserByteStreamCnvSvcBase )
+DECLARE_COMPONENT( FaserByteStreamAddressProviderSvc )
+DECLARE_COMPONENT( FaserROBDataProviderSvc )
+
diff --git a/Event/FaserEventStorage/CMakeLists.txt b/Event/FaserEventStorage/CMakeLists.txt
new file mode 100644
index 00000000..8f5f6d15
--- /dev/null
+++ b/Event/FaserEventStorage/CMakeLists.txt
@@ -0,0 +1,27 @@
+################################################################################
+# Package: FaserEventStorage
+################################################################################
+
+# Declare the package name:
+atlas_subdir( FaserEventStorage )
+
+# External dependencies:
+find_package( tdaq-common COMPONENTS ers EventStorage )
+find_package( Boost COMPONENTS system )
+
+atlas_add_library( FaserEventStorageLib
+    FaserEventStorage/*.h src/*.h src/*.cxx
+    PUBLIC_HEADERS FaserEventStorage
+    INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${TDAQ-COMMON_INCLUDE_DIRS}
+    LINK_LIBRARIES ${Boost_LIBRARIES} ${TDAQ-COMMON_LIBRARIES} EventFormats )
+
+
+# atlas_add_library(fReadPlain 
+#     src/fReadPlain.h src/fReadPlain.cxx 
+#     PUBLIC_HEADERS src
+#     INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${TDAQ-COMMON_INCLUDE_DIRS}
+#     LINK_LIBRARIES ${Boost_LIBRARIES} ${TDAQ-COMMON_LIBRARIES} -rdynamic)
+
+# Install files from the package:
+#atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
+#atlas_install_joboptions( share/*.py )
diff --git a/Event/FaserEventStorage/FaserEventStorage/DRError.h b/Event/FaserEventStorage/FaserEventStorage/DRError.h
new file mode 100644
index 00000000..493df0e1
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/DRError.h
@@ -0,0 +1,21 @@
+#ifndef _ERROR_ESTORE_R_
+#define _ERROR_ESTORE_R_
+
+/** 
+    \brief Return codes of the DataReader interface.
+    \file EventStorage/DRError.h
+*/
+
+namespace FaserEventStorage {
+
+  enum DRError { DROK = 0, /**< All OK */
+		 DRNOOK,   /**< an error, no way to read more data */
+                 DRWAIT,   /**< No way to read more data now, but there is a new file to which another process is writing. */
+		 DRNOSEQ,  /**< Not possible to make a file sequence. File name does not end with <number>.data */ 
+		 DRWOFF    /**< Wrong offset was given. No event data was found. You can still try another offset. */
+  };
+
+}        
+
+#endif //_ERROR_ESTORE_R_
+ 
diff --git a/Event/FaserEventStorage/FaserEventStorage/DataReader.h b/Event/FaserEventStorage/FaserEventStorage/DataReader.h
new file mode 100644
index 00000000..39282122
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/DataReader.h
@@ -0,0 +1,146 @@
+//Dear emacs, this is -*- c++ -*-
+
+
+/** 
+    \brief The API for reading of raw data data files 
+    written by ATLAS TDAQ applications.
+    \author Szymon Gadomski
+    \date May 2002 - Feb 2007
+    \file EventStorage/DataReader.h
+*/
+
+#ifndef FASEREVENTSTORAGE_DATAREADER_H
+#define FASEREVENTSTORAGE_DATAREADER_H
+
+#include <vector>
+#include <string>
+#include <stdint.h>
+#include <bitset>
+#include "FaserEventStorage/DRError.h"
+#include "FaserEventStorage/ESCompression.h"
+
+#include <boost/utility.hpp>
+
+namespace DAQFormats {
+  class EventFull;
+}
+
+using namespace FaserEventStorage;
+
+namespace FaserEventStorage {  
+
+  class DataReader : boost::noncopyable
+  {
+  protected:
+    DataReader() {};
+
+  public: 
+    /** the virual destructor */
+    virtual ~DataReader() {};
+
+  public:
+    /** 
+	  The method to enamble reading of file sequences.
+	    You need to call this method if you want to enable reading of 
+	      file sequences (*0001.data, *0002.data ...).
+	        By default, i.e. unless you call this method, only one file will 
+		  be read 
+    */ 
+    virtual DRError enableSequenceReading() = 0;
+
+    /** Feedback to user. Check if you can still read more data. */ 
+    virtual bool good() const = 0;
+
+    /** true if no more events left in the current file */
+    virtual bool endOfFile() const = 0;
+
+    /** true if no more events left in the file sequence */
+    virtual bool endOfFileSequence() const = 0; 
+ 
+    /** number of the file currently open; make sense only if you are reading a sequence */
+    virtual unsigned int currentFileNumber() const = 0; 
+
+    virtual unsigned int latestDataNumber() const = 0;
+
+
+    /** 
+	  read the event data 
+	    \param &eventSize the event (or data block) size will be returned here
+	      \param **event start of the data block
+	        \param pos if you give this parameter, you are trying to get an event from the offset pos
+		
+		  Possible return codes are decribed in the file EventStorage/DataReader.h
+    */
+    virtual DRError getData(DAQFormats::EventFull*& theEvent, int64_t pos) = 0;
+    virtual DRError getData(DAQFormats::EventFull*& theEvent) = 0; 
+    //    virtual DRError getDataPreAlloced(unsigned int &eventSize, char **event, int64_t allocSizeInBytes) = 0;
+ 
+    //    virtual DRError getDataPreAllocedWitPos(unsigned int &eventSize, char **event,  int64_t allocSizeInBytes, int64_t pos = -1) = 0; 
+ 
+ 
+    /** name of the current file */
+    virtual std::string fileName() const = 0;
+     
+    /** get the current offset within the file */
+    virtual int64_t getPosition() const = 0;
+
+    /** 
+	  The following methogs give access to metadata stored in the files.
+	  
+	    Dates and times are the local time of the PC that was writing tha data file.
+	      Human-readable encoding as integers was used. 
+	        For instance date 31012007 is 31 Jan 2007.
+		  Time 184422 is 18:44:22. 
+
+		    The following information is available without penalty at any stage during reading:
+    */
+    virtual unsigned int fileStartDate() const = 0; ///< Date when the file writing has started.
+    virtual unsigned int fileStartTime() const = 0; ///< Time when the file writing was started.
+    virtual unsigned int fileSizeLimitInDataBlocks() const = 0; ///< Maximum number of data blocks that was given when writing.
+    virtual unsigned int fileSizeLimitInMB() const = 0; ///< Maximum size in MB given when writing.
+    virtual std::string appName() const = 0;       ///< Name of the application that has written the file.
+    virtual std::string fileNameCore() const = 0;  ///< File name not including ._<file number>.data
+
+    /** 
+	  The following parameters of the run come from the Information System of the DAQ. 
+	    The information is also available without penalty at any stage during reading.
+    */
+    virtual unsigned int runNumber() const = 0;    ///< Run number 
+    virtual unsigned int maxEvents() const = 0;    ///< Maximum number of events specified for this run
+    virtual unsigned int recEnable() const = 0;    ///< Was recording enabled?     
+    virtual unsigned int triggerType() const = 0;  ///< Trigger type
+    virtual std::bitset<128> detectorMask() const = 0; ///< Detector mask
+    virtual unsigned int beamType() const = 0;     ///< Beam type
+    virtual unsigned int beamEnergy() const = 0;   ///< Beam energy
+    virtual std::vector<std::string> freeMetaDataStrings() const = 0; ///< Vector of strings containing metadata
+
+    /// Unique ID of the file represened as a string on POOL style.
+    /// For instance 10605EAF-52B1-DB11-94A4-000347D7BFE1
+    virtual std::string GUID() const = 0; 
+
+    virtual CompressionType compression() const = 0; ///< File compression technology
+
+    /** 
+	  The following methods will rewind to the end of file.
+	    Reading of data can continue undisturbed. 
+    */    
+    virtual unsigned int fileEndDate() = 0;            ///< Date when writing has stopped.
+    virtual unsigned int fileEndTime() = 0;            ///< Time when writing has stopped.
+    virtual unsigned int eventsInFile() = 0;           ///< Number of events in this file.
+    virtual unsigned int dataMB_InFile() = 0;          ///< Number of megabytes in this file.
+    virtual unsigned int eventsInFileSequence() = 0;   ///< Number of events in this file sequence written so far.
+    virtual unsigned int dataMB_InFileSequence() = 0;  ///< Number of MB in this file sequence written so far. 
+
+    virtual uint32_t lumiblockNumber() = 0;
+    virtual std::string stream() = 0;
+    virtual std::string projectTag() = 0;
+
+  };
+
+}
+
+#endif // EVENTSTORAGE_DATAREADER_H
+
+
+
+
diff --git a/Event/FaserEventStorage/FaserEventStorage/ESCompression.h b/Event/FaserEventStorage/FaserEventStorage/ESCompression.h
new file mode 100644
index 00000000..bf6f1e95
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/ESCompression.h
@@ -0,0 +1,20 @@
+//Dear emacs, this is -*- c++ -*-
+
+#ifndef FASEREVENTSTORAGE_ESCOMPRESSION_H
+#define FASEREVENTSTORAGE_ESCOMPRESSION_H
+
+#include <string>
+#include "ers/ers.h"
+
+namespace FaserEventStorage {
+      
+  enum CompressionType { NONE, RESERVED, UNKNOWN, ZLIB};
+
+  static const std::string compressiontag("Compression");
+  
+  CompressionType string_to_type(const std::string& type);
+  std::string type_to_string(const CompressionType& type);
+
+}
+
+#endif
diff --git a/Event/FaserEventStorage/FaserEventStorage/EventStorageIssues.h b/Event/FaserEventStorage/FaserEventStorage/EventStorageIssues.h
new file mode 100644
index 00000000..c0199045
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/EventStorageIssues.h
@@ -0,0 +1,134 @@
+#ifndef FASEREVENTSTORAGEISSUES_H
+#define FASEREVENTSTORAGEISSUES_H
+
+#include "ers/ers.h"
+
+
+/**
+   To report problems with configuration data base
+*/
+
+
+
+ERS_DECLARE_ISSUE(FaserEventStorage,
+		  WritingIssue,
+		  "FaserEventStorage writing problem" << ": " << reason,
+		  ((const char*) reason)
+		  )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_SingleFile,
+		       FaserEventStorage::WritingIssue,
+		       "ES_SingleFile" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_SingleFileAlreadyExists,
+		       FaserEventStorage::WritingIssue,
+		       "ES_SingleFileAlreadyExists" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+
+
+
+ERS_DECLARE_ISSUE(FaserEventStorage,
+		  ReadingIssue,
+		  "FaserEventStorage reading problem" << ": " << reason,
+		  ((const char*) reason)
+		  )
+
+ERS_DECLARE_ISSUE(FaserEventStorage,
+		  RawFileNameIssue,
+		  "FaserEventStorage problem with RawFileName" << ": " << reason,
+		  ((const char*) reason)
+		  )
+
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_InternalError,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_InternalError" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_WrongFileFormat,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_WrongFileFormat" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_OutOfFileBoundary,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_OutOfFileBoundary" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_NoEventFound,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_NoEventFound" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_WrongEventSize,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_WrongEventSize" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_NoEndOfFileRecord,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_NoEndOfFileRecord" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_AllocatedMemoryTooLittle,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_AllocatedMemoryTooLittle" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_AllocatingMemoryFailed,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_AllocatingMemoryFailed" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+
+
+ERS_DECLARE_ISSUE_BASE(FaserEventStorage,
+		       ES_SquenceNextFileMissing,
+		       FaserEventStorage::ReadingIssue,
+		       "ES_SquenceNextFileMissing" << ": " << reason  ,
+		       ((const char*) reason), ERS_EMPTY
+		       )
+
+
+
+/*
+ES_InternalError
+
+ES_WrongFileFormat
+
+ES_OutOfFileBoundary
+ES_NoEventFound
+ES_WrongEventSize
+
+
+ES_NoEndOfFileRecord
+ES_AllocatedMemoryTooLittle
+
+
+
+*/
+
+#endif
diff --git a/Event/FaserEventStorage/FaserEventStorage/EventStorageRecords.h b/Event/FaserEventStorage/FaserEventStorage/EventStorageRecords.h
new file mode 100644
index 00000000..129b128d
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/EventStorageRecords.h
@@ -0,0 +1,126 @@
+/**
+   \brief metadata records for EventStorage library
+   \author Szymon Gadomski
+   \date January 2004
+*/
+
+#ifndef FASEREVENTSTORAGE_RECORDS_H
+#define FASEREVENTSTORAGE_RECORDS_H
+
+#include <string>
+#include <vector>
+#include <stdint.h>
+
+// version of file format
+#define FILE_FORMAT_VERSION 0x00000006
+
+// markers as in DAQ-1
+#define FILE_START_MARKER 0x1234aaaa
+#define RUN_PARAMETERS_MARKER 0x1234bbbb
+
+#define EVENT_RECORD_MARKER 0x1234cccc
+
+#define STRING_SECTION_MARKER 0x1234aabb
+#define FREE_STRINGS_MARKER 0x1234aabc
+
+#define FILE_END_MARKER 0x1234dddd
+#define FILE_END_MARKER_LAST 0x1234eeee
+
+namespace FaserEventStorage {
+    
+  struct  file_start_record 
+  {
+    uint32_t marker;         /* Start of record marker          */
+    uint32_t record_size;    /* Total record size               */
+    uint32_t version;        /* Format version number           */
+    uint32_t file_number;    /* File number in the sequence     */
+    uint32_t date;           /* Date of run start               */
+    uint32_t time;           /* Time of run start               */
+    uint32_t sizeLimit_dataBlocks;  /* Max number of data blocks in the file */
+    uint32_t sizeLimit_MB;   /* Max number of data blocks in the file */
+  };
+
+  struct file_name_strings {
+    std::string appName;     
+    std::string fileNameCore; 
+  };
+
+  typedef std::vector<std::string> freeMetaDataStrings;
+
+  struct run_parameters_record {
+    uint32_t marker;         /* Start of record marker          */
+    uint32_t record_size;    /* Total record size               */
+    uint32_t run_number;     /* From IS                         */
+    uint32_t max_events;     /* From IS                         */
+    uint32_t rec_enable;     /* From IS                         */
+    uint32_t trigger_type;   /* From IS                         */
+    uint64_t detector_mask_LS;  /* From IS                      */
+    uint64_t detector_mask_MS;    /* From IS                      */
+    uint32_t beam_type;      /* From IS                         */
+    uint32_t beam_energy;    /* From IS                         */
+  };
+
+  struct data_separator_record {
+    uint32_t marker;      /* Start of record marker          */
+    uint32_t record_size;    /* Total record size               */
+    uint32_t data_block_number;  /* Index in the file sequence      */  
+    uint32_t data_block_size;    /* Size of the following block of data */
+  };
+
+  struct file_end_record {
+    uint32_t marker;         /* Start of record marker          */
+    uint32_t record_size;    /* Total record size               */
+    uint32_t date;           /* Date of run end                 */
+    uint32_t time;           /* Time of run end                 */
+    uint32_t events_in_file; /* Number of events recorded       */
+    uint32_t data_in_file;   /* Volume of data recorded         */
+    uint32_t events_in_run;  /* Number of events recorded       */
+    uint32_t data_in_run;    /* Volume of data recorded         */
+    uint32_t status;         /* Used to mark the last file. Other use possible in the future.*/
+    uint32_t end_marker;     /* End of RUNEND marker            */
+  };
+
+  // implement patterns
+  const uint32_t file_name_strings_marker = STRING_SECTION_MARKER;
+  const uint32_t free_strings_marker = FREE_STRINGS_MARKER;
+
+  const file_start_record file_start_pattern = {
+    FILE_START_MARKER,                  
+    sizeof(file_start_record)/sizeof(uint32_t),     
+    FILE_FORMAT_VERSION,                
+    0,                                  
+    0,                                  
+    0,
+    0,
+    0
+  };
+
+  const data_separator_record data_separator_pattern = {
+    EVENT_RECORD_MARKER,        
+    sizeof(data_separator_record)/sizeof(uint32_t),           
+    0,    
+    0     
+  };
+
+  const file_end_record file_end_pattern = {
+    FILE_END_MARKER,         
+    sizeof(file_end_record)/sizeof(uint32_t),          
+    0,          
+    0,          
+    0, 
+    0,   
+    0,  
+    0,    
+    0,    
+    FILE_END_MARKER_LAST    
+  };
+
+  std::string string_record(void *ri, const void *pi);
+  std::string string_record(file_name_strings nst);
+  void reset_record(void *ri, const void *pi);
+
+} // for namespace
+
+#endif // EVENTSTORAGE_RECORDS_H
+
+
diff --git a/Event/FaserEventStorage/FaserEventStorage/FileNameCallback.h b/Event/FaserEventStorage/FaserEventStorage/FileNameCallback.h
new file mode 100644
index 00000000..4a536cd1
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/FileNameCallback.h
@@ -0,0 +1,39 @@
+/**
+ \brief an interface for a call back class
+ \file EventStorage/FileNameCallback.h
+
+ a class to separate the generation of file names from the DataWriter
+
+ \author Cyril Topfel
+ \date December 2009
+*/
+
+#ifndef FASEREVENTSTORAGE_FILENAMECALLBACK_H
+#define FASEREVENTSTORAGE_FILENAMECALLBACK_H
+
+#include <string>
+
+namespace FaserEventStorage {
+  
+class FileNameCallback
+{
+ public:
+  virtual ~FileNameCallback() {};
+
+  virtual void advance() = 0;
+  virtual std::string getCurrentFileName(bool writing=false) = 0;
+  virtual std::string getCoreName() = 0;
+  /*  virtual std::string getFileNameByIndex(int index);*/
+  virtual unsigned int getIndex() = 0;
+  virtual void fileAlreadyExists() = 0;
+  
+  
+
+};
+
+}
+#endif // EVENTSTORAGE_FILENAMECALLBACK_H
+
+
+
+
diff --git a/Event/FaserEventStorage/FaserEventStorage/RawFileName.h b/Event/FaserEventStorage/FaserEventStorage/RawFileName.h
new file mode 100644
index 00000000..b1c57ff7
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/RawFileName.h
@@ -0,0 +1,263 @@
+/** 
+    \brief Class describing filenames of raw data in a format agreed for ATLAS; contruct, interpret and modify such file-names.
+    \author Kostas Kordas
+    \date Oct 2008
+    \file EventStorage/RawFileName.h
+*/
+
+#ifndef FASEREVENTSTORAGE_ONLINEFILENAME_H
+#define FASEREVENTSTORAGE_ONLINEFILENAME_H
+
+#include "FaserEventStorage/EventStorageIssues.h"
+#include "FaserEventStorage/FileNameCallback.h"
+//-----------------
+// includes for ers
+#include "ers/ers.h"
+//-----------------
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include <iomanip>
+#include <stdexcept>
+
+
+
+namespace daq
+{
+
+  /**
+   *  Constants associated with the RAW file name convention
+   * --------------------------------------------------------
+   */
+  // extenstions of files and delimiter between fields:
+  static const std::string  RAWFILENAME_EXTENSION_UNFINISHED    = ".writing";
+  static const std::string  RAWFILENAME_EXTENSION_FINISHED      = ".data";
+  static const std::string  RAWFILENAME_DELIMITER               = ".";
+  // defaults:
+  static const unsigned int RAWFILENAME_DEFAULT_UINT            = 0;
+  static const std::string  RAWFILENAME_DEFAULT_STRING          = ""; 
+  //  width of some file name fields, for proper padding:
+  static const unsigned int RAWFILENAME_RUN_NUMBER_LENGTH       = 8;
+  static const unsigned int RAWFILENAME_LB_NUMBER_LENGTH        = 4;
+  static const unsigned int RAWFILENAME_FILE_NUMBER_LENGTH      = 4;
+  static const unsigned int RAWFILENAME_RUN_NUMBER_LENGTH_OLD   = 7;
+  static const unsigned int RAWFILENAME_FILE_NUMBER_LENGTH_OLD  = 2;
+
+
+  /**
+   * Helper class for exceptions
+   */
+  class BadConversion : public std::runtime_error {
+  public:
+  BadConversion(const std::string& s) : std::runtime_error(s) { }
+  };
+
+  /**
+   * The class implementing the online filename convention
+   */
+  class RawFileName : public FaserEventStorage::FileNameCallback {
+  public:
+    /**
+     * Contructor with all ingredients given
+     * Note: Extension will be made to start with '.' (e.g., "data" -> ".data")
+     */
+    RawFileName(std::string ProjectTag,
+		unsigned int RunNumber,
+		std::string StreamType,
+		std::string StreamName,
+		unsigned int LumiBlockNumber,
+		std::string ApplicationName,
+		std::string ProductionStep="daq",
+		std::string DataType="RAW",
+		unsigned int FileSequenceNumber=1,
+		std::string Extension="");
+    
+
+
+    void advance();
+    std::string getCurrentFileName(bool writing);
+    /*  virtual std::string getFileNameByIndex(int index);*/
+
+    std::string getCoreName();
+
+
+    unsigned int getIndex();
+    void fileAlreadyExists();
+
+
+    
+    /**
+     * Constructor with the FileNameCore, a FileSequenceNumber and 
+     * the Extension only - 
+     *  Does not alter the FileNameCore, just attaches trailer fields 
+     *  to the fileNameCore; also, tries to interpret the resulting filename
+     *  Note: Extension will be made to start with '.' (e.g., "data" -> ".data")
+     */
+    RawFileName(std::string FileNameCore,
+		unsigned int FileSequenceNumber,
+		std::string Extension="");
+
+    /**
+     * Contructor with just the filename given: for interpretation
+     */   
+    RawFileName(std::string FileName);
+     
+    /**
+     * Destructor
+     */
+    ~RawFileName();
+
+    /**
+     * given the ingedients, contruct the fileName
+     */
+    void buildFileName(std::string ProjectTag,
+		       unsigned int RunNumber,
+		       std::string StreamType,
+		       std::string StreamName,
+		       unsigned int LumiBlockNumber,
+		       std::string ApplicationName,
+		       std::string ProductionStep,
+		       std::string DataType,
+		       unsigned int FileSequenceNumber,
+		       std::string Extension);
+    
+    /**
+     * given the ingedients, contruct the fileNameCore 
+     * and set m_core_known = true
+     */
+    void buildFileNameCore(std::string ProjectTag,
+			   unsigned int RunNumber,
+			   std::string StreamType,
+			   std::string StreamName,
+			   unsigned int LumiBlockNumber,
+			   std::string ApplicationName,
+			   std::string ProductionStep,
+			   std::string DataType);
+
+    /**
+     * Complete the FileName, 
+     * by appending a FileSequenceNumber and an Extension to the FileNameCore
+     * and set m_trailers_known = true
+     * Note: Extension will be made to start with '.' (e.g., "data" -> ".data")
+     */
+    void buildFileNameTrailers(std::string FileNameCore, 
+			       unsigned int FileSequenceNumber,
+			       std::string Extension);
+
+    /**
+     * given the fileName, reconstruct the ingredients
+     */
+    bool interpretFileName(std::string FileName); 
+
+    /**
+     * contruct the complain
+     */
+    std::string complain();
+ 
+    /**
+     * print the content of this object
+     */
+    void print();
+
+    /**
+     * Get methods:
+     * ------------
+     */
+    std::string project();
+    unsigned int runNumber();
+    std::string streamType();
+    std::string streamName();
+    std::string stream();
+    unsigned int lumiBlockNumber();
+    std::string applicationName();
+    std::string productionStep();
+    std::string dataType();
+    unsigned int fileSequenceNumber();
+    std::string extension();
+
+    std::string fileNameCore() { return m_fileNameCore; }
+    std::string fileName() { return m_fileName; }
+
+    bool hasValidCore() { return m_core_known; }
+    bool hasValidTrailer() { return m_trailer_known; }
+
+    std::string datasetName();
+
+    /**
+     * Set methods:
+     * ------------
+     */
+
+    /**
+     * Default values for the filename fields 
+     * If filename is valid, the correct values will be returned when asked.
+     */
+    void setDefaults();
+
+    /**
+     * Modify the File Trailer fileds (FileSequence Number and  Extension)
+     */
+    void setTailers(unsigned int fsn_i, std::string extension_s); 
+
+    /**
+     * Modify the FileSequenceNumber at the file trailer fields
+     */
+    void setFileSequenceNumber( unsigned int fsn_i );
+
+    /**
+     * Modify the File Extension at the file trailer fields
+     */
+    void setExtension( std::string extension_s );
+    
+
+  public: 
+    /** 
+     *  Helper methods: made static for use even without an object
+     * ------------------------------------------------------------
+     */
+
+    /**
+     * given a string and a delimeter, split it in fields and return them in 
+     * a vector of strings
+     */
+    static std::vector<std::string> split(std::string const & s, 
+					  char delimiter);
+
+    /**
+     * string to integer conversion
+     */ 
+    static unsigned int convertToUINT(const std::string & s);
+
+
+  private:
+    /**
+     * Member data:
+     * ------------
+     */
+    std::string m_project;
+    unsigned int m_runNumber;
+    std::string m_streamType;
+    std::string m_streamName;
+    std::string m_stream;
+    unsigned int m_lumiBlockNumber;
+    std::string m_applicationName;
+    std::string m_productionStep;
+    std::string m_dataType;
+    std::string m_fileNameCore;
+
+    unsigned int m_fileSequenceNumber;
+    std::string m_extension;
+    std::string m_fileName;
+
+    std::string m_datasetName;
+
+    bool m_core_known;
+    bool m_trailer_known;
+    
+  }; // end RawFileName class declaration
+
+} // end "daq" namespace
+
+#endif // EVENTSTORAGE_ONLINEFILENAME_H
diff --git a/Event/FaserEventStorage/FaserEventStorage/fRead.h b/Event/FaserEventStorage/FaserEventStorage/fRead.h
new file mode 100644
index 00000000..ad4c1e8d
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/fRead.h
@@ -0,0 +1,70 @@
+/**
+ \brief EventStorage library, an abstract interface for file I/O operations
+ \author Szymon Gadomski
+ \file EventStorage/fRead.h
+ \date Feb 2006 - Feb 2007
+
+ This is needed to support dufferent file I/O libraries:
+ - castor files are accessible with shift library,
+ - plain disk files need to be readable on computers without the shift lib,
+ - dCache is an alternative to Castor used at various sites for ATLAS.
+*/
+
+#ifndef FREAD_H
+#define FREAD_H
+
+#include <string>
+#include <stdint.h>
+
+class fRead 
+{
+ public:
+  fRead()
+    {
+      m_currentEndOfFile = -1;
+    };
+ 
+  virtual ~fRead() {}; 
+
+  uint32_t readuint32_t()
+  {
+    int64_t op = getPosition();
+    uint32_t myint;
+    readData((char*)&myint, sizeof(uint32_t));
+    setPosition(op);
+    return myint;
+  }
+
+  virtual bool isOpen() = 0;
+  virtual bool isEoF() = 0;
+  virtual bool fileExists(std::string name) const = 0;
+  virtual void openFile(std::string name) = 0;
+  virtual void closeFile() = 0;
+  virtual void readData(char *buffer, unsigned int sizeBytes) = 0;
+  virtual int64_t getPosition() = 0;
+  virtual void setPosition(int64_t p) = 0;
+  virtual void setPositionFromEnd(int64_t p) = 0;
+  
+  void setCurrentEndOfFile(int64_t p)
+  {
+    m_currentEndOfFile = p;
+  }
+  
+  void setPositionFromEndSafe(int64_t p)
+  {
+    if (m_currentEndOfFile==-1) setPositionFromEnd(p);
+    else
+      setPosition( m_currentEndOfFile + p);
+  }
+
+  virtual fRead * newReader() const = 0;
+
+ private:
+  int64_t m_currentEndOfFile;
+
+};
+
+extern "C" {
+  fRead *fReadFactory();
+}
+#endif 
diff --git a/Event/FaserEventStorage/FaserEventStorage/loadfRead.h b/Event/FaserEventStorage/FaserEventStorage/loadfRead.h
new file mode 100644
index 00000000..284bc8db
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/loadfRead.h
@@ -0,0 +1,14 @@
+/**
+   \brief Function to load the file lib wrapper class.
+   \author Szymon Gadomski
+   \date February 2006
+*/
+
+#ifndef FASEREVENTSTORAGE_LOADFREAD_H
+#define FASEREVENTSTORAGE_LOADFREAD_H
+
+#include "FaserEventStorage/fRead.h"
+
+fRead * loadfRead(std::string libName);
+
+#endif
diff --git a/Event/FaserEventStorage/FaserEventStorage/pickFaserDataReader.h b/Event/FaserEventStorage/FaserEventStorage/pickFaserDataReader.h
new file mode 100644
index 00000000..e809a363
--- /dev/null
+++ b/Event/FaserEventStorage/FaserEventStorage/pickFaserDataReader.h
@@ -0,0 +1,26 @@
+/**
+ \brief Function to choose the correct reader of the data files.
+
+ It recognizes data file formats of 2003 and later.
+ It chooses a file I/O library for plain disk files, Castor 
+ files or dCache files.
+
+ \file EventStorage/pickDataReader.h
+ \author Szymon Gadomski
+ \date Feb 2004 - Feb 2007
+*/
+
+#ifndef FASEREVENTSTORAGE_PICKDATAREADER_H
+#define FASEREVENTSTORAGE_PICKDATAREADER_H
+
+#include "FaserEventStorage/DataReader.h"
+#include <string>
+
+/**
+   \param fileName the name of the data file to read
+*/
+FaserEventStorage::DataReader * pickFaserDataReader(std::string fileName);
+
+
+
+#endif
diff --git a/Event/FaserEventStorage/README b/Event/FaserEventStorage/README
new file mode 100644
index 00000000..a2a79b9a
--- /dev/null
+++ b/Event/FaserEventStorage/README
@@ -0,0 +1,4 @@
+FaserEventStorage
+
+FASER version of utility pakcage EventStorage taken from here:
+https://gitlab.cern.ch/atlas-tdaq-software/EventStorage/-/tree/master/
diff --git a/Event/FaserEventStorage/src/DataReaderController.cxx b/Event/FaserEventStorage/src/DataReaderController.cxx
new file mode 100644
index 00000000..10c54500
--- /dev/null
+++ b/Event/FaserEventStorage/src/DataReaderController.cxx
@@ -0,0 +1,681 @@
+#include <memory>
+#include <sstream>
+#include <iomanip>
+
+
+#include "ers/ers.h"
+#include "FaserEventStorage/EventStorageIssues.h"
+#include "FaserEventStorage/fRead.h" 
+#include "DataReaderController.h"
+#include "EventStorage/RawFileName.h"
+#include "EventStackLayer.h"
+#include "ESLMultiFile.h"
+//#include "ESLMergeFile.h"
+#include "ESLOriginalFile.h"
+#include "EventFormats/DAQFormats.hpp"
+
+using namespace std;
+using namespace FaserEventStorage;
+
+
+DataReaderController::DataReaderController(fRead *fR, string filename)
+{
+  m_fR = fR; //the raw reader
+  m_fileName = filename; //the initial filename
+  
+  m_sequenceReading = false; //seq reading off per default 
+  m_finished = false;
+  m_last_file_finished = false ;
+
+  m_markForDeletion = 0;
+  m_responsibleForMetaData = 0;
+
+  //This is the entry Point, it always starts with a MultiFileReader
+  m_filehandler = new FESLMultiFile(m_fR);
+
+  ERS_DEBUG(1,"filehandler instantiated " << m_filehandler->identify() );
+
+  m_filehandler->setFile(filename);
+
+  ERS_DEBUG(3,"filehandler file set " << m_filehandler->identify() <<  " " << filename);
+
+  // ET doesn't do anything, so OK
+  m_filehandler->prepare();
+
+  ERS_DEBUG(3,"filehandler " << m_filehandler->identify() << " prepared.");
+
+  m_stack.push(m_filehandler);
+
+  m_cFileNumber = 0; 
+  m_sizeOfFileNumber = 0;
+
+  initialize();
+
+  ERS_DEBUG(3,"Initialization complete. Exiting Controller Constructor ");
+}
+
+DataReaderController::~DataReaderController()
+{
+  if (m_fR && m_fR->isOpen()) m_fR->closeFile();
+
+  while (!m_stack.empty()) {
+    EventStackLayer *tmp = m_stack.top(); 
+    m_stack.pop();
+    if (tmp != m_markForDeletion and tmp != m_filehandler)
+      delete tmp;
+  }
+
+  if (m_markForDeletion != 0)
+    {
+      delete m_markForDeletion;
+      m_markForDeletion = 0;
+    }
+  
+  if(m_filehandler) delete m_filehandler;
+  if(m_fR) delete m_fR;
+}
+
+
+void DataReaderController::initialize()
+{
+
+  //Now we load all the Instances onto the stack. filehandler will return an instance of type ESLMergeFile or ESLOriginalFile, this instance will report (method doneLoading) if it is finished. In case of the Originalfilereader, this will be true, in case of the MergeFileReader, this will be false, because the mergereader will want to load an originalfile inside. The process continues and the stack is filled. The resulting Stack should have a top element ready for Data to be read. 
+
+  bool done=false;
+  while (!done)
+    {
+      ERS_DEBUG(2, m_stack.top()->identify() << " openNext() called");
+      EventStackLayer *ELSnew = m_stack.top()->openNext();
+      ERS_DEBUG(2, ELSnew->identify() << " instantiated");
+
+      
+      //ELSnew->prepare();
+      // prepare is already done in openNext.
+      
+      if (ELSnew->responsibleforMetaData())
+	{
+	  //if this lyer is responsible for metadata, it is linked to the internal pointer of Controller. Controller will the relay metadata requests to this layer. great.
+	  m_responsibleForMetaData = ELSnew;
+	}
+      
+      ELSnew->setCaller(m_stack.top());
+      
+      m_stack.push( ELSnew );
+      ERS_DEBUG(2, ELSnew->identify() << " put on stack");
+
+      done = ELSnew->doneLoading();
+      ERS_DEBUG(2, ELSnew->identify() << " reported doneLoading: " << done);
+    }
+
+}
+
+bool DataReaderController::good() const
+{  
+  return m_stack.size()? m_stack.top()->moreEvents():false;
+}
+
+bool DataReaderController::endOfFile() const
+{
+  //this is just to keep compatibility with calling code. they want to know i f a file just finished
+
+  bool a = m_last_file_finished;
+  //m_last_file_finished = false;
+  return a;
+}
+
+bool DataReaderController::endOfFileSequence() const
+{
+  return false;
+}  
+
+
+
+//DRError DataReaderController::getData(unsigned int &eventSize, char **event, int64_t pos = -1 , bool memAlreadyAlloc = false, int64_t allocSizeInBytes = -1)
+DRError DataReaderController::getData(DAQFormats::EventFull*& theEvent, int64_t pos)
+{
+
+  int64_t oldpos = 0;
+  m_last_file_finished=false;
+
+
+  if (m_markForDeletion != 0)
+    {
+      delete m_markForDeletion;
+      m_markForDeletion = 0;
+    }
+
+  //if the position is defined, we need to remember the old position
+  //and jump to the given position
+  if ( pos != -1) 
+    {
+      oldpos = this->getPosition();
+      this->setPosition(pos);
+    }
+
+
+  DRError res =  m_stack.top()->getData(theEvent, -1);
+
+
+
+  //if position was defined, we need to jump back to the old position BEFORE checking for more events. Else if we are reading by offset, the program will crash.
+  if ( pos != -1) 
+    {
+      this->setPosition(oldpos);
+    }
+
+
+
+  if ( !(m_stack.top()->moreEvents()) )
+    {
+      ERS_DEBUG(2, " No more Events on top of stack ");
+      //this is the "main loop". It handles the switching from one originalfile to the next, from one mergefile to the next etc.
+      while ( !m_stack.empty() && !m_stack.top()->moreEvents() )
+{
+  ERS_DEBUG(2, m_stack.top()->identify() << " has more events?: answer was " << m_stack.top()->moreEvents() );
+
+  EventStackLayer *old = m_stack.top();    
+  bool success = old->finished();
+
+  //the following line we only use to report to the caller that just a file was closed
+  if ( m_responsibleForMetaData == old )
+    m_last_file_finished = true;
+
+    
+  ERS_DEBUG(2,  old->identify() << " finished? " << success);
+
+  m_stack.pop();
+    
+  ERS_DEBUG(2, " Popping " << old->identify() << " from stack");
+
+  if (success && !m_stack.empty()) m_stack.top()->advance(); 
+
+  if (!m_stack.empty() && m_stack.top()->handlesContinuation())
+    {
+      bool end = (old->endOfFileSequence() || !m_sequenceReading);
+      if (!end)
+{
+  //if the continuation is given, we ask for the next file
+  unsigned int nextSN = old->nextInSequence(m_cFileNumber);
+  ERS_DEBUG(2, " Next in Sequence is " << nextSN);
+  string next = this->nextInContinuation(nextSN);
+
+  m_stack.top()->setContinuationFile(next);
+
+}
+     
+    } //if continuation is not handled, nothing happens
+  if (old != m_responsibleForMetaData && old != m_filehandler)
+            {
+      //we preserve the m_metaDataResponsible Object. 
+              delete old;
+            }
+          else if (old == m_responsibleForMetaData)
+            {
+	      //the user probably still wants to read metadata, so we keep in mind that in the next get_data, this must be deleted
+              m_markForDeletion = old;
+            }
+  //while-loop will just continue to pop
+ } //end of while loop 
+      
+      if (m_stack.empty())
+	{
+	  //if the stack is empty, we are finished
+	  ERS_DEBUG(1, " Run finished, no more events ");
+	  m_finished = true;
+	}
+      else
+	{
+	  ERS_DEBUG(2, " Continuing ");
+	  //this will put the next redable item(s) on the stack
+	  initialize();
+	}
+      
+    }//end of moreEvents
+
+  //now everything should be in order, so let's read data
+  
+
+  return res;
+
+}
+
+DRError DataReaderController::getData(DAQFormats::EventFull*& theEvent) {
+  return getData(theEvent, -1);
+}
+/*
+DRError DataReaderController::getDataPreAlloced(unsigned int &eventSize, char **event, int64_t allocSizeInBytes)
+{
+  return getData(eventSize, event, -1, true, allocSizeInBytes);
+}
+
+DRError DataReaderController::getDataPreAllocedWitPos(unsigned int &eventSize, char **event,  int64_t allocSizeInBytes, int64_t pos ) 
+{
+  return getData(eventSize, event, pos, true, allocSizeInBytes);
+}
+*/
+
+
+void DataReaderController::setPosition(int64_t position)
+{
+  //if a setPosition takes place, only the instance on the stack that can handle position can do it. We are poppoing the stack until we find a responsible Instance.
+  
+  EventStackLayer *old = 0;
+
+  while ( !m_stack.top()->handlesOffset() )
+    {
+
+      old = m_stack.top();
+      m_stack.pop();
+      //delete old;
+      // WARNING: possible memory leak, if more than one Layer is popped. This should not be possible in current implementation. 
+      if (m_stack.empty()) 
+	{
+	  FaserEventStorage::ES_InternalError ci(ERS_HERE, "EventStack is empty. This should not happen.");
+	  throw ci;
+
+	}
+    }
+  //now we should be at the instance where the responisble instance is at top. 
+
+  //Please note: This only works if OriginalFile Layer is the last after Mergefile layer. There is however no reason yet to think this will change. famous last words :-~
+
+  EventStackLayer *off = m_stack.top()->loadAtOffset(position, old);
+
+  if (! (m_stack.top() == off) )
+    {
+      m_stack.push( off );
+    }
+  
+    
+  if (old && old != off) //we need to delete the old one, if the new one is not the same as the old one
+    {
+      //ERS_DEBUG(1, " deleting old " << old);
+      delete old;
+    }
+  //after this procedure, the correct originalFilehandler should be on top of the stack and ready for reading
+
+  m_finished = false;//we assume the user knows what he's doing and doesnt jump to an end of a file
+  
+  
+}
+
+int64_t DataReaderController::getPosition() const
+{
+  return m_fR->getPosition();
+}
+
+std::string DataReaderController::fileName() const
+{
+  return m_responsibleForMetaData->fileName();
+}
+
+unsigned int DataReaderController::fileStartDate() const
+{
+  return m_responsibleForMetaData->fileStartDate();
+}
+
+unsigned int DataReaderController::fileStartTime() const
+{
+  return m_responsibleForMetaData->fileStartTime();
+}
+
+
+unsigned int DataReaderController::currentFileNumber() const 
+{ 
+  return m_cFileNumber; 
+}
+
+
+DRError DataReaderController::enableSequenceReading()
+{
+  ERS_DEBUG(2,"DataReaderBase::enableSequenceReading() is called. "
+	    <<"Try parsing file name\n"<<m_fileName);
+
+  daq::RawFileName thename(m_fileName);
+  
+  if (!thename.hasValidTrailer()) 
+    {
+      ERS_DEBUG(1," Test of file name parsing has failed. "
+		<<"File sequence reading not enabled.");
+      return DRNOSEQ;
+    } 
+  else 
+    {
+      m_sizeOfFileNumber = daq::RAWFILENAME_FILE_NUMBER_LENGTH;
+      m_cFileNumber = thename.fileSequenceNumber();
+      m_fileNameCore = thename.fileNameCore();
+      
+      ERS_DEBUG(1," fileNameCore: " << m_fileNameCore);
+      
+      m_sequenceReading=true;
+      
+      // check if the actual name of this file corresponds to 
+      // the fileName reported inside the file
+      std::string test = fileName();  // name from meta-data inside the file
+      if(test != m_fileName)
+	{
+	  ERS_DEBUG(1," The name of this file is different from the fileName "
+		    << " reported inside the file itself. "
+		    << "File sequence reading not enabled.");
+	  return DRNOSEQ;
+	}
+      
+      return DROK;
+    }
+
+  /**** OLD code here - will be trhown away in due time
+
+  std::string tail= daq::RAWFILENAME_EXTENSION_FINISHED;
+
+  std:: string::size_type tailPos=m_fileName.rfind(tail);
+
+  if(tailPos==std::string::npos) {
+  ERS_DEBUG(3,"File name does not contain "<<tail);
+  return DRNOSEQ;
+  }
+  if(tailPos+tail.size() != m_fileName.size()) {
+  ERS_DEBUG(3,"File name does not end with "<<tail);
+  return DRNOSEQ; 
+  }
+
+  std::string nameCore=m_fileName.substr(0,tailPos);
+  ERS_DEBUG(3,"File name without the tail "<<nameCore);
+
+  std::string digits("0123456789");
+  std::string::size_type numPos=nameCore.find_last_not_of(digits);
+  ++numPos;
+  if(numPos==string::npos) return DRNOSEQ;
+
+  std::string num=nameCore.substr(numPos,nameCore.size());
+  ERS_DEBUG(3,"Expecting file number in this string <"<<num<<">.");
+
+  m_sizeOfFileNumber=num.size();
+  ERS_DEBUG(3,"Size of the number "<<m_sizeOfFileNumber);
+  if(m_sizeOfFileNumber==0) return DRNOSEQ;
+ 
+  m_cFileNumber=atoi(num.c_str());
+  ERS_DEBUG(3,"File number "<<m_cFileNumber);
+
+  m_fileNameCore=nameCore.substr(0,numPos);
+  ERS_DEBUG(3,"File name core "<<nameCore);
+
+  ERS_DEBUG(2,"Finished parsing, now test the result.");
+
+  m_sequenceReading=true; 
+  
+  std::string test = fileName();
+
+  if(test != m_fileName) {
+  ERS_DEBUG(1,"Test of file name parsing has failed. "
+  <<"File sequence reading not enabled.");
+  return DRNOSEQ;
+  } 
+ 
+  // --m_cFileNumber; // will be incremented at 1st open
+  return DROK;
+  
+  End of OLD code
+  ****/
+}
+
+
+std::string DataReaderController::nextInContinuation(unsigned int expected)
+{
+  int numFailed=20;
+  m_cFileNumber = expected;
+  
+  while(numFailed){
+    std::string next = this->sequenceFileName(true);
+      
+    if (m_fR->fileExists(next)){
+      ERS_DEBUG(2, "fRead reported " << next << " exists");
+      return next;
+    }else{
+      ERS_DEBUG(2, "fRead reported " << next << " does not exist");
+      m_cFileNumber++;
+      numFailed--;
+    }
+  }
+  
+  //Problem
+  FaserEventStorage::ES_SquenceNextFileMissing ci(ERS_HERE, "EndOfSequenceFlag was not found and 18 files with continuous sequnce number were not found. Aborting");
+  throw ci;
+
+  return "";
+}
+
+
+unsigned int DataReaderController::runNumber() const 
+{ 
+  return m_responsibleForMetaData->runNumber();
+}
+unsigned int DataReaderController::maxEvents() const 
+{
+  return m_responsibleForMetaData->maxEvents();
+}
+unsigned int DataReaderController::recEnable() const 
+{
+  return m_responsibleForMetaData->recEnable();
+}
+unsigned int DataReaderController::triggerType() const 
+{
+  return m_responsibleForMetaData->triggerType();
+}
+std::bitset<128> DataReaderController::detectorMask() const 
+{
+  return m_responsibleForMetaData->detectorMask();
+}
+unsigned int DataReaderController::beamType() const 
+{
+  return m_responsibleForMetaData->beamType();
+}
+unsigned int DataReaderController::beamEnergy() const  
+{
+  return m_responsibleForMetaData->beamEnergy();
+}
+
+
+CompressionType DataReaderController::compression() const{
+  return m_responsibleForMetaData->compression();
+}
+
+std::vector<std::string> DataReaderController::freeMetaDataStrings() const
+{
+  ERS_DEBUG(1, "Upper level is " << m_stack.top()->getCaller()->identify());
+  
+  std::vector<std::string> result;
+  //  if (m_stack.top()->getCaller()->identify()=="ESLMerge")
+  //  { //if a mergefiles is read, always return empty metadata
+  //   return result;
+  //  }
+  //  else
+  //  {
+  result = m_responsibleForMetaData->freeMetaDataStrings();
+  //  }
+
+
+  ERS_DEBUG(1, "RESP " << m_responsibleForMetaData->identify() << " ;et");
+
+  
+  std::vector<std::string> cleaned_result;
+  
+  std::vector<std::string> reserved;
+  reserved.push_back("Stream=");
+  reserved.push_back("Project=");
+  reserved.push_back("LumiBlock=");
+  reserved.push_back("GUID=");
+  reserved.push_back("Compression=");
+  
+  
+  for (unsigned int i = 0 ; i < result.size(); i++)
+    {
+      //check for Stream
+      
+      int is_reserved = 0;
+      for (unsigned int res = 0 ; res < reserved.size(); res++)
+	{  
+	  std::string ptn = reserved.at(res);
+	  std::string::size_type pos=result.at(i).find(ptn);
+	  if (pos==std::string::npos)
+	    {
+	      //ERS_DEBUG(1, "String " << result.at(i) << "Not reserved");
+	    }
+	  else
+	    {
+	      ERS_DEBUG(1, "String " << result.at(i) << "reserved");
+	      is_reserved=1;
+	    }
+	}
+      if (!is_reserved)
+	cleaned_result.push_back(result.at(i));
+    
+    }
+
+  return cleaned_result;
+
+  
+}
+
+std::string DataReaderController::GUID() const
+{
+  return m_responsibleForMetaData->GUID();
+}
+
+
+
+unsigned int DataReaderController::fileEndDate()
+{
+  return m_responsibleForMetaData->fileEndDate();
+}
+///< Date when writing has stopped.
+unsigned int DataReaderController::fileEndTime() 
+{
+  return m_responsibleForMetaData->fileEndTime();
+}
+///< Time when writing has stopped.
+unsigned int DataReaderController::eventsInFile() 
+{
+  return m_responsibleForMetaData->eventsInFile();
+}
+///< Number of events in this file.
+unsigned int DataReaderController::dataMB_InFile() 
+{
+  return m_responsibleForMetaData->dataMB_InFile();
+}
+///< Number of megabytes in this file.
+unsigned int DataReaderController::eventsInFileSequence() 
+{
+  return m_responsibleForMetaData->eventsInFileSequence();
+}
+///< Number of events in this file sequence written so far.
+
+
+unsigned int DataReaderController::fileSizeLimitInDataBlocks() const
+{
+  return m_responsibleForMetaData->fileSizeLimitInDataBlocks();
+}
+
+unsigned int DataReaderController::fileSizeLimitInMB() const
+{
+  return m_responsibleForMetaData->fileSizeLimitInMB();
+}
+
+std::string  DataReaderController::appName() const 
+{
+  /*if (m_responsibleForMetaData->identify()=="ESLMerge") 
+    {
+    return m_filehandler->getAppName();
+    }
+    else
+  */
+  return m_responsibleForMetaData->appName();
+}
+
+std::string  DataReaderController::fileNameCore() const 
+{
+  /*if (m_responsibleForMetaData->identify()=="ESLMerge")
+    {
+    return m_filehandler->getFileNameCore();
+    }
+    else*/
+  
+  return m_responsibleForMetaData->fileNameCore();
+}
+
+unsigned int DataReaderController::dataMB_InFileSequence() 
+{
+  ERS_DEBUG(1,"DataReaderController::dataMB_InFileSequence called but not implemented.");
+  return 0;
+  //return m_filehandler->getSum();
+}
+
+
+
+
+///< Number of MB in this file sequence written so far. 
+//unsigned int DataReaderController::fileStatusWord() 
+//{
+//  return m_responsibleForMetaData->fileStatusWord();
+//}
+///< Indicates an end of sequence. 
+
+
+std::string DataReaderController::sequenceFileName(bool isReady) const
+{
+  ERS_DEBUG(2,"DataReaderBase::sequenceFileName(...) is called.");
+    
+  daq::RawFileName name(m_fileNameCore, 
+			m_cFileNumber, 
+			isReady?daq::RAWFILENAME_EXTENSION_FINISHED:daq::RAWFILENAME_EXTENSION_UNFINISHED);
+  ERS_DEBUG(2," fileNameCore: " << m_fileNameCore);
+
+  ERS_DEBUG(2,"sequenceFileName returns " << name.fileName());
+  return name.fileName();
+    
+  /**** OLD code here - will be trhown away in due time
+	std::ostringstream n;
+ 
+	n << m_fileNameCore;
+	n << std::setw(m_sizeOfFileNumber) << std::setfill('0');
+	n << m_cFileNumber;
+
+	if(isReady) n << daq::RAWFILENAME_EXTENSION_FINISHED;
+	else n << daq::RAWFILENAME_EXTENSION_UNFINISHED;
+    
+	std::string name = n.str();
+    
+	ERS_DEBUG(2,"sequenceFileName returns " << name);
+	return name;
+
+	End of OLD code
+  ***/
+}
+
+uint32_t DataReaderController::lumiblockNumber()
+{
+  return m_responsibleForMetaData->lumiblockNumber();
+}
+std::string DataReaderController::stream()
+{
+  return m_responsibleForMetaData->stream();
+}
+std::string DataReaderController::projectTag()
+{
+  return m_responsibleForMetaData->projectTag();
+}
+
+
+
+unsigned int DataReaderController::latestDataNumber() const 
+{
+  return 1;
+}
+
+
+//void mythrowE(std::string errormessage)
+//{
+//  FaserEventStorage::ReadingIssue ci(ERS_HERE, errormessage.c_str());
+//  throw ci;
+//}
+
+
diff --git a/Event/FaserEventStorage/src/DataReaderController.h b/Event/FaserEventStorage/src/DataReaderController.h
new file mode 100644
index 00000000..c55745c4
--- /dev/null
+++ b/Event/FaserEventStorage/src/DataReaderController.h
@@ -0,0 +1,122 @@
+#ifndef FASERDATAREADERCONTOLLER_H
+#define FASERDATAREADERCONTOLLER_H
+
+#include <fstream>
+#include <vector>
+#include <stack>
+#include <stdint.h>
+
+#include "FaserEventStorage/DataReader.h"
+#include "FaserEventStorage/EventStorageIssues.h"
+
+namespace DAQFormats {
+  class EventFull;
+}
+class EventStackLayer;
+class fRead;
+class FESLMultiFile;
+
+namespace FaserEventStorage
+{
+  
+  class DataReaderController : public DataReader
+  {
+  public:
+    DataReaderController(fRead *fR, std::string filename); 
+    ~DataReaderController();
+    
+    void initialize();
+    
+    DRError enableSequenceReading();
+    
+    void setPosition(); //sets global position in file
+    int64_t getPosition() const;//gets current position in the file
+    void setPosition(int64_t pos);
+    
+    bool good() const;
+    bool endOfFile() const;
+    bool endOfFileSequence() const;  
+
+    unsigned int currentFileNumber() const; 
+
+    
+    //    DRError getData(unsigned int &eventSize, char **event, int64_t pos , bool memAlreadyAlloc, int64_t allocSizeInBytes );
+    DRError getData(DAQFormats::EventFull*& theEvent);
+    DRError getData(DAQFormats::EventFull*& theEvent, int64_t pos);
+
+    //    DRError getDataPreAlloced(unsigned int &eventSize, char **event, int64_t allocSizeInBytes);
+
+    //DRError getDataPreAllocedWitPos(unsigned int &eventSize, char **event,  int64_t allocSizeInBytes, int64_t pos = -1);
+
+
+    /*methods to delete
+      virtual bool fileWasFound() const = 0; 
+      
+    */
+    
+    unsigned int runNumber() const ;
+    unsigned int maxEvents() const ;
+    unsigned int recEnable() const ;
+    unsigned int triggerType() const ;
+    std::bitset<128> detectorMask() const ;
+    unsigned int beamType() const ;
+    unsigned int beamEnergy() const ;
+    std::string GUID() const;
+    
+    
+    std::vector<std::string> freeMetaDataStrings() const;
+
+    CompressionType compression() const;
+
+    std::string fileName() const;
+    
+    unsigned int fileStartDate() const;
+    unsigned int fileStartTime() const;
+    
+    unsigned int fileEndDate();            ///< Date when writing has stopped.
+    unsigned int fileEndTime() ;             ///< Time when writing has stopped.
+    unsigned int eventsInFile() ;          ///< Number of events in this file.
+    unsigned int dataMB_InFile() ;          ///< Number of megabytes in this file.
+    unsigned int eventsInFileSequence() ;   ///< Number of events in this file sequence written so far.
+    unsigned int dataMB_InFileSequence() ; ///< Number of MB in this file sequence written so far. 
+    //unsigned int fileStatusWord() ;         ///< Indicates an end of sequence.
+
+    unsigned int fileSizeLimitInDataBlocks() const ; 
+    unsigned int fileSizeLimitInMB() const ;
+    std::string appName() const ; 
+    std::string fileNameCore() const ;  
+    
+    uint32_t lumiblockNumber();
+    std::string stream();
+    std::string projectTag();
+
+    unsigned int latestDataNumber() const;
+    
+  private:
+    std::string nextInContinuation(unsigned int expected);
+    std::string sequenceFileName(bool isReady) const;
+
+
+  private:
+    std::stack<EventStackLayer*> m_stack;
+    fRead* m_fR;
+    bool m_sequenceReading; 
+    bool m_finished;
+    FESLMultiFile* m_filehandler; //the file handler //now unused
+    bool m_last_file_finished;
+    EventStackLayer* m_responsibleForMetaData;
+    EventStackLayer* m_markForDeletion;
+    
+    unsigned int m_sizeOfFileNumber;
+    unsigned int m_cFileNumber;
+    std::string m_fileNameCore;
+    std::string m_fileName;
+  };
+  
+  // fRead *fReadFactory();
+}
+
+void mythrowE(std::string errormessage);
+
+#endif 
+
diff --git a/Event/FaserEventStorage/src/ESLMultiFile.cxx b/Event/FaserEventStorage/src/ESLMultiFile.cxx
new file mode 100644
index 00000000..f7378e1f
--- /dev/null
+++ b/Event/FaserEventStorage/src/ESLMultiFile.cxx
@@ -0,0 +1,167 @@
+#include "FaserEventStorage/fRead.h"
+#include "ESLMultiFile.h"
+//#include "ESLMergeFile.h"
+#include "ESLOriginalFile.h"
+#include "DataReaderController.h"
+//#include "MergedRawFile.h"
+#include "EventStorage/RawFileName.h"
+
+FESLMultiFile::FESLMultiFile(fRead* fR) : EventStackLayer(fR) {
+  m_me = "FESLMulti"; 
+  ERS_DEBUG(3, identify() << " Constructor called booya");
+  m_currentFileIndex = 0 ;
+  m_sumsize = 0;
+  m_rawfilename = NULL;
+}  
+
+FESLMultiFile::FESLMultiFile(){ 
+  m_rawfilename = NULL;
+}  
+
+
+//This methods takes the next string from the vector, opens, the file and tries to look at the starting marker. According to this, it decides if the file is an originalfile or a mergefile.
+
+EventStackLayer* FESLMultiFile::openNext()
+{
+  
+  EventStackLayer* nextESL = 0;
+  
+  //m_currentFileIndex++; //this is already done in moreEvents;
+
+ 
+  if ( m_fR->isOpen() ) {
+    ERS_DEBUG(3, " Closing open file ");
+    m_fR->closeFile();
+  }
+
+  std::string next = m_filenames.at(m_currentFileIndex);
+
+  ERS_DEBUG(3, this->identify() << " Trying to open next file: " << next);
+
+  m_fR->openFile(next);
+  
+  ERS_DEBUG(3, this->identify() << " file opened " << next);
+    
+  m_fR->setCurrentEndOfFile(-1);
+
+  ERS_DEBUG(3, this->identify() << " set current end of " << next);
+
+  //m_rawfilename = new daq::RawFileName(next);
+
+  // ET - no marker?
+  //uint32_t marker = m_fR->readuint32_t();
+
+
+  ERS_DEBUG(3, this->identify() << " reading start " << next);
+
+  // ET - comment out everything related to reading file start marker
+  //if ( marker == FILE_START_MARKER) //It's an Original File
+  //  {
+      ERS_DEBUG(1, this->identify() << " found original file");
+
+      FESLOriginalFile* tmpofp = new FESLOriginalFile(m_fR);
+      tmpofp -> setFile(next);
+      tmpofp -> handleOffset();
+      tmpofp -> setResponsibleForMetaData();
+      
+      nextESL = tmpofp;
+  //  }
+  // elseif ( marker == MergedRawFile::FileMarker ) //It's a Merged File
+  //   {
+
+  //     ERS_DEBUG(1, this->identify() << " found merge file");
+
+  //     ESLMergeFile* tmpmf = new ESLMergeFile(m_fR);
+  //     tmpmf -> setFile(next);
+  //     tmpmf -> handleOffset();
+  //     tmpmf -> setResponsibleForMetaData();
+      
+  //     nextESL = tmpmf;
+  //   }
+  // else
+  //   {
+  //     FaserEventStorage::ES_WrongFileFormat ci(ERS_HERE, "file is of no know format. Abort.");
+  //     throw ci;
+      
+  //   }
+  
+  
+  nextESL->prepare();
+
+  // This looks for file-end sequence (which we don't have) 
+  // but it is caught, so OK
+  try
+    {
+      m_sumsize += nextESL->dataMB_InFile();
+    }
+  catch(...)
+    {
+      
+    }
+
+  return nextESL;
+  
+}
+
+bool FESLMultiFile::handlesContinuation()
+{
+  return true;
+}
+
+void FESLMultiFile::prepare()
+{
+  return;
+}
+
+bool FESLMultiFile::doneLoading()
+{
+  //multifile cannot be the last level, since it has to load either the mergefile or the originalfile.
+  return false;
+}
+
+void FESLMultiFile::advance()
+{
+  m_currentFileIndex++;
+  ERS_DEBUG(1, this->identify() << " advancing to next file " << m_currentFileIndex);
+}
+
+bool FESLMultiFile::moreEvents() 
+{
+  ERS_DEBUG(3, this->identify() << " asked for more events ");
+
+
+  if (m_filenames.size() == 0 ) return false;
+  if (m_currentFileIndex > m_filenames.size()-1) 
+    {
+      m_finished = true;
+      return false;
+    }
+  return true;
+}
+
+unsigned int FESLMultiFile::getSum()
+{
+  return m_sumsize;
+  
+}
+
+
+void FESLMultiFile::setContinuationFile(std::string next) 
+{
+  ERS_DEBUG(2, " Pushing : " << next << " on " << identify());
+  m_filenames.push_back(next);
+  ERS_DEBUG(2, " size now : " << m_filenames.size() );
+}
+
+void FESLMultiFile::setFile(std::string filename)
+{
+  m_filenames.push_back(filename);
+}
+
+void FESLMultiFile::setFiles(std::vector<std::string> filenames)
+{
+  m_filenames = filenames;
+}
+
+
+
diff --git a/Event/FaserEventStorage/src/ESLMultiFile.h b/Event/FaserEventStorage/src/ESLMultiFile.h
new file mode 100644
index 00000000..5a810d67
--- /dev/null
+++ b/Event/FaserEventStorage/src/ESLMultiFile.h
@@ -0,0 +1,51 @@
+#ifndef FASERESLMULTIFILE_H
+#define FASERESLMULTIFILE_H
+
+
+#include "FaserEventStorage/fRead.h"
+#include "EventStackLayer.h"
+#include "EventStorage/RawFileName.h"
+#include <vector>
+
+using namespace FaserEventStorage;
+
+class FESLMultiFile : public EventStackLayer
+{
+ protected:
+  FESLMultiFile();
+
+ public:
+  FESLMultiFile(fRead* fR);
+
+  
+  EventStackLayer* openNext();
+  
+  void prepare();
+  bool doneLoading();
+  
+  bool moreEvents() ;
+  bool handlesContinuation()  ;
+
+  void setContinuationFile(std::string next) ;
+
+  void advance();
+
+  unsigned int getSum();
+  
+  //distinct methods
+  void setFile(std::string filename);
+  void setFiles(std::vector<std::string> filenames);
+
+  
+
+ private:
+  std::vector<std::string> m_filenames;
+  unsigned int m_currentFileIndex;
+  unsigned int m_sumsize;
+  daq::RawFileName *m_rawfilename;
+
+};
+
+
+#endif 
+
diff --git a/Event/FaserEventStorage/src/ESLOriginalFile.cxx b/Event/FaserEventStorage/src/ESLOriginalFile.cxx
new file mode 100644
index 00000000..621ed256
--- /dev/null
+++ b/Event/FaserEventStorage/src/ESLOriginalFile.cxx
@@ -0,0 +1,656 @@
+#include "ESLOriginalFile.h"
+#include "FaserEventStorage/EventStorageIssues.h"
+#include "DataReaderController.h"
+//#include "compression/compression.h"
+//#include "compression/DataBuffer.h"
+#include "EventFormats/DAQFormats.hpp"
+
+#include <stdio.h>
+#include <string.h>
+
+FESLOriginalFile::FESLOriginalFile( fRead * m_fR) : EventStackLayer(m_fR)
+{
+  m_me = "FESLOriginal"; 
+
+  ERS_DEBUG(3, identify() << " Constructor called ");
+  
+  uint64_t cpos = m_fR->getPosition();
+  m_fR->setPositionFromEnd(0);
+  m_cfilesize = m_fR->getPosition();
+  m_fR->setPosition(cpos);
+
+  ERS_DEBUG(3, identify() << " File size found: " << m_cfilesize);
+
+  m_endOfFile = false;
+  m_advance_fer_updated = false;
+
+  m_compression = FaserEventStorage::NONE;
+  //m_uncompressed = new compression::DataBuffer();
+
+}
+ 
+FESLOriginalFile::~FESLOriginalFile() 
+{
+  //delete m_uncompressed;
+  ERS_DEBUG(3, identify() <<" destroyed ") ; 
+}
+
+ 
+EventStackLayer* FESLOriginalFile::openNext()
+{
+  return 0;
+  //does nothing
+}
+
+
+//DRError FESLOriginalFile::getData(unsigned int &eventSize, char **event, int64_t pos, bool memAlreadyAlloc, int64_t allocSizeInBytes)
+DRError FESLOriginalFile::getData(DAQFormats::EventFull*& theEvent, int64_t pos)
+{
+  ERS_DEBUG(2,"Entered FESLOriginalFile::getData().");
+  
+  if(pos>0) m_fR->setPosition(pos);
+//uint64_t startofevent = m_fR->getPosition(); // we will need this in case of reading failure.
+
+  // Don't allow stale data
+  if (theEvent != NULL) delete theEvent;
+  theEvent = new DAQFormats::EventFull();
+
+  // Read data header
+  size_t sizeofHeader = theEvent->header_size();
+  char* buffer = new char[sizeofHeader];
+
+  if (NULL == buffer) {
+    ERS_DEBUG(1, " tried to allocate " << theEvent->header_size() << " bytes for header but failed!");
+    FaserEventStorage::ES_AllocatingMemoryFailed ci(ERS_HERE, "FESLOriginalFile tried to allocate memory for header but failed. Abort.");
+      throw ci;
+  }
+
+  // Check if we will read beyond the end of the file
+  uint64_t cpos = m_fR->getPosition();
+  uint64_t remaining = m_cfilesize - cpos;
+  ERS_DEBUG(3, "current position before header " << cpos << " with " << remaining << " remaining") ;
+
+  if (remaining < sizeofHeader) {
+    ERS_DEBUG(1, "Requested" << sizeofHeader
+	      << " bytes for header but only " << remaining << " remain in file!");
+
+    FaserEventStorage::ES_OutOfFileBoundary ci(ERS_HERE, "Trying to read more data for header than remains in the file. This likely means your event is truncated. If you still want to read the data, catch this exception and proceed. The data block contains the rest of the data. ");
+    throw ci;
+
+    // In case this gets caught, but won't work well
+    m_fR->readData(buffer, remaining);
+    theEvent->loadHeader((uint8_t*)buffer, remaining);
+    delete[] buffer;
+    return DRNOOK;
+  }
+
+  m_fR->readData(buffer, sizeofHeader);
+  theEvent->loadHeader((uint8_t*)buffer, sizeofHeader);
+
+  delete[] buffer;
+
+  ERS_DEBUG(2,"DATA HEADER: Expected event size " << theEvent->size());
+
+  // Now we have the event length, create buffer to store this
+  size_t sizeofPayload = theEvent->payload_size();
+  buffer = new char[sizeofPayload];
+
+  if (NULL == buffer) {
+    ERS_DEBUG(1, "Tried to allocate " << sizeofPayload << " bytes for payload but failed!");    
+    FaserEventStorage::ES_AllocatingMemoryFailed ci(ERS_HERE, "FESLOriginalFile tried to allocate memory for payload but failed. Abort.");
+    throw ci;
+  }
+
+  // Check if we will read beyond the end of the file
+  cpos = m_fR->getPosition();
+  ERS_DEBUG(3, "current position before payload " << cpos << " with " << remaining << " remaining");
+  remaining = m_cfilesize - cpos;
+
+  if (remaining < sizeofPayload) {
+    ERS_DEBUG(1, "Requested " << sizeofPayload 
+	      << " bytes for payload but only " << remaining << " remain in file ");
+
+    FaserEventStorage::ES_OutOfFileBoundary ci(ERS_HERE, "Trying to read more data than remains in the file. This could mean that either your event is truncated, or that the event size record of this event is corrupted. If you still want to read the data, catch this exception and proceed. The data block contains the rest of the data. ");
+    throw ci;
+
+    // In case this gets caught, although thee loadPayload will throw its own error
+    m_fR->readData(buffer, remaining);
+    theEvent->loadPayload((uint8_t*)buffer, remaining);
+    delete[] buffer;
+
+    return DRNOOK;
+
+  } else {
+
+    // OK, read event
+    m_fR->readData(buffer, sizeofPayload);
+    theEvent->loadPayload((uint8_t*)buffer, sizeofPayload);
+  
+  }
+  ERS_DEBUG(2, "Event:\n" << *theEvent);
+  
+  ERS_DEBUG(3,"Finished reading the event.");
+
+  // CHECK FOR END OF FILE REACHED
+  // This is not an error
+  if( /*m_fR->isEoF()*/  m_cfilesize<=m_fR->getPosition()) {
+     //isEoF only tells you an end of file if you already hit the eof. it doesn't tell you if ou are exactly at the limit. therefore we check like that
+    ReadingIssue ci(ERS_HERE, "End of file reached after event.");
+    ers::warning(ci);
+    m_endOfFile = true;
+    m_finished = true;
+    
+  }
+
+  return DROK;
+}
+
+
+
+EventStackLayer* FESLOriginalFile::loadAtOffset(int64_t position, EventStackLayer *old)
+{
+  if(old){}; //Avoid compilation warning
+
+  if (m_cfilesize <=  position)
+  {
+ FaserEventStorage::ES_OutOfFileBoundary ci(ERS_HERE, "Trying to jump outside Filesize Boundary. Abort.");
+  throw ci;
+ 
+  }
+  m_fR->setPosition(position);
+  return this;
+}
+
+void FESLOriginalFile::prepare()
+{
+  // ET - Mainly reads metadata.
+  // No metadata, so basically skip this
+
+  /*
+  ERS_DEBUG(2,"Read metadata from the beginning of the file.");
+ 
+  file_start_record tmpfsr = file_start_pattern;
+  tmpfsr.version = 0x0;
+ 
+ 
+  if(unfile_record(&m_latest_fsr,&tmpfsr) == 0) {
+      ERS_DEBUG(2,"File start record not found after fopen.");
+      FaserEventStorage::ES_WrongFileFormat ci(ERS_HERE, "File start record not found after fopen.. FESLOriginalFile reported: File Format is not known. Abort");
+      throw ci;
+  }
+  
+  ERS_DEBUG(2,"File start record found after fopen. version "<< m_latest_fsr.version);
+  
+  m_latest_fns=unfile_name_strings();
+
+  if(m_latest_fns.appName=="there was") {
+    ERS_DEBUG(3,"File name strings not found in file.");     
+    FaserEventStorage::ES_WrongFileFormat ci(ERS_HERE, "FESLOriginalFile reported: File name strings not found in file.");
+    throw ci;
+  } else {
+    ERS_DEBUG(3,"File name strings found.");         
+  }
+
+  readOptionalFreeMetaDataStrings();
+  
+  checkCompression();
+
+  if (m_latest_fsr.version == 0x2) {
+    ERS_DEBUG(3,"Version 2 found. Switching to compability mode.");
+    
+    v2_internal_run_parameters_record v2_internal_rpr;
+    if(unfile_record(&v2_internal_rpr,&v2_run_parameters_pattern) == 0) {
+      ERS_DEBUG(3,"Run parameters record not found in file.");
+      FaserEventStorage::ES_WrongFileFormat ci(ERS_HERE, "FESLOriginalFile reported: Old Run parameters record not found in file.");
+      throw ci;
+    } else {
+      ERS_DEBUG(3,"Run parameters record found.");
+      m_internal_latest_rpr.marker=v2_internal_rpr.marker;              
+      m_internal_latest_rpr.record_size=v2_internal_rpr.record_size;
+      m_internal_latest_rpr.run_number=v2_internal_rpr.run_number;          
+      m_internal_latest_rpr.max_events=v2_internal_rpr.max_events;          
+      m_internal_latest_rpr.rec_enable=v2_internal_rpr.rec_enable;          
+      m_internal_latest_rpr.trigger_type=v2_internal_rpr.trigger_type;        
+      m_internal_latest_rpr.detector_mask_1of4=v2_internal_rpr.detector_mask;
+      m_internal_latest_rpr.detector_mask_2of4=0;
+      m_internal_latest_rpr.detector_mask_3of4=0;
+      m_internal_latest_rpr.detector_mask_4of4=0;
+      m_internal_latest_rpr.beam_type=v2_internal_rpr.beam_type;           
+      m_internal_latest_rpr.beam_energy=v2_internal_rpr.beam_energy;
+    }
+
+  } else if (m_latest_fsr.version == 0x5) {
+    ERS_DEBUG(3,"Version 5 found. Switching to compability mode.");
+
+    v5_internal_run_parameters_record v5_internal_rpr;
+    if(unfile_record(&v5_internal_rpr,&v5_run_parameters_pattern) == 0) {
+      ERS_DEBUG(3,"Run parameters record not found in file.");
+      FaserEventStorage::ES_WrongFileFormat ci(ERS_HERE, "FESLOriginalFile reported: Old Run parameters record not found in file.");
+      throw ci;
+    } else {
+      ERS_DEBUG(3,"Run parameters record found.");
+      m_internal_latest_rpr.marker=v5_internal_rpr.marker;              
+      m_internal_latest_rpr.record_size=v5_internal_rpr.record_size;
+      m_internal_latest_rpr.run_number=v5_internal_rpr.run_number;          
+      m_internal_latest_rpr.max_events=v5_internal_rpr.max_events;          
+      m_internal_latest_rpr.rec_enable=v5_internal_rpr.rec_enable;          
+      m_internal_latest_rpr.trigger_type=v5_internal_rpr.trigger_type;      
+      m_internal_latest_rpr.detector_mask_1of4=v5_internal_rpr.detector_mask_1of2;
+      m_internal_latest_rpr.detector_mask_2of4=v5_internal_rpr.detector_mask_2of2;
+      m_internal_latest_rpr.detector_mask_3of4=0;
+      m_internal_latest_rpr.detector_mask_4of4=0;
+      m_internal_latest_rpr.beam_type=v5_internal_rpr.beam_type;           
+      m_internal_latest_rpr.beam_energy=v5_internal_rpr.beam_energy;
+    }
+
+  } else if (m_latest_fsr.version == 0x6) {
+    ERS_DEBUG(3,"New version found.");
+    
+    if(unfile_record(&m_internal_latest_rpr,&run_parameters_pattern) == 0) {
+      ERS_DEBUG(1,"Run parameters record not found in file.");
+      FaserEventStorage::ES_WrongFileFormat ci(ERS_HERE, "FESLOriginalFile reported: Run parameters record not found in file.");
+      throw ci;
+    } else {
+      ERS_DEBUG(3,"Run parameters record found.");
+    }
+  } else {
+    FaserEventStorage::ES_WrongFileFormat ci(ERS_HERE, "FESLOriginalFile reported: File Format Version is not known. Abort");
+    throw ci;
+  }
+
+  ERS_DEBUG(2,"All metadata OK at the beginning of the file.");
+
+  if(unfile_record(&m_latest_fer,&file_end_pattern) != 0) 
+    {
+      //ERS_WARNING("No event data. This file contains only metadata. "
+      //  <<"End of file metadata found after the run parameters record.");
+      ERS_DEBUG(3,"End Record right after metadata. This OriginalFile contains only metadata.");
+
+      m_endOfFile = true;
+      m_fer_read = true;
+      
+    }
+  */
+  ERS_DEBUG(1,"File " << fileName() << " ready for reading."); 
+ 
+}
+
+bool FESLOriginalFile::doneLoading()
+{
+  return true; //an original file is not further merging anything
+}
+
+
+bool FESLOriginalFile::moreEvents() 
+{
+  ERS_DEBUG(3, m_me <<" more events: "<< (!m_endOfFile && !m_error));
+  return (!m_endOfFile && !m_error);
+}
+
+
+void FESLOriginalFile::readOptionalFreeMetaDataStrings() 
+{
+  ERS_DEBUG(3,"readOptionalFreeMetaDataStrings not implemented!");
+ }
+
+void FESLOriginalFile::checkCompression()
+{
+  // Always none
+  m_compression = FaserEventStorage::NONE;
+  /*
+  std::string comp = extractFromMetaData(FaserEventStorage::compressiontag+"=");
+
+  if(comp != ""){
+    m_compression = string_to_type(comp);
+    ERS_DEBUG(1,"Compressed file found. FMS: "<< comp << " Type: " 
+      << m_compression);
+  }
+  */
+}
+
+
+unsigned int FESLOriginalFile::fileStartDate() const 
+{
+  return m_latest_fsr.date;
+}
+
+unsigned int FESLOriginalFile::fileStartTime() const 
+{
+  return m_latest_fsr.time; 
+}
+
+
+std::vector<std::string> FESLOriginalFile::freeMetaDataStrings() const
+{
+  return m_fmdStrings;
+}
+
+FaserEventStorage::CompressionType FESLOriginalFile::compression() const {
+  return m_compression;
+}
+
+//Run parameter get records
+unsigned int FESLOriginalFile::runNumber() const {
+  return m_internal_latest_rpr.run_number;
+}
+
+     
+unsigned int FESLOriginalFile::maxEvents() const {
+  return  m_internal_latest_rpr.max_events;
+}
+
+     
+unsigned int FESLOriginalFile::recEnable() const {
+  return  m_internal_latest_rpr.rec_enable;
+}
+
+     
+unsigned int FESLOriginalFile::triggerType() const {
+  return m_internal_latest_rpr.trigger_type;
+}
+
+   
+std::bitset<128> FESLOriginalFile::detectorMask() const {
+    
+  uint64_t tmp = m_internal_latest_rpr.detector_mask_4of4;
+  tmp <<= 32;
+  tmp |= m_internal_latest_rpr.detector_mask_3of4;
+  
+  std::bitset<128> mask(tmp);
+  mask <<= 64;
+  
+  tmp = m_internal_latest_rpr.detector_mask_2of4;
+  tmp <<= 32;
+  tmp |= m_internal_latest_rpr.detector_mask_1of4;
+
+  mask |= tmp;
+  return mask;
+}
+
+unsigned int FESLOriginalFile::beamType() const {
+  return m_internal_latest_rpr.beam_type;
+}
+
+unsigned int FESLOriginalFile::beamEnergy() const {
+  return  m_internal_latest_rpr.beam_energy;
+}
+
+
+unsigned int FESLOriginalFile::fileEndDate() 
+{
+
+  if(!m_advance_fer_updated) {
+    m_latest_fer = currentFileFER();
+    m_advance_fer_updated = true;
+  }
+
+  return m_latest_fer.date;
+}
+
+    
+unsigned int FESLOriginalFile::fileEndTime() 
+{
+
+  if(!m_advance_fer_updated) {
+    m_latest_fer = currentFileFER();
+    m_advance_fer_updated = true;
+  }
+
+  return m_latest_fer.time;
+}
+
+    
+// This doesn't really work...
+unsigned int FESLOriginalFile::eventsInFile() 
+{
+
+  if(!m_advance_fer_updated) {
+    m_latest_fer = currentFileFER();
+    m_advance_fer_updated = true;
+  }
+
+  //return m_latest_fer.events_in_file;
+  return 1; // Avoid no events in file error
+}
+
+ 
+unsigned int FESLOriginalFile::dataMB_InFile() 
+{
+
+  if(!m_advance_fer_updated) {
+    m_latest_fer = currentFileFER();
+    m_advance_fer_updated = true;
+  }
+
+  return m_latest_fer.data_in_file;
+}
+
+   
+unsigned int FESLOriginalFile::eventsInFileSequence() 
+{
+
+  if(!m_advance_fer_updated) {
+    m_latest_fer = currentFileFER();
+    m_advance_fer_updated = true;
+  }
+
+  return m_latest_fer.events_in_run; 
+}
+
+  
+unsigned int FESLOriginalFile::dataMB_InFileSequence() 
+{
+
+  if(!m_advance_fer_updated) {
+    m_latest_fer = currentFileFER();
+    m_advance_fer_updated = true;
+  }
+
+  return m_latest_fer.data_in_run;
+}
+
+
+unsigned int FESLOriginalFile::fileSizeLimitInDataBlocks() const 
+{
+  return m_latest_fsr.sizeLimit_dataBlocks; 
+}
+
+unsigned int FESLOriginalFile::fileSizeLimitInMB() const 
+{
+  return m_latest_fsr.sizeLimit_MB; 
+}
+
+std::string FESLOriginalFile::appName() const 
+{
+  return m_latest_fns.appName;
+}
+
+std::string FESLOriginalFile::fileNameCore() const 
+{
+  return m_latest_fns.fileNameCore;
+}
+
+
+
+
+    
+unsigned int FESLOriginalFile::fileStatusWord() 
+{
+
+  if(!m_advance_fer_updated) {
+    m_latest_fer = currentFileFER();
+    m_advance_fer_updated = true;
+  }
+
+  return m_latest_fer.status; 
+}
+
+bool FESLOriginalFile::endOfFileSequence()
+{
+  if (m_error) return true;
+  ERS_DEBUG(3, identify() << " status word has value " << this->fileStatusWord());
+  return this->fileStatusWord();
+
+}
+
+unsigned int FESLOriginalFile::nextInSequence(unsigned int current)
+{
+  return current+1; //stupid, but original file format does not support next/prev
+}
+
+
+file_end_record FESLOriginalFile::currentFileFER() {
+  ERS_DEBUG(3,"FESLOriginalFile::currentFileFER() called.");
+
+  file_end_record cfFER=file_end_pattern;
+  m_advance_fer_updated = true;
+
+  /*
+  int64_t pos = m_fR->getPosition();
+
+  //forward to the end and reverse a bit now and 
+  int64_t back=sizeof(file_end_pattern);
+  m_fR->setPositionFromEndSafe(-back);
+
+  if (unfile_record(&cfFER,&file_end_pattern)!= 0)
+    {
+      m_advance_fer_updated = true;
+    };
+  
+  // rewind back
+  m_fR->setPosition(pos);
+
+  if(cfFER.date==0)
+    {
+      ERS_DEBUG(3,"No end of file record found");
+      FaserEventStorage::ES_NoEndOfFileRecord ci(ERS_HERE, "FESLOriginalFile reported: File end record not found in file. If you still want to read data from this file, either catch these excpetions or don't ask for information inside the EOF Record");
+      throw ci;
+
+    }
+  */
+  return cfFER;
+}
+
+internal_run_parameters_record FESLOriginalFile::getRunParameterrecord()
+{
+  return m_internal_latest_rpr;
+}
+
+std::string FESLOriginalFile::GUID() const 
+{
+  ERS_DEBUG(2,"DataReaderBase::GUID() called.");
+  if(m_fmdStrings.size()==0) {
+    ERS_DEBUG(2,"No metadata strings in this file. Return empty GUID string.");
+    return std::string("");
+  }
+  std::string guid = m_fmdStrings[0];
+  std::string ptn("GUID=");
+  std::string::size_type pos=guid.find(ptn);
+  if(pos==std::string::npos) {
+    ERS_DEBUG(2,"No GUID in metadata strings of this file. Return empty GUID string.");
+    return std::string("");
+  }
+  pos+=ptn.size();
+  guid=guid.substr(pos,guid.size());
+ 
+  ERS_DEBUG(2,"Returning "<<guid);
+  return guid;
+}
+
+uint32_t FESLOriginalFile::lumiblockNumber()
+{
+  ERS_DEBUG(2,"DataReaderBase::lumiblockNumber() called.");
+  std::string lumistring = extractFromMetaData("LumiBlock=");
+  if (lumistring =="")
+    {
+      ERS_DEBUG(2,"No Lumiblock Info found. returning 0");
+      return 0;
+    }
+  std::istringstream i(lumistring);
+  i >> m_lumiblockNumber;
+
+  return m_lumiblockNumber;
+}
+
+std::string FESLOriginalFile::stream()
+{
+  m_stream = extractFromMetaData("Stream=");
+  return m_stream;
+}
+
+std::string FESLOriginalFile::projectTag()
+{
+  m_projectTag = extractFromMetaData("Project=");
+  return m_projectTag;
+}
+
+
+file_name_strings FESLOriginalFile::unfile_name_strings() 
+{
+
+  int64_t pos = m_fR->getPosition();
+
+  uint32_t tst;
+
+  FaserEventStorage::file_name_strings nst;
+  nst.appName="there was"; nst.fileNameCore="a problem";
+
+  m_fR->readData((char *)(&tst),sizeof(uint32_t));
+  if(tst != FaserEventStorage::file_name_strings_marker) {
+    m_fR->setPosition(pos);
+    return nst;
+  }
+
+  uint32_t size=0;
+  m_fR->readData((char *)(&size),sizeof(uint32_t));
+
+  char *csn=new char[size];
+  m_fR->readData(csn,size);
+  std::string name(csn,size);
+  delete [] csn;
+
+  char buf[4];
+  char ns = size % 4;
+  if(ns) m_fR->readData(buf,4-ns);
+
+  m_fR->readData((char *)(&size),sizeof(uint32_t));
+  
+  char *cst=new char[size];
+  m_fR->readData(cst,size);
+  std::string tag(cst,size);
+  delete [] cst;
+
+  ns = size % 4;
+  if(ns) m_fR->readData(buf,4-ns);
+
+  nst.appName = name;
+  nst.fileNameCore = tag;
+
+  return nst;
+}
+
+std::string FESLOriginalFile::extractFromMetaData(std::string token)
+{
+  ERS_DEBUG(2,"DataReaderBase::extractFromMetaData() called: " << token);
+  if(m_fmdStrings.size()==0) 
+    {
+      ERS_DEBUG(2,"No metadata strings in this file. Return empty string");
+      return "";
+    }
+  for (unsigned int i=0; i< m_fmdStrings.size(); i++)
+    {
+      std::string cs = m_fmdStrings.at(i);
+      std::string::size_type pos=cs.find(token);
+      if(pos==std::string::npos) 
+	{ /*not foundokay */}
+      else
+	{
+	  pos+=token.size();
+	  std::string result=cs.substr(pos,cs.size());
+	  return result;
+	}
+    }
+  ERS_DEBUG(2,"No "<< token <<" found in metadata strings of this file. Return emptystring.");
+  return "";
+}
+
diff --git a/Event/FaserEventStorage/src/ESLOriginalFile.h b/Event/FaserEventStorage/src/ESLOriginalFile.h
new file mode 100644
index 00000000..c8570f8f
--- /dev/null
+++ b/Event/FaserEventStorage/src/ESLOriginalFile.h
@@ -0,0 +1,110 @@
+#ifndef ESLORIGINALFILE_H
+#define ESLORIGINALFILE_H
+
+
+#include "EventStackLayer.h"
+#include "FaserEventStorage/fRead.h"
+
+using namespace FaserEventStorage;
+
+// Forward declaration
+namespace DAQFormats {
+  class EventFull;
+}
+
+class FESLOriginalFile : public EventStackLayer
+{
+
+ public:
+  FESLOriginalFile( fRead * fR);
+  ~FESLOriginalFile( );
+
+  EventStackLayer* openNext();
+  EventStackLayer* loadAtOffset(int64_t position, EventStackLayer *old);
+  
+  void prepare();
+  bool doneLoading();
+
+  //DRError getData(unsigned int &eventSize, char **event, int64_t pos, bool memAlreadyAlloc, int64_t allocSizeInBytes);
+  DRError getData(DAQFormats::EventFull*& theEvent, int64_t pos);
+  
+  bool moreEvents() ;
+  //bool handlesOffset() ;
+  //bool handlesContinuation() ;
+  //std::string nextInContinuation() ;
+  //bool endOfFileSequence() ;
+
+
+  //additonal
+  internal_run_parameters_record getRunParameterrecord();
+
+  std::string GUID() const;
+  
+  unsigned int runNumber() const ;
+  unsigned int maxEvents() const ;
+  unsigned int recEnable() const ;
+  unsigned int triggerType() const ;
+  std::bitset<128> detectorMask() const ;
+  unsigned int beamType() const ;
+  unsigned int beamEnergy() const ;
+  std::vector<std::string> freeMetaDataStrings() const;
+  CompressionType compression() const;
+
+  unsigned int fileStartDate() const ;
+  unsigned int fileStartTime() const; 
+  
+  unsigned int fileEndDate() ;
+  unsigned int fileEndTime() ;
+  unsigned int eventsInFile() ;
+  unsigned int dataMB_InFile() ;
+  unsigned int eventsInFileSequence() ;
+  unsigned int dataMB_InFileSequence();
+  unsigned int fileStatusWord();
+  bool endOfFileSequence() ;
+  unsigned int nextInSequence(unsigned int current) ;
+
+  uint32_t lumiblockNumber();
+  std::string stream();
+  std::string projectTag();
+
+  unsigned int fileSizeLimitInDataBlocks() const ; 
+  unsigned int fileSizeLimitInMB() const ;
+  std::string appName() const ; 
+  std::string fileNameCore() const ;  
+  
+
+
+  
+ private:
+  void readOptionalFreeMetaDataStrings();
+  void checkCompression();
+  file_end_record currentFileFER();
+  
+  file_name_strings m_latest_fns;
+  
+  bool m_endOfFile;
+  
+  int64_t m_cfilesize;
+  
+  file_start_record m_latest_fsr;
+  data_separator_record m_latest_dsr;
+  
+  file_end_record m_latest_fer;
+  bool m_advance_fer_updated ;
+  uint32_t m_lumiblockNumber;
+  std::string m_stream;
+  std::string m_projectTag;
+
+  file_name_strings unfile_name_strings();
+  
+  FaserEventStorage::freeMetaDataStrings m_fmdStrings;
+  internal_run_parameters_record m_internal_latest_rpr;
+
+  std::string extractFromMetaData(std::string token);
+  
+  FaserEventStorage::CompressionType m_compression;
+  //compression::DataBuffer * m_uncompressed;
+};
+
+
+#endif
diff --git a/Event/FaserEventStorage/src/EventStackLayer.cxx b/Event/FaserEventStorage/src/EventStackLayer.cxx
new file mode 100644
index 00000000..23dbc99f
--- /dev/null
+++ b/Event/FaserEventStorage/src/EventStackLayer.cxx
@@ -0,0 +1,281 @@
+#include "ers/ers.h"
+#include <fstream>
+#include <vector>
+#include <stack>
+#include "EventStackLayer.h"
+#include "DataReaderController.h"
+#include "FaserEventStorage/EventStorageIssues.h"
+
+#include "EventFormats/DAQFormats.hpp"
+
+EventStackLayer::EventStackLayer( fRead* fR )
+{
+  //by default, this just sets the fileReader
+  ERS_DEBUG(2,"EventStackLayer gets fRead Object ");
+  m_fR = fR;
+  m_handleCont=false;
+  m_handleOffs=false;
+  m_responsibleMetaData=false;
+  m_finished = false;
+  m_error = false;
+  m_caller = NULL;
+}
+
+bool EventStackLayer::finished()
+{
+  return m_finished;
+}
+
+void EventStackLayer::advance()
+{
+
+}
+
+
+DRError EventStackLayer::getData(DAQFormats::EventFull*& theEvent, int64_t pos)
+{
+  if (theEvent){};
+  std::ostringstream os;
+  os << "EventStackLayerinterface::getData() was called, "
+     << " but should not have been called for this type of file!" 
+     << " position: " << pos ;  
+  
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, os.str().c_str());
+  throw ci;
+
+  return DRNOOK;
+}
+
+EventStackLayer* EventStackLayer::openNext() 
+{ 
+  return 0; 
+}
+
+
+EventStackLayer*
+EventStackLayer::loadAtOffset(int64_t position, EventStackLayer *old) 
+{ 
+  (void)old;
+  if (position < 0) ERS_DEBUG(2," called with negative position!");
+  return 0; 
+}
+
+bool EventStackLayer::handlesOffset() 
+{ 
+  return m_handleOffs; 
+}
+
+bool EventStackLayer::handlesContinuation() 
+{ 
+  return m_handleCont; 
+} 
+
+// std::string EventStackLayer::nextInContinuation() 
+//{ 
+//return "";
+//} 
+
+
+bool EventStackLayer::endOfFileSequence() 
+{ 
+  return true; 
+}
+
+void EventStackLayer::setContinuationFile(std::string next)
+{
+  if ( next == "blabla" ) ERS_DEBUG(2, " this is a blabla test");
+}
+
+void EventStackLayer::setFile( std::string filename)
+{
+  ERS_DEBUG(3, " SETTING filename " << filename);
+  m_currentFile = filename;
+}
+
+std::string EventStackLayer::fileName() 
+{ 
+  return m_currentFile;
+} 
+
+bool EventStackLayer::responsibleforMetaData()
+{
+  return m_responsibleMetaData;
+}
+
+void EventStackLayer::setResponsibleForMetaData()
+{
+  m_responsibleMetaData=true;
+}
+
+std::string EventStackLayer::GUID() const
+{
+  return "";
+}
+
+void EventStackLayer::handleContinuation() 
+{
+  m_handleCont=true;
+}
+
+
+unsigned int EventStackLayer::nextInSequence(unsigned int current) 
+{
+  std::ostringstream os;
+  os << "EventStackLayerinterface::getData() was called, "
+     << " but should not have been called for this type of file!" 
+     << " Current index: " << current;
+
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, os.str().c_str());
+  throw ci;
+
+  return 0;
+}
+
+
+
+void EventStackLayer::handleOffset() 
+{
+  m_handleOffs=true;
+}
+
+unsigned int EventStackLayer::runNumber() const { FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci;return 0;}
+unsigned int EventStackLayer::maxEvents() const {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}
+unsigned int EventStackLayer::recEnable() const {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci;return 0;}
+unsigned int EventStackLayer::triggerType() const {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}
+std::bitset<128>     EventStackLayer::detectorMask() const {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}
+unsigned int EventStackLayer::beamType() const { FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}
+unsigned int EventStackLayer::beamEnergy() const {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}
+std::vector<std::string> EventStackLayer::freeMetaDataStrings() const { 
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; 
+  std::vector<std::string> empty_vec;
+  return empty_vec;
+}
+
+FaserEventStorage::CompressionType EventStackLayer::compression() const{
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; 
+  return FaserEventStorage::NONE;
+}
+
+unsigned int EventStackLayer::fileStartDate() const { FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0; }
+unsigned int EventStackLayer::fileStartTime() const { FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0; }
+
+unsigned int EventStackLayer::fileEndDate() {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}      ///< Date when writing has stopped.
+unsigned int EventStackLayer::fileEndTime() {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}             ///< Time when writing has stopped.
+unsigned int EventStackLayer::eventsInFile() {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}           ///< Number of events in this file.
+unsigned int EventStackLayer::dataMB_InFile() {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}           ///< Number of megabytes in this file.
+unsigned int EventStackLayer::eventsInFileSequence() {FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0;}    ///< Number of events in this file sequence written so far.
+// unsigned int EventStackLayer::dataMB_InFileSequence() {mythrowE("ESL Interface called for metadata. Abort"); return 0;}   ///< Number of MB in this file sequence written so far. 
+// unsigned int EventStackLayer::fileStatusWord() {throw 14; return 0;}          ///< Indicates an end of sequence. 
+
+
+unsigned int EventStackLayer::fileSizeLimitInDataBlocks() const
+{
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci;
+  return 0;
+}
+
+unsigned int EventStackLayer::fileSizeLimitInMB() const
+{
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci;
+  return 0;
+}
+
+std::string  EventStackLayer::appName() const 
+{
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci;
+  return "";
+}
+
+std::string  EventStackLayer::fileNameCore() const 
+{
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci;
+  return "";
+}
+
+unsigned int EventStackLayer::dataMB_InFileSequence() 
+{
+  FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci;
+  return 0;
+}
+
+
+
+
+uint32_t EventStackLayer::lumiblockNumber() 
+{FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return 0; }
+
+std::string EventStackLayer::stream() 
+{FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return ""; }
+
+std::string EventStackLayer::projectTag()
+{FaserEventStorage::ES_InternalError ci(ERS_HERE, "ESL Interface called for metadata. This should not happen. Abort.");
+  throw ci; return ""; }
+
+
+
+int EventStackLayer::unfile_record(void *ri, const void *pi) 
+{
+  ERS_DEBUG(3,"UNFILE RECORD called ");
+  uint32_t *record = (uint32_t *)ri;
+  uint32_t *pattern = (uint32_t *)pi;
+  int size=pattern[1];
+  ERS_DEBUG(3,"reading record of size "<< size);
+  int64_t pos = m_fR->getPosition();
+
+  for(int i=0; i<size; i++) 
+    {
+      ERS_DEBUG(3,"READING ");
+      if(pattern[i] != 0) 
+{
+  uint32_t tst=0;
+  m_fR->readData((char *)(&tst),sizeof(uint32_t));
+  ERS_DEBUG(3,"GOT "<< tst << " vs " <<  pattern[i] <<" expected");
+  if(not (tst==pattern[i])) 
+    {
+      m_fR->setPosition(pos);
+      return 0;
+    }
+} 
+      else 
+{
+  m_fR->readData((char *)(record+i),sizeof(uint32_t));
+  ERS_DEBUG(3,"GOT " << *(record+i));
+}
+    }
+  return size;
+}
+
+void EventStackLayer::setCaller(EventStackLayer* caller)
+{
+m_caller = caller;
+}
+
+EventStackLayer* EventStackLayer::getCaller()
+{
+return m_caller;
+}
+
+
diff --git a/Event/FaserEventStorage/src/EventStackLayer.h b/Event/FaserEventStorage/src/EventStackLayer.h
new file mode 100644
index 00000000..138f88ae
--- /dev/null
+++ b/Event/FaserEventStorage/src/EventStackLayer.h
@@ -0,0 +1,164 @@
+#ifndef FASEREVENTSTACKLAYER_H
+#define FASEREVENTSTACKLAYER_H
+
+#include "ers/ers.h"
+#include <fstream>
+#include <vector>
+#include <stack>
+#include <bitset>
+#include "FaserEventStorage/DRError.h"
+#include "FaserEventStorage/fRead.h"
+#include "FaserEventStorage/DRError.h"
+#include "FaserEventStorage/EventStorageRecords.h"
+#include "EventStorage/RawFileName.h"
+#include "FaserEventStorage/ESCompression.h"
+
+#include "EventStorageInternalRecords.h"
+
+namespace DAQFormats {
+class EventFull;
+}
+
+using namespace FaserEventStorage;
+
+
+class EventStackLayer //=ESL henceforward
+{
+ protected:
+ EventStackLayer(): 
+  m_fR(NULL),
+    m_caller(NULL)
+      {}
+
+ public:
+  EventStackLayer( fRead* fR ) ;
+  
+  virtual ~EventStackLayer() {};
+  
+  virtual std::string identify() {return m_me;}
+  
+  //virtual DRError getData(unsigned int &eventSize, char **event, int64_t pos, bool memAlreadyAlloc, int64_t allocSizeInBytes);
+  virtual DRError getData(DAQFormats::EventFull*& theEvent, int64_t pos);
+  
+  //the interface to instantiate a son-ESL instance.
+  //e.g. MergeFileReader Instantiates an Originalfilereader
+  virtual EventStackLayer* openNext();
+  
+  
+  //the instance that can handle offsets also needs to be able to "load" a new original file.
+  virtual EventStackLayer* loadAtOffset(int64_t position, EventStackLayer *old);
+  
+  
+  //the interface to prepare a recently instantiated ESL
+  //this should parse the header (if any), so that either data can be read, or openNext() can be called
+  virtual void prepare() = 0 ;
+  
+  //tells the caller if the instance is ready for data to be read. If true is given, the caller can start with getData. If false is given, openNext() should be called, so the current instance can create an Object to be put on the stack.
+  virtual bool doneLoading() = 0 ;
+  
+  
+  //tells the caller if more events can be read from this instance. 
+  // - true should be returned if this is an Originalfile and reading is not finished. 
+  // - True should be returned by MergeFileHandler and MultiFileHand have more Originalfiles or MergeFiles to load
+  // - False should be returned if a Originalfile reader reached the end of the originalfile, or the Mergefilereader has no more Originalfiles or the MultiFilereader is out of files.
+  virtual bool moreEvents() = 0 ;
+  
+  
+  //this tells the caller if the instance handles offsets inside files. This is important for the get/set Position stuff. If a setPosition is called, the stack will be emptied until an instance is found which can handle offsets. Returns true for mergefilereader and false for multifile. If Multifilereader loads originalfiles directly, Originalfile handles offsets.
+  virtual bool handlesOffset();
+  
+  //tells the caller if continuation is handled by this instance on the stack
+  virtual bool handlesContinuation();
+  
+  //if the intance can handle continuation, it needs to provide a ressource, e.g. a filename string to the loader. E.g. Multifilehandler is finished with a file, and it asks the old file which is the next
+  //virtual std::string nextInContinuation() ;
+  
+  //tells if the sequence is at an end
+  virtual bool endOfFileSequence() ;
+  
+  //sets the next "file" to be opened (by Mutifilereader)
+  virtual void setContinuationFile(std::string next);
+  
+  virtual void setFile( std::string filename);
+  
+  virtual std::string fileName();
+  
+  //A ESl can be asked id it is rsponsible for metadata responsibiliry
+  virtual bool responsibleforMetaData();
+  
+  virtual void setResponsibleForMetaData();
+  
+  virtual std::string GUID() const;
+  
+  virtual bool finished();
+  virtual void advance();
+  
+  void handleContinuation() ;
+  virtual unsigned int nextInSequence(unsigned int current) ;
+  
+  
+  void handleOffset() ;
+  
+  //Run parameter get records
+  virtual unsigned int runNumber() const;
+  virtual unsigned int maxEvents() const;
+  virtual unsigned int recEnable() const ;
+  virtual unsigned int triggerType() const;
+  virtual std::bitset<128> detectorMask() const ;
+  virtual unsigned int beamType() const ;
+  virtual unsigned int beamEnergy() const;
+  virtual std::vector<std::string> freeMetaDataStrings() const;
+  virtual CompressionType compression() const;
+  
+  virtual unsigned int fileStartDate() const;
+  virtual unsigned int fileStartTime() const;
+
+  virtual unsigned int fileEndDate();             ///< Date when writing has stopped.
+  virtual unsigned int fileEndTime();             ///< Time when writing has stopped.
+  virtual unsigned int eventsInFile();           ///< Number of events in this file.
+  virtual unsigned int dataMB_InFile();           ///< Number of megabytes in this file.
+  virtual unsigned int eventsInFileSequence();    ///< Number of events in this file sequence written so far.
+
+  virtual unsigned int fileSizeLimitInDataBlocks() const ; 
+  virtual unsigned int fileSizeLimitInMB() const ;
+  virtual std::string appName() const ; 
+  virtual std::string fileNameCore() const ;  
+
+  virtual unsigned int dataMB_InFileSequence();   ///< Number of MB in this file sequence written so far. 
+  //virtual unsigned int fileStatusWord();          ///< Indicates an end of sequence. 
+  
+  virtual uint32_t lumiblockNumber();
+  virtual std::string stream();
+  virtual std::string projectTag();
+  
+  virtual void setCaller(EventStackLayer* caller);
+  virtual EventStackLayer* getCaller();
+
+  
+ protected:
+  //This is the raw file access reader
+  //it is assigned in the constructor
+  fRead* m_fR;
+  
+  EventStackLayer* m_caller;
+  
+  bool m_finished;
+  bool m_error;
+  
+  std::string m_me;
+  bool m_handleCont;
+  bool m_handleOffs;
+  
+  bool m_responsibleMetaData;
+  std::string m_currentFile;
+  
+  //unfile record is used by the inheriting classes
+  //to read data from the file
+  int unfile_record(void *ri, const void *pi);
+  
+};
+
+
+
+#endif 
+
diff --git a/Event/FaserEventStorage/src/EventStorageInternalRecords.h b/Event/FaserEventStorage/src/EventStorageInternalRecords.h
new file mode 100644
index 00000000..c0e5f35b
--- /dev/null
+++ b/Event/FaserEventStorage/src/EventStorageInternalRecords.h
@@ -0,0 +1,91 @@
+
+#ifndef FASEREVENTSTORAGE_INTERNAL_RECORDS_H
+#define FASEREVENTSTORAGE_INTERNAL_RECORDS_H
+
+
+namespace FaserEventStorage {
+  
+  struct internal_run_parameters_record {
+    uint32_t marker;              
+    uint32_t record_size;         
+    uint32_t run_number;          
+    uint32_t max_events;          
+    uint32_t rec_enable;          
+    uint32_t trigger_type;        
+    uint32_t detector_mask_1of4;
+    uint32_t detector_mask_2of4;
+    uint32_t detector_mask_3of4;
+    uint32_t detector_mask_4of4;
+    uint32_t beam_type;           
+    uint32_t beam_energy;         
+  };
+
+  struct v5_internal_run_parameters_record {
+    uint32_t marker;              
+    uint32_t record_size;         
+    uint32_t run_number;          
+    uint32_t max_events;          
+    uint32_t rec_enable;          
+    uint32_t trigger_type;        
+    uint32_t detector_mask_1of2;
+    uint32_t detector_mask_2of2;
+    uint32_t beam_type;           
+    uint32_t beam_energy;         
+  };
+
+  struct v2_internal_run_parameters_record {
+    uint32_t marker;              
+    uint32_t record_size;         
+    uint32_t run_number;          
+    uint32_t max_events;          
+    uint32_t rec_enable;          
+    uint32_t trigger_type;        
+    uint32_t detector_mask;
+    uint32_t beam_type;           
+    uint32_t beam_energy;         
+  };
+
+  
+  const internal_run_parameters_record run_parameters_pattern = {
+    RUN_PARAMETERS_MARKER,
+    sizeof(internal_run_parameters_record)/sizeof(uint32_t),
+    0,    
+    0,    
+    0,    
+    0,
+    0,
+    0,
+    0, 
+    0,
+    0,     
+    0
+  };   
+
+  const v2_internal_run_parameters_record v2_run_parameters_pattern = {
+    RUN_PARAMETERS_MARKER,
+    sizeof(v2_internal_run_parameters_record)/sizeof(uint32_t),
+    0,    
+    0,    
+    0,  
+    0, 
+    0,
+    0,     
+    0
+  };   
+
+  const v5_internal_run_parameters_record v5_run_parameters_pattern = {
+    RUN_PARAMETERS_MARKER,
+    sizeof(v5_internal_run_parameters_record)/sizeof(uint32_t),
+    0,    
+    0,    
+    0,  
+    0, 
+    0,
+    0,
+    0,     
+    0
+  };   
+
+}
+
+#endif
diff --git a/Event/FaserEventStorage/src/EventStorageRecords.cxx b/Event/FaserEventStorage/src/EventStorageRecords.cxx
new file mode 100644
index 00000000..80174463
--- /dev/null
+++ b/Event/FaserEventStorage/src/EventStorageRecords.cxx
@@ -0,0 +1,59 @@
+//
+// functions to convert records to strings
+// for debugging 
+// 
+#include <sstream>
+
+#include "FaserEventStorage/EventStorageRecords.h"
+
+std::string FaserEventStorage::string_record(void *ri, const void *pi) {
+
+  std::ostringstream s;
+  
+  uint32_t *record = (uint32_t *)ri;
+  uint32_t *pattern = (uint32_t *)pi;
+  int size=pattern[1];
+
+  for(int i=0; i<size; i++) {
+    if(pattern[i] != 0) {
+      s << std::hex << pattern[i] << std::dec << " ";
+    } else {
+      s << record[i] << " ";
+    }
+  }
+  
+  std::string rs = s.str();   
+  return rs;    
+}
+
+std::string FaserEventStorage::string_record(FaserEventStorage::file_name_strings nst) {
+  
+  std::ostringstream s;
+
+  s << std::hex << FaserEventStorage::file_name_strings_marker << std::dec;
+
+  s << " " << nst.appName.size();
+  s << " " << nst.appName;
+
+  char ns = nst.appName.size() % 4;
+  if(ns) s.write("____",4-ns);
+
+  s << " " << nst.fileNameCore.size();
+  s << " " << nst.fileNameCore;
+
+  ns = nst.fileNameCore.size() % 4;
+  if(ns) s.write("____",4-ns);
+
+  std::string rs = s.str();   
+  return rs;    
+
+}
+
+void FaserEventStorage::reset_record(void *ri, const void *pi) {
+
+  uint32_t *record = (uint32_t *)ri;
+  uint32_t *pattern = (uint32_t *)pi;
+  int size=pattern[1];
+
+  for(int i=0; i<size; i++) record[i] = pattern[i];
+}
diff --git a/Event/FaserEventStorage/src/RawFileName.cxx b/Event/FaserEventStorage/src/RawFileName.cxx
new file mode 100644
index 00000000..728445a8
--- /dev/null
+++ b/Event/FaserEventStorage/src/RawFileName.cxx
@@ -0,0 +1,738 @@
+#include "FaserEventStorage/RawFileName.h"
+#include "FaserEventStorage/EventStorageIssues.h"
+//-----------------
+// includes for ers
+#include "ers/ers.h"
+//-----------------
+
+#include <iostream>
+#include <sstream>
+#include <iomanip>
+#include <boost/tokenizer.hpp>
+
+
+namespace daq {
+
+  /**
+   * Contructor with ingredients given
+   */
+  RawFileName::RawFileName(std::string ProjectTag,
+			   unsigned int RunNumber,
+			   std::string StreamType,
+			   std::string StreamName,
+			   unsigned int LumiBlockNumber,
+			   std::string ApplicationName,
+			   std::string ProductionStep,
+			   std::string DataType,
+			   unsigned int FileSequenceNumber,
+			   std::string Extension): m_core_known(false), 
+						   m_trailer_known(false) 
+  {
+    ERS_DEBUG(1," Constructor with explicit fields");
+
+    buildFileName(ProjectTag,
+		  RunNumber,
+		  StreamType,
+		  StreamName,
+		  LumiBlockNumber,
+		  ApplicationName,
+		  ProductionStep,
+		  DataType,
+		  FileSequenceNumber,
+		  Extension);
+  }
+
+  /**
+   * Constructor with the FileNameCore, a FileSequenceNumber and 
+   * the Extension only - 
+   *  Does not alter the FileNameCore, just attaches trailer fields 
+   *  to the fileNameCore; also, tries to interpret the resulting filename
+   *  Note: delimiter must be inside the Extension (e.g., ".data")
+   */
+  RawFileName::RawFileName(std::string FileNameCore,
+			   unsigned int FileSequenceNumber,
+			   std::string Extension): m_core_known(false), 
+						   m_trailer_known(false)
+  {
+    ERS_DEBUG(1," Constructor with fileNameCore, sequenceNumber & extension");
+
+    setDefaults(); // in case the file name is not interpretable
+
+    buildFileNameTrailers(FileNameCore, 
+			  FileSequenceNumber,
+			  Extension);
+    
+    m_core_known = interpretFileName(m_fileName);
+  }
+    
+  
+  /**
+   * Contructor with just the filename given: for interpretation
+   */
+  RawFileName::RawFileName(std::string FileName): m_core_known(false), 
+						  m_trailer_known(false)
+  {
+    ERS_DEBUG(1," Constructor with fileName only, for interpretation");
+
+    setDefaults(); // in case the file name is not interpretable
+    
+    m_fileName = FileName;
+    m_fileNameCore = m_fileName; // can not know any better now... 
+
+    m_core_known = interpretFileName(m_fileName); //if OK, made m_fileNameCore
+  }
+
+  /**
+   * Destructor
+   */
+  RawFileName::~RawFileName(){
+    ERS_DEBUG(1," Destructor!");
+  }
+  
+
+
+  std::string RawFileName::getCurrentFileName(bool writing)
+  {
+    if (writing)
+      setTailers(m_fileSequenceNumber, RAWFILENAME_EXTENSION_UNFINISHED);
+    else
+      setTailers(m_fileSequenceNumber, RAWFILENAME_EXTENSION_FINISHED);
+    
+    return fileName();
+  }
+
+
+  std::string RawFileName::getCoreName()
+  {
+    return m_fileNameCore;
+  }
+
+  unsigned int RawFileName::getIndex()
+  {
+    return m_fileSequenceNumber;
+  }
+  
+  
+  void RawFileName::fileAlreadyExists()
+  {
+    m_fileSequenceNumber+=100;
+    
+  }
+  
+  void RawFileName::advance()
+  {
+    m_fileSequenceNumber+=1;
+    
+  }
+
+
+
+
+  /**
+   * given the ingedients, contruct the fileName
+   */
+  void RawFileName::buildFileName(std::string ProjectTag,
+				  unsigned int RunNumber,
+				  std::string StreamType,
+				  std::string StreamName,
+				  unsigned int LumiBlockNumber,
+				  std::string ApplicationName,
+				  std::string ProductionStep,
+				  std::string DataType,
+				  unsigned int FileSequenceNumber,
+				  std::string Extension) 
+  {
+    buildFileNameCore(ProjectTag,
+		      RunNumber,
+		      StreamType,
+		      StreamName,
+		      LumiBlockNumber,
+		      ApplicationName,
+		      ProductionStep,
+		      DataType);
+
+    buildFileNameTrailers(m_fileNameCore, // result of buildFileNameCore() 
+			  FileSequenceNumber,
+			  Extension);
+    
+    return;
+  }
+  
+  /**
+   * given the ingedients, contruct the fileNameCore 
+   * and set m_core_known = true
+   */
+  void RawFileName::buildFileNameCore(std::string ProjectTag,
+				      unsigned int RunNumber,
+				      std::string StreamType,
+				      std::string StreamName,
+				      unsigned int LumiBlockNumber,
+				      std::string ApplicationName,
+				      std::string ProductionStep,
+				      std::string DataType)
+  {
+    if (ProjectTag == "") { ProjectTag = "data_test"; } // default
+    m_project = ProjectTag;
+    m_runNumber = RunNumber;
+    m_streamType = StreamType;
+    m_streamName = StreamName;
+
+    std::ostringstream stream;
+    stream << m_streamType << "_" << m_streamName;
+    m_stream = stream.str();
+    
+    m_lumiBlockNumber = LumiBlockNumber;
+    m_applicationName = ApplicationName;
+    m_productionStep = ProductionStep;
+    m_dataType = DataType;
+    
+    std::ostringstream n;
+    n << ProjectTag << RAWFILENAME_DELIMITER; 
+    n << std::setw(RAWFILENAME_RUN_NUMBER_LENGTH) 
+      << std::setfill('0');
+    n << RunNumber << RAWFILENAME_DELIMITER;
+    n << StreamType << "_";
+    n << StreamName << RAWFILENAME_DELIMITER;
+    n << ProductionStep << RAWFILENAME_DELIMITER;
+    n << DataType;
+    m_datasetName = n.str();
+
+    n << RAWFILENAME_DELIMITER << "_lb";
+    n << std::setw(RAWFILENAME_LB_NUMBER_LENGTH) 
+      << std::setfill('0');
+    n << LumiBlockNumber << RAWFILENAME_DELIMITER;
+    n << "_" << ApplicationName;
+
+    m_fileNameCore = n.str();
+
+    m_core_known = true; // even the fileNameCore is OK to handle fileName
+  }
+  
+
+  /**
+   * construct a complete FileName, by appending a FileSequenceNumber and 
+   * an Extension to the given FileNameCore
+   * and set m_trailer_known = true
+   */
+  void RawFileName::buildFileNameTrailers(std::string FileNameCore, 
+					  unsigned int FileSequenceNumber,
+					  std::string Extension) 
+  {
+    m_fileNameCore = FileNameCore;
+    m_fileSequenceNumber = FileSequenceNumber;
+    m_extension = Extension;
+    
+    std::ostringstream n;
+    n << FileNameCore;
+    n << RAWFILENAME_DELIMITER
+      << "_"
+      << std::setw(RAWFILENAME_FILE_NUMBER_LENGTH) 
+      << std::setfill('0');
+    n << FileSequenceNumber;
+    if ( Extension != "" ) {
+      if (Extension.c_str()[0] != RAWFILENAME_DELIMITER.c_str()[0])
+	{
+	  n << RAWFILENAME_DELIMITER << Extension;
+	  m_extension = RAWFILENAME_DELIMITER + Extension;
+	} 
+      else 
+	{
+	  n << Extension; // delimiter is already in Extension
+	}
+    }
+    m_fileName = n.str();
+    
+    m_trailer_known = true;
+  }
+
+  /**
+   * Default values for the filename fields 
+   * If filename is valid, the correct values will be returned when asked.
+   */
+  void RawFileName::setDefaults() {
+    m_project            = RAWFILENAME_DEFAULT_STRING;
+    m_runNumber          = RAWFILENAME_DEFAULT_UINT;
+    m_streamType         = RAWFILENAME_DEFAULT_STRING;
+    m_streamName         = RAWFILENAME_DEFAULT_STRING;
+    m_stream             = RAWFILENAME_DEFAULT_STRING;
+    m_lumiBlockNumber    = RAWFILENAME_DEFAULT_UINT;
+    m_applicationName    = RAWFILENAME_DEFAULT_STRING;
+    m_productionStep     = RAWFILENAME_DEFAULT_STRING;
+    m_dataType           = RAWFILENAME_DEFAULT_STRING;
+    m_fileSequenceNumber = RAWFILENAME_DEFAULT_UINT;
+    m_extension          = RAWFILENAME_DEFAULT_STRING;
+
+    
+    m_fileNameCore       = RAWFILENAME_DEFAULT_STRING;
+    m_fileName           = RAWFILENAME_DEFAULT_STRING;
+
+    m_datasetName        = RAWFILENAME_DEFAULT_STRING;
+
+    m_core_known         = false;
+    m_trailer_known      = false;
+  }
+
+  /**
+   * Modify the File Trailer fileds (FileSequence Number and  Extension)
+   */
+  void RawFileName::setTailers(unsigned int fsn_i, std::string extension_s) 
+  {
+    m_fileSequenceNumber = fsn_i;
+    m_extension = extension_s;
+    
+    buildFileNameTrailers(m_fileNameCore,
+			  m_fileSequenceNumber,
+			  m_extension);
+    
+    m_core_known = interpretFileName(m_fileName);
+  }
+
+  /**
+   * Modify the FileSequenceNumber at the file trailer fields
+   */
+  void RawFileName::setFileSequenceNumber( unsigned int fsn_i ) 
+  {
+    m_fileSequenceNumber = fsn_i;
+    if ( !m_trailer_known ) {
+      m_extension = RAWFILENAME_DEFAULT_STRING;
+    }
+    
+    buildFileNameTrailers(m_fileNameCore,
+			  m_fileSequenceNumber,
+			  m_extension);
+    
+    m_core_known = interpretFileName(m_fileName);
+  }
+
+  /**
+   * Modify the File Extension at the file trailer fields
+   */
+  void RawFileName::setExtension( std::string extension_s ) 
+  {
+    m_extension = extension_s;
+    if ( !m_trailer_known ) {
+      m_fileSequenceNumber = RAWFILENAME_DEFAULT_UINT;
+      std::string mystream = "File Sequence number not known. Set this first, before trying to set the extension";
+      FaserEventStorage::RawFileNameIssue myissue(ERS_HERE, mystream.c_str() );
+      throw myissue;
+    }
+    
+    buildFileNameTrailers(m_fileNameCore,
+			  m_fileSequenceNumber,
+			  m_extension);
+    
+    m_core_known = interpretFileName(m_fileName);
+  }
+
+
+  /**
+   * given the fileName, reconstruct the ingredients
+   */
+  bool RawFileName::interpretFileName(std::string FileName)
+  {
+
+    ERS_DEBUG(1," interpretFileName: " << FileName 
+	      << "  (m_core_known = " << m_core_known
+	      << " , m_trailer_known = " << m_trailer_known << " )");
+
+    /*
+      std::cout << " interpretFileName: FileName = " << FileName
+		<< "  (m_core_known = " << m_core_known
+		<< " , m_trailer_known = " << m_trailer_known << " )"
+		<< std::endl;
+    */
+
+    // Before diving into interpretation, check if work is already done
+    if ( m_core_known && m_trailer_known ) return true;
+    if ( FileName == "" ) {
+      m_core_known = false;
+      m_trailer_known = false;
+      return false; 
+    }
+
+    // Try to interpretate the filename fields
+
+    // useful things for the spliting of the fileName in fields:
+    // when spliting with boost tokenizer :
+    typedef boost::tokenizer<boost::char_separator<char> >  tokenizer;
+    boost::char_separator<char> sep(RAWFILENAME_DELIMITER.c_str(), 
+				    "", boost::keep_empty_tokens);
+    // when spliting with std::string::find() :
+    std:: string::size_type sepPos;
+
+    // Assuming that the file finishes like: ._sequenceNumber.extension(s)
+    // we say that after the last "_" in the filename, we have the trailer,
+    // and before that "_" we have the fileNameCore
+
+    sepPos=FileName.rfind("._");
+    if(sepPos==std::string::npos) {
+      ERS_DEBUG(3,"File name does not contain ._ ");
+      return false;
+    }
+
+    // fileNameCore:
+    m_fileNameCore = FileName.substr(0,sepPos);
+
+    ERS_DEBUG(3,"Checking for . at the end of " << m_fileNameCore );
+    if (m_fileNameCore.c_str()[m_fileNameCore.size()-1] == '.') {
+      m_fileNameCore = m_fileNameCore.substr(0, m_fileNameCore.size()-1);
+    }
+    ERS_DEBUG(3,"After removing possible . at the end: " << m_fileNameCore );
+
+    // tail:
+    std::string trailers_onestring;
+    trailers_onestring = FileName.substr(sepPos+2,std::string::npos); //to end
+
+    std::vector<std::string> trailers;
+    /***
+	trailers = split(trailers_onestring,
+	RAWFILENAME_DELIMITER.c_str()[0]);
+    ***/
+    tokenizer trailer_tokens(trailers_onestring, sep);
+    trailers.assign(trailer_tokens.begin(), trailer_tokens.end());
+
+
+
+    // A) interpret trailers first:
+    // ----------------------------
+    // if the 1st filed in the trailer is a number,
+    // we can intepret the trailer, else not
+    if ( !m_trailer_known) {
+      try {
+	m_fileSequenceNumber //  = atoi( trailers[0].c_str() ); 
+	  = convertToUINT( trailers[0] );
+	m_trailer_known = true;
+	std::ostringstream myext;
+	for (unsigned int i=1; i !=  trailers.size(); i++) {
+	  if (i != 1) myext << RAWFILENAME_DELIMITER;
+	  myext << trailers[i];
+	}
+	m_extension = myext.str();
+
+	// build the file name again and set m_trailer_known = true 
+	buildFileNameTrailers(m_fileNameCore, 
+			      m_fileSequenceNumber,
+			      m_extension);
+	m_trailer_known = true;
+	
+      } catch (std::exception& ex) {
+	ERS_DEBUG(1," Can not interpret fileSequenceNumber: " << ex.what() );
+	m_trailer_known = false;
+	m_fileSequenceNumber = RAWFILENAME_DEFAULT_UINT;
+	m_extension          = RAWFILENAME_DEFAULT_STRING;
+      }
+    } // try only if trailer details are not known
+
+    ERS_DEBUG(3," =====> Trailer string: " << trailers_onestring
+	      << " has " << trailers_onestring.size() << " characters"
+	      << " ;  FileName: " << FileName 
+	      << "  , fileNameCore: " << m_fileNameCore
+	      << " , m_fileSequenceNumber = " << m_fileSequenceNumber
+	      << " , m_extension  = " << m_extension );
+
+
+    // B) Try to interpret the fileNameCore now:
+    // -----------------------------------------
+    if (m_core_known) {
+      return true;
+    }
+
+    // we are here only if m_core_known is false: interepret now
+    std::vector<std::string> fields;
+    // fields = split( FileName, RAWFILENAME_DELIMITER.c_str()[0] );
+    tokenizer core_tokens(FileName, sep);
+    fields.assign(core_tokens.begin(), core_tokens.end());
+    for ( std::vector<std::string>::iterator it=fields.begin();
+	  it != fields.end(); ++it) {
+      ERS_DEBUG(3, " field = " << *it);
+    }
+ 
+    ERS_DEBUG(3," number of . delimited fields found: " <<  fields.size());
+
+    bool can_interpret_core;
+    if (fields.size() >= 7 && fields[4] == "RAW") {
+      can_interpret_core=true;
+    } else {
+      can_interpret_core=false;
+    } 
+    
+    if ( !can_interpret_core ) {
+      ERS_DEBUG(1," Can not interpret the core of FileName: " << FileName 
+		<< " , so keeping " << m_fileNameCore << " as core.");
+      m_core_known = false;
+
+    } else {
+
+      m_project     = fields[0];
+      try {
+	m_runNumber // = atoi( fields[1].c_str() ); 
+	  = convertToUINT( fields[1] );
+      } catch (std::exception& ex) {
+	ERS_DEBUG(1," Can not interpret run-number : " << ex.what() );
+	return false; // done with intrepreting the core...
+      }
+
+      m_stream      = fields[2];
+
+      sepPos=m_stream.find("_");
+      if(sepPos==std::string::npos) {
+	ERS_DEBUG(3,"Stream does not contain _ ");
+	return false;
+      }
+      // first part is streamType:
+      m_streamType = m_stream.substr(0,sepPos);
+      // second part is streamName:
+      m_streamName = m_stream.substr(sepPos+1,std::string::npos); // to end
+
+      m_productionStep = fields[3];
+      m_dataType = fields[4];
+      m_datasetName = "datasetName";
+
+      try {
+        sepPos = fields[5].find("b");
+	m_lumiBlockNumber = 
+	  convertToUINT( fields[5].substr(sepPos+1, std::string::npos) );
+	// atoi ( fields[5].substr(sepPos+1, std::string::npos).c_str() ); 
+      } catch (std::exception& ex) {
+	ERS_DEBUG(1," Can not interpret lumi-block : " << ex.what() );
+	// m_lumiBlockNumber = 0;
+	return false; // done with intrepreting the core...
+      }
+      
+      sepPos = fields[6].find("_");
+      m_applicationName = fields[6].substr(sepPos+1, std::string::npos);
+      
+      // build the nameCore again and set m_core_known = true
+      buildFileNameCore(m_project,
+			m_runNumber,
+			m_streamType,
+			m_streamName,
+			m_lumiBlockNumber,
+			m_applicationName,
+			m_productionStep,
+			m_dataType);
+      m_core_known=true;
+    } // if ( !can_interpret_core ) )
+
+    return m_core_known;
+  } 
+
+  /**
+   * contruct the complain
+   */
+  std::string RawFileName::complain()
+  {
+    std::stringstream mystream;
+    mystream <<  "FileName " << m_fileName << " has failed interpretation";
+    return mystream.str();
+  }
+
+
+  /**
+   * Get methods:
+   * ------------
+   */
+  std::string RawFileName::project() { 
+    if ( hasValidCore() )  {
+      return m_project;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+      //FaserEventStorage::RawFileNameIssue myIssue(ERS_HERE, complain() );
+      // ers::warning(myIssue);
+      //throw myIssue;
+    }
+  }
+
+  std::string RawFileName::datasetName() { 
+    if ( hasValidCore() ) { 
+      return m_datasetName;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+  unsigned int RawFileName::runNumber() { 
+    if ( hasValidCore() ) { 
+      return m_runNumber;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+
+  std::string RawFileName::streamType() { 
+    if ( hasValidCore() ) { 
+      return m_streamType; 
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+  std::string RawFileName::streamName() { 
+    if ( hasValidCore() ) { 
+      return m_streamName; 
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+
+  std::string RawFileName::stream() {
+    if ( hasValidCore() ) { 
+      return m_stream; 
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+  unsigned int RawFileName::lumiBlockNumber() { 
+    if ( hasValidCore() ) { 
+      return m_lumiBlockNumber; 
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+  std::string RawFileName::applicationName() { 
+    if ( hasValidCore() ) { 
+      return m_applicationName;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+  std::string RawFileName::productionStep() { 
+    if ( hasValidCore() ) { 
+      return m_productionStep;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+  std::string RawFileName::dataType() { 
+    if ( hasValidCore() ) { 
+      return m_productionStep;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+
+  unsigned int RawFileName::fileSequenceNumber() {
+    if ( hasValidTrailer() )  {
+      return m_fileSequenceNumber;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+  std::string RawFileName::extension() { 
+    if ( hasValidTrailer() )  {
+      return m_extension;
+    } else {
+      throw FaserEventStorage::RawFileNameIssue(ERS_HERE, complain().c_str() );
+    }
+  }
+
+
+  /**
+   * print the content of this object
+   */
+  void RawFileName::print()
+  {
+    std::stringstream mystream;
+
+    mystream << " full fileName: " << m_fileName  << std::endl;
+    mystream << " fileNameCore:  " << m_fileNameCore  << std::endl;
+    if(m_core_known)
+      mystream << " datasetName:   " << m_datasetName << std::endl;
+    
+    
+    if (!m_core_known) {
+      mystream << "   Not all core fields known " << std::endl;
+    } else {
+      mystream << "   project   = " << m_project << std::endl;
+      mystream << "   runNo     = " << m_runNumber << std::endl;
+      mystream << "   stream    = " << m_stream 
+<< " ( type: " << m_streamType 
+<< " , name: " << m_streamName << " ) "
+<< std::endl;
+      mystream << "   prodStep  = " << m_productionStep << std::endl;
+      mystream << "   dataType  = " << m_dataType << std::endl;
+      mystream << "   lumiBlock = " << m_lumiBlockNumber << std::endl;
+      mystream << "   appName   = " << m_applicationName << std::endl;
+    } // end-if m_core_known
+
+    if ( !m_trailer_known ) {
+      mystream << "   Tailer fields not known " << std::endl;
+    } else {
+      mystream << "   seqNumber = " << m_fileSequenceNumber << std::endl;
+      mystream << "   extension = " << m_extension << std::endl;
+    } // end-if m_trailer_known
+
+    mystream << std::endl;
+    
+    std::string tmp = mystream.str();
+
+    ERS_LOG(tmp.c_str());
+
+    return;
+  }
+
+
+  /**
+   * split a string in its fields, using a ONE-CHARACTER-LONG delimiter
+   */
+  std::vector<std::string> RawFileName::split(std::string const & s, 
+      char delimiter) 
+  {    
+    std::vector<std::string> container;
+
+    typedef boost::tokenizer<boost::char_separator<char> >  tokenizer;
+
+    std::ostringstream os;
+    os << delimiter;
+    boost::char_separator<char> sep(os.str().c_str(), 
+    "", boost::keep_empty_tokens);
+
+    tokenizer tokens(s, sep);
+    container.assign(tokens.begin(), tokens.end());
+
+    return container;
+  }
+
+  /**
+   * string to integer conversion
+   */ 
+  unsigned int RawFileName::convertToUINT(const std::string & s) 
+  {
+    unsigned int x = 0;
+    std::istringstream i(s);
+    // check if ALL characters in "s" are numbers; otherwise throw
+    for ( unsigned int it = 0; it != s.size(); ++it) {
+      std::ostringstream temp_out; temp_out << s.c_str()[it];
+      std::istringstream temp_in(temp_out.str());
+      x=0;
+      if (!(temp_in >> x)) {
+std::string mystream = "Failed convertToUINT(\"" + s + "\")";
+FaserEventStorage::RawFileNameIssue myissue(ERS_HERE, mystream.c_str() );
+// ers::warning(ci);
+throw myissue;
+// throw daq::BadConversion("convertToUINT(\"" + s + "\")");
+      }
+    }
+    
+    x=0;
+    if (!(i >> x)) {
+      std::string mystream = "Failed convertToUINT(\"" + s + "\")";
+      FaserEventStorage::RawFileNameIssue myissue(ERS_HERE, mystream.c_str() );
+      // ers::warning(ci);
+      throw myissue;
+      // throw daq::BadConversion("convertToUINT(\"" + s + "\")");
+    }
+    
+    return x;
+  }
+
+}
+
diff --git a/Event/FaserEventStorage/src/fReadPlain.cxx b/Event/FaserEventStorage/src/fReadPlain.cxx
new file mode 100644
index 00000000..03c880d2
--- /dev/null
+++ b/Event/FaserEventStorage/src/fReadPlain.cxx
@@ -0,0 +1,148 @@
+#include "ers/ers.h"
+#include "fReadPlain.h"
+#include "EventStorage/EventStorageIssues.h"
+
+
+fReadPlain::fReadPlain() 
+{
+} 
+
+fReadPlain::~fReadPlain() 
+{
+  this->closeFile();
+}
+
+bool fReadPlain::isOpen() 
+{
+  return m_cFile.is_open();
+}
+
+bool fReadPlain::isEoF() 
+{
+  if(this->isOpen()) {
+    return m_cFile.eof();
+  } else {
+    return false;
+  }
+}
+
+bool fReadPlain::fileExists(std::string fName) const
+{
+  std::ifstream testFile;
+  testFile.open(fName.c_str(),std::ios::binary | std::ios::in);
+
+  bool isThere = testFile.good();
+
+  if(isThere) testFile.close();
+  
+  return isThere;
+}
+
+void fReadPlain::openFile(std::string fName) 
+{
+  if(this->isOpen()) this->closeFile();
+
+  m_cFile.clear();
+  m_cFile.open(fName.c_str(),std::ios::binary | std::ios::in);
+}  
+
+void fReadPlain::closeFile() 
+{
+  m_cFile.close();
+}
+
+void fReadPlain::readData(char *buffer, unsigned int sizeBytes) 
+{
+  if (sizeBytes==0) return;
+
+  if(!m_cFile.is_open()) {
+    std::stringstream mystream;
+    mystream << "an attempt to read from a file that is not open. "
+	     <<"fReadPlain::readData called to read "
+	     <<sizeBytes<<" bytes.";
+    std::string err = mystream.str();
+    EventStorage::ReadingIssue ci(ERS_HERE, err.c_str());
+    ers::warning(ci);
+    return;
+  }
+
+  if(m_cFile.eof()) {
+    std::stringstream mystream;
+    mystream << "error reading data from disk. "
+	     <<"fReadPlain called to read "
+	     <<sizeBytes<<" bytes and finds EOF.";
+    std::string err = mystream.str();
+    EventStorage::ReadingIssue ci(ERS_HERE, err.c_str());
+    ers::warning(ci);
+    return;
+  }
+
+  if(m_cFile.bad()) {
+    std::stringstream mystream;
+    mystream << "error reading data from disk. "
+	     <<"fReadPlain called to read " 
+	     <<sizeBytes<<" bytes and finds that the bad flag is set.";
+    std::string err = mystream.str();
+    EventStorage::ReadingIssue ci(ERS_HERE, err.c_str());
+    ers::warning(ci);
+    return;
+  } 
+
+  m_cFile.read(buffer,sizeBytes);
+
+  if(m_cFile.bad()) {
+    std::stringstream mystream;
+    mystream << "error reading data from disk. "
+             <<"fReadPlain finds the file in bad state after trying to read "
+             <<sizeBytes<<" bytes.";
+    std::string err = mystream.str();
+    EventStorage::ReadingIssue ci(ERS_HERE, err.c_str());
+    ers::warning(ci);
+  } else if(m_cFile.eof()) {
+    std::stringstream mystream;
+    mystream << "error reading data from disk. "
+             <<"fReadPlain finds EOF after trying to read "
+             <<sizeBytes<<" bytes.";
+    std::string err = mystream.str();
+    EventStorage::ReadingIssue ci(ERS_HERE, err.c_str());
+    ers::warning(ci);
+  }
+}
+
+int64_t fReadPlain::getPosition() 
+{
+  if(this->isOpen()) {
+    std::streampos pos=m_cFile.tellg();
+    return pos;
+  }
+  return -1;
+}
+
+void fReadPlain::setPosition(int64_t p) 
+{  
+  if(this->isOpen()) {
+    std::streampos pos=p;
+    m_cFile.seekg(pos);
+  }
+}
+ 
+void fReadPlain::setPositionFromEnd(int64_t p)
+{  
+  if(this->isOpen()) {
+    m_cFile.seekg(p,std::ios::end);
+  }
+}
+ 
+fRead * fReadPlain::newReader() const
+{
+  fReadPlain * nfr = new fReadPlain();
+  return (fRead *)nfr;
+}
+
+extern "C" {
+  fRead *fReadFactory() 
+  {
+    fReadPlain * nfr = new fReadPlain();
+    return (fRead *)nfr;
+  }
+}
diff --git a/Event/FaserEventStorage/src/fReadPlain.h b/Event/FaserEventStorage/src/fReadPlain.h
new file mode 100644
index 00000000..3fe6738d
--- /dev/null
+++ b/Event/FaserEventStorage/src/fReadPlain.h
@@ -0,0 +1,35 @@
+
+#ifndef FREADPLAIN_H
+#define FREADPLAIN_H
+
+#include <fstream>
+#include <string>
+
+#include "FaserEventStorage/fRead.h"
+
+class fReadPlain : public fRead
+//class fReadPlain 
+{
+ public:
+  fReadPlain(); 
+  ~fReadPlain();
+
+  bool isOpen();
+  bool isEoF();
+  bool fileExists(std::string fName) const;
+  void openFile(std::string fName);
+  void closeFile();
+  void readData(char *buffer, unsigned int sizeBytes);
+  int64_t getPosition();
+  void setPosition(int64_t p);
+  void setPositionFromEnd(int64_t p);
+  fRead * newReader() const; 
+
+ private:
+  std::ifstream m_cFile; // current file
+};
+
+// fRead *fReadFactory();
+
+#endif 
+
diff --git a/Event/FaserEventStorage/src/loadfRead.cxx b/Event/FaserEventStorage/src/loadfRead.cxx
new file mode 100644
index 00000000..0404e738
--- /dev/null
+++ b/Event/FaserEventStorage/src/loadfRead.cxx
@@ -0,0 +1,40 @@
+#include <dlfcn.h>
+#include "ers/ers.h"
+
+#include "FaserEventStorage/fRead.h" 
+#include "FaserEventStorage/loadfRead.h"
+
+fRead * loadfRead(std::string libName){
+ 
+  ERS_DEBUG(2,"loadfRead called with library name "<<libName);
+ 
+  ::dlerror();
+ 
+  libName += ".so";
+  libName = "lib" + libName;
+
+  void * lib = ::dlopen(libName.c_str(), RTLD_NOW | RTLD_GLOBAL);
+
+  if (!lib || ::dlerror() ) {
+    ERS_DEBUG(1,"Cannot load library");
+    return NULL;
+  }
+
+  ERS_DEBUG(2,"Library OK, now find the symbol.");
+
+  ::dlerror();
+
+  // fun is defined to be: 
+  // a pointer to a function which takes no arguments "()" 
+  // and returns fRead* (e.g., look in fReadPlain fReadFactory)
+  typedef fRead* (*fun)(); 
+  fun sym = (fun)::dlsym(lib, "fReadFactory");
+
+  if (!sym || ::dlerror()) {
+    ERS_DEBUG(1,"No symbol");
+    return NULL;
+  }
+  ERS_DEBUG(2,"Symbol is OK, now get the reader.");
+
+  return sym();   // this returns an "fRead*"
+}
diff --git a/Event/FaserEventStorage/src/pickFaserDataReader.cxx b/Event/FaserEventStorage/src/pickFaserDataReader.cxx
new file mode 100644
index 00000000..e800e22a
--- /dev/null
+++ b/Event/FaserEventStorage/src/pickFaserDataReader.cxx
@@ -0,0 +1,132 @@
+#include "ers/ers.h"
+#include "FaserEventStorage/fRead.h" 
+#include "FaserEventStorage/loadfRead.h"
+#include "FaserEventStorage/pickFaserDataReader.h"
+#include "FaserEventStorage/EventStorageIssues.h"
+#include "DataReaderController.h"
+
+DataReader * pickFaserDataReader(std::string fileName) {
+  
+  ERS_DEBUG(1,"pickFaserDataReader(file) with file name "<<fileName);
+
+  std::vector<std::string> fReadLibs;
+  fReadLibs.push_back("fReadPlain");  // Just use plain
+
+  /*
+  // Control plugins libraries via file name prefixes.
+  // Take the prefixes away from the name, in most cases anyway.
+  if(fileName.find("rfio:")==0) {
+    fileName.erase(0,std::string("rfio:").size());
+    fReadLibs.push_back("fReadCastor");
+  } else if(fileName.find("dcache:")==0) {
+    fileName.erase(0,std::string("dcache:").size());
+    fReadLibs.push_back("fReaddCache");
+  } else if(fileName.find("dcap:")==0) {
+    // Leave the prefix in the file name in this case.
+    fReadLibs.push_back("fReaddCache");
+  } else if(fileName.find("root:")==0) {
+    // Leave the prefix in the file name in this case.
+    fReadLibs.push_back("fReadXRootD");
+  } else if(fileName.find("https:")==0) {
+    // Leave the prefix in the file name in this case.
+    fReadLibs.push_back("fReadDavix");
+  } else if(fileName.find("davs:")==0) {
+    // Leave the prefix in the file name in this case.
+    fReadLibs.push_back("fReadDavix");
+  } else if(fileName.find("disk:")==0) {
+    fileName.erase(0,std::string("disk:").size());
+    fReadLibs.push_back("fReadPlain");
+  } else { // by defaul all will be tried
+    fReadLibs.push_back("fReadPlain");
+    fReadLibs.push_back("fReadCastor");
+    fReadLibs.push_back("fReadXRootD");
+    fReadLibs.push_back("fReadDavix");
+    fReadLibs.push_back("fReaddCache");
+  }
+  */
+  ERS_DEBUG(2,"After parsing the file name is "<<fileName);
+  ERS_DEBUG(2,"Number of fRead plugins to try is "<<fReadLibs.size());
+
+  std::vector<std::string>::iterator fReadLib=fReadLibs.begin();
+  fRead *pfR = NULL;
+
+  std::vector<std::string> libsNotLoaded;
+  std::vector<std::string> libsNoSuccess;
+  libsNotLoaded.clear(); libsNoSuccess.clear();
+
+  for(fReadLib=fReadLibs.begin(); fReadLib!=fReadLibs.end(); ++fReadLib) {
+    ERS_DEBUG(2,"Try to with lib "<<(*fReadLib));
+
+    pfR = loadfRead(*fReadLib);
+    if (!pfR) {
+      ERS_DEBUG(2,"No fRead");
+      libsNotLoaded.push_back(*fReadLib);
+      continue;
+    }
+    ERS_DEBUG(2,"fRead* OK. Try to open the data file "<<fileName);
+    
+    pfR->openFile(fileName);
+
+    ERS_DEBUG(2,"Is the file open? "<<pfR->isOpen());
+    if(!pfR->isOpen()) {
+      ERS_DEBUG(2,"Can not open file "<<fileName<<" with library "<<(*fReadLib));
+      libsNoSuccess.push_back(*fReadLib);
+      delete pfR;
+      pfR=NULL;
+      continue;    
+    } else {
+      break;
+    }
+  }
+
+  if(pfR==NULL || !pfR->isOpen()) {
+    if(libsNoSuccess.size()>0) {
+      std::string libList="";
+      std::vector<std::string>::iterator it;
+      for(it = libsNoSuccess.begin(); it != libsNoSuccess.end(); ++it) {
+	libList += *it + " ";
+      } 
+      //ERS_ERROR("Can not open file "<<fileName
+      //<<"\nThe following libraries were tried: "<<libList);
+      std::stringstream mystream;
+      mystream << "can not open file "<<fileName
+               <<"\nThe following libraries were tried: "<<libList;
+      std::string err = mystream.str();
+      ReadingIssue ci(ERS_HERE, err.c_str());
+      ers::error(ci);
+    } 
+    if(libsNotLoaded.size()>0) {
+      std::string libList="";
+      std::vector<std::string>::iterator it;
+      for(it = libsNotLoaded.begin(); it != libsNotLoaded.end(); ++it) {
+libList += *it + " ";
+      } 
+      //ERS_WARNING("Can not load libraries: "<<libList);
+      std::string err = "can not load libraries: " + libList;
+      ReadingIssue ci(ERS_HERE, err.c_str());
+      ers::warning(ci);
+    } 
+    
+    return NULL;
+  }
+
+  // We have a working fRead and the file is accessible.
+
+  ERS_DEBUG(1,"The file is accessible. Go through file format now.");
+
+  pfR->closeFile();
+
+  DataReader * pDR = NULL;
+  try{
+    pDR = new DataReaderController(pfR,fileName);
+  }catch(FaserEventStorage::ES_WrongFileFormat &ex){
+    ReadingIssue ci(ERS_HERE,"file format not valid for EventStorage.", ex); 
+    ers::warning(ci);
+    return NULL;
+  }
+
+  ERS_DEBUG(1,"File format is OK.");
+
+  return pDR;
+}
+
diff --git a/Legacy/LegacyBase/CMakeLists.txt b/Legacy/LegacyBase/CMakeLists.txt
index 9d7431b3..a8517538 100644
--- a/Legacy/LegacyBase/CMakeLists.txt
+++ b/Legacy/LegacyBase/CMakeLists.txt
@@ -7,14 +7,6 @@
 # Declare the package name:
 atlas_subdir( LegacyBase )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          PRIVATE
-                          Control/AthenaKernel
-                          )
-                          
-
 # External dependencies:
 find_package( CLHEP )
 find_package( ROOT COMPONENTS Core Tree RIO pthread Physics )
diff --git a/Legacy/LegacyConverter/CMakeLists.txt b/Legacy/LegacyConverter/CMakeLists.txt
index 03a1ab10..a9c31768 100644
--- a/Legacy/LegacyConverter/CMakeLists.txt
+++ b/Legacy/LegacyConverter/CMakeLists.txt
@@ -6,18 +6,6 @@
 # Declare the package name:
 atlas_subdir( LegacyConverter )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-			  xAOD/xAODFaserTruth
-                          xAOD/xAODFaserTracking
-			  Legacy/LegacyBase
-                          GaudiKernel
-                          PRIVATE
-                          Control/AthenaKernel
-                          )
-                          
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread EG )
 
diff --git a/MagneticField/MagFieldConditions/CMakeLists.txt b/MagneticField/MagFieldConditions/CMakeLists.txt
index 6d54b1e2..cd078820 100644
--- a/MagneticField/MagFieldConditions/CMakeLists.txt
+++ b/MagneticField/MagFieldConditions/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( MagFieldConditions )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/StoreGate
-                          MagneticField/MagFieldInterfaces
-			              GaudiKernel
-                          PRIVATE
-                          MagneticField/MagFieldElements
-                          )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
diff --git a/MagneticField/MagFieldElements/CMakeLists.txt b/MagneticField/MagFieldElements/CMakeLists.txt
index 9b6245f8..9bd3b356 100644
--- a/MagneticField/MagFieldElements/CMakeLists.txt
+++ b/MagneticField/MagFieldElements/CMakeLists.txt
@@ -5,30 +5,16 @@
 # Declare the package name:
 atlas_subdir( MagFieldElements )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          MagneticField/MagFieldInterfaces
-                          MagneticField/MagFieldConditions
-			              Control/CxxUtils
-                          PRIVATE
-                          MagneticField/MagFieldElements
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          GaudiKernel
-                          Tools/PathResolver )
-
 # External dependencies:
-find_package( CLHEP )
-find_package( Eigen )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
 # Component(s) in the package:
 atlas_add_library( MagFieldElements
                    src/*.cxx
                    PUBLIC_HEADERS MagFieldElements
-                   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
-		           LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES}  ${EIGEN_LIBRARIES} AthenaBaseComps GaudiKernel CxxUtils)
+                   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} 
+		           LINK_LIBRARIES EventPrimitives GaudiKernel CxxUtils
+                   PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} PathResolver)
 
 # Install files from the package:
 atlas_install_headers( MagFieldElements )
diff --git a/MagneticField/MagFieldServices/CMakeLists.txt b/MagneticField/MagFieldServices/CMakeLists.txt
index 186b51a0..40e92dd5 100644
--- a/MagneticField/MagFieldServices/CMakeLists.txt
+++ b/MagneticField/MagFieldServices/CMakeLists.txt
@@ -5,19 +5,6 @@
 # Declare the package name:
 atlas_subdir( MagFieldServices )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          MagneticField/MagFieldInterfaces
-                          MagneticField/MagFieldConditions
-                  			  Control/CxxUtils
-                          PRIVATE
-                          MagneticField/MagFieldElements                          
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          GaudiKernel
-                          Tools/PathResolver )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
diff --git a/Monitoring/CMakeLists.txt b/Monitoring/CMakeLists.txt
new file mode 100644
index 00000000..7e33f8b8
--- /dev/null
+++ b/Monitoring/CMakeLists.txt
@@ -0,0 +1,15 @@
+################################################################################
+# Package: Monitoring
+# Contains python code to implement offline monitoring
+################################################################################
+
+
+# Declare the package name:
+atlas_subdir( Monitoring )
+
+# External dependencies:
+find_package( ROOT COMPONENTS Core Tree )
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py )
+atlas_install_scripts( share/*.py )
diff --git a/Monitoring/python/LegacySelector.py b/Monitoring/python/LegacySelector.py
new file mode 100644
index 00000000..0481d7e6
--- /dev/null
+++ b/Monitoring/python/LegacySelector.py
@@ -0,0 +1,65 @@
+#
+#  LegacySelector.py
+#
+#  Class to select values from legacy ntuples
+#
+#  E.Torrence, Sept. 2019
+#
+#
+# Use Python3-style print statements
+from __future__ import print_function
+
+class LegacySelector ():
+    """Class to select values from Legacy ntuple"""
+
+    def __init__(self):
+        """Constructor"""
+
+        self.conf = None
+
+    # Pass MonitorValue conf object
+    def init(self, conf):
+        """Initialization"""
+
+        # Just save full conf object
+        self.conf = conf
+
+    # Return list of values from data object event
+    def get1DValue(self, event, varName):
+
+        # print ("LegacySelector.get1DValue called for", varName)
+
+        values = []
+
+        #varName = self.conf.xvar
+
+        # Variable name should first give the list, followed by the specific parameter
+        # Only the event number doesn't follow this pattern
+        if varName == 'fEventNumber':
+            # OK, this is weird, event is actually the tree, while event.event is the FaserEvent class.  
+            # For the lists, we can get them directly from event...
+            return event.event.GetEventNumber()
+
+        theListName = varName.split('.')[0]
+
+        theList = getattr(event, theListName)
+
+        # Loop over truth list
+        for obj in theList:
+            # Try to parse the variable string
+            # Find chunks separated by a point
+            # Each is either a method or an attribute
+            theObj = obj
+            varList = self.conf.xvar.split('.')[1:]      # Skip the list [1:]
+            for varName in varList:
+                # Is this an attribute or a method?
+                if callable(getattr(theObj, varName)):
+                    theObj = getattr(theObj, varName)()  # Method (function)
+                else:
+                    theObj = getattr(theObj, varName)    # Attribute (value)
+
+            # Once we have walked through the list, have our value
+            values.append(theObj)
+
+
+        return values
diff --git a/Monitoring/python/Monitor1DValue.py b/Monitoring/python/Monitor1DValue.py
new file mode 100755
index 00000000..1f43dc62
--- /dev/null
+++ b/Monitoring/python/Monitor1DValue.py
@@ -0,0 +1,200 @@
+#!/bin/env python
+#
+#  Monitor1DValue.py
+#
+#  Defines classes to implement monitored values
+#
+#  Classes
+#    Monitor1DValue
+#    Monitor1DValueConfig
+#
+#  E.Torrence, Aug. 2019
+#
+#
+# Use Python3-style print statements
+from __future__ import print_function
+
+import sys
+import ROOT
+
+from Monitoring.MonitorValueBase import MonitorValueBase, MonitorConfigBase
+
+#
+# 1D Monitoring class and configuration
+#
+class Monitor1DValueConfig(MonitorConfigBase):
+    """Configuration for Monitor1DValue"""
+
+    # Everything in this configuration must be simple values so JSON works
+
+    def __init__(self):
+        """Constructor providing default values"""
+
+        MonitorConfigBase.__init__(self)
+        # Defines tag, type, and desc
+
+        # Variable
+        self.selector = None # Text string describing selector class
+
+        self.xvar = None   # Text string describing value to fill
+
+        # Scale factor
+        self.xscale = 1
+
+        # Histogram parameters
+        self.nbins = 0
+        self.xlo = 0.
+        self.xhi = 0.
+        self.xlabel = ""
+        self.ylabel = ""
+
+        # Plot under/overflows
+        self.overflow = True
+
+        # Draw as linear or log scale by default
+        self.logy = False
+
+    # Utility function to make it easier to define hist parameters
+    def setBinning(self, nbins, xlo, xhi, xlabel="", ylabel=""):
+        """Define histogram bins and range"""
+
+        # Utility function to set histogram parameters in one go
+        self.nbins = nbins
+        self.xlo = xlo
+        self.xhi = xhi
+        self.xlabel = xlabel
+        self.ylabel = ylabel
+
+    
+class Monitor1DValue (MonitorValueBase):
+    """One dimensional monitored value class"""
+
+    def __init__(self, tag=''):
+        """Constructor, tag is a unique identification string"""
+
+        # Instantiate the configuration object
+        self.conf = Monitor1DValueConfig()
+
+        # Set the tag if provided
+        self.conf.tag = tag
+
+    def init(self):
+        """Initialize class and create histogram"""
+
+        # First call the base class, which checks a few things
+        MonitorValueBase.init(self)
+
+        # Now create our histogram with the parameters in self.conf
+        # Check if we want to store integers or floats
+        if isinstance(self.conf.xlo, int) and isinstance(self.conf.xhi, int):
+            self.hist = ROOT.TH1I(self.conf.tag+"_h", "", 
+                                  self.conf.nbins, self.conf.xlo, self.conf.xhi)
+        else: 
+            self.hist = ROOT.TH1D(self.conf.tag+"_h", "", 
+                                  self.conf.nbins, self.conf.xlo, self.conf.xhi)
+
+        # Also set labels
+        self.hist.GetXaxis().SetTitle(self.conf.xlabel)
+        self.hist.GetYaxis().SetTitle(self.conf.ylabel)
+
+    def fill(self, event):
+        """Fill histogram from event object"""
+
+        self.fillValue(self.selector.get1DValue(event, self.conf.xvar))
+
+        #varstr = self.conf.xvar
+        #theVar = getattr(event, varstr)
+        #self.fillValue(theVar)
+
+    def fillValue(self, val):
+        """Fill histogram with one or more values"""
+
+        #print ("Monitor1DValue.fillValue called with", val)
+
+        # Check if this is a single value or an iterable sequence
+        if hasattr(val, '__iter__'):
+            for v in val:
+                self.hist.Fill(v*self.conf.xscale)
+        else:
+            self.hist.Fill(val*self.conf.xscale)
+
+
+    def plot(self, c):
+        """Plot histogram to canvas c"""
+
+        # Log or lin?
+        if self.conf.logy:
+            c.SetLogy(True)
+        else:
+            c.SetLogy(False)
+
+        # Do something fancy to draw the overflow?
+        if self.conf.overflow:
+            # Must make a new histogram and fill under/overflow in first/last bins
+            h = self.hist.Clone()
+            nb = h.GetNbinsX()
+
+            under = h.GetBinContent(0)
+            h.SetBinContent(1, h.GetBinContent(1)+under)
+            over = h.GetBinContent(nb+1)
+            h.SetBinContent(nb, h.GetBinContent(nb)+over)
+
+        else:
+            h = self.hist
+
+        # Draw with default parameters
+        h.DrawCopy()
+
+# Testing code
+if __name__ == '__main__':
+
+    mv1 = Monitor1DValue('test1')
+    mv1.conf.setBinning(30, -3., 3.)
+    mv1.init()
+
+    mv2 = Monitor1DValue('test2')
+    mv2.conf.setBinning(30, -3., 3.)
+    mv2.init()
+
+    # Fill a list
+    import random
+    values = [random.gauss(0., 1.) for x in range(100)]
+    mv1.fill(values)
+
+    # Try one more
+    mv1.fill(random.gauss(0., 1.))
+
+    # Print something out
+    mv1.dump()
+
+    # Write to file
+    print()
+    print("Test writing to ROOT file")
+    tf = ROOT.TFile("test.root", "recreate")
+    mv1.writeRoot(tf)
+    mv2.writeRoot(tf)
+    #writeMonitorValue(tf, mv1)
+    #writeMonitorValue(tf, mv2)
+    tf.Close()
+
+    print()
+    print("Test reading from ROOT file")
+    tf = ROOT.TFile('test.root')
+
+    print()
+    print("Directory listing")
+    tf.ls()
+
+    from Monitoring.MonitorValueBase import readMonitorValueFromRoot
+
+    print()
+    print("Read objects back from ROOT file")    
+    mvr1 = readMonitorValueFromRoot(tf, "test1")
+    mvr1.dump()
+    mvr2 = readMonitorValueFromRoot(tf, "test2")
+    mvr2.dump()
+    try:
+        readMonitorValueFromRoot(tf, "test3")
+    except Exception as e:
+        print(e)
+
diff --git a/Monitoring/python/MonitorValueBase.py b/Monitoring/python/MonitorValueBase.py
new file mode 100644
index 00000000..82220c35
--- /dev/null
+++ b/Monitoring/python/MonitorValueBase.py
@@ -0,0 +1,253 @@
+#
+#  MonitorValueBase.py
+#
+#  Defines base classes to implement monitored values
+#
+#  Functions
+#    readMonitorValueFromRoot - read MonitorValue from ROOT file
+#    monitorValueFromJSON - construct MonitorValue from JSON
+#
+#  Classes
+#    MonitorValueBase
+#    MonitorConfigBase
+#
+#  E.Torrence, Aug. 2019
+#
+#
+# Use Python3-style print statements
+from __future__ import print_function
+
+import sys
+import ROOT
+import json
+
+# Utility function to create object instance from ROOT file
+def readMonitorValueFromRoot(f, tag):
+    """Read class named tag from open root file f"""
+
+    # Objects stored in subdirectory, make sure it exists
+    if not f.cd(tag):
+        print("Object", tag, "not present in file!")
+        f.ls()
+        raise ObjectNotFoundError("Error: directory not found for object "+tag+"!")
+    
+    #print ("Changed to directory", tag)
+    #f.ls()
+
+    # Read histogram first
+    histName = tag+"_h"
+    #print("Reading histogram", histName)
+    hist = ROOT.gROOT.FindObject(histName)
+    if hist is None:
+        f.cd("..")
+        raise ObjectNotFoundError("Error: unable to read histogram", histName,"!")
+
+    # Read JSON string stored in a TNamed object
+    objectName = tag+"_j"
+    tobj = ROOT.gROOT.FindObject(objectName)
+    if tobj is None:
+        f.cd("..")
+        raise ObjectNotFoundError("Error: unable to read JSON from",objectName, "!")
+
+    # Get JSON string from TNamed
+    jsonString = tobj.GetTitle()
+
+    #print(jsonString)
+    #obj = pickle.loads(unicode(pickleString.GetTitle(), 'utf-8'))
+
+    # Call our utility function to create a new (un-initalized) object
+    obj = monitorValueFromJSON(json.loads(jsonString))
+
+    # And put the histogram back
+    obj.hist = hist
+
+    # Return to the parent directory in the ROOT file
+    f.cd("..")
+
+    # Return the recreated object
+    return obj
+
+
+# Utility to create a new class from a JSON description
+# This does not initialize the class
+def monitorValueFromJSON(jsonDict):
+
+    # jsonDict = json.loads(jsonString)
+
+    # Get the object class name
+    className = jsonDict.get('type', None)
+    if className is None:
+        print ("monitorValueFromJSON: no class type specified!")
+        return None
+
+    # Find the class object in our module
+    # This is some voodoo
+    # Monitoring is the package name
+    # className is both the class but also the submodule to search in
+    # The fromlist=[] needs to specify the submodules
+    # So this works as long as each MV type has a unique module
+    # Need a better way to do this (perhaps using __init__.py?
+    class_ = getattr(__import__("Monitoring."+className, fromlist=[className]), className)
+
+    # Instantiate this class
+    obj = class_()
+
+    if obj is None:
+        f.cd("..")
+        raise ObjectNotFoundError("Error: unable to instantiate object", objectName, "!")
+
+    # Update the configuration from the JSON file
+    obj.conf.fromJSON(jsonDict)
+
+    # Also instantiate the selector
+    className = jsonDict.get('selector', None)
+
+    if className is None:
+        obj.selector = None
+        print ("monitorValueFromJSON: No selector specified for value", jsonDict["tag"])
+
+    else:
+        # Find the class name in our module
+        class_ = getattr(__import__("Monitoring."+className, fromlist=[className]), className)
+    # And instantiate this class
+        obj.selector = class_()
+
+        if obj.selector is None:
+            raise ObjectNotFoundError("Error: unable to instantiate object", objectName, "!")
+
+    # Done with selector object
+
+    # Don't call obj.init here, make user do this
+    return obj
+
+# Error in case histogram can't be read
+class ObjectNotFoundError(KeyError):
+     pass
+
+class MonitorValueBase ():
+    """Base class for monitored values"""
+
+    def __init__(self):
+        """Dummy Constructor"""
+
+        # Configuration object to store all needed parameters
+        self.conf = None
+
+        # Histogram (or other ROOT class) containing data
+        self.hist = None
+
+        # Selector class to fill histogram
+        self.selector = None
+
+    # Common init functions
+    def init(self):    
+
+        if self.conf is None:
+            print ("MonitorValueBase: init() called with no valid configuration!")
+            return
+
+        # Set type if not configured
+        actualType = self.__class__.__name__
+        if self.conf.type == None:
+            self.conf.type = actualType
+
+        # Check that type is correct
+        elif actualType != self.conf.type:
+            print ("actualType", actualType, "does not match configured type", self.conf.type,"!")
+            print ("...overriding conf.type")
+            self.conf.type = actualType
+
+        # Initialize the selector
+        if self.selector is not None:
+            self.selector.init(self.conf)
+
+
+    def fill(self, v):
+        # Dummy fill function
+        pass
+
+    def plot(self, c):
+        # Dummy plot function, must pass canvas in case we want to make log scale
+        pass
+
+    def dump(self):
+        """Write histogram to specified stream (stdout by default)"""
+
+        #print("Dump called for", self.conf.tag)
+        print(self.conf)
+        if self.hist is not None:
+            self.hist.Print()
+
+    def __str__(self):
+        return str(self.conf)
+
+    def writeRoot(self, f):
+        """Write hist and conf to open root file f"""
+
+        # Make a subdirectory to contain the components and switch
+        cwd = f.mkdir(self.conf.tag)
+        cwd.cd()
+
+        # Write the histogram first (if it isn't NULL)
+        if self.hist is not None:
+            self.hist.Write()
+
+        # Also write the conf JSON to TString
+        # ROOT name is tag_p
+        jsonString = self.conf.toJSON()
+        ts = ROOT.TNamed(self.conf.tag+"_j", jsonString)
+        ts.Write()
+
+        # Also write pickled object to TString
+        # pickleString = pickle.dumps(self)
+        # ts = ROOT.TNamed(self.tag+"_p", pickleString.decode("utf-8"))
+        # ts.Write()
+
+        # Now go back to starting directory to not screw things up
+        cwd.cd("..")
+
+    # These aren't needed any more
+    # Remove hist from elements to pickle (we save this separately)
+    def __getstate__(self):
+        state = self.__dict__.copy()
+        # Don't pickle hist
+        del state["hist"]
+        return state
+
+    def __setstate__(self, state):
+        self.__dict__.update(state)
+        # Add hist back since it doesn't exist in the pickle
+        self.hist = None
+
+#
+# Base class for configuration objects
+class MonitorConfigBase:
+
+    def __init__(self):
+        """Constructor provides default values"""
+        self.tag = ""    # Unique identifier string
+        self.type = None # Class name of instantiated MonitorValue object
+        self.desc = ""   # Helpful description string
+
+    def toJSON(self, indentLevel=0):
+        """Return JSON string describing values in this class"""
+        return json.dumps(self, default=lambda o: o.__dict__,
+                          sort_keys=True, indent=indentLevel)
+
+    def fromJSONStr(self, jsonString):
+        """Update class attributes using values read in from JSON string"""
+
+        # Note, values not specified will not be changed
+        jsonDict = json.loads(jsonString)
+        self.fromJSON(jsonDict)
+
+    def fromJSON(self, jsonDict):
+        """Update class attributes using values in parsed JSON dict"""
+
+        # This will only work for simple parameters
+        for (key, val) in jsonDict.iteritems():
+            setattr(self, key, val)
+
+    def __str__(self):
+        return self.toJSON(indentLevel=2)
+
diff --git a/Monitoring/python/MonitorValueManager.py b/Monitoring/python/MonitorValueManager.py
new file mode 100755
index 00000000..af869e22
--- /dev/null
+++ b/Monitoring/python/MonitorValueManager.py
@@ -0,0 +1,200 @@
+#!/bin/env python
+#
+# MonitorValueManager.py
+#
+# Defines the MonitorValueManager class that coordinates actions
+# for a large set of instantiated MonitorValue objects
+#
+# Classes
+#   MonitorValueManager
+#
+#  E.Torrence, Aug. 2019 
+#
+# Use python3-style print statements
+from __future__ import print_function
+
+import ROOT
+import json
+
+from Monitoring.MonitorValueBase import monitorValueFromJSON
+
+# Need to import all defined MV types so we can find them below
+from Monitoring.Monitor1DValue import Monitor1DValue
+
+
+class MonitorValueManager:
+    """Class to instantiate and manage a large set of MonitorValue objects"""
+
+    def __init__(self):
+        """Constructor"""
+
+        # Flag to print out some monitoring information
+        self.debug = True
+
+        # dict containing all MonitorValues, tags are used for keys
+        self.mvalDict = dict()
+
+        # Key list, used to keep order straight
+        self.tagList = []
+
+    def addValue(self, val):
+        """Add an instantiated MonitorValue to the dictionary"""
+
+        tag = val.conf.tag
+        if tag in self.mvalDict.keys():
+            print("Value with tag", tag,"already exists!")
+            print(self.mvalDict[tag].conf)
+            return
+
+        self.mvalDict[tag] = val
+        self.tagList.append(tag)
+        
+    def initValues(self):
+        """Call the init method on all stored MVs"""
+        # Loop through all MonitorValues defined and call the init() function
+        for val in self.mvalDict.itervalues():
+            if (self.debug):
+                print("Initializing value", val.conf.tag)
+
+            val.init()
+
+    def fillValues(self, event):
+        """Call the fill method on all stored MVs"""
+        for val in self.mvalDict.itervalues():
+            val.fill(event)
+
+    def writeValues(self, filename):
+        """Write out value histograms to file"""
+
+        # Simplest implementation for now
+        # Add some directory structure later
+        f = ROOT.TFile(filename, "RECREATE")
+
+        for val in self.mvalDict.itervalues():
+            val.writeRoot(f)
+
+        # Cleanup
+        f.Close()
+
+    def plotValuesToPDF(self, filename):
+        """Call the plot methods with output going to a PDF file"""
+        
+        # Lets see if this works
+        c = ROOT.TCanvas()
+        c.Print(filename+"[")
+
+        for tag in self.tagList:
+            val = self.mvalDict[tag]
+            val.plot(c)
+            c.Print(filename)
+
+        c.Print(filename+"]")
+
+    def createValuesFromJSON(self, filename):
+        """ Create values from JSON file of name filename"""
+
+        if self.debug: print("Opening JSON file", filename)
+        # Open file
+        try:
+            f = open(filename)
+        except Exception as e:
+            print("Error opening file", filename)
+            print(e)
+            return
+
+        # Parse JSON
+        if self.debug: print("Parsing JSON")
+        jsonList = json.load(f)
+
+        # Close the file
+        f.close()
+
+        # Keep track of what we are doing
+        count = 0
+        if self.debug: print("Creating objects from JSON")
+        for item in jsonList:
+            try:
+                newval = monitorValueFromJSON(item)
+            except Exception as e:
+                # On error, print error and continue
+                print("MonitorValueManager.createValuesFromJSON - Error creating object", item, "!")
+                print(e)
+                continue
+
+            self.addValue(newval)
+            count += 1
+
+        # Print out some results
+        if (self.debug):
+            print("Created", count, "new values")
+            print("Full list of MonitorValue tags:")
+            for key in sorted(self.mvalDict.keys()):
+                print(key)
+
+    def listValues(self):
+        """Print out type and tags for all defined values"""
+
+
+        print ("Listing of MonitorValues")
+
+        if len(self.mvalDict) == 0:
+            print("Value list is empty!")
+            return
+
+
+        print("Tag   ValueType")
+        print("---   ---------")
+        for tag in self.tagList:
+            print(tag, self.mvalDict[tag].conf.type)
+
+    def dumpValues(self):
+        """Print out verbose information for all defined values"""
+
+        if len(self.mvalDict) == 0:
+            print("Value list is empty!")
+            return
+
+        for tag in self.tagList:         # Sort to get alphabetical listing
+            print()
+            print(tag, self.mvalDict[tag].conf.type)
+            self.mvalDict[tag].dump()
+
+    def writeJSON(self, stream):
+        """Write out JSON for all configured objects to specified stream"""
+
+        jsonList = []
+        for tag in self.tagList:
+            val = self.mvalDict[tag]
+            jsonList.append(val.conf)
+
+        json.dump(jsonList, stream, default=lambda o: o.__dict__, 
+                  sort_keys=True, indent=2)
+
+# Testing code
+if __name__ == '__main__':
+
+    from Monitoring.Monitor1DValue import Monitor1DValue
+
+    mv1 = Monitor1DValue('test1')
+    mv1.conf.setBinning(30, -3., 3.)
+
+    mv2 = Monitor1DValue('test2')
+    mv2.conf.setBinning(60, -3., 3.)
+
+    mvm = MonitorValueManager()
+
+    mvm.addValue(mv1)  # Add already defined mv
+    mvm.addValue(mv2)
+    mvm.initValues()   # Initialize all values
+    mvm.listValues()   # Brief printout of all values
+    mvm.dumpValues()
+
+
+    import sys
+    mvm.writeJSON(sys.stdout)
+    print()
+
+    mvm.createValuesFromJSON('test.json')
+
+    mvm.listValues()
+
diff --git a/Monitoring/python/README b/Monitoring/python/README
new file mode 100644
index 00000000..fb7bb8fe
--- /dev/null
+++ b/Monitoring/python/README
@@ -0,0 +1,11 @@
+Things to do:
+-) Add some structure to the JSON config file, in particular, create
+   some kind of set structure that will be reflected in ROOT file,
+   but also groups monitored quantities by type.
+
+-) Remove JSON text from ROOT file (or store in separate structure)
+
+-) Figure out how to read ntuple variables.  Possibly have a 'handler' by 
+   data type, i.e. TruthParticle or SpacePoints.  These will know how to 
+   decode variables by simple string, and also might have their own config
+   parameters to be set.
diff --git a/Monitoring/python/__init__.py b/Monitoring/python/__init__.py
new file mode 100644
index 00000000..447ad57d
--- /dev/null
+++ b/Monitoring/python/__init__.py
@@ -0,0 +1,2 @@
+# 
+__author__ = "Eric Torrence"
diff --git a/Monitoring/share/simpleMonitoringTest.json b/Monitoring/share/simpleMonitoringTest.json
new file mode 100644
index 00000000..60e8fe25
--- /dev/null
+++ b/Monitoring/share/simpleMonitoringTest.json
@@ -0,0 +1,106 @@
+[
+  {
+    "tag": "eventNumber", 
+    "type": "Monitor1DValue", 
+    "desc": "Event Number",
+    "selector": "LegacySelector",
+    "xvar": "fEventNumber",
+    "nbins": 1000, 
+    "xlo":  0, 
+    "xhi":  10000, 
+    "xlabel": "Event Number", 
+    "ylabel": "Entries",
+    "overflow": true, 
+    "logy": false
+  }, 
+  {
+    "tag": "pdgCode", 
+    "type": "Monitor1DValue", 
+    "desc": "Truth particle PDG Code",
+    "selector": "LegacySelector",
+    "xvar": "fParticles.PdgCode",
+    "nbins": 53, 
+    "xlo": -12, 
+    "xhi":  40, 
+    "xlabel": "PDG Code", 
+    "ylabel": "Entries",
+    "overflow": true, 
+    "logy": true
+  }, 
+  {
+    "tag": "truthEnergy", 
+    "type": "Monitor1DValue", 
+    "desc": "Truth particle energy",
+    "selector": "LegacySelector",
+    "xvar": "fParticles.Energy",
+    "xscale": 0.001,
+    "nbins": 50, 
+    "xlo": 0.0, 
+    "xhi": 1000.0, 
+    "xlabel": "Energy (GeV)", 
+    "ylabel": "Entries",
+    "overflow": true, 
+    "logy": false
+  },
+  {
+    "tag": "truthVertexX", 
+    "type": "Monitor1DValue", 
+    "desc": "Truth particle X Vertex",
+    "selector": "LegacySelector",
+    "xvar": "fParticles.Vertex.x",
+    "xscale": 0.001,
+    "nbins": 50, 
+    "xlo": -0.5, 
+    "xhi": 0.5, 
+    "xlabel": "Truth Vertex X (m)", 
+    "ylabel": "Entries",
+    "overflow": true, 
+    "logy": false
+  },
+  {
+    "tag": "truthVertexY", 
+    "type": "Monitor1DValue", 
+    "desc": "Truth particle Y Vertex",
+    "selector": "LegacySelector",
+    "xvar": "fParticles.Vertex.y",
+    "xscale": 0.001,
+    "nbins": 50, 
+    "xlo": -0.5, 
+    "xhi": 0.5, 
+    "xlabel": "Truth Vertex Y (m)", 
+    "ylabel": "Entries",
+    "overflow": true, 
+    "logy": false
+  },
+  {
+    "tag": "truthVertexZ", 
+    "type": "Monitor1DValue", 
+    "desc": "Truth particle Z Vertex",
+    "selector": "LegacySelector",
+    "xvar": "fParticles.Vertex.z",
+    "xscale": 0.001,
+    "nbins": 50, 
+    "xlo": -2.5, 
+    "xhi": 2.5, 
+    "xlabel": "Truth Vertex Z (m)", 
+    "ylabel": "Entries",
+    "overflow": true, 
+    "logy": false
+  },
+
+  {
+    "tag": "trackerDigiPlane", 
+    "type": "Monitor1DValue", 
+    "desc": "Tracker Digi Plane",
+    "selector": "LegacySelector",
+    "xvar": "fTrackerDigis.Plane",
+    "nbins": 11, 
+    "xlo": -1, 
+    "xhi": 10, 
+    "xlabel": "Plane", 
+    "ylabel": "Digis",
+    "overflow": true, 
+    "logy": false
+  }
+
+]
\ No newline at end of file
diff --git a/Monitoring/share/simpleMonitoringTest.py b/Monitoring/share/simpleMonitoringTest.py
new file mode 100755
index 00000000..f33301e0
--- /dev/null
+++ b/Monitoring/share/simpleMonitoringTest.py
@@ -0,0 +1,41 @@
+#!/bin/env python
+#
+# simpleMonitoringTest.py
+#
+# Example of simple monitoring job using hte MonitorValueManager
+# Need JSON file simpleMonitoringTest.json and a TDR-style
+# ntuple in the run directory
+#
+# E. Torrence, Aug. 2019
+#
+# Use python3-style print statements
+from __future__ import print_function
+
+from Monitoring.MonitorValueManager import MonitorValueManager
+
+import ROOT
+
+# Start by instantiating mvm
+mvm = MonitorValueManager()
+
+# Load the configuration
+mvm.createValuesFromJSON('simpleMonitoringTest.json')
+mvm.initValues()
+# mvm.listValues()  # Check what we have
+mvm.dumpValues()  # Check what we have
+
+# Open ntuple
+tf = ROOT.TFile('ntuple.root')
+tt = tf.Get('faser')
+
+# Loop over events
+for event in tt:
+    mvm.fillValues(event)
+
+tf.Close()
+
+# Write to file
+mvm.writeValues('simpleMonitoringTest.root')
+
+# Plot values
+mvm.plotValuesToPDF('simpleMonitoringTest.pdf')
diff --git a/README.md b/README.md
index d2e2cc4c..4f860069 100644
--- a/README.md
+++ b/README.md
@@ -3,8 +3,12 @@ First barebone project for Calypso based on Athena master. Only packages not inc
 The following sequence will allow you to compile Calypso 1.0.0 on any machine with cvmfs access.
 ```
 #clone the (forked) project to your local machine
-git clone https://:@gitlab.cern.ch:8443/$USERNAME/calypso.git 
+git clone --recursive https://:@gitlab.cern.ch:8443/$USERNAME/calypso.git 
 
+# You also need to update faser-common as a submodule
+cd calypso/faser-common
+git submodule update --init
+cd ../..
 
 #The next three lines are used to setup the ATLAS release environment
 export ATLAS_LOCAL_ROOT_BASE=/cvmfs/atlas.cern.ch/repo/ATLASLocalRootBase 
@@ -14,7 +18,8 @@ asetup --input=calypso/asetup.faser master,latest,Athena
 #create build directory
 mkdir build
 cd build
+
 #build calypso
 cmake -DCMAKE_INSTALL_PREFIX=../run ../calypso ; make ; make install
 
-It can be convenient to alias the "asetup --input=calypso/asetup.faser" to something like "fsetup"
\ No newline at end of file
+It can be convenient to alias the "asetup --input=calypso/asetup.faser" to something like "fsetup"
diff --git a/Scintillator/ScintDetDescr/PreshowerGeoModel/CMakeLists.txt b/Scintillator/ScintDetDescr/PreshowerGeoModel/CMakeLists.txt
index d53c8ec9..14022a10 100644
--- a/Scintillator/ScintDetDescr/PreshowerGeoModel/CMakeLists.txt
+++ b/Scintillator/ScintDetDescr/PreshowerGeoModel/CMakeLists.txt
@@ -5,28 +5,6 @@
 # Declare the package name:
 atlas_subdir( PreshowerGeoModel )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-			              DetectorDescription/GeoPrimitives
-                          GaudiKernel
-                          Scintillator/ScintDetDescr/ScintGeoModelUtils
-                          Scintillator/ScintDetDescr/ScintReadoutGeometry
-                          PRIVATE
-                          Control/SGTools
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeometryDBSvc
-                          DetectorDescription/Identifier
-                          Scintillator/ScintDetDescr/ScintIdentifier 
-                          DetectorDescription/FaserDetDescr
-                          Scintillator/ScintDetDescr/ScintIdentifier )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
@@ -38,7 +16,7 @@ atlas_add_component( PreshowerGeoModel
         		     src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelUtilities GeoModelFaserUtilities GaudiKernel SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions FaserDetDescr ScintGeoModelUtils ScintReadoutGeometry ScintIdentifier Identifier )
+                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel GeoModelUtilities GeoModelFaserUtilities GaudiKernel SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions FaserDetDescr ScintGeoModelUtils ScintReadoutGeometry ScintIdentifier Identifier )
 
 #atlas_add_test( SCT_GMConfig_test
 #                SCRIPT test/SCT_GMConfig_test.py
diff --git a/Scintillator/ScintDetDescr/ScintGeoModelUtils/CMakeLists.txt b/Scintillator/ScintDetDescr/ScintGeoModelUtils/CMakeLists.txt
index d582f262..17066769 100644
--- a/Scintillator/ScintDetDescr/ScintGeoModelUtils/CMakeLists.txt
+++ b/Scintillator/ScintDetDescr/ScintGeoModelUtils/CMakeLists.txt
@@ -5,19 +5,6 @@
 # Declare the package name:
 atlas_subdir( ScintGeoModelUtils )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          GaudiKernel
-                          PRIVATE
-                          Control/StoreGate
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/GeometryDBSvc )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CLHEP )
@@ -30,6 +17,6 @@ atlas_add_library( ScintGeoModelUtils
                    PUBLIC_HEADERS ScintGeoModelUtils
                    INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
                    DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GaudiKernel StoreGateLib SGtests
+                   LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel GaudiKernel StoreGateLib SGtests GeoPrimitives GeometryDBSvcLib
                    PRIVATE_LINK_LIBRARIES GeoModelUtilities GeoModelFaserUtilities )
 
diff --git a/Scintillator/ScintDetDescr/ScintIdentifier/CMakeLists.txt b/Scintillator/ScintDetDescr/ScintIdentifier/CMakeLists.txt
index 58008a3b..6dc9408f 100644
--- a/Scintillator/ScintDetDescr/ScintIdentifier/CMakeLists.txt
+++ b/Scintillator/ScintDetDescr/ScintIdentifier/CMakeLists.txt
@@ -5,16 +5,6 @@
 # Declare the package name:
 atlas_subdir( ScintIdentifier )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/IdDict
-                          DetectorDescription/Identifier
-                          PRIVATE
-                          DetectorDescription/IdDictParser
-                          GaudiKernel )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
diff --git a/Scintillator/ScintDetDescr/ScintReadoutGeometry/CMakeLists.txt b/Scintillator/ScintDetDescr/ScintReadoutGeometry/CMakeLists.txt
index 992fbb0b..d97c23b2 100644
--- a/Scintillator/ScintDetDescr/ScintReadoutGeometry/CMakeLists.txt
+++ b/Scintillator/ScintDetDescr/ScintReadoutGeometry/CMakeLists.txt
@@ -5,28 +5,6 @@
 # Declare the package name:
 atlas_subdir( ScintReadoutGeometry )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/CxxUtils
-                          Control/StoreGate
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/Identifier
-                          GaudiKernel
-#                          InnerDetector/InDetConditions/InDetCondTools
-                          Scintillator/ScintDetDescr/ScintIdentifier
-                          Tracking/TrkDetDescr/TrkDetElementBase
-                          Tracking/TrkDetDescr/TrkSurfaces
-                          Tracking/TrkEvent/TrkEventPrimitives
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          PRIVATE
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/IdDictDetDescr )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Eigen )
@@ -38,6 +16,6 @@ atlas_add_library( ScintReadoutGeometry
                    PUBLIC_HEADERS ScintReadoutGeometry
                    INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
                    DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel CxxUtils FaserDetDescr GeoModelFaserUtilities GeoModelUtilities GeoPrimitives Identifier GaudiKernel ScintIdentifier TrkDetElementBase TrkSurfaces TrkEventPrimitives StoreGateLib SGtests AthenaBaseComps DetDescrConditions
+                   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel CxxUtils FaserDetDescr GeoModelFaserUtilities GeoModelUtilities GeoPrimitives Identifier GaudiKernel ScintIdentifier TrkDetElementBase TrkSurfaces TrkEventPrimitives StoreGateLib SGtests AthenaBaseComps DetDescrConditions
                    PRIVATE_LINK_LIBRARIES AthenaPoolUtilities IdDictDetDescr )
 
diff --git a/Scintillator/ScintDetDescr/TriggerGeoModel/CMakeLists.txt b/Scintillator/ScintDetDescr/TriggerGeoModel/CMakeLists.txt
index b8789d28..682fbdd4 100644
--- a/Scintillator/ScintDetDescr/TriggerGeoModel/CMakeLists.txt
+++ b/Scintillator/ScintDetDescr/TriggerGeoModel/CMakeLists.txt
@@ -5,28 +5,6 @@
 # Declare the package name:
 atlas_subdir( TriggerGeoModel )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-			              DetectorDescription/GeoPrimitives
-                          GaudiKernel
-                          Scintillator/ScintDetDescr/ScintGeoModelUtils
-                          Scintillator/ScintDetDescr/ScintReadoutGeometry
-                          PRIVATE
-                          Control/SGTools
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeometryDBSvc
-                          DetectorDescription/Identifier
-                          Scintillator/ScintDetDescr/ScintIdentifier 
-                          DetectorDescription/FaserDetDescr
-                          Scintillator/ScintDetDescr/ScintIdentifier )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
@@ -38,7 +16,7 @@ atlas_add_component( TriggerGeoModel
         		     src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelUtilities GeoModelFaserUtilities GaudiKernel SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions FaserDetDescr ScintGeoModelUtils ScintReadoutGeometry ScintIdentifier Identifier )
+                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel GeoModelUtilities GeoModelFaserUtilities GaudiKernel SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions FaserDetDescr ScintGeoModelUtils ScintReadoutGeometry ScintIdentifier Identifier )
 
 #atlas_add_test( SCT_GMConfig_test
 #                SCRIPT test/SCT_GMConfig_test.py
diff --git a/Scintillator/ScintDetDescr/VetoGeoModel/CMakeLists.txt b/Scintillator/ScintDetDescr/VetoGeoModel/CMakeLists.txt
index b590639e..7d3eb4ec 100644
--- a/Scintillator/ScintDetDescr/VetoGeoModel/CMakeLists.txt
+++ b/Scintillator/ScintDetDescr/VetoGeoModel/CMakeLists.txt
@@ -5,28 +5,6 @@
 # Declare the package name:
 atlas_subdir( VetoGeoModel )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-			              DetectorDescription/GeoPrimitives
-                          GaudiKernel
-                          Scintillator/ScintDetDescr/ScintGeoModelUtils
-                          Scintillator/ScintDetDescr/ScintReadoutGeometry
-                          PRIVATE
-                          Control/SGTools
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeometryDBSvc
-                          DetectorDescription/Identifier
-                          Scintillator/ScintDetDescr/ScintIdentifier 
-                          DetectorDescription/FaserDetDescr
-                          Scintillator/ScintDetDescr/ScintIdentifier )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
@@ -38,7 +16,7 @@ atlas_add_component( VetoGeoModel
         		     src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelUtilities GeoModelFaserUtilities GaudiKernel SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions FaserDetDescr ScintGeoModelUtils ScintReadoutGeometry ScintIdentifier Identifier )
+                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel GeoModelUtilities GeoModelFaserUtilities GaudiKernel SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions FaserDetDescr ScintGeoModelUtils ScintReadoutGeometry ScintIdentifier Identifier )
 
 #atlas_add_test( SCT_GMConfig_test
 #                SCRIPT test/SCT_GMConfig_test.py
diff --git a/Scintillator/ScintDetDescrCnv/ScintIdCnv/CMakeLists.txt b/Scintillator/ScintDetDescrCnv/ScintIdCnv/CMakeLists.txt
index 07a22222..8e217ad9 100644
--- a/Scintillator/ScintDetDescrCnv/ScintIdCnv/CMakeLists.txt
+++ b/Scintillator/ScintDetDescrCnv/ScintIdCnv/CMakeLists.txt
@@ -5,14 +5,6 @@
 # Declare the package name:
 atlas_subdir( ScintIdCnv )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/StoreGate
-                          DetectorDescription/DetDescrCnvSvc
-                          DetectorDescription/IdDictDetDescr
-                          GaudiKernel
-                          Scintillator/ScintDetDescr/ScintIdentifier )
-
 # Component(s) in the package:
 atlas_add_component( ScintIdCnv
                      src/*.cxx
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/CMakeLists.txt b/Scintillator/ScintEventCnv/ScintByteStream/CMakeLists.txt
new file mode 100644
index 00000000..12e96ba4
--- /dev/null
+++ b/Scintillator/ScintEventCnv/ScintByteStream/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+
+# Declare the package name:
+atlas_subdir( ScintByteStream )
+
+# Component(s) in the package:
+#atlas_add_library( ScintByteStreamLib
+#                   ScintByteStream/*.h 
+#                   PUBLIC_HEADERS ScintByteStream
+#                   LINK_LIBRARIES   StoreGateLib 
+#		            )
+
+atlas_add_component( ScintByteStream
+                     src/*.cxx
+                     src/components/*.cxx
+                     LINK_LIBRARIES AthenaKernel GaudiKernel FaserByteStreamCnvSvcBaseLib FaserEventStorageLib ScintRawEvent
+                     PRIVATE_LINK_LIBRARIES AthenaBaseComps )
+
+atlas_install_python_modules( python/*.py )
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/python/ScintByteStreamConfig.py b/Scintillator/ScintEventCnv/ScintByteStream/python/ScintByteStreamConfig.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/python/__init__.py b/Scintillator/ScintEventCnv/ScintByteStream/python/__init__.py
new file mode 100644
index 00000000..547eccb6
--- /dev/null
+++ b/Scintillator/ScintEventCnv/ScintByteStream/python/__init__.py
@@ -0,0 +1 @@
+#ScintByteStream
\ No newline at end of file
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.cxx b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.cxx
new file mode 100644
index 00000000..ff588cdd
--- /dev/null
+++ b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.cxx
@@ -0,0 +1,102 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#include "ScintByteStreamCnv.h"
+#include "ScintWaveformDecoderTool.h"
+
+#include "FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h"
+#include "ScintRawEvent/ScintWaveform.h"
+#include "ScintRawEvent/ScintWaveformContainer.h"
+#include "EventFormats/DAQFormats.hpp"
+
+#include "AthenaKernel/errorcheck.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/DataObject.h"
+#include "GaudiKernel/IRegistry.h"
+
+#include "StoreGate/StoreGateSvc.h"
+#include "GaudiKernel/IToolSvc.h"
+
+using DAQFormats::EventFull;
+
+ScintByteStreamCnv::ScintByteStreamCnv(ISvcLocator* svcloc)
+  : Converter(storageType(), classID(), svcloc)
+  , AthMessaging(svcloc != nullptr ? msgSvc() : nullptr, "ScintByteStreamCnv")
+  , m_name("ScintByteStreamCnv")
+  , m_tool("ScintWaveformDecoderTool")
+  , m_rdpSvc("FaserROBDataProviderSvc", m_name)
+{
+  ATH_MSG_DEBUG(m_name+"::initialize() called");
+}
+
+ScintByteStreamCnv::~ScintByteStreamCnv() {
+}
+
+const CLID& ScintByteStreamCnv::classID() 
+{
+  // Change to our data object
+  return ClassID_traits<ScintWaveformContainer>::ID();
+}
+
+StatusCode ScintByteStreamCnv::initialize() 
+{
+  ATH_MSG_DEBUG(m_name+"::initialize() called");
+
+  CHECK(Converter::initialize());
+  CHECK(m_rdpSvc.retrieve());
+  CHECK(m_tool.retrieve());
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode ScintByteStreamCnv::finalize() 
+{
+  ATH_MSG_DEBUG("ScintByteStreamCnv::Finalize");
+
+  CHECK(Converter::finalize());
+  return StatusCode::SUCCESS;  
+
+}
+
+StatusCode ScintByteStreamCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj) 
+{
+  ATH_MSG_DEBUG("ScintByteStreamCnv::createObj() called");
+
+  // Check that we can access raw data
+  if (!m_rdpSvc) {
+    ATH_MSG_ERROR("ScintByteStreamCnv::createObj() - ROBDataProviderSvc not loaded!");
+    return StatusCode::FAILURE;
+  }
+
+  FaserByteStreamAddress *pRE_Addr{nullptr};
+  pRE_Addr = dynamic_cast<FaserByteStreamAddress*>(pAddr); // Cast from OpaqueAddress
+  if (!pRE_Addr) {
+    ATH_MSG_ERROR("Cannot cast to FaserByteStreamAddress ");
+    return StatusCode::FAILURE;
+  }
+
+  // Get pointer to the raw event
+  const EventFull* re = m_rdpSvc->getEvent();
+  if (!re) {
+    ATH_MSG_ERROR("Cannot get raw event from FaserByteStreamInputSvc!");
+    return StatusCode::FAILURE;
+  }               
+
+  // Get key used in the StoreGateSvc::retrieve function
+  const std::string key = *(pRE_Addr->par());
+  ATH_MSG_DEBUG("ScintByteStreamCnv - creating objects "+key);
+
+  ScintWaveformContainer* wfmCont = new ScintWaveformContainer;
+
+  // Convert selected channels
+
+  CHECK( m_tool->convert(re, wfmCont, key) );
+  
+  pObj = SG::asStorable(wfmCont);
+
+  ATH_MSG_DEBUG(" New xAOD::ScintWaveformData created");
+  return StatusCode::SUCCESS;
+}
+
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.h b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.h
new file mode 100644
index 00000000..4b296547
--- /dev/null
+++ b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintByteStreamCnv.h
@@ -0,0 +1,48 @@
+//Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef SCINTBYTESTREAM_SCINTBYTESTREAMCNV_H
+#define SCINTBYTESTREAM_SCINTBYTESTREAMCNV_H
+
+#include "GaudiKernel/ClassID.h"
+#include "GaudiKernel/Converter.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include "AthenaBaseComps/AthMessaging.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+class ScintWaveformDecoderTool;
+class IFaserROBDataProviderSvc;
+
+// Abstract factory to create the converter
+template <class TYPE> class CnvFactory;
+
+class ScintByteStreamCnv: public Converter, public AthMessaging {
+
+public: 
+  ScintByteStreamCnv(ISvcLocator* svcloc);
+  virtual ~ScintByteStreamCnv();
+  
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  
+  virtual StatusCode createObj(IOpaqueAddress* pAddr, DataObject*& pObj) override;  
+  /// Storage type and class ID
+  virtual long repSvcType() const override { return i_repSvcType(); }
+  static long storageType() { return FaserByteStreamAddress::storageType(); }
+  static const CLID& classID();
+  
+private:
+  std::string m_name;
+  ToolHandle<ScintWaveformDecoderTool> m_tool;
+  ServiceHandle<IFaserROBDataProviderSvc> m_rdpSvc;
+
+};
+
+#endif  /* SCINTBYTESTREAM_SCINTBYTESTREAMCNV_H */
+
+
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.cxx b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.cxx
new file mode 100644
index 00000000..8cb9a344
--- /dev/null
+++ b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.cxx
@@ -0,0 +1,147 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#include "ScintWaveformDecoderTool.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include "ScintRawEvent/ScintWaveform.h"
+#include "EventFormats/DigitizerDataFragment.hpp"
+
+static const InterfaceID IID_IScintWaveformDecoderTool("ScintWaveformDecoderTool", 1, 0);
+
+const InterfaceID& ScintWaveformDecoderTool::interfaceID() {
+  return IID_IScintWaveformDecoderTool;
+}
+
+ScintWaveformDecoderTool::ScintWaveformDecoderTool(const std::string& type, 
+      const std::string& name,const IInterface* parent)
+  : AthAlgTool(type, name, parent)
+{
+  declareInterface<ScintWaveformDecoderTool>(this);
+
+  declareProperty("CaloChannels", m_caloChannels);
+  m_caloChannels.push_back(0);
+
+  declareProperty("VetoChannels", m_vetoChannels);
+  m_vetoChannels.push_back(1);
+
+  declareProperty("TriggerChannels", m_triggerChannels);
+  m_triggerChannels.push_back(2);
+
+  declareProperty("PreshowerChannels", m_preshowerChannels);
+  m_preshowerChannels.push_back(3);
+
+  declareProperty("TestChannels", m_testChannels);
+  m_testChannels.push_back(4);
+
+}
+
+ScintWaveformDecoderTool::~ScintWaveformDecoderTool()
+{
+}
+
+StatusCode
+ScintWaveformDecoderTool::initialize() 
+{
+  ATH_MSG_DEBUG("ScintWaveformDecoderTool::initialize()");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+ScintWaveformDecoderTool::finalize() 
+{
+  ATH_MSG_DEBUG("ScintWaveformDecoderTool::finalize()");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+ScintWaveformDecoderTool::convert(const DAQFormats::EventFull* re, 
+				  ScintWaveformContainer* container,
+				  const std::string key)
+{
+  ATH_MSG_DEBUG("ScintWaveformDecoderTool::convert("+key+")");
+
+  if (!re) {
+    ATH_MSG_ERROR("EventFull passed to convert() is null!");
+    return StatusCode::FAILURE;
+  }
+
+  if (!container) {
+    ATH_MSG_ERROR("ScintWaveformContainer passed to convert() is null!");
+    return StatusCode::FAILURE;
+  }
+
+  // Find the Waveform fragment
+  const DigitizerDataFragment* digitizer = NULL;
+  const DAQFormats::EventFragment* frag = NULL;
+  for(const auto &id : re->getFragmentIDs()) {
+    frag=re->find_fragment(id);
+
+    if ((frag->source_id()&0xFFFF0000) != DAQFormats::SourceIDs::PMTSourceID) continue;
+    ATH_MSG_DEBUG("Fragment:\n" << *frag);
+
+    digitizer = new DigitizerDataFragment(frag->payload<const uint32_t*>(), frag->payload_size()); 
+    break;
+  }
+
+  if (!digitizer) {
+    ATH_MSG_ERROR("Failed to find TLB fragment in raw event!");
+    return StatusCode::FAILURE;
+  }
+
+  // ATH_MSG_DEBUG("Digitizer Fragment:\n" << *digitizer);
+
+  std::vector<unsigned int>* channelList;
+
+  if (key == std::string("CaloWaveforms")) {
+    channelList = &m_caloChannels;
+  } else if (key == std::string("VetoWaveforms")) {
+    channelList = &m_vetoChannels;
+  } else if (key == std::string("TriggerWaveforms")) {
+    channelList = &m_triggerChannels;
+  } else if (key == std::string("PreshowerWaveforms")) {
+    channelList = &m_preshowerChannels;
+  } else if (key == std::string("TestWaveforms")) {
+    channelList = &m_testChannels;
+  } else {
+    ATH_MSG_ERROR("Unknown key " << key);
+    return StatusCode::FAILURE;
+  }
+
+  for (unsigned int channel: *channelList) {
+    ATH_MSG_DEBUG("Converting channel "+std::to_string(channel)+" for "+key);
+
+    ScintWaveform* wfm = new ScintWaveform();
+
+    // Finally, set values in Waveform object from Digitizer fragment
+    try {
+      wfm->setWaveform( channel, digitizer->channel_adc_counts( channel ) );
+    } catch ( DigitizerDataException& e ) {
+      ATH_MSG_INFO("ScintWaveformDecoderTool:\n"
+		   <<e.what()
+		   << "\nChannel "
+		   << channel
+		   << " not filled!\n");
+    }
+
+    try {
+      wfm->setHeader( digitizer );
+
+    } catch ( DigitizerDataException& e ) {
+      ATH_MSG_WARNING("ScintWaveformDecoderTool:\n"
+		      << e.what()
+		      << "\nCorrupted Digitizer data!\n"
+		      << *frag);
+    }
+
+    container->push_back(wfm);    
+  }
+
+  // Don't spring a leak
+  delete digitizer;
+
+ATH_MSG_DEBUG( "ScintWaveformDecoderTool created container " << key 
+<< " with size=" << container->size());
+  return StatusCode::SUCCESS; 
+}
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.h b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.h
new file mode 100644
index 00000000..0c43dc02
--- /dev/null
+++ b/Scintillator/ScintEventCnv/ScintByteStream/src/ScintWaveformDecoderTool.h
@@ -0,0 +1,45 @@
+//Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef SCINTBYTESTREAM_FASERTRIGGERDECODERTOOL_H
+#define SCINTBYTESTREAM_FASERTRIGGERDECODERTOOL_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include "EventFormats/DAQFormats.hpp"
+#include "ScintRawEvent/ScintWaveformContainer.h"
+
+// This class provides conversion between bytestream and Waveform objects
+
+class ScintWaveformDecoderTool : public AthAlgTool {
+
+ public:
+  ScintWaveformDecoderTool(const std::string& type, const std::string& name, 
+			  const IInterface* parent);
+
+  virtual ~ScintWaveformDecoderTool();
+
+  static const InterfaceID& interfaceID();
+
+  virtual StatusCode initialize();
+  virtual StatusCode finalize();
+
+  StatusCode convert(const DAQFormats::EventFull* re, ScintWaveformContainer* wfm, std::string key);
+
+private:
+  // List of channels to include in each container
+  std::vector<unsigned int> m_caloChannels;
+  std::vector<unsigned int> m_vetoChannels;
+  std::vector<unsigned int> m_triggerChannels;
+  std::vector<unsigned int> m_preshowerChannels;
+  std::vector<unsigned int> m_testChannels;
+
+
+};
+
+#endif  /* SCINTBYTESTREAM_FASERTRIGGERDECODERTOOL_H */
+ 
diff --git a/Scintillator/ScintEventCnv/ScintByteStream/src/components/ScintByteStream_entries.cxx b/Scintillator/ScintEventCnv/ScintByteStream/src/components/ScintByteStream_entries.cxx
new file mode 100644
index 00000000..f44dd7e5
--- /dev/null
+++ b/Scintillator/ScintEventCnv/ScintByteStream/src/components/ScintByteStream_entries.cxx
@@ -0,0 +1,6 @@
+#include "../ScintWaveformDecoderTool.h"
+#include "../ScintByteStreamCnv.h"
+
+DECLARE_COMPONENT( ScintWaveformDecoderTool )
+
+DECLARE_CONVERTER( ScintByteStreamCnv )
diff --git a/Scintillator/ScintEventCnv/ScintSimEventAthenaPool/CMakeLists.txt b/Scintillator/ScintEventCnv/ScintSimEventAthenaPool/CMakeLists.txt
index 48482343..8983143e 100644
--- a/Scintillator/ScintEventCnv/ScintSimEventAthenaPool/CMakeLists.txt
+++ b/Scintillator/ScintEventCnv/ScintSimEventAthenaPool/CMakeLists.txt
@@ -5,16 +5,6 @@
 # Declare the package name:
 atlas_subdir( ScintSimEventAthenaPool )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          AtlasTest/TestTools
-                          Database/AthenaPOOL/AthenaPoolCnvSvc
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          Database/AtlasSealCLHEP
-                          GaudiKernel
-                          Scintillator/ScintEventCnv/ScintSimEventTPCnv
-                          Scintillator/ScintSimEvent )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
@@ -33,5 +23,5 @@ atlas_add_dictionary( ScintSimEventAthenaPoolCnvDict
 
 # Install files from the package:
 atlas_install_headers( ScintSimEventAthenaPool )
-atlas_install_joboptions( share/*.py )
+#atlas_install_joboptions( share/*.py )
 
diff --git a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt
index ff9e4ed6..89c0c08d 100644
--- a/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt
+++ b/Scintillator/ScintEventCnv/ScintSimEventTPCnv/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( ScintSimEventTPCnv )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Database/AthenaPOOL/AthenaPoolCnvSvc
-                          GaudiKernel
-                          Generators/GeneratorObjectsTPCnv
-                          Scintillator/ScintSimEvent
-                          PRIVATE
-                          AtlasTest/TestTools
-                          Control/StoreGate
-                          DetectorDescription/Identifier )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
diff --git a/Scintillator/ScintG4/PreshowerG4_SD/CMakeLists.txt b/Scintillator/ScintG4/PreshowerG4_SD/CMakeLists.txt
index d98580ad..8c7e901a 100644
--- a/Scintillator/ScintG4/PreshowerG4_SD/CMakeLists.txt
+++ b/Scintillator/ScintG4/PreshowerG4_SD/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( PreshowerG4_SD )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/StoreGate
-                          GaudiKernel
-                          Scintillator/ScintSimEvent
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Sim/FaserMCTruth
-                           )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
@@ -26,11 +17,6 @@ atlas_add_component( PreshowerG4_SD
                      INCLUDE_DIRS ${GEANT4_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
                      LINK_LIBRARIES ${GEANT4_LIBRARIES} ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} StoreGateLib SGtests GaudiKernel ScintSimEvent G4AtlasToolsLib FaserMCTruth )
 
-atlas_add_test( PreshowerG4_SDToolConfig_test
-                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/PreshowerG4_SDToolConfig_test.py
-                PROPERTIES TIMEOUT 300 )
-
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_scripts( test/*.py )
 
diff --git a/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py b/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py
index 9bd507ee..96b90c45 100644
--- a/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py
+++ b/Scintillator/ScintG4/PreshowerG4_SD/python/PreshowerG4_SDToolConfig.py
@@ -2,7 +2,7 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
-from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
+# from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
 
 PreshowerSensorSDTool=CompFactory.PreshowerSensorSDTool
 
@@ -10,12 +10,13 @@ def PreshowerSensorSDCfg(ConfigFlags, name="PreshowerSensorSD", **kwargs):
 
     result = ComponentAccumulator()
     bare_collection_name = "PreshowerHits"
-    mergeable_collection_suffix = "_G4"
-    merger_input_property = "PreshowerHits"
+    # mergeable_collection_suffix = "_G4"
+    # merger_input_property = "PreshowerHits"
 
-    acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property)
+    # acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property, "SCINT")
+    # kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
     kwargs.setdefault("LogicalVolumeNames", ["Preshower::Plate"])
-    kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
+    kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    result.merge(acc)
+    # result.merge(acc)
     return result, PreshowerSensorSDTool(name, **kwargs)
diff --git a/Scintillator/ScintG4/PreshowerG4_SD/test/PreshowerG4_SDToolConfig_test.py b/Scintillator/ScintG4/PreshowerG4_SD/test/PreshowerG4_SDToolConfig_test.py
deleted file mode 100644
index e94aa49b..00000000
--- a/Scintillator/ScintG4/PreshowerG4_SD/test/PreshowerG4_SDToolConfig_test.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-"""Run tests on PreshowerG4_SD configuration
-
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-"""
-from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-
-
-if __name__ == '__main__':
-  
-
-  #import config flags
-  from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-  # Set up logging and config behaviour
-  from AthenaCommon.Logging import log
-  from AthenaCommon.Constants import DEBUG
-  from AthenaCommon.Configurable import Configurable
-  log.setLevel(DEBUG)
-  Configurable.configurableRun3Behavior = 1
-
-
-  # ConfigFlags.Sim.ISF.Run = True
-  ConfigFlags.Detector.SimulatePreshower = True
-
-  #Provide input
-  from AthenaConfiguration.TestDefaults import defaultTestFiles
-  inputDir = defaultTestFiles.d
-  ConfigFlags.Input.Files = defaultTestFiles.EVNT
-  
-  # Finalize 
-  ConfigFlags.lock()
-
-
-  ## Initialize a new component accumulator
-  cfg = ComponentAccumulator()
-
-  from PreshowerG4_SD.PreshowerG4_SDToolConfig import PreshowerSensorSDCfg
-
-  acc, tool = PreshowerSensorSDCfg(ConfigFlags) 
-  acc.addPublicTool(tool) 
-  cfg.merge(acc)
-
-
-  cfg.printConfig(withDetails=True, summariseProps = True)
-  ConfigFlags.dump()
-
-  f=open("test.pkl","wb")
-  cfg.store(f) 
-  f.close()
-
-
-
-  print(cfg._publicTools)
-  print("-----------------finished----------------------")
diff --git a/Scintillator/ScintG4/TriggerG4_SD/CMakeLists.txt b/Scintillator/ScintG4/TriggerG4_SD/CMakeLists.txt
index 543bbe34..fc5dfec8 100644
--- a/Scintillator/ScintG4/TriggerG4_SD/CMakeLists.txt
+++ b/Scintillator/ScintG4/TriggerG4_SD/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( TriggerG4_SD )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/StoreGate
-                          GaudiKernel
-                          Scintillator/ScintSimEvent
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Sim/FaserMCTruth
-                           )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
@@ -26,11 +17,6 @@ atlas_add_component( TriggerG4_SD
                      INCLUDE_DIRS ${GEANT4_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
                      LINK_LIBRARIES ${GEANT4_LIBRARIES} ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} StoreGateLib SGtests GaudiKernel ScintSimEvent G4AtlasToolsLib FaserMCTruth )
 
-atlas_add_test( TriggerG4_SDToolConfig_test
-                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/TriggerG4_SDToolConfig_test.py
-                PROPERTIES TIMEOUT 300 )
-
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_scripts( test/*.py )
 
diff --git a/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py b/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py
index 6e49a4e5..dae6ba97 100644
--- a/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py
+++ b/Scintillator/ScintG4/TriggerG4_SD/python/TriggerG4_SDToolConfig.py
@@ -2,7 +2,7 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
-from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
+# from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
 
 TriggerSensorSDTool=CompFactory.TriggerSensorSDTool
 
@@ -10,12 +10,13 @@ def TriggerSensorSDCfg(ConfigFlags, name="TriggerSensorSD", **kwargs):
 
     result = ComponentAccumulator()
     bare_collection_name = "TriggerHits"
-    mergeable_collection_suffix = "_G4"
-    merger_input_property = "TriggerHits"
+    # mergeable_collection_suffix = "_G4"
+    # merger_input_property = "TriggerHits"
 
-    acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property)
+    # acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property, "SCINT")
+    # kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
     kwargs.setdefault("LogicalVolumeNames", ["Trigger::Plate"])
-    kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
+    kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    result.merge(acc)
+    # result.merge(acc)
     return result, TriggerSensorSDTool(name, **kwargs)
diff --git a/Scintillator/ScintG4/TriggerG4_SD/test/TriggerG4_SDToolConfig_test.py b/Scintillator/ScintG4/TriggerG4_SD/test/TriggerG4_SDToolConfig_test.py
deleted file mode 100644
index f983a561..00000000
--- a/Scintillator/ScintG4/TriggerG4_SD/test/TriggerG4_SDToolConfig_test.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-"""Run tests on TriggerG4_SD configuration
-
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-"""
-from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-
-
-if __name__ == '__main__':
-  
-
-  #import config flags
-  from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-  # Set up logging and config behaviour
-  from AthenaCommon.Logging import log
-  from AthenaCommon.Constants import DEBUG
-  from AthenaCommon.Configurable import Configurable
-  log.setLevel(DEBUG)
-  Configurable.configurableRun3Behavior = 1
-
-
-  # ConfigFlags.Sim.ISF.Run = True
-  ConfigFlags.Detector.SimulateTrigger = True
-
-  #Provide input
-  from AthenaConfiguration.TestDefaults import defaultTestFiles
-  inputDir = defaultTestFiles.d
-  ConfigFlags.Input.Files = defaultTestFiles.EVNT
-  
-  # Finalize 
-  ConfigFlags.lock()
-
-
-  ## Initialize a new component accumulator
-  cfg = ComponentAccumulator()
-
-  from TriggerG4_SD.TriggerG4_SDToolConfig import TriggerSensorSDCfg
-
-  acc, tool = TriggerSensorSDCfg(ConfigFlags) 
-  acc.addPublicTool(tool) 
-  cfg.merge(acc)
-
-
-  cfg.printConfig(withDetails=True, summariseProps = True)
-  ConfigFlags.dump()
-
-  f=open("test.pkl","wb")
-  cfg.store(f) 
-  f.close()
-
-
-
-  print (cfg._publicTools)
-  print ("-----------------finished----------------------")
diff --git a/Scintillator/ScintG4/VetoG4_SD/CMakeLists.txt b/Scintillator/ScintG4/VetoG4_SD/CMakeLists.txt
index a0091083..1e2e9d73 100644
--- a/Scintillator/ScintG4/VetoG4_SD/CMakeLists.txt
+++ b/Scintillator/ScintG4/VetoG4_SD/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( VetoG4_SD )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/StoreGate
-                          GaudiKernel
-                          Scintillator/ScintSimEvent
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Sim/FaserMCTruth
-                           )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
@@ -26,11 +17,6 @@ atlas_add_component( VetoG4_SD
                      INCLUDE_DIRS ${GEANT4_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
                      LINK_LIBRARIES ${GEANT4_LIBRARIES} ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} StoreGateLib SGtests GaudiKernel ScintSimEvent G4AtlasToolsLib FaserMCTruth )
 
-atlas_add_test( VetoG4_SDToolConfig_test
-                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/VetoG4_SDToolConfig_test.py
-                PROPERTIES TIMEOUT 300 )
-
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_scripts( test/*.py )
 
diff --git a/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py b/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py
index fcb32ace..ccc50ce9 100644
--- a/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py
+++ b/Scintillator/ScintG4/VetoG4_SD/python/VetoG4_SDToolConfig.py
@@ -2,7 +2,7 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
-from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
+# from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
 
 VetoSensorSDTool=CompFactory.VetoSensorSDTool
 
@@ -10,12 +10,13 @@ def VetoSensorSDCfg(ConfigFlags, name="VetoSensorSD", **kwargs):
 
     result = ComponentAccumulator()
     bare_collection_name = "VetoHits"
-    mergeable_collection_suffix = "_G4"
-    merger_input_property = "VetoHits"
+    # mergeable_collection_suffix = "_G4"
+    # merger_input_property = "VetoHits"
 
-    acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property)
+    # acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property, 'SCINT')
+    # kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
     kwargs.setdefault("LogicalVolumeNames", ["Veto::Plate"])
-    kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
+    kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    result.merge(acc)
+    # result.merge(acc)
     return result, VetoSensorSDTool(name, **kwargs)
diff --git a/Scintillator/ScintG4/VetoG4_SD/test/VetoG4_SDToolConfig_test.py b/Scintillator/ScintG4/VetoG4_SD/test/VetoG4_SDToolConfig_test.py
deleted file mode 100644
index 5d361203..00000000
--- a/Scintillator/ScintG4/VetoG4_SD/test/VetoG4_SDToolConfig_test.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-"""Run tests on VetoG4_SD configuration
-
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-"""
-from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-
-
-if __name__ == '__main__':
-  
-
-  #import config flags
-  from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-  # Set up logging and config behaviour
-  from AthenaCommon.Logging import log
-  from AthenaCommon.Constants import DEBUG
-  from AthenaCommon.Configurable import Configurable
-  log.setLevel(DEBUG)
-  Configurable.configurableRun3Behavior = 1
-
-
-  # ConfigFlags.Sim.ISF.Run = True
-  ConfigFlags.Detector.SimulateVeto = True
-
-  #Provide input
-  from AthenaConfiguration.TestDefaults import defaultTestFiles
-  inputDir = defaultTestFiles.d
-  ConfigFlags.Input.Files = defaultTestFiles.EVNT
-  
-  # Finalize 
-  ConfigFlags.lock()
-
-
-  ## Initialize a new component accumulator
-  cfg = ComponentAccumulator()
-
-  from VetoG4_SD.VetoG4_SDToolConfig import VetoSensorSDCfg
-
-  acc, tool = VetoSensorSDCfg(ConfigFlags) 
-  acc.addPublicTool(tool) 
-  cfg.merge(acc)
-
-
-  cfg.printConfig(withDetails=True, summariseProps = True)
-  ConfigFlags.dump()
-
-  f=open("test.pkl","wb")
-  cfg.store(f) 
-  f.close()
-
-
-
-  print (cfg._publicTools)
-  print ("-----------------finished----------------------")
diff --git a/Scintillator/ScintRawEvent/CMakeLists.txt b/Scintillator/ScintRawEvent/CMakeLists.txt
new file mode 100644
index 00000000..4f97a2a9
--- /dev/null
+++ b/Scintillator/ScintRawEvent/CMakeLists.txt
@@ -0,0 +1,27 @@
+################################################################################
+# Package: ScintRawEvent
+################################################################################
+
+# Declare the package name:
+atlas_subdir( ScintRawEvent )
+
+# External dependencies:
+find_package( CLHEP )
+find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
+
+# Component(s) in the package:
+atlas_add_library( ScintRawEvent
+                   src/*.cxx
+                   PUBLIC_HEADERS ScintRawEvent
+                   INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS}
+                   PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+                   DEFINITIONS ${CLHEP_DEFINITIONS}
+                   LINK_LIBRARIES ${CLHEP_LIBRARIES} AthAllocators AthenaKernel CxxUtils StoreGateLib SGtests
+                   PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} ScintIdentifier EventFormats )
+
+atlas_add_dictionary( ScintRawEventDict
+                      ScintRawEvent/ScintRawEventDict.h
+                      ScintRawEvent/selection.xml
+                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${GEANT4_INCLUDE_DIRS}
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthAllocators CxxUtils StoreGateLib ScintIdentifier ScintRawEvent )
+
diff --git a/Scintillator/ScintRawEvent/ScintRawEvent/ScintRawEventDict.h b/Scintillator/ScintRawEvent/ScintRawEvent/ScintRawEventDict.h
new file mode 100644
index 00000000..9a41f314
--- /dev/null
+++ b/Scintillator/ScintRawEvent/ScintRawEvent/ScintRawEventDict.h
@@ -0,0 +1,10 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef SCINTRAWEVENT_SCINTRAWEVENTDICT_H
+#define SCINTRAWEVENT_SCINTRAWEVENTDICT_H
+
+#include "ScintRawEvent/ScintWaveformContainer.h"
+
+#endif
diff --git a/Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveform.h b/Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveform.h
new file mode 100644
index 00000000..0c211be6
--- /dev/null
+++ b/Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveform.h
@@ -0,0 +1,134 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+///////////////////////////////////////////////////////////////////
+// ScintWaveform.h
+//   Header file for class ScintWaveform
+///////////////////////////////////////////////////////////////////
+// Class for the raw waveform data for all scintillator detectors
+// This is a direct conversion of the DigitizerDataFragment data
+///////////////////////////////////////////////////////////////////
+
+#ifndef SCINTRAWEVENT_SCINTWAVEFORM_H
+#define SCINTRAWEVENT_SCINTWAVEFORM_H
+
+#include <bitset>
+#include <vector>
+#include <stdio.h>
+#include <iostream>
+#include <iomanip>
+
+#include "AthenaKernel/CLASS_DEF.h"
+
+class DigitizerDataFragment;
+
+class ScintWaveform  {
+
+  ///////////////////////////////////////////////////////////////////
+  // Public methods:
+  ///////////////////////////////////////////////////////////////////
+public:
+
+  // Default constructor
+  ScintWaveform();
+
+  // Destructor:
+  virtual ~ScintWaveform(); 
+  
+  //move assignment defaulted
+  ScintWaveform & operator = (ScintWaveform &&) = default;
+  //assignment defaulted
+  ScintWaveform & operator = (const ScintWaveform &) = default;
+  //copy c'tor defaulted
+  ScintWaveform(const ScintWaveform &) = default;
+
+  ///////////////////////////////////////////////////////////////////
+  // Const methods:
+  ///////////////////////////////////////////////////////////////////
+
+  // General data from Digitizer
+  unsigned int board_id() const;
+  bool         board_fail_flag() const;
+  unsigned int pattern_trig_options() const;
+  unsigned int channel_mask() const;
+  unsigned int event_counter() const;
+  unsigned int trigger_time_tag() const;
+  unsigned int n_samples() const;
+
+  // Waveform data
+  unsigned int channel() const;
+  const std::vector<unsigned int>& adc_counts() const;
+
+  unsigned int identify() const;
+
+  // some print-out:
+  void print() const;
+
+  bool operator < (const ScintWaveform& rhs) const
+  {return m_ID < rhs.m_ID;}
+
+  // Set functions
+  void setIdentifier (unsigned int id);
+  void setHeader (const DigitizerDataFragment* frag);
+  void setWaveform (unsigned int channel, const std::vector<uint16_t> waveform);
+
+  ///////////////////////////////////////////////////////////////////
+  // Private data:
+  ///////////////////////////////////////////////////////////////////
+private:
+  uint32_t m_board_id;
+  bool     m_board_fail_flag;
+  uint16_t m_pattern_trig_options;
+  uint16_t m_channel_mask;
+  uint32_t m_event_counter;
+  uint32_t m_trigger_time_tag;
+      
+  unsigned int m_samples;
+  unsigned int m_channel;
+  std::vector<unsigned int> m_adc_counts;
+
+  unsigned int m_ID;
+};
+
+
+///////////////////////////////////////////////////////////////////
+// Inline methods:
+///////////////////////////////////////////////////////////////////
+
+inline unsigned int
+ScintWaveform::channel() const { return m_channel; }
+
+inline unsigned int 
+ScintWaveform::board_id() const { return m_board_id; }
+
+inline bool 
+ScintWaveform::board_fail_flag() const { return m_board_fail_flag; }
+
+inline unsigned int 
+ScintWaveform::pattern_trig_options() const { return m_pattern_trig_options; }
+
+inline unsigned int 
+ScintWaveform::channel_mask() const { return m_channel_mask; }
+
+inline unsigned int 
+ScintWaveform::event_counter() const { return m_event_counter; }
+
+inline unsigned int 
+ScintWaveform::trigger_time_tag() const { return m_trigger_time_tag; }
+
+inline unsigned int 
+ScintWaveform::n_samples() const { return m_samples; }
+
+inline const std::vector<unsigned int>&
+ScintWaveform::adc_counts() const { return m_adc_counts; }
+
+inline unsigned int 
+ScintWaveform::identify() const { return m_ID; }
+
+std::ostream 
+&operator<<(std::ostream &out, const ScintWaveform &wfm);
+
+CLASS_DEF( ScintWaveform, 193792541, 1 )
+
+#endif // SCINTRAWEVENT_SCINTWAVEFORM_H
diff --git a/Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveformContainer.h b/Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveformContainer.h
new file mode 100644
index 00000000..4438e55d
--- /dev/null
+++ b/Scintillator/ScintRawEvent/ScintRawEvent/ScintWaveformContainer.h
@@ -0,0 +1,24 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef SCINTRAWEVENT_SCINTWAVEFORMCONTAINER_H
+#define SCINTRAWEVENT_SCINTWAVEFORMCONTAINER_H
+
+#include "ScintRawEvent/ScintWaveform.h"
+#include "AthContainers/DataVector.h"
+#include "AthenaKernel/CLASS_DEF.h"
+
+// Make this a class in case we need to add some functions
+class ScintWaveformContainer : public DataVector<ScintWaveform> {
+ public:
+  void print() const;
+};
+
+std::ostream 
+&operator<<(std::ostream &out, const ScintWaveformContainer &container);
+
+CLASS_DEF(ScintWaveformContainer, 1215612331, 1 )
+SG_BASE(ScintWaveformContainer, DataVector<ScintWaveform>);
+
+#endif // SCINTRAWEVENT_SCINTWAVEFORMCONTAINER_H
diff --git a/Scintillator/ScintRawEvent/ScintRawEvent/selection.xml b/Scintillator/ScintRawEvent/ScintRawEvent/selection.xml
new file mode 100644
index 00000000..f60a803c
--- /dev/null
+++ b/Scintillator/ScintRawEvent/ScintRawEvent/selection.xml
@@ -0,0 +1,7 @@
+<lcgdict>
+  <class name="ScintWaveformContainer" id="f40fd51f-b70e-4cc8-971d-b6ab5c751a86" />
+  <class name="DataVector<ScintWaveform>" id="e4b393bd-e9b8-458a-8691-b0ebbfd6999c" />
+  <class name="std::vector<ScintWaveform*>" />
+  <class name="std::vector<const ScintWaveform*>" />
+  <class name="ScintWaveform" />
+</lcgdict>
diff --git a/Scintillator/ScintRawEvent/src/ScintWaveform.cxx b/Scintillator/ScintRawEvent/src/ScintWaveform.cxx
new file mode 100644
index 00000000..b525f2e0
--- /dev/null
+++ b/Scintillator/ScintRawEvent/src/ScintWaveform.cxx
@@ -0,0 +1,65 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "ScintRawEvent/ScintWaveform.h"
+#include "EventFormats/DigitizerDataFragment.hpp"
+
+// Default consdtructor 
+//
+ScintWaveform::ScintWaveform( ) :
+  m_board_id(0),
+  m_board_fail_flag(1),
+  m_pattern_trig_options(0),
+  m_channel_mask(0),
+  m_event_counter(0),
+  m_trigger_time_tag(0),
+  m_samples(0),
+  m_channel(0),
+  m_adc_counts(),
+  m_ID(0xffff)
+{
+
+}
+
+ScintWaveform::~ScintWaveform() {}
+
+void
+ScintWaveform::setIdentifier(unsigned int id) {
+  m_ID = id;
+}
+
+void
+ScintWaveform::setHeader(const DigitizerDataFragment* frag) {
+  m_board_id = frag->board_id();
+  m_pattern_trig_options = frag->pattern_trig_options();
+  m_channel_mask = frag->channel_mask();
+  m_event_counter = frag->event_counter();
+  m_trigger_time_tag = frag->trigger_time_tag();
+  m_samples = frag->n_samples();
+}
+
+void
+ScintWaveform::setWaveform(unsigned int channel, const std::vector<uint16_t> waveform) {
+  m_channel = channel;
+
+  // Make sure the vector is empty first
+  m_adc_counts.clear();
+
+  for(uint16_t count: waveform) 
+    m_adc_counts.push_back(count);
+}
+
+std::ostream 
+&operator<<(std::ostream &out, const ScintWaveform &wfm) {
+  out << "Waveform data:" << std::endl
+  << std::setw(30) << " board_id:             "<<std::setfill(' ')<<std::setw(32)<<std::dec<<wfm.board_id()<<std::setfill(' ')<<std::endl
+  << std::setw(30) << " board_fail_flag:      "<<std::setfill(' ')<<std::setw(32)<<std::dec<<wfm.board_fail_flag()<<std::setfill(' ')<<std::endl
+  << std::setw(30) << " board_trig_options:   "<<std::setfill(' ')<<std::setw(32)<<std::dec<<wfm.pattern_trig_options()<<std::setfill(' ')<<std::endl
+  << std::setw(30) << " channel_mask:         "<<std::setfill(' ')<<std::setw(32)<<std::dec<<wfm.channel_mask()<<std::setfill(' ')<<std::endl
+  << std::setw(30) << " event_counter:        "<<std::setfill(' ')<<std::setw(32)<<std::dec<<wfm.event_counter()<<std::setfill(' ')<<std::endl
+  << std::setw(30) << " trigger_time_tag:     "<<std::setfill(' ')<<std::setw(32)<<std::dec<<wfm.trigger_time_tag()<<std::setfill(' ')<<std::endl
+      << std::setw(30) << " n_samples:            "<<std::setfill(' ')<<std::setw(32)<<std::dec<<wfm.n_samples()<<std::setfill(' ')<<std::endl;
+
+  return out;
+}
diff --git a/Scintillator/ScintRawEvent/src/ScintWaveformContainer.cxx b/Scintillator/ScintRawEvent/src/ScintWaveformContainer.cxx
new file mode 100644
index 00000000..2a71ab81
--- /dev/null
+++ b/Scintillator/ScintRawEvent/src/ScintWaveformContainer.cxx
@@ -0,0 +1,14 @@
+#include "ScintRawEvent/ScintWaveformContainer.h"
+
+void
+ScintWaveformContainer::print() const {
+  std::cout << "Waveform container with size=" << this->size() << std::endl;
+  for(auto wfm: *this) std::cout << *wfm;
+}
+
+std::ostream
+&operator<<(std::ostream &out, const ScintWaveformContainer& cont) {
+  out << "Waveform container with size=" << cont.size() << std::endl;
+  for(auto wfm: cont) out << *wfm;
+  return out;
+}
diff --git a/Scintillator/ScintSimEvent/CMakeLists.txt b/Scintillator/ScintSimEvent/CMakeLists.txt
index b0f889d0..27b63871 100644
--- a/Scintillator/ScintSimEvent/CMakeLists.txt
+++ b/Scintillator/ScintSimEvent/CMakeLists.txt
@@ -5,18 +5,6 @@
 # Declare the package name:
 atlas_subdir( ScintSimEvent )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Control/AthAllocators
-                          Control/CxxUtils
-                          Generators/GeneratorObjects
-                          Simulation/HitManagement
-                          
-                          PRIVATE
-                          Control/StoreGate
-                          Scintillator/ScintDetDescr/ScintIdentifier )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
diff --git a/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt b/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt
index 1d48d115..574f0242 100644
--- a/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt
+++ b/Simulation/G4Faser/G4FaserAlg/CMakeLists.txt
@@ -5,24 +5,6 @@
 # Declare the package name:
 atlas_subdir( G4FaserAlg )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          PRIVATE
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/SGTools
-                          Control/StoreGate
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          Event/EventInfo
-                          Generators/GeneratorObjects
-                          Generators/AtlasHepMC
-                          Simulation/G4Atlas/G4AtlasAlg
-                          Simulation/G4Atlas/G4AtlasInterfaces
-                          Simulation/G4Sim/FaserMCTruthBase
-                          Simulation/ISF/ISF_Core/FaserISF_Interfaces
-                          Simulation/Barcode/BarcodeInterfaces)
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
diff --git a/Simulation/G4Faser/G4FaserAlg/test/runG4.py b/Simulation/G4Faser/G4FaserAlg/test/runG4.py
index 3719fabd..257b07a2 100644
--- a/Simulation/G4Faser/G4FaserAlg/test/runG4.py
+++ b/Simulation/G4Faser/G4FaserAlg/test/runG4.py
@@ -38,7 +38,7 @@ if __name__ == "__main__":
     ConfigFlags.Input.isMC = True
     ConfigFlags.Input.RunNumber = 12345
     ConfigFlags.Input.Collections = [""]
-    ConfigFlags.ProjectName = "mc19"
+    ConfigFlags.Input.ProjectName = "mc19"
     ConfigFlags.Common.isOnline = False
     ConfigFlags.Beam.Type = "collisions"
     ConfigFlags.Beam.Energy = 7*TeV                              # Informational, does not affect simulation
diff --git a/Simulation/G4Faser/G4FaserServices/CMakeLists.txt b/Simulation/G4Faser/G4FaserServices/CMakeLists.txt
index db404972..e4095864 100644
--- a/Simulation/G4Faser/G4FaserServices/CMakeLists.txt
+++ b/Simulation/G4Faser/G4FaserServices/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( G4FaserServices )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          PRIVATE
-                          Control/AthenaBaseComps
-                          MagneticField/MagFieldInterfaces
-                          Generators/GeneratorObjects
-                          Simulation/G4Atlas/G4AtlasInterfaces
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Utilities/G4PhysicsLists)
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
@@ -32,4 +21,4 @@ find_package( XercesC)
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_scripts( test/*.py )
+#atlas_install_scripts( test/*.py )
diff --git a/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py b/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py
index 4d7b81ed..9e502c27 100644
--- a/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py
+++ b/Simulation/G4Faser/G4FaserServices/python/G4FaserFieldServices.py
@@ -16,6 +16,7 @@ def StandardFieldSvcCfg(ConfigFlags,name="StandardField", **kwargs):
     result.merge(acc)
 
     kwargs.setdefault("MagneticFieldSvc", result.getService("FaserFieldSvc")) # TODO This should probably be based on simFlags.MagneticField?
+    kwargs.setdefault("UseMagFieldSvc", True)  # Required to explicitly override default ATLAS behavior that doesn't work for FASER
     #kwargs.setdefault("FieldOn", True)
 
     result.addService(StandardFieldSvc(name, **kwargs))
diff --git a/Simulation/G4Faser/G4FaserTools/CMakeLists.txt b/Simulation/G4Faser/G4FaserTools/CMakeLists.txt
index e6729ddd..0c380226 100644
--- a/Simulation/G4Faser/G4FaserTools/CMakeLists.txt
+++ b/Simulation/G4Faser/G4FaserTools/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( G4FaserTools )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          AtlasGeometryCommon/SubDetectorEnvelopes
-                          Control/AthenaBaseComps
-                          Simulation/G4Atlas/G4AtlasInterfaces
-                          PRIVATE
-                          GaudiKernel
-                          Simulation/G4Utilities/G4PhysicsLists )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CLHEP )
@@ -40,5 +31,5 @@ find_package( XercesC )
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_scripts( test/*.py )
+#atlas_install_scripts( test/*.py )
 
diff --git a/Simulation/G4Sim/FaserMCTruth/CMakeLists.txt b/Simulation/G4Sim/FaserMCTruth/CMakeLists.txt
index 1f5cff9b..86d88a5d 100644
--- a/Simulation/G4Sim/FaserMCTruth/CMakeLists.txt
+++ b/Simulation/G4Sim/FaserMCTruth/CMakeLists.txt
@@ -5,16 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserMCTruth )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Generators/AtlasHepMC
-                          Generators/GeneratorObjects
-                          PRIVATE
-                          Simulation/ISF/ISF_Core/FaserISF_Event
-                          Simulation/ISF/ISF_Core/ISF_Event
-                          Simulation/G4Sim/SimHelpers )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
diff --git a/Simulation/G4Sim/FaserMCTruthBase/CMakeLists.txt b/Simulation/G4Sim/FaserMCTruthBase/CMakeLists.txt
index 52833804..ac2b69e0 100644
--- a/Simulation/G4Sim/FaserMCTruthBase/CMakeLists.txt
+++ b/Simulation/G4Sim/FaserMCTruthBase/CMakeLists.txt
@@ -5,24 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserMCTruthBase )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          GaudiKernel
-                          Simulation/G4Sim/SimHelpers
-                          Simulation/ISF/ISF_Core/ISF_Interfaces
-                          Simulation/ISF/ISF_Core/FaserISF_Interfaces
-                          PRIVATE
-                          Generators/AtlasHepMC
-                          Control/AthenaBaseComps
-                          Control/StoreGate
-                          Simulation/G4Atlas/G4AtlasInterfaces
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Sim/FaserMCTruth
-                          Simulation/G4Sim/TrackRecord
-                          DetectorDescription/FaserDetDescr
-                          Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
@@ -53,4 +35,4 @@ atlas_add_library( FaserMCTruthBaseLib
 #                     FaserISF_Geant4Event )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+#atlas_install_python_modules( python/*.py )
diff --git a/Simulation/G4Utilities/G4UserActions/CMakeLists.txt b/Simulation/G4Utilities/G4UserActions/CMakeLists.txt
index 5315f2a3..b9243218 100644
--- a/Simulation/G4Utilities/G4UserActions/CMakeLists.txt
+++ b/Simulation/G4Utilities/G4UserActions/CMakeLists.txt
@@ -5,26 +5,6 @@
 # Declare the package name:
 atlas_subdir( G4UserActions )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          PRIVATE
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/StoreGate
-                          GaudiKernel
-                          Simulation/G4Atlas/G4AtlasInterfaces
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Sim/TrackRecord
-                          Event/EventInfo
-                          Tracker/TrackerSimEvent
-                          Scintillator/ScintSimEvent
-                          Simulation/G4Sim/FaserMCTruth
-                          Simulation/G4Sim/FaserMCTruthBase
-                          Simulation/G4Sim/SimHelpers
-                          Simulation/G4Utilities/TrackWriteFastSim
-                          Simulation/G4Utilities/G4DebuggingTools
-                          Tools/PathResolver )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
@@ -42,5 +22,5 @@ atlas_add_component( G4UserActions
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_joboptions( share/*.py )
-atlas_install_runtime( share/*.dat )
+#atlas_install_joboptions( share/*.py )
+#atlas_install_runtime( share/*.dat )
diff --git a/Simulation/G4Utilities/Geo2G4/CMakeLists.txt b/Simulation/G4Utilities/Geo2G4/CMakeLists.txt
index a6b11f4d..eac3b290 100644
--- a/Simulation/G4Utilities/Geo2G4/CMakeLists.txt
+++ b/Simulation/G4Utilities/Geo2G4/CMakeLists.txt
@@ -5,22 +5,6 @@
 # Declare the package name:
 atlas_subdir( Geo2G4 )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          PRIVATE
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/StoreGate
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoSpecialShapes
-                          DetectorDescription/GeoModel/GeoModelUtilities
-			  DetectorDescription/GeoPrimitives
-                          Simulation/G4Atlas/G4AtlasInterfaces
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Sim/SimHelpers
-                          Simulation/G4Utilities/GeoMaterial2G4 )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CLHEP )
@@ -33,20 +17,13 @@ find_package( GeoModelCore )
 atlas_add_library( Geo2G4Lib
                    src/*.cxx
                    NO_PUBLIC_HEADERS
-                   INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${GEANT4_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS}
-                   PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${GEOMODEL_INCLUDE_DIRS}
+                   INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${GEANT4_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS}
+                   PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} 
                    PRIVATE_DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES ${XERCESC_LIBRARIES} ${GEANT4_LIBRARIES} ${ROOT_LIBRARIES} GaudiKernel
-                   PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaBaseComps GeoSpecialShapes G4AtlasToolsLib SimHelpers GeoMaterial2G4 AthenaKernel GeoModelUtilities StoreGateLib SGtests )
+                   LINK_LIBRARIES ${XERCESC_LIBRARIES} ${GEANT4_LIBRARIES} ${GEOMODELCORE_LIBRARIES} ${ROOT_LIBRARIES} AthenaBaseComps GaudiKernel G4AtlasInterfaces G4AtlasToolsLib GeoModelUtilities GeoModelFaserUtilities GeoPrimitives
+                   PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} ${CLHEP_LIBRARIES}  GeoSpecialShapes  SimHelpers GeoMaterial2G4 AthenaKernel GeoModelInterfaces StoreGateLib SGtests )
 
 atlas_add_component( Geo2G4
                      src/components/*.cxx
-                     INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${GEANT4_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${GEOMODEL_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${XERCESC_LIBRARIES} ${GEANT4_LIBRARIES} ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelUtilities GaudiKernel AthenaBaseComps StoreGateLib SGtests GeoSpecialShapes G4AtlasToolsLib SimHelpers GeoMaterial2G4 Geo2G4Lib )
-
-#atlas_add_dictionary( LArWheelSolidCheckerDict
-#                      src/LArWheelSolidDDProxy.h
-#                      src/lcg_dict/selection.xml
-#                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${GEANT4_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${GEOMODEL_INCLUDE_DIRS}
-#                      LINK_LIBRARIES ${Boost_LIBRARIES} ${XERCESC_LIBRARIES} ${GEANT4_LIBRARIES} ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelUtilities GaudiKernel AthenaBaseComps StoreGateLib SGtests GeoSpecialShapes SimHelpers GeoMaterial2G4 Geo2G4Lib )
+                     LINK_LIBRARIES Geo2G4Lib )
 
diff --git a/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.cxx b/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.cxx
index 286030c4..98630e2f 100644
--- a/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.cxx
+++ b/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.cxx
@@ -39,7 +39,7 @@ ExtParameterisedVolumeBuilder::ExtParameterisedVolumeBuilder(std::string n, Geo2
 {
 }
 
-G4LogicalVolume* ExtParameterisedVolumeBuilder::Build(const PVConstLink theGeoPhysVolume, OpticalVolumesMap* optical_volumes)
+G4LogicalVolume* ExtParameterisedVolumeBuilder::Build(const PVConstLink theGeoPhysVolume, OpticalVolumesMap* optical_volumes) const
 {
   PVConstLink theGeoPhysChild;
   const GeoSerialTransformer* serialTransformerChild=0;
@@ -183,7 +183,7 @@ G4LogicalVolume* ExtParameterisedVolumeBuilder::Build(const PVConstLink theGeoPh
   return theG4LogVolume;
 }
 
-Geo2G4AssemblyVolume* ExtParameterisedVolumeBuilder::BuildAssembly(PVConstLink pv)
+Geo2G4AssemblyVolume* ExtParameterisedVolumeBuilder::BuildAssembly(PVConstLink pv) const
 {
   PVConstLink theGeoPhysChild;
   G4LogicalVolume* theG4LogChild = 0;
diff --git a/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.h b/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.h
index 807fb396..a8f01a1d 100644
--- a/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.h
+++ b/Simulation/G4Utilities/Geo2G4/src/ExtParameterisedVolumeBuilder.h
@@ -19,9 +19,9 @@ class ExtParameterisedVolumeBuilder: public VolumeBuilder
 public:
   ExtParameterisedVolumeBuilder(std::string n, Geo2G4AssemblyFactory* G4AssemblyFactory);
   ///
-  G4LogicalVolume* Build(PVConstLink pv, OpticalVolumesMap* optical_volumes = 0);
+  G4LogicalVolume* Build(const PVConstLink pv, OpticalVolumesMap* optical_volumes = 0) const;
   ///
-  Geo2G4AssemblyVolume* BuildAssembly(PVConstLink pv);
+  Geo2G4AssemblyVolume* BuildAssembly(PVConstLink pv) const;
   /// Log a message using the Athena controlled logging system
   MsgStream& msg( MSG::Level lvl ) const { return m_msg << lvl; }
   /// Check whether the logging system is active at the provided verbosity level
diff --git a/Simulation/G4Utilities/Geo2G4/src/GDMLDetectorTool.cxx b/Simulation/G4Utilities/Geo2G4/src/GDMLDetectorTool.cxx
index f484943e..21212ee7 100644
--- a/Simulation/G4Utilities/Geo2G4/src/GDMLDetectorTool.cxx
+++ b/Simulation/G4Utilities/Geo2G4/src/GDMLDetectorTool.cxx
@@ -31,23 +31,23 @@ StatusCode GDMLDetectorTool::initialize()
     {
       m_detectorName = this->name();
       // re-initialize m_detectorName in order to take the real detector name rather than the path to it
-      size_t ipos=m_detectorName.find_last_of(".");
-      size_t length=m_detectorName.size();
+      size_t ipos=m_detectorName.value().find_last_of(".");
+      size_t length=m_detectorName.value().size();
       if (ipos<length)
         {
-          ATH_MSG_DEBUG( "m_detectorName: " << m_detectorName << " needs to be reset.");
-          m_detectorName=m_detectorName.substr(ipos+1,length-ipos-1);
-          ATH_MSG_DEBUG( "m_detectorName default value reset to " << m_detectorName);
+          ATH_MSG_DEBUG( "m_detectorName: " << m_detectorName.value() << " needs to be reset.");
+          m_detectorName=m_detectorName.value().substr(ipos+1,length-ipos-1);
+          ATH_MSG_DEBUG( "m_detectorName default value reset to " << m_detectorName.value());
         }
     }
   ATH_MSG_DEBUG( name() << "GDMLDetectorTool::initialize() : Detector name = " << m_detectorName<<" File name: "<<m_GDMLFileName );
   if(m_geoDetectorName.empty())
     {
-      m_geoDetectorName = m_detectorName;
+      m_geoDetectorName = m_detectorName.value();
     }
   if(m_GDMLFileName.empty())
     {
-          m_GDMLFileName = m_detectorName+".gdml";
+          m_GDMLFileName = m_detectorName.value()+".gdml";
     }
   ATH_MSG_DEBUG( name() << "GDMLDetectorTool::initialize() : Geo Detector name = " << m_geoDetectorName<<" File name: "<<m_GDMLFileName );
 
diff --git a/Simulation/G4Utilities/Geo2G4/src/Geo2G4AssemblyFactory.h b/Simulation/G4Utilities/Geo2G4/src/Geo2G4AssemblyFactory.h
index 16c93561..ddfed4b9 100644
--- a/Simulation/G4Utilities/Geo2G4/src/Geo2G4AssemblyFactory.h
+++ b/Simulation/G4Utilities/Geo2G4/src/Geo2G4AssemblyFactory.h
@@ -6,7 +6,6 @@
 #define GEO2G4_Geo2G4AssemblyFactory_h
 
 #include "GeoModelKernel/GeoVPhysVol.h"
-#include "Geo2G4AssemblyFactory.h"
 
 #include <map>
 #include <memory>
diff --git a/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.cxx b/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.cxx
index 1fefc082..13a56981 100644
--- a/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.cxx
+++ b/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.cxx
@@ -3,11 +3,6 @@
 */
 
 #include "Geo2G4SolidFactory.h"
-// #include "LArWheelSolid.h"
-// #include "LArWheelSliceSolid.h"
-// #include "LArWheelSolidDDProxy.h"
-
-// #include "GeoSpecialShapes/LArCustomShape.h"
 
 #include "GeoModelKernel/GeoShape.h"
 #include "GeoModelKernel/GeoBox.h"
@@ -27,6 +22,7 @@
 #include "GeoModelKernel/GeoShapeShift.h"
 #include "GeoModelKernel/GeoShapeUnion.h"
 #include "GeoModelKernel/GeoShapeIntersection.h"
+#include "GeoModelKernel/GeoUnidentifiedShape.h"
 #include "GeoModelKernel/GeoShapeSubtraction.h"
 #include "AthenaBaseComps/AthMsgStreamMacros.h"
 
@@ -518,31 +514,36 @@ G4VSolid *Geo2G4SolidFactory::Build(const GeoShape* geoShape, std::string name)
       theSolid = new G4SubtractionSolid(n, solidA, solidB);
     }
   //
-  // Custom Shapes (presently LAr shapes only)
+  // Custom Shapes 
   //
-  // else if(geoShape->typeID() == LArCustomShape::getClassTypeID())
+  // else if(geoShape->typeID() == GeoUnidentifiedShape::getClassTypeID())
   //   {
-  //     const LArCustomShape* customShape = dynamic_cast<const LArCustomShape*> (geoShape);
+  //     const GeoUnidentifiedShape* customShape = dynamic_cast<const GeoUnidentifiedShape*> (geoShape);
   //     if (nullptr==customShape) throw std::runtime_error("TypeID did not match cast for custom shape");
-  //     std::string customName = customShape->name();
-  //     customSolidMap::const_iterator it = customSolids.find(customName);
-  //     if(it!=customSolids.end())
-  //       theSolid = it->second;
-  //     else
-  //       {
-  //         theSolid = nullptr;
-  //         // if(customName.find("Slice") != std::string::npos){
-  //         //   theSolid = createLArWheelSliceSolid(customShape);
-  //         // } else {
-  //         //   theSolid = createLArWheelSolid(customName, s_lwsTypes.at(customName) ); // map.at throws std::out_of_range exception on unknown shape name
-  //         // }
-  //         if ( nullptr == theSolid ) {
-  //           std::string error = std::string("Can't create LArWheelSolid for name ") + customName + " in Geo2G4SolidFactory::Build";
-  //           throw std::runtime_error(error);
+  //     if (customShape->name()=="LArCustomShape")
+  //     {
+	//       std::string customName = customShape->asciiData();
+   
+  //     	customSolidMap::const_iterator it = customSolids.find(customName);
+  //       if(it!=customSolids.end())
+  //         theSolid = it->second;
+  //       else
+  //         {
+  //           theSolid = nullptr;
+  //           if(customName.find("Slice") != std::string::npos){
+  //             theSolid = createLArWheelSliceSolid(customShape);
+  //           } else {
+  //             theSolid = createLArWheelSolid(customName, s_lwsTypes.at(customName) ); // map.at throws std::out_of_range exception on unknown shape name
+  //           }
+  //           if ( nullptr == theSolid ) {
+  //             std::string error = std::string("Can't create LArWheelSolid for name ") + customName + " in Geo2G4SolidFactory::Build";
+  //             throw std::runtime_error(error);
+  //           }
+            
+  //           if(theSolid != nullptr) customSolids[customName] = theSolid;
   //         }
+  //     }
 
-  //         if(theSolid != nullptr) customSolids[customName] = theSolid;
-  //       }
   //   }
   //
   // Catch All
@@ -574,11 +575,9 @@ G4VSolid *Geo2G4SolidFactory::Build(const GeoShape* geoShape, std::string name)
 //         return theLWS;
 // }
 
-// G4VSolid* Geo2G4SolidFactory::createLArWheelSliceSolid(const LArCustomShape* customShape) const
+// G4VSolid* Geo2G4SolidFactory::createLArWheelSliceSolid(const GeoUnidentifiedShape* customShape) const
 // {
-//     LArWheelSliceSolid *theLWS = new LArWheelSliceSolid(customShape->name(), customShape->calculator());
-
-//     LArWheelSolidDDProxy *theLWS_p = new LArWheelSolidDDProxy(theLWS);
+//     LArWheelSliceSolid *theLWS = new LArWheelSliceSolid(customShape->asciiData());
 //     // ownership is passed to detStore
 //     if(detStore()->record(theLWS_p, theLWS->GetName()).isFailure()){
 //         ATH_MSG_WARNING("Can't store proxy for LArWheelSolid to the DetectorStore");
diff --git a/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.h b/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.h
index 97c5d130..e42138cf 100644
--- a/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.h
+++ b/Simulation/G4Utilities/Geo2G4/src/Geo2G4SolidFactory.h
@@ -17,7 +17,7 @@
 
 class G4VSolid;
 class GeoShape;
-// class LArCustomShape;
+class GeoUnidentifiedShape;
 
 class Geo2G4SolidFactory
 {
@@ -39,7 +39,7 @@ public:
    StoreGateSvc_t& detStore() const;
 private:
   // G4VSolid* createLArWheelSolid(const std::string& name, const LArWheelSolidDef_t & lwsdef) const;
-  // G4VSolid* createLArWheelSliceSolid(const LArCustomShape* ) const;
+  // G4VSolid* createLArWheelSliceSolid(const GeoUnidentifiedShape* ) const;
 
   // static const LArWheelSolid_typemap s_lwsTypes;
 
diff --git a/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.cxx b/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.cxx
index 39435689..3cab7fc8 100644
--- a/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.cxx
+++ b/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.cxx
@@ -3,14 +3,14 @@
 */
 
 #include "Geo2G4Svc.h"
-#include "VolumeBuilder.h"
+#include "Geo2G4AssemblyVolume.h"
 #include "ExtParameterisedVolumeBuilder.h"
 
-void InitializeBuilders(Geo2G4AssemblyFactory*);
+BuilderMap InitializeBuilders(Geo2G4AssemblyFactory*);
 
 Geo2G4Svc::Geo2G4Svc(const std::string& name, ISvcLocator* svcLocator)
   : base_class(name,svcLocator)
-  , m_defaultBuilder(nullptr)
+  , m_defaultBuilder()
   , m_getTopTransform(true)
   , m_G4AssemblyFactory(nullptr)
 {
@@ -31,12 +31,12 @@ StatusCode Geo2G4Svc::initialize()
   ATH_MSG_VERBOSE ("Initializing the Geo2G4Svc.");
   ATH_MSG_VERBOSE ("Creating all builders available.");
   m_G4AssemblyFactory = std::make_unique<Geo2G4AssemblyFactory>();
-  InitializeBuilders(m_G4AssemblyFactory.get()); // separate function not part of this class
+  m_builders = InitializeBuilders(m_G4AssemblyFactory.get()); // separate function not part of this class
   
   const std::string nameBuilder = "Extended_Parameterised_Volume_Builder"; //TODO Configurable property??
   this->SetDefaultBuilder(nameBuilder);
   ATH_MSG_VERBOSE (nameBuilder << " --> set as default builder" );
-  ATH_MSG_VERBOSE (nameBuilder << " --> ParamOn flag = " << m_defaultBuilder->GetParam());
+  ATH_MSG_VERBOSE (nameBuilder << " --> ParamOn flag = " << GetDefaultBuilder()->GetParam());
   initialized=1;
   if(msgLvl(MSG::VERBOSE))
     {
@@ -49,13 +49,6 @@ StatusCode Geo2G4Svc::finalize()
 {
   ATH_MSG_VERBOSE ("Finalizing the Geo2G4Svc.");
   
-  // clear builders...
-  // TODO: replace with std::unique_ptr
-  for (auto &x : m_builders) {
-      if (x.second)
-          delete x.second;
-  }
-
   return StatusCode::SUCCESS;
 }
 
@@ -63,21 +56,6 @@ void Geo2G4Svc::handle(const Incident& )
 {
 }
 
-void Geo2G4Svc::RegisterVolumeBuilder(VolumeBuilder* vb)
-{
-  std::string key(vb->GetKey());
-  if (m_builders.find(key)!=m_builders.end())
-    {
-      ATH_MSG_DEBUG ("Trying to set an already existing builder "<<key);
-      ATH_MSG_DEBUG ("\t request ignored, nothing done ");
-    }
-  else
-    {
-      m_builders[key]=vb;
-      ATH_MSG_DEBUG ("Volume builder registered "<<key);
-    }
-}
-
 void Geo2G4Svc::ListVolumeBuilders() const
 {
   ATH_MSG_INFO("---- List of all Volume Builders registered with Geo2G4Svc ----");
@@ -87,22 +65,7 @@ void Geo2G4Svc::ListVolumeBuilders() const
       ATH_MSG_INFO(" Volume Builder: "<<builder.second->GetKey());
     }
   ATH_MSG_INFO("---------------------------------------------------------------");
-  ATH_MSG_INFO(" default builder is "<<m_defaultBuilder->GetKey());
-}
-
-void Geo2G4Svc::UnregisterVolumeBuilder(VolumeBuilder* vb)
-{
-  const std::string key(vb->GetKey());
-  if (m_builders.find(key)!=m_builders.end())
-    {
-      ATH_MSG_DEBUG ("Removing builder "<<key<<" from the list");
-      m_builders.erase(key);
-    }
-  else
-    {
-      ATH_MSG_ERROR ("Trying to remove a not-existing builder "<<key);
-      ATH_MSG_ERROR ("\t request ignored, nothing done ");
-    }
+  ATH_MSG_INFO(" default builder is "<< GetDefaultBuilder()->GetKey());
 }
 
 VolumeBuilder* Geo2G4Svc::GetVolumeBuilder(std::string s) const
@@ -110,12 +73,12 @@ VolumeBuilder* Geo2G4Svc::GetVolumeBuilder(std::string s) const
   const auto builderItr(m_builders.find(s));
   if (builderItr!=m_builders.end())
     {
-      return builderItr->second;
+      return builderItr->second.get();
     }
   else
     {
       ATH_MSG_ERROR ("Trying to retrieve a not existing builder "<<s);
       ATH_MSG_ERROR ("\treturning Default Builder");
     }
-  return m_defaultBuilder;
+  return GetDefaultBuilder();
 }
diff --git a/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.h b/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.h
index f32f0fdd..619ea63a 100644
--- a/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.h
+++ b/Simulation/G4Utilities/Geo2G4/src/Geo2G4Svc.h
@@ -11,14 +11,14 @@
 #include "GaudiKernel/IIncidentListener.h"
 
 #include "Geo2G4AssemblyFactory.h"
-#include "Geo2G4AssemblyVolume.h"
+
+#include "VolumeBuilder.h"
 
 #include <string>
 #include <map>
 #include <memory>
 
-class VolumeBuilder;
-typedef std::map< std::string, VolumeBuilder*,std::less<std::string> > BuilderMap;
+typedef std::unordered_map< std::string, std::unique_ptr<VolumeBuilder> > BuilderMap;
 
 /// @todo NEEDS DOCUMENTATION
 class Geo2G4Svc: public extends<AthService, IGeo2G4Svc, IIncidentListener>
@@ -32,16 +32,16 @@ public:
   /// IIncidentListener methods -  FIXME does this service actually need to listen for Incidents?
   virtual void handle(const Incident&) override final;
   /// Geo2G4SvcBase methods
-  virtual void RegisterVolumeBuilder(VolumeBuilder* vb) override final;
-  virtual void UnregisterVolumeBuilder(VolumeBuilder* vb) override final;
-  virtual void SetDefaultBuilder(VolumeBuilder *vb) override final {m_defaultBuilder=vb;}
-  virtual void SetDefaultBuilder(std::string n) override final {this->SetDefaultBuilder(this->GetVolumeBuilder(n));}
+  // virtual void RegisterVolumeBuilder(VolumeBuilder* vb) override final;
+  // virtual void UnregisterVolumeBuilder(VolumeBuilder* vb) override final;
+  // virtual void SetDefaultBuilder(VolumeBuilder *vb) override final {m_defaultBuilder=vb;}
+  virtual void SetDefaultBuilder(std::string n) override final { m_defaultBuilder = n; }
   virtual VolumeBuilder* GetVolumeBuilder(std::string s) const override final;
-  virtual VolumeBuilder* GetDefaultBuilder() const override final {return m_defaultBuilder;}
+  virtual VolumeBuilder* GetDefaultBuilder() const override final {return m_builders.at(m_defaultBuilder).get();}
   virtual bool UseTopTransforms() const override final {return m_getTopTransform;}
   virtual void ListVolumeBuilders() const override final;
 private:
-  VolumeBuilder *m_defaultBuilder;
+  std::string m_defaultBuilder;
   BuilderMap m_builders ;
   bool m_getTopTransform;
   std::unique_ptr<Geo2G4AssemblyFactory> m_G4AssemblyFactory;
diff --git a/Simulation/G4Utilities/Geo2G4/src/GeoDetectorTool.cxx b/Simulation/G4Utilities/Geo2G4/src/GeoDetectorTool.cxx
index 53ea2041..5b270b1e 100644
--- a/Simulation/G4Utilities/Geo2G4/src/GeoDetectorTool.cxx
+++ b/Simulation/G4Utilities/Geo2G4/src/GeoDetectorTool.cxx
@@ -32,19 +32,19 @@ StatusCode GeoDetectorTool::initialize()
     {
       m_detectorName = this->name();
       // re-initialize m_detectorName in order to take the real detector name rather than the path to it
-      size_t ipos=m_detectorName.find_last_of(".");
-      size_t length=m_detectorName.size();
+      size_t ipos=m_detectorName.value().find_last_of(".");
+      size_t length=m_detectorName.value().size();
       if (ipos<length)
         {
-          ATH_MSG_VERBOSE( "m_detectorName: " << m_detectorName << " needs to be reset.");
-          m_detectorName=m_detectorName.substr(ipos+1,length-ipos-1);
-          ATH_MSG_VERBOSE( "m_detectorName default value reset to " << m_detectorName);
+          ATH_MSG_VERBOSE( "m_detectorName: " << m_detectorName.value() << " needs to be reset.");
+          m_detectorName=m_detectorName.value().substr(ipos+1,length-ipos-1);
+          ATH_MSG_VERBOSE( "m_detectorName default value reset to " << m_detectorName.value());
         }
     }
-  ATH_MSG_DEBUG( name() << "GeoDetectorTool::initialize() : Detector name = " << m_detectorName );
+  ATH_MSG_DEBUG( name() << "GeoDetectorTool::initialize() : Detector name = " << m_detectorName.value() );
   if(m_geoDetectorName.empty())
     {
-      m_geoDetectorName = m_detectorName;
+      m_geoDetectorName = m_detectorName.value();
     }
   ATH_MSG_DEBUG( name() << "GeoDetectorTool::initialize() : Geo Detector name = " << m_geoDetectorName );
 
diff --git a/Simulation/G4Utilities/Geo2G4/src/InitializeBuilders.cxx b/Simulation/G4Utilities/Geo2G4/src/InitializeBuilders.cxx
index 7a002c34..133c3de1 100644
--- a/Simulation/G4Utilities/Geo2G4/src/InitializeBuilders.cxx
+++ b/Simulation/G4Utilities/Geo2G4/src/InitializeBuilders.cxx
@@ -5,8 +5,12 @@
 #include "ExtParameterisedVolumeBuilder.h"
 #include "Geo2G4AssemblyFactory.h"
 
-void InitializeBuilders(Geo2G4AssemblyFactory* assemblyFactory)
+typedef std::unordered_map<std::string, std::unique_ptr<VolumeBuilder>> BuilderMap;
+
+BuilderMap InitializeBuilders(Geo2G4AssemblyFactory* assemblyFactory)
 {
-  ExtParameterisedVolumeBuilder *epb __attribute__ ((unused)) =
-    new ExtParameterisedVolumeBuilder("Extended_Parameterised_Volume_Builder", assemblyFactory);
+  BuilderMap map;
+  map.emplace("Extended_Parameterised_Volume_Builder",
+              std::make_unique<ExtParameterisedVolumeBuilder>("Extended_Parameterised_Volume_Builder", assemblyFactory));
+  return map;
 }
diff --git a/Simulation/G4Utilities/Geo2G4/src/VolumeBuilder.h b/Simulation/G4Utilities/Geo2G4/src/VolumeBuilder.h
index afc5195d..d1a9ed62 100644
--- a/Simulation/G4Utilities/Geo2G4/src/VolumeBuilder.h
+++ b/Simulation/G4Utilities/Geo2G4/src/VolumeBuilder.h
@@ -23,25 +23,25 @@ class VolumeBuilder
  public:
   VolumeBuilder(std::string k): m_paramOn(false), m_key(k)
   {
-    Geo2G4SvcAccessor accessor;
-    Geo2G4SvcBase *g=accessor.GetGeo2G4Svc();
-    g->RegisterVolumeBuilder(this);
+    // Geo2G4SvcAccessor accessor;
+    // Geo2G4SvcBase *g=accessor.GetGeo2G4Svc();
+    // g->RegisterVolumeBuilder(this);
   }
 
   virtual ~VolumeBuilder()
   {
-    Geo2G4SvcAccessor accessor;
-    Geo2G4SvcBase *g=accessor.GetGeo2G4Svc();
-    g->UnregisterVolumeBuilder(this);
+    // Geo2G4SvcAccessor accessor;
+    // Geo2G4SvcBase *g=accessor.GetGeo2G4Svc();
+    // g->UnregisterVolumeBuilder(this);
   }
 
   std::string GetKey() const {return m_key;}
 
   // flag controlling Parameterization to Parameterization translation
   void SetParam(bool flag){m_paramOn = flag;}
-  bool GetParam(){return m_paramOn;}
+  bool GetParam() const {return m_paramOn;}
 
-  virtual G4LogicalVolume* Build(PVConstLink pv, OpticalVolumesMap* optical_volumes = 0) = 0;
+  virtual G4LogicalVolume* Build(PVConstLink pv, OpticalVolumesMap* optical_volumes = 0) const = 0;
 
  protected:
   bool m_paramOn;
diff --git a/Simulation/G4Utilities/Geo2G4/src/lcg_dict/selection.xml b/Simulation/G4Utilities/Geo2G4/src/lcg_dict/selection.xml
deleted file mode 100644
index 98e02df0..00000000
--- a/Simulation/G4Utilities/Geo2G4/src/lcg_dict/selection.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<lcgdict>
-  <class name="LArWheelSolidDDProxy" />
-</lcgdict>
diff --git a/Simulation/ISF/ISF_Core/FaserISF_Event/CMakeLists.txt b/Simulation/ISF/ISF_Core/FaserISF_Event/CMakeLists.txt
index 91864e66..63a566c7 100644
--- a/Simulation/ISF/ISF_Core/FaserISF_Event/CMakeLists.txt
+++ b/Simulation/ISF/ISF_Core/FaserISF_Event/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserISF_Event )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          AtlasTest/TestTools
-                          Control/AthenaBaseComps
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/GeoPrimitives
-                          Generators/GeneratorObjects
-                          GaudiKernel
-                          Simulation/Barcode/BarcodeEvent
-                          Simulation/ISF/ISF_Core/ISF_Event )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Eigen )
diff --git a/Simulation/ISF/ISF_Core/FaserISF_Interfaces/CMakeLists.txt b/Simulation/ISF/ISF_Core/FaserISF_Interfaces/CMakeLists.txt
index 10af6070..5a5965c9 100644
--- a/Simulation/ISF/ISF_Core/FaserISF_Interfaces/CMakeLists.txt
+++ b/Simulation/ISF/ISF_Core/FaserISF_Interfaces/CMakeLists.txt
@@ -5,21 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserISF_Interfaces )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/StoreGate
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/GeoPrimitives
-                          Generators/GeneratorObjects
-                          GaudiKernel
-                          Generators/GeneratorObjects
-                          Simulation/Barcode/BarcodeEvent
-                          Simulation/G4Sim/TrackRecord
-                          Simulation/ISF/ISF_Core/FaserISF_Event
-                          Simulation/ISF/ISF_Core/ISF_Event )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Eigen )
diff --git a/Simulation/ISF/ISF_Core/FaserISF_Services/CMakeLists.txt b/Simulation/ISF/ISF_Core/FaserISF_Services/CMakeLists.txt
index bbe952c4..278b3f28 100644
--- a/Simulation/ISF/ISF_Core/FaserISF_Services/CMakeLists.txt
+++ b/Simulation/ISF/ISF_Core/FaserISF_Services/CMakeLists.txt
@@ -5,33 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserISF_Services )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          PRIVATE
-                          #AtlasGeometryCommon/SubDetectorEnvelopes
-                          Control/AthenaBaseComps
-                          Control/StoreGate
-                          DetectorDescription/FaserDetDescr
-                          Generators/AtlasHepMC
-                          Generators/GeneratorObjects
-                          Generators/TruthUtils
-                          Tracker/TrackerSimEvent
-                          Scintillator/ScintSimEvent
-                          Simulation/Barcode/BarcodeEvent
-                          Simulation/Barcode/BarcodeInterfaces
-                          Simulation/G4Atlas/G4AtlasInterfaces
-                          Simulation/G4Sim/FaserMCTruth
-                          Simulation/G4Sim/SimHelpers
-                          Simulation/G4Sim/TrackRecord
-                          Simulation/ISF/ISF_Core/ISF_Event
-                          Simulation/ISF/FaserISF_Core/FaserISF_Event
-                          Simulation/ISF/ISF_Core/ISF_Interfaces
-                          Simulation/ISF/ISF_Core/FaserISF_Interfaces
-                          Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Interfaces
-                          Simulation/ISF/ISF_HepMC/ISF_HepMC_Interfaces
-                          Tools/PmbCxxUtils )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Eigen )
@@ -48,7 +21,7 @@ atlas_add_component( FaserISF_Services
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${GEANT4_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${HEPPDT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${GEANT4_LIBRARIES} AtlasHepMCLib ${CLHEP_LIBRARIES} ${HEPPDT_LIBRARIES} GaudiKernel BarcodeInterfacesLib ScintSimEvent AthenaBaseComps StoreGateLib SGtests FaserDetDescr GeneratorObjects TrackerSimEvent G4AtlasInterfaces FaserMCTruth SimHelpers FaserISF_Event ISF_Event FaserISF_InterfacesLib ISF_InterfacesLib PmbCxxUtils TruthUtils )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${GEANT4_LIBRARIES} AtlasHepMCLib ${CLHEP_LIBRARIES} ${HEPPDT_LIBRARIES} GaudiKernel BarcodeInterfacesLib ScintSimEvent AthenaBaseComps StoreGateLib SGtests FaserDetDescr GeneratorObjects TrackerSimEvent G4AtlasInterfaces FaserMCTruth SimHelpers FaserISF_Event ISF_Event FaserISF_HepMC_Interfaces ISF_HepMC_Interfaces FaserISF_InterfacesLib ISF_InterfacesLib PmbCxxUtils TruthUtils )
 
 #atlas_add_test( FaserTruthSvc_test
 #                SOURCES
diff --git a/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/CMakeLists.txt b/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/CMakeLists.txt
index 65bd8372..d2a2aece 100644
--- a/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/CMakeLists.txt
+++ b/Simulation/ISF/ISF_Geant4/FaserISF_Geant4Event/CMakeLists.txt
@@ -4,21 +4,6 @@
 
 # Declare the package name:
 atlas_subdir( FaserISF_Geant4Event )
-
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Simulation/ISF/ISF_Core/FaserISF_Event
-                          Simulation/ISF/ISF_Core/ISF_Event
-                          Simulation/ISF/ISF_Core/FaserISF_Interfaces
-                          Simulation/ISF/ISF_Core/ISF_Interfaces
-                          Simulation/G4Sim/SimHelpers
-                          Simulation/Barcode/BarcodeEvent
-                          Simulation/G4Sim/FaserMCTruth
-                          PRIVATE
-                          Generators/AtlasHepMC
-                          DetectorDescription/GeoPrimitives )
-
-
         
 # External dependencies:
 find_package( CLHEP )
diff --git a/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Interfaces/CMakeLists.txt b/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Interfaces/CMakeLists.txt
index 48e02e4b..eb513923 100644
--- a/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Interfaces/CMakeLists.txt
+++ b/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Interfaces/CMakeLists.txt
@@ -5,11 +5,7 @@
 # Declare the package name:
 atlas_subdir( FaserISF_HepMC_Interfaces )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          Simulation/ISF/ISF_Core/FaserISF_Event )
-
-# Install files from the package:
-atlas_install_headers( FaserISF_HepMC_Interfaces )
-
+atlas_add_library( FaserISF_HepMC_Interfaces
+                   INTERFACE
+                   PUBLIC_HEADERS FaserISF_HepMC_Interfaces
+                   LINK_LIBRARIES AthenaKernel GaudiKernel )
\ No newline at end of file
diff --git a/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/CMakeLists.txt b/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/CMakeLists.txt
index 0433e79b..26ed2984 100644
--- a/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/CMakeLists.txt
+++ b/Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Tools/CMakeLists.txt
@@ -5,20 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserISF_HepMC_Tools )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          GaudiKernel
-                          PRIVATE
-                          Control/AthenaBaseComps
-                          DetectorDescription/FaserDetDescr
-                          Generators/AtlasHepMC
-                          Generators/TruthUtils
-                          Simulation/ISF/ISF_Core/FaserISF_Event
-                          Simulation/ISF/ISF_Core/FaserISF_Interfaces
-                          Simulation/ISF/ISF_HepMC/FaserISF_HepMC_Interfaces
-                          Simulation/ISF/ISF_HepMC/ISF_HepMC_Interfaces
-                          Tools/PathResolver )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 find_package( GTest )
@@ -31,7 +17,7 @@ atlas_add_component( FaserISF_HepMC_Tools
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${HEPMC_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${HEPMC_LIBRARIES} GaudiKernel FaserDetDescr AthenaBaseComps TruthUtils FaserISF_Event ISF_HepMC_Interfaces FaserISF_InterfacesLib PathResolver )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${HEPMC_LIBRARIES} GaudiKernel FaserDetDescr AthenaBaseComps TruthUtils FaserISF_Event FaserISF_HepMC_Interfaces ISF_HepMC_Interfaces FaserISF_InterfacesLib PathResolver )
 
 # Tests
 #atlas_add_test( GenParticleGenericFilter_test
diff --git a/Tracker/TrackerAlignTools/TrackerAlignGenTools/CMakeLists.txt b/Tracker/TrackerAlignTools/TrackerAlignGenTools/CMakeLists.txt
index 2bc84f26..5fa0ad81 100644
--- a/Tracker/TrackerAlignTools/TrackerAlignGenTools/CMakeLists.txt
+++ b/Tracker/TrackerAlignTools/TrackerAlignGenTools/CMakeLists.txt
@@ -5,42 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerAlignGenTools )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/Identifier
-#                          Event/EventPrimitives
-#                          InnerDetector/InDetAlignEvent/InDetAlignTrkInfo
-#                          InnerDetector/InDetAlignTools/InDetAlignToolInterfaces
-#                          InnerDetector/InDetRecEvent/InDetPrepRawData
-#                          Tracking/TrkEvent/TrkEventPrimitives
-#                          Tracking/TrkEvent/TrkEventUtils
-#                          Tracking/TrkEvent/TrkTrack
-#                          Tracking/TrkExtrapolation/TrkExInterfaces
-#                          Tracking/TrkTools/TrkToolInterfaces
-                          Event/EventContainers
-                          PRIVATE
-                          Control/AthContainers
-                          Database/RegistrationServices
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          GaudiKernel
-                          Generators/AtlasHepMC
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-#                          Simulation/G4Sim/TrackRecord
-#                          Tracking/TrkEvent/TrkMeasurementBase
-#                          Tracking/TrkEvent/TrkParameters
-#                          Tracking/TrkEvent/TrkPrepRawData
-#                          Tracking/TrkEvent/TrkRIO_OnTrack
-#                          Tracking/TrkEvent/TrkTrackSummary
-#                          Tracking/TrkEvent/TrkTruthData
-#                          Tracking/TrkFitter/TrkFitterInterfaces 
-                        )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
@@ -48,12 +12,15 @@ find_package( Eigen )
 find_package( HepPDT )
 
 # Component(s) in the package:
+atlas_add_library ( TrackerAlignGenToolsLib
+                    src/*.cxx
+                    PUBLIC_HEADERS TrackerAlignGenTools
+                    INCLUDE_DIRS ${CORAL_INCLUDE_DIRS} ${HEPPDT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
+                    LINK_LIBRARIES ${CORAL_LIBRARIES} ${HEPPDT_LIBRARIES} ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps AthenaPoolUtilities AtlasHepMCLib GeoPrimitives Identifier EventPrimitives AthenaKernel AthContainers FaserDetDescr DetDescrConditions GaudiKernel TrackerIdentifier TrackerReadoutGeometry RegistrationServicesLib )
+
 atlas_add_component( TrackerAlignGenTools
-                     src/*.cxx
                      src/components/*.cxx
-                     INCLUDE_DIRS ${CORAL_INCLUDE_DIRS} ${HEPPDT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${CORAL_LIBRARIES} ${HEPPDT_LIBRARIES} ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps AthenaPoolUtilities AtlasHepMCLib GeoPrimitives Identifier EventPrimitives AthenaKernel AthContainers FaserDetDescr DetDescrConditions GaudiKernel TrackerIdentifier TrackerReadoutGeometry )
-#                     LINK_LIBRARIES ${CORAL_LIBRARIES} ${HEPPDT_LIBRARIES} ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps AthenaPoolUtilities AtlasHepMCLib GeoPrimitives Identifier EventPrimitives InDetAlignTrkInfo InDetPrepRawData TrkEventPrimitives TrkEventUtils TrkTrack TrkExInterfaces TrkToolInterfaces AthenaKernel AthContainers AtlasDetDescr DetDescrConditions GaudiKernel InDetIdentifier InDetReadoutGeometry TrkMeasurementBase TrkParameters TrkPrepRawData TrkRIO_OnTrack TrkTrackSummary TrkTruthData TrkFitterInterfaces EventContainers )
+                     LINK_LIBRARIES TrackerAlignGenToolsLib )
 
 # Install files from the package:
 atlas_install_headers( TrackerAlignGenTools )
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/CMakeLists.txt b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/CMakeLists.txt
index 1e538ae9..eee3a3a1 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/CMakeLists.txt
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/CMakeLists.txt
@@ -5,27 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSCT_ConditionsAlgorithms )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/Identifier
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-			              DetectorDescription/GeoPrimitives
-                          GaudiKernel
-                          InnerDetector/InDetConditions/InDetConditionsSummaryService
-                          Tracker/TrackerConditions/FaserSCT_ConditionsData
-                          InnerDetector/InDetConditions/SCT_ConditionsTools
-                          InnerDetector/InDetDetDescr/SCT_Cabling
-                          PRIVATE
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracking/TrkDetDescr/TrkGeometry )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 
@@ -34,7 +13,7 @@ atlas_add_component( FaserSCT_ConditionsAlgorithms
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${Boost_LIBRARIES} AthenaBaseComps AthenaKernel StoreGateLib SGtests Identifier DetDescrConditions GeoModelUtilities GeoModelFaserUtilities GaudiKernel FaserSCT_ConditionsData SCT_CablingLib AthenaPoolUtilities TrackerIdentifier TrackerReadoutGeometry TrkGeometry SCT_ConditionsToolsLib )
+                     LINK_LIBRARIES ${Boost_LIBRARIES} AthenaBaseComps AthenaKernel StoreGateLib SGtests Identifier DetDescrConditions GeoModelUtilities GeoModelFaserUtilities GaudiKernel FaserSCT_ConditionsData SCT_CablingLib AthenaPoolUtilities TrackerIdentifier TrackerReadoutGeometry TrkGeometry SCT_ConditionsToolsLib InDetConditionsSummaryService )
 
 #atlas_add_test( TestCalibChipRead
 #                SCRIPT athena.py --threads=5 SCT_ConditionsAlgorithms/testCalibChipRead.py
@@ -102,6 +81,6 @@ atlas_add_component( FaserSCT_ConditionsAlgorithms
 #                ENVIRONMENT THREADS=5 )
 
 # Install files from the package:
-atlas_install_joboptions( share/*.py )
-atlas_install_python_modules( python/*.py )
-atlas_install_scripts( share/*.sh )
+#atlas_install_joboptions( share/*.py )
+#atlas_install_python_modules( python/*.py )
+#atlas_install_scripts( share/*.sh )
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsHVCondAlg.h b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsHVCondAlg.h
index 81a6e954..a7f4a303 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsHVCondAlg.h
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsHVCondAlg.h
@@ -15,7 +15,7 @@
 #include "StoreGate/WriteCondHandleKey.h"
 
 #include "GaudiKernel/ICondSvc.h"
-#include "GaudiKernel/Property.h"
+#include "Gaudi/Property.h"
 
 class FaserSCT_DCSConditionsHVCondAlg : public AthReentrantAlgorithm 
 {  
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsStatCondAlg.h b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsStatCondAlg.h
index f9fa5078..0bddf544 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsStatCondAlg.h
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsStatCondAlg.h
@@ -16,7 +16,7 @@
 #include "FaserSCT_ConditionsData/FaserSCT_DCSStatCondData.h"
 
 #include "GaudiKernel/ICondSvc.h"
-#include "GaudiKernel/Property.h"
+#include "Gaudi/Property.h"
 
 class FaserSCT_DCSConditionsStatCondAlg : public AthReentrantAlgorithm 
 {  
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsTempCondAlg.h b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsTempCondAlg.h
index b82a5ed1..a35bff24 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsTempCondAlg.h
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_DCSConditionsTempCondAlg.h
@@ -15,7 +15,7 @@
 #include "StoreGate/WriteCondHandleKey.h"
 
 #include "GaudiKernel/ICondSvc.h"
-#include "GaudiKernel/Property.h"
+#include "Gaudi/Property.h"
 
 class FaserSCT_DCSConditionsTempCondAlg : public AthReentrantAlgorithm 
 {  
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.h b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.h
index 3ce3427d..565f64c2 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.h
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.h
@@ -12,7 +12,7 @@
 
 // Include Gaudi classes
 #include "GaudiKernel/ICondSvc.h"
-#include "GaudiKernel/Property.h"
+#include "Gaudi/Property.h"
 
 // Include Athena classes
 #include "StoreGate/ReadCondHandleKey.h"
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.h b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.h
index fd260203..184fdf67 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.h
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.h
@@ -18,7 +18,7 @@
 
 // Include Gaudi classes
 #include "GaudiKernel/ICondSvc.h"
-#include "GaudiKernel/Property.h"
+#include "Gaudi/Property.h"
 
 // Include boost stuff
 #include "boost/array.hpp"
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsData/CMakeLists.txt b/Tracker/TrackerConditions/FaserSCT_ConditionsData/CMakeLists.txt
index 2b6f3035..9c0b2c7b 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsData/CMakeLists.txt
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsData/CMakeLists.txt
@@ -6,13 +6,6 @@ option( INSTALL_CONDB "Generate and install a conditions database" OFF )
 # Declare the package name:
 atlas_subdir( FaserSCT_ConditionsData )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/Identifier )
-
 # Component(s) in the package:
 atlas_add_library( FaserSCT_ConditionsData
                    src/*.cxx
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt
index dde73faa..9ba04a72 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt
@@ -5,30 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSCT_ConditionsTools )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          DetectorDescription/Identifier
-                          GaudiKernel
-                          InnerDetector/InDetConditions/InDetConditionsSummaryService
-                          Tracker/TrackerConditions/FaserSCT_ConditionsData
-                          InnerDetector/InDetConditions/SCT_ConditionsTools
-                          PRIVATE
-                          Control/AthenaBaseComps
-                          Control/StoreGate
-                          Event/xAOD/xAODEventInfo
-                          Event/EventContainers
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          InnerDetector/InDetConditions/InDetByteStreamErrors
-                          Tracker/TrackerConditions/FaserSiPropertiesTool
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          InnerDetector/InDetDetDescr/SCT_Cabling
-                          AtlasTest/TestTools )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
@@ -40,7 +16,7 @@ atlas_add_component ( FaserSCT_ConditionsTools
                       src/components/*.cxx
                       src/*.cxx
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaKernel Identifier GeoModelUtilities GeoModelFaserUtilities GaudiKernel AthenaBaseComps StoreGateLib SGtests xAODEventInfo FaserSCT_ConditionsData InDetByteStreamErrors TrackerIdentifier TrackerReadoutGeometry SCT_CablingLib FaserSiPropertiesToolLib SCT_ConditionsToolsLib )
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaKernel Identifier GeoModelUtilities GeoModelFaserUtilities GaudiKernel AthenaBaseComps StoreGateLib SGtests xAODEventInfo FaserSCT_ConditionsData InDetByteStreamErrors TrackerIdentifier TrackerReadoutGeometry SCT_CablingLib FaserSiPropertiesToolLib SCT_ConditionsToolsLib InDetConditionsSummaryService )
 
 
 #atlas_add_library( FaserSCT_ConditionsToolsLib
@@ -48,7 +24,7 @@ atlas_add_component ( FaserSCT_ConditionsTools
 #                   #PUBLIC_HEADERS FaserSCT_ConditionsTools
 #                   NO_PUBLIC_HEADERS
 #                   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-#                   LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaKernel Identifier GeoModelUtilities GeoModelFaserUtilities GaudiKernel AthenaBaseComps StoreGateLib SGtests xAODEventInfo FaserSCT_ConditionsData SCT_ConditionsTools FaserSiPropertiesToolLib InDetByteStreamErrors TrackerIdentifier TrackerReadoutGeometry SCT_CablingLib EventContainers)
+#                   LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} AthenaKernel Identifier GeoModelUtilities GeoModelFaserUtilities GaudiKernel AthenaBaseComps StoreGateLib SGtests xAODEventInfo FaserSCT_ConditionsData SCT_ConditionsTools FaserSiPropertiesToolLib InDetByteStreamErrors TrackerIdentifier TrackerReadoutGeometry SCT_CablingLib EventContainers InDetConditionsSummaryService )
 
 # Add unit tests
 #atlas_add_test( SCT_RODVetoTool_test
@@ -64,5 +40,5 @@ atlas_add_component ( FaserSCT_ConditionsTools
 # Install files from the package:
 #atlas_install_headers( FaserSCT_ConditionsTools )
 atlas_install_python_modules( python/*.py )
-atlas_install_scripts( share/*.py )
+#atlas_install_scripts( share/*.py )
 
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_DCSConditionsTool.h b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_DCSConditionsTool.h
index c3ef130e..0b454182 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_DCSConditionsTool.h
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_DCSConditionsTool.h
@@ -26,7 +26,7 @@
 #include "FaserSCT_ConditionsData/FaserSCT_DCSStatCondData.h"
 
 // Gaudi
-#include "GaudiKernel/Property.h"
+#include "Gaudi/Property.h"
 #include "GaudiKernel/EventContext.h"
 
 // STL
diff --git a/Tracker/TrackerConditions/FaserSiLorentzAngleTool/CMakeLists.txt b/Tracker/TrackerConditions/FaserSiLorentzAngleTool/CMakeLists.txt
index a6a19e68..0979e83f 100644
--- a/Tracker/TrackerConditions/FaserSiLorentzAngleTool/CMakeLists.txt
+++ b/Tracker/TrackerConditions/FaserSiLorentzAngleTool/CMakeLists.txt
@@ -5,27 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSiLorentzAngleTool )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/StoreGate
-                          DetectorDescription/GeoPrimitives
-                          GaudiKernel
-                          InnerDetector/InDetConditions/InDetCondTools
-                          Tracker/TrackerConditions/FaserSiPropertiesTool
-                          Tracker/TrackerConditions/FaserSCT_ConditionsData
-                          InnerDetector/InDetConditions/SiLorentzAngleTool
-                          MagneticField/MagFieldInterfaces
-                          PRIVATE
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/Identifier
-                          InnerDetector/InDetConditions/InDetConditionsSummaryService
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          MagneticField/MagFieldElements
-                          MagneticField/MagFieldConditions )
-
 # External dependencies:
 find_package( Eigen )
 
@@ -49,4 +28,4 @@ atlas_add_component( FaserSiLorentzAngleTool
 # Install files from the package:
 #atlas_install_headers( FaserSiLorentzAngleTool )
 atlas_install_python_modules( python/*.py )
-atlas_install_joboptions( share/*.py )
+#atlas_install_joboptions( share/*.py )
diff --git a/Tracker/TrackerConditions/FaserSiPropertiesTool/CMakeLists.txt b/Tracker/TrackerConditions/FaserSiPropertiesTool/CMakeLists.txt
index a771c637..029a9f3e 100644
--- a/Tracker/TrackerConditions/FaserSiPropertiesTool/CMakeLists.txt
+++ b/Tracker/TrackerConditions/FaserSiPropertiesTool/CMakeLists.txt
@@ -5,19 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSiPropertiesTool )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          PRIVATE
-                          Control/StoreGate
-                          DetectorDescription/Identifier
-                          InnerDetector/InDetConditions/InDetConditionsSummaryService
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerConditions/FaserSCT_ConditionsData )
-
 # External dependencies:
 find_package( CLHEP )
 
@@ -27,13 +14,13 @@ atlas_add_library( FaserSiPropertiesToolLib
                    PUBLIC_HEADERS FaserSiPropertiesTool
                    PRIVATE_INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS}
                    PRIVATE_DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES AthenaBaseComps AthenaKernel GaudiKernel TrackerReadoutGeometry FaserSCT_ConditionsData StoreGateLib SGtests
+                   LINK_LIBRARIES AthenaBaseComps AthenaKernel GaudiKernel TrackerReadoutGeometry FaserSCT_ConditionsData StoreGateLib SGtests InDetConditionsSummaryService
                    PRIVATE_LINK_LIBRARIES ${CLHEP_LIBRARIES} Identifier TrackerIdentifier )
 
 atlas_add_component( FaserSiPropertiesTool
                      src/components/*.cxx
                      INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${CLHEP_LIBRARIES} AthenaBaseComps AthenaKernel GaudiKernel TrackerReadoutGeometry FaserSCT_ConditionsData StoreGateLib SGtests Identifier TrackerIdentifier FaserSiPropertiesToolLib)
+                     LINK_LIBRARIES ${CLHEP_LIBRARIES} FaserSiPropertiesToolLib InDetConditionsSummaryService)
 
 # Run tests:
 #atlas_add_test( TestSCTProperties
@@ -47,5 +34,5 @@ atlas_add_component( FaserSiPropertiesTool
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_joboptions( share/*.py )
+#atlas_install_joboptions( share/*.py )
 
diff --git a/Tracker/TrackerDetDescr/DipoleGeoModel/CMakeLists.txt b/Tracker/TrackerDetDescr/DipoleGeoModel/CMakeLists.txt
index c4aeda23..8a778845 100644
--- a/Tracker/TrackerDetDescr/DipoleGeoModel/CMakeLists.txt
+++ b/Tracker/TrackerDetDescr/DipoleGeoModel/CMakeLists.txt
@@ -5,24 +5,6 @@
 # Declare the package name:
 atlas_subdir( DipoleGeoModel )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/GeoModel/GeoModelUtilities
-			              DetectorDescription/GeoPrimitives
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerGeoModelUtils
-                          PRIVATE
-                          Control/SGTools
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeometryDBSvc
-                          )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
@@ -34,7 +16,7 @@ atlas_add_component( DipoleGeoModel
 		     src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelFaserUtilities GeoModelUtilities GaudiKernel TrackerGeoModelUtils SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions )
+                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel GeoModelFaserUtilities GeoModelUtilities GaudiKernel TrackerGeoModelUtils SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions GeometryDBSvcLib )
 
 atlas_add_test( DipoleGMConfig_test
                 SCRIPT test/DipoleGMConfig_test.py
diff --git a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt
index 0f9ae155..8d34e379 100644
--- a/Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt
+++ b/Tracker/TrackerDetDescr/FaserSCT_GeoModel/CMakeLists.txt
@@ -5,26 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSCT_GeoModel )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/GeoModel/GeoModelUtilities
-			              DetectorDescription/GeoPrimitives
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerGeoModelUtils
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          PRIVATE
-                          Control/SGTools
-                          Control/StoreGate
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeometryDBSvc
-                          DetectorDescription/Identifier
-                          Tracker/TrackerDetDescr/TrackerIdentifier )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CORAL COMPONENTS CoralBase CoralKernel RelationalAccess )
@@ -36,7 +16,7 @@ atlas_add_component( FaserSCT_GeoModel
 		     src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} 
-                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GeoModelFaserUtilities GeoModelUtilities GaudiKernel TrackerGeoModelUtils TrackerReadoutGeometry SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions Identifier TrackerIdentifier )
+                     LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel GeoModelFaserUtilities GeoModelUtilities GaudiKernel TrackerGeoModelUtils TrackerReadoutGeometry SGTools StoreGateLib SGtests AthenaPoolUtilities DetDescrConditions Identifier TrackerIdentifier GeometryDBSvcLib )
 
 atlas_add_test( FaserSCT_GMConfig_test
                 SCRIPT test/FaserSCT_GMConfig_test.py
diff --git a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt
index e0fdcf14..66b62f64 100644
--- a/Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt
+++ b/Tracker/TrackerDetDescr/TrackerGeoModelUtils/CMakeLists.txt
@@ -5,19 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerGeoModelUtils )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Database/RDBAccessSvc
-                          GaudiKernel
-                          PRIVATE
-                          Control/StoreGate
-                          DetectorDescription/GeoModel/GeoModelInterfaces
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/GeometryDBSvc )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CLHEP )
@@ -30,6 +17,6 @@ atlas_add_library( TrackerGeoModelUtils
                    PUBLIC_HEADERS TrackerGeoModelUtils
                    INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
                    DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel GaudiKernel StoreGateLib SGtests
-                   PRIVATE_LINK_LIBRARIES GeoModelUtilities GeoModelFaserUtilities )
+                   LINK_LIBRARIES ${Boost_LIBRARIES} ${CORAL_LIBRARIES} ${CLHEP_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel GaudiKernel StoreGateLib SGtests GeoPrimitives
+                   PRIVATE_LINK_LIBRARIES GeoModelUtilities GeoModelFaserUtilities GeometryDBSvcLib )
 
diff --git a/Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictCosmic.xml b/Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictCosmic.xml
new file mode 100644
index 00000000..b0006660
--- /dev/null
+++ b/Tracker/TrackerDetDescr/TrackerIdDictFiles/data/IdDictCosmic.xml
@@ -0,0 +1,51 @@
+<IdDictionary name="Tracker" version="Faser">
+
+  <field name="part">
+    <label name="SCT"        value="1" />
+  </field>
+
+<!-- No interface detector in this version -->
+
+  <field name="station" >
+    <label name="Central"   value="2" />
+  </field>
+
+  <field name="layer" >
+    <label name="Upstream"   value="0" />
+    <label name="Central"    value="1" />
+    <label name="Downstream" value="2" />
+  </field>
+
+  <field name="phi_module">
+    <label name="Bottom"       value="0" /> 
+    <label name="LowerMiddle"  value="1" />
+    <label name="UpperMiddle"  value="2" />
+    <label name="Top"          value="3" />
+  </field>
+
+  <field name="eta_module">
+  <!-- facing downstream (hence "starboard" and "port")
+       x must increase right to left for a right-handed
+       coordinate system -->
+  <!-- numbers straddle zero for consistency with ATLAS -->       
+    <label name="Starboard"   value="-1" />
+    <label name="Port"        value="+1" />
+  </field>
+
+  <field name="side">
+  <!-- The "upper" side is the side with the pigtail -->
+    <label name="Upper"    value="0" />
+    <label name="Lower"    value="1" />
+  </field>
+
+  <region>
+    <range field="part"       value="SCT" />
+    <range field="station"    values="Central" />
+    <range field="layer"      values="Upstream Central Downstream" />
+    <range field="phi_module" values="Bottom LowerMiddle UpperMiddle Top" wraparound="FALSE" />
+    <range field="eta_module" values="Starboard Port" wraparound="FALSE" />
+    <range field="side"       values="Upper Lower" />
+    <range field="strip"      minvalue="0" maxvalue="767" />
+  </region>
+
+</IdDictionary>
\ No newline at end of file
diff --git a/Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt b/Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt
index 0e9efc6b..93fbd456 100644
--- a/Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt
+++ b/Tracker/TrackerDetDescr/TrackerIdentifier/CMakeLists.txt
@@ -5,16 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerIdentifier )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/IdDict
-                          DetectorDescription/Identifier
-                          PRIVATE
-                          DetectorDescription/IdDictParser
-                          GaudiKernel )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
diff --git a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt
index a36752e3..7efb5919 100644
--- a/Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt
+++ b/Tracker/TrackerDetDescr/TrackerReadoutGeometry/CMakeLists.txt
@@ -5,29 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerReadoutGeometry )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/CxxUtils
-                          Control/StoreGate
-                          DetectorDescription/FaserDetDescr
-                          DetectorDescription/GeoModel/GeoModelUtilities
-                          DetectorDescription/GeoModel/GeoModelFaserUtilities
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/Identifier
-                          GaudiKernel
-                          InnerDetector/InDetConditions/InDetCondTools
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracking/TrkDetDescr/TrkDetElementBase
-                          Tracking/TrkDetDescr/TrkSurfaces
-                          Tracking/TrkEvent/TrkEventPrimitives
-                          DetectorDescription/DetDescrCond/DetDescrConditions
-                          PRIVATE
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          DetectorDescription/IdDictDetDescr
-                        )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Eigen )
@@ -39,6 +16,6 @@ atlas_add_library( TrackerReadoutGeometry
                    PUBLIC_HEADERS TrackerReadoutGeometry
                    INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
                    DEFINITIONS ${CLHEP_DEFINITIONS}
-                   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODEL_LIBRARIES} AthenaKernel CxxUtils FaserDetDescr GeoModelUtilities GeoModelFaserUtilities GeoPrimitives Identifier GaudiKernel TrackerIdentifier TrkDetElementBase TrkSurfaces TrkEventPrimitives StoreGateLib SGtests AthenaBaseComps DetDescrConditions
+                   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${EIGEN_LIBRARIES} ${GEOMODELCORE_LIBRARIES} AthenaKernel CxxUtils FaserDetDescr GeoModelUtilities GeoModelFaserUtilities GeoPrimitives Identifier GaudiKernel TrackerIdentifier TrkDetElementBase TrkSurfaces TrkEventPrimitives StoreGateLib SGtests AthenaBaseComps DetDescrConditions InDetCondTools
                    PRIVATE_LINK_LIBRARIES AthenaPoolUtilities IdDictDetDescr )
 
diff --git a/Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt
index fd6d2418..8b9ded27 100644
--- a/Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt
+++ b/Tracker/TrackerDetDescrCnv/TrackerIdCnv/CMakeLists.txt
@@ -5,14 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerIdCnv )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/StoreGate
-                          DetectorDescription/DetDescrCnvSvc
-                          DetectorDescription/TrackerDetDescr
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerIdentifier )
-
 # Component(s) in the package:
 atlas_add_component( TrackerIdCnv
                      src/*.cxx
diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/CMakeLists.txt b/Tracker/TrackerDigitization/FaserSCT_Digitization/CMakeLists.txt
index a9bb50b8..0677e285 100644
--- a/Tracker/TrackerDigitization/FaserSCT_Digitization/CMakeLists.txt
+++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/CMakeLists.txt
@@ -5,32 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSCT_Digitization )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          #Commission/CommissionEvent
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          Control/PileUpTools
-                          DetectorDescription/Identifier
-                          Event/xAOD/xAODEventInfo
-                          GaudiKernel
-                          Tracker/TrackerConditions/TrackerCondTools
-                          Tracker/TrackerDigitization/FaserSiDigitization
-                          Tracker/TrackerRawEvent/TrackerRawData
-                          Tracker/TrackerSimEvent
-                          Simulation/HitManagement
-                          PRIVATE
-                          Control/StoreGate
-                          Generators/GeneratorObjects
-                          InnerDetector/InDetConditions/InDetConditionsSummaryService
-                          InnerDetector/InDetConditions/SCT_ConditionsTools # for interfaces
-                          Tracker/TrackerConditions/FaserSCT_ConditionsTools
-                          Tracker/TrackerConditions/FaserSiPropertiesTool
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          #InnerDetector/InDetDetDescr/SCT_ModuleDistortions
-                          Tracker/TrackerRawEvent/TrackerSimData )
-
 # External dependencies:
 find_package( Boost COMPONENTS filesystem thread system )
 find_package( CLHEP )
@@ -41,8 +15,7 @@ atlas_add_component( FaserSCT_Digitization
                      src/*.cxx src/*.h
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps AthenaKernel PileUpToolsLib Identifier xAODEventInfo GaudiKernel FaserSiDigitization TrackerRawData TrackerSimEvent HitManagement GeneratorObjects FaserSiPropertiesToolLib TrackerIdentifier TrackerReadoutGeometry TrackerSimData )
-#                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} CommissionEvent AthenaBaseComps AthenaKernel PileUpToolsLib Identifier xAODEventInfo GaudiKernel SiDigitization InDetRawData InDetSimEvent HitManagement GeneratorObjects FaserSiPropertiesToolLib InDetIdentifier InDetReadoutGeometry InDetSimData )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps AthenaKernel PileUpToolsLib Identifier xAODEventInfo GaudiKernel FaserSiDigitization TrackerRawData TrackerSimEvent HitManagement GeneratorObjects FaserSiPropertiesToolLib TrackerIdentifier TrackerReadoutGeometry TrackerSimData SCT_ConditionsToolsLib )
 
 #atlas_add_test( SCT_DigitizationMT_test
 #                SCRIPT Digi_tf.py --inputHITSFile /cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/DigitizationTests/HITS.04919495._001041.pool.root.1 --conditionsTag default:OFLCOND-RUN12-SDR-25 --digiSeedOffset1 170 --digiSeedOffset2 170 --geometryVersion ATLAS-R2-2015-03-01-00 --DataRunNumber 222525 --outputRDOFile mc15_2015_ttbar.RDO.pool.root --preInclude HITtoRDO:SimulationJobOptions/preInclude.SCTOnlyConfig.py,Digitization/ForceUseOfAlgorithms.py --postInclude Digitization/FixDataDependenciesForMT.py --skipEvents 0  --maxEvents 100 --athenaopts=--threads=10
@@ -52,6 +25,6 @@ atlas_add_component( FaserSCT_Digitization
 # Install files from the package:
 atlas_install_headers( FaserSCT_Digitization )
 atlas_install_python_modules( python/*.py )
-atlas_install_joboptions( share/*.py )
+#atlas_install_joboptions( share/*.py )
 atlas_install_scripts( test/FaserSCT_DigitizationDbg.py )
 
diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.cxx b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.cxx
index 67cc2ceb..04adc01f 100644
--- a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.cxx
+++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.cxx
@@ -487,7 +487,7 @@ StatusCode FaserSCT_DigitizationTool::processBunchXing(int bunchXing,
 // =========================================================================
 // property handlers
 // =========================================================================
-void FaserSCT_DigitizationTool::SetupRdoOutputType(Property &) {
+void FaserSCT_DigitizationTool::SetupRdoOutputType(Gaudi::Details::PropertyBase&) {
 }
 
 // Does nothing, but required by Gaudi
diff --git a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.h b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.h
index 1aa62a31..fb4a7482 100644
--- a/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.h
+++ b/Tracker/TrackerDigitization/FaserSCT_Digitization/src/FaserSCT_DigitizationTool.h
@@ -115,7 +115,7 @@ private:
   /**
      @brief Called when m_WriteSCT1_RawData is altered. Does nothing, but required by Gaudi.
   */
-  void SetupRdoOutputType(Property&);
+  void SetupRdoOutputType(Gaudi::Details::PropertyBase&);
 
   FloatProperty m_tfix{this, "FixedTime", -999., "Fixed time for Cosmics run selection"};
   BooleanProperty m_enableHits{this, "EnableHits", true, "Enable hits"};
diff --git a/Tracker/TrackerDigitization/FaserSiDigitization/CMakeLists.txt b/Tracker/TrackerDigitization/FaserSiDigitization/CMakeLists.txt
index afa4ae31..f31ff20b 100644
--- a/Tracker/TrackerDigitization/FaserSiDigitization/CMakeLists.txt
+++ b/Tracker/TrackerDigitization/FaserSiDigitization/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSiDigitization )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Control/AthAllocators
-                          DetectorDescription/Identifier
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracker/TrackerSimEvent )
-
 # Component(s) in the package:
 atlas_add_library( FaserSiDigitization
                    src/SiChargedDiode.cxx
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerByteStream/CMakeLists.txt
new file mode 100644
index 00000000..e80463b6
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+
+# Declare the package name:
+atlas_subdir( TrackerByteStream )
+
+# Component(s) in the package:
+
+atlas_add_component( TrackerByteStream
+                     src/*.cxx src/*.h
+                     src/components/*.cxx
+                     LINK_LIBRARIES AthenaKernel GaudiKernel StoreGateLib FaserByteStreamCnvSvcBaseLib FaserEventStorageLib TrackerRawData TrackerReadoutGeometry TrackerIdentifier
+                     PRIVATE_LINK_LIBRARIES AthenaBaseComps )
+
+
+atlas_install_python_modules( python/*.py )
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/python/TrackerByteStreamConfig.py b/Tracker/TrackerEventCnv/TrackerByteStream/python/TrackerByteStreamConfig.py
new file mode 100644
index 00000000..06e02977
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/python/TrackerByteStreamConfig.py
@@ -0,0 +1,9 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+#from AthenaConfiguration.ComponentFactory import CompFactory
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+
+def TrackerByteStreamCfg(configFlags, **kwargs):
+    acc = ComponentAccumulator()
+
+    return acc
\ No newline at end of file
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/python/__init__.py b/Tracker/TrackerEventCnv/TrackerByteStream/python/__init__.py
new file mode 100644
index 00000000..ab1dfcde
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/python/__init__.py
@@ -0,0 +1 @@
+#TrackerByteStream
\ No newline at end of file
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx
new file mode 100644
index 00000000..397ba8cf
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx
@@ -0,0 +1,105 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#include "TrackerByteStreamCnv.h"
+#include "TrackerDataDecoderTool.h"
+
+#include "FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h"
+#include "TrackerRawData/FaserSCT_RDO_Container.h"
+#include "EventFormats/DAQFormats.hpp"
+
+#include "TrackerIdentifier/FaserSCT_ID.h"
+
+#include "AthenaKernel/errorcheck.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/DataObject.h"
+#include "GaudiKernel/IRegistry.h"
+
+#include "StoreGate/StoreGateSvc.h"
+#include "GaudiKernel/IToolSvc.h"
+
+using DAQFormats::EventFull;
+
+TrackerByteStreamCnv::TrackerByteStreamCnv(ISvcLocator* svcloc)
+  : Converter(storageType(), classID(), svcloc)
+  , AthMessaging(svcloc != nullptr ? msgSvc() : nullptr, "TrackerByteStreamCnv")
+  , m_tool("TrackerDataDecoderTool")
+  , m_rdpSvc("FaserROBDataProviderSvc", "TrackerByteStreamCnv")
+  , m_detStoreSvc("StoreGateSvc/DetectorStore", "TrackerByteStreamCnv")
+{
+}
+
+TrackerByteStreamCnv::~TrackerByteStreamCnv() {
+}
+
+const CLID& TrackerByteStreamCnv::classID() 
+{
+  return ClassID_traits<FaserSCT_RDO_Container>::ID();
+}
+
+StatusCode TrackerByteStreamCnv::initialize() 
+{
+  ATH_MSG_DEBUG("initialize() called");
+
+  CHECK(Converter::initialize());
+  CHECK(m_rdpSvc.retrieve());
+  CHECK(m_tool.retrieve());
+
+  ATH_CHECK(m_detStoreSvc.retrieve());
+  ATH_CHECK(m_detStoreSvc->retrieve(m_sctID, "FaserSCT_ID"));
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrackerByteStreamCnv::finalize() 
+{
+  ATH_MSG_DEBUG("finalize() called");
+
+  CHECK(Converter::finalize());
+  return StatusCode::SUCCESS;  
+
+}
+
+StatusCode TrackerByteStreamCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj) 
+{
+  ATH_MSG_DEBUG("createObj() called");
+
+  // Check that we can access raw data
+  if (!m_rdpSvc) {
+    ATH_MSG_ERROR("createObj() - ROBDataProviderSvc not loaded!");
+    return StatusCode::FAILURE;
+  }
+
+  FaserByteStreamAddress *pRE_Addr{nullptr};
+  pRE_Addr = dynamic_cast<FaserByteStreamAddress*>(pAddr); // Cast from OpaqueAddress
+  if (!pRE_Addr) {
+    ATH_MSG_ERROR("Cannot cast to FaserByteStreamAddress ");
+    return StatusCode::FAILURE;
+  }
+
+  // Get pointer to the raw event
+  const EventFull* re = m_rdpSvc->getEvent();
+  if (!re) {
+    ATH_MSG_ERROR("Cannot get raw event from FaserByteStreamInputSvc!");
+    return StatusCode::FAILURE;
+  }               
+
+  // Get key used in the StoreGateSvc::retrieve function if useful
+  const std::string key = *(pRE_Addr->par());
+  ATH_MSG_DEBUG("Creating objects "+key);
+
+  unsigned int max = m_sctID->wafer_hash_max(); 
+  FaserSCT_RDO_Container* cont = new FaserSCT_RDO_Container(max);
+  ATH_MSG_DEBUG("New FaserSCT_RDO_Container created of size="<<cont->size());
+
+  // Convert raw data into this container
+
+  CHECK( m_tool->convert(re, cont) );
+  
+  pObj = SG::asStorable(cont);
+
+  return StatusCode::SUCCESS;
+}
+
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h
new file mode 100644
index 00000000..212257de
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h
@@ -0,0 +1,50 @@
+//Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRACKERBYTESTREAM_TRACKERBYTESTREAMCNV_H
+#define TRACKERBYTESTREAM_TRACKERBYTESTREAMCNV_H
+
+#include "GaudiKernel/ClassID.h"
+#include "GaudiKernel/Converter.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include "AthenaBaseComps/AthMessaging.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+class TrackerDataDecoderTool;
+class IFaserROBDataProviderSvc;
+class FaserSCT_ID;
+class StoreGateSvc;
+
+// Abstract factory to create the converter
+template <class TYPE> class CnvFactory;
+
+class TrackerByteStreamCnv: public Converter, public AthMessaging {
+
+public: 
+  TrackerByteStreamCnv(ISvcLocator* svcloc);
+  virtual ~TrackerByteStreamCnv();
+  
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  
+  virtual StatusCode createObj(IOpaqueAddress* pAddr, DataObject*& pObj) override;  
+  /// Storage type and class ID
+  virtual long repSvcType() const override { return i_repSvcType(); }
+  static long storageType() { return FaserByteStreamAddress::storageType(); }
+  static const CLID& classID();
+  
+private:
+  ToolHandle<TrackerDataDecoderTool>      m_tool;
+  ServiceHandle<IFaserROBDataProviderSvc> m_rdpSvc;
+  ServiceHandle<StoreGateSvc>             m_detStoreSvc;
+  const FaserSCT_ID*                      m_sctID{nullptr};
+};
+
+#endif  /* TRACKERBYTESTREAM_TRACKERBYTESTREAMCNV_H */
+
+
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx
new file mode 100644
index 00000000..11655889
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx
@@ -0,0 +1,308 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#include "TrackerDataDecoderTool.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include "TrackerRawData/FaserSCT3_RawData.h"
+#include "EventFormats/TrackerDataFragment.hpp"
+
+#include "TrackerReadoutGeometry/SiDetectorElement.h"
+#include "TrackerReadoutGeometry/SiDetectorElementCollection.h"
+#include "TrackerReadoutGeometry/SCT_DetectorManager.h"
+
+
+#include <vector>
+#include <map>
+
+static const InterfaceID IID_ITrackerDataDecoderTool("TrackerDataDecoderTool", 1, 0);
+
+const InterfaceID& TrackerDataDecoderTool::interfaceID() {
+  return IID_ITrackerDataDecoderTool;
+}
+
+TrackerDataDecoderTool::TrackerDataDecoderTool(const std::string& type, 
+      const std::string& name,const IInterface* parent)
+  : AthAlgTool(type, name, parent)
+{
+  declareInterface<TrackerDataDecoderTool>(this);
+
+  // No properties to declare (yet)
+
+}
+
+TrackerDataDecoderTool::~TrackerDataDecoderTool()
+{
+}
+
+StatusCode
+TrackerDataDecoderTool::initialize() 
+{
+  ATH_MSG_DEBUG("initialize()");
+
+  if (msgStream().level() >= MSG::WARNING ) TrackerDataFragment::set_debug_on(true);
+
+  if ((m_abcdMode != "HIT") && (m_abcdMode != "EDGE") && (m_abcdMode != "LEVEL") )
+  {
+    ATH_MSG_ERROR("Invalid ChipMode (" << m_abcdMode << "); please choose one of HIT, EDGE or LEVEL.");
+    return StatusCode::FAILURE;
+  }
+
+  ATH_CHECK(detStore()->retrieve(m_sctID, "FaserSCT_ID"));
+
+  m_sctContext = m_sctID->wafer_context();
+  m_phiReversed.resize(m_sctID->wafer_hash_max(), false);
+
+  const TrackerDD::SCT_DetectorManager* detMgr{nullptr};
+  ATH_CHECK(detStore()->retrieve(detMgr, "SCT"));
+
+  const TrackerDD::SiDetectorElementCollection* sctDetElementColl{detMgr->getDetectorElementCollection()};
+  size_t nReversed = 0;
+  for (const TrackerDD::SiDetectorElement* element: *sctDetElementColl)
+  {
+    if (element->swapPhiReadoutDirection()) 
+    {
+      m_phiReversed[element->identifyHash()] = true;
+      nReversed++;
+    }
+  }
+
+  ATH_MSG_DEBUG("Initialized " << m_sctID->wafer_hash_max() << " wafers with " << nReversed << " having phi reversed.");
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+TrackerDataDecoderTool::finalize() 
+{
+  ATH_MSG_DEBUG("TrackerDataDecoderTool::finalize()");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+TrackerDataDecoderTool::convert(const DAQFormats::EventFull* re, 
+    FaserSCT_RDO_Container* container)
+{
+  ATH_MSG_DEBUG("TrackerDataDecoderTool::convert()");
+
+  if (!re) {
+    ATH_MSG_ERROR("EventFull passed to convert() is null!");
+    return StatusCode::FAILURE;
+  }
+
+  if (!container) {
+    ATH_MSG_ERROR("TrackerDataContainer passed to convert() is null!");
+    return StatusCode::FAILURE;
+  }
+
+  std::map<IdentifierHash, std::unique_ptr<FaserSCT_RDO_Collection>>  collectionMap;
+
+  const DAQFormats::EventFragment* frag = NULL;
+  size_t validFragments = 0;
+  for(const auto &id : re->getFragmentIDs()) {
+    frag=re->find_fragment(id);
+
+    if ((frag->source_id()&0xFFFF0000) != DAQFormats::SourceIDs::TrackerSourceID) continue;
+    ATH_MSG_DEBUG("Fragment:\n" << *frag);
+    uint32_t trb = frag->source_id() & 0x0000FFFF;
+    // FIXME: will need to be updated for interface detector
+    int station = 2 + trb / TrackerDataFragment::PLANES_PER_STATION; 
+    int plane = trb % TrackerDataFragment::PLANES_PER_STATION;
+    
+    TrackerDataFragment trackFrag{ frag->payload<const uint32_t*>(), frag->payload_size() };
+
+    if (!trackFrag.valid())
+    {
+      ATH_MSG_WARNING("Invalid tracker data fragment for TRB " << trb);
+      // FIXME: What else to do if error?  Return FAILURE?
+      // FIXME: Validity checking in TrackerDataFragment is a placeholder
+      continue;
+    }
+    if (trackFrag.event_id() != re->event_id())
+    {
+      ATH_MSG_ERROR("Event ID mismatch for tracker data fragment from trb " << trb << 
+                    "; found " << trackFrag.event_id() << " but expected " << re->event_id());
+      // FIXME: Is returning FAILURE the right thing to do here?
+      return StatusCode::FAILURE;
+    }
+    validFragments++;
+    // auto bcid = trackFrag.bc_id();
+    ATH_MSG_DEBUG("Processing tracker data fragment for TRB " << trb);
+
+    for (const SCTEvent* sctEvent : trackFrag)
+    {
+      if (sctEvent != nullptr)
+      {
+        unsigned short onlineModuleID = sctEvent->GetModuleID(); 
+        if (plane == 2) onlineModuleID = (onlineModuleID + 4) % 8;
+        if (onlineModuleID >= TrackerDataFragment::MODULES_PER_FRAGMENT)
+        {
+          // FIXME: Should we return failure here?
+          ATH_MSG_ERROR("Invalid module ID (" << onlineModuleID << ") from trb " << trb);
+          continue;
+        }
+        if (sctEvent->BCIDMismatch())
+        {
+          // FIXME: Should we return failure here?
+          ATH_MSG_ERROR("Module data BCID mismatch between sides for online module " << onlineModuleID);
+          continue;
+        }
+        else if (sctEvent->HasError())
+        {
+          // FIXME: Should we return failure here?
+          ATH_MSG_ERROR("Online module " << onlineModuleID << " reports one or more errors.");
+          continue;
+        }
+        else if (sctEvent->MissingData())
+        {
+          // FIXME: Should we return failure here?
+          ATH_MSG_ERROR("Online module " << onlineModuleID << " reports missing data.");
+          continue;
+        }
+        else if (!sctEvent->IsComplete())
+        {
+          // FIXME: Should we return failure here?
+          ATH_MSG_ERROR("Online module " << onlineModuleID << " reports not complete.");
+          continue;
+        }
+        // Not satisfied, at least for cosmics data
+        // else if (sctEvent->GetBCID() != bcid)
+        // {
+        //   // FIXME: Should we return failure here?
+        //   ATH_MSG_ERROR("Module data BCID (" << sctEvent->GetBCID() << ")for online module " << 
+        //                  onlineModuleID << " differs from TrackerDataFragment (" << bcid << ")");
+        //   continue;
+        // }
+        ATH_MSG_DEBUG("Processing online module #" << onlineModuleID);
+        // Offline module number
+        uint32_t module = m_moduleMap[onlineModuleID];
+        size_t chipIndex{0};
+        for (auto hitVector : sctEvent->GetHits())
+        {
+          if (hitVector.size() > 0)
+          {
+            int side = chipIndex / TrackerDataFragment::CHIPS_PER_SIDE;
+            uint32_t chipOnSide = chipIndex % TrackerDataFragment::CHIPS_PER_SIDE;
+            for (auto hit : hitVector)
+            {
+              uint32_t stripOnChip = hit.first;
+              if (stripOnChip >= TrackerDataFragment::STRIPS_PER_CHIP)
+              {
+                // FIXME: Return failure?
+                ATH_MSG_ERROR("Invalid strip number on chip: " << stripOnChip );
+                continue;
+              }
+              uint32_t hitPattern  = hit.second;
+              if (m_abcdMode == "EDGE" && (((hitPattern & 0x2) == 0 ) || ((hitPattern & 0x4) != 0) ) ) continue; // 01X
+              if (m_abcdMode == "LEVEL" && ((hitPattern & 0x2) == 0)) continue; // X1X
+              int phiModule = module % 4; // 0 to 3 from bottom to top
+              int etaModule = -1 + 2*((module%2 + module/4) % 2); // -1 or +1
+              // ATH_MSG_DEBUG("Getting wafer_id for station, plane, phi, eta, side = " << station << " " << plane << " " << phiModule << " " << etaModule << " " << side);
+              Identifier id = m_sctID->wafer_id(station, plane, phiModule, etaModule, side);
+              IdentifierHash waferHash = m_sctID->wafer_hash(id);  // this will be the collection number in the container
+              int stripOnSide = chipOnSide * TrackerDataFragment::STRIPS_PER_CHIP + stripOnChip;
+              // ATH_MSG_DEBUG("Checking phi reversal for waferhash = " << waferHash << "(" << waferHash.value() << ") strip on side = " << stripOnSide);
+              if (m_phiReversed[waferHash]) stripOnSide = TrackerDataFragment::STRIPS_PER_SIDE - stripOnSide - 1;
+              if (stripOnSide < 0 || static_cast<uint32_t>(stripOnSide) >= TrackerDataFragment::STRIPS_PER_SIDE)
+              {
+                // FIXME: Return failure?
+                ATH_MSG_ERROR("Invalid strip number on side: " << stripOnSide);
+                continue;
+              }
+              Identifier digitID {m_sctID->strip_id(id, stripOnSide)};
+              int errors{0};
+              int groupSize{1};
+              unsigned int rawDataWord{static_cast<unsigned int>(groupSize | (stripOnSide << 11) | (hitPattern <<22) | (errors << 25))};
+
+              if (collectionMap.count(waferHash) == 0)
+              {
+                {
+                  std::unique_ptr<FaserSCT_RDO_Collection> current_collection = std::make_unique<FaserSCT_RDO_Collection>(waferHash);
+                  current_collection->setIdentifier(id);
+                  collectionMap[waferHash] = std::move(current_collection);
+                }
+              }
+              collectionMap[waferHash]->emplace_back(new FaserSCT3_RawData(digitID, rawDataWord, std::vector<int>() ));
+            }
+          }
+          chipIndex++;
+        }
+      }
+    }
+
+  }
+
+  if (validFragments == 0) 
+  {
+    ATH_MSG_ERROR("Failed to find Tracker fragments in raw event!");
+    return StatusCode::FAILURE;
+  }
+
+  for (auto& [hash, collection] : collectionMap)
+  {
+    if (collection == nullptr) continue;
+    if (collection->empty())
+    {
+      collection.reset();
+      continue;
+    }
+    ATH_CHECK(container->getWriteHandle(hash).addOrDelete(std::move(collection)));
+  }
+
+  // Can check if you found something
+  // ATH_MSG_DEBUG("Tracker Fragment:\n" << *trackerFragments[0]);
+
+  // Now we have a list of fragments, need to loop over all fragments
+  // and fill containers based on their data.
+  // See  InnerDetector/InDetEventCnv/SCT_RawDataByteStreamCnv/src/SCT_RodDecoder.cxx
+  // for the (complicated) way ATLAS does this.
+  // for (auto fragmentEntry: trackerFragments) {
+  //   size_t trb = fragmentEntry.first;
+  //   auto fragment = fragmentEntry.second;
+  //   ATH_MSG_DEBUG("Processing tracker data fragment for TRB " << trb);
+  //   // Must loop over data in this fragment, find the collection each 
+  //   // hit belongs to, create the collection if it doesn't exist, and fill 
+  //   // the RDOs into the proper collection.
+    
+  //   // Some snippets are here
+  //   FaserSCT_RDO_Collection* sctRDOColl{nullptr};
+
+  //   // Find collection in container, check if NULL, add add if it doesn't exist
+  //   // id = collectionID(data)
+  //   // if (!container->hasID(id)) {
+  //   //  ATH_MSG_DEBUG(" Collection ID = " << id << " does not exist, create it ");
+  //   //  sctRDOColl = new SCT_RD0_Collection(id);
+  //   //  sctRDOColl->setIdentifier(id);
+  //   //  CHECK( container->addCollection(sctRDOColl, id) );
+  //   // }
+  //   // sctRDOColl = container->get(id);  // Not sure how this works...
+  //   //
+  //   // Must loop over figure out which collection this data belongs to and 
+  //   // set pointer appropriately
+
+  //   FaserSCT3_RawData* rdo = new FaserSCT3_RawData();
+
+  //   // Do the conversion here using whatever it takes
+  //   // try {
+  //   //  rdo->setData( fragment );
+  //   //} catch ( TrackerDataException& e ) {
+  //   //  ATH_MSG_INFO("TrackerDataDecoderTool:\n"
+  //   //	   <<e.what()
+  //   //		   << "\nTracker data not filled!\n");
+
+  //   // sctRDOColl->push_back(rdo);
+
+  // }  // end of loop over fragments
+
+  // Don't spring a leak
+  // This may not quite be correct syntax, but the fragements we created above 
+  // need to be deleted 
+  // for (auto fragEntry : trackerFragments) 
+  //   delete fragEntry.second;
+
+  // We also should probably use std::make_unique to create the RDOs
+
+  ATH_MSG_DEBUG( "TrackerDataDecoderTool created container with size=" << container->size());
+  return StatusCode::SUCCESS; 
+}
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h
new file mode 100644
index 00000000..8aae1391
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h
@@ -0,0 +1,48 @@
+//Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef TRACKERBYTESTREAM_TRACKERDATADECODERTOOL_H
+#define TRACKERBYTESTREAM_TRACKERDATADECODERTOOL_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include "EventFormats/DAQFormats.hpp"
+#include "TrackerRawData/FaserSCT_RDO_Container.h"
+
+#include "TrackerIdentifier/FaserSCT_ID.h"
+
+
+// This class provides conversion between bytestream and Tracker RDOs
+
+class TrackerDataDecoderTool : public AthAlgTool {
+
+ public:
+  TrackerDataDecoderTool(const std::string& type, const std::string& name, 
+			  const IInterface* parent);
+
+  virtual ~TrackerDataDecoderTool();
+
+  static const InterfaceID& interfaceID();
+
+  virtual StatusCode initialize();
+  virtual StatusCode finalize();
+
+  StatusCode convert(const DAQFormats::EventFull* re, FaserSCT_RDO_Container* cont);
+
+private:
+  const FaserSCT_ID*                      m_sctID{nullptr};
+  IdContext                               m_sctContext;
+  std::vector<bool>                       m_phiReversed;
+  Gaudi::Property<std::vector<uint32_t> > m_moduleMap { this, 
+                                                        "ModuleMap", 
+                                                        {7, 2, 5, 0, 3, 6, 1, 4}, 
+                                                        "Mapping from online to offline module numbers" };
+  Gaudi::Property<std::string>            m_abcdMode { this, "ChipMode", "HIT", "Emulate LEVEL or EDGE mode for abcd chips (HIT means take anything over threshold)" };
+};
+
+#endif  /* TRACKERBYTESTREAM_TRACKERDATADECODERTOOL_H */
+ 
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/components/TrackerByteStream_entries.cxx b/Tracker/TrackerEventCnv/TrackerByteStream/src/components/TrackerByteStream_entries.cxx
new file mode 100644
index 00000000..278f04cd
--- /dev/null
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/components/TrackerByteStream_entries.cxx
@@ -0,0 +1,6 @@
+#include "../TrackerDataDecoderTool.h"
+#include "../TrackerByteStreamCnv.h"
+
+DECLARE_COMPONENT( TrackerDataDecoderTool )
+
+DECLARE_CONVERTER( TrackerByteStreamCnv )
diff --git a/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt
index edcf1d74..ece9e410 100644
--- a/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt
+++ b/Tracker/TrackerEventCnv/TrackerEventAthenaPool/CMakeLists.txt
@@ -29,7 +29,7 @@ atlas_add_dictionary( TrackerEventAthenaPoolCnvDict
 
 # Install files from the package:
 atlas_install_headers( TrackerEventAthenaPool )
-atlas_install_joboptions( share/*.py )
+#atlas_install_joboptions( share/*.py )
 
 # Set up (a) test(s) for the converter(s):
 #if( IS_DIRECTORY ${CMAKE_SOURCE_DIR}/Database/AthenaPOOL/AthenaPoolUtilities )
diff --git a/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt
index c63114d7..d60ff6dd 100644
--- a/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt
+++ b/Tracker/TrackerEventCnv/TrackerEventTPCnv/CMakeLists.txt
@@ -6,54 +6,20 @@
 # Declare the package name:
 atlas_subdir( TrackerEventTPCnv )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Control/AthAllocators
-   Control/AthLinks
-   Control/DataModelAthenaPool
-   Control/StoreGate
-   Database/AthenaPOOL/AthenaPoolCnvSvc
-   Database/AthenaPOOL/AthenaPoolUtilities
-   DetectorDescription/Identifier
-   GaudiKernel
-   Tracker/TrackerDetDescr/TrackerIdentifier
-   #InnerDetector/InDetRecEvent/InDetCompetingRIOsOnTrack
-   Tracker/TrackerRecEvent/TrackerPrepRawData
-   #Tracker/TrackerRecEvent/TrackerRIO_OnTrack
-   Tracking/TrkEventCnv/TrkEventCnvTools
-   Tracking/TrkEventCnv/TrkEventTPCnv
-   PRIVATE
-   AtlasTest/TestTools
-   Control/AthenaBaseComps
-   Control/AthenaKernel
-   Control/SGTools
-   DetectorDescription/IdDictParser
-   Event/EventPrimitives
-   Tracker/TrackerDetDescr/TrackerReadoutGeometry
-   Tracking/TrkDetDescr/TrkSurfaces
-   Tracking/TrkEvent/TrkEventPrimitives
-   Tracking/TrkEvent/TrkMeasurementBase
-   Tracking/TrkEvent/TrkRIO_OnTrack )
-
 # Component(s) in the package:
 atlas_add_tpcnv_library( TrackerEventTPCnv
    TrackerEventTPCnv/*.h src/*.cxx
-#   TrackerEventTPCnv/TrackerRIO_OnTrack/*.h src/TrackerRIO_OnTrack/*.cxx
    TrackerEventTPCnv/TrackerPrepRawData/*.h src/TrackerPrepRawData/*.cxx
-#   TrackerEventTPCnv/InDetCompetingRIOsOnTrack/*.h
-#   src/InDetCompetingRIOsOnTrack/*.cxx
    PUBLIC_HEADERS TrackerEventTPCnv
    LINK_LIBRARIES AthAllocators AthLinks DataModelAthenaPoolLib StoreGateLib
    AthenaPoolCnvSvcLib AthenaPoolUtilities Identifier GaudiKernel
    TrackerIdentifier 
-#  InDetCompetingRIOsOnTrack
    TrackerPrepRawData 
-#  TrackerRIO_OnTrack 
-   TrkEventTPCnv
+   TrkEventTPCnv 
+   TrkPrepRawData
    PRIVATE_LINK_LIBRARIES AthenaBaseComps AthenaKernel
    EventPrimitives TrackerReadoutGeometry TrkSurfaces TrkEventPrimitives
-   TrkMeasurementBase TrkRIO_OnTrack )
+   TrkMeasurementBase TrkRIO_OnTrack EventContainers )
 
 atlas_add_dictionary( TrackerEventTPCnvDict
    TrackerEventTPCnv/TrackerEventTPCnvDict.h TrackerEventTPCnv/selection.xml
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/CMakeLists.txt
index ff1dad0f..c5718df7 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/CMakeLists.txt
+++ b/Tracker/TrackerEventCnv/TrackerSimEventAthenaPool/CMakeLists.txt
@@ -5,16 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerSimEventAthenaPool )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          AtlasTest/TestTools
-                          Database/AthenaPOOL/AthenaPoolCnvSvc
-                          Database/AthenaPOOL/AthenaPoolUtilities
-                          Database/AtlasSealCLHEP
-                          GaudiKernel
-                          Tracker/TrackerEventCnv/TrackerSimEventTPCnv
-                          Tracker/TrackerSimEvent )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
@@ -33,5 +23,5 @@ atlas_add_dictionary( TrackerSimEventAthenaPoolCnvDict
 
 # Install files from the package:
 atlas_install_headers( TrackerSimEventAthenaPool )
-atlas_install_joboptions( share/*.py )
+#atlas_install_joboptions( share/*.py )
 
diff --git a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt
index 22723150..f18b0945 100644
--- a/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt
+++ b/Tracker/TrackerEventCnv/TrackerSimEventTPCnv/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerSimEventTPCnv )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Database/AthenaPOOL/AthenaPoolCnvSvc
-                          GaudiKernel
-                          Generators/GeneratorObjectsTPCnv
-                          Tracker/TrackerSimEvent
-                          PRIVATE
-                          AtlasTest/TestTools
-                          Control/StoreGate
-                          DetectorDescription/Identifier )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
diff --git a/Tracker/TrackerG4/FaserSCT_G4_SD/CMakeLists.txt b/Tracker/TrackerG4/FaserSCT_G4_SD/CMakeLists.txt
index c9d3d373..9e106e5d 100644
--- a/Tracker/TrackerG4/FaserSCT_G4_SD/CMakeLists.txt
+++ b/Tracker/TrackerG4/FaserSCT_G4_SD/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSCT_G4_SD )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PRIVATE
-                          Control/StoreGate
-                          GaudiKernel
-                          Tracker/TrackerSimEvent
-                          Simulation/G4Atlas/G4AtlasTools
-                          Simulation/G4Sim/FaserMCTruth
-                           )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
@@ -26,11 +17,6 @@ atlas_add_component( FaserSCT_G4_SD
                      INCLUDE_DIRS ${GEANT4_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
                      LINK_LIBRARIES ${GEANT4_LIBRARIES} ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} StoreGateLib SGtests GaudiKernel TrackerSimEvent G4AtlasToolsLib FaserMCTruth )
 
-atlas_add_test( FaserSCT_G4_SDToolConfig_test
-                SCRIPT python ${CMAKE_CURRENT_SOURCE_DIR}/test/FaserSCT_G4_SDToolConfig_test.py
-                PROPERTIES TIMEOUT 300 )
-
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
-atlas_install_scripts( test/*.py )
 
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 4c9f7576..eb4fb537 100644
--- a/Tracker/TrackerG4/FaserSCT_G4_SD/python/FaserSCT_G4_SDToolConfig.py
+++ b/Tracker/TrackerG4/FaserSCT_G4_SD/python/FaserSCT_G4_SDToolConfig.py
@@ -2,7 +2,7 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
-from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
+# from ISF_Algorithms.collection_merger_helpersNew import CollectionMergerCfg
 
 FaserSctSensorSDTool=CompFactory.FaserSctSensorSDTool
 
@@ -10,12 +10,13 @@ def SctSensorSDCfg(ConfigFlags, name="SctSensorSD", **kwargs):
 
     result = ComponentAccumulator()
     bare_collection_name = "SCT_Hits"
-    mergeable_collection_suffix = "_G4"
-    merger_input_property = "SCTHits"
+    # mergeable_collection_suffix = "_G4"
+    # merger_input_property = "SCTHits"
 
-    acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property)
+    # acc, hits_collection_name = CollectionMergerCfg(ConfigFlags, bare_collection_name, mergeable_collection_suffix, merger_input_property, "TRACKER")
+    # kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
     kwargs.setdefault("LogicalVolumeNames", ["SCT::BRLSensor"])
-    kwargs.setdefault("OutputCollectionNames", [hits_collection_name])
+    kwargs.setdefault("OutputCollectionNames", [bare_collection_name])
 
-    result.merge(acc)
+    # result.merge(acc)
     return result, FaserSctSensorSDTool(name, **kwargs)
diff --git a/Tracker/TrackerG4/FaserSCT_G4_SD/test/FaserSCT_G4_SDToolConfig_test.py b/Tracker/TrackerG4/FaserSCT_G4_SD/test/FaserSCT_G4_SDToolConfig_test.py
deleted file mode 100644
index 394d3416..00000000
--- a/Tracker/TrackerG4/FaserSCT_G4_SD/test/FaserSCT_G4_SDToolConfig_test.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-"""Run tests on FaserSCT_G4_SD configuration
-
-Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-"""
-from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
-
-
-if __name__ == '__main__':
-  
-
-  #import config flags
-  from CalypsoConfiguration.AllConfigFlags import ConfigFlags
-  # Set up logging and config behaviour
-  from AthenaCommon.Logging import log
-  from AthenaCommon.Constants import DEBUG
-  from AthenaCommon.Configurable import Configurable
-  log.setLevel(DEBUG)
-  Configurable.configurableRun3Behavior = 1
-
-
-  # ConfigFlags.Sim.ISF.Run = True
-  ConfigFlags.Detector.SimulateFaserSCT = True
-
-  #Provide input
-  from AthenaConfiguration.TestDefaults import defaultTestFiles
-  inputDir = defaultTestFiles.d
-  ConfigFlags.Input.Files = defaultTestFiles.EVNT
-  
-  # Finalize 
-  ConfigFlags.lock()
-
-
-  ## Initialize a new component accumulator
-  cfg = ComponentAccumulator()
-
-  from FaserSCT_G4_SD.FaserSCT_G4_SDToolConfig import SctSensorSDCfg
-
-  acc, tool = SctSensorSDCfg(ConfigFlags) 
-  acc.addPublicTool(tool) 
-  cfg.merge(acc)
-
-
-  cfg.printConfig(withDetails=True, summariseProps = True)
-  ConfigFlags.dump()
-
-  f=open("test.pkl","wb")
-  cfg.store(f) 
-  f.close()
-
-
-
-  print(cfg._publicTools)
-  print("-----------------finished----------------------")
diff --git a/Tracker/TrackerRawEvent/TrackerRawData/CMakeLists.txt b/Tracker/TrackerRawEvent/TrackerRawData/CMakeLists.txt
index 9037208e..b5fde237 100644
--- a/Tracker/TrackerRawEvent/TrackerRawData/CMakeLists.txt
+++ b/Tracker/TrackerRawEvent/TrackerRawData/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerRawData )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthContainers
-                          Control/AthLinks
-                          Control/AthenaKernel
-                          DetectorDescription/Identifier
-                          Event/EventContainers
-			              Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          PRIVATE
-                          GaudiKernel )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
diff --git a/Tracker/TrackerRawEvent/TrackerSimData/CMakeLists.txt b/Tracker/TrackerRawEvent/TrackerSimData/CMakeLists.txt
index ab5d1520..10793b4a 100644
--- a/Tracker/TrackerRawEvent/TrackerSimData/CMakeLists.txt
+++ b/Tracker/TrackerRawEvent/TrackerSimData/CMakeLists.txt
@@ -5,12 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerSimData )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          DetectorDescription/Identifier
-                          Generators/GeneratorObjects )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
diff --git a/Tracker/TrackerRecAlgs/TrackerPrepRawDataFormation/CMakeLists.txt b/Tracker/TrackerRecAlgs/TrackerPrepRawDataFormation/CMakeLists.txt
index 05ab1320..96032827 100644
--- a/Tracker/TrackerRecAlgs/TrackerPrepRawDataFormation/CMakeLists.txt
+++ b/Tracker/TrackerRecAlgs/TrackerPrepRawDataFormation/CMakeLists.txt
@@ -5,30 +5,11 @@
 # Declare the package name:
 atlas_subdir( TrackerPrepRawDataFormation )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/StoreGate
-                          DetectorDescription/Identifier
-                          GaudiKernel
-                          Tracker/TrackerRawEvent/TrackerRawData
-                          Tracker/TrackerRecEvent/TrackerPrepRawData
-                          Tracker/TrackerRecTools/FaserSiClusterizationTool
-                          PRIVATE
-                          Control/AthViews
-                          DetectorDescription/FaserDetDescr
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracker/TrackerConditions/FaserSCT_ConditionsData
-                          InnerDetector/InDetConditions/SCT_ConditionsData
-                          InnerDetector/InDetConditions/InDetConditionsSummaryService
-                        )
-
 # Component(s) in the package:
 atlas_add_component( TrackerPrepRawDataFormation
                      src/*.cxx src/*.h
                      src/components/*.cxx
-                     LINK_LIBRARIES AthenaBaseComps StoreGateLib SGtests Identifier GaudiKernel TrackerRawData TrackerPrepRawData FaserSiClusterizationToolLib FaserDetDescr TrackerIdentifier TrackerReadoutGeometry AthViews)
+                     LINK_LIBRARIES AthenaBaseComps StoreGateLib SGtests Identifier GaudiKernel TrackerRawData TrackerPrepRawData FaserSiClusterizationToolLib FaserDetDescr TrackerIdentifier TrackerReadoutGeometry AthViews SCT_ConditionsData InDetConditionsSummaryService )
 
 # Install files from the package:
 #atlas_install_headers( TrackerPrepRawDataFormation )
diff --git a/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/CMakeLists.txt b/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/CMakeLists.txt
index 3d274e74..a9e05da1 100644
--- a/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/CMakeLists.txt
+++ b/Tracker/TrackerRecAlgs/TrackerSpacePointFormation/CMakeLists.txt
@@ -5,25 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerSpacePointFormation )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaMonitoringKernel
-                          Control/AthContainers
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/Identifier
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracker/TrackerRecEvent/TrackerPrepRawData
-                          Tracker/TrackerRecEvent/TrackerSpacePoint
-                          Tracker/TrackerRecTools/FaserSiSpacePointTool
-#                          Tracking/TrkEvent/VxVertex
-                          PRIVATE
-                          DetectorDescription/FaserDetDescr
-                          Event/xAOD/xAODEventInfo
-			              Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracking/TrkEvent/TrkSpacePoint )
-
 # External dependencies:
 find_package( Eigen )
 
diff --git a/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/CMakeLists.txt b/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/CMakeLists.txt
index 3ea091fd..d55a82a3 100644
--- a/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/CMakeLists.txt
+++ b/Tracker/TrackerRecAlgs/TruthSeededTrackFinder/CMakeLists.txt
@@ -5,27 +5,6 @@
 # Declare the package name:
 atlas_subdir( TruthSeededTrackFinder )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaMonitoringKernel
-                          Control/AthContainers
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/Identifier
-                          GaudiKernel
-			              Generators/GeneratorObjects
-			              Tracker/TrackerDetDescr/TrackerReadoutGeometry
-			              Tracker/TrackerRawEvent/TrackerRawData
-			              Tracker/TrackerRawEvent/TrackerSimData
-            			  Tracker/TrackerSimEvent
-                          Tracker/TrackerRecEvent/TrackerPrepRawData
-                          Tracker/TrackerRecEvent/TrackerSpacePoint
-                          Tracking/TrkEvent/VxVertex
-                          PRIVATE
-                          DetectorDescription/FaserDetDescr
-                          Event/xAOD/xAODEventInfo
-			              Tracker/TrackerDetDescr/TrackerIdentifier )
-
 # External dependencies:
 find_package( Eigen )
 
@@ -40,7 +19,7 @@ find_package( Eigen )
  atlas_add_component( TruthSeededTrackFinder
                      src/components/*.cxx src/*.cxx src/*.h
                      INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS}
-		     LINK_LIBRARIES ${EIGEN_LIBRARIES} AthenaBaseComps AthContainers GeoPrimitives Identifier GaudiKernel TrackerReadoutGeometry TrackerRawData TrackerSimData GeneratorObjects TrackerSimEvent TrackerSpacePoint VxVertex FaserDetDescr xAODEventInfo TrackerIdentifier TrackerPrepRawData )
+		     LINK_LIBRARIES ${EIGEN_LIBRARIES} AthenaBaseComps AthContainers GeoPrimitives Identifier GaudiKernel TrackerReadoutGeometry TrackerRawData TrackerSimData GeneratorObjects TrackerSimEvent TrackerSpacePoint VxVertex FaserDetDescr xAODEventInfo TrackerIdentifier TrackerPrepRawData AthenaMonitoringKernelLib)
 
 atlas_install_python_modules( python/*.py )
 atlas_install_scripts( test/*.py )
diff --git a/Tracker/TrackerRecEvent/TrackerPrepRawData/CMakeLists.txt b/Tracker/TrackerRecEvent/TrackerPrepRawData/CMakeLists.txt
index b7135ead..1d7a2f71 100644
--- a/Tracker/TrackerRecEvent/TrackerPrepRawData/CMakeLists.txt
+++ b/Tracker/TrackerRecEvent/TrackerPrepRawData/CMakeLists.txt
@@ -5,21 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerPrepRawData )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthLinks
-                          Control/CxxUtils
-                          Control/AthenaKernel
-                          DetectorDescription/GeoPrimitives
-                          DetectorDescription/Identifier
-                          Event/EventPrimitives
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracker/TrackerRawEvent/TrackerRawData
-                          Tracking/TrkDetDescr/TrkSurfaces
-                          Tracking/TrkEvent/TrkEventPrimitives
-                          Tracking/TrkEvent/TrkPrepRawData )
-
 # External dependencies:
 find_package( Eigen )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
@@ -30,7 +15,7 @@ atlas_add_library( TrackerPrepRawData
                    PUBLIC_HEADERS TrackerPrepRawData
                    INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS}
                    PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                   LINK_LIBRARIES ${EIGEN_LIBRARIES} AthLinks CxxUtils AthenaKernel GeoPrimitives Identifier EventPrimitives GaudiKernel TrackerReadoutGeometry TrkSurfaces TrkEventPrimitives TrkPrepRawData TrackerRawData
+                   LINK_LIBRARIES ${EIGEN_LIBRARIES} AthLinks CxxUtils AthenaKernel GeoPrimitives Identifier EventPrimitives GaudiKernel TrackerReadoutGeometry TrkSurfaces TrkEventPrimitives TrkPrepRawData TrackerRawData EventContainers 
                    PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} )
 
 atlas_add_dictionary( TrackerPrepRawDataDict
diff --git a/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h
index 8337d229..75f3a09f 100755
--- a/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h
+++ b/Tracker/TrackerRecEvent/TrackerPrepRawData/TrackerPrepRawData/TrackerCluster.h
@@ -95,12 +95,15 @@ namespace Tracker
 		
 		/** return the detector element corresponding to this PRD
 		The pointer will be zero if the det el is not defined (i.e. it was not passed in by the ctor)*/
-		virtual const TrackerDD::SiDetectorElement* detectorElement() const;
+		virtual const TrackerDD::SiDetectorElement* detectorElement() const override;
+
+		/** Interface method checking the type*/
+		virtual bool type(Trk::PrepRawDataType::Type type) const final;
 
 		/** dump information about the SiCluster*/
-		virtual MsgStream&    dump( MsgStream&    stream) const;
+		virtual MsgStream&    dump( MsgStream&    stream) const override;
 		/** dump information about the SiCluster*/
-		virtual std::ostream& dump( std::ostream& stream) const;
+		virtual std::ostream& dump( std::ostream& stream) const override;
 
 		private:
 		FaserSiWidth m_width; //col, row, and width in mm
@@ -148,5 +151,9 @@ namespace Tracker
 		return m_detEl;
 	}
 
+	inline bool TrackerCluster::type(Trk::PrepRawDataType::Type type) const
+	{
+  		return type == Trk::PrepRawDataType::SiCluster;
+	}
 }
 #endif // TRACKERPREPRAWDATA_TRACKERCLUSTER_H
diff --git a/Tracker/TrackerRecEvent/TrackerSpacePoint/CMakeLists.txt b/Tracker/TrackerRecEvent/TrackerSpacePoint/CMakeLists.txt
index ef83b396..e00ba940 100644
--- a/Tracker/TrackerRecEvent/TrackerSpacePoint/CMakeLists.txt
+++ b/Tracker/TrackerRecEvent/TrackerSpacePoint/CMakeLists.txt
@@ -5,18 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerSpacePoint )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          DetectorDescription/Identifier
-                          Tracking/TrkDetDescr/TrkDetElementBase
-                          Tracking/TrkEvent/TrkSpacePoint
-                          PRIVATE
-                          DetectorDescription/GeoPrimitives
-                          Event/EventPrimitives
-                          Tracking/TrkDetDescr/TrkSurfaces
-                          Tracking/TrkEvent/TrkEventPrimitives
-                          Tracking/TrkEvent/TrkPrepRawData )
-
 # External dependencies:
 find_package( Eigen )
 
diff --git a/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx b/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx
index c474146b..ca62c4ab 100755
--- a/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx
+++ b/Tracker/TrackerRecEvent/TrackerSpacePoint/src/FaserSCT_SpacePoint.cxx
@@ -80,7 +80,8 @@ namespace Tracker
 			     const Amg::Vector3D& position,
 			     const std::pair<const Trk::PrepRawData*, const Trk::PrepRawData*>* clusList)
   {
-    m_clusList = clusList ;
+    m_clusList.first = clusList->first;
+    m_clusList.second = clusList->second;
     m_position = position ;
     m_elemIdList.first = elementIdList.first ;
     m_elemIdList.second = elementIdList.second ;
diff --git a/Tracker/TrackerRecTools/FaserSiClusterizationTool/CMakeLists.txt b/Tracker/TrackerRecTools/FaserSiClusterizationTool/CMakeLists.txt
index b0fd5a53..3d927a4b 100644
--- a/Tracker/TrackerRecTools/FaserSiClusterizationTool/CMakeLists.txt
+++ b/Tracker/TrackerRecTools/FaserSiClusterizationTool/CMakeLists.txt
@@ -5,36 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSiClusterizationTool )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Control/AthenaBaseComps
-   Control/AthenaKernel
-   DetectorDescription/GeoPrimitives
-   DetectorDescription/Identifier
-   Event/EventPrimitives
-   GaudiKernel
-   Tracker/TrackerRawEvent/TrackerSimData
-#############   InnerDetector/InDetConditions/InDetConditionsSummaryService
-#############   InnerDetector/InDetConditions/InDetCondTools
-   Tracker/TrackerDetDescr/TrackerIdentifier
-   Tracker/TrackerDetDescr/TrackerReadoutGeometry
-   Tracker/TrackerDetDescr/FaserSCT_ReadoutGeometry
-   Tracker/TrackerRawEvent/TrackerRawData
-   Tracker/TrackerRecEvent/TrackerPrepRawData
-   InnerDetector/InDetRecTools/InDetRecToolInterfaces
-   Tracking/TrkEvent/TrkParameters
-   PRIVATE
-   Control/CxxUtils
-   Database/AthenaPOOL/AthenaPoolUtilities
-   Database/AthenaPOOL/PoolSvc
-   Database/APR/FileCatalog
-   DetectorDescription/FaserDetDescr
-   DetectorDescription/DetDescrCond/DetDescrCondTools
-   Tracking/TrkDetDescr/TrkSurfaces
-   Tracking/TrkEvent/TrkEventPrimitives
-   Tracking/TrkEvent/VxVertex )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( ROOT COMPONENTS Core MathCore Hist )
@@ -58,4 +28,4 @@ atlas_add_component( FaserSiClusterizationTool
    LINK_LIBRARIES GaudiKernel FaserSiClusterizationToolLib )
 
 # Install files from the package:
-atlas_install_joboptions( share/*.py )
+#atlas_install_joboptions( share/*.py )
diff --git a/Tracker/TrackerRecTools/FaserSiSpacePointTool/CMakeLists.txt b/Tracker/TrackerRecTools/FaserSiSpacePointTool/CMakeLists.txt
index ad3ea577..a3be44fc 100644
--- a/Tracker/TrackerRecTools/FaserSiSpacePointTool/CMakeLists.txt
+++ b/Tracker/TrackerRecTools/FaserSiSpacePointTool/CMakeLists.txt
@@ -5,20 +5,6 @@
 # Declare the package name:
 atlas_subdir( FaserSiSpacePointTool )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          Control/AthenaKernel
-                          DetectorDescription/GeoPrimitives
-			              Tracker/TrackerRecEvent/TrackerPrepRawData
-                          DetectorDescription/Identifier
-                          PRIVATE
-                          GaudiKernel
-			              Tracker/TrackerDetDescr/TrackerReadoutGeometry
-			              Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerRecEvent/TrackerSpacePoint
-                        )
-
 # External dependencies:
 find_package( Eigen )
 
diff --git a/Tracker/TrackerSimEvent/CMakeLists.txt b/Tracker/TrackerSimEvent/CMakeLists.txt
index 6077137c..2cb3cc0f 100644
--- a/Tracker/TrackerSimEvent/CMakeLists.txt
+++ b/Tracker/TrackerSimEvent/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( TrackerSimEvent )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaKernel
-                          Control/AthAllocators
-                          Control/CxxUtils
-                          Generators/GeneratorObjects
-                          Simulation/HitManagement                        
-                          PRIVATE
-                          Control/StoreGate
-                          Tracker/TrackerDetDescr/TrackerIdentifier )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Geant4 )
diff --git a/Tracker/TrkDetAlgs/TrkDetStripClusterImporter/CMakeLists.txt b/Tracker/TrkDetAlgs/TrkDetStripClusterImporter/CMakeLists.txt
index 5629706c..a275b9a8 100644
--- a/Tracker/TrkDetAlgs/TrkDetStripClusterImporter/CMakeLists.txt
+++ b/Tracker/TrkDetAlgs/TrkDetStripClusterImporter/CMakeLists.txt
@@ -6,16 +6,6 @@
 # Declare the package name:
 atlas_subdir( TrkDetStripClusterImporter )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          xAOD/xAODFaserTracking
-                          GaudiKernel
-                          PRIVATE
-                          Control/AthenaKernel
-                          )
-                          
-
 # External dependencies:
 find_package( Eigen )
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread EG )
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/CMakeLists.txt b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/CMakeLists.txt
new file mode 100644
index 00000000..903be447
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/CMakeLists.txt
@@ -0,0 +1,18 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+
+# Declare the package name:
+atlas_subdir( FaserTriggerByteStream )
+
+# Component(s) in the package:
+atlas_add_library( FaserTriggerByteStreamLib
+                   src/*.cxx
+                   NO_PUBLIC_HEADERS
+                   LINK_LIBRARIES AthenaKernel GaudiKernel StoreGateLib FaserByteStreamCnvSvcBaseLib FaserEventStorageLib
+                   PRIVATE_LINK_LIBRARIES AthenaBaseComps xAODFaserTrigger  )
+
+atlas_add_component( FaserTriggerByteStream
+                     src/components/*.cxx
+                     LINK_LIBRARIES FaserTriggerByteStreamLib xAODFaserTrigger )
+
+#atlas_install_joboptions( share/*.py )
+atlas_install_python_modules( python/*.py )
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/python/FaserTriggerByteStreamConfig.py b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/python/FaserTriggerByteStreamConfig.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/python/__init__.py b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/python/__init__.py
new file mode 100644
index 00000000..a000042f
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/python/__init__.py
@@ -0,0 +1 @@
+# FaserTrigCnv
\ No newline at end of file
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.cxx b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.cxx
new file mode 100644
index 00000000..4d6c6a05
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.cxx
@@ -0,0 +1,114 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "FaserTriggerByteStreamAuxCnv.h"
+#include "FaserTriggerDecoderTool.h"
+
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+#include "EventFormats/DAQFormats.hpp"
+
+#include "AthenaKernel/errorcheck.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/DataObject.h"
+#include "GaudiKernel/IRegistry.h"
+
+#include "xAODFaserTrigger/FaserTriggerData.h"
+#include "xAODFaserTrigger/FaserTriggerDataAuxInfo.h"
+
+#include "StoreGate/StoreGateSvc.h"
+
+#include "eformat/StreamTag.h"
+
+#include <time.h>
+
+using DAQFormats::EventFull;
+
+FaserTriggerByteStreamAuxCnv::FaserTriggerByteStreamAuxCnv(ISvcLocator* svcloc)
+  : Converter(storageType(), classID(), svcloc)
+  , AthMessaging(svcloc != nullptr ? msgSvc() : nullptr, "FaserTriggerByteStreamAuxCnv")
+  , m_tool("FaserTriggerDecoderTool")
+  , m_robDataProvider("FaserROBDataProviderSvc", "FaserTriggerByteStreamAuxCnv")
+{
+}
+
+const CLID& FaserTriggerByteStreamAuxCnv::classID() 
+{
+  return ClassID_traits<xAOD::FaserTriggerDataAuxInfo>::ID();
+}
+
+long FaserTriggerByteStreamAuxCnv::storageType() 
+{
+  return FaserByteStreamAddress::storageType();
+}
+
+StatusCode FaserTriggerByteStreamAuxCnv::initialize() 
+{
+  ATH_MSG_DEBUG("Initialize");
+
+  CHECK(Converter::initialize());
+
+  CHECK(m_robDataProvider.retrieve());
+  CHECK(m_tool.retrieve());
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode FaserTriggerByteStreamAuxCnv::finalize() 
+{
+  ATH_MSG_DEBUG("Finalize");
+  
+  StatusCode sc = Converter::finalize();
+  if (sc.isFailure()) {
+    ATH_MSG_WARNING("Converter::finalize() failed");
+  }
+  return sc;
+}
+
+StatusCode FaserTriggerByteStreamAuxCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj) 
+{
+  if (pAddr == nullptr) ATH_MSG_ERROR("pAddr is null");
+  FaserByteStreamAddress *pRE_Addr{nullptr};
+  pRE_Addr = dynamic_cast<FaserByteStreamAddress*>(pAddr);
+  if (!pRE_Addr) {
+    ATH_MSG_ERROR("Cannot cast to FaserByteStreamAddress ");
+    return StatusCode::FAILURE;
+  }
+
+  ATH_MSG_DEBUG("Creating Objects");
+
+  // get RawEvent
+  const EventFull* re = m_robDataProvider->getEvent();
+  if (!re) {
+    ATH_MSG_ERROR("Can not get RawEvent ");
+    return StatusCode::FAILURE;
+  }
+
+  // Run Number
+  int runNumber = re->run_number();
+
+  // Event Number
+  uint64_t eventNumber;
+  eventNumber = re->event_id();
+
+
+  xAOD::FaserTriggerData triggerData;
+  xAOD::FaserTriggerDataAuxInfo* pTriggerDataAux = new xAOD::FaserTriggerDataAuxInfo();
+  triggerData.setStore(pTriggerDataAux);
+
+  CHECK( m_tool->convert(re, &triggerData) );
+
+  pObj = StoreGateSvc::asStorable(pTriggerDataAux);
+
+  ATH_MSG_DEBUG("Created xAOD::FaserTriggerDataAuxInfo for run/event =" << runNumber << " / " << eventNumber);
+  return StatusCode::SUCCESS;
+}
+
+StatusCode FaserTriggerByteStreamAuxCnv::createRep(DataObject* /*pObj*/, IOpaqueAddress*& /*pAddr*/) 
+{
+  ATH_MSG_DEBUG("Nothing to be done for xAOD::FaserTriggerDataAuxInfo createReps");
+  return StatusCode::SUCCESS;
+}
+
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.h b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.h
new file mode 100644
index 00000000..37ec3930
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamAuxCnv.h
@@ -0,0 +1,56 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERTRIGGERBYTESTREAMAUXCNV_H
+#define FASERTRIGGERBYTESTREAMAUXCNV_H
+
+/**
+ * @file FaserTriggerByteStreamAuxCnv.h
+ *
+ * @class FaserTriggerByteStreamAuxCnv
+ *
+ * @brief This is the class definition of ByteStream converter for xAOD::FaserTriggerDataAux
+ * Trigger Data is built from RawEvent when reading. Nothing is done when writing ByteStream
+ *
+ */ 
+#include "GaudiKernel/ClassID.h"
+#include "GaudiKernel/ToolHandle.h"
+#include "GaudiKernel/Converter.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "AthenaBaseComps/AthMessaging.h"
+#include "FaserByteStreamCnvSvcBase/IFaserROBDataProviderSvc.h"
+
+class FaserTriggerDecoderTool;
+// class IFaserROBDataProviderSvc;
+class StoreGateSvc;
+
+// Abstract factory to create the converter
+template <class TYPE> class CnvFactory;
+
+class FaserTriggerByteStreamAuxCnv : public Converter, public AthMessaging
+{
+ public:
+  FaserTriggerByteStreamAuxCnv(ISvcLocator* svcloc);
+  virtual ~FaserTriggerByteStreamAuxCnv() override {}
+  
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  
+  /// converter method to create object
+  virtual StatusCode createObj(IOpaqueAddress* pAddr, DataObject*& pObj) override;
+  /// converter method to write object
+  virtual StatusCode createRep(DataObject* pObj, IOpaqueAddress*& pAddr) override;
+
+  /// Storage type and class ID
+  virtual long repSvcType() const override { return i_repSvcType(); }
+  static long storageType();
+  static const CLID& classID();
+
+ private:
+  ToolHandle<FaserTriggerDecoderTool> m_tool;
+  ServiceHandle<IFaserROBDataProviderSvc> m_robDataProvider;
+  
+};
+
+#endif
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.cxx b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.cxx
new file mode 100644
index 00000000..353c6a14
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.cxx
@@ -0,0 +1,77 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#include "FaserTriggerByteStreamCnv.h"
+
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+#include "xAODFaserTrigger/FaserTriggerData.h"
+#include "xAODFaserTrigger/FaserTriggerDataAuxInfo.h"
+#include "EventFormats/DAQFormats.hpp"
+
+#include "AthenaKernel/errorcheck.h"
+#include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/StatusCode.h"
+#include "GaudiKernel/DataObject.h"
+#include "GaudiKernel/IRegistry.h"
+
+#include "StoreGate/StoreGateSvc.h"
+#include "GaudiKernel/IToolSvc.h"
+
+FaserTriggerByteStreamCnv::FaserTriggerByteStreamCnv(ISvcLocator* svcloc)
+  : Converter(storageType(), classID(), svcloc)
+  , AthMessaging(svcloc != nullptr ? msgSvc() : nullptr, "FaserTriggerByteStreamCnv")
+{
+}
+
+FaserTriggerByteStreamCnv::~FaserTriggerByteStreamCnv() {
+}
+
+const CLID& FaserTriggerByteStreamCnv::classID() 
+{
+  // Change to our data object
+  return ClassID_traits<xAOD::FaserTriggerData>::ID();
+}
+
+StatusCode FaserTriggerByteStreamCnv::initialize() 
+{
+  ATH_MSG_DEBUG("initialize");
+
+  CHECK(Converter::initialize());
+  return StatusCode::SUCCESS;
+}
+
+StatusCode FaserTriggerByteStreamCnv::finalize() 
+{
+  ATH_MSG_DEBUG("finalize");
+
+  CHECK(Converter::finalize());
+  return StatusCode::SUCCESS;  
+}
+
+StatusCode FaserTriggerByteStreamCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj)
+{
+  FaserByteStreamAddress *pRE_Addr{nullptr};
+  pRE_Addr = dynamic_cast<FaserByteStreamAddress*>(pAddr);
+  if (!pRE_Addr) {
+    ATH_MSG_ERROR("Cannot cast to FaserByteStreamAddress ");
+    return StatusCode::FAILURE;
+  }
+               
+  ATH_MSG_DEBUG("Creating Objects");
+
+  const std::string nm = *(pRE_Addr->par());
+  const std::string nmAux = nm + "AuxInfo.";
+
+  xAOD::FaserTriggerData* pTriggerData = new xAOD::FaserTriggerData();
+  DataLink<xAOD::FaserTriggerDataAuxInfo> link(nmAux);
+  pTriggerData->setStore(link);
+  pObj = StoreGateSvc::asStorable(pTriggerData);
+
+  ATH_MSG_DEBUG("New FaserTriggerData made");
+
+  return StatusCode::SUCCESS;
+
+}
+
+
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.h b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.h
new file mode 100644
index 00000000..8f9c3d3f
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerByteStreamCnv.h
@@ -0,0 +1,41 @@
+//Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FASERTRIGCNV_FASERTRIGGERBYTESTREAMCNV_H
+#define FASERTRIGCNV_FASERTRIGGERBYTESTREAMCNV_H
+
+#include "GaudiKernel/ClassID.h"
+#include "GaudiKernel/Converter.h"
+#include "GaudiKernel/ServiceHandle.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include "AthenaBaseComps/AthMessaging.h"
+#include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
+
+// Abstract factory to create the converter
+template <class TYPE> class CnvFactory;
+
+class FaserTriggerByteStreamCnv: public Converter, public AthMessaging {
+
+public: 
+  FaserTriggerByteStreamCnv(ISvcLocator* svcloc);
+
+  virtual ~FaserTriggerByteStreamCnv();
+  
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  
+  virtual StatusCode createObj(IOpaqueAddress* pAddr, DataObject*& pObj) override;  
+  /// Storage type and class ID
+  virtual long repSvcType() const override { return i_repSvcType(); }
+  static long storageType() { return FaserByteStreamAddress::storageType(); }
+  static const CLID& classID();
+  
+};
+
+#endif  /* FASERTRIGCNV_FASERTRIGGERBYTESTREAMCNV_H */
+
+
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.cxx b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.cxx
new file mode 100644
index 00000000..f5ac5dff
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.cxx
@@ -0,0 +1,96 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#include "FaserTriggerDecoderTool.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include "xAODFaserTrigger/FaserTriggerData.h"
+#include "xAODFaserTrigger/FaserTriggerDataAuxInfo.h"
+
+#include "EventFormats/TLBDataFragment.hpp"
+
+static const InterfaceID IID_IFaserTriggerDecoderTool("FaserTriggerDecoderTool", 1, 0);
+
+const InterfaceID& FaserTriggerDecoderTool::interfaceID() {
+  return IID_IFaserTriggerDecoderTool;
+}
+
+FaserTriggerDecoderTool::FaserTriggerDecoderTool(const std::string& type, 
+      const std::string& name,const IInterface* parent)
+  : AthAlgTool(type, name, parent)
+{
+  declareInterface<FaserTriggerDecoderTool>(this);
+}
+
+FaserTriggerDecoderTool::~FaserTriggerDecoderTool()
+{
+}
+
+StatusCode
+FaserTriggerDecoderTool::initialize() 
+{
+  ATH_MSG_DEBUG("FaserTriggerDecoderTool::initialize()");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+FaserTriggerDecoderTool::finalize() 
+{
+  ATH_MSG_DEBUG("FaserTriggerDecoderTool::finalize()");
+  return StatusCode::SUCCESS;
+}
+
+StatusCode
+FaserTriggerDecoderTool::convert(const DAQFormats::EventFull* re, 
+				   xAOD::FaserTriggerData* xaod)
+{
+  ATH_MSG_DEBUG("FaserTriggerDecoderTool::convert()");
+
+  if (!re) {
+    ATH_MSG_ERROR("EventFull passed to convert() is null!");
+    return StatusCode::FAILURE;
+  }
+
+  // Find the TLB fragment
+  const TLBDataFragment* tlb = NULL;
+  const DAQFormats::EventFragment* frag = NULL;
+  for(const auto &id : re->getFragmentIDs()) {
+    frag=re->find_fragment(id);
+
+    if ((frag->source_id()&0xFFFF0000) != DAQFormats::SourceIDs::TriggerSourceID) continue;
+    ATH_MSG_DEBUG("Fragment:\n" << *frag);
+
+    tlb = new TLBDataFragment(frag->payload<const uint32_t*>(), frag->payload_size()); 
+    break;
+  }
+
+  if (!tlb) {
+    ATH_MSG_ERROR("Failed to find TLB fragment in raw event!");
+    return StatusCode::FAILURE;
+  }
+
+  ATH_MSG_DEBUG("TLB:\n" << *tlb);
+
+  // Finally, set values in xAOD object from TLB
+  try {
+    xaod->setHeader( tlb->header() );
+    xaod->setEventId( tlb->event_id() );
+    xaod->setBcid( tlb->bc_id() );
+    xaod->setOrbitId( tlb->orbit_id() );
+    xaod->setInputBits( tlb->input_bits() );
+    xaod->setInputBitsNextClk( tlb->input_bits_next_clk() );
+    xaod->setTbp( tlb->tbp() );
+    xaod->setTap( tlb->tap() );
+  } catch ( TLBDataException& e ) {
+    ATH_MSG_WARNING("FaserTriggerDecoderTool:\n"
+		    << e.what()
+		    << "\nCorrupted TLB data!\n"
+		    << *frag);
+  }
+
+  // Don't spring a leak
+  delete tlb;
+
+  return StatusCode::SUCCESS; 
+}
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.h b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.h
new file mode 100644
index 00000000..346941d4
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/FaserTriggerDecoderTool.h
@@ -0,0 +1,35 @@
+//Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef FASERTRIGCNV_FASERTRIGGERDECODERTOOL_H
+#define FASERTRIGCNV_FASERTRIGGERDECODERTOOL_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
+
+#include "EventFormats/DAQFormats.hpp"
+#include "xAODFaserTrigger/FaserTriggerData.h"
+
+// This class provides conversion between bytestream and xAOD trigger objects
+
+class FaserTriggerDecoderTool : public AthAlgTool {
+
+ public:
+  FaserTriggerDecoderTool(const std::string& type, const std::string& name, 
+			  const IInterface* parent);
+
+  virtual ~FaserTriggerDecoderTool();
+
+  static const InterfaceID& interfaceID();
+
+  virtual StatusCode initialize();
+  virtual StatusCode finalize();
+
+  StatusCode convert(const DAQFormats::EventFull* re, xAOD::FaserTriggerData* xaod);
+
+};
+
+#endif
diff --git a/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/components/FaserTriggerByteStream_entries.cxx b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/components/FaserTriggerByteStream_entries.cxx
new file mode 100644
index 00000000..28091ca9
--- /dev/null
+++ b/Trigger/FaserTrigEventCnv/FaserTriggerByteStream/src/components/FaserTriggerByteStream_entries.cxx
@@ -0,0 +1,8 @@
+#include "../FaserTriggerByteStreamCnv.h"
+#include "../FaserTriggerByteStreamAuxCnv.h"
+#include "../FaserTriggerDecoderTool.h"
+
+DECLARE_COMPONENT( FaserTriggerDecoderTool )
+
+DECLARE_CONVERTER( FaserTriggerByteStreamCnv )
+DECLARE_CONVERTER( FaserTriggerByteStreamAuxCnv )
diff --git a/faser-common b/faser-common
new file mode 160000
index 00000000..48f7e3c7
--- /dev/null
+++ b/faser-common
@@ -0,0 +1 @@
+Subproject commit 48f7e3c7458c17ea30ce50deef68744d26d1c72a
diff --git a/graphics/VTI12/VTI12Algs/CMakeLists.txt b/graphics/VTI12/VTI12Algs/CMakeLists.txt
index dcfca1d4..97eddfd5 100644
--- a/graphics/VTI12/VTI12Algs/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Algs/CMakeLists.txt
@@ -5,16 +5,6 @@
 # Declare the package name:
 atlas_subdir( VTI12Algs )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          Control/AthenaBaseComps
-                          GaudiKernel
-                          PRIVATE
-                          Event/EventInfo
-                          Tools/PathResolver
-                          graphics/VTI12/VTI12Gui
-                          graphics/VTI12/VP1UtilsBase )
-
 # "Externals" dependencies - They are needed at runtime, only
 find_package( libxkbcommon ) 
 find_package( glib ) 
@@ -28,10 +18,10 @@ atlas_add_component( VTI12Algs
                      PRIVATE_LINK_LIBRARIES VTI12Gui VP1UtilsBase )
 
 # Install files from the package:
-atlas_install_python_modules( python/*.py )
+#atlas_install_python_modules( python/*.py )
 atlas_install_joboptions( share/*.py )
 atlas_install_scripts( share/vti12 )
-atlas_install_scripts( share/clear-bash-hash-table-vp1 )
+#atlas_install_scripts( share/clear-bash-hash-table-vp1 )
 
 #----------------------------------------------------------
 # CONFIGURING THE ENVIRONMENT VARIABLES FOR THE PACKAGE   #
diff --git a/graphics/VTI12/VTI12Algs/src/VTI12Alg.cxx b/graphics/VTI12/VTI12Algs/src/VTI12Alg.cxx
index 09a6e312..0e09cded 100644
--- a/graphics/VTI12/VTI12Algs/src/VTI12Alg.cxx
+++ b/graphics/VTI12/VTI12Algs/src/VTI12Alg.cxx
@@ -8,6 +8,7 @@
 #include "VP1UtilsBase/VP1FileUtilities.h"
 
 #include "EventInfo/EventInfo.h"
+#include "xAODEventInfo/EventInfo.h"
 #include "EventInfo/TriggerInfo.h"
 #include "EventInfo/EventID.h"
 #include "PathResolver/PathResolver.h"
@@ -131,32 +132,56 @@ StatusCode VTI12Alg::execute()
   if (!m_vp1gui)
     return StatusCode::FAILURE;
 
-  if (!m_noGui&&!m_vp1gui->hasBeenInitialised()) {
+  if (!m_noGui&&!m_vp1gui->hasBeenInitialised()) 
+  {
     m_vp1gui->init();//Launch!
   }
 
-  const EventInfo*  evt;
+  const EventInfo*  evt {nullptr};
+  const xAOD::EventInfo* xevt {nullptr};
+  uint64_t eventNumber{0};
+  int runNumber{0};
+  unsigned time{0};
+  unsigned int trigType{0};
+
   StatusCode status = evtStore()->retrieve(evt);
-  if(status.isSuccess()) {
+  if(status.isSuccess()) 
+  {
     // Get run/event number:
-	const uint64_t eventNumber = evt->event_ID()->event_number();
-    int runNumber = evt->event_ID()->run_number();
-    msg(MSG::DEBUG) << " Got run number = " << runNumber
-	<< ", event number = " << eventNumber << endmsg;
+    eventNumber = evt->event_ID()->event_number();
+    runNumber = evt->event_ID()->run_number();
     // Get time stamp:
-    unsigned time = evt->event_ID()->time_stamp();//0 means no info.
-
+    time = evt->event_ID()->time_stamp();//0 means no info.
     // Get L1 trigger type
     const TriggerInfo* trig = evt->trigger_info();
-    unsigned int trigType = trig ? trig->level1TriggerType() : 0;
+    trigType = trig ? trig->level1TriggerType() : 0;
+  }
+  else
+  {
+    status = evtStore()->retrieve(xevt);
+    if (status.isSuccess())
+    {
+      eventNumber = xevt->eventNumber();
+      runNumber = xevt->runNumber();
+      time = xevt->timeStamp();
+      trigType = xevt->level1TriggerType();
+    }
+  }
+  if (status.isSuccess())
+  {
+    msg(MSG::DEBUG) << " Got run number = " << runNumber
+      << ", event number = " << eventNumber << endmsg;
 
-    if (m_noGui||m_vp1gui->executeNewEvent(runNumber,eventNumber,trigType,time)) {
+    if (m_noGui||m_vp1gui->executeNewEvent(runNumber,eventNumber,trigType,time)) 
+    {
       return StatusCode::SUCCESS;
-    } else {
+    }
+    else 
+    {
       msg(MSG::INFO) << " Ending application gracefully." << endmsg;
       return StatusCode::FAILURE;
     }
-  };
+  }
 
   msg(MSG::WARNING) << " Unable to retrieve EventInfo from StoreGate. Skipping" << endmsg;
   return StatusCode::SUCCESS;
diff --git a/graphics/VTI12/VTI12Gui/CMakeLists.txt b/graphics/VTI12/VTI12Gui/CMakeLists.txt
index 08a7234d..c467a1f3 100644
--- a/graphics/VTI12/VTI12Gui/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Gui/CMakeLists.txt
@@ -8,13 +8,6 @@
 # Declare the package name:
 atlas_subdir( VTI12Gui )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC Event/xAOD/xAODBase
-   PUBLIC graphics/VP1/VP1Base
-   PUBLIC graphics/VP1/VP1UtilsBase 
-   )
-
 # External dependencies:
 find_package( Qt5 COMPONENTS Core OpenGL Gui Network PrintSupport Widgets )
 find_package( Coin3D )
@@ -39,5 +32,5 @@ atlas_add_library( VTI12Gui VTI12Gui/*.h src/*.h src/*.cxx src/*.qrc
    
 # Install files from the package:
 ##atlas_install_scripts( share/* ) # installs into bin/
-atlas_install_runtime( share/* ) # install into share/ //TODO: check if we still need this!
+##atlas_install_runtime( share/* ) # install into share/ //TODO: check if we still need this!
    
diff --git a/graphics/VTI12/VTI12Plugins/VTI12FaserPlugin/CMakeLists.txt b/graphics/VTI12/VTI12Plugins/VTI12FaserPlugin/CMakeLists.txt
index 6aa38cf1..0b3f7d70 100644
--- a/graphics/VTI12/VTI12Plugins/VTI12FaserPlugin/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Plugins/VTI12FaserPlugin/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( VTI12FaserPlugin )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   graphics/VP1/VP1Base
-   PRIVATE
-   graphics/VTI12/VTI12Systems/VTI12TrackSystems
-   graphics/VTI12/VTI12Systems/VTI12SimHitSystems
-   graphics/VTI12/VTI12Systems/VTI12RawDataSystems
-   graphics/VTI12/VTI12Systems/VTI12GeometrySystems
-   graphics/VTI12/VTI12Systems/VTI12GuideLineSystems )
-
 # External dependencies:
 find_package( Qt5 COMPONENTS Core Gui Widgets )
 
diff --git a/graphics/VTI12/VTI12Plugins/VTI12GeometryPlugin/CMakeLists.txt b/graphics/VTI12/VTI12Plugins/VTI12GeometryPlugin/CMakeLists.txt
index b6ed459a..1d7c003f 100644
--- a/graphics/VTI12/VTI12Plugins/VTI12GeometryPlugin/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Plugins/VTI12GeometryPlugin/CMakeLists.txt
@@ -5,14 +5,6 @@
 # Declare the package name:
 atlas_subdir( VTI12GeometryPlugin )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   graphics/VP1/VP1Base
-   PRIVATE
-   graphics/VTI12/VTI12Systems/VTI12GeometrySystems
-   graphics/VTI12/VTI12Systems/VTI12GuideLineSystems )
-
 # External dependencies:
 find_package( Qt5 COMPONENTS Core Gui Widgets )
 
@@ -23,5 +15,5 @@ set( CMAKE_AUTOMOC TRUE )
 atlas_add_library( VTI12GeometryPlugin
    VTI12GeometryPlugin/*.h src/*.cxx src/*.qrc 
    PUBLIC_HEADERS VTI12GeometryPlugin
-   LINK_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets
-   PRIVATE_LINK_LIBRARIES VP1Base VTI12GuideLineSystems VTI12GeometrySystems )
+   LINK_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets 
+   PRIVATE_LINK_LIBRARIES VP1Base VTI12GeometrySystems VTI12GuideLineSystems )
diff --git a/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/CMakeLists.txt b/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/CMakeLists.txt
index cc9c9d37..db96f84e 100644
--- a/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Systems/VTI12GeometrySystems/CMakeLists.txt
@@ -6,22 +6,6 @@
 # Declare the package name:
 atlas_subdir( VTI12GeometrySystems )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   DetectorDescription/GeoPrimitives
-   Generators/TruthUtils
-   Event/xAOD/xAODTruth
-   graphics/VP1/VP1Base
-   PRIVATE
-   DetectorDescription/GeoModel/GeoModelUtilities
-   DetectorDescription/GeoModel/GeoModelFaserUtilities
-   DetectorDescription/GeoModel/GeoModelExamples
-   DetectorDescription/GeoModel/GeoModelStandalone/GeoModelDBManager
-   DetectorDescription/GeoModel/GeoModelStandalone/GeoRead
-   graphics/VP1/VP1HEPVis
-   graphics/VTI12/VTI12Utils )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Coin3D )
@@ -49,9 +33,9 @@ set( CMAKE_AUTORCC ON )
 atlas_add_library( VTI12GeometrySystems
    VTI12GeometrySystems/*.h src/*.cxx
    PUBLIC_HEADERS VTI12GeometrySystems
-   INCLUDE_DIRS ${COIN3D_INCLUDE_DIRS} 
+   INCLUDE_DIRS ${COIN3D_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS}
    PRIVATE_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}  
    PRIVATE_DEFINITIONS ${CLHEP_DEFINITIONS}
-   LINK_LIBRARIES ${COIN3D_LIBRARIES} ${GEOMODEL_LIBRARIES} TruthUtils xAODTruth VP1Base GL Qt5::Core Qt5::Widgets
+   LINK_LIBRARIES ${COIN3D_LIBRARIES} ${GEOMODELCORE_LIBRARIES} TruthUtils xAODTruth VP1Base GL Qt5::Core Qt5::Widgets
    PRIVATE_LINK_LIBRARIES ${CLHEP_LIBRARIES} GeoModelUtilities GeoModelFaserUtilities VP1HEPVis VTI12Utils Qt5::Gui )
 
diff --git a/graphics/VTI12/VTI12Systems/VTI12GuideLineSystems/CMakeLists.txt b/graphics/VTI12/VTI12Systems/VTI12GuideLineSystems/CMakeLists.txt
index de63ebf7..b27bb177 100644
--- a/graphics/VTI12/VTI12Systems/VTI12GuideLineSystems/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Systems/VTI12GuideLineSystems/CMakeLists.txt
@@ -6,16 +6,6 @@
 # Declare the package name:
 atlas_subdir( VTI12GuideLineSystems )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   DetectorDescription/GeoPrimitives
-   graphics/VP1/VP1Base
-   graphics/VTI12/VTI12Utils
-   PRIVATE
-   GaudiKernel
-   graphics/VP1/VP1HEPVis )
-
 # External dependencies:
 find_package( Coin3D )
 find_package( Qt5 COMPONENTS Core Gui Widgets )
@@ -27,7 +17,7 @@ set( CMAKE_AUTOMOC TRUE )
 
 # Component(s) in the package:
 atlas_add_library( VTI12GuideLineSystems VTI12GuideLineSystems/*.h src/*.cxx
-   NO_PUBLIC_HEADERS
+   PUBLIC_HEADERS VTI12GuideLineSystems
    INCLUDE_DIRS ${COIN3D_INCLUDE_DIRS}
    LINK_LIBRARIES ${COIN3D_LIBRARIES} GeoPrimitives VP1Base VTI12Utils
    Qt5::Core Qt5::Gui
diff --git a/graphics/VTI12/VTI12Systems/VTI12RawDataSystems/CMakeLists.txt b/graphics/VTI12/VTI12Systems/VTI12RawDataSystems/CMakeLists.txt
index 946dd9d4..6003a0b4 100644
--- a/graphics/VTI12/VTI12Systems/VTI12RawDataSystems/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Systems/VTI12RawDataSystems/CMakeLists.txt
@@ -5,19 +5,6 @@
 # Declare the package name:
 atlas_subdir( VTI12RawDataSystems )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          DetectorDescription/GeoPrimitives
-                          graphics/VP1/VP1Base
-                          PRIVATE
-                          Event/EventPrimitives
-                          GaudiKernel
-                          Tracker/TrackerDetDescr/TrackerIdentifier
-                          Tracker/TrackerDetDescr/TrackerReadoutGeometry
-                          Tracker/TrackerRawEvent/TrackerRawData
-                          graphics/VP1/VP1HEPVis
-                          graphics/VTI12/VTI12Utils )
-
 # External dependencies:
 find_package( Coin3D )
 find_package( Eigen )
@@ -37,9 +24,8 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
 # Component(s) in the package:
 atlas_add_library( VTI12RawDataSystems VTI12RawDataSystems/*.h src/*.h src/*.cxx src/*.qrc  
                    PUBLIC_HEADERS VTI12RawDataSystems
-                   INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS}
+                   INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS} ${GEOMODELCORE_INCLUDE_DIRS}
                    PRIVATE_INCLUDE_DIRS ${COIN3D_INCLUDE_DIRS}
-#                   FILES LUCID_RawEvent/LUCID_Digit.h
                    LINK_LIBRARIES ${EIGEN_LIBRARIES} GeoPrimitives VP1Base GL
                    PRIVATE_LINK_LIBRARIES ${COIN3D_LIBRARIES} ${GEOMODELCORE_LIBRARIES} EventPrimitives GaudiKernel TrackerIdentifier TrackerReadoutGeometry TrackerRawData VP1HEPVis VTI12Utils )
 
diff --git a/graphics/VTI12/VTI12Systems/VTI12SimHitSystems/CMakeLists.txt b/graphics/VTI12/VTI12Systems/VTI12SimHitSystems/CMakeLists.txt
index d4a5ab0c..36394224 100644
--- a/graphics/VTI12/VTI12Systems/VTI12SimHitSystems/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Systems/VTI12SimHitSystems/CMakeLists.txt
@@ -5,17 +5,6 @@
 # Declare the package name:
 atlas_subdir( VTI12SimHitSystems )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs( PUBLIC
-                          graphics/VP1/VP1Base
-                          PRIVATE
-                          Control/StoreGate
-                          DetectorDescription/GeoModel/GeoAdaptors
-                          DetectorDescription/GeoPrimitives
-                          Scintillator/ScintSimEvent
-                          Tracker/TrackerSimEvent
-                          graphics/VTI12/VTI12Utils )
-
 # External dependencies:
 find_package( Coin3D )
 find_package( Eigen )
diff --git a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt
index 3c58b6fe..76da9092 100644
--- a/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Systems/VTI12TrackSystems/CMakeLists.txt
@@ -6,55 +6,6 @@
 # Declare the package name:
 atlas_subdir( VTI12TrackSystems )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   DetectorDescription/GeoPrimitives
-   DetectorDescription/Identifier
-#   Event/xAOD/xAODTracking
-   GaudiKernel
-   Generators/AtlasHepMC
-   Generators/GeneratorObjects
-   Simulation/G4Sim/TrackRecord
-   Tracking/TrkDetDescr/TrkDetDescrInterfaces
-   Tracking/TrkDetDescr/TrkSurfaces
-   Tracking/TrkEvent/TrkEventPrimitives
-   Tracking/TrkEvent/TrkParameters
-   graphics/VP1/VP1Base
-   graphics/VTI12/VTI12Utils
-   PRIVATE
-   Control/AthContainers
-   Control/StoreGate
-   DetectorDescription/FaserDetDescr
-   Event/EventPrimitives
-   Tracker/TrackerDetDescr/TrackerIdentifier
-   Tracker/TrackerDetDescr/TrackerReadoutGeometry
-#   InnerDetector/InDetRecEvent/InDetPrepRawData
-#   InnerDetector/InDetRecEvent/InDetRIO_OnTrack
-   Tracker/TrackerSimEvent
-   Scintillator/ScintDetDescr/ScintIdentifier
-   Scintillator/ScintDetDescr/ScintReadoutGeometry
-   Scintillator/ScintSimEvent
-   Reconstruction/Particle
-   Tracking/TrkDetDescr/TrkDetDescrUtils
-   Tracking/TrkDetDescr/TrkDetElementBase
-   Tracking/TrkDetDescr/TrkVolumes
-   Tracking/TrkEvent/TrkCompetingRIOsOnTrack
-   Tracking/TrkEvent/TrkMaterialOnTrack
-   Tracking/TrkEvent/TrkMeasurementBase
-   Tracking/TrkEvent/TrkPrepRawData
-   Tracking/TrkEvent/TrkPseudoMeasurementOnTrack
-   Tracking/TrkEvent/TrkRIO_OnTrack
-   Tracking/TrkEvent/TrkSegment
-   Tracking/TrkEvent/TrkTrack
-   Tracking/TrkEvent/TrkTrackSummary
-   Tracking/TrkExtrapolation/TrkExInterfaces
-   Tracking/TrkFitter/TrkFitterInterfaces
-   graphics/VP1/VP1HEPVis
-   graphics/VTI12/VTI12Systems/VTI12GuideLineSystems
-#   graphics/VP1/VP1Systems/VP1PRDSystems 
-   )
-
 # External dependencies:
 find_package( CLHEP )
 find_package( Coin3D )
@@ -72,11 +23,11 @@ atlas_add_library( VTI12TrackSystems VTI12TrackSystems/*.h src/*.cxx
    PUBLIC_HEADERS VTI12TrackSystems
    PRIVATE_INCLUDE_DIRS ${COIN3D_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
    ${CMAKE_CURRENT_BINARY_DIR}
-   LINK_LIBRARIES ${GEOMODEL_LIBRARIES} GeoPrimitives Identifier 
+   LINK_LIBRARIES ${GEOMODELCORE_LIBRARIES} GeoPrimitives Identifier 
    #xAODTracking
    GaudiKernel GeneratorObjects TrkDetDescrInterfaces TrkSurfaces
    TrkEventPrimitives TrkParameters VP1Base VTI12Utils StoreGateLib SGtests
-   Qt5::Core Qt5::Gui
+   Qt5::Core Qt5::Gui TrackRecordLib
    PRIVATE_LINK_LIBRARIES ${COIN3D_LIBRARIES} ${CLHEP_LIBRARIES}
    AtlasHepMCLib AthContainers FaserDetDescr EventPrimitives
    ScintIdentifier ScintSimEvent ScintReadoutGeometry
diff --git a/graphics/VTI12/VTI12Utils/CMakeLists.txt b/graphics/VTI12/VTI12Utils/CMakeLists.txt
index bf13d444..0587a8ca 100644
--- a/graphics/VTI12/VTI12Utils/CMakeLists.txt
+++ b/graphics/VTI12/VTI12Utils/CMakeLists.txt
@@ -8,31 +8,6 @@
 # Declare the package name:
 atlas_subdir( VTI12Utils )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Control/AthenaKernel
-   Control/StoreGate
-   DetectorDescription/GeoPrimitives
-   Event/EventPrimitives
-   GaudiKernel
-   graphics/VP1/VP1Base
-   PRIVATE
-   Control/CxxUtils
-   DetectorDescription/FaserDetDescr
-   DetectorDescription/GeoModel/GeoModelUtilities
-   DetectorDescription/GeoModel/GeoModelFaserUtilities
-   DetectorDescription/GeoModel/GeoSpecialShapes
-   DetectorDescription/Identifier
-   Scintillator/ScintDetDescr/ScintIdentifier
-   Scintillator/ScintDetDescr/ScintReadoutGeometry
-   Tracker/TrackerDetDescr/TrackerIdentifier
-   Tracker/TrackerDetDescr/TrackerReadoutGeometry
-#   InnerDetector/InDetRecEvent/InDetRIO_OnTrack
-   Tracking/TrkDetDescr/TrkSurfaces
-   Tracking/TrkEvent/TrkRIO_OnTrack
-   graphics/VP1/VP1HEPVis )
-
 # External dependencies:
 find_package( CLHEP ) # TODO: to be removed when fully migrated to Eigen-based GeoTrf
 find_package( Coin3D )
@@ -51,7 +26,7 @@ atlas_add_library( VTI12Utils VTI12Utils/*.h src/*.cxx src/*.cpp
    PRIVATE_INCLUDE_DIRS ${HEPPDT_INCLUDE_DIRS} ${COIN3D_INCLUDE_DIRS}
    ${EIGEN_INCLUDE_DIRS}
    DEFINITIONS ${CLHEP_DEFINITIONS}
-   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${GEOMODEL_LIBRARIES} EventPrimitives
+   LINK_LIBRARIES ${CLHEP_LIBRARIES} ${GEOMODELCORE_LIBRARIES} EventPrimitives
    GaudiKernel VP1Base StoreGateLib SGtests AthDSoCallBacks 
    GeoPrimitives Qt5::Core
    PRIVATE_LINK_LIBRARIES ${HEPPDT_LIBRARIES} ${COIN3D_LIBRARIES}
diff --git a/xAOD/xAODFaserBase/CMakeLists.txt b/xAOD/xAODFaserBase/CMakeLists.txt
index 809d9b9c..5b353fd0 100644
--- a/xAOD/xAODFaserBase/CMakeLists.txt
+++ b/xAOD/xAODFaserBase/CMakeLists.txt
@@ -12,14 +12,6 @@ if( NOT XAOD_STANDALONE )
    set( extra_libs SGTools )
 endif()
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Control/AthContainers
-   ${extra_deps}
-   PRIVATE
-   Control/AthLinks )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core Physics )
 
diff --git a/xAOD/xAODFaserTracking/CMakeLists.txt b/xAOD/xAODFaserTracking/CMakeLists.txt
index 5def07ca..24f2e464 100755
--- a/xAOD/xAODFaserTracking/CMakeLists.txt
+++ b/xAOD/xAODFaserTracking/CMakeLists.txt
@@ -1,17 +1,6 @@
 # Declare the package name:
 atlas_subdir( xAODFaserTracking )
 
-
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Control/AthContainers
-   Control/AthLinks
-   Event/xAOD/xAODBase
-   Event/xAOD/xAODFaserBase
-   Event/xAOD/xAODCore
-   ${extra_deps} )
-
 # External dependencies:
 find_package( Eigen )
 find_package( ROOT COMPONENTS Core GenVector )
diff --git a/xAOD/xAODFaserTrackingAthenaPool/CMakeLists.txt b/xAOD/xAODFaserTrackingAthenaPool/CMakeLists.txt
index 8add0695..6762075a 100644
--- a/xAOD/xAODFaserTrackingAthenaPool/CMakeLists.txt
+++ b/xAOD/xAODFaserTrackingAthenaPool/CMakeLists.txt
@@ -5,15 +5,6 @@
 # Declare the package name:
 atlas_subdir( xAODFaserTrackingAthenaPool )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PRIVATE
-   Control/AthContainers
-   Control/AthenaKernel
-   Database/AthenaPOOL/AthenaPoolCnvSvc
-   Database/AthenaPOOL/AthenaPoolUtilities
-   xAOD/xAODFaserTracking )
-
 # External dependencies:
 find_package( ROOT COMPONENTS Core )
 
diff --git a/xAOD/xAODFaserTrackingAthenaPool/src/xAODStripClusterAuxContainerCnv.cxx b/xAOD/xAODFaserTrackingAthenaPool/src/xAODStripClusterAuxContainerCnv.cxx
index d79d6280..e86f1aff 100644
--- a/xAOD/xAODFaserTrackingAthenaPool/src/xAODStripClusterAuxContainerCnv.cxx
+++ b/xAOD/xAODFaserTrackingAthenaPool/src/xAODStripClusterAuxContainerCnv.cxx
@@ -20,7 +20,7 @@ createPersistentWithKey( xAOD::StripClusterAuxContainer* trans, const std::strin
    if (static_cast<const SG::IAuxStore&>(*trans).size() > 0)
    {
       auto pers = new xAOD::StripClusterAuxContainer();
-      SG::copyAuxStoreThinned(*trans, *pers, static_cast<SG::ThinningDecisionBase*>(nullptr));
+      SG::copyAuxStoreThinned(*trans, *pers, static_cast<const SG::ThinningInfo*>(nullptr));
       return pers;
    }
    return new xAOD::StripClusterAuxContainer(*trans);
diff --git a/xAOD/xAODFaserTrigger/CMakeLists.txt b/xAOD/xAODFaserTrigger/CMakeLists.txt
new file mode 100644
index 00000000..bce466e8
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/CMakeLists.txt
@@ -0,0 +1,28 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+# CMAKE file based on Event/xAOD/xAODTrigger/CMakeLists.txt
+
+# Declare the package name.
+atlas_subdir( xAODFaserTrigger )
+
+# External dependencies.
+find_package( xAODUtilities )
+
+# Component(s) in the package.
+atlas_add_library( xAODFaserTrigger
+   xAODFaserTrigger/*.h xAODFaserTrigger/versions/*.h Root/*.cxx
+   PUBLIC_HEADERS xAODFaserTrigger
+   LINK_LIBRARIES xAODCore )
+
+atlas_add_xaod_smart_pointer_dicts(
+   INPUT xAODFaserTrigger/selection.xml
+   OUTPUT _selectionFile
+   OBJECTS "xAOD::FaserTriggerData_v1")
+
+atlas_add_dictionary( xAODFaserTriggerDict
+   xAODFaserTrigger/xAODFaserTriggerDict.h
+   ${_selectionFile}
+   LINK_LIBRARIES xAODCore xAODFaserTrigger
+   EXTRA_FILES Root/dict/*.cxx )
+
+# Understand what this does...
+# atlas_generate_cliddb( xAODFaserTrigger )
diff --git a/xAOD/xAODFaserTrigger/Root/FaserTriggerDataAuxInfo_v1.cxx b/xAOD/xAODFaserTrigger/Root/FaserTriggerDataAuxInfo_v1.cxx
new file mode 100644
index 00000000..9d3bb911
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/Root/FaserTriggerDataAuxInfo_v1.cxx
@@ -0,0 +1,26 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+// $Id: $
+
+// Local include(s):
+#include "xAODFaserTrigger/versions/FaserTriggerDataAuxInfo_v1.h"
+
+namespace xAOD {
+
+  FaserTriggerDataAuxInfo_v1::FaserTriggerDataAuxInfo_v1()
+    : AuxInfoBase(),
+      header(0), eventId(0), orbitId(0), bcid(0), 
+      inputBitsNextClk(0), inputBits(0), tbp(0), tap(0) {
+    AUX_VARIABLE( header );
+    AUX_VARIABLE( eventId );
+    AUX_VARIABLE( orbitId );
+    AUX_VARIABLE( bcid );
+    AUX_VARIABLE( inputBitsNextClk );
+    AUX_VARIABLE( inputBits );
+    AUX_VARIABLE( tbp );
+    AUX_VARIABLE( tap );
+  }
+
+} // namespace xAOD
diff --git a/xAOD/xAODFaserTrigger/Root/FaserTriggerData_v1.cxx b/xAOD/xAODFaserTrigger/Root/FaserTriggerData_v1.cxx
new file mode 100644
index 00000000..ac68351c
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/Root/FaserTriggerData_v1.cxx
@@ -0,0 +1,63 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+// $Id: $
+
+// xAOD include(s):
+#include "xAODCore/AuxStoreAccessorMacros.h"
+
+// Local include(s):
+#include "xAODFaserTrigger/versions/FaserTriggerData_v1.h"
+
+namespace xAOD {
+
+  FaserTriggerData_v1::FaserTriggerData_v1() 
+    : SG::AuxElement() {
+  }
+
+  /////////////////////////////////////////////////////////////////////////////
+  //
+  //              Implementation for the start time functions
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint32_t, 
+					header, setHeader )
+
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint32_t, 
+					eventId, setEventId )
+
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint32_t, 
+					orbitId, setOrbitId )
+
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint32_t, 
+					bcid, setBcid )
+
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint8_t, 
+					inputBitsNextClk, setInputBitsNextClk )
+
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint8_t, 
+					inputBits, setInputBits )
+
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint8_t, 
+					tbp, setTbp )
+
+  AUXSTORE_PRIMITIVE_SETTER_AND_GETTER( FaserTriggerData_v1, uint8_t, 
+					tap, setTap )
+
+} // namespace xAOD
+
+namespace xAOD {
+
+  std::ostream& operator<<(std::ostream& s, const xAOD::FaserTriggerData_v1& td) {
+    s << "xAODFaserTriggerData: eventID=" << td.eventId() 
+      << " orbitID=" << td.orbitId() 
+      << " BCID=" << td.bcid() 
+      << " Input Bits (next clk)=" << std::bitset<8>(td.inputBits()) << " (" 
+      << std::bitset<8>(td.inputBitsNextClk()) << ")"
+      << " TBP/TAP=" << std::bitset<6>(td.tbp()) << " / " 
+      << std::bitset<6>(td.tap())  
+      << std::endl;
+
+    return s;
+  }
+
+} // namespace xAOD
diff --git a/xAOD/xAODFaserTrigger/Root/xAODFaserTriggerCLIDs.cxx b/xAOD/xAODFaserTrigger/Root/xAODFaserTriggerCLIDs.cxx
new file mode 100644
index 00000000..62efdd99
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/Root/xAODFaserTriggerCLIDs.cxx
@@ -0,0 +1,8 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+//simple includes to force the CLASS_DEF etc to be encountered during compile
+
+#include "xAODFaserTrigger/FaserTriggerData.h"
+#include "xAODFaserTrigger/FaserTriggerDataAuxInfo.h"
diff --git a/xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerData.h b/xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerData.h
new file mode 100644
index 00000000..07b762fe
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerData.h
@@ -0,0 +1,22 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef XAODFASERTRIGGER_FASERTRIGGERDATA_H
+#define XAODFASERTRIGGER_FASERTRIGGERDATA_H
+
+// Local include(s):
+#include "xAODFaserTrigger/versions/FaserTriggerData_v1.h"
+
+namespace xAOD {
+  /// Declare the latest version of the class
+  typedef FaserTriggerData_v1 FaserTriggerData;
+}
+
+// Set up a CLID for the container:
+#include "xAODCore/CLASS_DEF.h"
+CLASS_DEF( xAOD::FaserTriggerData, 266142943, 1 )
+
+#endif // XAODFASERTRIGGER_FASERTRIGGERDATA_H
diff --git a/xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerDataAuxInfo.h b/xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerDataAuxInfo.h
new file mode 100644
index 00000000..d557cf60
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/xAODFaserTrigger/FaserTriggerDataAuxInfo.h
@@ -0,0 +1,22 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef XAODFASERTRIGGER_FASERTRIGGERDATAAUXINFO_H
+#define XAODFASERTRIGGER_FASERTRIGGERDATAAUXINFO_H
+
+// Local include(s):
+#include "xAODFaserTrigger/versions/FaserTriggerDataAuxInfo_v1.h"
+
+namespace xAOD {
+  /// Declare the latest version of the class
+  typedef FaserTriggerDataAuxInfo_v1 FaserTriggerDataAuxInfo;
+}
+
+// Set up a CLID for the container:
+#include "xAODCore/CLASS_DEF.h"
+CLASS_DEF( xAOD::FaserTriggerDataAuxInfo, 82583928, 1 )
+
+#endif // XAODFASERTRIGGER_FASERTRIGGERDATAAUXINFO_H
diff --git a/xAOD/xAODFaserTrigger/xAODFaserTrigger/selection.xml b/xAOD/xAODFaserTrigger/xAODFaserTrigger/selection.xml
new file mode 100644
index 00000000..f5b7e214
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/xAODFaserTrigger/selection.xml
@@ -0,0 +1,13 @@
+<!-- Copyright (C) 2020 CERN for the benefit of the FASER collaboration -->
+<!-- Missing id values here, need to figure out where these come from... -->
+<lcgdict>
+
+  <class name="xAOD::FaserTriggerData_v1" 
+	 id="965196C8-AC56-421C-9AC7-D7DB62E2AFFC"/>
+  <typedef name="xAOD::FaserTriggerData" />
+
+  <class name="xAOD::FaserTriggerDataAuxInfo_v1" 
+	 id="5F26C42B-3BF1-44CA-A127-172ED5797936"/>
+  <typedef name="xAOD::FaserTriggerDataAuxInfo" />
+
+</lcgdict>
diff --git a/xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerDataAuxInfo_v1.h b/xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerDataAuxInfo_v1.h
new file mode 100644
index 00000000..1ee88054
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerDataAuxInfo_v1.h
@@ -0,0 +1,58 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef XAODFASERTRIGGER_VERSIONS_FASERTRIGGERDATAAUXINFO_V1_H
+#define XAODFASERTRIGGER_VERSIONS_FASERTRIGGERDATAAUXINFO_V1_H
+
+// System include(s):
+extern "C" {
+#   include "stdint.h"
+}
+
+// xAOD include(s):
+#include "xAODCore/AuxInfoBase.h"
+
+namespace xAOD {
+
+  /// Class holding the data handled by FaserTriggerData_v1
+  ///
+  /// This class holds the payload of the TLB raw data
+  ///
+  /// @author Eric Torrence <torrence@uoregon.edu>
+  ///
+  /// $Revision:  $
+  /// $Date: $
+
+  class FaserTriggerDataAuxInfo_v1 : public AuxInfoBase {
+
+  public:
+    /// Default constructor
+    FaserTriggerDataAuxInfo_v1();
+
+  private:
+    /// @name TriggerLogicBoard payload
+    /// @{
+    uint32_t header;
+    uint32_t eventId;
+    uint32_t orbitId;
+    uint32_t bcid;
+    uint8_t inputBitsNextClk;
+    uint8_t inputBits;
+    uint8_t tbp;
+    uint8_t tap;
+    /// @}
+
+  }; // class FaserTriggerDataAuxContainer_v1
+
+} // namespace xAOD
+
+// Set up the StoreGate inheritance of the class:
+#include "xAODCore/BaseInfo.h"
+SG_BASE( xAOD::FaserTriggerDataAuxInfo_v1, xAOD::AuxInfoBase );
+
+#endif // XAODFASERTRIGGER_VERSIONS_FASERTRIGGERDATAAUXINFO_V1_H
+
+
diff --git a/xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerData_v1.h b/xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerData_v1.h
new file mode 100644
index 00000000..6ec754b8
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/xAODFaserTrigger/versions/FaserTriggerData_v1.h
@@ -0,0 +1,81 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef XAODFASERTRIGGER_VERSIONS_FASERTRIGGERDATA_V1_H
+#define XAODFASERTRIGGER_VERSIONS_FASERTRIGGERDATA_V1_H
+
+// System include(s):
+extern "C" {
+#   include "stdint.h"
+}
+
+// Core EDM include(s):
+#include "AthContainers/AuxElement.h"
+
+namespace xAOD {
+
+  /// Class describing the Faser Trigger Logic Board (TLB) raw data
+  ///
+  ///
+  class FaserTriggerData_v1 : public SG::AuxElement {
+
+  public:
+    /// Default constructor
+    FaserTriggerData_v1();
+
+    /// @name Access TLB elements
+    /// @{
+
+    /// The first raw word
+    uint32_t header() const;
+    void setHeader(uint32_t value);
+ 
+    /// Event ID
+    uint32_t eventId() const;
+    void setEventId(uint32_t value);
+
+    /// Orbit ID
+    uint32_t orbitId() const;
+    void setOrbitId(uint32_t value);
+
+    /// Bunch Crossing
+    uint32_t bcid() const;
+    void setBcid(uint32_t value);
+
+    /// Input bits
+    uint8_t inputBitsNextClk() const;
+    void setInputBitsNextClk(uint8_t value);
+
+    uint8_t inputBits() const;
+    void setInputBits(uint8_t value);
+
+    /// Trigger counts (before prescale, after prescale)
+    uint8_t tbp() const;
+    void setTbp(uint8_t value);
+
+    uint8_t tap() const;
+    void setTap(uint8_t value);
+
+    /// @}
+
+    /// @name Set function
+    /// @{
+
+    void setTriggerData( const uint32_t* data, size_t size );
+
+    /// @}
+
+  }; // class FaserTriggerData_v1
+
+  std::ostream& operator<<(std::ostream& s, const xAOD::FaserTriggerData_v1& td);
+
+} // namespace xAOD
+
+// Declare the inheritance of the type:
+#include "xAODCore/BaseInfo.h"
+SG_BASE( xAOD::FaserTriggerData_v1, SG::AuxElement );
+
+#endif // XAODFASERTRIGGER_VERSIONS_FASERTRIGGERDATA_V1_H
diff --git a/xAOD/xAODFaserTrigger/xAODFaserTrigger/xAODFaserTriggerDict.h b/xAOD/xAODFaserTrigger/xAODFaserTrigger/xAODFaserTriggerDict.h
new file mode 100644
index 00000000..494fcbc5
--- /dev/null
+++ b/xAOD/xAODFaserTrigger/xAODFaserTrigger/xAODFaserTriggerDict.h
@@ -0,0 +1,28 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef XAODFASERTRIGGER_XAODFASERTRIGGERDICT_H
+#define XAODFASERTRIGGER_XAODFASERTRIGGERDICT_H
+
+// Local include(s):
+#include "xAODFaserTrigger/FaserTriggerData.h"
+#include "xAODFaserTrigger/FaserTriggerDataAuxInfo.h"
+#include "xAODFaserTrigger/versions/FaserTriggerData_v1.h"
+#include "xAODFaserTrigger/versions/FaserTriggerDataAuxInfo_v1.h"
+
+// EDM include(s).
+#include "xAODCore/tools/DictHelpers.h"
+
+namespace {
+  struct GCCXML_DUMMY_INSTANTIATION_XAODFASERTRIGGER {
+    // Local type(s).
+    //XAOD_INSTANTIATE_NS_CONTAINER_TYPES( xAOD, FaserTriggerDataContainer_v1 );
+    XAOD_INSTANTIATE_NS_OBJECT_TYPES( xAOD, FaserTriggerData_v1 );
+
+  };
+}
+
+
+#endif // XAODFASERTRIGGER_XAODFASERTRIGGERDICT_H
+
diff --git a/xAOD/xAODFaserTriggerAthenaPool/CMakeLists.txt b/xAOD/xAODFaserTriggerAthenaPool/CMakeLists.txt
new file mode 100644
index 00000000..1d738c2a
--- /dev/null
+++ b/xAOD/xAODFaserTriggerAthenaPool/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+
+# Declare the package name.
+atlas_subdir( xAODFaserTriggerAthenaPool )
+
+# Component(s) in the package:
+atlas_add_poolcnv_library( xAODFaserTriggerAthenaPoolPoolCnv
+   src/*.h src/*.cxx
+   FILES xAODFaserTrigger/FaserTriggerData.h xAODFaserTrigger/FaserTriggerDataAuxInfo.h
+   TYPES_WITH_NAMESPACE xAOD::FaserTriggerData xAOD::FaserTriggerDataAuxInfo
+   CNV_PFX xAOD
+   LINK_LIBRARIES AthenaPoolCnvSvcLib AthenaPoolUtilities xAODFaserTrigger )
+
+
diff --git a/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.cxx b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.cxx
new file mode 100644
index 00000000..2ae94670
--- /dev/null
+++ b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.cxx
@@ -0,0 +1,5 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+// Dummy source file so that cmake will know this is a custom converter.
diff --git a/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.h b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.h
new file mode 100644
index 00000000..71d0cb01
--- /dev/null
+++ b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataAuxInfoCnv.h
@@ -0,0 +1,16 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef XAODFASERTRIGGERDATAATHENAPOOL_XAODFASERTRIGGERDATAAUXINFOCNV_H
+#define XAODFASERTRIGGERDATAATHENAPOOL_XAODFASERTRIGGERDATAAUXINFOCNV_H
+
+#include "xAODFaserTrigger/FaserTriggerDataAuxInfo.h"
+#include "AthenaPoolCnvSvc/T_AthenaPoolAuxContainerCnv.h"
+
+typedef T_AthenaPoolAuxContainerCnv<xAOD::FaserTriggerDataAuxInfo> xAODFaserTriggerDataAuxInfoCnv;
+
+
+#endif // XAODFASERTRIGGERDATAATHENAPOOL_XAODFASERTRIGGERDATAAUXINFOCNV_H
diff --git a/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.cxx b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.cxx
new file mode 100644
index 00000000..2ae94670
--- /dev/null
+++ b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.cxx
@@ -0,0 +1,5 @@
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+// Dummy source file so that cmake will know this is a custom converter.
diff --git a/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.h b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.h
new file mode 100644
index 00000000..73746f55
--- /dev/null
+++ b/xAOD/xAODFaserTriggerAthenaPool/src/xAODFaserTriggerDataCnv.h
@@ -0,0 +1,17 @@
+// Dear emacs, this is -*- c++ -*-
+
+/*
+  Copyright (C) 2020 CERN for the benefit of the FASER collaboration
+*/
+
+#ifndef XAODFASERTRIGGERDATAATHENAPOOL_XAODFASERTRIGGERDATACNV_H
+#define XAODFASERTRIGGERDATAATHENAPOOL_XAODFASERTRIGGERDATACNV_H
+
+#include "xAODFaserTrigger/FaserTriggerData.h"
+#include "AthenaPoolCnvSvc/T_AthenaPoolxAODCnv.h"
+
+
+typedef T_AthenaPoolxAODCnv<xAOD::FaserTriggerData> xAODFaserTriggerDataCnv;
+
+
+#endif // XAODFASERTRIGGERDATAATHENAPOOL_XAODFASERTRIGGERDATACNV_H
diff --git a/xAOD/xAODFaserTruth/CMakeLists.txt b/xAOD/xAODFaserTruth/CMakeLists.txt
index c13ee743..f35e88cb 100644
--- a/xAOD/xAODFaserTruth/CMakeLists.txt
+++ b/xAOD/xAODFaserTruth/CMakeLists.txt
@@ -6,17 +6,6 @@
 # Declare the package name:
 atlas_subdir( xAODFaserTruth )
 
-# Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Control/AthContainers
-   Control/AthLinks
-   Event/xAOD/xAODBase
-   Event/xAOD/xAODFaserBase
-   Event/xAOD/xAODCore
-   PRIVATE
-   Generators/TruthUtils )
-
 # Component(s) in the package:
 atlas_add_library( xAODFaserTruth
    xAODFaserTruth/*.h xAODFaserTruth/versions/*.h Root/*.h Root/*.cxx
-- 
GitLab