diff --git a/Event/xAOD/xAODMissingET/xAODMissingET/MissingETAssociationHelper.h b/Event/xAOD/xAODMissingET/xAODMissingET/MissingETAssociationHelper.h
index 27a84425f64ac079be4b3fdfc94d265a4044fae8..2ba2129df012da8f7cd5636966cc78b5fe1ec2d6 100644
--- a/Event/xAOD/xAODMissingET/xAODMissingET/MissingETAssociationHelper.h
+++ b/Event/xAOD/xAODMissingET/xAODMissingET/MissingETAssociationHelper.h
@@ -42,7 +42,7 @@ namespace xAOD
     void setObjSelectionFlag(const MissingETAssociation_v1* assoc, const IParticle* pPart, bool status);  /*!< @brief Flag object as selected for MET calculation */
 
     inline void resetObjSelectionFlags() { m_useObjectFlags.clear(); }
-		inline const MissingETAssociationMap_v1* map() const { return m_map; }
+    inline const MissingETAssociationMap_v1* map() const { return m_map; }
 
   private:
 
diff --git a/PhysicsAnalysis/JetMissingEtID/JetMissingEtTagTools/src/JetMissingEtTagTool.cxx b/PhysicsAnalysis/JetMissingEtID/JetMissingEtTagTools/src/JetMissingEtTagTool.cxx
index ff2c203afeecebe4b1e7a4fdfc2a6904e1e3195c..7693687480087dc63843ea1304643d0e3856bb05 100755
--- a/PhysicsAnalysis/JetMissingEtID/JetMissingEtTagTools/src/JetMissingEtTagTool.cxx
+++ b/PhysicsAnalysis/JetMissingEtID/JetMissingEtTagTools/src/JetMissingEtTagTool.cxx
@@ -574,7 +574,7 @@ StatusCode JetMetTagTool::recomputeMissingEt() {
     ATH_MSG_WARNING("Unable to retrieve MissingETAssociationMap: " << m_METMapName);
     return StatusCode::SUCCESS;
   }
-  xAOD::MissingETAssociationHelper* metHelper = new xAOD::MissingETAssociationHelper(metMap);
+  xAOD::MissingETAssociationHelper metHelper(metMap);
 
   /// MET core
   const xAOD::MissingETContainer* coreMet(0);
@@ -596,7 +596,7 @@ StatusCode JetMetTagTool::recomputeMissingEt() {
     //    uniques.clear();
     if( m_metmaker->rebuildMET("RefEle", xAOD::Type::Electron, newMet,
 			       elCont,
-			       metHelper).isFailure() ) {
+			       &metHelper).isFailure() ) {
       ATH_MSG_WARNING("Failed to build electron term.");
     }
     //ATH_MSG_DEBUG("Selected " << elCont->size() << " MET electrons. "
@@ -616,7 +616,7 @@ StatusCode JetMetTagTool::recomputeMissingEt() {
     //uniques.clear();
     if( m_metmaker->rebuildMET("RefGamma", xAOD::Type::Photon, newMet,
 			       phCont,
-			       metHelper).isFailure() ) {
+			       &metHelper).isFailure() ) {
       ATH_MSG_WARNING("Failed to build photon term.");
     }
     //ATH_MSG_DEBUG("Selected " << phCont->size() << " MET photons. "
@@ -636,7 +636,7 @@ StatusCode JetMetTagTool::recomputeMissingEt() {
     //uniques.clear();
     if( m_metmaker->rebuildMET("RefTau", xAOD::Type::Tau, newMet,
 			       tauCont,
-			       metHelper).isFailure() ){
+			       &metHelper).isFailure() ){
       ATH_MSG_WARNING("Failed to build tau term.");
     }
     //ATH_MSG_DEBUG("Selected " << tauCont->size() << " MET taus. "
