diff --git a/Control/AthenaBaseComps/AthenaBaseComps/DynamicDataHelper.h b/Control/AthenaBaseComps/AthenaBaseComps/DynamicDataHelper.h
index cf4dcdf5b2b5f4f415f4e4336e83bfedef308c16..55e15538643a9fe561eaac634bda85935fc18d88 100644
--- a/Control/AthenaBaseComps/AthenaBaseComps/DynamicDataHelper.h
+++ b/Control/AthenaBaseComps/AthenaBaseComps/DynamicDataHelper.h
@@ -66,7 +66,7 @@ namespace Ath {
       DataObjIDPtrColl m_inputHandles;
       DataObjIDPtrColl m_outputHandles;
 
-      std::vector< std::pair<IDynamicDataConsumer *,Gaudi::Algorithm *> > m_dynDataConsumer;
+      std::unordered_map< IDynamicDataConsumer *,std::vector<Gaudi::Algorithm *> > m_dynDataConsumer;
 
    };
 }
diff --git a/Control/AthenaBaseComps/src/DynamicDataHelper.cxx b/Control/AthenaBaseComps/src/DynamicDataHelper.cxx
index 9ce76b6d7daeef71eb1c57efa33532bb35b95756..1130d23eff7df584427348897ba22db40fb6e6cc 100644
--- a/Control/AthenaBaseComps/src/DynamicDataHelper.cxx
+++ b/Control/AthenaBaseComps/src/DynamicDataHelper.cxx
@@ -68,7 +68,10 @@ namespace Ath {
             [this](Gaudi::Algorithm *an_alg) {
                IDynamicDataConsumer *a_dyn_data_consumer=dynamic_cast<IDynamicDataConsumer *>(an_alg);
                if (a_dyn_data_consumer) {
-                  m_dynDataConsumer.push_back(std::make_pair(a_dyn_data_consumer, an_alg));
+                  std::vector<Gaudi::Algorithm *> &alg_list = m_dynDataConsumer[a_dyn_data_consumer];
+                  if (std::find(alg_list.begin(),alg_list.end(),an_alg)==alg_list.end()) {
+                     alg_list.push_back(an_alg);
+                  }
                }
                // have to collect input and output handles because the sequence will only collect them  after initialize
                insertHandles(m_inputHandles, an_alg->inputHandles());
@@ -79,7 +82,10 @@ namespace Ath {
                auto tool_visitor = [this, an_alg](IAlgTool *alg_tool) {
                   IDynamicDataConsumer *a_dyn_data_consumer=dynamic_cast<IDynamicDataConsumer *>(alg_tool);
                   if (a_dyn_data_consumer) {
-                     m_dynDataConsumer.push_back(std::make_pair(a_dyn_data_consumer, an_alg));
+                     std::vector<Gaudi::Algorithm *> &alg_list = m_dynDataConsumer[a_dyn_data_consumer];
+                     if (std::find(alg_list.begin(),alg_list.end(),an_alg)==alg_list.end()) {
+                        alg_list.push_back(an_alg);
+                     }
                   }
                   if (auto* tool_impl = dynamic_cast<AlgTool*>( alg_tool ); tool_impl) {
                      insertHandles(m_inputHandles, tool_impl->inputHandles());
@@ -130,29 +136,32 @@ namespace Ath {
          }
          out << endmsg;
       }
-      for (std::pair<IDynamicDataConsumer *,Gaudi::Algorithm *> &dyn_data_consumer :  m_dynDataConsumer ) {
+      for (std::pair<IDynamicDataConsumer * const,std::vector<Gaudi::Algorithm *> > &dyn_data_consumer :  m_dynDataConsumer ) {
          std::vector<Gaudi::DataHandle *> tmp_new_input_handles;
          std::vector<Gaudi::DataHandle *> tmp_new_output_handles;
          bool ret = dyn_data_consumer.first->updateDataNeeds(input_data_in, output_data_in, tmp_new_input_handles, tmp_new_output_handles);
          if (msgLvl(out,MSG::VERBOSE)) {
-            out << MSG::VERBOSE << " new data from " << dyn_data_consumer.second->name()
-                << " i:" << tmp_new_input_handles.size()
+            out << MSG::VERBOSE << " new data for";
+            for (const Gaudi::Algorithm *parent_alg : dyn_data_consumer.second) {
+               out << " " << parent_alg->name();
+            }
+            out << " i:" << tmp_new_input_handles.size()
                 << " o:" << tmp_new_output_handles.size()
                 << endmsg;
          }
          updated |=  ret;
          if (ret) {
             if (msgLvl(out,MSG::DEBUG)) {
-               if (Gaudi::Algorithm *an_alg = dynamic_cast<Gaudi::Algorithm *>(dyn_data_consumer.first); an_alg) {
+               if (Gaudi::Algorithm * const an_alg = dynamic_cast<Gaudi::Algorithm * const>(dyn_data_consumer.first); an_alg) {
                   out << MSG::DEBUG << an_alg->name() << " updated its data needs." << endmsg;
                   // DEBUG:
                   out << MSG::DEBUG << an_alg->name() << " inputs:";
-                  for (const Gaudi::DataHandle *handle : an_alg->inputHandles()) {
-                     out << " " << handle->fullKey();
-                  }
-                  out << endmsg;
+                     for (const Gaudi::DataHandle *handle : an_alg->inputHandles()) {
+                        out << " " << handle->fullKey();
+                     }
+                     out << endmsg;
                }
-               else if (AlgTool *alg_tool = dynamic_cast<AlgTool *>(dyn_data_consumer.first); alg_tool) {
+               else if (AlgTool *alg_tool = dynamic_cast<AlgTool * const>(dyn_data_consumer.first); alg_tool) {
                   out << MSG::DEBUG << alg_tool->name() << " updated its data needs." << endmsg;
                   // DEBUG:
                   out << MSG::DEBUG << alg_tool->name() << " inputs:";
@@ -166,20 +175,21 @@ namespace Ath {
                }
             }
          }
-         Gaudi::Algorithm *parent_alg = dyn_data_consumer.second;
-         input_data_out.reserve(input_data_out.size()+tmp_new_input_handles.size());
-         for (Gaudi::DataHandle *a_handle : tmp_new_input_handles) {
-            parent_alg->addDependency(a_handle->fullKey(), Gaudi::DataHandle::Reader);
-            input_data_out.push_back(&(a_handle->fullKey()));
-            if (msgLvl(out,MSG::DEBUG)) out << MSG::DEBUG << " addDependency new input for " << parent_alg->name() << " "
-                                            << a_handle->fullKey().className() << " / " <<  a_handle->objKey() << endmsg;
-         }
-         output_data_out.reserve(output_data_out.size()+tmp_new_output_handles.size());
-         for (Gaudi::DataHandle *a_handle : tmp_new_output_handles) {
-            parent_alg->addDependency(a_handle->fullKey(), Gaudi::DataHandle::Writer);
-            output_data_out.push_back(&(a_handle->fullKey()));
-            if (msgLvl(out,MSG::DEBUG)) out << MSG::DEBUG << " addDependency new output for " << parent_alg->name() << " "
-                                            << a_handle->fullKey().className() << " / "  << a_handle->objKey() << endmsg;
+         for (Gaudi::Algorithm *parent_alg : dyn_data_consumer.second) {
+            input_data_out.reserve(input_data_out.size()+tmp_new_input_handles.size());
+            for (Gaudi::DataHandle *a_handle : tmp_new_input_handles) {
+               parent_alg->addDependency(a_handle->fullKey(), Gaudi::DataHandle::Reader);
+               input_data_out.push_back(&(a_handle->fullKey()));
+               if (msgLvl(out,MSG::DEBUG)) out << MSG::DEBUG << " addDependency new input for " << parent_alg->name() << " "
+                                               << a_handle->fullKey().className() << " / " <<  a_handle->objKey() << endmsg;
+            }
+            output_data_out.reserve(output_data_out.size()+tmp_new_output_handles.size());
+            for (Gaudi::DataHandle *a_handle : tmp_new_output_handles) {
+               parent_alg->addDependency(a_handle->fullKey(), Gaudi::DataHandle::Writer);
+               output_data_out.push_back(&(a_handle->fullKey()));
+               if (msgLvl(out,MSG::DEBUG)) out << MSG::DEBUG << " addDependency new output for " << parent_alg->name() << " "
+                                               << a_handle->fullKey().className() << " / "  << a_handle->objKey() << endmsg;
+            }
          }
       }
       return updated;