diff --git a/InnerDetector/InDetConfig/python/ITkConfigFlags.py b/InnerDetector/InDetConfig/python/ITkConfigFlags.py
index 7e1f994c4d764fddd75b7b81c80ff8ea73cc7cb5..debc79a2ea41dd22662b7b892c57af73866b1dc3 100644
--- a/InnerDetector/InDetConfig/python/ITkConfigFlags.py
+++ b/InnerDetector/InDetConfig/python/ITkConfigFlags.py
@@ -60,8 +60,10 @@ def createITkConfigFlags():
                   not(prevFlags.Beam.Type is BeamType.Cosmics))
 
     # Save cluster information to Derivation
-    itkcf.addFlag("ITk.DAODStorePixel", True)
-    itkcf.addFlag("ITk.DAODStoreStrip", True)
+    itkcf.addFlag("ITk.DAODStorePixel", lambda prevFlags:
+                  prevFlags.Detector.EnableITkPixel)
+    itkcf.addFlag("ITk.DAODStoreStrip", lambda prevFlags:
+                  prevFlags.Detector.EnableITkStrip)
     itkcf.addFlag("ITk.DAODStoreExtra", True)
 
     # Save SiHitCollections to RDO
diff --git a/InnerDetector/InDetConfig/python/InDetConfigFlags.py b/InnerDetector/InDetConfig/python/InDetConfigFlags.py
index a9431d5d621afd8d7eef322618fff34c1c1925f4..100270e8b15d365dd9decf344fa99b75526d142a 100644
--- a/InnerDetector/InDetConfig/python/InDetConfigFlags.py
+++ b/InnerDetector/InDetConfig/python/InDetConfigFlags.py
@@ -43,9 +43,12 @@ def createInDetConfigFlags():
 
     # Save cluster information to Derivation
     icf.addFlag("InDet.DRAWZSelection", False)
-    icf.addFlag("InDet.DAODStorePixel", True)
-    icf.addFlag("InDet.DAODStoreSCT", True)
-    icf.addFlag("InDet.DAODStoreTRT", True)
+    icf.addFlag("InDet.DAODStorePixel", lambda prevFlags:
+                prevFlags.Detector.EnablePixel)
+    icf.addFlag("InDet.DAODStoreSCT", lambda prevFlags:
+                prevFlags.Detector.EnableSCT)
+    icf.addFlag("InDet.DAODStoreTRT", lambda prevFlags:
+                prevFlags.Detector.EnableTRT)
     icf.addFlag("InDet.DAODStoreExtra", True)
 
     # Specific flags for pixel study
diff --git a/InnerDetector/InDetRecTools/InDetUsedInFitTrackDecoratorTool/Root/InDetUsedInFitTrackDecoratorTool.cxx b/InnerDetector/InDetRecTools/InDetUsedInFitTrackDecoratorTool/Root/InDetUsedInFitTrackDecoratorTool.cxx
index 80dd6d05deb552acdadec36a6c832b12aa0e02a9..f7c891734b1fe2590bd2d7934216a8424b6ff596 100644
--- a/InnerDetector/InDetRecTools/InDetUsedInFitTrackDecoratorTool/Root/InDetUsedInFitTrackDecoratorTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetUsedInFitTrackDecoratorTool/Root/InDetUsedInFitTrackDecoratorTool.cxx
@@ -88,6 +88,8 @@ void InDet::InDetUsedInFitTrackDecoratorTool::decorate(const xAOD::TrackParticle
   // Decor handles for the AMVF vertices and weights
   SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<ElementLink<xAOD::VertexContainer>>> vtxDeco(m_vtxDecoKey, ctx);
   SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> wgtDeco(m_wgtDecoKey, ctx);
+  bool isVtxDeco_available = vtxDeco.isAvailable();
+  if(isVtxDeco_available) return;
 
   //vector to collect results
   std::vector<std::pair<const xAOD::Vertex*,float> > vxWithWeight;
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py
index 166db58d4720f5bda4cccf9a9a20b737cf17d5e9..d16852eb0b239d101198f474092365c06e7da5cc 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py
@@ -56,7 +56,7 @@ def IDTIDEKernelCommonCfg(flags, name='IDTIDEKernel'):
     from DerivationFrameworkInDet.InDetToolsConfig import (
         TrackParametersAtPVCfg)
     DFCommonZ0AtPV = acc.getPrimaryAndMerge(TrackParametersAtPVCfg(
-        flags, name="DFCommonZ0AtPV",
+        flags, name="IDTIDE_DFCommonZ0AtPV",
         Z0SGEntryName="IDTIDEInDetTrackZ0AtPV")
     )
     augmentationTools.append(DFCommonZ0AtPV)
@@ -179,46 +179,6 @@ def IDTIDEKernelCommonCfg(flags, name='IDTIDEKernel'):
 
     return acc
 
-def DFInDetTSOSKernelCfg(flags, name='DFInDetTSOSKernel'):
-    acc = ComponentAccumulator()
-
-    # ====================================================================
-    # AUGMENTATION TOOLS
-    # ====================================================================
-    tsos_augmentationTools = []
-
-    from DerivationFrameworkInDet.InDetToolsConfig import (
-        DFTrackStateOnSurfaceDecoratorCfg)
-    DFTSOS = acc.getPrimaryAndMerge(DFTrackStateOnSurfaceDecoratorCfg(flags))
-    tsos_augmentationTools.append(DFTSOS)
-
-    # shared between IDTIDE and IDTRKVALID
-    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
-        name,
-        AugmentationTools=tsos_augmentationTools,
-        ThinningTools=[],
-        OutputLevel=INFO))
-    return acc
-
-def DFITkTSOSKernelCfg(flags, name='DFITkTSOSKernel'):
-    acc = ComponentAccumulator()
-
-    # ====================================================================
-    # AUGMENTATION TOOLS
-    # ====================================================================
-    tsos_augmentationTools = []
-
-    from DerivationFrameworkInDet.InDetToolsConfig import DFITkTrackStateOnSurfaceDecoratorCfg
-    DFTSOS = acc.getPrimaryAndMerge(DFITkTrackStateOnSurfaceDecoratorCfg(flags))
-    tsos_augmentationTools.append(DFTSOS)
-
-    # shared between IDTIDE and IDTRKVALID
-    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
-        name,
-        AugmentationTools=tsos_augmentationTools,
-        ThinningTools=[],
-        OutputLevel=INFO))
-    return acc
 
 def IDTIDEThinningKernelCfg(flags, name="IDTIDEThinningKernel", StreamName=""):
     acc = ComponentAccumulator()
@@ -248,7 +208,7 @@ def IDTIDEThinningKernelCfg(flags, name="IDTIDEThinningKernel", StreamName=""):
             IDTIDETruthThinningToolCfg(flags, StreamName=StreamName)))
 
     acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
-        name="IDTIDEThinningKernel",
+        name,
         AugmentationTools=[],
         ThinningTools=thinningTools,
         OutputLevel=INFO))
@@ -295,6 +255,8 @@ def IDTIDEKernelCfg(flags, StreamName=""):
     acc.addSequence(parSeq(IDTIDEPostProcSequenceName),
                     parentName=IDTIDEPreselSequenceName)
 
+    from DerivationFrameworkInDet.InDetToolsConfig import (
+        DFInDetTSOSKernelCfg)
     acc.merge(DFInDetTSOSKernelCfg(flags),
               sequenceName=IDTIDEPostProcSequenceName)
     acc.merge(IDTIDEThinningKernelCfg(flags, StreamName=StreamName),
@@ -322,6 +284,7 @@ def ITkTIDEKernelCfg(flags, StreamName=""):
     acc.addSequence(parSeq(IDTIDEPostProcSequenceName),
                     parentName=IDTIDEPreselSequenceName)
 
+    from DerivationFrameworkInDet.InDetToolsConfig import DFITkTSOSKernelCfg
     acc.merge(DFITkTSOSKernelCfg(flags),
               sequenceName=IDTIDEPostProcSequenceName)
     acc.merge(IDTIDEThinningKernelCfg(flags, StreamName=StreamName),
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTRKVALID.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTRKVALID.py
index 7d3a666b799c9a9ad81822fcc9c40543b5cff536..3ba10d27828c9411b6600c9ea6d0ccef6a838ec6 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTRKVALID.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTRKVALID.py
@@ -16,135 +16,215 @@ from AthenaCommon.Constants import INFO
 
 # Main algorithm config
 
-
-def IDTRKVALIDKernelCfg(flags, name='IDTRKVALIDKernel', **kwargs):
-    """Configure the derivation framework driving algorithm (kernel) for IDTRKVALID"""
+def IDTRKVALID_ANDToolCfg(flags, name='IDTRKVALID_ANDTool'):
     acc = ComponentAccumulator()
-    DerivationKernel = CompFactory.DerivationFramework.DerivationKernel
 
-    acc.addSequence(seqAND('IDTRKVALIDSequence'))
+    sel_muon1  = 'Muons.pt > 25*GeV && Muons.ptcone40/Muons.pt < 0.3 && Muons.passesIDCuts'
+    sel_muon2  = 'Muons.pt > 20*GeV && Muons.ptcone40/Muons.pt < 0.3 && Muons.passesIDCuts'
+    draw_zmumu = '( count (  DRZmumuMass > 70*GeV   &&  DRZmumuMass < 110*GeV ) >= 1 )'
+    from DerivationFrameworkTools.DerivationFrameworkToolsConfig import (
+        InvariantMassToolCfg, xAODStringSkimmingToolCfg,
+        FilterCombinationANDCfg)
+    IDTRKVALID_ZmumuMass = acc.getPrimaryAndMerge(InvariantMassToolCfg(
+        flags, name="IDTRKVALID_ZmumuMass",
+        ContainerName            = "Muon",
+        ObjectRequirements       = sel_muon1,
+        SecondObjectRequirements = sel_muon2,
+        MassHypothesis           = 105.66,
+        SecondMassHypothesis     = 105.66,
+        StoreGateEntryName       = "ZmumuMass"))
+
+    IDTRKVALID_SkimmingTool = acc.getPrimaryAndMerge(
+        xAODStringSkimmingToolCfg(flags, name="IDTRKVALID_SkimmingTool",
+                                  expression=draw_zmumu))
+
+    IDTRKVALID_ANDTool = acc.getPrimaryAndMerge(
+        FilterCombinationANDCfg(flags, name,
+                                FilterList=[IDTRKVALID_ZmumuMass,
+                                            IDTRKVALID_SkimmingTool]))
+
+    acc.addPublicTool(IDTRKVALID_ANDTool, primary=True)
+    return acc
+
+
+def IDTRKVALIDKernelCommonCfg(flags, name='IDTRKVALIDKernel'):
+    acc = ComponentAccumulator()
 
     # ====================================================================
     # AUGMENTATION TOOLS
     # ====================================================================
     augmentationTools = []
-    tsos_augmentationTools = []
 
     # Add unbiased track parameters to track particles
     from DerivationFrameworkInDet.InDetToolsConfig import (
         TrackToVertexWrapperCfg)
     IDTRKVALIDTrackToVertexWrapper = acc.getPrimaryAndMerge(
-        TrackToVertexWrapperCfg(flags,
-                                name="IDTRKVALIDTrackToVertexWrapper",
-                                DecorationPrefix="IDTRKVALID"))
+        TrackToVertexWrapperCfg(
+            flags, name="IDTRKVALIDTrackToVertexWrapper",
+            DecorationPrefix="IDTRKVALID"))
     augmentationTools.append(IDTRKVALIDTrackToVertexWrapper)
 
-    from DerivationFrameworkInDet.InDetToolsConfig import (UsedInVertexFitTrackDecoratorCfg)
-    IDTRKVALIDUsedInFitDecorator = acc.getPrimaryAndMerge(UsedInVertexFitTrackDecoratorCfg(flags,
-                                                                                           name="IDTRKVALIDUsedInFitDecorator"))
+    from DerivationFrameworkInDet.InDetToolsConfig import (
+        UsedInVertexFitTrackDecoratorCfg)
+    IDTRKVALIDUsedInFitDecorator = acc.getPrimaryAndMerge(
+        UsedInVertexFitTrackDecoratorCfg(flags))
     augmentationTools.append(IDTRKVALIDUsedInFitDecorator)
 
     # @TODO eventually computed for other extra outputs. Possible to come  up with a solution to use a common Z0AtPV if there is more than one client ?
-    from DerivationFrameworkInDet.InDetToolsConfig import (TrackParametersAtPVCfg)
-    DFCommonZ0AtPV = acc.getPrimaryAndMerge(TrackParametersAtPVCfg(flags,
-                                                                   name="DFCommonZ0AtPV",
-                                                                   Z0SGEntryName="IDTRKVALIDInDetTrackZ0AtPV"))
+    from DerivationFrameworkInDet.InDetToolsConfig import TrackParametersAtPVCfg
+    DFCommonZ0AtPV = acc.getPrimaryAndMerge(TrackParametersAtPVCfg(
+        flags, name="IDTRKVALID_DFCommonZ0AtPV",
+        Z0SGEntryName="IDTRKVALIDInDetTrackZ0AtPV"))
     augmentationTools.append(DFCommonZ0AtPV)
 
-    if flags.Detector.GeometryID:
-        from DerivationFrameworkInDet.InDetToolsConfig import (DFTrackStateOnSurfaceDecoratorCfg)
-        DFTSOS = acc.getPrimaryAndMerge(DFTrackStateOnSurfaceDecoratorCfg(flags))
-        tsos_augmentationTools.append(DFTSOS)
+    # ====================================================================
+    # SKIMMING TOOLS
+    # ====================================================================
+    skimmingTools = []
+    if flags.InDet.DRAWZSelection:
+        IDTRKVALID_ANDTool = acc.getPrimaryAndMerge(IDTRKVALID_ANDToolCfg(flags))
+        skimmingTools.append(IDTRKVALID_ANDTool)
 
-    if flags.Detector.GeometryITk:
-        from DerivationFrameworkInDet.InDetToolsConfig import (ITkTrackStateOnSurfaceDecoratorCfg)
-        DFTSOS = acc.getPrimaryAndMerge(ITkTrackStateOnSurfaceDecoratorCfg(flags))
-        tsos_augmentationTools.append(DFTSOS)
-
-    from DerivationFrameworkInDet.PixelNtupleMakerConfig import (EventInfoPixelModuleStatusMonitoringCfg)
-    DFEI = acc.getPrimaryAndMerge(EventInfoPixelModuleStatusMonitoringCfg(flags,
-                                                                          name = "EventInfoPixelModuleStatusMonitoring",
-                                                                          OutputLevel =INFO))
-    augmentationTools.append(DFEI)
+    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
+        "IDTRKVALIDKernelPresel", SkimmingTools=skimmingTools))
 
     # ====================================================================
-    # SKIMMING TOOLS
+    # CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS
     # ====================================================================
+
+    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
+        name,
+        AugmentationTools = augmentationTools,
+        SkimmingTools     = skimmingTools,
+        ThinningTools     = [],
+        RunSkimmingFirst  = True))
+
+    return acc
+
+def IDTRKVALID_PixelModuleStatus_KernelCfg(
+        flags, name='IDTRKVALID_PixelModuleStatus_Kernel'):
+
+    acc = ComponentAccumulator()
+
+    augmentationTools = []
+    from DerivationFrameworkInDet.PixelNtupleMakerConfig import (
+        EventInfoPixelModuleStatusMonitoringCfg)
+    DFEI = acc.getPrimaryAndMerge(EventInfoPixelModuleStatusMonitoringCfg(flags))
+    augmentationTools.append(DFEI)
+
     skimmingTools = []
     if flags.InDet.DRAWZSelection:
-        sel_muon1  = 'Muons.pt > 25*GeV && Muons.ptcone40/Muons.pt < 0.3 && Muons.passesIDCuts'
-        sel_muon2  = 'Muons.pt > 20*GeV && Muons.ptcone40/Muons.pt < 0.3 && Muons.passesIDCuts'
-        draw_zmumu = '( count (  DRZmumuMass > 70*GeV   &&  DRZmumuMass < 110*GeV ) >= 1 )'
-        from DerivationFrameworkTools.DerivationFrameworkToolsConfig import (InvariantMassToolCfg,xAODStringSkimmingToolCfg,FilterCombinationANDCfg)
-        IDTRKVALID_ZmumuMass = acc.getPrimaryAndMerge(InvariantMassToolCfg(flags, 
-                                                                           name="IDTRKVALID_ZmumuMass",
-                                                                           ContainerName            = "Muon",
-                                                                           ObjectRequirements       = sel_muon1,
-                                                                           SecondObjectRequirements = sel_muon2,
-                                                                           MassHypothesis           = 105.66,
-                                                                           SecondMassHypothesis     = 105.66, 
-                                                                           StoreGateEntryName       = "ZmumuMass"))
-        IDTRKVALID_SkimmingTool = acc.getPrimaryAndMerge(xAODStringSkimmingToolCfg(flags, 
-                                                                                   name="IDTRKVALID_SkimmingTool",
-                                                                                   expression=draw_zmumu))
-        IDTRKVALID_ANDTool = acc.getPrimaryAndMerge(FilterCombinationANDCfg(flags, 
-                                                                            name="IDTRKVALID_ANDTool",
-                                                                            FilterList=[IDTRKVALID_ZmumuMass,IDTRKVALID_SkimmingTool]))
+        IDTRKVALID_ANDTool = acc.getPrimaryAndMerge(IDTRKVALID_ANDToolCfg(flags))
         skimmingTools.append(IDTRKVALID_ANDTool)
 
+    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
+        name,
+        AugmentationTools = augmentationTools,
+        SkimmingTools     = skimmingTools,
+        ThinningTools     = [],
+        RunSkimmingFirst  = True))
 
+    return acc
 
-    IDTRKVALIDKernelPresel = DerivationKernel("IDTRKVALIDKernelPresel",
-                                              SkimmingTools=skimmingTools)
-    acc.addEventAlgo(IDTRKVALIDKernelPresel, sequenceName="IDTRKVALIDSequence")
+def IDTRKVALID_ITkPixelModuleStatus_KernelCfg(
+        flags, name='IDTRKVALID_ITkPixelModuleStatus_Kernel'):
 
-    if flags.Detector.GeometryID:
-        from InDetConfig.InDetPrepRawDataToxAODConfig import InDetPrepDataToxAODCfg
-        acc.merge(InDetPrepDataToxAODCfg(flags))
+    acc = ComponentAccumulator()
 
-    if flags.Detector.GeometryITk:
-        from InDetConfig.InDetPrepRawDataToxAODConfig import ITkPrepDataToxAODCfg
-        acc.merge(ITkPrepDataToxAODCfg(flags))
+    augmentationTools = []
+    from DerivationFrameworkInDet.PixelNtupleMakerConfig import (
+        ITkEventInfoPixelModuleStatusMonitoringCfg)
+    DFEI = acc.getPrimaryAndMerge(
+        ITkEventInfoPixelModuleStatusMonitoringCfg(flags))
+    augmentationTools.append(DFEI)
+
+    skimmingTools = []
+    if flags.InDet.DRAWZSelection:
+        IDTRKVALID_ANDTool = acc.getPrimaryAndMerge(IDTRKVALID_ANDToolCfg(flags))
+        skimmingTools.append(IDTRKVALID_ANDTool)
+
+    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
+        name,
+        AugmentationTools = augmentationTools,
+        SkimmingTools     = skimmingTools,
+        ThinningTools     = [],
+        RunSkimmingFirst  = True))
+
+    return acc
+
+def IDTRKVALIDThinningKernelCfg(
+        flags, name="IDTRKVALIDThinningKernel", StreamName=""):
+    acc = ComponentAccumulator()
 
     # ====================================================================
     # THINNING TOOLS
     # ====================================================================
-    thinningTools = [] 
+    thinningTools = []
 
     # MC truth thinning
     if flags.Input.isMC:
-        from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import (MenuTruthThinningCfg)
-        IDTRKVALIDTruthThinningTool = acc.getPrimaryAndMerge(MenuTruthThinningCfg(flags,
-                                                                                  name                = "IDTRKVALIDTruthThinningTool",
-                                                                                  StreamName          = kwargs['StreamName'],
-                                                                                  WriteEverything     = True,
-                                                                                  WriteFirstN         = -1,
-                                                                                  PreserveAncestors   = True,
-                                                                                  PreserveGeneratorDescendants=True))
-        thinningTools.append(IDTRKVALIDTruthThinningTool)
+        from DerivationFrameworkInDet.InDetToolsConfig import (
+            IDTRKVALIDTruthThinningToolCfg)
+        thinningTools.append(acc.getPrimaryAndMerge(
+            IDTRKVALIDTruthThinningToolCfg(flags, StreamName=StreamName)))
+
+    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
+        name,
+        AugmentationTools=[],
+        ThinningTools=thinningTools,
+        OutputLevel=INFO))
+    return acc
 
