diff --git a/Control/AthContainers/AthContainers/AuxElement.h b/Control/AthContainers/AthContainers/AuxElement.h
index c494298f9863e64e23251211590779eaeae94a80..9a799f566a6e33920fd94cce1e71f7f4f63630fb 100644
--- a/Control/AthContainers/AthContainers/AuxElement.h
+++ b/Control/AthContainers/AthContainers/AuxElement.h
@@ -1176,4 +1176,7 @@ private:
 #include "AthContainers/AuxElement.icc"
 
 
+CLASS_DEF (SG::AuxElement, 225182422, 1)
+
+
 #endif // not ATHCONTAINERS_AUXELEMENTBASE_H
diff --git a/Control/AthenaBaseComps/AthenaBaseComps/AthAlgorithm.h b/Control/AthenaBaseComps/AthenaBaseComps/AthAlgorithm.h
index e79468713bfb49fa1b108eb1deb602510ef8baff..6ca6da831830312612672ea331805506c666b327 100644
--- a/Control/AthenaBaseComps/AthenaBaseComps/AthAlgorithm.h
+++ b/Control/AthenaBaseComps/AthenaBaseComps/AthAlgorithm.h
@@ -234,6 +234,15 @@ public:
   }
 
   
+  /**
+   * @brief Return the list of extra output dependencies.
+   *
+   * This list is extended to include symlinks implied by inheritance
+   * relations.
+   */
+  virtual const DataObjIDColl& extraOutputDeps() const override;
+
+
   /////////////////////////////////////////////////////////////////// 
   // Non-const methods: 
   /////////////////////////////////////////////////////////////////// 
@@ -266,6 +275,10 @@ public:
   typedef ServiceHandle<IUserDataSvc> UserDataSvc_t;
   /// Pointer to IUserDataSvc
   mutable UserDataSvc_t m_userStore;
+
+  /// Extra output dependency collection, extended by AthAlgorithmDHUpdate
+  /// to add symlinks.  Empty if no symlinks were found.
+  DataObjIDColl m_extendedExtraObjects;
 }; 
 
 /////////////////////////////////////////////////////////////////// 
diff --git a/Control/AthenaBaseComps/AthenaBaseComps/AthReentrantAlgorithm.h b/Control/AthenaBaseComps/AthenaBaseComps/AthReentrantAlgorithm.h
index e21626d3e063f20b88e9793922ab33a9808ae01a..0dd08e060b71e8ca06e75338ca79c7bae3f07436 100644
--- a/Control/AthenaBaseComps/AthenaBaseComps/AthReentrantAlgorithm.h
+++ b/Control/AthenaBaseComps/AthenaBaseComps/AthReentrantAlgorithm.h
@@ -281,7 +281,16 @@ public:
 
   }
 
-  
+
+  /**
+   * @brief Return the list of extra output dependencies.
+   *
+   * This list is extended to include symlinks implied by inheritance
+   * relations.
+   */
+  virtual const DataObjIDColl& extraOutputDeps() const override;
+
+
   /////////////////////////////////////////////////////////////////// 
   // Non-const methods: 
   /////////////////////////////////////////////////////////////////// 
@@ -314,6 +323,10 @@ public:
   typedef ServiceHandle<IUserDataSvc> UserDataSvc_t;
   /// Pointer to IUserDataSvc
   mutable UserDataSvc_t m_userStore;
+
+  /// Extra output dependency collection, extended by AthAlgorithmDHUpdate
+  /// to add symlinks.  Empty if no symlinks were found.
+  DataObjIDColl m_extendedExtraObjects;
 }; 
 
 /////////////////////////////////////////////////////////////////// 
diff --git a/Control/AthenaBaseComps/CMakeLists.txt b/Control/AthenaBaseComps/CMakeLists.txt
index ece926545de757e64648371b71d147dc2ba1c1da..fa62f1921cfa8c51dc0ebc850c91b8ee9d11d56a 100644
--- a/Control/AthenaBaseComps/CMakeLists.txt
+++ b/Control/AthenaBaseComps/CMakeLists.txt
@@ -38,3 +38,13 @@ atlas_add_test( AthReentrantAlgorithm_test
    SOURCES test/AthReentrantAlgorithm_test.cxx
    LINK_LIBRARIES StoreGateLib GaudiKernel TestTools AthenaBaseComps 
    ENVIRONMENT "JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/share" )
+
+atlas_add_test( AthAlgorithm_test
+   SOURCES test/AthAlgorithm_test.cxx
+   LINK_LIBRARIES StoreGateLib GaudiKernel TestTools AthenaBaseComps 
+   ENVIRONMENT "JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/share" )
+
+atlas_add_test( AthAlgorithmDHUpdate_test
+   SOURCES test/AthAlgorithmDHUpdate_test.cxx
+   LINK_LIBRARIES StoreGateLib GaudiKernel TestTools AthenaBaseComps
+   ENVIRONMENT "JOBOPTSEARCHPATH=${CMAKE_CURRENT_SOURCE_DIR}/share" )
diff --git a/Control/AthenaBaseComps/share/AthAlgorithmDHUpdate_test.ref b/Control/AthenaBaseComps/share/AthAlgorithmDHUpdate_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..d535188fd9f8895aad1444efc59279681dae2b33
--- /dev/null
+++ b/Control/AthenaBaseComps/share/AthAlgorithmDHUpdate_test.ref
@@ -0,0 +1,32 @@
+
+
+Initializing Gaudi ApplicationMgr using job opts ../share/propertyHandling_test.txt
+JobOptionsSvc        INFO # =======> /afs/cern.ch/user/s/ssnyder/atlas-work7/Control/AthenaBaseComps/share/../share/propertyHandling_test.txt
+JobOptionsSvc        INFO # (1,1): alg.rkey = "FooSvc/aaa"
+JobOptionsSvc        INFO # (2,1): alg.wkey = "BarSvc/bbb"
+JobOptionsSvc        INFO # (3,1): alg.ukey = "ccc"
+JobOptionsSvc        INFO # (4,1): alg.rhandle = "FooSvc/ddd"
+JobOptionsSvc        INFO # (5,1): alg.whandle = "BarSvc/eee"
+JobOptionsSvc        INFO # (6,1): alg.uhandle = "fff"
+JobOptionsSvc        INFO # (8,1): tool.rkey = "FooSvc/taa"
+JobOptionsSvc        INFO # (9,1): tool.wkey = "BarSvc/tbb"
+JobOptionsSvc        INFO # (10,1): tool.ukey = "tcc"
+JobOptionsSvc        INFO # (11,1): tool.rhandle = "FooSvc/tdd"
+JobOptionsSvc        INFO # (12,1): tool.whandle = "BarSvc/tee"
+JobOptionsSvc        INFO # (13,1): tool.uhandle = "tff"
+JobOptionsSvc        INFO # (15,1): ralg.rkey = "FooSvc/aaa"
+JobOptionsSvc        INFO # (16,1): ralg.whandle = "BarSvc/eee"
+JobOptionsSvc        INFO Job options successfully read in from ../share/propertyHandling_test.txt
+ApplicationMgr    SUCCESS 
+====================================================================================================================================
+                                                   Welcome to ApplicationMgr (GaudiCoreSvc v28r1)
+                                          running on lxplus042.cern.ch on Thu Apr  6 17:12:06 2017
+====================================================================================================================================
+ApplicationMgr       INFO Application Manager Configured successfully
+EventLoopMgr      WARNING Unable to locate service "EventSelector" 
+EventLoopMgr      WARNING No events will be processed from external input.
+HistogramPersis...WARNING Histograms saving not required.
+ApplicationMgr       INFO Application Manager Initialized successfully
+ApplicationMgr Ready
+test1
+ClassIDSvc           INFO  getRegistryEntries: read 677 CLIDRegistry entries for module ALL
diff --git a/Control/AthenaBaseComps/share/AthAlgorithm_test.ref b/Control/AthenaBaseComps/share/AthAlgorithm_test.ref
new file mode 100644
index 0000000000000000000000000000000000000000..351f76b877521af4b2ee9f8870348eca0d1660ad
--- /dev/null
+++ b/Control/AthenaBaseComps/share/AthAlgorithm_test.ref
@@ -0,0 +1,33 @@
+
+
+Initializing Gaudi ApplicationMgr using job opts ../share/propertyHandling_test.txt
+JobOptionsSvc        INFO # =======> /afs/cern.ch/user/s/ssnyder/atlas-work7/Control/AthenaBaseComps/share/../share/propertyHandling_test.txt
+JobOptionsSvc        INFO # (1,1): alg.rkey = "FooSvc/aaa"
+JobOptionsSvc        INFO # (2,1): alg.wkey = "BarSvc/bbb"
+JobOptionsSvc        INFO # (3,1): alg.ukey = "ccc"
+JobOptionsSvc        INFO # (4,1): alg.rhandle = "FooSvc/ddd"
+JobOptionsSvc        INFO # (5,1): alg.whandle = "BarSvc/eee"
+JobOptionsSvc        INFO # (6,1): alg.uhandle = "fff"
+JobOptionsSvc        INFO # (8,1): tool.rkey = "FooSvc/taa"
+JobOptionsSvc        INFO # (9,1): tool.wkey = "BarSvc/tbb"
+JobOptionsSvc        INFO # (10,1): tool.ukey = "tcc"
+JobOptionsSvc        INFO # (11,1): tool.rhandle = "FooSvc/tdd"
+JobOptionsSvc        INFO # (12,1): tool.whandle = "BarSvc/tee"
+JobOptionsSvc        INFO # (13,1): tool.uhandle = "tff"
+JobOptionsSvc        INFO # (15,1): ralg.rkey = "FooSvc/aaa"
+JobOptionsSvc        INFO # (16,1): ralg.whandle = "BarSvc/eee"
+JobOptionsSvc        INFO Job options successfully read in from ../share/propertyHandling_test.txt
+ApplicationMgr    SUCCESS 
+====================================================================================================================================
+                                                   Welcome to ApplicationMgr (GaudiCoreSvc v28r1)
+                                          running on lxplus042.cern.ch on Thu Apr  6 23:08:52 2017
+====================================================================================================================================
+ApplicationMgr       INFO Application Manager Configured successfully
+EventLoopMgr      WARNING Unable to locate service "EventSelector" 
+EventLoopMgr      WARNING No events will be processed from external input.
+HistogramPersis...WARNING Histograms saving not required.
+ApplicationMgr       INFO Application Manager Initialized successfully
+ApplicationMgr Ready
+test1
+ClassIDSvc           INFO  getRegistryEntries: read 727 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 359 CLIDRegistry entries for module ALL
diff --git a/Control/AthenaBaseComps/src/AthAlgorithm.cxx b/Control/AthenaBaseComps/src/AthAlgorithm.cxx
index e419251f6e8a86aff3750b4e02a54d93c9208035..35f87bce7e3ff8f48b21a9506e499698f2f11fa9 100644
--- a/Control/AthenaBaseComps/src/AthAlgorithm.cxx
+++ b/Control/AthenaBaseComps/src/AthAlgorithm.cxx
@@ -11,12 +11,14 @@
 
 // AthenaBaseComps includes
 #include "AthenaBaseComps/AthAlgorithm.h"
+#include "AthAlgorithmDHUpdate.h"
 
 // STL includes
 
 // FrameWork includes
 #include "GaudiKernel/Property.h"
 
+
 /////////////////////////////////////////////////////////////////// 
 // Public methods: 
 /////////////////////////////////////////////////////////////////// 
@@ -61,6 +63,14 @@ AthAlgorithm::AthAlgorithm( const std::string& name,
                    m_userStore = UserDataSvc_t ("UserDataSvc/UserDataSvc", name),
                    "Handle to a UserDataSvc/UserDataSvc instance: it will be used to "
                    "retrieve user data during the course of the job" );
+
+  // Set up to run AthAlgorithmDHUpdate in sysInitialize before
+  // merging depedency lists.  This extends the output dependency
+  // list with any symlinks implied by inheritance relations.
+  m_updateDataHandles =
+    std::make_unique<AthenaBaseComps::AthAlgorithmDHUpdate>
+    (m_extendedExtraObjects,
+     std::move (m_updateDataHandles));
 }
 
 // Destructor
@@ -105,3 +115,20 @@ AthAlgorithm::msg_update_handler( Property& outputLevel )
       msg().setLevel( msgLevel() );
    }
 }
