diff --git a/Control/SGComps/src/ProxyProviderSvc.cxx b/Control/SGComps/src/ProxyProviderSvc.cxx
index 90030813ef7ba906f3a1e168744f43f99afe654d..b180e710b92e0e1fb93e4c36b62e87f1c13c7500 100644
--- a/Control/SGComps/src/ProxyProviderSvc.cxx
+++ b/Control/SGComps/src/ProxyProviderSvc.cxx
@@ -178,14 +178,17 @@ ProxyProviderSvc::addAddress(IProxyRegistry& store,
   // std::cout << "PPS:addAdress: proxy for key " << tAddr->name() << " has resetOnly " << resetOnly << std::endl;
   SG::DataProxy* dp = new SG::DataProxy(std::move(tAddr),
                                         m_pDataLoader, true, resetOnly );
-  //  store.addToStore(tAddr->clID(),dp);
+
+  // Must add the primary CLID first.
+  bool addedProxy = store.addToStore(dp->clID(), dp).isSuccess();
   //  ATH_MSG_VERBOSE("created proxy for " << tAddr->clID() << "/" << tAddr->name() << "using " << m_pDataLoader->repSvcType());
 
-  bool addedProxy(false);
   // loop over all the transient CLIDs:
   SG::TransientAddress::TransientClidSet tClid = dp->transientID();
   for (CLID clid : tClid) {
-    addedProxy |= (store.addToStore(clid, dp)).isSuccess();
+    if (clid != dp->clID()) {
+      addedProxy &= (store.addToStore(clid, dp)).isSuccess();
+    }
   }
 
   if (addedProxy) {
diff --git a/Control/SGComps/test/ProxyProviderSvc_test.cxx b/Control/SGComps/test/ProxyProviderSvc_test.cxx
index 9462d972075b3e8a37c023bcf78faaee903cf319..c29d6ccb5a856c9e0800c3fbaa719159f1954778 100644
--- a/Control/SGComps/test/ProxyProviderSvc_test.cxx
+++ b/Control/SGComps/test/ProxyProviderSvc_test.cxx
@@ -46,7 +46,9 @@ public:
                                    const EventContext& ctx) override;
 
 
-  void add (CLID clid, const std::string& name);
+  void add (CLID clid,
+            const std::string& name,
+            const std::vector<CLID>& tclids = {});
 
 
 public:
@@ -61,8 +63,12 @@ StatusCode TestProvider::preLoadAddresses(StoreID::type /*storeID*/,
                                           tadList& list)
 {
   tListLen = list.size();
-  for (const SG::TransientAddress& tad : m_tads)
+  for (const SG::TransientAddress& tad : m_tads) {
     list.push_back (new SG::TransientAddress (tad.clID(), tad.name()));
+    for (CLID clid : tad.transientID()) {
+      list.back()->setTransientID (clid);
+    }
+  }
   return StatusCode::SUCCESS;
 }
 
@@ -71,8 +77,12 @@ StatusCode TestProvider::loadAddresses(StoreID::type /*storeID*/,
                                        tadList& list)
 {
   tListLen = list.size();
-  for (const SG::TransientAddress& tad : m_tads)
+  for (const SG::TransientAddress& tad : m_tads) {
     list.push_back (new SG::TransientAddress (tad.clID(), tad.name()));
+    for (CLID clid : tad.transientID()) {
+      list.back()->setTransientID (clid);
+    }
+  }
   return StatusCode::SUCCESS;
 }
 
@@ -85,9 +95,13 @@ StatusCode TestProvider::updateAddress(StoreID::type /*storeID*/,
 }
 
 
-void TestProvider::add (CLID clid, const std::string& name)
+void TestProvider::add (CLID clid, const std::string& name,
+                        const std::vector<CLID>& tclids)
 {
   m_tads.emplace_back (clid, name);
+  for (CLID clid : tclids) {
+    m_tads.back().setTransientID (clid);
+  }
 }
 
 
@@ -95,6 +109,8 @@ class TestProxyRegistry
   : public IProxyRegistry
 {
 public:
+  virtual ~TestProxyRegistry();
+
   virtual StatusCode addToStore(const CLID& id, SG::DataProxy* proxy) override;
 
   virtual StatusCode addAlias(const std::string& /*key*/, SG::DataProxy* /*proxy*/) override
@@ -113,14 +129,27 @@ public:
                                      const std::string& /*key*/) const override
   { return nullptr; }
 
-  std::vector<std::unique_ptr<SG::DataProxy> > proxies;
+  std::vector<SG::DataProxy*> proxies;
 };
 
 
+TestProxyRegistry::~TestProxyRegistry()
+{
+  for (SG::DataProxy* p : proxies) {
+    p->release();
+  }
+}
+
+
 StatusCode
-TestProxyRegistry::addToStore (const CLID& /*id*/, SG::DataProxy* proxy)
+TestProxyRegistry::addToStore (const CLID& id, SG::DataProxy* proxy)
 {
-  proxies.emplace_back (proxy);
+  // First entry should be primary.
+  if (proxies.empty() || proxies.back() != proxy) {
+    assert (id == proxy->clID());
+  }
+  proxy->addRef();
+  proxies.push_back (proxy);
   return StatusCode::SUCCESS;
 }
 
@@ -131,7 +160,9 @@ TestProvider providers[NPROVIDERS];
 
 void checkStore (const TestProxyRegistry& store)
 {
-  assert (store.proxies.size() == 3);
+  typedef SG::DataProxy::CLIDCont_t CLIDCont_t;
+
+  assert (store.proxies.size() == 5);
   assert (providers[0].tListLen == 0);
   assert (providers[1].tListLen == 0);
   assert (providers[2].tListLen == 2);
@@ -140,14 +171,20 @@ void checkStore (const TestProxyRegistry& store)
   assert (store.proxies[0]->clID() == 10);
   assert (store.proxies[0]->name() == "x1");
   assert (store.proxies[0]->provider() == &providers[1]);
+  assert (store.proxies[0]->transientID() == CLIDCont_t{10});
 
   assert (store.proxies[1]->clID() == 11);
   assert (store.proxies[1]->name() == "x2");
   assert (store.proxies[1]->provider() == &providers[1]);
+  assert (store.proxies[1]->transientID() == CLIDCont_t{11});
 
   assert (store.proxies[2]->clID() == 12);
   assert (store.proxies[2]->name() == "y1");
   assert (store.proxies[2]->provider() == &providers[3]);
+  assert (store.proxies[2]->transientID() == (CLIDCont_t{5, 12, 20}));
+
+  assert (store.proxies[3] == store.proxies[2]);
+  assert (store.proxies[4] == store.proxies[2]);
 }
 
 
@@ -157,7 +194,7 @@ void test1 (IProxyProviderSvc& svc)
 
   providers[1].add (10, "x1");
   providers[1].add (11, "x2");
-  providers[3].add (12, "y1");
+  providers[3].add (12, "y1", {5, 20});
 
   for (TestProvider& p : providers)
     svc.addProvider (&p);