@@ -656,7 +656,7 @@ StatusCode JetMetTagTool::recomputeMissingEt() {
     //uniques.clear();
     if( m_metmaker->rebuildMET("Muons", xAOD::Type::Muon, newMet,
 			       muonCont,
-			       metHelper).isFailure() ) {
+			       &metHelper).isFailure() ) {
       ATH_MSG_WARNING("Failed to build muon term.");
     }
     //ATH_MSG_DEBUG("Selected " << muonCont->size() << " MET muons. "
@@ -674,7 +674,7 @@ StatusCode JetMetTagTool::recomputeMissingEt() {
   // compute MET term
   //uniques.clear();
   if( m_metmaker->rebuildJetMET("RefJet", m_metSoftClusName, m_metPVSoftTrkName, newMet,
-				jetCont, coreMet, metHelper, true ).isFailure() ) {
+				jetCont, coreMet, &metHelper, true ).isFailure() ) {
     ATH_MSG_WARNING("Failed to build jet and soft terms.");
   }
   //ATH_MSG_DEBUG("Of " << jetCont->size() << " jets, "
@@ -693,7 +693,6 @@ StatusCode JetMetTagTool::recomputeMissingEt() {
   if( m_metmaker->buildMETSum("FinalClus", newMet, clsource).isFailure() ) {
     ATH_MSG_WARNING("Building MET FinalClus sum failed.");
   }
-  delete metHelper;
   return StatusCode::SUCCESS;
 }
 
diff --git a/PhysicsAnalysis/JetMissingEtID/MissingEtDQA/src/PhysValMET.cxx b/PhysicsAnalysis/JetMissingEtID/MissingEtDQA/src/PhysValMET.cxx
index d5982379b354303dd6f95989f53a7a425579b3be..8c97a137f5d63af0ac7742dee88e7c70d0f9bf2b 100644
--- a/PhysicsAnalysis/JetMissingEtID/MissingEtDQA/src/PhysValMET.cxx
+++ b/PhysicsAnalysis/JetMissingEtID/MissingEtDQA/src/PhysValMET.cxx
@@ -27,6 +27,7 @@
 #include "AthenaBaseComps/AthCheckMacros.h"
 #include "xAODMissingET/MissingETComposition.h"
 #include "xAODMissingET/MissingETAssociationMap.h"
+#include "xAODMissingET/MissingETAssociationHelper.h"
 
 #include "xAODJet/JetContainer.h"
 #include "xAODMuon/MuonContainer.h"
@@ -881,7 +882,7 @@ namespace MissingEtDQA {
     	ATH_MSG_WARNING("Unable to retrieve MissingETAssociationMap: " << m_mapname);
     	return StatusCode::SUCCESS;
       }
