diff --git a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h
index 48f2cfd30ef471688f045b47fe61205a943a94f4..a36aef566bd86e2b9df49a09c985ec0c5dd4bb73 100755
--- a/Database/PersistentDataModel/PersistentDataModel/DataHeader.h
+++ b/Database/PersistentDataModel/PersistentDataModel/DataHeader.h
@@ -56,7 +56,7 @@ public: // Constructor and Destructor
    /// @param classID [IN] Primary ClassID of the DataObject for which a DataHeaderElement is created.
    /// @param key [IN] SG Key of the DataObject for which a DataHeaderElement is created.
    /// @param token [IN] Token of the DataObject for which a DataHeaderElement is created.
-   DataHeaderElement(const CLID classID, const std::string& key, const Token* token);
+   DataHeaderElement(const CLID classID, const std::string& key, Token&& token);
    /// Destructor
    virtual ~DataHeaderElement();
 
@@ -111,9 +111,8 @@ private:
    std::string m_key;
    /// set of StoreGate alias string.
    std::set<std::string> m_alias;
-   /// pointer to transient address
-   const Token* m_token;
-   bool m_ownToken;
+   /// Transient address token.
+   Token m_token;
    /// hash table for ElementLink host container keys.
    std::vector<sgkey_t> m_hashes;
 };
diff --git a/Database/PersistentDataModel/PersistentDataModel/Token.h b/Database/PersistentDataModel/PersistentDataModel/Token.h
index 4d9a167164b8137072a79e7d66e6200d648ff70e..ef8a37e3923f5047181cf901588a11b74974b0d2 100755
--- a/Database/PersistentDataModel/PersistentDataModel/Token.h
+++ b/Database/PersistentDataModel/PersistentDataModel/Token.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef PERSISTENTDATAMODEL_TOKEN_H
@@ -37,6 +37,8 @@ public:
    Token();
    /// Constructor with data assignment
    explicit Token(const Token* source);
+   /// Allow move.
+   explicit Token(Token&& source);
    /// Standard destructor: release all allocated resources.
    virtual ~Token();
    /// Operator < to allow ordering
