diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt
index 27eefb6b34e88e81bf86392d18bd9477b40b47a5..13a3ced0d6e4dc30959224e2d00fb35bc8e9fd3a 100644
--- a/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt
+++ b/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt
@@ -20,12 +20,14 @@ atlas_depends_on_subdirs( PUBLIC
                           Trigger/TrigSteer/TrigInterfaces
                           PRIVATE
                           Calorimeter/CaloEvent
+                          Calorimeter/CaloUtils
                           Event/xAOD/xAODCaloEvent
                           Event/xAOD/xAODEgammaCnv
                           Event/xAOD/xAODEventShape
                           Event/xAOD/xAODTracking
 			  PhysicsAnalysis/Interfaces/EgammaAnalysisInterfaces	
                           Reconstruction/egamma/egammaEvent
+                          Reconstruction/egamma/egammaUtils
                           Trigger/TrigTools/TrigTimeAlgs )
 
 # External dependencies:
@@ -36,13 +38,13 @@ atlas_add_library( TrigEgammaRecLib
                    src/*.cxx
                    PUBLIC_HEADERS TrigEgammaRec
                    PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                   LINK_LIBRARIES xAODEgamma xAODPrimitives GaudiKernel RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent LumiBlockCompsLib TrigInterfacesLib EgammaAnalysisInterfacesLib TrigTimeAlgsLib
-                   PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} CaloEvent xAODCaloEvent xAODEventShape xAODTracking egammaEvent )
+                   LINK_LIBRARIES xAODEgamma xAODPrimitives GaudiKernel CaloUtilsLib RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent LumiBlockCompsLib TrigInterfacesLib EgammaAnalysisInterfacesLib TrigTimeAlgsLib
+                   PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} CaloEvent xAODCaloEvent xAODEventShape xAODTracking egammaEvent egammaUtils)
 
 atlas_add_component( TrigEgammaRec
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} xAODEgamma xAODPrimitives GaudiKernel LumiBlockCompsLib RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent TrigInterfacesLib CaloEvent xAODCaloEvent xAODEventShape xAODTracking EgammaAnalysisInterfacesLib egammaEvent TrigTimeAlgsLib TrigEgammaRecLib )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} xAODEgamma xAODPrimitives GaudiKernel CaloUtilsLib LumiBlockCompsLib RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent TrigInterfacesLib CaloEvent xAODCaloEvent xAODEventShape xAODTracking EgammaAnalysisInterfacesLib egammaEvent egammaUtils TrigTimeAlgsLib TrigEgammaRecLib )
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h b/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h
index 5e86e07598dd278d6be45ca9247fa04215c94d38..1a049aed5d7b1b4bdce74615a3246925d7259784 100755
--- a/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h
+++ b/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h
@@ -86,6 +86,8 @@ private:
 
   ToolHandle<IEMTrackMatchBuilder> m_trackMatchBuilder;
   ToolHandle<IEMConversionBuilder> m_conversionBuilder;
+
+
   ToolHandle<IEMShowerBuilder> m_showerBuilder;  // trigger specific
   ToolHandle<IEMFourMomBuilder> m_fourMomBuilder; // trigger specific
   ToolHandle<IEGammaAmbiguityTool> m_ambiguityTool;
@@ -112,12 +114,13 @@ private:
   ToolHandle<ILumiBlockMuTool>  m_lumiBlockMuTool; 
   // booleans to run specific parts of offline reconstruction
   bool m_doConversions;
+  bool m_doBremCollection;
   bool m_doTrackMatching;
   bool m_doTrackIsolation;
   bool m_doCaloCellIsolation;
   bool m_doTopoIsolation;
   bool m_useBremAssoc;
-  
+    
   // Allows delete
   EgammaRecContainer *m_eg_container; 
   // needed for monitoring to work
diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py
index 40a003b5ac769727addd93030118bfd6afaaa42d..1721caa5a02a8f94876f727f7900c43b6005f5d8 100755
--- a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py
+++ b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py
@@ -56,7 +56,7 @@ TrigEgammaRec = Factory(TrigEgammaRecConf.TrigEgammaRec, name="TrigEgammaRec",do
     # Tools with non-default configuration
     TrackMatchBuilderTool = TrigEMTrackMatchBuilder,
     ShowerBuilderTool = TrigEMShowerBuilder,
-    
+                        
     # Set the isolation tools
     TrackIsolationTool = TrigTrackIsolationTool, 
     CaloCellIsolationTool = TrigCaloIsolationTool, 
@@ -75,7 +75,6 @@ TrigEgammaRec = Factory(TrigEgammaRecConf.TrigEgammaRec, name="TrigEgammaRec",do
     PhotonPIDBuilder = TrigPhotonPIDBuilder,
     
     # Tools with default configuration    
-#     VertexBuilderTool = EMVertexBuilder,
     ConversionBuilderTool = EMConversionBuilder.copyPublic("TrigEMConversionBuilder"),
     AmbiguityTool = EGammaAmbiguityTool.copyPublic("TrigEGammaAmbiguityTool"),
     FourMomBuilderTool = EMFourMomBuilder.copyPublic("TrigEMFourMomBuilder"),
@@ -88,3 +87,4 @@ TrigEgammaRec = Factory(TrigEgammaRecConf.TrigEgammaRec, name="TrigEgammaRec",do
     postInit = [configureTrigEgammaMonitoring],
 )
 
+
diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py
index befd1e2ce4be958d9ec77d59a054e417441f498c..723459a24f27d63f24a66dace1fe31e23edd7bfc 100644
--- a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py
+++ b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 # vim:fenc=utf-8
 #
-# Copyright @2016 Ryan Mackenzie White <ryan.white@cern.ch>
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 #
 
 """
@@ -36,9 +36,11 @@ PhotonPidTools()
 
 # Following tools have TrigEgamma factories
 from egammaTools.egammaToolsFactories import EMTrackMatchBuilder, EMFourMomBuilder, EMShowerBuilder
+from egammaTools import egammaToolsConf
 
 from egammaTools.egammaToolsConf import EMPIDBuilder
 from CaloClusterCorrection import CaloClusterCorrectionConf as Cccc
+from egammaTrackTools.egammaTrackToolsFactories import EMExtrapolationTools
 TrigCaloFillRectangularCluster = PublicToolFactory( Cccc.CaloFillRectangularCluster,
         name = "trigegamma_CaloFillRectangularCluster",
         eta_size = 5,
@@ -118,8 +120,14 @@ TrigEMExtrapolationTools=EMExtrapolationTools.copyPublic(name="TrigEMExtrapolati
                                                         useCaching=False)
 
 
+def appendtoTrigEMTrackMatchBuilder(tool):
+    "add track to calo tool "
+    if not hasattr(tool,"EMExtrapolationTools"):
+        tool += EMExtrapolationTools()
+
 TrigEMTrackMatchBuilder = EMTrackMatchBuilder.copyPublic(
     name = "TrigEMTrackMatchBuilder",
+    postInit=[appendtoTrigEMTrackMatchBuilder],
     broadDeltaEta      = 0.2, #For offline 0.1
     broadDeltaPhi      = 0.2, #For offline 0.15
     useScoring         = False, 
@@ -134,10 +142,13 @@ TrigEMShowerBuilder = EMShowerBuilder.copyPublic(
 )
 
 from TriggerMenu.egamma.EgammaSliceFlags import EgammaSliceFlags
+from egammaMVACalib.TrigEgammaMVACalibFactories import TrigElectronMVATool, TrigPhotonMVATool
+
 mlog.info("MVA version version %s"%EgammaSliceFlags.calibMVAVersion() )
 mlog.info("Cluster Correction version %s"%EgammaSliceFlags.clusterCorrectionVersion() )
 EgammaSliceFlags.calibMVAVersion.set_On()
 
+
 from TrigCaloRec.TrigCaloRecConf import TrigCaloClusterMaker
 
 def configureTrigCaloClusterMonitoring(tool):
@@ -163,7 +174,6 @@ def configureClusterBuilder(slwAlg):
             eta_Duplicate = 5,
             phi_Duplicate = 5
             )
-    #mlog.info("TrigCaloClusterMaker adding slw tool %s"%trigslw.getFullName())
     slwAlg += trigslw
     slwAlg.ClusterMakerTools=[ trigslw.getFullName() ]
 
@@ -178,7 +188,6 @@ def configureClusterCorrections(slwAlg):
         if hasattr(slwAlg,clName):
             continue
         for tool in make_CaloSwCorrections (cl,version=EgammaSliceFlags.clusterCorrectionVersion()):
-            #mlog.info("Correction tool %s"%tool.getFullName())
             slwAlg += tool
             slwAlg.ClusterCorrectionTools += [tool.getFullName()]
 
diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaTrackTools.py b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaTrackTools.py
new file mode 100644
index 0000000000000000000000000000000000000000..a5fe6863b36d92a8977f798b8746d99579ff985b
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaTrackTools.py
@@ -0,0 +1,112 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr, ToolSvc
+
+from SiClusterOnTrackTool.SiClusterOnTrackToolConf import InDet__PixelClusterOnTrackTool
+egTrigPixelClusterOnTrackTool = InDet__PixelClusterOnTrackTool("egTrigPixelClusterOnTrackTool",
+                                                               DisableDistortions = False,
+                                                               applyNNcorrection = False)
+ToolSvc += egTrigPixelClusterOnTrackTool
+
+from SiClusterOnTrackTool.SiClusterOnTrackToolConf import InDet__SCT_ClusterOnTrackTool
+egTrigSCT_ClusterOnTrackTool = InDet__SCT_ClusterOnTrackTool ("egTrigSCT_ClusterOnTrackTool",
+                                                          CorrectionStrategy = 0,  # do correct position bias
+                                                          ErrorStrategy      = 2)  # do use phi dependent errors
+ToolSvc += egTrigSCT_ClusterOnTrackTool
+
+
+
+from TrkRIO_OnTrackCreator.TrkRIO_OnTrackCreatorConf import Trk__RIO_OnTrackCreator
+egTrigRotCreator = Trk__RIO_OnTrackCreator(name             = 'egTrigRotCreator',
+                                       ToolPixelCluster = egTrigPixelClusterOnTrackTool,
+                                       ToolSCT_Cluster  = egTrigSCT_ClusterOnTrackTool,
+                                       Mode             = 'indet')
+ToolSvc += egTrigRotCreator
+
+
+from TrkDetDescrSvc.AtlasTrackingGeometrySvc import AtlasTrackingGeometrySvc
+
+from TrkExRungeKuttaPropagator.TrkExRungeKuttaPropagatorConf import Trk__RungeKuttaPropagator as Propagator
+egTrigTrkPropagator = Propagator(name = 'egTrigTrkPropagator')
+egTrigTrkPropagator.AccuracyParameter = 0.0001
+ToolSvc += egTrigTrkPropagator
+
+from TrkExSTEP_Propagator.TrkExSTEP_PropagatorConf import Trk__STEP_Propagator as StepPropagator
+egTrigTrkStepPropagator = StepPropagator(name = 'egTrigTrkStepPropagator')
+ToolSvc += egTrigTrkStepPropagator
+
+from TrkExTools.TrkExToolsConf import Trk__Navigator
+egTrigTrkNavigator = Trk__Navigator(name = 'egTrigTrkNavigator')
+ToolSvc += egTrigTrkNavigator
+
+from TrkExTools.TrkExToolsConf import Trk__MaterialEffectsUpdator
+egTrigTrkMaterialUpdator = Trk__MaterialEffectsUpdator(name = "egTrigTrkMaterialEffectsUpdator")
+ToolSvc += egTrigTrkMaterialUpdator
+
+egTrigTrkSubPropagators = []
+egTrigTrkSubUpdators = []
+# -------------------- set it depending on the geometry ----------------------------------------------------
+# default for ID is (Rk,Mat)
+egTrigTrkSubPropagators += [ egTrigTrkPropagator.name() ]
+egTrigTrkSubUpdators    += [ egTrigTrkMaterialUpdator.name() ]
+# default for Calo is (Rk,MatLandau)
+egTrigTrkSubPropagators += [ egTrigTrkPropagator.name() ]
+egTrigTrkSubUpdators    += [ egTrigTrkMaterialUpdator.name() ]
+# default for MS is (STEP,Mat)
+egTrigTrkSubPropagators += [ egTrigTrkStepPropagator.name() ]
+egTrigTrkSubUpdators    += [ egTrigTrkMaterialUpdator.name() ]
+# ----------------------------------------------------------------------------------------------------------            
+
+from TrkExTools.TrkExToolsConf import Trk__Extrapolator
+egTrigTrkExtrapolator = Trk__Extrapolator(name                    = 'egTrigTrkExtrapolator',
+                                      Propagators             = [ egTrigTrkPropagator, egTrigTrkStepPropagator ],
+                                      MaterialEffectsUpdators = [ egTrigTrkMaterialUpdator ],
+                                      Navigator               = egTrigTrkNavigator,
+                                      SubPropagators          = egTrigTrkSubPropagators,
+                                      SubMEUpdators           = egTrigTrkSubUpdators)
+ToolSvc += egTrigTrkExtrapolator
+
+
+# Set up the GSF
+from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GsfMaterialMixtureConvolution
+GSFTrigMaterialUpdator = Trk__GsfMaterialMixtureConvolution (name = 'GSFTrigMaterialUpdator')
+ToolSvc += GSFTrigMaterialUpdator
+# component Reduction
+from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__QuickCloseComponentsMultiStateMerger
+GSFTrigComponentReduction = Trk__QuickCloseComponentsMultiStateMerger (name                      = 'GSFTrigComponentReduction',
+                                                                       MaximumNumberOfComponents = 12)
+ToolSvc += GSFTrigComponentReduction
+
+from TrkMeasurementUpdator.TrkMeasurementUpdatorConf import Trk__KalmanUpdator as ConfiguredKalmanUpdator
+egTrigTrkUpdator = ConfiguredKalmanUpdator('egTrigTrkUpdator')
+ToolSvc += egTrigTrkUpdator
+
+from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GsfMeasurementUpdator
+GSFTrigMeasurementUpdator = Trk__GsfMeasurementUpdator( name    = 'GSFTrigMeasurementUpdator',
+                                                    Updator = egTrigTrkUpdator )
+ToolSvc += GSFTrigMeasurementUpdator
+
+from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GsfExtrapolator
+GSFTrigExtrapolator = Trk__GsfExtrapolator(name                          = 'GSFTrigExtrapolator',
+                                       Propagators                   = [ egTrigTrkPropagator ],
+                                       SearchLevelClosestParameters  = 10,
+                                       StickyConfiguration           = True,
+                                       Navigator                     = egTrigTrkNavigator,
+                                       GsfMaterialConvolution        = GSFTrigMaterialUpdator,
+                                       ComponentMerger               = GSFTrigComponentReduction,
+                                       SurfaceBasedMaterialEffects   = False )
+ToolSvc += GSFTrigExtrapolator
+
+
+from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GaussianSumFitter
+GSFTrigTrackFitter = Trk__GaussianSumFitter(name                    = 'GSFTrigTrackFitter',
+                                        ToolForExtrapolation    = GSFTrigExtrapolator,
+                                        MeasurementUpdatorType  = GSFTrigMeasurementUpdator,
+                                        ReintegrateOutliers     = True,
+                                        MakePerigee             = True,
+                                        RefitOnMeasurementBase  = True,
+                                        DoHitSorting            = True,
+                                        ValidationMode          = False,
+                                        ToolForROTCreation      = egTrigRotCreator)
+# --- end of fitter loading
+ToolSvc += GSFTrigTrackFitter
diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.cxx b/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.cxx
index 578aa0d87c3fe76507b6c895674f1528e8b1f85a..8b95163cef42217d4667e2e1e546c1264740c7e8 100755
--- a/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.cxx
+++ b/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.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
 */
 
 /********************************************************************
@@ -146,6 +146,8 @@ TrigEgammaRec::TrigEgammaRec(const std::string& name,ISvcLocator* pSvcLocator):
     declareProperty("doTrackMatching",m_doTrackMatching = false, "run TrackMatchBuilder");
     // Set flag for conversions 
     declareProperty("doConversions",m_doConversions = false, "run ConversionBuilder");
+    /** @brief run GSF refit */
+    declareProperty("doBremCollection",                    m_doBremCollection          = false, "run BremCollection");
 
     // Monitoring
     typedef const DataVector<xAOD::Electron> xAODElectronDV_type;
@@ -469,59 +471,59 @@ HLT::ErrorCode TrigEgammaRec::hltInitialize() {
         if (runIsoType.find(flavName) == runIsoType.end()) runIsoType.insert(flavName);
     }
     
-    // /** @brief Retrieve IsolationTools based on IsoTypes configured */
-    // // BROKEN! WORTH FIXING, OR IS THIS FILE NOW OBSOLETE
-    // if(m_doTrackIsolation){
-    //     if (!m_trackIsolationTool.empty() && runIsoType.find("ptcone") != runIsoType.end()){ 
-    //         ATH_MSG_DEBUG("Retrieve TrackIsolationTool");
-
-    //         if(m_trackIsolationTool.retrieve().isFailure()){
-    //             ATH_MSG_ERROR("Unable to retrieve " << m_trackIsolationTool);
-    //             return HLT::BAD_JOB_SETUP;
-    //         }
-    //         else {
-    //             ATH_MSG_DEBUG("Retrieved Tool "<<m_trackIsolationTool);
-    //             if (timerSvc()) m_timerIsoTool1 = addTimer("TrackIsolationTool");
-    //         }
-    //     }
-    // } else {
-      m_trackIsolationTool.disable();
-    // }
-
-    // if(m_doCaloCellIsolation){
-    //     if (!m_caloCellIsolationTool.empty() && runIsoType.find("etcone") != runIsoType.end()) {
-    //         ATH_MSG_DEBUG("Retrieve CaloIsolationTool is empty");
-    //         if(m_caloCellIsolationTool.retrieve().isFailure()){
-    //             ATH_MSG_ERROR("Unable to retrieve " << m_caloCellIsolationTool);
-    //             return HLT::BAD_JOB_SETUP;
-    //         }
-    //         else {
-    //             ATH_MSG_DEBUG("Retrieved Tool "<<m_caloCellIsolationTool);
-    //             if (timerSvc()) m_timerIsoTool2 = addTimer("CaloCellIsolationTool");
-    //         }
-    //     } else {
-    //       m_caloCellIsolationTool.disable();
-    //     }
-    // } else {
-      m_caloCellIsolationTool.disable();
-    // }
-    // if(m_doTopoIsolation){
-    //     if (!m_topoIsolationTool.empty() && runIsoType.find("topoetcone") != runIsoType.end()) {
-    //         ATH_MSG_DEBUG("Retrieve TopoIsolationTool is empty");
-    //         if(m_topoIsolationTool.retrieve().isFailure()){
-    //             ATH_MSG_ERROR("Unable to retrieve " << m_topoIsolationTool);
-    //             return HLT::BAD_JOB_SETUP;
-    //         }
-    //         else {
-    //             ATH_MSG_DEBUG("Retrieved Tool "<<m_topoIsolationTool);
-    //             if (timerSvc()) m_timerIsoTool3 = addTimer("topoIsolationTool");
-    //         }
-    //     } else {
-    //       m_topoIsolationTool.disable();
-    //     }
-    // } else {
-      m_topoIsolationTool.disable();
-    // }
+     /** @brief Retrieve IsolationTools based on IsoTypes configured */
+     if(m_doTrackIsolation){
+         if (!m_trackIsolationTool.empty() && runIsoType.find("ptcone") != runIsoType.end()){ 
+             ATH_MSG_DEBUG("Retrieve TrackIsolationTool");
+
+             if(m_trackIsolationTool.retrieve().isFailure()){
+                 ATH_MSG_ERROR("Unable to retrieve " << m_trackIsolationTool);
+                 return HLT::BAD_JOB_SETUP;
+             }
+             else {
+                 ATH_MSG_DEBUG("Retrieved Tool "<<m_trackIsolationTool);
+                 if (timerSvc()) m_timerIsoTool1 = addTimer("TrackIsolationTool");
+             }
+         }
+     } else {
+    m_trackIsolationTool.disable();
+     }
+
+     if(m_doCaloCellIsolation){
+         if (!m_caloCellIsolationTool.empty() && runIsoType.find("etcone") != runIsoType.end()) {
+             ATH_MSG_DEBUG("Retrieve CaloIsolationTool is empty");
+             if(m_caloCellIsolationTool.retrieve().isFailure()){
+                 ATH_MSG_ERROR("Unable to retrieve " << m_caloCellIsolationTool);
+                 return HLT::BAD_JOB_SETUP;
+             }
+             else {
+                 ATH_MSG_DEBUG("Retrieved Tool "<<m_caloCellIsolationTool);
+                 if (timerSvc()) m_timerIsoTool2 = addTimer("CaloCellIsolationTool");
+             }
+         } else {
+           m_caloCellIsolationTool.disable();
+         }
+     } else {
+    m_caloCellIsolationTool.disable();
+     }
+     if(m_doTopoIsolation){
+         if (!m_topoIsolationTool.empty() && runIsoType.find("topoetcone") != runIsoType.end()) {
+             ATH_MSG_DEBUG("Retrieve TopoIsolationTool is empty");
+             if(m_topoIsolationTool.retrieve().isFailure()){
+                 ATH_MSG_ERROR("Unable to retrieve " << m_topoIsolationTool);
+                 return HLT::BAD_JOB_SETUP;
+             }
+             else {
+                 ATH_MSG_DEBUG("Retrieved Tool "<<m_topoIsolationTool);
+                 if (timerSvc()) m_timerIsoTool3 = addTimer("topoIsolationTool");
+             }
+         } else {
+           m_topoIsolationTool.disable();
+         }
+     } else {
+    m_topoIsolationTool.disable();
+     }
+    // <--
     //print summary info
     ATH_MSG_INFO("REGTEST: xAOD Reconstruction for Run2" );
     ATH_MSG_INFO("REGTEST: Initialization completed successfully, tools initialized:  " );
@@ -546,6 +548,7 @@ HLT::ErrorCode TrigEgammaRec::hltInitialize() {
     ATH_MSG_DEBUG("REGTEST: Do Track Isolation: "   << m_doTrackIsolation);
     ATH_MSG_DEBUG("REGTEST: Do CaloCell Isolation: "<< m_doCaloCellIsolation);
     ATH_MSG_DEBUG("REGTEST: Do TopoIsolation: "     << m_doTopoIsolation);
+    ATH_MSG_DEBUG("REGTEST: run bremBuilding: "     << m_doBremCollection);
     ATH_MSG_DEBUG("REGTEST: Use BremAssoc: "        << m_useBremAssoc);
 
     ATH_MSG_INFO("REGTEST: ElectronContainerName: " << m_electronContainerName );
@@ -635,28 +638,30 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
     }
     
 
-    // bool topoClusTrue = false; 
-    // std::vector<const xAOD::CaloClusterContainer*> vectorClusterContainerTopo;
-    // if(m_doTopoIsolation){
-    //     stat = getFeatures(inputTE, vectorClusterContainerTopo,m_topoClusterContName);
+    bool topoClusTrue = false; 
+    std::vector<const xAOD::CaloClusterContainer*> vectorClusterContainerTopo;
+    if(m_doTopoIsolation){
+        stat = getFeatures(inputTE, vectorClusterContainerTopo,m_topoClusterContName);
     
-    //     if ( stat!= HLT::OK ) {
-    //         ATH_MSG_ERROR(" REGTEST: No CaloTopoClusterContainers retrieved for the trigger element");
-    //         //return HLT::OK; // If you did not get it, it is not a problem, continue!
-    //     }  
+    // -> From here is broken?
+        if ( stat!= HLT::OK ) {
+            ATH_MSG_ERROR(" REGTEST: No CaloTopoClusterContainers retrieved for the trigger element");
+            //return HLT::OK; // If you did not get it, it is not a problem, continue!
+        }  
              
-    //     //debug message
-    //     if ( msgLvl() <= MSG::VERBOSE){
-    //     msg() << MSG::VERBOSE << " REGTEST: Got " << vectorClusterContainerTopo.size()
-    //          << " CaloCTopoclusterContainers associated to the TE " << endmsg;
-    //     }
-    //     // Get the last ClusterContainer
-    //     if ( !vectorClusterContainerTopo.empty() ) {
-    //         const xAOD::CaloClusterContainer* clusContainerTopo = vectorClusterContainerTopo.back();
-    //         if (clusContainerTopo->size() > 0) topoClusTrue = true;
-    //         ATH_MSG_DEBUG("REGTEST: Number of topo containers : " << clusContainerTopo->size());
-    //     } // vector of Cluster Container empty?!
-    // }
+        //debug message
+        if ( msgLvl() <= MSG::VERBOSE){
+        msg() << MSG::VERBOSE << " REGTEST: Got " << vectorClusterContainerTopo.size()
+             << " CaloCTopoclusterContainers associated to the TE " << endmsg;
+        }
+        // Get the last ClusterContainer
+        if ( !vectorClusterContainerTopo.empty() ) {
+            const xAOD::CaloClusterContainer* clusContainerTopo = vectorClusterContainerTopo.back();
+            if (clusContainerTopo->size() > 0) topoClusTrue = true;
+            ATH_MSG_DEBUG("REGTEST: Number of topo containers : " << clusContainerTopo->size());
+        } // vector of Cluster Container empty?!
+    }
+    // <--  up to here
 
 
     if(msgLvl() <= MSG::DEBUG) msg() << MSG::DEBUG 
@@ -672,6 +677,7 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
     std::string electronContSGKey="";
     std::string electronKey="";
     HLT::ErrorCode sc = getUniqueKey( m_electron_container, electronContSGKey, electronKey);
+    ATH_MSG_DEBUG("The electron container SG key created is: " << electronContSGKey);
     if (sc != HLT::OK) {
         msg() << MSG::DEBUG << "Could not retrieve the electron container key" << endmsg;
         return sc;
@@ -700,7 +706,7 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
 
     // Shower Shape & CaloCellContainer
     const CaloCellContainer* pCaloCellContainer = 0;
-    //const xAOD::CaloClusterContainer* pTopoClusterContainer = 0;
+    const xAOD::CaloClusterContainer* pTopoClusterContainer = 0;
     
     // Get vector of pointers to all CaloCellContainers from TE
     std::string clusCollKey="";
@@ -748,7 +754,57 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
                 if ( msgLvl() <= MSG::VERBOSE) msg() << MSG::VERBOSE << "Running m_showerBuilder: " << m_showerBuilder << endmsg;
             } //pCaloCellContainer
         }
