diff --git a/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h b/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h
index 5b95de334dcc18163eff80e4bc7772c86f684ba4..856ed1415cbc0d86cb66ac5d5666e98c2d9506dd 100755
--- a/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h
+++ b/Trigger/TrigAlgorithms/TrigTauRec/TrigTauRec/TrigTauRecMerged.h
@@ -22,6 +22,7 @@
 #include "TrigTimeAlgs/TrigTimerSvc.h"
 #include "GaudiKernel/ToolHandle.h"
 #include "tauRecTools/ITauToolBase.h"
+//#include "tauRecTools/TauJetRNNEvaluator.h"
 
 #include "LumiBlockComps/ILuminosityTool.h" 
 #include "BeamSpotConditionsData/BeamSpotData.h"
@@ -205,14 +206,36 @@ class TrigTauRecMerged: public HLT::FexAlgo {
   std::vector<unsigned char> m_calo_errors;
   /** track errors */
   std::vector<unsigned char> m_track_errors;
-  /** author */
-  std::vector<unsigned char> m_author;
 
-  /** deltaZ0 core Trks*/
-  std::vector<float> m_deltaZ0coreTrks;
-
-  /** deltaZ0 wide Trks*/
-  std::vector<float> m_deltaZ0wideTrks;
+  //  RNN ID monitoring
+  // retrieved from tool handle, if tool exists
+  // needs migration of RNN tools to master
+  //TauJetRNNEvaluator* m_rnn_evaluator;
+
+  float m_RNN_scalar_ptRatioEflowApprox; 
+  float m_RNN_scalar_mEflowApprox; 
+  float m_RNN_scalar_pt_jetseed_log;
+
+  int m_RNN_Nclusters;
+  std::vector<double> m_RNN_cluster_et_log;
+  std::vector<double> m_RNN_cluster_dEta;
+  std::vector<double> m_RNN_cluster_dPhi;
+  std::vector<double> m_RNN_cluster_CENTER_LAMBDA;
+  std::vector<double> m_RNN_cluster_SECOND_LAMBDA;
+  std::vector<double> m_RNN_cluster_SECOND_R;
+
+  int m_RNN_Ntracks;
+  std::vector<double> m_RNN_track_pt_log;
+  std::vector<double> m_RNN_track_dEta;
+  std::vector<double> m_RNN_track_dPhi;
+  std::vector<double> m_RNN_track_d0_abs_log;
+  std::vector<double> m_RNN_track_z0sinThetaTJVA_abs_log;
+  std::vector<double> m_RNN_track_nInnermostPixelHits;
+  std::vector<double> m_RNN_track_nPixelHits;
+  std::vector<double> m_RNN_track_nSCTHits;
+
+  float m_RNNJetScore;
+  float m_RNNJetScoreSigTrans;
 
 };
 #endif
diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py
index d9f76cf6859e215e3cada408bfa8964906ba2795..491fc8c3c849a618ec8e4567e22018a83241f9e4 100644
--- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py
+++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauAlgorithmsHolder.py
@@ -124,7 +124,6 @@ def getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='', ca
     
     from tauRecTools.tauRecToolsConf import TauCalibrateLC
     TauCalibrateLC = TauCalibrateLC(name = _name,
-                                    #calibrationFile = "EnergyCalibrationLC2012_retuned.root",
                                     calibrationFile = calibFileName,
                                     doEnergyCorrection = correctEnergy,
                                     doAxisCorrection = correctAxis)
@@ -134,14 +133,46 @@ def getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='', ca
     cached_instances[_name] = TauCalibrateLC                
     return TauCalibrateLC
 
+########################################################################
+# MvaTESVariableDecorator
+def getMvaTESVariableDecorator():
+
+    _name = sPrefix + 'MvaTESVariableDecorator'
+
+    if _name in cached_instances:
+        return cached_instances[_name]
+
+    from AthenaCommon.AppMgr import ToolSvc
+    from tauRecTools.tauRecToolsConf import MvaTESVariableDecorator
+    MvaTESVariableDecorator = MvaTESVariableDecorator(name = _name)
+
+    ToolSvc += MvaTESVariableDecorator
+    cached_instances[_name] = MvaTESVariableDecorator
+    return MvaTESVariableDecorator
+
+########################################################################
+# MvaTESEvaluator
+def getMvaTESEvaluator():
+
+    _name = sPrefix + 'MvaTESEvaluator'
+
+    if _name in cached_instances:
+        return cached_instances[_name]
+
+    from AthenaCommon.AppMgr import ToolSvc
+    from tauRecTools.tauRecToolsConf import MvaTESEvaluator
+    MvaTESEvaluator = MvaTESEvaluator(name = _name,
+                                      WeightFileName = 'OnlineMvaTES_BRT_v1.weights.root')
+
+    ToolSvc += MvaTESEvaluator
+    cached_instances[_name] = MvaTESEvaluator
+    return MvaTESEvaluator
+
 ########################################################################
 # Tau cell variables calculation
-def getCellVariables(cellConeSize=0.2, prefix=''):
-    #if prefix is not given, take global one 
-    if not prefix: 
-        prefix=sPrefix 
+def getCellVariables(cellConeSize=0.2):
  
-    _name = prefix + 'CellVariables'
+    _name = sPrefix + 'CellVariables'
     
     if _name in cached_instances:
         return cached_instances[_name]
@@ -676,10 +707,11 @@ def getTrackToVertexTool():
 ########################################################################
 # Tau-Track Association
 def getTauTrackFinder(applyZ0cut=False, maxDeltaZ0=2, noSelector = False, prefix=''):
-    #if prefix is not given, take global one
-    if not prefix:
-        prefix=sPrefix
-    _name = sPrefix + 'TauTrackFinder'
+
+    #if prefix is not given, take global one 
+    if not prefix: 
+        prefix=sPrefix 
+    _name = prefix + 'TauTrackFinder'
     
     if _name in cached_instances:
         return cached_instances[_name] 
@@ -720,7 +752,144 @@ def getTauGenericPi0Cone():
     cached_instances[_name] = TauGenericPi0Cone
     return TauGenericPi0Cone
 
