diff --git a/Control/StoreGate/StoreGate/tools/SGImplSvc.h b/Control/StoreGate/StoreGate/tools/SGImplSvc.h
index f00d41797082e6157a781726f7c0fbac44f82bba..2a865512dcfae7fa0644515127f5740d2ee020fe 100644
--- a/Control/StoreGate/StoreGate/tools/SGImplSvc.h
+++ b/Control/StoreGate/StoreGate/tools/SGImplSvc.h
@@ -1106,6 +1106,7 @@ private:
   typedef std::recursive_mutex mutex_t;
   typedef std::lock_guard<mutex_t> lock_t;
   mutable mutex_t m_mutex;
+  mutable mutex_t m_remapMutex;
 
   
 public:
diff --git a/Control/StoreGate/src/SGImplSvc.cxx b/Control/StoreGate/src/SGImplSvc.cxx
index 3f52b05705cb4d91319aba4ebf932f65115d359c..c65c8f1554d776daca90c66b2c43be7e0e8aacd2 100644
--- a/Control/StoreGate/src/SGImplSvc.cxx
+++ b/Control/StoreGate/src/SGImplSvc.cxx
@@ -332,19 +332,24 @@ string SGImplSvc::createKey(const CLID& id)
 // clear store
 StatusCode SGImplSvc::clearStore(bool forceRemove)
 {
-  lock_t lock (m_mutex);
-  emptyTrash();
-  for (auto& p : m_newBoundHandles)
-    p.second.clear();
-  assert(m_pStore);
-  MsgStream* pmlog( msgLvl(MSG::VERBOSE) ? &msg() : 0);
-  msg() << MSG::DEBUG << "Clearing store with forceRemove="
-        << forceRemove << endmsg;
-  bool hard_reset = (m_numSlots > 1);
-  m_pStore->clearStore(forceRemove, hard_reset, pmlog);
-  m_storeLoaded=false;  //FIXME hack needed by loadEventProxies
-  m_remap_impl->m_remaps.clear();
-  m_arena.reset();
+  {
+    lock_t lock (m_mutex);
+    emptyTrash();
+    for (auto& p : m_newBoundHandles)
+      p.second.clear();
+    assert(m_pStore);
+    MsgStream* pmlog( msgLvl(MSG::VERBOSE) ? &msg() : 0);
+    msg() << MSG::DEBUG << "Clearing store with forceRemove="
+          << forceRemove << endmsg;
+    bool hard_reset = (m_numSlots > 1);
+    m_pStore->clearStore(forceRemove, hard_reset, pmlog);
+    m_storeLoaded=false;  //FIXME hack needed by loadEventProxies
+  }
+  {
+    lock_t remap_lock (m_remapMutex);
+    m_remap_impl->m_remaps.clear();
+    m_arena.reset();
+  }
 
   return StatusCode::SUCCESS;
 }
@@ -1412,7 +1417,7 @@ void SGImplSvc::remap_impl (sgkey_t source,
                             sgkey_t target,
                             off_t index_offset)
 {
-  lock_t lock (m_mutex);
+  lock_t lock (m_remapMutex);
   SG::RemapImpl::remap_t payload;
   payload.target = target;
   payload.index_offset = index_offset;
@@ -1431,7 +1436,7 @@ void SGImplSvc::remap_impl (sgkey_t source,
 bool SGImplSvc::tryELRemap (sgkey_t sgkey_in, size_t index_in,
                             sgkey_t& sgkey_out, size_t& index_out)
 {
-  lock_t lock (m_mutex);
+  lock_t lock (m_remapMutex);
   SG::RemapImpl::remap_map_t::iterator i =
     m_remap_impl->m_remaps.find (sgkey_in);
   if (i == m_remap_impl->m_remaps.end())