     heroInfo = temporaryHeroInfo[hero.get('slug')]
     locked = heroInfo.status is 'Locked'
     hero = @loadHero hero, heroIndex
+    @preloadHero heroIndex + 1
+    @preloadHero heroIndex - 1
     @selectedHero = hero unless locked
     Backbone.Mediator.publish 'level:hero-selection-updated', hero: @selectedHero
     $('#choose-inventory-button').prop 'disabled', locked
 
-  loadHero: (hero, heroIndex) ->
+  getFullHero: (original) ->
+    url = "/db/thang.type/#{original}/version"
+    if fullHero = @supermodel.getModel url
+      return fullHero
+    fullHero = new ThangType()
+    fullHero.setURL url
+    fullHero = (@supermodel.loadModel fullHero, 'thang').model
+    fullHero
+
+  preloadHero: (heroIndex) ->
+    return unless hero = @heroes.models[heroIndex]
+    @loadHero hero, heroIndex, true
+
+  loadHero: (hero, heroIndex, preloading=false) ->
     createjs.Ticker.removeEventListener 'tick', stage for stage in _.values @stages
     if stage = @stages[heroIndex]
-      createjs.Ticker.addEventListener 'tick', stage
-      @playSelectionSound hero
+      unless preloading
+        _.defer -> createjs.Ticker.addEventListener 'tick', stage  # Deferred, otherwise it won't start updating for some reason.
+        @playSelectionSound hero
       return hero
-    fullHero = new ThangType()
-    fullHero.setURL "/db/thang.type/#{hero.get('original')}/version"
-    fullHero = (@supermodel.loadModel fullHero, 'thang').model
+    fullHero = @getFullHero hero.get 'original'
     onLoaded = =>
       return unless canvas = $(".hero-item[data-hero-id='#{fullHero.get('original')}'] canvas")
       canvas.prop width: @canvasWidth, height: @canvasHeight

      movieClip.x = canvas.prop('width') * 0.5
      movieClip.y = canvas.prop('height') * 0.925  # This is where the feet go.
      stage = new createjs.Stage(canvas[0])
      stage.addChild movieClip
      stage.update()
      createjs.Ticker.addEventListener 'tick', stage
      movieClip.gotoAndPlay 0
      @stages[heroIndex] = stage
      @playSelectionSound hero
    if fullHero.loaded
      _.defer onLoaded
    else

    direction = e.direction  # 'left' or 'right'
    heroItem = $(e.relatedTarget)
    hero = _.find @heroes.models, (hero) -> hero.get('original') is heroItem.data('hero-id')
    return console.error "Couldn't find hero from heroItem:", heroItem unless hero
    heroIndex = heroItem.index()
    @$el.find('.hero-indicator').each ->
      distance = Math.min 3, Math.abs $(@).index() - heroIndex
