diff --git a/cmd/integration/commands/flags.go b/cmd/integration/commands/flags.go
index 255c7511ed07bc4f1699c9e1d94c77db4b070a79..aaca78f33f9f350e6420948d08ac011fd1914324 100644
--- a/cmd/integration/commands/flags.go
+++ b/cmd/integration/commands/flags.go
@@ -31,6 +31,7 @@ var (
 	file               string
 	txtrace            bool // Whether to trace the execution (should only be used together eith `block`)
 	storageMode        string
+	chain              string // Which chain to use (mainnet, ropsten, rinkeby, goerli, etc.)
 )
 
 func must(err error) {
@@ -132,3 +133,7 @@ func withSilkworm(cmd *cobra.Command) {
 func withTxTrace(cmd *cobra.Command) {
 	cmd.Flags().BoolVar(&txtrace, "txtrace", false, "enable tracing of transactions")
 }
+
+func withChain(cmd *cobra.Command) {
+	cmd.Flags().StringVar(&chain, "chain", "", "pick a chain to assume (mainnet, ropsten, etc.)")
+}
diff --git a/cmd/integration/commands/stages.go b/cmd/integration/commands/stages.go
index e793cbd7074c080ecac892da3d18fc05ebbbec57..c5986e07f8838b454839ad7623fbfc9722ad1f6c 100644
--- a/cmd/integration/commands/stages.go
+++ b/cmd/integration/commands/stages.go
@@ -268,6 +268,7 @@ func init() {
 	withBatchSize(cmdStageExec)
 	withSilkworm(cmdStageExec)
 	withTxTrace(cmdStageExec)
+	withChain(cmdStageExec)
 
 	rootCmd.AddCommand(cmdStageExec)
 
@@ -276,6 +277,7 @@ func init() {
 	withBlock(cmdStageHashState)
 	withUnwind(cmdStageHashState)
 	withBatchSize(cmdStageHashState)
+	withChain(cmdStageHashState)
 
 	rootCmd.AddCommand(cmdStageHashState)
 
@@ -284,6 +286,7 @@ func init() {
 	withBlock(cmdStageTrie)
 	withUnwind(cmdStageTrie)
 	withIntegrityChecks(cmdStageTrie)
+	withChain(cmdStageTrie)
 
 	rootCmd.AddCommand(cmdStageTrie)
 
@@ -776,13 +779,31 @@ func newSync(db ethdb.RwKV) (ethdb.StorageMode, consensus.Engine, *params.ChainC
 		panic(err)
 	}
 	vmConfig := &vm.Config{NoReceipts: !sm.Receipts}
-	chainConfig := params.MainnetChainConfig
+	var chainConfig *params.ChainConfig
+	var genesis *core.Genesis
+	switch chain {
+	case "", params.MainnetChainName:
+		chainConfig = params.MainnetChainConfig
+		genesis = core.DefaultGenesisBlock()
+	case params.RopstenChainName:
+		chainConfig = params.RopstenChainConfig
+		genesis = core.DefaultRopstenGenesisBlock()
+	case params.GoerliChainName:
+		chainConfig = params.GoerliChainConfig
+		genesis = core.DefaultGoerliGenesisBlock()
+	case params.RinkebyChainName:
+		chainConfig = params.RinkebyChainConfig
+		genesis = core.DefaultRinkebyGenesisBlock()
+	case params.BaikalChainName:
+		chainConfig = params.BaikalChainConfig
+		genesis = core.DefaultBaikalGenesisBlock()
+	}
 	events := remotedbserver.NewEvents()
 
 	txCacher := core.NewTxSenderCacher(1)
 	txPool := core.NewTxPool(ethconfig.Defaults.TxPool, chainConfig, ethdb.NewObjectDatabase(db), txCacher)
 
-	chainConfig, genesis, genesisErr := core.SetupGenesisBlock(ethdb.NewObjectDatabase(db), core.DefaultGenesisBlock(), sm.History)
+	chainConfig, genesisBlock, genesisErr := core.SetupGenesisBlock(ethdb.NewObjectDatabase(db), genesis, sm.History)
 	if _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok {
 		panic(genesisErr)
 	}
@@ -794,7 +815,7 @@ func newSync(db ethdb.RwKV) (ethdb.StorageMode, consensus.Engine, *params.ChainC
 
 	engine := ethash.NewFaker()
 	blockDownloaderWindow := 65536
-	downloadServer, err := download.NewControlServer(db, "", chainConfig, genesis.Hash(), engine, 1, nil, blockDownloaderWindow)
+	downloadServer, err := download.NewControlServer(db, "", chainConfig, genesisBlock.Hash(), engine, 1, nil, blockDownloaderWindow)
 	if err != nil {
 		panic(err)
 	}
diff --git a/core/state_transition.go b/core/state_transition.go
index 6800f2173e32585f0ca18f791d9c7cc1eac009d3..fee6cb673899290dbe952785752a0abdf2d114fb 100644
--- a/core/state_transition.go
+++ b/core/state_transition.go
@@ -192,12 +192,7 @@ func (st *StateTransition) to() common.Address {
 }
 
 func (st *StateTransition) buyGas(gasBailout bool) error {
-	price := st.gasPrice
-	if st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) {
-		// price = min(tip, feeCap - baseFee) + baseFee
-		price = cmath.Min256(new(uint256.Int).Add(st.tip, st.evm.Context.BaseFee), st.feeCap)
-	}
-	mgval := new(big.Int).Mul(new(big.Int).SetUint64(st.msg.Gas()), price.ToBig())
+	mgval := new(big.Int).Mul(new(big.Int).SetUint64(st.msg.Gas()), st.gasPrice.ToBig())
 	gasCost, overflow := uint256.FromBig(mgval)
 	if have, want := st.state.GetBalance(st.msg.From()), mgval; overflow || st.state.GetBalance(st.msg.From()).Lt(gasCost) {
 		if !gasBailout {
@@ -344,12 +339,7 @@ func (st *StateTransition) refundGas(refundQuotient uint64) {
 	st.gas += refund
 
 	// Return ETH for remaining gas, exchanged at the original rate.
-	price := st.gasPrice
-	if st.evm.ChainConfig().IsLondon(st.evm.Context.BlockNumber) {
-		// price = min(tip, feeCap - baseFee) + baseFee
-		price = cmath.Min256(new(uint256.Int).Add(st.tip, st.evm.Context.BaseFee), st.feeCap)
-	}
-	remaining := new(uint256.Int).Mul(new(uint256.Int).SetUint64(st.gas), price)
+	remaining := new(uint256.Int).Mul(new(uint256.Int).SetUint64(st.gas), st.gasPrice)
 	st.state.AddBalance(st.msg.From(), remaining)
 
 	// Also return remaining gas to the block gas counter so it is
diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go
index 8e2bb21ef3bfb41244484045587da17b17c9893c..17afc897cbb0f59556408ea47545520a02389081 100644
--- a/core/vm/jump_table.go
+++ b/core/vm/jump_table.go
@@ -74,6 +74,7 @@ type JumpTable [256]*operation
 // contantinople, istanbul, petersburg, berlin, and london instructions.
 func newLondonInstructionSet() JumpTable {
 	instructionSet := newBerlinInstructionSet()
+	enable3529(&instructionSet) // EIP-3529: Reduction in refunds https://eips.ethereum.org/EIPS/eip-3529
 	enable3198(&instructionSet) // Base fee opcode https://eips.ethereum.org/EIPS/eip-3198
 	return instructionSet
 }