diff --git a/CHANGELOG.md b/CHANGELOG.md
index d5680044a13..ebf2333bd42 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@
 - Changed: [#5806](https://github.com/ethereum/aleth/pull/5806) Optimize selfdestruct opcode in aleth-interpreter by reducing state accesses in certain out-of-gas scenarios.
 - Removed: [#5760](https://github.com/ethereum/aleth/pull/5760) Official support for Visual Studio 2015 has been dropped. Compilation with this compiler is expected to stop working after migration to C++14.
 - Fixed: [#5792](https://github.com/ethereum/aleth/pull/5792) Faster and cheaper execution of RPC functions which query blockchain state (e.g. getBalance).
+- Fixed: [#5811](https://github.com/ethereum/aleth/pull/5811) RPC methods querying transactions (`eth_getTransactionByHash`, `eth_getBlockByNumber`) return correct `v` value.
 
 ## [1.7.0] - Unreleased
 
diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp
index d13dfc869a1..bfaaf475136 100644
--- a/libethcore/TransactionBase.cpp
+++ b/libethcore/TransactionBase.cpp
@@ -134,6 +134,16 @@ SignatureStruct const& TransactionBase::signature() const
     return *m_vrs;
 }
 
+u256 TransactionBase::rawV() const
+{
+    if (!m_vrs)
+        BOOST_THROW_EXCEPTION(TransactionIsUnsigned());
+
+    int const vOffset = m_chainId.has_value() ? *m_chainId * 2 + 35 : 27;
+    return m_vrs->v + vOffset;
+}
+
+
 void TransactionBase::sign(Secret const& _priv)
 {
     auto sig = dev::sign(_priv, sha3(WithoutSignature));
@@ -163,10 +173,8 @@ void TransactionBase::streamRLP(RLPStream& _s, IncludeSignature _sig, bool _forE
         if (hasZeroSignature())
             _s << *m_chainId;
         else
-        {
-            int const vOffset = m_chainId.has_value() ? *m_chainId * 2 + 35 : 27;
-            _s << (m_vrs->v + vOffset);
-        }
+            _s << rawV();
+
         _s << (u256)m_vrs->r << (u256)m_vrs->s;
     }
     else if (_forEip155hash)
diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h
index 422939cce19..53e220fb490 100644
--- a/libethcore/TransactionBase.h
+++ b/libethcore/TransactionBase.h
@@ -137,6 +137,10 @@ class TransactionBase
     /// @throws TransactionIsUnsigned if signature was not initialized
     SignatureStruct const& signature() const;
 
+    /// @returns v value of the transaction (has chainID and recoveryID encoded in it)
+    /// @throws TransactionIsUnsigned if signature was not initialized
+    u256 rawV() const;
+
     void sign(Secret const& _priv);			///< Sign the transaction.
 
     /// @returns amount of gas required for the basic payment.
diff --git a/libweb3jsonrpc/JsonHelper.cpp b/libweb3jsonrpc/JsonHelper.cpp
index 92ba88b2b88..18681a57ada 100644
--- a/libweb3jsonrpc/JsonHelper.cpp
+++ b/libweb3jsonrpc/JsonHelper.cpp
@@ -112,7 +112,7 @@ Json::Value toJson(dev::eth::Transaction const& _t, std::pair<h256, unsigned> _l
         res["blockHash"] = toJS(_location.first);
         res["transactionIndex"] = toJS(_location.second);
         res["blockNumber"] = toJS(_blockNumber);
-        res["v"] = toJS(_t.signature().v);
+        res["v"] = toJS(_t.rawV());
         res["r"] = toJS(_t.signature().r);
         res["s"] = toJS(_t.signature().s);
     }
@@ -213,7 +213,7 @@ Json::Value toJson(dev::eth::Transaction const& _t)
     res["sighash"] = toJS(_t.sha3(WithoutSignature));
     res["r"] = toJS(_t.signature().r);
     res["s"] = toJS(_t.signature().s);
-    res["v"] = toJS(_t.signature().v);
+    res["v"] = toJS(_t.rawV());
     return res;
 }
 
@@ -243,7 +243,7 @@ Json::Value toJson(dev::eth::LocalisedTransaction const& _t)
         res["blockNumber"] = toJS(_t.blockNumber());
         res["r"] = toJS(_t.signature().r);
         res["s"] = toJS(_t.signature().s);
-        res["v"] = toJS(_t.signature().v);
+        res["v"] = toJS(_t.rawV());
     }
     return res;
 }