From f04c3617ac5ff81072f0dfda84a66c9591745db6 Mon Sep 17 00:00:00 2001
From: Scott Snyder <scott.snyder@cern.ch>
Date: Fri, 14 Dec 2018 17:10:03 +0000
Subject: [PATCH] AthenaKernel+others: Support mixed conditions containers.

---
 Control/AthenaKernel/AthenaKernel/CondCont.h  | 544 ++++++++++++-
 .../AthenaKernel/AthenaKernel/CondCont.icc    | 161 +++-
 Control/AthenaKernel/share/CondCont_test.ref  |  12 +-
 Control/AthenaKernel/src/CondCont.cxx         | 752 +++++++++++++-----
 Control/AthenaKernel/test/CondCont_test.cxx   | 380 ++++++++-
 .../src/DelayedConditionsCleanerSvc.cxx       |   1 +
 .../test/ConditionsCleanerSvc_test.cxx        |  34 +-
 .../test/DelayedConditionsCleanerSvc_test.cxx |  39 +-
 .../DataModelRunTests/share/CondReader.ref    | 292 +++++--
 .../DataModelRunTests/share/CondReaderMT.ref  | 333 ++++++--
 .../DataModelRunTests/share/CondReader_jo.py  |  19 +-
 .../DataModelRunTests/share/CondWriter.ref    |  40 +-
 .../DataModelRunTests/share/CondWriter_jo.py  |  26 +-
 .../DataModelTestDataCommonDict.h             |   3 +-
 .../DataModelTestDataCommon/S3.h              |  39 +
 .../DataModelTestDataCommon/S3Cond.h          |  25 +
 .../DataModelTestDataCommon/selection.xml     |   1 +
 .../DataModelTestDataCommon/src/CondAlg2.cxx  |  87 ++
 .../DataModelTestDataCommon/src/CondAlg2.h    |  63 ++
 .../src/CondReaderAlg.cxx                     |  27 +-
 .../src/CondReaderAlg.h                       |   6 +-
 .../src/CondWriterAlg.cxx                     |  60 ++
 .../src/CondWriterAlg.h                       |   6 +-
 .../DataModelTestDataCommon_entries.cxx       |   2 +
 24 files changed, 2581 insertions(+), 371 deletions(-)
 create mode 100644 Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h
 create mode 100644 Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h
 create mode 100644 Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx
 create mode 100644 Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h

diff --git a/Control/AthenaKernel/AthenaKernel/CondCont.h b/Control/AthenaKernel/AthenaKernel/CondCont.h
index 7e7bd6991bd..e2a503cc626 100644
--- a/Control/AthenaKernel/AthenaKernel/CondCont.h
+++ b/Control/AthenaKernel/AthenaKernel/CondCont.h
@@ -7,6 +7,61 @@
  * @author Vakho, Charles, Scott
  * @date 2017
  * @brief Hold mappings of ranges to condition objects.
+ *
+ * Conditions objects of type @c T are managed by @c CondCont<T>, which are
+ * recorded in the conditions store.  @c CondCont<T> is a map of IOV ranges
+ * to payload objects of type @c T.
+ *
+ * A conditions container must be declared as such and given a CLID using
+ * the macro @c CONDCONT_DEF:
+ *@code
+ *  CONDCONT_DEF (MyType, 12345);
+ @endcode
+ *
+ * If one payload class derives from another, it is possible declare
+ * conditions containers so that they have the same inheritance by adding
+ * the payload base class as a thir argument to @c CONDCONT_DEF.  For example,
+ * if @c MyType derived from @c MyBase then you can use
+ *@code
+ *  CONDCONT_DEF (MyType, 12345, MyBase);
+ @endcode
+ *
+ * A conditions container declared in this way should have keys that
+ * are either ranges in run+lbn or timestamp; they cannot be mixed.
+ * However, in the case where one has a conditions algorithm that takes
+ * as input both a run+lbn and a timestamp condition, the result
+ * will be IOVs that have both run+lbn and timestamp ranges.  Such conditions
+ * may be stored in a mixed conditions container, declared as:
+ @code
+ *  CONDCONT_MIXED_DEF (MyType, 12345);
+ @endcode
+ *
+ * @c CondCont<MyType> is now declared as a mixed container.
+ * Inheritance of conditions containers is not currently implemented
+ * for mixed containers.
+ *
+ * Implementation notes:
+ * All conditions containers derive from @c CondContBase.  This defines
+ * virtual functions that are used by the IOV services.  @c CondContSingleBase
+ * derives from this and collects non-templated implementations used by
+ * non-mixed containers; most virtual functions can be declared @c final here.
+ * Finally, @c CondCont<T> derives from @c CondContSingleBase and implements
+ * the type-specific part.
+ *
+ * We reduce the amount of templated code that must be instantiated by storing
+ * the payloads as void* in the underlying @c ConcurrentRangeMap.  All this
+ * needs to do with the payloads is to be able to delete them; we handle
+ * this by giving @c ConcurrentRangeMap a function to call to delete a payload.
+ *
+ * For the case of mixed containers, rather than having the @c ConcurrentRangeMap
+ * store the payload directly, it instead holds another @c ConcurrentRangeMap
+ * which in turn hold the payload.  The top map is indexed by run+lbn
+ * and the secondary ones by timestamp.
+ *
+ * For mixed containers, we have @c CondContMixedBase deriving from
+ * @c CondContBase and @c CondContMixed<T> deriving from that.
+ * The @c CONDCONT_MIXED_DEF macro then specializes @c CondCont<T>
+ * so that it derives from @c CondContMixed<T>
  */
 
 #ifndef ATHENAKERNEL_CONDCONT_H
@@ -66,6 +121,9 @@ enum class CondContStatusCode : StatusCode::code_t
 STATUSCODE_ENUM_DECL (CondContStatusCode)
 
 
+/**
+ * @brief Base class for all conditions containers.
+ */
 class CondContBase
 {
 public:
@@ -111,7 +169,10 @@ public:
     TIMESTAMP,
 
     /// Container uses run+lbn keys.
-    RUNLBN
+    RUNLBN,
+
+    /// Mixed Run+lbn / timestamp container.
+    MIXED,
   };
 
 
@@ -154,6 +215,12 @@ public:
   SG::DataProxy* proxy();
 
 
+  /**
+   * @brief Return the associated @c DataProxy, if any.
+   */
+  const SG::DataProxy* proxy() const;
+
+
   /**
    * @brief Set the associated @c DataProxy.
    * @param proxy The proxy to set.
@@ -166,7 +233,7 @@ public:
    * @param ost Stream to which to write the dump.
    */
   virtual
-  void list (std::ostream& ost) const;
+  void list (std::ostream& ost) const = 0;
 
 
   /**
@@ -185,7 +252,7 @@ public:
    * @brief Return all IOV validity ranges defined in this container.
    */
   virtual
-  std::vector<EventIDRange> ranges() const;
+  std::vector<EventIDRange> ranges() const = 0;
 
 
   /** 
@@ -209,7 +276,7 @@ public:
   virtual
   StatusCode typelessInsert (const EventIDRange& r,
                              void* obj,
-                             const EventContext& ctx = Gaudi::Hive::currentContext());
+                             const EventContext& ctx = Gaudi::Hive::currentContext()) = 0;
 
 
   /**
@@ -217,7 +284,7 @@ public:
    * @param t IOV time to check.
    */
   virtual
-  bool valid( const EventIDBase& t) const;
+  bool valid( const EventIDBase& t) const = 0;
 
 
   /**
@@ -228,7 +295,7 @@ public:
    * Returns true if @c t is mapped; false otherwise.
    */
   virtual
-  bool range (const EventIDBase& t, EventIDRange& r) const;
+  bool range (const EventIDBase& t, EventIDRange& r) const = 0;
 
 
   /**
@@ -238,7 +305,7 @@ public:
    */
   virtual
   StatusCode erase (const EventIDBase& t,
-                    const EventContext& ctx = Gaudi::Hive::currentContext());
+                    const EventContext& ctx = Gaudi::Hive::currentContext()) = 0;
 
 
   /**
@@ -299,7 +366,7 @@ public:
    */
   virtual
   StatusCode extendLastRange (const EventIDRange& newRange,
-                              const EventContext& ctx = Gaudi::Hive::currentContext());
+                              const EventContext& ctx = Gaudi::Hive::currentContext()) = 0;
 
 
   /**
@@ -399,10 +466,12 @@ protected:
     CondContSet;
 
   typedef CondContSet::Updater_t Updater_t;
+  typedef CondContSet::delete_function delete_function;
 
   /**
    * @brief Internal constructor.
    * @param rcusvc RCU service instance.
+   * @param keyType Key type for this container.
    * @param CLID of the most-derived @c CondCont.
    * @param id CLID+key for this object.
    * @param proxy @c DataProxy for this object.
@@ -410,6 +479,7 @@ protected:
    * @param capacity Initial capacity of the container.
    */
   CondContBase (Athena::IRCUSvc& rcusvc,
+                KeyType keytype,
                 CLID clid,
                 const DataObjID& id,
                 SG::DataProxy* proxy,
@@ -435,6 +505,30 @@ protected:
                          const EventContext& ctx = Gaudi::Hive::currentContext());
 
 
+  /**
+   * @brief Erase the first element not less than @c t.
+   * @param IOV time of element to erase.
+   * @param ctx Event context for the current thread.
+   */
+  StatusCode eraseBase (const EventIDBase& t,
+                        const EventContext& ctx = Gaudi::Hive::currentContext());
+
+
+  /**
+   * @brief Extend the range of the last IOV.
+   * @param newRange New validity range.
+   * @param ctx Event context.
+   *
+   * Returns failure if the start time of @c newRange does not match the start time
+   * of the last IOV in the container.  Otherwise, the end time for the last
+   * IOV is changed to the end time for @c newRange.  (If the end time for @c newRange
+   * is before the end of the last IOV, then nothing is changed.)
+   */
+  StatusCode
+  extendLastRangeBase (const EventIDRange& newRange,
+                       const EventContext& ctx = Gaudi::Hive::currentContext());
+
+
   /** 
    * @brief Internal lookup function.
    * @param t IOV time to find.
@@ -475,6 +569,17 @@ protected:
   virtual const void* doCast (CLID clid, const void* ptr) const = 0;
 
 
+  /**
+   * @brief Call @c func on each entry in the container.
+   * @param func Functional to call on each entry.
+   *
+   * @c func will be called on each container element
+   * (being passed const CondContSet::value_type&).
+   */
+  template <class FUNC>
+  void forEach (const FUNC& func) const;
+
+
   /**
    * @brief Tell the cleaner that a new object was added to the container.
    */
@@ -488,6 +593,18 @@ protected:
   void insertError (CLID usedCLID) const;
 
 
+  /**
+   * @brief Return the deletion function for this container.
+   */
+  delete_function* delfcn() const;
+
+
+  /**
+   * @brief Description of this container to use for Msgstream.
+   */
+  std::string title() const;
+
+
 private:
   /// Key type of this container.
   KeyType m_keyType;
@@ -516,6 +633,119 @@ private:
 ///////////////////////////////////////////////////////////////////////////
 
 
+/**
+ * @brief Base class for conditions containers that are either
+ *        Run+LBN or timestamp.
+ */
+class CondContSingleBase
+  : public CondContBase
+{
+public:
+  /**
+   * @brief Dump the container contents for debugging.
+   * @param ost Stream to which to write the dump.
+   */
+  virtual
+  void list (std::ostream& ost) const override final;
+
+
+  /**
+   * @brief Return all IOV validity ranges defined in this container.
+   */
+  virtual
+  std::vector<EventIDRange> ranges() const override final;
+
+
+  /** 
+   * @brief Insert a new conditions object.
+   * @param r Range of validity of this object.
+   * @param obj Pointer to the object being inserted.
+   * @param ctx Event context for the current thread.
+   *
+   * @c obj must point to an object of type @c T,
+   * except in the case of inheritance, where the type of @c obj must
+   * correspond to the most-derived @c CondCont type.
+   * The container will take ownership of this object.
+   *
+   * Returns SUCCESS if the object was successfully inserted;
+   * OVERLAP if the object was inserted but the range partially overlaps
+   * with an existing one;
+   * DUPLICATE if the object wasn't inserted because the range
+   * duplicates an existing one, and FAILURE otherwise
+   * (ownership of the object will be taken in any case).
+   */
+  virtual
+  StatusCode typelessInsert (const EventIDRange& r,
+                             void* obj,
+                             const EventContext& ctx = Gaudi::Hive::currentContext()) override final;
+
+
+  /**
+   * @brief Test to see if a given IOV time is mapped in the container.
+   * @param t IOV time to check.
+   */
+  virtual
+  bool valid( const EventIDBase& t) const override final;
+
+
+  /**
+   * @brief Return the mapped validity range for an IOV time.
+   * @param t IOV time to check.
+   * @param r[out] The range containing @c t.
+   *
+   * Returns true if @c t is mapped; false otherwise.
+   */
+  virtual
+  bool range (const EventIDBase& t, EventIDRange& r) const override final;
+
+
+  /**
+   * @brief Erase the first element not less than @c t.
+   * @param IOV time of element to erase.
+   * @param ctx Event context for the current thread.
+   */
+  virtual
+  StatusCode erase (const EventIDBase& t,
+                    const EventContext& ctx = Gaudi::Hive::currentContext()) override final;
+
+
+  /**
+   * @brief Extend the range of the last IOV.
+   * @param newRange New validity range.
+   * @param ctx Event context.
+   *
+   * Returns failure if the start time of @c newRange does not match the start time
+   * of the last IOV in the container.  Otherwise, the end time for the last
+   * IOV is changed to the end time for @c newRange.  (If the end time for @c newRange
+   * is before the end of the last IOV, then nothing is changed.)
+   */
+  virtual
+  StatusCode extendLastRange (const EventIDRange& newRange,
+                              const EventContext& ctx = Gaudi::Hive::currentContext()) override final;
+
+
+protected:
+  /**
+   * @brief Internal constructor.
+   * @param rcusvc RCU service instance.
+   * @param CLID of the most-derived @c CondCont.
+   * @param id CLID+key for this object.
+   * @param proxy @c DataProxy for this object.
+   * @param delfcn Deletion function for the actual payload type.
+   * @param capacity Initial capacity of the container.
+   */
+  CondContSingleBase (Athena::IRCUSvc& rcusvc,
+                      CLID clid,
+                      const DataObjID& id,
+                      SG::DataProxy* proxy,
+                      CondContSet::delete_function* delfcn,
+                      size_t capacity);
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+
+
 template <class T> class CondCont;
 
 
@@ -530,7 +760,7 @@ template <typename T>
 class CondContBaseInfo
 {
 public:
-  typedef CondContBase Base;
+  typedef CondContSingleBase Base;
 };
 
 
@@ -679,7 +909,7 @@ protected:
             CLID clid,
             const DataObjID& id,
             SG::DataProxy* proxy,
-            const typename CondContSet::delete_function* delfcn,
+            typename CondContSet::delete_function* delfcn,
             size_t capacity);
 
 
@@ -717,16 +947,296 @@ public:
 
 
 private:
-  typedef CondContBase::RangeKey RangeKey;
+  /// Deletion function to pass to @c ConcurrentRangeMap.
+  static void delfcn (const void* p) {
+    delete reinterpret_cast<const T*>(p);
+  }
+};
 
 
+///////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * @brief Base class for conditions containers for which keys are ranges
+ *        in both Run+LBN and timestamp.
+ */
+class CondContMixedBase
+  : public CondContBase
+{
+public:
+  /**
+   * @brief Dump the container contents for debugging.
+   * @param ost Stream to which to write the dump.
+   */
+  virtual
+  void list (std::ostream& ost) const override final;
+
+
+  /**
+   * @brief Return all IOV validity ranges defined in this container.
+   */
+  virtual
+  std::vector<EventIDRange> ranges() const override final;
+
+
+  /** 
+   * @brief Insert a new conditions object.
+   * @param r Range of validity of this object.
+   * @param obj Pointer to the object being inserted.
+   * @param ctx Event context for the current thread.
+   *
+   * @c obj must point to an object of type @c T,
+   * except in the case of inheritance, where the type of @c obj must
+   * correspond to the most-derived @c CondCont type.
+   * The container will take ownership of this object.
+   *
+   * Returns SUCCESS if the object was successfully inserted;
+   * OVERLAP if the object was inserted but the range partially overlaps
+   * with an existing one;
+   * DUPLICATE if the object wasn't inserted because the range
+   * duplicates an existing one, and FAILURE otherwise
+   * (ownership of the object will be taken in any case).
+   */
+  virtual
+  StatusCode typelessInsert (const EventIDRange& r,
+                             void* obj,
+                             const EventContext& ctx = Gaudi::Hive::currentContext()) override final;
+
+
+  /**
+   * @brief Test to see if a given IOV time is mapped in the container.
+   * @param t IOV time to check.
+   */
+  virtual
+  bool valid( const EventIDBase& t) const override final;
+
+
+  /**
+   * @brief Return the mapped validity range for an IOV time.
+   * @param t IOV time to check.
+   * @param r[out] The range containing @c t.
+   *
+   * Returns true if @c t is mapped; false otherwise.
+   */
+  virtual
+  bool range (const EventIDBase& t, EventIDRange& r) const override final;
+
+
+  /**
+   * @brief Erase the first element not less than @c t.
+   * @param IOV time of element to erase.
+   * @param ctx Event context for the current thread.
+   *
+   * This is not implemented for mixed containers.
+   */
+  virtual
+  StatusCode erase (const EventIDBase& t,
+                    const EventContext& ctx = Gaudi::Hive::currentContext()) override final;
+
+
+  /**
+   * @brief Extend the range of the last IOV.
+   * @param newRange New validity range.
+   * @param ctx Event context.
+   *
+   * Returns failure if the start time of @c newRange does not match the start time
+   * of the last IOV in the container.  Otherwise, the end time for the last
+   * IOV is changed to the end time for @c newRange.  (If the end time for @c newRange
+   * is before the end of the last IOV, then nothing is changed.)
+   *
+   * This is not implemented for mixed containers.
+   */
+  virtual
+  StatusCode extendLastRange (const EventIDRange& newRange,
+                              const EventContext& ctx = Gaudi::Hive::currentContext()) override final;
+
+
+protected:
+  /**
+   * @brief Internal constructor.
+   * @param rcusvc RCU service instance.
+   * @param CLID of the most-derived @c CondCont.
+   * @param id CLID+key for this object.
+   * @param proxy @c DataProxy for this object.
+   * @param payloadDelfcn Deletion function for the actual payload type.
+   * @param capacity Initial capacity of the container.
+   */
+  CondContMixedBase (Athena::IRCUSvc& rcusvc,
+                     CLID clid,
+                     const DataObjID& id,
+                     SG::DataProxy* proxy,
+                     CondContSet::delete_function* payloadDelfcn,
+                     size_t capacity);
+
+
+  /** 
+   * @brief Insert a new conditions object.
+   * @param r Range of validity of this object.
+   * @param t Pointer to the object being inserted.
+   * @param ctx Event context for the current thread.
+   *
+   * Returns SUCCESS if the object was successfully inserted;
+   * OVERLAP if the object was inserted but the range partially overlaps
+   * with an existing one;
+   * DUPLICATE if the object wasn't inserted because the range
+   * duplicates an existing one, and FAILURE otherwise
+   * (ownership of the object will be taken in any case).
+   */
+  StatusCode insertMixed (const EventIDRange& r,
+                          CondContBase::CondContSet::payload_unique_ptr t,
+                          const EventContext& ctx = Gaudi::Hive::currentContext());
+
+
+  /** 
+   * @brief Internal lookup function.
+   * @param t IOV time to find.
+   * @param r If non-null, copy validity range of the object here.
+   *
+   * Looks up the conditions object corresponding to the IOV time @c t.
+   * If found, return the pointer (as a pointer to the payload type
+   * of the most-derived CondCont).  Otherwise, return nullptr.
+   */
+  const void* findMixed (const EventIDBase& t,
+                         EventIDRange const** r) const;
+
+
+  /**
+   * @brief Return the payload deletion function for this container.
+   */
+  delete_function* payloadDelfcn() const;
+
+
+  /**
+   * @brief Do pointer conversion for the payload type.
+   * @param clid CLID for the desired pointer type.
+   * @param ptr Pointer of type @c T*.
+   *
+   * This just aborts, since we don't currently implement inheritance
+   * for mixed types.
+   */
+  virtual const void* doCast(CLID /*clid*/, const void* /*ptr*/) const override;
+
+
+private:
   /// Deletion function to pass to @c ConcurrentRangeMap.
   static void delfcn (const void* p) {
+    delete reinterpret_cast<const CondContSet*>(p);
+  }
+
+  /// Need to remember the RCU svc here in order to pass it to the
+  /// TS maps.
+  Athena::IRCUSvc& m_rcusvc;
+
+  /// Function to delete payload objects.
+  delete_function* m_payloadDelfcn;
+
+  /// Mutex for insertions.
+  std::mutex m_mutex;
+};
+
+
+///////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * @brief Conditions container for which keys are ranges  in both Run+LBN
+ *        and timestamp.
+ *
+ * Don't use this directly; instead declare your container with
+ * @c CONDCONT_MIXED_DEF and then use @c CondCont<T>.
+ */
+template <typename T>
+class CondContMixed: public CondContMixedBase
+{
+public:
+  /// Base class.
+  typedef CondContMixedBase Base;
+
+  typedef typename Base::CondContSet CondContSet;
+
+  /// Payload type held by this class.
+  typedef T Payload;
+
+  typedef CondContBase::key_type key_type;
+
+
+  /// Destructor.
+  virtual ~CondContMixed();
+
+  /// No copying.
+  CondContMixed (const CondContMixed&) = delete;
+  CondContMixed& operator= (const CondContMixed&) = delete;
+
+
+  /** 
+   * @brief Insert a new conditions object.
+   * @param r Range of validity of this object.
+   * @param obj Pointer to the object being inserted.
+   * @param ctx Event context for the current thread.
+   *
+   * @c obj must point to an object of type @c T.
+   * This will give an error if this is not called
+   * on the most-derived @c CondCont.
+   *
+   * Returns SUCCESS if the object was successfully inserted;
+   * OVERLAP if the object was inserted but the range partially overlaps
+   * with an existing one;
+   * DUPLICATE if the object wasn't inserted because the range
+   * duplicates an existing one, and FAILURE otherwise
+   * (ownership of the object will be taken in any case).
+   */
+  StatusCode insert (const EventIDRange& r,
+                     std::unique_ptr<T> obj,
+                     const EventContext& ctx = Gaudi::Hive::currentContext());
+
+
+  /** 
+   * @brief Look up a conditions object for a given time.
+   * @param t IOV time to find.
+   * @param obj[out] Object found.
+   * @param r If non-null, copy validity range of the object here.
+   *
+   * Returns true if the object was found; false otherwide.
+   */
+  bool find (const EventIDBase& t,
+             T const*& obj,
+             EventIDRange const** r = nullptr) const;
+
+
+protected:
+  /** 
+   * @brief Internal Constructor.
+   * @param rcusvc RCU service instance.
+   * @param CLID of the most-derived @c CondCont.
+   * @param id CLID+key for this object.
+   * @param proxy @c DataProxy for this object.
+   * @param capacity Initial capacity of the container.
+   */
+  CondContMixed (Athena::IRCUSvc& rcusvc,
+                 CLID clid,
+                 const DataObjID& id,
+                 SG::DataProxy* proxy,
+                 size_t capacity);
+
+
+public:
+  /// Helper to ensure that the inheritance information for this class
+  /// gets initialized.
+  static void registerBaseInit();
+
+
+private:
+  /// Deletion function to for payload objects.
+  static void payloadDelfcn (const void* p) {
     delete reinterpret_cast<const T*>(p);
   }
 };
 
 