-      metMap->resetObjSelectionFlags();
+      MissingETAssociationHelper metHelper(metMap);
       const MissingETContainer* coreMet(0);
       if( evtStore()->retrieve(coreMet, m_corename).isFailure() ) {
     	ATH_MSG_WARNING("Unable to retrieve MissingETContainer: " << m_corename);
@@ -894,27 +895,27 @@ namespace MissingEtDQA {
       else m_metmaker = m_metmakerTopo;
 
       // Electrons
-      if( m_metmaker->rebuildMET("RefEle", xAOD::Type::Electron, met_Reb, metElectrons.asDataVector(), metMap).isFailure() ) {
+      if( m_metmaker->rebuildMET("RefEle", xAOD::Type::Electron, met_Reb, metElectrons.asDataVector(), &metHelper).isFailure() ) {
     	ATH_MSG_WARNING("Failed to build electron term.");
       }
 
       // Photons
-      if( m_metmaker->rebuildMET("RefGamma", xAOD::Type::Photon, met_Reb, metPhotons.asDataVector(), metMap).isFailure() ) {
+      if( m_metmaker->rebuildMET("RefGamma", xAOD::Type::Photon, met_Reb, metPhotons.asDataVector(), &metHelper).isFailure() ) {
     	ATH_MSG_WARNING("Failed to build photon term.");
       }
 
       // Taus
-      if( m_metmaker->rebuildMET("RefTau", xAOD::Type::Tau, met_Reb,metTaus.asDataVector(),metMap).isFailure() ){
+      if( m_metmaker->rebuildMET("RefTau", xAOD::Type::Tau, met_Reb,metTaus.asDataVector(),&metHelper).isFailure() ){
     	ATH_MSG_WARNING("Failed to build tau term.");
       }
 
       // Muons
-      if( m_metmaker->rebuildMET("Muons", xAOD::Type::Muon, met_Reb, metMuons.asDataVector(), metMap).isFailure() ) {
+      if( m_metmaker->rebuildMET("Muons", xAOD::Type::Muon, met_Reb, metMuons.asDataVector(), &metHelper).isFailure() ) {
     	ATH_MSG_WARNING("Failed to build muon term.");
       }
 
       // Jets
-      if( m_metmaker->rebuildJetMET("RefJet", "SoftClus", "PVSoftTrk", met_Reb, jets, coreMet, metMap, true).isFailure() ) {
+      if( m_metmaker->rebuildJetMET("RefJet", "SoftClus", "PVSoftTrk", met_Reb, jets, coreMet, &metHelper, true).isFailure() ) {
     	ATH_MSG_WARNING("Failed to build jet and soft terms.");
       }
       MissingETBase::Types::bitmask_t trksource = MissingETBase::Source::Track;
diff --git a/Reconstruction/MET/METReconstruction/src/METAssocTestAlg.cxx b/Reconstruction/MET/METReconstruction/src/METAssocTestAlg.cxx
index c33236af6ddec685df7291aae2354a744839989c..fcc68795a525640d93ae2d2937d472053208cea6 100644
--- a/Reconstruction/MET/METReconstruction/src/METAssocTestAlg.cxx
+++ b/Reconstruction/MET/METReconstruction/src/METAssocTestAlg.cxx
@@ -4,6 +4,7 @@
 
 #include "METAssocTestAlg.h"
 #include "xAODMissingET/MissingETAssociationMap.h"
+#include "xAODMissingET/MissingETAssociationHelper.h"
 
 using namespace xAOD;
 
@@ -71,14 +72,15 @@ namespace met {
     JetFourMom_t jetconstp4 = jet.jetP4(JetConstitScaleMomentum);
     MissingETBase::Types::constvec_t jettrkvec = assoc.jetTrkVec();
 
+    xAOD::MissingETAssociationHelper helper;
+
     // switch on all overlapping objects
-    assoc.resetObjSelectionFlags();
     for(size_t iobj=0; iobj<assoc.objects().size(); ++iobj) {
-      assoc.setObjSelectionFlag(iobj,true);
+      helper.setObjSelectionFlag(&assoc,iobj,true);
     }
     // get cluster/inclusive pflow and track/charged pflow constituent sums
-    MissingETBase::Types::constvec_t overlapcalvec = assoc.overlapCalVec();
-    MissingETBase::Types::constvec_t overlaptrkvec = assoc.overlapTrkVec();
+    MissingETBase::Types::constvec_t overlapcalvec = assoc.overlapCalVec(&helper);
+    MissingETBase::Types::constvec_t overlaptrkvec = assoc.overlapTrkVec(&helper);
 
     ATH_MSG_VERBOSE("  Jet constituent-scale pt: " << jetconstp4.pt()     << ", E: " << jetconstp4.e() );
     ATH_MSG_VERBOSE("  Max constituent overlap pt:   " << overlapcalvec.cpt() << ", E: " << overlapcalvec.ce() );
@@ -105,16 +107,18 @@ namespace met {
     JetFourMom_t jetconstp4 = jet.jetP4(JetConstitScaleMomentum);
     MissingETBase::Types::constvec_t jettrkvec = assoc.jetTrkVec();
 
+    xAOD::MissingETAssociationHelper helper;
+
     // loop over individual objects and check that none of them has a larger
     // associated constituent sum than the jet
     for(size_t iobj=0; iobj<assoc.objects().size(); ++iobj) {
       ATH_MSG_VERBOSE("    Now on constituent " << iobj );
       const IParticle* obj = assoc.objects()[iobj];
       if(!obj) continue; // invalid ElementLink -- thinned?
-      assoc.resetObjSelectionFlags();
-      assoc.setObjSelectionFlag(iobj,true);
-      MissingETBase::Types::constvec_t overlapcalvec = assoc.overlapCalVec();
-      MissingETBase::Types::constvec_t overlaptrkvec = assoc.overlapTrkVec();
+      helper.resetObjSelectionFlags();
+      helper.setObjSelectionFlag(&assoc,iobj,true);
+      MissingETBase::Types::constvec_t overlapcalvec = assoc.overlapCalVec(&helper);
+      MissingETBase::Types::constvec_t overlaptrkvec = assoc.overlapTrkVec(&helper);
 
       ATH_MSG_VERBOSE("    Object pt:       " << obj->pt() << ", E: " << obj->e() << ", type: " << obj->type());
       ATH_MSG_VERBOSE("    Constituent pt:  " << overlapcalvec.cpt() << ", E: " << overlapcalvec.ce() );
diff --git a/Reconstruction/MET/METUtilities/src/METMakerAlg.cxx b/Reconstruction/MET/METUtilities/src/METMakerAlg.cxx
index 1ffc68b5099b5f11ddd732660ad07443084f8ec2..909d89033195d63ba5fec77de67cff03060b1b58 100644
--- a/Reconstruction/MET/METUtilities/src/METMakerAlg.cxx
+++ b/Reconstruction/MET/METUtilities/src/METMakerAlg.cxx
@@ -140,7 +140,7 @@ namespace met {
     ATH_CHECK( m_metMap.isValid() );
 
     MissingETAssociationMap* metMap = new MissingETAssociationMap((*m_metMap));
-    MissingETAssociationHelper* metHelper = new MissingETAssociationHelper(metMap);
+    MissingETAssociationHelper metHelper(metMap);
     // Retrieve containers ***********************************************
 
     /// MET
@@ -201,7 +201,7 @@ namespace met {
       }
       if( m_metmaker->rebuildMET("RefEle", xAOD::Type::Electron, newMet,
     				 metElectrons.asDataVector(),
-    				 metHelper, objScale).isFailure() ) {
+    				 &metHelper, objScale).isFailure() ) {
     	ATH_MSG_WARNING("Failed to build electron term.");
       }
       ATH_MSG_DEBUG("Selected " << metElectrons.size() << " MET electrons. "
@@ -218,7 +218,7 @@ namespace met {
       }
       if( m_metmaker->rebuildMET("RefGamma", xAOD::Type::Photon, newMet,
     				 metPhotons.asDataVector(),
-    				 metHelper, objScale).isFailure() ) {
+    				 &metHelper, objScale).isFailure() ) {
     	ATH_MSG_WARNING("Failed to build photon term.");
       }
       ATH_MSG_DEBUG("Selected " << metPhotons.size() << " MET photons. "
@@ -235,7 +235,7 @@ namespace met {
       }
       if( m_metmaker->rebuildMET("RefTau", xAOD::Type::Tau, newMet,
     				 metTaus.asDataVector(),
-    				 metHelper, objScale).isFailure() ){
+    				 &metHelper, objScale).isFailure() ){
     	ATH_MSG_WARNING("Failed to build tau term.");
       }
       ATH_MSG_DEBUG("Selected " << metTaus.size() << " MET taus. "
@@ -254,7 +254,7 @@ namespace met {
       if(m_doTruthLep) objScale = MissingETBase::UsageHandler::OnlyTrack;
       if( m_metmaker->rebuildMET("Muons", xAOD::Type::Muon, newMet,
     				 metMuons.asDataVector(),
-    				 metHelper, objScale).isFailure() ) {
+    				 &metHelper, objScale).isFailure() ) {
     	ATH_MSG_WARNING("Failed to build muon term.");
       }
       ATH_MSG_DEBUG("Selected " << metMuons.size() << " MET muons. "
@@ -262,7 +262,7 @@ namespace met {
     }
 
     if( m_metmaker->rebuildJetMET("RefJet", m_softclname, m_softtrkname, newMet,
-				  Jets.cptr(), coreMet.cptr(), metHelper, false ).isFailure() ) {
+				  Jets.cptr(), coreMet.cptr(), &metHelper, false ).isFailure() ) {
       ATH_MSG_WARNING("Failed to build jet and soft terms.");
     }
     ATH_MSG_DEBUG("Of " << Jets.cptr()->size()  << " jets, "
@@ -280,7 +280,6 @@ namespace met {
       ATH_MSG_WARNING("Building MET FinalClus sum failed.");
     }
 
-    delete metHelper;
     return StatusCode::SUCCESS;
   }
 
diff --git a/Reconstruction/MET/METUtilities/util/example_METMaker_METSystematicsTool.cxx b/Reconstruction/MET/METUtilities/util/example_METMaker_METSystematicsTool.cxx
index 2c7ed77cc57e06dcd78a68e6f143251ba06d5557..adb37b80ca1557f27c9196cc8fb28db20f71e2fa 100644
--- a/Reconstruction/MET/METUtilities/util/example_METMaker_METSystematicsTool.cxx
+++ b/Reconstruction/MET/METUtilities/util/example_METMaker_METSystematicsTool.cxx
@@ -29,6 +29,7 @@ int main() {
 #include "xAODMissingET/MissingETAuxContainer.h"
 #include "xAODMissingET/MissingETAssociationMap.h"
 #include "xAODMissingET/MissingETContainer.h"
+#include "xAODMissingET/MissingETAssociationHelper.h"
 
 #include "xAODCore/ShallowAuxContainer.h"
 #include "xAODCore/ShallowCopy.h"
@@ -194,8 +195,8 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
       xAOD::MissingETAuxContainer* newMetAuxContainer = new xAOD::MissingETAuxContainer();
       newMetContainer->setStore(newMetAuxContainer);
 
-      // It is necessary to reset the selected objects before every MET calculation
-      metMap->resetObjSelectionFlags();
+      // A MET Association Helper is needed to keep track of selected objects
+      xAOD::MissingETAssociationHelper metHelper(metMap);
 
       //here we apply some basic cuts and rebuild the met at each step
       //Electrons
@@ -207,7 +208,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
 				 xAOD::Type::Electron,       //telling the rebuilder that this is electron met
 				 newMetContainer,            //filling this met container
 				 metElectrons.asDataVector(),//using these metElectrons that accepted our cuts
-				 metMap)                     //and this association map
+				 &metHelper)                     //and this association map
 	     );
 
       //Photons
@@ -219,7 +220,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
 				 xAOD::Type::Photon,
 				 newMetContainer,
 				 metPhotons.asDataVector(),
-				 metMap)
+				 &metHelper)
 	     );
 
       //Taus
@@ -231,7 +232,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
 				 xAOD::Type::Tau,
 				 newMetContainer,
 				 metTaus.asDataVector(),
-				 metMap)
+				 &metHelper)
 	     );
 
       //Muons
@@ -243,7 +244,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
 				 xAOD::Type::Muon,
 				 newMetContainer,
 				 metMuons.asDataVector(),
-				 metMap)
+				 &metHelper)
 	     );
 
       //Now time to rebuild jetMet and get the soft term
