diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
index 6010309a2a0ce6f2dfe60d784921c7b788c2b61c..7b6ba5c3cd671563bd1c566ecce258e18863fb46 100644
--- a/Godeps/Godeps.json
+++ b/Godeps/Godeps.json
@@ -20,8 +20,8 @@
 		},
 		{
 			"ImportPath": "github.com/ethereum/ethash",
-			"Comment": "v23.1-240-ga524c9f",
-			"Rev": "a524c9f7d55cb8925567dc201b44ba555862056d"
+			"Comment": "v23.1-242-gbc9ba4d",
+			"Rev": "bc9ba4d6a83a0fe308fefd8c6001b8ed1607137f"
 		},
 		{
 			"ImportPath": "github.com/fatih/color",
diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
index ad59dd5e3e3149d80cdb58575702b746069c77d7..60121bb3bb0a1351116125ec5236af35cd5264f3 100644
--- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
+++ b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go
@@ -108,10 +108,13 @@ func freeCache(cache *cache) {
 // Light implements the Verify half of the proof of work. It uses a few small
 // in-memory caches to verify the nonces found by Full.
 type Light struct {
-	test      bool              // if set use a smaller cache size
-	mu        sync.Mutex        // protects the per-epoch map of DAGs
-	caches    map[uint64]*cache // currently cached verification DAGs
-	NumCaches int               // Maximum number of DAGs to cache before eviction (only init, don't modify)
+	test bool // If set, use a smaller cache size
+
+	mu     sync.Mutex        // Protects the per-epoch map of verification caches
+	caches map[uint64]*cache // Currently maintained verification caches
+	future *cache            // Pre-generated cache for the estimated future DAG
+
+	NumCaches int // Maximum number of caches to keep before eviction (only init, don't modify)
 }
 
 // Verify checks whether the block's nonce is valid.
@@ -192,12 +195,25 @@ func (l *Light) getCache(blockNum uint64) *cache {
 					evict = cache
 				}
 			}
-			glog.V(logger.Info).Infof("Evicting DAG for epoch %d in favour of epoch %d", evict.epoch, epoch)
+			glog.V(logger.Debug).Infof("Evicting DAG for epoch %d in favour of epoch %d", evict.epoch, epoch)
 			delete(l.caches, evict.epoch)
 		}
-		// Create and return a new DAG for the epoch
-		c = &cache{epoch: epoch, test: l.test}
+		// If we have the new DAG pre-generated, use that, otherwise create a new one
+		if l.future != nil && l.future.epoch == epoch {
+			glog.V(logger.Debug).Infof("Using pre-generated DAG for epoch %d", epoch)
+			c, l.future = l.future, nil
+		} else {
+			glog.V(logger.Debug).Infof("No pre-generated DAG available, creating new for epoch %d", epoch)
+			c = &cache{epoch: epoch, test: l.test}
+		}
 		l.caches[epoch] = c
+
+		// If we just used up the future cache, or need a refresh, regenerate
+		if l.future == nil || l.future.epoch <= epoch {
+			glog.V(logger.Debug).Infof("Pre-generating DAG for epoch %d", epoch+1)
+			l.future = &cache{epoch: epoch + 1, test: l.test}
+			go l.future.generate()
+		}
 	}
 	c.used = time.Now()
 	l.mu.Unlock()