+///////////////////////////////////////////////////////////////////////////
+
+
 #include "AthenaKernel/CondCont.icc"
 #include "AthenaKernel/CondContMaker.h"
 
@@ -751,6 +1261,18 @@ private:
 #define CONDCONT_DEF(...)  \
   BOOST_PP_OVERLOAD(CONDCONT_DEF_, __VA_ARGS__)(__VA_ARGS__)
 
+
+/// Declare a mixed conditions container along with its CLID.
+#define CONDCONT_MIXED_DEF(T, CLID) \
+  template<> class CondCont<T> : public CondContMixed<T> {          \
+  public:                                                           \
+    CondCont (Athena::IRCUSvc& rcusvc, const DataObjID& id,         \
+              SG::DataProxy* proxy =nullptr, size_t capacity = 16)  \
+      : CondContMixed<T> (rcusvc, CLID, id, proxy, capacity) {}     \
+  };                                                                \
+  CLASS_DEF( CondCont<T>, CLID, 1)                                  \
+  static CondContainer::CondContMaker<T> maker_ ## CLID {}
+
   
 #endif // not ATHENAKERNEL_CONDCONT_H
 
diff --git a/Control/AthenaKernel/AthenaKernel/CondCont.icc b/Control/AthenaKernel/AthenaKernel/CondCont.icc
index 2efc2d89559..a0800550a33 100644
--- a/Control/AthenaKernel/AthenaKernel/CondCont.icc
+++ b/Control/AthenaKernel/AthenaKernel/CondCont.icc
@@ -63,13 +63,12 @@ SG::DataProxy* CondContBase::proxy()
 
 
 /**
- * @brief Test to see if a given IOV time is mapped in the container.
- * @param t IOV time to check.
+ * @brief Return the associated @c DataProxy, if any.
  */
 inline
-bool CondContBase::valid (const EventIDBase& t) const
+const SG::DataProxy* CondContBase::proxy() const
 {
-  return findBase (t, nullptr) != nullptr;
+  return m_proxy;
 }
 
 
@@ -114,7 +113,26 @@ CondContBase::key_type CondContBase::keyFromRunLBN (const EventIDBase& b)
 inline
 CondContBase::key_type CondContBase::keyFromTimestamp (const EventIDBase& b)
 {
-  return (static_cast<key_type> (b.time_stamp())<<32) + b.time_stamp_ns_offset();
+  return (static_cast<key_type> (b.time_stamp())*1000000000) + b.time_stamp_ns_offset();
+}
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * @brief Call @c func on each entry in the container.
+ * @param func Functional to call on each entry.
+ *
+ * @c func will be called on each container element
+ * (being passed const CondContSet::value_type&).
+ */
+template <class FUNC>
+void CondContBase::forEach (const FUNC& func) const
+{
+  for (const typename CondContSet::value_type& ent : m_condSet.range()) {
+    func (ent);
+  }
 }
 
 
@@ -155,6 +173,20 @@ CondContBase::RangeKey::RangeKey (const EventIDRange& r,
 ///////////////////////////////////////////////////////////////////////////
 
 
+/**
+ * @brief Test to see if a given IOV time is mapped in the container.
+ * @param t IOV time to check.
+ */
+inline
+bool CondContSingleBase::valid (const EventIDBase& t) const
+{
+  return findBase (t, nullptr) != nullptr;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+
+
 /** 
  * @brief Constructor.
  * @param rcusvc RCU service instance.
@@ -288,7 +320,7 @@ CondCont<T>::CondCont (Athena::IRCUSvc& rcusvc,
                        CLID clid,
                        const DataObjID& id,
                        SG::DataProxy* proxy,
-                       const typename CondContSet::delete_function* delfcn,
+                       typename CondContSet::delete_function* delfcn,
                        size_t capacity)
   : Base (rcusvc, clid, id, proxy, delfcn, capacity)
 {
@@ -333,3 +365,120 @@ void CondCont<T>::registerBaseInit()
 }
 
 
+///////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * @brief Test to see if a given IOV time is mapped in the container.
+ * @param t IOV time to check.
+ */
+inline
+bool CondContMixedBase::valid (const EventIDBase& t) const
+{
+  return findMixed (t, nullptr) != nullptr;
+}
+
+
+///////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * @brief Destructor.
+ */
+template <typename T>
+CondContMixed<T>::~CondContMixed<T>()
+{
+}    
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/** 
+ * @brief Insert a new conditions object.
+ * @param r Range of validity of this object.
+ * @param t Pointer to the object being inserted.
+ * @param ctx Event context for the current thread.
+ *
+ * @c t must point to an object of type @c T.
+ * This will give an error if this is not called
+ * on the most-derived @c CondCont.
+ *
+ * Returns SUCCESS if the object was successfully inserted;
+ * OVERLAP if the object was inserted but the range partially overlaps
+ * with an existing one;
+ * DUPLICATE if the object wasn't inserted because the range
+ * duplicates an existing one, and FAILURE otherwise
+ * (ownership of the object will be taken in any case).
+ */
+template <typename T>
+StatusCode CondContMixed<T>::insert (const EventIDRange& r,
+                                     std::unique_ptr<T> t,
+                                     const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  // Not checking CLID here, since we don't support inheritance for mixed
+  // containers.
+
+  return Base::insertMixed (r, std::move(t), ctx);
+}
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/** 
+ * @brief Look up a conditions object for a given time.
+ * @param t IOV time to find.
+ * @param obj[out] Object found.
+ * @param r If non-null, copy validity range of the object here.
+ *
+ * Returns true if the object was found; false otherwide.
+ */
+template <typename T>
+bool CondContMixed<T>::find (const EventIDBase& t,
+                             T const *& obj,
+                             EventIDRange const** r) const
+{
+  obj = reinterpret_cast<const T*> (Base::findMixed (t, r));
+  return obj != nullptr;
+}
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/** 
+ * @brief Constructor.
+ * @param rcusvc RCU service instance.
+ * @param CLID of the most-derived @c CondCont.
+ * @param id CLID+key for this object.
+ * @param proxy @c DataProxy for this object.
+ * @param capacity Initial capacity of the container.
+ */
+template <class T>
+inline
+CondContMixed<T>::CondContMixed (Athena::IRCUSvc& rcusvc,
+                                 CLID clid,
+                                 const DataObjID& id,
+                                 SG::DataProxy* proxy,
+                                 size_t capacity)
+  : Base (rcusvc, clid, id, proxy, payloadDelfcn, capacity)
+{
+  CondContMixed<T>::registerBaseInit();
+}
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+/**
+ * @brief Helper to ensure that the inheritance information for this class
+ *               gets initialized.
+ */
+template <class T>
+void CondContMixed<T>::registerBaseInit()
+{
+  static const SG::RegisterBaseInit<CondContMixed> rbi;
+}
+
+
diff --git a/Control/AthenaKernel/share/CondCont_test.ref b/Control/AthenaKernel/share/CondCont_test.ref
index ba5de68b9be..e85d4d97ab2 100644
--- a/Control/AthenaKernel/share/CondCont_test.ref
+++ b/Control/AthenaKernel/share/CondCont_test.ref
@@ -1,5 +1,5 @@
 test1
-ClassIDSvc           INFO  getRegistryEntries: read 51 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 52 CLIDRegistry entries for module ALL
 UNKNOWN_CLASS:c...  ERROR CondContBase::insertBase: EventIDRange {[40,l:2] - [t:543]} is neither fully RunEvent nor TimeStamp
 UNKNOWN_CLASS:c...  ERROR CondContBase::erase: Non-Run/LBN key used in Run/LBN container.
 UNKNOWN_CLASS:c...  ERROR CondContBase::erase: Non-Timestamp key used in timestamp container.
@@ -13,4 +13,14 @@ test2
 UNKNOWN_CLASS:c...  ERROR CondContBase::insertBase: EventIDRange {[40,l:2] - [t:543]} is neither fully RunEvent nor TimeStamp
 UNKNOWN_CLASS:c...  ERROR CondCont<T>::insert: Not most-derived class; CLID used: 932847546; container CLID: 932847547
 test3
+test4
+UNKNOWN_CLASS:c...  ERROR CondContMixedBase::insertMixed: Run+lbn part of new range doesn't match existing range. New: {[2,t:150,l:10] - [2,t:150,l:15]}; existing: {[2,t:100,l:10] - [2,t:103.500000000,l:20]}
+UNKNOWN_CLASS:c...  ERROR CondContMixedBase::insertMixed: Range does not have both start and stop timestamps defined.
+UNKNOWN_CLASS:c...  ERROR CondContMixedBase::findMixed: No valid timestamp in key used with mixed container.
+UNKNOWN_CLASS:c...  ERROR CondContBase::findBase: Non-Run/LBN key used in Run/LBN container.
+UNKNOWN_CLASS:c...  ERROR CondContMixedBase::findMixed: No valid timestamp in key used with mixed container.
+UNKNOWN_CLASS:c...  ERROR CondContBase::findBase: Non-Run/LBN key used in Run/LBN container.
+UNKNOWN_CLASS:c...  ERROR CondContMixedBase::erase: erase() is not implemented for mixed containers.
+UNKNOWN_CLASS:c...  ERROR CondContMixedBase::extendLastRange: extendLastRange() is not implemented for mixed containers.
 testThread
+testThreadMixed
diff --git a/Control/AthenaKernel/src/CondCont.cxx b/Control/AthenaKernel/src/CondCont.cxx
index d6731d51cf8..519e61aa7f1 100644
--- a/Control/AthenaKernel/src/CondCont.cxx
+++ b/Control/AthenaKernel/src/CondCont.cxx
@@ -10,6 +10,7 @@
 #include "AthenaKernel/CondCont.h"
 #include "AthenaKernel/getMessageSvc.h"
 #include "CxxUtils/AthUnlikelyMacros.h"
+#include "CxxUtils/checker_macros.h"
 #include "GaudiKernel/MsgStream.h"
 #include <iostream>
 
@@ -94,20 +95,6 @@ void CondContBase::setProxy (SG::DataProxy* proxy)
 }
 
 
-/**
- * @brief Dump the container contents for debugging.
- * @param ost Stream to which to write the dump.
- */
-void CondContBase::list (std::ostream& ost) const
-{
-  ost << "id: " << m_id << "  proxy: " << m_proxy << " ["
-      << m_condSet.size() << "] entries" << std::endl;
-  for (const typename CondContSet::value_type& ent : m_condSet.range()) {
-    ost << ent.first.m_range << " " << ent.second << std::endl;
-  }
-}
-
-
 /**
  * @brief Dump the container to cout.  For calling from the debugger.
  */
@@ -126,108 +113,6 @@ size_t CondContBase::entries() const
 }
 
 
-/**
- * @brief Return all IOV validity ranges defined in this container.
- */
-std::vector<EventIDRange> 
-CondContBase::ranges() const
-{
-  std::vector<EventIDRange> r;
-  r.reserve (m_condSet.size());
-  for (const typename CondContSet::value_type& ent : m_condSet.range()) {
-    r.push_back( ent.first.m_range );
-  }
-
-  return r;
-}
-
-
-/** 
- * @brief Insert a new conditions object.
- * @param r Range of validity of this object.
- * @param obj Pointer to the object being inserted.
- * @param ctx Event context for the current thread.
- *
- * @c obj must point to an object of type @c T,
- * except in the case of inheritance, where the type of @c obj must
- * correspond to the most-derived @c CondCont type.
- * The container will take ownership of this object.
- *
- * Returns SUCCESS if the object was successfully inserted;
- * OVERLAP if the object was inserted but the range partially overlaps
- * with an existing one;
- * DUPLICATE if the object wasn't inserted because the range
- * duplicates an existing one, and FAILURE otherwise
- * (ownership of the object will be taken in any case).
- */
-StatusCode
-CondContBase::typelessInsert (const EventIDRange& r,
-                              void* obj,
-                              const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
-{
-  return insertBase (r,
-                     CondContSet::payload_unique_ptr (obj, m_condSet.delfcn()),
-                     ctx);
-}
-
-
-/**
- * @brief Return the mapped validity range for an IOV time.
- * @param t IOV time to check.
- * @param r[out] The range containing @c t.
- *
- * Returns true if @c t is mapped; false otherwise.
- */
-bool
-CondContBase::range(const EventIDBase& t, EventIDRange& r) const
-{
-  const EventIDRange* rp = nullptr;
-  if (findBase (t, &rp) != nullptr) {
-    r = *rp;
-    return true;
-  }
-  return false;
-}
-
-
-/**
- * @brief Erase the first element not less than @c t.
- * @param IOV time of element to erase.
- * @param ctx Event context for the current thread.
- */
-StatusCode CondContBase::erase (const EventIDBase& t,
-                                const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
-{
-  switch (m_keyType) {
-  case KeyType::RUNLBN:
-    if (!t.isRunLumi()) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
-      msg << MSG::ERROR << "CondContBase::erase: "
-          << "Non-Run/LBN key used in Run/LBN container."
-          << endmsg;
-      return StatusCode::FAILURE;
-    }
-    m_condSet.erase (CondContBase::keyFromRunLBN (t), ctx);
-    break;
-  case KeyType::TIMESTAMP:
-    if (!t.isTimeStamp()) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
-      msg << MSG::ERROR << "CondContBase::erase: "
-          << "Non-Timestamp key used in timestamp container."
-          << endmsg;
-      return StatusCode::FAILURE;
-    }
-    m_condSet.erase (CondContBase::keyFromTimestamp (t), ctx);
-    break;
-  case KeyType::SINGLE:
-    break;
-  default:
-    std::abort();
-  }
-  return StatusCode::SUCCESS;
-}
-
-
 /**
  * @brief Remove unused entries from the front of the list.
  * @param keys List of keys that may still be in use.
@@ -286,63 +171,10 @@ size_t CondContBase::maxSize() const
 }
 
 
-/**
- * @brief Extend the range of the last IOV.
- * @param newRange New validity range.
- * @param ctx Event context.
- *
- * Returns failure if the start time of @c newRange does not match the start time
- * of the last IOV in the container.  Otherwise, the end time for the last
- * IOV is changed to the end time for @c newRange.  (If the end time for @c newRange
- * is before the end of the last IOV, then nothing is changed.)
- */
-StatusCode
-CondContBase::extendLastRange (const EventIDRange& newRange,
-                               const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
-{
-  key_type start;
-  key_type stop;
-  switch (m_keyType) {
-  case KeyType::RUNLBN:
-    if (!newRange.start().isRunLumi()) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
-      msg << MSG::ERROR << "CondContBase::extendLastRange: "
-          << "Non-Run/LBN range used in Run/LBN container."
-          << endmsg;
-      return StatusCode::FAILURE;
-    }
-    start = keyFromRunLBN (newRange.start());
-    stop  = keyFromRunLBN (newRange.stop());
-    break;
-  case KeyType::TIMESTAMP:
-    if (!newRange.start().isTimeStamp()) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
-      msg << MSG::ERROR << "CondContBase::extendLastRange: "
-          << "Non-timestamp range used in timestamp container."
-          << endmsg;
-      return StatusCode::FAILURE;
-    }
-    start = keyFromTimestamp (newRange.start());
-    stop  = keyFromTimestamp (newRange.stop());
-    break;
-  case KeyType::SINGLE:
-    // Empty container.
-    return StatusCode::FAILURE;
-  default:
-    std::abort();
-  }
-  
-  if (m_condSet.extendLastRange (RangeKey (newRange, start, stop), ctx) != nullptr)
-  {
-    return StatusCode::SUCCESS;
-  }
-  return StatusCode::FAILURE;
-}
-
-
 /**
  * @brief Internal constructor.
  * @param rcusvc RCU service instance.
+ * @param keyType Key type for this container.
  * @param CLID of the most-derived @c CondCont.
  * @param id CLID+key for this object.
  * @param proxy @c DataProxy for this object.
@@ -350,12 +182,13 @@ CondContBase::extendLastRange (const EventIDRange& newRange,
  * @param capacity Initial capacity of the container.
  */
 CondContBase::CondContBase (Athena::IRCUSvc& rcusvc,
+                            KeyType keyType,
                             CLID clid,
                             const DataObjID& id,
                             SG::DataProxy* proxy,
                             CondContSet::delete_function* delfcn,
                             size_t capacity)
-  : m_keyType (KeyType::SINGLE),
+  : m_keyType (keyType),
     m_clid (clid),
     m_id (id),
     m_proxy (proxy),
