diff --git a/Reconstruction/TrackParticleTPCnv/TrackParticleTPCnv/ATLAS_CHECK_THREAD_SAFETY b/Reconstruction/TrackParticleTPCnv/TrackParticleTPCnv/ATLAS_CHECK_THREAD_SAFETY
new file mode 100644
index 0000000000000000000000000000000000000000..d96f338f1f153ac6caa050bec5a43b3a07af4b23
--- /dev/null
+++ b/Reconstruction/TrackParticleTPCnv/TrackParticleTPCnv/ATLAS_CHECK_THREAD_SAFETY
@@ -0,0 +1 @@
+Reconstruction/TrackParticleTPCnv
diff --git a/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp1.cxx b/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp1.cxx
index 75a991b7b7772f88c7ebb6ad675f59a48617589b..48fddf41dd8e0fe876ee53c853b0d522e421f5db 100755
--- a/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp1.cxx
+++ b/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp1.cxx
@@ -3,6 +3,7 @@
 */
 
 #include "TrackParticleTPCnv/TrackParticleContainerCnv_tlp1.h"
+#include "CxxUtils/checker_macros.h"
 
 TrackParticleContainerCnv_tlp1::TrackParticleContainerCnv_tlp1()
 {
@@ -161,7 +162,12 @@ persToTrans (const Rec::TrackParticleContainer_tlp1* pers,
              Rec::TrackParticleContainer* trans,
              MsgStream& msg)
 {
-  setPStorage (const_cast<Rec::TrackParticleContainer_tlp1*> (pers));
+    // FIXME: TPConverter uses the same non-const member m_pStorage
+    // for both reading and writing, but we want it to be const
+    // in the former case.
+    Rec::TrackParticleContainer_tlp1* pers_nc ATLAS_THREAD_SAFE =
+      const_cast<Rec::TrackParticleContainer_tlp1*> (pers);
+    setPStorage (pers_nc);
   m_mainConverter.pstoreToTrans (0, trans, msg);
 }
 
diff --git a/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp2.cxx b/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp2.cxx
index 1ee9b66c634a44d21927e9102757960637de84e0..0c64f8d896893e210e33178880563e8e46a855bf 100644
--- a/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp2.cxx
+++ b/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp2.cxx
@@ -1,8 +1,9 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "TrackParticleTPCnv/TrackParticleContainerCnv_tlp2.h"
+#include "CxxUtils/checker_macros.h"
 
 TrackParticleContainerCnv_tlp2::TrackParticleContainerCnv_tlp2()
 {
@@ -124,7 +125,12 @@ void TrackParticleContainerCnv_tlp2::setPStorage( Rec::TrackParticleContainer_tl
 
 void T_TPCnv<Rec::TrackParticleContainer, Rec::TrackParticleContainer_tlp2 >::
 persToTrans (const Rec::TrackParticleContainer_tlp2* pers, Rec::TrackParticleContainer* trans, MsgStream& msg){
-    setPStorage (const_cast<Rec::TrackParticleContainer_tlp2*> (pers));
+    // FIXME: TPConverter uses the same non-const member m_pStorage
+    // for both reading and writing, but we want it to be const
+    // in the former case.
+    Rec::TrackParticleContainer_tlp2* pers_nc ATLAS_THREAD_SAFE =
+      const_cast<Rec::TrackParticleContainer_tlp2*> (pers);
+    setPStorage (pers_nc);
     m_mainConverter.pstoreToTrans (0, trans, msg);
 }
 
diff --git a/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp3.cxx b/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp3.cxx
index d70cc856da3a064ad939ed1c8a16ee86ea98bb18..803eaff52194ce16aeecce09fc4867a49a64f0f5 100644
--- a/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp3.cxx
+++ b/Reconstruction/TrackParticleTPCnv/src/TrackParticleContainerCnv_tlp3.cxx
@@ -1,8 +1,9 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "TrackParticleTPCnv/TrackParticleContainerCnv_tlp3.h"
+#include "CxxUtils/checker_macros.h"
 
 TrackParticleContainerCnv_tlp3::TrackParticleContainerCnv_tlp3(bool nosurf /*= false*/)
   : m_trackParametersCnv (nosurf)
@@ -29,8 +30,14 @@ void TrackParticleContainerCnv_tlp3::setPStorage( Rec::TrackParticleContainer_tl
 
 
 void T_TPCnv<Rec::TrackParticleContainer, Rec::TrackParticleContainer_tlp3 >::
-persToTrans (const Rec::TrackParticleContainer_tlp3* pers, Rec::TrackParticleContainer* trans, MsgStream& msg){
-    setPStorage (const_cast<Rec::TrackParticleContainer_tlp3*> (pers));
+persToTrans (const Rec::TrackParticleContainer_tlp3* pers, Rec::TrackParticleContainer* trans, MsgStream& msg)
+{
+    // FIXME: TPConverter uses the same non-const member m_pStorage
+    // for both reading and writing, but we want it to be const
+    // in the former case.
+    Rec::TrackParticleContainer_tlp3* pers_nc ATLAS_THREAD_SAFE =
+      const_cast<Rec::TrackParticleContainer_tlp3*> (pers);
+    setPStorage (pers_nc);
     m_mainConverter.pstoreToTrans (0, trans, msg);
 }