diff --git a/Control/SGTools/src/DataStore.cxx b/Control/SGTools/src/DataStore.cxx
index 1201c297c34b6b9dff3c153a7149c026b95470e8..d7e596184fb368da9ba7d40bc25b212a6e792d9d 100755
--- a/Control/SGTools/src/DataStore.cxx
+++ b/Control/SGTools/src/DataStore.cxx
@@ -218,8 +218,9 @@ DataStore::removeProxy(DataProxy* proxy, bool forceRemove, bool hard)
     // Remove all symlinks too.
     for (CLID symclid : clids) 
     {
-      if (symclid == clid) continue;
-      m_keyMap.erase (m_pool.stringToKey (name, symclid));
+      sgkey_t sgkey = m_pool.stringToKey (name, symclid);
+      m_keyMap.erase (sgkey);
+      if (clid == symclid) continue;
       storeIter = m_storeMap.find(symclid);
       if (storeIter != m_storeMap.end()) {
         SG::ProxyIterator it = storeIter->second.find (name);
diff --git a/Control/SGTools/test/DataStore_test.cxx b/Control/SGTools/test/DataStore_test.cxx
index 16bca70d27df2500259a04aac5548b54536926c3..2c5b4ef122c6113bc836b8389b0812bc57deb38e 100644
--- a/Control/SGTools/test/DataStore_test.cxx
+++ b/Control/SGTools/test/DataStore_test.cxx
@@ -386,7 +386,24 @@ void test_removeProxy ATLAS_NOT_THREAD_SAFE ()
   assert (store.proxy (123, "dp1") == 0);
   assert (store.proxy (124, "dp1") == 0);
   assert (store.proxy (123, "dp1x") == 0);
+  dp1->release();
 
+  //==============================================
+
+  // Test recording with a secondary CLID first.
+  SG::DataProxy* dp2 = make_proxy (223, "dp2");
+  dp2->resetOnly (false);
+  dp2->addRef();
+  dp2->setTransientID (223);
+  dp2->setTransientID (224);
+  assert (store.addToStore (224, dp2).isSuccess());
+  assert (store.addToStore (223, dp2).isSuccess());
+  assert (dp2->refCount() == 3);
+  assert (store.removeProxy (dp2, false, false).isSuccess());
+  assert (dp2->refCount() == 1);
+  assert (store.proxy_exact (pool.stringToKey ("dp2", 223)) == 0);
+  assert (store.proxy_exact (pool.stringToKey ("dp2", 224)) == 0);
+  dp2->release();
 }