@@ -391,12 +224,26 @@ CondContBase::insertBase (const EventIDRange& r,
 
   key_type start_key, stop_key;
 
-  if (start.isTimeStamp() && stop.isTimeStamp()) {
+  if (m_keyType == KeyType::MIXED) {
+    if (start.run_number() == EventIDBase::UNDEFNUM ||
+        stop.run_number() == EventIDBase::UNDEFNUM)
+    {
+      MsgStream msg (Athena::getMessageSvc(), title());
+      msg << MSG::ERROR << "CondContBase::insertBase: "
+          << "Run part of range invalid in mixed container."
+          << endmsg;
+      return StatusCode::FAILURE;
+    }
+
+    start_key = keyFromRunLBN (start);
+    stop_key  = keyFromRunLBN (stop);
+  }
+  else if (start.isTimeStamp() && stop.isTimeStamp()) {
     if (m_keyType == KeyType::SINGLE) {
       m_keyType = KeyType::TIMESTAMP;
     }
     else if (m_keyType != KeyType::TIMESTAMP) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
+      MsgStream msg (Athena::getMessageSvc(), title());
       msg << MSG::ERROR << "CondContBase::insertBase: "
           << "Timestamp key used in non-timestamp container."
           << endmsg;
@@ -414,7 +261,7 @@ CondContBase::insertBase (const EventIDRange& r,
       m_keyType = KeyType::RUNLBN;
     }
     else if (m_keyType != KeyType::RUNLBN) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
+      MsgStream msg (Athena::getMessageSvc(), title());
       msg << MSG::ERROR << "CondContBase::insertBase: "
           << "Run/LBN key used in non-Run/LBN container."
           << endmsg;
@@ -426,7 +273,7 @@ CondContBase::insertBase (const EventIDRange& r,
   }
 
   else {
-    MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
+    MsgStream msg (Athena::getMessageSvc(), title());
     msg << MSG::ERROR << "CondContBase::insertBase: EventIDRange " << r 
         << " is neither fully RunEvent nor TimeStamp" 
         << endmsg;
@@ -449,6 +296,99 @@ CondContBase::insertBase (const EventIDRange& r,
 }
 
 
+/**
+ * @brief Erase the first element not less than @c t.
+ * @param IOV time of element to erase.
+ * @param ctx Event context for the current thread.
+ */
+StatusCode
+CondContBase::eraseBase (const EventIDBase& t,
+                         const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  switch (m_keyType) {
+  case KeyType::RUNLBN:
+    if (!t.isRunLumi()) {
+      MsgStream msg (Athena::getMessageSvc(), title());
+      msg << MSG::ERROR << "CondContBase::erase: "
+          << "Non-Run/LBN key used in Run/LBN container."
+          << endmsg;
+      return StatusCode::FAILURE;
+    }
+    m_condSet.erase (CondContBase::keyFromRunLBN (t), ctx);
+    break;
+  case KeyType::TIMESTAMP:
+    if (!t.isTimeStamp()) {
+      MsgStream msg (Athena::getMessageSvc(), title());
+      msg << MSG::ERROR << "CondContBase::erase: "
+          << "Non-Timestamp key used in timestamp container."
+          << endmsg;
+      return StatusCode::FAILURE;
+    }
+    m_condSet.erase (CondContBase::keyFromTimestamp (t), ctx);
+    break;
+  case KeyType::SINGLE:
+    break;
+  default:
+    std::abort();
+  }
+  return StatusCode::SUCCESS;
+}
+
+
+/**
+ * @brief Extend the range of the last IOV.
+ * @param newRange New validity range.
+ * @param ctx Event context.
+ *
+ * Returns failure if the start time of @c newRange does not match the start time
+ * of the last IOV in the container.  Otherwise, the end time for the last
+ * IOV is changed to the end time for @c newRange.  (If the end time for @c newRange
+ * is before the end of the last IOV, then nothing is changed.)
+ */
+StatusCode
+CondContBase::extendLastRangeBase (const EventIDRange& newRange,
+                                   const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  key_type start;
+  key_type stop;
+  switch (m_keyType) {
+  case KeyType::RUNLBN:
+    if (!newRange.start().isRunLumi()) {
+      MsgStream msg (Athena::getMessageSvc(), title());
+      msg << MSG::ERROR << "CondContBase::extendLastRange: "
+          << "Non-Run/LBN range used in Run/LBN container."
+          << endmsg;
+      return StatusCode::FAILURE;
+    }
+    start = keyFromRunLBN (newRange.start());
+    stop  = keyFromRunLBN (newRange.stop());
+    break;
+  case KeyType::TIMESTAMP:
+    if (!newRange.start().isTimeStamp()) {
+      MsgStream msg (Athena::getMessageSvc(), title());
+      msg << MSG::ERROR << "CondContBase::extendLastRange: "
+          << "Non-timestamp range used in timestamp container."
+          << endmsg;
+      return StatusCode::FAILURE;
+    }
+    start = keyFromTimestamp (newRange.start());
+    stop  = keyFromTimestamp (newRange.stop());
+    break;
+  case KeyType::SINGLE:
+    // Empty container.
+    return StatusCode::FAILURE;
+  default:
+    std::abort();
+  }
+  
+  if (m_condSet.extendLastRange (RangeKey (newRange, start, stop), ctx) != nullptr)
+  {
+    return StatusCode::SUCCESS;
+  }
+  return StatusCode::FAILURE;
+}
+
+
 /** 
  * @brief Internal lookup function.
  * @param clid CLID for the desired pointer type.
@@ -466,8 +406,9 @@ const void* CondContBase::findBase (const EventIDBase& t,
   key_type key;
   switch (m_keyType) {
   case KeyType::RUNLBN:
+  case KeyType::MIXED:
     if (ATH_UNLIKELY (!t.isRunLumi())) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
+      MsgStream msg (Athena::getMessageSvc(), title());
       msg << MSG::ERROR << "CondContBase::findBase: "
           << "Non-Run/LBN key used in Run/LBN container."
           << endmsg;
@@ -477,7 +418,7 @@ const void* CondContBase::findBase (const EventIDBase& t,
     break;
   case KeyType::TIMESTAMP:
     if (ATH_UNLIKELY (!t.isTimeStamp())) {
-      MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
+      MsgStream msg (Athena::getMessageSvc(), title());
       msg << MSG::ERROR << "CondContBase::findBase: "
           << "Non-timestamp key used in timestamp container."
           << endmsg;
@@ -530,9 +471,464 @@ void CondContBase::setCleanerSvcName (const std::string& name)
  */
 void CondContBase::insertError (CLID usedCLID) const
 {
-  MsgStream msg (Athena::getMessageSvc(), m_id.fullKey());
+  MsgStream msg (Athena::getMessageSvc(), title());
   msg << MSG::ERROR << "CondCont<T>::insert: Not most-derived class; "
       << "CLID used: " << usedCLID
       << "; container CLID: " << m_clid
       << endmsg;
 }
+
+
+/**
+ * @brief Return the deletion function for this container.
+ */
+CondContBase::delete_function* CondContBase::delfcn() const
+{
+  return m_condSet.delfcn();
+}
+
+
+/**
+ * @brief Description of this container to use for Msgstream.
+ */
+std::string CondContBase::title() const
+{
+  return m_id.fullKey();
+}
+
+
+//****************************************************************************
+
+
+/**
+ * @brief Dump the container contents for debugging.
+ * @param ost Stream to which to write the dump.
+ */
+void CondContSingleBase::list (std::ostream& ost) const
+{
+  ost << "id: " << id() << "  proxy: " << proxy() << " ["
+      << entries() << "] entries" << std::endl;
+  forEach ([&] (const CondContSet::value_type& ent)
+           { ost << ent.first.m_range << " " << ent.second << std::endl; });
+}
+
+
+/**
+ * @brief Return all IOV validity ranges defined in this container.
+ */
+std::vector<EventIDRange> 
+CondContSingleBase::ranges() const
+{
+  std::vector<EventIDRange> r;
+  r.reserve (entries());
+
+  forEach ([&] (const CondContSet::value_type& ent)
+           { r.push_back (ent.first.m_range); });
+
+  return r;
+}
+
+
+/** 
+ * @brief Insert a new conditions object.
+ * @param r Range of validity of this object.
+ * @param obj Pointer to the object being inserted.
+ * @param ctx Event context for the current thread.
+ *
+ * @c obj must point to an object of type @c T,
+ * except in the case of inheritance, where the type of @c obj must
+ * correspond to the most-derived @c CondCont type.
+ * The container will take ownership of this object.
+ *
+ * Returns SUCCESS if the object was successfully inserted;
+ * OVERLAP if the object was inserted but the range partially overlaps
+ * with an existing one;
+ * DUPLICATE if the object wasn't inserted because the range
+ * duplicates an existing one, and FAILURE otherwise
+ * (ownership of the object will be taken in any case).
+ */
+StatusCode
+CondContSingleBase::typelessInsert (const EventIDRange& r,
+                                    void* obj,
+                                    const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  return insertBase (r,
+                     CondContSet::payload_unique_ptr (obj, delfcn()),
+                     ctx);
+}
+
+
+/**
+ * @brief Return the mapped validity range for an IOV time.
+ * @param t IOV time to check.
+ * @param r[out] The range containing @c t.
+ *
+ * Returns true if @c t is mapped; false otherwise.
+ */
+bool
+CondContSingleBase::range (const EventIDBase& t, EventIDRange& r) const
+{
+  const EventIDRange* rp = nullptr;
+  if (findBase (t, &rp) != nullptr) {
+    r = *rp;
+    return true;
+  }
+  return false;
+}
+
+
+/**
+ * @brief Erase the first element not less than @c t.
+ * @param IOV time of element to erase.
+ * @param ctx Event context for the current thread.
+ */
+StatusCode
+CondContSingleBase::erase (const EventIDBase& t,
+                           const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  return CondContBase::eraseBase (t, ctx);
+}
+
+
+/**
+ * @brief Extend the range of the last IOV.
+ * @param newRange New validity range.
+ * @param ctx Event context.
+ *
+ * Returns failure if the start time of @c newRange does not match the start time
+ * of the last IOV in the container.  Otherwise, the end time for the last
+ * IOV is changed to the end time for @c newRange.  (If the end time for @c newRange
+ * is before the end of the last IOV, then nothing is changed.)
+ */
+StatusCode
+CondContSingleBase::extendLastRange (const EventIDRange& newRange,
+                                     const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  return CondContBase::extendLastRangeBase (newRange, ctx);
+}
+
+
+/**
+ * @brief Internal constructor.
+ * @param rcusvc RCU service instance.
+ * @param CLID of the most-derived @c CondCont.
+ * @param id CLID+key for this object.
+ * @param proxy @c DataProxy for this object.
+ * @param delfcn Deletion function for the actual payload type.
+ * @param capacity Initial capacity of the container.
+ */
+CondContSingleBase::CondContSingleBase (Athena::IRCUSvc& rcusvc,
+                                        CLID clid,
+                                        const DataObjID& id,
+                                        SG::DataProxy* proxy,
+                                        CondContSet::delete_function* delfcn,
+                                        size_t capacity)
+  : CondContBase (rcusvc, KeyType::SINGLE, clid, id, proxy, delfcn, capacity)
+{
+}
+
+
+//****************************************************************************
+
+
+/**
+ * @brief Internal constructor.
+ * @param rcusvc RCU service instance.
+ * @param CLID of the most-derived @c CondCont.
+ * @param id CLID+key for this object.
+ * @param proxy @c DataProxy for this object.
+ * @param payloadDelfcn Deletion function for the actual payload type.
+ * @param capacity Initial capacity of the container.
+ */
+CondContMixedBase::CondContMixedBase (Athena::IRCUSvc& rcusvc,
+                                      CLID clid,
+                                      const DataObjID& id,
+                                      SG::DataProxy* proxy,
+                                      CondContSet::delete_function* payloadDelfcn,
+                                      size_t capacity)
+  : CondContBase (rcusvc, KeyType::MIXED, clid, id, proxy, delfcn, capacity),
+    m_rcusvc (rcusvc),
+    m_payloadDelfcn (payloadDelfcn)
+{
+}
+
+
+/**
+ * @brief Dump the container contents for debugging.
+ * @param ost Stream to which to write the dump.
+ */
+void CondContMixedBase::list (std::ostream& ost) const
+{
+  ost << "id: " << id() << "  proxy: " << proxy() << " ["
+      << entries() << "] run+lbn entries" << std::endl;
+  forEach ([&] (const CondContSet::value_type& ent)
+           {
+             const CondContSet* tsmap =
+               reinterpret_cast<const CondContSet*> (ent.second);
+             for (const CondContSet::value_type& ent2 : tsmap->range()) {
+               ost << ent2.first.m_range << " " << ent2.second << std::endl;
+             }
+           });
+}
+
+
+/**
+ * @brief Return all IOV validity ranges defined in this container.
+ */
+std::vector<EventIDRange> 
+CondContMixedBase::ranges() const
+{
+  std::vector<EventIDRange> r;
+  r.reserve (entries()*2);
+
+  forEach ([&] (const CondContSet::value_type& ent)
+           {
+             const CondContSet* tsmap =
+               reinterpret_cast<const CondContSet*> (ent.second);
+             for (const CondContSet::value_type& ent2 : tsmap->range()) {
+               r.push_back (ent2.first.m_range);
+             }
+           });
+
+  return r;
+}
+
+
+/** 
+ * @brief Insert a new conditions object.
+ * @param r Range of validity of this object.
+ * @param obj Pointer to the object being inserted.
+ * @param ctx Event context for the current thread.
+ *
+ * @c obj must point to an object of type @c T,
+ * except in the case of inheritance, where the type of @c obj must
+ * correspond to the most-derived @c CondCont type.
+ * The container will take ownership of this object.
+ *
+ * Returns SUCCESS if the object was successfully inserted;
+ * OVERLAP if the object was inserted but the range partially overlaps
+ * with an existing one;
+ * DUPLICATE if the object wasn't inserted because the range
+ * duplicates an existing one, and FAILURE otherwise
+ * (ownership of the object will be taken in any case).
+ */
+StatusCode
+CondContMixedBase::typelessInsert (const EventIDRange& r,
+                                   void* obj,
+                                   const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  return insertMixed (r,
+                      CondContSet::payload_unique_ptr (obj, payloadDelfcn()),
+                      ctx);
+}
+
+
+/**
+ * @brief Return the mapped validity range for an IOV time.
+ * @param t IOV time to check.
+ * @param r[out] The range containing @c t.
+ *
+ * Returns true if @c t is mapped; false otherwise.
+ */
+bool
+CondContMixedBase::range (const EventIDBase& t, EventIDRange& r) const
+{
+  const EventIDRange* rp = nullptr;
+  if (findMixed (t, &rp) != nullptr) {
+    r = *rp;
+    return true;
+  }
+  return false;
+}
+
+
+/**
+ * @brief Erase the first element not less than @c t.
+ * @param IOV time of element to erase.
+ * @param ctx Event context for the current thread.
+ *
+ * This is not implemented for mixed containers.
+ */
+StatusCode
+CondContMixedBase::erase (const EventIDBase& /*t*/,
+                          const EventContext& /*ctx = Gaudi::Hive::currentContext()*/)
+{
+  MsgStream msg (Athena::getMessageSvc(), title());
+  msg << MSG::ERROR << "CondContMixedBase::erase: "
+      << "erase() is not implemented for mixed containers."
+      << endmsg;
+  return StatusCode::FAILURE;
+}
+
+
+/**
+ * @brief Extend the range of the last IOV.
+ * @param newRange New validity range.
+ * @param ctx Event context.
+ *
+ * Returns failure if the start time of @c newRange does not match the start time
+ * of the last IOV in the container.  Otherwise, the end time for the last
+ * IOV is changed to the end time for @c newRange.  (If the end time for @c newRange
+ * is before the end of the last IOV, then nothing is changed.)
+ *
+ * This is not implemented for mixed containers.
+ */
+StatusCode
+CondContMixedBase::extendLastRange (const EventIDRange& /*newRange*/,
+                                    const EventContext& /*ctx = Gaudi::Hive::currentContext()*/)
+{
+  MsgStream msg (Athena::getMessageSvc(), title());
+  msg << MSG::ERROR << "CondContMixedBase::extendLastRange: "
+      << "extendLastRange() is not implemented for mixed containers."
+      << endmsg;
+  return StatusCode::FAILURE;
+}
+
+
+/** 
+ * @brief Insert a new conditions object.
+ * @param r Range of validity of this object.
+ * @param t Pointer to the object being inserted.
+ * @param ctx Event context for the current thread.
+ *
+ * Returns SUCCESS if the object was successfully inserted;
+ * OVERLAP if the object was inserted but the range partially overlaps
+ * with an existing one;
+ * DUPLICATE if the object wasn't inserted because the range
+ * duplicates an existing one, and FAILURE otherwise
+ * (ownership of the object will be taken in any case).
+ */
+StatusCode
+CondContMixedBase::insertMixed (const EventIDRange& r,
+                                CondContBase::CondContSet::payload_unique_ptr t,
+                                const EventContext& ctx /*= Gaudi::Hive::currentContext()*/)
+{
+  // Serialize insertions.  This may not actually be needed, but just in case.
+  std::lock_guard<std::mutex> lock (m_mutex);
+
+  const EventIDRange* range = nullptr;
+  const void* tsmap_void = findBase (r.start(), &range);
+  CondContSet* tsmap ATLAS_THREAD_SAFE =
+    const_cast<CondContSet*>(reinterpret_cast<const CondContSet*> (tsmap_void));
+
+  StatusCode sc = StatusCode::SUCCESS;
+  sc.ignore();
+  if (tsmap) {
+    if (r.start().run_number() != range->start().run_number() ||
+        r.stop().run_number() != range->stop().run_number() ||
+        r.start().lumi_block() != range->start().lumi_block() ||
+        r.stop().lumi_block() != range->stop().lumi_block())
+    {
+      MsgStream msg (Athena::getMessageSvc(), title());
+      msg << MSG::ERROR << "CondContMixedBase::insertMixed: "
+          << "Run+lbn part of new range doesn't match existing range. "
+          << "New: " << r << "; existing: " << *range
+          << endmsg;
+      return StatusCode::FAILURE;
+    }
+  }
+  else {
+    auto newmap = std::make_unique<CondContSet>
+      (Updater_t (m_rcusvc, m_payloadDelfcn), m_payloadDelfcn, 16);
+    tsmap = newmap.get();
+    sc = insertBase (r, std::move (newmap), ctx);
+    if (sc.isFailure()) {
+      return sc;
+    }
+    else if (Category::isDuplicate (sc)) {
+      // Shouldn't happen...
+      std::abort();
+    }
+  }
+
+  if (!r.start().isTimeStamp() || !r.stop().isTimeStamp())
+  {
+    MsgStream msg (Athena::getMessageSvc(), title());
+    msg << MSG::ERROR << "CondContMixedBase::insertMixed: "
+        << "Range does not have both start and stop timestamps defined."
+        << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  key_type start_key = keyFromTimestamp (r.start());
+  key_type stop_key  = keyFromTimestamp (r.stop());
+
+  CondContSet::EmplaceResult reslt =
+    tsmap->emplace ( RangeKey(r, start_key, stop_key),
+                     std::move(t), ctx );
+
+  if (reslt == CondContSet::EmplaceResult::DUPLICATE)
+  {
+    return CondContStatusCode::DUPLICATE;
+  }
+  else if (reslt == CondContSet::EmplaceResult::OVERLAP) {
+    return CondContStatusCode::OVERLAP;
+  }
+  
+  return sc;
+}
+
+
+/** 
+ * @brief Internal lookup function.
+ * @param t IOV time to find.
+ * @param r If non-null, copy validity range of the object here.
+ *
+ * Looks up the conditions object corresponding to the IOV time @c t.
+ * If found, return the pointer (as a pointer to the payload type
+ * of the most-derived CondCont).  Otherwise, return nullptr.
+ */
+const void*
+CondContMixedBase::findMixed (const EventIDBase& t,
+                              EventIDRange const** r) const
+{
+  const void* ptr = CondContBase::findBase (t, nullptr);
+  if (!ptr) return nullptr;
+
+  if (!t.isTimeStamp()) {
+    MsgStream msg (Athena::getMessageSvc(), title());
+    msg << MSG::ERROR << "CondContMixedBase::findMixed: "
+        << "No valid timestamp in key used with mixed container."
+        << endmsg;
+    return nullptr;
+  }
+
+  const CondContSet* tsmap = reinterpret_cast<const CondContSet*> (ptr);
+  key_type key = keyFromTimestamp (t);
+  CondContSet::const_iterator it = tsmap->find (key);
+
+  if (it && key < it->first.m_stop) {
+    if (r) {
+      *r = &it->first.m_range;
+    }
+    ptr = it->second;
+  }
+  else {
+    ptr = nullptr;
+  }
+
+  return ptr;
+}
+
+
+/**
+ * @brief Return the payload deletion function for this container.
+ */
+CondContBase::delete_function* CondContMixedBase::payloadDelfcn() const
+{
+  return m_payloadDelfcn;
+}
+
+
+/**
+ * @brief Do pointer conversion for the payload type.
+ * @param clid CLID for the desired pointer type.
+ * @param ptr Pointer of type @c T*.
+ *
+ * This just aborts, since we don't currently implement inheritance
+ * for mixed types.
+ */
+const void* CondContMixedBase::doCast (CLID /*clid*/, const void* /*ptr*/) const
+{
+  std::abort();
+}
diff --git a/Control/AthenaKernel/test/CondCont_test.cxx b/Control/AthenaKernel/test/CondCont_test.cxx
index 4b7baabe321..4bc3b0aef41 100644
--- a/Control/AthenaKernel/test/CondCont_test.cxx
+++ b/Control/AthenaKernel/test/CondCont_test.cxx
@@ -130,6 +130,14 @@ CONDCONT_BASE(D, B);
 CLASS_DEF(CondCont<B>, 932847546, 0)
 CLASS_DEF(CondCont<D>, 932847547, 0)
 
+CLASS_DEF(CondContMixed<B>, 932847548, 0)
+
+
+bool succ (StatusCode sc)
+{
+  return sc.getCode() == static_cast<StatusCode::code_t>(StatusCode::SUCCESS);
+}
+
 
 EventIDBase runlbn (int run, int lbn)
 {
@@ -149,6 +157,16 @@ EventIDBase timestamp (int t)
 }
 
 
+EventIDBase mixed (int run, int lbn, float t)
+{
+  return EventIDBase (run,  // run
+                      EventIDBase::UNDEFEVT,  // event
+                      int(t),
+                      int((t - int(t)) * 1e9), // timestamp ns
+                      lbn);
+}
+
+
 const EventIDRange r1 (runlbn (10, 15), runlbn (10, 20));
 const EventIDRange r2 (runlbn (20, 17), runlbn (EventIDBase::UNDEFNUM/2, EventIDBase::UNDEFNUM/2));
 const EventIDRange r3 (timestamp (123), timestamp (456));
@@ -183,9 +201,9 @@ void fillit (CondCont<T>& cc_rl, CondCont<T>& cc_ts, std::vector<T*> & ptrs)
   ptrs.push_back (new T(2));
   ptrs.push_back (new T(3));
 
-  assert( cc_rl.typelessInsert (r1, ptrs[0]).isSuccess() );
-  assert( cc_rl.typelessInsert (r2, ptrs[1]).isSuccess() );
-  assert( cc_ts.insert (r3, std::unique_ptr<T> (ptrs[2])).isSuccess() );
+  assert(succ( cc_rl.typelessInsert (r1, ptrs[0]) ));
+  assert(succ( cc_rl.typelessInsert (r2, ptrs[1]) ));
+  assert(succ( cc_ts.insert (r3, std::unique_ptr<T> (ptrs[2])) ));
   {
     StatusCode sc = cc_ts.insert (r3, std::make_unique<T> (99));
     assert (sc.isSuccess());
@@ -421,7 +439,155 @@ void test3 (TestRCUSvc& rcusvc)
 }
 
 
-//*******************************************************************************
+class CondContMixedTest
+  : public CondContMixed<B>
+{
+public:
+  CondContMixedTest (Athena::IRCUSvc& rcusvc, const DataObjID& id)
+    : CondContMixed<B> (rcusvc, ClassID_traits<CondContMixed<B> >::ID(),
+                        id, nullptr, 16)
+  {
+  }
+};
+
+
+// Testing mixed keys.
+void test4 (TestRCUSvc& rcusvc)
+{
+  std::cout << "test4\n";
+  DataObjID id ("cls", "key");
+
+  std::vector<B*> bptrs;
+  for (int i=0; i < 6; i++) {
+    bptrs.push_back (new B(i+1));
+  }
+
+  // Insert
+
+  CondContMixedTest cc (rcusvc, id);
+  assert (cc.keyType() == CondContBase::KeyType::MIXED);
+
+  assert (succ (cc.insert (EventIDRange (mixed(1, 10, 1),
+                                         mixed(1, 20, 2)),
+                           std::unique_ptr<B>(bptrs[0]))) );
+  assert (succ (cc.insert (EventIDRange (mixed(1, 10, 2),
+                                         mixed(1, 20, 4.5)),
+                           std::unique_ptr<B>(bptrs[1]))) );
+
+  assert (succ (cc.insert (EventIDRange (mixed(1, 30, 25),
+                                         mixed(1, 40, 30)),
+                           std::unique_ptr<B>(bptrs[2]))) );
+
+  assert (succ (cc.insert (EventIDRange (mixed(2, 10, 100),
+                                         mixed(2, 20, 103.5)),
+                           std::unique_ptr<B>(bptrs[3]))) );
+  assert (succ (cc.insert (EventIDRange (mixed(2, 10, 103.5),
+                                         mixed(2, 20, 110)),
+                           std::unique_ptr<B>(bptrs[4]))) );
+  assert (succ (cc.typelessInsert (EventIDRange (mixed(2, 10, 120),
+                                                 mixed(2, 20, 130)),
+                                   bptrs[5])) );
+
+  assert (cc.insert (EventIDRange (mixed(2, 10, 150),
+                                   mixed(2, 15, 150)),
+                     std::make_unique<B>(7)).isFailure());
+  assert (cc.insert (EventIDRange (mixed(2, 10, 150),
+                                   runlbn(2, 20)),
+                     std::make_unique<B>(8)).isFailure());
+
+  StatusCode sc = cc.insert (EventIDRange (mixed(2, 10, 120),
+                                           mixed(2, 20, 130)),
+                             std::make_unique<B>(9));
+  assert (sc.isSuccess());
+  assert (CondContBase::Category::isDuplicate (sc));
+
+
+  // List
+  std::ostringstream ss1;
+  cc.list (ss1);
+  std::ostringstream exp1;
+  exp1 << "id:  ( 'UNKNOWN_CLASS:cls' , 'key' )   proxy: 0 [3] run+lbn entries\n";
+  exp1 << "{[1,t:1,l:10] - [1,t:2,l:20]} " << bptrs[0] << "\n";
+  exp1 << "{[1,t:2,l:10] - [1,t:4.500000000,l:20]} " << bptrs[1] << "\n";
+  exp1 << "{[1,t:25,l:30] - [1,t:30,l:40]} " << bptrs[2] << "\n";
+  exp1 << "{[2,t:100,l:10] - [2,t:103.500000000,l:20]} " << bptrs[3] << "\n";
+  exp1 << "{[2,t:103.500000000,l:10] - [2,t:110,l:20]} " << bptrs[4] << "\n";
+  exp1 << "{[2,t:120,l:10] - [2,t:130,l:20]} " << bptrs[5] << "\n";
+  //std::cout << "ss1: " << ss1.str() << "\nexp1: " << exp1.str() << "\n";
+  assert (ss1.str() == exp1.str());
+
+
+  // Ranges
+  std::vector<EventIDRange> rvec = cc.ranges();
+  assert (rvec.size() == 6);
+  assert (rvec[0] == EventIDRange (mixed(1, 10,   1),   mixed(1, 20,   2)));
+  assert (rvec[1] == EventIDRange (mixed(1, 10,   2),   mixed(1, 20,   4.5)));
+  assert (rvec[2] == EventIDRange (mixed(1, 30,  25),   mixed(1, 40,  30)));
+  assert (rvec[3] == EventIDRange (mixed(2, 10, 100),   mixed(2, 20, 103.5)));
+  assert (rvec[4] == EventIDRange (mixed(2, 10, 103.5), mixed(2, 20, 110)));
+  assert (rvec[5] == EventIDRange (mixed(2, 10, 120),   mixed(2, 20, 130)));
+
+
+  // Find
+  const EventIDRange* range = nullptr;
+  const B* obj = nullptr;
+  assert (!cc.find (runlbn(1, 10), obj, &range));
+  assert (!cc.find (timestamp(110), obj, &range));
+
+  assert (cc.find (mixed(1, 12, 3), obj, &range));
+  assert (obj->m_x == 2);
+  assert (*range == EventIDRange (mixed(1, 10,   2),   mixed(1, 20,   4.5)));
+
+  assert (cc.find (mixed(1, 35, 25), obj, &range));
+  assert (obj->m_x == 3);
+  assert (*range == EventIDRange (mixed(1, 30,  25),   mixed(1, 40,  30)));
+                             
+  assert (cc.find (mixed(2, 12, 103.7), obj, &range));
+  assert (obj->m_x == 5);
+  assert (*range == EventIDRange (mixed(2, 10, 103.5), mixed(2, 20, 110)));
+
+  assert (!cc.find (mixed(1, 12, 10), obj, &range));
+  assert (!cc.find (mixed(1,  8,  3), obj, &range));
+  assert (!cc.find (mixed(1, 35, 20), obj, &range));
+  assert (!cc.find (mixed(2, 15, 115), obj, &range));
+
+
+  // Valid
+  assert (!cc.valid (runlbn(1, 10)));
+  assert (!cc.valid (timestamp(110)));
+
+  assert (cc.valid (mixed(1, 12, 3)));
+  assert (cc.valid (mixed(1, 35, 25)));
+  assert (cc.valid (mixed(2, 12, 103.7)));
+
+  assert (!cc.valid (mixed(1, 12, 10)));
+  assert (!cc.valid (mixed(1,  8,  3)));
+  assert (!cc.valid (mixed(1, 35, 20)));
+  assert (!cc.valid (mixed(2, 15, 115)));
+
+
+  // Range
+  EventIDRange r2;
+  assert (cc.range (mixed(1, 35, 25), r2));
+  assert (r2 == EventIDRange (mixed(1, 30,  25),   mixed(1, 40,  30)));
+  assert (!cc.range (mixed(1, 35, 20), r2));
+
+
+  // Insert w/overlap
+  sc = cc.insert (EventIDRange (mixed (2, 10, 125),
+                                mixed (2, 20, 127)),
+                  std::make_unique<B> (11));
+  assert (CondContBase::Category::isOverlap (sc));
+
+
+  // Erase/extendLastRange
+  assert (cc.erase (mixed(2, 10, 100)).isFailure());
+  assert (cc.extendLastRange (EventIDRange (mixed(2, 10, 125),
+                                            mixed(2, 20, 200))).isFailure());
+}
+
+
+//******************************************************************************
 
 
 std::shared_timed_mutex start_mutex;
@@ -631,6 +797,210 @@ void testThread (TestRCUSvc& rcusvc)
 }
 
 
+//******************************************************************************
+
+
+class testThread_MixedWriter
+  : public testThread_Base
+{
+public:
+  testThread_MixedWriter (int slot, CondContMixedTest& map);
+  void operator()();
+  EventIDRange makeRange (int i);
+
+private:
+  CondContMixedTest& m_map;
+};
+
+
+testThread_MixedWriter::testThread_MixedWriter (int slot, CondContMixedTest& map)
+  : testThread_Base (slot),
+    m_map (map)
+{
+}
+
+
+void testThread_MixedWriter::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  for (int i=0; i < nwrites; i++) {
+    if (i >= ninflight/2) {
+      std::vector<CondContBase::key_type> keys;
+      keys.reserve (ninflight/2);
+      for (int j = i/2-ninflight/2; j<i/2; j++) {
+        keys.push_back (j);
+      }
+      m_map.trim (keys);
+    }
+    EventIDRange r = makeRange(i);
+    int payload = r.start().lumi_block() + r.start().time_stamp();
+    assert (m_map.insert (r, std::make_unique<B> (payload), ctx()).isSuccess());
+    m_map.quiescent (ctx());
+    if (((i+1)%128) == 0) {
+      usleep (1000);
+    }
+  }
+}
+
+
+EventIDRange testThread_MixedWriter::makeRange (int i)
+{
+  //                  111111111
+  //        0123456789012345678  // i
+  //
+  //        0011223344556677889  // lb
+  //        0112233445566778899  // ts
+
+  unsigned int lbn = i / 2;
+  unsigned int ts = (i+1)/2 * 1000;
+  EventIDBase start (0, 0, ts,   0, lbn);
+  EventIDBase stop  (0, 0, ts+1, 0, lbn+1);
+  return EventIDRange (start, stop);
+}
+
+
+class testThread_MixedIterator
+  : public testThread_Base
+{
+public:
+  testThread_MixedIterator (int slot, CondContMixedTest& map);
+  void operator()();
+
+private:
+  CondContMixedTest& m_map;
+};
+
+
+testThread_MixedIterator::testThread_MixedIterator (int slot, CondContMixedTest& map)
+  : testThread_Base (slot),
+    m_map (map)
+{
+}
+
+
+void testThread_MixedIterator::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  bool full = false;
+  while (true) {
+    int sz = static_cast<int>(m_map.entries());
+    if (full) {
+      assert (std::abs (sz - ninflight/2) <= 1);
+    }
+    std::vector<EventIDRange> rvec = m_map.ranges();
+    sz = rvec.size();
+    if (full) {
+      assert (std::abs (sz - ninflight) <= 2);
+    }
+
+    if (sz >= ninflight) {
+      full = true;
+    }
+
+    for (const EventIDRange& r : rvec) {
+      const B* obj;
+      if (m_map.find (r.start(), obj)) {
+        assert (obj->m_x == static_cast<int>(r.start().lumi_block() + r.start().time_stamp()));
+      }
+    }
+
+    if (sz > 0 && (rvec.end()-1)->start().lumi_block() == (nwrites-1)/2) break;
+
+    m_map.quiescent (ctx());
+  }
+}
+
+
+class testThread_MixedReader
+  : public testThread_Base
+{
+public:
+  testThread_MixedReader (int slot, CondContMixedTest& map);
+  void operator()();
+
+private:
+  CondContMixedTest& m_map;
+  uint32_t m_seed;
+};
+
+
+testThread_MixedReader::testThread_MixedReader (int slot, CondContMixedTest& map)
+  : testThread_Base (slot),
+    m_map (map),
+    m_seed (slot * 123)
+{
+}
+
+
+void testThread_MixedReader::operator()()
+{
+  setContext();
+  std::shared_lock<std::shared_timed_mutex> lock (start_mutex);
+
+  while (true) {
+    std::vector<EventIDRange> rvec = m_map.ranges();
+    if (rvec.empty()) continue;
+    const EventIDBase& stop = (rvec.end()-1)->stop();
+    const EventIDBase& start = rvec.begin()->start();
+    unsigned int lb = Athena_test::randi_seed (m_seed,
+                                               stop.lumi_block()-1,
+                                               start.lumi_block());
+    unsigned int ts = Athena_test::randi_seed (m_seed,
+                                               stop.time_stamp()-1,
+                                               start.time_stamp());
+    EventIDBase key (0, 0, ts, 0, lb);
+    const B* obj = nullptr;
+    const EventIDRange* rr = nullptr;
+    if (m_map.find (key, obj, &rr)) {
+      assert (lb >= rr->start().lumi_block() && lb < rr->stop().lumi_block());
+      assert (ts >= rr->start().time_stamp() && ts < rr->stop().time_stamp());
+      assert (obj->m_x == static_cast<int> (rr->start().lumi_block() + rr->start().time_stamp()));
+    }
+
+    if ((rvec.end()-1)->start().lumi_block() == (nwrites-1)/2) break;
+    m_map.quiescent (ctx());
+  }
+}
+
+
+void testThreadMixed_iter (TestRCUSvc& rcusvc)
+{
+  DataObjID id ("cls", "key");
+  CondContMixedTest condcont (rcusvc, id);
+
+  const int nthread = 4;
+  std::thread threads[nthread];
+  start_mutex.lock();
+
+  threads[0] = std::thread (testThread_MixedWriter (0, condcont));
+  threads[1] = std::thread (testThread_MixedIterator (1, condcont));
+  threads[2] = std::thread (testThread_MixedReader (2, condcont));
+  threads[3] = std::thread (testThread_MixedReader (3, condcont));
+
+  // Try to get the threads starting as much at the same time as possible.
+  start_mutex.unlock();
+  for (int i=0; i < nthread; i++)
+    threads[i].join();
+}
+
+
+void testThreadMixed (TestRCUSvc& rcusvc)
+{
+  std::cout << "testThreadMixed\n";
+
+  for (int i=0; i < 10; i++) {
+    testThreadMixed_iter (rcusvc);
+  }
+}
+
+
+//******************************************************************************
+
+
 int main ATLAS_NOT_THREAD_SAFE ()
 {
   CondContBase::setCleanerSvcName ("ConditionsCleanerTest");
@@ -647,6 +1017,8 @@ int main ATLAS_NOT_THREAD_SAFE ()
   test1 (rcusvc);
   test2 (rcusvc);
   test3 (rcusvc);
+  test4 (rcusvc);
   testThread (rcusvc);
+  testThreadMixed (rcusvc);
   return 0;
 }
diff --git a/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx b/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx
index 761ce45eb04..ea73fc3415f 100644
--- a/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx
+++ b/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx
@@ -225,6 +225,7 @@ DelayedConditionsCleanerSvc::event (const EventContext& ctx, bool allowAsync)
         case KeyType::SINGLE:
           break;
         case KeyType::RUNLBN:
+        case KeyType::MIXED:
           ci_runlbn.push_back (ci);
           break;
         case KeyType::TIMESTAMP:
diff --git a/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx b/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx
index 90789b786ee..3215a0cceb3 100644
--- a/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx
+++ b/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx
@@ -42,11 +42,43 @@ class CondContTest
 {
 public:
   CondContTest (Athena::IRCUSvc& rcusvc, const DataObjID& id)
-    : CondContBase (rcusvc, 123, id, nullptr, nullptr, 0)
+    : CondContBase (rcusvc, KeyType::SINGLE, 123, id, nullptr, nullptr, 0)
   {}
 
   virtual const void* doCast (CLID /*clid*/, const void* /*ptr*/) const override
   { std::abort(); }
+
+  virtual
+  void list (std::ostream& /*ost*/) const override
+  { std::abort(); }
+
+  virtual
+  std::vector<EventIDRange> ranges() const override
+  { std::abort(); }
+
+  virtual
+  StatusCode typelessInsert (const EventIDRange& /*r*/,
+                             void* /*obj*/,
+                             const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override
+  { std::abort(); }
+
+  virtual
+  bool valid( const EventIDBase& /*t*/) const override
+  { std::abort(); }
+
+  virtual
+  bool range (const EventIDBase& /*t*/, EventIDRange& /*r*/) const override
+  { std::abort(); }
+
+  virtual
+  StatusCode erase (const EventIDBase& /*t*/,
+                    const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override
+  { std::abort(); }
+
+  virtual
+  StatusCode extendLastRange (const EventIDRange& /*newRange*/,
+                              const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override
+  { std::abort(); }
 };
 
 
diff --git a/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx b/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx
index 115af550e5d..f36a61ef030 100644
--- a/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx
+++ b/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx
@@ -72,7 +72,7 @@ public:
   static void delfcn (const void*) {}
   CondContTest (Athena::IRCUSvc& rcusvc, const DataObjID& id, int n,
                 CondContBase::KeyType keyType)
-    : CondContBase (rcusvc, 123, id, nullptr, delfcn, 0),
+    : CondContBase (rcusvc, KeyType::SINGLE, 123, id, nullptr, delfcn, 0),
       m_n (n)
   {
     // Do a dummy insert to set the key type.
@@ -113,7 +113,44 @@ public:
     return v;
   }
 
+  virtual
+  void list (std::ostream& /*ost*/) const override
+  { std::abort(); }
+
+  virtual
+  bool valid( const EventIDBase& /*t*/) const override
+  { std::abort(); }
+
+  virtual
+  bool range (const EventIDBase& /*t*/, EventIDRange& /*r*/) const override
+  { std::abort(); }
+
+  virtual
+  StatusCode erase (const EventIDBase& /*t*/,
+                    const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override
+  { std::abort(); }
   
+  virtual
+  std::vector<EventIDRange> ranges() const override
+  { std::abort(); }
+
+  virtual
+  StatusCode typelessInsert (const EventIDRange& r,
+                             void* obj,
+                             const EventContext& ctx = Gaudi::Hive::currentContext()) override
+  {
+    return insertBase (r,
+                       CondContSet::payload_unique_ptr (obj, delfcn),
+                       ctx);
+  }
+
+
+  virtual
+  StatusCode extendLastRange (const EventIDRange& /*newRange*/,
+                              const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override
+  { std::abort(); }
+
+
 private:
   int m_n;
   std::list<std::vector<key_type> > m_keys;
diff --git a/Control/DataModelTest/DataModelRunTests/share/CondReader.ref b/Control/DataModelTest/DataModelRunTests/share/CondReader.ref
index 6ea310e1a79..949f0f0f281 100644
--- a/Control/DataModelTest/DataModelRunTests/share/CondReader.ref
+++ b/Control/DataModelTest/DataModelRunTests/share/CondReader.ref
@@ -1,13 +1,13 @@
-Thu Dec  6 06:25:07 CET 2018
+Tue Dec 11 15:25:53 CET 2018
 Preloading tcmalloc_minimal.so
 Py:Athena            INFO including file "AthenaCommon/Preparation.py"
-Py:Athena            INFO using release [AthenaWorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3/fa0fd6d0989] -- built on [2018-12-06T0538]
+Py:Athena            INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3g/fc1ea6b7761] -- built on [2018-12-11T1514]
 Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
 Py:Athena            INFO executing ROOT6Setup
 Py:Athena            INFO including file "AthenaCommon/Execution.py"
 Py:Athena            INFO including file "DataModelRunTests/CondReader_jo.py"
 Py:Athena            INFO including file "AthenaPoolCnvSvc/AthenaPool_jobOptions.py"
-Py:ConfigurableDb    INFO Read module info for 5473 configurables from 53 genConfDb files
+Py:ConfigurableDb    INFO Read module info for 5443 configurables from 42 genConfDb files
 Py:ConfigurableDb    INFO No duplicates have been found: that's good !
 Py:Athena            INFO including file "DataModelRunTests/loadReadDicts.py"
 EventInfoMgtInit: Got release version  Athena-22.0.1
@@ -18,7 +18,7 @@ ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to leve
 ApplicationMgr    SUCCESS 
 ====================================================================================================================================
                                                    Welcome to ApplicationMgr (GaudiCoreSvc v30r5)
-                                          running on lxplus077.cern.ch on Thu Dec  6 06:25:23 2018
+                                          running on lxplus079.cern.ch on Tue Dec 11 15:26:12 2018
 ====================================================================================================================================
 ApplicationMgr       INFO Successfully loaded modules : AthenaServices
 ApplicationMgr       INFO Application Manager Configured successfully
@@ -30,7 +30,7 @@ ClassIDSvc           INFO  getRegistryEntries: read 2946 CLIDRegistry entries fo
 CoreDumpSvc          INFO install f-a-t-a-l handler... (flag = -1)
 CoreDumpSvc          INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) 
 AthenaEventLoopMgr   INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00
-ClassIDSvc           INFO  getRegistryEntries: read 1818 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 1877 CLIDRegistry entries for module ALL
 CondInputLoader      INFO Initializing CondInputLoader...
 MetaDataSvc          INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00
 AthenaPoolCnvSvc     INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00
@@ -38,8 +38,8 @@ PoolSvc              INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.x
 PoolSvc              INFO Set connectionsvc retry/timeout/IDLE timeout to  'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled
 PoolSvc              INFO Frontier compression level set to 5
 DBReplicaSvc         INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data
-DBReplicaSvc         INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-04T2300/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
-DBReplicaSvc         INFO Total of 10 servers found for host lxplus077.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ]
+DBReplicaSvc         INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-10T2259/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
+DBReplicaSvc         INFO Total of 10 servers found for host lxplus079.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ]
 PoolSvc              INFO Successfully setup replica sorting algorithm
 PoolSvc              INFO Setting up APR FileCatalog and Streams
 PoolSvc              INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml
@@ -49,20 +49,26 @@ IOVDbSvc             INFO Opened read transaction for POOL PersistencySvc
 IOVDbSvc             INFO Only 5 POOL conditions files will be open at once
 IOVDbSvc             INFO Cache alignment will be done in 3 slices
 IOVDbFolder          INFO Read from meta data only for folder /TagInfo
-IOVDbSvc             INFO Initialised with 2 connections and 3 folders
+IOVDbSvc             INFO Initialised with 2 connections and 5 folders
 IOVDbSvc             INFO Service IOVDbSvc initialised successfully
 IOVDbSvc             INFO preLoadAddresses: Removing folder /TagInfo. It should only be in the file meta data and was not found.
 IOVDbSvc             INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200
-ClassIDSvc           INFO  getRegistryEntries: read 1341 CLIDRegistry entries for module ALL
 IOVSvc               INFO No IOVSvcTool associated with store "StoreGateSvc"
 IOVSvcTool           INFO IOVRanges will be checked at every Event
+ClassIDSvc           INFO  getRegistryEntries: read 1341 CLIDRegistry entries for module ALL
 IOVDbSvc             INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200
+IOVDbSvc             INFO Added taginfo remove for /DMTest/RLTest
 IOVDbSvc             INFO Added taginfo remove for /DMTest/S2
+IOVDbSvc             INFO Added taginfo remove for /DMTest/TSTest
 IOVDbSvc             INFO Added taginfo remove for /DMTest/TestAttrList
 CondInputLoader      INFO Adding base classes:
+  +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' )   ->
+  +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' )   ->
   +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' )   ->
   +  ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' )   -> DMTest::S1 (243020043)
 CondInputLoader      INFO Will create WriteCondHandle dependencies for the following DataObjects:
+    +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) 
+    +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) 
     +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) 
     +  ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) 
     +  ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) 