-#end
+########################################################################
+# TauTrackClassifier
+def getTauTrackClassifier():
+
+    _name = sPrefix + 'TauTrackClassifier'
+
+    if _name in cached_instances:
+        return cached_instances[_name]
+    
+    from AthenaCommon.AppMgr import ToolSvc
+    from tauRecTools.tauRecToolsConf import tauRecTools__TauTrackClassifier as TauTrackClassifier
+    from tauRecTools.tauRecToolsConf import tauRecTools__TrackMVABDT as TrackMVABDT
+
+    import PyUtils.RootUtils as ru
+    ROOT = ru.import_root()
+    import cppyy
+    cppyy.loadDictionary('xAODTau_cDict')
+
+    input_file_name = 'EFtracks_BDT_classifier_v0.root'
+    calibrationFolder = 'TrigTauRec/00-11-02/'
+    BDTcut = 0.45
+    deltaZ0 = 1.0
+
+    # =========================================================================
+    EFtrackBDT = TrackMVABDT(
+        name = _name + "_MVABDT",
+        InputWeightsPath = input_file_name,
+        Threshold        = BDTcut,
+        DeltaZ0          = deltaZ0,
+        ExpectedFlag     = ROOT.xAOD.TauJetParameters.unclassified, 
+        inTrigger        = True,
+        calibFolder      = calibrationFolder        
+    )
+
+    ToolSvc += EFtrackBDT
+
+    classifier = TauTrackClassifier(
+        name=_name, 
+        Classifiers=[EFtrackBDT]
+    )
+
+    cached_instances[_name] = classifier
+    return classifier
+
+########################################################################
+# TauIDVarCalculator
+def getTauIDVarCalculator():
+
+    _name = sPrefix + 'TauIDVarCalculator'
+
+    if _name in cached_instances:
+        return cached_instances[_name]
+    
+    from AthenaCommon.AppMgr import ToolSvc
+    from tauRecTools.tauRecToolsConf import TauIDVarCalculator            
+    TauIDVarCalculator = TauIDVarCalculator(name=_name)
+    
+    ToolSvc += TauIDVarCalculator                                 
+    cached_instances[_name] = TauIDVarCalculator
+    return TauIDVarCalculator
+
+########################################################################
+# TauJetRNNEvaluator
+def getTauJetRNNEvaluator(NetworkFile0P="", NetworkFile1P="", NetworkFile3P="", OutputVarname="RNNJetScore", 
+                          MaxTracks=10, MaxClusters=6, MaxClusterDR=1.0, 
+                          InputLayerScalar="scalar", InputLayerTracks="tracks", InputLayerClusters="clusters", 
+                          OutputLayer="rnnid_output", OutputNode="sig_prob"):
+
+    _name = sPrefix + 'TauJetRNNEvaluator'
+
+    if _name in cached_instances:
+        return cached_instances[_name]
+
+    from AthenaCommon.AppMgr import ToolSvc
+    from tauRecTools.tauRecToolsConf import TauJetRNNEvaluator
+    TauJetRNNEvaluator = TauJetRNNEvaluator(name=_name,
+                                      NetworkFile0P=NetworkFile0P,
+                                      NetworkFile1P=NetworkFile1P,
+                                      NetworkFile3P=NetworkFile3P,
+                                      OutputVarname=OutputVarname,
+                                      MaxTracks=MaxTracks,
+                                      MaxClusters=MaxClusters,
+                                      MaxClusterDR=MaxClusterDR,
+                                      InputLayerScalar=InputLayerScalar,
+                                      InputLayerTracks=InputLayerTracks,
+                                      InputLayerClusters=InputLayerClusters,
+                                      OutputLayer=OutputLayer,
+                                      OutputNode=OutputNode)
+
+    ToolSvc += TauJetRNNEvaluator
+    cached_instances[_name] = TauJetRNNEvaluator
+    return TauJetRNNEvaluator
+
+########################################################################
+# TauWPDecoratorJetRNN
+def getTauWPDecoratorJetRNN():
+
+    _name = sPrefix + 'TauWPDecoratorJetRNN'
+
+    if _name in cached_instances:
+        return cached_instances[_name]
+
+    import PyUtils.RootUtils as ru
+    ROOT = ru.import_root()
+    import cppyy
+    cppyy.loadDictionary('xAODTau_cDict')
+
+    from AthenaCommon.AppMgr import ToolSvc
+    from tauRecTools.tauRecToolsConf import TauWPDecorator
+    TauWPDecorator = TauWPDecorator( name=_name,
+                                     flatteningFile0Prong = "rnnid_flat_0p_v4.root",
+                                     flatteningFile1Prong = "rnnid_flat_1p_v4.root",
+                                     flatteningFile3Prong = "rnnid_flat_mp_v4.root",
+                                     CutEnumVals =
+                                     [ ROOT.xAOD.TauJetParameters.JetRNNSigVeryLoose, ROOT.xAOD.TauJetParameters.JetRNNSigLoose,
+                                       ROOT.xAOD.TauJetParameters.JetRNNSigMedium, ROOT.xAOD.TauJetParameters.JetRNNSigTight ],
+                                     SigEff0P = [0.98, 0.90, 0.65, 0.50],
+                                     SigEff1P = [0.992, 0.99, 0.965, 0.94],
+                                     SigEff3P = [0.99, 0.98, 0.865, 0.80],
+                                     ScoreName = "RNNJetScore",
+                                     NewScoreName = "RNNJetScoreSigTrans",
+                                     DefineWPs = True,
+                                 )
+
+    ToolSvc += TauWPDecorator
+    cached_instances[_name] = TauWPDecorator
+    return TauWPDecorator
+
+# target efficiencies used for 2017 BDT:
+# SigEff1P = [0.995, 0.99, 0.97, 0.90],
+# SigEff3P = [0.995, 0.94, 0.88, 0.78],
+
+
+
+# end
+
+
+
 
 """ obsolete methods
 
diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py
index b448439d97e4de8fcaec067b87970abb24ed78a8..0b6c7b4fa94a7e52e680b29c684d8a61cdd83364 100644
--- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py
+++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 
 """ TrigTauRec """
@@ -56,7 +56,7 @@ class TrigTauRecMerged_Tau (TrigTauRecMerged) :
 	    
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 	    
 	    
@@ -91,17 +91,17 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMerged) :
             import TrigTauRec.TrigTauAlgorithmsHolder as taualgs
             tools = []
 
-            taualgs.setPrefix("TrigTau_")
+            taualgs.setPrefix("TrigTau2012_")
 
             #what should run in trigger???
             #same as tauRec (but without Pi0 cluster finder)
             tools.append(taualgs.getJetSeedBuilder())
             tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default
             tools.append(taualgs.getTauAxis())
-            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTau2012_"))
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2))
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
 
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTau2012_"))  #cellConeSize 0.2!!
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))  #cellConeSize 0.2!!
 
             #tools.append(taualgs.getElectronVetoVars())  #needed?
             tools.append(taualgs.getTauVertexVariables())
@@ -111,7 +111,7 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMerged) :
             
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -126,6 +126,7 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMerged) :
 
 
 class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) :
+
         __slots__ = [ '_mytools']
         def __init__(self, name = "TrigTauRecMerged_TauPreselection"):
             super( TrigTauRecMerged_TauPreselection , self ).__init__( name )
@@ -158,15 +159,12 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) :
             tools.append(taualgs.getTauAxis())
             # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here
             # Insert bypass later?
-            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845)
-            if TriggerFlags.run2Config == '2016':
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPreselection_", noSelector=False))
-            else:
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPreselection_", noSelector=False))
+            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845)
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, noSelector=False))
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPreselection_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
             # tools.append(taualgs.getElectronVetoVars())
             # Variables combining tracking and calorimeter information
             tools.append(taualgs.getTauCommonCalcVars())
@@ -178,7 +176,7 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) :
 
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -190,8 +188,8 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMerged) :
             ## add beam type flag
             from AthenaCommon.BeamFlags import jobproperties
             self.BeamType = jobproperties.Beam.beamType()
-            
-            
+
+
 class TrigTauRecMerged_TauFTK (TrigTauRecMerged) :
         __slots__ = [ '_mytools']
         def __init__(self, name = "TrigTauRecMerged_TauFTK"):
@@ -226,11 +224,11 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMerged) :
             tools.append(taualgs.getTauAxis())
             # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here
             # Insert bypass later?
-            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauFTK_", noSelector = False))
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, noSelector = False))
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauFTK_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
             # tools.append(taualgs.getElectronVetoVars())
             # Variables combining tracking and calorimeter information
             tools.append(taualgs.getTauCommonCalcVars())
@@ -242,7 +240,7 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMerged) :
 
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -287,11 +285,59 @@ class TrigTauRecMerged_TauCaloOnly (TrigTauRecMerged) :
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauCaloOnly_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
 
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
+                pass
+
+            self.Tools = tools
+
+            ## add beam type flag
+            from AthenaCommon.BeamFlags import jobproperties
+            self.BeamType = jobproperties.Beam.beamType()
+
+class TrigTauRecMerged_TauCaloOnlyMVA (TrigTauRecMerged) :
+        __slots__ = [ '_mytools']
+        def __init__(self, name = "TrigTauRecMerged_TauCaloOnlyMVA"):
+            super( TrigTauRecMerged_TauCaloOnlyMVA , self ).__init__( name )
+            self._mytools = []
+
+            # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = []
+            from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring
+            validation = TrigTauRecValidationMonitoring()
+            online     = TrigTauRecOnlineMonitoring()
+
+            from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
+            time = TrigTimeHistToolConfig("Time")
+            self.AthenaMonTools = [ time, validation, online ]
+
+            import TrigTauRec.TrigTauAlgorithmsHolder as taualgs
+            tools = []
+
+            taualgs.setPrefix("TrigTauCaloOnlyMVA_")
+
+            # Collection name - not stored
+            self.OutputCollection = "TrigTauRecCaloOnly"
+
+            # Only include tools needed for calo pre-selection
+
+            # Set seedcalo energy scale (Full RoI)
+            tools.append(taualgs.getJetSeedBuilder())
+            # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger)
+            tools.append(taualgs.getTauAxis())
+            # Calibrate to TES
+            tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True))
+            # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
+            # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt()
+            tools.append(taualgs.getMvaTESVariableDecorator())
+            tools.append(taualgs.getMvaTESEvaluator())
+
+            for tool in tools:
+                tool.inTrigger = True
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -332,15 +378,12 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMerged) :
             tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default
             # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger)       
             tools.append(taualgs.getTauAxis())
-            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845)
-            if TriggerFlags.run2Config == '2016':
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPrecision_"))
-            else:
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPrecision_"))
+            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845)
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1))
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPrecision_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
             # tools.append(taualgs.getElectronVetoVars())
             # Lifetime variables
             tools.append(taualgs.getTauVertexVariables())
@@ -353,7 +396,7 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMerged) :
             
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -361,5 +404,101 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMerged) :
             ## add beam type flag
             from AthenaCommon.BeamFlags import jobproperties
             self.BeamType = jobproperties.Beam.beamType()
+
+
+
+class TrigTauRecMerged_TauPrecisionMVA (TrigTauRecMerged) :
+        __slots__ = [ '_mytools']
+
+        def __init__(self, name = "TrigTauRecMerged_TauPrecisionMVA", doMVATES=False, doTrackBDT=False, doRNN=False):
+        
+            super( TrigTauRecMerged_TauPrecisionMVA , self ).__init__( name )
+
+            self._mytools = []
+
+            # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = []
+            from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring 
+            validation = TrigTauRecValidationMonitoring()        
+            online     = TrigTauRecOnlineMonitoring()
+            
+            from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
+            time = TrigTimeHistToolConfig("Time")
+            self.AthenaMonTools = [ time, validation, online ]
+
+            import TrigTauRec.TrigTauAlgorithmsHolder as taualgs
+            tools = []
+
+            # using same prefix as in TauPrecision sequence should be safe if tools with different configurations have different names
+            # e.g. TauTrackFinder in 2016 using dz0=2mm instead of 1mm in 2017
+            taualgs.setPrefix("TrigTau_")
+
+            # Collection name
+            self.OutputCollection = "TrigTauRecMerged"
+
+            # Include full set of tools
+
+            # Set seedcalo energy scale (Full RoI)
+            tools.append(taualgs.getJetSeedBuilder())
+            # Associate RoI vertex or Beamspot to tau - don't use TJVA
+            tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default
+            # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger)       
+            tools.append(taualgs.getTauAxis())
+            
+            # for now, use 'doMVATES=False' to detect tracktwoEF, instead of introducing new flag
+            if not doMVATES:
+                # Count tracks with deltaZ0 cut of 1mm for tracktwoEF           
+                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1))
+            else:
+                # tightened to 0.75 mm for tracktwoMVA (until the track BDT can be used)
+                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=0.75, prefix='TrigTauTightDZ_'))            
+
+            if doTrackBDT:                
+                # BDT track classification
+                tools.append(taualgs.getTauTrackClassifier())
+
+            # Calibrate to calo TES
+            tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
+
+            if doMVATES:
+                # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt()
+                tools.append(taualgs.getMvaTESVariableDecorator())
+                tools.append(taualgs.getMvaTESEvaluator())
+
+            # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
+            # tools.append(taualgs.getElectronVetoVars())
+            # Lifetime variables
+            tools.append(taualgs.getTauVertexVariables())
+            # Variables combining tracking and calorimeter information
+            tools.append(taualgs.getTauCommonCalcVars())
+            # Cluster-based sub-structure, with dRMax also
+            tools.append(taualgs.getTauSubstructure())
+            # tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=False, correctAxis=True, postfix='_onlyAxis'))
+            tools.append(taualgs.getPileUpCorrection())
+
+            if doRNN:
+                # RNN tau ID
+                tools.append(taualgs.getTauJetRNNEvaluator(NetworkFile0P="rnnid_config_0p_v3.json",
+                                                           NetworkFile1P="rnnid_config_1p_v3.json",
+                                                           NetworkFile3P="rnnid_config_mp_v3.json",
+                                                           MaxTracks=10, 
+                                                           MaxClusters=6,
+                                                           MaxClusterDR=1.0))
+                # flattened RNN score and WP
+                tools.append(taualgs.getTauWPDecoratorJetRNN())
+
+
+            for tool in tools:
+                tool.inTrigger = True
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
+                pass
+
+            self.Tools = tools
+
+            ## add beam type flag
+            from AthenaCommon.BeamFlags import jobproperties
+            self.BeamType = jobproperties.Beam.beamType()
+
+
             
 #end
diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py
index fa826a5d182109a09dcefa3eebec679a65b6d5b3..ea725c603d1b6b886a82f6563d4bda994dc57f13 100644
--- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py
+++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecConfigMT.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 
 """ TrigTauRec """
@@ -56,7 +56,7 @@ class TrigTauRecMerged_Tau (TrigTauRecMergedMT) :
 	    
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 	    
 	    
@@ -91,17 +91,17 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMergedMT) :
             import TrigTauRec.TrigTauAlgorithmsHolder as taualgs
             tools = []
 
-            taualgs.setPrefix("TrigTau_")
+            taualgs.setPrefix("TrigTau2012_")
 
             #what should run in trigger???
             #same as tauRec (but without Pi0 cluster finder)
             tools.append(taualgs.getJetSeedBuilder())
             tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default
             tools.append(taualgs.getTauAxis())
-            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTau2012_"))
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2))
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
 
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTau2012_"))  #cellConeSize 0.2!!
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))  #cellConeSize 0.2!!
 
             #tools.append(taualgs.getElectronVetoVars())  #needed?
             tools.append(taualgs.getTauVertexVariables())
@@ -111,7 +111,7 @@ class TrigTauRecMerged_Tau2012 (TrigTauRecMergedMT) :
             
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -158,15 +158,12 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMergedMT) :
             tools.append(taualgs.getTauAxis())
             # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here
             # Insert bypass later?
-            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845)
-            if TriggerFlags.run2Config == '2016':
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPreselection_", noSelector=False))
-            else:
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPreselection_", noSelector=False))
+            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845)
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, noSelector=False))
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPreselection_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
             # tools.append(taualgs.getElectronVetoVars())
             # Variables combining tracking and calorimeter information
             tools.append(taualgs.getTauCommonCalcVars())
@@ -178,7 +175,7 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMergedMT) :
 
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -190,8 +187,8 @@ class TrigTauRecMerged_TauPreselection (TrigTauRecMergedMT) :
             ## add beam type flag
             from AthenaCommon.BeamFlags import jobproperties
             self.BeamType = jobproperties.Beam.beamType()
-            
-            
+
+
 class TrigTauRecMerged_TauFTK (TrigTauRecMergedMT) :
         __slots__ = [ '_mytools']
         def __init__(self, name = "TrigTauRecMerged_TauFTK"):
@@ -226,11 +223,11 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMergedMT) :
             tools.append(taualgs.getTauAxis())
             # Count tracks with deltaZ0 cut of 2mm -> Need to remove quality criteria for fast-tracks here
             # Insert bypass later?
-            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauFTK_", noSelector = False))
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, noSelector = False))
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauFTK_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
             # tools.append(taualgs.getElectronVetoVars())
             # Variables combining tracking and calorimeter information
             tools.append(taualgs.getTauCommonCalcVars())
@@ -242,7 +239,7 @@ class TrigTauRecMerged_TauFTK (TrigTauRecMergedMT) :
 
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -262,12 +259,13 @@ class TrigTauRecMerged_TauCaloOnly (TrigTauRecMergedMT) :
             self._mytools = []
             
             # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = []
-            from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring 
-            validation = TrigTauRecValidationMonitoring()        
-            online     = TrigTauRecOnlineMonitoring()
-                
-            from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
-            time = TrigTimeHistToolConfig("Time")
+            # not used for now?
+            #from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring 
+            #validation = TrigTauRecValidationMonitoring()        
+            #online     = TrigTauRecOnlineMonitoring()
+            
+            #from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
+            #time = TrigTimeHistToolConfig("Time")
             #self.AthenaMonTools = [ time, validation, online ]
 
             import TrigTauRec.TrigTauAlgorithmsHolder as taualgs
@@ -287,11 +285,59 @@ class TrigTauRecMerged_TauCaloOnly (TrigTauRecMergedMT) :
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauCaloOnly_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
+
+            for tool in tools:
+                tool.inTrigger = True
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
+                pass
+
+            self.Tools = tools
+
+            ## add beam type flag
+            from AthenaCommon.BeamFlags import jobproperties
+            self.BeamType = jobproperties.Beam.beamType()
+
+class TrigTauRecMerged_TauCaloOnlyMVA (TrigTauRecMergedMT) :
+        __slots__ = [ '_mytools']
+        def __init__(self, name = "TrigTauRecMerged_TauCaloOnlyMVA"):
+            super( TrigTauRecMerged_TauCaloOnlyMVA , self ).__init__( name )
+            self._mytools = []
+
+            # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = []
+            from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring
+            validation = TrigTauRecValidationMonitoring()
+            online     = TrigTauRecOnlineMonitoring()
+
+            from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
+            time = TrigTimeHistToolConfig("Time")
+            self.AthenaMonTools = [ time, validation, online ]
+
+            import TrigTauRec.TrigTauAlgorithmsHolder as taualgs
+            tools = []
+
+            taualgs.setPrefix("TrigTauCaloOnlyMVA_")
+
+            # Collection name - not stored
+            self.OutputCollection = "TrigTauRecCaloOnly"
+
+            # Only include tools needed for calo pre-selection
+
+            # Set seedcalo energy scale (Full RoI)
+            tools.append(taualgs.getJetSeedBuilder())
+            # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger)
+            tools.append(taualgs.getTauAxis())
+            # Calibrate to TES
+            tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy', caloOnly=True))
+            # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
+            # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt()
+            tools.append(taualgs.getMvaTESVariableDecorator())
+            tools.append(taualgs.getMvaTESEvaluator())
 
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -332,15 +378,12 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMergedMT) :
             tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default
             # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger)       
             tools.append(taualgs.getTauAxis())
-            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017 (see ATR-15845)
-            if TriggerFlags.run2Config == '2016':
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=2, prefix="TrigTauPrecision_"))
-            else:
-                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1, prefix="TrigTauPrecision_"))
+            # Count tracks with deltaZ0 cut of 2mm for 2016 and 1mm for 2017-2018 (see ATR-15845)
+            tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1))
             # Calibrate to TES
             tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
             # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
-            tools.append(taualgs.getCellVariables(cellConeSize=0.2, prefix="TrigTauPrecision_"))
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
             # tools.append(taualgs.getElectronVetoVars())
             # Lifetime variables
             tools.append(taualgs.getTauVertexVariables())
@@ -353,7 +396,7 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMergedMT) :
             
             for tool in tools:
                 tool.inTrigger = True
-                tool.calibFolder = 'TrigTauRec/00-11-01/'
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
                 pass
 
             self.Tools = tools
@@ -361,5 +404,101 @@ class TrigTauRecMerged_TauPrecision (TrigTauRecMergedMT) :
             ## add beam type flag
             from AthenaCommon.BeamFlags import jobproperties
             self.BeamType = jobproperties.Beam.beamType()
+
+
+
+class TrigTauRecMerged_TauPrecisionMVA (TrigTauRecMergedMT) :
+        __slots__ = [ '_mytools']
+
+        def __init__(self, name = "TrigTauRecMerged_TauPrecisionMVA", doMVATES=False, doTrackBDT=False, doRNN=False):
+        
+            super( TrigTauRecMerged_TauPrecisionMVA , self ).__init__( name )
+
+            self._mytools = []
+
+            # monitoring part. To switch off do in topOption TriggerFlags.enableMonitoring = []
+            from TrigTauRec.TrigTauRecMonitoring import TrigTauRecValidationMonitoring, TrigTauRecOnlineMonitoring 
+            validation = TrigTauRecValidationMonitoring()        
+            online     = TrigTauRecOnlineMonitoring()
+            
+            from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
+            time = TrigTimeHistToolConfig("Time")
+            self.AthenaMonTools = [ time, validation, online ]
+
+            import TrigTauRec.TrigTauAlgorithmsHolder as taualgs
+            tools = []
+
+            # using same prefix as in TauPrecision sequence should be safe if tools with different configurations have different names
+            # e.g. TauTrackFinder in 2016 using dz0=2mm instead of 1mm in 2017
+            taualgs.setPrefix("TrigTau_")
+
+            # Collection name
+            self.OutputCollection = "TrigTauRecMerged"
+
+            # Include full set of tools
+
+            # Set seedcalo energy scale (Full RoI)
+            tools.append(taualgs.getJetSeedBuilder())
+            # Associate RoI vertex or Beamspot to tau - don't use TJVA
+            tools.append(taualgs.getTauVertexFinder(doUseTJVA=False)) #don't use TJVA by default
+            # Set LC energy scale (0.2 cone) and intermediate axis (corrected for vertex: useless at trigger)       
+            tools.append(taualgs.getTauAxis())
+            
+            # for now, use 'doMVATES=False' to detect tracktwoEF, instead of introducing new flag
+            if not doMVATES:
+                # Count tracks with deltaZ0 cut of 1mm for tracktwoEF           
+                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=1))
+            else:
+                # tightened to 0.75 mm for tracktwoMVA (until the track BDT can be used)
+                tools.append(taualgs.getTauTrackFinder(applyZ0cut=True, maxDeltaZ0=0.75, prefix='TrigTauTightDZ_'))            
+
+            if doTrackBDT:                
+                # BDT track classification
+                tools.append(taualgs.getTauTrackClassifier())
+
+            # Calibrate to calo TES
+            tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=True, correctAxis=False, postfix='_onlyEnergy'))
+
+            if doMVATES:
+                # Compute MVA TES (ATR-17649), stores MVA TES as default tau pt()
+                tools.append(taualgs.getMvaTESVariableDecorator())
+                tools.append(taualgs.getMvaTESEvaluator())
+
+            # Calculate cell-based quantities: strip variables, EM and Had energies/radii, centFrac, isolFrac and ring energies
+            tools.append(taualgs.getCellVariables(cellConeSize=0.2))
+            # tools.append(taualgs.getElectronVetoVars())
+            # Lifetime variables
+            tools.append(taualgs.getTauVertexVariables())
+            # Variables combining tracking and calorimeter information
+            tools.append(taualgs.getTauCommonCalcVars())
+            # Cluster-based sub-structure, with dRMax also
+            tools.append(taualgs.getTauSubstructure())
+            # tools.append(taualgs.getEnergyCalibrationLC(correctEnergy=False, correctAxis=True, postfix='_onlyAxis'))
+            tools.append(taualgs.getPileUpCorrection())
+
+            if doRNN:
+                # RNN tau ID
+                tools.append(taualgs.getTauJetRNNEvaluator(NetworkFile0P="rnnid_config_0p_v3.json",
+                                                           NetworkFile1P="rnnid_config_1p_v3.json",
+                                                           NetworkFile3P="rnnid_config_mp_v3.json",
+                                                           MaxTracks=10, 
+                                                           MaxClusters=6,
+                                                           MaxClusterDR=1.0))
+                # flattened RNN score and WP
+                tools.append(taualgs.getTauWPDecoratorJetRNN())
+
+
+            for tool in tools:
+                tool.inTrigger = True
+                tool.calibFolder = 'TrigTauRec/00-11-02/'
+                pass
+
+            self.Tools = tools
+
+            ## add beam type flag
+            from AthenaCommon.BeamFlags import jobproperties
+            self.BeamType = jobproperties.Beam.beamType()
+
+
             
 #end
diff --git a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py
index e23ecb7b552ee92d29ade7852f97fdf9d64fb34c..051a99cd356890f5ca7572ab5da7ffa38abecf36 100644
--- a/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py
+++ b/Trigger/TrigAlgorithms/TrigTauRec/python/TrigTauRecMonitoring.py
@@ -7,8 +7,6 @@ errorcalolabels = 'NoROIDescr:NoCellCont:EmptyCellCont:NoClustCont:NoClustKey:Em
 
 errortracklabels = 'NoTrkCont:NoVtxCont'
 
-authorlabels = 'AutauRec:Autau13p:AuBoth:AutauRecOnly:Autau13pOnly'
-                    
 class TrigTauRecOnlineMonitoring(TrigGenericMonitoringToolConfig):
     def __init__ (self, name="TrigTauRecOnlineMonitoring"):
         super(TrigTauRecOnlineMonitoring, self).__init__(name)
@@ -61,8 +59,8 @@ class TrigTauRecOnlineMonitoring(TrigGenericMonitoringToolConfig):
         self.Histograms += [ defineHistogram('EF_innerTrkAvgDist', type='TH1F', title=" EF inner track average distance; innerTrkAvgDist; nRoIs", xbins=40, xmin=-0.05, xmax=0.5) ]
         self.Histograms += [ defineHistogram('EF_SumPtTrkFrac', type='TH1F', title=" EF Sum Pt Track Fraction; SumPtTrkFrac; nRoIs", xbins=40, xmin=-0.5, xmax=1.1) ]
  
-        self.Histograms += [ defineHistogram('EF_ActualInteractions', type='TH1F', title=" Number of actual interaction per bunch crossing;ActualInteractions;nevents", xbins=50, xmin=0.0, xmax=50.) ]
-        self.Histograms += [ defineHistogram('EF_AvgInteractions', type='TH1F', title=" Number of average interaction per bunch crossing;AvgInteractions;nevents", xbins=50, xmin=0.0, xmax=50.) ]
+        self.Histograms += [ defineHistogram('EF_ActualInteractions', type='TH1F', title=" Number of actual interaction per bunch crossing;ActualInteractions;nevents", xbins=80, xmin=0.0, xmax=80.) ]
+        self.Histograms += [ defineHistogram('EF_AvgInteractions', type='TH1F', title=" Number of average interaction per bunch crossing;AvgInteractions;nevents", xbins=80, xmin=0.0, xmax=80.) ]
 
         self.Histograms += [ defineHistogram('EF_beamspot_x', type='TH1F', title=" Beamspot position;Beamspot x;nevents", xbins=50, xmin=-10.0, xmax=10.) ]
         self.Histograms += [ defineHistogram('EF_beamspot_y', type='TH1F', title=" Beamspot position;Beamspot y;nevents", xbins=50, xmin=-10.0, xmax=10.) ]
@@ -71,11 +69,33 @@ class TrigTauRecOnlineMonitoring(TrigGenericMonitoringToolConfig):
 
         self.Histograms += [ defineHistogram('EF_calo_errors', type='TH1F', title=" EF Calo Errors ;  ; nRoIs", xbins=10, xmin=-0.5, xmax=9.5 , labels=errorcalolabels) ]
         self.Histograms += [ defineHistogram('EF_track_errors', type='TH1F', title=" EF Track Errors ;  ; nRoIs", xbins=2, xmin=-0.5, xmax=2.5 , labels=errortracklabels) ]
-        self.Histograms += [ defineHistogram('EF_author', type='TH1F', title=" EF author ;  ; nRoIs", xbins=5, xmin=0.5, xmax=5.5 , labels=authorlabels) ]
-        self.Histograms += [ defineHistogram('EF_deltaZ0coreTrks', type='TH1F', title=" EF delta Z0 coreTrks wrt leadTrk ; #Delta Z0 [mm]; nRoIs x nTracks", xbins=160, xmin=-20, xmax=20) ]
-        self.Histograms += [ defineHistogram('EF_deltaZ0wideTrks', type='TH1F', title=" EF delta Z0 wideTrks wrt leadTrk ; #Delta Z0 [mm]; nRoIs x nTracks", xbins=160, xmin=-20, xmax=20) ]  
 
-        
+        # RNN ID
+        # scalar inputs
+        self.Histograms += [ defineHistogram('EF_RNN_scalar_ptRatioEflowApprox', type='TH1F', title=" EF RNN scalar ptRatioEflowApprox; min(ptRatioEflowApprox 4.)", xbins=50, xmin=0., xmax=4.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_scalar_mEflowApprox', type='TH1F', title=" EF RNN scalar mEflowApprox; Log10(max(mEflowApprox 140.)", xbins=50, xmin=0., xmax=5.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_scalar_pt_jetseed_log', type='TH1F', title=" EF RNN scalar pt_jetseed_log; Log10(tau.ptJetSeed)", xbins=50, xmin=3.5, xmax=7.) ]
+        # cluster inputs
+        self.Histograms += [ defineHistogram('EF_RNN_Nclusters', type='TH1F', title=" EF RNN Nclusters; Number of clusters", xbins=10, xmin=0., xmax=10.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_cluster_et_log', type='TH1F', title=" EF RNN cluster et_log; Log10(cluster E_{T})", xbins=50, xmin=1., xmax=7.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_cluster_dEta', type='TH1F', title=" EF RNN cluster dEta; #Delta#eta(cluster tau)", xbins=50, xmin=-0.5, xmax=0.5) ]
+        self.Histograms += [ defineHistogram('EF_RNN_cluster_dPhi', type='TH1F', title=" EF RNN cluster dPhi; #Delta#phi(cluster tau)", xbins=50, xmin=-0.5, xmax=0.5) ]
+        # track inputs
+        self.Histograms += [ defineHistogram('EF_RNN_Ntracks', type='TH1F', title=" EF RNN Ntracks; Number of tracks", xbins=12, xmin=0., xmax=12.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_pt_log', type='TH1F', title=" EF RNN track pt_log; Log10(track p_{T})", xbins=50, xmin=2.7, xmax=7.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_dEta', type='TH1F', title=" EF RNN track dEta; #Delta#eta(track tau)", xbins=50, xmin=-0.5, xmax=0.5) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_dPhi', type='TH1F', title=" EF RNN track dPhi; #Delta#phi(track xtau)", xbins=50, xmin=-0.5, xmax=0.5) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_d0_abs_log', type='TH1F', title=" EF RNN track d0_abs_log; Log10(Abs(track.d0()) + 1e-6)", xbins=50, xmin=-6.1, xmax=2.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_z0sinThetaTJVA_abs_log', type='TH1F', title=" EF RNN track z0sinThetaTJVA_abs_log; Log10(Abs(track.z0sinThetaTJVA(tau)) + 1e-6)", xbins=50, xmin=-6.1, xmax=4.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_nInnermostPixelHits', type='TH1F', title=" EF RNN track nInnermostPixelHits; nInnermostPixelHits", xbins=4, xmin=0., xmax=4.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_nPixelHits', type='TH1F', title=" EF RNN track nPixelHits; nPixelHits", xbins=11, xmin=0., xmax=11.) ]
+        self.Histograms += [ defineHistogram('EF_RNN_track_nSCTHits', type='TH1F', title=" EF RNN track nSCTHits; nSCTHits", xbins=20, xmin=0., xmax=20.) ]
+        # output
+        self.Histograms += [ defineHistogram('EF_RNNJetScore', type='TH1F', title=" EF RNNJetScore; RNNJetScore", xbins=50, xmin=0., xmax=1.) ]
+        self.Histograms += [ defineHistogram('EF_RNNJetScoreSigTrans', type='TH1F', title=" EF RNNJetScoreSigTrans; RNNJetScoreSigTrans", xbins=50, xmin=0., xmax=1.) ]
+
+
+
 ########## add validation specific histograms 
 class TrigTauRecValidationMonitoring(TrigTauRecOnlineMonitoring):
     def __init__ (self, name="TrigTauRecValidationMonitoring"):
diff --git a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx
index 3a1dc594e19d8fe125b9bcdb6af9dc13f6d82693..0be526b23a842078199a30e732c4e06e61a73d35 100755
--- a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx
+++ b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMerged.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 /********************************************************************
@@ -44,12 +44,13 @@
 
 #include "LumiBlockComps/ILumiBlockMuTool.h"
 
-#include "TrigTauRec/TrigTauRecMerged.h"
+// needs migration to master of RNN tools in tauRecTools
+//#include "tauRecTools/TauJetRNN.h"
 
+#include "TrigTauRec/TrigTauRecMerged.h"
 
 using namespace std;
 
-
 // Invokes base class constructor.
 TrigTauRecMerged::TrigTauRecMerged(const std::string& name,ISvcLocator* pSvcLocator):
 		  HLT::FexAlgo(name, pSvcLocator),
@@ -60,7 +61,8 @@ TrigTauRecMerged::TrigTauRecMerged(const std::string& name,ISvcLocator* pSvcLoca
 		  m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"),
 		  m_maxeta( 2.5 ),
 		  m_minpt( 10000 ),
-		  m_trkcone( 0.2 )
+		  m_trkcone( 0.2 ) //,
+		  //m_rnn_evaluator(0)
 {
   
   // The following properties can be specified at run-time
@@ -193,14 +195,34 @@ TrigTauRecMerged::TrigTauRecMerged(const std::string& name,ISvcLocator* pSvcLoca
   /** Errors */
   declareMonitoredStdContainer("EF_track_errors",m_track_errors);
   
-  /** Author */
-  declareMonitoredStdContainer("EF_author",m_author);
-  
-  /** deltaZ0 core Trks*/
-  declareMonitoredStdContainer("EF_deltaZ0coreTrks",m_deltaZ0coreTrks);
-  
-  /** deltaZ0 wide Trks*/
-  declareMonitoredStdContainer("EF_deltaZ0wideTrks",m_deltaZ0wideTrks);
+  // RNN inputs
+  // scalar
+  declareMonitoredVariable("EF_RNN_scalar_ptRatioEflowApprox", m_RNN_scalar_ptRatioEflowApprox);
+  declareMonitoredVariable("EF_RNN_scalar_mEflowApprox", m_RNN_scalar_mEflowApprox);
+  declareMonitoredVariable("EF_RNN_scalar_pt_jetseed_log", m_RNN_scalar_pt_jetseed_log);
+
+  // clusters
+  declareMonitoredVariable("EF_RNN_Nclusters", m_RNN_Nclusters);
+  declareMonitoredStdContainer("EF_RNN_cluster_et_log", m_RNN_cluster_et_log);
+  declareMonitoredStdContainer("EF_RNN_cluster_dEta", m_RNN_cluster_dEta);
+  declareMonitoredStdContainer("EF_RNN_cluster_dPhi", m_RNN_cluster_dPhi);
+  declareMonitoredStdContainer("EF_RNN_cluster_CENTER_LAMBDA", m_RNN_cluster_CENTER_LAMBDA);
+  declareMonitoredStdContainer("EF_RNN_cluster_SECOND_LAMBDA", m_RNN_cluster_SECOND_LAMBDA);
+  declareMonitoredStdContainer("EF_RNN_cluster_SECOND_R", m_RNN_cluster_SECOND_R);
+
+  // tracks
+  declareMonitoredVariable("EF_RNN_Ntracks", m_RNN_Ntracks);
+  declareMonitoredStdContainer("EF_RNN_track_pt_log", m_RNN_track_pt_log);
+  declareMonitoredStdContainer("EF_RNN_track_dEta", m_RNN_track_dEta);
+  declareMonitoredStdContainer("EF_RNN_track_dPhi", m_RNN_track_dPhi);
+  declareMonitoredStdContainer("EF_RNN_track_d0_abs_log", m_RNN_track_d0_abs_log);
+  declareMonitoredStdContainer("EF_RNN_track_z0sinThetaTJVA_abs_log", m_RNN_track_z0sinThetaTJVA_abs_log);
+  declareMonitoredStdContainer("EF_RNN_track_nInnermostPixelHits", m_RNN_track_nInnermostPixelHits);
+  declareMonitoredStdContainer("EF_RNN_track_nPixelHits", m_RNN_track_nPixelHits);
+  declareMonitoredStdContainer("EF_RNN_track_nSCTHits", m_RNN_track_nSCTHits);
+  // output
+  declareMonitoredVariable("EF_RNNJetScore", m_RNNJetScore);
+  declareMonitoredVariable("EF_RNNJetScoreSigTrans", m_RNNJetScoreSigTrans);
 
 }
 
@@ -210,7 +232,7 @@ TrigTauRecMerged::~TrigTauRecMerged()
 
 HLT::ErrorCode TrigTauRecMerged::hltInitialize()
 {
-	msg() << MSG::INFO << "TrigTauRecMerged::initialize()" << endmsg;
+	ATH_MSG_INFO( "TrigTauRecMerged::initialize()" );
 
 	m_tauEventData.setInTrigger(true);
 	////////////////////
@@ -218,7 +240,7 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize()
 	////////////////////
 	// check tool names
 	if ( m_tools.begin() == m_tools.end() ) {
-		msg() << MSG::ERROR << " no tools given for this algorithm." << endmsg;
+	        ATH_MSG_ERROR( "No tools given for this algorithm." );
 		return HLT::BAD_JOB_SETUP;
 	}
 
@@ -226,43 +248,52 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize()
 	//-------------------------------------------------------------------------
 	ToolHandleArray<ITauToolBase> ::iterator p_itT = m_tools.begin();
 	ToolHandleArray<ITauToolBase> ::iterator p_itTE = m_tools.end();
-	msg() << MSG::INFO << "List of tools in execution sequence:" << endmsg;
-	msg() << MSG::INFO << "------------------------------------" << endmsg;
+	ATH_MSG_INFO( "List of tools in execution sequence:" );
+	ATH_MSG_INFO( "------------------------------------" );
 
 	for(; p_itT != p_itTE; ++p_itT ) {
 		StatusCode p_sc = p_itT->retrieve();
 		if( p_sc.isFailure() ) {
-			msg() << MSG::WARNING << "Cannot find tool named <";
-			msg() << *p_itT << ">" << endmsg;
+		        ATH_MSG_WARNING( "Cannot find tool named <" << *p_itT << ">" );
 			return HLT::BAD_JOB_SETUP;
 		}
 		else {
-			msg() << MSG::INFO << "REGTEST ";
-			msg() <<" add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name() << endmsg;
+		        ATH_MSG_INFO( "REGTEST " );
+			ATH_MSG_INFO( "Add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name() );
 			if(  doTiming() ) m_mytimers.push_back(addTimer((*p_itT)->name())) ;
 			(*p_itT)->setTauEventData(&m_tauEventData);
+
+			/*
+			// monitoring of RNN input variables
+			ToolHandle<ITauToolBase> handle = *p_itT;
+			TauJetRNNEvaluator* RNN_evaluator = dynamic_cast<TauJetRNNEvaluator*>(&(*handle));
+			if(RNN_evaluator) {
+			  ATH_MSG_INFO( "Retrieved TauJetRNNEvaluator for RNN inputs monitoring" );
+			  m_rnn_evaluator = RNN_evaluator;
+			}
+			*/
 		}
 	}
 
-	msg() << MSG::INFO << " " << endmsg;
-	msg() << MSG::INFO << "------------------------------------" << endmsg;
+	ATH_MSG_INFO( " " );
+	ATH_MSG_INFO( "------------------------------------" );
+
 
 	ToolHandleArray<ITauToolBase> ::iterator p_itTe = m_endtools.begin();
 	ToolHandleArray<ITauToolBase> ::iterator p_itTEe = m_endtools.end();
 
-	msg() << MSG::INFO << "List of end tools in execution sequence:" << endmsg;
-	msg() << MSG::INFO << "------------------------------------" << endmsg;
+	ATH_MSG_INFO( "List of end tools in execution sequence:" );
+	ATH_MSG_INFO( "------------------------------------" );
 
 	for(; p_itTe != p_itTEe; ++p_itTe ) {
 		StatusCode p_sc = p_itTe->retrieve();
 		if( p_sc.isFailure() ) {
-			msg() << MSG::WARNING << "Cannot find tool named <";
-			msg() << *p_itTe << ">" << endmsg;
+		        ATH_MSG_WARNING( "Cannot find tool named <" << *p_itTe << ">" );
 			return HLT::BAD_JOB_SETUP;
 		}
 		else {
-			msg() << MSG::INFO << "REGTEST ";
-			msg() <<" add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name() << endmsg;
+	  	        ATH_MSG_INFO( "REGTEST " );
+			ATH_MSG_INFO( "Add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name() );
 			if(  doTiming() ) m_mytimers.push_back(addTimer((*p_itTe)->name())) ;
 			( *p_itTe )->setTauEventData(&m_tauEventData);
 		}
@@ -277,20 +308,20 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize()
 	// }                                                                            
 
 	if (m_lumiBlockMuTool.retrieve().isFailure()) {                                     
-	  msg() << MSG::WARNING << "Unable to retrieve LumiBlockMuTool" << endmsg;     
+	  ATH_MSG_WARNING( "Unable to retrieve LumiBlockMuTool" );
 	} else {                                                                     
-	  msg() << MSG::DEBUG << "Successfully retrieved LumiBlockMuTool" << endmsg; 
+	  ATH_MSG_DEBUG( "Successfully retrieved LumiBlockMuTool" ); 
 	}                                                                            
 
 	// Retrieve beam conditions
 	if(m_beamSpotKey.initialize().isFailure()) {
-	  msg() << MSG::WARNING << "Unable to retrieve Beamspot key" << endmsg;
+	  ATH_MSG_WARNING( "Unable to retrieve Beamspot key" );
         } else {
-          msg() << MSG::DEBUG << "Successfully retrieved Beamspot key" << endmsg;
+          ATH_MSG_DEBUG( "Successfully retrieved Beamspot key" );
 	}
 	
-	msg() << MSG::INFO << " " << endmsg;
-	msg() << MSG::INFO << "------------------------------------" << endmsg;
+	ATH_MSG_INFO( " " );
+	ATH_MSG_INFO( "------------------------------------" );
 	
 	return HLT::OK;
 }
@@ -298,7 +329,6 @@ HLT::ErrorCode TrigTauRecMerged::hltInitialize()
 /////////////////////////////////////////////////////////////////
 HLT::ErrorCode TrigTauRecMerged::hltFinalize()
 {
-	//msg() << MSG::DEBUG << "Finalizing TrigTauRecMerged" << endmsg;
 	return HLT::OK;
 }
 
@@ -344,7 +374,6 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	m_innerTrkAvgDist=-999;
 	m_SumPtTrkFrac=-999;
 
-	m_author.clear();
 	m_calo_errors.clear();
 	m_track_errors.clear();
 	m_EtEm =-10.;
@@ -356,19 +385,30 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	m_EtaEF = -99;
 	m_PhiEF = -99;
 
+	// RNN variables monitoring
+	m_RNN_scalar_ptRatioEflowApprox = 0.; m_RNN_scalar_mEflowApprox = 0.; m_RNN_scalar_pt_jetseed_log = 0.;
+	m_RNN_Nclusters = -1;
+	m_RNN_cluster_et_log.clear(); m_RNN_cluster_dEta.clear(); m_RNN_cluster_dPhi.clear();
+	m_RNN_cluster_CENTER_LAMBDA.clear(); m_RNN_cluster_SECOND_LAMBDA.clear(); m_RNN_cluster_SECOND_R.clear();
+	m_RNN_Ntracks = -1;
+	m_RNN_track_pt_log.clear(); m_RNN_track_dEta.clear(); m_RNN_track_dPhi.clear();
+	m_RNN_track_d0_abs_log.clear(); m_RNN_track_z0sinThetaTJVA_abs_log.clear();
+	m_RNN_track_nInnermostPixelHits.clear(); m_RNN_track_nPixelHits.clear(); m_RNN_track_nSCTHits.clear();
+	m_RNNJetScore = -999; m_RNNJetScoreSigTrans = -999.;
+
 	// Retrieve store.
-	if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "Executing TrigTauRecMerged" << endmsg;
+	if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Executing TrigTauRecMerged" );
 
 	// Get RoiDescriptor
 	const TrigRoiDescriptor* roiDescriptor = 0;
 	HLT::ErrorCode hltStatus = getFeature(inputTE, roiDescriptor);
 
-	if ( hltStatus==HLT::OK && roiDescriptor!= NULL ) {
+	if ( hltStatus==HLT::OK && roiDescriptor!= nullptr ) {
 		if( msgLvl() <= MSG::DEBUG )
-			msg() << MSG::DEBUG << "REGTEST: RoI " << *roiDescriptor<< endmsg;
+		    ATH_MSG_DEBUG( "REGTEST: RoI " << *roiDescriptor );
 	}
 	else {
-		msg() <<  MSG::ERROR << "Failed to find RoiDescriptor " << endmsg;
+	        ATH_MSG_ERROR( "Failed to find RoiDescriptor " );
 		m_calo_errors.push_back(NoROIDescr);
 		return hltStatus;
 	}
@@ -379,40 +419,30 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	hltStatus = getFeatures(inputTE, vectorCaloCellContainer);
 
 	if(hltStatus!=HLT::OK ) {
-		msg() << MSG::ERROR << " No CaloCellContainers retrieved for the trigger element" << endmsg;
+	        ATH_MSG_ERROR( " No CaloCellContainers retrieved for the trigger element" );
 		m_calo_errors.push_back(NoCellCont);
 		return hltStatus;
 	}
 
 	if (vectorCaloCellContainer.size() < 1) {
-		msg() << MSG::ERROR
-				<< "Size of vector CaloCell container is not 1. Is"
-				<< vectorCaloCellContainer.size()
-				<< endmsg;
+	        ATH_MSG_ERROR( "Size of vector CaloCell container is not 1. Is " << vectorCaloCellContainer.size() );
 		m_calo_errors.push_back(NoCellCont);
 		return HLT::ERROR;
 	}
 
 	const CaloCellContainer* RoICaloCellContainer = vectorCaloCellContainer.back();
 
-	if(RoICaloCellContainer != NULL) {
+	if(RoICaloCellContainer != nullptr) {
 		m_nCells = RoICaloCellContainer->size();
-
-		msg() << MSG::DEBUG
-				<< "REGTEST: Size of vector CaloCell container is "
-				<< RoICaloCellContainer->size()
-				<< endmsg;
+		ATH_MSG_DEBUG("REGTEST: Size of vector CaloCell container is " << RoICaloCellContainer->size() );
 		if(RoICaloCellContainer->size()==0) {
-			msg() << MSG::INFO
-					<< "Cannot proceed, size of vector CaloCell container is "
-					<< RoICaloCellContainer->size()
-					<< endmsg;
+		        ATH_MSG_INFO( "Cannot proceed, size of vector CaloCell container is " << RoICaloCellContainer->size() );
 			m_calo_errors.push_back(EmptyCellCont);
 			return HLT::OK;
 		}
 	}
 	else {
-		msg() << MSG::ERROR << "no CaloCell container found "<< endmsg;
+	        ATH_MSG_ERROR( "No CaloCell container found" );
 		m_calo_errors.push_back(NoCellCont);
 		return HLT::ERROR;
 	}
@@ -422,21 +452,19 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	hltStatus = getFeatures(inputTE, vectorCaloClusterContainer);
   
 	if(hltStatus!=HLT::OK ) {
-	  msg() << MSG::ERROR << " No CaloClusterContainers retrieved for the trigger element" << endmsg;
+	  ATH_MSG_ERROR( "No CaloClusterContainers retrieved for the trigger element" );
 	  m_calo_errors.push_back(NoClustCont);
 	  return hltStatus;
 	}
 
 	if (vectorCaloClusterContainer.size() < 1) {
-	  msg() << MSG::ERROR
-		<< "  CaloCluster container is empty"
-		<< endmsg;
+	  ATH_MSG_ERROR( "CaloCluster container is empty" );
 	  m_calo_errors.push_back(NoClustCont);
 	  return HLT::ERROR;
 	}
   
 	if( msgLvl() <= MSG::DEBUG )
-	  msg() << MSG::DEBUG << " CaloCluster container size is " << vectorCaloClusterContainer.size() << endmsg;
+	  ATH_MSG_DEBUG( "CaloCluster container size is " << vectorCaloClusterContainer.size() );
   
 	// Grab the last cluster collection attached
 	const xAOD::CaloClusterContainer* RoICaloClusterContainer = vectorCaloClusterContainer.back();
@@ -445,13 +473,13 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	hltStatus = getStoreGateKey( RoICaloClusterContainer, collKey );
 
 	if(hltStatus!=HLT::OK ) {
-		msg() << MSG::ERROR << "Cluster has no key " << endmsg;
+	        ATH_MSG_ERROR( "Cluster has no key" );
 		m_calo_errors.push_back(NoClustKey);
 		return HLT::ERROR;
 	}
 
 	if( msgLvl() <= MSG::DEBUG )
-		msg() << MSG::DEBUG << " cluster key for back cluster is " << collKey << endmsg;
+	  ATH_MSG_DEBUG( "Cluster key for back cluster is " << collKey );
 
 	
 	// Not necessary anymore
@@ -491,45 +519,45 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	vector<const xAOD::TrackParticleContainer*> vectorTrackContainer;
 	hltStatus = getFeatures(inputTE,vectorTrackContainer);
 
-	const xAOD::TrackParticleContainer*  RoITrackContainer=NULL;
+	const xAOD::TrackParticleContainer* RoITrackContainer = nullptr;
 
 	if (hltStatus!=HLT::OK) {
-		msg() << MSG::INFO << "REGTEST: No Track container found." << endmsg;
+	        ATH_MSG_INFO( "REGTEST: No Track container found." );
 		m_track_errors.push_back(NoTrkCont);
 	}
 	else {
 		if (vectorTrackContainer.size()<1) {
-			msg() << MSG::DEBUG << "Size of vector Track container is not 1. Is " << vectorTrackContainer.size() << endmsg;
+		        ATH_MSG_DEBUG( "Size of vector Track container is not 1. Is " << vectorTrackContainer.size() );
 			m_track_errors.push_back(NoTrkCont);
 		}
 
 		if(vectorTrackContainer.size()>0) {
 			RoITrackContainer = vectorTrackContainer.back();
 			if( msgLvl() <= MSG::DEBUG )
-				msg() << MSG::DEBUG << "REGTEST: Size of vector Track container is " << RoITrackContainer->size() << endmsg;
+			  ATH_MSG_DEBUG( "REGTEST: Size of vector Track container is " << RoITrackContainer->size() );
 		}
-		if(RoITrackContainer != NULL) m_nTracks = RoITrackContainer->size();
+		if(RoITrackContainer != nullptr) m_nTracks = RoITrackContainer->size();
 	}
 
 	// get Vertex Container
 	vector<const xAOD::VertexContainer*> vectorVxContainer;
 	hltStatus = getFeatures(inputTE,vectorVxContainer);
-	const xAOD::VertexContainer* RoIVxContainer = NULL;
+	const xAOD::VertexContainer* RoIVxContainer = nullptr;
 
 	if(hltStatus!=HLT::OK) {
-		msg() << MSG::INFO << "No VxContainers retrieved for the trigger element" << endmsg;
+	        ATH_MSG_INFO( "No VxContainers retrieved for the trigger element" );
 		m_track_errors.push_back(NoVtxCont);
 	}
 	else {
 		if (vectorVxContainer.size() < 1) {
-			msg() << MSG::DEBUG << "Size of vector Vertex  container is not 1. Is " << vectorVxContainer.size() << endmsg;
+		        ATH_MSG_DEBUG( "Size of vector Vertex  container is not 1. Is " << vectorVxContainer.size() );
 			m_track_errors.push_back(NoVtxCont);
 		}
 
 		if(vectorVxContainer.size() >0) {
 			RoIVxContainer = vectorVxContainer.back();
 			if( msgLvl() <= MSG::DEBUG )
-				msg() << MSG::DEBUG << "REGTEST: Size of vector Vertex  container " << RoIVxContainer->size() << endmsg;
+			  ATH_MSG_DEBUG( "REGTEST: Size of vector Vertex  container " << RoIVxContainer->size() );
 		}
 	}
 
@@ -553,8 +581,8 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	  avg_mu = m_lumiBlockMuTool->averageInteractionsPerCrossing();
           m_ActualInteractions = mu;
           m_AvgInteractions = avg_mu;
-	  msg() << MSG::DEBUG << "REGTEST: Retrieved Mu Value : " << mu << endmsg;
-	  msg() << MSG::DEBUG << "REGTEST: Average Mu Value   : " << avg_mu << endmsg;
+	  ATH_MSG_DEBUG( "REGTEST: Retrieved Mu Value : " << mu );
+	  ATH_MSG_DEBUG( "REGTEST: Average Mu Value   : " << avg_mu );
 	}
 	
 
@@ -622,12 +650,12 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	xAOD::CaloClusterContainer::const_iterator clusterIt;
 	for (clusterIt=RoICaloClusterContainer->begin(); clusterIt != RoICaloClusterContainer->end(); ++clusterIt) {
 	  if( msgLvl() <= MSG::DEBUG )
-	    msg()<< MSG::DEBUG <<" Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )" << endmsg;
+	    ATH_MSG_DEBUG( "Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )" );
     
 	  if((*clusterIt)->e() < 0)
 	    {
 	      if( msgLvl() <= MSG::DEBUG )
-		msg()<< MSG::DEBUG <<" Negative energy cluster is rejected" << endmsg;
+		ATH_MSG_DEBUG( "Negative energy cluster is rejected" );
 	      continue;
 	    }
     
@@ -639,17 +667,17 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	
 	aJet->setJetP4(xAOD::JetFourMom_t(TauBarycenter.Pt(), TauBarycenter.Eta(), TauBarycenter.Phi(), TauBarycenter.M() ) ); 
 
-	if( msgLvl() <= MSG::DEBUG ) msg() << MSG :: DEBUG << "jet formed"<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() << endmsg;
+	if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Jet formed "<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() );
 	
 	hltStatus=attachFeature(outputTE, theJetCollection, "TrigTauJet");
 	
 	if (hltStatus!=HLT::OK ) {
-	  msg() << MSG::ERROR << "Unable to record JetCollection  in TDS" << endmsg;
+	  ATH_MSG_ERROR( "Unable to record JetCollection  in TDS" );
 	  m_calo_errors.push_back(NoJetAttach);
 	  return hltStatus;
 	}
 	else {
-	  if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " JetCollection is recorded with key " << "HLT_" << "_" << "TrigTauJet" << endmsg;
+	  if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "JetCollection is recorded with key " << "HLT_" << "_" << "TrigTauJet" );
 	}
 
 
@@ -700,11 +728,11 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 		processStatus = (*firstTool)->eventInitialize();
 
 		if( processStatus != StatusCode :: SUCCESS ) {
-			msg() << MSG :: ERROR << "tool "<<(*firstTool)->name()<< "failed in eventInitialize" << endmsg;
+		        ATH_MSG_ERROR( "Tool "<<(*firstTool)->name()<< "failed in eventInitialize" );
 			return HLT :: TOOL_FAILURE;
 		}
 	}
-	if( msgLvl() <= MSG::DEBUG ) msg() << MSG ::DEBUG << " initialize all good " << endmsg;
+	if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "initialize all good" );
 
 	//-------------------------------------------------------------------------
 	// using Jet collection
@@ -719,18 +747,17 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	m_tauEventData.seedContainer = theJetCollection;
 
 	// This sets one track and link. Need to have at least 1 track linked to retrieve track container
+	// can't we instead implement in the EDM a function to retrieve the track container of a tau?
 	setEmptyTauTrack(p_tau, pTrackContainer);
 
 	if(p_seed->e()<=0) {
-		msg() << MSG::DEBUG << " Roi: changing eta due to energy " << p_seed->e() << endmsg;
+                ATH_MSG_DEBUG( "Roi: changing eta due to energy " << p_seed->e() );
 		p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m());
 		
-		msg() << MSG::DEBUG << "Roi: " << roiDescriptor->roiId()
-        		  << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi()
-        		  << endmsg;
+		ATH_MSG_DEBUG( "Roi: " << roiDescriptor->roiId() << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() );
 	}
 
-	if( msgLvl() <= MSG::DEBUG ) msg() << MSG ::DEBUG <<" roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() << endmsg;
+	if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() );
 
 	m_tauEventData.setObject("JetCollection", theJetCollection );
 
@@ -741,13 +768,13 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	firstTool = m_tools.begin();
 	lastTool  = m_tools.end();
 	processStatus    = StatusCode::SUCCESS;
-	if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "Starting tool loop with seed jet" << endmsg;
+	if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Starting tool loop with seed jet" );
 	std::vector<TrigTimer* >::iterator itimer =  m_mytimers.begin();
 	while ( ! processStatus.isFailure() && firstTool != lastTool ) {
 	        // loop stops only when Failure indicated by one of the tools
 	        if( msgLvl() <= MSG::DEBUG ) {
-			msg() << MSG::DEBUG << "Starting Tool: " << endmsg;
-			msg() << MSG::DEBUG <<  (*firstTool)->name() << endmsg;
+		        ATH_MSG_DEBUG( "Starting Tool:");
+			ATH_MSG_DEBUG( (*firstTool)->name() );
 		}
 		// time in the various tools
 		++toolnum;
@@ -762,14 +789,14 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 
 		if ( !processStatus.isFailure() ) {
 			if( msgLvl() <= MSG::DEBUG ) {
-				msg() << MSG::DEBUG << "REGTEST: "<< (*firstTool)->name() << " executed successfully " << endmsg;
-				msg() << MSG::DEBUG << "REGTEST: Roi: " << roiDescriptor->roiId()
-            						<< " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi()
-            						<< " Tau pT : "<< p_tau->pt()<< endmsg;
+			  ATH_MSG_DEBUG( "REGTEST: "<< (*firstTool)->name() << " executed successfully ");
+			  ATH_MSG_DEBUG( "REGTEST: Roi: " << roiDescriptor->roiId()
+					 << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi()
+					 << " Tau pT : "<< p_tau->pt() );
 			}
 		}
 		else {
-			if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG <<"REGTEST: "<< (*firstTool)->name() << " execution failed " << endmsg;
+		  if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "REGTEST: "<< (*firstTool)->name() << " execution failed" );
 		}
 		++firstTool;
 		++itimer;
@@ -778,7 +805,7 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 
 	//check status
 	if ( !processStatus.isSuccess() )  {   // some problem
-		if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "the tau object has NOT been registered in the tau container" << endmsg;
+	        if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "The tau object has NOT been registered in the tau container" );
 		// ToolHandleArray<ITauToolBase> ::iterator tool = m_tools.begin();
 		// for(; tool != firstTool; ++tool ) (*tool)->cleanup( &m_tauEventData );
 		// (*tool)->cleanup( &m_tauEventData );
@@ -789,34 +816,33 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 
 		pContainer->pop_back();
 
-		if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "clean up done after jet seed" << endmsg;
+		if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Clean up done after jet seed" );
 	}
 	else if( processStatus.isSuccess()) {
 
 	  float fJetEnergy = (*p_tau->jetLink())->e();
-	  msg() << MSG::DEBUG << " Roi: jet e "<< fJetEnergy <<endmsg;
+	  ATH_MSG_DEBUG( "Roi: jet e "<< fJetEnergy );
 	  
 	  if( fJetEnergy < 0.00001 ) {
-	    msg() << MSG::DEBUG << " Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)"<<endmsg;
-	    msg() << MSG::DEBUG << " Roi: this is probably not needed anymore, method PxPyPzE has been corrected"<<endmsg;
+	    ATH_MSG_DEBUG( "Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)" );
+	    ATH_MSG_DEBUG( "Roi: this is probably not needed anymore, method PxPyPzE has been corrected" );
 	    
 	    //p_tau->setEta(roiDescriptor->eta0());
 	    //p_tau->setPhi(roiDescriptor->phi0());
 	    // Direct accessors not available anymore
 	    p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m());
 	    
-	    msg() << MSG::DEBUG << " Roi: " << roiDescriptor->roiId()
-		  << " Tau eta: " << p_tau->eta()
-		  << " Tau phi: " << p_tau->phi()
-		  << " Tau pT : "<< p_tau->pt()<< endmsg;
+	    ATH_MSG_DEBUG( " Roi: " << roiDescriptor->roiId()
+			   << " Tau eta: " << p_tau->eta()
+			   << " Tau phi: " << p_tau->phi()
+			   << " Tau pT : "<< p_tau->pt() );
 	  }
 	  
 	  // loop over end tools
 	  ToolHandleArray<ITauToolBase> ::iterator p_itET = m_endtools.begin();
 	  ToolHandleArray<ITauToolBase> ::iterator p_itETE = m_endtools.end();
 	  for (; p_itET != p_itETE; ++p_itET ) {
-	    msg() << MSG::VERBOSE << "Invoking endTool ";
-	    msg() << ( *p_itET )->name() << endmsg;
+	    ATH_MSG_VERBOSE( "Invoking endTool " << ( *p_itET )->name() );
 	    
 	    processStatus = ( *p_itET )->execute( *p_tau);
 	    if( processStatus.isFailure() ) break;
@@ -868,26 +894,53 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	  if(m_dPhi<-M_PI) m_dPhi += 2.0*M_PI;
 	  if(m_dPhi>M_PI)  m_dPhi -= 2.0*M_PI;
 	  
-	  // author variable removed. There are no different tau reco algs anymor
 	  
-	  // write out delta Z0
+	  // uncomment when RNN tools migrated to master
 	  /*
-	   * FF, March 2014: deactivated.
-	   * If the output of these variables is still needed, drop me a line.
-	   * We can either print them here as done before or put them into tauEDM to have them available globally
-	   if (m_useTauPVTool) {
-	   m_tauPVTool->getDeltaZ0Values(m_deltaZ0coreTrks, m_deltaZ0wideTrks);
-	   
-	   msg() << MSG::DEBUG << "REGTEST: deltaZ0 for core trk ";
-	   for ( unsigned int i=0; i<m_deltaZ0coreTrks.size(); ++i) msg() << MSG::DEBUG << i << ": " << m_deltaZ0coreTrks[i] << ", ";
-	   msg() << MSG::DEBUG << endmsg;
-	   
-	   msg() << MSG::DEBUG << "REGTEST: deltaZ0 for wide trk ";
-	   for ( unsigned int i=0; i<m_deltaZ0wideTrks.size(); ++i) msg() << MSG::DEBUG << i << ": " << m_deltaZ0wideTrks[i] << ", ";
-	   msg() << MSG::DEBUG << endmsg;
-	   }
-	  */
+	  // RNN monitoring
+	  if(m_rnn_evaluator) {
 
+	    TauJetRNN* rnn = 0;
+	    if(m_numTrack==0) rnn = m_rnn_evaluator->get_rnn_0p();
+	    else if(m_numTrack==1) rnn = m_rnn_evaluator->get_rnn_1p();
+	    else rnn = m_rnn_evaluator->get_rnn_3p();
+	    
+	    const std::map<std::string, std::map<std::string, double> >* rnn_scalar = rnn->getScalarInputs();
+	    const std::map<std::string, std::map<std::string, std::vector<double>> >* rnn_vector = rnn->getVectorInputs();
+
+	    m_RNN_scalar_ptRatioEflowApprox = rnn_scalar->at("scalar").at("ptRatioEflowApprox");
+	    m_RNN_scalar_mEflowApprox = rnn_scalar->at("scalar").at("mEflowApprox");
+	    // this is obviously a scalar, but is stored in tracks and clusters
+	    if(rnn_vector->at("tracks").at("pt_log").size()>0) m_RNN_scalar_pt_jetseed_log = rnn_vector->at("tracks").at("pt_jetseed_log")[0];
+	    else if(rnn_vector->at("clusters").at("et_log").size()>0) m_RNN_scalar_pt_jetseed_log = rnn_vector->at("clusters").at("pt_jetseed_log")[0];
+
+	    m_RNN_Nclusters = rnn_vector->at("clusters").at("et_log").size();
+	    m_RNN_cluster_et_log = rnn_vector->at("clusters").at("et_log");
+	    m_RNN_cluster_dEta = rnn_vector->at("clusters").at("dEta");
+	    m_RNN_cluster_dPhi = rnn_vector->at("clusters").at("dPhi");	    
+	    m_RNN_cluster_CENTER_LAMBDA = rnn_vector->at("clusters").at("CENTER_LAMBDA");
+	    m_RNN_cluster_SECOND_LAMBDA = rnn_vector->at("clusters").at("SECOND_LAMBDA"); 
+	    m_RNN_cluster_SECOND_R = rnn_vector->at("clusters").at("SECOND_R");
+
+	    m_RNN_Ntracks = rnn_vector->at("tracks").at("pt_log").size();
+	    m_RNN_track_pt_log = rnn_vector->at("tracks").at("pt_log");
+	    m_RNN_track_dEta = rnn_vector->at("tracks").at("dEta");
+	    m_RNN_track_dPhi = rnn_vector->at("tracks").at("dPhi");
+	    m_RNN_track_d0_abs_log = rnn_vector->at("tracks").at("d0_abs_log");
+	    m_RNN_track_z0sinThetaTJVA_abs_log = rnn_vector->at("tracks").at("z0sinThetaTJVA_abs_log");
+	    m_RNN_track_nInnermostPixelHits = rnn_vector->at("tracks").at("nIBLHitsAndExp");
+	    m_RNN_track_nPixelHits = rnn_vector->at("tracks").at("nPixelHitsPlusDeadSensors");
+	    m_RNN_track_nSCTHits = rnn_vector->at("tracks").at("nSCTHitsPlusDeadSensors");
+
+	    if( !p_tau->hasDiscriminant(xAOD::TauJetParameters::RNNJetScore) || !p_tau->isAvailable<float>("RNNJetScore") )
+	      ATH_MSG_WARNING( "RNNJetScore not available. Should not happen when TauJetRNNEvaluator is run!" );
+	    else m_RNNJetScore = p_tau->discriminant(xAOD::TauJetParameters::RNNJetScore);
+	    if( !p_tau->hasDiscriminant(xAOD::TauJetParameters::RNNJetScoreSigTrans) || !p_tau->isAvailable<float>("RNNJetScoreSigTrans") )
+	      ATH_MSG_WARNING( "RNNJetScoreSigTrans not available. Make sure TauWPDecorator is run!" );
+	    else m_RNNJetScoreSigTrans = p_tau->discriminant(xAOD::TauJetParameters::RNNJetScoreSigTrans);
+	  }
+	  */  
+	
 	  //
 	  // copy CaloOnly four vector, if present
 	  //
@@ -897,11 +950,11 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 
 	  if( tmpCaloOnlyStatus != HLT::OK){ 
 
-	    msg() << MSG::DEBUG << "Can't get container TrigTauRecCaloOnly to copy four-vector" << endmsg;
+	    ATH_MSG_DEBUG( "Can't get container TrigTauRecCaloOnly to copy four-vector" );
 
 	  } else {
 
-	    msg() << MSG::DEBUG << "Got container TrigTauRecCaloOnly size :" << tempCaloOnlyContVec.size() << endmsg;
+	    ATH_MSG_DEBUG( "Got container TrigTauRecCaloOnly size :" << tempCaloOnlyContVec.size() );
 	     
 	    if ( tempCaloOnlyContVec.size() != 0 ) {
 
@@ -912,7 +965,7 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 
 	      for(xAOD::TauJetContainer::const_iterator tauIt = tempCaloOnlyContVec.back()->begin(); tauIt != tempCaloOnlyContVec.back()->end(); tauIt++){ 
 
-	   	msg() << MSG::DEBUG << "pT(tau) = " << (*tauIt)->pt() << " pT(caloOnly) = " << (*tauIt)->ptTrigCaloOnly() << endmsg;
+	   	ATH_MSG_DEBUG( "pT(tau) = " << (*tauIt)->pt() << " pT(caloOnly) = " << (*tauIt)->ptTrigCaloOnly() );
 	  	
 	   	p_tau->setP4(xAOD::TauJetParameters::TrigCaloOnly, (*tauIt)->ptTrigCaloOnly(), (*tauIt)->etaTrigCaloOnly(), (*tauIt)->phiTrigCaloOnly(), (*tauIt)->mTrigCaloOnly());
 
@@ -932,10 +985,10 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 
 
 
-	  msg() << MSG::DEBUG << "REGTEST: Roi: " << roiDescriptor->roiId()
-		<< " Tau being saved eta: " << m_EtaEF << " Tau phi: " << m_PhiEF
-		<< " wrt L1 dEta "<< m_dEta<<" dPhi "<<m_dPhi
-		<< " Tau Et (GeV): "<< m_EtFinal << endmsg;
+	  ATH_MSG_DEBUG( "REGTEST: Roi: " << roiDescriptor->roiId()
+			 << " Tau being saved eta: " << m_EtaEF << " Tau phi: " << m_PhiEF
+			 << " wrt L1 dEta "<< m_dEta<<" dPhi "<<m_dPhi
+			 << " Tau Et (GeV): "<< m_EtFinal );
 	  
 	  ++m_Ncand;
 	}
@@ -945,18 +998,18 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	  pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end());
 	  pContainer->pop_back();
 	  
-	  if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "deleted tau done after jet seed" << endmsg;
+	  if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Deleted tau done after jet seed" );
 	}
 	
 	// call eventFinalize on the booked tau tools
 	for ( firstTool = m_tools.begin(); firstTool != lastTool; firstTool++ ) {
 	  processStatus = (*firstTool)->eventFinalize();
 	  if( processStatus != StatusCode :: SUCCESS ) {
-	    msg() << MSG :: INFO << "tool "<<(*firstTool)->name()<< "failed in eventFinalize" << endmsg;
+	    ATH_MSG_INFO( "Tool "<<(*firstTool)->name()<< "failed in eventFinalize" );
 	    return HLT :: TOOL_FAILURE;
 	  }
 	}
-	msg() << MSG :: DEBUG << "tools succeed in eventFinalize" << endmsg;
+	ATH_MSG_DEBUG( "Tools succeed in eventFinalize" );
 	
 	
 	//-------------------------------------------------------------------------
@@ -966,15 +1019,61 @@ HLT::ErrorCode TrigTauRecMerged::hltExecute(const HLT::TriggerElement* inputTE,
 	hltStatus=attachFeature(outputTE, pContainer, m_outputName);
 	hltStatus=attachFeature(outputTE, pTrackContainer, m_outputName+"Tracks");
 	if (hltStatus!=HLT::OK )  {
-		msg() << MSG::ERROR << "Unable to record tau Container in TDS" << endmsg;
+	        ATH_MSG_ERROR( "Unable to record tau Container in TDS" );
 		m_calo_errors.push_back(NoHLTtauAttach);
 		return hltStatus;
 	}
 	else {
-		if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "Recorded a tau container: " << "HLT_" << "TrigTauRecMerged" << endmsg;
+	  if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "Recorded a tau container: " << "HLT_" << "TrigTauRecMerged" );
 	}
 
-	if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << "the tau object has been registered in the tau container" << endmsg;
+	if( msgLvl() <= MSG::DEBUG ) ATH_MSG_DEBUG( "The tau object has been registered in the tau container" );
+
+
+	// workaround to "fix" broken element links in data
+
+	// skip bad taus which have been discarded
+	if(pContainer->size()==0)
+	  return HLT::OK;
+
+	static SG::AuxElement::Accessor< xAOD::TauJet::JetLink_t > jetAcc( "jetLink" );
+	jetAcc( *p_tau ).toPersistent();
+
+	static SG::AuxElement::Accessor< xAOD::TauJet::VertexLink_t > vertexAcc( "vertexLink" );
+	vertexAcc( *p_tau ).toPersistent();
+
+	xAOD::TauJet::TauTrackLinks_t new_tauTrackLinks;
+	static SG::AuxElement::Accessor< xAOD::TauJet::TauTrackLinks_t > tauTrackAcc( "tauTrackLinks" );
+	static SG::AuxElement::Accessor< xAOD::TauTrack::TrackParticleLinks_t > trackAcc( "trackLinks" );
+
+	for( ElementLink< xAOD::TauTrackContainer > tautrack_link : tauTrackAcc( *p_tau ) ) {
+
+	  xAOD::TauTrack::TrackParticleLinks_t new_trackLinks;
+
+	  for( ElementLink< xAOD::TrackParticleContainer > track_link : trackAcc( *(*tautrack_link) ) ) {
+	    track_link.toPersistent();
+
+	    ElementLink< xAOD::TrackParticleContainer > newTrackLink;
+	    newTrackLink.toPersistent();
+	    newTrackLink.resetWithKeyAndIndex( track_link.persKey(), track_link.persIndex() );
+	    new_trackLinks.push_back(newTrackLink);	    
+	  }
+
+	  pTrackContainer->at(tautrack_link.index())->clearTrackLinks();
+	  pTrackContainer->at(tautrack_link.index())->setTrackLinks(new_trackLinks);
+
+	  tautrack_link.toPersistent();
+
+	  ElementLink< xAOD::TauTrackContainer > newTauTrackLink;
+	  newTauTrackLink.toPersistent();
+	  newTauTrackLink.resetWithKeyAndIndex( tautrack_link.persKey(), tautrack_link.persIndex() );
+	  new_tauTrackLinks.push_back(newTauTrackLink);
+	}
+
+	p_tau->clearTauTrackLinks();
+	p_tau->setAllTauTrackLinks(new_tauTrackLinks);
+
+	// no action needs to be taken for tau -> clusters links
 	
 	// set status of TE to always true for FE algorithms
 	return HLT::OK;
diff --git a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx
index 8a1cdf2d38a172994460bafde2df26a83bd0a627..03ff7d3cf5cb143d6cd009ee1765b5ae64cd3d9f 100644
--- a/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx
+++ b/Trigger/TrigAlgorithms/TrigTauRec/src/TrigTauRecMergedMT.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 /********************************************************************
@@ -10,13 +10,10 @@
  * AUTHOR:   E.Carquin
  * MODIFIED: Nov 23 2018
  *   
- *           Run a subset of the offline tauRec/tau1p3p routines in the EF 
+ *           Run a subset of the offline tauRec routines at the HLT
  *********************************************************************/
 
-//#include "GaudiKernel/IToolSvc.h"
-//#include "GaudiKernel/ListItem.h"
-//#include "GaudiKernel/StatusCode.h"
-//#include "GaudiKernel/Property.h"
+#include "GaudiKernel/SystemOfUnits.h"
 
 #include "TrigT1Interfaces/TrigT1Interfaces_ClassDEF.h"
 #include "TrigSteeringEvent/TrigRoiDescriptor.h"
@@ -53,10 +50,10 @@ using namespace std;
 // Invokes base class constructor.
 TrigTauRecMergedMT::TrigTauRecMergedMT(const std::string& name,ISvcLocator* pSvcLocator)
   :AthAlgorithm(name, pSvcLocator),
-		  m_tools(this),
-		  m_endtools(this),
-		  m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"),
-		  m_beamSpotSvc("BeamCondSvc", name)
+   m_tools(this),
+   m_endtools(this),
+   m_lumiBlockMuTool("LumiBlockMuTool/LumiBlockMuTool"),
+   m_beamSpotSvc("BeamCondSvc", name)
 {
   declareProperty("Tools", m_tools, "List of ITauToolBase tools" );
   declareProperty("EndTools", m_endtools, "List of End ITauToolBase tools" );
@@ -69,574 +66,569 @@ TrigTauRecMergedMT::~TrigTauRecMergedMT()
 
 StatusCode TrigTauRecMergedMT::initialize()
 {
-   ATH_MSG_DEBUG("TrigTauRecMergedMT::initialize()");
-
-   m_tauEventData.setInTrigger(true);
-   if ( m_tools.begin() == m_tools.end() ) {
-      ATH_MSG_DEBUG(" no tools given for this algorithm.");
+  ATH_MSG_DEBUG("TrigTauRecMergedMT::initialize()");
+
+  m_tauEventData.setInTrigger(true);
+  if ( m_tools.begin() == m_tools.end() ) {
+    ATH_MSG_DEBUG(" no tools given for this algorithm.");
+    return StatusCode::FAILURE;
+  }
+
+  ToolHandleArray<ITauToolBase> ::iterator p_itT = m_tools.begin();
+  ToolHandleArray<ITauToolBase> ::iterator p_itTE = m_tools.end();
+  ATH_MSG_DEBUG("List of tools in execution sequence:");
+
+  for(; p_itT != p_itTE; ++p_itT ) {
+    StatusCode p_sc = p_itT->retrieve();
+    if( p_sc.isFailure() ) {
+      ATH_MSG_DEBUG("Cannot find tool named <" << *p_itT << ">");
       return StatusCode::FAILURE;
-   }
-
-   ToolHandleArray<ITauToolBase> ::iterator p_itT = m_tools.begin();
-   ToolHandleArray<ITauToolBase> ::iterator p_itTE = m_tools.end();
-   ATH_MSG_DEBUG("List of tools in execution sequence:");
-
-   for(; p_itT != p_itTE; ++p_itT ) {
-      StatusCode p_sc = p_itT->retrieve();
-      if( p_sc.isFailure() ) {
-         ATH_MSG_DEBUG("Cannot find tool named <" << *p_itT << ">");
-         return StatusCode::FAILURE;
-      }
-      else {
-         ATH_MSG_DEBUG("Add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name());
-         //if(  doTiming() ) m_mytimers.push_back(addTimer((*p_itT)->name())) ;
-         (*p_itT)->setTauEventData(&m_tauEventData);
-      }
-   }
-
-   ToolHandleArray<ITauToolBase> ::iterator p_itTe = m_endtools.begin();
-   ToolHandleArray<ITauToolBase> ::iterator p_itTEe = m_endtools.end();
-
-   for(; p_itTe != p_itTEe; ++p_itTe ) {
-      StatusCode p_sc = p_itTe->retrieve();
-      if( p_sc.isFailure() ) {
-         ATH_MSG_DEBUG("Cannot find tool named <" << *p_itTe << ">");
-         return StatusCode::FAILURE;
-      }
-      else {
-         ATH_MSG_DEBUG(" Add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name());
-         //if(  doTiming() ) m_mytimers.push_back(addTimer((*p_itTe)->name())) ;
-         ( *p_itTe )->setTauEventData(&m_tauEventData);
-      }
-   }
-
-   if (m_lumiBlockMuTool.retrieve().isFailure()) {
-     ATH_MSG_WARNING("Unable to retrieve LumiBlockMuTool");
-   } else {
-     ATH_MSG_DEBUG("Successfully retrieved LumiBlockMuTool");
-   }
-
-   // Retrieve beam conditions
-   if(m_beamSpotSvc.retrieve().isFailure()) {
-     ATH_MSG_WARNING("Unable to retrieve Beamspot service");
-        } else {
-          ATH_MSG_WARNING("Successfully retrieved Beamspot service");
-   }
-
-   if ( not m_monTool.name().empty() ) {
-     ATH_CHECK( m_monTool.retrieve() );
-   }
-
-   ATH_MSG_DEBUG( "Initialising HandleKeys" );
-   CHECK( m_roIInputKey.initialize()        );
-   CHECK( m_L1RoIKey.initialize()           );
-   CHECK( m_clustersKey.initialize()        );
-   CHECK( m_tracksKey.initialize()          );
-   CHECK( m_vertexKey.initialize()          );
-   CHECK( m_trigTauJetKey.initialize()      );
-   CHECK( m_trigtauSeedOutKey.initialize()  );
-   CHECK( m_trigtauRecOutKey.initialize()   );
-   CHECK( m_trigtauTrkOutKey.initialize()   );
-
-   return StatusCode::SUCCESS;
+    }
+    else {
+      ATH_MSG_DEBUG("Add timer for tool "<< ( *p_itT )->type() <<" "<< ( *p_itT )->name());
+      //if(  doTiming() ) m_mytimers.push_back(addTimer((*p_itT)->name())) ;
+      (*p_itT)->setTauEventData(&m_tauEventData);
+    }
+  }
+
+  ToolHandleArray<ITauToolBase> ::iterator p_itTe = m_endtools.begin();
+  ToolHandleArray<ITauToolBase> ::iterator p_itTEe = m_endtools.end();
+
+  for(; p_itTe != p_itTEe; ++p_itTe ) {
+    StatusCode p_sc = p_itTe->retrieve();
+    if( p_sc.isFailure() ) {
+      ATH_MSG_DEBUG("Cannot find tool named <" << *p_itTe << ">");
+      return StatusCode::FAILURE;
+    }
+    else {
+      ATH_MSG_DEBUG(" Add time for end tool "<< ( *p_itTe )->type() <<" "<< ( *p_itTe )->name());
+      //if(  doTiming() ) m_mytimers.push_back(addTimer((*p_itTe)->name())) ;
+      ( *p_itTe )->setTauEventData(&m_tauEventData);
+    }
+  }
+
+  if (m_lumiBlockMuTool.retrieve().isFailure()) {
+    ATH_MSG_WARNING("Unable to retrieve LumiBlockMuTool");
+  } 
+  else {
+    ATH_MSG_DEBUG("Successfully retrieved LumiBlockMuTool");
+  }
+
+  // Retrieve beam conditions
+  if(m_beamSpotSvc.retrieve().isFailure()) {
+    ATH_MSG_WARNING("Unable to retrieve Beamspot service");
+  } 
+  else {
+    ATH_MSG_WARNING("Successfully retrieved Beamspot service");
+  }
+
+  if ( not m_monTool.name().empty() ) {
+    ATH_CHECK( m_monTool.retrieve() );
+  }
+
+  ATH_MSG_DEBUG( "Initialising HandleKeys" );
+  CHECK( m_roIInputKey.initialize()        );
+  CHECK( m_L1RoIKey.initialize()           );
+  CHECK( m_clustersKey.initialize()        );
+  CHECK( m_tracksKey.initialize()          );
+  CHECK( m_vertexKey.initialize()          );
+  CHECK( m_trigTauJetKey.initialize()      );
+  CHECK( m_trigtauSeedOutKey.initialize()  );
+  CHECK( m_trigtauRecOutKey.initialize()   );
+  CHECK( m_trigtauTrkOutKey.initialize()   );
+
+  return StatusCode::SUCCESS;
 }
 
 StatusCode TrigTauRecMergedMT::finalize()
 {
-   return StatusCode::SUCCESS;
+  return StatusCode::SUCCESS;
 }
 
 StatusCode TrigTauRecMergedMT::execute()
 {
 
-   ATH_MSG_DEBUG("Execution");
-
-   auto ctx = getContext();
-
-   // variables to initialize and keep values for monitoring variables
-   std::vector<unsigned char> calo_errors(0);
-   std::vector<unsigned char> track_errors(0);
-   std::vector<unsigned char> author(0);
-   std::vector<float> deltaZ0coreTrks(0);
-   std::vector<float> deltaZ0wideTrks(0);
-
-   auto nCells             = Monitored::Scalar<int>("nRoI_EFTauCells",    0);
-   auto nTracks            = Monitored::Scalar<int>("nRoI_EFTauTracks", -10);
-   auto dEta               = Monitored::Scalar<float>("dEtaEFTau_RoI",    -10.);
-   auto dPhi               = Monitored::Scalar<float>("dPhiEFTau_RoI",    -10.);
-   auto emRadius           = Monitored::Scalar<float>("EF_EMRadius", -0.099);
-   auto hadRadius          = Monitored::Scalar<float>("EF_EMRadius", -0.099);
-   auto EtFinal            = Monitored::Scalar<float>("EF_EtFinal", 0.);
-   auto Et                 = Monitored::Scalar<float>("EF_Et", 0.);
-   auto EtHad              = Monitored::Scalar<float>("EF_EtHad",-10.);
-   auto EtEm               = Monitored::Scalar<float>("EF_EtEm",-10.);
-   auto EMFrac             = Monitored::Scalar<float>("EF_EMFrac",-10.);
-   auto IsoFrac            = Monitored::Scalar<float>("EF_IsoFrac",-1.);
-   auto centFrac           = Monitored::Scalar<float>("EF_centFrac",-10.);
-   auto nWideTrk           = Monitored::Scalar<int>("EF_nWideTrk",0);
-   auto ipSigLeadTrk       = Monitored::Scalar<float>("EF_ipSigLeadTrk",-1000.);
-   auto trFlightPathSig    = Monitored::Scalar<float>("EF_trFlightPathSig",-10.);
-   auto massTrkSys         = Monitored::Scalar<float>("EF_massTrkSys",-10.);
-   auto dRmax              = Monitored::Scalar<float>("EF_dRmax",-10.);
-   auto numTrack           = Monitored::Scalar<int>("EF_NTrk", -10);
-   auto trkAvgDist         = Monitored::Scalar<float>("EF_TrkAvgDist",-1.0);
-   auto etovPtLead         = Monitored::Scalar<float>("EF_EtovPtLead",-10.);
-   auto PSSFraction        = Monitored::Scalar<float>("EF_PSSFraction",-999.9);
-   auto EMPOverTrkSysP     = Monitored::Scalar<float>("EF_EMPOverTrkSysP",-999.9);
-   auto ChPiEMEOverCaloEME = Monitored::Scalar<float>("EF_ChPiEMEOverCaloEME",-999.9);
-   auto SumPtTrkFrac       = Monitored::Scalar<float>("EF_SumPtTrkFrac",-999.9);
-   auto innerTrkAvgDist    = Monitored::Scalar<float>("EF_innerTrkAvgDist",-1.0);
-   auto Ncand              = Monitored::Scalar<int>("EF_nCand",0);
-   auto ActualInteractions = Monitored::Scalar<float>("EF_ActualInteractions",-999.9);
-   auto AvgInteractions    = Monitored::Scalar<float>("EF_AvgInteractions",-999.9);
-   auto beamspot_x         = Monitored::Scalar<float>("EF_beamspot_x",-999.9);
-   auto beamspot_y         = Monitored::Scalar<float>("EF_beamspot_y",-999.9);
-   auto beamspot_z         = Monitored::Scalar<float>("EF_beamspot_z",-999.9);
-   auto EtaL1                 = Monitored::Scalar<float>("EtaL1",-99.9);
-   auto PhiL1                 = Monitored::Scalar<float>("PhiL1",-99.9);
-   auto EtaEF                 = Monitored::Scalar<float>("EtaEF",-99.9);
-   auto PhiEF                 = Monitored::Scalar<float>("PhiEF",-99.9);
-
-   auto EF_calo_errors        = Monitored::Collection("calo_errors",calo_errors);
-   auto EF_track_errors       = Monitored::Collection("track_errors",track_errors);
-   auto EF_author             = Monitored::Collection("author",author);
-   auto EF_deltaZ0coreTrks    = Monitored::Collection("deltaZ0coreTrks",deltaZ0coreTrks);
-   auto EF_deltaZ0wideTrks    = Monitored::Collection("deltaZ0wideTrks",deltaZ0wideTrks);
-
-   auto monitorIt = Monitored::Group( m_monTool, nCells, nTracks, dEta, dPhi, emRadius, hadRadius,
-   EtFinal, Et, EtHad, EtEm, EMFrac, IsoFrac, centFrac, nWideTrk, ipSigLeadTrk, trFlightPathSig, massTrkSys,
-   dRmax, numTrack, trkAvgDist, etovPtLead, PSSFraction, EMPOverTrkSysP, ChPiEMEOverCaloEME, SumPtTrkFrac,
-   innerTrkAvgDist, Ncand, ActualInteractions, AvgInteractions, beamspot_x, beamspot_y, beamspot_z, EtaL1,
-   PhiL1, EtaEF, PhiEF );
-
-	// Retrieve store.
-	ATH_MSG_DEBUG("Executing TrigTauRecMergedMT");
-
-	// Get RoiDescriptor
-   SG::ReadHandle< TrigRoiDescriptorCollection > roisHandle = SG::makeHandle( m_roIInputKey, ctx );
-   if(roisHandle->size()==0){
-     ATH_MSG_DEBUG("RoIHandle size = Zero");
-     return StatusCode::SUCCESS;
-   }
-   const TrigRoiDescriptor *roiDescriptor = roisHandle->at(0);
-
-	if ( roiDescriptor!= NULL ) {
-		ATH_MSG_DEBUG("REGTEST: RoI " << *roiDescriptor);
-	}
-	else {
-		ATH_MSG_DEBUG("Failed to find RoiDescriptor ");
-		calo_errors.push_back(NoROIDescr);
-		return StatusCode::SUCCESS;
-	}
-
-	// Retrieve Calocluster container
-   SG::ReadHandle< xAOD::CaloClusterContainer > CCContainerHandle = SG::makeHandle( m_clustersKey,ctx );
-   CHECK( CCContainerHandle.isValid() );
-
-   const xAOD::CaloClusterContainer *RoICaloClusterContainer = CCContainerHandle.get();
-   ATH_MSG_DEBUG( "Found " << RoICaloClusterContainer->size() << " caloClusters, updating the corresponding RoI ... " );
-
-   if(RoICaloClusterContainer != NULL) {
-     ATH_MSG_DEBUG( "REGTEST: Size of vector CaloCluster container is " << RoICaloClusterContainer->size());
-     if(RoICaloClusterContainer->size()==0) {
-       ATH_MSG_DEBUG( "Cannot proceed, size of vector CaloCluster container is " << RoICaloClusterContainer->size());
-       return StatusCode::SUCCESS;
-     }
-   }else {
-     ATH_MSG_DEBUG( "no CaloCluster container found " );
-     return StatusCode::SUCCESS;
-   }
-
-	// get TrackContainer
-   SG::ReadHandle< xAOD::TrackParticleContainer > TPContainerHandle = SG::makeHandle( m_tracksKey,ctx );
-
-   const xAOD::TrackParticleContainer *RoITrackParticleContainer = NULL;
-
-	if ( !TPContainerHandle.isValid() ) {
-		ATH_MSG_INFO("REGTEST: No Track container found.");
-		track_errors.push_back(NoTrkCont);
-	}
-	else {
-      RoITrackParticleContainer=TPContainerHandle.get();
-		ATH_MSG_DEBUG("REGTEST: Size of vector Track container is " << RoITrackParticleContainer->size());
-		if(RoITrackParticleContainer != NULL) nTracks = RoITrackParticleContainer->size();
-	}
-
-	// get Vertex Container
-   SG::ReadHandle< xAOD::VertexContainer > VertexContainerHandle = SG::makeHandle( m_vertexKey,ctx );
-
-	const xAOD::VertexContainer* RoIVxContainer = NULL;
-
-	if( !VertexContainerHandle.isValid() ) {
-		ATH_MSG_INFO(" No VxContainers retrieved for the trigger element");
-		track_errors.push_back(NoVtxCont);
-	}
-	else {
-			RoIVxContainer = VertexContainerHandle.get();
-			ATH_MSG_DEBUG("REGTEST: Size of vector Vertex  container " << RoIVxContainer->size());
-	}
-
-	double mu = 0.0;
-   double avg_mu = 0.0;
-	if(m_lumiBlockMuTool){
-	  mu     = m_lumiBlockMuTool->actualInteractionsPerCrossing(); // (retrieve mu for the current BCID)
-	  avg_mu = m_lumiBlockMuTool->averageInteractionsPerCrossing();
-     ActualInteractions = mu;
-     AvgInteractions    = avg_mu;
-	  ATH_MSG_DEBUG("REGTEST: Retrieved Mu Value : " << mu);
-	  ATH_MSG_DEBUG("REGTEST: Average Mu Value   : " << avg_mu);
-	}
+  ATH_MSG_DEBUG("Execution");
+
+  auto ctx = getContext();
+
+  // variables to initialize and keep values for monitoring variables
+  std::vector<unsigned char> calo_errors(0);
+  std::vector<unsigned char> track_errors(0);
+
+  auto nCells             = Monitored::Scalar<int>("nRoI_EFTauCells",    0);
+  auto nTracks            = Monitored::Scalar<int>("nRoI_EFTauTracks", -10);
+  auto dEta               = Monitored::Scalar<float>("dEtaEFTau_RoI",    -10.);
+  auto dPhi               = Monitored::Scalar<float>("dPhiEFTau_RoI",    -10.);
+  auto emRadius           = Monitored::Scalar<float>("EF_EMRadius", -0.099);
+  auto hadRadius          = Monitored::Scalar<float>("EF_EMRadius", -0.099);
+  auto EtFinal            = Monitored::Scalar<float>("EF_EtFinal", 0.);
+  auto Et                 = Monitored::Scalar<float>("EF_Et", 0.);
+  auto EtHad              = Monitored::Scalar<float>("EF_EtHad",-10.);
+  auto EtEm               = Monitored::Scalar<float>("EF_EtEm",-10.);
+  auto EMFrac             = Monitored::Scalar<float>("EF_EMFrac",-10.);
+  auto IsoFrac            = Monitored::Scalar<float>("EF_IsoFrac",-1.);
+  auto centFrac           = Monitored::Scalar<float>("EF_centFrac",-10.);
+  auto nWideTrk           = Monitored::Scalar<int>("EF_nWideTrk",0);
+  auto ipSigLeadTrk       = Monitored::Scalar<float>("EF_ipSigLeadTrk",-1000.);
+  auto trFlightPathSig    = Monitored::Scalar<float>("EF_trFlightPathSig",-10.);
+  auto massTrkSys         = Monitored::Scalar<float>("EF_massTrkSys",-10.);
+  auto dRmax              = Monitored::Scalar<float>("EF_dRmax",-10.);
+  auto numTrack           = Monitored::Scalar<int>("EF_NTrk", -10);
+  auto trkAvgDist         = Monitored::Scalar<float>("EF_TrkAvgDist",-1.0);
+  auto etovPtLead         = Monitored::Scalar<float>("EF_EtovPtLead",-10.);
+  auto PSSFraction        = Monitored::Scalar<float>("EF_PSSFraction",-999.9);
+  auto EMPOverTrkSysP     = Monitored::Scalar<float>("EF_EMPOverTrkSysP",-999.9);
+  auto ChPiEMEOverCaloEME = Monitored::Scalar<float>("EF_ChPiEMEOverCaloEME",-999.9);
+  auto SumPtTrkFrac       = Monitored::Scalar<float>("EF_SumPtTrkFrac",-999.9);
+  auto innerTrkAvgDist    = Monitored::Scalar<float>("EF_innerTrkAvgDist",-1.0);
+  auto Ncand              = Monitored::Scalar<int>("EF_nCand",0);
+  auto ActualInteractions = Monitored::Scalar<float>("EF_ActualInteractions",-999.9);
+  auto AvgInteractions    = Monitored::Scalar<float>("EF_AvgInteractions",-999.9);
+  auto beamspot_x         = Monitored::Scalar<float>("EF_beamspot_x",-999.9);
+  auto beamspot_y         = Monitored::Scalar<float>("EF_beamspot_y",-999.9);
+  auto beamspot_z         = Monitored::Scalar<float>("EF_beamspot_z",-999.9);
+  auto EtaL1                 = Monitored::Scalar<float>("EtaL1",-99.9);
+  auto PhiL1                 = Monitored::Scalar<float>("PhiL1",-99.9);
+  auto EtaEF                 = Monitored::Scalar<float>("EtaEF",-99.9);
+  auto PhiEF                 = Monitored::Scalar<float>("PhiEF",-99.9);
+
+  auto EF_calo_errors        = Monitored::Collection("calo_errors",calo_errors);
+  auto EF_track_errors       = Monitored::Collection("track_errors",track_errors);
+
+  auto monitorIt = Monitored::Group( m_monTool, nCells, nTracks, dEta, dPhi, emRadius, hadRadius,
+				     EtFinal, Et, EtHad, EtEm, EMFrac, IsoFrac, centFrac, nWideTrk, ipSigLeadTrk, trFlightPathSig, massTrkSys,
+				     dRmax, numTrack, trkAvgDist, etovPtLead, PSSFraction, EMPOverTrkSysP, ChPiEMEOverCaloEME, SumPtTrkFrac,
+				     innerTrkAvgDist, Ncand, ActualInteractions, AvgInteractions, beamspot_x, beamspot_y, beamspot_z, EtaL1,
+				     PhiL1, EtaEF, PhiEF );
+
+  // Retrieve store.
+  ATH_MSG_DEBUG("Executing TrigTauRecMergedMT");
+
+  // Get RoiDescriptor
+  SG::ReadHandle< TrigRoiDescriptorCollection > roisHandle = SG::makeHandle( m_roIInputKey, ctx );
+  if(roisHandle->size() == 0){
+    ATH_MSG_DEBUG("RoIHandle size = Zero");
+    return StatusCode::SUCCESS;
+  }
+  const TrigRoiDescriptor *roiDescriptor = roisHandle->at(0);
+
+  if ( roiDescriptor != nullptr ) {
+    ATH_MSG_DEBUG("REGTEST: RoI " << *roiDescriptor);
+  }
+  else {
+    ATH_MSG_DEBUG("Failed to find RoiDescriptor ");
+    calo_errors.push_back(NoROIDescr);
+    return StatusCode::SUCCESS;
+  }
+
+  // Retrieve Calocluster container
+  SG::ReadHandle< xAOD::CaloClusterContainer > CCContainerHandle = SG::makeHandle( m_clustersKey,ctx );
+  CHECK( CCContainerHandle.isValid() );
+
+  const xAOD::CaloClusterContainer *RoICaloClusterContainer = CCContainerHandle.get();
+  ATH_MSG_DEBUG( "Found " << RoICaloClusterContainer->size() << " caloClusters, updating the corresponding RoI ... " );
+
+  if(RoICaloClusterContainer != nullptr) {
+    ATH_MSG_DEBUG( "REGTEST: Size of vector CaloCluster container is " << RoICaloClusterContainer->size());
+    if(RoICaloClusterContainer->size() == 0) {
+      ATH_MSG_DEBUG( "Cannot proceed, size of vector CaloCluster container is " << RoICaloClusterContainer->size());
+      return StatusCode::SUCCESS;
+    }
+  }
+  else {
+    ATH_MSG_DEBUG( "no CaloCluster container found " );
+    return StatusCode::SUCCESS;
+  }
+
+  // get TrackContainer
+  SG::ReadHandle< xAOD::TrackParticleContainer > TPContainerHandle = SG::makeHandle( m_tracksKey,ctx );
+
+  const xAOD::TrackParticleContainer *RoITrackParticleContainer = nullptr;
+
+  if ( !TPContainerHandle.isValid() ) {
+    ATH_MSG_INFO("REGTEST: No Track container found.");
+    track_errors.push_back(NoTrkCont);
+  }
+  else {
+    RoITrackParticleContainer = TPContainerHandle.get();
+    ATH_MSG_DEBUG("REGTEST: Size of vector Track container is " << RoITrackParticleContainer->size());
+    if(RoITrackParticleContainer != nullptr) nTracks = RoITrackParticleContainer->size();
+  }
+
+  // get Vertex Container
+  SG::ReadHandle< xAOD::VertexContainer > VertexContainerHandle = SG::makeHandle( m_vertexKey,ctx );
+
+  const xAOD::VertexContainer* RoIVxContainer = nullptr;
+
+  if( !VertexContainerHandle.isValid() ) {
+    ATH_MSG_INFO(" No VxContainers retrieved for the trigger element");
+    track_errors.push_back(NoVtxCont);
+  }
+  else {
+    RoIVxContainer = VertexContainerHandle.get();
+    ATH_MSG_DEBUG("REGTEST: Size of vector Vertex  container " << RoIVxContainer->size());
+  }
+
+  double mu = 0.0;
+  double avg_mu = 0.0;
+  if(m_lumiBlockMuTool){
+    mu     = m_lumiBlockMuTool->actualInteractionsPerCrossing(); // (retrieve mu for the current BCID)
+    avg_mu = m_lumiBlockMuTool->averageInteractionsPerCrossing();
+    ActualInteractions = mu;
+    AvgInteractions    = avg_mu;
+    ATH_MSG_DEBUG("REGTEST: Retrieved Mu Value : " << mu);
+    ATH_MSG_DEBUG("REGTEST: Average Mu Value   : " << avg_mu);
+  }
 	
 
-	//-------------------------------------------------------------------------
-	// Get beamspot
-	//-------------------------------------------------------------------------
+  //-------------------------------------------------------------------------
+  // Get beamspot
+  //-------------------------------------------------------------------------
 
-	// Copy the first vertex from a const object
-	xAOD::Vertex theBeamspot;
-	theBeamspot.makePrivateStore();
-	const xAOD::Vertex* ptrBeamspot = 0;
+  // Copy the first vertex from a const object
+  xAOD::Vertex theBeamspot;
+  theBeamspot.makePrivateStore();
+  const xAOD::Vertex* ptrBeamspot = nullptr;
 
-	if(m_beamSpotSvc){
+  if(m_beamSpotSvc){
 	
-	  // Alter the position of the vertex
-	  theBeamspot.setPosition(m_beamSpotSvc->beamPos());
+    // Alter the position of the vertex
+    theBeamspot.setPosition(m_beamSpotSvc->beamPos());
 	
-	  beamspot_x=theBeamspot.x();
-	  beamspot_y=theBeamspot.y();
-	  beamspot_z=theBeamspot.z();
-
-	  // Create a AmgSymMatrix to alter the vertex covariance mat.
-	  AmgSymMatrix(3) cov = m_beamSpotSvc->beamVtx().covariancePosition();
-	  theBeamspot.setCovariancePosition(cov);
+    beamspot_x=theBeamspot.x();
+    beamspot_y=theBeamspot.y();
+    beamspot_z=theBeamspot.z();
 
-	  ptrBeamspot = &theBeamspot;
+    // Create a AmgSymMatrix to alter the vertex covariance mat.
+    AmgSymMatrix(3) cov = m_beamSpotSvc->beamVtx().covariancePosition();
+    theBeamspot.setCovariancePosition(cov);
 
-	}
+    ptrBeamspot = &theBeamspot;
+  }
 
 
-	//-------------------------------------------------------------------------
-	// Creating jet container used as "tau seed" for tau reconstruction
-	//-------------------------------------------------------------------------
+  //-------------------------------------------------------------------------
+  // Creating jet container used as "tau seed" for tau reconstruction
+  //-------------------------------------------------------------------------
 
-	// Ensure that we are using a TrigAuxContainer
-	xAOD::JetContainer* theJetCollection = new xAOD::JetContainer();
-	xAOD::JetTrigAuxContainer theJetContainer;
-	theJetCollection->setStore(&theJetContainer);
+  // Ensure that we are using a TrigAuxContainer
+  xAOD::JetContainer* theJetCollection = new xAOD::JetContainer();
+  xAOD::JetTrigAuxContainer theJetContainer;
+  theJetCollection->setStore(&theJetContainer);
 	
-	xAOD::Jet* aJet = new xAOD::Jet();
+  xAOD::Jet* aJet = new xAOD::Jet();
 
-	theJetCollection->push_back(aJet);
+  theJetCollection->push_back(aJet);
 	
-	// Build the jet, also keep track of the kinematics by hand
-	// We are using calibrated clusters, we need to keep track of this
-	aJet->setConstituentsSignalState(xAOD::JetConstitScale::CalibratedJetConstituent);
+  // Build the jet, also keep track of the kinematics by hand
+  // We are using calibrated clusters, we need to keep track of this
+  aJet->setConstituentsSignalState(xAOD::JetConstitScale::CalibratedJetConstituent);
 	
-	// Make a minimal effort to speed things up ;)
-	// Eventually, want to use FastJet here?
-	TLorentzVector myCluster;
-  	TLorentzVector TauBarycenter(0., 0., 0., 0.);
+  // Make a minimal effort to speed things up ;)
+  // Eventually, want to use FastJet here?
+  TLorentzVector myCluster;
+  TLorentzVector TauBarycenter(0., 0., 0., 0.);
   
-	xAOD::CaloClusterContainer::const_iterator clusterIt;
-	for (clusterIt=RoICaloClusterContainer->begin(); clusterIt != RoICaloClusterContainer->end(); ++clusterIt) {
-	  ATH_MSG_DEBUG(" Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )");
+  xAOD::CaloClusterContainer::const_iterator clusterIt;
+  for (clusterIt=RoICaloClusterContainer->begin(); clusterIt != RoICaloClusterContainer->end(); ++clusterIt) {
+    ATH_MSG_DEBUG(" Cluster (e, eta, phi) : ("<< (*clusterIt)->e() << " , " <<(*clusterIt)->eta()<<" , "<<(*clusterIt)->phi()<< " )");
     
-	  if((*clusterIt)->e() < 0)
-	    {
-	      ATH_MSG_DEBUG(" Negative energy cluster is rejected");
-	      continue;
-	    }
+    if((*clusterIt)->e() < 0)
+      {
+	ATH_MSG_DEBUG(" Negative energy cluster is rejected");
+	continue;
+      }
     
-	  myCluster.SetPtEtaPhiE((*clusterIt)->pt(), (*clusterIt)->eta(), (*clusterIt)->phi(), (*clusterIt)->e());
-	  aJet->addConstituent(*clusterIt);
+    myCluster.SetPtEtaPhiE((*clusterIt)->pt(), (*clusterIt)->eta(), (*clusterIt)->phi(), (*clusterIt)->e());
+    aJet->addConstituent(*clusterIt);
 
-	  TauBarycenter += myCluster;
-	}
+    TauBarycenter += myCluster;
+  }
 	
-	aJet->setJetP4(xAOD::JetFourMom_t(TauBarycenter.Pt(), TauBarycenter.Eta(), TauBarycenter.Phi(), TauBarycenter.M() ) ); 
-
-	ATH_MSG_DEBUG("jet formed"<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() );
-
-   // Prepare Outputs
-   std::unique_ptr< xAOD::JetContainer > tauSeedContainer( new xAOD::JetContainer() );
-
-   // Save Outputs
-   SG::WriteHandle< xAOD::JetContainer > outTauSeedHandle = SG::makeHandle( m_trigtauSeedOutKey,ctx );
-   CHECK( outTauSeedHandle.record( std::move( tauSeedContainer ) ) );
-
-	StatusCode processStatus    = StatusCode::SUCCESS;
-
-   // Save Outputs
-   SG::WriteHandle<xAOD::TauJetContainer> outTauJetHandle( m_trigtauRecOutKey );
-   SG::WriteHandle<xAOD::TauTrackContainer> outTauTrackHandle( m_trigtauTrkOutKey );
-
-	//-------------------------------------------------------------------------
-	// setup TauCandidate data
-	//-------------------------------------------------------------------------
-	m_tauEventData.clear();
-	xAOD::TauJetContainer *pContainer = new xAOD::TauJetContainer();
-	xAOD::TauJetAuxContainer *pAuxContainer = new xAOD::TauJetAuxContainer();
-
-	xAOD::TauTrackContainer *pTrackContainer = new xAOD::TauTrackContainer();
-	xAOD::TauTrackAuxContainer *pTrackAuxContainer = new xAOD::TauTrackAuxContainer();
-
-	pContainer->setStore(pAuxContainer);
-	pTrackContainer->setStore(pTrackAuxContainer);
-
-	m_tauEventData.setObject("TauTrackContainer", pTrackContainer);
-	m_tauEventData.xAODTauContainer = pContainer;
-	m_tauEventData.tauAuxContainer = pAuxContainer;
-
-	// Set the Objects that we can attach right now
-	m_tauEventData.setObject("TrackContainer", RoITrackParticleContainer);
-	m_tauEventData.setObject("VxPrimaryCandidate", RoIVxContainer);
-	if(m_lumiBlockMuTool) m_tauEventData.setObject("AvgInteractions", avg_mu);
-	if(m_beamSpotSvc) m_tauEventData.setObject("Beamspot", ptrBeamspot);
-	if(m_beamType == ("cosmics")) m_tauEventData.setObject("IsCosmics?", true );
-
-
-	//-------------------------------------------------------------------------
-	// eventInitialize tauRec colls
-	//-------------------------------------------------------------------------
-	ToolHandleArray<ITauToolBase> ::iterator firstTool = m_tools.begin();
-	ToolHandleArray<ITauToolBase> ::iterator lastTool  = m_tools.end();
-	for ( ; firstTool != lastTool; firstTool++ ) {
-		processStatus = (*firstTool)->eventInitialize();
-
-		if( processStatus != StatusCode :: SUCCESS ) {
-			ATH_MSG_ERROR("tool "<<(*firstTool)->name()<< "failed in eventInitialize");
-			return StatusCode::FAILURE;
-		}
-	}
-	ATH_MSG_DEBUG(" initialize all good ");
-
-	//-------------------------------------------------------------------------
-	// using Jet collection
-	// setup tau candidate structure
-	//-------------------------------------------------------------------------
-	xAOD::Jet* p_seed =    (*theJetCollection->begin());  //there is only one jet stored
-
-	xAOD::TauJet* p_tau = new xAOD::TauJet();
-	pContainer->push_back(p_tau);
-	p_tau->setROIWord(roiDescriptor->roiWord());
-	p_tau->setJet(theJetCollection, p_seed);
-	m_tauEventData.seedContainer = theJetCollection;
-
-	// This sets one track and link. Need to have at least 1 track linked to retrieve track container
-	setEmptyTauTrack(p_tau, pTrackContainer);
-
-	if(p_seed->e()<=0) {
-		msg() << MSG::DEBUG << " Roi: changing eta due to energy " << p_seed->e() << endmsg;
-		p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m());
+  aJet->setJetP4(xAOD::JetFourMom_t(TauBarycenter.Pt(), TauBarycenter.Eta(), TauBarycenter.Phi(), TauBarycenter.M() ) ); 
+
+  ATH_MSG_DEBUG("jet formed"<< aJet->eta() <<" , " << aJet->phi() <<" , " << aJet->pt() << " , "<< aJet->e() );
+
+  // Prepare Outputs
+  std::unique_ptr< xAOD::JetContainer > tauSeedContainer( new xAOD::JetContainer() );
+
+  // Save Outputs
+  SG::WriteHandle< xAOD::JetContainer > outTauSeedHandle = SG::makeHandle( m_trigtauSeedOutKey,ctx );
+  CHECK( outTauSeedHandle.record( std::move( tauSeedContainer ) ) );
+
+  StatusCode processStatus    = StatusCode::SUCCESS;
+
+  // Save Outputs
+  SG::WriteHandle<xAOD::TauJetContainer> outTauJetHandle( m_trigtauRecOutKey );
+  SG::WriteHandle<xAOD::TauTrackContainer> outTauTrackHandle( m_trigtauTrkOutKey );
+
+  //-------------------------------------------------------------------------
+  // setup TauCandidate data
+  //-------------------------------------------------------------------------
+  m_tauEventData.clear();
+  xAOD::TauJetContainer *pContainer = new xAOD::TauJetContainer();
+  xAOD::TauJetAuxContainer *pAuxContainer = new xAOD::TauJetAuxContainer();
+
+  xAOD::TauTrackContainer *pTrackContainer = new xAOD::TauTrackContainer();
+  xAOD::TauTrackAuxContainer *pTrackAuxContainer = new xAOD::TauTrackAuxContainer();
+
+  pContainer->setStore(pAuxContainer);
+  pTrackContainer->setStore(pTrackAuxContainer);
+
+  m_tauEventData.setObject("TauTrackContainer", pTrackContainer);
+  m_tauEventData.xAODTauContainer = pContainer;
+  m_tauEventData.tauAuxContainer = pAuxContainer;
+
+  // Set the Objects that we can attach right now
+  m_tauEventData.setObject("TrackContainer", RoITrackParticleContainer);
+  m_tauEventData.setObject("VxPrimaryCandidate", RoIVxContainer);
+  if(m_lumiBlockMuTool) m_tauEventData.setObject("AvgInteractions", avg_mu);
+  if(m_beamSpotSvc) m_tauEventData.setObject("Beamspot", ptrBeamspot);
+  if(m_beamType == ("cosmics")) m_tauEventData.setObject("IsCosmics?", true );
+
+
+  //-------------------------------------------------------------------------
+  // eventInitialize tauRec colls
+  //-------------------------------------------------------------------------
+  ToolHandleArray<ITauToolBase> ::iterator firstTool = m_tools.begin();
+  ToolHandleArray<ITauToolBase> ::iterator lastTool  = m_tools.end();
+  for ( ; firstTool != lastTool; firstTool++ ) {
+    processStatus = (*firstTool)->eventInitialize();
+
+    if( processStatus != StatusCode :: SUCCESS ) {
+      ATH_MSG_ERROR("tool "<<(*firstTool)->name()<< "failed in eventInitialize");
+      return StatusCode::FAILURE;
+    }
+  }
+  ATH_MSG_DEBUG(" initialize all good ");
+
+  //-------------------------------------------------------------------------
+  // using Jet collection
+  // setup tau candidate structure
+  //-------------------------------------------------------------------------
+  xAOD::Jet* p_seed = (*theJetCollection->begin());  //there is only one jet stored
+
+  xAOD::TauJet* p_tau = new xAOD::TauJet();
+  pContainer->push_back(p_tau);
+  p_tau->setROIWord(roiDescriptor->roiWord());
+  p_tau->setJet(theJetCollection, p_seed);
+  m_tauEventData.seedContainer = theJetCollection;
+
+  // This sets one track and link. Need to have at least 1 track linked to retrieve track container
+  // Can't we instead implement in the EDM a function to retrieve the track container of a tau?
+  setEmptyTauTrack(p_tau, pTrackContainer);
+
+  if(p_seed->e()<=0) {
+    ATH_MSG_DEBUG( "Roi: changing eta due to energy " << p_seed->e() );
+    p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m());
 		
-		msg() << MSG::DEBUG << "Roi: " << roiDescriptor->roiId()
-        		  << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi()
-        		  << endmsg;
-	}
-
-	ATH_MSG_DEBUG(" roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() );
-
-	m_tauEventData.setObject("JetCollection", theJetCollection );
-
-	//-------------------------------------------------------------------------
-	// loop over booked tau tools
-	//-------------------------------------------------------------------------
-	int toolnum = 0;
-	firstTool = m_tools.begin();
-	lastTool  = m_tools.end();
-	processStatus    = StatusCode::SUCCESS;
-	ATH_MSG_DEBUG("Starting tool loop with seed jet");
-	//std::vector<TrigTimer* >::iterator itimer =  m_mytimers.begin();
-	while ( ! processStatus.isFailure() && firstTool != lastTool ) {
-	   // loop stops only when Failure indicated by one of the tools
-	   ATH_MSG_DEBUG("Starting Tool: " <<  (*firstTool)->name() );
-		// time in the various tools
-		++toolnum;
-		//if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->start();
-
-		processStatus = (*firstTool)->execute( *p_tau );
-		if ( !processStatus.isFailure() ) {
-			ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " executed successfully ");
-	      ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId()
-            						<< " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi()
-            						<< " Tau pT : "<< p_tau->pt());
-		}
-		else {
-			ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " execution failed ");
-		}
-		++firstTool;
-		//++itimer;
-		//if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->stop();
-	}
-
-	//check status
-	if ( !processStatus.isSuccess() )  {   // some problem
-		ATH_MSG_DEBUG("the tau object has NOT been registered in the tau container");
-		// ToolHandleArray<ITauToolBase> ::iterator tool = m_tools.begin();
-		// for(; tool != firstTool; ++tool ) (*tool)->cleanup( &m_tauEventData );
-		// (*tool)->cleanup( &m_tauEventData );
-
-		xAOD::TauJet* bad_tau = pContainer->back();
-		ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << "Tracks associated with tau: ");
-		pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end());
-
-		pContainer->pop_back();
-
-		ATH_MSG_DEBUG("clean up done after jet seed");
-	}
-	else if( processStatus.isSuccess()) {
-
-	  float fJetEnergy = (*p_tau->jetLink())->e();
-	  ATH_MSG_DEBUG(" Roi: jet e "<< fJetEnergy);
+    ATH_MSG_DEBUG( "Roi: " << roiDescriptor->roiId() << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi() );
+  }
+
+  ATH_MSG_DEBUG(" roidescriptor roiword " << roiDescriptor->roiWord() << " saved " << p_tau->ROIWord() );
+
+  m_tauEventData.setObject("JetCollection", theJetCollection );
+
+  //-------------------------------------------------------------------------
+  // loop over booked tau tools
+  //-------------------------------------------------------------------------
+  int toolnum = 0;
+  firstTool = m_tools.begin();
+  lastTool  = m_tools.end();
+  processStatus    = StatusCode::SUCCESS;
+  ATH_MSG_DEBUG("Starting tool loop with seed jet");
+  //std::vector<TrigTimer* >::iterator itimer =  m_mytimers.begin();
+  while ( ! processStatus.isFailure() && firstTool != lastTool ) {
+    // loop stops only when Failure indicated by one of the tools
+    ATH_MSG_DEBUG("Starting Tool: " <<  (*firstTool)->name() );
+    // time in the various tools
+    ++toolnum;
+    //if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->start();
+
+    processStatus = (*firstTool)->execute( *p_tau );
+    if ( !processStatus.isFailure() ) {
+      ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " executed successfully ");
+      ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId()
+		    << " Tau eta: " << p_tau->eta() << " Tau phi: " << p_tau->phi()
+		    << " Tau pT : "<< p_tau->pt());
+    }
+    else {
+      ATH_MSG_DEBUG("REGTEST: "<< (*firstTool)->name() << " execution failed ");
+    }
+    ++firstTool;
+    //++itimer;
+    //if ( doTiming() && itimer != m_mytimers.end() ) (*itimer)->stop();
+  }
+
+  //check status
+  if ( !processStatus.isSuccess() )  {   // some problem
+    ATH_MSG_DEBUG("The tau object has NOT been registered in the tau container");
+    // ToolHandleArray<ITauToolBase> ::iterator tool = m_tools.begin();
+    // for(; tool != firstTool; ++tool ) (*tool)->cleanup( &m_tauEventData );
+    // (*tool)->cleanup( &m_tauEventData );
+
+    xAOD::TauJet* bad_tau = pContainer->back();
+    ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << " tracks associated with tau");
+    pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end());
+
+    pContainer->pop_back();
+
+    ATH_MSG_DEBUG("Clean up done after jet seed");
+  }
+  else {
+
+    float fJetEnergy = (*p_tau->jetLink())->e();
+    ATH_MSG_DEBUG("Roi: jet e "<< fJetEnergy);
 	  
-	  if( fJetEnergy < 0.00001 ) {
-	    ATH_MSG_DEBUG(" Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)");
-	    ATH_MSG_DEBUG(" Roi: this is probably not needed anymore, method PxPyPzE has been corrected");
+    if( fJetEnergy < 0.00001 ) {
+      ATH_MSG_DEBUG("Roi: changing eta phi to L1 ones due to energy negative (PxPyPzE flips eta and phi)");
+      ATH_MSG_DEBUG("Roi: this is probably not needed anymore, method PxPyPzE has been corrected");
 	    
-	    //p_tau->setEta(roiDescriptor->eta0());
-	    //p_tau->setPhi(roiDescriptor->phi0());
-	    // Direct accessors not available anymore
-	    p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m());
+      p_tau->setP4(p_tau->pt(), roiDescriptor->eta(), roiDescriptor->phi(), p_tau->m());
 	    
-	    ATH_MSG_DEBUG(" Roi: " << roiDescriptor->roiId()
-		  << " Tau eta: " << p_tau->eta()
-		  << " Tau phi: " << p_tau->phi()
-		  << " Tau pT : "<< p_tau->pt());
-	  }
+      ATH_MSG_DEBUG("Roi: " << roiDescriptor->roiId()
+		    << " Tau eta: " << p_tau->eta()
+		    << " Tau phi: " << p_tau->phi()
+		    << " Tau pT : "<< p_tau->pt());
+    }
 	  
-	  // loop over end tools
-	  ToolHandleArray<ITauToolBase> ::iterator p_itET = m_endtools.begin();
-	  ToolHandleArray<ITauToolBase> ::iterator p_itETE = m_endtools.end();
-	  for (; p_itET != p_itETE; ++p_itET ) {
-	    ATH_MSG_VERBOSE("Invoking endTool " << ( *p_itET )->name() );
+    // loop over end tools
+    ToolHandleArray<ITauToolBase> ::iterator p_itET = m_endtools.begin();
+    ToolHandleArray<ITauToolBase> ::iterator p_itETE = m_endtools.end();
+    for (; p_itET != p_itETE; ++p_itET ) {
+      ATH_MSG_VERBOSE("Invoking endTool " << ( *p_itET )->name() );
 	    
-	    processStatus = ( *p_itET )->execute( *p_tau);
-	    if( processStatus.isFailure() ) break;
-	  }
-	  // Get L1 RoiDescriptor
-     SG::ReadHandle< TrigRoiDescriptorCollection > L1roisHandle = SG::makeHandle( m_L1RoIKey, ctx );
-     const TrigRoiDescriptor *roiL1Descriptor = L1roisHandle->at(0);
-
-	  EtaL1         =  roiL1Descriptor->eta();
-	  PhiL1         =  roiL1Descriptor->phi();
-
-	  // get tau detail variables for Monitoring
-	  numTrack      = p_tau->nTracks();
-	  nWideTrk = p_tau->nTracksIsolation();
-	  p_tau->detail(xAOD::TauJetParameters::trkAvgDist, trkAvgDist);
-	  p_tau->detail(xAOD::TauJetParameters::etOverPtLeadTrk, etovPtLead);
-	  p_tau->detail(xAOD::TauJetParameters::EMRadius, emRadius);
-	  p_tau->detail(xAOD::TauJetParameters::hadRadius, hadRadius);
-	  p_tau->detail(xAOD::TauJetParameters::isolFrac, IsoFrac);
-	  p_tau->detail(xAOD::TauJetParameters::centFrac, centFrac);
-	  p_tau->detail(xAOD::TauJetParameters::ipSigLeadTrk, ipSigLeadTrk);
-	  p_tau->detail(xAOD::TauJetParameters::trFlightPathSig, trFlightPathSig);
-	  p_tau->detail(xAOD::TauJetParameters::dRmax, dRmax);
-	  p_tau->detail(xAOD::TauJetParameters::massTrkSys, massTrkSys);
+      processStatus = ( *p_itET )->execute( *p_tau);
+      if( processStatus.isFailure() ) break;
+    }
+
+    // Get L1 RoiDescriptor
+    SG::ReadHandle< TrigRoiDescriptorCollection > L1roisHandle = SG::makeHandle( m_L1RoIKey, ctx );
+
+    if ( L1roisHandle.isValid() && (L1roisHandle->size() != 0) ) {
+      const TrigRoiDescriptor *roiL1Descriptor = L1roisHandle->at(0);      
+      EtaL1 = roiL1Descriptor->eta();
+      PhiL1 = roiL1Descriptor->phi();
+    }
+    else {
+      ATH_MSG_WARNING("Failed to retrieve L1 RoI descriptor!");
+    }
+
+    // get tau detail variables for Monitoring
+    numTrack      = p_tau->nTracks();
+    nWideTrk = p_tau->nTracksIsolation();
+    p_tau->detail(xAOD::TauJetParameters::trkAvgDist, trkAvgDist);
+    p_tau->detail(xAOD::TauJetParameters::etOverPtLeadTrk, etovPtLead);
+    p_tau->detail(xAOD::TauJetParameters::EMRadius, emRadius);
+    p_tau->detail(xAOD::TauJetParameters::hadRadius, hadRadius);
+    p_tau->detail(xAOD::TauJetParameters::isolFrac, IsoFrac);
+    p_tau->detail(xAOD::TauJetParameters::centFrac, centFrac);
+    p_tau->detail(xAOD::TauJetParameters::ipSigLeadTrk, ipSigLeadTrk);
+    p_tau->detail(xAOD::TauJetParameters::trFlightPathSig, trFlightPathSig);
+    p_tau->detail(xAOD::TauJetParameters::dRmax, dRmax);
+    p_tau->detail(xAOD::TauJetParameters::massTrkSys, massTrkSys);
 	  
-	  p_tau->detail(xAOD::TauJetParameters::PSSFraction, PSSFraction);
-	  p_tau->detail(xAOD::TauJetParameters::EMPOverTrkSysP, EMPOverTrkSysP);
-	  p_tau->detail(xAOD::TauJetParameters::ChPiEMEOverCaloEME, ChPiEMEOverCaloEME);
-	  p_tau->detail(xAOD::TauJetParameters::innerTrkAvgDist, innerTrkAvgDist);	 
-     p_tau->detail(xAOD::TauJetParameters::SumPtTrkFrac, SumPtTrkFrac);
-
-	  massTrkSys /= 1000.; // make GeV
-	  p_tau->detail(xAOD::TauJetParameters::etEMAtEMScale, EtEm);
-	  EtEm /= 1000.;  // make GeV
-	  p_tau->detail(xAOD::TauJetParameters::etHadAtEMScale, EtHad);
-	  EtHad /= 1000.; // make GeV
-	  Et            = EtEm + EtHad;
-	  EtFinal       = p_tau->pt()/1000.;
-	  
-	  EtaEF = p_tau->eta();
-	  PhiEF = p_tau->phi();
+    p_tau->detail(xAOD::TauJetParameters::PSSFraction, PSSFraction);
+    p_tau->detail(xAOD::TauJetParameters::EMPOverTrkSysP, EMPOverTrkSysP);
+    p_tau->detail(xAOD::TauJetParameters::ChPiEMEOverCaloEME, ChPiEMEOverCaloEME);
+    p_tau->detail(xAOD::TauJetParameters::innerTrkAvgDist, innerTrkAvgDist);	 
+    p_tau->detail(xAOD::TauJetParameters::SumPtTrkFrac, SumPtTrkFrac);
+
+    massTrkSys /= Gaudi::Units::GeV;
+    p_tau->detail(xAOD::TauJetParameters::etEMAtEMScale, EtEm);
+    EtEm /= Gaudi::Units::GeV;
+    p_tau->detail(xAOD::TauJetParameters::etHadAtEMScale, EtHad);
+    EtHad /= Gaudi::Units::GeV;
+    Et            = EtEm + EtHad;
+    EtFinal       = p_tau->pt()/Gaudi::Units::GeV;
+    
+    EtaEF = p_tau->eta();
+    PhiEF = p_tau->phi();
 	  
-	  if( Et !=0) EMFrac =  EtEm/ Et ;
+    if( Et !=0) EMFrac =  EtEm/ Et ;
 	  
-	  dEta =  EtaEF - roiDescriptor->eta();
-	  dPhi =  PhiEF - roiDescriptor->phi();
-	  if(dPhi<-M_PI) dPhi += 2.0*M_PI;
-	  if(dPhi>M_PI)  dPhi -= 2.0*M_PI;
+    dEta =  EtaEF - roiDescriptor->eta();
+    dPhi =  PhiEF - roiDescriptor->phi();
+    if(dPhi<-M_PI) dPhi += 2.0*M_PI;
+    if(dPhi>M_PI)  dPhi -= 2.0*M_PI;
 
-	  std::vector<const xAOD::TauJetContainer*> tempCaloOnlyContVec;
+    std::vector<const xAOD::TauJetContainer*> tempCaloOnlyContVec;
 
-     // get TauJetContainer
-     SG::ReadHandle< xAOD::TauJetContainer > TJContainerHandle = SG::makeHandle( m_trigTauJetKey,ctx );
-     const xAOD::TauJetContainer *tempCaloOnlyCont=TJContainerHandle.get();
-     tempCaloOnlyContVec.push_back(tempCaloOnlyCont);
+    // get TauJetContainer
+    SG::ReadHandle< xAOD::TauJetContainer > TJContainerHandle = SG::makeHandle( m_trigTauJetKey,ctx );
+    const xAOD::TauJetContainer *tempCaloOnlyCont=TJContainerHandle.get();
+    tempCaloOnlyContVec.push_back(tempCaloOnlyCont);
 
-	  /*if( !tempCaloOnlyContVec.isValid()){
+    /*if( !tempCaloOnlyContVec.isValid()){
 
-	    ATH_MSG_DEBUG( "Can't get container TrigTauRecCaloOnly to copy four-vector");
+      ATH_MSG_DEBUG( "Can't get container TrigTauRecCaloOnly to copy four-vector");
 
-	  } else {*/
-	    if (tempCaloOnlyCont) {
+      } else {*/
+    if (tempCaloOnlyCont) {
 
-	      // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back();
-	      // for(xAOD::TauJetContainer::const_iterator tauIt = tempCaloOnlyTauCont->begin(); tauIt != tempCaloOnlyTauCont->end(); tauIt++){ 
+      // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back();
+      // for(xAOD::TauJetContainer::const_iterator tauIt = tempCaloOnlyTauCont->begin(); tauIt != tempCaloOnlyTauCont->end(); tauIt++){ 
 
-	      // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back();
+      // const xAOD::TauJetContainer* tempCaloOnlyTauCont = tempCaloOnlyContVec.back();
 
-	      for(auto tauIt: *tempCaloOnlyCont){
-           ATH_MSG_DEBUG("On the loop");
-	   	  ATH_MSG_DEBUG("pT(tau) = " << tauIt->pt() << " pT(caloOnly) = " << tauIt->ptTrigCaloOnly() );
+      for(auto tauIt: *tempCaloOnlyCont){
+	ATH_MSG_DEBUG("On the loop");
+	ATH_MSG_DEBUG("pT(tau) = " << tauIt->pt() << " pT(caloOnly) = " << tauIt->ptTrigCaloOnly() );
 	  	
-	   	  p_tau->setP4(xAOD::TauJetParameters::TrigCaloOnly, tauIt->ptTrigCaloOnly(), tauIt->etaTrigCaloOnly(), tauIt->phiTrigCaloOnly(), tauIt->mTrigCaloOnly());
-
-	      }
+	p_tau->setP4(xAOD::TauJetParameters::TrigCaloOnly, tauIt->ptTrigCaloOnly(), tauIt->etaTrigCaloOnly(), tauIt->phiTrigCaloOnly(), tauIt->mTrigCaloOnly());
+      }
 	      
-	    //}
+      //}
 	    
-	  }else{
-               ATH_MSG_WARNING( "TauJetContainer not found :");
-     }
-
-	  ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId()
-		<< " Tau being saved eta: " << EtaEF << " Tau phi: " << PhiEF
-		<< " wrt L1 dEta "<< dEta<<" dPhi "<<dPhi
-		<< " Tau Et (GeV): "<< EtFinal);
-	  
-	  ++Ncand;
-	}
-	else {
-	  xAOD::TauJet* bad_tau = pContainer->back();
-	  ATH_MSG_DEBUG("Deleting " << bad_tau->nAllTracks() << "Tracks associated with tau: ");
-	  pTrackContainer->erase(pTrackContainer->end()-bad_tau->nAllTracks(), pTrackContainer->end());
-	  pContainer->pop_back();
+    }
+    else{
+      ATH_MSG_WARNING( "TauJetContainer not found :");
+    }
+    
+    ATH_MSG_DEBUG("REGTEST: Roi: " << roiDescriptor->roiId()
+		  << " Tau being saved eta: " << EtaEF << " Tau phi: " << PhiEF
+		  << " wrt L1 dEta "<< dEta<<" dPhi "<<dPhi
+		  << " Tau Et (GeV): "<< EtFinal);
 	  
-	  ATH_MSG_DEBUG("deleted tau done after jet seed");
-	}
+    ++Ncand;
+  }
+
 	
-	// call eventFinalize on the booked tau tools
-	for ( firstTool = m_tools.begin(); firstTool != lastTool; firstTool++ ) {
-	  processStatus = (*firstTool)->eventFinalize();
-	  if( processStatus != StatusCode :: SUCCESS ) {
-	    ATH_MSG_DEBUG("tool "<<(*firstTool)->name()<< "failed in eventFinalize");
-	    return StatusCode::FAILURE;
-	  }
-	}
-	ATH_MSG_DEBUG("tools succeed in eventFinalize");
+  // call eventFinalize on the booked tau tools
+  for ( firstTool = m_tools.begin(); firstTool != lastTool; firstTool++ ) {
+    processStatus = (*firstTool)->eventFinalize();
+    if( processStatus != StatusCode :: SUCCESS ) {
+      ATH_MSG_DEBUG("tool "<<(*firstTool)->name()<< "failed in eventFinalize");
+      return StatusCode::FAILURE;
+    }
+  }
+  ATH_MSG_DEBUG("Tools succeed in eventFinalize");
 	
 	
-	//-------------------------------------------------------------------------
-	// all done, register the tau Container in TDS.
-	//-------------------------------------------------------------------------
-
-   ATH_MSG_DEBUG("Output TauJetContainer size:"<< pContainer->size());
-   ATH_MSG_DEBUG("Output TauTrackJetContainer size:"<< pTrackContainer->size());
-
-   CHECK( outTauJetHandle.record(std::unique_ptr<xAOD::TauJetContainer>{pContainer}, std::unique_ptr<xAOD::TauJetAuxContainer>{pAuxContainer}) );
-   CHECK( outTauTrackHandle.record(std::unique_ptr<xAOD::TauTrackContainer>{pTrackContainer}, std::unique_ptr<xAOD::TauTrackAuxContainer>{pTrackAuxContainer}) );
-
-   ATH_MSG_DEBUG("Recorded a tau container: HLT_TrigTauRecMergedMT");
-	ATH_MSG_DEBUG("the tau object has been registered in the tau container");
-
-	// set status of TE to always true for FE algorithms
-	return StatusCode::SUCCESS;
+  //-------------------------------------------------------------------------
+  // all done, register the tau Container in TDS.
+  //-------------------------------------------------------------------------
+  
+  ATH_MSG_DEBUG("Output TauJetContainer size:"<< pContainer->size());
+  ATH_MSG_DEBUG("Output TauTrackJetContainer size:"<< pTrackContainer->size());
+  
+  CHECK( outTauJetHandle.record(std::unique_ptr<xAOD::TauJetContainer>{pContainer}, std::unique_ptr<xAOD::TauJetAuxContainer>{pAuxContainer}) );
+  CHECK( outTauTrackHandle.record(std::unique_ptr<xAOD::TauTrackContainer>{pTrackContainer}, std::unique_ptr<xAOD::TauTrackAuxContainer>{pTrackAuxContainer}) );
+  
+  ATH_MSG_DEBUG("Recorded a tau container: HLT_TrigTauRecMergedMT");
+  ATH_MSG_DEBUG("the tau object has been registered in the tau container");
+  
+  
+  // the validity of element links in data will need to be checked in R22! (see TrigTauRecMerged.cxx)
+  
+  
+  // set status of TE to always true for FE algorithms
+  return StatusCode::SUCCESS;
 }
 
 void TrigTauRecMergedMT::setEmptyTauTrack(xAOD::TauJet* &pTau,
-                                       xAOD::TauTrackContainer* &tauTrackContainer)
+					  xAOD::TauTrackContainer* &tauTrackContainer)
 {
   // Make a new tau track, add to container
   xAOD::TauTrack* pTrack = new xAOD::TauTrack();
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py
index c4a37f2a27f2f420f40e4310bdbee0d63072d870..ed6f36146ee7a707b69b016159d404b2d7c2f736 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDef.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 """ Tau slice signatures """
 
@@ -10,23 +10,19 @@ from AthenaCommon.Logging import logging
 logging.getLogger().info("Importing %s",__name__)
 log = logging.getLogger(__name__)
 
-from InDetTrigParticleCreation.InDetTrigParticleCreationConf import InDet__TrigVertexxAODCnv 
-from InDetTrigRecExample.EFInDetConfig import TrigEFIDInsideOut_Tau
 from TrigCaloRec.TrigCaloRecConfig import TrigCaloCellMaker_tau, TrigCaloClusterMaker_topo
 from TrigFTK_RecAlgs.TrigFTK_RecAlgs_Config import TrigFTK_VxPrimary_EF
 from TrigInDetConf.TrigInDetFTKSequence import TrigInDetFTKSequence
 from TrigInDetConf.TrigInDetSequence import TrigInDetSequence
-from TrigT2CaloTau.TrigT2CaloTauConfig import T2CaloTau_Tau_Med
-from TrigT2IDTau.T2IDTauConfig import T2IDTau_Tau_1GeV_dZ02_dR0103
-from TrigT2Tau.T2TauFinalConfig import T2TauFinal_Tau_dR03_1GeV_dZ02
-from TrigTauDiscriminant.TrigTauDiscriGetter import TrigTauDiscriGetter, TrigTauDiscriGetter2015
+from TrigTauDiscriminant.TrigTauDiscriGetter import TrigTauDiscriGetter2015
 from TrigTauHypo.TrigTauHypoBase import HLTTrackTauHypo_rejectNoTracks
 from TrigTauHypo.TrigTauHypoConf import HLTTauCaloRoiUpdater, HLTTauTrackRoiUpdater
-from TrigTauRec.TrigTauRecConfig import (TrigTauRecMerged_Tau2012,
-                                         TrigTauRecMerged_TauCaloOnly,
+from TrigTauRec.TrigTauRecConfig import (TrigTauRecMerged_TauCaloOnly,
+                                         TrigTauRecMerged_TauCaloOnlyMVA,
                                          TrigTauRecMerged_TauFTK,
                                          TrigTauRecMerged_TauPrecision,
-                                         TrigTauRecMerged_TauPreselection)
+                                         TrigTauRecMerged_TauPreselection,
+                                         TrigTauRecMerged_TauPrecisionMVA)
 from TrigTauRec.TrigTauRecCosmicsConfig import TrigTauRecCosmics_Tau2012
 from TriggerMenu.menu.HltConfig import L2EFChainDef, mergeRemovingOverlap
 
@@ -88,12 +84,11 @@ class L2EFChain_tau(L2EFChainDef):
         selection    = self.chainPart['selection']
         preselection = self.chainPart['preselection']
 
-        if 'r1' in selection or 'r1' in preselection:
-            # Run-I set-up
-            self.setup_tauChainRunOne()
-        else:
-            # Run-II set-up
-            self.setup_tauChain()
+        # Run-I setup no longer supported
+        assert('r1' not in selection and 'r1' not in preselection), "Run-1 chains no longer supported! " + self.chainName
+
+        # Run-II setup
+        self.setup_tauChain()
        
         L2EFChainDef.__init__(self, self.chainName, self.L2Name, self.chainCounter, chainDict['L1item'], self.EFName, self.chainCounter, self.L2InputTE)
 
@@ -142,6 +137,16 @@ class L2EFChain_tau(L2EFChainDef):
         self.EFsequenceList += [[[ self.currentItem ],
                                  [caloRec],
                                  self.continueChain('L2', 'calorec')]]
+
+    #create the TrigTauRec Calorimeter only sequence    
+    def addTrigTauRecCaloOnlyMVASequence(self,threshold,selection,preselection):  # MVA TES (ATR-17687)
+
+        # Run TrigTauRec, calorimeter only (to get proper calibration, and cell-based vars)
+        caloRec = TrigTauRecMerged_TauCaloOnlyMVA()
+
+        self.EFsequenceList += [[[ self.currentItem ],
+                                 [caloRec],
+                                 self.continueChain('L2', 'calorec')]]
         
     #create the Calorimeter hypo (selection) sequence    
     def addCaloHypoSequence(self,threshold,selection,preselection):    
@@ -162,7 +167,7 @@ class L2EFChain_tau(L2EFChainDef):
         elif preselection == 'FTKRefit':
             [trkfast, trkprec[:]] = TrigInDetFTKSequence("Tau","tau",sequenceFlavour=["refit","PT"]).getSequence()
         elif preselection == 'FTKNoPrec':
-            [trkfast] = TrigInDetFTKSequence("Tau","tau","").getSequence()
+            [trkfast] = TrigInDetFTKSequence("Tau","tau",sequenceFlavour=[""]).getSequence()
             [trkprec[:]] = TrigInDetFTKSequence("Tau","tau",sequenceFlavour=["refit"]).getSequence()
         else:
             [trkfast, trkprec[:]] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence()
@@ -191,28 +196,17 @@ class L2EFChain_tau(L2EFChainDef):
         theTrigFTK_VxPrimary_EF = TrigFTK_VxPrimary_EF("TauFTKVertex", "Tau")
         theTrigFTK_VxPrimary_EF.useRawTracks = False
         theTrigFTK_VxPrimary_EF.useRefittedTracks = False
-
-        # to allow compatibility between release 20.11 and 21
-#        from TrigInDetConf.TrigInDetSequence import vertexXAODCnvNeeded 
-#        if vertexXAODCnvNeeded():
-#           theTrigFTK_VxPrimary_EF.vxContainerName = 'PrimVxFTK'
-#           theTrigFTK_VxPrimary_EF.getVertexContainer = False
-#           theInDet__TrigVertexxAODCnv = InDet__TrigVertexxAODCnv(name="FTKTauVtxConversion")
-#           theInDet__TrigVertexxAODCnv.InputVxContainerKey = 'PrimVxFTK'
-#           theInDet__TrigVertexxAODCnv.OutputVxContainerKey = 'PrimVertexFTK'
-#           vertexAlgorithms = [theTrigFTK_VxPrimary_EF, theInDet__TrigVertexxAODCnv]
-#           self.EFsequenceList += [[[ self.currentItem ],vertexAlgorithms,self.continueChain('L2', 'vertex')]]          
-#        else:
         theTrigFTK_VxPrimary_EF.vertexContainerName= 'PrimVertexFTK'
         theTrigFTK_VxPrimary_EF.getVertexContainer = True
         vertexAlgorithms = [theTrigFTK_VxPrimary_EF]
+
         self.EFsequenceList += [[[ self.currentItem ], vertexAlgorithms, self.continueChain('L2', 'vertex')]]
         
     #create the TrigTauRec preselection sequence       
     def addTrigTauRecTauPreselectionSequence(self,threshold,selection,preselection,idperf):              
         # Run TrigTauRec to store pre-selected taus
         recPreselection = TrigTauRecMerged_TauPreselection()
-
+            
         self.EFsequenceList += [[[ self.currentItem ],
                                  [recPreselection],
                                  self.continueChain('L2', 'storepre')]]
@@ -238,11 +232,10 @@ class L2EFChain_tau(L2EFChainDef):
         # Here we load our new tau-specific RoI Updater
         tauRoiUpdater = HLTTauTrackRoiUpdater()
         # This will add up to a tolerance of 5 mm due to the extra 3mm tolerance from the FTF
-        # tauRoiUpdater.z0HalfWidth = 2.0 # Temporarily widened to 10 mm
         tauRoiUpdater.z0HalfWidth = 7.0
 
         #ftracks = trkcore+[tauRoiUpdater]+trkiso
-        if not idperf:
+        if not idperf and preselection != 'tracktwoMVA':
             ftracks = trkcore + [tauRoiUpdater, tauRejectEmpty] + trkiso
         else :
             ftracks = trkcore+[tauRoiUpdater]+trkiso
@@ -291,8 +284,6 @@ class L2EFChain_tau(L2EFChainDef):
     def setup_tauChain(self):
 
         threshold   = self.chainPart['threshold']
-        calibration = self.chainPart['calib']
-        recoAlg     = self.chainPart['recoAlg'] 
         selection   = self.chainPart['selection']
         preselection= self.chainPart['preselection']
         idperf      = "idperf" in self.chainPart['trkInfo']
@@ -301,23 +292,37 @@ class L2EFChain_tau(L2EFChainDef):
         # Cleaner if-statements
         # Strategies which need calorimeter pre-selection
         needsCaloPre  = ['calo', 'ptonly', 'mvonly', 'caloonly',
-                         'track', 'trackonly', 'tracktwo',
+                         'track', 'trackonly', 'tracktwo', 'tracktwoEF',
                          'trackcalo', 'tracktwocalo','tracktwo2015']
+        needsCaloMVAPre = ['tracktwoEFmvaTES','tracktwoMVA']
         # Strategies which need fast-track finding
         needsTrackTwoPre = ['tracktwo', 'tracktwoonly', 'tracktwocalo','tracktwo2015']
+        needsTrackTwoNoPre = ['tracktwoEF','tracktwoEFmvaTES','tracktwoMVA']
         needsTrackPre    = ['track', 'trackonly', 'trackcalo', 'FTK', 'FTKRefit', 'FTKNoPrec']
         # Strategies which need Run-II final hypo
-        needsRun2Hypo = ['calo', 'ptonly', 'mvonly', 'caloonly',
-                         'trackonly', 'track', 'tracktwo', 'tracktwocalo', 'trackcalo', 'FTK', 'FTKRefit', 'FTKNoPrec', 'tracktwo2015']
-        fastTrackingUsed = needsTrackPre + needsTrackTwoPre
+        needsRun2Hypo = ['calo', 'ptonly', 'mvonly', 'caloonly', 'trackonly', 'track', 'tracktwo', 'tracktwoEF', 'tracktwoEFmvaTES', 'tracktwoMVA', 'tracktwocalo', 'trackcalo', 'FTK', 'FTKRefit', 'FTKNoPrec', 'tracktwo2015']
+        fastTrackingUsed = needsTrackPre + needsTrackTwoPre + needsTrackTwoNoPre
+
+
+        # 2018 preselection
+        preselection2018 = needsCaloMVAPre + needsTrackTwoNoPre
+        # MVA TES for preselection and precision steps
+        MVATES = preselection in needsCaloMVAPre
+        # track counting based on EF tracks + BDT classification for core tracks
+        #TrackBDT = preselection in ['tracktwoMVA']
+        # can't afford to use track BDT unfortunately, rates too high (especially when including 0p)
+        TrackBDT = False
+        # evaluate RNN for triggers using RNN ID, and 2018 support triggers (even those using BDT ID, to avoid too many different precision sequences)
+        RNN = selection in ['verylooseRNN', 'looseRNN', 'mediumRNN', 'tightRNN'] or preselection in preselection2018
+        # chains using 2018 features
+        needsAlgo2018 = (preselection in preselection2018) or MVATES or TrackBDT or RNN 
+        # give unique name to precision sequence
+        use = {True:'', False:'no'}
+        MVAprefix = '{0}MVATES_{1}TrackBDT_{2}RNN'.format(use[MVATES], use[TrackBDT], use[RNN])
+
         
         #Set the default values
         [trkcore, trkprec] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence()
-
-        # Temporary hack to handle naming scheme
-        if 'r1' in selection:
-            preselection = 'r1'
-            selection = selection.replace('r1', '')
     
         # Overrule the final EF selection
         if idperf:
@@ -337,15 +342,22 @@ class L2EFChain_tau(L2EFChainDef):
                 self.addCaloSequence(threshold, selection, preselection)
                 self.addTrigTauRecCaloOnlySequence(threshold,selection,preselection)
                 self.addCaloHypoSequence(threshold,selection,preselection)
+            elif preselection in needsCaloMVAPre:
+                self.addCaloSequence(threshold, selection, preselection)
+                self.addTrigTauRecCaloOnlyMVASequence(threshold,selection,preselection)
+                self.addCaloHypoSequence(threshold,selection,preselection)
             # Two step fast-tracking
             if preselection in needsTrackTwoPre:
                 self.addTwoStepTrackingSequence(threshold,selection,preselection,idperf, trkprec)
-                if preselection != 'tracktwo':
-                    self.addTwoStepTrackingSelectionSequence(threshold,selection,preselection,idperf)
+                if preselection == 'tracktwo':
                     self.addTrigTauRecTauPreselectionSequence(threshold,selection,preselection,idperf)
+                    self.addTwoStepTrackingSelectionSequence(threshold,selection,preselection,idperf)
                 else:
-                    self.addTrigTauRecTauPreselectionSequence(threshold,selection,preselection,idperf)
                     self.addTwoStepTrackingSelectionSequence(threshold,selection,preselection,idperf)
+                    self.addTrigTauRecTauPreselectionSequence(threshold,selection,preselection,idperf)
+            # Two-step tracking but no tau reco, no selection
+            if preselection in needsTrackTwoNoPre:
+                self.addTwoStepTrackingSequence(threshold,selection,preselection,idperf, trkprec)
             # One step fast-tracking
             if preselection in needsTrackPre:
                 self.addTrackingSequence(threshold,selection,preselection,idperf,trkprec)
@@ -362,9 +374,12 @@ class L2EFChain_tau(L2EFChainDef):
 
             # Change track selection if we're running on cosmics...
             if selection == 'cosmic':
-                recmerged_2012    = TrigTauRecCosmics_Tau2012()
+                recmerged    = TrigTauRecCosmics_Tau2012()
             else:
-                recmerged_2012    = TrigTauRecMerged_TauPrecision()
+                if needsAlgo2018:
+                    recmerged    = TrigTauRecMerged_TauPrecisionMVA(name='TrigTauMVA_{}'.format(MVAprefix), doMVATES=MVATES, doTrackBDT=TrackBDT, doRNN=RNN)
+                else:
+                    recmerged    = TrigTauRecMerged_TauPrecision()
 
             efidinsideout = trkprec
 
@@ -379,180 +394,38 @@ class L2EFChain_tau(L2EFChainDef):
                                      self.continueChain('EF', 'tr')]]
 
             # TrigTauRec and Hypo (no BDT)
-            if selection == 'kaonpi1' or selection == 'kaonpi2' or selection == 'dipion1' or selection=='dipion1loose' or selection == 'dipion2' or selection == 'dikaon' or selection == 'dikaontight' or selection == 'dikaonmass' or selection == 'dikaonmasstight' or selection == 'singlepion' or selection == 'singlepiontight':
+            if selection == 'kaonpi1' or selection == 'kaonpi2' or selection == 'dipion1' or selection=='dipion1loose' or selection == 'dipion2' or selection == 'dipion3' or selection == 'dikaon' or selection == 'dikaontight' or selection == 'dikaonmass' or selection == 'dikaonmasstight' or selection == 'singlepion' or selection == 'singlepiontight':
                 self.EFsequenceList += [[[ self.currentItem ],
-                                         [recmerged_2012, theEFHypo],
+                                         [recmerged, theEFHypo],
                                          self.continueChain('EF', 'effinal')]]                
-            else:
-            # TrigTauRec, BDT and Hypo
-                efmv              = TrigTauDiscriGetter2015()
-                self.EFsequenceList += [[[ self.currentItem ],
-                                         [recmerged_2012, efmv, theEFHypo],
-                                         self.continueChain('EF', 'effinal')]]
-
-    def setup_tauChainRunOne(self):
-        
-        threshold   = self.chainPart['threshold']
-        calibration = self.chainPart['calib']
-        recoAlg     = self.chainPart['recoAlg']
-        selection   = self.chainPart['selection']
-        preselection= self.chainPart['preselection']
-        idperf      = "idperf" in self.chainPart['trkInfo']
-
-        # Handle Run-II naming scheme
-        if 'r1' in selection:
-            preselection = 'r1'
-            selection = selection.replace('r1', '')
-
-        # Overrule the final EF selection
-        if idperf:
-            selection = 'perf'    
-
-        if preselection == 'r1':
-            # Try new hypo extraction method
-            theL2CaloHypo   = self.hypoProvider.GetHypo('L2', threshold, selection, 'calo', 'r1')
-            theL2IDHypo     = self.hypoProvider.GetHypo('L2', threshold, selection, 'id', 'r1')
-            theL2FinalHypo  = self.hypoProvider.GetHypo('L2', threshold, selection, '', 'r1')
-            # Get the necessary fexes
-
-            from TrigL2SiTrackFinder.TrigL2SiTrackFinder_Config import (TrigL2SiTrackFinder_TauA,
-                                                                        TrigL2SiTrackFinder_TauB,
-                                                                        TrigL2SiTrackFinder_TauC)
-            t2calo_2012 = T2CaloTau_Tau_Med()
-            l2sitrkfinder_tauB = TrigL2SiTrackFinder_TauB()
-            t2id_2012 = T2IDTau_Tau_1GeV_dZ02_dR0103()
-            t2final_2012 = T2TauFinal_Tau_dR03_1GeV_dZ02()
-
-            if idperf:
-                l2sitrkfinder_tauA = TrigL2SiTrackFinder_TauA()
-                l2sitrkfinder_tauC = TrigL2SiTrackFinder_TauC()
-
-            # L2 configuration
-            self.L2sequenceList += [[[ self.currentItem ],
-                                     [t2calo_2012, theL2CaloHypo],
-                                     self.continueChain('L2', 'calo')]]
-
-            if idperf:
-                self.L2sequenceList += [[[ self.currentItem ],
-                                         [l2sitrkfinder_tauA, l2sitrkfinder_tauB, l2sitrkfinder_tauC, t2id_2012, theL2IDHypo],
-                                         self.continueChain('L2', 'id')]]
-            else:
-                self.L2sequenceList += [[[ self.currentItem ],
-                                         [l2sitrkfinder_tauB, t2id_2012, theL2IDHypo],
-                                         self.continueChain('L2', 'id')]]
-
-            self.L2sequenceList += [[[ self.currentItem ],
-                                     [t2final_2012, theL2FinalHypo],
-                                     self.continueChain('L2', 'l2final')]]
-
-        if preselection == 'r1':
-
-            theEFHypo       = self.hypoProvider.GetHypo('EF', threshold, selection, '', 'r1')
-
-            # Get the necessary fexes
-
-            cellmaker         = TrigCaloCellMaker_tau()
-            clustermaker_topo = TrigCaloClusterMaker_topo()
-            efidinsideout     = TrigEFIDInsideOut_Tau().getSequence()
-            recmerged_2012    = TrigTauRecMerged_Tau2012()
-            efmv              = TrigTauDiscriGetter()
-
-            self.EFsequenceList += [[[ self.currentItem ],
-                                     [cellmaker, clustermaker_topo],
-                                     self.continueChain('EF', 'clf0')]]
-
-            self.EFsequenceList += [[[ self.currentItem ],
-                                     efidinsideout,
-                                     self.continueChain('EF', 'tr')]]
-
-            self.EFsequenceList += [[[ self.currentItem ],
-                                     [recmerged_2012, efmv, theEFHypo],
-                                     self.continueChain('EF', 'effinal')]]
-            
-
-    # Prototype for TwoStep configuration
-    def setup_tauChainTwoStep(self):
-
-        threshold   = self.chainPart['threshold']
-        calibration = self.chainPart['calib']
-        recoAlg     = self.chainPart['recoAlg'] 
-        selection   = self.chainPart['selection']
-        preselection= self.chainPart['preselection']
-        idperf      = "idperf" in self.chainPart['trkInfo']
-        
-        # Overrule the final EF selection
-        if idperf:
-            selection = 'perf'
-
-        if preselection == 'calo' or preselection == 'ptonly' or preselection == 'mvonly' or preselection == 'caloonly' or preselection == 'track' or preselection == 'trackonly':
-            # Test 2015 approach
-            log.info("Calo-based pre-selection configuration is not quite ready yet!")
-            log.info("Very preliminary version!!")
-
 
-            cellmaker         = TrigCaloCellMaker_tau()
-            clustermaker_topo = TrigCaloClusterMaker_topo()
-
-            # Run topoclustering
-            self.EFsequenceList += [[[ self.currentItem ],
-                                     [cellmaker, clustermaker_topo],
-                                     self.continueChain('EF', 'clf0')]]
+            elif needsAlgo2018:
                 
+                # don't evaluate BDT for RNN chains
+                EFsequence = []
+                if selection not in ['verylooseRNN', 'looseRNN', 'mediumRNN', 'tightRNN']:
+                    EFsequence.append( TrigTauDiscriGetter2015() )
 
-        if preselection == 'track' or preselection == 'trackonly' or (preselection != 'r1' and idperf):
-    
-            # Get the necessary fexes
-            [trkfast, trkprec] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence()
-            
-            # Run fast-tracking
-            self.EFsequenceList += [[[ self.currentItem ],
-                                     trkfast,
-                                     self.continueChain('EF', 'trfast')]]
-            
-        # Here we're running the TrigTauRec based on all the stuff that ran before.  Uh-oh, this is dangerous...
-        # For now, assume fast-tracking is always run
-        
-        recPreselection = TrigTauRecMerged_TauPreselection()
-
-        self.EFsequenceList += [[[ self.currentItem ],
-                                 recPreselection,
-                                 self.continueChain('EF', 'prefinal')]]
-
-
-        # Insert generic hypothesis
-        
-        
-        
-        if preselection == 'calo' or preselection == 'ptonly' or preselection == 'mvonly' or preselection == 'caloonly' or preselection == 'trackonly' or preselection == 'track':
-            # Only run tracking and tau-rec : no need for topoclustering
-            if preselection == 'caloonly' or preselection == 'trackonly' or selection == 'cosmic':
-                theEFHypo       = self.hypoProvider.GetHypo('EF', threshold, 'perf', '', 'r1')
-            else: 
-                theEFHypo       = self.hypoProvider.GetHypo('EF', threshold, selection, '', 'r1')
-
-            # Get the necessary fexes
-            [trkfast, trkprec] = TrigInDetSequence("Tau", "tau", "IDTrig").getSequence()
+                EFsequence.append( theEFHypo )
 
+                self.EFsequenceList += [[[ self.currentItem ],
+                                         [recmerged],
+                                         self.continueChain('EF', 'taurecef')]]
 
-            # Change track selection if we're running on cosmics...
-            if selection == 'cosmic':
-                recmerged_2012    = TrigTauRecCosmics_Tau2012()
-            else:
-                recmerged_2012    = TrigTauRecMerged_TauPrecision()
+                if not idperf:
+                    theHLTTrackPre   = self.hypoProvider.GetHypo('L2', threshold, selection, 'id', preselection)
+                    self.EFsequenceList += [[[ self.currentItem ],
+                                         [theHLTTrackPre],
+                                         self.continueChain('EF', 'trackpre')]]
 
-            # Only run the fast-tracking if it wasn't run at pre-selection
-            if preselection != 'track' and preselection != 'trackonly' and not idperf:
-                efidinsideout     = trkfast+trkprec
+                self.EFsequenceList += [[[ self.currentItem ],
+                                         EFsequence,
+                                         self.continueChain('EF', 'effinal')]]
+     
             else:
-                efidinsideout     = trkprec
-            
-            efmv              = TrigTauDiscriGetter2015()
-
-
-            self.EFsequenceList += [[[ self.currentItem ],
-                                     efidinsideout,
-                                     self.continueChain('EF', 'tr')]]
+            # TrigTauRec, BDT and Hypo
+                efmv              = TrigTauDiscriGetter2015()
+                self.EFsequenceList += [[[ self.currentItem ],
+                                         [recmerged, efmv, theEFHypo],
+                                         self.continueChain('EF', 'effinal')]]
 
-            self.EFsequenceList += [[[ self.currentItem ],
-                                     [recmerged_2012, efmv, theEFHypo],
-                                     self.continueChain('EF', 'effinal')]]
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py
index a7254eecdb42b70031e8935be586108c9ac43474..4f035879bb7379ae088e3fb67b858e021f427408 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauDefIdTest.py
@@ -121,8 +121,6 @@ class L2EFChain_tau(L2EFChainDef):
     def setup_tauChain(self):
 
         threshold   = self.chainPart['threshold']
-        calibration = self.chainPart['calib']
-        recoAlg     = self.chainPart['recoAlg'] 
         selection   = self.chainPart['selection']
         preselection= self.chainPart['preselection']
         idperf      = "idperf" in self.chainPart['trkInfo']
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py
index fbaed18a3ad93b0571d46b6f0a9facb30f1afbac..4c5cdb184798337710d31d33018b99d25906d6c6 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauHypoProvider.py
@@ -38,7 +38,6 @@ class TauHypoProvider:
                         theThresh = self.thresholdsL2Calo[(criteria, int(threshold))]
                         currentHypo = T2CaloTauHypo(currentHypoKey, theVars, theThresh)
                     
-
                 if part == 'id':
                     if criteria== 'perf':
                         from TrigTauHypo.TrigTauHypoBase import T2IDTauHypo_tauNoCut
@@ -68,44 +67,45 @@ class TauHypoProvider:
                         from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo_tauNoCut
                         currentHypo = EFTauMVHypo_tauNoCut(currentHypoKey.replace(threshold, ''))
 
-                    elif criteria=='dikaon' or criteria=='dikaontight' or criteria=='dikaonmass' or criteria=='dikaonmasstight' or criteria=='kaonpi1' or criteria=='kaonpi2' or criteria=='dipion1' or criteria=='dipion1loose' or criteria=='dipion2':
+                    elif criteria=='dikaon' or criteria=='dikaontight' or criteria=='dikaonmass' or criteria=='dikaonmasstight' or criteria=='kaonpi1' or criteria=='kaonpi2' or criteria=='dipion1' or criteria=='dipion1loose' or criteria=='dipion2' or criteria=='dipion3':
                         from TrigTauHypo.TrigTauHypoConfig2012 import EFTauDiKaonHypo
                         theVars = ['massTrkSysMin', 'massTrkSysMax', 'massTrkSysKaonMin', 'massTrkSysKaonMax', 'massTrkSysKaonPiMin', 'massTrkSysKaonPiMax', 'targetMassTrkSysKaonPi', 'leadTrkPtMin','EtCalibMin','EMPOverTrkSysPMax']
                         theThresh = self.thresholdsEF_dikaon[(criteria, int(threshold))]
                         currentHypo = EFTauDiKaonHypo(currentHypoKey, theVars, theThresh)
 
-#                    elif criteria=='dikaonmass' or criteria=='dikaonmasstight':
-#                        from TrigTauHypo.TrigTauHypoConfig2012 import EFTauDiKaonHypo
-#                        theVars = ['massTrkSysKaonMin', 'massTrkSysKaonMax', 'leadTrkPtMin','EtCalibMin','EMPOverTrkSysPMax','nWideTrackMax']
-#                        theThresh = self.thresholdsEF_dikaonmass[(criteria, int(threshold))]
-#                        currentHypo = EFTauDiKaonHypo(currentHypoKey, theVars, theThresh)
-
                     elif criteria=='singlepion' or criteria=='singlepiontight':
                         from TrigTauHypo.TrigTauHypoConfig2012 import EFTauDiKaonHypo
                         theVars = ['leadTrkPtMin','EtCalibMin','nTrackMax','nWideTrackMax','dRmaxMax','etOverPtLeadTrkMin','etOverPtLeadTrkMax']
                         theThresh = self.thresholdsEF_singlepion[(criteria, int(threshold))]
                         currentHypo = EFTauDiKaonHypo(currentHypoKey, theVars, theThresh)
 
-                    elif criteria=='medium1HighptL' or criteria=='medium1HighptM' or criteria=='medium1HighptH':
-                        from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo_highpt
-                        theVars = ['NTrackMax', 'EtCalibMin', 'Level','HighptTrkThr','HighptIDThr','HighptJetThr']
-                        theThresh = self.thresholdsEF[(criteria, int(threshold))]
-                        theThresh.extend(self.thresholdsHighpt[(criteria)])
-                        currentHypo = EFTauMVHypo_highpt(currentHypoKey, theVars, theThresh)
-
                     elif criteria=='medium0':
                         from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo
                         theVars = ['NTrackMin','NTrackMax', 'EtCalibMin', 'Level','ApplyIDon0p']
                         theThresh = self.thresholdsEF_FTK[(criteria, int(threshold))]
                         currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
 
+                    elif criteria=='medium1NoPt':
+                        from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo
+                        theVars = ['NTrackMax', 'EtCalibMin', 'Level']
+                        theThresh = self.thresholdsEF[('medium1', 0)] # do not apply pt cut at EF
+                        currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
+
+                    elif criteria=='verylooseRNN' or criteria=='looseRNN' or criteria=='mediumRNN' or criteria=='tightRNN':
+                        from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo
+                        theVars = ['NTrackMax', 'EtCalibMin', 'Level']
+                        theThresh = self.thresholdsEF[(criteria, int(threshold))]
+                        theVars.extend(['Method','NTrackMin','HighptIDThr'])
+                        theThresh.extend([3,0,280000.])
+                        currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
+
                     else:
                         from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo
                         theVars = ['NTrackMax', 'EtCalibMin', 'Level']
                         theThresh = self.thresholdsEF[(criteria, int(threshold))]
                         currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
 
-        if strategy == 'calo' or strategy =='ptonly' or strategy == 'mvonly' or strategy == 'caloonly' or strategy == 'track' or strategy == 'trackonly' or strategy == 'tracktwo' or strategy == 'trackcalo' or strategy == 'tracktwocalo' or strategy == 'tracktwo2015' or strategy == 'FTK' or strategy == 'FTKRefit' or strategy == 'FTKNoPrec':
+        if strategy == 'calo' or strategy =='ptonly' or strategy == 'mvonly' or strategy == 'caloonly' or strategy == 'track' or strategy == 'trackonly' or strategy == 'tracktwo' or strategy == 'tracktwoEF' or strategy == 'tracktwoEFmvaTES' or strategy == 'tracktwoMVA' or strategy == 'trackcalo' or strategy == 'tracktwocalo' or strategy == 'tracktwo2015' or strategy == 'FTK' or strategy == 'FTKRefit' or strategy == 'FTKNoPrec':
 
             # Simple implementation of 2015 pre-selection
             currentHypoKey = 'l2'+part+'_tau'+threshold+'_'+criteria+'_'+strategy
@@ -143,7 +143,6 @@ class TauHypoProvider:
             if part == 'id':
                 from TrigTauHypo.TrigTauHypoBase import HLTTrackTauHypo
                 from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo
-                from TrigTauHypo.TrigTauHypoConfig2012 import EFTauMVHypo_highpt
                 # Important Note: the pT cut here is an unused dummy
                 if criteria == 'cosmic':
                     theVars = ['LowerPtCut', 'TracksInCoreCut', 'TracksInIsoCut', 'DeltaZ0Cut']
@@ -155,19 +154,18 @@ class TauHypoProvider:
                     theThresh = [0,3,1,0.*self.GeV,-1111,0]
                     currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
                 else:
-                    if strategy != 'tracktwo' and strategy != 'FTK' and strategy != 'FTKRefit' and strategy != 'FTKNoPrec':
+                    if strategy != 'tracktwo' and strategy != 'tracktwoEF' and strategy != 'tracktwoEFmvaTES' and strategy != 'tracktwoMVA' and strategy != 'FTK' and strategy != 'FTKRefit' and strategy != 'FTKNoPrec':
                         theVars = ['LowerPtCut','LowerTrackPtCut']
                         theThresh = [int(threshold)*self.GeV,1.*self.GeV]
                         currentHypo = HLTTrackTauHypo(currentHypoKey, theVars, theThresh)
+                    elif strategy == 'tracktwoMVA':
+                        theVars = ['NTrackMin','NTrackMax','NWideTrackMax','EtCalibMin', 'Level','Method']
+                        theThresh = [0,3,1,0.*self.GeV,-1111,0]
+                        currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
                     else:
                         theVars = ['NTrackMin','NTrackMax','NWideTrackMax','EtCalibMin', 'Level','Method']
                         theThresh = [1,3,1,0.*self.GeV,-1111,0]
-                        if criteria=='medium1HighptL' or criteria=='medium1HighptM' or criteria=='medium1HighptH':
-                            theVars.extend(['HighptTrkThr','HighptIDThr','HighptJetThr'])
-                            theThresh.extend(self.thresholdsHighpt[(criteria)])
-                            currentHypo = EFTauMVHypo_highpt(currentHypoKey, theVars, theThresh)
-                        else:
-                            currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
+                        currentHypo = EFTauMVHypo(currentHypoKey, theVars, theThresh)
 
         assert currentHypo, 'unable to find hypothesis algorithm: '+currentHypoKey
             
@@ -258,6 +256,7 @@ class TauHypoProvider:
         ('medium1', 29): [3,  29.0*GeV, 2],
         ('medium1', 35): [3,  35.0*GeV, 2],
         ('medium1', 38): [3,  38.0*GeV, 2],
+        ('medium1', 40): [3,  40.0*GeV, 2],
         ('medium1', 50): [3,  50.0*GeV, 2],
         ('medium1', 60): [3,  60.0*GeV, 2],
         ('medium1', 80): [3,  80.0*GeV, 2],
@@ -277,40 +276,58 @@ class TauHypoProvider:
         ('tight1', 125): [3, 125.0*GeV, 3], 
         ('tight1', 160): [3, 160.0*GeV, 3],
         ('tight1', 200): [3, 200.0*GeV, 3],
-        ('medium1HighptL', 20): [3,  20.0*GeV, 2],
-        ('medium1HighptL', 25): [3,  25.0*GeV, 2],
-        ('medium1HighptL', 29): [3,  29.0*GeV, 2],
-        ('medium1HighptL', 35): [3,  35.0*GeV, 2],
-        ('medium1HighptL', 38): [3,  38.0*GeV, 2],
-        ('medium1HighptL', 50): [3,  50.0*GeV, 2],
-        ('medium1HighptL', 60): [3,  60.0*GeV, 2],
-        ('medium1HighptL', 80): [3,  80.0*GeV, 2],
-        ('medium1HighptL', 115): [3, 115.0*GeV, 2],
-        ('medium1HighptL', 125): [3, 125.0*GeV, 2],
-        ('medium1HighptL', 160): [3, 160.0*GeV, 2],
-        ('medium1HighptM', 20): [3,  20.0*GeV, 2],
-        ('medium1HighptM', 25): [3,  25.0*GeV, 2],
-        ('medium1HighptM', 29): [3,  29.0*GeV, 2],
-        ('medium1HighptM', 35): [3,  35.0*GeV, 2],
-        ('medium1HighptM', 38): [3,  38.0*GeV, 2],
-        ('medium1HighptM', 50): [3,  50.0*GeV, 2],
-        ('medium1HighptM', 60): [3,  60.0*GeV, 2],
-        ('medium1HighptM', 80): [3,  80.0*GeV, 2],
-        ('medium1HighptM', 115): [3, 115.0*GeV, 2],
-        ('medium1HighptM', 125): [3, 125.0*GeV, 2],
-        ('medium1HighptM', 160): [3, 160.0*GeV, 2],
-        ('medium1HighptH', 20): [3,  20.0*GeV, 2],
-        ('medium1HighptH', 25): [3,  25.0*GeV, 2],
-        ('medium1HighptH', 29): [3,  29.0*GeV, 2],
-        ('medium1HighptH', 35): [3,  35.0*GeV, 2],
-        ('medium1HighptH', 38): [3,  38.0*GeV, 2],
-        ('medium1HighptH', 50): [3,  50.0*GeV, 2],
-        ('medium1HighptH', 60): [3,  60.0*GeV, 2],
-        ('medium1HighptH', 80): [3,  80.0*GeV, 2],
-        ('medium1HighptH', 115): [3, 115.0*GeV, 2],
-        ('medium1HighptH', 125): [3, 125.0*GeV, 2],
-        ('medium1HighptH', 160): [3, 160.0*GeV, 2], 
-        ('medium1HighptH', 200): [3, 200.0*GeV, 2]
+        ('verylooseRNN', 20): [3,  20.0*GeV, 0],
+        ('verylooseRNN', 25): [3,  25.0*GeV, 0],
+        ('verylooseRNN', 29): [3,  29.0*GeV, 0],
+        ('verylooseRNN', 35): [3,  35.0*GeV, 0],
+        ('verylooseRNN', 38): [3,  38.0*GeV, 0],
+        ('verylooseRNN', 50): [3,  50.0*GeV, 0],
+        ('verylooseRNN', 60): [3,  60.0*GeV, 0],
+        ('verylooseRNN', 80): [3,  80.0*GeV, 0],
+        ('verylooseRNN', 115): [3, 115.0*GeV, 0],
+        ('verylooseRNN', 125): [3, 125.0*GeV, 0], 
+        ('verylooseRNN', 160): [3, 160.0*GeV, 0],
+        ('verylooseRNN', 200): [3, 200.0*GeV, 0],
+        ('looseRNN', 20): [3,  20.0*GeV, 1],
+        ('looseRNN', 25): [3,  25.0*GeV, 1],
+        ('looseRNN', 29): [3,  29.0*GeV, 1],
+        ('looseRNN', 35): [3,  35.0*GeV, 1],
+        ('looseRNN', 38): [3,  38.0*GeV, 1],
+        ('looseRNN', 50): [3,  50.0*GeV, 1],
+        ('looseRNN', 60): [3,  60.0*GeV, 1],
+        ('looseRNN', 80): [3,  80.0*GeV, 1],
+        ('looseRNN', 115): [3, 115.0*GeV, 1],
+        ('looseRNN', 125): [3, 125.0*GeV, 1], 
+        ('looseRNN', 160): [3, 160.0*GeV, 1],
+        ('looseRNN', 200): [3, 200.0*GeV, 1],
+        ('mediumRNN', 0): [3,  0.0*GeV, 2], 
+        ('mediumRNN', 12): [3,  12.0*GeV, 2],
+        ('mediumRNN', 20): [3,  20.0*GeV, 2],
+        ('mediumRNN', 25): [3,  25.0*GeV, 2],
+        ('mediumRNN', 29): [3,  29.0*GeV, 2],
+        ('mediumRNN', 35): [3,  35.0*GeV, 2],
+        ('mediumRNN', 38): [3,  38.0*GeV, 2],
+        ('mediumRNN', 40): [3,  40.0*GeV, 2],
+        ('mediumRNN', 50): [3,  50.0*GeV, 2],
+        ('mediumRNN', 60): [3,  60.0*GeV, 2],
+        ('mediumRNN', 80): [3,  80.0*GeV, 2],
+        ('mediumRNN', 115): [3, 115.0*GeV, 2],
+        ('mediumRNN', 125): [3, 125.0*GeV, 2], 
+        ('mediumRNN', 160): [3, 160.0*GeV, 2], 
+        ('mediumRNN', 200): [3, 200.0*GeV, 2],
+        ('tightRNN', 20): [3,  20.0*GeV, 3],
+        ('tightRNN', 25): [3,  25.0*GeV, 3],
+        ('tightRNN', 29): [3,  29.0*GeV, 3],
+        ('tightRNN', 35): [3,  35.0*GeV, 3],
+        ('tightRNN', 38): [3,  38.0*GeV, 3],
+        ('tightRNN', 40): [3,  40.0*GeV, 3],
+        ('tightRNN', 50): [3,  50.0*GeV, 3],
+        ('tightRNN', 60): [3,  60.0*GeV, 3],
+        ('tightRNN', 80): [3,  80.0*GeV, 3],
+        ('tightRNN', 115): [3, 115.0*GeV, 3],
+        ('tightRNN', 125): [3, 125.0*GeV, 3], 
+        ('tightRNN', 160): [3, 160.0*GeV, 3],
+        ('tightRNN', 200): [3, 200.0*GeV, 3]
         }
 
     thresholdsEF_FTK = {
@@ -329,12 +346,8 @@ class TauHypoProvider:
         ('medium0', 160): [0,3, 160.0*GeV, 2, False],
         ('medium0', 200): [0,3, 200.0*GeV, 2, False],
         }
-    thresholdsHighpt = {
-        ('medium1HighptL'):[250.0*GeV,330.0*GeV,410.0*GeV], 
-        ('medium1HighptM'):[200.0*GeV,330.0*GeV,410.0*GeV],
-        ('medium1HighptH'):[160.0*GeV,330.0*GeV,410.0*GeV]   
-        }
 
+# 'massTrkSysMin', 'massTrkSysMax', 'massTrkSysKaonMin', 'massTrkSysKaonMax', 'massTrkSysKaonPiMin', 'massTrkSysKaonPiMax', 'targetMassTrkSysKaonPi', 'leadTrkPtMin','EtCalibMin','EMPOverTrkSysPMax'
     thresholdsEF_dikaon = {
         ('dikaon', 25):          [0.2*GeV, 0.45*GeV,    0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   15.0*GeV, 25.0*GeV, 1.5],
         ('dikaon', 35):          [0.2*GeV, 0.45*GeV,    0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   25.0*GeV, 35.0*GeV, 1.5], 
@@ -353,7 +366,8 @@ class TauHypoProvider:
         ('dipion1loose', 25):    [0.475*GeV, 1.075*GeV, 0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   25.0*GeV, 25.0*GeV, 1.5],
         ('dipion1loose', 35):    [0.475*GeV, 1.075*GeV, 0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   25.0*GeV, 35.0*GeV, 1.5],
         ('dipion2', 25):         [0.460*GeV, 0.538*GeV, 0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   15.0*GeV, 25.0*GeV, 1.0],
-        ('dipion2', 35):         [0.460*GeV, 0.538*GeV, 0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   25.0*GeV, 35.0*GeV, 1.0]
+        ('dipion2', 35):         [0.460*GeV, 0.538*GeV, 0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   25.0*GeV, 35.0*GeV, 1.0],
+        ('dipion3', 25):         [0.279*GeV, 0.648*GeV, 0.0*GeV, 1000.0*GeV,  0.0*GeV, 1000.0*GeV, 0.0*GeV,   25.0*GeV, 25.0*GeV, 2.2], #ATR-16600
         }
 
 
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py
index 32e809dfc4b065523bb0e8ec1e85d2a5fa441e51..164db119f1bfe6cc0dfc4d48cfc1e46bb75a12d2 100755
--- a/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/tau/TauSliceFlags.py
@@ -2,11 +2,8 @@
 
 """ Tau slice specific flags  """
 
-
- 
-from AthenaCommon.Logging import logging
-from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer, jobproperties
-from TriggerMenu.menu.CommonSliceHelper import CommonSliceHelper, AllowedList
+from AthenaCommon.JobProperties import JobProperty, JobPropertyContainer
+from TriggerMenu.menu.CommonSliceHelper import CommonSliceHelper
 
 __author__  = ''
 __version__="$Revision: 1.34 $"