diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c
index 06ed76fdcc9ddd40cc45d40190e076559a39fe1b..7cdf46716cce5f35e6a0f393d734771cd5ca9950 100644
--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -1297,7 +1297,7 @@ static int detect_transition_to_still(
     int frame_interval,
     int still_interval,
     double loop_decay_rate,
-    double decay_accumulator )
+    double last_decay_rate )
 {
     BOOL trans_to_still = FALSE;
 
@@ -1306,12 +1306,12 @@ static int detect_transition_to_still(
     // instead of a clean scene cut.
     if ( (frame_interval > MIN_GF_INTERVAL) &&
          (loop_decay_rate >= 0.999) &&
-         (decay_accumulator < 0.9) )
+         (last_decay_rate < 0.9) )
     {
         int j;
         FIRSTPASS_STATS * position = cpi->twopass.stats_in;
         FIRSTPASS_STATS tmp_next_frame;
-        double decay_rate;
+        double zz_inter;
 
         // Look ahead a few frames to see if static condition
         // persists...
@@ -1320,8 +1320,9 @@ static int detect_transition_to_still(
             if (EOF == input_stats(cpi, &tmp_next_frame))
                 break;
 
-            decay_rate = get_prediction_decay_rate(cpi, &tmp_next_frame);
-            if ( decay_rate < 0.999 )
+            zz_inter =
+                (tmp_next_frame.pcnt_inter - tmp_next_frame.pcnt_motion);
+            if ( zz_inter < 0.999 )
                 break;
         }
         // Reset file position
@@ -1562,9 +1563,8 @@ static int calc_arf_boost(
     *b_boost = boost_score;
 
     arf_boost = (*f_boost + *b_boost);
-    arf_boost += ((b_frames + f_frames) * 25);
-    //if ( arf_boost < ((b_frames + f_frames) * 10) )
-    //     arf_boost = ((b_frames + f_frames) * 10);
+    if ( arf_boost < ((b_frames + f_frames) * 20) )
+         arf_boost = ((b_frames + f_frames) * 20);
 
     return arf_boost;
 }
@@ -1637,13 +1637,14 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
 
     double mv_ratio_accumulator = 0.0;
     double decay_accumulator = 1.0;
+    double zero_motion_accumulator = 1.0;
 
     double loop_decay_rate = 1.00;          // Starting decay rate
+    double last_loop_decay_rate = 1.00;
 
     double this_frame_mv_in_out = 0.0;
     double mv_in_out_accumulator = 0.0;
     double abs_mv_in_out_accumulator = 0.0;
-    double mod_err_per_mb_accumulator = 0.0;
 
     int max_bits = frame_max_bits(cpi);     // Max for a single frame
 
@@ -1692,9 +1693,6 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
 
         gf_group_err += mod_frame_err;
 
-        mod_err_per_mb_accumulator +=
-            mod_frame_err / DOUBLE_DIVIDE_CHECK((double)cpi->common.MBs);
-
         if (EOF == input_stats(cpi, &next_frame))
             break;
 
@@ -1710,30 +1708,33 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
         // Cumulative effect of prediction quality decay
         if ( !flash_detected )
         {
+            last_loop_decay_rate = loop_decay_rate;
             loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
             decay_accumulator = decay_accumulator * loop_decay_rate;
-            decay_accumulator =
-                decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
-        }
-        boost_score += decay_accumulator *
-                       calc_frame_boost( cpi, &next_frame,
-                                         this_frame_mv_in_out );
-
-        // Break clause to detect very still sections after motion
-        // For example a staic image after a fade or other transition.
-        if ( detect_transition_to_still( cpi, i, 5,
-                                         loop_decay_rate,
-                                         decay_accumulator ) )
-        {
-            allow_alt_ref = FALSE;
-            boost_score = old_boost_score;
-            break;
+
+            // Monitor for static sections.
+            zero_motion_accumulator *=
+                (next_frame.pcnt_inter - next_frame.pcnt_motion);
+
+            // Break clause to detect very still sections after motion
+            // (for example a staic image after a fade or other transition).
+            if ( detect_transition_to_still( cpi, i, 5, loop_decay_rate,
+                                             last_loop_decay_rate ) )
+            {
+                allow_alt_ref = FALSE;
+                break;
+            }
         }
 
+        // Calculate a boost number for this frame
+        boost_score +=
+            ( decay_accumulator *
+              calc_frame_boost( cpi, &next_frame, this_frame_mv_in_out ) );
+
         // Break out conditions.
         if  (
             // Break at cpi->max_gf_interval unless almost totally static
-            (i >= cpi->max_gf_interval && (decay_accumulator < 0.995)) ||
+            (i >= cpi->max_gf_interval && (zero_motion_accumulator < 0.995)) ||
             (
                 // Dont break out with a very short interval
                 (i > MIN_GF_INTERVAL) &&
@@ -1848,7 +1849,8 @@ static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
     cpi->twopass.modified_error_used += gf_group_err;
 
     // Assign  bits to the arf or gf.
-    for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++) {
+    for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++)
+    {
         int boost;
         int allocation_chunks;
         int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
@@ -2367,6 +2369,7 @@ static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
     FIRSTPASS_STATS *start_position;
 
     double decay_accumulator = 1.0;
+    double zero_motion_accumulator = 1.0;
     double boost_score = 0;
     double old_boost_score = 0.0;
     double loop_decay_rate;
@@ -2568,6 +2571,10 @@ static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
         if (r > RMAX)
             r = RMAX;
 
+        // Monitor for static sections.
+        zero_motion_accumulator *=
+            (next_frame.pcnt_inter - next_frame.pcnt_motion);
+
         // How fast is prediction quality decaying
         loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
 
@@ -2652,7 +2659,7 @@ static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
         // spend almost all of the bits on the key frame.
         // cpi->twopass.frames_to_key-1 because key frame itself is taken
         // care of by kf_boost.
-        if ( decay_accumulator >= 0.99 )
+        if ( zero_motion_accumulator >= 0.99 )
         {
             allocation_chunks =
                 ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost;