diff --git a/src/input/input.cpp b/src/input/input.cpp
index 7e3c0542..1eb70743 100644
--- a/src/input/input.cpp
+++ b/src/input/input.cpp
@@ -784,14 +784,21 @@ namespace Mist {
     if (nProxy.isBuffered(track, keyNum)) {
       //get corresponding page number
       int pageNumber = 0;
+      int pageSize = 0;
       for (std::map<unsigned long, DTSCPageData>::iterator it = nProxy.pagesByTrack[track].begin(); it != nProxy.pagesByTrack[track].end(); it++) {
         if (it->first <= keyNum) {
           pageNumber = it->first;
+          pageSize = it->second.keyNum;
         } else {
           break;
         }
       }
       pageCounter[track][pageNumber] = 15;
+      //If we're less than 10% off from the next page, make sure the next is also buffered.
+      if (keyNum+pageSize/10 > pageNumber+pageSize){
+        MEDIUM_MSG("Pre-buffering next page! (%u+%u/10 > %u+%u)", keyNum, pageSize, pageNumber, pageSize);
+        return bufferFrame(track, pageNumber+pageSize+1);
+      }
       VERYHIGH_MSG("Track %u, key %u is already buffered in page %d. Cancelling bufferFrame", track, keyNum, pageNumber);
       return true;
     }
diff --git a/src/output/output.cpp b/src/output/output.cpp
index 7b484ea6..5da915cd 100644
--- a/src/output/output.cpp
+++ b/src/output/output.cpp
@@ -1576,7 +1576,7 @@ namespace Mist{
     }
 
     //when live, every keyframe, check correctness of the keyframe number
-    if (myMeta.live && thisPacket.getFlag("keyframe")){
+    if (thisPacket.getFlag("keyframe")){
       //cancel if not alive
       if (!nProxy.userClient.isAlive()){
         return false;
@@ -1585,7 +1585,7 @@ namespace Mist{
       //Failure here will cause tracks to drop due to inconsistent internal state.
       nxtKeyNum[nxt.tid] = getKeyForTime(nxt.tid, thisPacket.getTime());
       int counter = 0;
-      while(counter < 40 && myMeta.tracks[nxt.tid].getKey(nxtKeyNum[nxt.tid]).getTime() != thisPacket.getTime()){
+      while(myMeta.live && counter < 40 && myMeta.tracks[nxt.tid].getKey(nxtKeyNum[nxt.tid]).getTime() != thisPacket.getTime()){
         if (counter++){
           //Only sleep 250ms if this is not the first updatemeta try
           Util::wait(250);