diff --git a/Calorimeter/CaloConditions/CaloConditions/CaloLocalHadCoeff.h b/Calorimeter/CaloConditions/CaloConditions/CaloLocalHadCoeff.h
index 8277101a17b43fdc08d15bb0052d5a5339526daf..6951cddbd9d85f99fd833d5cd703e67e8dedc331 100644
--- a/Calorimeter/CaloConditions/CaloConditions/CaloLocalHadCoeff.h
+++ b/Calorimeter/CaloConditions/CaloConditions/CaloLocalHadCoeff.h
@@ -309,4 +309,6 @@ CLASS_DEF( CondCont<CaloLocalHadCoeff> , 82862607 , 1 )
 #include "SGTools/BaseInfo.h"
 SG_BASE( CondCont<CaloLocalHadCoeff>, CondContBase );
 
+REGISTER_CC( CaloLocalHadCoeff  )
+
 #endif
diff --git a/Calorimeter/CaloExample/CaloHiveEx/share/CaloHiveExOpts.py b/Calorimeter/CaloExample/CaloHiveEx/share/CaloHiveExOpts.py
index 6c08672b7976c9fd1e66ae6e3af14b3b003fee50..2881957c00056d3c49a88e332a9ed49363059638 100644
--- a/Calorimeter/CaloExample/CaloHiveEx/share/CaloHiveExOpts.py
+++ b/Calorimeter/CaloExample/CaloHiveEx/share/CaloHiveExOpts.py
@@ -4,6 +4,8 @@
 
 from AthenaCommon.AlgSequence import AlgSequence
 topSequence = AlgSequence()
+from AthenaCommon.AlgSequence import AthSequencer 
+condSeq = AthSequencer("AthCondSeq") 
 
 #---------------------------------------------------------------------------------#
 # MT-specific code
@@ -55,7 +57,7 @@ topSequence+=xAODMaker__EventInfoCnvAlg()
 # NEW Conditions access infrastructure
 #
 from IOVSvc.IOVSvcConf import CondInputLoader
-topSequence += CondInputLoader( "CondInputLoader", OutputLevel=DEBUG,  )
+condSeq += CondInputLoader( "CondInputLoader", OutputLevel=DEBUG )
 
 import StoreGate.StoreGateConf as StoreGateConf
 svcMgr += StoreGateConf.StoreGateSvc("ConditionStore")
