diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go
index d7cdf1064f957d3688a484d4938709b54772cfbf..c41375c4d0e6a46b91ebdddb632b6125dfc6d724 100644
--- a/cmd/geth/chaincmd.go
+++ b/cmd/geth/chaincmd.go
@@ -99,6 +99,7 @@ func importChain(ctx *cli.Context) error {
 			utils.Fatalf("Failed to read database stats: %v", err)
 		}
 		fmt.Println(stats)
+		fmt.Printf("Trie cache misses: %d\n\n", trie.CacheMisses())
 
 		// Compact the entire database to more accurately measure disk io and print the stats
 		start = time.Now()
@@ -113,7 +114,6 @@ func importChain(ctx *cli.Context) error {
 			utils.Fatalf("Failed to read database stats: %v", err)
 		}
 		fmt.Println(stats)
-		fmt.Println("Trie cache misses:", trie.CacheMisses())
 	}
 	return nil
 }
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 65311ca418de5235d002082618da3b0931810f3e..ccc42d3cf13df658d7d8332eee0a943502457d41 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -134,8 +134,9 @@ participating.
 		utils.KeyStoreDirFlag,
 		utils.OlympicFlag,
 		utils.FastSyncFlag,
-		utils.CacheFlag,
 		utils.LightKDFFlag,
+		utils.CacheFlag,
+		utils.TrieCacheGenFlag,
 		utils.JSpathFlag,
 		utils.ListenPortFlag,
 		utils.MaxPeersFlag,
diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go
index dc1788aad2731b24dc31263bd52b414bd9f79c13..2cb6e77e8608e3ff1aed20762ad69fd186ce899d 100644
--- a/cmd/geth/usage.go
+++ b/cmd/geth/usage.go
@@ -73,7 +73,13 @@ var AppHelpFlagGroups = []flagGroup{
 			utils.IdentityFlag,
 			utils.FastSyncFlag,
 			utils.LightKDFFlag,
+		},
+	},
+	{
+		Name: "PERFORMANCE TUNING",
+		Flags: []cli.Flag{
 			utils.CacheFlag,
+			utils.TrieCacheGenFlag,
 		},
 	},
 	{
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 0c5206a17adeea47ceed743c8cee9c24ba4593c8..1859f735d6bf7378b95e590e96f26ee914868be0 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -141,11 +141,6 @@ var (
 		Usage: "Document Root for HTTPClient file scheme",
 		Value: DirectoryString{homeDir()},
 	}
-	CacheFlag = cli.IntFlag{
-		Name:  "cache",
-		Usage: "Megabytes of memory allocated to internal caching (min 16MB / database forced)",
-		Value: 128,
-	}
 	FastSyncFlag = cli.BoolFlag{
 		Name:  "fast",
 		Usage: "Enable fast syncing through state downloads",
@@ -154,6 +149,17 @@ var (
 		Name:  "lightkdf",
 		Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength",
 	}
+	// Performance tuning settings
+	CacheFlag = cli.IntFlag{
+		Name:  "cache",
+		Usage: "Megabytes of memory allocated to internal caching (min 16MB / database forced)",
+		Value: 128,
+	}
+	TrieCacheGenFlag = cli.IntFlag{
+		Name:  "trie-cache-gens",
+		Usage: "Number of trie node generations to keep in memory",
+		Value: int(state.MaxTrieCacheGen),
+	}
 	// Fork settings
 	SupportDAOFork = cli.BoolFlag{
 		Name:  "support-dao-fork",
@@ -721,6 +727,10 @@ func RegisterEthService(ctx *cli.Context, stack *node.Node, extra []byte) {
 		}
 		ethConf.PowTest = true
 	}
+	// Override any global options pertaining to the Ethereum protocol
+	if gen := ctx.GlobalInt(TrieCacheGenFlag.Name); gen > 0 {
+		state.MaxTrieCacheGen = uint16(gen)
+	}
 
 	if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
 		return eth.New(ctx, ethConf)
diff --git a/core/state/statedb.go b/core/state/statedb.go
index 0e46e5e2cb1e774d8f573e8c0fe6219bec628cea..6a24d2865e49a2b8f416f3c1ffbf3defd370bcb1 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -38,14 +38,14 @@ import (
 // created.
 var StartingNonce uint64
 
+// Trie cache generation limit after which to evic trie nodes from memory.
+var MaxTrieCacheGen = uint16(120)
+
 const (
 	// Number of past tries to keep. This value is chosen such that
 	// reasonable chain reorg depths will hit an existing trie.
 	maxPastTries = 12
 
-	// Trie cache generation limit.
-	maxTrieCacheGen = 120
-
 	// Number of codehash->size associations to keep.
 	codeSizeCacheSize = 100000
 )
@@ -89,7 +89,7 @@ type StateDB struct {
 
 // Create a new state from a given trie
 func New(root common.Hash, db ethdb.Database) (*StateDB, error) {
-	tr, err := trie.NewSecure(root, db, maxTrieCacheGen)
+	tr, err := trie.NewSecure(root, db, MaxTrieCacheGen)
 	if err != nil {
 		return nil, err
 	}
@@ -158,7 +158,7 @@ func (self *StateDB) openTrie(root common.Hash) (*trie.SecureTrie, error) {
 			return &tr, nil
 		}
 	}
-	return trie.NewSecure(root, self.db, maxTrieCacheGen)
+	return trie.NewSecure(root, self.db, MaxTrieCacheGen)
 }
 
 func (self *StateDB) pushTrie(t *trie.SecureTrie) {