@@ -255,7 +256,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
 				     newMetContainer, //adding to this new met container
 				     calibJets,       //using this jet collection to calculate jet met
 				     coreMet,         //core met container
-				     metMap,          //with this association map
+				     &metHelper,          //with this association map
 				      false            //don't apply jet jvt cut
 				     )
 	     );
diff --git a/Reconstruction/MET/METUtilities/util/example_METMaker_advanced.cxx b/Reconstruction/MET/METUtilities/util/example_METMaker_advanced.cxx
index bdb1db9e08a8c22ca659c3dac1d2ffa4bdf56ebe..248723221a0fa12d4decb48810256f0ce55b6274 100644
--- a/Reconstruction/MET/METUtilities/util/example_METMaker_advanced.cxx
+++ b/Reconstruction/MET/METUtilities/util/example_METMaker_advanced.cxx
@@ -28,6 +28,7 @@ int main() {
 #include "xAODMissingET/MissingETAuxContainer.h"
 #include "xAODMissingET/MissingETAssociationMap.h"
 #include "xAODMissingET/MissingETContainer.h"
+#include "xAODMissingET/MissingETAssociationHelper.h"
 
 #include "xAODCore/ShallowCopy.h"
 #include "xAODJet/JetContainer.h"
@@ -158,14 +159,12 @@ int main( int argc, char* argv[] ){std::cout << __PRETTY_FUNCTION__ << std::endl
     const xAOD::MissingETAssociationMap* metMap = nullptr;
     std::string metAssocKey = "METAssoc_" + jetType;
     ANA_CHECK( event->retrieve(metMap, metAssocKey) );
-    metMap->resetObjSelectionFlags();
 
     xAOD::MissingETContainer*    newMetContainer    = new xAOD::MissingETContainer();
     xAOD::MissingETAuxContainer* newMetAuxContainer = new xAOD::MissingETAuxContainer();
     newMetContainer->setStore(newMetAuxContainer);
 
-    // It is necessary to reset the selected objects before every MET calculation
-    metMap->resetObjSelectionFlags();
+    xAOD::MissingETAssociationHelper metHelper(metMap);
 
     //here we apply some basic cuts and rebuild the met at each step
     //InvisibleElectrons
@@ -178,7 +177,7 @@ int main( int argc, char* argv[] ){std::cout << __PRETTY_FUNCTION__ << std::endl
       }
       //this line will mark the electron as invisible if it passes the (inv) electron selection cut
       //this removes the particle and associated clusters from the jet and soft term calculations
-      ANA_CHECK( metMaker->markInvisible(metInvisibleElectrons.asDataVector(),metMap,newMetContainer) );
+      ANA_CHECK( metMaker->markInvisible(metInvisibleElectrons.asDataVector(),&metHelper,newMetContainer) );
       // NOTE: Objects marked as invisible should not also be added as part
       // of another term! However, you can e.g. mark some electrons invisible
       // and compute RefEle with others.
@@ -193,7 +192,7 @@ int main( int argc, char* argv[] ){std::cout << __PRETTY_FUNCTION__ << std::endl
 			       xAOD::Type::Photon,
 			       newMetContainer,
 			       metPhotons.asDataVector(),
-			       metMap)
+			       &metHelper)
 	   );
     //Taus
     ConstDataVector<xAOD::TauJetContainer> metTaus(SG::VIEW_ELEMENTS);
