diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py
index b1e9de7ee70ad611853bed2f3138ec0b0dd6261e..0eca2567537f52ecd9aade6a4e8441270a1bb209 100644
--- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py
+++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py
@@ -47,7 +47,7 @@ def addOutputCopyAlgorithms (algSeq, postfix, inputContainer, outputContainer, s
         copyalg.selection = ['outputSelect']
     else :
         copyalg.selection = []
-    copyalg.deepCopy = True
+    copyalg.deepCopy = False
     algSeq += copyalg
 
 
@@ -77,8 +77,17 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare) :
     jetSequence = makeJetAnalysisSequence( dataType, jetContainer, enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False )
 
     from FTagAnalysisAlgorithms.FTagAnalysisSequence import makeFTagAnalysisSequence
-    makeFTagAnalysisSequence( jetSequence, dataType, jetContainer, noEfficiency = True, legacyRecommendations = True,
-                              enableCutflow=True )
+    btagger = "DL1r"
+    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 = jetContainer, outputName = 'AnaJets_%SYS%' )
 
@@ -128,6 +137,7 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare) :
     vars += [ 'OutMuons_NOSYS.eta -> mu_eta',
               'OutMuons_NOSYS.phi -> mu_phi',
               'OutMuons_%SYS%.pt  -> mu_pt_%SYS%',
+              'OutMuons_NOSYS.charge -> mu_charge',
               'OutMuons_%SYS%.baselineSelection_medium -> mu_select_medium_%SYS%',
               'OutMuons_%SYS%.baselineSelection_tight  -> mu_select_tight_%SYS%', ]
     if dataType != 'data':
@@ -152,6 +162,7 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare) :
     vars += [ 'OutElectrons_%SYS%.pt  -> el_pt_%SYS%',
               'OutElectrons_NOSYS.phi -> el_phi',
               'OutElectrons_NOSYS.eta -> el_eta',
+              'OutElectrons_NOSYS.charge -> el_charge',
               'OutElectrons_%SYS%.baselineSelection_loose -> el_select_loose_%SYS%', ]
     if dataType != 'data':
         vars += [ 'OutElectrons_%SYS%.effSF_loose_%SYS% -> el_effSF_loose_%SYS%', ]
@@ -184,6 +195,7 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare) :
     vars += [ 'OutTauJets_%SYS%.pt  -> tau_pt_%SYS%',
               'OutTauJets_NOSYS.phi -> tau_phi',
               'OutTauJets_NOSYS.eta -> tau_eta',
+              'OutTauJets_NOSYS.charge -> tau_charge',
               'OutTauJets_%SYS%.baselineSelection_tight -> tau_select_tight_%SYS%', ]
     if dataType != 'data':
         vars += [ 'OutTauJets_%SYS%.tau_effSF_tight_%SYS% -> tau_effSF_tight_%SYS%', ]
@@ -380,7 +392,7 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare) :
     # Include, and then set up the trigger analysis sequence:
     from TriggerAnalysisAlgorithms.TriggerAnalysisSequence import \
         makeTriggerAnalysisSequence
-    triggerSequence = makeTriggerAnalysisSequence( dataType, triggerChains=triggerChains )
+    triggerSequence = makeTriggerAnalysisSequence( dataType, triggerChains=triggerChains, noFilter=True )
     # FIXME: temporarily disabling this for comparisons, as there is no
     # corresponding configuration block.  also, maybe it should be possible
     # to disable filtering in the algorithm, i.e. just store the trigger
@@ -571,13 +583,28 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare) :
 
 
 
-def makeSequence (dataType, useBlocks, forCompare) :
+def makeSequence (dataType, useBlocks, forCompare, noSystematics, hardCuts = False) :
+
+    # do some harder cuts on all object types, this is mostly used for
+    # benchmarking
+    if hardCuts :
+        global electronMinPt
+        electronMinPt = 27e3
+        global photonMinPt
+        photonMinPt = 27e3
+        global muonMinPt
+        muonMinPt = 27e3
+        global tauMinPt
+        tauMinPt = 27e3
+        global jetMinPt
+        jetMinPt = 45e3
 
     algSeq = AlgSequence()
 
     # Set up the systematics loader/handler service:
     sysService = createService( 'CP::SystematicsSvc', 'SystematicsSvc', sequence = algSeq )
-    sysService.sigmaRecommended = 1
+    if not noSystematics :
+        sysService.sigmaRecommended = 1
 
     vars = []
     if not useBlocks :
@@ -589,6 +616,8 @@ def makeSequence (dataType, useBlocks, forCompare) :
     # Add an ntuple dumper algorithm:
     treeMaker = createAlgorithm( 'CP::TreeMakerAlg', 'TreeMaker' )
     treeMaker.TreeName = 'analysis'
