diff --git a/cmd/rpcdaemon/commands/debug_api.go b/cmd/rpcdaemon/commands/debug_api.go
index 5ecad1b2ec151d6aaf1d230db30124244dc76572..f692da238d59a4e5f8b2fabad466484aada46c10 100644
--- a/cmd/rpcdaemon/commands/debug_api.go
+++ b/cmd/rpcdaemon/commands/debug_api.go
@@ -19,6 +19,7 @@ import (
 	"github.com/ledgerwatch/erigon/internal/ethapi"
 	"github.com/ledgerwatch/erigon/rpc"
 	"github.com/ledgerwatch/erigon/turbo/transactions"
+	"github.com/ledgerwatch/log/v3"
 )
 
 // AccountRangeMaxResults is the maximum number of results to be returned per call
@@ -74,7 +75,11 @@ func (api *PrivateDebugAPIImpl) StorageRangeAt(ctx context.Context, blockHash co
 		return StorageRangeResult{}, nil
 	}
 	getHeader := func(hash common.Hash, number uint64) *types.Header {
-		return rawdb.ReadHeader(tx, hash, number)
+		h, e := api._blockReader.Header(ctx, tx, hash, number)
+		if e != nil {
+			log.Error("getHeader error", "number", number, "hash", hash, "err", e)
+		}
+		return h
 	}
 
 	contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil }
diff --git a/cmd/rpcdaemon/commands/erigon_receipts.go b/cmd/rpcdaemon/commands/erigon_receipts.go
index b8d4ead38c64009e066db7e02fc98f9a855d369f..cc9a6bae69fed76b6fd6273e2e7fa26605d87644 100644
--- a/cmd/rpcdaemon/commands/erigon_receipts.go
+++ b/cmd/rpcdaemon/commands/erigon_receipts.go
@@ -28,7 +28,7 @@ func (api *ErigonImpl) GetLogsByHash(ctx context.Context, hash common.Hash) ([][
 	if block == nil {
 		return nil, nil
 	}
-	receipts, err := getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs())
+	receipts, err := api.getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs())
 	if err != nil {
 		return nil, fmt.Errorf("getReceipts error: %w", err)
 	}
diff --git a/cmd/rpcdaemon/commands/eth_receipts.go b/cmd/rpcdaemon/commands/eth_receipts.go
index a5b667a8e291e55d1dce878f00a60a26d5167083..988dd3389eb3bd1bfddf7017eadb3ddb73b05d7b 100644
--- a/cmd/rpcdaemon/commands/eth_receipts.go
+++ b/cmd/rpcdaemon/commands/eth_receipts.go
@@ -9,6 +9,7 @@ import (
 
 	"github.com/holiman/uint256"
 	"github.com/ledgerwatch/erigon-lib/kv"
+	"github.com/ledgerwatch/log/v3"
 
 	"github.com/RoaringBitmap/roaring"
 	"github.com/ledgerwatch/erigon/common"
@@ -29,13 +30,17 @@ import (
 	"github.com/ledgerwatch/erigon/turbo/transactions"
 )
 
-func getReceipts(ctx context.Context, tx kv.Tx, chainConfig *params.ChainConfig, block *types.Block, senders []common.Address) (types.Receipts, error) {
+func (api *BaseAPI) getReceipts(ctx context.Context, tx kv.Tx, chainConfig *params.ChainConfig, block *types.Block, senders []common.Address) (types.Receipts, error) {
 	if cached := rawdb.ReadReceipts(tx, block, senders); cached != nil {
 		return cached, nil
 	}
 
 	getHeader := func(hash common.Hash, number uint64) *types.Header {
-		return rawdb.ReadHeader(tx, hash, number)
+		h, e := api._blockReader.Header(ctx, tx, hash, number)
+		if e != nil {
+			log.Error("getHeader error", "number", number, "hash", hash, "err", e)
+		}
+		return h
 	}
 	contractHasTEVM := ethdb.GetHasTEVM(tx)
 	_, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, block.Hash(), 0)
@@ -310,7 +315,7 @@ func (api *APIImpl) GetTransactionReceipt(ctx context.Context, hash common.Hash)
 		return nil, nil
 	}
 
-	receipts, err := getReceipts(ctx, tx, cc, block, block.Body().SendersFromTxs())
+	receipts, err := api.getReceipts(ctx, tx, cc, block, block.Body().SendersFromTxs())
 	if err != nil {
 		return nil, fmt.Errorf("getReceipts error: %w", err)
 	}
@@ -344,7 +349,7 @@ func (api *APIImpl) GetBlockReceipts(ctx context.Context, number rpc.BlockNumber
 	if err != nil {
 		return nil, err
 	}
-	receipts, err := getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs())
+	receipts, err := api.getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs())
 	if err != nil {
 		return nil, fmt.Errorf("getReceipts error: %w", err)
 	}
diff --git a/cmd/rpcdaemon/commands/tracing.go b/cmd/rpcdaemon/commands/tracing.go
index 497ea6cef0e1c8c47d7bb34cb6a064d2d63aad17..26312b8a78d299839611fc2ca44033d4f527e082 100644
--- a/cmd/rpcdaemon/commands/tracing.go
+++ b/cmd/rpcdaemon/commands/tracing.go
@@ -18,6 +18,7 @@ import (
 	"github.com/ledgerwatch/erigon/rpc"
 	"github.com/ledgerwatch/erigon/turbo/rpchelper"
 	"github.com/ledgerwatch/erigon/turbo/transactions"
+	"github.com/ledgerwatch/log/v3"
 )
 
 // TraceBlockByNumber implements debug_traceBlockByNumber. Returns Geth style block traces.