@@ -204,7 +203,7 @@ int main( int argc, char* argv[] ){std::cout << __PRETTY_FUNCTION__ << std::endl
 			       xAOD::Type::Tau,
 			       newMetContainer,
 			       metTaus.asDataVector(),
-			       metMap)
+			       &metHelper)
 	   );
     
     //Muons
@@ -217,7 +216,7 @@ int main( int argc, char* argv[] ){std::cout << __PRETTY_FUNCTION__ << std::endl
 			       xAOD::Type::Muon,
 			       newMetContainer,
 			       metMuons.asDataVector(),
-			       metMap)
+			       &metHelper)
 	   );
     
     met::addGhostMuonsToJets(*muons, *calibJets);
@@ -230,7 +229,7 @@ int main( int argc, char* argv[] ){std::cout << __PRETTY_FUNCTION__ << std::endl
 				    newMetContainer, //adding to this new met container
 				    calibJets,       //using this jet collection to calculate jet met
 				    coreMet,         //core met container
-				    metMap,          //with this association map
+				    &metHelper,          //with this association map
 				    false            //don't apply jet jvt cut
 				    )
 	     );
@@ -240,7 +239,7 @@ int main( int argc, char* argv[] ){std::cout << __PRETTY_FUNCTION__ << std::endl
 				      newMetContainer,//adding to this new met container
 				      calibJets,	  //using this jet collection to calculate jet track met
 				      coreMet,	  //core met container
-				      metMap,	  //with this association map
+				      &metHelper,	  //with this association map
 				      false		  //don't apply jet jvt cut
 				      )
 	     );