+
+
+/**
+ * @brief Return the list of extra output dependencies.
+ *
+ * This list is extended to include symlinks implied by inheritance
+ * relations.
+ */
+const DataObjIDColl& AthAlgorithm::extraOutputDeps() const
+{
+  // If we didn't find any symlinks to add, just return the collection
+  // from the base class.  Otherwise, return the extended collection.
+  if (!m_extendedExtraObjects.empty()) {
+    return m_extendedExtraObjects;
+  }
+  return Algorithm::extraOutputDeps();
+}
diff --git a/Control/AthenaBaseComps/src/AthAlgorithmDHUpdate.cxx b/Control/AthenaBaseComps/src/AthAlgorithmDHUpdate.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..237817d086579dab5bd6117f720c4f4588119442
--- /dev/null
+++ b/Control/AthenaBaseComps/src/AthAlgorithmDHUpdate.cxx
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+// $Id$
+/**
+ * @file AthenaBaseComps/src/AthAlgorithmDHUpdate.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Apr, 2017
+ * @brief Update output dependencies to include symlinks.
+ */
+
+
+#include "AthAlgorithmDHUpdate.h"
+#include "SGTools/BaseInfo.h"
+
+
+namespace AthenaBaseComps {
+
+
+/**
+ * @brief Constructor.
+ * @param linkedObjs Set to which entries for symlinks will be added.
+ * @param chain Hook to call after this one completes.
+ */
+AthAlgorithmDHUpdate::AthAlgorithmDHUpdate (DataObjIDColl& linkedObjs,
+                                            std::unique_ptr<IDataHandleVisitor> chain)
+  : m_linkedObjs (linkedObjs),
+    m_chain (std::move (chain))
+{
+}
+
+
+/**
+ * @brief Walk over the dependencies of an algorithm.
+ * @param dhh The algorithm object.
+ *
+ * Finds output dependencies of the algorithms that have symlinks
+ * available and enters these links in @c linkedObjs.
+ */
+void AthAlgorithmDHUpdate::visit (const IDataHandleHolder* dhh)
+{
+  // Make a copy, as usually linkedObjs will be extraOutputDeps().
+  DataObjIDColl ex = dhh->extraOutputDeps();
+
+  // Process all output dependencies.
+  for (const Gaudi::DataHandle* h : dhh->outputHandles()) {
+    if (!h->objKey().empty())
+      handle (h->fullKey().clid(), h->objKey());
+  }
+
+  for (const DataObjID& dobj : ex) {
+    if (!dobj.key().empty())
+      handle (dobj.clid(), dobj.key());
+  }
+
+  for (const DataObjID& dobj : dhh->outputDataObjs()) {
+    if (!dobj.key().empty())
+      handle (dobj.clid(), dobj.key());
+  }
+
+  // If we put anything in linkedObjs, also add the contents
+  // of extraOutputDeps.
+  if (!m_linkedObjs.empty()) {
+    DataObjIDColl ex = dhh->extraOutputDeps();
+    m_linkedObjs.insert (ex.begin(), ex.end());
+  }
+
+  // Call the next hook function, if any.
+  if (m_chain) {
+    m_chain->visit (dhh);
+  }
+}
+
+
+/**
+ * @brief Handle one output dependency.
+ * @param clid The CLID of the output.
+ * @param key The SG key of the output.
+ *
+ * If CLID has symlinks available, enter these links in @c linkedObjs.
+ */
+void AthAlgorithmDHUpdate::handle (CLID clid, const std::string& key)
+{
+  const SG::BaseInfoBase* bib = SG::BaseInfoBase::find (clid);
+  if (!bib) return;
+  for (CLID clid2 : bib->get_bases()) {
+    if (clid2 != clid) {
+      m_linkedObjs.emplace (clid2, key);
+    }
+  }
+}
+
+
+} // namespace AthenaBaseComps
diff --git a/Control/AthenaBaseComps/src/AthAlgorithmDHUpdate.h b/Control/AthenaBaseComps/src/AthAlgorithmDHUpdate.h
new file mode 100644
index 0000000000000000000000000000000000000000..45036ce0ce7fe3c13f1d6b0aa59154bf574e9f08
--- /dev/null
+++ b/Control/AthenaBaseComps/src/AthAlgorithmDHUpdate.h
@@ -0,0 +1,85 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+// $Id$
+/**
+ * @file AthenaBaseComps/src/AthAlgorithmDHUpdate.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Apr, 2017
+ * @brief Update output dependencies to include symlinks.
+ */
+
+
+#ifndef ATHENABASECOMPS_ATHALGORITHMDHUPDATE_H
+#define ATHENABASECOMPS_ATHALGORITHMDHUPDATE_H
+
+
+#include "GaudiKernel/IDataHandleHolder.h"
+#include "GaudiKernel/DataObjID.h"
+#include "GaudiKernel/ClassID.h"
+#include <memory>
+
+
+namespace AthenaBaseComps {
+
+
+/**
+ * @brief Update output dependencies to include symlinks.
+ *
+ * This is intended to be installed in an algorithm via the
+ * m_updateDataHandles hook, to run before Algorithm::sysInitialize
+ * merges the sets of input and output dependencies.
+ *
+ * It makes a first pass over all the output dependences.  For each,
+ * it examines the CLID to see if there are any other CLIDs to which
+ * it is convertable, and if so, adds them to the @c linkedObjs list.
+ * The intention is that the algorithm will then override
+ * @c extraOutputDeps so that it will include these extra entries.
+ */
+class AthAlgorithmDHUpdate
+  : public IDataHandleVisitor
+{
+public:
+  /**
+   * @brief Constructor.
+   * @param linkedObjs Set to which entries for symlinks will be added.
+   * @param chain Hook to call after this one completes.
+   */
+  AthAlgorithmDHUpdate (DataObjIDColl& linkedObjs,
+                        std::unique_ptr<IDataHandleVisitor> chain);
+  
+
+  /**
+   * @brief Walk over the dependencies of an algorithm.
+   * @param dhh The algorithm object.
+   *
+   * Finds output dependencies of the algorithms that have symlinks
+   * available and enters these links in @c linkedObjs.
+   */
+  virtual void visit(const IDataHandleHolder* dhh) override;
+
+  
+private:
+  /**
+   * @brief Handle one output dependency.
+   * @param clid The CLID of the output.
+   * @param key The SG key of the output.
+   *
+   * If CLID has symlinks available, enter these links in @c linkedObjs.
+   */
+  void handle (CLID clid, const std::string& key);
+
+
+  /// Set of additional output dependencies represented by links.
+  DataObjIDColl& m_linkedObjs;
+
+  /// Hook to call after this one.
+  std::unique_ptr<IDataHandleVisitor> m_chain;
+};
+
+
+} // namespace AthenaBaseComps
+
+
+#endif // not ATHENABASECOMPS_ATHALGORITHMDHUPDATE_H
diff --git a/Control/AthenaBaseComps/src/AthReentrantAlgorithm.cxx b/Control/AthenaBaseComps/src/AthReentrantAlgorithm.cxx
index bc09e1db6f48bac7fd108fa942909166bf6f3797..7846761c4a224cf63677fe206a231145f7fcdbe5 100644
--- a/Control/AthenaBaseComps/src/AthReentrantAlgorithm.cxx
+++ b/Control/AthenaBaseComps/src/AthReentrantAlgorithm.cxx
@@ -11,6 +11,7 @@
 
 // AthenaBaseComps includes
 #include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "AthAlgorithmDHUpdate.h"
 
 // FrameWork includes
 #include "GaudiKernel/Property.h"
@@ -62,6 +63,14 @@ AthReentrantAlgorithm::AthReentrantAlgorithm( const std::string& name,
                    m_userStore = UserDataSvc_t ("UserDataSvc/UserDataSvc", name),
                    "Handle to a UserDataSvc/UserDataSvc instance: it will be used to "
                    "retrieve user data during the course of the job" );
+
+  // Set up to run AthAlgorithmDHUpdate in sysInitialize before
+  // merging depedency lists.  This extends the output dependency
+  // list with any symlinks implied by inheritance relations.
+  m_updateDataHandles =
+    std::make_unique<AthenaBaseComps::AthAlgorithmDHUpdate>
+    (m_extendedExtraObjects,
+     std::move (m_updateDataHandles));
 }
 
 // Destructor
@@ -119,3 +128,20 @@ StatusCode AthReentrantAlgorithm::execute()
   return execute_r (Gaudi::Hive::currentContext());
 }
 #endif
