diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py
index f9f27f2f53ba0e975bcf7626fb4540ddb33adc2e..9bf2a55abfddfb1e78b3225d50537b8670a5dff2 100644
--- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py
+++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py
@@ -92,23 +92,23 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare, isPhyslite, noPhysliteB
     else :
         input = jetContainer
     jetSequence = makeJetAnalysisSequence( dataType, jetContainer,
-                                           runJvtUpdate = True,
-                                           enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False,
-                                           runGhostMuonAssociation = not isPhyslite)
-
-    if not noPhysliteBroken :
-        from FTagAnalysisAlgorithms.FTagAnalysisSequence import makeFTagAnalysisSequence
-        btagger = "MV2c10"
-        btagWP = "FixedCutBEff_77"
-        makeFTagAnalysisSequence( jetSequence, dataType, jetContainer, noEfficiency = False, legacyRecommendations = True,
-                                  enableCutflow=True, btagger = btagger, btagWP = btagWP )
-        vars += [
-            'OutJets_%SYS%.ftag_select_' + btagger + '_' + btagWP + ' -> jet_ftag_select_%SYS%',
-        ]
-        if dataType != 'data' :
-            vars += [
-                'OutJets_%SYS%.ftag_effSF_' + btagger + '_' + btagWP + '_%SYS% -> jet_ftag_eff_%SYS%'
-            ]
+                                           truthJetCollection='AntiKt4TruthDressedWZJets',
+                                           enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False)
+
+    # FIX ME: f-tag needs an overhaul to run on DAOD_PHYS
+    # if not noPhysliteBroken :
+    #     from FTagAnalysisAlgorithms.FTagAnalysisSequence import makeFTagAnalysisSequence
+    #     btagger = "MV2c10"
+    #     btagWP = "FixedCutBEff_77"
+    #     makeFTagAnalysisSequence( jetSequence, dataType, jetContainer, noEfficiency = False, legacyRecommendations = True,
+    #                               enableCutflow=True, btagger = btagger, btagWP = btagWP )
+    #     vars += [
+    #         'OutJets_%SYS%.ftag_select_' + btagger + '_' + btagWP + ' -> jet_ftag_select_%SYS%',
+    #     ]
+    #     if dataType != 'data' :
+    #         vars += [
+    #             'OutJets_%SYS%.ftag_effSF_' + btagger + '_' + btagWP + '_%SYS% -> jet_ftag_eff_%SYS%'
+    #         ]
 
     jetSequence.configure( inputName = input, outputName = 'AnaJets_%SYS%' )
 
@@ -213,7 +213,7 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare, isPhyslite, noPhysliteB
         input = 'AnalysisPhotons'
     else :
         input = 'Photons'