-        //if(topoClusTrue) pTopoClusterContainer = vectorClusterContainerTopo.back();
+        if(topoClusTrue) pTopoClusterContainer = vectorClusterContainerTopo.back();
+    }
+
+
+    //********************************************************************************
+    xAOD::TrackParticleContainer *GSFTrigTrackParticles = new xAOD::TrackParticleContainer();
+    if (m_doBremCollection){ 
+
+      ATH_MSG_DEBUG("In m_doBremCollection");
+      ATH_MSG_DEBUG(" REGTEST: Got " << vectorClusterContainer.size() << " CaloClusterContainers associated to the TE ");
+      if (vectorClusterContainer.size() != 1){
+        ATH_MSG_ERROR("REGTEST: Size of vectorClusterContainer is not 1, it is: "<< vectorClusterContainer.size());
+        return HLT::NAV_ERROR;
+      }
+
+      // Get the last ClusterContainer
+      const xAOD::CaloClusterContainer* clusContainer = vectorClusterContainer.back();
+      if(!clusContainer){
+	return HLT::OK;
+      }
+      
+      ATH_MSG_DEBUG (clusContainer->size() << " calo clusters in container");
+      
+      
+      std::vector<const xAOD::TrackParticleContainer*> vectorTrackParticleContainer;
+      stat = getFeatures(inputTE, vectorTrackParticleContainer);
+      
+      if (stat != HLT::OK) {
+	ATH_MSG_DEBUG(" REGTEST: no TrackParticleContainer from TE, m_doBremCollection ");
+	return HLT::NAV_ERROR;
+      }
+      
+      const xAOD::TrackParticleContainer *tracks = vectorTrackParticleContainer.back();
+      if (!tracks || tracks->size()<1){
+       return HLT::OK;
+      }
+      for (const xAOD::TrackParticle *trk:*tracks) {
+            ATH_MSG_DEBUG("track pt is: " << trk->pt());
+      }
+            
+
+
+      for (const xAOD::TrackParticle *trk:*GSFTrigTrackParticles) {
+            ATH_MSG_DEBUG("GSFTrigTrackParticles pt is: " << trk->pt());
+      }
+      
+      if (HLT::OK != attachFeature( outputTE, GSFTrigTrackParticles, "GSFTrigTrackParticles") ){
+        ATH_MSG_ERROR("REGTEST: trigger xAOD::TrackParticleContainer for GSF attach to TE and record into StoreGate failed");
+        return HLT::NAV_ERROR;
+      }
+
     }
 
     //**********************************************************************