+
+
+/**
+ * @brief Return the list of extra output dependencies.
+ *
+ * This list is extended to include symlinks implied by inheritance
+ * relations.
+ */
+const DataObjIDColl& AthReentrantAlgorithm::extraOutputDeps() const
+{
+  // If we didn't find any symlinks to add, just return the collection
+  // from the base class.  Otherwise, return the extended collection.
+  if (!m_extendedExtraObjects.empty()) {
+    return m_extendedExtraObjects;
+  }
+  return Algorithm::extraOutputDeps();
+}
diff --git a/Control/AthenaBaseComps/test/AthAlgorithmDHUpdate_test.cxx b/Control/AthenaBaseComps/test/AthAlgorithmDHUpdate_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..e57749a5018f907090f794a1b0c1156539f39a9c
--- /dev/null
+++ b/Control/AthenaBaseComps/test/AthAlgorithmDHUpdate_test.cxx
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+// $Id$
+/**
+ * @file AthenaBaseComps/test/AthAlgorithmDHUpdate_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Apr, 2017
+ * @brief Test property handling for AthReentrantAlgorithm.
+ */
+
+
+#undef NDEBUG
+#include "../src/AthAlgorithmDHUpdate.h"
+#include "SGTools/CLASS_DEF.h"
+#include "SGTools/BaseInfo.h"
+#include "TestTools/initGaudi.h"
+#include <cassert>
+#include <iostream>
+
+
+class A2 {};
+class A3 {};
+class A1 : public A2, public A3 {};
+CLASS_DEF (A1, 132102064, 0)
+CLASS_DEF (A2, 132102065, 0)
+CLASS_DEF (A3, 132102066, 0)
+SG_BASES2 (A1, A2, A3);
+
+class B2 {};
+class B1 : public B2 {};
+CLASS_DEF (B1, 132102074, 0)
+CLASS_DEF (B2, 132102075, 0)
+SG_BASE (B1, B2);
+
+class C2 {};
+class C1 : public C2 {};
+CLASS_DEF (C1, 132102084, 0)
+CLASS_DEF (C2, 132102085, 0)
+SG_BASE (C1, C2);
+
+class TestHolder
+  : public IDataHandleHolder
+{
+public:
+  virtual std::vector<Gaudi::DataHandle*> inputHandles() const override
+  { std::abort(); }
+  virtual const DataObjIDColl& extraInputDeps() const override
+  { std::abort(); }
+  virtual void acceptDHVisitor(IDataHandleVisitor*) const override
+  { std::abort(); }
+  virtual void commitHandles() override
+  { std::abort(); }
+  virtual const DataObjIDColl& inputDataObjs() const override
+  { std::abort(); }
+  virtual void addDependency(const DataObjID&, const Gaudi::DataHandle::Mode&) override
+  { std::abort(); }
+  virtual void declare(Gaudi::DataHandle&) override
+  { std::abort(); }
+  virtual void renounce(Gaudi::DataHandle&) override
+  { std::abort(); }
+  virtual unsigned long addRef() override
+  { std::abort(); }
+  virtual unsigned long release() override
+  { std::abort(); }
+  virtual StatusCode queryInterface(const InterfaceID&, void**) override
+  { std::abort(); }
+  virtual const std::string& name() const override
+  { std::abort(); }
+
+  virtual std::vector<Gaudi::DataHandle*> outputHandles() const override;
+  virtual const DataObjIDColl& extraOutputDeps() const override;
+  virtual const DataObjIDColl& outputDataObjs() const override;
+
+
+  std::vector<Gaudi::DataHandle*> handle_ptrs;
+  DataObjIDColl outDeps;
+  DataObjIDColl extraOutDeps;
+};
+
+
+std::vector<Gaudi::DataHandle*> TestHolder::outputHandles() const
+{
+  return handle_ptrs;
+}
+
+
+const DataObjIDColl& TestHolder::extraOutputDeps() const
+{
+  return extraOutDeps;
+}
+
+
+const DataObjIDColl& TestHolder::outputDataObjs() const
+{
+  return outDeps;
+}
+
+
+class TestChain
+  : public IDataHandleVisitor
+{
+public:
+  virtual void visit(const IDataHandleHolder*) override;
+
+  const IDataHandleHolder* visited = nullptr;
+};
+
+
+void TestChain::visit (const IDataHandleHolder* dhh) 
+{
+  visited = dhh;
+}
+
+
+void test1()
+{
+  std::cout << "test1\n";
+
+  TestHolder h;
+  Gaudi::DataHandle h1 (DataObjID (ClassID_traits<A1>::ID(), "a1"));
+  h.handle_ptrs.push_back (&h1);
+
+  h.outDeps.emplace (ClassID_traits<B1>::ID(), "b1");
+  h.outDeps.emplace (ClassID_traits<C1>::ID(), "c1");
+  h.extraOutDeps.emplace (ClassID_traits<C1>::ID(), "c1");
+
+  DataObjIDColl linkedObjs;
+  auto chain = std::make_unique<TestChain>();
+  TestChain* tc = chain.get();
+  AthenaBaseComps::AthAlgorithmDHUpdate dhu (linkedObjs, std::move (chain));
+  dhu.visit (&h);
+  assert (tc->visited == &h);
+
+  DataObjIDColl exp = {
+    { ClassID_traits<A2>::ID(), "a1" },
+    { ClassID_traits<A3>::ID(), "a1" },
+    { ClassID_traits<B2>::ID(), "b1" },
+    { ClassID_traits<C1>::ID(), "c1" },
+    { ClassID_traits<C2>::ID(), "c1" },
+  };
+
+  if (linkedObjs != exp) {
+    for (const DataObjID& o : linkedObjs) {
+        std::cout << "linked " << o.clid() << " " << o.key() << "\n";
+    }
+  }
+
+  // Quick test with null chain.
+  std::unique_ptr<IDataHandleVisitor> chain2;
+  AthenaBaseComps::AthAlgorithmDHUpdate dhu2 (linkedObjs, std::move (chain2));
+  dhu2.visit (&h);
+}
+
+
+int main()
+{
+  ISvcLocator* svcLoc = nullptr;
+  Athena_test::initGaudi ("propertyHandling_test.txt", svcLoc);
+
+  test1();
+  return 0;
+}
diff --git a/Control/AthenaBaseComps/test/AthAlgorithm_test.cxx b/Control/AthenaBaseComps/test/AthAlgorithm_test.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..f0f2e494e004d9cc1a52cf81f213fd1c07a0fbfc
--- /dev/null
+++ b/Control/AthenaBaseComps/test/AthAlgorithm_test.cxx
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+// $Id$
+/**
+ * @file AthenaBaseComps/test/AthAlgorithm_test.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Apr, 2017
+ * @brief Test property handling for AthAlgorithm.
+ */
+
+
+#undef NDEBUG
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "StoreGate/ReadHandleKey.h"
+#include "StoreGate/WriteHandle.h"
+#include "TestTools/initGaudi.h"
+#include "GaudiKernel/ThreadLocalContext.h"
+#include <vector>
+#include <cassert>
+#include <iostream>
+
+
+namespace AthenaBaseCompsTest {
+class MyBase {};
+class MyObj : public MyBase {};
+}
+CLASS_DEF (AthenaBaseCompsTest::MyBase, 293847296, 1)
+CLASS_DEF (AthenaBaseCompsTest::MyObj, 293847295, 1)
+SG_BASE (AthenaBaseCompsTest::MyObj, AthenaBaseCompsTest::MyBase);
+using AthenaBaseCompsTest::MyObj;
+
+
+class MyAlg
+  : public AthAlgorithm
+{
+public:
+  MyAlg (const std::string& name, ISvcLocator* svcLoc);
+
+  virtual StatusCode execute() override;
+
+  virtual void declare(Gaudi::DataHandle& hnd) override;
+
+  SG::ReadHandleKey<MyObj> rkey;
+  SG::WriteHandle<MyObj> whandle;
+
+  std::vector<Gaudi::DataHandle*> inputs;
+  std::vector<Gaudi::DataHandle*> outputs;
+};
+
+
+MyAlg::MyAlg  (const std::string& name, ISvcLocator* svcLoc)
+  : AthAlgorithm (name, svcLoc)
+{
+  declareProperty ("rkey", rkey);
+  declareProperty ("whandle", whandle);
+}
+
+
+StatusCode MyAlg::execute()
+{
+  return StatusCode::SUCCESS;
+}
+
+
+void MyAlg::declare(Gaudi::DataHandle& hnd) {
+  if (hnd.mode() & Gaudi::DataHandle::Reader) 
+    inputs.push_back( &hnd );
+  if (hnd.mode() & Gaudi::DataHandle::Writer) 
+    outputs.push_back( &hnd );
+  AthAlgorithm::declare (hnd);
+}
+
+
+void test1 (ISvcLocator* svcLoc)
+{
+  std::cout << "test1\n";
+
+  MyAlg alg ("ralg", svcLoc);  alg.addRef();
+  //assert (alg.setProperties().isSuccess());
+  assert (alg.sysInitialize().isSuccess());
+
+  assert (alg.rkey.clid() == 293847295);
+  assert (alg.rkey.key() == "aaa");
+  assert (alg.rkey.storeHandle().name() == "FooSvc");
+  assert (alg.rkey.mode() == Gaudi::DataHandle::Reader);
+
+  assert (alg.whandle.clid() == 293847295);
+  assert (alg.whandle.key() == "eee");
+  assert (alg.whandle.storeHandle().name() == "BarSvc");
+  assert (alg.whandle.mode() == Gaudi::DataHandle::Writer);
+
+  std::vector<std::string> inputKeys { "aaa"  };
+  assert (alg.inputs.size() == inputKeys.size());
+  for (size_t i = 0; i < inputKeys.size(); i++)
+    assert (alg.inputs[i]->objKey() == inputKeys[i]);
+
+  std::vector<std::string> outputKeys { "eee" };
+  assert (alg.outputs.size() == outputKeys.size());
+  for (size_t i = 0; i < outputKeys.size(); i++)
+    assert (alg.outputs[i]->objKey() == outputKeys[i]);
+
+  IProxyDict* xdict = &*alg.evtStore();
+  xdict = alg.evtStore()->hiveProxyDict();
+  EventContext ctx;
+  ctx.setProxy (xdict);
+  Gaudi::Hive::setCurrentContext (ctx);
+
+  assert (alg.execute().isSuccess());
+
+  DataObjIDColl exp = {
+    { ClassID_traits<AthenaBaseCompsTest::MyObj>::ID(), "eee" },
+    { ClassID_traits<AthenaBaseCompsTest::MyBase>::ID(), "eee" },
+  };
+  if (exp != alg.outputDataObjs()) {
+    for (const DataObjID& o : alg.outputDataObjs()) {
+      std::cout << "obj " << o.clid() << " " << o.key() << "\n";
+    }
+  }
+}
+
+
+int main()
+{
+  ISvcLocator* svcLoc = nullptr;
+  Athena_test::initGaudi ("propertyHandling_test.txt", svcLoc);
+
+  test1 (svcLoc);
+  return 0;
+}
diff --git a/Control/AthenaBaseComps/test/AthReentrantAlgorithm_test.cxx b/Control/AthenaBaseComps/test/AthReentrantAlgorithm_test.cxx
index d0d94d7778107bb89094d986b8e84a1a0ac0ae7e..51d4685b71cb9a61ec0361fcc1ffea88a41d888d 100644
--- a/Control/AthenaBaseComps/test/AthReentrantAlgorithm_test.cxx
+++ b/Control/AthenaBaseComps/test/AthReentrantAlgorithm_test.cxx
@@ -23,9 +23,12 @@
 
 
 namespace AthenaBaseCompsTest {
-class MyObj {};
+class MyBase {};
+class MyObj : public MyBase {};
 }
+CLASS_DEF (AthenaBaseCompsTest::MyBase, 293847296, 1)
 CLASS_DEF (AthenaBaseCompsTest::MyObj, 293847295, 1)
+SG_BASE (AthenaBaseCompsTest::MyObj, AthenaBaseCompsTest::MyBase);
 using AthenaBaseCompsTest::MyObj;
 
 
@@ -70,6 +73,7 @@ void MyAlg::declare(Gaudi::DataHandle& hnd) {
     inputs.push_back( &hnd );
   if (hnd.mode() & Gaudi::DataHandle::Writer) 
     outputs.push_back( &hnd );
+  AthReentrantAlgorithm::declare (hnd);
 }
 
 
@@ -78,7 +82,8 @@ void test1 (ISvcLocator* svcLoc)
   std::cout << "test1\n";
 
   MyAlg alg ("ralg", svcLoc);  alg.addRef();
-  assert (alg.setProperties().isSuccess());
+  //assert (alg.setProperties().isSuccess());
+  assert (alg.sysInitialize().isSuccess());
 
   assert (alg.rkey.clid() == 293847295);
   assert (alg.rkey.key() == "aaa");
@@ -108,6 +113,16 @@ void test1 (ISvcLocator* svcLoc)
 
   assert (alg.execute().isSuccess());
   assert (pdict == xdict);
+
+  DataObjIDColl exp = {
+    { ClassID_traits<AthenaBaseCompsTest::MyObj>::ID(), "eee" },
+    { ClassID_traits<AthenaBaseCompsTest::MyBase>::ID(), "eee" },
+  };
+  if (exp != alg.outputDataObjs()) {
+    for (const DataObjID& o : alg.outputDataObjs()) {
+      std::cout << "obj " << o.clid() << " " << o.key() << "\n";
+    }
+  }
 }
 
 