-    photonSequence = makePhotonAnalysisSequence( dataType, 'Tight.FixedCutTight', postfix = 'tight',
+    photonSequence = makePhotonAnalysisSequence( dataType, 'Tight.FixedCutTight', postfix = 'tight', ptSelectionOutput=True,
                                                  recomputeIsEM=False, enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False )
     photonSequence.configure( inputName = input,
                               outputName = 'AnaPhotons_%SYS%' )
@@ -232,7 +232,9 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare, isPhyslite, noPhysliteB
         input = 'AnalysisTauJets'
     else :
         input = 'TauJets'
+    # FIX ME: Need to disable truth matching for taus to run on DAOD_PHYS
     tauSequence = makeTauAnalysisSequence( dataType, 'Tight', postfix = 'tight',
+                                           rerunTruthMatching = False,
                                            enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False )
     tauSequence.configure( inputName = input, outputName = 'AnaTauJets_%SYS%' )
 
@@ -454,7 +456,6 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli
 
     configSeq = ConfigSequence ()
 
-
     if not isPhyslite :
         # Include, and then set up the pileup analysis sequence:
         prwfiles, lumicalcfiles = pileupConfigFiles(dataType)
@@ -506,7 +507,7 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli
     # Include, and then set up the photon analysis algorithm sequence:
     from EgammaAnalysisAlgorithms.PhotonAnalysisConfig import makePhotonCalibrationConfig, makePhotonWorkingPointConfig
 
-    makePhotonCalibrationConfig (configSeq, 'AnaPhotons', recomputeIsEM=False)
+    makePhotonCalibrationConfig (configSeq, 'AnaPhotons', recomputeIsEM=False, ptSelectionOutput=True)
     makePhotonWorkingPointConfig (configSeq, 'AnaPhotons', 'Tight.FixedCutTight', postfix = 'tight', recomputeIsEM=False)
     vars += [ 'OutPhotons_NOSYS.eta -> ph_eta',
               'OutPhotons_NOSYS.phi -> ph_phi',
@@ -519,7 +520,7 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli
     # Include, and then set up the muon analysis algorithm sequence:
     from MuonAnalysisAlgorithms.MuonAnalysisConfig import makeMuonCalibrationConfig, makeMuonWorkingPointConfig
 
-    makeMuonCalibrationConfig (configSeq, 'AnaMuons')
+    makeMuonCalibrationConfig (configSeq, 'AnaMuons', ptSelectionOutput=True)
     makeMuonWorkingPointConfig (configSeq, 'AnaMuons', workingPoint='Medium.Iso', postfix='medium')
     makeMuonWorkingPointConfig (configSeq, 'AnaMuons', workingPoint='Tight.Iso', postfix='tight')
     vars += [ 'OutMuons_NOSYS.eta -> mu_eta',
@@ -536,7 +537,9 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli
     # Include, and then set up the tau analysis algorithm sequence:
     from TauAnalysisAlgorithms.TauAnalysisConfig import makeTauCalibrationConfig, makeTauWorkingPointConfig
 
-    makeTauCalibrationConfig (configSeq, 'AnaTauJets')
+    # FIX ME: Need to disable truth matching for taus to run on DAOD_PHYS
+    makeTauCalibrationConfig (configSeq, 'AnaTauJets',
+                              rerunTruthMatching = False)
     makeTauWorkingPointConfig (configSeq, 'AnaTauJets', workingPoint='Tight', postfix='tight')
     vars += [ 'OutTauJets_NOSYS.eta -> tau_eta',
               'OutTauJets_NOSYS.phi -> tau_phi',
diff --git a/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py b/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py
index 3e315940ff69ab0077fb65136a88eab8952243ce..f8eb3d25c47c0f5e6a54d68730342b26f72f06d7 100644
--- a/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py
+++ b/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py
@@ -9,67 +9,47 @@ class PileupReweightingBlock (ConfigBlock):
 
     def __init__ (self) :
         super (PileupReweightingBlock, self).__init__ ()
-        self.campaign=None
-        self.files=None
-        self.useDefaultConfig=False
-        self.userLumicalcFiles=None
-        self.userPileupConfigs=None
+        self.userPileupConfigs=[]
+        self.userLumicalcFiles=[]
+        self.autoConfig=False
 
 
     def makeAlgs (self, config) :
 
-        from Campaigns.Utils import Campaign
-
         try:
             from AthenaCommon.Logging import logging
         except ImportError:
             import logging
-        log = logging.getLogger('makePileupAnalysisSequence')
-
-        # TODO: support per-campaign config
-
-        toolConfigFiles = []
-        toolLumicalcFiles = []
-        campaign = self.campaign
-        if self.files is not None and (campaign is None or campaign is Campaign.Unknown or self.userPileupConfigs is None):
-            if campaign is None or campaign is Campaign.Unknown:
-                from Campaigns.Utils import getMCCampaign
-                campaign = getMCCampaign(self.files)
-                if campaign:
-                    log.info(f'Autoconfiguring PRW with campaign: {campaign}')
-                else:
-                    log.info('Campaign could not be determined.')
-
-            if campaign:
-                if self.userPileupConfigs is None:
-                    from PileupReweighting.AutoconfigurePRW import getConfigurationFiles
-                    toolConfigFiles = getConfigurationFiles(campaign=campaign, files=self.files, useDefaultConfig=self.useDefaultConfig)
-                    log.info('Setting PRW configuration based on input files')
-
-                    if toolConfigFiles:
-                        log.info(f'Using PRW configuration: {", ".join(toolConfigFiles)}')
-                else:
-                    log.info('Using user provided PRW configuration')
-
-        if self.userPileupConfigs is not None:
-            toolConfigFiles = self.userPileupConfigs[:]
-
-        if self.userLumicalcFiles is not None:
-            log.info('Using user-provided lumicalc files')
-            toolLumicalcFiles = self.userLumicalcFiles[:]
+        prwlog = logging.getLogger('makePileupAnalysisSequence')
+
+        muMcFiles = self.userPileupConfigs[:]
+        userLumicalcFiles = self.userLumicalcFiles
+        if self.autoConfig:
+            from PileupReweighting.AutoconfigurePRW import getLumiCalcFiles,getMCMuFiles
+            userLumicalcFiles = getLumiCalcFiles()
+            if len(muMcFiles)==0:
+                muMcFiles = getMCMuFiles()
+            else:
+                prwlog.warning('Sent autoconfig and self.userPileupConfigs='+str(self.userPileupConfigs))
+                prwlog.warning('Ignoring autoconfig and keeping user-specified files')
+
+        if userLumicalcFiles==[]:
+            muDataFiles = ["GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root",
+                           "GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root",
+                           "GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root",
+                           "GoodRunsLists/data18_13TeV/20190708/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root" ]
         else:
-            from PileupReweighting.AutoconfigurePRW import getLumicalcFiles
-            toolLumicalcFiles = getLumicalcFiles(campaign)
+            muDataFiles = userLumicalcFiles[:]
 
         # Set up the only algorithm of the sequence:
         alg = config.createAlgorithm( 'CP::PileupReweightingAlg', 'PileupReweightingAlg' )
         config.addPrivateTool( 'pileupReweightingTool', 'CP::PileupReweightingTool' )
-        alg.pileupReweightingTool.ConfigFiles = toolConfigFiles
-        if not toolConfigFiles and config.dataType() != "data":
-            log.info("No PRW config files provided. Disabling reweighting")
+        alg.pileupReweightingTool.ConfigFiles = muMcFiles
+        if not muMcFiles and config.dataType() != "data":
+            prwlog.info("No PRW config files provided. Disabling reweighting")
             # Setting the weight decoration to the empty string disables the reweighting
             alg.pileupWeightDecoration = ""
-        alg.pileupReweightingTool.LumiCalcFiles = toolLumicalcFiles
+        alg.pileupReweightingTool.LumiCalcFiles = muDataFiles
 
 
 
@@ -123,7 +103,7 @@ class PrimaryVertexBlock (ConfigBlock):
 class PtEtaSelectionBlock (ConfigBlock):
     """the ConfigBlock for a pt-eta selection"""
 
-    def __init__ (self, containerName, *, postfix, minPt, maxEta,
+    def __init__ (self, containerName, postfix, minPt, maxEta,
                   selectionDecoration) :
         super (PtEtaSelectionBlock, self).__init__ ()
         self.containerName = containerName
@@ -160,7 +140,7 @@ class PtEtaSelectionBlock (ConfigBlock):
 class OutputThinningBlock (ConfigBlock):
     """the ConfigBlock for output thinning"""
 
-    def __init__ (self, containerName, *, postfix) :
+    def __init__ (self, containerName, postfix) :
         super (OutputThinningBlock, self).__init__ ()
         self.containerName = containerName
         self.postfix = postfix
@@ -199,7 +179,7 @@ class OutputThinningBlock (ConfigBlock):
 
 
 
-def makePileupReweightingConfig( seq, campaign=None, files=None, useDefaultConfig=False, userLumicalcFiles=None, userPileupConfigs=None ):
+def makePileupReweightingConfig( seq, userPileupConfigs=[], userLumicalcFiles=[] , autoConfig=False ):
     """Create a PRW analysis config
 
     Keyword arguments:
@@ -207,11 +187,9 @@ def makePileupReweightingConfig( seq, campaign=None, files=None, useDefaultConfi
     # TO DO: add explanation of the keyword arguments, left to experts
 
     config = PileupReweightingBlock ()
-    config.campaign = campaign
-    config.files = files
-    config.useDefaultConfig = useDefaultConfig
-    config.userLumicalcFiles = userLumicalcFiles
     config.userPileupConfigs = userPileupConfigs
+    config.userLumicalcFiles = userLumicalcFiles
+    config.autoConfig = autoConfig
     seq.append (config)
 
 
@@ -246,8 +224,8 @@ def makePrimaryVertexConfig( seq ) :
 
 
 def makePtEtaSelectionConfig( seq, containerName,
-                              *, postfix = '', minPt = None, maxEta = None,
-                              selectionDecoration):
+                              selectionDecoration,
+                              postfix = '', minPt = None, maxEta = None):
     """Create a pt-eta kinematic selection config
 
     Keyword arguments:
@@ -269,7 +247,7 @@ def makePtEtaSelectionConfig( seq, containerName,
 
 
 def makeOutputThinningConfig( seq, containerName,
-                              *, postfix = '', selection = None, outputName = None):
+                              postfix = '', selection = None, outputName = None):
     """Create an output thinning config
 
     This will do a consistent selection of output containers (if there
diff --git a/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py b/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py
index adec672333b48eecb6efc8854db9efa6e86e8477..cf95c880cbdd5a1f4e3a7a837dfac68d36ba0e43 100644
--- a/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py
+++ b/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py
@@ -171,7 +171,7 @@ class PhotonWorkingPointConfig (ConfigBlock) :
         alg.particles = config.readName (self.containerName)
         alg.preselection = config.getPreselection (self.containerName, self.selectionName)
         config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration,
-                             bits=(32 if self.recomputeIsEM else 1))
+                             bits=(32 if self.recomputeIsEM else 1), preselection=True)
 
         # Set up the isolation selection algorithm:
         if self.isolationWP != 'NonIso' :
@@ -183,7 +183,7 @@ class PhotonWorkingPointConfig (ConfigBlock) :
             alg.egammas = config.readName (self.containerName)
             alg.preselection = config.getPreselection (self.containerName, self.selectionName)
             config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration,
-                                 bits=1)
+                                 bits=1, preselection=True)
 
         # Set up an algorithm used for decorating baseline photon selection:
         alg = config.createAlgorithm( 'CP::AsgSelectionAlg',
@@ -201,7 +201,7 @@ class PhotonWorkingPointConfig (ConfigBlock) :
             alg.scaleFactorDecoration = 'ph_effSF' + self.postfix + '_%SYS%'
             if config.dataType() == 'afii':
                 alg.efficiencyCorrectionTool.ForceDataType = \
-                    ROOT.PATCore.ParticleDataType.Full  # no AFII ID SFs for now
+                    ROOT.PATCore.ParticleDataType.Fast
             elif config.dataType() == 'mc':
                 alg.efficiencyCorrectionTool.ForceDataType = \
                     ROOT.PATCore.ParticleDataType.Full
diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py
index 8c5e4faeaaf55527301c544110b3a1bc47ce7d98..b7497e72ff7dd2ac4df6944625562568ddce4956 100644
--- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py
+++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py
@@ -30,10 +30,33 @@ class PreJetAnalysisConfig (ConfigBlock) :
         else :
             config.setSourceName (self.containerName, self.jetCollection)
 
+        # Setup the postfix
+        postfix = self.postfix
+        if postfix != '':
+            postfix = "_" + postfix
+
+        # Remove b-tagging calibration from the container name
+        jetCollection = self.jetCollection
+        btIndex = jetCollection.find('_BTagging')
+        if btIndex != -1:
+            jetCollection = jetCollection[:btIndex]
+
+        # interpret the jet collection
+        collection_pattern = re.compile(
+            r"AntiKt(\d+)(EMTopo|EMPFlow|LCTopo|TrackCaloCluster|UFOCSSK)(TrimmedPtFrac5SmallR20|SoftDropBeta100Zcut10)?Jets")
+        match = collection_pattern.match(jetCollection)
+        if not match:
+            raise ValueError(
+                "Jet collection {0} does not match expected pattern!".format(jetCollection) )
+        radius = int(match.group(1) )
+        if radius not in [2, 4, 6, 10]:
+            raise ValueError("Jet collection has an unsupported radius '{0}'!".format(radius) )
+        jetInput = match.group(2)
+
         # Relink original jets in case of b-tagging calibration
-        if self.runOriginalObjectLink :
+        if btIndex != -1:
             alg = config.createAlgorithm( 'CP::AsgOriginalObjectLinkAlg',
-                                          'JetOriginalObjectLinkAlg'+self.postfix )
+                                          'JetOriginalObjectLinkAlg'+postfix )
             alg.baseContainerName = self.jetCollection
             alg.particles = config.readName (self.containerName)
             if config.wantCopy (self.containerName) :
@@ -41,14 +64,32 @@ class PreJetAnalysisConfig (ConfigBlock) :
             alg.preselection = config.getPreselection (self.containerName, '')
 
         # Set up the jet ghost muon association algorithm:
-        if (self.runGhostMuonAssociation is None and not config.isPhyslite()) or \
-           (self.runGhostMuonAssociation is True):
+        if self.runGhostMuonAssociation:
             alg = config.createAlgorithm( 'CP::JetGhostMuonAssociationAlg',
-                                          'JetGhostMuonAssociationAlg'+self.postfix )
+                                          'JetGhostMuonAssociationAlg'+postfix )
             alg.jets = config.readName (self.containerName)
             if config.wantCopy (self.containerName) :
                 alg.jetsOut = config.copyName (self.containerName)
 
+        # IsBtag decoration for Jet Flavour Uncertainties
+        # (https://twiki.cern.ch/twiki/bin/view/AtlasProtected/JetUncertaintiesRel21Summer2018SmallR)
+        if config.dataType() != 'data' and radius < 10:
+            # Step 1: pt and eta selection
+            alg = config.createAlgorithm('CP::AsgSelectionAlg', 'JetIsBtagPtEtaSelectionAlg'+postfix)
+            config.addPrivateTool('selectionTool', 'CP::AsgPtEtaSelectionTool')
+            alg.selectionTool.minPt = 20
+            alg.selectionTool.maxEta = 2.5
+            alg.selectionDecoration = 'kinematicSelectionBtag,as_char'
+            alg.particles = config.readName (self.containerName)
+            # Step 2: truth selection using HadronConeExclTruthLabelID
+            alg = config.createAlgorithm('CP::AsgSelectionAlg', 'JetIsBtagTruthSelectionAlg'+postfix)
+            alg.preselection = 'kinematicSelectionBtag,as_char'
+            config.addPrivateTool('selectionTool', 'CP::AsgIntValueSelectionTool')
+            alg.selectionTool.selectionFlag = 'HadronConeExclTruthLabelID'
+            alg.selectionTool.acceptedValues = [5]
+            alg.selectionDecoration = 'IsBjet,as_char'
+            alg.particles = config.readName (self.containerName)
+
 
 
 
@@ -62,34 +103,31 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
         self.jetCollection = jetCollection
         self.jetInput = jetInput
         self.postfix = postfix
-        if self.postfix != '' and self.postfix[0] != '_' :
-            self.postfix = '_' + self.postfix
-        self.runJvtUpdate = False
-        self.runFJvtUpdate = False
+        self.runJvtUpdate = True
+        self.runFJvtUpdate = True
         self.runJvtSelection = True
-        self.runFJvtSelection = False
+        self.runFJvtSelection = True
         self.runJvtEfficiency = True
-        self.runFJvtEfficiency = False
+        self.runFJvtEfficiency = True
         self.reduction = "Global"
         self.JEROption = "Simple"
+        self.truthJetCollection = 'AntiKt4TruthDressedWZJets'
 
 
     def makeAlgs (self, config) :
 
-        jetCollectionName=self.jetCollection
-        if(self.jetCollection=="AnalysisJets") :
-            jetCollectionName="AntiKt4EMPFlowJets"
-        if(self.jetCollection=="AnalysisLargeRJets") :
-            jetCollectionName="AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets"
+        postfix = self.postfix
+        if postfix != '' and postfix[0] != '_' :
+            postfix = '_' + postfix
 
         if self.jetInput not in ["EMTopo", "EMPFlow"]:
             raise ValueError(
                 "Unsupported input type '{0}' for R=0.4 jets!".format(self.jetInput) )
 
         # Prepare the jet calibration algorithm
-        alg = config.createAlgorithm( 'CP::JetCalibrationAlg', 'JetCalibrationAlg'+self.postfix )
+        alg = config.createAlgorithm( 'CP::JetCalibrationAlg', 'JetCalibrationAlg'+postfix )
         config.addPrivateTool( 'calibrationTool', 'JetCalibrationTool' )
-        alg.calibrationTool.JetCollection = jetCollectionName[:-4]
+        alg.calibrationTool.JetCollection = self.jetCollection[:-4]
         # Get the correct string to use in the config file name
         if config.dataType() == 'afii':
             configFile = "JES_MC16Recommendation_AFII_{0}_Apr2019_Rel21.config"
@@ -107,6 +145,7 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
         alg.calibrationTool.IsData = (config.dataType() == 'data')
         alg.jets = config.readName (self.containerName)
         alg.jetsOut = config.copyName (self.containerName)
+        alg.preselection = config.getPreselection (self.containerName, '')
 
         # Jet uncertainties
         # Prepare the config file
@@ -125,9 +164,9 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
                 "Invalid combination of reduction and JEROption settings: "
                 "reduction: {0}, JEROption: {1}".format(self.reduction, self.JEROption) )
 
-        alg = config.createAlgorithm( 'CP::JetUncertaintiesAlg', 'JetUncertaintiesAlg'+self.postfix )
+        alg = config.createAlgorithm( 'CP::JetUncertaintiesAlg', 'JetUncertaintiesAlg'+postfix )
         config.addPrivateTool( 'uncertaintiesTool', 'JetUncertaintiesTool' )
-        alg.uncertaintiesTool.JetDefinition = jetCollectionName[:-4]
+        alg.uncertaintiesTool.JetDefinition = self.jetCollection[:-4]
         # Add the correct directory on the front
         alg.uncertaintiesTool.ConfigFile = "rel21/Fall2018/"+configFile
         alg.uncertaintiesTool.MCType = "AFII" if config.dataType() == "afii" else "MC16"
@@ -138,26 +177,14 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
 
         # Set up the JVT update algorithm:
         if self.runJvtUpdate :
-            alg = config.createAlgorithm( 'CP::JvtUpdateAlg', 'JvtUpdateAlg'+self.postfix )
+            alg = config.createAlgorithm( 'CP::JvtUpdateAlg', 'JvtUpdateAlg'+postfix )
             config.addPrivateTool( 'jvtTool', 'JetVertexTaggerTool' )
-            alg.jvtTool.JetContainer = self.jetCollection
             alg.jets = config.readName (self.containerName)
             alg.jetsOut = config.copyName (self.containerName)
             alg.preselection = config.getPreselection (self.containerName, '')
 
-        if self.runNNJvtUpdate:
-            assert self.jetInput=="EMPFlow", "NN JVT only defined for PFlow jets"
-            alg = config.createAlgorithm( 'CP::JetDecoratorAlg', 'NNJvtUpdateAlg'+self.postfix )
-            config.addPrivateTool( 'decorator', 'JetPileupTag::JetVertexNNTagger' )
-            # Set this actually to the *output* collection
-            alg.jets = config.readName (self.containerName)
-            alg.jetsOut = config.copyName (self.containerName)
-            alg.decorator.JetContainer = alg.jetsOut.replace ('%SYS%', 'NOSYS')
-            alg.decorator.SuppressInputDependence=True
-            alg.decorator.SuppressOutputDependence=True
-
         if self.runFJvtUpdate :
-            alg = config.createAlgorithm( 'CP::JetModifierAlg', 'JetModifierAlg'+self.postfix )
+            alg = config.createAlgorithm( 'CP::JetModifierAlg', 'JetModifierAlg'+postfix )
             config.addPrivateTool( 'modifierTool', 'JetForwardJvtTool')
             alg.modifierTool.OutputDec = "passFJVT" #Output decoration
             # fJVT WPs depend on the MET WP
@@ -167,12 +194,11 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
             alg.modifierTool.ForwardMaxPt = 120.0e3 #Max Pt to define fwdJets for JVT
             alg.jets = config.readName (self.containerName)
             alg.jetsOut = config.copyName (self.containerName)
-            alg.preselection = config.getPreselection (self.containerName, '')
 
         # Set up the jet efficiency scale factor calculation algorithm
         # Change the truthJetCollection property to AntiKt4TruthWZJets if preferred
         if self.runJvtSelection :
-            alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'JvtEfficiencyAlg'+self.postfix )
+            alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'JvtEfficiencyAlg'+postfix )
             config.addPrivateTool( 'efficiencyTool', 'CP::JetJvtEfficiency' )
             if self.jetInput == 'EMPFlow':
                 alg.efficiencyTool.SFFile = 'JetJvtEfficiency/Moriond2018/JvtSFFile_EMPFlowJets.root'
@@ -181,7 +207,6 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
                 alg.efficiencyTool.SFFile = 'JetJvtEfficiency/Moriond2018/JvtSFFile_EMTopoJets.root'
                 alg.efficiencyTool.MaxPtForJvt = 120e3
             alg.efficiencyTool.WorkingPoint = 'Tight' if self.jetInput == 'EMPFlow' else 'Medium'
-            alg.truthJetCollection = 'AntiKt4TruthDressedWZJets'
             alg.selection = 'jvt_selection'
             alg.scaleFactorDecoration = 'jvt_effSF_%SYS%'
             # Disable scale factor decorations if running on data
@@ -189,6 +214,10 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
             if not self.runJvtEfficiency or config.dataType() == 'data':
                 alg.scaleFactorDecoration = ''
                 alg.truthJetCollection = ''
+            elif self.truthJetCollection is not None:
+                alg.truthJetCollection = self.truthJetCollection
+            else :
+                alg.truthJetCollection = 'AntiKt4TruthDressedWZJets'
             alg.outOfValidity = 2
             alg.outOfValidityDeco = 'no_jvt'
             alg.skipBadEfficiency = 0
@@ -204,7 +233,6 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
                 alg.efficiencyTool.SFFile = 'JetJvtEfficiency/May2020/fJvtSFFile.EMtopo.root'
             alg.efficiencyTool.WorkingPoint = 'Tight'
             alg.efficiencyTool.UseMuSFFormat = True
-            alg.truthJetCollection = 'AntiKt4TruthDressedWZJets'
             alg.dofJVT = True
             alg.fJVTStatus = 'passFJVT,as_char'
             alg.selection = 'fjvt_selection'
@@ -214,6 +242,10 @@ class SmallRJetAnalysisConfig (ConfigBlock) :
             if not self.runFJvtEfficiency or config.dataType() == 'data':
                 alg.scaleFactorDecoration = ''
                 alg.truthJetCollection = ''
+            elif self.truthJetCollection is not None:
+                alg.truthJetCollection = self.truthJetCollection
+            else :
+                alg.truthJetCollection = 'AntiKt4TruthDressedWZJets'
             alg.outOfValidity = 2
             alg.outOfValidityDeco = 'no_fjvt'
             alg.skipBadEfficiency = 0
@@ -437,10 +469,11 @@ def makeJetAnalysisConfig( seq, containerName, jetCollection, postfix = '',
 
 def makeSmallRJetAnalysisConfig( seq, containerName, jetCollection,
                                    jetInput, postfix = '',
-                                   runJvtUpdate = False, runFJvtUpdate = False,
-                                   runJvtSelection = True, runFJvtSelection = False,
-                                   runJvtEfficiency = True, runFJvtEfficiency = False,
-                                   reduction = "Global", JEROption = "Simple"):
+                                   runJvtUpdate = True, runFJvtUpdate = True,
+                                   runJvtSelection = True, runFJvtSelection = True,
+                                   runJvtEfficiency = True, runFJvtEfficiency = True,
+                                   reduction = "Global", JEROption = "Simple",
+                                   truthJetCollection = None):
     """Add algorithms for the R=0.4 jets.
 
       Keyword arguments
@@ -456,6 +489,7 @@ def makeSmallRJetAnalysisConfig( seq, containerName, jetCollection,
         runFJvtEfficiency -- Determines whether or not to calculate the forward JVT efficiency
         reduction -- Which NP reduction scheme should be used (All, Global, Category, Scenario)
         JEROption -- Which variant of the reduction should be used (All, Full, Simple). Note that not all combinations of reduction and JEROption are valid!
+        truthJetCollection -- a custom jet collection to use for truth jets
     """
 
     if jetInput not in ["EMTopo", "EMPFlow"]:
@@ -472,6 +506,8 @@ def makeSmallRJetAnalysisConfig( seq, containerName, jetCollection,
     config.runFJvtEfficiency = runFJvtEfficiency
     config.reduction = reduction
     config.JEROption = JEROption
+    if truthJetCollection is not None :
+        config.truthJetCollection = truthJetCollection
     seq.append (config)
 
 
diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py
index 7df0266191cdbaf0ddfdef042e61d7212435a2af..c9d83f4ca7963b93b19dc6d55a21cd49cb18b061 100644
--- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py
+++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py
@@ -160,7 +160,8 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection,
                                    runJvtUpdate = True, runFJvtUpdate = True,
                                    runJvtSelection = True, runFJvtSelection = True,
                                    runJvtEfficiency = True, runFJvtEfficiency = True,
-                                   reduction = "Global", JEROption = "Simple"):
+                                   reduction = "Global", JEROption = "Simple",
+                                   truthJetCollection = None):
     """Add algorithms for the R=0.4 jets.
 
       Keyword arguments
@@ -177,6 +178,7 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection,
         runFJvtEfficiency -- Determines whether or not to calculate the forward JVT efficiency
         reduction -- Which NP reduction scheme should be used (All, Global, Category, Scenario)
         JEROption -- Which variant of the reduction should be used (All, Full, Simple). Note that not all combinations of reduction and JEROption are valid!
+        truthJetCollection -- a custom jet collection to use for truth jets
     """
     if jetInput not in ["EMTopo", "EMPFlow"]:
         raise ValueError(
@@ -267,6 +269,8 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection,
         if not runJvtEfficiency or dataType == 'data':
             alg.scaleFactorDecoration = ''
             alg.truthJetCollection = ''
+        elif truthJetCollection is not None:
+            alg.truthJetCollection = truthJetCollection
         alg.outOfValidity = 2
         alg.outOfValidityDeco = 'no_jvt'
         alg.skipBadEfficiency = 0
@@ -291,6 +295,8 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection,
         if not runFJvtEfficiency or dataType == 'data':
             alg.scaleFactorDecoration = ''
             alg.truthJetCollection = ''
+        elif truthJetCollection is not None:
+            alg.truthJetCollection = truthJetCollection
         alg.outOfValidity = 2
         alg.outOfValidityDeco = 'no_fjvt'
         alg.skipBadEfficiency = 0
diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py
index bc29348785455995ea7d804e9fc26027ff60fffe..e32314cce39d79d6aed07d4bd80b5961ccf05900 100644
--- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py
+++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py
@@ -15,7 +15,7 @@ class JetJvtAnalysisConfig (ConfigBlock) :
         self.postfix = postfix
         if self.postfix != '' and self.postfix[0] != '_' :
             self.postfix = '_' + self.postfix
-        self.enableFJvt = False
+        self.disableFJvt = False
         self.globalSF = True
         self.runSelection = True
 
@@ -34,7 +34,7 @@ class JetJvtAnalysisConfig (ConfigBlock) :
             alg.scaleFactorOutputDecoration = 'jvt_effSF_%SYS%'
             alg.particles = config.readName (self.containerName)
 
-            if self.enableFJvt:
+            if not self.disableFJvt:
                 alg = config.createAlgorithm( 'CP::AsgEventScaleFactorAlg', 'ForwardJvtEventScaleFactorAlg' )
                 preselection = config.getPreselection (self.containerName, '')
                 alg.preselection = preselection + '&&no_fjvt' if preselection else 'no_fjvt'
@@ -45,27 +45,27 @@ class JetJvtAnalysisConfig (ConfigBlock) :
         if self.runSelection:
             config.addSelection (self.containerName, '', 'jvt_selection',
                                  bits=1, preselection=False)
-            if self.enableFJvt :
+            if not self.disableFJvt :
                 config.addSelection (self.containerName, '', 'fjvt_selection',
                                      bits=1, preselection=False)
 
 
 def makeJetJvtAnalysisConfig( seq, containerName, jetCollection,
                               postfix = '',
-                              enableFJvt = False,
+                              disableFJvt = False,
                               globalSF = True,
                               runSelection = True ):
     """Create a jet JVT analysis algorithm config
 
     Keyword arguments:
       jetCollection -- The jet container to run on
-      enableFJvt -- Whether to enable forward JVT calculations
+      disableFJvt -- Whether to disable forward JVT calculations
       globalSF -- Whether to calculate per event scale factors
       runSelection -- Whether to run selection
     """
 
     config = JetJvtAnalysisConfig (containerName, jetCollection, postfix)
-    config.enableFJvt = enableFJvt
+    config.disableFJvt = disableFJvt
     config.globalSF = globalSF
     config.runSelection = runSelection
 
diff --git a/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py b/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py
index 57a6c6e24df70edd544335bceb01d6bc132ac7ca..b7fe0165b143b4d24de84075be0401f33686d016 100644
--- a/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py
+++ b/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py
@@ -79,12 +79,12 @@ class TauWorkingPointConfig (ConfigBlock) :
 
         # Set up the algorithm selecting taus:
         alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'TauSelectionAlg' + self.postfix )
-        config.addPrivateTool( 'selectionTool', 'TauAnalysisTools::TauSelectionTool' )
-        alg.selectionTool.ConfigPath = inputfile
+        alg.selectionTool = '%s/%s' % \
+            ( selectionTool.getType(), selectionTool.getName() )
         alg.selectionDecoration = 'selected_tau' + self.postfix + ',as_bits'
         alg.particles = config.readName (self.containerName)
         alg.preselection = config.getPreselection (self.containerName, self.selectionName)
-        config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration, bits=6)
+        config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration, bits=6, preselection=True)
 
         # Set up an algorithm used for decorating baseline tau selection:
         alg = config.createAlgorithm( 'CP::AsgSelectionAlg',