diff --git a/cmd/geth/dao_test.go b/cmd/geth/dao_test.go
index 59730b17f57ed533e75ff75d991150094c5152ba..56e77ba0b7be80c7dc5d9c4186ca1f3903253bc6 100644
--- a/cmd/geth/dao_test.go
+++ b/cmd/geth/dao_test.go
@@ -116,19 +116,19 @@ func TestDAOInitOldPrivnet(t *testing.T) {
 	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{}, nil, false)
 }
 func TestDAODefaultOldPrivnet(t *testing.T) {
-	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{false, false}}, params.MainNetDAOForkBlock, true)
+	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{false, false}}, nil, false)
 }
 func TestDAOSupportOldPrivnet(t *testing.T) {
-	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{true, false}}, params.MainNetDAOForkBlock, true)
+	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{true, false}}, nil, true)
 }
 func TestDAOOpposeOldPrivnet(t *testing.T) {
-	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{false, true}}, params.MainNetDAOForkBlock, false)
+	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{false, true}}, nil, false)
 }
 func TestDAOSwitchToSupportOldPrivnet(t *testing.T) {
-	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{false, true}, {true, false}}, params.MainNetDAOForkBlock, true)
+	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{false, true}, {true, false}}, nil, true)
 }
 func TestDAOSwitchToOpposeOldPrivnet(t *testing.T) {
-	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{true, false}, {false, true}}, params.MainNetDAOForkBlock, false)
+	testDAOForkBlockNewChain(t, false, daoOldGenesis, [][2]bool{{true, false}, {false, true}}, nil, false)
 }
 func TestDAOInitNoForkPrivnet(t *testing.T) {
 	testDAOForkBlockNewChain(t, false, daoNoForkGenesis, [][2]bool{}, daoGenesisForkBlock, false)
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 71777ce605f561e46967b4fd3ea6c36f5d5c33b7..6c627ddcf34df6947beea8bfc2a2d703c93d3f72 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -781,34 +781,43 @@ func MakeChainConfigFromDb(ctx *cli.Context, db ethdb.Database) *core.ChainConfi
 			Fatalf("Could not make chain configuration: %v", err)
 		}
 	}
-	// Set any missing fields due to them being unset or system upgrade
-	if config.HomesteadBlock == nil {
-		if ctx.GlobalBool(TestNetFlag.Name) {
-			config.HomesteadBlock = params.TestNetHomesteadBlock
-		} else {
-			config.HomesteadBlock = params.MainNetHomesteadBlock
+	// Check whether we are allowed to set default config params or not:
+	//  - If no genesis is set, we're running either mainnet or testnet (private nets use `geth init`)
+	//  - If a genesis is already set, ensure we have a configuration for it (mainnet or testnet)
+	defaults := genesis == nil ||
+		(genesis.Hash() == params.MainNetGenesisHash && !ctx.GlobalBool(TestNetFlag.Name)) ||
+		(genesis.Hash() == params.TestNetGenesisHash && ctx.GlobalBool(TestNetFlag.Name))
+
+	// Set any missing chainConfig fields due to them being unset or system upgrade
+	if defaults {
+		if config.HomesteadBlock == nil {
+			if ctx.GlobalBool(TestNetFlag.Name) {
+				config.HomesteadBlock = params.TestNetHomesteadBlock
+			} else {
+				config.HomesteadBlock = params.MainNetHomesteadBlock
+			}
 		}
-	}
-	if config.DAOForkBlock == nil {
-		if ctx.GlobalBool(TestNetFlag.Name) {
-			config.DAOForkBlock = params.TestNetDAOForkBlock
-		} else {
-			config.DAOForkBlock = params.MainNetDAOForkBlock
+		if config.DAOForkBlock == nil {
+			if ctx.GlobalBool(TestNetFlag.Name) {
+				config.DAOForkBlock = params.TestNetDAOForkBlock
+			} else {
+				config.DAOForkBlock = params.MainNetDAOForkBlock
+			}
+			config.DAOForkSupport = true
 		}
-		config.DAOForkSupport = true
-	}
-	if config.HomesteadGasRepriceBlock == nil {
-		if ctx.GlobalBool(TestNetFlag.Name) {
-			config.HomesteadGasRepriceBlock = params.TestNetHomesteadGasRepriceBlock
-		} else {
-			config.HomesteadGasRepriceBlock = params.MainNetHomesteadGasRepriceBlock
+		if config.HomesteadGasRepriceBlock == nil {
+			if ctx.GlobalBool(TestNetFlag.Name) {
+				config.HomesteadGasRepriceBlock = params.TestNetHomesteadGasRepriceBlock
+			} else {
+				config.HomesteadGasRepriceBlock = params.MainNetHomesteadGasRepriceBlock
+			}
 		}
-	}
-	if config.HomesteadGasRepriceHash == (common.Hash{}) {
-		if ctx.GlobalBool(TestNetFlag.Name) {
-			config.HomesteadGasRepriceHash = params.TestNetHomesteadGasRepriceHash
-		} else {
-			config.HomesteadGasRepriceHash = params.MainNetHomesteadGasRepriceHash
+		if config.HomesteadGasRepriceHash == (common.Hash{}) {
+			if ctx.GlobalBool(TestNetFlag.Name) {
+				config.HomesteadGasRepriceHash = params.TestNetHomesteadGasRepriceHash
+			} else {
+				config.HomesteadGasRepriceHash = params.MainNetHomesteadGasRepriceHash
+			}
 		}
 	}
 	// Force override any existing configs if explicitly requested
diff --git a/core/block_validator.go b/core/block_validator.go
index 3f5aa10ffdd2a01688720490252ddf27d9e0609c..1bb1a9713cc0809ba142e6aefd4d8245cd787319 100644
--- a/core/block_validator.go
+++ b/core/block_validator.go
@@ -253,7 +253,7 @@ func ValidateHeader(config *ChainConfig, pow pow.PoW, header *types.Header, pare
 	}
 	if config.HomesteadGasRepriceBlock != nil && config.HomesteadGasRepriceBlock.Cmp(header.Number) == 0 {
 		if config.HomesteadGasRepriceHash != (common.Hash{}) && config.HomesteadGasRepriceHash != header.Hash() {
-			return ValidationError("Homestead gas reprice fork hash mismatch: have 0x%x, want 0x%x", header.Hash(), config.HomesteadGasRepriceBlock)
+			return ValidationError("Homestead gas reprice fork hash mismatch: have 0x%x, want 0x%x", header.Hash(), config.HomesteadGasRepriceHash)
 		}
 	}
 	return nil
diff --git a/params/util.go b/params/util.go
index bd0cff7e81151ba3d8105691b3b2f75a1b2c9a1d..63f571a17e783d8f2b56ccf21555c8c6cc66cf6b 100644
--- a/params/util.go
+++ b/params/util.go
@@ -23,6 +23,9 @@ import (
 )
 
 var (
+	TestNetGenesisHash = common.HexToHash("0x0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303") // Testnet genesis hash to enforce below configs on
+	MainNetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") // Mainnet genesis hash to enforce below configs on
+
 	TestNetHomesteadBlock = big.NewInt(494000)  // Testnet homestead block
 	MainNetHomesteadBlock = big.NewInt(1150000) // Mainnet homestead block