diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c
index bf06f32e16bf852e6dbb137fc348791db2dffd7e..0a9f12a310c6ebec4cbce2435b700b802428c52d 100644
--- a/vp8/encoder/ratectrl.c
+++ b/vp8/encoder/ratectrl.c
@@ -222,9 +222,9 @@ void vp8_restore_coding_context(VP8_COMP *cpi)
 void vp8_setup_key_frame(VP8_COMP *cpi)
 {
     // Setup for Key frame:
-
     vp8_default_coef_probs(& cpi->common);
     vp8_kf_default_bmode_probs(cpi->common.kf_bmode_prob);
+    vp8_init_mbmode_probs(& cpi->common);
 
     vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
     {
@@ -263,6 +263,18 @@ void vp8_setup_key_frame(VP8_COMP *cpi)
     vpx_memcpy( cpi->common.vp8_mode_contexts,
                 default_vp8_mode_contexts,
                 sizeof(default_vp8_mode_contexts));
+
+    /* make sure coding_context is correct in key frame recode */
+    {
+        CODING_CONTEXT *const cc = & cpi->coding_context;
+
+        vp8_copy(cc->mvc,      cpi->common.fc.mvc);
+#if CONFIG_HIGH_PRECISION_MV
+        vp8_copy(cc->mvc_hp,      cpi->common.fc.mvc_hp);
+#endif
+        vp8_copy(cc->ymode_prob,   cpi->common.fc.ymode_prob);
+        vp8_copy(cc->uv_mode_prob,  cpi->common.fc.uv_mode_prob);
+    }
 }
 void vp8_setup_inter_frame(VP8_COMP *cpi)
 {