diff --git a/js/spniCore.js b/js/spniCore.js
index 0dc389a35db9b04613a7a928bbddb082d07ebffd..493c3cf3f8c1156e8eb2750bc2d324b7f38957db 100644
--- a/js/spniCore.js
+++ b/js/spniCore.js
@@ -108,18 +108,6 @@ $previousScreen = null;
  * xml (jQuery object), the player's loaded XML file.
  ************************************************************/
 function createNewPlayer (id, first, last, labels, gender, size, intelligence, timer, tags, xml) {
-    var player_imgs = [];
-    if(xml) {
-        xml.find("state").each(function () {
-            var img = 'opponents/'+id+'/'+$(this).attr('img');
-            if($.inArray(img, player_imgs) === -1) {
-                player_imgs.push(img);
-            }
-        });
-        
-        console.log("Found "+player_imgs.length.toString()+" unique image files for "+id+"...");
-    }
-    
     var newPlayerObject = {id:id,
                            folder:'opponents/'+id+'/',
 						   first:first,
@@ -131,8 +119,17 @@ function createNewPlayer (id, first, last, labels, gender, size, intelligence, t
                            timer:timer,
                            tags:tags,
                            xml:xml,
-                           image_set: player_imgs,
-
+                           
+                           getImagesForStage: function(stage) {
+                               if(!this.xml) return [];
+                               
+                               var imageSet = {};
+                               var folder = this.folder;
+                               this.xml.find('stage[id="'+stage+'"] state').each(function () {
+                                   imageSet[folder+$(this).attr('img')] = true;
+                               });
+                               return Object.keys(imageSet);
+                           },
                            getByStage: function (arr) {
                                if (typeof(arr) === "string") {
                                    return arr;
diff --git a/js/spniGame.js b/js/spniGame.js
index 0a6d9c013ecdb47ef5bb6b57b6d80df2d70e692b..b7bdd507f5613f9bf7362f78ac17ad5f593b3ae0 100644
--- a/js/spniGame.js
+++ b/js/spniGame.js
@@ -553,6 +553,15 @@ function completeRevealPhase () {
             $gameLabels[i].css({"background-color" : clearColour});
         }
     }
+    
+    if(sw_is_available() && recentLoser != HUMAN_PLAYER) {
+        /* Begin preloading images used by the loser for the stage after next. */
+        var loadStage = players[recentLoser].stage+2;
+        var images = players[recentLoser].getImagesForStage(loadStage);
+        console.log("Preloading "+images.length.toString()+" image files from "+players[recentLoser].folder+" for stage "+loadStage.toString()+"...");
+        
+        request_url_caching(images);
+    }
 
     /* set up the main button */
 	if (recentLoser != HUMAN_PLAYER && clothes > 0) {
diff --git a/js/spniSelect.js b/js/spniSelect.js
index 36516759554793953b6172e5f704931eedf6500b..eebba9d296a9251a296c943491470f48d95faad7 100644
--- a/js/spniSelect.js
+++ b/js/spniSelect.js
@@ -916,21 +916,18 @@ function advanceSelectScreen () {
     console.log("Starting game...");
 
     if(sw_is_available()) {
-        /* Ask SW to preload all unique image files for all characters in the game. */
-        var player_imgs = [];
-        
+        /* Ask SW to preload stage 0 and stage 1 images for all characters in the game. */
         for(var i=0;i<players.length;i++) {
             if(!players[i]) {
                 continue;
             }
 
-        	if (players[i].image_set.length <= 0) {
-                continue;
-            }
+        	var images = players[i].getImagesForStage(0);
+            images.concat(players[i].getImagesForStage(1));
 
-            console.log("Preloading "+players[i].image_set.length.toString()+" image files from "+players[i].folder+" ...");
+            console.log("Preloading "+images.length.toString()+" image files from "+players[i].folder+" stages 0 and 1...");
             
-            request_url_caching(players[i].image_set);
+            request_url_caching(images);
         }
     }