@@ -775,8 +831,11 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
                     << " REGTEST: empty TrackParticleContainer from TE, m_trackMatchBuilder: " << m_trackMatchBuilder << endmsg;
 
             } else {
-                // Get the pointer to last TrackParticleContainer 
-                pTrackParticleContainer = vectorTrackParticleContainer.back();
+                // Get the pointer to last TrackParticleContainer
+                if(m_doBremCollection){
+                    pTrackParticleContainer = GSFTrigTrackParticles;
+                } 
+                else pTrackParticleContainer = vectorTrackParticleContainer.back();
                 m_doTrackMatching = true;
                 if(!pTrackParticleContainer){
                     m_doTrackMatching = false;
@@ -796,6 +855,7 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
         float leadTrkpt=0.0;
         const xAOD::TrackParticle *leadTrk=NULL;
         for (const xAOD::TrackParticle *trk:*pTrackParticleContainer) {
+        ATH_MSG_DEBUG("In track matching, track pt: " << trk->pt());
             if(trk->pt() > leadTrkpt) {
                 leadTrkpt = trk->pt();
                 leadTrk=trk;
@@ -894,7 +954,10 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
     }
                 
     ElementLinkVector<xAOD::TrackParticleContainer> trackLinks;
-    stat=getFeaturesLinks< xAOD::TrackParticleContainer, xAOD::TrackParticleContainer > (inputTE, trackLinks, "");
+    if(m_doBremCollection){
+        stat=getFeaturesLinks< xAOD::TrackParticleContainer, xAOD::TrackParticleContainer > (outputTE, trackLinks, "");
+    }
+    else stat=getFeaturesLinks< xAOD::TrackParticleContainer, xAOD::TrackParticleContainer > (inputTE, trackLinks, "");
     if ( stat != HLT::OK ) {
         ATH_MSG_ERROR("REGTEST: No TrackParticleLinks retrieved for the trigger element");
             //May need to add ERROR codes for online debugging
@@ -1082,53 +1145,61 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
         // Isolation
         //
         // Calo Isolation types
-
-	// THIS IS NOW BROKEN. IS IT WORTH FIXING, OR WILL THIS BECOME OBSOLETE IN 22.0?
-        
-        // if(m_doCaloCellIsolation || m_doTopoIsolation){       
-        //     if (timerSvc()) m_timerIsoTool2->start(); //timer
-        //     std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end();
-        //     for (; itc != itcE; itc++) {
-        //         CaloIsoHelp isoH = itc->second;
-        //         std::string flav = itc->first;
-        //         bool bsc = false;
-        //         if (flav == "etcone" && pCaloCellContainer)
-        //             bsc = m_caloCellIsolationTool->decorateParticle_caloCellIso(*eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer);
-        //         /*else if (flav == "topoetcone" )
-        //             // Add check for topoclusters (when available);
-        //             //bsc = m_topoIsolationTool->decorateParticle_topoClusterIso(*eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer);*/
-        //         if (!bsc && flav=="etcone") 
-        //             ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav);
-        //     }
-        //     ATH_MSG_DEBUG(" REGTEST: etcone20   =  " << getIsolation_etcone20(eg));
-        //     ATH_MSG_DEBUG(" REGTEST: etcone30   =  " << getIsolation_etcone30(eg));
-        //     ATH_MSG_DEBUG(" REGTEST: etcone40   =  " << getIsolation_etcone40(eg));
-        //     if (timerSvc()) m_timerIsoTool2->stop(); //timer
-        // }
-        // if(m_doTrackIsolation){
-        //     ATH_MSG_DEBUG("Running TrackIsolationTool for Electrons");
-
-        //     if (timerSvc()) m_timerIsoTool1->start(); //timer
-        //     if(m_egTrackIso.size() != 0) {
-        //         // Track Isolation types
-        //         std::map<std::string,TrackIsoHelp>::iterator itt = m_egTrackIso.begin(), ittE = m_egTrackIso.end();
-        //         for (; itt != ittE; itt++) {
-        //             TrackIsoHelp isoH = itt->second;
-        //             std::string flav  = itt->first;
-        //             const std::set<const xAOD::TrackParticle*> tracksToExclude = xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); // For GSF this may need to be property
-        //             // Need the decorate methods from IsolationTool
-        //             bool bsc = m_trackIsolationTool->decorateParticle(*eg, isoH.help.isoTypes, isoH.CorrList, &leadTrkVtx, &tracksToExclude,pTrackParticleContainer);
-        //             if (!bsc) 
-        //                 ATH_MSG_WARNING("Call to TrackIsolationTool failed for flavour " << flav);
-        //         }
-        //         ATH_MSG_DEBUG(" REGTEST: ptcone20   =  " << getIsolation_ptcone20(eg));
-        //         ATH_MSG_DEBUG(" REGTEST: ptcone30   =  " << getIsolation_ptcone30(eg));
-        //         ATH_MSG_DEBUG(" REGTEST: ptcone40   =  " << getIsolation_ptcone40(eg));
-
-        //     }
-        //     if (timerSvc()) m_timerIsoTool1->stop(); //timer       
-        // }
         
+        if(m_doCaloCellIsolation || m_doTopoIsolation){       
+            if (timerSvc()) m_timerIsoTool2->start(); //timer
+            std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end();
+            for (; itc != itcE; itc++) {
+                CaloIsoHelp isoH = itc->second;
+                std::string flav = itc->first;
+                bool bsc = false;
+                bool tbsc = false;
+		xAOD::CaloIsolation CaloIsoResult;
+		xAOD::CaloIsolation TopoIsoResult;
+                if (flav == "etcone" && pCaloCellContainer) {
+                    bsc = m_caloCellIsolationTool->caloCellIsolation(CaloIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer);
+		} else if (flav == "topoetcone" && topoClusTrue) {
+                    // Add check for topoclusters (when available);
+                    tbsc = m_topoIsolationTool->caloTopoClusterIsolation(TopoIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer);
+		}
+                if (!bsc && m_doCaloCellIsolation && flav=="etcone") {
+                    ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav);
+		}
+                if (!tbsc && m_doTopoIsolation && flav =="topoetcone") {
+                    ATH_MSG_WARNING("Call to CaloTopoIsolationTool failed for flavour " << flav);
+		}
+
+		ATH_MSG_DEBUG(" REGTEST: etcone       " << flav <<  " =   " <<  CaloIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]);
+		ATH_MSG_DEBUG(" REGTEST: topoetcone40 " << flav <<  " =   " <<  TopoIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]);
+
+	    }
+            if (timerSvc()) m_timerIsoTool2->stop(); //timer
+        }
+        if(m_doTrackIsolation){
+            ATH_MSG_DEBUG("Running TrackIsolationTool for Electrons");
+
+            if (timerSvc()) m_timerIsoTool1->start(); //timer
+            if(m_egTrackIso.size() != 0) {
+                // Track Isolation types
+                std::map<std::string,TrackIsoHelp>::iterator itt = m_egTrackIso.begin(), ittE = m_egTrackIso.end();
+		xAOD::TrackIsolation isoresult;
+                for (; itt != ittE; itt++) {
+                    TrackIsoHelp isoH = itt->second;
+                    std::string flav  = itt->first;
+                    const std::set<const xAOD::TrackParticle*> tracksToExclude = xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); // For GSF this may need to be property
+                    // Need the decorate methods from IsolationTool
+                    bool bsc = m_trackIsolationTool->trackIsolation(isoresult, *eg, isoH.help.isoTypes, isoH.CorrList, &leadTrkVtx, &tracksToExclude,pTrackParticleContainer);
+                    if (!bsc) 
+                        ATH_MSG_WARNING("Call to TrackIsolationTool failed for flavour " << flav);
+                }
+                ATH_MSG_DEBUG(" REGTEST: ptcone20   =  " << isoresult.ptcones[0]);
+                ATH_MSG_DEBUG(" REGTEST: ptcone30   =  " << isoresult.ptcones[1]);
+                ATH_MSG_DEBUG(" REGTEST: ptcone40   =  " << isoresult.ptcones[2]);
+
+            if (timerSvc()) m_timerIsoTool1->stop(); //timer       
+	    }
+	}
+	//
         // PID
         ATH_MSG_DEBUG("about to run execute(eg) for PID");
         if (timerSvc()) m_timerPIDTool1->start(); //timer