@@ -73,7 +79,9 @@ HistogramPersis...WARNING Histograms saving not required.
 EventSelector        INFO  Enter McEventSelector Initialization 
 AthenaEventLoopMgr   INFO Setup EventSelector service EventSelector
 ApplicationMgr       INFO Application Manager Initialized successfully
-ClassIDSvc           INFO  getRegistryEntries: read 7219 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 7221 CLIDRegistry entries for module ALL
+CondInputLoader      INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/RLTest'
+CondInputLoader      INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TSTest'
 CondInputLoader      INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TestAttrList'
 CondInputLoader      INFO created CondCont<DMTest::S2> with key 'ConditionStore+/DMTest/S2'
 ApplicationMgr       INFO Application Manager Started successfully
@@ -85,130 +93,280 @@ ClassIDSvc           INFO  getRegistryEntries: read 109 CLIDRegistry entries for
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #0, run #0 0 events processed so far  <<<===
 IOVDbSvc             INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200
 IOVDbSvc             INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200
-Domain[ROOT_All]     INFO ->  Access   DbDatabase   READ      [ROOT_All] F67004F9-6082-4B4C-B52D-88A1A76CF991
+Domain[ROOT_All]     INFO ->  Access   DbDatabase   READ      [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7
 Domain[ROOT_All]     INFO                           condtest.pool.root
 RootDatabase.open    INFO condtest.pool.root File version:61404
 DMTest::CondRea...   INFO Event 0 LBN 0
 DMTest::CondRea...   INFO   xint xint (int) : 10
 DMTest::CondRea...   INFO   scond 1000
 DMTest::CondRea...   INFO   s2 0
+DMTest::CondRea...   INFO   rl xint (int) : 1
+DMTest::CondRea...   INFO   ts xint (int) : 100
+DMTest::CondRea...   INFO   s3 101
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #0, run #0 1 events processed so far  <<<===
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #1, run #0 1 events processed so far  <<<===
 DMTest::CondRea...   INFO Event 1 LBN 0
 DMTest::CondRea...   INFO   xint xint (int) : 10
 DMTest::CondRea...   INFO   scond 1000
 DMTest::CondRea...   INFO   s2 0
+DMTest::CondRea...   INFO   rl xint (int) : 1
+DMTest::CondRea...   INFO   ts xint (int) : 100
+DMTest::CondRea...   INFO   s3 101
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #1, run #0 2 events processed so far  <<<===
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #2, run #0 2 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 2 LBN 1
-DMTest::CondRea...   INFO   xint xint (int) : 20
-DMTest::CondRea...   INFO   scond 2000
+DMTest::CondRea...   INFO Event 2 LBN 0
+DMTest::CondRea...   INFO   xint xint (int) : 10
+DMTest::CondRea...   INFO   scond 1000
 DMTest::CondRea...   INFO   s2 0
+DMTest::CondRea...   INFO   rl xint (int) : 1
+DMTest::CondRea...   INFO   ts xint (int) : 100
+DMTest::CondRea...   INFO   s3 101
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #2, run #0 3 events processed so far  <<<===
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #3, run #0 3 events processed so far  <<<===
 DMTest::CondRea...   INFO Event 3 LBN 1
 DMTest::CondRea...   INFO   xint xint (int) : 20
 DMTest::CondRea...   INFO   scond 2000
 DMTest::CondRea...   INFO   s2 0
+DMTest::CondRea...   INFO   rl xint (int) : 2
+DMTest::CondRea...   INFO   ts xint (int) : 200
+DMTest::CondRea...   INFO   s3 202
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #3, run #0 4 events processed so far  <<<===
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #4, run #0 4 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 4 LBN 2
+DMTest::CondRea...   INFO Event 4 LBN 1
+DMTest::CondRea...   INFO   xint xint (int) : 20
+DMTest::CondRea...   INFO   scond 2000
+DMTest::CondRea...   INFO   s2 0
+DMTest::CondRea...   INFO   rl xint (int) : 2
+DMTest::CondRea...   INFO   ts xint (int) : 200
+DMTest::CondRea...   INFO   s3 202
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #0 5 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #5, run #0 5 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 5 LBN 1
+DMTest::CondRea...   INFO   xint xint (int) : 20
+DMTest::CondRea...   INFO   scond 2000
+DMTest::CondRea...   INFO   s2 0
+DMTest::CondRea...   INFO   rl xint (int) : 2
+DMTest::CondRea...   INFO   ts xint (int) : 200
+DMTest::CondRea...   INFO   s3 202
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #0 6 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #6, run #0 6 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 6 LBN 2
 DMTest::CondRea...   INFO   xint xint (int) : 30
 DMTest::CondRea...   INFO   scond 3000
 DMTest::CondRea...   INFO   s2 100
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #4, run #0 5 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #5, run #0 5 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 5 LBN 2
+DMTest::CondRea...   INFO   rl xint (int) : 2
+DMTest::CondRea...   INFO   ts xint (int) : 300
+DMTest::CondRea...   INFO   s3 302
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #0 7 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #7, run #0 7 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 7 LBN 2
 DMTest::CondRea...   INFO   xint xint (int) : 30
 DMTest::CondRea...   INFO   scond 3000
 DMTest::CondRea...   INFO   s2 100
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #5, run #0 6 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #6, run #0 6 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 6 LBN 3
+DMTest::CondRea...   INFO   rl xint (int) : 2
+DMTest::CondRea...   INFO   ts xint (int) : 400
+DMTest::CondRea...   INFO   s3 402
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #0 8 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #8, run #0 8 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 8 LBN 2
+DMTest::CondRea...   INFO   xint xint (int) : 30
+DMTest::CondRea...   INFO   scond 3000
+DMTest::CondRea...   INFO   s2 100
+DMTest::CondRea...   INFO   rl xint (int) : 2
+DMTest::CondRea...   INFO   ts xint (int) : 400
+DMTest::CondRea...   INFO   s3 402
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #0 9 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #9, run #0 9 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 9 LBN 3
 DMTest::CondRea...   INFO   xint xint (int) : 40
 DMTest::CondRea...   INFO   scond 4000
 DMTest::CondRea...   INFO   s2 100
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #6, run #0 7 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #7, run #0 7 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 7 LBN 3
+DMTest::CondRea...   INFO   rl xint (int) : 3
+DMTest::CondRea...   INFO   ts xint (int) : 400
+DMTest::CondRea...   INFO   s3 403
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #0 10 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #10, run #0 10 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 10 LBN 3
 DMTest::CondRea...   INFO   xint xint (int) : 40
 DMTest::CondRea...   INFO   scond 4000
 DMTest::CondRea...   INFO   s2 100
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #7, run #0 8 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #8, run #0 8 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 8 LBN 4
+DMTest::CondRea...   INFO   rl xint (int) : 3
+DMTest::CondRea...   INFO   ts xint (int) : 500
+DMTest::CondRea...   INFO   s3 503
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #0 11 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #11, run #0 11 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 11 LBN 3
+DMTest::CondRea...   INFO   xint xint (int) : 40
+DMTest::CondRea...   INFO   scond 4000
+DMTest::CondRea...   INFO   s2 100
+DMTest::CondRea...   INFO   rl xint (int) : 3
+DMTest::CondRea...   INFO   ts xint (int) : 500
+DMTest::CondRea...   INFO   s3 503
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #0 12 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #12, run #0 12 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 12 LBN 4
 DMTest::CondRea...   INFO   xint xint (int) : 50
 DMTest::CondRea...   INFO   scond 5000
 DMTest::CondRea...   INFO   s2 200
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #8, run #0 9 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #9, run #0 9 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 9 LBN 4
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 500
+DMTest::CondRea...   INFO   s3 504
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #0 13 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #13, run #0 13 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 13 LBN 4
 DMTest::CondRea...   INFO   xint xint (int) : 50
 DMTest::CondRea...   INFO   scond 5000
 DMTest::CondRea...   INFO   s2 200
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #9, run #0 10 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #10, run #0 10 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 10 LBN 5
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 500
+DMTest::CondRea...   INFO   s3 504
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #0 14 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #14, run #0 14 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 14 LBN 4
+DMTest::CondRea...   INFO   xint xint (int) : 50
+DMTest::CondRea...   INFO   scond 5000
+DMTest::CondRea...   INFO   s2 200
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 500
+DMTest::CondRea...   INFO   s3 504
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #0 15 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #15, run #0 15 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 15 LBN 5
 DMTest::CondRea...   INFO   xint xint (int) : 60
 DMTest::CondRea...   INFO   scond 6000
 DMTest::CondRea...   INFO   s2 200
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #10, run #0 11 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #11, run #0 11 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 11 LBN 5
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 500
+DMTest::CondRea...   INFO   s3 504
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #0 16 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #16, run #0 16 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 16 LBN 5
 DMTest::CondRea...   INFO   xint xint (int) : 60
 DMTest::CondRea...   INFO   scond 6000
 DMTest::CondRea...   INFO   s2 200
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #11, run #0 12 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #12, run #0 12 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 12 LBN 6
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 500
+DMTest::CondRea...   INFO   s3 504
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #0 17 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #17, run #0 17 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 17 LBN 5
+DMTest::CondRea...   INFO   xint xint (int) : 60
+DMTest::CondRea...   INFO   scond 6000
+DMTest::CondRea...   INFO   s2 200
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 600
+DMTest::CondRea...   INFO   s3 604
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #0 18 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #18, run #0 18 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 18 LBN 6
 DMTest::CondRea...   INFO   xint xint (int) : 70
 DMTest::CondRea...   INFO   scond 7000
 DMTest::CondRea...   INFO   s2 300
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #12, run #0 13 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #13, run #0 13 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 13 LBN 6
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 600
+DMTest::CondRea...   INFO   s3 604
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #0 19 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #19, run #0 19 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 19 LBN 6
 DMTest::CondRea...   INFO   xint xint (int) : 70
 DMTest::CondRea...   INFO   scond 7000
 DMTest::CondRea...   INFO   s2 300
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #13, run #0 14 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #14, run #0 14 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 14 LBN 7
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 700
+DMTest::CondRea...   INFO   s3 704
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #19, run #0 20 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #20, run #0 20 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 20 LBN 6
+DMTest::CondRea...   INFO   xint xint (int) : 70
+DMTest::CondRea...   INFO   scond 7000
+DMTest::CondRea...   INFO   s2 300
+DMTest::CondRea...   INFO   rl xint (int) : 4
+DMTest::CondRea...   INFO   ts xint (int) : 700
+DMTest::CondRea...   INFO   s3 704
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #20, run #0 21 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #21, run #0 21 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 21 LBN 7
 DMTest::CondRea...   INFO   xint xint (int) : 80
 DMTest::CondRea...   INFO   scond 8000
 DMTest::CondRea...   INFO   s2 300
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #14, run #0 15 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #15, run #0 15 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 15 LBN 7
+DMTest::CondRea...   INFO   rl xint (int) : 5
+DMTest::CondRea...   INFO   ts xint (int) : 700
+DMTest::CondRea...   INFO   s3 705
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #21, run #0 22 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #22, run #0 22 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 22 LBN 7
 DMTest::CondRea...   INFO   xint xint (int) : 80
 DMTest::CondRea...   INFO   scond 8000
 DMTest::CondRea...   INFO   s2 300
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #15, run #0 16 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #16, run #0 16 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 16 LBN 8
+DMTest::CondRea...   INFO   rl xint (int) : 5
+DMTest::CondRea...   INFO   ts xint (int) : 800
+DMTest::CondRea...   INFO   s3 805
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #22, run #0 23 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #23, run #0 23 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 23 LBN 7
+DMTest::CondRea...   INFO   xint xint (int) : 80
+DMTest::CondRea...   INFO   scond 8000
+DMTest::CondRea...   INFO   s2 300
+DMTest::CondRea...   INFO   rl xint (int) : 5
+DMTest::CondRea...   INFO   ts xint (int) : 800
+DMTest::CondRea...   INFO   s3 805
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #23, run #0 24 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #24, run #0 24 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 24 LBN 8
 DMTest::CondRea...   INFO   xint xint (int) : 90
 DMTest::CondRea...   INFO   scond 9000
 DMTest::CondRea...   INFO   s2 400
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #16, run #0 17 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #17, run #0 17 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 17 LBN 8
+DMTest::CondRea...   INFO   rl xint (int) : 6
+DMTest::CondRea...   INFO   ts xint (int) : 800
+DMTest::CondRea...   INFO   s3 806
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #24, run #0 25 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #25, run #0 25 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 25 LBN 8
 DMTest::CondRea...   INFO   xint xint (int) : 90
 DMTest::CondRea...   INFO   scond 9000
 DMTest::CondRea...   INFO   s2 400
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #17, run #0 18 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #18, run #0 18 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 18 LBN 9
+DMTest::CondRea...   INFO   rl xint (int) : 6
+DMTest::CondRea...   INFO   ts xint (int) : 800
+DMTest::CondRea...   INFO   s3 806
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #25, run #0 26 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #26, run #0 26 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 26 LBN 8
+DMTest::CondRea...   INFO   xint xint (int) : 90
+DMTest::CondRea...   INFO   scond 9000
+DMTest::CondRea...   INFO   s2 400
+DMTest::CondRea...   INFO   rl xint (int) : 6
+DMTest::CondRea...   INFO   ts xint (int) : 900
+DMTest::CondRea...   INFO   s3 906
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #26, run #0 27 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #27, run #0 27 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 27 LBN 9
 DMTest::CondRea...   INFO   xint xint (int) : 100
 DMTest::CondRea...   INFO   scond 10000
 DMTest::CondRea...   INFO   s2 400
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #0 19 events processed so far  <<<===
-AthenaEventLoopMgr   INFO   ===>>>  start processing event #19, run #0 19 events processed so far  <<<===
-DMTest::CondRea...   INFO Event 19 LBN 9
+DMTest::CondRea...   INFO   rl xint (int) : 7
+DMTest::CondRea...   INFO   ts xint (int) : 900
+DMTest::CondRea...   INFO   s3 907
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #27, run #0 28 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #28, run #0 28 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 28 LBN 9
 DMTest::CondRea...   INFO   xint xint (int) : 100
 DMTest::CondRea...   INFO   scond 10000
 DMTest::CondRea...   INFO   s2 400
-AthenaEventLoopMgr   INFO   ===>>>  done processing event #19, run #0 20 events processed so far  <<<===
+DMTest::CondRea...   INFO   rl xint (int) : 7
+DMTest::CondRea...   INFO   ts xint (int) : 900
+DMTest::CondRea...   INFO   s3 907
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #28, run #0 29 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #29, run #0 29 events processed so far  <<<===
+DMTest::CondRea...   INFO Event 29 LBN 9
+DMTest::CondRea...   INFO   xint xint (int) : 100
+DMTest::CondRea...   INFO   scond 10000
+DMTest::CondRea...   INFO   s2 400
+DMTest::CondRea...   INFO   rl xint (int) : 7
+DMTest::CondRea...   INFO   ts xint (int) : 900
+DMTest::CondRea...   INFO   s3 907
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #29, run #0 30 events processed so far  <<<===
 condtest.pool.root   INFO Database being retired...
-Domain[ROOT_All]     INFO ->  Deaccess DbDatabase   READ      [ROOT_All] F67004F9-6082-4B4C-B52D-88A1A76CF991
+Domain[ROOT_All]     INFO ->  Deaccess DbDatabase   READ      [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7
 Domain[ROOT_All]     INFO >   Deaccess DbDomain     READ      [ROOT_All] 
 ApplicationMgr       INFO Application Manager Stopped successfully
 IncidentProcAlg1     INFO Finalize
@@ -217,11 +375,13 @@ LoadReadDicts        INFO Finalizing LoadReadDicts...
 IncidentProcAlg2     INFO Finalize
 EventSelector        INFO finalize
 PyComponentMgr       INFO Finalizing PyComponentMgr...
-IOVDbFolder          INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 10/1/1810 ((     0.01 ))s
-IOVDbFolder          INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 20/1/80 ((     0.00 ))s
-IOVDbSvc             INFO  bytes in ((      0.02 ))s
+IOVDbFolder          INFO Folder /DMTest/RLTest (AttrList) db-read 1/7 objs/chan/bytes 7/1/28 ((     0.01 ))s
+IOVDbFolder          INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 15/1/2715 ((     0.00 ))s
+IOVDbFolder          INFO Folder /DMTest/TSTest (AttrList) db-read 1/9 objs/chan/bytes 9/1/36 ((     0.00 ))s
+IOVDbFolder          INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 30/1/120 ((     0.00 ))s
+IOVDbSvc             INFO  bytes in ((      0.01 ))s
 IOVDbSvc             INFO Connection sqlite://;schema=mycool.db;dbname=OFLP200 : nConnect: 0 nFolders: 0 ReadTime: ((     0.00 ))s
-IOVDbSvc             INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 2 ReadTime: ((     0.02 ))s
+IOVDbSvc             INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 4 ReadTime: ((     0.01 ))s
 AthDictLoaderSvc     INFO in finalize...
 ToolSvc              INFO Removing all tools created by ToolSvc
 ChronoStatSvc.f...   INFO  Service finalized successfully 
diff --git a/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref b/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref
index 47e0826cb57..8800bc3257b 100644
--- a/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref
+++ b/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref
@@ -1,7 +1,7 @@
-Thu Dec  6 06:15:44 CET 2018
+Tue Dec 11 15:26:14 CET 2018
 Preloading tcmalloc_minimal.so
 Py:Athena            INFO including file "AthenaCommon/Preparation.py"
-Py:Athena            INFO using release [AthenaWorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3/fa0fd6d0989] -- built on [2018-12-06T0538]
+Py:Athena            INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3g/fc1ea6b7761] -- built on [2018-12-11T1514]
 Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
 Py:Athena            INFO executing ROOT6Setup
 Py:Athena            INFO configuring AthenaHive with [1] concurrent threads and [1] concurrent events
@@ -10,7 +10,7 @@ Py:Athena            INFO including file "AthenaCommon/Execution.py"
 Py:Athena            INFO including file "DataModelRunTests/CondReaderMT_jo.py"
 Py:Athena            INFO including file "DataModelRunTests/CondReader_jo.py"
 Py:Athena            INFO including file "AthenaPoolCnvSvc/AthenaPool_jobOptions.py"
-Py:ConfigurableDb    INFO Read module info for 5473 configurables from 53 genConfDb files
+Py:ConfigurableDb    INFO Read module info for 5443 configurables from 42 genConfDb files
 Py:ConfigurableDb    INFO No duplicates have been found: that's good !
 Py:Athena            INFO including file "DataModelRunTests/loadReadDicts.py"
 EventInfoMgtInit: Got release version  Athena-22.0.1
@@ -22,7 +22,7 @@ MessageSvc           INFO Activating in a separate thread
 ApplicationMgr    SUCCESS 
 ====================================================================================================================================
                                                    Welcome to ApplicationMgr (GaudiCoreSvc v30r5)
-                                          running on lxplus077.cern.ch on Thu Dec  6 06:16:12 2018
+                                          running on lxplus079.cern.ch on Tue Dec 11 15:26:37 2018
 ====================================================================================================================================
 ApplicationMgr       INFO Successfully loaded modules : AthenaServices
 ApplicationMgr       INFO Application Manager Configured successfully
@@ -39,8 +39,8 @@ PoolSvc                                            INFO io_register[PoolSvc](xml
 PoolSvc                                            INFO Set connectionsvc retry/timeout/IDLE timeout to  'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled
 PoolSvc                                            INFO Frontier compression level set to 5
 DBReplicaSvc                                       INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data
-DBReplicaSvc                                       INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-04T2300/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
-DBReplicaSvc                                       INFO Total of 10 servers found for host lxplus077.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ]
+DBReplicaSvc                                       INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-10T2259/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
+DBReplicaSvc                                       INFO Total of 10 servers found for host lxplus079.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ]
 PoolSvc                                            INFO Successfully setup replica sorting algorithm
 PoolSvc                                            INFO Setting up APR FileCatalog and Streams
 PoolSvc                                            INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml
@@ -50,30 +50,36 @@ IOVDbSvc                                           INFO Opened read transaction
 IOVDbSvc                                           INFO Only 5 POOL conditions files will be open at once
 IOVDbSvc                                           INFO Cache alignment will be done in 3 slices
 IOVDbFolder                                        INFO Read from meta data only for folder /TagInfo
-IOVDbSvc                                           INFO Initialised with 2 connections and 3 folders
+IOVDbSvc                                           INFO Initialised with 2 connections and 5 folders
 IOVDbSvc                                           INFO Service IOVDbSvc initialised successfully
-ClassIDSvc                                         INFO  getRegistryEntries: read 2839 CLIDRegistry entries for module ALL
+ClassIDSvc                                         INFO  getRegistryEntries: read 2898 CLIDRegistry entries for module ALL
 PyComponentMgr                                     INFO Initializing PyComponentMgr...
 LoadReadDicts                                      INFO Initializing LoadReadDicts...
-ClassIDSvc                                         INFO  getRegistryEntries: read 7064 CLIDRegistry entries for module ALL
+ClassIDSvc                                         INFO  getRegistryEntries: read 7066 CLIDRegistry entries for module ALL
 CondInputLoader                                    INFO Initializing CondInputLoader...
 IOVDbSvc                                           INFO preLoadAddresses: Removing folder /TagInfo. It should only be in the file meta data and was not found.
 IOVDbSvc                                           INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200
 IOVSvc                                             INFO No IOVSvcTool associated with store "StoreGateSvc"
 IOVSvcTool                                         INFO IOVRanges will be checked at every Event
 IOVDbSvc                                           INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200
