diff --git a/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js b/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js
index b53f42ab7c4ea046fabbdf9f842d62b056bca4d7..5f8f85b6f24f18fc5f30495af69a0ee3ce081615 100755
--- a/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js
+++ b/record-and-playback/presentation/playback/presentation/0.9.0/lib/writing.js
@@ -520,21 +520,26 @@ svgobj.setAttribute('data', shapes_svg);
 svgobj.setAttribute('height', '100%');
 svgobj.setAttribute('width', '100%');
 
-svgobj.addEventListener('load', function() {
-  console.log("got svgobj 'load' event");
+var setupWriting = function() {
   runPopcorn();
 
-  if (svjobjLoaded) {
-    return;
-  }
-  svjobjLoaded = true;
-
   generateThumbnails();
 
   var p = Popcorn("#video");
   p.currentTime(defineStartTime());
 
   removeLoadingScreen();
+}
+
+svgobj.addEventListener('load', function() {
+  console.log("got svgobj 'load' event");
+
+  if (svjobjLoaded) {
+    return;
+  }
+  svjobjLoaded = true;
+
+  window.await_video_loaded(setupWriting);
 }, false);
 
 // Fetches the metadata associated with the recording and uses it to configure
diff --git a/record-and-playback/presentation/playback/presentation/0.9.0/playback.js b/record-and-playback/presentation/playback/presentation/0.9.0/playback.js
index 7482f368876ca6c3faff1bc47157995c2e52d194..d87af1f4f8d7416a6e9768113228c186db50eaa0 100755
--- a/record-and-playback/presentation/playback/presentation/0.9.0/playback.js
+++ b/record-and-playback/presentation/playback/presentation/0.9.0/playback.js
@@ -422,6 +422,24 @@ load_spinner = function(){
   spinner = new Spinner(opts).spin(target);
 };
 
+var video_loaded_callbacks = [];
+var video_loaded = false;
+
+var notify_video_loaded = function() {
+  video_loaded = true;
+  for (i = 0; i < video_loaded_callbacks.length; i++) {
+    video_loaded_callbacks[i]();
+  }
+};
+window.await_video_loaded = function(callback) {
+  if (video_loaded) {
+    /* Video is already loaded, just immediately execute the callback */
+    callback();
+  } else {
+    video_loaded_callbacks.push(callback);
+  }
+}
+
 
 document.addEventListener("DOMContentLoaded", function() {
   console.log("==DOM content loaded");
@@ -433,6 +451,11 @@ document.addEventListener("DOMContentLoaded", function() {
     google_frame_warning();
   }
 
+  load_spinner();
+  console.log("==Hide playback content");
+  $("#playback-content").css('visibility', 'hidden');
+
+
   if (checkUrl(RECORDINGS + '/video/webcams.webm') == true) {
     hasVideo = true;
     $("#audio-area").attr("style", "display:none;");
@@ -443,10 +466,6 @@ document.addEventListener("DOMContentLoaded", function() {
     load_audio();
   }
 
-  load_spinner();
-  console.log("==Hide playback content");
-  $("#playback-content").css('visibility', 'hidden');
-
   //load up the acorn controls
   console.log("==Loading acorn media player ");
   $('#video').acornMediaPlayer({
@@ -457,6 +476,8 @@ document.addEventListener("DOMContentLoaded", function() {
     swapVideoPresentation();
   });
 
+  notify_video_loaded();
+
   resizeComponents();
 }, false);