diff --git a/Reconstruction/MET/METUtilities/util/example_rebuildTrackMET.cxx b/Reconstruction/MET/METUtilities/util/example_rebuildTrackMET.cxx
index 533f8a9e2c2b8d475cd944e7ace236842dc40103..849c29b2ef80bfd6735f2488ff29a1f3f3344236 100644
--- a/Reconstruction/MET/METUtilities/util/example_rebuildTrackMET.cxx
+++ b/Reconstruction/MET/METUtilities/util/example_rebuildTrackMET.cxx
@@ -28,6 +28,7 @@ int main() {
 #include "xAODMissingET/MissingETAuxContainer.h"
 #include "xAODMissingET/MissingETAssociationMap.h"
 #include "xAODMissingET/MissingETContainer.h"
+#include "xAODMissingET/MissingETAssociationHelper.h"
 
 #include "xAODCore/ShallowAuxContainer.h"
 #include "xAODCore/ShallowCopy.h"
@@ -178,9 +179,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
       xAOD::MissingETAuxContainer* newMetAuxContainer = new xAOD::MissingETAuxContainer();
       newMetContainer->setStore(newMetAuxContainer);
 
-      // It is necessary to reset the selected objects before every MET calculation
-      metMap->resetObjSelectionFlags();
-
+      xAOD::MissingETAssociationHelper metHelper(metMap);
       //here we apply some basic cuts and rebuild the met at each step
       //Electrons
       ConstDataVector<xAOD::ElectronContainer> invisElectrons(SG::VIEW_ELEMENTS);
@@ -195,14 +194,14 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
 	}
       }
       if(!invisElectrons.empty()){
-	ANA_CHECK( metMaker->markInvisible(invisElectrons.asDataVector(),metMap,newMetContainer) );
+	ANA_CHECK( metMaker->markInvisible(invisElectrons.asDataVector(),&metHelper,newMetContainer) );
       }
 
       ANA_CHECK( metMaker->rebuildMET("TrkEle",                   //name of metElectrons in metContainer
 				 xAOD::Type::Electron,       //telling the rebuilder that this is electron met
 				 newMetContainer,            //filling this met container
 				 metElectrons.asDataVector(),//using these metElectrons that accepted our cuts
-				 metMap)                     //and this association map
+				 &metHelper)                     //and this association map
 	     );
 
       //Muons