diff --git a/Calorimeter/CaloRec/src/CaloClusterMaker.cxx b/Calorimeter/CaloRec/src/CaloClusterMaker.cxx
index f6bdf2a0a8fd5d1a17c1f19de09eec66e2c657f5..0632c26551343ba7bb621dec0bc5734127ebd218 100644
--- a/Calorimeter/CaloRec/src/CaloClusterMaker.cxx
+++ b/Calorimeter/CaloRec/src/CaloClusterMaker.cxx
@@ -89,23 +89,23 @@ CaloClusterMaker::~CaloClusterMaker()
 
 StatusCode CaloClusterMaker::initialize()
 {
-  //Retrieve maker tools
-  for (auto tool :  m_clusterMakerTools) {
-    StatusCode sc=tool.retrieve();
-    if (sc.isFailure())
-      ATH_MSG_ERROR("Failed to retrieve maker tool " << tool);
-    else
-      ATH_MSG_DEBUG("Successfully retrieved maker tool " << tool);
-  }//end loop over maker tools
 
+
+  if (m_clusterMakerTools.retrieve().isFailure()) {
+    ATH_MSG_ERROR("Failed to retrieve maker ToolHandleArray "
+                  << m_clusterMakerTools);
+  } else {
+    ATH_MSG_DEBUG("Successfully retrieved maker ToolHandleArray "
+                  << m_clusterMakerTools);
+  }
   
-  for (auto tool :  m_clusterCorrectionTools) {
-     StatusCode sc=tool.retrieve();
-    if (sc.isFailure())
-      ATH_MSG_ERROR("Failed to retrieve correction tool " << tool);
-    else
-      ATH_MSG_DEBUG("Successfully retrieved correction tool " << tool);
-  }//end loop over correction tools
+  if (m_clusterCorrectionTools.retrieve().isFailure()) {
+    ATH_MSG_ERROR("Failed to retrieve correction ToolHandleArray "
+                  << m_clusterCorrectionTools);
+  } else {
+    ATH_MSG_DEBUG("Successfully retrieved correction ToolHandleArray "
+                  << m_clusterCorrectionTools);
+  }
 
   if (m_chronoTools) {
     msg(MSG::INFO) << "Will use ChronoStatSvc to monitor ClusterMaker and ClusterCorrection tools" << endmsg;
diff --git a/Control/AthenaBaseComps/AthenaBaseComps/AthFilterAlgorithm.h b/Control/AthenaBaseComps/AthenaBaseComps/AthFilterAlgorithm.h
index 8f3c8dd508856917e76ea138bd8cb4aa75a48187..cdacea9352d19a93e1aeea606df058a73feb1e48 100644
--- a/Control/AthenaBaseComps/AthenaBaseComps/AthFilterAlgorithm.h
+++ b/Control/AthenaBaseComps/AthenaBaseComps/AthFilterAlgorithm.h
@@ -51,7 +51,7 @@ class AthFilterAlgorithm
   virtual StatusCode sysInitialize();
   
   /// Set the filter passed flag to the specified state
-  virtual void setFilterPassed( bool state );
+  virtual void setFilterPassed( bool state ) const;
 
   /// @brief helper method to ease the setting of this filter's description
   /// in derived classes
diff --git a/Control/AthenaBaseComps/src/AthFilterAlgorithm.cxx b/Control/AthenaBaseComps/src/AthFilterAlgorithm.cxx
index 348312a570bc372f146d614d9141b07bf7eef86f..312403758b8c425afc32218dd3177a14ed3f8cb9 100644
--- a/Control/AthenaBaseComps/src/AthFilterAlgorithm.cxx
+++ b/Control/AthenaBaseComps/src/AthFilterAlgorithm.cxx
@@ -96,7 +96,7 @@ AthFilterAlgorithm::sysInitialize()
 
 /// Set the filter passed flag to the specified state
 void
-AthFilterAlgorithm::setFilterPassed( bool state )
+AthFilterAlgorithm::setFilterPassed( bool state ) const
 {
   AthAlgorithm::setFilterPassed(state);
 
diff --git a/Control/AthenaCommon/python/AppMgr.py b/Control/AthenaCommon/python/AppMgr.py
index 89bfcae52fd482d885e9f578534bd7cd87855f98..33ae6d0ba62569761fc307a8cb7a8629a3498082 100755
--- a/Control/AthenaCommon/python/AppMgr.py
+++ b/Control/AthenaCommon/python/AppMgr.py
@@ -306,8 +306,19 @@ class AthAppMgr( AppMgr ):
 
          # XXX: should we discard empty sequences ?
          #      might save some CPU and memory...
-         athAllAlgSeq += athCondSeq
-         athAllAlgSeq += athAlgSeq
+
+         # ensure that the CondInputLoader gets initialized after all
+         # other user Algorithms for MT so that base classes of data deps
+         # can be correctly determined. In MT, the order of execution
+         # is irrelevant (determined by data deps). But for serial, we 
+         # need the CondAlgs to execute first, so the ordering changes.
+         from AthenaCommon.ConcurrencyFlags import jobproperties as jp
+         if ( jp.ConcurrencyFlags.NumThreads() > 0 ) :
+            athAllAlgSeq += athAlgSeq
+            athAllAlgSeq += athCondSeq
+         else:
+            athAllAlgSeq += athCondSeq
+            athAllAlgSeq += athAlgSeq
 
          athAlgEvtSeq += athBeginSeq
          athAlgEvtSeq += athAllAlgSeq
diff --git a/Control/AthenaExamples/AthExHive/src/CondAlgX.cxx b/Control/AthenaExamples/AthExHive/src/CondAlgX.cxx
index ecfe2ea94d60262f3023e7b58e778ecd22202255..4b6eed6f9ff7ce0d3bed99830b2faa65013d014b 100644
--- a/Control/AthenaExamples/AthExHive/src/CondAlgX.cxx
+++ b/Control/AthenaExamples/AthExHive/src/CondAlgX.cxx
@@ -49,7 +49,7 @@ StatusCode CondAlgX::initialize() {
     return StatusCode::FAILURE;
   }
 
-  if (m_cs->regHandle(this, m_wchk, m_wchk.dbKey()).isFailure()) {
+  if (m_cs->regHandle(this, m_wchk).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_wchk.fullKey() 
                   << " with CondSvc");
     return StatusCode::FAILURE;
diff --git a/Control/AthenaExamples/AthExHive/src/CondAlgY.cxx b/Control/AthenaExamples/AthExHive/src/CondAlgY.cxx
index 49b0456cab7adfe1fe07bae164a801a91f58ed6e..a8522719513dd76a768ca1338bc090f066dbe5bb 100644
--- a/Control/AthenaExamples/AthExHive/src/CondAlgY.cxx
+++ b/Control/AthenaExamples/AthExHive/src/CondAlgY.cxx
@@ -49,13 +49,13 @@ StatusCode CondAlgY::initialize() {
     return StatusCode::FAILURE;
   }
 
-  if (m_cs->regHandle(this, m_wch1, m_wch1.dbKey()).isFailure()) {
+  if (m_cs->regHandle(this, m_wch1).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_wch1.fullKey() 
                   << " with CondSvc");
     return StatusCode::FAILURE;
   }
 
-  if (m_cs->regHandle(this, m_wch2, m_wch2.dbKey()).isFailure()) {
+  if (m_cs->regHandle(this, m_wch2).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_wch2.fullKey() 
                   << " with CondSvc");
     return StatusCode::FAILURE;
diff --git a/Control/AthenaKernel/AthenaKernel/CondCont.h b/Control/AthenaKernel/AthenaKernel/CondCont.h
index 2492e8174a5d6a5bc6a234ede16366b878cd62be..8bb627788f145f294ab5275d10f3297c38ffe768 100644
--- a/Control/AthenaKernel/AthenaKernel/CondCont.h
+++ b/Control/AthenaKernel/AthenaKernel/CondCont.h
@@ -1,8 +1,7 @@
-// This file's extension implies that it's C, but it's really -*- C++ -*-.
 /*
  * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
  */
-// $Id$
+//
 /**
  * @file AthenaKernel/CondCont.h
  * @author Vakho, Charles, Scott
@@ -403,12 +402,13 @@ protected:
                                   EventIDRange* r) const override;
 
 
-private:
+public:
 
   /// Helper to ensure that the inheritance information for this class
   /// gets initialized.
   static void registerBaseInit();
 
+private:
 
   /// Mutex used to protect the container.
   typedef std::mutex mutex_t;
@@ -431,6 +431,8 @@ private:
 
 #include "AthenaKernel/CondCont.icc"
 
+#include "AthenaKernel/CondContMaker.h"
+#define REGISTER_CC(T) static CondContainer::CondContMaker<T> maker_ ## T{};
 
 #endif // not ATHENAKERNEL_CONDCONT_H
 
diff --git a/Control/AthenaKernel/AthenaKernel/CondContFactory.h b/Control/AthenaKernel/AthenaKernel/CondContFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..abc4205918e3b8e5b42ad50e70b248b967f988cf
--- /dev/null
+++ b/Control/AthenaKernel/AthenaKernel/CondContFactory.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+#ifndef ATHENAKERNEL_CONDCONTFACT_H
+#define ATHENAKERNEL_CONDCONTFACT_H 1
+
+#include "AthenaKernel/ICondContMaker.h"
+
+#include <map>
+#include <string>
+#include <mutex>
+
+class CondContBase;
+
+namespace CondContainer {
+  class CondContFactory {
+  public:
+    static CondContFactory& Instance();
+    void regMaker(const CLID& clid, ICondContMaker* maker);
+    CondContBase* Create(const CLID& clid, const std::string& key) const;
+    
+  private:
+    CondContFactory(){}
+    
+    CondContFactory(const CondContFactory&);
+    CondContFactory& operator=(const CondContFactory&);
+    
+    std::map<CLID, ICondContMaker*> m_makers;
+    mutable std::mutex m_mapMutex;
+  };
+}
+
+#endif
diff --git a/Control/AthenaKernel/AthenaKernel/CondContMaker.h b/Control/AthenaKernel/AthenaKernel/CondContMaker.h
new file mode 100644
index 0000000000000000000000000000000000000000..0cbbe68b9b34ee7fe89bfd52c3710e6ce1802277
--- /dev/null
+++ b/Control/AthenaKernel/AthenaKernel/CondContMaker.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+#ifndef ATHENAKERNEL_CONDCONTMAKER_H
+#define ATHENAKERNEL_CONDCONTMAKER_H 1
+
+#include "AthenaKernel/ICondContMaker.h"
+#include "AthenaKernel/CondContFactory.h"
+#include "AthenaKernel/ClassID_traits.h"
+#include "GaudiKernel/DataObjID.h"
+
+class CondContBase;
+
+namespace CondContainer {
+  template <typename T>
+  class CondContMaker : public ICondContMaker {
+  public:
+    CondContMaker() {
+      CondContFactory::Instance().regMaker( ClassID_traits<T>::ID() , this );
+    }
+    
+    virtual CondContBase* Create(const CLID& clid, const std::string& key)  const {
+      DataObjID id(clid,key);
+      
+      return new CondCont<T>(id);
+    }
+  };
+}
+
+
+#endif
+
diff --git a/Control/AthenaKernel/AthenaKernel/ICondContMaker.h b/Control/AthenaKernel/AthenaKernel/ICondContMaker.h
new file mode 100644
index 0000000000000000000000000000000000000000..3eda36d3e46ec9a54e9a7bfe19d085789e775180
--- /dev/null
+++ b/Control/AthenaKernel/AthenaKernel/ICondContMaker.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+
+#ifndef ATHENAKERNEL_ICONDCONTMAKER_H
+#define ATHENAKERNEL_ICONDCONTMAKER_H 1
+
+#include <string>
+#include "GaudiKernel/ClassID.h"
+
+class CondContBase;
+
+namespace CondContainer {
+
+  class ICondContMaker {
+  public:
+    virtual CondContBase* Create(const CLID& clid, const std::string& key) const = 0;
+    virtual ~ICondContMaker() {}
+  };
+}
+
+#endif
diff --git a/Control/AthenaKernel/share/CondCont_test.ref b/Control/AthenaKernel/share/CondCont_test.ref
index cc5a924c7a3e31f7009a1bb25f1b5c0654157317..b230d82d52c2ae66e44f26bc366fc14eee3e6a09 100644
--- a/Control/AthenaKernel/share/CondCont_test.ref
+++ b/Control/AthenaKernel/share/CondCont_test.ref
@@ -1,5 +1,5 @@
 test1
-CondCont<T>::insert error: EventIDRange {[40,4294967295,l:2] - [4294967295,4294967295,543:0]} is neither fully RunEvent nor TimeStamp
+CondCont<T>::insert error: EventIDRange {[40,l:2] - [4294967295,t:543]} is neither fully RunEvent nor TimeStamp
 test2
-CondCont<T>::insert error: EventIDRange {[40,4294967295,l:2] - [4294967295,4294967295,543:0]} is neither fully RunEvent nor TimeStamp
+CondCont<T>::insert error: EventIDRange {[40,l:2] - [4294967295,t:543]} is neither fully RunEvent nor TimeStamp
 CondCont<T>::insert error: Not most-derived class.
diff --git a/Control/AthenaKernel/src/CondContFactory.cxx b/Control/AthenaKernel/src/CondContFactory.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..cc86c40d4e6693631c70a90997364a7aea7b0efb
--- /dev/null
+++ b/Control/AthenaKernel/src/CondContFactory.cxx
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+
+#include "AthenaKernel/CondContFactory.h"
+#include "AthenaKernel/CondCont.h"
+#include "CxxUtils/checker_macros.h"
+#include <sstream>
+#include <stdexcept>
+
+using namespace CondContainer;
+
+CondContFactory& CondContFactory::Instance() {
+  static CondContFactory factory ATLAS_THREAD_SAFE;
+  return factory;
+}
+
+void CondContFactory::regMaker(const CLID& key, ICondContMaker* maker) {
+  std::lock_guard<std::mutex> guard(m_mapMutex);
+  if (m_makers.find(key) != m_makers.end()) {
+    //    std::cerr << "multiple makers for CLID " << key << std::endl;
+  } else {
+    m_makers[key] = maker;
+  }
+}
+
+CondContBase* CondContFactory::Create( const CLID& clid, const std::string& key ) const {
+  std::lock_guard<std::mutex> guard(m_mapMutex);
+  auto i = m_makers.find(clid);
+  if ( i == m_makers.end()) {
+    return nullptr;
+  }
+  ICondContMaker* maker = i->second;
+  return maker->Create(clid,key);
+}
diff --git a/Control/AthenaKernel/test/CondCont_test.cxx b/Control/AthenaKernel/test/CondCont_test.cxx
index a3a938bdf2f2ddaa3955c8a33372e8046c01a901..93aabbee8446867cf64c0f08876e7b7d9485507e 100644
--- a/Control/AthenaKernel/test/CondCont_test.cxx
+++ b/Control/AthenaKernel/test/CondCont_test.cxx
@@ -55,7 +55,7 @@ CLASS_DEF(CondCont<D>, 932847547, 0)
 EventIDBase runlbn (int run, int lbn)
 {
   return EventIDBase (run,
-                      EventIDBase::UNDEFNUM,  // event
+                      EventIDBase::UNDEFEVT,  // event
                       EventIDBase::UNDEFNUM,  // timestamp
                       EventIDBase::UNDEFNUM,  // timestamp ns
                       lbn);
@@ -65,13 +65,13 @@ EventIDBase runlbn (int run, int lbn)
 EventIDBase timestamp (int t)
 {
   return EventIDBase (EventIDBase::UNDEFNUM,  // run
-                      EventIDBase::UNDEFNUM,  // event
+                      EventIDBase::UNDEFEVT,  // event
                       t);
 }
 
 
 const EventIDRange r1 (runlbn (10, 15), runlbn (10, 20));
-const EventIDRange r2 (runlbn (20, 17), runlbn (EventIDBase::UNDEFNUM/2, EventIDBase::UNDEFNUM));
+const EventIDRange r2 (runlbn (20, 17), runlbn (EventIDBase::UNDEFNUM/2, EventIDBase::UNDEFNUM/2));
 const EventIDRange r3 (timestamp (123), timestamp (456));
 
 
@@ -103,10 +103,13 @@ RE: [0]\n");
   std::ostringstream exp2;
   exp2 << "id: ('key')  proxy: 0\n"
        << "clock: [1]\n"
-       << "{[4294967295,4294967295,123:0] - [4294967295,4294967295,456:0]} " << ptrs[2] << "\n"
+       << "{[4294967295,t:123] - [4294967295,t:456]} " << ptrs[2] << "\n"
        << "RE: [2]\n"
-       << "{[20,4294967295,l:17] - [2147483647,4294967295]} " << ptrs[1] << "\n"
-       << "{[10,4294967295,l:15] - [10,4294967295,l:20]} " << ptrs[0] << "\n";
+       << "{[20,l:17] - [2147483647,l:2147483647]} " << ptrs[1] << "\n"
+       << "{[10,l:15] - [10,l:20]} " << ptrs[0] << "\n";
+
+  //  std::cout << "ss2: " << ss2.str() << "\nexp2: " << exp2.str() << "\n";
+
   assert (ss2.str() == exp2.str());
 
   auto t4 = std::make_unique<T> (4);
diff --git a/Control/AthenaServices/src/AthenaEventLoopMgr.cxx b/Control/AthenaServices/src/AthenaEventLoopMgr.cxx
index 6d1c4bace951e9917c16841bb0410ecad237b6b4..a7da9750076c3fb92315e6dfcfc3335186b190da 100644
--- a/Control/AthenaServices/src/AthenaEventLoopMgr.cxx
+++ b/Control/AthenaServices/src/AthenaEventLoopMgr.cxx
@@ -635,8 +635,7 @@ StatusCode AthenaEventLoopMgr::executeAlgorithms(const EventContext& ctx) {
     // this duplicates what is already done in Algorithm::sysExecute, which
     // calls Algorithm::setExecuted, but eventually we plan to remove that 
     // function
-    m_aess->algExecState(*ita,ctx).setExecuted(true);
-    m_aess->algExecState(*ita,ctx).setExecStatus(sc);
+    m_aess->algExecState(*ita,ctx).setState(AlgExecState::State::Done, sc);
     if ( !sc.isSuccess() ) {
       m_msg << MSG::INFO  << "Execution of algorithm "
 	    << (*ita)->name() << " failed with StatusCode::" << sc
diff --git a/Control/AthenaServices/src/AthenaHiveEventLoopMgr.cxx b/Control/AthenaServices/src/AthenaHiveEventLoopMgr.cxx
index f24be10c1853f8edf07332e2ae475ef6757fdad3..7492069ec7c73654eca9d5062484471880566831 100644
--- a/Control/AthenaServices/src/AthenaHiveEventLoopMgr.cxx
+++ b/Control/AthenaServices/src/AthenaHiveEventLoopMgr.cxx
@@ -116,6 +116,8 @@ AthenaHiveEventLoopMgr::AthenaHiveEventLoopMgr(const std::string& nam,
   declareProperty("FakeTimestampInterval", m_timeStampInt = 1,
                   "timestamp interval between events when creating Events "
                   "without an EventSelector");
+  declareProperty("ShowTimestamp", m_showTimeStamp = false,
+                  "show timestamp in heartbeat");
 
   m_scheduledStop = false;
 
@@ -730,17 +732,29 @@ StatusCode AthenaHiveEventLoopMgr::executeEvent(void* createdEvts_IntPtr )
   m_doEvtHeartbeat = (m_eventPrintoutInterval.value() > 0 && 
 		 0 == (m_nev % m_eventPrintoutInterval.value()));
   if (m_doEvtHeartbeat)  {
-   if(!m_useTools) 
-     m_msg << MSG::INFO
-           << "  ===>>>  start processing event #" << evtNumber << ", run #" << m_currentRun 
-           << " on slot " << evtContext->slot() << ",  " << m_proc 
-           << " events processed so far  <<<===" << endmsg;
-   else 
-     m_msg << MSG::INFO
-           << "  ===>>>  start processing event #" << evtNumber << ", run #" << m_currentRun 
-           << " on slot " << evtContext->slot() << ",  " 
-           << m_nev << " events read and " << m_proc 
-           << " events processed so far  <<<===" << endmsg;   
+    if(!m_useTools) {
+      m_msg << MSG::INFO
+            << "  ===>>>  start processing event #" << evtNumber 
+            << ", run #" << m_currentRun;
+      if (m_showTimeStamp && pEvent->event_ID()->isTimeStamp()) {
+        m_msg << " [t=" << pEvent->event_ID()->time_stamp() << ".";
+        if (pEvent->event_ID()->time_stamp_ns_offset() != 0) {
+          m_msg << std::setfill('0') << std::setw(9);
+        } else {
+          m_msg << "0";
+        }
+        m_msg << "]";
+      }
+      m_msg << " on slot " << evtContext->slot() << ",  " << m_proc 
+            << " events processed so far  <<<===" << endmsg;
+    } else  {
+      m_msg << MSG::INFO
+            << "  ===>>>  start processing event #" << evtNumber 
+            << ", run #" << m_currentRun 
+            << " on slot " << evtContext->slot() << ",  " 
+            << m_nev << " events read and " << m_proc 
+            << " events processed so far  <<<===" << endmsg;   
+    }
   }
 
   // Reset the timeout singleton
diff --git a/Control/AthenaServices/src/AthenaHiveEventLoopMgr.h b/Control/AthenaServices/src/AthenaHiveEventLoopMgr.h
index 9eeee04c629c4e9eb76801e5b55e6b99f05e4d3c..85fc9bb521208f6ee3849dda12d81d8faf99430e 100644
--- a/Control/AthenaServices/src/AthenaHiveEventLoopMgr.h
+++ b/Control/AthenaServices/src/AthenaHiveEventLoopMgr.h
@@ -284,6 +284,7 @@ private:
   bool m_doEvtHeartbeat;
 
   unsigned int m_flmbi, m_timeStampInt;
+  bool m_showTimeStamp;
 
   // from MinimalEventLoopMgr
 public:
diff --git a/Control/AthenaServices/src/DecisionSvc.cxx b/Control/AthenaServices/src/DecisionSvc.cxx
index 8b908983aab9e2033e907ec5a35b6291f7cc04d2..0984f387801b5b29a8ca595f20f0c3422ebbaaf5 100644
--- a/Control/AthenaServices/src/DecisionSvc.cxx
+++ b/Control/AthenaServices/src/DecisionSvc.cxx
@@ -345,7 +345,7 @@ DecisionSvc::isEventAccepted( const std::string& stream,
       result = false;
       for (auto it = vecAlgs.begin(); it != vecAlgs.end(); it++) {
         bool isE,fp;
-        isE = m_algstateSvc->algExecState(*it,ectx).isExecuted();
+        isE = (m_algstateSvc->algExecState(*it,ectx).state() == AlgExecState::State::Done);
         fp = m_algstateSvc->algExecState(*it,ectx).filterPassed();
         if (isE && fp) {
 	  result = true;
@@ -368,7 +368,7 @@ DecisionSvc::isEventAccepted( const std::string& stream,
     if ( ! vecAlgs.empty( ) ) {
       for (auto it = vecAlgs.begin(); it != vecAlgs.end(); it++) {
         bool isE,fp;
-        isE = m_algstateSvc->algExecState(*it,ectx).isExecuted();
+        isE = (m_algstateSvc->algExecState(*it,ectx).state() == AlgExecState::State::Done);
         fp = m_algstateSvc->algExecState(*it,ectx).filterPassed();
         if (!isE || !fp) {
           result = false;
@@ -391,7 +391,7 @@ DecisionSvc::isEventAccepted( const std::string& stream,
     if ( ! vecAlgs.empty( ) ) {
       for (auto it = vecAlgs.begin(); it != vecAlgs.end(); it++) {
         bool isE,fp;
-        isE = m_algstateSvc->algExecState(*it,ectx).isExecuted();
+        isE = (m_algstateSvc->algExecState(*it,ectx).state() == AlgExecState::State::Done);
         fp = m_algstateSvc->algExecState(*it,ectx).filterPassed();
 	if ( isE && fp ) {
           result = false;
diff --git a/Control/IOVSvc/IOVSvc/CondSvc.h b/Control/IOVSvc/IOVSvc/CondSvc.h
index bdc1e5ddd8137a637d3e2fdaa77348e593fa94ea..de8790b8b72582c6fd1a352ecbc92a67b8b1de25 100644
--- a/Control/IOVSvc/IOVSvc/CondSvc.h
+++ b/Control/IOVSvc/IOVSvc/CondSvc.h
@@ -16,6 +16,9 @@
 #include <vector>
 #include <mutex>
 
+class ConditionSlotFuture;
+class ICondtionIOSvc;
+
 class CondSvc: public extends1<AthService, ICondSvc> {
 public:
 
@@ -28,8 +31,8 @@ public:
 
   // from ICondSvc
 public:
-  virtual StatusCode regHandle(IAlgorithm* alg, const Gaudi::DataHandle& id, 
-                               const std::string& key);
+  virtual StatusCode regHandle(IAlgorithm* alg, const Gaudi::DataHandle& id);
+  //                               const std::string& key);
 
   virtual bool getInvalidIDs(const EventContext&, DataObjIDColl& ids);
   virtual bool getValidIDs(const EventContext&, DataObjIDColl& ids);
@@ -40,10 +43,28 @@ public:
   virtual const std::set<IAlgorithm*>& condAlgs() const { return m_condAlgs; }
 
   virtual bool isRegistered(const DataObjID&) const;
+  virtual bool isRegistered(IAlgorithm*) const;
+  
   virtual const DataObjIDColl& conditionIDs() const;
 
-  virtual void dump() const;
-  virtual void dump(std::ostringstream&) const;
+  //  virtual void dump() const;
+  virtual void dump(std::ostream&) const;
+
+public:
+  // unimplemented interfaces
+  
+  /// Asynchronously setup conditions
+  virtual ConditionSlotFuture* startConditionSetup(const EventContext&) {
+    return nullptr;
+  }
+
+  /// register an IConditionIOSvc (alternative to Algorithm processing of 
+  /// Conditions)
+  virtual StatusCode registerConditionIOSvc(IConditionIOSvc*) {
+    return StatusCode::FAILURE;
+  }
+
+  
 
 private:
 
@@ -73,7 +94,7 @@ private:
   id_map_t  m_idMap;
   alg_map_t m_algMap;
 
-  std::map<std::string, DataObjID> m_keyMap;
+  //  std::map<std::string, DataObjID> m_keyMap;
   std::set<IAlgorithm*> m_condAlgs;
 
   DataObjIDColl m_condIDs;
diff --git a/Control/IOVSvc/src/CondInputLoader.cxx b/Control/IOVSvc/src/CondInputLoader.cxx
index f089c16d7bf4a1e0371537dac210c75d6030a828..4fb6be672dfb76f5491fb2a1f4dfdb0b03a7ba53 100644
--- a/Control/IOVSvc/src/CondInputLoader.cxx
+++ b/Control/IOVSvc/src/CondInputLoader.cxx
@@ -12,14 +12,18 @@
 
 // FrameWork includes
 #include "GaudiKernel/Property.h"
+#include "GaudiKernel/IClassIDSvc.h"
 #include "StoreGate/ReadHandle.h"
 #include "AthenaKernel/errorcheck.h"
 #include "AthenaKernel/IOVTime.h"
 #include "AthenaKernel/IOVRange.h"
 #include "AthenaKernel/IIOVDbSvc.h"
 #include "AthenaKernel/IIOVSvc.h"
+#include "StoreGate/CondHandleKey.h"
+#include "AthenaKernel/CondContMaker.h"
 
 #include "xAODEventInfo/EventInfo.h"
+#include "SGTools/BaseInfo.h"
 
 /////////////////////////////////////////////////////////////////// 
 // Public methods: 
@@ -29,10 +33,11 @@
 ////////////////
 CondInputLoader::CondInputLoader( const std::string& name, 
                                   ISvcLocator* pSvcLocator ) : 
-  ::AthAlgorithm( name, pSvcLocator ), m_dump(false),
+  ::AthAlgorithm( name, pSvcLocator ),
   m_condStore("StoreGateSvc/ConditionStore", name),
   m_condSvc("CondSvc",name),
-  m_IOVSvc("IOVSvc",name)
+  m_IOVSvc("IOVSvc",name),
+  m_clidSvc("ClassIDSvc",name)
 
 {
   //
@@ -48,7 +53,6 @@ CondInputLoader::CondInputLoader( const std::string& name,
 
   declareProperty( "Load", m_load); 
   //->declareUpdateHandler(&CondInputLoader::loader, this);
-  declareProperty( "ShowEventDump", m_dump=false);
 }
 
 // Destructor
@@ -90,13 +94,19 @@ CondInputLoader::initialize()
     return StatusCode::FAILURE;
   }
 
+  ServiceHandle<IClassIDSvc> m_clidSvc("ClassIDSvc", name());
+  if (!m_clidSvc.isValid()) {
+    ATH_MSG_FATAL("unable to retrieve ClassIDSvc");
+    return StatusCode::FAILURE;
+  }
+
   std::vector<std::string> keys = idb->getKeyList();
   std::string folderName, tg;
   IOVRange range;
   bool retrieved;
   unsigned long long br;
   float rt;
-  DataObjIDColl loadCopy;
+  DataObjIDColl handles_to_load;
 
   std::map<std::string,std::string> folderKeyMap;
   for (auto key : keys) {
@@ -118,9 +128,13 @@ CondInputLoader::initialize()
     // } else {
     //   ATH_MSG_DEBUG(" not remapping folder " << id.key());
     }
-    SG::VarHandleKey vhk(id.clid(),id.key(),Gaudi::DataHandle::Writer, 
+    if (id.key() == "") {
+      ATH_MSG_INFO("ignoring blank key for " << id );
+      continue;
+    }
+    SG::VarHandleKey vhk(id.clid(),id.key(),Gaudi::DataHandle::Writer,
                          StoreID::storeName(StoreID::CONDITION_STORE));
-    loadCopy.emplace(vhk.fullKey());
+    handles_to_load.emplace(vhk.fullKey());
   }
 
   // for (auto key : keys) {
@@ -130,7 +144,7 @@ CondInputLoader::initialize()
   //       if (id.key() == folderName) {
   //         ATH_MSG_DEBUG("  mapping folder " << folderName << "  to SGkey " << key );
   //         id.updateKey( key );
-  //         loadCopy.insert(id);
+  //         handles_to_load.insert(id);
   //         m_keyFolderMap[key] = folderName;
   //         break;
   //       }
@@ -140,7 +154,40 @@ CondInputLoader::initialize()
   //   }
   // }
 
-  m_load = loadCopy;
+  m_load = handles_to_load;
+  m_handlesToCreate = handles_to_load;
+
+  // Add in all the base classes known to StoreGate, in case a handle
+  // is read via its base class. These will be added to the output deps,
+  // and also registered with the CondSvc, as the scheduler needs this
+  // info.
+
+  std::ostringstream ost;
+  ost << "Adding base classes:";
+  for (auto &e : handles_to_load) {
+    // ignore empty keys
+    if (e.key() == "") continue;
+
+    ost << "\n  + " << e  << "  ->";
+    CLID clid = e.clid();
+    const SG::BaseInfoBase* bib = SG::BaseInfoBase::find( clid );
+    if ( ! bib ) {
+      ost << " no bases";
+    } else {
+      for (CLID clid2 : bib->get_bases()) {
+        if (clid2 != clid) {
+          std::string base("UNKNOWN");
+          m_clidSvc->getTypeNameOfID(clid2,base).ignore();
+          ost << " " << base << " (" << clid2 << ")";
+          SG::VarHandleKey vhk(clid2,e.key(),Gaudi::DataHandle::Writer,
+                               StoreID::storeName(StoreID::CONDITION_STORE));
+          m_load.emplace(vhk.fullKey());
+        }
+      }
+    }
+  }
+  ATH_MSG_INFO(ost.str());
+
 
   // Update the properties, set the ExtraOutputs for Alg deps
   const Property &p = getProperty("Load");
@@ -162,7 +209,7 @@ CondInputLoader::initialize()
     } else {
       SG::VarHandleKey vhk(e.clid(),e.key(),Gaudi::DataHandle::Writer,
                            StoreID::storeName(StoreID::CONDITION_STORE));
-      if (m_condSvc->regHandle(this, vhk, e.key()).isFailure()) {
+      if (m_condSvc->regHandle(this, vhk).isFailure()) {
         ATH_MSG_ERROR("Unable to register WriteCondHandle " << vhk.fullKey());
         sc = StatusCode::FAILURE;
       }
@@ -170,7 +217,6 @@ CondInputLoader::initialize()
       m_IOVSvc->ignoreProxy(vhk.fullKey().clid(), vhk.key());
     }
   }
-
   ATH_MSG_INFO(str.str());
 
   return sc;
@@ -188,34 +234,72 @@ CondInputLoader::finalize()
 
 //-----------------------------------------------------------------------------
 
-StatusCode 
-CondInputLoader::execute()
-{  
-  ATH_MSG_DEBUG ("Executing " << name() << "...");
+StatusCode
+CondInputLoader::start()
+{
+  //
+  // now create the CondCont<T>. This has to be done after initialize(), 
+  // as we need to make sure that all Condition Objects have been instantiated
+  // so as to fill the static condition obj registry via REGISTER_CC
+  //
+  // we use a VHK to store the info instead of a DataObjIDColl, as this saves
+  // us the trouble of stripping out the storename from the key later.
+  //
 
-  if (m_first) {
-    DataObjIDColl::iterator itr;
-    for (itr = m_load.begin(); itr != m_load.end(); ++itr) {
-      SG::VarHandleKey vhk(itr->clid(),itr->key(),Gaudi::DataHandle::Reader);
-      if ( ! m_condStore->contains<CondContBase>( vhk.key() ) ){
-        ATH_MSG_INFO("ConditionStore does not contain a CondCont<> of "
-                     << *itr << "  (key: " << vhk.key() << ") "
-                     << ". Either a ReadCondHandle was not initialized or "
-                     << "no other Algorithm is using this Handle");
+  DataObjIDColl::iterator ditr;
+  bool fail(false);
+  for (ditr = m_handlesToCreate.begin(); ditr != m_handlesToCreate.end(); ++ditr) {
+    SG::VarHandleKey vhk(ditr->clid(),ditr->key(),Gaudi::DataHandle::Writer);
+    if ( ! m_condStore->contains<CondContBase>( vhk.key() ) ){
+      std::string tp("UNKNOWN");
+      if (m_clidSvc->getTypeNameOfID(ditr->clid(),tp).isFailure()) {
+        ATH_MSG_WARNING("unable to convert clid " << ditr->clid() << " to a classname."
+                        << "This is a BAD sign, but will try to continue");
+      }
+      CondContBase* cb = 
+        CondContainer::CondContFactory::Instance().Create( ditr->clid(), ditr->key() );
+      if (cb == 0) {
+        ATH_MSG_ERROR("failed to create CondCont<" << tp
+                      << "> clid=" << ditr->clid()
+                      << " : no factory found");
+        fail = true;
       } else {
-        m_vhk.push_back(vhk);
+        ATH_MSG_INFO("created CondCont<" << tp << "> with key '"
+                     << ditr->key() << "'");
+        if (m_condStore->record(cb, vhk.key()).isFailure()) {
+          ATH_MSG_ERROR("while creating a CondContBase for " 
+                        << vhk.fullKey());
+          fail = true;
+        } else {
+          m_vhk.push_back(vhk);
+        }
       }
+    } else {
+      m_vhk.push_back(vhk);
     }
-    m_first = false;
   }
+  
+  if (fail && m_abort) {
+    ATH_MSG_FATAL("Unable to setup some of the requested CondCont<T>. "
+                  << "Aborting");
+    return StatusCode::FAILURE;
+  }
+
+  return StatusCode::SUCCESS;
+
+}
+
+
+//-----------------------------------------------------------------------------
+
+StatusCode 
+CondInputLoader::execute()
+{  
+  ATH_MSG_DEBUG ("Executing " << name() << "...");
 
   EventIDBase now;
-#ifdef GAUDI_SYSEXECUTE_WITHCONTEXT
   if (!getContext().valid()) {
     ATH_MSG_WARNING("EventContext not valid! This should not happen!");
-#else
-  if(getContext()==nullptr) {
-#endif
     const xAOD::EventInfo* thisEventInfo;
     if(evtStore()->retrieve(thisEventInfo)!=StatusCode::SUCCESS) {
       ATH_MSG_ERROR("Unable to get Event Info");
@@ -228,19 +312,11 @@ CondInputLoader::execute()
     now.set_time_stamp_ns_offset(thisEventInfo->timeStampNSOffset());
   }
   else {
-#ifdef GAUDI_SYSEXECUTE_WITHCONTEXT
     now.set_run_number(getContext().eventID().run_number());
     now.set_event_number(getContext().eventID().event_number());
     now.set_lumi_block(getContext().eventID().lumi_block());
     now.set_time_stamp(getContext().eventID().time_stamp());
     now.set_time_stamp_ns_offset(getContext().eventID().time_stamp_ns_offset());
-#else
-    now.set_run_number(getContext()->eventID().run_number());
-    now.set_event_number(getContext()->eventID().event_number());
-    now.set_lumi_block(getContext()->eventID().lumi_block());
-    now.set_time_stamp(getContext()->eventID().time_stamp());
-    now.set_time_stamp_ns_offset(getContext()->eventID().time_stamp_ns_offset());
-#endif
   }
 
   EventIDBase now_event = now;
@@ -289,7 +365,7 @@ CondInputLoader::execute()
 
   }
 
-  if (m_dump) {
+  if (m_dumpEvt) {
     ATH_MSG_DEBUG(m_condStore->dump()); 
   }
   
diff --git a/Control/IOVSvc/src/CondInputLoader.h b/Control/IOVSvc/src/CondInputLoader.h
index 0bc64e7c3165ed9bba842ed78180fa410aac55a8..af0aee1664a168290f876fbf49b3f8e971f27986 100644
--- a/Control/IOVSvc/src/CondInputLoader.h
+++ b/Control/IOVSvc/src/CondInputLoader.h
@@ -49,6 +49,7 @@ class CondInputLoader
 
   // Athena algorithm's Hooks
   virtual StatusCode  initialize();
+  virtual StatusCode  start();
   virtual StatusCode  execute();
   virtual StatusCode  finalize();
 
@@ -75,15 +76,21 @@ class CondInputLoader
   //  void loader(Property&);
 
   /// Containers
-  DataObjIDColl m_load;
+  DataObjIDColl m_load, m_handlesToCreate;
   std::vector< SG::VarHandleKey > m_vhk;
 
-  bool m_dump;
+  Gaudi::Property<bool> m_dumpEvt{ this, "DumpCondStore", false, 
+      "dump the ConditionStore at the end execute"};
+  Gaudi::Property<bool> m_abort {this, "AbortIfInitFails", true, 
+      "Abort execution if unable to create the CondCont<T> in first event"};
+
+
   bool m_first { true };
 
   ServiceHandle<StoreGateSvc> m_condStore;
   ServiceHandle<ICondSvc> m_condSvc;
   ServiceHandle<IIOVSvc> m_IOVSvc;
+  ServiceHandle<IClassIDSvc> m_clidSvc;
   
   std::map<std::string,std::string> m_keyFolderMap;
 }; 
diff --git a/Control/IOVSvc/src/CondSvc.cxx b/Control/IOVSvc/src/CondSvc.cxx
index 8d7cfb39a868944dad8881e87d3c548a575538b4..88c7f20cf1798bb8a9f6ff13894d9783e3ef1a15 100644
--- a/Control/IOVSvc/src/CondSvc.cxx
+++ b/Control/IOVSvc/src/CondSvc.cxx
@@ -5,6 +5,7 @@
 #include "AthenaKernel/CondCont.h"
 #include "GaudiKernel/EventIDBase.h"
 #include "GaudiKernel/SvcFactory.h"
+#include "AthenaKernel/StoreID.h"
 
 //---------------------------------------------------------------------------
 
@@ -43,21 +44,21 @@ CondSvc::initialize() {
 }
 //---------------------------------------------------------------------------
 
-void
-CondSvc::dump() const {
+// void
+// CondSvc::dump() const {
 
-  std::ostringstream ost;
-  dump(ost);
+//   std::ostringstream ost;
+//   dump(ost);
 
-  info() << ost.str() << endmsg;
+//   info() << ost.str() << endmsg;
 
-}
+// }
 
 
 //---------------------------------------------------------------------------
 
 void
-CondSvc::dump(std::ostringstream& ost) const {
+CondSvc::dump(std::ostream& ost) const {
 
   std::lock_guard<std::mutex> lock(m_lock);
 
@@ -121,13 +122,12 @@ CondSvc::stop() {
 //---------------------------------------------------------------------------
 
 StatusCode 
-CondSvc::regHandle(IAlgorithm* alg, const Gaudi::DataHandle& dh, 
-                   const std::string& key) {
+CondSvc::regHandle(IAlgorithm* alg, const Gaudi::DataHandle& dh) {
 
   std::lock_guard<std::mutex> lock(m_lock);
 
-  ATH_MSG_DEBUG( "regHandle: alg: " << alg->name() << "  id: " << dh.fullKey()
-                 << "  dBkey: " << key );
+  ATH_MSG_DEBUG( "regHandle: alg: " << alg->name() << "  id: "
+                 << dh.fullKey() );
 
   if (dh.mode() != Gaudi::DataHandle::Writer) {
     info() << dh.fullKey() << " is a ReadHandle. no need to register"
@@ -149,7 +149,7 @@ CondSvc::regHandle(IAlgorithm* alg, const Gaudi::DataHandle& dh,
     // FIXME : so why is it a set<IAlgorithm*> ??
   }
 
-  m_keyMap[key] = dh.fullKey();
+  //  m_keyMap[key] = dh.fullKey();
   m_condAlgs.insert(alg);
 
   m_condIDs.emplace( dh.fullKey() );
@@ -292,9 +292,17 @@ CondSvc::isValidID(const EventContext& ctx, const DataObjID& id) const {
 
   EventIDBase now(ctx.eventID());
 
-  CondContBase *cib;
-  if (m_sgs->retrieve(cib, id.key()).isSuccess()) {
-    return cib->valid(now);
+  // FIXME: this is ugly, but we need to strip out the name of the store.
+  std::string sk = id.key();
+  if (sk.find(StoreID::storeName(StoreID::CONDITION_STORE)) == 0) {
+    sk.erase(0,15);
+  }
+
+  if (m_sgs->contains<CondContBase>( sk ) ) {
+    CondContBase *cib;
+    if (m_sgs->retrieve(cib, sk).isSuccess()) {
+      return cib->valid(now);
+    }
   }
 
   return false;
@@ -312,6 +320,17 @@ CondSvc::isRegistered(const DataObjID& id) const {
 
 //---------------------------------------------------------------------------
 
+
+bool
+CondSvc::isRegistered(IAlgorithm* ialg) const {
+
+  return (m_condAlgs.find(ialg) != m_condAlgs.end());
+
+}
+
+//---------------------------------------------------------------------------
+
+
 const DataObjIDColl&
 CondSvc::conditionIDs() const {
 
diff --git a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
index bc48912931be80594a5bd09f1feff854c647c6ab..3aaf48e34799876ff2accf73ae64f2a276cf82d6 100644
--- a/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
+++ b/Control/PileUpComps/src/PileUpEventLoopMgr.cxx
@@ -750,8 +750,7 @@ StatusCode PileUpEventLoopMgr::executeAlgorithms()
       // this duplicates what is already done in Algorithm::sysExecute, which
       // calls Algorithm::setExecuted, but eventually we plan to remove that 
       // function
-      m_aess->algExecState(*ita,*m_eventContext).setExecuted(true);
-      m_aess->algExecState(*ita,*m_eventContext).setExecStatus(sc);
+      m_aess->algExecState(*ita,*m_eventContext).setState(AlgExecState::State::Done, sc);
       if ( !sc.isSuccess() )
         {
           ATH_MSG_INFO ( "Execution of algorithm " <<
diff --git a/Control/StoreGate/StoreGate/CondHandleKey.h b/Control/StoreGate/StoreGate/CondHandleKey.h
index 40915798182c34af3a43cfb636b9cb7250c792b0..d38d4b295a90b3e92ed3dff25b4cbaa3ea591608 100644
--- a/Control/StoreGate/StoreGate/CondHandleKey.h
+++ b/Control/StoreGate/StoreGate/CondHandleKey.h
@@ -10,6 +10,7 @@
 #include "StoreGate/StoreGateSvc.h"
 #include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/MsgStream.h"
+#include "GaudiKernel/IClassIDSvc.h"
 
 namespace SG {
 
diff --git a/Control/StoreGate/StoreGate/CondHandleKey.icc b/Control/StoreGate/StoreGate/CondHandleKey.icc
index 9c1b60089881196964b1ba232aef2b0db5f102c4..71b9e7838c7487750c1c3d37f2f3585ccdb30d76 100644
--- a/Control/StoreGate/StoreGate/CondHandleKey.icc
+++ b/Control/StoreGate/StoreGate/CondHandleKey.icc
@@ -3,6 +3,8 @@
 */
 
 #include "AthenaKernel/StoreID.h"
+#include "GaudiKernel/System.h"
+#include <typeinfo>
 
 namespace SG {
   
@@ -14,7 +16,9 @@ namespace SG {
                  StoreID::storeName(StoreID::CONDITION_STORE)),
     m_cs(StoreID::storeName(StoreID::CONDITION_STORE),"CondHandleKey"),
     m_dbKey(dbKey)
-  {}
+  {
+    CondCont<T>::registerBaseInit();
+  }
 
   //---------------------------------------------------------------------------  
   
@@ -37,33 +41,51 @@ namespace SG {
       return StatusCode::FAILURE;
     }
 
-    
-    if (m_cs->contains< CondCont<T> > (SG::VarHandleKey::key()) ) {      
-      if (m_cs->retrieve(m_cc, SG::VarHandleKey::key()).isFailure()) {
+              
+    if (mode() == DataHandle::Writer) {
+      if (m_cs->contains< CondCont<T> > (SG::VarHandleKey::key()) ) {
         MsgStream msg(Athena::getMessageSvc(), "CondHandleKey");
         msg << MSG::ERROR 
-            << "CondHandleKey::init(): unable to retrieve CondCont of "
-            << Gaudi::DataHandle::fullKey() << " from " 
-            << StoreID::storeName(StoreID::CONDITION_STORE)
-            << " with key " << SG::VarHandleKey::key()
+            << StoreID::storeName( StoreID::CONDITION_STORE ) 
+            << " already contains a CondCont of type "
+            << Gaudi::DataHandle::fullKey() 
             << endmsg;
         return StatusCode::FAILURE;
+      } else {
+        m_cc = new CondCont<T>(Gaudi::DataHandle::fullKey());
+        if (m_cs->record(m_cc, SG::VarHandleKey::key()).isFailure()) {
+          MsgStream msg(Athena::getMessageSvc(), "CondHandleKey");
+          msg << MSG::ERROR 
+              << "CondHandleKey::init(): unable to record empty CondCont of " 
+              << Gaudi::DataHandle::fullKey() << " in " 
+              << StoreID::storeName( StoreID::CONDITION_STORE ) 
+              << " with key " << SG::VarHandleKey::key() << endmsg;
+          delete m_cc;
+          m_cc = 0;
+          return StatusCode::FAILURE;
+        }
+        // std::cout << "recorded " << Gaudi::DataHandle::fullKey() 
+        //           << " with key "
+        //           << SG::VarHandleKey::key() << std::endl;
       }
     } else {
-      m_cc = new CondCont<T>(Gaudi::DataHandle::fullKey());
-      if (m_cs->record(m_cc, SG::VarHandleKey::key()).isFailure()) {
-        MsgStream msg(Athena::getMessageSvc(), "CondHandleKey");
-        msg << MSG::ERROR 
-            << "CondHandleKey::init(): unable to record empty CondCont of " 
-            << Gaudi::DataHandle::fullKey() << " in " 
-            << StoreID::storeName( StoreID::CONDITION_STORE ) 
-            << " with key " << SG::VarHandleKey::key() << endmsg;
-        delete m_cc;
-        m_cc = 0;
-        return StatusCode::FAILURE;
+      // lets see if we get lucky and the Write alg already created the
+      // continer we want
+      if (m_cs->contains< CondCont<T> > (SG::VarHandleKey::key()) ) {
+        if (m_cs->retrieve(m_cc, SG::VarHandleKey::key()).isFailure()) {
+          MsgStream msg(Athena::getMessageSvc(), "CondHandleKey");
+          msg << MSG::ERROR 
+              << "CondHandleKey::init(): unable to retrieve CondCont of "
+              << Gaudi::DataHandle::fullKey() << " from " 
+              << StoreID::storeName(StoreID::CONDITION_STORE)
+              << " with key " << SG::VarHandleKey::key()
+              << endmsg;
+          m_cc = 0;
+          return StatusCode::FAILURE;
+        }
       }
     }
-
+          
 
     m_isInit = true;
 
diff --git a/Control/StoreGate/StoreGate/ReadCondHandle.h b/Control/StoreGate/StoreGate/ReadCondHandle.h
index ae81e5c1bdbf9b4d521b1c66da2d5c990206a250..0847d4aef06accfcbc9a95db5e3f3d435ec92edf 100644
--- a/Control/StoreGate/StoreGate/ReadCondHandle.h
+++ b/Control/StoreGate/StoreGate/ReadCondHandle.h
@@ -66,6 +66,8 @@ namespace SG {
     EventIDRange m_range;
     
     const SG::ReadCondHandleKey<T>& m_hkey;
+
+    StoreGateSvc* m_cs {nullptr};
   };
 
 
@@ -85,7 +87,8 @@ namespace SG {
     SG::VarHandleBase( key, &ctx ),
     m_eid( ctx.eventID() ),
     m_cc( key.getCC() ),
-    m_hkey(key)
+    m_hkey(key),
+    m_cs ( key.getCS() )
   {
     EventIDBase::number_type conditionsRun =
       ctx.template getExtension<Atlas::ExtendedEventContext>()->conditionsRun();
@@ -104,11 +107,38 @@ namespace SG {
     }
 
     if (m_cc == 0) {
-      MsgStream msg(Athena::getMessageSvc(), "ReadCondHandle");
-      msg << MSG::ERROR
-          << "ReadCondHandle : ptr to CondCont<T> is zero"
-          << endmsg;
-      throw std::runtime_error("ReadCondHandle: ptr to CondCont<T> is zero");
+      // try to retrieve it
+      CondContBase *cb(nullptr);
+      if (m_cs->retrieve(cb, SG::VarHandleKey::key()).isFailure()) {
+        MsgStream msg(Athena::getMessageSvc(), "ReadCondHandle");
+        msg << MSG::ERROR
+            << "can't retrieve " << Gaudi::DataHandle::fullKey() 
+            << " via base class" << endmsg;
+        throw std::runtime_error("ReadCondHandle: ptr to CondCont<T> is zero");
+      } else {
+        m_cc = dynamic_cast< CondCont<T>* > (cb);
+        if (m_cc == 0) {
+          MsgStream msg(Athena::getMessageSvc(), "ReadCondHandle");
+          msg << MSG::ERROR
+              << "can't dcast CondContBase to " << Gaudi::DataHandle::fullKey() 
+              << endmsg;
+          throw std::runtime_error("ReadCondHandle: ptr to CondCont<T> is zero");
+        }
+      }
+          
+
+
+
+      // if ( m_cs->retrieve(m_cc, SG::VarHandleKey::key()).isFailure() ) {
+      //   MsgStream msg(Athena::getMessageSvc(), "ReadCondHandle");
+      //   msg << MSG::ERROR
+      //       << "ReadCondHandle : unable to retrieve ReadCondHandle of type"
+      //       << Gaudi::DataHandle::fullKey() << " from "
+      //       << StoreID::storeName(StoreID::CONDITION_STORE)
+      //       << " with key " << SG::VarHandleKey::key()
+      //       << endmsg;
+      //   throw std::runtime_error("ReadCondHandle: ptr to CondCont<T> is zero");
+      // }
     }
   
   }
diff --git a/DataQuality/DataQualityConfigurations/python/TestDisplayHI.py b/DataQuality/DataQualityConfigurations/python/TestDisplayHI.py
index a5fe3200d22d83b1b2f6c6e860d7e5d57af1750d..aedb89865662c0680f9b7c052b1701bb435ad070 100644
--- a/DataQuality/DataQualityConfigurations/python/TestDisplayHI.py
+++ b/DataQuality/DataQualityConfigurations/python/TestDisplayHI.py
@@ -29,3 +29,4 @@ dqconfig.runlist        = "runlist_TEST.xml"
 dqconfig.indexFile      = "results_TEST.html"
 dqconfig.lockFile       = "DQWebDisplay_TEST.lock"
 dqconfig.doHandi        = False
+
diff --git a/Database/AthenaPOOL/AthenaPoolUtilities/AthenaPoolUtilities/CondAttrListCollection.h b/Database/AthenaPOOL/AthenaPoolUtilities/AthenaPoolUtilities/CondAttrListCollection.h
index 84e38d27047fa7a34bf6528c1bdbdca86788ab52..913067b01539763e4542f16eec968a30d827fbe3 100644
--- a/Database/AthenaPOOL/AthenaPoolUtilities/AthenaPoolUtilities/CondAttrListCollection.h
+++ b/Database/AthenaPOOL/AthenaPoolUtilities/AthenaPoolUtilities/CondAttrListCollection.h
@@ -200,6 +200,7 @@ CLASS_DEF( CondCont<CondAttrListCollection>, 1223307417  , 1 )
 #include "SGTools/BaseInfo.h"
 SG_BASE( CondCont<CondAttrListCollection>, CondContBase );
 
+REGISTER_CC( CondAttrListCollection )
 
 //<<<<<< INLINE PUBLIC FUNCTIONS                                        >>>>>>
 //<<<<<< INLINE MEMBER FUNCTIONS                                        >>>>>>
diff --git a/DetectorDescription/DetDescrCond/DetDescrConditions/DetDescrConditions/DetCondCFloat.h b/DetectorDescription/DetDescrCond/DetDescrConditions/DetDescrConditions/DetCondCFloat.h
index f425b75883a4d0ecf964e37041d053cbc73a31aa..558b88273cc3105fa884dac58911c2d5005b6222 100755
--- a/DetectorDescription/DetDescrCond/DetDescrConditions/DetDescrConditions/DetCondCFloat.h
+++ b/DetectorDescription/DetDescrCond/DetDescrConditions/DetDescrConditions/DetCondCFloat.h
@@ -76,6 +76,7 @@ class DetCondCFloat {
 CLASS_DEF(DetCondCFloat,247459965,1)
 CLASS_DEF( CondCont<DetCondCFloat> , 85257013 , 1 )
 SG_BASE( CondCont<DetCondCFloat>, CondContBase );
+REGISTER_CC( DetCondCFloat )
 
 // inline functions for DetCondCFloat
 
diff --git a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/src/PixelCalibCondAlg.cxx b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/src/PixelCalibCondAlg.cxx
index dd6c4d511745fdd68d5b154804e040c46b65201d..158124866898ad946e7ca9b8c54843cf629cf330 100644
--- a/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/src/PixelCalibCondAlg.cxx
+++ b/InnerDetector/InDetCalibAlgs/PixelCalibAlgs/src/PixelCalibCondAlg.cxx
@@ -32,7 +32,7 @@ StatusCode PixelCalibCondAlg::initialize()
   ATH_CHECK( m_writeKey.initialize() );
 
   // Register write handle
-  if (m_condSvc->regHandle(this, m_writeKey, m_writeKey.dbKey()).isFailure()) {
+  if (m_condSvc->regHandle(this, m_writeKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_writeKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_MonitorConditionsCondAlg.cxx b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_MonitorConditionsCondAlg.cxx
index 5fb80b3393e50e396cb5b2cbfd4fa92b6ab67fb9..4ef44c85666fddf2aac4a191bbcc084090ea781c 100644
--- a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_MonitorConditionsCondAlg.cxx
+++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_MonitorConditionsCondAlg.cxx
@@ -33,7 +33,7 @@ StatusCode SCT_MonitorConditionsCondAlg::initialize()
   // Write Cond Handle
   ATH_CHECK(m_writeKey.initialize());
   // Register write handle
-  if(m_condSvc->regHandle(this, m_writeKey, m_writeKey.dbKey()).isFailure()) {
+  if(m_condSvc->regHandle(this, m_writeKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_writeKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_TdaqEnabledCondAlg.cxx b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_TdaqEnabledCondAlg.cxx
index 18f28484e3661d5545a6392ca52ce30706591651..04e7a7019c1628ae5dcc65e94fc5866ddcb70de3 100644
--- a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_TdaqEnabledCondAlg.cxx
+++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_TdaqEnabledCondAlg.cxx
@@ -41,7 +41,7 @@ StatusCode SCT_TdaqEnabledCondAlg::initialize()
   // Write Cond Handle
   ATH_CHECK( m_writeKey.initialize() );
   // Register write handle
-  if(m_condSvc->regHandle(this, m_writeKey, m_writeKey.dbKey()).isFailure()) {
+  if(m_condSvc->regHandle(this, m_writeKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_writeKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/LArCalorimeter/LArBadChannelTool/src/LArBadChannelCondAlg.cxx b/LArCalorimeter/LArBadChannelTool/src/LArBadChannelCondAlg.cxx
index b49b7e22f2e99927410294d40b02d8dacdeb0b82..e3971217a460628f62cf356a9f5352d0c3d7c6aa 100644
--- a/LArCalorimeter/LArBadChannelTool/src/LArBadChannelCondAlg.cxx
+++ b/LArCalorimeter/LArBadChannelTool/src/LArBadChannelCondAlg.cxx
@@ -31,7 +31,7 @@ StatusCode LArBadChannelCondAlg::initialize() {
   ATH_CHECK( m_BCOutputKey.initialize() );
 
   // Register write handle
-  if (m_condSvc->regHandle(this, m_BCOutputKey, m_BCOutputKey.dbKey()).isFailure()) {
+  if (m_condSvc->regHandle(this, m_BCOutputKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_BCOutputKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/LArCalorimeter/LArBadChannelTool/src/LArBadFebCondAlg.cxx b/LArCalorimeter/LArBadChannelTool/src/LArBadFebCondAlg.cxx
index fd062101d63caed849291cc90c40c74669102a12..f121fd62ba4e03098644e93e5252e74c2010f26b 100644
--- a/LArCalorimeter/LArBadChannelTool/src/LArBadFebCondAlg.cxx
+++ b/LArCalorimeter/LArBadChannelTool/src/LArBadFebCondAlg.cxx
@@ -31,7 +31,7 @@ StatusCode LArBadFebCondAlg::initialize() {
   ATH_CHECK( m_BCOutputKey.initialize() );
 
   // Register write handle
-  if (m_condSvc->regHandle(this, m_BCOutputKey, m_BCOutputKey.dbKey()).isFailure()) {
+  if (m_condSvc->regHandle(this, m_BCOutputKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_BCOutputKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/LArCalorimeter/LArRawConditions/LArRawConditions/LArHVScaleCorrComplete.h b/LArCalorimeter/LArRawConditions/LArRawConditions/LArHVScaleCorrComplete.h
index abc24450a93ba53aaec9b9ff3f932c9172996271..c2472c80faffdafd9c6608ba7c807919196dc14d 100644
--- a/LArCalorimeter/LArRawConditions/LArRawConditions/LArHVScaleCorrComplete.h
+++ b/LArCalorimeter/LArRawConditions/LArRawConditions/LArHVScaleCorrComplete.h
@@ -34,4 +34,13 @@ class LArHVScaleCorrComplete: public ILArHVScaleCorr ,
 
 };
 CLASS_DEF( LArHVScaleCorrComplete, 220593802,1)
+
+// SG_BASE(LArHVScaleCorrComplete, ILArHVScaleCorr);
+
+#include "AthenaKernel/CondCont.h"
+CONDCONT_BASE(LArHVScaleCorrComplete, ILArHVScaleCorr);
+CLASS_DEF( CondCont<LArHVScaleCorrComplete> , 84955454 , 1 )
+
+REGISTER_CC( LArHVScaleCorrComplete )
+
 #endif 
diff --git a/LArCalorimeter/LArRecUtils/src/LArADC2MeVCondAlg.cxx b/LArCalorimeter/LArRecUtils/src/LArADC2MeVCondAlg.cxx
index e341fd1ede28487a2812da3c90115f599fac1733..744f0d82471b49a7fe49fb47065d20bd53bdff9a 100644
--- a/LArCalorimeter/LArRecUtils/src/LArADC2MeVCondAlg.cxx
+++ b/LArCalorimeter/LArRecUtils/src/LArADC2MeVCondAlg.cxx
@@ -77,7 +77,7 @@ StatusCode LArADC2MeVCondAlg::initialize() {
   ATH_CHECK( m_ADC2MeVKey.initialize() );
 
   // Register write handle
-  if (m_condSvc->regHandle(this, m_ADC2MeVKey, m_ADC2MeVKey.dbKey()).isFailure()) {
+  if (m_condSvc->regHandle(this, m_ADC2MeVKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_ADC2MeVKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/LArCalorimeter/LArRecUtils/src/LArFlatConditionsAlg.icc b/LArCalorimeter/LArRecUtils/src/LArFlatConditionsAlg.icc
index d096853e1ba754636cba38b82e0a58058b363bc2..a96cfd5f9bede4f5610482c2e6edba163f98b0e7 100644
--- a/LArCalorimeter/LArRecUtils/src/LArFlatConditionsAlg.icc
+++ b/LArCalorimeter/LArRecUtils/src/LArFlatConditionsAlg.icc
@@ -28,7 +28,7 @@ StatusCode LArFlatConditionsAlg<T>::initialize() {
   ATH_CHECK( m_readKey.initialize() );
   ATH_CHECK( m_writeKey.initialize() );
   // Register write handle
-  if (m_condSvc->regHandle(this, m_writeKey, m_writeKey.dbKey()).isFailure()) {
+  if (m_condSvc->regHandle(this, m_writeKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_writeKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/LArCalorimeter/LArRecUtils/src/LArOnOffMappingAlg.cxx b/LArCalorimeter/LArRecUtils/src/LArOnOffMappingAlg.cxx
index adc2230ab10e2007a4d5992c0c09220f9d1a807c..b43b443bcfce9b939b69eae652b8843b75f0f91e 100644
--- a/LArCalorimeter/LArRecUtils/src/LArOnOffMappingAlg.cxx
+++ b/LArCalorimeter/LArRecUtils/src/LArOnOffMappingAlg.cxx
@@ -38,7 +38,7 @@ StatusCode LArOnOffMappingAlg::initialize() {
   ATH_CHECK( m_readKey.initialize() );
   ATH_CHECK( m_writeKey.initialize() );
   // Register write handle
-  if (m_condSvc->regHandle(this, m_writeKey, m_writeKey.dbKey()).isFailure()) {
+  if (m_condSvc->regHandle(this, m_writeKey).isFailure()) {
     ATH_MSG_ERROR("unable to register WriteCondHandle " << m_writeKey.fullKey() << " with CondSvc");
     return StatusCode::FAILURE;
   }
diff --git a/Projects/AthSimulation/externals.txt b/Projects/AthSimulation/externals.txt
index 7b46c785fa0f02250ba2948d059728788cc0f178..b09b27407c93f1e84e7c4fa43e0971664f47e430 100644
--- a/Projects/AthSimulation/externals.txt
+++ b/Projects/AthSimulation/externals.txt
@@ -9,4 +9,4 @@
 AthSimulationExternalsVersion = 4be765b4
 
 # The version of atlas/Gaudi to use:
-GaudiVersion = v28r2.011
+GaudiVersion = v29r0.001
diff --git a/Projects/Athena/externals.txt b/Projects/Athena/externals.txt
index b5c4acb782cf1914907763fce2a4bef1a608bb20..dc15216343a194f9f84141eb87d1fcb944feb0ef 100644
--- a/Projects/Athena/externals.txt
+++ b/Projects/Athena/externals.txt
@@ -8,5 +8,5 @@
 # The version of atlas/atlasexternals to use:
 AthenaExternalsVersion = 4be765b4
 
-# The version of atlas/Gaudi to use:
-GaudiVersion = v28r2.011
+# The version of atlas/Gaudi to use: 
+GaudiVersion = v29r0.001
diff --git a/Trigger/TriggerSimulation/TrigSimTransforms/src/MergingEventLoopMgr.cxx b/Trigger/TriggerSimulation/TrigSimTransforms/src/MergingEventLoopMgr.cxx
index d3a5483be0c170da6748400dcc50908a48e09c93..f63a4d0a8c3440edbb4ee7e9d358cfd77abca805 100644
--- a/Trigger/TriggerSimulation/TrigSimTransforms/src/MergingEventLoopMgr.cxx
+++ b/Trigger/TriggerSimulation/TrigSimTransforms/src/MergingEventLoopMgr.cxx
@@ -1038,8 +1038,7 @@ namespace TrigSim {
             // this duplicates what is already done in Algorithm::sysExecute, which
             // calls Algorithm::setExecuted, but eventually we plan to remove that 
             // function
-            m_aess->algExecState(*it,m_eventContext).setExecuted(true);
-            m_aess->algExecState(*it,m_eventContext).setExecStatus(sc);
+            m_aess->algExecState(*it,m_eventContext).setState(AlgExecState::State::Done, sc);
 
             if(sc.isFailure()) {
                 m_log << MSG::ERROR << "Algorithm failed in sysExecute(): "