diff --git a/Control/DataModelTest/DataModelRunTests/CMakeLists.txt b/Control/DataModelTest/DataModelRunTests/CMakeLists.txt
index 49df0b2be64707c9d28476ac3e4f8645da9d3d2d..1d60c31652fec9e389b22cb7235af74b9489c97e 100644
--- a/Control/DataModelTest/DataModelRunTests/CMakeLists.txt
+++ b/Control/DataModelTest/DataModelRunTests/CMakeLists.txt
@@ -77,3 +77,13 @@ datamodel_run_test (xAODRootTestRead2
 datamodel_run_test (ByteStreamTestWrite)
 datamodel_run_test (ByteStreamTestRead DEPENDS ByteStreamTestWrite)
 
+datamodel_run_test (xAODTestSymlinks1)
+datamodel_run_test (xAODTestSymlinks1MT
+                    COMMAND "athena.py --thread=1")
+
+datamodel_run_test (xAODTestSymlinks2
+                    DEPENDS xAODTestWrite)
+datamodel_run_test (xAODTestSymlinks2MT
+                    COMMAND "athena.py --thread=1"
+                    DEPENDS xAODTestWrite)
+
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1.ref b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1.ref
new file mode 100644
index 0000000000000000000000000000000000000000..3e4b05309430758d54c89937e308cc8681e41632
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1.ref
@@ -0,0 +1,126 @@
+Thu Apr 20 20:18:35 CEST 2017
+Preloading tcmalloc_minimal.so
+Py:Athena            INFO including file "AthenaCommon/Preparation.py"
+Py:Athena            INFO using release [WorkDir-22.0.0] [x86_64-slc6-gcc62-opt] [atlas-work3g/725f3a42d9] -- built on [2017-04-20T1906]
+Py:Athena            INFO including file "AthenaCommon/Bootstrap.py"
+Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
+Py:Athena            INFO executing ROOT6Setup
+[?1034hPy:Athena            INFO including file "AthenaCommon/Execution.py"
+Py:Athena            INFO including file "DataModelRunTests/xAODTestSymlinks1_jo.py"
+Py:ConfigurableDb    INFO Read module info for 5294 configurables from 15 genConfDb files
+Py:ConfigurableDb    INFO No duplicates have been found: that's good !
+Py:Athena            INFO including file "AthenaCommon/runbatch.py"
+ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+ApplicationMgr    SUCCESS 
+====================================================================================================================================
+                                                   Welcome to ApplicationMgr (GaudiCoreSvc v28r1)
+                                          running on lxplus005.cern.ch on Thu Apr 20 20:18:47 2017
+====================================================================================================================================
+ApplicationMgr       INFO Successfully loaded modules : AthenaServices
+ApplicationMgr       INFO Application Manager Configured successfully
+ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+StatusCodeSvc        INFO initialize
+AthDictLoaderSvc     INFO in initialize...
+AthDictLoaderSvc     INFO acquired Dso-registry
+ClassIDSvc           INFO  getRegistryEntries: read 2307 CLIDRegistry entries for module ALL
+ChronoStatSvc        INFO  Number of skipped events for MemStat-1
+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 5682 CLIDRegistry entries for module ALL
+ClassIDSvc           INFO  getRegistryEntries: read 52 CLIDRegistry entries for module ALL
+MetaDataSvc          INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00
+AthenaPoolCnvSvc     INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00
+PoolSvc              INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok]
+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) will be considered for COOL data
+DBReplicaSvc         INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2017-04-18T2225/Athena/22.0.0/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
+DBReplicaSvc         INFO Total of 10 servers found for host lxplus005.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
+DbSession Info     Open     DbSession    
+Domain[ROOT_All] Info >   Access   DbDomain     READ      [ROOT_All] 
+PoolSvc              INFO Re-initializing PoolSvc
+ClassIDSvc           INFO  getRegistryEntries: read 867 CLIDRegistry entries for module ALL
+HistogramPersis...WARNING Histograms saving not required.
+EventSelector        INFO  Enter McEventSelector Initialization 
+AthenaEventLoopMgr   INFO Setup EventSelector service EventSelector
+ApplicationMgr       INFO Application Manager Initialized successfully
+ApplicationMgr       INFO Application Manager Started successfully
+EventPersistenc...   INFO Added successfully Conversion service:McCnvSvc
+AthenaEventLoopMgr   INFO   ===>>>  start of run 0    <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #0, run #0 0 events processed so far  <<<===
+ClassIDSvc           INFO  getRegistryEntries: read 104 CLIDRegistry entries for module ALL
+xAODTestReadSym...   INFO C (as AuxElement): 1000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 2000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 3000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 4000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 5000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 6000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 7000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 8000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 9000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 10000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 11000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 12000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 13000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 14000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 15000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 16000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 17000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 18000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 19000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 20000
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #19, run #0 20 events processed so far  <<<===
+Domain[ROOT_All] Info >   Deaccess DbDomain     READ      [ROOT_All] 
+ApplicationMgr       INFO Application Manager Stopped successfully
+IncidentProcAlg1     INFO Finalize
+IncidentProcAlg2     INFO Finalize
+EventSelector        INFO finalize
+AthDictLoaderSvc     INFO in finalize...
+ToolSvc              INFO Removing all tools created by ToolSvc
+ChronoStatSvc.f...   INFO  Service finalized successfully 
+ApplicationMgr       INFO Application Manager Finalized successfully
+ApplicationMgr       INFO Application Manager Terminated successfully
+Py:Athena            INFO leaving with code 0: "successful run"
+CORAL/Services/ConnectionService Info Deleting the ConnectionPool
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1MT.ref b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1MT.ref
new file mode 100644
index 0000000000000000000000000000000000000000..85e4e24bba881e7a517b8050021f94eeca1b455f
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1MT.ref
@@ -0,0 +1,175 @@
+Thu Apr 20 20:24:37 CEST 2017
+Preloading tcmalloc_minimal.so
+Py:Athena            INFO including file "AthenaCommon/Preparation.py"
+Py:Athena            INFO using release [WorkDir-22.0.0] [x86_64-slc6-gcc62-opt] [atlas-work3g/725f3a42d9] -- built on [2017-04-20T1906]
+Py:Athena            INFO including file "AthenaCommon/Bootstrap.py"
+Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
+Py:Athena            INFO executing ROOT6Setup
+[?1034hPy:Athena            INFO configuring AthenaHive with [1] concurrent threads
+Py:Athena            INFO including file "AthenaCommon/Execution.py"
+Py:Athena            INFO including file "DataModelRunTests/xAODTestSymlinks1MT_jo.py"
+Py:Athena            INFO including file "DataModelRunTests/xAODTestSymlinks1_jo.py"
+Py:ConfigurableDb    INFO Read module info for 5294 configurables from 15 genConfDb files
+Py:ConfigurableDb    INFO No duplicates have been found: that's good !
+Py:Athena            INFO including file "AthenaCommon/runbatch.py"
+ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+MessageSvc           INFO Activating in a separate thread
+ApplicationMgr    SUCCESS 
+====================================================================================================================================
+                                                   Welcome to ApplicationMgr (GaudiCoreSvc v28r1)
+                                          running on lxplus005.cern.ch on Thu Apr 20 20:24:50 2017
+====================================================================================================================================
+ApplicationMgr       INFO Successfully loaded modules : AthenaServices
+ApplicationMgr       INFO Application Manager Configured successfully
+ApplicationMgr                                     INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+AthDictLoaderSvc                                   INFO in initialize...
+AthDictLoaderSvc                                   INFO acquired Dso-registry
+ClassIDSvc                                         INFO  getRegistryEntries: read 2745 CLIDRegistry entries for module ALL
+ChronoStatSvc                                      INFO  Number of skipped events for MemStat-1
+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) 
+AthenaHiveEventLoopMgr                             INFO Initializing AthenaHiveEventLoopMgr - package version AthenaServices-00-00-00
+MetaDataSvc                                        INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00
+AthenaPoolCnvSvc                                   INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00
+PoolSvc                                            INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok]
+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) will be considered for COOL data
+DBReplicaSvc                                       INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2017-04-18T2225/Athena/22.0.0/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config
+DBReplicaSvc                                       INFO Total of 10 servers found for host lxplus005.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
+DbSession Info     Open     DbSession    
+Domain[ROOT_All] Info >   Access   DbDomain     READ      [ROOT_All] 
+PoolSvc                                            INFO Re-initializing PoolSvc
+ClassIDSvc                                         INFO  getRegistryEntries: read 6549 CLIDRegistry entries for module ALL
+ClassIDSvc                                         INFO  getRegistryEntries: read 52 CLIDRegistry entries for module ALL
+SGInputLoader                                      INFO Will preload the following DataObjects:
+ThreadPoolSvc                                      INFO no thread init tools attached
+ForwardSchedulerSvc                                INFO Activating scheduler in a separate thread
+ForwardSchedulerSvc                                INFO Waiting for ForwardSchedulerSvc to activate
+ForwardSchedulerSvc                                INFO Start checking the actionsQueue
+ForwardSchedulerSvc                             WARNING Property MaxEventsInFlight was set. This works but it's deprecated. Please migrate your code options files.
+ForwardSchedulerSvc                                INFO Found 8 algorithms
+ForwardSchedulerSvc                                INFO outputs:
+('DMTest::C','cinfo')
+('SG::AuxElement','cinfo')
+('DMTest::CVec','cvec')
+
+ForwardSchedulerSvc                                INFO Data Dependencies for Algorithms:
+  BeginIncFiringAlg
+      none
+  IncidentProcAlg1
+      none
+  SGInputLoader
+      none
+  xAODTestWriteCVec
+    o INPUT  ('EventInfo','McEventInfo')
+    o OUTPUT ('DMTest::CVec','cvec')
+  xAODTestWriteCInfo
+    o INPUT  ('EventInfo','McEventInfo')
+    o INPUT  ('DMTest::CVec','cvec')
+    o OUTPUT ('SG::AuxElement','cinfo')
+    o OUTPUT ('DMTest::C','cinfo')
+  xAODTestReadSymlink
+    o INPUT  ('SG::AuxElement','cinfo')
+  EndIncFiringAlg
+      none
+  IncidentProcAlg2
+      none
+ForwardSchedulerSvc                                INFO Will attribute the following unmet INPUT dependencies to "SGInputLoader/SGInputLoader" Algorithm
+   o ('EventInfo','McEventInfo')    required by Algorithm: 
+       * xAODTestWriteCVec
+       * xAODTestWriteCInfo
+ForwardSchedulerSvc                                INFO Concurrency level information:
+ForwardSchedulerSvc                                INFO  o Number of events in flight:  'MaxEventsInFlight':1
+ForwardSchedulerSvc                                INFO  o Number of algorithms in flight:  'MaxAlgosInFlight':1
+ForwardSchedulerSvc                                INFO  o TBB thread pool size:  'ThreadPoolSize':1
+HistogramPersistencySvc                         WARNING Histograms saving not required.
+EventSelector                                      INFO  Enter McEventSelector Initialization 
+AthenaHiveEventLoopMgr                             INFO Setup EventSelector service EventSelector
+ApplicationMgr                                     INFO Application Manager Initialized successfully
+ApplicationMgr                                     INFO Application Manager Started successfully
+AthenaHiveEventLoopMgr                             INFO Starting loop on events
+EventPersistencySvc                                INFO Added successfully Conversion service:McCnvSvc
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start of run 0    <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #0, run #0 on slot 0,  0 events processed so far  <<<===
+ClassIDSvc                              0   0      INFO  getRegistryEntries: read 104 CLIDRegistry entries for module ALL
+xAODTestReadSymlink                     0   0      INFO C (as AuxElement): 1000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #0, run #0 on slot 0,  1 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #1, run #0 on slot 0,  1 events processed so far  <<<===
+xAODTestReadSymlink                     1   0      INFO C (as AuxElement): 2000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #1, run #0 on slot 0,  2 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #2, run #0 on slot 0,  2 events processed so far  <<<===
+xAODTestReadSymlink                     2   0      INFO C (as AuxElement): 3000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #2, run #0 on slot 0,  3 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #3, run #0 on slot 0,  3 events processed so far  <<<===
+xAODTestReadSymlink                     3   0      INFO C (as AuxElement): 4000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #3, run #0 on slot 0,  4 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #4, run #0 on slot 0,  4 events processed so far  <<<===
+xAODTestReadSymlink                     4   0      INFO C (as AuxElement): 5000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #4, run #0 on slot 0,  5 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #5, run #0 on slot 0,  5 events processed so far  <<<===
+xAODTestReadSymlink                     5   0      INFO C (as AuxElement): 6000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #5, run #0 on slot 0,  6 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #6, run #0 on slot 0,  6 events processed so far  <<<===
+xAODTestReadSymlink                     6   0      INFO C (as AuxElement): 7000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #6, run #0 on slot 0,  7 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #7, run #0 on slot 0,  7 events processed so far  <<<===
+xAODTestReadSymlink                     7   0      INFO C (as AuxElement): 8000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #7, run #0 on slot 0,  8 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #8, run #0 on slot 0,  8 events processed so far  <<<===
+xAODTestReadSymlink                     8   0      INFO C (as AuxElement): 9000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #8, run #0 on slot 0,  9 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #9, run #0 on slot 0,  9 events processed so far  <<<===
+xAODTestReadSymlink                     9   0      INFO C (as AuxElement): 10000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #9, run #0 on slot 0,  10 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #10, run #0 on slot 0,  10 events processed so far  <<<===
+xAODTestReadSymlink                     10  0      INFO C (as AuxElement): 11000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #10, run #0 on slot 0,  11 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #11, run #0 on slot 0,  11 events processed so far  <<<===
+xAODTestReadSymlink                     11  0      INFO C (as AuxElement): 12000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #11, run #0 on slot 0,  12 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #12, run #0 on slot 0,  12 events processed so far  <<<===
+xAODTestReadSymlink                     12  0      INFO C (as AuxElement): 13000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #12, run #0 on slot 0,  13 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #13, run #0 on slot 0,  13 events processed so far  <<<===
+xAODTestReadSymlink                     13  0      INFO C (as AuxElement): 14000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #13, run #0 on slot 0,  14 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #14, run #0 on slot 0,  14 events processed so far  <<<===
+xAODTestReadSymlink                     14  0      INFO C (as AuxElement): 15000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #14, run #0 on slot 0,  15 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #15, run #0 on slot 0,  15 events processed so far  <<<===
+xAODTestReadSymlink                     15  0      INFO C (as AuxElement): 16000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #15, run #0 on slot 0,  16 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #16, run #0 on slot 0,  16 events processed so far  <<<===
+xAODTestReadSymlink                     16  0      INFO C (as AuxElement): 17000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #16, run #0 on slot 0,  17 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #17, run #0 on slot 0,  17 events processed so far  <<<===
+xAODTestReadSymlink                     17  0      INFO C (as AuxElement): 18000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #17, run #0 on slot 0,  18 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #18, run #0 on slot 0,  18 events processed so far  <<<===
+xAODTestReadSymlink                     18  0      INFO C (as AuxElement): 19000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #18, run #0 on slot 0,  19 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #19, run #0 on slot 0,  19 events processed so far  <<<===
+xAODTestReadSymlink                     19  0      INFO C (as AuxElement): 20000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #19, run #0 on slot 0,  20 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO ---> Loop Finished (seconds): 0.0441599
+Domain[ROOT_All] Info >   Deaccess DbDomain     READ      [ROOT_All] 
+ApplicationMgr                                     INFO Application Manager Stopped successfully
+IncidentProcAlg1                                   INFO Finalize
+SGInputLoader                                      INFO Finalizing SGInputLoader...
+IncidentProcAlg2                                   INFO Finalize
+EventSelector                                      INFO finalize
+ForwardSchedulerSvc                                INFO Joining Scheduler thread
+ForwardSchedulerSvc                     19  0      INFO Terminating thread-pool resources
+TimelineSvc                                        INFO Outputting timeline with 160 entries to file  'TimelineFile':timeline.csv
+EventDataSvc                                       INFO Finalizing EventDataSvc - package version StoreGate-00-00-00
+AthDictLoaderSvc                                   INFO in finalize...
+ToolSvc                                            INFO Removing all tools created by ToolSvc
+ChronoStatSvc.finalize()                           INFO  Service finalized successfully 
+ApplicationMgr                                     INFO Application Manager Finalized successfully
+ApplicationMgr                                     INFO Application Manager Terminated successfully
+Py:Athena            INFO leaving with code 0: "successful run"
+CORAL/Services/ConnectionService Info Deleting the ConnectionPool
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1MT_jo.py b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1MT_jo.py
new file mode 100644
index 0000000000000000000000000000000000000000..c950c9d30f5357f931c5c28d030ea56af878bdeb
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1MT_jo.py
@@ -0,0 +1,10 @@
+#
+# $Id$
+#
+# File: DataModelRunTests/share/xAODTestSymlinks1MT_jo.py
+# Author: snyder@bnl.gov
+# Date: Apr 2017
+# Purpose: Test syminks and hive.
+#
+
+include ('DataModelRunTests/xAODTestSymlinks1_jo.py')
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1_jo.py b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1_jo.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2fcac96491ba38127f8edb670e0c08f22b2a5db
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks1_jo.py
@@ -0,0 +1,71 @@
+#
+# $Id$
+#
+# File: DataModelRunTests/share/xAODTestSymlinks1_jo.py
+# Author: snyder@bnl.gov
+# Date: Apr 2017
+# Purpose: Test syminks and hive.
+#
+
+## basic job configuration (for generator)
+import AthenaCommon.AtlasUnixGeneratorJob
+
+## get a handle to the default top-level algorithm sequence
+from AthenaCommon.AlgSequence import AlgSequence
+topSequence = AlgSequence()
+
+## get a handle to the ServiceManager
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+
+## get a handle to the ApplicationManager
+from AthenaCommon.AppMgr import theApp
+
+#--------------------------------------------------------------
+# Load POOL support
+#--------------------------------------------------------------
+import AthenaPoolCnvSvc.WriteAthenaPool
+
+
+
+#--------------------------------------------------------------
+# Event related parameters
+#--------------------------------------------------------------
+theApp.EvtMax = 20
+
+
+#--------------------------------------------------------------
+# Set up the algorithm.
+#--------------------------------------------------------------
+
+from AthenaCommon.ConcurrencyFlags import jobproperties as jp
+nThreads = jp.ConcurrencyFlags.NumThreads()
+if nThreads >= 1:
+  svcMgr.ForwardSchedulerSvc.CheckDependencies = True
+  svcMgr.ForwardSchedulerSvc.DataLoaderAlg = 'SGInputLoader'
+
+  from SGComps.SGCompsConf import SGInputLoader
+  topSequence += SGInputLoader( OutputLevel=INFO, ShowEventDump=False )
+
+
+from DataModelTestDataCommon.DataModelTestDataCommonConf import \
+     DMTest__xAODTestReadSymlink
+from DataModelTestDataWrite.DataModelTestDataWriteConf import \
+     DMTest__xAODTestWriteCVec, \
+     DMTest__xAODTestWriteCInfo
+topSequence += DMTest__xAODTestWriteCVec ("xAODTestWriteCVec")
+topSequence += DMTest__xAODTestWriteCInfo ("xAODTestWriteCInfo")
+topSequence += DMTest__xAODTestReadSymlink ("xAODTestReadSymlink", Key='cinfo')
+
+
+#--------------------------------------------------------------
+# Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
+#--------------------------------------------------------------
+svcMgr.MessageSvc.OutputLevel = 3
+svcMgr.MessageSvc.debugLimit  = 100000
+svcMgr.ClassIDSvc.OutputLevel = 3
+
+# No stats printout
+ChronoStatSvc = Service( "ChronoStatSvc" )
+ChronoStatSvc.ChronoPrintOutTable = FALSE
+ChronoStatSvc.PrintUserTime       = FALSE
+ChronoStatSvc.StatPrintOutTable   = FALSE
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2.ref b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2.ref
new file mode 100644
index 0000000000000000000000000000000000000000..35e97761a0400dc49bee649c58462f849d59c1e7
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2.ref
@@ -0,0 +1,158 @@
+Fri Apr  7 03:45:19 CEST 2017
+Preloading tcmalloc_minimal.so
+Py:Athena            INFO including file "AthenaCommon/Preparation.py"
+Py:Athena            INFO using release [AthenaWorkDir-22.0.0] [x86_64-slc6-gcc62-dbg] [mt-sss/4765e91ead] -- built on [2017-04-07T0230]
+Py:Athena            INFO including file "AthenaCommon/Bootstrap.py"
+Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
+Py:Athena            INFO executing ROOT6Setup
+[?1034hPy:Athena            INFO including file "AthenaCommon/Execution.py"
+Py:Athena            INFO including file "DataModelRunTests/xAODTestSymlinks2_jo.py"
+Py:ConfigurableDb    INFO Read module info for 5290 configurables from 30 genConfDb files
+Py:ConfigurableDb    INFO No duplicates have been found: that's good !
+Py:Athena            INFO including file "AthenaCommon/runbatch.py"
+ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+ApplicationMgr    SUCCESS 
+====================================================================================================================================
+                                                   Welcome to ApplicationMgr (GaudiCoreSvc v28r1)
+                                          running on lxplus042.cern.ch on Fri Apr  7 03:45:41 2017
+====================================================================================================================================
+ApplicationMgr       INFO Successfully loaded modules : AthenaServices
+ApplicationMgr       INFO Application Manager Configured successfully
+ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+StatusCodeSvc        INFO initialize
+AthDictLoaderSvc     INFO in initialize...
+AthDictLoaderSvc     INFO acquired Dso-registry
+ClassIDSvc           INFO  getRegistryEntries: read 8862 CLIDRegistry entries for module ALL
+ChronoStatSvc        INFO  Number of skipped events for MemStat-1
+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 358 CLIDRegistry entries for module ALL
+MetaDataSvc          INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00
+AthenaPoolCnvSvc     INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00
+PoolSvc              INFO Initializing PoolSvc - package version PoolSvc-00-00-00
+PoolSvc              INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok]
+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-ai.cern.ch:8000/atlr)(serverurl=http://aiatlas036.cern.ch:8000/atlr)(serverurl=http://aiatlas034.cern.ch:8000/atlr)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(serverurl=http://ccfrontier01.in2p3.fr:23128/ccin2p3-AtlasFrontier)(serverurl=http://ccfrontier05.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca20.cern.ch:3128)(proxyurl=http://ca17.cern.ch:3128)(proxyurl=http://atlast0fsquid.cern.ch:3128)(proxyurl=http://atlassquid1.cern.ch:3128)(proxyurl=http://atlassquid2.cern.ch:3128)(proxyurl=http://atlassquid4.cern.ch:3128) will be considered for COOL data
+DBReplicaSvc         INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2017-04-05T2225/Athena/22.0.0/InstallArea/x86_64-slc6-gcc62-dbg/share/dbreplica.config
+DBReplicaSvc         INFO Total of 10 servers found for host lxplus042.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
+DbSession Info     Open     DbSession    
+Domain[ROOT_All] Info >   Access   DbDomain     READ      [ROOT_All] 
+PoolSvc              INFO Re-initializing PoolSvc
+EventSelector        INFO reinitialization...
+EventSelector        INFO EventSelection with query 
+RootCollection Info Opening Collection File xaoddata.root in mode: READ
+RootCollection Info File xaoddata.root opened
+Domain[ROOT_All] Info ->  Access   DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+Domain[ROOT_All] Info                           xaoddata.root
+RootDatabase.open Info xaoddata.root File version:60802
+ImplicitCollection Info Opened the implicit collection with connection string "PFN:xaoddata.root"
+ImplicitCollection Info and a name "POOLContainer(DataHeader)"
+PoolSvc              INFO Failed to find container MetaDataHdrDataHeader to get Token.
+EventPersistenc...   INFO Added successfully Conversion service:AthenaPoolCnvSvc
+EventSelector        INFO Initializing EventSelector - package version EventSelectorAthenaPool-00-00-00
+EventSelector        INFO reinitialization...
+EventSelector        INFO EventSelection with query 
+RootCollection Info Opening Collection File xaoddata.root in mode: READ
+RootCollection Info File xaoddata.root opened
+ImplicitCollection Info Opened the implicit collection with connection string "PFN:xaoddata.root"
+ImplicitCollection Info and a name "POOLContainer(DataHeader)"
+AthenaPoolAddre...   INFO Initializing AthenaPoolAddressProviderSvc - package version EventSelectorAthenaPool-00-00-00
+HistogramPersis...WARNING Histograms saving not required.
+AthenaEventLoopMgr   INFO Setup EventSelector service EventSelector
+ApplicationMgr       INFO Application Manager Initialized successfully
+xaoddata.root Info Database being retired...
+Domain[ROOT_All] Info ->  Deaccess DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+RootCollection Info Opening Collection File xaoddata.root in mode: READ
+RootCollection Info File xaoddata.root opened
+DbSession Info     Open     DbSession    
+Domain[ROOT_All] Info >   Access   DbDomain     READ      [ROOT_All] 
+Domain[ROOT_All] Info ->  Access   DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+Domain[ROOT_All] Info                           xaoddata.root
+RootDatabase.open Info xaoddata.root File version:60802
+ImplicitCollection Info Opened the implicit collection with connection string "PFN:xaoddata.root"
+ImplicitCollection Info and a name "POOLContainer(DataHeader)"
+ApplicationMgr       INFO Application Manager Started successfully
+PoolSvc              INFO Failed to find container MetaDataHdrDataHeader to get Token.
+ClassIDSvc           INFO  getRegistryEntries: read 1067 CLIDRegistry entries for module ALL
+AthenaPoolConve...   INFO massageEventInfo: unable to get OverrideRunNumberFromInput property from EventSelector 
+AthenaEventLoopMgr   INFO   ===>>>  start of run 0    <<<===
+AthenaEventLoopMgr   INFO   ===>>>  start processing event #0, run #0 0 events processed so far  <<<===
+ClassIDSvc           INFO  getRegistryEntries: read 11 CLIDRegistry entries for module ALL
+xAODTestReadSym...   INFO C (as AuxElement): 1000
+ClassIDSvc           INFO  getRegistryEntries: read 48 CLIDRegistry entries for module ALL
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 2000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 3000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 4000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 5000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 6000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 7000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 8000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 9000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 10000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 11000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 12000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 13000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 14000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 15000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 16000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 17000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 18000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 19000
+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  <<<===
+xAODTestReadSym...   INFO C (as AuxElement): 20000
+AthenaEventLoopMgr   INFO   ===>>>  done processing event #19, run #0 20 events processed so far  <<<===
+xaoddata.root Info Database being retired...
+Domain[ROOT_All] Info ->  Deaccess DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+ApplicationMgr       INFO Application Manager Stopped successfully
+IncidentProcAlg1     INFO Finalize
+IncidentProcAlg2     INFO Finalize
+Domain[ROOT_All] Info >   Deaccess DbDomain     READ      [ROOT_All] 
+AthDictLoaderSvc     INFO in finalize...
+ToolSvc              INFO Removing all tools created by ToolSvc
+ChronoStatSvc.f...   INFO  Service finalized successfully 
+ApplicationMgr       INFO Application Manager Finalized successfully
+ApplicationMgr       INFO Application Manager Terminated successfully
+Py:Athena            INFO leaving with code 0: "successful run"
+CORAL/Services/ConnectionService Info Deleting the ConnectionPool
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2MT.ref b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2MT.ref
new file mode 100644
index 0000000000000000000000000000000000000000..fd1c6f485f64d22f8b417ea8583361d4ba818fd1
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2MT.ref
@@ -0,0 +1,195 @@
+Fri Apr  7 03:44:23 CEST 2017
+Preloading tcmalloc_minimal.so
+Py:Athena            INFO including file "AthenaCommon/Preparation.py"
+Py:Athena            INFO using release [AthenaWorkDir-22.0.0] [x86_64-slc6-gcc62-dbg] [mt-sss/4765e91ead] -- built on [2017-04-07T0230]
+Py:Athena            INFO including file "AthenaCommon/Bootstrap.py"
+Py:Athena            INFO including file "AthenaCommon/Atlas.UnixStandardJob.py"
+Py:Athena            INFO executing ROOT6Setup
+[?1034hPy:Athena            INFO configuring AthenaHive with [1] concurrent threads
+Py:Athena            INFO including file "AthenaCommon/Execution.py"
+Py:Athena            INFO including file "DataModelRunTests/xAODTestSymlinks2MT_jo.py"
+Py:Athena            INFO including file "DataModelRunTests/xAODTestSymlinks2_jo.py"
+Py:ConfigurableDb    INFO Read module info for 5290 configurables from 30 genConfDb files
+Py:ConfigurableDb    INFO No duplicates have been found: that's good !
+Py:Athena            INFO including file "AthenaCommon/runbatch.py"
+ApplicationMgr       INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+MessageSvc           INFO Activating in a separate thread
+ApplicationMgr    SUCCESS 
+====================================================================================================================================
+                                                   Welcome to ApplicationMgr (GaudiCoreSvc v28r1)
+                                          running on lxplus042.cern.ch on Fri Apr  7 03:44:44 2017
+====================================================================================================================================
+ApplicationMgr       INFO Successfully loaded modules : AthenaServices
+ApplicationMgr       INFO Application Manager Configured successfully
+ApplicationMgr                                     INFO Updating Gaudi::PluginService::SetDebug(level) to level= 'PluginDebugLevel':0
+AthDictLoaderSvc                                   INFO in initialize...
+AthDictLoaderSvc                                   INFO acquired Dso-registry
+ClassIDSvc                                         INFO  getRegistryEntries: read 9237 CLIDRegistry entries for module ALL
+ChronoStatSvc                                      INFO  Number of skipped events for MemStat-1
+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) 
+AthenaHiveEventLoopMgr                             INFO Initializing AthenaHiveEventLoopMgr - package version AthenaServices-00-00-00
+MetaDataSvc                                        INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00
+AthenaPoolCnvSvc                                   INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00
+PoolSvc                                            INFO Initializing PoolSvc - package version PoolSvc-00-00-00
+PoolSvc                                            INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.xml) [ok]
+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-ai.cern.ch:8000/atlr)(serverurl=http://aiatlas036.cern.ch:8000/atlr)(serverurl=http://aiatlas034.cern.ch:8000/atlr)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(serverurl=http://ccfrontier01.in2p3.fr:23128/ccin2p3-AtlasFrontier)(serverurl=http://ccfrontier05.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca20.cern.ch:3128)(proxyurl=http://ca17.cern.ch:3128)(proxyurl=http://atlast0fsquid.cern.ch:3128)(proxyurl=http://atlassquid1.cern.ch:3128)(proxyurl=http://atlassquid2.cern.ch:3128)(proxyurl=http://atlassquid4.cern.ch:3128) will be considered for COOL data
+DBReplicaSvc                                       INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2017-04-05T2225/Athena/22.0.0/InstallArea/x86_64-slc6-gcc62-dbg/share/dbreplica.config
+DBReplicaSvc                                       INFO Total of 10 servers found for host lxplus042.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
+DbSession Info     Open     DbSession    
+Domain[ROOT_All] Info >   Access   DbDomain     READ      [ROOT_All] 
+PoolSvc                                            INFO Re-initializing PoolSvc
+EventSelector                                      INFO reinitialization...
+EventSelector                                      INFO EventSelection with query 
+RootCollection Info Opening Collection File xaoddata.root in mode: READ
+RootCollection Info File xaoddata.root opened
+Domain[ROOT_All] Info ->  Access   DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+Domain[ROOT_All] Info                           xaoddata.root
+RootDatabase.open Info xaoddata.root File version:60802
+ImplicitCollection Info Opened the implicit collection with connection string "PFN:xaoddata.root"
+ImplicitCollection Info and a name "POOLContainer(DataHeader)"
+PoolSvc                                            INFO Failed to find container MetaDataHdrDataHeader to get Token.
+EventPersistencySvc                                INFO Added successfully Conversion service:AthenaPoolCnvSvc
+EventSelector                                      INFO Initializing EventSelector - package version EventSelectorAthenaPool-00-00-00
+EventSelector                                      INFO reinitialization...
+EventSelector                                      INFO EventSelection with query 
+RootCollection Info Opening Collection File xaoddata.root in mode: READ
+RootCollection Info File xaoddata.root opened
+ImplicitCollection Info Opened the implicit collection with connection string "PFN:xaoddata.root"
+ImplicitCollection Info and a name "POOLContainer(DataHeader)"
+AthenaPoolAddressProviderSvc                       INFO Initializing AthenaPoolAddressProviderSvc - package version EventSelectorAthenaPool-00-00-00
+ClassIDSvc                                         INFO  getRegistryEntries: read 1425 CLIDRegistry entries for module ALL
+SGInputLoader                                      INFO Will preload the following DataObjects:
+ThreadPoolSvc                                      INFO no thread init tools attached
+ForwardSchedulerSvc                                INFO Activating scheduler in a separate thread
+ForwardSchedulerSvc                                INFO Waiting for ForwardSchedulerSvc to activate
+ForwardSchedulerSvc                                INFO Start checking the actionsQueue
+ForwardSchedulerSvc                             WARNING Property MaxEventsInFlight was set. This works but it's deprecated. Please migrate your code options files.
+ForwardSchedulerSvc                                INFO Found 6 algorithms
+ForwardSchedulerSvc                                INFO outputs:
+
+ForwardSchedulerSvc                                INFO Data Dependencies for Algorithms:
+  BeginIncFiringAlg
+      none
+  IncidentProcAlg1
+      none
+  SGInputLoader
+      none
+  xAODTestReadSymlink
+    o INPUT  ('SG::AuxElement','cinfo')
+  EndIncFiringAlg
+      none
+  IncidentProcAlg2
+      none
+ForwardSchedulerSvc                                INFO Will attribute the following unmet INPUT dependencies to "SGInputLoader/SGInputLoader" Algorithm
+   o ('SG::AuxElement','cinfo')    required by Algorithm: 
+       * xAODTestReadSymlink
+ForwardSchedulerSvc                                INFO Concurrency level information:
+ForwardSchedulerSvc                                INFO  o Number of events in flight:  'MaxEventsInFlight':1
+ForwardSchedulerSvc                                INFO  o Number of algorithms in flight:  'MaxAlgosInFlight':1
+ForwardSchedulerSvc                                INFO  o TBB thread pool size:  'ThreadPoolSize':1
+HistogramPersistencySvc                         WARNING Histograms saving not required.
+AthenaHiveEventLoopMgr                             INFO Setup EventSelector service EventSelector
+ApplicationMgr                                     INFO Application Manager Initialized successfully
+xaoddata.root Info Database being retired...
+Domain[ROOT_All] Info ->  Deaccess DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+RootCollection Info Opening Collection File xaoddata.root in mode: READ
+RootCollection Info File xaoddata.root opened
+DbSession Info     Open     DbSession    
+Domain[ROOT_All] Info >   Access   DbDomain     READ      [ROOT_All] 
+Domain[ROOT_All] Info ->  Access   DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+Domain[ROOT_All] Info                           xaoddata.root
+RootDatabase.open Info xaoddata.root File version:60802
+ImplicitCollection Info Opened the implicit collection with connection string "PFN:xaoddata.root"
+ImplicitCollection Info and a name "POOLContainer(DataHeader)"
+ApplicationMgr                                     INFO Application Manager Started successfully
+AthenaHiveEventLoopMgr                             INFO Starting loop on events
+PoolSvc                                            INFO Failed to find container MetaDataHdrDataHeader to get Token.
+AthenaPoolConverter                                INFO massageEventInfo: unable to get OverrideRunNumberFromInput property from EventSelector 
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start of run 0    <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #0, run #0 on slot 0,  0 events processed so far  <<<===
+ClassIDSvc                              0   0      INFO  getRegistryEntries: read 11 CLIDRegistry entries for module ALL
+xAODTestReadSymlink                     0   0      INFO C (as AuxElement): 1000
+ClassIDSvc                              0   0      INFO  getRegistryEntries: read 48 CLIDRegistry entries for module ALL
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #0, run #0 on slot 0,  1 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #1, run #0 on slot 0,  1 events processed so far  <<<===
+xAODTestReadSymlink                     1   0      INFO C (as AuxElement): 2000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #1, run #0 on slot 0,  2 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #2, run #0 on slot 0,  2 events processed so far  <<<===
+xAODTestReadSymlink                     2   0      INFO C (as AuxElement): 3000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #2, run #0 on slot 0,  3 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #3, run #0 on slot 0,  3 events processed so far  <<<===
+xAODTestReadSymlink                     3   0      INFO C (as AuxElement): 4000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #3, run #0 on slot 0,  4 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #4, run #0 on slot 0,  4 events processed so far  <<<===
+xAODTestReadSymlink                     4   0      INFO C (as AuxElement): 5000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #4, run #0 on slot 0,  5 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #5, run #0 on slot 0,  5 events processed so far  <<<===
+xAODTestReadSymlink                     5   0      INFO C (as AuxElement): 6000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #5, run #0 on slot 0,  6 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #6, run #0 on slot 0,  6 events processed so far  <<<===
+xAODTestReadSymlink                     6   0      INFO C (as AuxElement): 7000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #6, run #0 on slot 0,  7 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #7, run #0 on slot 0,  7 events processed so far  <<<===
+xAODTestReadSymlink                     7   0      INFO C (as AuxElement): 8000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #7, run #0 on slot 0,  8 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #8, run #0 on slot 0,  8 events processed so far  <<<===
+xAODTestReadSymlink                     8   0      INFO C (as AuxElement): 9000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #8, run #0 on slot 0,  9 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #9, run #0 on slot 0,  9 events processed so far  <<<===
+xAODTestReadSymlink                     9   0      INFO C (as AuxElement): 10000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #9, run #0 on slot 0,  10 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #10, run #0 on slot 0,  10 events processed so far  <<<===
+xAODTestReadSymlink                     10  0      INFO C (as AuxElement): 11000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #10, run #0 on slot 0,  11 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #11, run #0 on slot 0,  11 events processed so far  <<<===
+xAODTestReadSymlink                     11  0      INFO C (as AuxElement): 12000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #11, run #0 on slot 0,  12 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #12, run #0 on slot 0,  12 events processed so far  <<<===
+xAODTestReadSymlink                     12  0      INFO C (as AuxElement): 13000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #12, run #0 on slot 0,  13 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #13, run #0 on slot 0,  13 events processed so far  <<<===
+xAODTestReadSymlink                     13  0      INFO C (as AuxElement): 14000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #13, run #0 on slot 0,  14 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #14, run #0 on slot 0,  14 events processed so far  <<<===
+xAODTestReadSymlink                     14  0      INFO C (as AuxElement): 15000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #14, run #0 on slot 0,  15 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #15, run #0 on slot 0,  15 events processed so far  <<<===
+xAODTestReadSymlink                     15  0      INFO C (as AuxElement): 16000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #15, run #0 on slot 0,  16 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #16, run #0 on slot 0,  16 events processed so far  <<<===
+xAODTestReadSymlink                     16  0      INFO C (as AuxElement): 17000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #16, run #0 on slot 0,  17 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #17, run #0 on slot 0,  17 events processed so far  <<<===
+xAODTestReadSymlink                     17  0      INFO C (as AuxElement): 18000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #17, run #0 on slot 0,  18 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #18, run #0 on slot 0,  18 events processed so far  <<<===
+xAODTestReadSymlink                     18  0      INFO C (as AuxElement): 19000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #18, run #0 on slot 0,  19 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO   ===>>>  start processing event #19, run #0 on slot 0,  19 events processed so far  <<<===
+xAODTestReadSymlink                     19  0      INFO C (as AuxElement): 20000
+AthenaHiveEventLoopMgr                             INFO   ===>>>  done processing event #19, run #0 on slot 0,  20 events processed so far  <<<===
+AthenaHiveEventLoopMgr                             INFO ---> Loop Finished (seconds): 0.533476
+xaoddata.root Info Database being retired...
+Domain[ROOT_All] Info ->  Deaccess DbDatabase   READ      [ROOT_All] C99A5126-381F-7F4F-B568-3D70CAC1AC25
+ApplicationMgr                                     INFO Application Manager Stopped successfully
+IncidentProcAlg1                                   INFO Finalize
+SGInputLoader                                      INFO Finalizing SGInputLoader...
+IncidentProcAlg2                                   INFO Finalize
+ForwardSchedulerSvc                                INFO Joining Scheduler thread
+ForwardSchedulerSvc                     19  0      INFO Terminating thread-pool resources
+TimelineSvc                                        INFO Outputting timeline with 120 entries to file  'TimelineFile':timeline.csv
+EventDataSvc                                       INFO Finalizing EventDataSvc - package version StoreGate-00-00-00
+Domain[ROOT_All] Info >   Deaccess DbDomain     READ      [ROOT_All] 
+AthDictLoaderSvc                                   INFO in finalize...
+ToolSvc                                            INFO Removing all tools created by ToolSvc
+ChronoStatSvc.finalize()                           INFO  Service finalized successfully 
+ApplicationMgr                                     INFO Application Manager Finalized successfully
+ApplicationMgr                                     INFO Application Manager Terminated successfully
+Py:Athena            INFO leaving with code 0: "successful run"
+CORAL/Services/ConnectionService Info Deleting the ConnectionPool
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2MT_jo.py b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2MT_jo.py
new file mode 100644
index 0000000000000000000000000000000000000000..556b3860ea096473323b5d9d6b305f6846c1b73c
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2MT_jo.py
@@ -0,0 +1,10 @@
+#
+# $Id$
+#
+# File: DataModelRunTests/share/xAODTestSymlinks2MT_jo.py
+# Author: snyder@bnl.gov
+# Date: Apr 2017
+# Purpose: Test syminks and hive.
+#
+
+include ('DataModelRunTests/xAODTestSymlinks2_jo.py')
diff --git a/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2_jo.py b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2_jo.py
new file mode 100644
index 0000000000000000000000000000000000000000..c87673b7f52e18393eacf447351c96bd8d36e658
--- /dev/null
+++ b/Control/DataModelTest/DataModelRunTests/share/xAODTestSymlinks2_jo.py
@@ -0,0 +1,80 @@
+#
+# $Id$
+#
+# File: DataModelRunTests/share/xAODTestSymlinks2_jo.py
+# Author: snyder@bnl.gov
+# Date: Apr 2017
+# Purpose: Test syminks and hive.
+#
+
+## basic job configuration (for generator)
+import AthenaCommon.AtlasUnixStandardJob
+
+## get a handle to the default top-level algorithm sequence
+from AthenaCommon.AlgSequence import AlgSequence
+topSequence = AlgSequence()
+
+## get a handle to the ServiceManager
+from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+
+## get a handle to the ApplicationManager
+from AthenaCommon.AppMgr import theApp
+
+#--------------------------------------------------------------
+# Load POOL support
+#--------------------------------------------------------------
+import AthenaPoolCnvSvc.ReadAthenaPool
+
+
+#--------------------------------------------------------------
+# Define input
+#--------------------------------------------------------------
+svcMgr.EventSelector.InputCollections        = [ "xaoddata.root" ]
+
+
+#--------------------------------------------------------------
+# Event related parameters
+#--------------------------------------------------------------
+theApp.EvtMax = 20
+
+
+#--------------------------------------------------------------
+# Set up the algorithm.
+#--------------------------------------------------------------
+
+from AthenaCommon.ConcurrencyFlags import jobproperties as jp
+nThreads = jp.ConcurrencyFlags.NumThreads()
+if nThreads >= 1:
+  svcMgr.ForwardSchedulerSvc.CheckDependencies = True
+  svcMgr.ForwardSchedulerSvc.DataLoaderAlg = 'SGInputLoader'
+
+  from SGComps.SGCompsConf import SGInputLoader
+  topSequence += SGInputLoader( OutputLevel=INFO, ShowEventDump=False )
+
+
+from DataModelTestDataCommon.DataModelTestDataCommonConf import \
+     DMTest__xAODTestReadSymlink
+topSequence += DMTest__xAODTestReadSymlink ("xAODTestReadSymlink", Key='cinfo')
+
+
+# Note: can't autoload these.
+import ROOT
+import cppyy
+cppyy.loadDictionary("libDataModelTestDataCommonDict")
+cppyy.loadDictionary("libDataModelTestDataReadDict")
+ROOT.DMTest.B
+ROOT.DMTest.setConverterLibrary ('libDataModelTestDataReadCnvPoolCnv.so')
+
+
+#--------------------------------------------------------------
+# Set output level threshold (2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
+#--------------------------------------------------------------
+svcMgr.MessageSvc.OutputLevel = 3
+svcMgr.MessageSvc.debugLimit  = 100000
+svcMgr.ClassIDSvc.OutputLevel = 3
+
+# No stats printout
+ChronoStatSvc = Service( "ChronoStatSvc" )
+ChronoStatSvc.ChronoPrintOutTable = FALSE
+ChronoStatSvc.PrintUserTime       = FALSE
+ChronoStatSvc.StatPrintOutTable   = FALSE
diff --git a/Control/DataModelTest/DataModelRunTests/test/post.sh b/Control/DataModelTest/DataModelRunTests/test/post.sh
index 8a2a07bb29d1a134619703e15505808f6dc3a3f7..b6c9c397f884c11be5edf3a77ca81bfc77e2c498 100755
--- a/Control/DataModelTest/DataModelRunTests/test/post.sh
+++ b/Control/DataModelTest/DataModelRunTests/test/post.sh
@@ -186,6 +186,10 @@ PP="$PP"'|has different type than the branch'
 
 # Gaudi changes
 PP="$PP"'|INFO massageEventInfo:'
+PP="$PP"'|Loop Finished'
+
+# Hive ordering.
+PP="$PP"'|Terminating thread-pool resources'
 
 
 
diff --git a/Control/DataModelTest/DataModelTestDataCommon/CMakeLists.txt b/Control/DataModelTest/DataModelTestDataCommon/CMakeLists.txt
index da584aacb5a5ccd6aedd05ab7d2ff98234aefee6..1f65b503480dde4d7adf0812703cfc10d6a5fd80 100644
--- a/Control/DataModelTest/DataModelTestDataCommon/CMakeLists.txt
+++ b/Control/DataModelTest/DataModelTestDataCommon/CMakeLists.txt
@@ -15,24 +15,31 @@ atlas_depends_on_subdirs( PUBLIC
                           GaudiKernel
                           PRIVATE
                           Control/AthLinks
+                          Control/StoreGate
+                          Control/AthenaBaseComps
                           Trigger/TrigDataAccess/TrigSerializeCnvSvc )
 
 # External dependencies:
 find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
 
 # Component(s) in the package:
-atlas_add_library( DataModelTestDataCommon
+atlas_add_library( DataModelTestDataCommonLib
                    src/*.cxx
                    PUBLIC_HEADERS DataModelTestDataCommon
                    PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
                    LINK_LIBRARIES AthContainers SGTools xAODCore xAODTrigger GaudiKernel
-                   PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthLinks )
+                   PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthLinks StoreGateLib AthenaBaseComps )
+
+atlas_add_component( DataModelTestDataCommon
+                     src/components/*.cxx
+                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib SGTools xAODCore GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests TrigSteeringEvent DataModelTestDataCommonLib )
 
 atlas_add_dictionary( DataModelTestDataCommonDict
                       DataModelTestDataCommon/DataModelTestDataCommonDict.h
                       DataModelTestDataCommon/selection.xml
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks DataModelTestDataCommon
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks DataModelTestDataCommonLib
                       NO_ROOTMAP_MERGE
                       EXTRA_FILES src/dict/*.cxx
                       ELEMENT_LINKS DMTest::BAuxVec DMTest::CVec_v1 )
@@ -42,4 +49,4 @@ atlas_add_sercnv_library ( DataModelTestDataCommonSerCnv
   FILES DataModelTestDataCommon/CVec.h DataModelTestDataCommon/CView.h DataModelTestDataCommon/CAuxContainer.h
   TYPES_WITH_NAMESPACE DMTest::CVec DMTest::CView DMTest::CAuxContainer
   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} 
-  LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks TrigSerializeCnvSvcLib DataModelTestDataCommon )
+  LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks TrigSerializeCnvSvcLib DataModelTestDataCommonLib )
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..aa3c7ed559fb0532de2b3c4663f3feb9df2e252c
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+// $Id$
+/**
+ * @file DataModeltestDataCommon/src/components/DataModelTestDataCommon_entries.cxx
+ * @author snyder@bnl.gov
+ * @date Apr, 2017
+ * @brief Gaudi algorithm factory declarations.
+ */
+
+#include "GaudiKernel/DeclareFactoryEntries.h"
+#include "../xAODTestReadSymlink.h"
+
+DECLARE_NAMESPACE_ALGORITHM_FACTORY(DMTest, xAODTestReadSymlink)
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_load.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_load.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ae5ccddd06a8e9423b17b9861741ecf32a6ba472
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_load.cxx
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+// $Id$
+/**
+ * @file/src/components/DataModelTestDataCommon_load.cxx
+ * @author snyder@bnl.gov
+ * @date Apr, 2017
+ * @brief Gaudi shared lib loading declaration.
+ */
+
+#include "GaudiKernel/LoadFactoryEntries.h"
+
+LOAD_FACTORY_ENTRIES( DataModelTestDataCommon )
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/xAODTestReadSymlink.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/xAODTestReadSymlink.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..aebed797353b069d9ec58f04de89f5bf1b578776
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/xAODTestReadSymlink.cxx
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+// $Id$
+/**
+ * @file DataModelTestDataCommon/src/xAODTestReadSymlink.cxx
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Apr, 2017
+ * @brief Test reading via a symlink.
+ */
+
+
+#include "xAODTestReadSymlink.h"
+#include "StoreGate/ReadHandle.h"
+
+
+namespace DMTest {
+
+
+xAODTestReadSymlink::xAODTestReadSymlink (const std::string &name, ISvcLocator *pSvcLocator)
+  : AthReentrantAlgorithm (name, pSvcLocator)
+{
+  declareProperty ("Key", m_objKey);
+}
+
+
+StatusCode xAODTestReadSymlink::initialize()
+{
+  ATH_CHECK( m_objKey.initialize() );
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode xAODTestReadSymlink::execute_r (const EventContext& ctx) const
+{
+  SG::ReadHandle<SG::AuxElement> c (m_objKey, ctx);
+
+  static const SG::AuxElement::Accessor<int> anInt ("anInt");
+  ATH_MSG_INFO( "C (as AuxElement): " << anInt (*c) );
+  return StatusCode::SUCCESS;
+}
+
+
+} // namespace DMTest
diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/xAODTestReadSymlink.h b/Control/DataModelTest/DataModelTestDataCommon/src/xAODTestReadSymlink.h
new file mode 100644
index 0000000000000000000000000000000000000000..9c793a392959be14c1e585d3eb8f28fa434d0e85
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataCommon/src/xAODTestReadSymlink.h
@@ -0,0 +1,60 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+
+/*
+ * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration.
+ */
+
+// $Id$
+/**
+ * @file DataModelTestDataCommon/src/xAODTestReadSymlink.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Apr, 2017
+ * @brief Test reading via a symlink.
+ */
+
+
+#ifndef DATAMODELTESTDATACOMMON_XAODTESTREADSYMLINK_H
+#define DATAMODELTESTDATACOMMON_XAODTESTREADSYMLINK_H
+
+
+#include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "StoreGate/ReadHandleKey.h"
+#include "AthContainers/AuxElement.h"
+
+
+namespace DMTest {
+
+
+class xAODTestReadSymlink
+  : public AthReentrantAlgorithm
+{
+public:
+  /**
+   * @brief Constructor.
+   * @param name The algorithm name.
+   * @param svc The service locator.
+   */
+  xAODTestReadSymlink (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::ReadHandleKey<SG::AuxElement> m_objKey;
+};
+
+
+} // namespace DMTest
+
+
+#endif // not DATAMODELTESTDATACOMMON_XAODTESTREADSYMLINK_H
diff --git a/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt b/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt
index b962d213858fdcfab7443c7f1872d91a2eb92a4b..761282dd6a16315f3e3f695732ebdcfc72ebc2dd 100644
--- a/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt
+++ b/Control/DataModelTest/DataModelTestDataRead/CMakeLists.txt
@@ -32,19 +32,19 @@ atlas_add_library( DataModelTestDataReadLib
                    src/*.cxx
                    PUBLIC_HEADERS DataModelTestDataRead
                    PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                   LINK_LIBRARIES AthContainers AthLinks DataModelTestDataCommon SGTools GaudiKernel DataModelAthenaPoolLib StoreGateLib SGtests TrigSteeringEvent TrigNavigationLib
+                   LINK_LIBRARIES AthContainers AthLinks DataModelTestDataCommonLib SGTools GaudiKernel DataModelAthenaPoolLib StoreGateLib SGtests TrigSteeringEvent TrigNavigationLib
                    PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps AthenaKernel CxxUtils xAODCore )
 
 atlas_add_component( DataModelTestDataRead
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommon SGTools GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests xAODCore TrigSteeringEvent DataModelTestDataReadLib )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommonLib SGTools GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests xAODCore TrigSteeringEvent DataModelTestDataReadLib )
 
 atlas_add_dictionary( DataModelTestDataReadDict
                       DataModelTestDataRead/DataModelTestDataReadDict.h
                       DataModelTestDataRead/selection.xml
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommon SGTools GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests xAODCore DataModelTestDataReadLib
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommonLib SGTools GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests xAODCore DataModelTestDataReadLib
                       NO_ROOTMAP_MERGE
                       EXTRA_FILES src/dict/*.cxx
                       ELEMENT_LINKS DataVector<DMTest::B> )
@@ -54,4 +54,4 @@ atlas_add_sercnv_library ( DataModelTestDataReadSerCnv
   FILES DataModelTestDataRead/HVec.h DataModelTestDataRead/HView.h DataModelTestDataRead/HAuxContainer.h
   TYPES_WITH_NAMESPACE DMTest::HVec DMTest::HView DMTest::HAuxContainer
   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} 
-  LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks TrigSerializeCnvSvcLib DataModelTestDataCommon DataModelTestDataReadLib )
+  LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks TrigSerializeCnvSvcLib DataModelTestDataCommonLib DataModelTestDataReadLib )
diff --git a/Control/DataModelTest/DataModelTestDataReadCnv/CMakeLists.txt b/Control/DataModelTest/DataModelTestDataReadCnv/CMakeLists.txt
index 8016ca4f8f390d8c46ebc27bb45ad7e63f2674f3..b47fbba44e92fe469715eaa8fd598d21b5c5e258 100644
--- a/Control/DataModelTest/DataModelTestDataReadCnv/CMakeLists.txt
+++ b/Control/DataModelTest/DataModelTestDataReadCnv/CMakeLists.txt
@@ -21,5 +21,5 @@ atlas_add_poolcnv_library( DataModelTestDataReadCnvPoolCnv
                            src/*.cxx
                            FILES DataModelTestDataRead/BVec.h DataModelTestDataRead/BDer.h DataModelTestDataRead/DVec.h DataModelTestDataRead/DDer.h DataModelTestDataRead/ELVec.h DataModelTestDataRead/G.h DataModelTestDataRead/GVec.h DataModelTestDataRead/GAuxContainer.h DataModelTestDataRead/H.h DataModelTestDataRead/HVec.h DataModelTestDataRead/HAuxContainer.h DataModelTestDataRead/HView.h DataModelTestDataCommon/BAux.h DataModelTestDataCommon/BAuxVec.h DataModelTestDataCommon/BAuxStandalone.h DataModelTestDataCommon/C.h DataModelTestDataCommon/CVec.h DataModelTestDataCommon/CAuxContainer.h DataModelTestDataCommon/CView.h DataModelTestDataCommon/CVecWithData.h DataModelTestDataCommon/CInfoAuxContainer.h DataModelTestDataCommon/CTrigAuxContainer.h
                            TYPES_WITH_NAMESPACE DMTest::BVec DMTest::DVec DMTest::DDer DMTest::BDer DMTest::ELVec DMTest::BAux DMTest::BAuxVec DMTest::BAuxStandalone DMTest::C DMTest::CVec DMTest::CAuxContainer DMTest::G DMTest::GVec DMTest::GAuxContainer DMTest::CVecWithData DMTest::CInfoAuxContainer DMTest::CTrigAuxContainer DMTest::CView DMTest::H DMTest::HVec DMTest::HAuxContainer DMTest::HView
-                           LINK_LIBRARIES AthenaPoolUtilities AthenaKernel DataModelTestDataCommon DataModelTestDataReadLib AthenaPoolCnvSvcLib )
+                           LINK_LIBRARIES AthenaPoolUtilities AthenaKernel DataModelTestDataCommonLib DataModelTestDataReadLib AthenaPoolCnvSvcLib )
 
diff --git a/Control/DataModelTest/DataModelTestDataReadCnv/src/CCnv.cxx b/Control/DataModelTest/DataModelTestDataReadCnv/src/CCnv.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..fbcf9df43ee516b401b847c2123597698892e255
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataReadCnv/src/CCnv.cxx
@@ -0,0 +1,5 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// Dummy source file so that cmake will know this is a custom converter.
diff --git a/Control/DataModelTest/DataModelTestDataReadCnv/src/CCnv.h b/Control/DataModelTest/DataModelTestDataReadCnv/src/CCnv.h
new file mode 100644
index 0000000000000000000000000000000000000000..8f2b628701dc01ca4546f6bda62d3bc302344378
--- /dev/null
+++ b/Control/DataModelTest/DataModelTestDataReadCnv/src/CCnv.h
@@ -0,0 +1,27 @@
+// This file's extension implies that it's C, but it's really -*- C++ -*-.
+
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+// $Id$
+/**
+ * @file DataModelTestDataReadCnv/src/CCnv.h
+ * @author scott snyder <snyder@bnl.gov>
+ * @date Apr, 2016
+ * @brief POOL coverter for C.
+ */
+
+
+#ifndef DATAMODELTESTDATAREADCNV_CCNV_H
+#define DATAMODELTESTDATAREADCNV_CCNV_H
+
+
+#include "DataModelTestDataCommon/C.h"
+#include "AthenaPoolCnvSvc/T_AthenaPoolxAODCnv.h"
+
+
+typedef T_AthenaPoolxAODCnv<DMTest::C> CCnv;
+
+
+#endif // not DATAMODELTESTDATAREADCNV_CCNV_H
diff --git a/Control/DataModelTest/DataModelTestDataWrite/CMakeLists.txt b/Control/DataModelTest/DataModelTestDataWrite/CMakeLists.txt
index b43ef7397e45384b64df6f493198a291de8e696f..ecae489ead1c27021e8db4bdb09011b670b03e3e 100644
--- a/Control/DataModelTest/DataModelTestDataWrite/CMakeLists.txt
+++ b/Control/DataModelTest/DataModelTestDataWrite/CMakeLists.txt
@@ -34,19 +34,19 @@ atlas_add_library( DataModelTestDataWriteLib
                    src/*.cxx
                    PUBLIC_HEADERS DataModelTestDataWrite
                    PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                   LINK_LIBRARIES AthContainers AthLinks DataModelTestDataCommon SGTools xAODCore GaudiKernel DataModelAthenaPoolLib StoreGateLib SGtests TrigNavigationLib EventInfo TrigSteeringEvent
+                   LINK_LIBRARIES AthContainers AthLinks DataModelTestDataCommonLib SGTools xAODCore GaudiKernel DataModelAthenaPoolLib StoreGateLib SGtests TrigNavigationLib EventInfo TrigSteeringEvent
                    PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps AthenaKernel CxxUtils )
 
 atlas_add_component( DataModelTestDataWrite
                      src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommon SGTools xAODCore GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests TrigSteeringEvent DataModelTestDataWriteLib )
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommonLib SGTools xAODCore GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests TrigSteeringEvent DataModelTestDataWriteLib )
 
 atlas_add_dictionary( DataModelTestDataWriteDict
                       DataModelTestDataWrite/DataModelTestDataWriteDict.h
                       DataModelTestDataWrite/selection.xml
                       INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-                      LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommon SGTools xAODCore GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests DataModelTestDataWriteLib
+                      LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers AthLinks DataModelAthenaPoolLib DataModelTestDataCommonLib SGTools xAODCore GaudiKernel AthenaBaseComps AthenaKernel CxxUtils StoreGateLib SGtests DataModelTestDataWriteLib
                       NO_ROOTMAP_MERGE
                       EXTRA_FILES src/dict/*.cxx
                       ELEMENT_LINKS DataVector<DMTest::B> )
@@ -57,4 +57,4 @@ atlas_add_sercnv_library ( DataModelTestDataWriteSerCnv
   FILES DataModelTestDataWrite/HVec.h DataModelTestDataWrite/HView.h DataModelTestDataWrite/HAuxContainer.h
   TYPES_WITH_NAMESPACE DMTest::HVec DMTest::HView DMTest::HAuxContainer
   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
-  LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks TrigSerializeCnvSvcLib DataModelTestDataCommon DataModelTestDataWriteLib )
+  LINK_LIBRARIES ${ROOT_LIBRARIES} AthContainers SGTools xAODCore xAODTrigger GaudiKernel AthLinks TrigSerializeCnvSvcLib DataModelTestDataCommonLib DataModelTestDataWriteLib )
diff --git a/Control/DataModelTest/DataModelTestDataWriteCnv/CMakeLists.txt b/Control/DataModelTest/DataModelTestDataWriteCnv/CMakeLists.txt
index 786bd960e9a0d2b23c1222f41abea46de1186e46..104f8b02fb7d053d12288690c411eca91e06e2a1 100644
--- a/Control/DataModelTest/DataModelTestDataWriteCnv/CMakeLists.txt
+++ b/Control/DataModelTest/DataModelTestDataWriteCnv/CMakeLists.txt
@@ -20,5 +20,5 @@ atlas_add_poolcnv_library( DataModelTestDataWriteCnvPoolCnv
                            src/*.cxx
                            FILES DataModelTestDataWrite/BVec.h DataModelTestDataWrite/BDer.h DataModelTestDataWrite/DVec.h DataModelTestDataWrite/DDer.h DataModelTestDataWrite/ELVec.h DataModelTestDataWrite/G.h DataModelTestDataWrite/GVec.h DataModelTestDataWrite/GAuxContainer.h DataModelTestDataWrite/H.h DataModelTestDataWrite/HVec.h DataModelTestDataWrite/HAuxContainer.h DataModelTestDataWrite/HView.h DataModelTestDataCommon/BAux.h DataModelTestDataCommon/BAuxVec.h DataModelTestDataCommon/BAuxStandalone.h DataModelTestDataCommon/C.h DataModelTestDataCommon/CVec.h DataModelTestDataCommon/CAuxContainer.h DataModelTestDataCommon/CView.h DataModelTestDataCommon/CVecWithData.h DataModelTestDataCommon/CInfoAuxContainer.h DataModelTestDataCommon/CTrigAuxContainer.h
                            TYPES_WITH_NAMESPACE DMTest::BVec DMTest::DVec DMTest::DDer DMTest::BDer DMTest::ELVec DMTest::BAux DMTest::BAuxVec DMTest::BAuxStandalone DMTest::C DMTest::CVec DMTest::CAuxContainer DMTest::G DMTest::GVec DMTest::GAuxContainer DMTest::CVecWithData DMTest::CInfoAuxContainer DMTest::CTrigAuxContainer DMTest::CView DMTest::H DMTest::HVec DMTest::HAuxContainer DMTest::HView
-                           LINK_LIBRARIES AthenaPoolUtilities DataModelTestDataCommon DataModelTestDataWriteLib AthenaPoolCnvSvcLib )
+                           LINK_LIBRARIES AthenaPoolUtilities DataModelTestDataCommonLib DataModelTestDataWriteLib AthenaPoolCnvSvcLib )
 
diff --git a/Control/SGComps/src/SGInputLoader.cxx b/Control/SGComps/src/SGInputLoader.cxx
index 0815f2a2f61b0cb4c4e661f197c0b62712e3f224..8a77c39b056dd3a6c879dd07bba169d1858eb5a4 100644
--- a/Control/SGComps/src/SGInputLoader.cxx
+++ b/Control/SGComps/src/SGInputLoader.cxx
@@ -89,7 +89,20 @@ SGInputLoader::execute()
       if (dp->transientAddress()->provider() == 0) {
 	ATH_MSG_DEBUG("   obj " << obj << " has no provider, and is only Transient" );
       }
+
+      // Tell hive about the object.
       evtStore()->addedNewTransObject(obj.clid(), obj.key());
+
+      // Also add all aliases...
+      for (const std::string& alias : dp->alias()) {
+        evtStore()->addedNewTransObject(obj.clid(), alias);
+      }
+
+      // ... and linked classes.
+      for (CLID clid2 : dp->transientAddress()->transientID()) {
+        if (clid2 != obj.clid())
+          evtStore()->addedNewTransObject(clid2, obj.key());
+      }
     } else {
       ATH_MSG_ERROR("unable to get proxy for " << obj);
     }
diff --git a/Control/StoreGate/src/SGImplSvc.cxx b/Control/StoreGate/src/SGImplSvc.cxx
index b49902703a604241692e07e5f12433860e45e7c7..5603a653d1268a2a2a6a18dcf7d8773a3d1dd540 100644
--- a/Control/StoreGate/src/SGImplSvc.cxx
+++ b/Control/StoreGate/src/SGImplSvc.cxx
@@ -714,6 +714,8 @@ SGImplSvc::addSymLink(const CLID& linkid, DataProxy* dp)
     if (baseptr)
       this->t2pRegister (baseptr, dp).ignore();
   }
+
+  addedNewTransObject (linkid, dp->name());
   return sc;
 }
 
@@ -728,6 +730,8 @@ SGImplSvc::addAlias(const std::string& aliasKey, DataProxy* proxy)
     return StatusCode::FAILURE;
   }
 
+  addedNewTransObject (proxy->clID(), aliasKey);
+
   // add key to proxy and to ProxyStore
   return m_pStore->addAlias(aliasKey, proxy);
 }
@@ -1642,7 +1646,19 @@ void SGImplSvc::addedNewPersObject(CLID clid, DataProxy* dp) {
   //if proxy is loading from persistency
   //add key of object to list of "newly recorded" objects
   if (0 != dp->transientAddress()->provider()) {
+    // The object itself.
     s_newObjs.insert(DataObjID(clid,dp->name()));
+
+    // Aliases.
+    for (const std::string& alias : dp->alias()) {
+      s_newObjs.insert(DataObjID(clid,alias));
+    }
+
+    // Symlinks.
+    for (CLID clid2 : dp->transientAddress()->transientID()) {
+      if (clid2 != clid)
+        s_newObjs.insert(DataObjID(clid2,dp->name()));
+    }
   }
 }
 void SGImplSvc::addedNewTransObject(CLID clid, const std::string& key) {