diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c
index 93bb98e69c846c0417fca8cc1c921ffc1303ca15..e7a711e113e7f9ca051726c7e8ef06d92ee500eb 100644
--- a/vp9/common/vp9_reconintra.c
+++ b/vp9/common/vp9_reconintra.c
@@ -236,7 +236,10 @@ void vp9_build_intra_predictors(uint8_t *src, int src_stride,
   if (up_available) {
     uint8_t *yabove_ptr = src - src_stride;
     vpx_memcpy(yabove_row, yabove_ptr, bw);
-    vpx_memset(yabove_row + bw, yabove_row[bw -1], bw);
+    if (bw == 4 && right_available)
+      vpx_memcpy(yabove_row + bw, yabove_ptr + bw, bw);
+    else
+      vpx_memset(yabove_row + bw, yabove_row[bw -1], bw);
     ytop_left = left_available ? yabove_ptr[-1] : 127;
   } else {
     vpx_memset(yabove_row, 127, bw * 2);
@@ -610,7 +613,7 @@ void vp9_intra4x4_predict(MACROBLOCKD *xd,
                           uint8_t *predictor, int pre_stride) {
   const int have_top = (block_idx >> 2) || xd->up_available;
   const int have_left = (block_idx & 3) || xd->left_available;
-  const int have_right = ((block_idx & 3) != 3) || xd->right_available;
+  const int have_right = ((block_idx & 3) != 3);
 
   vp9_build_intra_predictors(predictor, pre_stride,
                              predictor, pre_stride,
@@ -625,7 +628,7 @@ void vp9_intra_uv4x4_predict(MACROBLOCKD *xd,
   const int block_idx = block4x4_idx & 3;
   const int have_top = (block_idx >> 1) || xd->up_available;
   const int have_left = (block_idx & 1) || xd->left_available;
-  const int have_right = !(block_idx & 1) || xd->right_available;
+  const int have_right = !(block_idx & 1);
 
   vp9_build_intra_predictors(predictor, pre_stride,
                              predictor, pre_stride,