diff --git a/src/predict.rs b/src/predict.rs
index fc64bbcec9557d43436307169ecf733a4c76575a..723b9c780636258b2a879c9af0a7ba2e5d18d398 100755
--- a/src/predict.rs
+++ b/src/predict.rs
@@ -38,7 +38,6 @@ pub static RAV1E_INTRA_MODES_MINIMAL: &'static [PredictionMode] = &[
 
 pub static RAV1E_INTER_MODES: &'static [PredictionMode] = &[
   PredictionMode::GLOBALMV,
-  PredictionMode::DC_PRED,
 ];
 
 // Weights are quadratic from '1' to '1 / block_size', scaled by 2^sm_weight_log2_scale.
diff --git a/src/rdo.rs b/src/rdo.rs
index 1c01cd203445db3a3753bc74a2a4b0b7e2c227c0..69d7847578f5b40220d13b05450e3895e1f969a3 100755
--- a/src/rdo.rs
+++ b/src/rdo.rs
@@ -197,20 +197,26 @@ pub fn rdo_mode_decision(
   let cw_checkpoint = cw.checkpoint();
 
   // Exclude complex prediction modes at higher speed levels
-  let mode_set = if fi.frame_type == FrameType::INTER {
-    RAV1E_INTER_MODES
-  } else if fi.config.speed <= 3 {
+  let intra_mode_set = if (fi.frame_type == FrameType::KEY && fi.config.speed <= 3) ||
+                          (fi.frame_type == FrameType::INTER && fi.config.speed <= 1) {
     RAV1E_INTRA_MODES
   } else {
     RAV1E_INTRA_MODES_MINIMAL
   };
 
-  for &luma_mode in mode_set {
+  let mut mode_set: Vec<PredictionMode> = Vec::new();
+
+  if fi.frame_type == FrameType::INTER {
+    mode_set.extend_from_slice(RAV1E_INTER_MODES);
+  }
+  mode_set.extend_from_slice(intra_mode_set);
+
+  for &luma_mode in &mode_set {
     assert!(fi.frame_type == FrameType::INTER || luma_mode.is_intra());
 
     let same_as_luma_modes = &[ luma_mode ];
-    let mode_set_chroma = if is_chroma_block && fi.config.speed <= 3 && luma_mode.is_intra() {
-      RAV1E_INTRA_MODES
+    let mode_set_chroma = if is_chroma_block && luma_mode.is_intra() {
+      intra_mode_set
     } else {
       same_as_luma_modes
     };