+IOVDbSvc                                           INFO Added taginfo remove for /DMTest/RLTest
 IOVDbSvc                                           INFO Added taginfo remove for /DMTest/S2
+IOVDbSvc                                           INFO Added taginfo remove for /DMTest/TSTest
 IOVDbSvc                                           INFO Added taginfo remove for /DMTest/TestAttrList
 CondInputLoader                                    INFO Adding base classes:
+  +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' )   ->
+  +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' )   ->
   +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' )   ->
   +  ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' )   -> DMTest::S1 (243020043)
 CondInputLoader                                    INFO Will create WriteCondHandle dependencies for the following DataObjects:
+    +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) 
+    +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) 
     +  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) 
     +  ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) 
     +  ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) 
 ThreadPoolSvc                                      INFO no thread init tools attached
 AvalancheSchedulerSvc                              INFO Activating scheduler in a separate thread
-AvalancheSchedulerSvc                              INFO Found 9 algorithms
+AvalancheSchedulerSvc                              INFO Found 10 algorithms
 AvalancheSchedulerSvc                              INFO Data Dependencies for Algorithms:
   BeginIncFiringAlg
       none
@@ -84,11 +90,16 @@ AvalancheSchedulerSvc                              INFO Data Dependencies for Al
   LoadReadDicts
       none
   DMTest::CondReaderAlg
+    o INPUT   ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) 
+    o INPUT   ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) 
     o INPUT   ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) 
     o INPUT   ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) 
     o INPUT   ( 'DMTest::S1' , 'ConditionStore+scond' ) 
+    o INPUT   ( 'DMTest::S3' , 'ConditionStore+scond3' ) 
     o INPUT   ( 'EventInfo' , 'StoreGateSvc+McEventInfo' ) 
   CondInputLoader
+    o OUTPUT  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) 
+    o OUTPUT  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) 
     o OUTPUT  ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) 
     o OUTPUT  ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) 
     o OUTPUT  ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) 
@@ -96,6 +107,10 @@ AvalancheSchedulerSvc                              INFO Data Dependencies for Al
     o INPUT   ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) 
     o OUTPUT  ( 'DMTest::S1' , 'ConditionStore+scond' ) 
     o OUTPUT  ( 'DMTest::S2' , 'ConditionStore+scond' ) 
+  DMTest::CondAlg2
+    o INPUT   ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) 
+    o INPUT   ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) 
+    o OUTPUT  ( 'DMTest::S3' , 'ConditionStore+scond3' ) 
   EndIncFiringAlg
       none
   IncidentProcAlg2
@@ -115,6 +130,8 @@ AthenaHiveEventLoopMgr                             INFO Setup EventSelector serv
 ApplicationMgr                                     INFO Application Manager Initialized successfully
 PoolSvc                                            INFO Enabled implicit multithreading in ROOT via PersistencySvc to: 1
 ClassIDSvc                                         INFO  getRegistryEntries: read 108 CLIDRegistry entries for module ALL
+CondInputLoader                                    INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/RLTest'
+CondInputLoader                                    INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TSTest'
 CondInputLoader                                    INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TestAttrList'
 CondInputLoader                                    INFO created CondCont<DMTest::S2> with key 'ConditionStore+/DMTest/S2'
 ApplicationMgr                                     INFO Application Manager Started successfully
@@ -127,13 +144,16 @@ ClassIDSvc                              0   0      INFO  getRegistryEntries: rea
 AthenaHiveEventLoopMgr                  0   0      INFO   ===>>>  start processing event #0, run #0 on slot 0,  0 events processed so far  <<<===
 IOVDbSvc                                0   0      INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200
 IOVDbSvc                                0   0      INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200