@@ -63,7 +64,11 @@ func (api *PrivateDebugAPIImpl) traceBlock(ctx context.Context, blockNrOrHash rp
 	}
 
 	getHeader := func(hash common.Hash, number uint64) *types.Header {
-		return rawdb.ReadHeader(tx, hash, number)
+		h, e := api._blockReader.Header(ctx, tx, hash, number)
+		if e != nil {
+			log.Error("getHeader error", "number", number, "hash", hash, "err", e)
+		}
+		return h
 	}
 
 	_, blockCtx, _, ibs, reader, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, block.Hash(), 0)
diff --git a/cmd/state/commands/check_change_sets.go b/cmd/state/commands/check_change_sets.go
index 7667bc36d1a9782b8ac2a8605c3d7f33fc758f82..8137ea23a789cbfdd982394ef40cc0959bd693fd 100644
--- a/cmd/state/commands/check_change_sets.go
+++ b/cmd/state/commands/check_change_sets.go
@@ -17,7 +17,6 @@ import (
 	"github.com/ledgerwatch/erigon/common/changeset"
 	"github.com/ledgerwatch/erigon/common/dbutils"
 	"github.com/ledgerwatch/erigon/core"
-	"github.com/ledgerwatch/erigon/core/rawdb"
 	"github.com/ledgerwatch/erigon/core/state"
 	"github.com/ledgerwatch/erigon/core/types"
 	"github.com/ledgerwatch/erigon/core/vm"
@@ -31,9 +30,8 @@ import (
 )
 
 var (
-	historyfile   string
-	nocheck       bool
-	writeReceipts bool
+	historyfile string
+	nocheck     bool
 )
 
 func init() {
@@ -42,7 +40,6 @@ func init() {
 	withSnapshotBlocks(checkChangeSetsCmd)
 	checkChangeSetsCmd.Flags().StringVar(&historyfile, "historyfile", "", "path to the file where the changesets and history are expected to be. If omitted, the same as <datadir>/erion/chaindata")
 	checkChangeSetsCmd.Flags().BoolVar(&nocheck, "nocheck", false, "set to turn off the changeset checking and only execute transaction (for performance testing)")
-	checkChangeSetsCmd.Flags().BoolVar(&writeReceipts, "writeReceipts", false, "set to turn on writing receipts as the execution ongoing")
 	rootCmd.AddCommand(checkChangeSetsCmd)
 }
 
@@ -51,13 +48,13 @@ var checkChangeSetsCmd = &cobra.Command{
 	Short: "Re-executes historical transactions in read-only mode and checks that their outputs match the database ChangeSets",
 	RunE: func(cmd *cobra.Command, args []string) error {
 		logger := log.New()
-		return CheckChangeSets(genesis, logger, block, chaindata, historyfile, nocheck, writeReceipts)
+		return CheckChangeSets(genesis, logger, block, chaindata, historyfile, nocheck)
 	},
 }
 
 // CheckChangeSets re-executes historical transactions in read-only mode
 // and checks that their outputs match the database ChangeSets.
-func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, chaindata string, historyfile string, nocheck bool, writeReceipts bool) error {
+func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, chaindata string, historyfile string, nocheck bool) error {
 	if len(historyfile) == 0 {
 		historyfile = chaindata
 	}
@@ -150,7 +147,6 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64,
 		if b == nil {
 			break
 		}
-
 		reader := state.NewPlainState(historyTx, blockNum)
 		//reader.SetTrace(blockNum == uint64(block))
 		intraBlockState := state.New(reader)
@@ -162,22 +158,22 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64,
 			blockWriter = csw
 		}
 
-		getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(rwtx, hash, number) }
+		getHeader := func(hash common.Hash, number uint64) *types.Header {
+			h, e := blockReader.Header(ctx, rwtx, hash, number)
+			if e != nil {
+				panic(e)
+			}
+			return h
+		}
 		contractHasTEVM := ethdb.GetHasTEVM(rwtx)
 		receipts, err1 := runBlock(engine, intraBlockState, noOpWriter, blockWriter, chainConfig, getHeader, contractHasTEVM, b, vmConfig)
 		if err1 != nil {
 			return err1
 		}
-		if writeReceipts {
-			if chainConfig.IsByzantium(blockNum) {
-				receiptSha := types.DeriveSha(receipts)
-				if receiptSha != b.ReceiptHash() {
-					return fmt.Errorf("mismatched receipt headers for block %d", blockNum)
-				}
-			}
-
-			if err := rawdb.AppendReceipts(rwtx, blockNum, receipts); err != nil {
-				return err
+		if chainConfig.IsByzantium(blockNum) {
+			receiptSha := types.DeriveSha(receipts)
+			if receiptSha != b.ReceiptHash() {
+				return fmt.Errorf("mismatched receipt headers for block %d", blockNum)
 			}
 		}
 
@@ -274,32 +270,9 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64,
 		select {
 		case interrupt = <-interruptCh:
 			fmt.Println("interrupted, please wait for cleanup...")
-		case <-commitEvery.C:
-			if writeReceipts {
-				log.Info("Committing receipts", "up to block", b.NumberU64())
-				if err = rwtx.Commit(); err != nil {
-					return err
-				}
-				rwtx, err = chainDb.BeginRw(context.Background())
-				if err != nil {
-					return err
-				}
-				defer rwtx.Rollback()
-				historyTx.Rollback()
-				historyTx, err = historyDb.BeginRo(context.Background())
-				if err != nil {
-					return err
-				}
-			}
 		default:
 		}
 	}
-	if writeReceipts {
-		log.Info("Committing final receipts", "batch size")
-		if err = rwtx.Commit(); err != nil {
-			return err
-		}
-	}
 	log.Info("Checked", "blocks", blockNum, "next time specify --block", blockNum, "duration", time.Since(startTime))
 	return nil
 }