@@ -214,7 +213,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
 				 xAOD::Type::Muon,
 				 newMetContainer,
 				 metMuons.asDataVector(),
-				 metMap)
+				 &metHelper)
 	     );
 
       // for rebuilding track MET
@@ -223,7 +222,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
       				  newMetContainer,//adding to this new met container
       				  calibJets,	  //using this jet collection to calculate jet track met
       				  coreMet,	  //core met container
-      				  metMap,	  //with this association map
+      				  &metHelper,	  //with this association map
       				  false		  //don't apply jet jvt cut
       				  )
       	 );
@@ -245,7 +244,7 @@ int main( int argc, char* argv[]) {std::cout << __PRETTY_FUNCTION__ << std::endl
       // when doing track MET
       xAOD::MissingET * jetTrkMet = (*newMetContainer)["TrkJet"];
       ANA_CHECK( jetTrkMet != nullptr);
-      ANA_CHECK( metSystTool->applyCorrection(*jetTrkMet, metMap));//for jetTrkMet correction, we need the METAssociationMap
+      ANA_CHECK( metSystTool->applyCorrection(*jetTrkMet, &metHelper));//for jetTrkMet correction, we need the METAssociationMap
       if(debug) std::cout << "Jet track met: " << jetTrkMet->met();
 
       //this builds the final track or cluster met sums, using systematic varied container