diff --git a/Trigger/TrigAnalysis/TrigDecisionTool/CMakeLists.txt b/Trigger/TrigAnalysis/TrigDecisionTool/CMakeLists.txt
index cc42264aad1e7c0d2af6ed279656d90ddd0a2b21..ada516fb04e5424dc6981efaf2f538ff572b12ba 100644
--- a/Trigger/TrigAnalysis/TrigDecisionTool/CMakeLists.txt
+++ b/Trigger/TrigAnalysis/TrigDecisionTool/CMakeLists.txt
@@ -1,4 +1,4 @@
-# $Id: CMakeLists.txt 750388 2016-05-27 15:57:30Z krasznaa $
+# $Id: CMakeLists.txt 786880 2016-11-28 13:00:09Z krasznaa $
 ################################################################################
 # Package: TrigDecisionTool
 ################################################################################
@@ -17,10 +17,29 @@ if( XAOD_STANDALONE )
       Trigger/TrigConfiguration/TrigConfInterfaces
       Trigger/TrigConfiguration/TrigConfL1Data
       Trigger/TrigEvent/TrigDecisionInterface
-	   Trigger/TrigEvent/TrigRoiConversion
+      Trigger/TrigEvent/TrigRoiConversion
       Trigger/TrigEvent/TrigNavStructure
       PRIVATE
       Trigger/TrigEvent/TrigSteeringEvent )
+elseif( XAOD_ANALYSIS )
+   atlas_depends_on_subdirs(
+      PUBLIC
+      Control/AthToolSupport/AsgTools
+      Control/StoreGate
+      Event/EventInfo
+      Event/xAOD/xAODBase
+      Event/xAOD/xAODTrigger
+      GaudiKernel
+      Trigger/TrigConfiguration/TrigConfHLTData
+      Trigger/TrigConfiguration/TrigConfInterfaces
+      Trigger/TrigConfiguration/TrigConfL1Data
+      Trigger/TrigEvent/TrigDecisionInterface
+      Trigger/TrigEvent/TrigRoiConversion
+      Trigger/TrigEvent/TrigNavStructure
+      PRIVATE
+      Control/AthenaBaseComps
+      Control/AthenaKernel
+      Trigger/TrigEvent/TrigSteeringEvent )
 else()
    atlas_depends_on_subdirs(
       PUBLIC
@@ -37,7 +56,7 @@ else()
       Trigger/TrigEvent/TrigDecisionEvent
       Trigger/TrigEvent/TrigDecisionInterface
       Trigger/TrigEvent/TrigMuonEvent
-	   Trigger/TrigEvent/TrigRoiConversion
+      Trigger/TrigEvent/TrigRoiConversion
       Trigger/TrigEvent/TrigNavStructure
       Trigger/TrigEvent/TrigNavigation
       Trigger/TrigEvent/TrigStorageDefinitions
@@ -62,17 +81,31 @@ if( XAOD_STANDALONE )
       TrigConfHLTData TrigConfL1Data TrigNavStructure TrigRoiConversionLib
       PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} TrigSteeringEvent )
 else()
