diff --git a/src/index/txindex.cpp b/src/index/txindex.cpp
index 7992d8533..2a661f033 100644
--- a/src/index/txindex.cpp
+++ b/src/index/txindex.cpp
@@ -254,9 +254,30 @@ bool TxIndex::BlockUntilSyncedToCurrentChain()
     return true;
 }
 
-bool TxIndex::FindTx(const uint256& txid, CDiskTxPos& pos) const
+bool TxIndex::FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRef& tx) const
 {
-    return m_db->ReadTxPos(txid, pos);
+    CDiskTxPos postx;
+    if (!m_db->ReadTxPos(tx_hash, postx)) {
+        return false;
+    }
+
+    CAutoFile file(OpenBlockFile(postx, true), SER_DISK, CLIENT_VERSION);
+    if (file.IsNull()) {
+        return error("%s: OpenBlockFile failed", __func__);
+    }
+    CBlockHeader header;
+    try {
+        file >> header;
+        fseek(file.Get(), postx.nTxOffset, SEEK_CUR);
+        file >> tx;
+    } catch (const std::exception& e) {
+        return error("%s: Deserialize or I/O error - %s", __func__, e.what());
+    }
+    if (tx->GetHash() != tx_hash) {
+        return error("%s: txid mismatch", __func__);
+    }
+    block_hash = header.GetHash();
+    return true;
 }
 
 void TxIndex::Interrupt()
diff --git a/src/index/txindex.h b/src/index/txindex.h
index 41199f0b3..ac746de05 100644
--- a/src/index/txindex.h
+++ b/src/index/txindex.h
@@ -6,6 +6,7 @@
 #define BITCOIN_INDEX_TXINDEX_H
 
 #include <primitives/block.h>
+#include <primitives/transaction.h>
 #include <threadinterrupt.h>
 #include <txdb.h>
 #include <uint256.h>
@@ -69,8 +70,13 @@ public:
     /// up from far behind, this method does not block and immediately returns false.
     bool BlockUntilSyncedToCurrentChain();
 
-    /// Look up the on-disk location of a transaction by hash.
-    bool FindTx(const uint256& txid, CDiskTxPos& pos) const;
+    /// Look up a transaction by hash.
+    ///
+    /// @param[in]   tx_hash  The hash of the transaction to be returned.
+    /// @param[out]  block_hash  The hash of the block the transaction is found in.
+    /// @param[out]  tx  The transaction itself.
+    /// @return  true if transaction is found, false otherwise
+    bool FindTx(const uint256& tx_hash, uint256& block_hash, CTransactionRef& tx) const;
 
     void Interrupt();
 
diff --git a/src/validation.cpp b/src/validation.cpp
index 5ea81bfc9..14257d78f 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -1029,27 +1029,7 @@ bool GetTransaction(const uint256& hash, CTransactionRef& txOut, const Consensus
         }
 
         if (g_txindex) {
-            CDiskTxPos postx;
-            if (g_txindex->FindTx(hash, postx)) {
-                CAutoFile file(OpenBlockFile(postx, true), SER_DISK, CLIENT_VERSION);
-                if (file.IsNull())
-                    return error("%s: OpenBlockFile failed", __func__);
-                CBlockHeader header;
-                try {
-                    file >> header;
-                    fseek(file.Get(), postx.nTxOffset, SEEK_CUR);
-                    file >> txOut;
-                } catch (const std::exception& e) {
-                    return error("%s: Deserialize or I/O error - %s", __func__, e.what());
-                }
-                hashBlock = header.GetHash();
-                if (txOut->GetHash() != hash)
-                    return error("%s: txid mismatch", __func__);
-                return true;
-            }
-
-            // transaction not found in index, nothing more can be done
-            return false;
+            return g_txindex->FindTx(hash, hashBlock, txOut);
         }
 
         if (fAllowSlow) { // use coin database to locate block that contains transaction, and scan it