diff --git a/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx
index d6fdf943c3c83cf817a3029d6c74f86162652e55..a9ae9559fdfc0a3e7b0e7170c94c3fe98d315603 100644
--- a/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx
+++ b/Event/xAOD/xAODTrigger/Root/TrigCompositeAuxContainer_v2.cxx
@@ -18,6 +18,8 @@ namespace xAOD {
       AUX_VARIABLE( linkColKeys );
       AUX_VARIABLE( linkColIndices );
       AUX_VARIABLE( linkColClids );
+
+      AUX_VARIABLE( decisions );
    }
 
 } // namespace xAOD
diff --git a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx
index 50905d65e450824752caf6dcab3f24291161530e..c0603fb755d73a457b5927bf541d7f068f2cae46 100644
--- a/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx
+++ b/Event/xAOD/xAODTrigger/Root/TrigComposite_v1.cxx
@@ -47,6 +47,9 @@ namespace xAOD {
   AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::string,
                                       name, setName )
 
+  AUXSTORE_OBJECT_SETTER_AND_GETTER( TrigComposite_v1, std::vector<TrigCompositeUtils::DecisionID>,
+                                      decisions, setDecisions )
+
    //
    /////////////////////////////////////////////////////////////////////////////
 
@@ -97,6 +100,10 @@ namespace xAOD {
     if (newName == "") {
       newName = name;
     }
+    if (newName == "self") {
+      if (s_throwOnCopyError) throw std::runtime_error("It does not make sense for the 'self' link to be in a collection. There can be only one.");
+      return false;
+    }
     const std::string mangledName = name + s_collectionSuffix;
     const std::string mangledNewName = newName + s_collectionSuffix;
     if (other.hasObjectLink(mangledName)) {
@@ -123,8 +130,8 @@ namespace xAOD {
   bool TrigComposite_v1::copyAllLinksFrom(const xAOD::TrigComposite_v1& other) {
     bool didCopy = false;
     for (const std::string& name : other.linkColNames()) {
-      // Cannot copy any 'self' links as *this does not know its own location in its parent container
-      if (name == "self") continue;
+      // Cannot copy any 'self' link(s) as *this does not know its own location in its parent container
+      if (name == "self" || name == "self" + s_collectionSuffix) continue;
       // Check we don't have one (or more) entries with this raw name (raw = might be mangled).
       if (this->hasObjectLink(name)) continue;
       // Check if the link is for a single object or collection of objects by looking for the mangled suffix
@@ -173,6 +180,17 @@ namespace xAOD {
       return hasObjectLink( mangledName );
    }
 
+   bool TrigComposite_v1::hasObjectLinkExact(const std::string& name, const uint32_t key, const uint16_t index, const uint32_t clid) const {
+      for (size_t i = 0; i < this->linkColNames().size(); ++i) {
+         if (this->linkColNames().at(i) != name) continue;
+         if (this->linkColKeys().at(i) != key) continue;
+         if (this->linkColIndices().at(i) != index) continue;
+         if (this->linkColClids().at(i) != clid) continue;
+         return true;
+      } 
+      return false;
+   }
+
    AUXSTORE_OBJECT_GETTER( TrigComposite_v1, std::vector< std::string >,
                            linkColNames )
    AUXSTORE_OBJECT_GETTER( TrigComposite_v1, std::vector< uint32_t >,
@@ -209,7 +227,7 @@ namespace xAOD {
    void TrigComposite_v1::typelessSetObjectLink( const std::string& name, const uint32_t key, const uint32_t clid, const uint16_t beginIndex, const uint16_t endIndex ) {
 
      // Loop over collections
-     if ( endIndex - beginIndex > 1 ) {
+     if ( endIndex - beginIndex > 1 ) { // Adding a *collection* of links
 
        // Check uniqueness
        const std::string mangledName = name + s_collectionSuffix;
@@ -247,7 +265,7 @@ namespace xAOD {
          this->linkColClidsNC().push_back( clid );
        }
      }
-     else {
+     else { // Adding a *single* link
 
        // Check uniqueness
        if ( std::find( linkColNamesNC().begin(), linkColNamesNC().end(), name ) == linkColNamesNC().end() ) {
@@ -280,12 +298,19 @@ namespace xAOD {
 
 
 std::ostream& operator<<(std::ostream& os, const xAOD::TrigComposite_v1& tc) {
-  os << "TrigComposite_v1 '" << tc.name() << "' link: name, key, index, CLID" << std::endl;
+  os << "TrigComposite_v1 name:'" << tc.name() << "'" << std::endl;
+  os << "  N Lnks:" << tc.linkColNames().size();
   for (size_t i=0; i<tc.linkColNames().size(); ++i){
-    os << tc.linkColNames()[i] << ", ";
-    os << tc.linkColKeys()[i] << ", ";
-    os << tc.linkColIndices()[i] << ", ";
-    os << tc.linkColClids()[i] << std::endl;
+    if (!i) os << std::endl;
+    os << "    Link Name:"  << tc.linkColNames()[i];
+    os << ", Key:"   << tc.linkColKeys()[i];
+    os << ", Index:" << tc.linkColIndices()[i];
+    os << ", CLID:"  << tc.linkColClids()[i];
+    if (i != tc.linkColNames().size() - 1) os << std::endl;
+  }
+  if (tc.decisions().size()) {
+    os << std::endl << "  N Decisions: '" << tc.decisions().size() << std::endl << "    ";
+    for (const TrigCompositeUtils::DecisionID id : tc.decisions()) os << id << ", ";
   }
   return os;
 }
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h b/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h
index 32524ccb8d3133b433503338bf811cd71a1dcd2e..6fc5a85eec5a526e1af68657fd44b202c3c74789 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/TrigComposite.h
@@ -11,8 +11,6 @@
 // Local include(s):
 #include "xAODTrigger/versions/TrigComposite_v1.h"
 
-#include <set>
-
 namespace xAOD{
    /// Declare the latest version of the class
    typedef TrigComposite_v1 TrigComposite;
@@ -20,9 +18,6 @@ namespace xAOD{
 
 namespace TrigCompositeUtils{ 
    typedef xAOD::TrigComposite Decision;
-
-   typedef unsigned int DecisionID;
-   typedef std::set<DecisionID> DecisionIDContainer;
 }
 
 // Declare a CLID for the type:
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h
index a930c557c246d21a8ce1ae5b7aa37d3da8c18465..fce55c86b240c21e0ed0c09e311e6487ed1aebcf 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigCompositeAuxContainer_v2.h
@@ -18,6 +18,8 @@ extern "C" {
 // xAOD include(s):
 #include "xAODCore/AuxContainerBase.h"
 
+#include "xAODTrigger/TrigComposite.h"
+
 namespace xAOD {
 
    /// Auxiliary store for TrigComposite containers
@@ -41,6 +43,8 @@ namespace xAOD {
       std::vector< std::vector< uint16_t > >    linkColIndices;
       std::vector< std::vector< uint32_t > >    linkColClids;
 
+      std::vector< std::vector< TrigCompositeUtils::DecisionID > >    decisions;
+
    }; // class TrigCompositeAuxContainer_v2
 
 } // namespace xAOD
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h
index b65c66e1b880f035c1d2cd9b6e3624d65b05836b..6b529cabc190dd0102630bb320c80a2a6ca45c79 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.h
@@ -14,12 +14,18 @@ extern "C" {
 }
 #include <string>
 #include <vector>
+#include <set>
 
 // EDM include(s):
 #include "AthContainers/AuxElement.h"
 #include "AthLinks/ElementLink.h"
 #include "AthLinks/ElementLinkVector.h"
 
+namespace TrigCompositeUtils{ 
+   typedef unsigned int DecisionID;
+   typedef std::set<DecisionID> DecisionIDContainer;
+}
+
 namespace xAOD {
 
    /// Class used to describe composite objects in the HLT
@@ -54,6 +60,11 @@ namespace xAOD {
       /// Set a human-readable name for the object
       void setName( const std::string& name );
 
+      /// Get positive HLT chain decisions associated with this TrigComposite. Navigation use
+      const std::vector<TrigCompositeUtils::DecisionID>& decisions() const;
+      /// Set positive HLT chain decisions associated with this TrigComposite. Navigation use
+      void setDecisions( const std::vector<TrigCompositeUtils::DecisionID>& decisions );
+
       /// @}
 
       /// @name Functions for accessing basic properties on the object
@@ -94,11 +105,11 @@ namespace xAOD {
       template< class OBJECT >
       const OBJECT* object( const std::string& name ) const;
 
-      /// Add a link to a single object within a collection
+      /// Add a link to a single object within a collection. Performs de-duplication
       template< class CONTAINER >
       bool addObjectCollectionLink( const std::string& collectionName,
                                     const ElementLink< CONTAINER >& link );
-      /// Add links to multiple objects within a collection
+      /// Add links to multiple objects within a collection.  Performs de-duplication
       template< class CONTAINER >
       bool addObjectCollectionLinks( const std::string& collectionName,
                                      const ElementLinkVector< CONTAINER >& links );
@@ -176,6 +187,9 @@ namespace xAOD {
       /// Raw access to the persistent link CLIDs (non-const)
       std::vector< uint32_t >& linkColClidsNC();
 
+      // Helper function, check for exact link match
+      bool hasObjectLinkExact(const std::string& name, const uint32_t key, const uint16_t index, const uint32_t clid) const;
+
       /// Helper function, copy one link into this object
       void copyLinkInternal(const xAOD::TrigComposite_v1& other, const size_t index, const std::string& newName);
 
diff --git a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc
index 360664965ada39b4a054b1a6beaf1e6d3a60151e..598f26110174cef2457cc5c9481e81e35d5ed487 100644
--- a/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc
+++ b/Event/xAOD/xAODTrigger/xAODTrigger/versions/TrigComposite_v1.icc
@@ -184,12 +184,14 @@ namespace xAOD {
     // No method currently provided to update or check for uniqueness of a link
     // being added to a container.
 
-    // Add a new object:
+    // Add a new object (unless it would duplicate an existing one):
     const std::string mangledName = collectionName + s_collectionSuffix;
-    linkColNamesNC().push_back( mangledName );
-    linkColKeysNC().push_back( link.key() );
-    linkColIndicesNC().push_back( link.index() );
-    linkColClidsNC().push_back( ClassID_traits< CONTAINER >::ID() );
+    if (!hasObjectLinkExact(mangledName, link.key(), link.index(), ClassID_traits< CONTAINER >::ID())) {
+      linkColNamesNC().push_back( mangledName );
+      linkColKeysNC().push_back( link.key() );
+      linkColIndicesNC().push_back( link.index() );
+      linkColClidsNC().push_back( ClassID_traits< CONTAINER >::ID() );
+    }
     return true;
   }
 
diff --git a/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx b/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx
index 42ea4e63556ab3fadf64fb2b6bc80b8ef8f4326f..9b288cf02da0b22b5372f19fbe02e2d015213201 100644
--- a/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx
+++ b/Trigger/TrigAlgorithms/TrigPartialEventBuilding/src/PEBInfoWriterAlg.cxx
@@ -92,7 +92,7 @@ StatusCode PEBInfoWriterAlg::execute(const EventContext& eventContext) const {
     // Link to new decision
     newd->setObjectLink("roi", roiEL);
     newd->setObjectLink("view", viewEL);
-    linkToPrevious(newd, decisionInput().key(), counter);
+    linkToPrevious(newd, previousDecision);
     
     ATH_MSG_DEBUG("REGTEST:  View = " << (*viewEL));
     ATH_MSG_DEBUG("REGTEST:  RoI  = eta/phi = " << (*roiEL)->eta() << "/" << (*roiEL)->phi());
diff --git a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx
index b5d7bcf9eb119224617abc759c0c677095712bd5..bb07fa0e5b2299df1ac8044d0b1a7e3f34f6e70a 100644
--- a/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx
+++ b/Trigger/TrigHypothesis/TrigEgammaHypo/src/TrigL2CaloHypoAlgMT.cxx
@@ -55,7 +55,7 @@ StatusCode TrigL2CaloHypoAlgMT::execute( const EventContext& context ) const {
 
   // loop over previous decisions
   size_t counter=0;
-  for ( auto previousDecision: *previousDecisionsHandle ) {
+  for ( const auto previousDecision: *previousDecisionsHandle ) {
     //get RoI  
     auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" );
     
@@ -82,7 +82,7 @@ StatusCode TrigL2CaloHypoAlgMT::execute( const EventContext& context ) const {
     }
     d->setObjectLink( "roi", roiELInfo.link );
     
-    TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter );
+    TrigCompositeUtils::linkToPrevious( d, previousDecision );
     ATH_MSG_DEBUG( "Added view, roi, cluster, previous decision to new decision " << counter << " for view " << (*viewELInfo.link)->name()  );
     counter++;
 
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx
index df1a85c30c1c68339e76f4b2dc28a9d605f828fb..981fb5a24e11e4f127aebe4da913acb67b3d6ca3 100755
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMufastHypoAlg.cxx
@@ -74,7 +74,7 @@ StatusCode TrigMufastHypoAlg::execute( const EventContext& context ) const
   std::vector<TrigMufastHypoTool::MuonClusterInfo> toolInput;
   // loop over previous decisions
   size_t counter=0;
-  for ( auto previousDecision: *previousDecisionsHandle ) {
+  for ( const auto previousDecision: *previousDecisionsHandle ) {
     //get RoI
     auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI"  );
     auto roiEL = roiInfo.link;
@@ -104,7 +104,7 @@ StatusCode TrigMufastHypoAlg::execute( const EventContext& context ) const
     newd->setObjectLink( "feature", muonEL );  
     newd->setObjectLink( "roi",     roiEL );
     newd->setObjectLink( "view",    viewEL );
-    TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter );
+    TrigCompositeUtils::linkToPrevious( newd, previousDecision );
     
     ATH_MSG_DEBUG("REGTEST: " << m_muFastKey.key() << " pT = " << (*muonEL)->pt() << " GeV");
     ATH_MSG_DEBUG("REGTEST: " << m_muFastKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi());
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx
index 166b8cc483c8ab247a085e858032d80f0a35d3eb..f5bed116b9ab0bea0f912e6282747cdc8f6b2b4b 100644
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuisoHypoAlg.cxx
@@ -68,7 +68,7 @@ StatusCode TrigMuisoHypoAlg::execute( const EventContext& context) const
  
   std::vector<TrigMuisoHypoTool::MuisoInfo> toolInput; 
   size_t counter = 0; // view counter
-  for ( auto previousDecision: *previousDecisionsHandle ) {
+  for ( const auto previousDecision: *previousDecisionsHandle ) {
     // get View
     auto viewEL = previousDecision->objectLink< ViewContainer >( "view" );
     ATH_CHECK( viewEL.isValid() );
@@ -90,7 +90,7 @@ StatusCode TrigMuisoHypoAlg::execute( const EventContext& context) const
     
     newd->setObjectLink( "feature", muonEL );  
     newd->setObjectLink( "view",    viewEL );
-    TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter );
+    TrigCompositeUtils::linkToPrevious( newd, previousDecision );
     
     ATH_MSG_DEBUG("REGTEST: " << m_muIsoKey.key() << " pT = " << (*muonEL)->pt() << " GeV");
     ATH_MSG_DEBUG("REGTEST: " << m_muIsoKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi());
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx
index 2de33a5573a324d8f670f4bdea892072ebab46ea..be33078a44f834b44c49da8b4f49d8f23c8a9dac 100755
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFCombinerHypoAlg.cxx
@@ -75,7 +75,7 @@ StatusCode TrigMuonEFCombinerHypoAlg::execute( const EventContext& context ) con
   size_t counter = 0;  // view counter
 
   // loop over previous decisions
-  for ( auto previousDecision: *previousDecisionsHandle ) {
+  for ( const auto previousDecision: *previousDecisionsHandle ) {
      // get RoIs
     auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI"  );
     auto roiEL = roiInfo.link;
@@ -110,7 +110,7 @@ StatusCode TrigMuonEFCombinerHypoAlg::execute( const EventContext& context ) con
     newd -> setObjectLink( "feature", muonEL );
     newd -> setObjectLink( "roi",     roiEL  );
     newd -> setObjectLink( "view",    viewEL );
-    TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter );
+    TrigCompositeUtils::linkToPrevious( newd, previousDecision );
 
     ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " pT = " << (*muonEL)->pt() << " GeV");
     ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi());
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx
index 40bed09b2bdb1d0eb84992dc87921cdb034e2981..e91f559945aa6c79683b76631d26dfcff65ee58d 100755
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFMSonlyHypoAlg.cxx
@@ -75,7 +75,7 @@ StatusCode TrigMuonEFMSonlyHypoAlg::execute( const EventContext& context ) const
   size_t counter = 0;  // view counter
 
   // loop over previous decisions
-  for ( auto previousDecision: *previousDecisionsHandle ) {
+  for (const auto previousDecision: *previousDecisionsHandle ) {
      // get RoIs
     auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI"  );
     auto roiEL = roiInfo.link;
@@ -110,7 +110,7 @@ StatusCode TrigMuonEFMSonlyHypoAlg::execute( const EventContext& context ) const
     newd -> setObjectLink( "feature", muonEL );
     newd -> setObjectLink( "roi",     roiEL  );
     newd -> setObjectLink( "view",    viewEL );
-    TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter );
+    TrigCompositeUtils::linkToPrevious( newd, previousDecision );
 
     ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " pT = " << (*muonEL)->pt() << " GeV");
     ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " eta/phi = " << (*muonEL)->eta() << "/" << (*muonEL)->phi());
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx
index f1a59c2d650f44df95cce2e388063571332486e2..8c991854a1f48c3a2075db21876a3cad6e0308a6 100755
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigMuonEFTrackIsolationHypoAlg.cxx
@@ -71,7 +71,7 @@ StatusCode TrigMuonEFTrackIsolationHypoAlg::execute( const EventContext& context
 
   std::vector<TrigMuonEFTrackIsolationHypoTool::EFIsolationMuonInfo> toolInput;
   size_t counter = 0;
-  for ( auto previousDecision: *previousDecisionsHandle ) {
+  for ( const auto previousDecision: *previousDecisionsHandle ) {
     // get RoIs
     auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI"  );
     auto roiEL = roiInfo.link;
@@ -105,7 +105,7 @@ StatusCode TrigMuonEFTrackIsolationHypoAlg::execute( const EventContext& context
     newd -> setObjectLink( "roi", roiEL );
     newd -> setObjectLink( "view", viewEL );
 
-    TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter );
+    TrigCompositeUtils::linkToPrevious( newd, previousDecision );
 
 
     ATH_MSG_DEBUG("REGTEST: " << m_muonKey.key() << " pT = " << (*muonEL)->pt() << " GeV");
diff --git a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx
index ea94c0bc76ea8c65a4da78deed9d86e2719b15eb..95ecf0836b6f7269388bf510baebeeaf6523f1f4 100644
--- a/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigMuonHypoMT/src/TrigmuCombHypoAlg.cxx
@@ -75,7 +75,7 @@ StatusCode TrigmuCombHypoAlg::execute(const EventContext& context) const
   // loop over previous decisions
   size_t counter = 0; 
 
-  for ( auto previousDecision: *previousDecisionsHandle )  {
+  for ( const auto previousDecision: *previousDecisionsHandle )  {
     // get L2MuonSA Feature
     TrigCompositeUtils::LinkInfo<xAOD::L2StandAloneMuonContainer> linkInfo = 
        TrigCompositeUtils::findLink<xAOD::L2StandAloneMuonContainer>(previousDecision, "feature");
@@ -104,7 +104,7 @@ StatusCode TrigmuCombHypoAlg::execute(const EventContext& context) const
 
     // set objectLink
     newd->setObjectLink( "feature", muCombEL );
-    TrigCompositeUtils::linkToPrevious( newd, decisionInput().key(), counter);
+    TrigCompositeUtils::linkToPrevious( newd, previousDecision);
 
     // DEBUG
     auto muFastInfo = (*muCombEL)->muSATrack(); 
diff --git a/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx
index e03f9bac680661df8d8eea2d74fe26b943e1beae..f709144b2293813c1308ea1657607e9af3e2fe12 100644
--- a/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx
+++ b/Trigger/TrigHypothesis/TrigTauHypo/src/TrigTauCaloHypoAlgMT.cxx
@@ -52,7 +52,7 @@ StatusCode TrigTauCaloHypoAlgMT::execute( const EventContext& context ) const {
 
   // loop over previous decisions
   size_t counter=0;
-  for ( auto previousDecision: *previousDecisionsHandle ) {
+  for ( const auto previousDecision: *previousDecisionsHandle ) {
     //get RoI
     auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( previousDecision, "initialRoI" );
     ATH_CHECK( roiELInfo.isValid() );
@@ -70,15 +70,15 @@ StatusCode TrigTauCaloHypoAlgMT::execute( const EventContext& context ) const {
 
     toolInput.emplace_back( d, roi, clusterHandle.cptr(), previousDecision );
 
-     {
-       auto el = ViewHelper::makeLink( *(viewELInfo.link), clusterHandle, 0 );
+    {
+      auto el = ViewHelper::makeLink( *(viewELInfo.link), clusterHandle, 0 );
       ATH_CHECK( el.isValid() );
       d->setObjectLink( "feature",  el );
     }
-     d->setObjectLink( "roi", roiELInfo.link );
-     TrigCompositeUtils::linkToPrevious( d, decisionInput().key(), counter );
-     ATH_MSG_DEBUG( "Added view, roi, cluster, previous decision to new decision " << counter << " for view " << (*viewELInfo.link)->name()  );
-     counter++;
+    d->setObjectLink( "roi", roiELInfo.link );
+    TrigCompositeUtils::linkToPrevious( d, previousDecision );
+    ATH_MSG_DEBUG( "Added view, roi, cluster, previous decision to new decision " << counter << " for view " << (*viewELInfo.link)->name()  );
+    counter++;
 
   }
 
diff --git a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h
index f72f8f21b16729e9981b021606b7afc0a7101ac9..1bbd5cdcd5b27a4eefb764e885e34a61c1702660 100644
--- a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h
+++ b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.h
@@ -55,7 +55,6 @@ namespace TrigCompositeUtils {
   /**
    * @brief Creates and right away records the DecisionContainer using the provided WriteHandle.
    **/
-
   void createAndStore( SG::WriteHandle<DecisionContainer>& handle );
 
   /**
@@ -94,6 +93,12 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std:
    **/
   void insertDecisionIDs( const Decision* src, Decision* dest );
 
+ /**
+   * @brief Appends the decision IDs of src to the dest decision object
+   * @warning Performing merging of IDs and solving the duples (via set)
+   **/
+  void insertDecisionIDs( const DecisionIDContainer& src, Decision* dest );
+
  /**
    * @brief Make unique list of decision IDs of dest Decision object
    * @warning Use vector->set->vector
@@ -109,14 +114,17 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std:
 
   /**
    * @brief Another variant of the above method to access DecisionIDs stored in
- the Decision object, returns const accessor
+   * the Decision object, returns const accessor
+   * @warning Operates on the underlying xAOD vector form rather than the DecisionContainer set form
    **/
-  const std::vector<int>& decisionIDs( const Decision* d ); 
+  const std::vector<DecisionID>& decisionIDs( const Decision* d ); 
 
   /**
-   * @brief Another variant of the above method to access DecisionIDs stored in the Decision object, returns read/write accessor
+   * @brief Another variant of the above method to access DecisionIDs stored in 
+   * the Decision object, returns read/write accessor
+   * @warning Operates on the underlying xAOD vector form rather than the DecisionContainer set form
    **/ 
-  std::vector<int>& decisionIDs( Decision* d );
+  std::vector<DecisionID>& decisionIDs( Decision* d );
 
   
   /**
@@ -135,19 +143,24 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std:
   bool passed( DecisionID id, const DecisionIDContainer& );
   
   /**
-   * @brief Links to the previous object
+   * @brief Links to the previous object, location of previous 'seed' decision supplied by hand
    **/
   void linkToPrevious(Decision* d, const std::string& previousCollectionKey, size_t previousIndex);
 
   /**
-   * @brief checks if there is a link to previous object
+   * @brief Links to the previous object, 'seed' decision provided explicitly.
+   **/
+  void linkToPrevious(Decision* d, const Decision* dOld);
+
+  /**
+   * @brief checks if there is at least one 'seed' link to previous object
    **/
   bool hasLinkToPrevious(const Decision* d);
 
   /**
-   * @brief returns link to previous decision object
+   * @brief returns links to previous decision object 'seed'
    **/
-  ElementLinkVector<DecisionContainer> getLinkToPrevious(const Decision*);
+  const ElementLinkVector<DecisionContainer> getLinkToPrevious(const Decision*);
 
   /**
    * @brief copy all links from src to dest TC objects
@@ -180,6 +193,24 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std:
     std::string m_name;
   };
 
+  /**
+   * @brief Prerequisite object usable with @see filter allowing to find TC having a link to an object collection of name
+   **/
+  class HasObjectCollection {
+  public:
+    /**
+     * @brief constructor specifying the link name
+     **/
+    HasObjectCollection(const std::string& name): m_name(name) {}
+    /**
+     * @brief checks if the arg TC has link collection of name specified at construction 
+     * @warning method for internal consumption within @see find function 
+     **/
+    bool operator()(const xAOD::TrigComposite* ) const;
+  private:
+    std::string m_name;
+  };
+
   
   /**
    * @brief collects all TC linked back to the start TC
@@ -196,7 +227,7 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std:
       : source{0} {}
     LinkInfo(const xAOD::TrigComposite *s, const ElementLink<T>& l)
       : source{s}, link{l} {}
-	
+
     bool isValid() const {
       return source && link.isValid(); }
     /**
@@ -204,7 +235,7 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std:
      */
     operator StatusCode () {
       return (isValid() ? StatusCode::SUCCESS : StatusCode::FAILURE); }
-	
+
     const xAOD::TrigComposite *source;
     ElementLink<T> link;
   };
@@ -217,25 +248,7 @@ Decision* newDecisionIn( DecisionContainer* dc, const Decision* dOld, const std:
    */
   template<typename T>
   LinkInfo<T>
-  findLink(const xAOD::TrigComposite* start, const std::string& linkName) {
-    auto source = find(start, HasObject(linkName) );
-    //
-    if ( not source ){
-      auto seeds = getLinkToPrevious(start);
-      // std::cout<<"Looking for seeds: found " <<seeds.size()<<std::endl;
-      for (auto seed: seeds){
-	const xAOD::TrigComposite* dec = *seed;//deference
-	LinkInfo<T> link= findLink<T>( dec, linkName );
-	// return the first found
-	if (link.isValid()) return link;
-      }
-      return LinkInfo<T>(); // invalid link
-    }
-
-    //std::cout<<"Found source for "<<linkName<<std::endl;
-
-    return LinkInfo<T>( source, source->objectLink<T>( linkName ) );
-  }
+  findLink(const xAOD::TrigComposite* start, const std::string& linkName);
 
   /**
    * Prints the TC including the linked seeds
diff --git a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc
index 4f47a25430580aa651fe7c37ec81ea204ddb3015..198d9a223faeee541fedc427b7ad896877fe4efd 100644
--- a/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc
+++ b/Trigger/TrigSteer/DecisionHandling/DecisionHandling/TrigCompositeUtils.icc
@@ -36,5 +36,23 @@ namespace TrigCompositeUtils {
     return handle;
   }
 
+  template<typename T>
+  LinkInfo<T>
+  findLink(const xAOD::TrigComposite* start, const std::string& linkName) {
+    auto source = find(start, HasObject(linkName) );
+    //
+    if ( not source ){
+      auto seeds = getLinkToPrevious(start);
+      for (auto seed: seeds){
+        const xAOD::TrigComposite* dec = *seed;//deference
+        LinkInfo<T> link= findLink<T>( dec, linkName );
+        // return the first found
+        if (link.isValid()) return link;
+      }
+      return LinkInfo<T>(); // invalid link
+    }
+
+    return LinkInfo<T>( source, source->objectLink<T>( linkName ) );
+  }
 
 }
diff --git a/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref b/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref
index 4336ef8e73c8cd36b427b307f184f51fe89d7639..0efaa06a2d0d91f617cc1585a5565f79113cb83c 100644
--- a/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref
+++ b/Trigger/TrigSteer/DecisionHandling/share/TrigCompositeUtils_test.ref
@@ -1,7 +1,7 @@
 ApplicationMgr    SUCCESS 
 ====================================================================================================================================
-                                                   Welcome to ApplicationMgr (GaudiCoreSvc v27r1p99)
-                                          running on karma on Thu Dec 27 22:27:34 2018
+                                                   Welcome to ApplicationMgr (GaudiCoreSvc v30r5)
+                                          running on pc-tbed-pub-24.cern.ch on Wed Feb 20 14:16:00 2019
 ====================================================================================================================================
 ApplicationMgr       INFO Application Manager Configured successfully
 EventLoopMgr      WARNING Unable to locate service "EventSelector" 
@@ -9,18 +9,18 @@ EventLoopMgr      WARNING No events will be processed from external input.
 HistogramPersis...WARNING Histograms saving not required.
 ApplicationMgr       INFO Application Manager Initialized successfully
 ApplicationMgr Ready
-ClassIDSvc           INFO  getRegistryEntries: read 10811 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 7561 CLIDRegistry entries for module ALL
 Context: s: 0  e: 0
 Current context: s: 0  e: 0
 ClassIDSvc           INFO  getRegistryEntries: read 372 CLIDRegistry entries for module ALL
 initialize SG::WriteHandleKey<DecisionContainer> whkT
 call createAndStore( whkT ) with default context, twice
 StoreGateSvc_Impl WARNING  setupProxy:: error setting up proxy for key arbitrary and clid 1333228823
- Pre-existing valid DataProxy @0x1a48360 found in Store for key arbitrary with clid 1333228823
-StoreGateSvc_Impl WARNING record_impl: Problem setting up the proxy for object @0x1a458a0
- recorded with key arbitrary of type xAOD::TrigCompositeContainer (CLID 1333228823) in DataObject @0x1a42ea0
-VarHandle(Store...  ERROR Control/StoreGate/src/VarHandleBase.cxx:733 (FUNC): code 0: recordObject failed
-                    FATAL Control/StoreGate/StoreGate/WriteHandle.icc:887 (FUNC): code 0: this->record(std::move(data))
+ Pre-existing valid DataProxy @0xf666d0 found in Store for key arbitrary with clid 1333228823
+StoreGateSvc_Impl WARNING record_impl: Problem setting up the proxy for object @0xf64f10
+ recorded with key arbitrary of type xAOD::TrigCompositeContainer (CLID 1333228823) in DataObject @0xf66810
+VarHandle(Store...  ERROR /build1/atnight/localbuilds/nightlies/master/athena/Control/StoreGate/src/VarHandleBase.cxx:733 (FUNC): code 0: recordObject failed
+                    FATAL /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2019-02-11T2351/Athena/22.0.1/InstallArea/x86_64-slc6-gcc8-opt/src/Control/StoreGate/StoreGate/WriteHandle.icc:887 (FUNC): code 0: this->record(std::move(data))
 handle name "arbitrary" isPresent 1 isValid 1
 handle name "arbitrary" isPresent 1 isValid 0
 
@@ -44,32 +44,33 @@ Call setObjectLink with a bad ElementLink that has no corresponding collection.
 xAOD::TrigComposite_v1::setObjectLink ERROR link is not valid
 
 New decision d3b with name & context 
-d3b: TrigComposite_v1 'd3b' link: name, key, index, CLID
-self, 1042135810, 3, 1333228823
-testlink, 1042135810, 1, 1333228823
-
+d3b: TrigComposite_v1 name:'d3b'
+  N Lnks:2
+    Link Name:self, Key:1042135810, Index:3, CLID:1333228823
+    Link Name:testlink, Key:1042135810, Index:1, CLID:1333228823
 el2 1042135810 1
-d3: TrigComposite_v1 '' link: name, key, index, CLID
-self, 1042135810, 2, 1333228823
-seed, 1042135810, 1, 1333228823
-
-d4: TrigComposite_v1 '' link: name, key, index, CLID
-self, 1042135810, 4, 1333228823
-seed, 1042135810, 1, 1333228823
-
+d3: TrigComposite_v1 name:''
+  N Lnks:2
+    Link Name:self, Key:1042135810, Index:2, CLID:1333228823
+    Link Name:seed__COLL, Key:1042135810, Index:1, CLID:1333228823
+  N Decisions: '2
+    95, 99, 
+d4: TrigComposite_v1 name:''
+  N Lnks:2
+    Link Name:self, Key:1042135810, Index:4, CLID:1333228823
+    Link Name:seed__COLL, Key:1042135810, Index:1, CLID:1333228823
 el: key 1042135810 index 1
 create d5 
 set link 
-d5: TrigComposite_v1 'd5' link: name, key, index, CLID
-self, 1042135810, 5, 1333228823
-feature, 1042135810, 1, 1333228823
-
+d5: TrigComposite_v1 name:'d5'
+  N Lnks:2
+    Link Name:self, Key:1042135810, Index:5, CLID:1333228823
+    Link Name:feature, Key:1042135810, Index:1, CLID:1333228823
 create d6 
-d6: TrigComposite_v1 'd6' link: name, key, index, CLID
-self, 1042135810, 6, 1333228823
-feature, 1042135810, 1, 1333228823
-seed, 1042135810, 5, 1333228823
-
+d6: TrigComposite_v1 name:'d6'
+  N Lnks:2
+    Link Name:self, Key:1042135810, Index:6, CLID:1333228823
+    Link Name:seed__COLL, Key:1042135810, Index:5, CLID:1333228823
 get d5 feature link 
 get d6 feature link 
 compare feature links 
diff --git a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx
index 02488db94d84359d669f5d1ac3bc075fe5ea2606..a99a873cd1228fab6297cdee6687c8d40cb1488e 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/ComboHypo.cxx
@@ -10,7 +10,7 @@
 
 using namespace TrigCompositeUtils;
 ComboHypo::ComboHypo(const std::string& name, ISvcLocator* pSvcLocator) 
-  : ::AthReentrantAlgorithm(name, pSvcLocator)
+: ::AthReentrantAlgorithm(name, pSvcLocator)
 {}
 
 ComboHypo::~ComboHypo()
@@ -34,8 +34,8 @@ StatusCode ComboHypo::initialize() {
 
   // find max inputs size
   auto maxMultEl = std::max_element( m_multiplicitiesReqMap.begin(), m_multiplicitiesReqMap.end(),  
-  				   []( MultiplicityReqMap::value_type a, MultiplicityReqMap::value_type b ){  
-  				     return a.second.size() < b.second.size(); } ); 
+   []( MultiplicityReqMap::value_type a, MultiplicityReqMap::value_type b ){  
+     return a.second.size() < b.second.size(); } ); 
   
   const size_t maxMult = maxMultEl->second.size();
 
@@ -64,7 +64,7 @@ StatusCode ComboHypo::finalize() {
 
 
 StatusCode ComboHypo::copyDecisions( const DecisionIDContainer& passing, const EventContext& context ) const {
-    
+
   ATH_MSG_DEBUG( "Copying "<<passing.size()<<" positive decisions to outputs");
   for ( size_t input_counter = 0; input_counter < m_inputs.size(); ++input_counter ) {
 
@@ -74,51 +74,47 @@ StatusCode ComboHypo::copyDecisions( const DecisionIDContainer& passing, const E
 
     auto inputHandle = SG::makeHandle( m_inputs[input_counter], context );
     if ( inputHandle.isValid() ) {
-      const DecisionContainer* inputs = inputHandle.cptr();
-      const size_t sz = inputs->size();
       
-      for ( size_t i = 0; i < sz; ++i  ) {
-	const Decision *inputDecision = inputs->at(i);
-	DecisionIDContainer inputDecisionIDs;
-	decisionIDs( inputDecision, inputDecisionIDs );
-	
-	// from all poitive decision in the input only the ones that survived counting are passed over
-	DecisionIDContainer common;      
-	std::set_intersection( inputDecisionIDs.begin(), inputDecisionIDs.end(), passing.begin(), passing.end(),
-			       std::inserter( common, common.end() ) );
-	
-
-	Decision*  newDec = newDecisionIn( outDecisions );
-	linkToPrevious( newDec, inputHandle.key(), i );
-	ATH_MSG_DEBUG("New decision has "<< (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( newDec, "initialRoI")).isValid()
-		      <<" valid initialRoI and "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions");   
-
-	for ( auto id: common ) {
-	  addDecisionID( id, newDec );
-	}
-	
-	// add View?
-	if ( inputDecision->hasObjectLink( "view" ) ) {
-	   auto viewEL = inputDecision->objectLink< ViewContainer >( "view" );
-	   CHECK( viewEL.isValid() );
-	   newDec->setObjectLink( "view",    viewEL );
-	}
+      for (const Decision* inputDecision: *inputHandle) {
+
+        DecisionIDContainer inputDecisionIDs;
+        decisionIDs( inputDecision, inputDecisionIDs );
+
+        // from all poitive decision in the input only the ones that survived counting are passed over
+        DecisionIDContainer common;      
+        std::set_intersection( inputDecisionIDs.begin(), inputDecisionIDs.end(), passing.begin(), passing.end(),
+          std::inserter( common, common.end() ) );
+
+        Decision*  newDec = newDecisionIn( outDecisions );
+        linkToPrevious( newDec, inputDecision );
+        ATH_MSG_DEBUG("New decision has "<< (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( newDec, "initialRoI")).isValid()
+          << " valid initialRoI and "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions");   
+
+        insertDecisionIDs( common, newDec );
+
+        // add View?
+        if ( inputDecision->hasObjectLink( "view" ) ) {
+          auto viewEL = inputDecision->objectLink< ViewContainer >( "view" );
+          CHECK( viewEL.isValid() );
+          newDec->setObjectLink( "view",    viewEL );
+        }
       }
     }
 
     // debug printout:
-    if ( msgLvl(MSG::DEBUG)) {
+    if ( msgLvl(MSG::DEBUG) ) {
       ATH_MSG_DEBUG(outputHandle.key() <<" with "<< outputHandle->size() <<" decisions:");
       for (auto outdecision:  *outputHandle){
-	TrigCompositeUtils::DecisionIDContainer objDecisions;      
-	TrigCompositeUtils::decisionIDs( outdecision, objDecisions );    
-	ATH_MSG_DEBUG("Number of positive decisions for this output: " << objDecisions.size() );
-	for ( TrigCompositeUtils::DecisionID id : objDecisions ) {
-	  ATH_MSG_DEBUG( " ---  decision " << HLT::Identifier( id ) );
-	}
+        TrigCompositeUtils::DecisionIDContainer objDecisions;      
+        TrigCompositeUtils::decisionIDs( outdecision, objDecisions );    
+        ATH_MSG_DEBUG("Number of positive decisions for this output: " << objDecisions.size() );
+        for ( TrigCompositeUtils::DecisionID id : objDecisions ) {
+          ATH_MSG_DEBUG( " ---  decision " << HLT::Identifier( id ) );
+        }
       }
     }
   }
+
   return StatusCode::SUCCESS;
 }
 
@@ -129,11 +125,11 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >&  dmap, const E
       ATH_MSG_DEBUG( "Found implicit RH from " << inputHandle.key() <<" with "<< inputHandle->size() << " elements:"  );
       MultiplicityMap thisInputDmap;
       for ( const Decision* decision : *inputHandle.cptr() ) {
-	ATH_MSG_DEBUG( "Decision with "<< decisionIDs( decision ).size() << " chains passed:" );
-	for ( DecisionID id: decisionIDs( decision ) ) {
-	  ATH_MSG_DEBUG( " +++ " << HLT::Identifier( id ) );
-	  thisInputDmap[id] ++;
-	}	    
+        ATH_MSG_DEBUG( "Decision with "<< decisionIDs( decision ).size() << " chains passed:" );
+        for ( DecisionID id: decisionIDs( decision ) ) {
+          ATH_MSG_DEBUG( " +++ " << HLT::Identifier( id ) );
+          thisInputDmap[id] ++;
+        }     
       }
       dmap[i]= thisInputDmap; 
     }
@@ -143,7 +139,6 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >&  dmap, const E
     }
   }
 
-
   //debug
   ATH_MSG_DEBUG( "Decision map filled :" );
   int i=0;
@@ -158,7 +153,7 @@ void ComboHypo::fillDecisionsMap( std::vector< MultiplicityMap >&  dmap, const E
 
 StatusCode ComboHypo::execute(const EventContext& context ) const {
   ATH_MSG_DEBUG( "Executing " << name() << "..." );
- 
+
   
   DecisionIDContainer passing;
   // this map is filled with the count of positive decisions from each input
@@ -175,8 +170,8 @@ StatusCode ComboHypo::execute(const EventContext& context ) const {
       const int observedMultiplicity = dmap[ inputContainerIndex ][ requiredDecisionID ];
       ATH_MSG_DEBUG( "Required multiplicity " << requiredMultiplicity  << " for chain " << m.first<< ": observed multiplicity " << observedMultiplicity << " in container " << inputContainerIndex  );
       if ( observedMultiplicity < requiredMultiplicity ) {
-	overallDecision = false;
-	break;
+        overallDecision = false;
+        break;
       }
     }
     ATH_MSG_DEBUG( "Chain " << m.first <<  ( overallDecision ? " is accepted" : " is rejected") );
@@ -186,7 +181,6 @@ StatusCode ComboHypo::execute(const EventContext& context ) const {
   }
   
   ATH_CHECK( copyDecisions( passing, context ) );
-
   
   return StatusCode::SUCCESS;
 }
diff --git a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
index 6406db2a9d765067c5e7028e807cfa471418ff70..ae9f403eb8cf864fc9e352e4a2e7c6edc3a34be1 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/InputMakerBase.cxx
@@ -10,7 +10,7 @@ using namespace TrigCompositeUtils;
 
 
 InputMakerBase::InputMakerBase( const std::string& name, ISvcLocator* pSvcLocator )
-  : ::AthReentrantAlgorithm( name, pSvcLocator ) {}
+: ::AthReentrantAlgorithm( name, pSvcLocator ) {}
 
 InputMakerBase::~InputMakerBase() {}
 
@@ -65,55 +65,66 @@ StatusCode InputMakerBase::decisionInputToOutput(const EventContext& context, st
     }
     ATH_MSG_DEBUG( "Running on input "<< inputKey.key()<<" with " << inputHandle->size() << " elements" );
     
-    // create the output container
+    // We have an input container with >= 1 Decision objects. Create an output container with the same index. 
     TrigCompositeUtils::createAndStore(outputHandles[outputIndex]);
 
 
     auto outDecisions = outputHandles[outputIndex].ptr();
 
-    //map all RoIs that are stored in this input container
-    std::vector <ElementLink<TrigRoiDescriptorCollection> > RoIsFromDecision;
-       
+    // If using m_mergeOutputs, then collate all RoIs that are stored in this input container
+    ElementLinkVector<TrigRoiDescriptorCollection> RoIsFromDecision;
+
     // loop over decisions retrieved from this input
     size_t input_counter =0;
     size_t output_counter =0;
-   
-    for ( auto decision : *inputHandle){
-      ATH_MSG_DEBUG( "Input Decision "<<input_counter <<" has " <<TrigCompositeUtils::getLinkToPrevious(decision).size()<<" previous links");
-      TrigCompositeUtils::Decision*  newDec;
-      bool addDecision=false;
-      int roi_counter=0;
+    for (const TrigCompositeUtils::Decision* inputDecision : *inputHandle){
+      ATH_MSG_DEBUG( "Input Decision "<<input_counter <<" has " <<TrigCompositeUtils::getLinkToPrevious(inputDecision).size()<<" previous links");
+      TrigCompositeUtils::Decision* newDec = nullptr;
+      bool addDecision = false;
+      ElementLink<TrigRoiDescriptorCollection> roiEL = ElementLink<TrigRoiDescriptorCollection>();
+      
       if (m_mergeOutputs){
-	auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( decision,  m_roisLink.value());
-	CHECK( roiELInfo.isValid() );      
-	auto roiEL = roiELInfo.link;
-	auto roiIt=find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL);
-	addDecision = (roiIt == RoIsFromDecision.end());
-	if (addDecision) {
-	  RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used
-	  const TrigRoiDescriptor* roi = *roiEL;
-	  ATH_MSG_DEBUG( "Found RoI:" <<*roi<<" FS="<<roi->isFullscan());
-	  roi_counter = roiIt-RoIsFromDecision.begin();
-	}
-      } else
-	addDecision=true;
+        // Get RoI from this input decision 
+        const auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision,  m_roisLink.value());
+        CHECK( roiELInfo.isValid() );      
+        roiEL = roiELInfo.link;
+        const auto roiIt = std::find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL);
+        addDecision = (roiIt == RoIsFromDecision.end());
+        // addDecision is positive here if we have *not* before encountered this RoI within this input collection.
+        if (addDecision) {
+          RoIsFromDecision.push_back(roiEL); // To keep track of which we have used
+          ATH_MSG_DEBUG( "Found RoI:" << **roiEL <<" FS="<< (*roiEL)->isFullscan());
+        }
+      } else { // Not merging, keep a 1-to-1 mapping of Decisions in Input & Output containers
+        addDecision=true;
+      }
 
       if ( addDecision ){
-	newDec = TrigCompositeUtils::newDecisionIn( outDecisions );
-	output_counter++;
-      }
-      else{
-	newDec = outDecisions[outputIndex][roi_counter];
+        // Create a new Decision in the Output container to mirror one in the Input container
+        newDec = TrigCompositeUtils::newDecisionIn( outDecisions );
+        output_counter++;
+      } else{
+        // addDecision can only be false if m_mergeOutputs was true and roiEL was found within RoIsFromDecision
+        // Re-use a Decision already added to the Output container 
+        const auto roiIt = std::find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL);
+        if (roiIt == RoIsFromDecision.end()) {
+          ATH_MSG_ERROR("Logic error in decisionInputToOutput. Cannot find existing RoI.");
+          return StatusCode::FAILURE;
+        }
+        const size_t roiCounter = std::distance( RoIsFromDecision.begin(), roiIt );
+        newDec = outDecisions[outputIndex][roiCounter];
       }
-      
-      TrigCompositeUtils::linkToPrevious( newDec, inputKey.key(), input_counter );
-      TrigCompositeUtils::insertDecisionIDs( decision, newDec );     	
+
+      TrigCompositeUtils::linkToPrevious( newDec, inputDecision ); // Link inputDecision object as the 'seed' of newDec
+      TrigCompositeUtils::insertDecisionIDs( inputDecision, newDec ); // Copy decision IDs from inputDecision into newDec
       ATH_MSG_DEBUG("New decision has "<< (TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( newDec,  m_roisLink.value())).isValid() <<" valid "<<m_roisLink.value() <<" and "<< TrigCompositeUtils::getLinkToPrevious(newDec).size() <<" previous decisions");     
-      input_counter++;	
+      input_counter++;  
     } // loop over input decisions
 
     ATH_MSG_DEBUG( "Filled output key " <<  decisionOutputs()[ outputIndex ].key() <<" of size "<<outDecisions->size()  <<" at index "<< outputIndex);
-    outputIndex++;	       
+    for (auto i : *outDecisions) msg() << i << " ";
+    msg() << endmsg;
+    outputIndex++;         
   } // end of first loop over input keys
 
   return StatusCode::SUCCESS;
@@ -176,4 +187,4 @@ size_t InputMakerBase::countInputHandles( const EventContext& context ) const {
 
 
 
-  
+
diff --git a/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx b/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx
index a527412adc03f363ff443842de31fcee677b423f..e396a41734d7d451beda37ea95c45a0bbca81b4f 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/InputMakerForRoI.cxx
@@ -12,10 +12,11 @@ using TrigCompositeUtils::DecisionContainer;
 using TrigCompositeUtils::Decision;
 using TrigCompositeUtils::linkToPrevious;
 using TrigCompositeUtils::getLinkToPrevious;
+using TrigCompositeUtils::findLink;
 
 InputMakerForRoI:: InputMakerForRoI( const std::string& name, 
-				     ISvcLocator* pSvcLocator )    
-  : InputMakerBase( name, pSvcLocator ) {}
+ ISvcLocator* pSvcLocator )    
+: InputMakerBase( name, pSvcLocator ) {}
 
 
 InputMakerForRoI::~ InputMakerForRoI() {}
@@ -38,12 +39,12 @@ StatusCode  InputMakerForRoI::execute( const EventContext& context ) const {
   ATH_MSG_DEBUG( "Executing " << name() << "..." );
   
   // call base class helper method to read input decisions, loop over them create outputs and connect them, returns with outputHandles filled
-  std::vector< SG::WriteHandle<TrigCompositeUtils::DecisionContainer> > outputHandles;
+  std::vector< SG::WriteHandle<DecisionContainer> > outputHandles;
   ATH_CHECK (decisionInputToOutput(context, outputHandles));
   
   // Prepare Outputs
   std::unique_ptr< TrigRoiDescriptorCollection > oneRoIColl( new TrigRoiDescriptorCollection() );
- 
+
   // use also this:    ElementLinkVector<xAOD::MuonRoIContainer> getMuonRoILinks = obj->objectCollectionLinks<xAOD::MuonRoIContainer>("ManyMuonRoIs");
   std::vector <ElementLink<TrigRoiDescriptorCollection> > RoIsFromDecision;  // used to check for duplicate features linked to different inputHandles
 
@@ -61,24 +62,23 @@ StatusCode  InputMakerForRoI::execute( const EventContext& context ) const {
     ATH_MSG_DEBUG( "Got output "<< outputHandle.key()<<" with " << outputHandle->size() << " elements" );
     // loop over output decisions in container of outputHandle, follow link to inputDecision
     for ( auto outputDecision : *outputHandle){ 
-      ElementLinkVector<DecisionContainer> inputLinks = TrigCompositeUtils::getLinkToPrevious(outputDecision);
+      ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision);
       for (auto input: inputLinks){
-	const Decision* inputDecision = *input;
-	auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() );
-	auto roiEL = roiELInfo.link;
-	ATH_CHECK( roiEL.isValid() );
-      
-	// avoid adding the same feature multiple times: check if not in container, if not add it
-	if ( find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL)
-	     == RoIsFromDecision.end() ){
-	  RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used 
-	  const TrigRoiDescriptor* roi = *roiEL;
-	  ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan());
-	  //make a new one:
-	  TrigRoiDescriptor* newroi= new TrigRoiDescriptor(*roi); //use copy constructor
-	  oneRoIColl->push_back(newroi);
-	  ATH_MSG_DEBUG("Added RoI:" <<*newroi<<" FS="<<newroi->isFullscan());
-	}
+        const Decision* inputDecision = *input;
+        auto roiELInfo = findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() );
+        auto roiEL = roiELInfo.link;
+        ATH_CHECK( roiEL.isValid() );
+
+        // avoid adding the same feature multiple times: check if not in container, if not add it
+        if ( find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL) == RoIsFromDecision.end() ) {
+          RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used 
+          const TrigRoiDescriptor* roi = *roiEL;
+          ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan());
+          //make a new one:
+          TrigRoiDescriptor* newroi= new TrigRoiDescriptor(*roi); //use copy constructor
+          oneRoIColl->push_back(newroi);
+          ATH_MSG_DEBUG("Added RoI:" <<*newroi<<" FS="<<newroi->isFullscan());
+        }
       } // loop over previous input links           
     } // loop over decisions      
   } // loop over output keys
diff --git a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx
index dc97402c08734eb7ba704aa50bc48b3c313c4c35..33aa17f46550e97d04f34761a9bbe26ad9b24eda 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.cxx
@@ -7,6 +7,15 @@
 
 #include "GaudiKernel/Property.h"
 
+using TrigCompositeUtils::DecisionContainer;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::DecisionIDContainer;
+using TrigCompositeUtils::DecisionID;
+using TrigCompositeUtils::decisionIDs;
+using TrigCompositeUtils::insertDecisionIDs;
+using TrigCompositeUtils::createAndStore;
+using TrigCompositeUtils::newDecisionIn;
+
 RoRSeqFilter::RoRSeqFilter( const std::string& name, 
   ISvcLocator* pSvcLocator ) :
   ::AthAlgorithm( name, pSvcLocator )
@@ -87,34 +96,35 @@ StatusCode RoRSeqFilter::execute() {
   if ( m_mergeInputs ) {
 
     ATH_MSG_DEBUG( "Recording " <<  m_outputKeys[ 0 ].key() ); 
-    TrigCompositeUtils::createAndStore(outputHandles[0]);
-    TrigCompositeUtils::DecisionContainer* output = outputHandles[0].ptr();
+    createAndStore(outputHandles[0]);
+    DecisionContainer* output = outputHandles[0].ptr();
     for ( auto inputKey: m_inputKeys ) {
       auto inputHandle = SG::makeHandle( inputKey );
       if( inputHandle.isValid() )
-        passCounter += copyPassing( *inputHandle, inputKey.key(),  *output );
+        passCounter += copyPassing( *inputHandle,  *output );
     }
     outputIndex++;
 
-  } else {
+  } else { // Not merging inputs
 
     for ( auto inputKey: m_inputKeys ) {
       // already made handles, so this code could be simplified to a loop over inputHandles.
       auto inputHandle = SG::makeHandle( inputKey );
 
       if( not inputHandle.isValid() ) {
-	ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" not present" );
+        ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" not present" );
       } else if ( inputHandle->empty() ) {
-	ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" contains all rejected decisions, skipping" );
+        ATH_MSG_DEBUG( "InputHandle "<< inputKey.key() <<" contains all rejected decisions, skipping" );
       } else {
-	ATH_MSG_DEBUG( "Checking inputHandle "<< inputKey.key() <<" with " << inputHandle->size() <<" elements");
-	TrigCompositeUtils::createAndStore(outputHandles[outputIndex]);
-	TrigCompositeUtils::DecisionContainer* output = outputHandles[outputIndex].ptr();
-	passCounter += copyPassing( *inputHandle, inputKey.key(), *output );	
-	ATH_MSG_DEBUG( "Recorded output key " <<  m_outputKeys[ outputIndex ].key() <<" of size "<<output->size()  <<" at index "<< outputIndex);
+        ATH_MSG_DEBUG( "Checking inputHandle "<< inputKey.key() <<" with " << inputHandle->size() <<" elements");
+        createAndStore(outputHandles[outputIndex]);
+        DecisionContainer* output = outputHandles[outputIndex].ptr();
+        passCounter += copyPassing( *inputHandle, *output );  
+        ATH_MSG_DEBUG( "Recorded output key " <<  m_outputKeys[ outputIndex ].key() <<" of size "<<output->size()  <<" at index "<< outputIndex);
       }
       outputIndex++; // Keep the mapping of inputKey<->outputKey correct
     }
+
   }
 
   setFilterPassed( passCounter != 0 );
@@ -127,33 +137,36 @@ StatusCode RoRSeqFilter::execute() {
   return StatusCode::SUCCESS;
 }
   
-size_t RoRSeqFilter::copyPassing( const TrigCompositeUtils::DecisionContainer& input, 
-                                  const std::string& inputKey,
-                                  TrigCompositeUtils::DecisionContainer& output ) const {
+size_t RoRSeqFilter::copyPassing( const DecisionContainer& input, 
+                                  DecisionContainer& output ) const {
   size_t passCounter = 0;
   ATH_MSG_DEBUG( "Input size " << input.size() );
   for (size_t i = 0; i < input.size(); ++i) {
-    const TrigCompositeUtils::Decision* inputDecision = input.at(i);
+    const Decision* inputDecision = input.at(i);
 
-    TrigCompositeUtils::DecisionIDContainer objDecisions;      
-    TrigCompositeUtils::decisionIDs( inputDecision, objDecisions );
+    DecisionIDContainer objDecisions;      
+    decisionIDs( inputDecision, objDecisions );
 
     ATH_MSG_DEBUG("Number of positive decisions for this input: " << objDecisions.size() );
 
-    for ( TrigCompositeUtils::DecisionID id : objDecisions ) {
+    for ( DecisionID id : objDecisions ) {
       ATH_MSG_DEBUG( " -- Positive decision " << HLT::Identifier( id ) );
     }
 
-    std::vector<TrigCompositeUtils::DecisionID> intersection;
+    DecisionIDContainer intersection;
     std::set_intersection( m_chains.begin(), m_chains.end(),
          objDecisions.begin(), objDecisions.end(),
-         std::back_inserter( intersection ) );
+         std::inserter(intersection, intersection.end()) );
 
     if ( not intersection.empty() ) {      
-      TrigCompositeUtils::Decision* decisionCopy = TrigCompositeUtils::newDecisionIn( &output, name() );
-      *decisionCopy = *inputDecision; // copies auxdata from one auxstore to the other
-      // future improvement: could use newDecisionIn(&output,input,name which internally does the linkToPrevious, then no longer need to pass the key
-      TrigCompositeUtils::linkToPrevious(decisionCopy, inputKey, i); // Update seed
+      // This sets up the 'self' link & the 'seed' link (seeds from inputDecision)
+      Decision* decisionCopy = newDecisionIn( &output, inputDecision, name() );
+
+      // Copy accross only the DecisionIDs which have passed through this Filter for this Decision object. 
+      // WARNING: Still need to 100% confirm if the correct set to propagate forward is objDecisions or intersection.
+      // Tim M changing this from objDecisions (all IDs) -> intersection (only passed IDs) Feb 19
+      insertDecisionIDs(intersection, decisionCopy);
+
       passCounter ++;
       ATH_MSG_DEBUG("Input satisfied at least one active chain");
     } else {
diff --git a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h
index ee6a6dd2f9fbf02a472f854ee4c31b9c938eee8f..6e572e48d7fc85a9a70ca09f87976dc0c11f973f 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h
+++ b/Trigger/TrigSteer/DecisionHandling/src/RoRSeqFilter.h
@@ -79,17 +79,15 @@ class RoRSeqFilter
 /**
  * @brief Applies generic filter to input container, keeping only the decision objects with at least 
  * one affirmative decision from the previous Stage. Considering only decisions from chains utilising this filter.
- * @param input Reference to input container of decision objects.
  * @param inputKey Storegate key of input, needed to link newly created decision objects to their parents.
  * @param output Writeable output container to store copies of decision objects which pass the filter.
  * @return The number of decision objects which passed the filter.
  *
- * Produced a deep-copy of all Decision objects in the input container which possess a positive decision from
+ * Produced a selective copy of all Decision objects in the input container which possess a positive decision from
  * at least one of the chains which this filter algorithm is configured for. This new object is linked to its 
  * parent and stored in the output collection. It will form the starting point for the next Step. 
  **/
   size_t copyPassing( const TrigCompositeUtils::DecisionContainer& input, 
-                      const std::string& inputKey,
                       TrigCompositeUtils::DecisionContainer& output) const;
 
 }; 
diff --git a/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx b/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx
index 581958e813a97f4db2c9337ecf1aaa93d00b65d3..8a8e92a003e73c29d862c742b47937dc4ac9ae57 100644
--- a/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/src/TrigCompositeUtils.cxx
@@ -10,10 +10,8 @@
 #include "StoreGate/WriteHandle.h"
 #include "DecisionHandling/TrigCompositeUtils.h"
 
-
-
-static const SG::AuxElement::Accessor< std::vector< int > >   readWriteAccessor( "decisions" );
-static const SG::AuxElement::ConstAccessor< std::vector<int> > readOnlyAccessor( "decisions" );
+static const SG::AuxElement::Accessor< std::vector<TrigCompositeUtils::DecisionID> > readWriteAccessor("decisions");
+static const SG::AuxElement::ConstAccessor< std::vector<TrigCompositeUtils::DecisionID> > readOnlyAccessor("decisions");
 
 namespace TrigCompositeUtils {  
 
@@ -36,7 +34,6 @@ namespace TrigCompositeUtils {
   Decision* newDecisionIn ( DecisionContainer* dc, const std::string& name, const EventContext& ctx ) {
     Decision * x = new Decision;
     dc->push_back( x );
-    readWriteAccessor( *x ).size(); // fake operation just to make the decisions decoration
     size_t index = dc->size() - 1;
     // make self link, useful to copy for seed link in a successor, but requires that DecisionContainer is already recorded in SG.
     ElementLink<DecisionContainer> el(*dc, index, ctx);
@@ -51,68 +48,63 @@ namespace TrigCompositeUtils {
   }
 
   Decision* newDecisionIn ( DecisionContainer* dc, const Decision* dOld, const std::string& name, const EventContext& ctx ) {
-    Decision* dNew =  newDecisionIn( dc, name, ctx);
-   if ( dOld->hasObjectLink("roi" ) ){
-     dNew->copyLinkFrom(dOld,"roi");
-   }
-   else if ( dOld->hasObjectLink("initialRoI") ){
-     dNew->copyLinkFrom(dOld,"initialRoI","roi");
-   }
-   if ( dOld->hasObjectLink("view" ) ){
-     dNew->copyLinkFrom(dOld,"view");
-   }
-   if ( dOld->hasObjectLink("feature" ) ){
-     dNew->copyLinkFrom(dOld,"feature");
-   }
-   if ( dOld->hasObjectLink("self" ) ){
-     dNew->copyLinkFrom(dOld,"self","seed"); // make use of self-link 
-   }
-   return dNew;
+    Decision* dNew =  newDecisionIn( dc, name, ctx); // Sets up 'self' link of dNew
+    linkToPrevious(dNew, dOld); // Sets up link to 'seed' collection, points to 'self' link of dOld
+    return dNew;
   }
 
   void addDecisionID( DecisionID id,  Decision* d ) {   
-    std::vector<int>& decisions = readWriteAccessor( *d );
-    if ( decisions.size() == 0 or decisions.back() != static_cast<int>(id) ) 
+    std::vector<DecisionID>& decisions = readWriteAccessor( *d );
+    if ( decisions.size() == 0 or decisions.back() != id) 
       decisions.push_back( id );
   }
   
   void decisionIDs( const Decision* d, DecisionIDContainer& destination ) {    
-    const std::vector<int>& decisions = readOnlyAccessor( *d );    
+    const std::vector<DecisionID>& decisions = readOnlyAccessor( *d );    
     destination.insert( decisions.begin(), decisions.end() );
   }
 
-  const std::vector<int>& decisionIDs( const Decision* d ) {    
+  const std::vector<DecisionID>& decisionIDs( const Decision* d ) {    
     return readOnlyAccessor( *d );    
   }
 
-  std::vector<int>& decisionIDs( Decision* d ) {
+  std::vector<DecisionID>& decisionIDs( Decision* d ) {
     return readWriteAccessor( *d );
   }
 
-  void insertDecisionIDs( const Decision* src, Decision* dest ){
-    DecisionIDContainer ids;
-    decisionIDs( src, ids );
-    decisionIDs( dest, ids );
-    decisionIDs( dest ).clear(); 
-    decisionIDs( dest ).insert( decisionIDs(dest).end(), ids.begin(), ids.end() );
+  void insertDecisionIDs(const Decision* src, Decision* dest ){
+    DecisionIDContainer srcIds;
+    decisionIDs( src, srcIds ); // Now stored in a set
+    insertDecisionIDs( srcIds, dest);
+  }
+
+  void insertDecisionIDs( const DecisionIDContainer& src, Decision* dest ) {
+    DecisionIDContainer collateIDs;
+    // Decision are xAOD objects backed by a std::vector
+    // Here we use a std::set to de-duplicate IDs from src and dest before setting dest
+    decisionIDs( dest, collateIDs ); // Set operation 1. Get from dest
+    collateIDs.insert( src.begin(), src.end() ); // Set operation 2. Get from src
+    decisionIDs( dest ).clear(); // Clear target
+    // Copy from set to (ordered) vector
+    decisionIDs( dest ).insert( decisionIDs(dest).end(), src.begin(), src.end() );
   }
 
-  void uniqueDecisionIDs( Decision* dest){
-    DecisionIDContainer ids;
-    decisionIDs( dest, ids );
-    decisionIDs( dest ).clear(); 
-    decisionIDs( dest ).insert( decisionIDs(dest).end(), ids.begin(), ids.end() );
+  void uniqueDecisionIDs(Decision* dest) {
+    // Re-use above insertDecisionIDs method.
+    // This implicitly performs de-duplication
+    return insertDecisionIDs(dest, dest);
   }
 
   bool allFailed( const Decision* d ) {
-    const std::vector<int>& decisions = readOnlyAccessor( *d );    
+    const std::vector<DecisionID>& decisions = readOnlyAccessor( *d );    
     return decisions.empty();
   }
 
   bool isAnyIDPassing( const Decision* d,  const DecisionIDContainer& required ) {
-    for ( auto id : readOnlyAccessor( *d ) ) {
-      if ( required.count( id ) > 0 )
-	return true;
+    for ( DecisionID id : readOnlyAccessor( *d ) ) {
+      if ( required.count( id ) > 0 ) {
+        return true;
+      }
     }
     return false;
   }    
@@ -122,29 +114,29 @@ namespace TrigCompositeUtils {
   }
 
   void linkToPrevious( Decision* d, const std::string& previousCollectionKey, size_t previousIndex ) {
-    ElementLinkVector<DecisionContainer> seeds;
-    ElementLink<DecisionContainer> new_seed= ElementLink<DecisionContainer>( previousCollectionKey, previousIndex );
-    // do we need this link to self link?
-    if ( (*new_seed)->hasObjectLink("self" ) )
-      seeds.push_back( (*new_seed)->objectLink<DecisionContainer>("self")); // make use of self-link 
-    else
-      seeds.push_back(ElementLink<DecisionContainer>( previousCollectionKey, previousIndex ));
-    
-    if (hasLinkToPrevious(d) ){
-      ElementLinkVector<DecisionContainer> oldseeds = d->objectCollectionLinks<DecisionContainer>( "seed" );
-      seeds.reserve( seeds.size() + oldseeds.size() );
-      std::move( oldseeds.begin(), oldseeds.end(), std::back_inserter( seeds ) );
+    ElementLink<DecisionContainer> seed = ElementLink<DecisionContainer>( previousCollectionKey, previousIndex );
+    if (!seed.isValid()) {
+      throw GaudiException("Invalid Decision Link key or index provided", "TrigCompositeUtils::linkToPrevious", StatusCode::FAILURE);
+    } else {
+      d->addObjectCollectionLink("seed", seed);
     }
+  }
 
-    d->addObjectCollectionLinks("seed", seeds);
-    
+  void linkToPrevious( Decision* d, const Decision* dOld) {
+    if ( dOld && dOld->hasObjectLink("self") ) {
+      // Internally de-dupes the "seed" collection of links
+      d->addObjectCollectionLink("seed", dOld->objectLink<DecisionContainer>("self"));  
+    } else {
+      throw GaudiException("Using linkToPrevious with a previous decision requires that decision to have its 'self' link set",
+        "TrigCompositeUtils::linkToPrevious", StatusCode::FAILURE);
+    }    
   }
 
   bool hasLinkToPrevious( const Decision* d ) {
-    return d->hasObjectLink( "seed" );
+    return d->hasObjectCollectionLinks( "seed" );
   }
 
-  ElementLinkVector <DecisionContainer> getLinkToPrevious( const Decision* d ) {
+  const ElementLinkVector<DecisionContainer> getLinkToPrevious( const Decision* d ) {
     return d->objectCollectionLinks<DecisionContainer>( "seed" );
   }
 
@@ -155,23 +147,35 @@ namespace TrigCompositeUtils {
 
  
   
-  const xAOD::TrigComposite* find( const xAOD::TrigComposite* start, const std::function<bool( const xAOD::TrigComposite* )>& filter ) {
+  const Decision* find( const Decision* start, const std::function<bool( const Decision* )>& filter ) {
     if ( filter( start ) ) return start;
 
-    if ( start->hasObjectLink( "seed" ) ) {
-      return find( start->object<xAOD::TrigComposite>( "seed" ), filter );
+    if ( hasLinkToPrevious(start) ) {
+      const ElementLinkVector<DecisionContainer> seeds = getLinkToPrevious(start);
+      for (const ElementLink<DecisionContainer>& seedEL : seeds) {
+        const Decision* result = find( *seedEL, filter );
+        if (result) return result;
+      }
     }
-    else return nullptr;
+    
+    return nullptr;
   }
 
-  bool HasObject::operator()( const xAOD::TrigComposite* composite ) const {
+  bool HasObject::operator()( const Decision* composite ) const {
     return composite->hasObjectLink( m_name );
   }
 
-  bool recursiveGetObjectLinks( const xAOD::TrigComposite* start, ElementLinkVector<xAOD::TrigCompositeContainer>& linkVector ){
+  bool HasObjectCollection::operator()( const Decision* composite ) const {
+    return composite->hasObjectCollectionLinks( m_name );
+  }
+
+  bool recursiveGetObjectLinks( const Decision* start, ElementLinkVector<DecisionContainer>& linkVector ){
     //recursively find in the seeds
-    if ( start->hasObjectLink( "seed" ) ) {
-      return recursiveGetObjectLinks( start->object<xAOD::TrigComposite>( "seed" ), linkVector );
+    if ( hasLinkToPrevious(start) ) {
+      const ElementLinkVector<DecisionContainer> seeds = getLinkToPrevious(start);
+      for (const ElementLink<DecisionContainer>& seedEL : seeds) {
+        recursiveGetObjectLinks( *seedEL, linkVector );
+      }
     }
 
     int isComposite=0;
@@ -183,7 +187,7 @@ namespace TrigCompositeUtils {
 
     // ElementLink<xAOD::TrigComposite> test;
     // test = start->objectLink( "childProxies" );
-    ElementLinkVector<xAOD::TrigCompositeContainer> links = start->objectCollectionLinks<xAOD::TrigCompositeContainer>( "childProxies" );
+    ElementLinkVector<DecisionContainer> links = start->objectCollectionLinks<DecisionContainer>( "childProxies" );
 
     linkVector.reserve( linkVector.size() + links.size() );
     std::move( links.begin(), links.end(), std::back_inserter( linkVector ) );
@@ -191,13 +195,13 @@ namespace TrigCompositeUtils {
     return true;
   }
 
-  std::string dump( const xAOD::TrigComposite*  tc, std::function< std::string( const xAOD::TrigComposite* )> printerFnc ) {
+  std::string dump( const Decision*  tc, std::function< std::string( const Decision* )> printerFnc ) {
     std::string ret; 
     ret += printerFnc( tc );
-    if ( tc->hasObjectLink("seed") ) {
-      const xAOD::TrigComposite* seedTc = tc->object<xAOD::TrigComposite>( "seed" );
-      if ( seedTc ) {
-	ret += " -> " + dump( seedTc, printerFnc );
+    if ( hasLinkToPrevious(tc) ) {
+      const ElementLinkVector<DecisionContainer> seeds = getLinkToPrevious(tc);
+      for (const ElementLink<DecisionContainer>& seedEL : seeds) {
+        ret += " -> " + dump( *seedEL, printerFnc );
       }
     }
     return ret;
diff --git a/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx b/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx
index 48940d6b33693bfa6b19b953d486a2fb675cc546..b2ef8139eb0987f54752253cd08413db790aec9d 100644
--- a/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx
+++ b/Trigger/TrigSteer/DecisionHandling/test/TrigCompositeUtils_test.cxx
@@ -13,12 +13,12 @@
 #include "TestTools/expect.h"
 #include "DecisionHandling/TrigCompositeUtils.h"
 #include "xAODTrigger/TrigCompositeAuxContainer.h"
+#include "CxxUtils/checker_macros.h"
 
-bool xAOD::TrigComposite::s_throwOnCopyError = true;
-
-int main() {
+int main ATLAS_NOT_THREAD_SAFE () {
 
   using namespace TrigCompositeUtils;
+  xAOD::TrigComposite::s_throwOnCopyError = true;
 
   errorcheck::ReportMessage::hideFunctionNames (true);
 
@@ -131,10 +131,10 @@ int main() {
   addDecisionID( 95, d3 );
   addDecisionID( 99, d3 );
   addDecisionID( 99, d3 );
-  auto storedDecisions  = d3->getDetail<std::vector<int>>( "decisions" );
+  auto storedDecisions  = d3->getDetail<std::vector<DecisionID>>( "decisions" );
   VALUE ( storedDecisions.size() ) EXPECTED ( 2 );
-  VALUE ( ( int )storedDecisions.front() ) EXPECTED ( 95 );
-  VALUE ( ( int )storedDecisions.back() ) EXPECTED ( 99 );
+  VALUE ( ( DecisionID )storedDecisions.front() ) EXPECTED ( 95 );
+  VALUE ( ( DecisionID )storedDecisions.back() ) EXPECTED ( 99 );
 
   // Make an EL with an invalid (zero) hash key and try to add it to a Decision
   auto data1 = std::make_unique<DecisionContainer>() ;
@@ -152,10 +152,12 @@ int main() {
   VALUE ( d3->setObjectLink( "bad", badEL2 ) ) EXPECTED ( false );
   // this fails, and cerr output also expected
 
-  // Make, store and retrieve a "seed" link
+  // Make, store and retrieve a "seed" link within a collection
   ElementLink<DecisionContainer> el( *dc, 1 );
-  assert( d3->setObjectLink( "seed", el ) );
-  ElementLink<DecisionContainer > resEl = d3->objectLink<DecisionContainer>("seed");
+  assert( d3->addObjectCollectionLink( "seed", el ) );
+  ElementLinkVector<DecisionContainer > resElVector = d3->objectCollectionLinks<DecisionContainer>("seed");
+  assert( resElVector.size() == 1 );
+  ElementLink<DecisionContainer> resEl = resElVector.front();
   VALUE( resEl.index() ) EXPECTED ( el.index() );
   VALUE( resEl.key() ) EXPECTED ( el.key() );
 
@@ -163,14 +165,16 @@ int main() {
   std::cout << std::endl;
   std::cout << "New decision d3b with name & context " << std::endl;
   auto d3b = newDecisionIn( dc, "d3b", ctx );
-  // Make, store and retrieve a "seed" link, with context
+  // Make, store and retrieve a "testLink" link, with context
   ElementLink<DecisionContainer> el2( *dc, 1, ctx );
   assert ( d3b->setObjectLink( "testlink", el2 ) );
   std::cout << "d3b: " << *d3b << std::endl;
   std::cout << "el2 " << el2.key() << " " << el2.index() << std::endl;
   ElementLink<DecisionContainer > resEl2 = d3b->objectLink<DecisionContainer>("testlink");
+  const Decision* res2 = d3b->object<Decision>("testlink");
   VALUE( resEl2.index() ) EXPECTED ( el2.index() );
   VALUE( resEl2.key() ) EXPECTED ( el2.key() );
+  VALUE( *resEl2.cptr() ) EXPECTED ( res2 );
 
   // check copyLinks (copies all)
   auto d4 = newDecisionIn( dc );
@@ -178,7 +182,8 @@ int main() {
   std::cout << "d3: " << *d3 << std::endl;
   std::cout << "d4: " << *d4 << std::endl;
   std::cout << "el: key " << el.key() << " index " << el.index() << std::endl;
-  ElementLink<DecisionContainer > resElCopied = d4->objectLink<DecisionContainer>("seed");
+  ElementLinkVector<DecisionContainer > resElCopiedVector = d4->objectCollectionLinks<DecisionContainer>("seed");
+  ElementLink<DecisionContainer> resElCopied = resElCopiedVector.front();
   VALUE ( resElCopied.index() ) EXPECTED ( el.index() );
   VALUE ( resElCopied.key() ) EXPECTED ( el.key() );
 
@@ -194,15 +199,19 @@ int main() {
   std::cout << "get d5 feature link " << std::endl;
   ElementLink<DecisionContainer > d5feature = d5->objectLink<DecisionContainer>("feature");
   std::cout << "get d6 feature link " << std::endl;
-  ElementLink<DecisionContainer > d6feature = d6->objectLink<DecisionContainer>("feature");
+  // We have to get this recursivly
+  LinkInfo<DecisionContainer> linkInfo = findLink<DecisionContainer>(d6, "feature");
+  VALUE ( linkInfo.isValid() ) EXPECTED ( true );
+  ElementLink<DecisionContainer > d6feature = linkInfo.link;
   std::cout << "compare feature links " << std::endl;
   VALUE ( d5feature.index() ) EXPECTED ( d6feature.index() );
   VALUE ( d5feature.key() ) EXPECTED ( d6feature.key() );
   std::cout << "get self and seed links " << std::endl;
   auto d5self = d5->objectLink<DecisionContainer>("self");
-  auto d6seed = d6->objectLink<DecisionContainer>("seed");
-  VALUE ( d5self.index()  ) EXPECTED ( d6seed.index() );
-  VALUE ( d5self.key()  ) EXPECTED ( d6seed.key() );
+  auto d6seedVector = getLinkToPrevious(d6);
+  auto d6seed = d6seedVector.front();
+  VALUE ( d5self.index() ) EXPECTED ( d6seed.index() );
+  VALUE ( d5self.key()   ) EXPECTED ( d6seed.key()   );
 
   return 0;
   
diff --git a/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx b/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx
index 3929467e0389e801badc70d4508103ae34c6f7a5..f952bea82082e2181e2d1cc13b2378b38eca0346 100644
--- a/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx
+++ b/Trigger/TrigSteer/ViewAlgs/src/EventViewCreatorAlgorithm.cxx
@@ -13,7 +13,7 @@
 using namespace TrigCompositeUtils;
 
 EventViewCreatorAlgorithm::EventViewCreatorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
-  : InputMakerBase( name, pSvcLocator ) {}
+: InputMakerBase( name, pSvcLocator ) {}
 
 EventViewCreatorAlgorithm::~EventViewCreatorAlgorithm(){}
 
@@ -31,7 +31,7 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con
   // create the output decisions, similar to inputs (copy basic links)
   std::vector< SG::WriteHandle<TrigCompositeUtils::DecisionContainer> > outputHandles;
   ATH_CHECK (decisionInputToOutput(context, outputHandles));
- 
+
   // make the views
   auto viewsHandle = SG::makeHandle( m_viewsKey ); 
   auto viewVector1 = std::make_unique< ViewContainer >();
@@ -46,7 +46,7 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con
   unsigned int conditionsRun = context.getExtension<Atlas::ExtendedEventContext>().conditionsRun();
 
   //map all RoIs that are stored
-  std::vector <ElementLink<TrigRoiDescriptorCollection> > RoIsFromDecision;
+  ElementLinkVector<TrigRoiDescriptorCollection> RoIsFromDecision;
 
   // loop over decisions
   for (auto outputHandle: outputHandles) {
@@ -63,39 +63,40 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con
     // loop over output decisions in container of outputHandle, follow link to inputDecision
     for ( auto outputDecision : *outputHandle){ 
       ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision);
+      ATH_MSG_DEBUG( "Got inputLinks with " << inputLinks.size() << " elements" );
       // loop over input links as predecessors
       for (auto input: inputLinks){
-	const Decision* inputDecision = *input;
-	// find the RoI
-	auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() );
-	auto roiEL = roiELInfo.link;
-	ATH_CHECK( roiEL.isValid() );
-	// check if already found
-	auto roiIt=find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL);
-	if ( roiIt == RoIsFromDecision.end() ){
-	  RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used 
-	  const TrigRoiDescriptor* roi = *roiEL;
-	  ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan());
-	  ATH_MSG_DEBUG( "Positive decisions on RoI, preparing view" );
-	  
-	  // make the view
-	  ATH_MSG_DEBUG( "Making the View" );
-	  auto newView = ViewHelper::makeView( name()+"_view", viewCounter++, m_viewFallThrough ); //pointer to the view
-	  viewVector->push_back( newView );
-	  contexts.emplace_back( context );
-	  contexts.back().setExtension( Atlas::ExtendedEventContext( viewVector->back(), conditionsRun, roi ) );
-	  
-	  // link decision to this view
-	  outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), viewVector->size()-1 ));//adding view to TC
-	  ATH_MSG_DEBUG( "Adding new view to new decision; storing view in viewVector component " << viewVector->size()-1 );
-	  ATH_CHECK( linkViewToParent( inputDecision, viewVector->back() ) );
-	  ATH_CHECK( placeRoIInView( roi, viewVector->back(), contexts.back() ) );	
-	}
-	else {
-	  int iview = roiIt-RoIsFromDecision.begin();
-	  outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), iview ) ); //adding view to TC
-	  ATH_MSG_DEBUG( "Adding already mapped view " << iview << " in ViewVector , to new decision");
-	}
+        const Decision* inputDecision = *input;
+        // find the RoI
+        auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision, m_roisLink.value() );
+        auto roiEL = roiELInfo.link;
+        ATH_CHECK( roiEL.isValid() );
+        // check if already found
+        auto roiIt=find(RoIsFromDecision.begin(), RoIsFromDecision.end(), roiEL);
+        if ( roiIt == RoIsFromDecision.end() ){
+          RoIsFromDecision.push_back(roiEL); // just to keep track of which we have used 
+          const TrigRoiDescriptor* roi = *roiEL;
+          ATH_MSG_DEBUG("Found RoI:" <<*roi<<" FS="<<roi->isFullscan());
+          ATH_MSG_DEBUG("Positive decisions on RoI, preparing view" );
+          
+          // make the view
+          ATH_MSG_DEBUG( "Making the View" );
+          auto newView = ViewHelper::makeView( name()+"_view", viewCounter++, m_viewFallThrough ); //pointer to the view
+          viewVector->push_back( newView );
+          contexts.emplace_back( context );
+          contexts.back().setExtension( Atlas::ExtendedEventContext( viewVector->back(), conditionsRun, roi ) );
+          
+          // link decision to this view
+          outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), viewVector->size()-1 ));//adding view to TC
+          ATH_MSG_DEBUG( "Adding new view to new decision; storing view in viewVector component " << viewVector->size()-1 );
+          ATH_CHECK( linkViewToParent( inputDecision, viewVector->back() ) );
+          ATH_CHECK( placeRoIInView( roi, viewVector->back(), contexts.back() ) );  
+        }
+        else {
+          int iview = roiIt - RoIsFromDecision.begin();
+          outputDecision->setObjectLink( "view", ElementLink< ViewContainer >(m_viewsKey.key(), iview ) ); //adding view to TC
+          ATH_MSG_DEBUG( "Adding already mapped view " << iview << " in ViewVector , to new decision");
+        }
       }// loop over previous inputs
     } // loop over decisions   
   }// loop over output keys
@@ -105,9 +106,9 @@ StatusCode EventViewCreatorAlgorithm::execute( const EventContext& context ) con
 
   ATH_MSG_DEBUG( "Launching execution in " << viewVector->size() << " views" );
   ATH_CHECK( ViewHelper::ScheduleViews( viewVector,           // Vector containing views
-					m_viewNodeName,             // CF node to attach views to
-					context,                    // Source context
-					m_scheduler.get() ) );
+          m_viewNodeName,             // CF node to attach views to
+          context,                    // Source context
+          m_scheduler.get() ) );
   
   // report number of views, stored already when container was created
   // auto viewsHandle = SG::makeHandle( m_viewsKey );
@@ -132,8 +133,8 @@ StatusCode EventViewCreatorAlgorithm::linkViewToParent( const TrigCompositeUtils
     if ( m_requireParentView ) {
       ATH_MSG_ERROR( "Parent view not linked because it could not be found" );
       ATH_MSG_ERROR( TrigCompositeUtils::dump( inputDecision, [](const xAOD::TrigComposite* tc){ 
-								return "TC " + tc->name() + ( tc->hasObjectLink("view") ? " has view " : " has no view " );
-							      } ) );
+        return "TC " + tc->name() + ( tc->hasObjectLink("view") ? " has view " : " has no view " );
+      } ) );
       return StatusCode::FAILURE;
     }
     
@@ -146,7 +147,7 @@ StatusCode EventViewCreatorAlgorithm::placeRoIInView( const TrigRoiDescriptor* r
   auto oneRoIColl = std::make_unique< ConstDataVector<TrigRoiDescriptorCollection> >();    
   oneRoIColl->clear( SG::VIEW_ELEMENTS ); //Don't delete the RoIs
   oneRoIColl->push_back( roi );
-	
+  
   //store the RoI in the view
   auto handle = SG::makeHandle( m_inViewRoIs, context );
   ATH_CHECK( handle.setProxyDict( view ) );
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py
index 19ef84faf0d755e528139c3f5254fa14277c9e50..06ad199e389d1848358a3cae6b11daf0733ba886 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/dataScoutingTest.py
@@ -119,7 +119,7 @@ decisionObjectsToRecord = []
 for d in decisionObjects:
     decisionObjectsToRecord.extend([
         "xAOD::TrigCompositeContainer_v1#%s" % d,
-        "xAOD::TrigCompositeAuxContainer_v2#%s.decisions" % d
+        "xAOD::TrigCompositeAuxContainer_v2#%s." % d
     ])
 
 ##########################################
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py b/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py
index 474e1c36b3f0a87a9d39ba72c4bd7f0307f565c5..00c05345fad1382118dc87f2e7a93cd4a9b81cbb 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py
@@ -349,7 +349,7 @@ serialiser = TriggerEDMSerialiserToolCfg("Serialiser")
 serialiser.OutputLevel=VERBOSE
 serialiser.addCollectionListToMainResult([
    "xAOD::TrigCompositeContainer_v1#remap_EgammaCaloDecisions",
-   "xAOD::TrigCompositeAuxContainer_v2#remap_EgammaCaloDecisionsAux.decisions",
+   "xAOD::TrigCompositeAuxContainer_v2#remap_EgammaCaloDecisionsAux.",
    "xAOD::TrigEMClusterContainer_v1#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters",
    "xAOD::TrigEMClusterAuxContainer_v2#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux.RoIword.clusterQuality.e233.e237.e277.e2tsts1.ehad1.emaxs1.energy.energySample.et.eta.eta1.fracs1.nCells.phi.rawEnergy.rawEnergySample.rawEt.rawEta.rawPhi.viewIndex.weta2.wstot",
    "xAOD::TrigElectronContainer_v1#HLT_xAOD__TrigElectronContainer_L2ElectronFex",
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref
index 1c772ff2c5efe1023d0853f5f99752afdcb877a1..26c1b35bf69af09ee108d1d1f4ce6f75d4812a6b 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/egammaRunData.ref
@@ -1,6 +1,5 @@
 HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes
-HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG    Fragment size including 128 bytes from 1x DynAux : 508
+HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :396 bytes
 HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes
 HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG    Fragment size including 88 bytes from 1x DynAux : 892
@@ -8,8 +7,7 @@ HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :748 bytes
 HLTRMakerAlg.MKTool.Serialiser          0   0     DEBUG    Fragment size including 1392 bytes from 14x DynAux : 2140
 HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :664 bytes
-HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG    Fragment size including 184 bytes from 1x DynAux : 848
+HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :740 bytes
 HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1764 bytes
 HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG    Fragment size including 100 bytes from 1x DynAux : 1864
@@ -17,8 +15,7 @@ HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :2864 bytes
 HLTRMakerAlg.MKTool.Serialiser          1   0     DEBUG    Fragment size including 2680 bytes from 14x DynAux : 5544
 HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :856 bytes
-HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG    Fragment size including 204 bytes from 1x DynAux : 1060
+HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :948 bytes
 HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :2404 bytes
 HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG    Fragment size including 108 bytes from 1x DynAux : 2512
@@ -26,8 +23,7 @@ HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1760 bytes
 HLTRMakerAlg.MKTool.Serialiser          2   0     DEBUG    Fragment size including 2008 bytes from 14x DynAux : 3768
 HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :664 bytes
-HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG    Fragment size including 172 bytes from 1x DynAux : 836
+HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :728 bytes
 HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1764 bytes
 HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG    Fragment size including 100 bytes from 1x DynAux : 1864
@@ -35,8 +31,7 @@ HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3324 bytes
 HLTRMakerAlg.MKTool.Serialiser          3   0     DEBUG    Fragment size including 2960 bytes from 14x DynAux : 6284
 HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes
-HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG    Fragment size including 152 bytes from 1x DynAux : 628
+HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :516 bytes
 HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes
 HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG    Fragment size including 92 bytes from 1x DynAux : 1216
@@ -44,8 +39,7 @@ HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1024 bytes
 HLTRMakerAlg.MKTool.Serialiser          4   0     DEBUG    Fragment size including 1560 bytes from 14x DynAux : 2584
 HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :948 bytes
-HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG    Fragment size including 212 bytes from 1x DynAux : 1160
+HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :1052 bytes
 HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :2724 bytes
 HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG    Fragment size including 112 bytes from 1x DynAux : 2836
@@ -53,8 +47,7 @@ HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :4612 bytes
 HLTRMakerAlg.MKTool.Serialiser          5   0     DEBUG    Fragment size including 3744 bytes from 14x DynAux : 8356
 HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes
-HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG    Fragment size including 132 bytes from 1x DynAux : 512
+HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :400 bytes
 HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes
 HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG    Fragment size including 88 bytes from 1x DynAux : 892
@@ -62,8 +55,7 @@ HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1208 bytes
 HLTRMakerAlg.MKTool.Serialiser          6   0     DEBUG    Fragment size including 1672 bytes from 14x DynAux : 2880
 HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :568 bytes
-HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG    Fragment size including 160 bytes from 1x DynAux : 728
+HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :620 bytes
 HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1444 bytes
 HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG    Fragment size including 96 bytes from 1x DynAux : 1540
@@ -71,8 +63,7 @@ HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3048 bytes
 HLTRMakerAlg.MKTool.Serialiser          7   0     DEBUG    Fragment size including 2792 bytes from 14x DynAux : 5840
 HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes
-HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG    Fragment size including 160 bytes from 1x DynAux : 636
+HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :524 bytes
 HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes
 HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG    Fragment size including 92 bytes from 1x DynAux : 1216
@@ -80,14 +71,13 @@ HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :840 bytes
 HLTRMakerAlg.MKTool.Serialiser          8   0     DEBUG    Fragment size including 1448 bytes from 14x DynAux : 2288
 HLTRMakerAlg.MKTool.Serialiser          9   0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          9   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :284 bytes
+HLTRMakerAlg.MKTool.Serialiser          9   0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :296 bytes
 HLTRMakerAlg.MKTool.Serialiser          9   0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          9   0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :484 bytes
 HLTRMakerAlg.MKTool.Serialiser          9   0     DEBUG xAOD::TrigElectronContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFex Fragment size :196 bytes
 HLTRMakerAlg.MKTool.Serialiser          9   0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :472 bytes
 HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :664 bytes
-HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG    Fragment size including 204 bytes from 1x DynAux : 868
+HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :760 bytes
 HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1764 bytes
 HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG    Fragment size including 100 bytes from 1x DynAux : 1864
@@ -95,8 +85,7 @@ HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3508 bytes
 HLTRMakerAlg.MKTool.Serialiser          10  0     DEBUG    Fragment size including 3072 bytes from 14x DynAux : 6580
 HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes
-HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG    Fragment size including 128 bytes from 1x DynAux : 508
+HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :396 bytes
 HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes
 HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG    Fragment size including 88 bytes from 1x DynAux : 892
@@ -104,8 +93,7 @@ HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :840 bytes
 HLTRMakerAlg.MKTool.Serialiser          11  0     DEBUG    Fragment size including 1448 bytes from 14x DynAux : 2288
 HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :1044 bytes
-HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG    Fragment size including 256 bytes from 1x DynAux : 1300
+HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :1192 bytes
 HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :3044 bytes
 HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG    Fragment size including 116 bytes from 1x DynAux : 3160
@@ -113,8 +101,7 @@ HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :3876 bytes
 HLTRMakerAlg.MKTool.Serialiser          12  0     DEBUG    Fragment size including 3296 bytes from 14x DynAux : 7172
 HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes
-HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG    Fragment size including 164 bytes from 1x DynAux : 640
+HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :528 bytes
 HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes
 HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG    Fragment size including 92 bytes from 1x DynAux : 1216
@@ -122,8 +109,7 @@ HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :2496 bytes
 HLTRMakerAlg.MKTool.Serialiser          13  0     DEBUG    Fragment size including 2456 bytes from 14x DynAux : 4952
 HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes
-HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG    Fragment size including 132 bytes from 1x DynAux : 512
+HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :400 bytes
 HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes
 HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG    Fragment size including 88 bytes from 1x DynAux : 892
@@ -131,22 +117,20 @@ HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :748 bytes
 HLTRMakerAlg.MKTool.Serialiser          14  0     DEBUG    Fragment size including 1392 bytes from 14x DynAux : 2140
 HLTRMakerAlg.MKTool.Serialiser          15  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          15  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :284 bytes
+HLTRMakerAlg.MKTool.Serialiser          15  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :296 bytes
 HLTRMakerAlg.MKTool.Serialiser          15  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          15  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :484 bytes
 HLTRMakerAlg.MKTool.Serialiser          15  0     DEBUG xAOD::TrigElectronContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFex Fragment size :196 bytes
 HLTRMakerAlg.MKTool.Serialiser          15  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :472 bytes
 HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :380 bytes
-HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG    Fragment size including 124 bytes from 1x DynAux : 504
+HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :392 bytes
 HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :804 bytes
 HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG    Fragment size including 88 bytes from 1x DynAux : 892
 HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG xAOD::TrigElectronContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFex Fragment size :196 bytes
 HLTRMakerAlg.MKTool.Serialiser          16  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :472 bytes
 HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes
-HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG    Fragment size including 164 bytes from 1x DynAux : 640
+HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :528 bytes
 HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes
 HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG    Fragment size including 92 bytes from 1x DynAux : 1216
@@ -154,8 +138,7 @@ HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :1392 bytes
 HLTRMakerAlg.MKTool.Serialiser          17  0     DEBUG    Fragment size including 1784 bytes from 14x DynAux : 3176
 HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :476 bytes
-HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG    Fragment size including 160 bytes from 1x DynAux : 636
+HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :524 bytes
 HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1124 bytes
 HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG    Fragment size including 92 bytes from 1x DynAux : 1216
@@ -163,8 +146,7 @@ HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG xAOD::TrigElectronContai
 HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG xAOD::TrigElectronAuxContainer#HLT_xAOD__TrigElectronContainer_L2ElectronFexAux. Fragment size :840 bytes
 HLTRMakerAlg.MKTool.Serialiser          18  0     DEBUG    Fragment size including 1448 bytes from 14x DynAux : 2288
 HLTRMakerAlg.MKTool.Serialiser          19  0     DEBUG xAOD::TrigCompositeContainer#remap_EgammaCaloDecisions Fragment size :180 bytes
-HLTRMakerAlg.MKTool.Serialiser          19  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :568 bytes
-HLTRMakerAlg.MKTool.Serialiser          19  0     DEBUG    Fragment size including 152 bytes from 1x DynAux : 720
+HLTRMakerAlg.MKTool.Serialiser          19  0     DEBUG xAOD::TrigCompositeAuxContainer#remap_EgammaCaloDecisionsAux. Fragment size :612 bytes
 HLTRMakerAlg.MKTool.Serialiser          19  0     DEBUG xAOD::TrigEMClusterContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClusters Fragment size :204 bytes
 HLTRMakerAlg.MKTool.Serialiser          19  0     DEBUG xAOD::TrigEMClusterAuxContainer#HLT_xAOD__TrigEMClusterContainer_L2CaloClustersAux. Fragment size :1444 bytes
 HLTRMakerAlg.MKTool.Serialiser          19  0     DEBUG    Fragment size including 96 bytes from 1x DynAux : 1540
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py
index 5c2e333931c91e8850c3fc65a1d5b99672c18c66..45862afb45c47defcb21e35248d16973d819b481 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/pebTest.py
@@ -120,7 +120,7 @@ decisionObjectsToRecord = []
 for d in decisionObjects:
     decisionObjectsToRecord.extend([
         "xAOD::TrigCompositeContainer_v1#%s" % d,
-        "xAOD::TrigCompositeAuxContainer_v2#%s.decisions" % d
+        "xAOD::TrigCompositeAuxContainer_v2#%s." % d
     ])
 
 ##########################################
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx
index 94b86c7dfa59afef4fd0b43da787a54b6971f267..a220b43967725e4388bf3e4f3a4ff06955ce3278 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx
+++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoAlg.cxx
@@ -6,9 +6,9 @@
 #include "TestHypoAlg.h"
 
 namespace HLTTest {
-  
+
   TestHypoAlg::TestHypoAlg( const std::string& name, ISvcLocator* pSvcLocator ) 
-    : ::HypoBase( name, pSvcLocator ) {}
+  : ::HypoBase( name, pSvcLocator ) {}
 
   TestHypoAlg::~TestHypoAlg() {}
   
@@ -51,9 +51,9 @@ namespace HLTTest {
 
     // find features:
     std::vector<const FeatureOBJ*> featureFromDecision;
-    for ( auto previousDecision: *previousDecisionsHandle ) {
-      auto linkInfo = TrigCompositeUtils::findLink<FeatureContainer>(previousDecision, m_linkName.value());
-      auto featureLink = linkInfo.link;
+    for ( const auto previousDecision: *previousDecisionsHandle ) {
+      const auto linkInfo = TrigCompositeUtils::findLink<FeatureContainer>(previousDecision, m_linkName.value());
+      const auto featureLink = linkInfo.link;
       CHECK( featureLink.isValid() );
       const FeatureOBJ* feature = *featureLink;
       featureFromDecision.push_back( feature);
@@ -62,51 +62,50 @@ namespace HLTTest {
     
     //map reco object and decision: find in reco obejct the initial RoI and map it to the correct decision
     size_t reco_counter = 0;
-    for (auto recoobj: *recoInput){
-      auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( recoobj, "initialRoI"  );
-      auto roiEL = roiInfo.link;
+    for (const auto recoobj: *recoInput){
+      const auto roiInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( recoobj, "initialRoI"  );
+      const auto roiEL = roiInfo.link;
       CHECK( roiEL.isValid() );
       
-      auto featureInfo = TrigCompositeUtils::findLink<FeatureContainer>( recoobj, m_linkName.value()  );
-      auto featurelink = featureInfo.link;
+      const auto featureInfo = TrigCompositeUtils::findLink<FeatureContainer>( recoobj, m_linkName.value()  );
+      const auto featurelink = featureInfo.link;
       CHECK( featurelink.isValid() );
       if ( not featurelink.isValid() )  {
-	ATH_MSG_ERROR( " Can not find reference to " + m_linkName.value() + " from the decision" );
-	return StatusCode::FAILURE;
+        ATH_MSG_ERROR( " Can not find reference to " + m_linkName.value() + " from the decision" );
+        return StatusCode::FAILURE;
       }
       
       ATH_MSG_DEBUG(" Found link from the reco object to feature "<<m_linkName.value() );
       const FeatureOBJ* feature = *featurelink;
       // find the same roi in the previous decisions
       bool foundFeatureInDecision=false;
-       size_t pos=distance(featureFromDecision.begin(), find(featureFromDecision.begin(), featureFromDecision.end(), feature));
-       if (pos < featureFromDecision.size()){
-	 foundFeatureInDecision=true;	 
-       }
-       
-       if (foundFeatureInDecision){
-	 ATH_MSG_DEBUG(" Found link from the reco object to the previous decision at position "<<pos);
-	 auto d = newDecisionIn(decisions);
-	 d->setObjectLink( "feature", ElementLink<xAOD::TrigCompositeContainer>(m_recoInput.key(), reco_counter) );// feature used by the Tool
-	 d->setObjectLink( m_linkName.value(), featurelink );
-	 linkToPrevious( d, decisionInput().key(), pos );
-       }
-       else{
-	 ATH_MSG_ERROR( " Can not find reference to previous decision from feature " + m_linkName.value() + " from reco object " << reco_counter );
-	 return StatusCode::FAILURE;
-       }
-       reco_counter++;
+      size_t pos=distance(featureFromDecision.begin(), find(featureFromDecision.begin(), featureFromDecision.end(), feature));
+      if (pos < featureFromDecision.size()){
+        foundFeatureInDecision=true;  
+      }
+
+      if (foundFeatureInDecision){
+        ATH_MSG_DEBUG(" Found link from the reco object to the previous decision at position "<<pos);
+        auto d = newDecisionIn(decisions);
+        d->setObjectLink( "feature", ElementLink<xAOD::TrigCompositeContainer>(m_recoInput.key(), reco_counter) );// feature used by the Tool
+        d->setObjectLink( m_linkName.value(), featurelink );
+        linkToPrevious( d, decisionInput().key(), pos );
+      }
+      else{
+        ATH_MSG_ERROR( " Can not find reference to previous decision from feature " + m_linkName.value() + " from reco object " << reco_counter );
+        return StatusCode::FAILURE;
+      }
+      reco_counter++;
     }
-    
- 
 
     if (decisions->size()>0){
       for ( auto tool: m_tools ) {
-	CHECK( tool->decide( decisions ) );
+        CHECK( tool->decide( decisions ) );
       }
     }
 
     ATH_MSG_DEBUG( "Exiting with "<< outputHandle->size() <<" decisions");
+
     //debug
     for (auto outh: *outputHandle){
       TrigCompositeUtils::DecisionIDContainer objDecisions;      
@@ -115,14 +114,11 @@ namespace HLTTest {
       ATH_MSG_DEBUG("Number of positive decisions for this input: " << objDecisions.size() );
 
       for ( TrigCompositeUtils::DecisionID id : objDecisions ) {
-       	ATH_MSG_DEBUG( " --- found new decision " << HLT::Identifier( id ) );
+        ATH_MSG_DEBUG( " --- found new decision " << HLT::Identifier( id ) );
       }  
-
     }
-
-
+  
     return StatusCode::SUCCESS;
   }
 
-  
 } //> end namespace HLTTest
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx
index cac352bfc086e1737d36e2117255d525f33b91bd..e3f0bf919a51ab90d2b588afbd5acdf01411bb06 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx
+++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestHypoTool.cxx
@@ -11,10 +11,10 @@ using namespace TrigCompositeUtils;
 namespace HLTTest {
 
   TestHypoTool::TestHypoTool( const std::string& type, 
-			      const std::string& name, 
-			      const IInterface* parent ) : 
-    ITestHypoTool( name ),
-    AthAlgTool( type, name, parent )
+    const std::string& name, 
+    const IInterface* parent ) : 
+  ITestHypoTool( name ),
+  AthAlgTool( type, name, parent )
   {
     m_decisionId=HLT::Identifier::fromToolName(name );
   }
@@ -28,59 +28,59 @@ namespace HLTTest {
     ATH_MSG_DEBUG("Link name is "<<m_linkName.value());
     ATH_MSG_DEBUG("threshold="<<m_threshold);
     ATH_MSG_DEBUG("property="<<m_property);   
-   return StatusCode::SUCCESS;
+    return StatusCode::SUCCESS;
   }
 
-
-  
   StatusCode TestHypoTool::decide( DecisionContainer* decisions ) const  {
     ATH_MSG_DEBUG( "Making new decisions " << name() );
     size_t counter = 0;
-    for ( auto d: *decisions )  {
+    for ( const auto d: *decisions )  {
       //get previous decisions
       ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(d);
       ATH_MSG_DEBUG("Got "<<inputLinks.size()<<" previous decisions");
-      for (auto previousDecisions: inputLinks){
-	
-	//auto previousDecisions = linkToPrevious( d);
-	TrigCompositeUtils::DecisionIDContainer objDecisions;      
-	TrigCompositeUtils::decisionIDs( *previousDecisions, objDecisions );
-      
-	ATH_MSG_DEBUG("Number of previous decisions ID for input "<< counter <<"= " << objDecisions.size() );
-      
-	for ( TrigCompositeUtils::DecisionID id : objDecisions ) {
-	  ATH_MSG_DEBUG( " -- found decision " << HLT::Identifier( id ) );
-	}
-
-	auto it= find(objDecisions.begin(), objDecisions.end(),  m_decisionId);
-	if (it != objDecisions.end()){      
-	  auto feature = d->objectLink<xAOD::TrigCompositeContainer>( "feature" );
-	  //auto feature = d->objectLink<xAOD::TrigCompositeContainer>( m_linkName.value() );
-	  if ( not feature.isValid() )  {
-	    ATH_MSG_ERROR( " Can not find reference to the object from the decision" );
-	    return StatusCode::FAILURE;
-	  }
-	  float v = (*feature)->getDetail<float>( m_property );
-	  if ( v > m_threshold ) { // actual cut will be more complex of course
-	    ATH_MSG_DEBUG( "  threshold " << m_threshold << " passed by value: " << v );	
-	    addDecisionID(  m_decisionId, d );
-	  }
-	  else ATH_MSG_DEBUG( "  threshold " << m_threshold << " not passed by value " << v );
-	}
-	else {
-	  ATH_MSG_DEBUG("No Input decisions requested by active chain "<< m_decisionId);
-	}       
-	counter++;
+      for (const auto previousDecisions: inputLinks){
+
+        TrigCompositeUtils::DecisionIDContainer objDecisions;      
+        TrigCompositeUtils::decisionIDs( *previousDecisions, objDecisions );
+
+        ATH_MSG_DEBUG("Number of previous decisions ID for input "<< counter <<"= " << objDecisions.size() );
+
+        for ( TrigCompositeUtils::DecisionID id : objDecisions ) {
+          ATH_MSG_DEBUG( " -- found decision " << HLT::Identifier( id ) );
+        }
+
+        const auto it = find(objDecisions.begin(), objDecisions.end(),  m_decisionId);
+        if (it != objDecisions.end()){      
+          
+          const auto feature = d->objectLink<xAOD::TrigCompositeContainer>( "feature" );
+          // Used to fetch m_linkName.value() but this was refactored to "feature"
+          if ( not feature.isValid() )  {
+            ATH_MSG_ERROR( " Can not find reference to the object from the decision" );
+            return StatusCode::FAILURE;
+          }
+          const float v = (*feature)->getDetail<float>( m_property );
+          if ( v > m_threshold ) { // actual cut will be more complex of course
+            ATH_MSG_DEBUG( "  threshold " << m_threshold << " passed by value: " << v );  
+            addDecisionID(  m_decisionId, d );
+          } else {
+            ATH_MSG_DEBUG( "  threshold " << m_threshold << " not passed by value " << v );
+          }
+        
+        } else { // it == objDecisions.end()
+
+          ATH_MSG_DEBUG("No Input decisions requested by active chain "<< m_decisionId);
+        
+        }       
+        counter++;
       }
     }
-    
     return StatusCode::SUCCESS;
   }
 
-  
+
   StatusCode TestHypoTool::finalize() {
     ATH_MSG_INFO( "Finalizing " << name() << "..." );
     return StatusCode::SUCCESS;
   }
 
-  } //> end namespace HLTTest
+} //> end namespace HLTTest
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx
index 3d7b76d870f9b2df38d784cfebf4933b5fe119ef..226e7820b9ae739def0c571c41d0d28b0b38d194 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx
+++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestInputMaker.cxx
@@ -10,11 +10,11 @@
 #include <vector>
 
 namespace HLTTest {
-  
+
   TestInputMaker::TestInputMaker( const std::string& name, 
-			    ISvcLocator* pSvcLocator )    
-    : InputMakerBase( name, pSvcLocator ) {}
-   
+    ISvcLocator* pSvcLocator )    
+  : InputMakerBase( name, pSvcLocator ) {}
+
 
   TestInputMaker::~TestInputMaker() {}
 
@@ -36,7 +36,7 @@ namespace HLTTest {
 
   StatusCode TestInputMaker::execute( const EventContext& context ) const {  
     ATH_MSG_DEBUG( "Executing " << name() << "..." );
- 
+
     // call base class helper method to read input decisions, loop over them create outputs and connect them, returns with outputHandles filled
     std::vector< SG::WriteHandle<TrigCompositeUtils::DecisionContainer> > outputHandles;
     CHECK (decisionInputToOutput(context, outputHandles));
@@ -50,51 +50,50 @@ namespace HLTTest {
     // loop over output decisions, navigate to inputs
     for (auto outputHandle: outputHandles) {
       if( not outputHandle.isValid() ) {
- 	ATH_MSG_DEBUG( "Got no decisions from output "<< outputHandle.key() << " because handle not valid");
- 	continue;
+        ATH_MSG_DEBUG( "Got no decisions from output "<< outputHandle.key() << " because handle not valid");
+        continue;
       }
       if( outputHandle->size() == 0){ // input filtered out
- 	ATH_MSG_ERROR( "Got no decisions from output "<< outputHandle.key()<<": handle is valid but container is empty. Is this expected?");
- 	return StatusCode::FAILURE;
+        ATH_MSG_ERROR( "Got no decisions from output "<< outputHandle.key()<<": handle is valid but container is empty. Is this expected?");
+        return StatusCode::FAILURE;
       }
+
       ATH_MSG_DEBUG( "Got output "<< outputHandle.key()<<" with " << outputHandle->size() << " elements" );
       // loop over output decisions in container of outputHandle, follow link to inputDecision
-      for ( auto outputDecision : *outputHandle){ 
-        ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision);
-	for (auto input: inputLinks){
-	  ATH_MSG_DEBUG( "followed seed link to input "<< input.key() );
-	  const Decision* inputDecision = *input;
-	  auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision,  m_roisLink.value());
-	  CHECK( roiELInfo.isValid() );
-	
-	  // retrieve input feature from input decision (TrigComposite), will in this case be a TrigRoiDescriptor	  
-	  auto featureLinkInfo = TrigCompositeUtils::findLink<FeatureContainer>( inputDecision,  m_linkName.value());
-	  CHECK( featureLinkInfo.isValid() );
-	
-	  // link input reco object to outputDecision
-	  auto featureLink = featureLinkInfo.link;
-	  const FeatureOBJ* feature = *featureLink;
-	  ATH_MSG_DEBUG(" Found feature " <<m_linkName.value() );
-	  
-	  // merge reco outputs that are linked to the same feature (RoI): this avoids processing the same RoI from TC decisions from different chains
-	  
-	  // avoid adding the same feature multiple times: check if not in container, if not add it
-	  if ( find(featuresFromDecision.begin(), featuresFromDecision.end(), feature)
-	       == featuresFromDecision.end() ){
-	    featuresFromDecision.push_back(feature); // just to keep track of which we have used 
-	    // create the "reco" output: this would normally be a copy of the reco input or something derived from it, e.g. detector data inside a RoI. A TrigComposite is used here just for a trivial example.
-	    auto newFeature = new xAOD::TrigComposite;
-	    reco_output->push_back(newFeature); 
-	    newFeature->setObjectLink(m_linkName.value(), featureLink);
-	    ATH_MSG_DEBUG(" Added " <<m_linkName.value() << " and " << m_roisLink.value() << " to reco object");
-	  }
-	}//loop over previous inputs
+      for (const  auto outputDecision : *outputHandle){ 
+        const ElementLinkVector<DecisionContainer> inputLinks = getLinkToPrevious(outputDecision);
+        for (const auto input: inputLinks){
+          ATH_MSG_DEBUG( "followed seed link to input "<< input.key() );
+          const Decision* inputDecision = *input;
+          const auto roiELInfo = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( inputDecision,  m_roisLink.value());
+          CHECK( roiELInfo.isValid() );
+
+          // retrieve input feature from input decision (TrigComposite), will in this case be a TrigRoiDescriptor   
+          const auto featureLinkInfo = TrigCompositeUtils::findLink<FeatureContainer>( inputDecision,  m_linkName.value());
+          CHECK( featureLinkInfo.isValid() );
+
+          // link input reco object to outputDecision
+          const auto featureLink = featureLinkInfo.link;
+          const FeatureOBJ* feature = *featureLink;
+          ATH_MSG_DEBUG(" Found feature " <<m_linkName.value() );
+
+          // merge reco outputs that are linked to the same feature (RoI): this avoids processing the same RoI from TC decisions from different chains
+
+          // avoid adding the same feature multiple times: check if not in container, if not add it
+          if ( find(featuresFromDecision.begin(), featuresFromDecision.end(), feature) == featuresFromDecision.end() ){
+            featuresFromDecision.push_back(feature); // just to keep track of which we have used 
+            // create the "reco" output: this would normally be a copy of the reco input or something derived from it, e.g. detector data inside a RoI. A TrigComposite is used here just for a trivial example.
+            auto newFeature = new xAOD::TrigComposite;
+            reco_output->push_back(newFeature); 
+            newFeature->setObjectLink(m_linkName.value(), featureLink);
+            ATH_MSG_DEBUG(" Added " <<m_linkName.value() << " and " << m_roisLink.value() << " to reco object");
+          }
+        }//loop over previous inputs
         // For early tests, create TC, link to RoiD, push back onto TCC.
         // Later will output RoID collection directly via tool.        
       } // loop over decisions      
     } // loop over input keys
-
-    
+   
     // Finally, record output
     ATH_MSG_DEBUG("Produced "<<reco_output->size() <<" reco objects and stored in "<<m_recoOutput);
     auto reco_outputHandle = SG::makeHandle(m_recoOutput, context);
@@ -106,5 +105,5 @@ namespace HLTTest {
     return StatusCode::SUCCESS;
   }
 
- 
+
 } //> end namespace HLTTest
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx
index 43495b0c8053b1ef7a785970d177ae89624096a5..7a0af223d1a2d903634619ddedad3006511346fb 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx
+++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestMerger.cxx
@@ -17,8 +17,8 @@ namespace HLTTest {
   // Constructors
   ////////////////
   TestMerger::TestMerger( const std::string& name, 
-			  ISvcLocator* pSvcLocator ) : 
-    ::AthAlgorithm( name, pSvcLocator )
+    ISvcLocator* pSvcLocator ) : 
+  ::AthAlgorithm( name, pSvcLocator )
   {
     declareProperty( "Inputs", m_inputs );
     declareProperty( "Output", m_outputKey );
@@ -51,17 +51,17 @@ namespace HLTTest {
     auto aux    = std::make_unique<DecisionAuxContainer>();
     output->setStore( aux.get() );
 
-    for ( auto input: m_inputs ) {
+    for (const auto input: m_inputs ) {
       auto iHandle = SG::ReadHandle<DecisionContainer>(input);
       if ( iHandle.isValid() ) {
-	size_t counter = 0;
-	for ( auto iDecisionIter  = iHandle->begin(); iDecisionIter != iHandle->end(); ++iDecisionIter, ++counter ) {
-	  auto d = newDecisionIn(output.get());
-	  linkToPrevious(d, input, counter );
-	}
-	ATH_MSG_DEBUG( "Input " << input << " present, linked " << counter << " inputs" );
+        size_t counter = 0;
+        for ( auto iDecisionIter  = iHandle->begin(); iDecisionIter != iHandle->end(); ++iDecisionIter, ++counter ) {
+          auto d = newDecisionIn(output.get());
+          linkToPrevious(d, *iDecisionIter );
+        }
+        ATH_MSG_DEBUG( "Input " << input << " present, linked " << counter << " inputs" );
       } else {
-	ATH_MSG_DEBUG( "Input " << input << " absent" );
+        ATH_MSG_DEBUG( "Input " << input << " absent" );
       }
     }
     
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx b/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx
index 968b9f7e8c1826f1c9a37f86336889e753abdb45..db31e748bfd2c3a2825aca525e706b9a07dcacd9 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx
+++ b/Trigger/TrigValidation/TrigUpgradeTest/src/TestRoRSeqFilter.cxx
@@ -15,8 +15,8 @@ using namespace TrigCompositeUtils;
 namespace HLTTest {
 
   TestRoRSeqFilter::TestRoRSeqFilter( const std::string& name, 
-				      ISvcLocator* pSvcLocator ) : 
-    ::AthAlgorithm( name, pSvcLocator )
+    ISvcLocator* pSvcLocator ) : 
+  ::AthAlgorithm( name, pSvcLocator )
   {
     declareProperty( "Inputs", m_inputs );
     declareProperty( "Outputs", m_outputs );
@@ -34,25 +34,28 @@ namespace HLTTest {
     ATH_MSG_DEBUG("Will consume the input data: " << m_inputs << " and produce " << m_outputs );
     ATH_MSG_DEBUG("This filter has alwaysPass=" << m_alwaysPass);
     ATH_MSG_DEBUG("Configured chains are:");
-    for ( auto& el: m_chainsProperty ) ATH_MSG_DEBUG(el);
+    for ( auto& el: m_chainsProperty ) {
+      ATH_MSG_DEBUG(el);
+    }
     // if ( m_inputs.size() != m_outputs.size() ) {
     //   ATH_MSG_ERROR("Inputs and Outputs have different size, the mapping is unclear");
     //   return StatusCode::FAILURE;
     // }
-  
-    for ( auto& el: m_chainsProperty ) 
+
+    for ( auto& el: m_chainsProperty ) {
       m_chains.insert( HLT::Identifier(el).numeric() );
-    
+    }
+
     // minimal validity crosscheck
     if ( m_chainsProperty.size() == 0 and m_alwaysPass == false ) {
       ATH_MSG_WARNING("This filter will always reject as it has no chains of interest configured");
     }
-  
+
     if ( m_chains.size() != m_chainsProperty.size() ) {
       ATH_MSG_ERROR("Repeated chain requirements (annoyance) or chain to hash conversion clash (major configuration issue therefore can not run)");
       return StatusCode::FAILURE;
     }  
-  
+
     return StatusCode::SUCCESS;
   }
 
@@ -67,7 +70,7 @@ namespace HLTTest {
   {
     ATH_MSG_DEBUG ( "Executing " << name() << "..." );
     bool pass = false;
-    
+
     for ( size_t inputIndex = 0; inputIndex < m_inputs.size(); ++inputIndex ) {
       auto input = m_inputs[inputIndex];
       ATH_MSG_DEBUG( "Processing input " << input );
@@ -79,22 +82,21 @@ namespace HLTTest {
 
       // not bother recording if there is no output
       if ( not decisionOutput->empty() ) {
-	ATH_MSG_DEBUG( "Saving output " << m_outputs[inputIndex] );
-	pass = true;      
-	SG::WriteHandle<DecisionContainer> outputDH( m_outputs[inputIndex] );
-	CHECK( outputDH.record( std::move( decisionOutput ), std::move( decisionAux ) ) );	
+        ATH_MSG_DEBUG( "Saving output " << m_outputs[inputIndex] );
+        pass = true;      
+        SG::WriteHandle<DecisionContainer> outputDH( m_outputs[inputIndex] );
+        CHECK( outputDH.record( std::move( decisionOutput ), std::move( decisionAux ) ) );  
       } else {
-	ATH_MSG_DEBUG( "None of the decisions in the input " << input << " passed, skipping recording output " );
+        ATH_MSG_DEBUG( "None of the decisions in the input " << input << " passed, skipping recording output " );
       }
     }
 
     ATH_MSG_DEBUG( "The overall decision is : " << ( pass or m_alwaysPass ? "positive" : "negative") );
-    
+
     setFilterPassed( pass or m_alwaysPass );
     return StatusCode::SUCCESS;
   }
 
-
   void TestRoRSeqFilter::copyPassing( const std::string& inputKey, DecisionContainer* output ) const {
     SG::ReadHandle<DecisionContainer> inputDH( inputKey );
     if ( not inputDH.isValid() ) {
@@ -103,29 +105,29 @@ namespace HLTTest {
     }
 
     ATH_MSG_DEBUG( "Filtering "<<inputDH->size()<<" obejcts with key "<<inputKey);
-    
+
     size_t counter=0;
     for ( auto objIter =  inputDH->begin(); objIter != inputDH->end(); ++objIter, ++counter ) {      
       DecisionIDContainer objDecisions;      
       decisionIDs( *objIter, objDecisions ); // this should be replaced in production code by method passingIDs but the later is not printing so in tests we want the IDs
       // here we have to sets of IDs, those we are interested in (via chain property) and those comming from the decision obj
-	
+
       std::vector<DecisionID> intersection;
       std::set_intersection( m_chains.begin(), m_chains.end(),
-			     objDecisions.begin(), objDecisions.end(),
-			     std::back_inserter( intersection ) );
-      
+      objDecisions.begin(), objDecisions.end(),
+      std::back_inserter( intersection ) );
+    
       ATH_MSG_DEBUG( "Found "<<intersection.size()<<" objects of interest for key "<<inputKey);
       for ( auto positive: intersection ) {
-	ATH_MSG_DEBUG( "Found positive decision for chain " << HLT::Identifier( positive ) );
+        ATH_MSG_DEBUG( "Found positive decision for chain " << HLT::Identifier( positive ) );
       }
 
       const bool positiveObjectDecision = not intersection.empty();
       if ( positiveObjectDecision ) {
-	auto d = newDecisionIn( output );
-	linkToPrevious( d, inputKey, counter );
+        auto d = newDecisionIn( output );
+        linkToPrevious( d, *objIter );
       } else {
-	ATH_MSG_DEBUG( "Skipping objects with key " << inputKey <<" as they passed no chain of interest to this filter" );
+        ATH_MSG_DEBUG( "Skipping objects with key " << inputKey <<" as they passed no chain of interest to this filter" );
       }
     }
   }
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh b/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh
index f7156c46c3c4aec55f6896c0a4077af1cb2bfa97..74e9973310d471cfab859f7e5cef03fe65a5069e 100755
--- a/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh
+++ b/Trigger/TrigValidation/TrigUpgradeTest/test/test_egamma_run_data.sh
@@ -2,7 +2,7 @@
 # art-type: build
 # art-include: master/Athena
 
-#clear BS from previous runs
+#clear BS from previous runs 
 rm -rf  data_test.*.data
 athena  --threads=1 --skipEvents=10 --evtMax=20 --filesInput="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1" TrigUpgradeTest/egamma.withViews.py &&
 checkxAOD.py myESD.pool.root &&
diff --git a/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt b/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt
index 395e1ccd0c75f2b384fc0505729f0bef14950633..db9b326dafec91e5cc57be1992f50a28f93a9b99 100644
--- a/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt
+++ b/Trigger/TrigValidation/TrigValAlgs/CMakeLists.txt
@@ -25,6 +25,7 @@ atlas_depends_on_subdirs( PUBLIC
                           PRIVATE
                           Control/AthenaKernel
                           Control/CxxUtils
+                          Control/AthViews
                           Event/EventInfo
                           Event/xAOD/xAODEventInfo
                           Event/xAOD/xAODBTagging
@@ -64,7 +65,7 @@ atlas_add_component( TrigValAlgs
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${XERCESC_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps AthAnalysisBaseCompsLib GaudiKernel TrigDecisionToolLib TrigCaloEvent TrigInDetEvent TrigMuonEvent TrigNavToolsLib TrigNavigationLib TrigParticle TrigSteeringEvent AthenaKernel CxxUtils EventInfo xAODEventInfo xAODBTagging xAODEgamma xAODJet xAODMuon xAODTau xAODTracking xAODTrigBphys xAODTrigCalo xAODTrigEgamma xAODTrigMinBias xAODTrigMissingET xAODTrigMuon xAODCore xAODTrigger AnalysisTriggerEvent MuonCombinedToolInterfaces Particle tauEvent VxSecVertex TrigConfigSvcLib TrigConfHLTData TrigRoiConversionLib TrigDecisionEvent TrigMissingEtEvent TrigInDetTruthEvent TrigT1Interfaces DecisionHandlingLib )
+                     LINK_LIBRARIES ${XERCESC_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps AthAnalysisBaseCompsLib GaudiKernel TrigDecisionToolLib TrigCaloEvent TrigInDetEvent TrigMuonEvent TrigNavToolsLib TrigNavigationLib TrigParticle TrigSteeringEvent AthenaKernel CxxUtils EventInfo xAODEventInfo xAODBTagging xAODEgamma xAODJet xAODMuon xAODTau xAODTracking xAODTrigBphys xAODTrigCalo xAODTrigEgamma xAODTrigMinBias xAODTrigMissingET xAODTrigMuon xAODCore xAODTrigger AnalysisTriggerEvent MuonCombinedToolInterfaces Particle tauEvent VxSecVertex TrigConfigSvcLib TrigConfHLTData TrigRoiConversionLib TrigDecisionEvent TrigMissingEtEvent TrigInDetTruthEvent TrigT1Interfaces DecisionHandlingLib AthViews )
 
 # Install files from the package:
 atlas_install_headers( TrigValAlgs )
diff --git a/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx b/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx
index 4ccbf728073a0eae1e29bdd8cc23be549189e136..a9837a115caa3e58af77951f62ac1b141f8882a7 100644
--- a/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx
+++ b/Trigger/TrigValidation/TrigValAlgs/src/TrigEDMChecker.cxx
@@ -99,6 +99,9 @@
 
 #include "TrigT1Interfaces/RecEmTauRoI.h"
 
+#include "AthViews/ViewHelper.h"
+#include "AthViews/View.h"
+
 
 #include <iostream>
 #include <fstream>
@@ -4030,6 +4033,11 @@ StatusCode TrigEDMChecker::dumpTrigComposite() {
     m_dumpTrigCompositeContainers.clear();
     const CLID TrigCompositeCLID = static_cast<CLID>( ClassID_traits< xAOD::TrigCompositeContainer >::ID() );
     evtStore()->keys(TrigCompositeCLID, m_dumpTrigCompositeContainers);
+    std::string typeNameTC;
+    ATH_CHECK(m_clidSvc->getTypeNameOfID(TrigCompositeCLID, typeNameTC));
+    ATH_MSG_DEBUG("dumpTrigComposite got " <<  m_dumpTrigCompositeContainers.size() << " keys for " << typeNameTC);
+  } else {
+    ATH_MSG_DEBUG("Using supplied " <<  m_dumpTrigCompositeContainers.size() << " keys");
   }
 
   for ( const std::string & key: m_dumpTrigCompositeContainers ) {
@@ -4042,22 +4050,12 @@ StatusCode TrigEDMChecker::dumpTrigComposite() {
     const xAOD::TrigCompositeContainer* cont= nullptr;
     ATH_CHECK( evtStore()->retrieve( cont, key ) );
     
+    size_t count = 0;
     for ( auto tc: *cont ) {
-      ATH_MSG_DEBUG("name: " << tc->name());
-
-      // one gets a bit of info but is not that useful, we need to develop 
-      //SGdebug::print_aux_vars( *tc );
-      //SGdebug::dump_aux_vars( *tc );
-
-      // find the EL and check them
-      ATH_MSG_DEBUG( "Link col names   : " << tc->linkColNames() );
-      ATH_MSG_DEBUG( "Link col keys    : " << tc->linkColKeys() );
-      ATH_MSG_DEBUG( "Link col CLIDs   : " << tc->linkColClids() );
-      ATH_MSG_DEBUG( "Link col indices : " << tc->linkColIndices() );
-
+      ATH_MSG_DEBUG(" ########## ELEMENT " << count++);
+      ATH_MSG_DEBUG(*tc);
       // Get the objects we know of
       for (size_t i = 0; i < tc->linkColNames().size(); ++i) ATH_CHECK(checkTrigCompositeElementLink(tc, i));
-
     }
   }
   ATH_MSG_INFO( "REGTEST ==========END of xAOD::TrigCompositeContainer DUMP===========" );
@@ -4074,24 +4072,31 @@ StatusCode TrigEDMChecker::checkTrigCompositeElementLink(const xAOD::TrigComposi
   if (clid == ClassID_traits< TrigRoiDescriptorCollection >::ID()) { 
 
     const ElementLink<TrigRoiDescriptorCollection> elementLink = tc->objectLink<TrigRoiDescriptorCollection>(name);
-    if (!elementLink.isValid()) ATH_MSG_WARNING("Invalid element link from '" << tc->name() << "' to '" << name << "'");
-    else ATH_MSG_DEBUG("Got TrigRoiDescriptor:" << *elementLink);
+    if (!elementLink.isValid()) ATH_MSG_WARNING("  Invalid element link to TrigRoiDescriptorCollection, link name:'" << name << "'");
+    else ATH_MSG_DEBUG("  Dereferenced link '" << name << "'' to TrigRoiDescriptor:" << *elementLink);
 
   } else if (clid == ClassID_traits< DataVector< LVL1::RecEmTauRoI > >::ID()) { // There could be a few ROI types....
     // CLASS_DEF( DataVector< LVL1::RecEmTauRoI >, 6256, 1 )
 
     const ElementLink<DataVector< LVL1::RecEmTauRoI >> elementLink = tc->objectLink<DataVector< LVL1::RecEmTauRoI >>(name);
-    if (!elementLink.isValid()) ATH_MSG_WARNING("Invalid element link from '" << tc->name() << "' to '" << name << "'");
-    else ATH_MSG_DEBUG("Got LVL1::RecEmTauRoI:" << *elementLink);
+    if (!elementLink.isValid()) ATH_MSG_WARNING("  Invalid element link to LVL1::RecEmTauRoI, link name:'" << name << "'");
+    else ATH_MSG_DEBUG("  Dereferenced link '" << name << "' to LVL1::RecEmTauRoI:" << *elementLink);
 
    } else if (clid == ClassID_traits< xAOD::TrigCompositeContainer >::ID()) {
     
     const ElementLink<xAOD::TrigCompositeContainer> elementLink = tc->objectLink<xAOD::TrigCompositeContainer>(name);
-    if (!elementLink.isValid()) ATH_MSG_WARNING("Invalid element link from '" << tc->name() << "' to '" << name << "'");
-    else ATH_MSG_DEBUG("Got TrigComposite:" << (*elementLink)->name());
+    if (!elementLink.isValid()) ATH_MSG_WARNING("  Invalid element link to TrigComposite, link name:'" << name << "'");
+    else ATH_MSG_DEBUG("  Dereferenced link '" << name << "' to TrigComposite, TC name:'" << (*elementLink)->name() << "'");
+
+   } else if (clid == ClassID_traits< ViewContainer >::ID()) {
+    
+    const ElementLink<ViewContainer> elementLink = tc->objectLink<ViewContainer>(name);
+    if (!elementLink.isValid()) ATH_MSG_WARNING("  Invalid element link to View, link name:'" << name << "'");
+    else ATH_MSG_DEBUG("  Dereferenced link '" << name << "' to View:'" << *elementLink);
+
 
   } else {
-    ATH_MSG_DEBUG("Ignoring link to '" << name << "' with CLID " << clid);
+    ATH_MSG_DEBUG("  Ignoring link to '" << name << "' with link CLID " << clid);
   }
 
   return StatusCode::SUCCESS;
@@ -4104,11 +4109,11 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue
   // This constexpr is evaluated at compile time
   const CLID TrigCompositeCLID = static_cast<CLID>( ClassID_traits< xAOD::TrigCompositeContainer >::ID() );
   std::vector<std::string> keys;
-  if ( m_doDumpAll ) {
+  if ( m_doDumpAllTrigComposite ) {
     evtStore()->keys(TrigCompositeCLID, keys);
   }
   else {
-    std::vector<std::string> keys = m_dumpTrigCompositeContainers;
+    keys = m_dumpTrigCompositeContainers;
   }
   std::string typeNameTC;
   ATH_CHECK(m_clidSvc->getTypeNameOfID(TrigCompositeCLID, typeNameTC));
@@ -4123,8 +4128,21 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue
   ss << "  node [shape=rectangle]" << std::endl;
   ss << "  rankdir = BT" << std::endl;
 
+  const std::vector<std::string> vetoList = { // Patterns to ignore when dumping all
+    "TrigCostContainer",
+    "L1DecoderSummary"
+    };
+
   // Now process them
-  for (const std::string key : keys) {
+  for (const std::string& key : keys) {
+    bool veto = false;
+    for (const std::string& vetoStr : vetoList) {
+      if (m_doDumpAllTrigComposite && key.find(vetoStr) != std::string::npos) {
+        veto = true;
+        break;
+      }
+    }
+    if (veto) continue;
     ATH_CHECK( evtStore()->retrieve( container, key ) );
     size_t index = 0;
     ss << "  subgraph " << key << " {" << std::endl;
@@ -4146,21 +4164,23 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue
       // Output all the things I link to
       for (size_t i = 0; i < tc->linkColNames().size(); ++i) {
         const std::string link = tc->linkColNames().at(i);
-        if (link == "seed") {
-          const xAOD::TrigComposite* seed = tc->object<xAOD::TrigComposite>("seed");
-          ss << "    \"" << tc << "\" -> \"" << seed << "\" [label=\"seed\"]" << std::endl; 
+        if (link == "self") {
+          continue; // Ignore the "self" link
+        } else if (link == "seed" || link == "seed__COLL") {
+          const xAOD::TrigComposite* seed = tc->object<xAOD::TrigComposite>(link);
+          ss << "    \"" << tc << "\" -> \"" << seed << "\" [label=\"seed\"]" << std::endl; // Print ptr address
         } else {
           // Start with my class ID
           const CLID linkCLID = static_cast<CLID>( tc->linkColClids().at(i) );
           // Use it to get my class name
           std::string tname;
           ATH_CHECK(m_clidSvc->getTypeNameOfID(linkCLID, tname));
-          // Now ge the sgkey I'm linking to & the index
+          // Now get the sgkey I'm linking to & the index
           const SG::sgkey_t key = static_cast<SG::sgkey_t>( tc->linkColKeys().at(i) );
           const unsigned index = tc->linkColIndices().at(i);
           // Look it up
           CLID checkCLID;
-          const std::string* keyStr = evtStore()->keyToString(key, checkCLID);
+          const std::string* keyStr = evtStore()->keyToString(key, checkCLID); // I don't own this str
           if (keyStr != nullptr && checkCLID != linkCLID) {
             std::string tnameOfCheck;
             m_clidSvc->getTypeNameOfID(checkCLID, tnameOfCheck).ignore(); // Might be invalid. But we don't care.
@@ -4168,7 +4188,7 @@ StatusCode TrigEDMChecker::TrigCompositeNavigationToDot(std::string& returnValue
               << ". We were expecting " << linkCLID << " [" << tname << "]");
           }
           // Print
-          ss << "    \"" << tc << "\" -> \"";
+          ss << "    \"" << tc << "\" -> \""; // Print ptr address
           ss << "Container=" << tname << "\\nKey=";
           if (keyStr != nullptr) ss << *keyStr;
           else ss << "[KEY "<< key <<" NOT IN STORE]";