-   atlas_add_library( TrigDecisionToolLib
-      TrigDecisionTool/*.h Root/*.cxx src/*.cxx
-      PUBLIC_HEADERS TrigDecisionTool
-      INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
-      PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-      LINK_LIBRARIES ${Boost_LIBRARIES} AsgTools EventInfo xAODBase xAODTrigger
-      GaudiKernel AnalysisTriggerEvent TrigConfHLTData TrigConfL1Data
-      TrigDecisionEvent TrigMuonEvent TrigNavStructure TrigStorageDefinitions
-      StoreGateLib TrigNavigationLib TrigRoiConversionLib
-      PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps TrigSteeringEvent
-      AthenaKernel )
+   if( XAOD_ANALYSIS )
+      atlas_add_library( TrigDecisionToolLib
+         TrigDecisionTool/*.h Root/*.cxx src/*.cxx
+         PUBLIC_HEADERS TrigDecisionTool
+         INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
+         PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+         LINK_LIBRARIES ${Boost_LIBRARIES} AsgTools EventInfo xAODBase
+         xAODTrigger GaudiKernel TrigConfHLTData TrigConfL1Data
+         TrigNavStructure StoreGateLib TrigRoiConversionLib
+         PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps
+         TrigSteeringEvent AthenaKernel )
+   else()
+      atlas_add_library( TrigDecisionToolLib
+         TrigDecisionTool/*.h Root/*.cxx src/*.cxx
+         PUBLIC_HEADERS TrigDecisionTool
+         INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
+         PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+         LINK_LIBRARIES ${Boost_LIBRARIES} AsgTools EventInfo xAODBase
+         xAODTrigger GaudiKernel AnalysisTriggerEvent TrigConfHLTData
+         TrigConfL1Data TrigDecisionEvent TrigMuonEvent TrigNavStructure
+         TrigStorageDefinitions StoreGateLib TrigNavigationLib
+         TrigRoiConversionLib
+         PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps
+         TrigSteeringEvent AthenaKernel )
+   endif()
 
    atlas_add_component( TrigDecisionTool
       src/components/*.cxx
diff --git a/Trigger/TrigAnalysis/TrigDecisionTool/Root/CacheGlobalMemory.cxx b/Trigger/TrigAnalysis/TrigDecisionTool/Root/CacheGlobalMemory.cxx
index 387d0790d64bdbe904b59c43a36e20c2194a6586..3c91afc99a743fe678fc11d409e2b2de26bbef4e 100644
--- a/Trigger/TrigAnalysis/TrigDecisionTool/Root/CacheGlobalMemory.cxx
+++ b/Trigger/TrigAnalysis/TrigDecisionTool/Root/CacheGlobalMemory.cxx
@@ -140,16 +140,20 @@ void Trig::CacheGlobalMemory::update(const TrigConf::HLTChainList* confChains,
   ATH_MSG_DEBUG( "Updating configuration, done with L1" );  
   
   //clear cache completely becuase underlying config objects might have changed
+  for(auto& c : m_l2chainsCache){delete c.second;}
   m_l2chainsCache.clear(); 
+  for(auto& c : m_efchainsCache){delete c.second;}
   m_efchainsCache.clear(); 
   m_mConfChains.clear();
   if ( ! confChains ) {
     ATH_MSG_WARNING( "No chains in configuration, probably run w/o HLT" );
   } else {
 
+    ATH_MSG_DEBUG("Updating Configuration chains. Number of conf chains: " << m_confChains->size()); 
+
     // updating internal map of conf chains (this map is only used for fast lookup)
     for(auto ch : *m_confChains) {
-      m_mConfChains[ch->chain_name().c_str()] = ch;
+      m_mConfChains[ch->chain_name()] = ch;
     }
 
     // updating internal cache of HLT::Chains
@@ -266,9 +270,10 @@ const HLT::Chain* Trig::CacheGlobalMemory::chain(const TrigConf::HLTChain& ch) c
 }
 
 const TrigConf::HLTChain* Trig::CacheGlobalMemory::config_chain(const std::string& name) const {
-  ChainHashMap_t::const_iterator f = m_mConfChains.find(name.c_str());
-  if ( f == m_mConfChains.end() )
+  ChainHashMap_t::const_iterator f = m_mConfChains.find(name);
+  if ( f == m_mConfChains.end() ){
     return 0;
+  }
   return f->second;
 }
 
diff --git a/Trigger/TrigAnalysis/TrigDecisionTool/Root/TrigDecisionTool.cxx b/Trigger/TrigAnalysis/TrigDecisionTool/Root/TrigDecisionTool.cxx
index 8dd6e14b796068f2291e1b39e7f0ddb589a83594..25e26aadd22f0a74e6c6fee96beb64cc6b46d3e8 100644
--- a/Trigger/TrigAnalysis/TrigDecisionTool/Root/TrigDecisionTool.cxx
+++ b/Trigger/TrigAnalysis/TrigDecisionTool/Root/TrigDecisionTool.cxx
@@ -229,6 +229,16 @@ StatusCode
 Trig::TrigDecisionTool::finalize() {
    // release all chaingroups
    m_navigation->reset();
+
+   auto it = std::find(s_instances.begin(), s_instances.end(), name());
+   if(it != s_instances.end()){
+     s_instances.erase(it);
+   }
+   else{
+      ATH_MSG_ERROR("could not find instance name in instance list, but must have been added in ::initialize(). Name: " << name());
+      return StatusCode::FAILURE;
+   }
+   ATH_MSG_INFO("TDT finalized and removed from instance list");
    return StatusCode::SUCCESS;
 }
 
diff --git a/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/CacheGlobalMemory.h b/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/CacheGlobalMemory.h
index 268a3bc1dc366c9b71e322c530f99e48a38fd393..55e2338ecab98503ffa06063e67dab8805b89807 100644
--- a/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/CacheGlobalMemory.h
+++ b/Trigger/TrigAnalysis/TrigDecisionTool/TrigDecisionTool/CacheGlobalMemory.h
@@ -199,15 +199,7 @@ namespace Trig {
     const TrigConf::HLTChainList*  m_confChains;            //!< all chains configuration
     mutable const xAOD::TrigCompositeContainer* m_expressStreamContainer;
 
-    struct eqstr
-    {
-      bool operator()(const char* s1, const char* s2) const
-      {
-        return strcmp(s1, s2) == 0;
-      }
-    };
-    
-    typedef std::unordered_map<const char*, const TrigConf::HLTChain*, std::hash<const char*>, eqstr> ChainHashMap_t;
+    typedef std::unordered_map<std::string, const TrigConf::HLTChain*> ChainHashMap_t;
     ChainHashMap_t     m_mConfChains;            //!< map of conf chains
   
     char     m_bgCode; //!< the encoded bunchgroup information