+    # the auto-flush setting still needs to be figured out
+    #treeMaker.TreeAutoFlush = 0
     algSeq += treeMaker
     ntupleMaker = createAlgorithm( 'CP::AsgxAODNTupleMakerAlg', 'NTupleMaker' )
     ntupleMaker.TreeName = 'analysis'
diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py
index 7fb3acc3ae27bf3f5df558430c9170cc6f764e1b..65dffdfd2f41bd9c81129310d72f4996801c7a8d 100755
--- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py
+++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py
@@ -15,15 +15,27 @@ parser.add_option( '-d', '--data-type', dest = 'data_type',
 parser.add_option( '-s', '--submission-dir', dest = 'submission_dir',
                    action = 'store', type = 'string', default = 'submitDir',
                    help = 'Submission directory for EventLoop' )
+parser.add_option("--force-input", action = "store", dest = "force_input",
+                  default = None,
+                  help = "Force the given input file")
 parser.add_option( '-u', '--unit-test', dest='unit_test',
                    action = 'store_true', default = False,
                    help = 'Run the job in "unit test mode"' )
 parser.add_option( '--direct-driver', dest='direct_driver',
                    action = 'store_true', default = False,
                    help = 'Run the job with the direct driver' )
+parser.add_option( '--max-events', dest = 'max_events',
+                   action = 'store', type = 'int', default = 500,
+                   help = 'Number of events to run' )
 parser.add_option( '--algorithm-timer', dest='algorithm_timer',
                    action = 'store_true', default = False,
                    help = 'Run the job with a timer for each algorithm' )
+parser.add_option( '--no-systematics', dest='no_systematics',
+                   action = 'store_true', default = False,
+                   help = 'Configure the job to with no systematics' )
+parser.add_option( '--hard-cuts', dest='hard_cuts',
+                   action = 'store_true', default = False,
+                   help = 'Configure the job with harder cuts' )
 parser.add_option( '--block-config', dest='block_config',
                    action = 'store_true', default = False,
                    help = 'Run the job in "unit test mode"' )
@@ -55,28 +67,27 @@ import os
 sh = ROOT.SH.SampleHandler()
 sh.setMetaString( 'nc_tree', 'CollectionTree' )
 sample = ROOT.SH.SampleLocal (dataType)
-if dataType == "data" :
-    sample.add (os.getenv ('ASG_TEST_FILE_DATA'))
-    pass
-if dataType == "mc" :
-    sample.add (os.getenv ('ASG_TEST_FILE_MC'))
-    pass
-if dataType == "afii" :
-    sample.add (os.getenv ('ASG_TEST_FILE_MC_AFII'))
-    pass
+inputfile = {"data": 'ASG_TEST_FILE_DATA',
+             "mc":   'ASG_TEST_FILE_MC',
+             "afii": 'ASG_TEST_FILE_MC_AFII'}
+if options.force_input :
+    sample.add (options.force_input)
+else :
+    sample.add (os.getenv (inputfile[dataType]))
 sh.add (sample)
 sh.printContent()
 
 # Create an EventLoop job.
 job = ROOT.EL.Job()
 job.sampleHandler( sh )
-job.options().setDouble( ROOT.EL.Job.optMaxEvents, 500 )
+if options.max_events > 0:
+    job.options().setDouble( ROOT.EL.Job.optMaxEvents, options.max_events )
 if options.algorithm_timer :
     job.options().setBool( ROOT.EL.Job.optAlgorithmTimer, True )
 
 
 from AnalysisAlgorithmsConfig.FullCPAlgorithmsTest import makeSequence
-algSeq = makeSequence (dataType, blockConfig, forCompare=forCompare)
+algSeq = makeSequence (dataType, blockConfig, forCompare=forCompare, noSystematics = options.no_systematics, hardCuts = options.hard_cuts)
 print( algSeq ) # For debugging
 algSeq.addSelfToJob( job )
 
@@ -86,11 +97,9 @@ job.outputAdd( ROOT.EL.OutputStream( 'ANALYSIS' ) )
 # Find the right output directory:
 submitDir = options.submission_dir
 if options.unit_test:
-    import os
-    import tempfile
-    submitDir = tempfile.mkdtemp( prefix = 'fullCPTest_'+dataType+'_', dir = os.getcwd() )
-    os.rmdir( submitDir )
-    pass
+    job.options().setString (ROOT.EL.Job.optSubmitDirMode, 'unique')
+else :
+    job.options().setString (ROOT.EL.Job.optSubmitDirMode, 'unique-link')
 
 
 # Run the job using the local driver.  This is intentionally the local
diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py
index bf4234ecbabe5651b9fb595903d6fbde9cf738a9..42b67a3938b5fa8b228ee2611f84375703bd7192 100644
--- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py
+++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py
@@ -15,6 +15,9 @@ athArgsParser.add_argument( '--block-config', dest='block_config',
 athArgsParser.add_argument( '--for-compare', dest='for_compare',
                             action = 'store_true', default = False,
                             help = 'Configure the job for comparison of sequences vs blocks' )
+athArgsParser.add_argument( '--no-systematics', dest='no_systematics',
+                            action = 'store_true', default = False,
+                            help = 'Configure the job to with no systematics' )
 athArgs = athArgsParser.parse_args()
 
 dataType = athArgs.data_type
@@ -36,7 +39,7 @@ testFile = os.getenv ( inputfile[dataType] )
 svcMgr.EventSelector.InputCollections = [testFile]
 
 from AnalysisAlgorithmsConfig.FullCPAlgorithmsTest import makeSequence
-algSeq = makeSequence (dataType, blockConfig, forCompare=forCompare)
+algSeq = makeSequence (dataType, blockConfig, forCompare=forCompare, noSystematics = athArgs.no_systematics)
 print (algSeq) # For debugging
 
 # Add all algorithms from the sequence to the job.
diff --git a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigEventSelectorAlg.cxx b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigEventSelectorAlg.cxx
index a66ce3f0369b823e11ba83781d1958bceb1927b3..49340b56eae1b7677d7a66be5346f02237210023 100644
--- a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigEventSelectorAlg.cxx
+++ b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/Root/TrigEventSelectorAlg.cxx
@@ -41,7 +41,7 @@ StatusCode CP::TrigEventSelectionAlg::initialize()
 
 StatusCode CP::TrigEventSelectionAlg::execute()
 {
-  EL::FilterReporter filter (m_filterParams, false);
+  EL::FilterReporter filter (m_filterParams, m_noFilter.value());
 
   if (m_trigList.empty()) {
     filter.setPassed(true);
diff --git a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/TriggerAnalysisAlgorithms/TrigEventSelectionAlg.h b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/TriggerAnalysisAlgorithms/TrigEventSelectionAlg.h
index 8ed2a020d793a81fce07e2f330968b8c9784dc1a..453f1d38730ec0efcb5b31fd3feb960a5ab8bdd1 100644
--- a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/TriggerAnalysisAlgorithms/TrigEventSelectionAlg.h
+++ b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/TriggerAnalysisAlgorithms/TrigEventSelectionAlg.h
@@ -9,6 +9,7 @@
 
 #include <AnaAlgorithm/AnaAlgorithm.h>
 #include <AnaAlgorithm/FilterReporterParams.h>
+#include <AsgTools/PropertyWrapper.h> 
 #include <AsgTools/ToolHandle.h> 
 #include <AthContainers/AuxElement.h>
 #include <TrigDecisionInterface/ITrigDecisionTool.h>
@@ -35,6 +36,9 @@ namespace CP
     /// \brief the decoration for trigger selection
     std::string m_selectionDecoration;
 
+    /// \brief whether to not apply an event filter
+    Gaudi::Property<bool> m_noFilter {this, "noFilter", false, "whether to not apply an event filter"};
+
     /// \brief the accessors for \ref m_selectionDecoration and \ref m_trigList combination
     std::vector<SG::AuxElement::Decorator<bool>> m_selectionAccessors;
 
diff --git a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisSequence.py b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisSequence.py
index 68e6dcfbc0bcacdcb3e35ebe39813ba29e8853be..e36fbca506d4988c5f89c73cae64d632bbd06b69 100644
--- a/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisSequence.py
+++ b/PhysicsAnalysis/Algorithms/TriggerAnalysisAlgorithms/python/TriggerAnalysisSequence.py
@@ -7,13 +7,15 @@ from AnaAlgorithm.DualUseConfig import addPrivateTool, createAlgorithm, createPu
 
 def makeTriggerAnalysisSequence( dataType,
                                  triggerChains = [],
-                                 prescaleLumiCalcFiles = []):
+                                 prescaleLumiCalcFiles = [],
+                                 noFilter = False):
     """Create a basic trigger analysis algorithm sequence
 
     Keyword arguments:
       dataType -- The data type to run on ("data", "mc" or "afii")
       triggerChains -- a list of trigger chains
       prescaleLumiCalcFiles -- a list of lumicalc files to calculate trigger prescales
+      noFilter -- do not apply an event filter (i.e. don't skip any events)
     """
 
     if dataType not in ["data", "mc", "afii"] :
@@ -38,6 +40,7 @@ def makeTriggerAnalysisSequence( dataType,
             ( decisionTool.getType(), decisionTool.getName() )
         alg.triggers = list(triggerChains)
         alg.selectionDecoration = 'trigPassed'
+        alg.noFilter = noFilter
 
         seq.append( alg, inputPropName = None )