     {
         _resStartTime = getTimer();
 
-        var blocks :Set = getBaseBlocks();
+        // 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)) {
-                var sceneBlock :SceneBlock = createSceneBlock(blockKey);
-                _pendingBlocks.add(sceneBlock);
-                sceneBlock.resolve(_ctx, _model, thisRef, blockResolved);
+                if (_prefetchedBlocks.containsKey(blockKey)) {
+                    _readyBlocks.add(_prefetchedBlocks.remove(blockKey));
+                } else {
+                    var sceneBlock :SceneBlock = createSceneBlock(blockKey);
+                    _pendingBlocks.add(sceneBlock);
+                    sceneBlock.resolve(_ctx, _model, thisRef, blockResolved);
+                }
             }
         });
 

        var xMove :int = (_pendingMoveBy == null ? 0 : _pendingMoveBy.x);
        var yMove :int = (_pendingMoveBy == null ? 0 : _pendingMoveBy.y);

        var minX :int = xMove;
        var maxX :int = size.x + xMove;
        var minY :int = yMove;
        var maxY :int = BOTTOM_BUFFER + size.y + yMove;

        var topLeft :Point = _isoView.localToIso(new Point(minX, minY));
        var topRight :Point = _isoView.localToIso(new Point(maxX, minY));

            _masks);
    }

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