-Domain[ROOT_All]                        0   0      INFO ->  Access   DbDatabase   READ      [ROOT_All] F69635EF-6D4E-394D-BC66-03595DA2A079
+Domain[ROOT_All]                        0   0      INFO ->  Access   DbDatabase   READ      [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7
 Domain[ROOT_All]                        0   0      INFO                           condtest.pool.root
 RootDatabase.open                       0   0      INFO condtest.pool.root File version:61404
 DMTest::CondReaderAlg                   0   0      INFO Event 0 LBN 0
 DMTest::CondReaderAlg                   0   0      INFO   xint xint (int) : 10
 DMTest::CondReaderAlg                   0   0      INFO   scond 1000
 DMTest::CondReaderAlg                   0   0      INFO   s2 0
+DMTest::CondReaderAlg                   0   0      INFO   rl xint (int) : 1
+DMTest::CondReaderAlg                   0   0      INFO   ts xint (int) : 100
+DMTest::CondReaderAlg                   0   0      INFO   s3 101
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #0, run #0 on slot 0,  1 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  1   0      INFO   ===>>>  start processing event #1, run #0 on slot 0,  1 events processed so far  <<<===
 ClassIDSvc                              1   0      INFO  getRegistryEntries: read 55 CLIDRegistry entries for module ALL
@@ -141,118 +161,265 @@ DMTest::CondReaderAlg                   1   0      INFO Event 1 LBN 0
 DMTest::CondReaderAlg                   1   0      INFO   xint xint (int) : 10
 DMTest::CondReaderAlg                   1   0      INFO   scond 1000
 DMTest::CondReaderAlg                   1   0      INFO   s2 0
+DMTest::CondReaderAlg                   1   0      INFO   rl xint (int) : 1
+DMTest::CondReaderAlg                   1   0      INFO   ts xint (int) : 100
+DMTest::CondReaderAlg                   1   0      INFO   s3 101
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #1, run #0 on slot 0,  2 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  2   0      INFO   ===>>>  start processing event #2, run #0 on slot 0,  2 events processed so far  <<<===
-DMTest::CondReaderAlg                   2   0      INFO Event 2 LBN 1
-DMTest::CondReaderAlg                   2   0      INFO   xint xint (int) : 20
-DMTest::CondReaderAlg                   2   0      INFO   scond 2000
+DMTest::CondReaderAlg                   2   0      INFO Event 2 LBN 0
+DMTest::CondReaderAlg                   2   0      INFO   xint xint (int) : 10
+DMTest::CondReaderAlg                   2   0      INFO   scond 1000
 DMTest::CondReaderAlg                   2   0      INFO   s2 0
+DMTest::CondReaderAlg                   2   0      INFO   rl xint (int) : 1
+DMTest::CondReaderAlg                   2   0      INFO   ts xint (int) : 100
+DMTest::CondReaderAlg                   2   0      INFO   s3 101
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #2, run #0 on slot 0,  3 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  3   0      INFO   ===>>>  start processing event #3, run #0 on slot 0,  3 events processed so far  <<<===
 DMTest::CondReaderAlg                   3   0      INFO Event 3 LBN 1
 DMTest::CondReaderAlg                   3   0      INFO   xint xint (int) : 20
 DMTest::CondReaderAlg                   3   0      INFO   scond 2000
 DMTest::CondReaderAlg                   3   0      INFO   s2 0
+DMTest::CondReaderAlg                   3   0      INFO   rl xint (int) : 2
+DMTest::CondReaderAlg                   3   0      INFO   ts xint (int) : 200
+DMTest::CondReaderAlg                   3   0      INFO   s3 202
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #3, run #0 on slot 0,  4 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  4   0      INFO   ===>>>  start processing event #4, run #0 on slot 0,  4 events processed so far  <<<===
-DMTest::CondReaderAlg                   4   0      INFO Event 4 LBN 2
-DMTest::CondReaderAlg                   4   0      INFO   xint xint (int) : 30
-DMTest::CondReaderAlg                   4   0      INFO   scond 3000
-DMTest::CondReaderAlg                   4   0      INFO   s2 100
+DMTest::CondReaderAlg                   4   0      INFO Event 4 LBN 1
+DMTest::CondReaderAlg                   4   0      INFO   xint xint (int) : 20
+DMTest::CondReaderAlg                   4   0      INFO   scond 2000
+DMTest::CondReaderAlg                   4   0      INFO   s2 0
+DMTest::CondReaderAlg                   4   0      INFO   rl xint (int) : 2
+DMTest::CondReaderAlg                   4   0      INFO   ts xint (int) : 200
+DMTest::CondReaderAlg                   4   0      INFO   s3 202
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #4, run #0 on slot 0,  5 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  5   0      INFO   ===>>>  start processing event #5, run #0 on slot 0,  5 events processed so far  <<<===
-DMTest::CondReaderAlg                   5   0      INFO Event 5 LBN 2
-DMTest::CondReaderAlg                   5   0      INFO   xint xint (int) : 30
-DMTest::CondReaderAlg                   5   0      INFO   scond 3000
-DMTest::CondReaderAlg                   5   0      INFO   s2 100
+DMTest::CondReaderAlg                   5   0      INFO Event 5 LBN 1
+DMTest::CondReaderAlg                   5   0      INFO   xint xint (int) : 20
+DMTest::CondReaderAlg                   5   0      INFO   scond 2000
+DMTest::CondReaderAlg                   5   0      INFO   s2 0
+DMTest::CondReaderAlg                   5   0      INFO   rl xint (int) : 2
+DMTest::CondReaderAlg                   5   0      INFO   ts xint (int) : 200
+DMTest::CondReaderAlg                   5   0      INFO   s3 202
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #5, run #0 on slot 0,  6 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  6   0      INFO   ===>>>  start processing event #6, run #0 on slot 0,  6 events processed so far  <<<===
-DMTest::CondReaderAlg                   6   0      INFO Event 6 LBN 3
-DMTest::CondReaderAlg                   6   0      INFO   xint xint (int) : 40
-DMTest::CondReaderAlg                   6   0      INFO   scond 4000
+DMTest::CondReaderAlg                   6   0      INFO Event 6 LBN 2
+DMTest::CondReaderAlg                   6   0      INFO   xint xint (int) : 30
+DMTest::CondReaderAlg                   6   0      INFO   scond 3000
 DMTest::CondReaderAlg                   6   0      INFO   s2 100
+DMTest::CondReaderAlg                   6   0      INFO   rl xint (int) : 2
+DMTest::CondReaderAlg                   6   0      INFO   ts xint (int) : 300
+DMTest::CondReaderAlg                   6   0      INFO   s3 302
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #6, run #0 on slot 0,  7 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  7   0      INFO   ===>>>  start processing event #7, run #0 on slot 0,  7 events processed so far  <<<===
-DMTest::CondReaderAlg                   7   0      INFO Event 7 LBN 3
-DMTest::CondReaderAlg                   7   0      INFO   xint xint (int) : 40
-DMTest::CondReaderAlg                   7   0      INFO   scond 4000
+DMTest::CondReaderAlg                   7   0      INFO Event 7 LBN 2
+DMTest::CondReaderAlg                   7   0      INFO   xint xint (int) : 30
+DMTest::CondReaderAlg                   7   0      INFO   scond 3000
 DMTest::CondReaderAlg                   7   0      INFO   s2 100
+DMTest::CondReaderAlg                   7   0      INFO   rl xint (int) : 2
+DMTest::CondReaderAlg                   7   0      INFO   ts xint (int) : 400
+DMTest::CondReaderAlg                   7   0      INFO   s3 402
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #7, run #0 on slot 0,  8 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  8   0      INFO   ===>>>  start processing event #8, run #0 on slot 0,  8 events processed so far  <<<===
-DMTest::CondReaderAlg                   8   0      INFO Event 8 LBN 4
-DMTest::CondReaderAlg                   8   0      INFO   xint xint (int) : 50
-DMTest::CondReaderAlg                   8   0      INFO   scond 5000
-DMTest::CondReaderAlg                   8   0      INFO   s2 200
+DMTest::CondReaderAlg                   8   0      INFO Event 8 LBN 2
+DMTest::CondReaderAlg                   8   0      INFO   xint xint (int) : 30
+DMTest::CondReaderAlg                   8   0      INFO   scond 3000
+DMTest::CondReaderAlg                   8   0      INFO   s2 100
+DMTest::CondReaderAlg                   8   0      INFO   rl xint (int) : 2
+DMTest::CondReaderAlg                   8   0      INFO   ts xint (int) : 400
+DMTest::CondReaderAlg                   8   0      INFO   s3 402
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #8, run #0 on slot 0,  9 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  9   0      INFO   ===>>>  start processing event #9, run #0 on slot 0,  9 events processed so far  <<<===
-DMTest::CondReaderAlg                   9   0      INFO Event 9 LBN 4
-DMTest::CondReaderAlg                   9   0      INFO   xint xint (int) : 50
-DMTest::CondReaderAlg                   9   0      INFO   scond 5000
-DMTest::CondReaderAlg                   9   0      INFO   s2 200
+DMTest::CondReaderAlg                   9   0      INFO Event 9 LBN 3
+DMTest::CondReaderAlg                   9   0      INFO   xint xint (int) : 40
+DMTest::CondReaderAlg                   9   0      INFO   scond 4000
+DMTest::CondReaderAlg                   9   0      INFO   s2 100
+DMTest::CondReaderAlg                   9   0      INFO   rl xint (int) : 3
+DMTest::CondReaderAlg                   9   0      INFO   ts xint (int) : 400
+DMTest::CondReaderAlg                   9   0      INFO   s3 403
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #9, run #0 on slot 0,  10 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  10  0      INFO   ===>>>  start processing event #10, run #0 on slot 0,  10 events processed so far  <<<===
-DMTest::CondReaderAlg                   10  0      INFO Event 10 LBN 5
-DMTest::CondReaderAlg                   10  0      INFO   xint xint (int) : 60
-DMTest::CondReaderAlg                   10  0      INFO   scond 6000
-DMTest::CondReaderAlg                   10  0      INFO   s2 200
+DMTest::CondReaderAlg                   10  0      INFO Event 10 LBN 3
+DMTest::CondReaderAlg                   10  0      INFO   xint xint (int) : 40
+DMTest::CondReaderAlg                   10  0      INFO   scond 4000
+DMTest::CondReaderAlg                   10  0      INFO   s2 100
+DMTest::CondReaderAlg                   10  0      INFO   rl xint (int) : 3
+DMTest::CondReaderAlg                   10  0      INFO   ts xint (int) : 500
+DMTest::CondReaderAlg                   10  0      INFO   s3 503
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #10, run #0 on slot 0,  11 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  11  0      INFO   ===>>>  start processing event #11, run #0 on slot 0,  11 events processed so far  <<<===
-DMTest::CondReaderAlg                   11  0      INFO Event 11 LBN 5
-DMTest::CondReaderAlg                   11  0      INFO   xint xint (int) : 60
-DMTest::CondReaderAlg                   11  0      INFO   scond 6000
-DMTest::CondReaderAlg                   11  0      INFO   s2 200
+DMTest::CondReaderAlg                   11  0      INFO Event 11 LBN 3
+DMTest::CondReaderAlg                   11  0      INFO   xint xint (int) : 40
+DMTest::CondReaderAlg                   11  0      INFO   scond 4000
+DMTest::CondReaderAlg                   11  0      INFO   s2 100
+DMTest::CondReaderAlg                   11  0      INFO   rl xint (int) : 3
+DMTest::CondReaderAlg                   11  0      INFO   ts xint (int) : 500
+DMTest::CondReaderAlg                   11  0      INFO   s3 503
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #11, run #0 on slot 0,  12 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  12  0      INFO   ===>>>  start processing event #12, run #0 on slot 0,  12 events processed so far  <<<===
-DMTest::CondReaderAlg                   12  0      INFO Event 12 LBN 6
-DMTest::CondReaderAlg                   12  0      INFO   xint xint (int) : 70
-DMTest::CondReaderAlg                   12  0      INFO   scond 7000
-DMTest::CondReaderAlg                   12  0      INFO   s2 300
+DMTest::CondReaderAlg                   12  0      INFO Event 12 LBN 4
+DMTest::CondReaderAlg                   12  0      INFO   xint xint (int) : 50
+DMTest::CondReaderAlg                   12  0      INFO   scond 5000
+DMTest::CondReaderAlg                   12  0      INFO   s2 200
+DMTest::CondReaderAlg                   12  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   12  0      INFO   ts xint (int) : 500
+DMTest::CondReaderAlg                   12  0      INFO   s3 504
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #12, run #0 on slot 0,  13 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  13  0      INFO   ===>>>  start processing event #13, run #0 on slot 0,  13 events processed so far  <<<===
-DMTest::CondReaderAlg                   13  0      INFO Event 13 LBN 6
-DMTest::CondReaderAlg                   13  0      INFO   xint xint (int) : 70
-DMTest::CondReaderAlg                   13  0      INFO   scond 7000
-DMTest::CondReaderAlg                   13  0      INFO   s2 300
+DMTest::CondReaderAlg                   13  0      INFO Event 13 LBN 4
+DMTest::CondReaderAlg                   13  0      INFO   xint xint (int) : 50
+DMTest::CondReaderAlg                   13  0      INFO   scond 5000
+DMTest::CondReaderAlg                   13  0      INFO   s2 200
+DMTest::CondReaderAlg                   13  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   13  0      INFO   ts xint (int) : 500
+DMTest::CondReaderAlg                   13  0      INFO   s3 504
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #13, run #0 on slot 0,  14 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  14  0      INFO   ===>>>  start processing event #14, run #0 on slot 0,  14 events processed so far  <<<===
-DMTest::CondReaderAlg                   14  0      INFO Event 14 LBN 7
-DMTest::CondReaderAlg                   14  0      INFO   xint xint (int) : 80
-DMTest::CondReaderAlg                   14  0      INFO   scond 8000
-DMTest::CondReaderAlg                   14  0      INFO   s2 300
+DMTest::CondReaderAlg                   14  0      INFO Event 14 LBN 4
+DMTest::CondReaderAlg                   14  0      INFO   xint xint (int) : 50
+DMTest::CondReaderAlg                   14  0      INFO   scond 5000
+DMTest::CondReaderAlg                   14  0      INFO   s2 200
+DMTest::CondReaderAlg                   14  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   14  0      INFO   ts xint (int) : 500
+DMTest::CondReaderAlg                   14  0      INFO   s3 504
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #14, run #0 on slot 0,  15 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  15  0      INFO   ===>>>  start processing event #15, run #0 on slot 0,  15 events processed so far  <<<===
-DMTest::CondReaderAlg                   15  0      INFO Event 15 LBN 7
-DMTest::CondReaderAlg                   15  0      INFO   xint xint (int) : 80
-DMTest::CondReaderAlg                   15  0      INFO   scond 8000
-DMTest::CondReaderAlg                   15  0      INFO   s2 300
+DMTest::CondReaderAlg                   15  0      INFO Event 15 LBN 5
+DMTest::CondReaderAlg                   15  0      INFO   xint xint (int) : 60
+DMTest::CondReaderAlg                   15  0      INFO   scond 6000
+DMTest::CondReaderAlg                   15  0      INFO   s2 200
+DMTest::CondReaderAlg                   15  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   15  0      INFO   ts xint (int) : 500
+DMTest::CondReaderAlg                   15  0      INFO   s3 504
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #15, run #0 on slot 0,  16 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  16  0      INFO   ===>>>  start processing event #16, run #0 on slot 0,  16 events processed so far  <<<===
-DMTest::CondReaderAlg                   16  0      INFO Event 16 LBN 8
-DMTest::CondReaderAlg                   16  0      INFO   xint xint (int) : 90
-DMTest::CondReaderAlg                   16  0      INFO   scond 9000
-DMTest::CondReaderAlg                   16  0      INFO   s2 400
+DMTest::CondReaderAlg                   16  0      INFO Event 16 LBN 5
+DMTest::CondReaderAlg                   16  0      INFO   xint xint (int) : 60
+DMTest::CondReaderAlg                   16  0      INFO   scond 6000
+DMTest::CondReaderAlg                   16  0      INFO   s2 200
+DMTest::CondReaderAlg                   16  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   16  0      INFO   ts xint (int) : 500
+DMTest::CondReaderAlg                   16  0      INFO   s3 504
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #16, run #0 on slot 0,  17 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  17  0      INFO   ===>>>  start processing event #17, run #0 on slot 0,  17 events processed so far  <<<===
-DMTest::CondReaderAlg                   17  0      INFO Event 17 LBN 8
-DMTest::CondReaderAlg                   17  0      INFO   xint xint (int) : 90
-DMTest::CondReaderAlg                   17  0      INFO   scond 9000
-DMTest::CondReaderAlg                   17  0      INFO   s2 400
+DMTest::CondReaderAlg                   17  0      INFO Event 17 LBN 5
+DMTest::CondReaderAlg                   17  0      INFO   xint xint (int) : 60
+DMTest::CondReaderAlg                   17  0      INFO   scond 6000
+DMTest::CondReaderAlg                   17  0      INFO   s2 200
+DMTest::CondReaderAlg                   17  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   17  0      INFO   ts xint (int) : 600
+DMTest::CondReaderAlg                   17  0      INFO   s3 604
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #17, run #0 on slot 0,  18 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  18  0      INFO   ===>>>  start processing event #18, run #0 on slot 0,  18 events processed so far  <<<===
-DMTest::CondReaderAlg                   18  0      INFO Event 18 LBN 9
-DMTest::CondReaderAlg                   18  0      INFO   xint xint (int) : 100
-DMTest::CondReaderAlg                   18  0      INFO   scond 10000
-DMTest::CondReaderAlg                   18  0      INFO   s2 400
+DMTest::CondReaderAlg                   18  0      INFO Event 18 LBN 6
+DMTest::CondReaderAlg                   18  0      INFO   xint xint (int) : 70
+DMTest::CondReaderAlg                   18  0      INFO   scond 7000
+DMTest::CondReaderAlg                   18  0      INFO   s2 300
+DMTest::CondReaderAlg                   18  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   18  0      INFO   ts xint (int) : 600
+DMTest::CondReaderAlg                   18  0      INFO   s3 604
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #18, run #0 on slot 0,  19 events processed so far  <<<===
 AthenaHiveEventLoopMgr                  19  0      INFO   ===>>>  start processing event #19, run #0 on slot 0,  19 events processed so far  <<<===
-DMTest::CondReaderAlg                   19  0      INFO Event 19 LBN 9
-DMTest::CondReaderAlg                   19  0      INFO   xint xint (int) : 100
-DMTest::CondReaderAlg                   19  0      INFO   scond 10000
-DMTest::CondReaderAlg                   19  0      INFO   s2 400
+DMTest::CondReaderAlg                   19  0      INFO Event 19 LBN 6
+DMTest::CondReaderAlg                   19  0      INFO   xint xint (int) : 70
+DMTest::CondReaderAlg                   19  0      INFO   scond 7000
+DMTest::CondReaderAlg                   19  0      INFO   s2 300
+DMTest::CondReaderAlg                   19  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   19  0      INFO   ts xint (int) : 700
+DMTest::CondReaderAlg                   19  0      INFO   s3 704
 AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #19, run #0 on slot 0,  20 events processed so far  <<<===
-AthenaHiveEventLoopMgr                             INFO ---> Loop Finished (seconds): 1.68937
+AthenaHiveEventLoopMgr                  20  0      INFO   ===>>>  start processing event #20, run #0 on slot 0,  20 events processed so far  <<<===
+DMTest::CondReaderAlg                   20  0      INFO Event 20 LBN 6
+DMTest::CondReaderAlg                   20  0      INFO   xint xint (int) : 70
+DMTest::CondReaderAlg                   20  0      INFO   scond 7000
+DMTest::CondReaderAlg                   20  0      INFO   s2 300
+DMTest::CondReaderAlg                   20  0      INFO   rl xint (int) : 4
+DMTest::CondReaderAlg                   20  0      INFO   ts xint (int) : 700
+DMTest::CondReaderAlg                   20  0      INFO   s3 704
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #20, run #0 on slot 0,  21 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  21  0      INFO   ===>>>  start processing event #21, run #0 on slot 0,  21 events processed so far  <<<===
+DMTest::CondReaderAlg                   21  0      INFO Event 21 LBN 7
+DMTest::CondReaderAlg                   21  0      INFO   xint xint (int) : 80
+DMTest::CondReaderAlg                   21  0      INFO   scond 8000
+DMTest::CondReaderAlg                   21  0      INFO   s2 300
+DMTest::CondReaderAlg                   21  0      INFO   rl xint (int) : 5
+DMTest::CondReaderAlg                   21  0      INFO   ts xint (int) : 700
+DMTest::CondReaderAlg                   21  0      INFO   s3 705
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #21, run #0 on slot 0,  22 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  22  0      INFO   ===>>>  start processing event #22, run #0 on slot 0,  22 events processed so far  <<<===
+DMTest::CondReaderAlg                   22  0      INFO Event 22 LBN 7
+DMTest::CondReaderAlg                   22  0      INFO   xint xint (int) : 80
+DMTest::CondReaderAlg                   22  0      INFO   scond 8000
+DMTest::CondReaderAlg                   22  0      INFO   s2 300
+DMTest::CondReaderAlg                   22  0      INFO   rl xint (int) : 5
+DMTest::CondReaderAlg                   22  0      INFO   ts xint (int) : 800
+DMTest::CondReaderAlg                   22  0      INFO   s3 805
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #22, run #0 on slot 0,  23 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  23  0      INFO   ===>>>  start processing event #23, run #0 on slot 0,  23 events processed so far  <<<===
+DMTest::CondReaderAlg                   23  0      INFO Event 23 LBN 7
+DMTest::CondReaderAlg                   23  0      INFO   xint xint (int) : 80
+DMTest::CondReaderAlg                   23  0      INFO   scond 8000
+DMTest::CondReaderAlg                   23  0      INFO   s2 300
+DMTest::CondReaderAlg                   23  0      INFO   rl xint (int) : 5
+DMTest::CondReaderAlg                   23  0      INFO   ts xint (int) : 800
+DMTest::CondReaderAlg                   23  0      INFO   s3 805
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #23, run #0 on slot 0,  24 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  24  0      INFO   ===>>>  start processing event #24, run #0 on slot 0,  24 events processed so far  <<<===
+DMTest::CondReaderAlg                   24  0      INFO Event 24 LBN 8
+DMTest::CondReaderAlg                   24  0      INFO   xint xint (int) : 90
+DMTest::CondReaderAlg                   24  0      INFO   scond 9000
+DMTest::CondReaderAlg                   24  0      INFO   s2 400
+DMTest::CondReaderAlg                   24  0      INFO   rl xint (int) : 6
+DMTest::CondReaderAlg                   24  0      INFO   ts xint (int) : 800
+DMTest::CondReaderAlg                   24  0      INFO   s3 806
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #24, run #0 on slot 0,  25 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  25  0      INFO   ===>>>  start processing event #25, run #0 on slot 0,  25 events processed so far  <<<===
+DMTest::CondReaderAlg                   25  0      INFO Event 25 LBN 8
+DMTest::CondReaderAlg                   25  0      INFO   xint xint (int) : 90
+DMTest::CondReaderAlg                   25  0      INFO   scond 9000
+DMTest::CondReaderAlg                   25  0      INFO   s2 400
+DMTest::CondReaderAlg                   25  0      INFO   rl xint (int) : 6
+DMTest::CondReaderAlg                   25  0      INFO   ts xint (int) : 800
+DMTest::CondReaderAlg                   25  0      INFO   s3 806
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #25, run #0 on slot 0,  26 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  26  0      INFO   ===>>>  start processing event #26, run #0 on slot 0,  26 events processed so far  <<<===
+DMTest::CondReaderAlg                   26  0      INFO Event 26 LBN 8
+DMTest::CondReaderAlg                   26  0      INFO   xint xint (int) : 90
+DMTest::CondReaderAlg                   26  0      INFO   scond 9000
+DMTest::CondReaderAlg                   26  0      INFO   s2 400
+DMTest::CondReaderAlg                   26  0      INFO   rl xint (int) : 6
+DMTest::CondReaderAlg                   26  0      INFO   ts xint (int) : 900
+DMTest::CondReaderAlg                   26  0      INFO   s3 906
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #26, run #0 on slot 0,  27 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  27  0      INFO   ===>>>  start processing event #27, run #0 on slot 0,  27 events processed so far  <<<===
+DMTest::CondReaderAlg                   27  0      INFO Event 27 LBN 9
+DMTest::CondReaderAlg                   27  0      INFO   xint xint (int) : 100
+DMTest::CondReaderAlg                   27  0      INFO   scond 10000
+DMTest::CondReaderAlg                   27  0      INFO   s2 400
+DMTest::CondReaderAlg                   27  0      INFO   rl xint (int) : 7
+DMTest::CondReaderAlg                   27  0      INFO   ts xint (int) : 900
+DMTest::CondReaderAlg                   27  0      INFO   s3 907
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #27, run #0 on slot 0,  28 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  28  0      INFO   ===>>>  start processing event #28, run #0 on slot 0,  28 events processed so far  <<<===
+DMTest::CondReaderAlg                   28  0      INFO Event 28 LBN 9
+DMTest::CondReaderAlg                   28  0      INFO   xint xint (int) : 100
+DMTest::CondReaderAlg                   28  0      INFO   scond 10000
+DMTest::CondReaderAlg                   28  0      INFO   s2 400
+DMTest::CondReaderAlg                   28  0      INFO   rl xint (int) : 7
+DMTest::CondReaderAlg                   28  0      INFO   ts xint (int) : 900
+DMTest::CondReaderAlg                   28  0      INFO   s3 907
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #28, run #0 on slot 0,  29 events processed so far  <<<===
+AthenaHiveEventLoopMgr                  29  0      INFO   ===>>>  start processing event #29, run #0 on slot 0,  29 events processed so far  <<<===
+DMTest::CondReaderAlg                   29  0      INFO Event 29 LBN 9
+DMTest::CondReaderAlg                   29  0      INFO   xint xint (int) : 100
+DMTest::CondReaderAlg                   29  0      INFO   scond 10000
+DMTest::CondReaderAlg                   29  0      INFO   s2 400
+DMTest::CondReaderAlg                   29  0      INFO   rl xint (int) : 7
+DMTest::CondReaderAlg                   29  0      INFO   ts xint (int) : 900
+DMTest::CondReaderAlg                   29  0      INFO   s3 907
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #29, run #0 on slot 0,  30 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO ---> Loop Finished (seconds): 1.70628
 condtest.pool.root                                 INFO Database being retired...
-Domain[ROOT_All]                                   INFO ->  Deaccess DbDatabase   READ      [ROOT_All] F69635EF-6D4E-394D-BC66-03595DA2A079
+Domain[ROOT_All]                                   INFO ->  Deaccess DbDatabase   READ      [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7
 Domain[ROOT_All]                                   INFO >   Deaccess DbDomain     READ      [ROOT_All] 
 ApplicationMgr                                     INFO Application Manager Stopped successfully
 IncidentProcAlg1                                   INFO Finalize
@@ -264,11 +431,13 @@ EventSelector                                      INFO finalize
 AvalancheSchedulerSvc                              INFO Joining Scheduler thread
 PyComponentMgr                                     INFO Finalizing PyComponentMgr...
 EventDataSvc                                       INFO Finalizing EventDataSvc - package version StoreGate-00-00-00
-IOVDbFolder                                        INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 10/1/1810 ((     0.01 ))s
-IOVDbFolder                                        INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 20/1/80 ((     0.00 ))s
-IOVDbSvc                                           INFO  bytes in ((      0.02 ))s
+IOVDbFolder                                        INFO Folder /DMTest/RLTest (AttrList) db-read 1/7 objs/chan/bytes 7/1/28 ((     0.01 ))s
+IOVDbFolder                                        INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 15/1/2715 ((     0.00 ))s
+IOVDbFolder                                        INFO Folder /DMTest/TSTest (AttrList) db-read 1/9 objs/chan/bytes 9/1/36 ((     0.00 ))s
+IOVDbFolder                                        INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 30/1/120 ((     0.00 ))s
+IOVDbSvc                                           INFO  bytes in ((      0.01 ))s
 IOVDbSvc                                           INFO Connection sqlite://;schema=mycool.db;dbname=OFLP200 : nConnect: 0 nFolders: 0 ReadTime: ((     0.00 ))s
-IOVDbSvc                                           INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 2 ReadTime: ((     0.02 ))s
+IOVDbSvc                                           INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 4 ReadTime: ((     0.01 ))s
 AthDictLoaderSvc                                   INFO in finalize...
 ToolSvc                                            INFO Removing all tools created by ToolSvc
 ChronoStatSvc.finalize()                           INFO  Service finalized successfully 
diff --git a/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py b/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py
index 243a6011c0b..0a86a459006 100644
--- a/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py
+++ b/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py
@@ -44,12 +44,16 @@ conddb.addFolder ('condtest.db', '/DMTest/TestAttrList <tag>AttrList_noTag</tag>
                   className='AthenaAttributeList')
 conddb.addFolder ('condtest.db', '/DMTest/S2 <tag>S2_noTag</tag>',
                   className='DMTest::S2')
+conddb.addFolder ('condtest.db', '/DMTest/RLTest <tag>RL_noTag</tag>',
+                  className='AthenaAttributeList')
+conddb.addFolder ('condtest.db', '/DMTest/TSTest <tag>TS_noTag</tag>',
+                  className='AthenaAttributeList')
 
 
 #--------------------------------------------------------------
 # Event related parameters
 #--------------------------------------------------------------
-theApp.EvtMax = 20
+theApp.EvtMax = 30
 
 
 #--------------------------------------------------------------
@@ -65,13 +69,16 @@ if nThreads >= 1:
 
 
 from DataModelTestDataCommon.DataModelTestDataCommonConf import \
-     DMTest__CondReaderAlg, DMTest__CondAlg1
-topSequence += DMTest__CondReaderAlg()
+     DMTest__CondReaderAlg, DMTest__CondAlg1, DMTest__CondAlg2
+topSequence += DMTest__CondReaderAlg (RLTestKey = '/DMTest/RLTest',
+                                      TSTestKey = '/DMTest/TSTest',
+                                      S3Key = 'scond3')
 
 
 from AthenaCommon.AlgSequence import AthSequencer             
 condSequence = AthSequencer("AthCondSeq")             
 condSequence += DMTest__CondAlg1()
+condSequence += DMTest__CondAlg2()
 
 
 #--------------------------------------------------------------
@@ -87,9 +94,11 @@ ChronoStatSvc.ChronoPrintOutTable = FALSE
 ChronoStatSvc.PrintUserTime       = FALSE
 ChronoStatSvc.StatPrintOutTable   = FALSE
 
-# Increment LBN every two events.
+# Increment LBN every three events, TS each event.
 from McEventSelector import McEventSelectorConf
-svcMgr+=McEventSelectorConf.McEventSelector('EventSelector',EventsPerLB=2)
+svcMgr+=McEventSelectorConf.McEventSelector('EventSelector',
+                                            EventsPerLB=3,
+                                            TimeStampInterval=1)
 
 PoolSvc = Service( "PoolSvc" )
 PoolSvc.ReadCatalog = ["file:CondWriter_catalog.xml"]
diff --git a/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref b/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref
index 3037f66a83a..42c31d04841 100644
--- a/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref
+++ b/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref
@@ -1,12 +1,12 @@
-Thu Dec  6 06:22:29 CET 2018
+Tue Dec 11 15:25:02 CET 2018
 Preloading tcmalloc_minimal.so
 Py:Athena            INFO including file "AthenaCommon/Preparation.py"
-Py:Athena            INFO using release [AthenaWorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3/fa0fd6d0989] -- built on [2018-12-06T0538]
+Py:Athena            INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3g/fc1ea6b7761] -- built on [2018-12-11T1514]
 Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
 Py:Athena            INFO executing ROOT6Setup
 Py:Athena            INFO including file "AthenaCommon/Execution.py"
 Py:Athena            INFO including file "DataModelRunTests/CondWriter_jo.py"
-Py:ConfigurableDb    INFO Read module info for 5473 configurables from 53 genConfDb files
+Py:ConfigurableDb    INFO Read module info for 5443 configurables from 42 genConfDb files
 Py:ConfigurableDb    INFO No duplicates have been found: that's good !
 Py:Athena            INFO including file "DataModelRunTests/loadWriteDicts.py"
 EventInfoMgtInit: Got release version  Athena-22.0.1
@@ -17,7 +17,7 @@ ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to leve
 ApplicationMgr    SUCCESS 
 ====================================================================================================================================
                                                    Welcome to ApplicationMgr (GaudiCoreSvc v30r5)
-                                          running on lxplus077.cern.ch on Thu Dec  6 06:22:54 2018
+                                          running on lxplus079.cern.ch on Tue Dec 11 15:25:24 2018
 ====================================================================================================================================
 ApplicationMgr       INFO Successfully loaded modules : AthenaServices
 ApplicationMgr       INFO Application Manager Configured successfully
@@ -29,7 +29,7 @@ ClassIDSvc           INFO  getRegistryEntries: read 2946 CLIDRegistry entries fo
 CoreDumpSvc          INFO install f-a-t-a-l handler... (flag = -1)
 CoreDumpSvc          INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) 
 AthenaEventLoopMgr   INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00
-ClassIDSvc           INFO  getRegistryEntries: read 1796 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 1855 CLIDRegistry entries for module ALL
 PyComponentMgr       INFO Initializing PyComponentMgr...
 LoadWriteDicts       INFO Initializing LoadWriteDicts...
 MetaDataSvc          INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00
@@ -37,8 +37,8 @@ AthenaPoolCnvSvc     INFO Initializing AthenaPoolCnvSvc - package version Athena
 PoolSvc              INFO Set connectionsvc retry/timeout/IDLE timeout to  'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled
 PoolSvc              INFO Frontier compression level set to 5
 DBReplicaSvc         INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data
-DBReplicaSvc         INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-04T2300/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
-DBReplicaSvc         INFO Total of 10 servers found for host lxplus077.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ]
+DBReplicaSvc         INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-10T2259/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
+DBReplicaSvc         INFO Total of 10 servers found for host lxplus079.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ]
 PoolSvc              INFO Successfully setup replica sorting algorithm
 PoolSvc              INFO Setting up APR FileCatalog and Streams
 PoolSvc              INFO POOL WriteCatalog is file:CondWriter_catalog.xml