diff --git a/Database/PersistentDataModel/src/DataHeader.cxx b/Database/PersistentDataModel/src/DataHeader.cxx
index 6c674d974e92a597c3ae1205ad14b9c8a36f03d1..3a79ebdf093187037ebf4e2b5fdd98200e223b13 100755
--- a/Database/PersistentDataModel/src/DataHeader.cxx
+++ b/Database/PersistentDataModel/src/DataHeader.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 /** @file DataHeader.cxx
@@ -15,19 +15,15 @@
 #include "AthenaKernel/IStringPool.h"
 
 //______________________________________________________________________________
-DataHeaderElement::DataHeaderElement() : m_pClid(0), m_clids(), m_key(), m_alias(), m_token(0), m_ownToken(false), m_hashes() {
+DataHeaderElement::DataHeaderElement() : m_pClid(0), m_clids(), m_key(), m_alias(), m_hashes() {
 }
 //______________________________________________________________________________
 DataHeaderElement::DataHeaderElement(const DataHeaderElement& rhs) : m_pClid(rhs.m_pClid),
 	m_clids(rhs.m_clids),
 	m_key(rhs.m_key),
 	m_alias(rhs.m_alias),
-	m_token(0),
-	m_ownToken(false),
+        m_token(rhs.getToken()),
 	m_hashes(rhs.m_hashes) {
-   if (rhs.getToken() != 0) {
-      m_token = new Token(rhs.getToken()); m_ownToken = true;
-   }
 }
 //______________________________________________________________________________
 DataHeaderElement::DataHeaderElement(const SG::TransientAddress* sgAddress, IOpaqueAddress* tokAddress,
@@ -63,35 +59,30 @@ DataHeaderElement::DataHeaderElement(CLID clid,
     m_clids(tClids.begin(), tClids.end()),
     m_key((pTag.empty()) ? name : pTag),
     m_alias(std::move(alias)),
-    m_token(0), m_ownToken(false), m_hashes()
+    m_hashes()
 {
   m_clids.erase(m_pClid);
   TokenAddress* tokAddr = dynamic_cast<TokenAddress*>(tokAddress);
   if (tokAddr != 0 && tokAddr->getToken() != 0) {
-    m_token = new Token(tokAddr->getToken()); m_ownToken = true;
+    tokAddr->getToken()->setData (&m_token);
   } else {
     tokAddr = dynamic_cast<TokenAddress*>(tadAddress);
     if (tokAddr != 0 && tokAddr->getToken() != 0) {
-      m_token = tokAddr->getToken();
+      tokAddr->getToken()->setData (&m_token);
     } else if (tokAddress != 0) {
-      Token* token = new Token;
-      m_token = token; m_ownToken = true;
-      token->fromString(*(tokAddress->par()));
+      m_token.fromString(*(tokAddress->par()));
     } else if (tadAddress != 0) {
-      Token* token = new Token;
-      m_token = token; m_ownToken = true;
-      token->fromString(*(tadAddress->par()));
+      m_token.fromString(*(tadAddress->par()));
     }
   }
 }
 //______________________________________________________________________________
 DataHeaderElement::DataHeaderElement(const CLID classID,
-	const std::string& key, const Token* token)
-	: m_pClid(classID), m_clids(), m_key(key), m_alias(), m_token(token), m_ownToken(true), m_hashes() {
+	const std::string& key, Token&& token)
+	: m_pClid(classID), m_clids(), m_key(key), m_alias(), m_token(std::move(token)), m_hashes() {
 }
 //______________________________________________________________________________
 DataHeaderElement::~DataHeaderElement() {
-   if (m_ownToken) { delete m_token; m_token = 0; }
 }
 //______________________________________________________________________________
 DataHeaderElement& DataHeaderElement::operator=(const DataHeaderElement& rhs) {
@@ -100,12 +91,7 @@ DataHeaderElement& DataHeaderElement::operator=(const DataHeaderElement& rhs) {
       m_clids = rhs.m_clids;
       m_key = rhs.m_key;
       m_alias = rhs.m_alias;
-      if (m_ownToken) { delete m_token; m_token = 0; m_ownToken = false; }
-      if (rhs.getToken() != 0) {
-         Token* newtok = new Token;
-         m_token = newtok; m_ownToken = true;
-         rhs.getToken()->setData(newtok);
-      }
+      rhs.getToken()->setData(&m_token);
       m_hashes = rhs.m_hashes;
    }
    return(*this);
@@ -133,7 +119,7 @@ const std::set<std::string>& DataHeaderElement::getAlias() const {
 }
 //_____________________________________________________________________________
 const Token* DataHeaderElement::getToken() const {
-   return(m_token);
+   return(&m_token);
 }
 //_____________________________________________________________________________
 long DataHeaderElement::getStorageType() const {
@@ -162,7 +148,7 @@ SG::TransientAddress* DataHeaderElement::getAddress(unsigned long contextId) con
 SG::TransientAddress* DataHeaderElement::getAddress(const std::string& key,
 	unsigned long contextId) const {
    CLID primaryClID = getPrimaryClassID();
-   Token* token = new Token(m_token);
+   Token* token = new Token(&m_token);
    TokenAddress* tokAdd = new TokenAddress(this->getStorageType(), primaryClID, "", m_key, contextId , token);
    SG::TransientAddress* sgAddress = new SG::TransientAddress(primaryClID, key, tokAdd);
    for (std::set<CLID>::const_iterator iter = m_clids.begin(), last = m_clids.end();
@@ -188,11 +174,7 @@ void DataHeaderElement::dump(std::ostream& ostr) const
       for( auto& a : getAlias() ) ostr << " " << a;
       ostr << endl;
    }
-   if( m_token ) {
-      ostr << "Token: " << m_token->toString();
-      if( m_ownToken ) ostr << " owned";
-      ostr << endl;
-   }
+   ostr << "Token: " << m_token.toString() << endl;
    if( m_hashes.size() ) {
       ostr << "Hashes:";
       for( auto h : m_hashes ) ostr <<  " " << h;
diff --git a/Database/PersistentDataModel/src/Token.cxx b/Database/PersistentDataModel/src/Token.cxx
index 279157b2f33cf938622c3838f135344f37b71fe4..1383caa83094250ebd3f1bc544dd79ce53379c7c 100755
--- a/Database/PersistentDataModel/src/Token.cxx
+++ b/Database/PersistentDataModel/src/Token.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "PersistentDataModel/Token.h"
@@ -52,6 +52,21 @@ Token::Token(const Token* source) : m_refCount(1),
    s_numCount++;
 }
 
+/// Move constructor.
+Token::Token(Token&& source)
+  : m_refCount (1),
+    m_technology (source.m_technology),
+    m_dbID (std::move (source.m_dbID)),
+    m_cntID (std::move (source.m_cntID)),
+    m_classID (std::move (source.m_classID)),
+    m_oid (std::move (source.m_oid)),
+    m_type (source.m_type),
+    m_auxString (std::move (source.m_auxString))
+{
+   s_numCount++;
+}
+    
+
 Token::~Token() {
    s_numCount--;
 }
@@ -194,5 +209,7 @@ const Token& Token::set(Token* pToken) const {
 const Token& Token::setData(Token* pToken) const {
    this->set(pToken);
    pToken->m_oid.second = m_oid.second;
+   pToken->m_type = m_type;
+   pToken->m_auxString = m_auxString;
    return *this;
 }
diff --git a/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx b/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx
index 9d73114c30f5357375ed1a31b94e13a7635328c9..96d10124058013ec7e9df53e4950f6ba279249a8 100755
--- a/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx
+++ b/Database/PersistentDataModelAthenaPool/src/DataHeaderCnv.cxx
@@ -565,8 +565,7 @@ DataHeader* DataHeaderCnv::createTransient() {
       DataHeader* dh = new DataHeader();
       std::string bestPfn, fileType;
       m_athenaPoolCnvSvc->getPoolSvc()->lookupBestPfn(this->m_i_poolToken->dbID().toString(), bestPfn, fileType);
-      const Token* copy = new Token(this->m_i_poolToken);
-      DataHeaderElement dhe(ClassID_traits<DataHeader>::ID(), bestPfn, copy);
+      DataHeaderElement dhe(ClassID_traits<DataHeader>::ID(), bestPfn, Token(this->m_i_poolToken));
       dh->insert(dhe);
       return(dh);
    }
diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx
index ee1e00cbd38c561de64a794409b4e416b89689c6..097d5dfe2c7328ce2d65c89bd81f38123f61f042 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p3.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 /** @file DataHeaderCnv_p3.cxx
@@ -78,9 +78,7 @@ void DataHeaderElementCnv_p3::persToTrans(const DataHeaderElement_p3* pers,
       snprintf(text, length, "][TECH=%08X][OID=%08X-%08X]", pers->m_technology, pers->m_oid1, pers->m_oid2);
       tokenStr.append(text);
    }
-   Token* token = new Token;
-   token->fromString(tokenStr);
-   delete trans->m_token; trans->m_token = token;
+   trans->m_token.fromString(tokenStr);
 }
 //______________________________________________________________________________
 void DataHeaderElementCnv_p3::transToPers(const DataHeaderElement* /*trans*/,
diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx
index 5b137356ae3ef40712c3ca12c14e8a43ec26cbb7..95ca379cd113b63ac10496abbfa0f6f27905c8e5 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p4.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 /** @file DataHeaderCnv_p4.cxx
@@ -82,9 +82,7 @@ void DataHeaderElementCnv_p4::persToTrans(const DataHeaderElement_p4* pers,
       snprintf(text, length, "][TECH=%08X][OID=%08X-%08X]", pers->m_technology, pers->m_oid1, pers->m_oid2);
       tokenStr.append(text);
    }
-   Token* token = new Token;
-   token->fromString(tokenStr);
-   delete trans->m_token; trans->m_token = token;
+   trans->m_token.fromString(tokenStr);
 }
 //______________________________________________________________________________
 void DataHeaderElementCnv_p4::transToPers(const DataHeaderElement* /*trans*/,
diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
index bdfb582f936e4d19291766f07ec775b5e0110ea0..c6977d5f3698a747fb0eb8c4f78f8428eccc91fb 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p5.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
 */
 
 /** @file DataHeaderCnv_p5.cxx
@@ -21,8 +21,7 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers,
 	const DataHeaderForm_p5& form,
         unsigned int entry) const
 {
-   delete trans.m_token; trans.m_token = new Token; trans.m_ownToken = true;
-   Token* token = const_cast<Token*>(trans.m_token);
+   Token& token = trans.m_token;
    std::vector<unsigned int>::const_iterator intIter = form.params(entry).begin();
    unsigned int keyIdx = 0U, aliasNum = 0U, clidNum = 0U;
 // Translate PoolToken
@@ -31,7 +30,7 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers,
       keyIdx = *intIter; ++intIter;
       aliasNum = *intIter; ++intIter;
       clidNum = *intIter; ++intIter;
-      token->fromString(pers.m_token);
+      token.fromString(pers.m_token);
    } else {
       const unsigned int keyPos = (unsigned short)(*intIter>>16),
 	      version = (unsigned short)(*intIter&0x0000FFFF); ++intIter;
@@ -54,7 +53,7 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers,
       }
 // Append DbGuid
       Guid guid(form.map()[guidIdx]);
-      token->setDb(guid);
+      token.setDb(guid);
 // Container name, may be optimized
       std::string cntName;
       if (prefixIdx > 0) {
@@ -69,12 +68,12 @@ void DataHeaderElementCnv_p5::persToTrans(const DataHeaderElement_p5& pers,
       } else {
          cntName += pers.m_token;
       }
-      //token->setCont(cntName);
+      //token.setCont(cntName);
 // Append ClassId
       Guid clid(form.map()[classIdx]);
-      token->setClassID(clid);
-      token->setTechnology(tech);
-      token->setOid(Token::OID_t(oid1, pers.m_oid2));
+      token.setClassID(clid);
+      token.setTechnology(tech);
+      token.setOid(Token::OID_t(oid1, pers.m_oid2));
    }
    unsigned int aliasCur = 0U, clidCur = 0U;
    trans.m_key = form.map()[keyIdx];
@@ -263,9 +262,9 @@ void DataHeaderCnv_p5::insertDHRef(DataHeader_p5& pers,
                                    const std::string& key,
                                    const std::string& strToken) const
 {
-  Token* token = new Token;
-  token->fromString(strToken);
-  DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, token);
+  Token token;
+  token.fromString(strToken);
+  DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, std::move(token));
   DataHeaderElement_p5 pEle;
   unsigned int entry = dhForm.size() + 1;
   m_elemCnv.transToPers(tEle, pEle, dhForm, entry);
diff --git a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx
index 8e6e324500707580f986b826bda60886c2a6889d..ddc1f18e32af04b50c8134c0131a85da10b85ae0 100755
--- a/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx
+++ b/Database/PersistentDataModelTPCnv/src/DataHeaderCnv_p6.cxx
@@ -18,13 +18,10 @@ using FullElement  = DataHeader_p6::FullElement;
 bool DataHeaderCnv_p6::persToElem( const DataHeader_p6* pers, unsigned p_idx,
                                     DataHeaderElement* trans, const DataHeaderForm_p6& form ) const
 {
-   delete trans->m_token;  trans->m_token = nullptr;
    int obj_idx = pers->m_shortElements[p_idx];
    if( obj_idx == INT32_MIN ) return true;
 
-   Token* token = new Token;
-   trans->m_token = token;
-   trans->m_ownToken = true;
+   Token& token = trans->m_token;
    unsigned db_idx = 0;
    unsigned long long oid2 = 0;
    if( obj_idx >= 0 ) {
@@ -39,14 +36,14 @@ bool DataHeaderCnv_p6::persToElem( const DataHeader_p6* pers, unsigned p_idx,
 
    if( form.sizeDb() > db_idx ) {
       // Append DbGuid
-      token->setDb(         form.getDbGuid( db_idx ) );
-      token->setTechnology( form.getDbTech( db_idx ) );
+      token.setDb(         form.getDbGuid( db_idx ) );
+      token.setTechnology( form.getDbTech( db_idx ) );
    }
    if( form.sizeObj() > (size_t)obj_idx ) {
-      token->setCont(       form.getObjContainer( obj_idx ) );
+      token.setCont(       form.getObjContainer( obj_idx ) );
       // Append ClassId
-      token->setClassID(    form.getObjClassId(obj_idx) );
-      token->setOid( Token::OID_t( form.getObjOid1(obj_idx), oid2) );
+      token.setClassID(    form.getObjClassId(obj_idx) );
+      token.setOid( Token::OID_t( form.getObjOid1(obj_idx), oid2) );
       // StoreGate
       trans->m_key = form.getObjKey( obj_idx );
       trans->m_alias = form.getObjAlias( obj_idx );
@@ -159,8 +156,8 @@ void DataHeaderCnv_p6::insertDHRef( DataHeader_p6* pers,
                                     const std::string& key, const std::string& tokstr,
                                     DataHeaderForm_p6& form ) const
 {
-   Token* token = new Token();
-   token->fromString( tokstr );
-   DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, token);
+   Token token;
+   token.fromString( tokstr );
+   DataHeaderElement tEle(ClassID_traits<DataHeader>::ID(), key, std::move(token));
    elemToPers( &tEle, pers, form );
 }
diff --git a/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx b/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx
index 66bbc4141583ee2692048579136d821cc69257fd..d2b4b4f664e6758a098cd0f789841101ebbc0b54 100644
--- a/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx
+++ b/Event/ByteStreamCnvSvc/src/ByteStreamEventStorageInputSvc.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "ByteStreamEventStorageInputSvc.h"
@@ -665,12 +665,11 @@ ByteStreamEventStorageInputSvc::currentEventStatus() const
 std::unique_ptr<DataHeaderElement>
 ByteStreamEventStorageInputSvc::makeBSProvenance() const
 {
-    std::unique_ptr<Token> token = std::make_unique<Token>();
-    token->setDb(m_fileGUID);
-    token->setTechnology(0x00001000);
-    token->setOid(Token::OID_t(0LL, m_evtFileOffset));
+    Token token;
+    token.setDb(m_fileGUID);
+    token.setTechnology(0x00001000);
+    token.setOid(Token::OID_t(0LL, m_evtFileOffset));
 
-    // note: passing ownership of token to DataHeaderElement
     return std::make_unique<DataHeaderElement>(ClassID_traits<DataHeader>::ID(),
-        "StreamRAW", token.release());
+        "StreamRAW", std::move(token));
 }