@@ -1169,35 +1240,35 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE,
         
         // Isolation
 
-	// BROKEN. WORTH FIXING, OR IS THIS FILE MOVING?
-        // if(m_doCaloCellIsolation || m_doTopoIsolation){       
-        //     if (timerSvc()) m_timerIsoTool2->start(); //timer
-        //     std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end();
-        //     for (; itc != itcE; itc++) {
-        //         CaloIsoHelp isoH = itc->second;
-        //         std::string flav = itc->first;
-        //         bool bsc = false;
-        //         bool tbsc = false;
-        //         if (flav == "etcone" && pCaloCellContainer)
-        //             bsc = m_caloCellIsolationTool->decorateParticle_caloCellIso(*eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer);
-        //         else if (flav == "topoetcone" && topoClusTrue)
-        //             // Add check for topoclusters (when available);
-        //             tbsc = m_topoIsolationTool->decorateParticle_topoClusterIso(*eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer);
-        //         if (!bsc && m_doCaloCellIsolation && flav=="etcone") 
-        //             ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav);
-        //         if (!tbsc && m_doTopoIsolation && flav =="topoetcone") 
-        //             ATH_MSG_WARNING("Call to CaloTopoIsolationTool failed for flavour " << flav);
-        //     }
-        //     ATH_MSG_DEBUG(" REGTEST: etcone20   =  " << getIsolation_etcone20(eg));
-        //     ATH_MSG_DEBUG(" REGTEST: etcone30   =  " << getIsolation_etcone30(eg));
-        //     ATH_MSG_DEBUG(" REGTEST: etcone40   =  " << getIsolation_etcone40(eg));
-        //     ATH_MSG_DEBUG(" REGTEST: topoetcone20   =  " << getIsolation_topoetcone20(eg));
-        //     ATH_MSG_DEBUG(" REGTEST: topoetcone30   =  " << getIsolation_topoetcone30(eg));
-        //     ATH_MSG_DEBUG(" REGTEST: topoetcone40   =  " << getIsolation_topoetcone40(eg));
-
-        //     if (timerSvc()) m_timerIsoTool2->stop(); //timer
-        // }
-    
+        if(m_doCaloCellIsolation || m_doTopoIsolation){       
+            if (timerSvc()) m_timerIsoTool2->start(); //timer
+            std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end();
+            for (; itc != itcE; itc++) {
+                CaloIsoHelp isoH = itc->second;
+                std::string flav = itc->first;
+                bool bsc = false;
+                bool tbsc = false;
+		xAOD::CaloIsolation CaloIsoResult;
+		xAOD::CaloIsolation TopoIsoResult;
+                if (flav == "etcone" && pCaloCellContainer){
+                    bsc = m_caloCellIsolationTool->caloCellIsolation(CaloIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer);
+		} else if (flav == "topoetcone" && topoClusTrue) {
+                    // Add check for topoclusters (when available);
+                    tbsc = m_topoIsolationTool->caloTopoClusterIsolation(TopoIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer);
+		}
+                if (!bsc && m_doCaloCellIsolation && flav=="etcone") {
+                    ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav);
+		}
+                if (!tbsc && m_doTopoIsolation && flav =="topoetcone") {
+                    ATH_MSG_WARNING("Call to CaloTopoIsolationTool failed for flavour " << flav);
+		}
+		ATH_MSG_DEBUG(" REGTEST: etcone       " << flav <<  " =   " <<  CaloIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]);
+		ATH_MSG_DEBUG(" REGTEST: topoetcone40 " << flav <<  " =   " <<  TopoIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]);
+	    }
+
+            if (timerSvc()) m_timerIsoTool2->stop(); //timer
+        }
+
         // Particle ID
         if (timerSvc()) m_timerPIDTool3->start(); //timer
         if( m_photonPIDBuilder->execute(ctx, eg)){