@@ -61,13 +61,13 @@ AthenaEventLoopMgr   INFO   ===>>>  start of run 0    <<<===
 EventPersistenc...   INFO Added successfully Conversion service:AthenaPoolCnvSvc
 EventPersistenc...   INFO Added successfully Conversion service:TagInfoMgr
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #0, run #0 0 events processed so far  <<<===
-ClassIDSvc           INFO  getRegistryEntries: read 8990 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 8992 CLIDRegistry entries for module ALL
 IOVDbSvc             INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200
 IOVDbSvc             INFO *** COOL  exception caught: The database does not exist
 IOVDbSvc             INFO Create a new conditions database: sqlite://;schema=condtest.db;dbname=OFLP200
 DbSession            INFO     Open     DbSession    
 Domain[ROOT_All]     INFO >   Access   DbDomain     UPDATE    [ROOT_All] 
-Domain[ROOT_All]     INFO ->  Access   DbDatabase   CREATE    [ROOT_All] A9C970C0-3C58-8C41-8200-4F1137A07773
+Domain[ROOT_All]     INFO ->  Access   DbDatabase   CREATE    [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7
 Domain[ROOT_All]     INFO                           condtest.pool.root
 RootDatabase.open    INFO condtest.pool.root File version:61404
 StorageSvc           INFO Building shape according to reflection information using shape ID for:
@@ -119,9 +119,29 @@ AthenaEventLoopMgr   INFO   ===>>>  start processing event #18, run #0 18 events
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #18, run #0 19 events processed so far  <<<===
 AthenaEventLoopMgr   INFO   ===>>>  start processing event #19, run #0 19 events processed so far  <<<===
 AthenaEventLoopMgr   INFO   ===>>>  done processing event #19, run #0 20 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #20, run #0 20 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #20, run #0 21 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #21, run #0 21 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #21, run #0 22 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #22, run #0 22 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #22, run #0 23 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #23, run #0 23 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #23, run #0 24 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #24, run #0 24 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #24, run #0 25 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #25, run #0 25 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #25, run #0 26 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #26, run #0 26 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #26, run #0 27 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #27, run #0 27 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #27, run #0 28 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #28, run #0 28 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #28, run #0 29 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #29, run #0 29 events processed so far  <<<===
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #29, run #0 30 events processed so far  <<<===
 Domain[ROOT_All]     INFO >   Deaccess DbDomain     READ      [ROOT_All] 
 condtest.pool.root   INFO Database being retired...
-Domain[ROOT_All]     INFO ->  Deaccess DbDatabase   CREATE    [ROOT_All] A9C970C0-3C58-8C41-8200-4F1137A07773
+Domain[ROOT_All]     INFO ->  Deaccess DbDatabase   CREATE    [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7
 Domain[ROOT_All]     INFO >   Deaccess DbDomain     UPDATE    [ROOT_All] 
 ApplicationMgr       INFO Application Manager Stopped successfully
 IncidentProcAlg1     INFO Finalize
diff --git a/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py b/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py
index 8b027b97dc6..4c112a7fb5c 100644
--- a/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py
+++ b/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py
@@ -29,7 +29,29 @@ include ('DataModelRunTests/loadWriteDicts.py')
 #--------------------------------------------------------------
 # Event related parameters
 #--------------------------------------------------------------
-theApp.EvtMax = 20
+theApp.EvtMax = 30
+
+#
+# For purposes of this test, we assume that timestamp (in sec) matches
+# the event number (starting with 0) and that LBN counts every 3 events.
+#
+# We write four folders:
+# /DMTest/TestAttrList (runlbn):
+#  Attribute list.  New IOV for every LBN.  xint=(lbn+1)*10
+# /DMTest/S2 (runlbn):
+#  DMTest::S2.  New IOV for every 2 LBNs.  payload: lbn*50
+# /DMTest/RLTest (runlbn):
+#  Attribute list, defined as below.
+# /DMTest/TSTest (timestamp):
+#  Attribute list, defined as below.
+
+#  lbn:     0..1..2..3..4..5..6..7..8..9..
+#
+# lbn iov:  1..2.....3..4........5..6..7..
+#  ts iov:  1..2..34..5......6.7..8...9...   * 100
+#
+# event:              11111111112222222222
+# (ts)      012345678901234567890123456789
 
 #--------------------------------------------------------------
 # Output options
@@ -38,7 +60,7 @@ theApp.EvtMax = 20
 
 from AthenaServices.AthenaServicesConf import AthenaOutputStreamTool
 condstream = AthenaOutputStreamTool ('CondStream',
-                                         OutputFile = 'condtest.pool.root')
+                                     OutputFile = 'condtest.pool.root')
 
 from DataModelTestDataCommon.DataModelTestDataCommonConf import \
      DMTest__CondWriterAlg
diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h
index 64348ed784a..704384590e5 100755
--- a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h
+++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h
@@ -1,7 +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
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 */
 
 // $Id: DataModelTestDataCommonDict.h,v 1.2 2005-12-01 19:07:55 ssnyder Exp $
@@ -21,6 +21,7 @@
 #include "DataModelTestDataCommon/D.h"
 #include "DataModelTestDataCommon/S1.h"
 #include "DataModelTestDataCommon/S2.h"
+#include "DataModelTestDataCommon/S3.h"
 #include "DataModelTestDataCommon/BAux.h"
 #include "DataModelTestDataCommon/BAuxStandalone.h"
 #include "DataModelTestDataCommon/BAuxVec.h"
diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h
new file mode 100644
index 00000000000..71568d141c6
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h
@@ -0,0 +1,39 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+/*
+ * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
+ */
+// $Id$
+/**
+ * @file DataModelTestDataCommon/S3.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Nov, 2018
+ * @brief For mixed condcont tests.
+ */
+
+
+#ifndef DATAMODELTESTDATACOMMON_S3_H
+#define DATAMODELTESTDATACOMMON_S3_H
+
+
+#include "SGTools/CLASS_DEF.h"
+
+
+namespace DMTest {
+
+
+class S3
+{
+public:
+  S3 (int x = 0) : m_x (x) {}
+  virtual ~S3() {}
+  int m_x;
+};
+
+
+} // namespace DMTest
+
+
+CLASS_DEF (DMTest::S3, 131160325, 0)
+
+
+#endif // not DATAMODELTESTDATACOMMON_S3_H
diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h
new file mode 100644
index 00000000000..dfe169113d6
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h
@@ -0,0 +1,25 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+/*
+ * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
+ */
+// $Id$
+/**
+ * @file DataModelTestDataCommon/S3Cond.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Nov, 2018
+ * @brief Conditions declarations for S3.
+ */
+
+
+#ifndef DATAMODELTESTDATACOMMON_S3COND_H
+#define DATAMODELTESTDATACOMMON_S3COND_H
+
+
+#include "DataModelTestDataCommon/S3.h"
+#include "AthenaKernel/CondCont.h"
+
+
+CONDCONT_MIXED_DEF(DMTest::S3, 62539635);
+
+
+#endif // not DATAMODELTESTDATACOMMON_S3COND_H
diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml
index 6f6ac81d83d..bc604a323d4 100755
--- a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml
+++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml
@@ -14,6 +14,7 @@
   <class name="DMTest::D"/>
   <class name="DMTest::S1" id="230C025C-A8BB-4C8A-9C82-04C9C3D92384"/>
   <class name="DMTest::S2" id="EC2D9BCD-4B99-41EB-A799-82BAF48887FC"/>
+  <class name="DMTest::S3"/>
   <class name="DMTest::BAux" id="B2751847-F5E8-456A-8C03-BCA9AEEB27DD"/>
   <class name="DMTest::BAuxStandalone" id="6378E4BD-95AD-4D46-9860-B15779893A75" IAuxStore="true"/>
   <class name="DataVector<DMTest::BAux>" id="734BB39F-4E7C-4637-8510-6716160242D4"/>
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx
new file mode 100644
index 00000000000..ff8f54068cc
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
+ */
+// $Id$
+/**
+ * @file DataModelTestDataCommon/src/CondAlg2.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Nov, 2018
+ * @brief Testing conditions algorithm taking both RL and TS inputs
+ *        and producing mixed output.
+ */
+
+
+#include "CondAlg2.h"
+
+
+namespace DMTest {
+
+
+/**
+ * @brief Constructor.
+ * @param name The algorithm name.
+ * @param pSvcLocator The service locator.
+ */
+CondAlg2::CondAlg2 (const std::string &name, ISvcLocator *pSvcLocator)
+  : AthReentrantAlgorithm (name, pSvcLocator),
+    m_rltestKey ("/DMTest/RLTest"),
+    m_tstestKey ("/DMTest/TSTest"),
+    m_outKey ("scond3", "DMTest")
+{
+  declareProperty ("RLTestKey",  m_rltestKey);
+  declareProperty ("TSTestKey",  m_tstestKey);
+  declareProperty ("OutKey",     m_outKey);
+}
+
+
+/**
+ * @brief Algorithm initialization; called at the beginning of the job.
+ */
+StatusCode CondAlg2::initialize()
+{
+  ATH_CHECK( m_rltestKey.initialize() );
+  ATH_CHECK( m_tstestKey.initialize() );
+  ATH_CHECK( m_outKey.initialize() );
+  return StatusCode::SUCCESS;
+}
+
+
+/**
+ * @brief Algorithm event processing.
+ */
+StatusCode CondAlg2::execute_r (const EventContext& ctx) const
+{
+  SG::ReadCondHandle<AthenaAttributeList> rltest (m_rltestKey, ctx);
+  int xint_rl = (**rltest)["xint"].data<int>();
+
+  SG::ReadCondHandle<AthenaAttributeList> tstest (m_tstestKey, ctx);
+  int xint_ts = (**tstest)["xint"].data<int>();
+
+  EventIDRange range_rl;
+  ATH_CHECK( rltest.range(range_rl) );
+
+  EventIDRange range_ts;
+  ATH_CHECK( tstest.range(range_ts) );
+
+  EventIDBase start (range_rl.start().run_number(),
+                     range_rl.start().event_number(),
+                     range_ts.start().time_stamp(),
+                     range_ts.start().time_stamp_ns_offset(),
+                     range_rl.start().lumi_block());
+  EventIDBase stop (range_rl.stop().run_number(),
+                    range_rl.stop().event_number(),
+                    range_ts.stop().time_stamp(),
+                    range_ts.stop().time_stamp_ns_offset(),
+                    range_rl.stop().lumi_block());
+
+  EventIDRange range (start, stop);
+
+  SG::WriteCondHandle<DMTest::S3> out (m_outKey, ctx);
+  auto s3 = std::make_unique<DMTest::S3> (xint_rl + xint_ts);
+  ATH_CHECK( out.record (range, std::move(s3)) );
+
+  return StatusCode::SUCCESS;
+}
+
+
+} // namespace DMTest
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h
new file mode 100644
index 00000000000..b4a9a146193
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h
@@ -0,0 +1,63 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+/*
+ * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
+ */
+// $Id$
+/**
+ * @file DataModelTestDataCommon/src/CondAlg2.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Nov, 2018
+ * @brief Testing conditions algorithm taking both RL and TS inputs
+ *        and producing mixed output.
+ */
+
+
+#ifndef DATAMODELTESTDATACOMMON_CONDALG2_H
+#define DATAMODELTESTDATACOMMON_CONDALG2_H
+
+
+#include "DataModelTestDataCommon/S3Cond.h"
+#include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "AthenaPoolUtilities/AthenaAttributeList.h"
+#include "StoreGate/ReadCondHandleKey.h"
+#include "StoreGate/WriteCondHandleKey.h"
+
+
+namespace DMTest {
+
+
+class CondAlg2
+  : public AthReentrantAlgorithm
+{
+public:
+  /**
+   * @brief Constructor.
+   * @param name The algorithm name.
+   * @param pSvcLocator The service locator.
+   */
+  CondAlg2 (const std::string &name, ISvcLocator *pSvcLocator);
+
+
+  /**
+   * @brief Algorithm initialization; called at the beginning of the job.
+   */
+  virtual StatusCode initialize() override;
+
+
+  /**
+   * @brief Algorithm event processing.
+   */
+  virtual StatusCode execute_r (const EventContext& ctx) const override;
+
+
+private:
+  SG::ReadCondHandleKey<AthenaAttributeList> m_rltestKey;
+  SG::ReadCondHandleKey<AthenaAttributeList> m_tstestKey;
+  SG::WriteCondHandleKey<DMTest::S3> m_outKey;
+};
+
+
+} // namespace DMTest
+
+
+#endif // not DATAMODELTESTDATACOMMON_CONDALG2_H
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx
index 079279a66ec..857844c074f 100644
--- a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx
@@ -30,13 +30,19 @@ CondReaderAlg::CondReaderAlg (const std::string& name, ISvcLocator *pSvcLocator)
     m_chronoSvc ("ChronoStatSvc", name),
     m_attrListKey ("/DMTest/TestAttrList"),
     m_scondKey ("scond", "DMTest"),
-    m_s2Key ("/DMTest/S2")
+    m_s2Key ("/DMTest/S2"),
+    m_s3Key(""),
+    m_rltestKey (""),
+    m_tstestKey ("")
 {
   declareProperty ("ChronoSvc",    m_chronoSvc);
   declareProperty ("EventInfoKey", m_eventInfoKey = "McEventInfo");
   declareProperty ("AttrListKey",  m_attrListKey);
   declareProperty ("SCondKey",     m_scondKey);
   declareProperty ("S2Key",        m_s2Key);
+  declareProperty ("S3Key",        m_s3Key);
+  declareProperty ("RLTestKey",    m_rltestKey);
+  declareProperty ("TSTestKey",    m_tstestKey);
   declareProperty ("Spins",        m_spins = 0);
 }
 
@@ -54,6 +60,10 @@ StatusCode CondReaderAlg::initialize()
   // Allow running without POOL payload
   if ( !m_s2Key.key().empty()) ATH_CHECK( m_s2Key.initialize() );
 
+  if ( !m_s3Key.key().empty())     ATH_CHECK( m_s3Key.initialize() );
+  if ( !m_rltestKey.key().empty()) ATH_CHECK( m_rltestKey.initialize() );
+  if ( !m_tstestKey.key().empty()) ATH_CHECK( m_tstestKey.initialize() );
+
   return StatusCode::SUCCESS;
 }
 
@@ -79,6 +89,21 @@ StatusCode CondReaderAlg::execute (const EventContext& ctx) const
     ATH_MSG_INFO ("  s2 " << s2->m_x );
   }
 
+  if (!m_rltestKey.key().empty()) {
+    SG::ReadCondHandle<AthenaAttributeList> rl (m_rltestKey, ctx);
+    ATH_MSG_INFO ("  rl " << (**rl)["xint"]);
+  }
+
+  if (!m_tstestKey.key().empty()) {
+    SG::ReadCondHandle<AthenaAttributeList> ts (m_tstestKey, ctx);
+    ATH_MSG_INFO ("  ts " << (**ts)["xint"]);
+  }
+
+  if (!m_s3Key.key().empty()) {
+    SG::ReadCondHandle<DMTest::S3> s3 (m_s3Key, ctx);
+    ATH_MSG_INFO ("  s3 " << s3->m_x );
+  }
+
   {
     std::string xint = "xint";
     Chrono chrono (&*m_chronoSvc, "spin time");
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h
index 06781d9024b..58d158d42ed 100644
--- a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h
@@ -1,6 +1,6 @@
 // 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.
+ * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
  */
 // $Id$
 /**
@@ -16,6 +16,7 @@
 
 
 #include "DataModelTestDataCommon/S1Cond.h"
+#include "DataModelTestDataCommon/S3Cond.h"
 #include "EventInfo/EventInfo.h"
 #include "AthenaBaseComps/AthReentrantAlgorithm.h"
 #include "AthenaPoolUtilities/AthenaAttributeList.h"
@@ -58,6 +59,9 @@ private:
   SG::ReadCondHandleKey<AthenaAttributeList> m_attrListKey;
   SG::ReadCondHandleKey<DMTest::S1> m_scondKey;
   SG::ReadCondHandleKey<DMTest::S1> m_s2Key;
+  SG::ReadCondHandleKey<DMTest::S3> m_s3Key;
+  SG::ReadCondHandleKey<AthenaAttributeList> m_rltestKey;
+  SG::ReadCondHandleKey<AthenaAttributeList> m_tstestKey;
   size_t m_spins;
 };
 
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx
index c7692d8d178..ac4774c6a7f 100644
--- a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx
@@ -35,6 +35,8 @@ CondWriterAlg::CondWriterAlg (const std::string &name, ISvcLocator *pSvcLocator)
   declareProperty ("EventInfoKey", m_eventInfoKey = "McEventInfo");
   declareProperty ("AttrListKey",  m_attrListKey = "/DMTest/TestAttrList");
   declareProperty ("S2Key",        m_s2Key       = "/DMTest/S2");
+  declareProperty ("RLTestKey",    m_rltestKey   = "/DMTest/RLTest");
+  declareProperty ("TSTestKey",    m_tstestKey   = "/DMTest/TSTest");
 }
 
 
@@ -72,6 +74,61 @@ StatusCode CondWriterAlg::writeSCond (unsigned int count)
 }
 
 
+StatusCode CondWriterAlg::writeRLTest (unsigned int count)
+{
+  // Bound in LBN.
+  static const unsigned int bounds[] = { 0, 1, 3, 4, 7, 8, 9 };
+
+  unsigned int lbn = count / 3;
+  const unsigned int* pos = std::find (std::begin(bounds),
+                                       std::end(bounds),
+                                       lbn);
+  if (pos != std::end(bounds)) {
+    unsigned int niov = pos - std::begin(bounds) + 1;
+
+    auto attrList = std::make_unique<AthenaAttributeList>();
+    attrList->extend ("xint", "int");
+    (*attrList)["xint"].setValue(static_cast<int> (niov));
+    ATH_CHECK( detStore()->overwrite (std::move (attrList), m_rltestKey) );
+
+    ATH_CHECK( m_regSvc->registerIOV ("AthenaAttributeList",
+                                      m_rltestKey,
+                                      "RL_noTag",
+                                      0, 0,
+                                      lbn, IOVTime::MAXEVENT) );
+  }
+
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode CondWriterAlg::writeTSTest (unsigned int count)
+{
+  // Bound in count.
+  static const unsigned int bounds[] = { 0, 3, 6, 7, 10, 17, 19, 22, 26 };
+
+  const unsigned int* pos = std::find (std::begin(bounds),
+                                       std::end(bounds),
+                                       count);
+  if (pos != std::end(bounds)) {
+    unsigned int niov = pos - std::begin(bounds) + 1;
+
+    auto attrList = std::make_unique<AthenaAttributeList>();
+    attrList->extend ("xint", "int");
+    (*attrList)["xint"].setValue(static_cast<int> (niov * 100));
+    ATH_CHECK( detStore()->overwrite (std::move (attrList), m_tstestKey) );
+
+    ATH_CHECK( m_regSvc->registerIOV ("AthenaAttributeList",
+                                      m_tstestKey,
+                                      "TS_noTag",
+                                      static_cast<uint64_t>(count) * 1000000000,
+                                      IOVTime::MAXTIMESTAMP) );
+  }
+
+  return StatusCode::SUCCESS;
+}
+
+
 /**
  * @brief Algorithm event processing.
  */
@@ -96,6 +153,9 @@ StatusCode CondWriterAlg::execute()
     ATH_CHECK( writeSCond (count) );
   }
 
+  ATH_CHECK( writeRLTest (count) );
+  ATH_CHECK( writeTSTest (count) );
+
   return StatusCode::SUCCESS;
 }
 
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h
index 8d899ce2b42..dab470ced32 100644
--- a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h
@@ -1,6 +1,6 @@
 // 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.
+ * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration.
  */
 // $Id$
 /**
@@ -53,12 +53,16 @@ public:
 
 private:
   StatusCode writeSCond (unsigned int count);
+  StatusCode writeRLTest (unsigned int count);
+  StatusCode writeTSTest (unsigned int count);
 
   ServiceHandle<IIOVRegistrationSvc> m_regSvc;
   ToolHandle<IAthenaOutputStreamTool> m_streamer;
   SG::ReadHandleKey<EventInfo> m_eventInfoKey;
   std::string m_attrListKey;
   std::string m_s2Key;
+  std::string m_rltestKey;
+  std::string m_tstestKey;
 };
 
 
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx
index 63c29a927ba..ed7277f358b 100644
--- a/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx
@@ -21,6 +21,7 @@
 #include "../CondReaderAlg.h"
 #include "../xAODTestReadSymlinkTool.h"
 #include "../CondAlg1.h"
+#include "../CondAlg2.h"
 #include "../MetaWriterAlg.h"
 #include "../MetaReaderAlg.h"
 
@@ -33,6 +34,7 @@ DECLARE_COMPONENT( DMTest::CondWriterAlg )
 DECLARE_COMPONENT( DMTest::CondWriterExtAlg )
 DECLARE_COMPONENT( DMTest::CondReaderAlg )
 DECLARE_COMPONENT( DMTest::CondAlg1 )
+DECLARE_COMPONENT( DMTest::CondAlg2 )
 DECLARE_COMPONENT( DMTest::MetaWriterAlg )
 DECLARE_COMPONENT( DMTest::MetaReaderAlg )
 
-- 
GitLab