         }
 
         // Now, take out any old blocks no longer in our valid blocks.
-        var blocks :Set = getBaseBlocks();
+        var blocks :Set = getBaseBlocks(true);
         for each (var baseKey :int in _blocks.keys()) {
             if (!blocks.contains(baseKey)) {
                 _blocks.remove(baseKey).release();
             }
         }
+        // And any prefetch blocks that are bogus can go away too.
+        for each (var preKey :int in _prefetchedBlocks.keys()) {
+            if (!blocks.contains(preKey)) {
+                _prefetchedBlocks.remove(preKey);
+            }
+        }
 
         trace("Scene Block Resolution took: " + (getTimer() - _resStartTime) + "ms");
+
+        // Let's setup some prefetching...
+        blocks.forEach(function(blockKey :int) :void {
+            if (!_blocks.containsKey(blockKey)) {
+                var sceneBlock :SceneBlock = createSceneBlock(blockKey);
+                _pendingPrefetchBlocks.push(sceneBlock);
+            }
+        });
+
+        maybePrefetchABlock();
+    }
+
+    protected function maybePrefetchABlock () :void
+    {
+        if (_pendingPrefetchBlocks.length != 0) {
+            _pendingPrefetchBlocks.shift().resolve(_ctx, _model, this, prefetchBlockResolved);
+        }
+    }
+
+    protected function prefetchBlockResolved (resolved :SceneBlock) :void
+    {
+        _prefetchedBlocks.put(resolved.getKey(), resolved);
+
+        // If we haven't moved on to resolve a new region, let's try another block.
+        if (_pendingBlocks.size() == 0) {
+            DelayUtil.delayFrame(function() :void {
+                maybePrefetchABlock();
+            });
+        }
     }
 
     protected function refreshScene () :void

            _masks);
    }

    protected function getBaseBlocks () :Set
    {
        var blocks :Set = Sets.newSetOf(int);


    {
        _resStartTime = getTimer();

        // Clear em til we're done resolving.
        _pendingPrefetchBlocks = [];

        var blocks :Set = getBaseBlocks(false);

        // Keep this to use in our function...
        var thisRef :MisoScenePanel = this;

        // Postpone calling complete til they're all queued up.
        _skipComplete = true;

        blocks.forEach(function(blockKey :int) :void {
            if (!_blocks.containsKey(blockKey)) {
                if (_prefetchedBlocks.containsKey(blockKey)) {
                    _readyBlocks.add(_prefetchedBlocks.remove(blockKey));
                } else {
                    var sceneBlock :SceneBlock = createSceneBlock(blockKey);
                    _pendingBlocks.add(sceneBlock);
                    sceneBlock.resolve(_ctx, _model, thisRef, blockResolved);
                }
            }
        });