-    # ====================================================================
-    # CREATE THE DERIVATION KERNEL ALGORITHM AND PASS THE ABOVE TOOLS
-    # ====================================================================
-    acc.addEventAlgo(DerivationKernel(name              = "DFTSOSKernel",
-                                      AugmentationTools = tsos_augmentationTools,
-                                      ThinningTools     = [],
-                                      OutputLevel       =INFO), 
-                                      sequenceName="IDTRKVALIDSequence")
-
-    acc.addEventAlgo(DerivationKernel(name,
-                                      AugmentationTools = augmentationTools,
-                                      SkimmingTools     = skimmingTools,
-                                      ThinningTools     = [],
-                                      RunSkimmingFirst  = True,
-                                      OutputLevel=INFO), 
-                                      sequenceName="IDTRKVALIDSequence")
-
-    acc.addEventAlgo(DerivationKernel(name="IDTRKVALIDThinningKernel",
-                                      AugmentationTools = [],
-                                      ThinningTools     = thinningTools,
-                                      OutputLevel       = INFO), 
-                                      sequenceName="IDTRKVALIDSequence")
+
+def IDTRKVALIDKernelCfg(flags, StreamName=""):
+    """Configure the derivation framework driving algorithm (kernel) for IDTRKVALID"""
+    acc = ComponentAccumulator()
+
+    IDTRKVALIDSequenceName='IDTRKVALIDSequence'
+    acc.addSequence(seqAND(IDTRKVALIDSequenceName))
+
+    acc.merge(IDTRKVALIDKernelCommonCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    acc.merge(IDTRKVALID_PixelModuleStatus_KernelCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    from InDetConfig.InDetPrepRawDataToxAODConfig import InDetPrepDataToxAODCfg
+    acc.merge(InDetPrepDataToxAODCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    from DerivationFrameworkInDet.InDetToolsConfig import DFInDetTSOSKernelCfg
+    acc.merge(DFInDetTSOSKernelCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    acc.merge(IDTRKVALIDThinningKernelCfg(flags, StreamName=StreamName),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    return acc
+
+def ITkTRKVALIDKernelCfg(flags, StreamName=""):
+    """Configure the derivation framework driving algorithm (kernel) for IDTRKVALID"""
+    acc = ComponentAccumulator()
+
+    IDTRKVALIDSequenceName='IDTRKVALIDSequence'
+    acc.addSequence(seqAND(IDTRKVALIDSequenceName))
+
+    acc.merge(IDTRKVALIDKernelCommonCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    acc.merge(IDTRKVALID_ITkPixelModuleStatus_KernelCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    from InDetConfig.InDetPrepRawDataToxAODConfig import ITkPrepDataToxAODCfg
+    acc.merge(ITkPrepDataToxAODCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    from DerivationFrameworkInDet.InDetToolsConfig import DFITkTSOSKernelCfg
+    acc.merge(DFITkTSOSKernelCfg(flags),
+              sequenceName=IDTRKVALIDSequenceName)
+
+    acc.merge(IDTRKVALIDThinningKernelCfg(flags, StreamName=StreamName),
+              sequenceName=IDTRKVALIDSequenceName)
 
     return acc
 
@@ -154,9 +234,10 @@ def IDTRKVALIDCfg(flags):
     acc = ComponentAccumulator()
 
     # Main algorithm (kernel)
-    acc.merge(IDTRKVALIDKernelCfg(flags, 
-                                  name       = "IDTRKVALIDKernel",
-                                  StreamName = 'StreamDAOD_IDTRKVALID'))
+    if flags.Detector.GeometryID:
+        acc.merge(IDTRKVALIDKernelCfg(flags, StreamName = 'StreamDAOD_IDTRKVALID'))
+    if flags.Detector.GeometryITk:
+        acc.merge(ITkTRKVALIDKernelCfg(flags, StreamName = 'StreamDAOD_IDTRKVALID'))
 
     # =============================
     # Define contents of the format
@@ -164,9 +245,10 @@ def IDTRKVALIDCfg(flags):
     from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
     from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
     from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
-    IDTRKVALIDSlimmingHelper = SlimmingHelper("IDTRKVALIDSlimmingHelper",
-                                              NamesAndTypes = flags.Input.TypedCollections,
-                                              ConfigFlags   = flags)
+    IDTRKVALIDSlimmingHelper = SlimmingHelper(
+        "IDTRKVALIDSlimmingHelper",
+        NamesAndTypes = flags.Input.TypedCollections,
+        ConfigFlags   = flags)
 
     AllVariables = []
     StaticContent = []
@@ -226,6 +308,7 @@ def IDTRKVALIDCfg(flags):
                 "SCT_Clusters": "xAOD::TrackMeasurementValidationContainer",
                 "SCT_ClustersAux": "xAOD::TrackMeasurementValidationAuxContainer"
             })
+
     if flags.Detector.GeometryITk:
         if flags.ITk.DAODStorePixel:
             IDTRKVALIDSlimmingHelper.AppendToDictionary.update({
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py
index 5a1a066f798320b4cd44919b3db8a969cd551191..677321fc2d22229f68b1da16e651738611d77eae 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py
@@ -135,6 +135,25 @@ def DFTrackStateOnSurfaceDecoratorCfg(
     kwargs.setdefault("OutputLevel", INFO)
     return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs)
 
+def DFInDetTSOSKernelCfg(flags, name='DFInDetTSOSKernel'):
+    acc = ComponentAccumulator()
+
+    # ====================================================================
+    # AUGMENTATION TOOLS
+    # ====================================================================
+    tsos_augmentationTools = []
+
+    DFTSOS = acc.getPrimaryAndMerge(DFTrackStateOnSurfaceDecoratorCfg(flags))
+    tsos_augmentationTools.append(DFTSOS)
+
+    # shared between IDTIDE and IDTRKVALID
+    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
+        name,
+        AugmentationTools=tsos_augmentationTools,
+        ThinningTools=[],
+        OutputLevel=INFO))
+    return acc
+
 def ObserverTrackStateOnSurfaceDecoratorCfg(
         flags, name="ObserverTrackStateOnSurfaceDecorator", **kwargs):
     kwargs.setdefault("ContainerName", "InDetObservedTrackParticles")
@@ -265,13 +284,32 @@ def ITkTSOS_CommonKernelCfg(flags, name="ITkTSOS_CommonKernel"):
 
 def DFITkTrackStateOnSurfaceDecoratorCfg(
         flags, name="DFITkTrackStateOnSurfaceDecorator", **kwargs):
-    kwargs.setdefault("StorePixel", flags.Detector.EnableITkPixel)
-    kwargs.setdefault("StoreSCT", flags.Detector.EnableITkStrip)
+    kwargs.setdefault("StorePixel", flags.ITk.DAODStorePixel)
+    kwargs.setdefault("StoreSCT", flags.ITk.DAODStoreStrip)
     kwargs.setdefault("DecorationPrefix", "")
     kwargs.setdefault("PRDtoTrackMap", "")
     kwargs.setdefault("OutputLevel", INFO)
     return ITkTrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs)
 
+def DFITkTSOSKernelCfg(flags, name='DFITkTSOSKernel'):
+    acc = ComponentAccumulator()
+
+    # ====================================================================
+    # AUGMENTATION TOOLS
+    # ====================================================================
+    tsos_augmentationTools = []
+
+    DFTSOS = acc.getPrimaryAndMerge(DFITkTrackStateOnSurfaceDecoratorCfg(flags))
+    tsos_augmentationTools.append(DFTSOS)
+
+    # shared between IDTIDE and IDTRKVALID
+    acc.addEventAlgo(CompFactory.DerivationFramework.DerivationKernel(
+        name,
+        AugmentationTools=tsos_augmentationTools,
+        ThinningTools=[],
+        OutputLevel=INFO))
+    return acc
+
 def ITkSiSPTrackStateOnSurfaceDecoratorCfg(
         flags, name="SiSPTrackStateOnSurfaceDecorator", **kwargs):
     kwargs.setdefault("ContainerName", "SiSPSeededTracksTrackParticles")
@@ -514,3 +552,15 @@ def IDTIDETruthThinningToolCfg(flags, name="IDTIDETruthThinningTool", **kwargs):
     from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import (
         MenuTruthThinningCfg)
     return MenuTruthThinningCfg(flags, name, **kwargs)
+
+def IDTRKVALIDTruthThinningToolCfg(
+        flags, name="IDTRKVALIDTruthThinningTool", **kwargs):
+
+    kwargs.setdefault("WriteEverything", True)
+    kwargs.setdefault("WriteFirstN", -1)
+    kwargs.setdefault("PreserveAncestors", True)
+    kwargs.setdefault("PreserveGeneratorDescendants", True)
+
+    from DerivationFrameworkMCTruth.TruthDerivationToolsConfig import (
+        MenuTruthThinningCfg)
+    return MenuTruthThinningCfg(flags, name, **kwargs)
diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/PixelNtupleMakerConfig.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/PixelNtupleMakerConfig.py
index f9e9e23b72296f13425401892a730ae34193bd01..7b98802b6964966581e917a9912176cbb344577d 100644
--- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/PixelNtupleMakerConfig.py
+++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/PixelNtupleMakerConfig.py
@@ -8,7 +8,6 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
-from PixelConditionsTools.PixelConditionsSummaryConfig import PixelConditionsSummaryCfg
 
 def PixelNtupleMakerCfg(flags, name="PixelMonitoringTool", **kwargs):
     acc= ComponentAccumulator()
@@ -21,10 +20,62 @@ def PixelNtupleMakerCfg(flags, name="PixelMonitoringTool", **kwargs):
     acc.addPublicTool(the_tool, primary = True)
     return acc
 
-def EventInfoPixelModuleStatusMonitoringCfg(flags, name="EventInfoPixelModuleStatusMonitoring", **kwargs):
-    acc= ComponentAccumulator()
-    kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(PixelConditionsSummaryCfg(flags)))
-    the_tool = CompFactory.DerivationFramework.EventInfoPixelModuleStatusMonitoring(name,**kwargs)
-    acc.addPublicTool(the_tool, primary = True)
+def EventInfoPixelModuleStatusMonitoringCfg(
+        flags, name="EventInfoPixelModuleStatusMonitoring", **kwargs):
+    from PixelConditionsAlgorithms.PixelConditionsConfig import (
+        PixelDCSCondTempAlgCfg, PixelDCSCondHVAlgCfg,
+        PixelDCSCondStateAlgCfg, PixelDCSCondStatusAlgCfg,
+        PixelDeadMapCondAlgCfg, )
+    acc = PixelDCSCondTempAlgCfg(flags)
+    acc.merge(PixelDCSCondHVAlgCfg(flags))
+    acc.merge(PixelDCSCondStateAlgCfg(flags))
+    acc.merge(PixelDCSCondStatusAlgCfg(flags))
+    acc.merge(PixelDeadMapCondAlgCfg(flags))
+
+    if "PixelConditionsSummaryTool" not in kwargs:
+        from PixelConditionsTools.PixelConditionsSummaryConfig import (
+            PixelConditionsSummaryCfg)
+        kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(
+            PixelConditionsSummaryCfg(flags)))
+
+    acc.addPublicTool(
+        CompFactory.DerivationFramework.EventInfoPixelModuleStatusMonitoring(
+            name,**kwargs), primary = True)
+    return acc
+
+def ITkEventInfoPixelModuleStatusMonitoringCfg(
+        flags, name="ITkEventInfoPixelModuleStatusMonitoring", **kwargs):
+    from PixelConditionsAlgorithms.ITkPixelConditionsConfig import (
+        ITkPixelDCSCondTempAlgCfg, ITkPixelDCSCondHVAlgCfg,
+        ITkPixelDCSCondStateAlgCfg, ITkPixelDCSCondStatusAlgCfg,
+        ITkPixelDeadMapCondAlgCfg)
+    acc = ITkPixelDCSCondTempAlgCfg(flags)
+    acc.merge(ITkPixelDCSCondHVAlgCfg(flags))
+    acc.merge(ITkPixelDCSCondStateAlgCfg(flags))
+    acc.merge(ITkPixelDCSCondStatusAlgCfg(flags))
+    acc.merge(ITkPixelDeadMapCondAlgCfg(flags))
+
+    kwargs.setdefault("ReadKeyeTemp", "ITkPixelDCSTempCondData")
+    kwargs.setdefault("ReadKeyHV", "ITkPixelDCSHVCondData")
+    kwargs.setdefault("PixelDCSStateCondData", "ITkPixelDCSStateCondData")
+    kwargs.setdefault("PixelDCSStatusCondData", "ITkPixelDCSStatusCondData")
+    kwargs.setdefault("PixelDeadMapCondData", "ITkPixelDeadMapCondData")
+
+    # No PixelByteStreamErrs producer yet for ITk
+    kwargs.setdefault("PixelByteStreamErrs", "")
+    kwargs.setdefault("UseByteStreamRD53", False)
+
+    kwargs.setdefault("UseByteStreamFEI4", False)
+    kwargs.setdefault("UseByteStreamFEI3", False)
+
+    if "PixelConditionsSummaryTool" not in kwargs:
+        from PixelConditionsTools.ITkPixelConditionsSummaryConfig import (
+            ITkPixelConditionsSummaryCfg)
+        kwargs.setdefault("PixelConditionsSummaryTool", acc.popToolsAndMerge(
+            ITkPixelConditionsSummaryCfg(flags)))
+
+    acc.addPublicTool(
+        CompFactory.DerivationFramework.EventInfoPixelModuleStatusMonitoring(
+            name,**kwargs), primary = True)
     return acc