diff --git a/common/log/TimingList.cpp b/common/log/TimingList.cpp
index ca6c6ecf9e597d1e689acea2f15a0fea24f01ff2..c970717e5881a92c8cc84acdb1d976caef2db4ee 100644
--- a/common/log/TimingList.cpp
+++ b/common/log/TimingList.cpp
@@ -31,14 +31,31 @@ void TimingList::addToLog(ScopedParamContainer& spc) {
   }
 }
 
-void TimingList::insert(const std::string& name, double value) {
-  push_back(std::make_tuple(name, value));
+double& TimingList::at(const std::string& name) {
+  for (auto &e: *this) {
+    if (std::get<0>(e) == name) return std::get<1>(e);
+  }
+  throw std::out_of_range("In TimingList::at(): no such element.");
+}
+
+
+void TimingList::insertOrIncrement(const std::string& name, double value) {
+  try {
+    at(name)+=value;
+  } catch (std::out_of_range&) {
+    push_back(std::make_tuple(name, value));
+  }
+}
+
+void TimingList::insOrIncAndReset(const std::string& name, utils::Timer& t) {
+  insertOrIncrement(name, t.secs(utils::Timer::resetCounter));
 }
 
 void TimingList::insertAndReset(const std::string& name, utils::Timer& t) {
   push_back(std::make_tuple(name, t.secs(utils::Timer::resetCounter)));
 }
 
+
 TimingList& TimingList::operator+=(const TimingList& other) {
   for (auto & ot: other) {
     std::string oName;
diff --git a/common/log/TimingList.hpp b/common/log/TimingList.hpp
index 733adbafe5897b17591851bbc2c5fb5042dfd14e..b8436d485d931f109352fce3854a0d7f17172a16 100644
--- a/common/log/TimingList.hpp
+++ b/common/log/TimingList.hpp
@@ -32,10 +32,13 @@ class ScopedParamContainer;
 
 class TimingList: public std::list<std::tuple<std::string, double>> {
 public:
-  void insert(const std::string &, double);
+  void insertOrIncrement(const std::string &, double);
+  void insOrIncAndReset(const std::string&, utils::Timer &);
   void insertAndReset(const std::string&, utils::Timer &);
   TimingList & operator+= (const TimingList &);
   void addToLog(ScopedParamContainer &);
+private:
+  double & at(const std::string&);
 };
 
 }} // namespace cta::log
\ No newline at end of file