Merge "Fix "_FORTIFY_SOURCE" redefined warning" into experimental
diff --git a/configure b/configure
index ceeec27..77ae9de 100755
--- a/configure
+++ b/configure
@@ -221,14 +221,9 @@
     superblocks
     pred_filter
     lossless
-    hybridtransform
-    hybridtransform8x8
     switchable_interp
     newbestrefmv
     new_mvref
-    hybridtransform16x16
-    newmventropy
-    tx_select
 "
 CONFIG_LIST="
     external_build
diff --git a/tools/lint-hunks.py b/tools/lint-hunks.py
index 87c7b03..b15a691 100755
--- a/tools/lint-hunks.py
+++ b/tools/lint-hunks.py
@@ -21,7 +21,8 @@
 LONG_OPTIONS = ["help"]
 
 TOPLEVEL_CMD = ["git", "rev-parse", "--show-toplevel"]
-DIFF_CMD = ["git", "diff-index", "-u", "--cached", "HEAD", "--"]
+DIFF_CMD = ["git", "diff"]
+DIFF_INDEX_CMD = ["git", "diff-index", "-u", "HEAD", "--"]
 SHOW_CMD = ["git", "show"]
 CPPLINT_FILTERS = ["-readability/casting", "-runtime/int"]
 
@@ -61,7 +62,7 @@
         argv = sys.argv
     try:
         try:
-            opts, _ = getopt.getopt(argv[1:], SHORT_OPTIONS, LONG_OPTIONS)
+            opts, args = getopt.getopt(argv[1:], SHORT_OPTIONS, LONG_OPTIONS)
         except getopt.error, msg:
             raise Usage(msg)
 
@@ -71,10 +72,20 @@
                 print __doc__
                 sys.exit(0)
 
+        if args and len(args) > 1:
+            print __doc__
+            sys.exit(0)
+
         # Find the fully qualified path to the root of the tree
         tl = Subprocess(TOPLEVEL_CMD, stdout=subprocess.PIPE)
         tl = tl.communicate()[0].strip()
 
+        # See if we're working on the index or not.
+        if args:
+            diff_cmd = DIFF_CMD + [args[0] + "^!"]
+        else:
+            diff_cmd = DIFF_INDEX_CMD
+
         # Build the command line to execute cpplint
         cpplint_cmd = [os.path.join(tl, "tools", "cpplint.py"),
                        "--filter=" + ",".join(CPPLINT_FILTERS),
@@ -82,7 +93,7 @@
 
         # Get a list of all affected lines
         file_affected_line_map = {}
-        p = Subprocess(DIFF_CMD, stdout=subprocess.PIPE)
+        p = Subprocess(diff_cmd, stdout=subprocess.PIPE)
         stdout = p.communicate()[0]
         for hunk in diff.ParseDiffHunks(StringIO.StringIO(stdout)):
             filename = hunk.right.filename[2:]
@@ -95,13 +106,20 @@
         for filename, affected_lines in file_affected_line_map.iteritems():
             if filename.split(".")[-1] not in ("c", "h", "cc"):
                 continue
-            show_cmd = SHOW_CMD + [":" + filename]
-            show = Subprocess(show_cmd, stdout=subprocess.PIPE)
-            lint = Subprocess(cpplint_cmd, expected_returncode=(0, 1),
-                              stdin=show.stdout, stderr=subprocess.PIPE)
-            lint_out = lint.communicate()[1]
-            if lint.returncode == 1:
-                lint_failed = True
+
+            if args:
+                # File contents come from git
+                show_cmd = SHOW_CMD + [args[0] + ":" + filename]
+                show = Subprocess(show_cmd, stdout=subprocess.PIPE)
+                lint = Subprocess(cpplint_cmd, expected_returncode=(0, 1),
+                                  stdin=show.stdout, stderr=subprocess.PIPE)
+                lint_out = lint.communicate()[1]
+            else:
+                # File contents come from the working tree
+                lint = Subprocess(cpplint_cmd, expected_returncode=(0, 1),
+                                  stdin=subprocess.PIPE, stderr=subprocess.PIPE)
+                stdin = open(os.path.join(tl, filename)).read()
+                lint_out = lint.communicate(stdin)[1]
 
             for line in lint_out.split("\n"):
                 fields = line.split(":")
@@ -111,8 +129,9 @@
                 if warning_line_num in affected_lines:
                     print "%s:%d:%s"%(filename, warning_line_num,
                                       ":".join(fields[2:]))
+                    lint_failed = True
 
-        # Propagate lint's exit status
+        # Set exit code if any relevant lint errors seen
         if lint_failed:
             return 1
 
diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h
index 092d9ff..cb546e7 100644
--- a/vp8/common/blockd.h
+++ b/vp8/common/blockd.h
@@ -86,9 +86,7 @@
   BILINEAR = 1,
   EIGHTTAP = 2,
   EIGHTTAP_SHARP = 3,
-#if CONFIG_SWITCHABLE_INTERP
   SWITCHABLE  /* should be the last one */
-#endif
 } INTERPOLATIONFILTERTYPE;
 
 typedef enum
@@ -135,14 +133,12 @@
   TX_SIZE_MAX                  // Number of different transforms available
 } TX_SIZE;
 
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
 typedef enum {
   DCT_DCT   = 0,                      // DCT  in both horizontal and vertical
-  ADST_DCT  = 1,                      // ADST in horizontal, DCT in vertical
-  DCT_ADST  = 2,                      // DCT  in horizontal, ADST in vertical
+  ADST_DCT  = 1,                      // ADST in vertical, DCT in horizontal
+  DCT_ADST  = 2,                      // DCT  in vertical, ADST in horizontal
   ADST_ADST = 3                       // ADST in both directions
 } TX_TYPE;
-#endif
 
 #define VP8_YMODES  (B_PRED + 1)
 #define VP8_UV_MODES (TM_PRED + 1)
@@ -151,14 +147,6 @@
 
 #define VP8_MVREFS (1 + SPLITMV - NEARESTMV)
 
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-#define ACTIVE_HT 110                // quantization stepsize threshold
-#endif
-
-#if CONFIG_HYBRIDTRANSFORM16X16
-#define ACTIVE_HT16 300
-#endif
-
 typedef enum {
   B_DC_PRED,          /* average of above and left pixels */
   B_TM_PRED,
@@ -182,53 +170,17 @@
   B_MODE_COUNT
 } B_PREDICTION_MODE;
 
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
-// convert MB_PREDICTION_MODE to B_PREDICTION_MODE
-static B_PREDICTION_MODE pred_mode_conv(MB_PREDICTION_MODE mode) {
-  B_PREDICTION_MODE b_mode;
-  switch (mode) {
-    case DC_PRED:
-      b_mode = B_DC_PRED;
-      break;
-    case V_PRED:
-      b_mode = B_VE_PRED;
-      break;
-    case H_PRED:
-      b_mode = B_HE_PRED;
-      break;
-    case TM_PRED:
-      b_mode = B_TM_PRED;
-      break;
-    case D45_PRED:
-      b_mode = B_LD_PRED;
-      break;
-    case D135_PRED:
-      b_mode = B_RD_PRED;
-      break;
-    case D117_PRED:
-      b_mode = B_VR_PRED;
-      break;
-    case D153_PRED:
-      b_mode = B_HD_PRED;
-      break;
-    case D27_PRED:
-      b_mode = B_VL_PRED;
-      break;
-    case D63_PRED:
-      b_mode = B_HU_PRED;
-      break;
-    default :
-      // for debug purpose, to be removed after full testing
-      assert(0);
-      break;
-  }
-  return b_mode;
-}
-#endif
-
 #define VP8_BINTRAMODES (B_HU_PRED + 1)  /* 10 */
 #define VP8_SUBMVREFS (1 + NEW4X4 - LEFT4X4)
 
+typedef enum {
+  PARTITIONING_16X8 = 0,
+  PARTITIONING_8X16,
+  PARTITIONING_8X8,
+  PARTITIONING_4X4,
+  NB_PARTITIONINGS,
+} SPLITMV_PARTITIONING_TYPE;
+
 /* For keyframes, intra block modes are predicted by the (already decoded)
    modes for the Y blocks to the left and above us; for interframes, there
    is a single probability table. */
@@ -236,9 +188,7 @@
 union b_mode_info {
   struct {
     B_PREDICTION_MODE first;
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
     TX_TYPE           tx_type;
-#endif
 
 #if CONFIG_COMP_INTRA_PRED
     B_PREDICTION_MODE second;
@@ -272,7 +222,7 @@
   int mv_ref_index[MAX_REF_FRAMES];
 #endif
 
-  unsigned char partitioning;
+  SPLITMV_PARTITIONING_TYPE partitioning;
   unsigned char mb_skip_coeff;                                /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */
   unsigned char need_to_clamp_mvs;
   unsigned char need_to_clamp_secondmv;
@@ -291,9 +241,7 @@
   // Flag to turn prediction signal filter on(1)/off(0 ) at the MB level
   unsigned int pred_filter_enabled;
 #endif
-#if CONFIG_SWITCHABLE_INTERP
     INTERPOLATIONFILTERTYPE interp_filter;
-#endif
 
 #if CONFIG_SUPERBLOCKS
   // FIXME need a SB array of 4 MB_MODE_INFOs that
@@ -416,8 +364,6 @@
   vp8_subpix_fn_t  subpixel_predict_avg16x16;
   int allow_high_precision_mv;
 
-  void *current_bc;
-
   int corrupted;
 
 #if !CONFIG_SUPERBLOCKS && (ARCH_X86 || ARCH_X86_64)
@@ -438,73 +384,130 @@
   int_mv ref_mv[MAX_MV_REFS];
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
   int q_index;
-#endif
 
 } MACROBLOCKD;
 
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
+#define ACTIVE_HT 110                // quantization stepsize threshold
+
+#define ACTIVE_HT8 300
+
+#define ACTIVE_HT16 300
+
+// convert MB_PREDICTION_MODE to B_PREDICTION_MODE
+static B_PREDICTION_MODE pred_mode_conv(MB_PREDICTION_MODE mode) {
+  B_PREDICTION_MODE b_mode;
+  switch (mode) {
+    case DC_PRED:
+      b_mode = B_DC_PRED;
+      break;
+    case V_PRED:
+      b_mode = B_VE_PRED;
+      break;
+    case H_PRED:
+      b_mode = B_HE_PRED;
+      break;
+    case TM_PRED:
+      b_mode = B_TM_PRED;
+      break;
+    case D45_PRED:
+      b_mode = B_LD_PRED;
+      break;
+    case D135_PRED:
+      b_mode = B_RD_PRED;
+      break;
+    case D117_PRED:
+      b_mode = B_VR_PRED;
+      break;
+    case D153_PRED:
+      b_mode = B_HD_PRED;
+      break;
+    case D27_PRED:
+      b_mode = B_HU_PRED;
+      break;
+    case D63_PRED:
+      b_mode = B_VL_PRED;
+      break;
+    default :
+      // for debug purpose, to be removed after full testing
+      assert(0);
+      break;
+  }
+  return b_mode;
+}
+
 // transform mapping
-static void txfm_map(BLOCKD *b, B_PREDICTION_MODE bmode) {
+static TX_TYPE txfm_map(B_PREDICTION_MODE bmode) {
   // map transform type
+  TX_TYPE tx_type;
   switch (bmode) {
     case B_TM_PRED :
     case B_RD_PRED :
-      b->bmi.as_mode.tx_type = ADST_ADST;
+      tx_type = ADST_ADST;
       break;
 
     case B_VE_PRED :
     case B_VR_PRED :
-      b->bmi.as_mode.tx_type = ADST_DCT;
+      tx_type = ADST_DCT;
       break;
 
     case B_HE_PRED :
     case B_HD_PRED :
     case B_HU_PRED :
-      b->bmi.as_mode.tx_type = DCT_ADST;
+      tx_type = DCT_ADST;
       break;
 
     default :
-      b->bmi.as_mode.tx_type = DCT_DCT;
+      tx_type = DCT_DCT;
       break;
   }
-}
-
-static TX_TYPE get_tx_type(MACROBLOCKD *xd, const BLOCKD *b) {
-  TX_TYPE tx_type = DCT_DCT;
-  int ib = (b - xd->block);
-  if (ib >= 16) return tx_type;
-#if CONFIG_HYBRIDTRANSFORM16X16
-  if (xd->mode_info_context->mbmi.txfm_size == TX_16X16) {
-    if (xd->mode_info_context->mbmi.mode < I8X8_PRED &&
-        xd->q_index < ACTIVE_HT16)
-      tx_type = b->bmi.as_mode.tx_type;
-    return tx_type;
-  }
-#endif
-#if CONFIG_HYBRIDTRANSFORM8X8
-  if (xd->mode_info_context->mbmi.txfm_size  == TX_8X8) {
-    BLOCKD *bb;
-    ib = (ib & 8) + ((ib & 4) >> 1);
-    bb = xd->block + ib;
-    if (xd->mode_info_context->mbmi.mode == I8X8_PRED)
-      tx_type = bb->bmi.as_mode.tx_type;
-    return tx_type;
-  }
-#endif
-#if CONFIG_HYBRIDTRANSFORM
-  if (xd->mode_info_context->mbmi.txfm_size  == TX_4X4) {
-    if (xd->mode_info_context->mbmi.mode == B_PRED &&
-        xd->q_index < ACTIVE_HT) {
-      tx_type = b->bmi.as_mode.tx_type;
-    }
-    return tx_type;
-  }
-#endif
   return tx_type;
 }
-#endif
+
+static TX_TYPE get_tx_type_4x4(const MACROBLOCKD *xd, const BLOCKD *b) {
+  TX_TYPE tx_type = DCT_DCT;
+  if (xd->mode_info_context->mbmi.mode == B_PRED &&
+      xd->q_index < ACTIVE_HT) {
+    tx_type = txfm_map(b->bmi.as_mode.first);
+  }
+  return tx_type;
+}
+
+static TX_TYPE get_tx_type_8x8(const MACROBLOCKD *xd, const BLOCKD *b) {
+  TX_TYPE tx_type = DCT_DCT;
+  if (xd->mode_info_context->mbmi.mode == I8X8_PRED &&
+      xd->q_index < ACTIVE_HT8) {
+    tx_type = txfm_map(pred_mode_conv(b->bmi.as_mode.first));
+  }
+  return tx_type;
+}
+
+static TX_TYPE get_tx_type_16x16(const MACROBLOCKD *xd, const BLOCKD *b) {
+  TX_TYPE tx_type = DCT_DCT;
+  if (xd->mode_info_context->mbmi.mode < I8X8_PRED &&
+      xd->q_index < ACTIVE_HT16) {
+    tx_type = txfm_map(pred_mode_conv(xd->mode_info_context->mbmi.mode));
+  }
+  return tx_type;
+}
+
+static TX_TYPE get_tx_type(const MACROBLOCKD *xd, const BLOCKD *b) {
+  TX_TYPE tx_type = DCT_DCT;
+  int ib = (b - xd->block);
+  if (ib >= 16)
+    return tx_type;
+  if (xd->mode_info_context->mbmi.txfm_size == TX_16X16) {
+    tx_type = get_tx_type_16x16(xd, b);
+  }
+  if (xd->mode_info_context->mbmi.txfm_size  == TX_8X8) {
+    ib = (ib & 8) + ((ib & 4) >> 1);
+    tx_type = get_tx_type_8x8(xd, &xd->block[ib]);
+  }
+  if (xd->mode_info_context->mbmi.txfm_size  == TX_4X4) {
+    tx_type = get_tx_type_4x4(xd, b);
+  }
+  return tx_type;
+}
 
 extern void vp8_build_block_doffsets(MACROBLOCKD *xd);
 extern void vp8_setup_block_dptrs(MACROBLOCKD *xd);
diff --git a/vp8/common/default_coef_probs.h b/vp8/common/default_coef_probs.h
index 5e21195..bd1f795 100644
--- a/vp8/common/default_coef_probs.h
+++ b/vp8/common/default_coef_probs.h
@@ -13,9 +13,9 @@
 
 
 static const vp8_prob default_coef_probs [BLOCK_TYPES]
-[COEF_BANDS]
-[PREV_COEF_CONTEXTS]
-[ENTROPY_NODES] = {
+                                         [COEF_BANDS]
+                                         [PREV_COEF_CONTEXTS]
+                                         [ENTROPY_NODES] = {
   {
     /* Block Type ( 0 ) */
     {
@@ -254,11 +254,10 @@
   }
 };
 
-#if CONFIG_HYBRIDTRANSFORM
 static const vp8_prob default_hybrid_coef_probs [BLOCK_TYPES]
-[COEF_BANDS]
-[PREV_COEF_CONTEXTS]
-[ENTROPY_NODES] = {
+                                                [COEF_BANDS]
+                                                [PREV_COEF_CONTEXTS]
+                                                [ENTROPY_NODES] = {
   {
     /* Block Type ( 0 ) */
     {
@@ -496,7 +495,6 @@
     }
   }
 };
-#endif
 
 static const vp8_prob
 default_coef_probs_8x8[BLOCK_TYPES_8X8]
@@ -731,12 +729,11 @@
   }
 };
 
-#if CONFIG_HYBRIDTRANSFORM8X8
 static const vp8_prob
 default_hybrid_coef_probs_8x8[BLOCK_TYPES_8X8]
-                                 [COEF_BANDS]
-                                 [PREV_COEF_CONTEXTS]
-                                 [ENTROPY_NODES] = {
+                             [COEF_BANDS]
+                             [PREV_COEF_CONTEXTS]
+                             [ENTROPY_NODES] = {
   {
     /* block Type 0 */
     {
@@ -964,7 +961,6 @@
     }
   }
 };
-#endif
 
 static const vp8_prob
   default_coef_probs_16x16[BLOCK_TYPES_16X16]
@@ -1173,7 +1169,6 @@
   }
 };
 
-#if CONFIG_HYBRIDTRANSFORM16X16
 static const vp8_prob
   default_hybrid_coef_probs_16x16[BLOCK_TYPES_16X16]
                                  [COEF_BANDS]
@@ -1380,4 +1375,3 @@
     }
   }
 };
-#endif
diff --git a/vp8/common/entropy.c b/vp8/common/entropy.c
index 90f7a52..a3f731a 100644
--- a/vp8/common/entropy.c
+++ b/vp8/common/entropy.c
@@ -64,8 +64,6 @@
   7, 11, 14, 15,
 };
 
-
-#if CONFIG_HYBRIDTRANSFORM
 DECLARE_ALIGNED(16, const int, vp8_col_scan[16]) = {
   0, 4,  8, 12,
   1, 5,  9, 13,
@@ -78,7 +76,6 @@
   8,   9, 10, 11,
   12, 13, 14, 15
 };
-#endif
 
 
 DECLARE_ALIGNED(64, const int, vp8_coef_bands_8x8[64]) = { 0, 1, 2, 3, 5, 4, 4, 5,
@@ -208,25 +205,19 @@
 void vp8_default_coef_probs(VP8_COMMON *pc) {
   vpx_memcpy(pc->fc.coef_probs, default_coef_probs,
              sizeof(pc->fc.coef_probs));
-#if CONFIG_HYBRIDTRANSFORM
   vpx_memcpy(pc->fc.hybrid_coef_probs, default_hybrid_coef_probs,
              sizeof(pc->fc.hybrid_coef_probs));
-#endif
 
   vpx_memcpy(pc->fc.coef_probs_8x8, default_coef_probs_8x8,
              sizeof(pc->fc.coef_probs_8x8));
-#if CONFIG_HYBRIDTRANSFORM8X8
   vpx_memcpy(pc->fc.hybrid_coef_probs_8x8, default_hybrid_coef_probs_8x8,
              sizeof(pc->fc.hybrid_coef_probs_8x8));
-#endif
 
   vpx_memcpy(pc->fc.coef_probs_16x16, default_coef_probs_16x16,
              sizeof(pc->fc.coef_probs_16x16));
-#if CONFIG_HYBRIDTRANSFORM16X16
   vpx_memcpy(pc->fc.hybrid_coef_probs_16x16,
              default_hybrid_coef_probs_16x16,
              sizeof(pc->fc.hybrid_coef_probs_16x16));
-#endif
 }
 
 void vp8_coef_tree_initialize() {
@@ -344,7 +335,6 @@
         }
       }
 
-#if CONFIG_HYBRIDTRANSFORM
   for (i = 0; i < BLOCK_TYPES; ++i)
     for (j = 0; j < COEF_BANDS; ++j)
       for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -366,7 +356,6 @@
           else cm->fc.hybrid_coef_probs[i][j][k][t] = prob;
         }
       }
-#endif
 
   for (i = 0; i < BLOCK_TYPES_8X8; ++i)
     for (j = 0; j < COEF_BANDS; ++j)
@@ -390,7 +379,6 @@
         }
       }
 
-#if CONFIG_HYBRIDTRANSFORM8X8
   for (i = 0; i < BLOCK_TYPES_8X8; ++i)
     for (j = 0; j < COEF_BANDS; ++j)
       for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -413,7 +401,6 @@
           else cm->fc.hybrid_coef_probs_8x8[i][j][k][t] = prob;
         }
       }
-#endif
 
   for (i = 0; i < BLOCK_TYPES_16X16; ++i)
     for (j = 0; j < COEF_BANDS; ++j)
@@ -437,7 +424,6 @@
         }
       }
 
-#if CONFIG_HYBRIDTRANSFORM16X16
   for (i = 0; i < BLOCK_TYPES_16X16; ++i)
     for (j = 0; j < COEF_BANDS; ++j)
       for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -458,5 +444,4 @@
           else cm->fc.hybrid_coef_probs_16x16[i][j][k][t] = prob;
         }
       }
-#endif
 }
diff --git a/vp8/common/entropy.h b/vp8/common/entropy.h
index 4af3ecf..48a100a 100644
--- a/vp8/common/entropy.h
+++ b/vp8/common/entropy.h
@@ -37,9 +37,9 @@
 #define DCT_VAL_CATEGORY5       9       /* 35-66     Extra Bits 5+1 */
 #define DCT_VAL_CATEGORY6       10      /* 67+       Extra Bits 13+1 */
 #define DCT_EOB_TOKEN           11      /* EOB       Extra Bits 0+0 */
-
 #define MAX_ENTROPY_TOKENS 12
 #define ENTROPY_NODES 11
+#define EOSB_TOKEN              127     /* Not signalled, encoder only */
 
 extern const vp8_tree_index vp8_coef_tree[];
 
@@ -104,10 +104,8 @@
 void vp8_default_coef_probs(struct VP8Common *);
 extern DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]);
 
-#if CONFIG_HYBRIDTRANSFORM
 extern DECLARE_ALIGNED(16, const int, vp8_col_scan[16]);
 extern DECLARE_ALIGNED(16, const int, vp8_row_scan[16]);
-#endif
 
 extern short vp8_default_zig_zag_mask[16];
 extern DECLARE_ALIGNED(64, const int, vp8_default_zig_zag1d_8x8[64]);
diff --git a/vp8/common/entropymode.c b/vp8/common/entropymode.c
index 5627aa4..bcd9f37 100644
--- a/vp8/common/entropymode.c
+++ b/vp8/common/entropymode.c
@@ -215,9 +215,9 @@
 };
 
 const vp8_tree_index vp8_mbsplit_tree[6] = {
-  -3, 2,
-  -2, 4,
-  -0, -1
+  -PARTITIONING_4X4,   2,
+  -PARTITIONING_8X8,   4,
+  -PARTITIONING_16X8, -PARTITIONING_8X16,
 };
 
 const vp8_tree_index vp8_mv_ref_tree[8] = {
@@ -301,11 +301,8 @@
 
   vpx_memcpy(x->fc.sub_mv_ref_prob, vp8_sub_mv_ref_prob2, sizeof(vp8_sub_mv_ref_prob2));
   vpx_memcpy(x->fc.mbsplit_prob, vp8_mbsplit_probs, sizeof(vp8_mbsplit_probs));
-#if CONFIG_SWITCHABLE_INTERP
   vpx_memcpy(x->fc.switchable_interp_prob, vp8_switchable_interp_prob,
              sizeof(vp8_switchable_interp_prob));
-#endif
-
 }
 
 
@@ -338,7 +335,6 @@
   } while (++i < VP8_BINTRAMODES);
 }
 
-#if CONFIG_SWITCHABLE_INTERP
 #if VP8_SWITCHABLE_FILTERS == 3
 const vp8_tree_index vp8_switchable_interp_tree[VP8_SWITCHABLE_FILTERS*2-2] = {
   -0, 2,
@@ -363,19 +359,10 @@
   { 64},
   {192},
 };
-//#define SWITCHABLE_86
-#ifdef SWITCHABLE_86
-const INTERPOLATIONFILTERTYPE vp8_switchable_interp[VP8_SWITCHABLE_FILTERS] = {
-  EIGHTTAP, SIXTAP};
-const int vp8_switchable_interp_map[SWITCHABLE+1] = {1, -1, 0, -1, -1}; //8, 6
-#else
 const INTERPOLATIONFILTERTYPE vp8_switchable_interp[VP8_SWITCHABLE_FILTERS] = {
   EIGHTTAP, EIGHTTAP_SHARP};
 const int vp8_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1}; //8, 8s
 #endif
-#endif
-#endif
-
 
 void vp8_entropy_mode_init() {
   vp8_tokens_from_tree(vp8_bmode_encodings,   vp8_bmode_tree);
@@ -387,10 +374,8 @@
   vp8_tokens_from_tree(vp8_uv_mode_encodings,  vp8_uv_mode_tree);
   vp8_tokens_from_tree(vp8_i8x8_mode_encodings,  vp8_i8x8_mode_tree);
   vp8_tokens_from_tree(vp8_mbsplit_encodings, vp8_mbsplit_tree);
-#if CONFIG_SWITCHABLE_INTERP
   vp8_tokens_from_tree(vp8_switchable_interp_encodings,
                        vp8_switchable_interp_tree);
-#endif
 
   vp8_tokens_from_tree_offset(vp8_mv_ref_encoding_array,
                               vp8_mv_ref_tree, NEARESTMV);
diff --git a/vp8/common/entropymode.h b/vp8/common/entropymode.h
index 430c949..debb565 100644
--- a/vp8/common/entropymode.h
+++ b/vp8/common/entropymode.h
@@ -76,16 +76,14 @@
 
 void vp8_adapt_mode_probs(struct VP8Common *);
 
-#if CONFIG_SWITCHABLE_INTERP
 #define VP8_SWITCHABLE_FILTERS 2 /* number of switchable filters */
 extern const  INTERPOLATIONFILTERTYPE vp8_switchable_interp
                   [VP8_SWITCHABLE_FILTERS];
-extern const  int vp8_switchable_interp_map[SWITCHABLE+1];
+extern const  int vp8_switchable_interp_map[SWITCHABLE + 1];
 extern const  vp8_tree_index vp8_switchable_interp_tree
-                  [2*(VP8_SWITCHABLE_FILTERS-1)];
+                  [2*(VP8_SWITCHABLE_FILTERS - 1)];
 extern struct vp8_token_struct vp8_switchable_interp_encodings
                   [VP8_SWITCHABLE_FILTERS];
 extern const  vp8_prob vp8_switchable_interp_prob
-                  [VP8_SWITCHABLE_FILTERS+1][VP8_SWITCHABLE_FILTERS-1];
-#endif
+                  [VP8_SWITCHABLE_FILTERS + 1][VP8_SWITCHABLE_FILTERS - 1];
 #endif
diff --git a/vp8/common/entropymv.c b/vp8/common/entropymv.c
index 6c31236..a442a24 100644
--- a/vp8/common/entropymv.c
+++ b/vp8/common/entropymv.c
@@ -14,8 +14,6 @@
 
 //#define MV_COUNT_TESTING
 
-#if CONFIG_NEWMVENTROPY
-
 #define MV_COUNT_SAT 16
 #define MV_MAX_UPDATE_FACTOR 160
 
@@ -450,413 +448,13 @@
   }
 }
 
-#else   /* CONFIG_NEWMVENTROPY */
-
-#define MV_COUNT_SAT 16
-#define MV_MAX_UPDATE_FACTOR 128
-
-const MV_CONTEXT_HP vp8_mv_update_probs_hp[2] = {
-  {{
-      237,
-      246,
-      253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
-      254, 254, 254, 254, 254, 250, 250, 252, 254, 254, 254
-    }
-  },
-  {{
-      231,
-      243,
-      245, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
-      254, 254, 254, 254, 254, 251, 251, 254, 254, 254, 254
-    }
-  }
-};
-const MV_CONTEXT_HP vp8_default_mv_context_hp[2] = {
-  {{
-      /* row */
-      162,                                        /* is short */
-      128,                                        /* sign */
-      220, 204, 180, 192, 192, 119, 192, 192, 180, 140, 192, 192, 224, 224, 224, /* short tree */
-      128, 129, 132,  75, 145, 178, 206, 239, 254, 254, 254 /* long bits */
-    }
-  },
-  {{
-      /* same for column */
-      164,                                        /* is short */
-      128,
-      220, 204, 180, 192, 192, 119, 192, 192, 180, 140, 192, 192, 224, 224, 224, /* short tree */
-      128, 130, 130,  74, 148, 180, 203, 236, 254, 254, 254 /* long bits */
-    }
-  }
-};
-
-const MV_CONTEXT vp8_mv_update_probs[2] = {
-  {{
-      237,
-      246,
-      253, 253, 254, 254, 254, 254, 254,
-      254, 254, 254, 254, 254, 250, 250, 252, 254, 254
-    }
-  },
-  {{
-      231,
-      243,
-      245, 253, 254, 254, 254, 254, 254,
-      254, 254, 254, 254, 254, 251, 251, 254, 254, 254
-    }
-  }
-};
-const MV_CONTEXT vp8_default_mv_context[2] = {
-  {{
-      /* row */
-      162,                                        /* is short */
-      128,                                        /* sign */
-      225, 146, 172, 147, 214,  39, 156,          /* short tree */
-      128, 129, 132,  75, 145, 178, 206, 239, 254, 254 /* long bits */
-    }
-  },
-  {{
-      /* same for column */
-      164,                                        /* is short */
-      128,
-      204, 170, 119, 235, 140, 230, 228,
-      128, 130, 130,  74, 148, 180, 203, 236, 254, 254 /* long bits */
-    }
-  }
-};
-
-const vp8_tree_index vp8_small_mvtree_hp [30] = {
-  2,  16,
-  4,  10,
-  6,   8,
-  -0,  -1,
-  -2,  -3,
-  12,  14,
-  -4,  -5,
-  -6,  -7,
-  18,  24,
-  20,  22,
-  -8,  -9,
-  -10, -11,
-  26,  28,
-  -12, -13,
-  -14, -15
-};
-struct vp8_token_struct vp8_small_mvencodings_hp [16];
-
-const vp8_tree_index vp8_small_mvtree [14] = {
-  2, 8,
-  4, 6,
-  -0, -1,
-  -2, -3,
-  10, 12,
-  -4, -5,
-  -6, -7
-};
-struct vp8_token_struct vp8_small_mvencodings [8];
-
-__inline static void calc_prob(vp8_prob *p, const unsigned int ct[2], int pbits) {
-  const unsigned int tot = ct[0] + ct[1];
-  if (tot) {
-    const vp8_prob x = ((ct[0] * 255) / tot) & -(1 << (8 - pbits));
-    *p = x ? x : 1;
-  } else {
-    *p = 128;
-  }
-}
-
-static void compute_component_probs(
-  const unsigned int events [MVvals],
-  vp8_prob Pnew [MVPcount],
-  unsigned int is_short_ct[2],
-  unsigned int sign_ct[2],
-  unsigned int bit_ct [mvlong_width] [2],
-  unsigned int short_ct  [mvnum_short],
-  unsigned int short_bct [mvnum_short - 1] [2]
-) {
-  is_short_ct[0] = is_short_ct[1] = 0;
-  sign_ct[0] = sign_ct[1] = 0;
-  vpx_memset(bit_ct, 0, sizeof(unsigned int)*mvlong_width * 2);
-  vpx_memset(short_ct, 0, sizeof(unsigned int)*mvnum_short);
-  vpx_memset(short_bct, 0, sizeof(unsigned int) * (mvnum_short - 1) * 2);
-
-  {
-    const int c = events [mv_max];
-    is_short_ct [0] += c;    // Short vector
-    short_ct [0] += c;       // Magnitude distribution
-  }
-  {
-    int j = 1;
-    do {
-      const int c1 = events [mv_max + j];  // positive
-      const int c2 = events [mv_max - j];  // negative
-      const int c  = c1 + c2;
-      int a = j;
-
-      sign_ct [0] += c1;
-      sign_ct [1] += c2;
-
-      if (a < mvnum_short) {
-        is_short_ct [0] += c;     // Short vector
-        short_ct [a] += c;       // Magnitude distribution
-      } else {
-        int k = mvlong_width - 1;
-        is_short_ct [1] += c;     // Long vector
-
-        do
-          bit_ct [k] [(a >> k) & 1] += c;
-
-        while (--k >= 0);
-      }
-    } while (++j <= mv_max);
-  }
-  calc_prob(Pnew + mvpis_short, is_short_ct, 8);
-
-  calc_prob(Pnew + MVPsign, sign_ct, 8);
-
-  {
-    vp8_prob p [mvnum_short - 1];    /* actually only need branch ct */
-    int j = 0;
-
-    vp8_tree_probs_from_distribution(
-      mvnum_short, vp8_small_mvencodings, vp8_small_mvtree,
-      p, short_bct, short_ct,
-      256, 1
-    );
-
-    do
-      calc_prob(Pnew + MVPshort + j, short_bct[j], 8);
-    while (++j < mvnum_short - 1);
-  }
-
-  {
-    int j = 0;
-    do
-      calc_prob(Pnew + MVPbits + j, bit_ct[j], 8);
-    while (++j < mvlong_width);
-  }
-}
-
-static void compute_component_probs_hp(
-  const unsigned int events [MVvals_hp],
-  vp8_prob Pnew [MVPcount_hp],
-  unsigned int is_short_ct[2],
-  unsigned int sign_ct[2],
-  unsigned int bit_ct [mvlong_width_hp] [2],
-  unsigned int short_ct  [mvnum_short_hp],
-  unsigned int short_bct [mvnum_short_hp - 1] [2]
-) {
-  is_short_ct[0] = is_short_ct[1] = 0;
-  sign_ct[0] = sign_ct[1] = 0;
-  vpx_memset(bit_ct, 0, sizeof(unsigned int)*mvlong_width_hp * 2);
-  vpx_memset(short_ct, 0, sizeof(unsigned int)*mvnum_short_hp);
-  vpx_memset(short_bct, 0, sizeof(unsigned int) * (mvnum_short_hp - 1) * 2);
-
-  {
-    const int c = events [mv_max_hp];
-    is_short_ct [0] += c;    // Short vector
-    short_ct [0] += c;       // Magnitude distribution
-  }
-  {
-    int j = 1;
-    do {
-      const int c1 = events [mv_max_hp + j];  // positive
-      const int c2 = events [mv_max_hp - j];  // negative
-      const int c  = c1 + c2;
-      int a = j;
-
-      sign_ct [0] += c1;
-      sign_ct [1] += c2;
-
-      if (a < mvnum_short_hp) {
-        is_short_ct [0] += c;     // Short vector
-        short_ct [a] += c;       // Magnitude distribution
-      } else {
-        int k = mvlong_width_hp - 1;
-        is_short_ct [1] += c;     // Long vector
-
-        do
-          bit_ct [k] [(a >> k) & 1] += c;
-
-        while (--k >= 0);
-      }
-    } while (++j <= mv_max_hp);
-  }
-  calc_prob(Pnew + mvpis_short_hp, is_short_ct, 8);
-
-  calc_prob(Pnew + MVPsign_hp, sign_ct, 8);
-
-  {
-    vp8_prob p [mvnum_short_hp - 1];    /* actually only need branch ct */
-    int j = 0;
-
-    vp8_tree_probs_from_distribution(
-      mvnum_short_hp, vp8_small_mvencodings_hp, vp8_small_mvtree_hp,
-      p, short_bct, short_ct,
-      256, 1
-    );
-
-    do
-      calc_prob(Pnew + MVPshort_hp + j, short_bct[j], 8);
-    while (++j < mvnum_short_hp - 1);
-  }
-
-  {
-    int j = 0;
-    do
-      calc_prob(Pnew + MVPbits_hp + j, bit_ct[j], 8);
-    while (++j < mvlong_width_hp);
-  }
-}
-
-void vp8_adapt_mv_probs(VP8_COMMON *cm) {
-  int i, t, count, factor;
-#ifdef MV_COUNT_TESTING
-  printf("static const unsigned int\nMVcount[2][MVvals]={\n");
-  for (i = 0; i < 2; ++i) {
-    printf("  { ");
-    for (t = 0; t < MVvals; t++) {
-      printf("%d, ", cm->fc.MVcount[i][t]);
-      if (t % 16 == 15 && t != MVvals - 1) printf("\n    ");
-    }
-    printf("},\n");
-  }
-  printf("};\n");
-  printf("static const unsigned int\nMVcount_hp[2][MVvals_hp]={\n");
-  for (i = 0; i < 2; ++i) {
-    printf("  { ");
-    for (t = 0; t < MVvals_hp; t++) {
-      printf("%d, ", cm->fc.MVcount_hp[i][t]);
-      if (t % 16 == 15 && t != MVvals_hp - 1) printf("\n    ");
-    }
-    printf("},\n");
-  }
-  printf("};\n");
-#endif  /* MV_COUNT_TESTING */
-
-  for (i = 0; i < 2; ++i) {
-    int prob;
-    unsigned int is_short_ct[2];
-    unsigned int sign_ct[2];
-    unsigned int bit_ct [mvlong_width] [2];
-    unsigned int short_ct  [mvnum_short];
-    unsigned int short_bct [mvnum_short - 1] [2];
-    vp8_prob Pnew [MVPcount];
-    compute_component_probs(cm->fc.MVcount[i], Pnew,
-                            is_short_ct, sign_ct,
-                            bit_ct, short_ct, short_bct);
-    count = is_short_ct[0] + is_short_ct[1];
-    count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-    factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-    prob = ((int)cm->fc.pre_mvc[i].prob[mvpis_short] * (256 - factor) +
-            (int)Pnew[mvpis_short] * factor + 128) >> 8;
-    if (prob <= 0) cm->fc.mvc[i].prob[mvpis_short] = 1;
-    else if (prob > 255) cm->fc.mvc[i].prob[mvpis_short] = 255;
-    else cm->fc.mvc[i].prob[mvpis_short] = prob;
-
-    count = sign_ct[0] + sign_ct[1];
-    count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-    factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-    prob = ((int)cm->fc.pre_mvc[i].prob[MVPsign] * (256 - factor) +
-            (int)Pnew[MVPsign] * factor + 128) >> 8;
-    if (prob <= 0) cm->fc.mvc[i].prob[MVPsign] = 1;
-    else if (prob > 255) cm->fc.mvc[i].prob[MVPsign] = 255;
-    else cm->fc.mvc[i].prob[MVPsign] = prob;
-
-    for (t = 0; t < mvnum_short - 1; ++t) {
-      count = short_bct[t][0] + short_bct[t][1];
-      count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-      factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-      prob = ((int)cm->fc.pre_mvc[i].prob[MVPshort + t] * (256 - factor) +
-              (int)Pnew[MVPshort + t] * factor + 128) >> 8;
-      if (prob <= 0) cm->fc.mvc[i].prob[MVPshort + t] = 1;
-      else if (prob > 255) cm->fc.mvc[i].prob[MVPshort + t] = 255;
-      else cm->fc.mvc[i].prob[MVPshort + t] = prob;
-    }
-    for (t = 0; t < mvlong_width; ++t) {
-      count = bit_ct[t][0] + bit_ct[t][1];
-      count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-      factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-      prob = ((int)cm->fc.pre_mvc[i].prob[MVPbits + t] * (256 - factor) +
-              (int)Pnew[MVPbits + t] * factor + 128) >> 8;
-      if (prob <= 0) cm->fc.mvc[i].prob[MVPbits + t] = 1;
-      else if (prob > 255) cm->fc.mvc[i].prob[MVPbits + t] = 255;
-      else cm->fc.mvc[i].prob[MVPbits + t] = prob;
-    }
-  }
-  for (i = 0; i < 2; ++i) {
-    int prob;
-    unsigned int is_short_ct[2];
-    unsigned int sign_ct[2];
-    unsigned int bit_ct [mvlong_width_hp] [2];
-    unsigned int short_ct  [mvnum_short_hp];
-    unsigned int short_bct [mvnum_short_hp - 1] [2];
-    vp8_prob Pnew [MVPcount_hp];
-    compute_component_probs_hp(cm->fc.MVcount_hp[i], Pnew,
-                               is_short_ct, sign_ct,
-                               bit_ct, short_ct, short_bct);
-    count = is_short_ct[0] + is_short_ct[1];
-    count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-    factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-    prob = ((int)cm->fc.pre_mvc_hp[i].prob[mvpis_short_hp] * (256 - factor) +
-            (int)Pnew[mvpis_short_hp] * factor + 128) >> 8;
-    if (prob <= 0) cm->fc.mvc_hp[i].prob[mvpis_short_hp] = 1;
-    else if (prob > 255) cm->fc.mvc_hp[i].prob[mvpis_short_hp] = 255;
-    else cm->fc.mvc_hp[i].prob[mvpis_short_hp] = prob;
-
-    count = sign_ct[0] + sign_ct[1];
-    count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-    factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-    prob = ((int)cm->fc.pre_mvc_hp[i].prob[MVPsign_hp] * (256 - factor) +
-            (int)Pnew[MVPsign_hp] * factor + 128) >> 8;
-    if (prob <= 0) cm->fc.mvc_hp[i].prob[MVPsign_hp] = 1;
-    else if (prob > 255) cm->fc.mvc_hp[i].prob[MVPsign_hp] = 255;
-    else cm->fc.mvc_hp[i].prob[MVPsign_hp] = prob;
-
-    for (t = 0; t < mvnum_short_hp - 1; ++t) {
-      count = short_bct[t][0] + short_bct[t][1];
-      count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-      factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-      prob = ((int)cm->fc.pre_mvc_hp[i].prob[MVPshort_hp + t] * (256 - factor) +
-              (int)Pnew[MVPshort_hp + t] * factor + 128) >> 8;
-      if (prob <= 0) cm->fc.mvc_hp[i].prob[MVPshort_hp + t] = 1;
-      else if (prob > 255) cm->fc.mvc_hp[i].prob[MVPshort_hp + t] = 255;
-      else cm->fc.mvc_hp[i].prob[MVPshort_hp + t] = prob;
-    }
-    for (t = 0; t < mvlong_width_hp; ++t) {
-      count = bit_ct[t][0] + bit_ct[t][1];
-      count = count > MV_COUNT_SAT ? MV_COUNT_SAT : count;
-      factor = (MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT);
-      prob = ((int)cm->fc.pre_mvc_hp[i].prob[MVPbits_hp + t] * (256 - factor) +
-              (int)Pnew[MVPbits_hp + t] * factor + 128) >> 8;
-      if (prob <= 0) cm->fc.mvc_hp[i].prob[MVPbits_hp + t] = 1;
-      else if (prob > 255) cm->fc.mvc_hp[i].prob[MVPbits_hp + t] = 255;
-      else cm->fc.mvc_hp[i].prob[MVPbits_hp + t] = prob;
-    }
-  }
-}
-
-#endif  /* CONFIG_NEWMVENTROPY */
-
 void vp8_entropy_mv_init() {
-#if CONFIG_NEWMVENTROPY
   vp8_tokens_from_tree(vp8_mv_joint_encodings, vp8_mv_joint_tree);
   vp8_tokens_from_tree(vp8_mv_class_encodings, vp8_mv_class_tree);
   vp8_tokens_from_tree(vp8_mv_class0_encodings, vp8_mv_class0_tree);
   vp8_tokens_from_tree(vp8_mv_fp_encodings, vp8_mv_fp_tree);
-#else
-  vp8_tokens_from_tree(vp8_small_mvencodings, vp8_small_mvtree);
-  vp8_tokens_from_tree(vp8_small_mvencodings_hp, vp8_small_mvtree_hp);
-#endif
 }
 
 void vp8_init_mv_probs(VP8_COMMON *cm) {
-#if CONFIG_NEWMVENTROPY
   vpx_memcpy(&cm->fc.nmvc, &vp8_default_nmv_context, sizeof(nmv_context));
-#else
-  vpx_memcpy(cm->fc.mvc,
-             vp8_default_mv_context, sizeof(vp8_default_mv_context));
-  vpx_memcpy(cm->fc.mvc_hp,
-             vp8_default_mv_context_hp, sizeof(vp8_default_mv_context_hp));
-#endif
 }
diff --git a/vp8/common/entropymv.h b/vp8/common/entropymv.h
index 1a193b1..80540a5 100644
--- a/vp8/common/entropymv.h
+++ b/vp8/common/entropymv.h
@@ -22,7 +22,6 @@
 void vp8_init_mv_probs(struct VP8Common *cm);
 void vp8_adapt_mv_probs(struct VP8Common *cm);
 
-#if CONFIG_NEWMVENTROPY
 void vp8_adapt_nmv_probs(struct VP8Common *cm, int usehp);
 void vp8_lower_mv_precision(MV *mv);
 int vp8_use_nmv_hp(const MV *ref);
@@ -129,65 +128,4 @@
     unsigned int (*branch_ct_class0_hp)[2],
     unsigned int (*branch_ct_hp)[2]);
 
-#else  /* CONFIG_NEWMVENTROPY */
-
-enum {
-  mv_max  = 1023,              /* max absolute value of a MV component */
-  MVvals = (2 * mv_max) + 1,   /* # possible values "" */
-  mvlong_width = 10,       /* Large MVs have 9 bit magnitudes */
-  mvnum_short = 8,         /* magnitudes 0 through 7 */
-  mvnum_short_bits = 3,         /* number of bits for short mvs */
-
-  mvfp_max  = 255,              /* max absolute value of a full pixel MV component */
-  MVfpvals = (2 * mvfp_max) + 1, /* # possible full pixel MV values */
-
-  /* probability offsets for coding each MV component */
-
-  mvpis_short = 0,         /* short (<= 7) vs long (>= 8) */
-  MVPsign,                /* sign for non-zero */
-  MVPshort,               /* 8 short values = 7-position tree */
-
-  MVPbits = MVPshort + mvnum_short - 1, /* mvlong_width long value bits */
-  MVPcount = MVPbits + mvlong_width    /* (with independent probabilities) */
-};
-
-typedef struct mv_context {
-  vp8_prob prob[MVPcount];  /* often come in row, col pairs */
-} MV_CONTEXT;
-
-extern const MV_CONTEXT vp8_mv_update_probs[2], vp8_default_mv_context[2];
-
-enum {
-  mv_max_hp  = 2047,              /* max absolute value of a MV component */
-  MVvals_hp = (2 * mv_max_hp) + 1,   /* # possible values "" */
-  mvlong_width_hp = 11,       /* Large MVs have 9 bit magnitudes */
-  mvnum_short_hp = 16,         /* magnitudes 0 through 15 */
-  mvnum_short_bits_hp = 4,         /* number of bits for short mvs */
-
-  mvfp_max_hp  = 255,              /* max absolute value of a full pixel MV component */
-  MVfpvals_hp = (2 * mvfp_max_hp) + 1, /* # possible full pixel MV values */
-
-  /* probability offsets for coding each MV component */
-
-  mvpis_short_hp = 0,         /* short (<= 7) vs long (>= 8) */
-  MVPsign_hp,                /* sign for non-zero */
-  MVPshort_hp,               /* 8 short values = 7-position tree */
-
-  MVPbits_hp = MVPshort_hp + mvnum_short_hp - 1, /* mvlong_width long value bits */
-  MVPcount_hp = MVPbits_hp + mvlong_width_hp    /* (with independent probabilities) */
-};
-
-typedef struct mv_context_hp {
-  vp8_prob prob[MVPcount_hp];  /* often come in row, col pairs */
-} MV_CONTEXT_HP;
-
-extern const MV_CONTEXT_HP vp8_mv_update_probs_hp[2], vp8_default_mv_context_hp[2];
-
-extern const vp8_tree_index vp8_small_mvtree[];
-extern struct vp8_token_struct vp8_small_mvencodings [8];
-extern const vp8_tree_index vp8_small_mvtree_hp[];
-extern struct vp8_token_struct vp8_small_mvencodings_hp [16];
-
-#endif  /* CONFIG_NEWMVENTROPY */
-
 #endif
diff --git a/vp8/common/findnearmv.c b/vp8/common/findnearmv.c
index 285aabd..5fc1350 100644
--- a/vp8/common/findnearmv.c
+++ b/vp8/common/findnearmv.c
@@ -10,7 +10,7 @@
 
 
 #include "findnearmv.h"
-#include "vp8/encoder/variance.h"
+#include "vp8/common/sadmxn.h"
 #include <limits.h>
 
 const unsigned char vp8_mbsplit_offset[4][16] = {
@@ -22,11 +22,7 @@
 
 static void lower_mv_precision(int_mv *mv, int usehp)
 {
-#if CONFIG_NEWMVENTROPY
   if (!usehp || !vp8_use_nmv_hp(&mv->as_mv)) {
-#else
-  if (!usehp) {
-#endif
     if (mv->as_mv.row & 1)
       mv->as_mv.row += (mv->as_mv.row > 0 ? -1 : 1);
     if (mv->as_mv.col & 1)
@@ -199,6 +195,23 @@
 }
 
 #if CONFIG_NEWBESTREFMV
+unsigned int vp8_sad3x16_c(
+  const unsigned char *src_ptr,
+  int  src_stride,
+  const unsigned char *ref_ptr,
+  int  ref_stride,
+  int max_sad) {
+  return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 3, 16);
+}
+unsigned int vp8_sad16x3_c(
+  const unsigned char *src_ptr,
+  int  src_stride,
+  const unsigned char *ref_ptr,
+  int  ref_stride,
+  int max_sad) {
+  return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 3);
+}
+
 /* check a list of motion vectors by sad score using a number rows of pixels
  * above and a number cols of pixels in the left to select the one with best
  * score to use as ref motion vector
@@ -241,11 +254,10 @@
 
     // If we see a 0,0 vector for a second time we have reached the end of
     // the list of valid candidate vectors.
-    if (!this_mv.as_int)
-      if (zero_seen)
-        break;
-      else
-        zero_seen = TRUE;
+    if (!this_mv.as_int && zero_seen)
+      break;
+
+    zero_seen = zero_seen || !this_mv.as_int;
 
     vp8_clamp_mv(&this_mv,
                  xd->mb_to_left_edge - LEFT_TOP_MARGIN + 16,
@@ -261,10 +273,10 @@
 
     sad = 0;
     if (xd->up_available)
-      sad += vp8_sad16x3_c(above_src, xd->dst.y_stride,
+      sad += vp8_sad16x3(above_src, xd->dst.y_stride,
                            above_ref + offset, ref_y_stride, INT_MAX);
     if (xd->left_available)
-      sad += vp8_sad3x16_c(left_src, xd->dst.y_stride,
+      sad += vp8_sad3x16(left_src, xd->dst.y_stride,
                            left_ref + offset, ref_y_stride, INT_MAX);
     // Add the entry to our list and then resort the list on score.
     sad_scores[i] = sad;
diff --git a/vp8/common/findnearmv.h b/vp8/common/findnearmv.h
index cd7b87a..345a7c1 100644
--- a/vp8/common/findnearmv.h
+++ b/vp8/common/findnearmv.h
@@ -159,45 +159,34 @@
   if (!(b & 3)) {
     /* On L edge, get from MB to left of us */
     --cur_mb;
-    switch (cur_mb->mbmi.mode) {
-      case DC_PRED:
-        return B_DC_PRED;
-      case V_PRED:
-        return B_VE_PRED;
-      case H_PRED:
-        return B_HE_PRED;
-      case TM_PRED:
-        return B_TM_PRED;
-      case I8X8_PRED:
-      case B_PRED:
-        return (cur_mb->bmi + b + 3)->as_mode.first;
-      default:
-        return B_DC_PRED;
+
+    if (cur_mb->mbmi.mode < I8X8_PRED) {
+      return pred_mode_conv(cur_mb->mbmi.mode);
+    } else if (cur_mb->mbmi.mode == I8X8_PRED) {
+      return pred_mode_conv((cur_mb->bmi + 3 + b)->as_mode.first);
+    } else if (cur_mb->mbmi.mode == B_PRED) {
+      return ((cur_mb->bmi + 3 + b)->as_mode.first);
+    } else {
+      return B_DC_PRED;
     }
   }
   return (cur_mb->bmi + b - 1)->as_mode.first;
 }
 
-static B_PREDICTION_MODE above_block_mode(const MODE_INFO
-                                          *cur_mb, int b, int mi_stride) {
+static B_PREDICTION_MODE above_block_mode(const MODE_INFO *cur_mb,
+                                          int b, int mi_stride) {
   if (!(b >> 2)) {
     /* On top edge, get from MB above us */
     cur_mb -= mi_stride;
 
-    switch (cur_mb->mbmi.mode) {
-      case DC_PRED:
-        return B_DC_PRED;
-      case V_PRED:
-        return B_VE_PRED;
-      case H_PRED:
-        return B_HE_PRED;
-      case TM_PRED:
-        return B_TM_PRED;
-      case I8X8_PRED:
-      case B_PRED:
-        return (cur_mb->bmi + b + 12)->as_mode.first;
-      default:
-        return B_DC_PRED;
+    if (cur_mb->mbmi.mode < I8X8_PRED) {
+      return pred_mode_conv(cur_mb->mbmi.mode);
+    } else if (cur_mb->mbmi.mode == I8X8_PRED) {
+      return pred_mode_conv((cur_mb->bmi + 12 + b)->as_mode.first);
+    } else if (cur_mb->mbmi.mode == B_PRED) {
+      return ((cur_mb->bmi + 12 + b)->as_mode.first);
+    } else {
+      return B_DC_PRED;
     }
   }
 
diff --git a/vp8/common/idct.h b/vp8/common/idct.h
index d096e81..ae33df6 100644
--- a/vp8/common/idct.h
+++ b/vp8/common/idct.h
@@ -109,12 +109,9 @@
 extern prototype_second_order(vp8_short_inv_walsh4x4_1_lossless_c);
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
 #include "vp8/common/blockd.h"
 void vp8_ihtllm_c(short *input, short *output, int pitch,
                   TX_TYPE tx_type, int tx_dim);
-#endif
-
 
 typedef prototype_idct((*vp8_idct_fn_t));
 typedef prototype_idct_scalar_add((*vp8_idct_scalar_add_fn_t));
diff --git a/vp8/common/idctllm.c b/vp8/common/idctllm.c
index 7b3ac36..c7369b2 100644
--- a/vp8/common/idctllm.c
+++ b/vp8/common/idctllm.c
@@ -26,9 +26,7 @@
 #include "vp8/common/idct.h"
 #include "vp8/common/systemdependent.h"
 
-#if CONFIG_HYBRIDTRANSFORM
 #include "vp8/common/blockd.h"
-#endif
 
 #include <math.h>
 
@@ -38,7 +36,6 @@
 
 // TODO: these transforms can be further converted into integer forms
 //       for complexity optimization
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
 float idct_4[16] = {
   0.500000000000000,   0.653281482438188,   0.500000000000000,   0.270598050073099,
   0.500000000000000,   0.270598050073099,  -0.500000000000000,  -0.653281482438188,
@@ -90,9 +87,7 @@
   0.483002021635509,  -0.466553967085785,   0.434217976756762,  -0.387095214016348,
   0.326790388032145,  -0.255357107325375,   0.175227946595736,  -0.089131608307532
 };
-#endif
 
-#if CONFIG_HYBRIDTRANSFORM16X16 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8
 float idct_16[256] = {
   0.250000,  0.351851,  0.346760,  0.338330,  0.326641,  0.311806,  0.293969,  0.273300,
   0.250000,  0.224292,  0.196424,  0.166664,  0.135299,  0.102631,  0.068975,  0.034654,
@@ -162,9 +157,7 @@
   0.347761, -0.344612,  0.338341, -0.329007,  0.316693, -0.301511,  0.283599, -0.263118,
   0.240255, -0.215215,  0.188227, -0.159534,  0.129396, -0.098087,  0.065889, -0.033094
 };
-#endif
 
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
 void vp8_ihtllm_c(short *input, short *output, int pitch,
                   TX_TYPE tx_type, int tx_dim) {
 
@@ -189,6 +182,7 @@
     // pointers to vertical and horizontal transforms
     float *ptv, *pth;
 
+    assert(tx_type != DCT_DCT);
     // load and convert residual array into floating-point
     for(j = 0; j < tx_dim; j++) {
       for(i = 0; i < tx_dim; i++) {
@@ -288,7 +282,6 @@
   }
   vp8_clear_system_state(); // Make it simd safe : __asm emms;
 }
-#endif
 
 void vp8_short_idct4x4llm_c(short *input, short *output, int pitch) {
   int i;
diff --git a/vp8/common/loopfilter_filters.c b/vp8/common/loopfilter_filters.c
index 3f97d21..323d48d 100644
--- a/vp8/common/loopfilter_filters.c
+++ b/vp8/common/loopfilter_filters.c
@@ -7,8 +7,6 @@
  *  in the file PATENTS.  All contributing project authors may
  *  be found in the AUTHORS file in the root of the source tree.
  */
-
-
 #include <stdlib.h>
 #include "vpx_config.h"
 #include "loopfilter.h"
@@ -94,6 +92,7 @@
   *op1 = u ^ 0x80;
 
 }
+
 void vp8_loop_filter_horizontal_edge_c
 (
   unsigned char *s,
@@ -218,6 +217,7 @@
     Filter2 = vp8_signed_char_clamp(vp8_filter + 3);
     Filter1 >>= 3;
     Filter2 >>= 3;
+
     u = vp8_signed_char_clamp(qs0 - Filter1);
     *oq0 = u ^ 0x80;
     u = vp8_signed_char_clamp(ps0 + Filter2);
@@ -271,8 +271,6 @@
   } while (++i < count * 8);
 
 }
-
-
 void vp8_mbloop_filter_vertical_edge_c
 (
   unsigned char *s,
diff --git a/vp8/common/onyxc_int.h b/vp8/common/onyxc_int.h
index 0396a70..38df350 100644
--- a/vp8/common/onyxc_int.h
+++ b/vp8/common/onyxc_int.h
@@ -51,27 +51,14 @@
   vp8_prob sub_mv_ref_prob [SUBMVREF_COUNT][VP8_SUBMVREFS - 1];
   vp8_prob mbsplit_prob [VP8_NUMMBSPLITS - 1];
   vp8_prob coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM
   vp8_prob hybrid_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#endif
   vp8_prob coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_prob hybrid_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#endif
   vp8_prob coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_prob hybrid_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#endif
 
-#if CONFIG_NEWMVENTROPY
   nmv_context nmvc;
   nmv_context pre_nmvc;
-#else
-  MV_CONTEXT mvc[2];
-  MV_CONTEXT_HP mvc_hp[2];
-  MV_CONTEXT pre_mvc[2];
-  MV_CONTEXT_HP pre_mvc_hp[2];
-#endif
   vp8_prob pre_bmode_prob [VP8_BINTRAMODES - 1];
   vp8_prob pre_ymode_prob [VP8_YMODES - 1]; /* interframe intra mode probs */
   vp8_prob pre_uv_mode_prob [VP8_YMODES][VP8_UV_MODES - 1];
@@ -87,56 +74,37 @@
 
   vp8_prob pre_coef_probs [BLOCK_TYPES] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM
   vp8_prob pre_hybrid_coef_probs [BLOCK_TYPES] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#endif
 
   vp8_prob pre_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_prob pre_hybrid_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#endif
 
   vp8_prob pre_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_prob pre_hybrid_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
-#endif
 
   unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#if CONFIG_HYBRIDTRANSFORM
   unsigned int hybrid_coef_counts [BLOCK_TYPES] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
 
   unsigned int coef_counts_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#if CONFIG_HYBRIDTRANSFORM8X8
   unsigned int hybrid_coef_counts_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
 
   unsigned int coef_counts_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#if CONFIG_HYBRIDTRANSFORM16X16
   unsigned int hybrid_coef_counts_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS]
       [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
 
-#if CONFIG_NEWMVENTROPY
   nmv_context_counts NMVcount;
-#else
-  unsigned int MVcount [2] [MVvals];
-  unsigned int MVcount_hp [2] [MVvals_hp];
-#endif
-#if CONFIG_SWITCHABLE_INTERP
-  vp8_prob switchable_interp_prob[VP8_SWITCHABLE_FILTERS+1]
-                                 [VP8_SWITCHABLE_FILTERS-1];
-#endif
+  vp8_prob switchable_interp_prob[VP8_SWITCHABLE_FILTERS + 1]
+                                 [VP8_SWITCHABLE_FILTERS - 1];
 
   int mode_context[6][4];
   int mode_context_a[6][4];
@@ -161,10 +129,8 @@
   ONLY_4X4            = 0,
   ALLOW_8X8           = 1,
   ALLOW_16X16         = 2,
-#if CONFIG_TX_SELECT
   TX_MODE_SELECT      = 3,
-#endif
-  NB_TXFM_MODES       = 3 + CONFIG_TX_SELECT,
+  NB_TXFM_MODES       = 4,
 } TXFM_MODE;
 
 typedef struct VP8_COMMON_RTCD {
@@ -302,10 +268,8 @@
 
   vp8_prob prob_comppred[COMP_PRED_CONTEXTS];
 
-#if CONFIG_TX_SELECT
   // FIXME contextualize
   vp8_prob prob_tx[TX_SIZE_MAX - 1];
-#endif
 
   vp8_prob mbskip_pred_probs[MBSKIP_CONTEXTS];
 
diff --git a/vp8/common/postproc.c b/vp8/common/postproc.c
index 17bbe32..388612e 100644
--- a/vp8/common/postproc.c
+++ b/vp8/common/postproc.c
@@ -783,7 +783,7 @@
 
         if (mi->mbmi.mode == SPLITMV) {
           switch (mi->mbmi.partitioning) {
-            case 0 : {  /* mv_top_bottom */
+            case PARTITIONING_16X8 : {  /* mv_top_bottom */
               union b_mode_info *bmi = &mi->bmi[0];
               MV *mv = &bmi->mv.as_mv;
 
@@ -803,7 +803,7 @@
 
               break;
             }
-            case 1 : {  /* mv_left_right */
+            case PARTITIONING_8X16 : {  /* mv_left_right */
               union b_mode_info *bmi = &mi->bmi[0];
               MV *mv = &bmi->mv.as_mv;
 
@@ -823,7 +823,7 @@
 
               break;
             }
-            case 2 : {  /* mv_quarters   */
+            case PARTITIONING_8X8 : {  /* mv_quarters   */
               union b_mode_info *bmi = &mi->bmi[0];
               MV *mv = &bmi->mv.as_mv;
 
@@ -858,6 +858,7 @@
               vp8_blit_line(x0 + 12,  x1, y0 + 12,  y1, y_buffer, y_stride);
               break;
             }
+            case PARTITIONING_4X4:
             default : {
               union b_mode_info *bmi = mi->bmi;
               int bx0, by0;
diff --git a/vp8/common/pred_common.c b/vp8/common/pred_common.c
index cb80a0f..a97eed8 100644
--- a/vp8/common/pred_common.c
+++ b/vp8/common/pred_common.c
@@ -15,8 +15,8 @@
 // TBD prediction functions for various bitstream signals
 
 // Returns a context number for the given MB prediction signal
-unsigned char get_pred_context(VP8_COMMON *const cm,
-                               MACROBLOCKD *const xd,
+unsigned char get_pred_context(const VP8_COMMON *const cm,
+                               const MACROBLOCKD *const xd,
                                PRED_ID pred_id) {
   int pred_context;
   MODE_INFO *m = xd->mode_info_context;
@@ -63,7 +63,6 @@
                      (m - cm->mode_info_stride)->mbmi.mb_skip_coeff;
       break;
 
-#if CONFIG_SWITCHABLE_INTERP
     case PRED_SWITCHABLE_INTERP:
       {
         int left_in_image = (m - 1)->mbmi.mb_in_image;
@@ -93,7 +92,6 @@
           pred_context = VP8_SWITCHABLE_FILTERS;
       }
       break;
-#endif
 
     default:
       // TODO *** add error trap code.
@@ -106,8 +104,8 @@
 
 // This function returns a context probability for coding a given
 // prediction signal
-vp8_prob get_pred_prob(VP8_COMMON *const cm,
-                       MACROBLOCKD *const xd,
+vp8_prob get_pred_prob(const VP8_COMMON *const cm,
+                       const MACROBLOCKD *const xd,
                        PRED_ID pred_id) {
   vp8_prob pred_probability;
   int pred_context;
@@ -146,10 +144,10 @@
 
 // This function returns a context probability ptr for coding a given
 // prediction signal
-vp8_prob *get_pred_probs(VP8_COMMON *const cm,
-                         MACROBLOCKD *const xd,
+const vp8_prob *get_pred_probs(const VP8_COMMON *const cm,
+                         const MACROBLOCKD *const xd,
                          PRED_ID pred_id) {
-  vp8_prob *pred_probability;
+  const vp8_prob *pred_probability;
   int pred_context;
 
   // Get the appropriate prediction context
@@ -175,11 +173,10 @@
       pred_probability = &cm->mbskip_pred_probs[pred_context];
       break;
 
-#if CONFIG_SWITCHABLE_INTERP
     case PRED_SWITCHABLE_INTERP:
       pred_probability = &cm->fc.switchable_interp_prob[pred_context][0];
       break;
-#endif
+
     default:
       // TODO *** add error trap code.
       pred_probability = NULL;
@@ -191,7 +188,7 @@
 
 // This function returns the status of the given prediction signal.
 // I.e. is the predicted value for the given signal correct.
-unsigned char get_pred_flag(MACROBLOCKD *const xd,
+unsigned char get_pred_flag(const MACROBLOCKD *const xd,
                             PRED_ID pred_id) {
   unsigned char pred_flag = 0;
 
@@ -260,14 +257,14 @@
 // peredict various bitstream signals.
 
 // Macroblock segment id prediction function
-unsigned char get_pred_mb_segid(VP8_COMMON *const cm, int MbIndex) {
+unsigned char get_pred_mb_segid(const VP8_COMMON *const cm, int MbIndex) {
   // Currently the prediction for the macroblock segment ID is
   // the value stored for this macroblock in the previous frame.
   return cm->last_frame_seg_map[MbIndex];
 }
 
-MV_REFERENCE_FRAME get_pred_ref(VP8_COMMON *const cm,
-                                MACROBLOCKD *const xd) {
+MV_REFERENCE_FRAME get_pred_ref(const VP8_COMMON *const cm,
+                                const MACROBLOCKD *const xd) {
   MODE_INFO *m = xd->mode_info_context;
 
   MV_REFERENCE_FRAME left;
diff --git a/vp8/common/pred_common.h b/vp8/common/pred_common.h
index f4992f5..2a9875d 100644
--- a/vp8/common/pred_common.h
+++ b/vp8/common/pred_common.h
@@ -22,25 +22,22 @@
   PRED_REF = 1,
   PRED_COMP = 2,
   PRED_MBSKIP = 3,
-#if CONFIG_SWITCHABLE_INTERP
-  PRED_SWITCHABLE_INTERP = 4,
-#endif
+  PRED_SWITCHABLE_INTERP = 4
 } PRED_ID;
 
-
-extern unsigned char get_pred_context(VP8_COMMON *const cm,
-                                      MACROBLOCKD *const xd,
+extern unsigned char get_pred_context(const VP8_COMMON *const cm,
+                                      const MACROBLOCKD *const xd,
                                       PRED_ID pred_id);
 
-extern vp8_prob get_pred_prob(VP8_COMMON *const cm,
-                              MACROBLOCKD *const xd,
+extern vp8_prob get_pred_prob(const VP8_COMMON *const cm,
+                              const MACROBLOCKD *const xd,
                               PRED_ID pred_id);
 
-extern vp8_prob *get_pred_probs(VP8_COMMON *const cm,
-                                MACROBLOCKD *const xd,
+extern const vp8_prob *get_pred_probs(const VP8_COMMON *const cm,
+                                const MACROBLOCKD *const xd,
                                 PRED_ID pred_id);
 
-extern unsigned char get_pred_flag(MACROBLOCKD *const xd,
+extern unsigned char get_pred_flag(const MACROBLOCKD *const xd,
                                    PRED_ID pred_id);
 
 extern void set_pred_flag(MACROBLOCKD *const xd,
@@ -48,10 +45,10 @@
                           unsigned char pred_flag);
 
 
-extern unsigned char get_pred_mb_segid(VP8_COMMON *const cm, int MbIndex);
+extern unsigned char get_pred_mb_segid(const VP8_COMMON *const cm, int MbIndex);
 
-extern MV_REFERENCE_FRAME get_pred_ref(VP8_COMMON *const cm,
-                                       MACROBLOCKD *const xd);
+extern MV_REFERENCE_FRAME get_pred_ref(const VP8_COMMON *const cm,
+                                       const MACROBLOCKD *const xd);
 extern void compute_mod_refprobs(VP8_COMMON *const cm);
 
 #endif /* __INC_PRED_COMMON_H__ */
diff --git a/vp8/common/reconinter.c b/vp8/common/reconinter.c
index 1c4cdb3..6c60845 100644
--- a/vp8/common/reconinter.c
+++ b/vp8/common/reconinter.c
@@ -36,13 +36,7 @@
         &cm->rtcd.subpix, sixtap_avg8x8);
     xd->subpixel_predict_avg16x16 = SUBPIX_INVOKE(
         &cm->rtcd.subpix, sixtap_avg16x16);
-  }
-  else if (mcomp_filter_type == EIGHTTAP
-#if CONFIG_SWITCHABLE_INTERP
-           ||
-           mcomp_filter_type == SWITCHABLE
-#endif
-          ) {
+  } else if (mcomp_filter_type == EIGHTTAP || mcomp_filter_type == SWITCHABLE) {
     xd->subpixel_predict        = SUBPIX_INVOKE(
         &cm->rtcd.subpix, eighttap4x4);
     xd->subpixel_predict8x4     = SUBPIX_INVOKE(
@@ -294,7 +288,7 @@
   }
 }
 
-static void build_inter_predictors4b(MACROBLOCKD *xd, BLOCKD *d, int pitch) {
+void vp8_build_inter_predictors4b(MACROBLOCKD *xd, BLOCKD *d, int pitch) {
   unsigned char *ptr_base;
   unsigned char *ptr;
   unsigned char *pred_ptr = d->predictor;
@@ -319,8 +313,8 @@
  * come from an earlier call to build_inter_predictors_4b()) with the
  * predictor of the second reference frame / motion vector.
  */
-static void build_2nd_inter_predictors4b(MACROBLOCKD *xd,
-                                         BLOCKD *d, int pitch) {
+void vp8_build_2nd_inter_predictors4b(MACROBLOCKD *xd,
+                                      BLOCKD *d, int pitch) {
   unsigned char *ptr_base;
   unsigned char *ptr;
   unsigned char *pred_ptr = d->predictor;
@@ -965,7 +959,7 @@
   MB_MODE_INFO * mbmi = &xd->mode_info_context->mbmi;
   BLOCKD *blockd = xd->block;
 
-  if (xd->mode_info_context->mbmi.partitioning < 3) {
+  if (xd->mode_info_context->mbmi.partitioning != PARTITIONING_4X4) {
     blockd[ 0].bmi = xd->mode_info_context->bmi[ 0];
     blockd[ 2].bmi = xd->mode_info_context->bmi[ 2];
     blockd[ 8].bmi = xd->mode_info_context->bmi[ 8];
@@ -985,16 +979,16 @@
     }
 
 
-    build_inter_predictors4b(xd, &blockd[ 0], 16);
-    build_inter_predictors4b(xd, &blockd[ 2], 16);
-    build_inter_predictors4b(xd, &blockd[ 8], 16);
-    build_inter_predictors4b(xd, &blockd[10], 16);
+    vp8_build_inter_predictors4b(xd, &blockd[ 0], 16);
+    vp8_build_inter_predictors4b(xd, &blockd[ 2], 16);
+    vp8_build_inter_predictors4b(xd, &blockd[ 8], 16);
+    vp8_build_inter_predictors4b(xd, &blockd[10], 16);
 
     if (mbmi->second_ref_frame) {
-      build_2nd_inter_predictors4b(xd, &blockd[ 0], 16);
-      build_2nd_inter_predictors4b(xd, &blockd[ 2], 16);
-      build_2nd_inter_predictors4b(xd, &blockd[ 8], 16);
-      build_2nd_inter_predictors4b(xd, &blockd[10], 16);
+      vp8_build_2nd_inter_predictors4b(xd, &blockd[ 0], 16);
+      vp8_build_2nd_inter_predictors4b(xd, &blockd[ 2], 16);
+      vp8_build_2nd_inter_predictors4b(xd, &blockd[ 8], 16);
+      vp8_build_2nd_inter_predictors4b(xd, &blockd[10], 16);
     }
   } else {
     for (i = 0; i < 16; i += 2) {
diff --git a/vp8/common/reconinter.h b/vp8/common/reconinter.h
index 55044e5..c786119 100644
--- a/vp8/common/reconinter.h
+++ b/vp8/common/reconinter.h
@@ -59,6 +59,11 @@
 extern void vp8_build_2nd_inter_predictors_b(BLOCKD *d, int pitch,
                                              vp8_subpix_fn_t sppf);
 
+extern void vp8_build_inter_predictors4b(MACROBLOCKD *xd, BLOCKD *d,
+                                         int pitch);
+extern void vp8_build_2nd_inter_predictors4b(MACROBLOCKD *xd,
+                                             BLOCKD *d, int pitch);
+
 extern void vp8_build_inter4x4_predictors_mbuv(MACROBLOCKD *xd);
 extern void vp8_setup_interp_filters(MACROBLOCKD *xd,
                                      INTERPOLATIONFILTERTYPE filter,
diff --git a/vp8/common/reconintra4x4.c b/vp8/common/reconintra4x4.c
index 0ba0a2c..dfbaf13 100644
--- a/vp8/common/reconintra4x4.c
+++ b/vp8/common/reconintra4x4.c
@@ -298,18 +298,19 @@
 void vp8_intra_prediction_down_copy(MACROBLOCKD *xd) {
   unsigned char *above_right = *(xd->block[0].base_dst) + xd->block[0].dst -
                                xd->block[0].dst_stride + 16;
+  unsigned int *src_ptr = (unsigned int *)
+      (above_right - (xd->mb_index == 3 ? 16 * xd->block[0].dst_stride : 0));
 
-  unsigned int *src_ptr = (unsigned int *)above_right;
-  unsigned int *dst_ptr0 =
-    (unsigned int *)(above_right + 4 * xd->block[0].dst_stride);
+  unsigned int *dst_ptr0 = (unsigned int *)above_right;
   unsigned int *dst_ptr1 =
-    (unsigned int *)(above_right + 8 * xd->block[0].dst_stride);
+    (unsigned int *)(above_right + 4 * xd->block[0].dst_stride);
   unsigned int *dst_ptr2 =
+    (unsigned int *)(above_right + 8 * xd->block[0].dst_stride);
+  unsigned int *dst_ptr3 =
     (unsigned int *)(above_right + 12 * xd->block[0].dst_stride);
 
   *dst_ptr0 = *src_ptr;
   *dst_ptr1 = *src_ptr;
   *dst_ptr2 = *src_ptr;
+  *dst_ptr3 = *src_ptr;
 }
-
-
diff --git a/vp8/common/rtcd.c b/vp8/common/rtcd.c
index a7bb92c..01dad46 100644
--- a/vp8/common/rtcd.c
+++ b/vp8/common/rtcd.c
@@ -11,20 +11,95 @@
 #define RTCD_C
 #include "vpx_rtcd.h"
 
+#if CONFIG_MULTITHREAD && defined(_WIN32)
+#include <windows.h>
+#include <stdlib.h>
+static void once(void (*func)(void))
+{
+    static CRITICAL_SECTION *lock;
+    static LONG waiters;
+    static int done;
+    void *lock_ptr = &lock;
+
+    /* If the initialization is complete, return early. This isn't just an
+     * optimization, it prevents races on the destruction of the global
+     * lock.
+     */
+    if(done)
+        return;
+
+    InterlockedIncrement(&waiters);
+
+    /* Get a lock. We create one and try to make it the one-true-lock,
+     * throwing it away if we lost the race.
+     */
+
+    {
+        /* Scope to protect access to new_lock */
+        CRITICAL_SECTION *new_lock = malloc(sizeof(CRITICAL_SECTION));
+        InitializeCriticalSection(new_lock);
+        if (InterlockedCompareExchangePointer(lock_ptr, new_lock, NULL) != NULL)
+        {
+            DeleteCriticalSection(new_lock);
+            free(new_lock);
+        }
+    }
+
+    /* At this point, we have a lock that can be synchronized on. We don't
+     * care which thread actually performed the allocation.
+     */
+
+    EnterCriticalSection(lock);
+
+    if (!done)
+    {
+        func();
+        done = 1;
+    }
+
+    LeaveCriticalSection(lock);
+
+    /* Last one out should free resources. The destructed objects are
+     * protected by checking if(done) above.
+     */
+    if(!InterlockedDecrement(&waiters))
+    {
+        DeleteCriticalSection(lock);
+        free(lock);
+        lock = NULL;
+    }
+}
+
+
+#elif CONFIG_MULTITHREAD && HAVE_PTHREAD_H
+#include <pthread.h>
+static void once(void (*func)(void))
+{
+    static pthread_once_t lock = PTHREAD_ONCE_INIT;
+    pthread_once(&lock, func);
+}
+
+
+#else
 /* No-op version that performs no synchronization. vpx_rtcd() is idempotent,
  * so as long as your platform provides atomic loads/stores of pointers
  * no synchronization is strictly necessary.
  */
 
-static void once(void (*func)(void)) {
-  static int done;
+static void once(void (*func)(void))
+{
+    static int done;
 
-  if(!done) {
-    func();
-    done = 1;
-  }
+    if(!done)
+    {
+        func();
+        done = 1;
+    }
 }
+#endif
 
-void vpx_rtcd() {
-  once(setup_rtcd_internal);
+
+void vpx_rtcd()
+{
+    once(setup_rtcd_internal);
 }
diff --git a/vp8/common/rtcd_defs.sh b/vp8/common/rtcd_defs.sh
index ef272df..ea64c96 100644
--- a/vp8/common/rtcd_defs.sh
+++ b/vp8/common/rtcd_defs.sh
@@ -125,22 +125,22 @@
 # Loopfilter
 #
 prototype void vp8_loop_filter_mbv "unsigned char *y, unsigned char *u, unsigned char *v, int ystride, int uv_stride, struct loop_filter_info *lfi"
-specialize vp8_loop_filter_mbv;
+specialize vp8_loop_filter_mbv sse2
 
 prototype void vp8_loop_filter_bv "unsigned char *y, unsigned char *u, unsigned char *v, int ystride, int uv_stride, struct loop_filter_info *lfi"
-specialize vp8_loop_filter_bv;
+specialize vp8_loop_filter_bv sse2
 
 prototype void vp8_loop_filter_bv8x8 "unsigned char *y, unsigned char *u, unsigned char *v, int ystride, int uv_stride, struct loop_filter_info *lfi"
-specialize vp8_loop_filter_bv8x8;
+specialize vp8_loop_filter_bv8x8 sse2
 
 prototype void vp8_loop_filter_mbh "unsigned char *y, unsigned char *u, unsigned char *v, int ystride, int uv_stride, struct loop_filter_info *lfi"
-specialize vp8_loop_filter_mbh;
+specialize vp8_loop_filter_mbh sse2
 
 prototype void vp8_loop_filter_bh "unsigned char *y, unsigned char *u, unsigned char *v, int ystride, int uv_stride, struct loop_filter_info *lfi"
-specialize vp8_loop_filter_bh;
+specialize vp8_loop_filter_bh sse2
 
 prototype void vp8_loop_filter_bh8x8 "unsigned char *y, unsigned char *u, unsigned char *v, int ystride, int uv_stride, struct loop_filter_info *lfi"
-specialize vp8_loop_filter_bh8x8;
+specialize vp8_loop_filter_bh8x8 sse2
 
 prototype void vp8_loop_filter_simple_mbv "unsigned char *y, int ystride, const unsigned char *blimit"
 specialize vp8_loop_filter_simple_mbv mmx sse2 media neon
@@ -174,3 +174,210 @@
 vp8_loop_filter_simple_bh_media=vp8_loop_filter_bhs_armv6
 vp8_loop_filter_simple_bh_neon=vp8_loop_filter_bhs_neon
 
+#
+# sad 16x3, 3x16
+#
+prototype unsigned int vp8_sad16x3 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int ref_stride, int max_sad"
+specialize vp8_sad16x3
+
+prototype unsigned int vp8_sad3x16 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int ref_stride, int max_sad"
+specialize vp8_sad3x16
+
+#
+# Encoder functions below this point.
+#
+if [ "$CONFIG_VP8_ENCODER" = "yes" ]; then
+
+
+# variance
+[ $arch = "x86_64" ] && mmx_x86_64=mmx && sse2_x86_64=sse2
+
+prototype unsigned int vp8_variance32x32 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance32x32
+
+prototype unsigned int vp8_variance16x16 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance16x16 mmx sse2
+vp8_variance16x16_sse2=vp8_variance16x16_wmt
+vp8_variance16x16_mmx=vp8_variance16x16_mmx
+
+prototype unsigned int vp8_variance16x8 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance16x8 mmx sse2
+vp8_variance16x8_sse2=vp8_variance16x8_wmt
+vp8_variance16x8_mmx=vp8_variance16x8_mmx
+
+prototype unsigned int vp8_variance8x16 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance8x16 mmx sse2
+vp8_variance8x16_sse2=vp8_variance8x16_wmt
+vp8_variance8x16_mmx=vp8_variance8x16_mmx
+
+prototype unsigned int vp8_variance8x8 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance8x8 mmx sse2
+vp8_variance8x8_sse2=vp8_variance8x8_wmt
+vp8_variance8x8_mmx=vp8_variance8x8_mmx
+
+prototype unsigned int vp8_variance4x4 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance4x4 mmx sse2
+vp8_variance4x4_sse2=vp8_variance4x4_wmt
+vp8_variance4x4_mmx=vp8_variance4x4_mmx
+
+prototype unsigned int vp8_sub_pixel_variance32x32 "const unsigned char *src_ptr, int source_stride, int xoffset, int  yoffset, const unsigned char *ref_ptr, int Refstride, unsigned int *sse"
+specialize vp8_sub_pixel_variance32x32
+
+prototype unsigned int vp8_sub_pixel_variance16x16 "const unsigned char *src_ptr, int source_stride, int xoffset, int  yoffset, const unsigned char *ref_ptr, int Refstride, unsigned int *sse"
+specialize vp8_sub_pixel_variance16x16 sse2 mmx ssse3
+vp8_sub_pixel_variance16x16_sse2=vp8_sub_pixel_variance16x16_wmt
+
+prototype unsigned int vp8_sub_pixel_variance8x16 "const unsigned char *src_ptr, int source_stride, int xoffset, int  yoffset, const unsigned char *ref_ptr, int Refstride, unsigned int *sse"
+specialize vp8_sub_pixel_variance8x16 sse2 mmx
+vp8_sub_pixel_variance8x16_sse2=vp8_sub_pixel_variance8x16_wmt
+
+prototype unsigned int vp8_sub_pixel_variance16x8 "const unsigned char *src_ptr, int source_stride, int xoffset, int  yoffset, const unsigned char *ref_ptr, int Refstride, unsigned int *sse"
+specialize vp8_sub_pixel_variance16x8 sse2 mmx ssse3
+vp8_sub_pixel_variance16x8_sse2=vp8_sub_pixel_variance16x8_ssse3;
+vp8_sub_pixel_variance16x8_sse2=vp8_sub_pixel_variance16x8_wmt
+
+prototype unsigned int vp8_sub_pixel_variance8x8 "const unsigned char *src_ptr, int source_stride, int xoffset, int  yoffset, const unsigned char *ref_ptr, int Refstride, unsigned int *sse"
+specialize vp8_sub_pixel_variance8x8 sse2 mmx
+vp8_sub_pixel_variance8x8_sse2=vp8_sub_pixel_variance8x8_wmt
+
+prototype unsigned int vp8_sub_pixel_variance4x4 "const unsigned char *src_ptr, int source_stride, int xoffset, int  yoffset, const unsigned char *ref_ptr, int Refstride, unsigned int *sse"
+specialize vp8_sub_pixel_variance4x4 sse2 mmx
+vp8_sub_pixel_variance4x4_sse2=vp8_sub_pixel_variance4x4_wmt
+
+prototype unsigned int vp8_sad32x32 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int max_sad"
+specialize vp8_sad32x32
+
+prototype unsigned int vp8_sad16x16 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int max_sad"
+specialize vp8_sad16x16 mmx sse2 sse3
+vp8_sad16x16_sse2=vp8_sad16x16_wmt
+
+prototype unsigned int vp8_sad16x8 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int max_sad"
+specialize vp8_sad16x8 mmx sse2
+vp8_sad16x8_sse2=vp8_sad16x8_wmt
+
+prototype unsigned int vp8_sad8x16 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int max_sad"
+specialize vp8_sad8x16 mmx sse2
+vp8_sad8x16_sse2=vp8_sad8x16_wmt
+
+prototype unsigned int vp8_sad8x8 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int max_sad"
+specialize vp8_sad8x8 mmx sse2
+vp8_sad8x8_sse2=vp8_sad8x8_wmt
+
+prototype unsigned int vp8_sad4x4 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int max_sad"
+specialize vp8_sad4x4 mmx sse2
+vp8_sad4x4_sse2=vp8_sad4x4_wmt
+
+prototype unsigned int vp8_variance_halfpixvar16x16_h "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance_halfpixvar16x16_h mmx sse2
+vp8_variance_halfpixvar16x16_h_sse2=vp8_variance_halfpixvar16x16_h_wmt
+
+prototype unsigned int vp8_variance_halfpixvar16x16_v "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance_halfpixvar16x16_v mmx sse2
+vp8_variance_halfpixvar16x16_v_sse2=vp8_variance_halfpixvar16x16_v_wmt
+
+prototype unsigned int vp8_variance_halfpixvar16x16_hv "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance_halfpixvar16x16_hv mmx sse2
+vp8_variance_halfpixvar16x16_hv_sse2=vp8_variance_halfpixvar16x16_hv_wmt
+
+prototype unsigned int vp8_variance_halfpixvar32x32_h "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance_halfpixvar32x32_h
+
+prototype unsigned int vp8_variance_halfpixvar32x32_v "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance_halfpixvar32x32_v
+
+prototype unsigned int vp8_variance_halfpixvar32x32_hv "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, unsigned int *sse"
+specialize vp8_variance_halfpixvar32x32_hv
+
+prototype void vp8_sad32x32x3 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad32x32x3
+
+prototype void vp8_sad16x16x3 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad16x16x3 sse3 ssse3
+
+prototype void vp8_sad16x8x3 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad16x8x3 sse3 ssse3
+
+prototype void vp8_sad8x16x3 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad8x16x3 sse3
+
+prototype void vp8_sad8x8x3 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad8x8x3 sse3
+
+prototype void vp8_sad4x4x3 "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad4x4x3 sse3
+
+prototype void vp8_sad32x32x8 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned short *sad_array"
+specialize vp8_sad32x32x8
+
+prototype void vp8_sad16x16x8 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned short *sad_array"
+specialize vp8_sad16x16x8 sse4
+
+prototype void vp8_sad16x8x8 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned short *sad_array"
+specialize vp8_sad16x8x8 sse4
+
+prototype void vp8_sad8x16x8 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned short *sad_array"
+specialize vp8_sad8x16x8 sse4
+
+prototype void vp8_sad8x8x8 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned short *sad_array"
+specialize vp8_sad8x8x8 sse4
+
+prototype void vp8_sad4x4x8 "const unsigned char *src_ptr, int  src_stride, const unsigned char *ref_ptr, int  ref_stride, unsigned short *sad_array"
+specialize vp8_sad4x4x8 sse4
+
+prototype void vp8_sad32x32x4d "const unsigned char *src_ptr, int  src_stride, unsigned char *ref_ptr[], int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad32x32x4d
+
+prototype void vp8_sad16x16x4d "const unsigned char *src_ptr, int  src_stride, unsigned char *ref_ptr[], int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad16x16x4d sse3
+
+prototype void vp8_sad16x8x4d "const unsigned char *src_ptr, int  src_stride, unsigned char *ref_ptr[], int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad16x8x4d sse3
+
+prototype void vp8_sad8x16x4d "const unsigned char *src_ptr, int  src_stride, unsigned char *ref_ptr[], int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad8x16x4d sse3
+
+prototype void vp8_sad8x8x4d "const unsigned char *src_ptr, int  src_stride, unsigned char *ref_ptr[], int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad8x8x4d sse3
+
+prototype void vp8_sad4x4x4d "const unsigned char *src_ptr, int  src_stride, unsigned char *ref_ptr[], int  ref_stride, unsigned int *sad_array"
+specialize vp8_sad4x4x4d sse3
+
+#
+# Block copy
+#
+case $arch in
+    x86*)
+    prototype void vp8_copy32xn "const unsigned char *src_ptr, int source_stride, const unsigned char *ref_ptr, int ref_stride, int n"
+    specialize vp8_copy32xn sse2 sse3
+    ;;
+esac
+
+prototype unsigned int vp8_sub_pixel_mse16x16 "const unsigned char  *src_ptr, int  src_pixels_per_line, int  xoffset, int  yoffset, const unsigned char *dst_ptr, int dst_pixels_per_line, unsigned int *sse"
+specialize vp8_sub_pixel_mse16x16 sse2 mmx
+vp8_sub_pixel_mse16x16_sse2=vp8_sub_pixel_mse16x16_wmt
+
+prototype unsigned int vp8_mse16x16 "const unsigned char *src_ptr, int  source_stride, const unsigned char *ref_ptr, int  recon_stride, unsigned int *sse"
+specialize vp8_mse16x16 mmx sse2
+vp8_mse16x16_sse2=vp8_mse16x16_wmt
+
+prototype unsigned int vp8_sub_pixel_mse32x32 "const unsigned char  *src_ptr, int  source_stride, int  xoffset, int  yoffset, const unsigned char *ref_ptr, int Refstride, unsigned int *sse"
+specialize vp8_sub_pixel_mse32x32
+
+prototype unsigned int vp8_get_mb_ss "const short *"
+specialize vp8_get_mb_ss mmx sse2
+
+#
+# Structured Similarity (SSIM)
+#
+if [ "$CONFIG_INTERNAL_STATS" = "yes" ]; then
+    [ $arch = "x86_64" ] && sse2_on_x86_64=sse2
+
+    prototype void vp8_ssim_parms_8x8 "unsigned char *s, int sp, unsigned char *r, int rp, unsigned long *sum_s, unsigned long *sum_r, unsigned long *sum_sq_s, unsigned long *sum_sq_r, unsigned long *sum_sxr"
+    specialize vp8_ssim_parms_8x8 $sse2_on_x86_64
+
+    prototype void vp8_ssim_parms_16x16 "unsigned char *s, int sp, unsigned char *r, int rp, unsigned long *sum_s, unsigned long *sum_r, unsigned long *sum_sq_s, unsigned long *sum_sq_r, unsigned long *sum_sxr"
+    specialize vp8_ssim_parms_16x16 $sse2_on_x86_64
+fi
+
+fi
+# end encoder functions
diff --git a/vp8/common/sadmxn.h b/vp8/common/sadmxn.h
new file mode 100644
index 0000000..47b8dfc
--- /dev/null
+++ b/vp8/common/sadmxn.h
@@ -0,0 +1,37 @@
+/*
+ *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef __INC_SAD_H
+#define __INC_SAD_H
+
+static __inline
+unsigned int sad_mx_n_c(
+  const unsigned char *src_ptr,
+  int  src_stride,
+  const unsigned char *ref_ptr,
+  int  ref_stride,
+  int m,
+  int n) {
+  int r, c;
+  unsigned int sad = 0;
+
+  for (r = 0; r < n; r++) {
+    for (c = 0; c < m; c++) {
+      sad += abs(src_ptr[c] - ref_ptr[c]);
+    }
+
+    src_ptr += src_stride;
+    ref_ptr += ref_stride;
+  }
+
+  return sad;
+}
+
+#endif
diff --git a/vp8/common/seg_common.c b/vp8/common/seg_common.c
index b616391..a11fe87 100644
--- a/vp8/common/seg_common.c
+++ b/vp8/common/seg_common.c
@@ -19,7 +19,7 @@
 // the coding mechanism is still subject to change so these provide a
 // convenient single point of change.
 
-int segfeature_active(MACROBLOCKD *xd,
+int segfeature_active(const MACROBLOCKD *xd,
                       int segment_id,
                       SEG_LVL_FEATURES feature_id) {
   // Return true if mask bit set and segmentation enabled.
@@ -66,7 +66,7 @@
   xd->segment_feature_data[segment_id][feature_id] = seg_data;
 }
 
-int get_segdata(MACROBLOCKD *xd,
+int get_segdata(const MACROBLOCKD *xd,
                 int segment_id,
                 SEG_LVL_FEATURES feature_id) {
   return xd->segment_feature_data[segment_id][feature_id];
@@ -126,7 +126,7 @@
     (1 << ref_frame);
 }
 
-int check_segref(MACROBLOCKD *xd,
+int check_segref(const MACROBLOCKD *xd,
                  int segment_id,
                  MV_REFERENCE_FRAME ref_frame) {
   return (xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME] &
diff --git a/vp8/common/seg_common.h b/vp8/common/seg_common.h
index 7413192..59f40d1 100644
--- a/vp8/common/seg_common.h
+++ b/vp8/common/seg_common.h
@@ -15,7 +15,7 @@
 #ifndef __INC_SEG_COMMON_H__
 #define __INC_SEG_COMMON_H__ 1
 
-int segfeature_active(MACROBLOCKD *xd,
+int segfeature_active(const MACROBLOCKD *xd,
                       int segment_id,
                       SEG_LVL_FEATURES feature_id);
 
@@ -42,7 +42,7 @@
                  SEG_LVL_FEATURES feature_id,
                  int seg_data);
 
-int get_segdata(MACROBLOCKD *xd,
+int get_segdata(const MACROBLOCKD *xd,
                 int segment_id,
                 SEG_LVL_FEATURES feature_id);
 
@@ -73,7 +73,7 @@
                 int segment_id,
                 MV_REFERENCE_FRAME ref_frame);
 
-int check_segref(MACROBLOCKD *xd,
+int check_segref(const MACROBLOCKD *xd,
                  int segment_id,
                  MV_REFERENCE_FRAME ref_frame);
 
diff --git a/vp8/common/x86/loopfilter_mmx.asm b/vp8/common/x86/loopfilter_mmx.asm
index 697a5de..63b7238 100644
--- a/vp8/common/x86/loopfilter_mmx.asm
+++ b/vp8/common/x86/loopfilter_mmx.asm
@@ -594,790 +594,6 @@
     ret
 
 
-;void vp8_mbloop_filter_horizontal_edge_mmx
-;(
-;    unsigned char *src_ptr,
-;    int  src_pixel_step,
-;    const char *blimit,
-;    const char *limit,
-;    const char *thresh,
-;    int count
-;)
-global sym(vp8_mbloop_filter_horizontal_edge_mmx)
-sym(vp8_mbloop_filter_horizontal_edge_mmx):
-    push        rbp
-    mov         rbp, rsp
-    SHADOW_ARGS_TO_STACK 6
-    GET_GOT     rbx
-    push        rsi
-    push        rdi
-    ; end prolog
-
-    ALIGN_STACK 16, rax
-    sub          rsp, 32      ; reserve 32 bytes
-    %define t0   [rsp + 0]    ;__declspec(align(16)) char t0[8];
-    %define t1   [rsp + 16]   ;__declspec(align(16)) char t1[8];
-
-        mov         rsi, arg(0) ;src_ptr
-        movsxd      rax, dword ptr arg(1) ;src_pixel_step     ; destination pitch?
-
-        movsxd      rcx, dword ptr arg(5) ;count
-.next8_mbh:
-        mov         rdx, arg(3) ;limit
-        movq        mm7, [rdx]
-        mov         rdi, rsi              ; rdi points to row +1 for indirect addressing
-        add         rdi, rax
-
-        ; calculate breakout conditions
-        movq        mm2, [rdi+2*rax]      ; q3
-
-        movq        mm1, [rsi+2*rax]      ; q2
-        movq        mm6, mm1              ; q2
-        psubusb     mm1, mm2              ; q2-=q3
-        psubusb     mm2, mm6              ; q3-=q2
-        por         mm1, mm2              ; abs(q3-q2)
-        psubusb     mm1, mm7
-
-
-        ; mm1 = abs(q3-q2), mm6 =q2, mm7 = limit
-        movq        mm4, [rsi+rax]        ; q1
-        movq        mm3, mm4              ; q1
-        psubusb     mm4, mm6              ; q1-=q2
-        psubusb     mm6, mm3              ; q2-=q1
-        por         mm4, mm6              ; abs(q2-q1)
-        psubusb     mm4, mm7
-        por        mm1, mm4
-
-
-        ; mm1 = mask,      mm3=q1, mm7 = limit
-
-        movq        mm4, [rsi]            ; q0
-        movq        mm0, mm4              ; q0
-        psubusb     mm4, mm3              ; q0-=q1
-        psubusb     mm3, mm0              ; q1-=q0
-        por         mm4, mm3              ; abs(q0-q1)
-        movq        t0, mm4               ; save to t0
-        psubusb     mm4, mm7
-        por        mm1, mm4
-
-
-        ; mm1 = mask, mm0=q0,  mm7 = limit, t0 = abs(q0-q1)
-
-        neg         rax                   ; negate pitch to deal with above border
-
-        movq        mm2, [rsi+4*rax]      ; p3
-        movq        mm4, [rdi+4*rax]      ; p2
-        movq        mm5, mm4              ; p2
-        psubusb     mm4, mm2              ; p2-=p3
-        psubusb     mm2, mm5              ; p3-=p2
-        por         mm4, mm2              ; abs(p3 - p2)
-        psubusb     mm4, mm7
-        por        mm1, mm4
-        ; mm1 = mask, mm0=q0,  mm7 = limit, t0 = abs(q0-q1)
-
-        movq        mm4, [rsi+2*rax]      ; p1
-        movq        mm3, mm4              ; p1
-        psubusb     mm4, mm5              ; p1-=p2
-        psubusb     mm5, mm3              ; p2-=p1
-        por         mm4, mm5              ; abs(p2 - p1)
-        psubusb     mm4, mm7
-        por        mm1, mm4
-
-        movq        mm2, mm3              ; p1
-
-
-        ; mm1 = mask, mm0=q0,  mm7 = limit, t0 = abs(q0-q1)
-
-        movq        mm4, [rsi+rax]        ; p0
-        movq        mm5, mm4              ; p0
-        psubusb     mm4, mm3              ; p0-=p1
-        psubusb     mm3, mm5              ; p1-=p0
-        por         mm4, mm3              ; abs(p1 - p0)
-        movq        t1, mm4               ; save to t1
-        psubusb     mm4, mm7
-        por        mm1, mm4
-        ; mm1 = mask, mm0=q0,  mm7 = limit, t0 = abs(q0-q1) t1 = abs(p1-p0)
-        ; mm5 = p0
-        movq        mm3, [rdi]            ; q1
-        movq        mm4, mm3              ; q1
-        psubusb     mm3, mm2              ; q1-=p1
-        psubusb     mm2, mm4              ; p1-=q1
-        por         mm2, mm3              ; abs(p1-q1)
-        pand        mm2, [GLOBAL(tfe)]    ; set lsb of each byte to zero
-        psrlw       mm2, 1                ; abs(p1-q1)/2
-
-        movq        mm6, mm5              ; p0
-        movq        mm3, mm0              ; q0
-        psubusb     mm5, mm3              ; p0-=q0
-        psubusb     mm3, mm6              ; q0-=p0
-        por         mm5, mm3              ; abs(p0 - q0)
-        paddusb     mm5, mm5              ; abs(p0-q0)*2
-        paddusb     mm5, mm2              ; abs (p0 - q0) *2 + abs(p1-q1)/2
-
-        mov         rdx, arg(2) ;blimit           ; get blimit
-        movq        mm7, [rdx]            ; blimit
-
-        psubusb     mm5,    mm7           ; abs (p0 - q0) *2 + abs(p1-q1)/2  > blimit
-        por         mm1,    mm5
-        pxor        mm5,    mm5
-        pcmpeqb     mm1,    mm5           ; mask mm1
-
-        ; mm1 = mask, mm0=q0,  mm7 = blimit, t0 = abs(q0-q1) t1 = abs(p1-p0)
-        ; mm6 = p0,
-
-        ; calculate high edge variance
-        mov         rdx, arg(4) ;thresh           ; get thresh
-        movq        mm7, [rdx]            ;
-        movq        mm4, t0               ; get abs (q1 - q0)
-        psubusb     mm4, mm7
-        movq        mm3, t1               ; get abs (p1 - p0)
-        psubusb     mm3, mm7
-        paddb       mm4, mm3              ; abs(q1 - q0) > thresh || abs(p1 - p0) > thresh
-
-        pcmpeqb     mm4,        mm5
-
-        pcmpeqb     mm5,        mm5
-        pxor        mm4,        mm5
-
-
-
-        ; mm1 = mask, mm0=q0,  mm7 = thresh, t0 = abs(q0-q1) t1 = abs(p1-p0)
-        ; mm6 = p0, mm4=hev
-        ; start work on filters
-        movq        mm2, [rsi+2*rax]      ; p1
-        movq        mm7, [rdi]            ; q1
-        pxor        mm2, [GLOBAL(t80)]    ; p1 offset to convert to signed values
-        pxor        mm7, [GLOBAL(t80)]    ; q1 offset to convert to signed values
-        psubsb      mm2, mm7              ; p1 - q1
-
-        pxor        mm6, [GLOBAL(t80)]    ; offset to convert to signed values
-        pxor        mm0, [GLOBAL(t80)]    ; offset to convert to signed values
-        movq        mm3, mm0              ; q0
-        psubsb      mm0, mm6              ; q0 - p0
-        paddsb      mm2, mm0              ; 1 * (q0 - p0) + (p1 - q1)
-        paddsb      mm2, mm0              ; 2 * (q0 - p0)
-        paddsb      mm2, mm0              ; 3 * (q0 - p0) + (p1 - q1)
-        pand        mm1, mm2              ; mask filter values we don't care about
-
-
-        ; mm1 = vp8_filter, mm4=hev, mm6=ps0, mm3=qs0
-        movq        mm2, mm1              ; vp8_filter
-        pand        mm2, mm4;             ; Filter2 = vp8_filter & hev
-
-        movq        mm5,        mm2       ;
-        paddsb      mm5,        [GLOBAL(t3)];
-
-        pxor        mm0, mm0              ; 0
-        pxor        mm7, mm7              ; 0
-
-        punpcklbw   mm0, mm5              ; e0f0g0h0
-        psraw       mm0, 11               ; sign extended shift right by 3
-        punpckhbw   mm7, mm5              ; a0b0c0d0
-        psraw       mm7, 11               ; sign extended shift right by 3
-        packsswb    mm0, mm7              ; Filter2 >>=3;
-
-        movq        mm5, mm0              ; Filter2
-
-        paddsb      mm2, [GLOBAL(t4)]     ; vp8_signed_char_clamp(Filter2 + 4)
-        pxor        mm0, mm0              ; 0
-        pxor        mm7, mm7              ; 0
-
-        punpcklbw   mm0, mm2              ; e0f0g0h0
-        psraw       mm0, 11               ; sign extended shift right by 3
-        punpckhbw   mm7, mm2              ; a0b0c0d0
-        psraw       mm7, 11               ; sign extended shift right by 3
-        packsswb    mm0, mm7              ; Filter2 >>=3;
-
-        ; mm0= filter2 mm1 = vp8_filter,  mm3 =qs0 mm5=s mm4 =hev mm6=ps0
-        psubsb      mm3, mm0              ; qs0 =qs0 - filter1
-        paddsb      mm6, mm5              ; ps0 =ps0 + Fitler2
-
-        ; mm1=vp8_filter, mm3=qs0, mm4 =hev mm6=ps0
-        ; vp8_filter &= ~hev;
-        ; Filter2 = vp8_filter;
-        pandn       mm4, mm1              ; vp8_filter&=~hev
-
-
-        ; mm3=qs0, mm4=filter2, mm6=ps0
-
-        ; u = vp8_signed_char_clamp((63 + Filter2 * 27)>>7);
-        ; s = vp8_signed_char_clamp(qs0 - u);
-        ; *oq0 = s^0x80;
-        ; s = vp8_signed_char_clamp(ps0 + u);
-        ; *op0 = s^0x80;
-        pxor        mm0, mm0
-
-        pxor        mm1, mm1
-        pxor        mm2, mm2
-        punpcklbw   mm1, mm4
-        punpckhbw   mm2, mm4
-        pmulhw      mm1, [GLOBAL(s27)]
-        pmulhw      mm2, [GLOBAL(s27)]
-        paddw       mm1, [GLOBAL(s63)]
-        paddw       mm2, [GLOBAL(s63)]
-        psraw       mm1, 7
-        psraw       mm2, 7
-        packsswb    mm1, mm2
-
-        psubsb      mm3, mm1
-        paddsb      mm6, mm1
-
-        pxor        mm3, [GLOBAL(t80)]
-        pxor        mm6, [GLOBAL(t80)]
-        movq        [rsi+rax], mm6
-        movq        [rsi],     mm3
-
-        ; roughly 2/7th difference across boundary
-        ; u = vp8_signed_char_clamp((63 + Filter2 * 18)>>7);
-        ; s = vp8_signed_char_clamp(qs1 - u);
-        ; *oq1 = s^0x80;
-        ; s = vp8_signed_char_clamp(ps1 + u);
-        ; *op1 = s^0x80;
-        pxor        mm1, mm1
-        pxor        mm2, mm2
-        punpcklbw   mm1, mm4
-        punpckhbw   mm2, mm4
-        pmulhw      mm1, [GLOBAL(s18)]
-        pmulhw      mm2, [GLOBAL(s18)]
-        paddw       mm1, [GLOBAL(s63)]
-        paddw       mm2, [GLOBAL(s63)]
-        psraw       mm1, 7
-        psraw       mm2, 7
-        packsswb    mm1, mm2
-
-        movq        mm3, [rdi]
-        movq        mm6, [rsi+rax*2]       ; p1
-
-        pxor        mm3, [GLOBAL(t80)]
-        pxor        mm6, [GLOBAL(t80)]
-
-        paddsb      mm6, mm1
-        psubsb      mm3, mm1
-
-        pxor        mm6, [GLOBAL(t80)]
-        pxor        mm3, [GLOBAL(t80)]
-        movq        [rdi], mm3
-        movq        [rsi+rax*2], mm6
-
-        ; roughly 1/7th difference across boundary
-        ; u = vp8_signed_char_clamp((63 + Filter2 * 9)>>7);
-        ; s = vp8_signed_char_clamp(qs2 - u);
-        ; *oq2 = s^0x80;
-        ; s = vp8_signed_char_clamp(ps2 + u);
-        ; *op2 = s^0x80;
-        pxor        mm1, mm1
-        pxor        mm2, mm2
-        punpcklbw   mm1, mm4
-        punpckhbw   mm2, mm4
-        pmulhw      mm1, [GLOBAL(s9)]
-        pmulhw      mm2, [GLOBAL(s9)]
-        paddw       mm1, [GLOBAL(s63)]
-        paddw       mm2, [GLOBAL(s63)]
-        psraw       mm1, 7
-        psraw       mm2, 7
-        packsswb    mm1, mm2
-
-
-        movq        mm6, [rdi+rax*4]
-        neg         rax
-        movq        mm3, [rdi+rax  ]
-
-        pxor        mm6, [GLOBAL(t80)]
-        pxor        mm3, [GLOBAL(t80)]
-
-        paddsb      mm6, mm1
-        psubsb      mm3, mm1
-
-        pxor        mm6, [GLOBAL(t80)]
-        pxor        mm3, [GLOBAL(t80)]
-        movq        [rdi+rax  ], mm3
-        neg         rax
-        movq        [rdi+rax*4], mm6
-
-;EARLY_BREAK_OUT:
-        neg         rax
-        add         rsi,8
-        dec         rcx
-        jnz         .next8_mbh
-
-    add rsp, 32
-    pop rsp
-    ; begin epilog
-    pop rdi
-    pop rsi
-    RESTORE_GOT
-    UNSHADOW_ARGS
-    pop         rbp
-    ret
-
-
-;void vp8_mbloop_filter_vertical_edge_mmx
-;(
-;    unsigned char *src_ptr,
-;    int  src_pixel_step,
-;    const char *blimit,
-;    const char *limit,
-;    const char *thresh,
-;    int count
-;)
-global sym(vp8_mbloop_filter_vertical_edge_mmx)
-sym(vp8_mbloop_filter_vertical_edge_mmx):
-    push        rbp
-    mov         rbp, rsp
-    SHADOW_ARGS_TO_STACK 6
-    GET_GOT     rbx
-    push        rsi
-    push        rdi
-    ; end prolog
-
-    ALIGN_STACK 16, rax
-    sub          rsp, 96      ; reserve 96 bytes
-    %define t0   [rsp + 0]    ;__declspec(align(16)) char t0[8];
-    %define t1   [rsp + 16]   ;__declspec(align(16)) char t1[8];
-    %define srct [rsp + 32]   ;__declspec(align(16)) char srct[64];
-
-        mov         rsi,        arg(0) ;src_ptr
-        movsxd      rax,        dword ptr arg(1) ;src_pixel_step     ; destination pitch?
-
-        lea         rsi,        [rsi + rax*4 - 4]
-
-        movsxd      rcx,        dword ptr arg(5) ;count
-.next8_mbv:
-        lea         rdi,        [rsi + rax]  ; rdi points to row +1 for indirect addressing
-
-        ;transpose
-        movq        mm0,        [rdi+2*rax]                 ; 77 76 75 74 73 72 71 70
-        movq        mm6,        [rsi+2*rax]                 ; 67 66 65 64 63 62 61 60
-
-        movq        mm7,        mm6                         ; 77 76 75 74 73 72 71 70
-        punpckhbw   mm7,        mm0                         ; 77 67 76 66 75 65 74 64
-
-        punpcklbw   mm6,        mm0                         ; 73 63 72 62 71 61 70 60
-        movq        mm0,        [rsi+rax]                   ; 57 56 55 54 53 52 51 50
-
-        movq        mm4,        [rsi]                       ; 47 46 45 44 43 42 41 40
-        movq        mm5,        mm4                         ; 47 46 45 44 43 42 41 40
-
-        punpckhbw   mm5,        mm0                         ; 57 47 56 46 55 45 54 44
-        punpcklbw   mm4,        mm0                         ; 53 43 52 42 51 41 50 40
-
-        movq        mm3,        mm5                         ; 57 47 56 46 55 45 54 44
-        punpckhwd   mm5,        mm7                         ; 77 67 57 47 76 66 56 46
-
-        punpcklwd   mm3,        mm7                         ; 75 65 55 45 74 64 54 44
-        movq        mm2,        mm4                         ; 53 43 52 42 51 41 50 40
-
-        punpckhwd   mm4,        mm6                         ; 73 63 53 43 72 62 52 42
-        punpcklwd   mm2,        mm6                         ; 71 61 51 41 70 60 50 40
-
-        neg         rax
-
-        movq        mm7,        [rsi+rax]                   ; 37 36 35 34 33 32 31 30
-        movq        mm6,        [rsi+rax*2]                 ; 27 26 25 24 23 22 21 20
-
-        movq        mm1,        mm6                         ; 27 26 25 24 23 22 21 20
-        punpckhbw   mm6,        mm7                         ; 37 27 36 36 35 25 34 24
-
-        punpcklbw   mm1,        mm7                         ; 33 23 32 22 31 21 30 20
-
-        movq        mm7,        [rsi+rax*4];                ; 07 06 05 04 03 02 01 00
-        punpckhbw   mm7,        [rdi+rax*4]                 ; 17 07 16 06 15 05 14 04
-
-        movq        mm0,        mm7                         ; 17 07 16 06 15 05 14 04
-        punpckhwd   mm7,        mm6                         ; 37 27 17 07 36 26 16 06
-
-        punpcklwd   mm0,        mm6                         ; 35 25 15 05 34 24 14 04
-        movq        mm6,        mm7                         ; 37 27 17 07 36 26 16 06
-
-        punpckhdq   mm7,        mm5                         ; 77 67 57 47 37 27 17 07  = q3
-        punpckldq   mm6,        mm5                         ; 76 66 56 46 36 26 16 06  = q2
-
-        lea         rdx,        srct
-        movq        mm5,        mm6                         ; 76 66 56 46 36 26 16 06
-
-        movq        [rdx+56],   mm7
-        psubusb     mm5,        mm7                         ; q2-q3
-
-
-        movq        [rdx+48],   mm6
-        psubusb     mm7,        mm6                         ; q3-q2
-
-        por         mm7,        mm5;                        ; mm7=abs (q3-q2)
-        movq        mm5,        mm0                         ; 35 25 15 05 34 24 14 04
-
-        punpckhdq   mm5,        mm3                         ; 75 65 55 45 35 25 15 05 = q1
-        punpckldq   mm0,        mm3                         ; 74 64 54 44 34 24 15 04 = q0
-
-        movq        mm3,        mm5                         ; 75 65 55 45 35 25 15 05 = q1
-        psubusb     mm3,        mm6                         ; q1-q2
-
-        psubusb     mm6,        mm5                         ; q2-q1
-        por         mm6,        mm3                         ; mm6=abs(q2-q1)
-
-        movq        [rdx+40],   mm5                         ; save q1
-        movq        [rdx+32],   mm0                         ; save q0
-
-        movq        mm3,        [rsi+rax*4]                 ; 07 06 05 04 03 02 01 00
-        punpcklbw   mm3,        [rdi+rax*4]                 ; 13 03 12 02 11 01 10 00
-
-        movq        mm0,        mm3                         ; 13 03 12 02 11 01 10 00
-        punpcklwd   mm0,        mm1                         ; 31 21 11 01 30 20 10 00
-
-        punpckhwd   mm3,        mm1                         ; 33 23 13 03 32 22 12 02
-        movq        mm1,        mm0                         ; 31 21 11 01 30 20 10 00
-
-        punpckldq   mm0,        mm2                         ; 70 60 50 40 30 20 10 00  =p3
-        punpckhdq   mm1,        mm2                         ; 71 61 51 41 31 21 11 01  =p2
-
-        movq        [rdx],      mm0                         ; save p3
-        movq        [rdx+8],    mm1                         ; save p2
-
-        movq        mm2,        mm1                         ; 71 61 51 41 31 21 11 01  =p2
-        psubusb     mm2,        mm0                         ; p2-p3
-
-        psubusb     mm0,        mm1                         ; p3-p2
-        por         mm0,        mm2                         ; mm0=abs(p3-p2)
-
-        movq        mm2,        mm3                         ; 33 23 13 03 32 22 12 02
-        punpckldq   mm2,        mm4                         ; 72 62 52 42 32 22 12 02 = p1
-
-        punpckhdq   mm3,        mm4                         ; 73 63 53 43 33 23 13 03 = p0
-        movq        [rdx+24],   mm3                         ; save p0
-
-        movq        [rdx+16],   mm2                         ; save p1
-        movq        mm5,        mm2                         ; mm5 = p1
-
-        psubusb     mm2,        mm1                         ; p1-p2
-        psubusb     mm1,        mm5                         ; p2-p1
-
-        por         mm1,        mm2                         ; mm1=abs(p2-p1)
-        mov         rdx,        arg(3) ;limit
-
-        movq        mm4,        [rdx]                       ; mm4 = limit
-        psubusb     mm7,        mm4                         ; abs(q3-q2) > limit
-
-        psubusb     mm0,        mm4                         ; abs(p3-p2) > limit
-        psubusb     mm1,        mm4                         ; abs(p2-p1) > limit
-
-        psubusb     mm6,        mm4                         ; abs(q2-q1) > limit
-        por         mm7,        mm6                         ; or
-
-        por         mm0,        mm1                         ;
-        por         mm0,        mm7                         ; abs(q3-q2) > limit || abs(p3-p2) > limit ||abs(p2-p1) > limit || abs(q2-q1) > limit
-
-        movq        mm1,        mm5                         ; p1
-
-        movq        mm7,        mm3                         ; mm3=mm7=p0
-        psubusb     mm7,        mm5                         ; p0 - p1
-
-        psubusb     mm5,        mm3                         ; p1 - p0
-        por         mm5,        mm7                         ; abs(p1-p0)
-
-        movq        t0,         mm5                         ; save abs(p1-p0)
-        lea         rdx,        srct
-
-        psubusb     mm5,        mm4                         ; mm5 = abs(p1-p0) > limit
-        por         mm0,        mm5                         ; mm0=mask
-
-        movq        mm5,        [rdx+32]                    ; mm5=q0
-        movq        mm7,        [rdx+40]                    ; mm7=q1
-
-        movq        mm6,        mm5                         ; mm6=q0
-        movq        mm2,        mm7                         ; q1
-        psubusb     mm5,        mm7                         ; q0-q1
-
-        psubusb     mm7,        mm6                         ; q1-q0
-        por         mm7,        mm5                         ; abs(q1-q0)
-
-        movq        t1,         mm7                         ; save abs(q1-q0)
-        psubusb     mm7,        mm4                         ; mm7=abs(q1-q0)> limit
-
-        por         mm0,        mm7                         ; mask
-
-        movq        mm5,        mm2                         ; q1
-        psubusb     mm5,        mm1                         ; q1-=p1
-        psubusb     mm1,        mm2                         ; p1-=q1
-        por         mm5,        mm1                         ; abs(p1-q1)
-        pand        mm5,        [GLOBAL(tfe)]               ; set lsb of each byte to zero
-        psrlw       mm5,        1                           ; abs(p1-q1)/2
-
-        mov         rdx,        arg(2) ;blimit                      ;
-
-        movq        mm4,        [rdx]                       ;blimit
-        movq        mm1,        mm3                         ; mm1=mm3=p0
-
-        movq        mm7,        mm6                         ; mm7=mm6=q0
-        psubusb     mm1,        mm7                         ; p0-q0
-
-        psubusb     mm7,        mm3                         ; q0-p0
-        por         mm1,        mm7                         ; abs(q0-p0)
-        paddusb     mm1,        mm1                         ; abs(q0-p0)*2
-        paddusb     mm1,        mm5                         ; abs (p0 - q0) *2 + abs(p1-q1)/2
-
-        psubusb     mm1,        mm4                         ; abs (p0 - q0) *2 + abs(p1-q1)/2  > blimit
-        por         mm1,        mm0;                        ; mask
-
-        pxor        mm0,        mm0
-        pcmpeqb     mm1,        mm0
-
-        ; calculate high edge variance
-        mov         rdx,        arg(4) ;thresh            ; get thresh
-        movq        mm7,        [rdx]
-        ;
-        movq        mm4,        t0              ; get abs (q1 - q0)
-        psubusb     mm4,        mm7             ; abs(q1 - q0) > thresh
-
-        movq        mm3,        t1              ; get abs (p1 - p0)
-        psubusb     mm3,        mm7             ; abs(p1 - p0)> thresh
-
-        por         mm4,        mm3             ; abs(q1 - q0) > thresh || abs(p1 - p0) > thresh
-        pcmpeqb     mm4,        mm0
-
-        pcmpeqb     mm0,        mm0
-        pxor        mm4,        mm0
-
-
-
-
-        ; start work on filters
-        lea         rdx,        srct
-
-        ; start work on filters
-        movq        mm2, [rdx+16]         ; p1
-        movq        mm7, [rdx+40]         ; q1
-        pxor        mm2, [GLOBAL(t80)]    ; p1 offset to convert to signed values
-        pxor        mm7, [GLOBAL(t80)]    ; q1 offset to convert to signed values
-        psubsb      mm2, mm7              ; p1 - q1
-
-        movq        mm6, [rdx+24]         ; p0
-        movq        mm0, [rdx+32]         ; q0
-        pxor        mm6, [GLOBAL(t80)]    ; offset to convert to signed values
-        pxor        mm0, [GLOBAL(t80)]    ; offset to convert to signed values
-
-        movq        mm3, mm0              ; q0
-        psubsb      mm0, mm6              ; q0 - p0
-        paddsb      mm2, mm0              ; 1 * (q0 - p0) + (p1 - q1)
-        paddsb      mm2, mm0              ; 2 * (q0 - p0)
-        paddsb      mm2, mm0              ; 3 * (q0 - p0) + (p1 - q1)
-        pand       mm1, mm2           ; mask filter values we don't care about
-
-        ; mm1 = vp8_filter, mm4=hev, mm6=ps0, mm3=qs0
-        movq        mm2, mm1              ; vp8_filter
-        pand        mm2, mm4;             ; Filter2 = vp8_filter & hev
-
-        movq        mm5,        mm2       ;
-        paddsb      mm5,        [GLOBAL(t3)];
-
-        pxor        mm0, mm0              ; 0
-        pxor        mm7, mm7              ; 0
-
-        punpcklbw   mm0, mm5              ; e0f0g0h0
-        psraw       mm0, 11               ; sign extended shift right by 3
-        punpckhbw   mm7, mm5              ; a0b0c0d0
-        psraw       mm7, 11               ; sign extended shift right by 3
-        packsswb    mm0, mm7              ; Filter2 >>=3;
-
-        movq        mm5, mm0              ; Filter2
-
-        paddsb      mm2, [GLOBAL(t4)]     ; vp8_signed_char_clamp(Filter2 + 4)
-        pxor        mm0, mm0              ; 0
-        pxor        mm7, mm7              ; 0
-
-        punpcklbw   mm0, mm2              ; e0f0g0h0
-        psraw       mm0, 11               ; sign extended shift right by 3
-        punpckhbw   mm7, mm2              ; a0b0c0d0
-        psraw       mm7, 11               ; sign extended shift right by 3
-        packsswb    mm0, mm7              ; Filter2 >>=3;
-
-        ; mm0= filter2 mm1 = vp8_filter,  mm3 =qs0 mm5=s mm4 =hev mm6=ps0
-        psubsb      mm3, mm0              ; qs0 =qs0 - filter1
-        paddsb      mm6, mm5              ; ps0 =ps0 + Fitler2
-
-        ; mm1=vp8_filter, mm3=qs0, mm4 =hev mm6=ps0
-        ; vp8_filter &= ~hev;
-        ; Filter2 = vp8_filter;
-        pandn       mm4, mm1              ; vp8_filter&=~hev
-
-
-        ; mm3=qs0, mm4=filter2, mm6=ps0
-
-        ; u = vp8_signed_char_clamp((63 + Filter2 * 27)>>7);
-        ; s = vp8_signed_char_clamp(qs0 - u);
-        ; *oq0 = s^0x80;
-        ; s = vp8_signed_char_clamp(ps0 + u);
-        ; *op0 = s^0x80;
-        pxor        mm0, mm0
-
-        pxor        mm1, mm1
-        pxor        mm2, mm2
-        punpcklbw   mm1, mm4
-        punpckhbw   mm2, mm4
-        pmulhw      mm1, [GLOBAL(s27)]
-        pmulhw      mm2, [GLOBAL(s27)]
-        paddw       mm1, [GLOBAL(s63)]
-        paddw       mm2, [GLOBAL(s63)]
-        psraw       mm1, 7
-        psraw       mm2, 7
-        packsswb    mm1, mm2
-
-        psubsb      mm3, mm1
-        paddsb      mm6, mm1
-
-        pxor        mm3, [GLOBAL(t80)]
-        pxor        mm6, [GLOBAL(t80)]
-        movq        [rdx+24], mm6
-        movq        [rdx+32], mm3
-
-        ; roughly 2/7th difference across boundary
-        ; u = vp8_signed_char_clamp((63 + Filter2 * 18)>>7);
-        ; s = vp8_signed_char_clamp(qs1 - u);
-        ; *oq1 = s^0x80;
-        ; s = vp8_signed_char_clamp(ps1 + u);
-        ; *op1 = s^0x80;
-        pxor        mm1, mm1
-        pxor        mm2, mm2
-        punpcklbw   mm1, mm4
-        punpckhbw   mm2, mm4
-        pmulhw      mm1, [GLOBAL(s18)]
-        pmulhw      mm2, [GLOBAL(s18)]
-        paddw       mm1, [GLOBAL(s63)]
-        paddw       mm2, [GLOBAL(s63)]
-        psraw       mm1, 7
-        psraw       mm2, 7
-        packsswb    mm1, mm2
-
-        movq        mm3, [rdx + 40]
-        movq        mm6, [rdx + 16]       ; p1
-        pxor        mm3, [GLOBAL(t80)]
-        pxor        mm6, [GLOBAL(t80)]
-
-        paddsb      mm6, mm1
-        psubsb      mm3, mm1
-
-        pxor        mm6, [GLOBAL(t80)]
-        pxor        mm3, [GLOBAL(t80)]
-        movq        [rdx + 40], mm3
-        movq        [rdx + 16], mm6
-
-        ; roughly 1/7th difference across boundary
-        ; u = vp8_signed_char_clamp((63 + Filter2 * 9)>>7);
-        ; s = vp8_signed_char_clamp(qs2 - u);
-        ; *oq2 = s^0x80;
-        ; s = vp8_signed_char_clamp(ps2 + u);
-        ; *op2 = s^0x80;
-        pxor        mm1, mm1
-        pxor        mm2, mm2
-        punpcklbw   mm1, mm4
-        punpckhbw   mm2, mm4
-        pmulhw      mm1, [GLOBAL(s9)]
-        pmulhw      mm2, [GLOBAL(s9)]
-        paddw       mm1, [GLOBAL(s63)]
-        paddw       mm2, [GLOBAL(s63)]
-        psraw       mm1, 7
-        psraw       mm2, 7
-        packsswb    mm1, mm2
-
-        movq        mm6, [rdx+ 8]
-        movq        mm3, [rdx+48]
-
-        pxor        mm6, [GLOBAL(t80)]
-        pxor        mm3, [GLOBAL(t80)]
-
-        paddsb      mm6, mm1
-        psubsb      mm3, mm1
-
-        pxor        mm6, [GLOBAL(t80)]          ; mm6 = 71 61 51 41 31 21 11 01
-        pxor        mm3, [GLOBAL(t80)]          ; mm3 = 76 66 56 46 36 26 15 06
-
-        ; tranpose and write back
-        movq        mm0,    [rdx]               ; mm0 = 70 60 50 40 30 20 10 00
-        movq        mm1,    mm0                 ; mm0 = 70 60 50 40 30 20 10 00
-
-        punpcklbw   mm0,    mm6                 ; mm0 = 31 30 21 20 11 10 01 00
-        punpckhbw   mm1,    mm6                 ; mm3 = 71 70 61 60 51 50 41 40
-
-        movq        mm2,    [rdx+16]            ; mm2 = 72 62 52 42 32 22 12 02
-        movq        mm6,    mm2                 ; mm3 = 72 62 52 42 32 22 12 02
-
-        punpcklbw   mm2,    [rdx+24]            ; mm2 = 33 32 23 22 13 12 03 02
-        punpckhbw   mm6,    [rdx+24]            ; mm3 = 73 72 63 62 53 52 43 42
-
-        movq        mm5,    mm0                 ; mm5 = 31 30 21 20 11 10 01 00
-        punpcklwd   mm0,    mm2                 ; mm0 = 13 12 11 10 03 02 01 00
-
-        punpckhwd   mm5,    mm2                 ; mm5 = 33 32 31 30 23 22 21 20
-        movq        mm4,    mm1                 ; mm4 = 71 70 61 60 51 50 41 40
-
-        punpcklwd   mm1,    mm6                 ; mm1 = 53 52 51 50 43 42 41 40
-        punpckhwd   mm4,    mm6                 ; mm4 = 73 72 71 70 63 62 61 60
-
-        movq        mm2,    [rdx+32]            ; mm2 = 74 64 54 44 34 24 14 04
-        punpcklbw   mm2,    [rdx+40]            ; mm2 = 35 34 25 24 15 14 05 04
-
-        movq        mm6,    mm3                 ; mm6 = 76 66 56 46 36 26 15 06
-        punpcklbw   mm6,    [rdx+56]            ; mm6 = 37 36 27 26 17 16 07 06
-
-        movq        mm7,    mm2                 ; mm7 = 35 34 25 24 15 14 05 04
-        punpcklwd   mm2,    mm6                 ; mm2 = 17 16 15 14 07 06 05 04
-
-        punpckhwd   mm7,    mm6                 ; mm7 = 37 36 35 34 27 26 25 24
-        movq        mm6,    mm0                 ; mm6 = 13 12 11 10 03 02 01 00
-
-        punpckldq   mm0,    mm2                 ; mm0 = 07 06 05 04 03 02 01 00
-        punpckhdq   mm6,    mm2                 ; mm6 = 17 16 15 14 13 12 11 10
-
-        movq        [rsi+rax*4], mm0            ; write out
-        movq        [rdi+rax*4], mm6            ; write out
-
-        movq        mm0,    mm5                 ; mm0 = 33 32 31 30 23 22 21 20
-        punpckldq   mm0,    mm7                 ; mm0 = 27 26 25 24 23 22 20 20
-
-        punpckhdq   mm5,    mm7                 ; mm5 = 37 36 35 34 33 32 31 30
-        movq        [rsi+rax*2], mm0            ; write out
-
-        movq        [rdi+rax*2], mm5            ; write out
-        movq        mm2,    [rdx+32]            ; mm2 = 74 64 54 44 34 24 14 04
-
-        punpckhbw   mm2,    [rdx+40]            ; mm2 = 75 74 65 64 54 54 45 44
-        punpckhbw   mm3,    [rdx+56]            ; mm3 = 77 76 67 66 57 56 47 46
-
-        movq        mm5,    mm2                 ; mm5 = 75 74 65 64 54 54 45 44
-        punpcklwd   mm2,    mm3                 ; mm2 = 57 56 55 54 47 46 45 44
-
-        punpckhwd   mm5,    mm3                 ; mm5 = 77 76 75 74 67 66 65 64
-        movq        mm0,    mm1                 ; mm0=  53 52 51 50 43 42 41 40
-
-        movq        mm3,    mm4                 ; mm4 = 73 72 71 70 63 62 61 60
-        punpckldq   mm0,    mm2                 ; mm0 = 47 46 45 44 43 42 41 40
-
-        punpckhdq   mm1,    mm2                 ; mm1 = 57 56 55 54 53 52 51 50
-        movq        [rsi],  mm0                 ; write out
-
-        movq        [rdi],  mm1                 ; write out
-        neg         rax
-
-        punpckldq   mm3,    mm5                 ; mm3 = 67 66 65 64 63 62 61 60
-        punpckhdq   mm4,    mm5                 ; mm4 = 77 76 75 74 73 72 71 60
-
-        movq        [rsi+rax*2], mm3
-        movq        [rdi+rax*2], mm4
-
-        lea         rsi,        [rsi+rax*8]
-        dec         rcx
-
-        jnz         .next8_mbv
-
-    add rsp, 96
-    pop rsp
-    ; begin epilog
-    pop rdi
-    pop rsi
-    RESTORE_GOT
-    UNSHADOW_ARGS
-    pop         rbp
-    ret
-
-
 ;void vp8_loop_filter_simple_horizontal_edge_mmx
 ;(
 ;    unsigned char *src_ptr,
diff --git a/vp8/common/x86/loopfilter_sse2.asm b/vp8/common/x86/loopfilter_sse2.asm
index 295609c..6f6531c 100644
--- a/vp8/common/x86/loopfilter_sse2.asm
+++ b/vp8/common/x86/loopfilter_sse2.asm
@@ -380,302 +380,6 @@
     ret
 
 
-%macro MB_FILTER_AND_WRITEBACK 1
-%if %1 == 0
-        movdqa      xmm2,                   p1              ; p1
-        movdqa      xmm7,                   q1              ; q1
-%elif %1 == 1
-        movdqa      xmm2,                   [rsi+2*rax]     ; p1
-        movdqa      xmm7,                   [rdi]           ; q1
-
-        mov         rcx,                    rax
-        neg         rcx
-%elif %1 == 2
-        lea         rdx,                    srct
-
-        movdqa      xmm2,                   [rdx+32]        ; p1
-        movdqa      xmm7,                   [rdx+80]        ; q1
-        movdqa      xmm6,                   [rdx+48]        ; p0
-        movdqa      xmm0,                   [rdx+64]        ; q0
-%endif
-
-        pxor        xmm2,                   [GLOBAL(t80)]   ; p1 offset to convert to signed values
-        pxor        xmm7,                   [GLOBAL(t80)]   ; q1 offset to convert to signed values
-        pxor        xmm6,                   [GLOBAL(t80)]   ; offset to convert to signed values
-        pxor        xmm0,                   [GLOBAL(t80)]   ; offset to convert to signed values
-
-        psubsb      xmm2,                   xmm7            ; p1 - q1
-        movdqa      xmm3,                   xmm0            ; q0
-
-        psubsb      xmm0,                   xmm6            ; q0 - p0
-
-        paddsb      xmm2,                   xmm0            ; 1 * (q0 - p0) + (p1 - q1)
-
-        paddsb      xmm2,                   xmm0            ; 2 * (q0 - p0)
-
-        paddsb      xmm2,                   xmm0            ; 3 * (q0 - p0) + (p1 - q1)
-
-        pand        xmm1,                   xmm2            ; mask filter values we don't care about
-
-        movdqa      xmm2,                   xmm1            ; vp8_filter
-
-        pand        xmm2,                   xmm4            ; Filter2 = vp8_filter & hev
-        pxor        xmm0,                   xmm0
-
-        pandn       xmm4,                   xmm1            ; vp8_filter&=~hev
-        pxor        xmm1,                   xmm1
-
-        punpcklbw   xmm0,                   xmm4            ; Filter 2 (hi)
-        movdqa      xmm5,                   xmm2
-
-        punpckhbw   xmm1,                   xmm4            ; Filter 2 (lo)
-        paddsb      xmm5,                   [GLOBAL(t3)]    ; vp8_signed_char_clamp(Filter2 + 3)
-
-        pmulhw      xmm1,                   [GLOBAL(s9)]    ; Filter 2 (lo) * 9
-
-        pmulhw      xmm0,                   [GLOBAL(s9)]    ; Filter 2 (hi) * 9
-
-        punpckhbw   xmm7,                   xmm5            ; axbxcxdx
-        paddsb      xmm2,                   [GLOBAL(t4)]    ; vp8_signed_char_clamp(Filter2 + 4)
-
-        punpcklbw   xmm5,                   xmm5            ; exfxgxhx
-        psraw       xmm7,                   11              ; sign extended shift right by 3
-
-        psraw       xmm5,                   11              ; sign extended shift right by 3
-        punpckhbw   xmm4,                   xmm2            ; axbxcxdx
-
-        punpcklbw   xmm2,                   xmm2            ; exfxgxhx
-        psraw       xmm4,                   11              ; sign extended shift right by 3
-
-        packsswb    xmm5,                   xmm7            ; Filter2 >>=3;
-        psraw       xmm2,                   11              ; sign extended shift right by 3
-
-        packsswb    xmm2,                   xmm4            ; Filter1 >>=3;
-        movdqa      xmm7,                   xmm1
-
-        paddsb      xmm6,                   xmm5            ; ps0 =ps0 + Fitler2
-        movdqa      xmm4,                   xmm1
-
-        psubsb      xmm3,                   xmm2            ; qs0 =qs0 - Filter1
-        movdqa      xmm5,                   xmm0
-
-        movdqa      xmm2,                   xmm5
-        paddw       xmm0,                   [GLOBAL(s63)]   ; Filter 2 (hi) * 9 + 63
-
-        paddw       xmm1,                   [GLOBAL(s63)]   ; Filter 2 (lo) * 9 + 63
-        paddw       xmm5,                   xmm5            ; Filter 2 (hi) * 18
-
-        paddw       xmm7,                   xmm7            ; Filter 2 (lo) * 18
-        paddw       xmm5,                   xmm0            ; Filter 2 (hi) * 27 + 63
-
-        paddw       xmm7,                   xmm1            ; Filter 2 (lo) * 27 + 63
-        paddw       xmm2,                   xmm0            ; Filter 2 (hi) * 18 + 63
-
-        paddw       xmm4,                   xmm1            ; Filter 2 (lo) * 18 + 63
-        psraw       xmm0,                   7               ; (Filter 2 (hi) * 9 + 63) >> 7
-
-        psraw       xmm1,                   7               ; (Filter 2 (lo) * 9 + 63) >> 7
-        psraw       xmm2,                   7               ; (Filter 2 (hi) * 18 + 63) >> 7
-
-        packsswb    xmm0,                   xmm1            ; u1 = vp8_signed_char_clamp((63 + Filter2 * 9)>>7)
-        psraw       xmm4,                   7               ; (Filter 2 (lo) * 18 + 63) >> 7
-
-        psraw       xmm5,                   7               ; (Filter 2 (hi) * 27 + 63) >> 7
-        packsswb    xmm2,                   xmm4            ; u2 = vp8_signed_char_clamp((63 + Filter2 * 18)>>7)
-
-        psraw       xmm7,                   7               ; (Filter 2 (lo) * 27 + 63) >> 7
-
-        packsswb    xmm5,                   xmm7            ; u3 = vp8_signed_char_clamp((63 + Filter2 * 27)>>7)
-
-        psubsb      xmm3,                   xmm5            ; sq = vp8_signed_char_clamp(qs0 - u3)
-        paddsb      xmm6,                   xmm5            ; sp = vp8_signed_char_clamp(ps0 - u3)
-
-%if %1 == 0
-        movdqa      xmm5,                   q2              ; q2
-        movdqa      xmm1,                   q1              ; q1
-        movdqa      xmm4,                   p1              ; p1
-        movdqa      xmm7,                   p2              ; p2
-
-%elif %1 == 1
-        movdqa      xmm5,                   XMMWORD PTR [rdi+rcx]   ; q2
-        movdqa      xmm1,                   XMMWORD PTR [rdi]       ; q1
-        movdqa      xmm4,                   XMMWORD PTR [rsi+rax*2] ; p1
-        movdqa      xmm7,                   XMMWORD PTR [rdi+rax*4] ; p2
-%elif %1 == 2
-        movdqa      xmm5,                   XMMWORD PTR [rdx+96]    ; q2
-        movdqa      xmm1,                   XMMWORD PTR [rdx+80]    ; q1
-        movdqa      xmm4,                   XMMWORD PTR [rdx+32]    ; p1
-        movdqa      xmm7,                   XMMWORD PTR [rdx+16]    ; p2
-%endif
-
-        pxor        xmm3,                   [GLOBAL(t80)]   ; *oq0 = sq^0x80
-        pxor        xmm6,                   [GLOBAL(t80)]   ; *oq0 = sp^0x80
-
-        pxor        xmm1,                   [GLOBAL(t80)]
-        pxor        xmm4,                   [GLOBAL(t80)]
-
-        psubsb      xmm1,                   xmm2            ; sq = vp8_signed_char_clamp(qs1 - u2)
-        paddsb      xmm4,                   xmm2            ; sp = vp8_signed_char_clamp(ps1 - u2)
-
-        pxor        xmm1,                   [GLOBAL(t80)]   ; *oq1 = sq^0x80;
-        pxor        xmm4,                   [GLOBAL(t80)]   ; *op1 = sp^0x80;
-
-        pxor        xmm7,                   [GLOBAL(t80)]
-        pxor        xmm5,                   [GLOBAL(t80)]
-
-        paddsb      xmm7,                   xmm0            ; sp = vp8_signed_char_clamp(ps2 - u)
-        psubsb      xmm5,                   xmm0            ; sq = vp8_signed_char_clamp(qs2 - u)
-
-        pxor        xmm7,                   [GLOBAL(t80)]   ; *op2 = sp^0x80;
-        pxor        xmm5,                   [GLOBAL(t80)]   ; *oq2 = sq^0x80;
-
-%if %1 == 0
-        lea         rsi,                    [rsi+rcx*2]
-        lea         rdi,                    [rdi+rcx*2]
-
-        movq        MMWORD PTR [rsi],       xmm6            ; p0
-        movhps      MMWORD PTR [rdi],       xmm6
-        movq        MMWORD PTR [rsi + rcx], xmm3            ; q0
-        movhps      MMWORD PTR [rdi + rcx], xmm3
-
-        movq        MMWORD PTR [rsi+rcx*2], xmm1            ; q1
-        movhps      MMWORD PTR [rdi+rcx*2], xmm1
-
-        movq        MMWORD PTR [rsi + rax], xmm4            ; p1
-        movhps      MMWORD PTR [rdi + rax], xmm4
-
-        movq        MMWORD PTR [rsi+rax*2], xmm7            ; p2
-        movhps      MMWORD PTR [rdi+rax*2], xmm7
-
-        lea         rsi,                    [rsi + rcx]
-        lea         rdi,                    [rdi + rcx]
-        movq        MMWORD PTR [rsi+rcx*2], xmm5            ; q2
-        movhps      MMWORD PTR [rdi+rcx*2], xmm5
-%elif %1 == 1
-        movdqa      XMMWORD PTR [rdi+rcx],  xmm5            ; q2
-        movdqa      XMMWORD PTR [rdi],      xmm1            ; q1
-        movdqa      XMMWORD PTR [rsi],      xmm3            ; q0
-        movdqa      XMMWORD PTR [rsi+rax  ],xmm6            ; p0
-        movdqa      XMMWORD PTR [rsi+rax*2],xmm4            ; p1
-        movdqa      XMMWORD PTR [rdi+rax*4],xmm7            ; p2
-%elif %1 == 2
-        movdqa      XMMWORD PTR [rdx+80],   xmm1            ; q1
-        movdqa      XMMWORD PTR [rdx+64],   xmm3            ; q0
-        movdqa      XMMWORD PTR [rdx+48],   xmm6            ; p0
-        movdqa      XMMWORD PTR [rdx+32],   xmm4            ; p1
-%endif
-
-%endmacro
-
-
-;void vp8_mbloop_filter_horizontal_edge_sse2
-;(
-;    unsigned char *src_ptr,
-;    int            src_pixel_step,
-;    const char    *blimit,
-;    const char    *limit,
-;    const char    *thresh,
-;    int            count
-;)
-global sym(vp8_mbloop_filter_horizontal_edge_sse2)
-sym(vp8_mbloop_filter_horizontal_edge_sse2):
-    push        rbp
-    mov         rbp, rsp
-    SHADOW_ARGS_TO_STACK 6
-    SAVE_XMM 7
-    GET_GOT     rbx
-    push        rsi
-    push        rdi
-    ; end prolog
-
-    ALIGN_STACK 16, rax
-    sub         rsp, 32     ; reserve 32 bytes
-    %define t0 [rsp + 0]    ;__declspec(align(16)) char t0[16];
-    %define t1 [rsp + 16]   ;__declspec(align(16)) char t1[16];
-
-        mov         rsi,                    arg(0)            ;src_ptr
-        movsxd      rax,                    dword ptr arg(1)  ;src_pixel_step
-
-        mov         rdx,                    arg(3)            ;limit
-        movdqa      xmm7,                   XMMWORD PTR [rdx]
-
-        lea         rdi,                    [rsi+rax]         ; rdi points to row +1 for indirect addressing
-
-        ; calculate breakout conditions and high edge variance
-        LFH_FILTER_AND_HEV_MASK 1
-        ; filter and write back the results
-        MB_FILTER_AND_WRITEBACK 1
-
-    add rsp, 32
-    pop rsp
-    ; begin epilog
-    pop rdi
-    pop rsi
-    RESTORE_GOT
-    RESTORE_XMM
-    UNSHADOW_ARGS
-    pop         rbp
-    ret
-
-
-;void vp8_mbloop_filter_horizontal_edge_uv_sse2
-;(
-;    unsigned char *u,
-;    int            src_pixel_step,
-;    const char    *blimit,
-;    const char    *limit,
-;    const char    *thresh,
-;    unsigned char *v
-;)
-global sym(vp8_mbloop_filter_horizontal_edge_uv_sse2)
-sym(vp8_mbloop_filter_horizontal_edge_uv_sse2):
-    push        rbp
-    mov         rbp, rsp
-    SHADOW_ARGS_TO_STACK 6
-    SAVE_XMM 7
-    GET_GOT     rbx
-    push        rsi
-    push        rdi
-    ; end prolog
-
-    ALIGN_STACK 16, rax
-    sub         rsp, 96       ; reserve 96 bytes
-    %define q2  [rsp + 0]     ;__declspec(align(16)) char q2[16];
-    %define q1  [rsp + 16]    ;__declspec(align(16)) char q1[16];
-    %define p2  [rsp + 32]    ;__declspec(align(16)) char p2[16];
-    %define p1  [rsp + 48]    ;__declspec(align(16)) char p1[16];
-    %define t0  [rsp + 64]    ;__declspec(align(16)) char t0[16];
-    %define t1  [rsp + 80]    ;__declspec(align(16)) char t1[16];
-
-        mov         rsi,                    arg(0)             ; u
-        mov         rdi,                    arg(5)             ; v
-        movsxd      rax,                    dword ptr arg(1)   ; src_pixel_step
-        mov         rcx,                    rax
-        neg         rax                     ; negate pitch to deal with above border
-
-        mov         rdx,                    arg(3)             ;limit
-        movdqa      xmm7,                   XMMWORD PTR [rdx]
-
-        lea         rsi,                    [rsi + rcx]
-        lea         rdi,                    [rdi + rcx]
-
-        ; calculate breakout conditions and high edge variance
-        LFH_FILTER_AND_HEV_MASK 0
-        ; filter and write back the results
-        MB_FILTER_AND_WRITEBACK 0
-
-    add rsp, 96
-    pop rsp
-    ; begin epilog
-    pop rdi
-    pop rsi
-    RESTORE_GOT
-    RESTORE_XMM
-    UNSHADOW_ARGS
-    pop         rbp
-    ret
-
-
 %macro TRANSPOSE_16X8 2
         movq        xmm4,               QWORD PTR [rsi]        ; xx xx xx xx xx xx xx xx 07 06 05 04 03 02 01 00
         movq        xmm1,               QWORD PTR [rdi]        ; xx xx xx xx xx xx xx xx 17 16 15 14 13 12 11 10
@@ -1141,233 +845,6 @@
     pop         rbp
     ret
 
-%macro MBV_TRANSPOSE 0
-        movdqa      xmm0,               [rdx]               ; f0 e0 d0 c0 b0 a0 90 80 70 60 50 40 30 20 10 00
-        movdqa      xmm1,               xmm0                ; f0 e0 d0 c0 b0 a0 90 80 70 60 50 40 30 20 10 00
-
-        punpcklbw   xmm0,               xmm7                ; 71 70 61 60 51 50 41 40 31 30 21 20 11 10 01 00
-        punpckhbw   xmm1,               xmm7                ; f1 f0 e1 e0 d1 d0 c1 c0 b1 b0 a1 a0 91 90 81 80
-
-        movdqa      xmm2,               [rdx+32]            ; f2 e2 d2 c2 b2 a2 92 82 72 62 52 42 32 22 12 02
-        movdqa      xmm6,               xmm2                ; f2 e2 d2 c2 b2 a2 92 82 72 62 52 42 32 22 12 02
-
-        punpcklbw   xmm2,               [rdx+48]            ; 73 72 63 62 53 52 43 42 33 32 23 22 13 12 03 02
-        punpckhbw   xmm6,               [rdx+48]            ; f3 f2 e3 e2 d3 d2 c3 c2 b3 b2 a3 a2 93 92 83 82
-
-        movdqa      xmm3,               xmm0                ; 71 70 61 60 51 50 41 40 31 30 21 20 11 10 01 00
-        punpcklwd   xmm0,               xmm2                ; 33 32 31 30 23 22 21 20 13 12 11 10 03 02 01 00
-
-        punpckhwd   xmm3,               xmm2                ; 73 72 71 70 63 62 61 60 53 52 51 50 43 42 41 40
-        movdqa      xmm4,               xmm1                ; f1 f0 e1 e0 d1 d0 c1 c0 b1 b0 a1 a0 91 90 81 80
-
-        punpcklwd   xmm1,               xmm6                ; b3 b2 b1 b0 a3 a2 a1 a0 93 92 91 90 83 82 81 80
-        punpckhwd   xmm4,               xmm6                ; f3 f2 f1 f0 e3 e2 e1 e0 d3 d2 d1 d0 c3 c2 c1 c0
-
-        movdqa      xmm2,               [rdx+64]            ; f4 e4 d4 c4 b4 a4 94 84 74 64 54 44 34 24 14 04
-        punpcklbw   xmm2,               [rdx+80]            ; 75 74 65 64 55 54 45 44 35 34 25 24 15 14 05 04
-
-        movdqa      xmm6,               xmm5                ; f6 e6 d6 c6 b6 a6 96 86 76 66 56 46 36 26 16 06
-        punpcklbw   xmm6,               [rdx+112]           ; 77 76 67 66 57 56 47 46 37 36 27 26 17 16 07 06
-
-        movdqa      xmm7,               xmm2                ; 75 74 65 64 55 54 45 44 35 34 25 24 15 14 05 04
-        punpcklwd   xmm2,               xmm6                ; 37 36 35 34 27 26 25 24 17 16 15 14 07 06 05 04
-
-        punpckhwd   xmm7,               xmm6                ; 77 76 75 74 67 66 65 64 57 56 55 54 47 46 45 44
-        movdqa      xmm6,               xmm0                ; 33 32 31 30 23 22 21 20 13 12 11 10 03 02 01 00
-
-        punpckldq   xmm0,               xmm2                ; 17 16 15 14 13 12 11 10 07 06 05 04 03 02 01 00
-        punpckhdq   xmm6,               xmm2                ; 37 36 35 34 33 32 31 30 27 26 25 24 23 22 21 20
-%endmacro
-
-%macro MBV_WRITEBACK_1 0
-        movq        QWORD  PTR [rsi],   xmm0
-        movhps      MMWORD PTR [rdi],   xmm0
-
-        movq        QWORD  PTR [rsi+2*rax], xmm6
-        movhps      MMWORD PTR [rdi+2*rax], xmm6
-
-        movdqa      xmm0,               xmm3                ; 73 72 71 70 63 62 61 60 53 52 51 50 43 42 41 40
-        punpckldq   xmm0,               xmm7                ; 57 56 55 54 53 52 51 50 47 46 45 44 43 42 41 40
-
-        punpckhdq   xmm3,               xmm7                ; 77 76 75 74 73 72 71 70 67 66 65 64 63 62 61 60
-
-        movq        QWORD  PTR [rsi+4*rax], xmm0
-        movhps      MMWORD PTR [rdi+4*rax], xmm0
-
-        movq        QWORD  PTR [rsi+2*rcx], xmm3
-        movhps      MMWORD PTR [rdi+2*rcx], xmm3
-
-        movdqa      xmm2,               [rdx+64]            ; f4 e4 d4 c4 b4 a4 94 84 74 64 54 44 34 24 14 04
-        punpckhbw   xmm2,               [rdx+80]            ; f5 f4 e5 e4 d5 d4 c5 c4 b5 b4 a5 a4 95 94 85 84
-
-        punpckhbw   xmm5,               [rdx+112]           ; f7 f6 e7 e6 d7 d6 c7 c6 b7 b6 a7 a6 97 96 87 86
-        movdqa      xmm0,               xmm2
-
-        punpcklwd   xmm0,               xmm5                ; b7 b6 b4 b4 a7 a6 a5 a4 97 96 95 94 87 86 85 84
-        punpckhwd   xmm2,               xmm5                ; f7 f6 f5 f4 e7 e6 e5 e4 d7 d6 d5 d4 c7 c6 c5 c4
-
-        movdqa      xmm5,               xmm1                ; b3 b2 b1 b0 a3 a2 a1 a0 93 92 91 90 83 82 81 80
-        punpckldq   xmm1,               xmm0                ; 97 96 95 94 93 92 91 90 87 86 85 83 84 82 81 80
-
-        punpckhdq   xmm5,               xmm0                ; b7 b6 b5 b4 b3 b2 b1 b0 a7 a6 a5 a4 a3 a2 a1 a0
-%endmacro
-
-%macro MBV_WRITEBACK_2 0
-        movq        QWORD  PTR [rsi],   xmm1
-        movhps      MMWORD PTR [rdi],   xmm1
-
-        movq        QWORD  PTR [rsi+2*rax], xmm5
-        movhps      MMWORD PTR [rdi+2*rax], xmm5
-
-        movdqa      xmm1,               xmm4                ; f3 f2 f1 f0 e3 e2 e1 e0 d3 d2 d1 d0 c3 c2 c1 c0
-        punpckldq   xmm1,               xmm2                ; d7 d6 d5 d4 d3 d2 d1 d0 c7 c6 c5 c4 c3 c2 c1 c0
-        punpckhdq   xmm4,               xmm2                ; f7 f6 f4 f4 f3 f2 f1 f0 e7 e6 e5 e4 e3 e2 e1 e0
-
-        movq        QWORD  PTR [rsi+4*rax], xmm1
-        movhps      MMWORD PTR [rdi+4*rax], xmm1
-
-        movq        QWORD  PTR [rsi+2*rcx], xmm4
-        movhps      MMWORD PTR [rdi+2*rcx], xmm4
-%endmacro
-
-
-;void vp8_mbloop_filter_vertical_edge_sse2
-;(
-;    unsigned char *src_ptr,
-;    int            src_pixel_step,
-;    const char    *blimit,
-;    const char    *limit,
-;    const char    *thresh,
-;    int            count
-;)
-global sym(vp8_mbloop_filter_vertical_edge_sse2)
-sym(vp8_mbloop_filter_vertical_edge_sse2):
-    push        rbp
-    mov         rbp, rsp
-    SHADOW_ARGS_TO_STACK 6
-    SAVE_XMM 7
-    GET_GOT     rbx
-    push        rsi
-    push        rdi
-    ; end prolog
-
-    ALIGN_STACK 16, rax
-    sub          rsp, 160     ; reserve 160 bytes
-    %define t0   [rsp + 0]    ;__declspec(align(16)) char t0[16];
-    %define t1   [rsp + 16]   ;__declspec(align(16)) char t1[16];
-    %define srct [rsp + 32]   ;__declspec(align(16)) char srct[128];
-
-        mov         rsi,                arg(0)              ; src_ptr
-        movsxd      rax,                dword ptr arg(1)    ; src_pixel_step
-
-        lea         rsi,                [rsi - 4]
-        lea         rdi,                [rsi + rax]         ; rdi points to row +1 for indirect addressing
-        lea         rcx,                [rax*2+rax]
-
-        ; Transpose
-        TRANSPOSE_16X8 1, 0
-
-        ; calculate filter mask and high edge variance
-        LFV_FILTER_MASK_HEV_MASK 0
-
-        neg         rax
-        ; start work on filters
-        MB_FILTER_AND_WRITEBACK 2
-
-        lea         rsi,                [rsi+rax*8]
-        lea         rdi,                [rdi+rax*8]
-
-        ; transpose and write back
-        MBV_TRANSPOSE
-
-        neg         rax
-
-        MBV_WRITEBACK_1
-
-        lea         rsi,                [rsi+rax*8]
-        lea         rdi,                [rdi+rax*8]
-        MBV_WRITEBACK_2
-
-    add rsp, 160
-    pop rsp
-    ; begin epilog
-    pop rdi
-    pop rsi
-    RESTORE_GOT
-    RESTORE_XMM
-    UNSHADOW_ARGS
-    pop         rbp
-    ret
-
-
-;void vp8_mbloop_filter_vertical_edge_uv_sse2
-;(
-;    unsigned char *u,
-;    int            src_pixel_step,
-;    const char    *blimit,
-;    const char    *limit,
-;    const char    *thresh,
-;    unsigned char *v
-;)
-global sym(vp8_mbloop_filter_vertical_edge_uv_sse2)
-sym(vp8_mbloop_filter_vertical_edge_uv_sse2):
-    push        rbp
-    mov         rbp, rsp
-    SHADOW_ARGS_TO_STACK 6
-    SAVE_XMM 7
-    GET_GOT     rbx
-    push        rsi
-    push        rdi
-    ; end prolog
-
-    ALIGN_STACK 16, rax
-    sub          rsp, 160     ; reserve 160 bytes
-    %define t0   [rsp + 0]    ;__declspec(align(16)) char t0[16];
-    %define t1   [rsp + 16]   ;__declspec(align(16)) char t1[16];
-    %define srct [rsp + 32]   ;__declspec(align(16)) char srct[128];
-
-        mov         rsi,                arg(0)              ; u_ptr
-        movsxd      rax,                dword ptr arg(1)    ; src_pixel_step
-
-        lea         rsi,                [rsi - 4]
-        lea         rdi,                [rsi + rax]         ; rdi points to row +1 for indirect addressing
-        lea         rcx,                [rax+2*rax]
-
-        lea         rdx,                srct
-
-        ; Transpose
-        TRANSPOSE_16X8 0, 0
-
-        ; calculate filter mask and high edge variance
-        LFV_FILTER_MASK_HEV_MASK 0
-
-        ; start work on filters
-        MB_FILTER_AND_WRITEBACK 2
-
-        ; transpose and write back
-        MBV_TRANSPOSE
-
-        mov         rsi,                arg(0)             ;u_ptr
-        lea         rsi,                [rsi - 4]
-        lea         rdi,                [rsi + rax]
-        MBV_WRITEBACK_1
-        mov         rsi,                arg(5)             ;v_ptr
-        lea         rsi,                [rsi - 4]
-        lea         rdi,                [rsi + rax]
-        MBV_WRITEBACK_2
-
-    add rsp, 160
-    pop rsp
-    ; begin epilog
-    pop rdi
-    pop rsi
-    RESTORE_GOT
-    RESTORE_XMM
-    UNSHADOW_ARGS
-    pop         rbp
-    ret
-
-
 ;void vp8_loop_filter_simple_horizontal_edge_sse2
 ;(
 ;    unsigned char *src_ptr,
diff --git a/vp8/common/x86/loopfilter_x86.c b/vp8/common/x86/loopfilter_x86.c
index e723981..4d490a6 100644
--- a/vp8/common/x86/loopfilter_x86.c
+++ b/vp8/common/x86/loopfilter_x86.c
@@ -9,63 +9,36 @@
  */
 
 
+#include <emmintrin.h>  // SSE2
 #include "vpx_config.h"
 #include "vp8/common/loopfilter.h"
 
-prototype_loopfilter(vp8_mbloop_filter_vertical_edge_mmx);
-prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_mmx);
 prototype_loopfilter(vp8_loop_filter_vertical_edge_mmx);
 prototype_loopfilter(vp8_loop_filter_horizontal_edge_mmx);
 
 prototype_loopfilter(vp8_loop_filter_vertical_edge_sse2);
 prototype_loopfilter(vp8_loop_filter_horizontal_edge_sse2);
-prototype_loopfilter(vp8_mbloop_filter_vertical_edge_sse2);
-prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_sse2);
 
 extern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_sse2;
 extern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_sse2;
-extern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_sse2;
-extern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_sse2;
 
 #if HAVE_MMX
 /* Horizontal MB filtering */
 void vp8_loop_filter_mbh_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
                              int y_stride, int uv_stride, struct loop_filter_info *lfi) {
-  vp8_mbloop_filter_horizontal_edge_mmx(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
-
-  if (u_ptr)
-    vp8_mbloop_filter_horizontal_edge_mmx(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
-
-  if (v_ptr)
-    vp8_mbloop_filter_horizontal_edge_mmx(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
 }
 
 
 /* Vertical MB Filtering */
 void vp8_loop_filter_mbv_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
                              int y_stride, int uv_stride, struct loop_filter_info *lfi) {
-  vp8_mbloop_filter_vertical_edge_mmx(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
-
-  if (u_ptr)
-    vp8_mbloop_filter_vertical_edge_mmx(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
-
-  if (v_ptr)
-    vp8_mbloop_filter_vertical_edge_mmx(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
 }
 
 
 /* Horizontal B Filtering */
 void vp8_loop_filter_bh_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
                             int y_stride, int uv_stride, struct loop_filter_info *lfi) {
-  vp8_loop_filter_horizontal_edge_mmx(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
-  vp8_loop_filter_horizontal_edge_mmx(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
-  vp8_loop_filter_horizontal_edge_mmx(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
 
-  if (u_ptr)
-    vp8_loop_filter_horizontal_edge_mmx(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
-
-  if (v_ptr)
-    vp8_loop_filter_horizontal_edge_mmx(v_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
 }
 
 
@@ -99,26 +72,412 @@
 #endif
 
 
-/* Horizontal MB filtering */
 #if HAVE_SSE2
+void vp8_mbloop_filter_horizontal_edge_c_sse2
+(
+  unsigned char *s,
+  int p,
+  const unsigned char *_blimit,
+  const unsigned char *_limit,
+  const unsigned char *_thresh,
+  int count
+) {
+  DECLARE_ALIGNED(16, unsigned char, flat_op2[16]);
+  DECLARE_ALIGNED(16, unsigned char, flat_op1[16]);
+  DECLARE_ALIGNED(16, unsigned char, flat_op0[16]);
+  DECLARE_ALIGNED(16, unsigned char, flat_oq2[16]);
+  DECLARE_ALIGNED(16, unsigned char, flat_oq1[16]);
+  DECLARE_ALIGNED(16, unsigned char, flat_oq0[16]);
+  __m128i mask, hev, flat;
+  __m128i thresh, limit, blimit;
+  const __m128i zero = _mm_set1_epi16(0);
+  __m128i p4, p3, p2, p1, p0, q0, q1, q2, q3, q4;
+
+  thresh = _mm_shuffle_epi32(_mm_cvtsi32_si128(_thresh[0] * 0x01010101), 0);
+  limit = _mm_shuffle_epi32(_mm_cvtsi32_si128(_limit[0] * 0x01010101), 0);
+  blimit = _mm_shuffle_epi32(_mm_cvtsi32_si128(_blimit[0] * 0x01010101), 0);
+
+  p4 = _mm_loadu_si128((__m128i *)(s - 5 * p));
+  p3 = _mm_loadu_si128((__m128i *)(s - 4 * p));
+  p2 = _mm_loadu_si128((__m128i *)(s - 3 * p));
+  p1 = _mm_loadu_si128((__m128i *)(s - 2 * p));
+  p0 = _mm_loadu_si128((__m128i *)(s - 1 * p));
+  q0 = _mm_loadu_si128((__m128i *)(s - 0 * p));
+  q1 = _mm_loadu_si128((__m128i *)(s + 1 * p));
+  q2 = _mm_loadu_si128((__m128i *)(s + 2 * p));
+  q3 = _mm_loadu_si128((__m128i *)(s + 3 * p));
+  q4 = _mm_loadu_si128((__m128i *)(s + 4 * p));
+  {
+    const __m128i abs_p1p0 = _mm_or_si128(_mm_subs_epu8(p1, p0),
+                                          _mm_subs_epu8(p0, p1));
+    const __m128i abs_q1q0 = _mm_or_si128(_mm_subs_epu8(q1, q0),
+                                          _mm_subs_epu8(q0, q1));
+    const __m128i one = _mm_set1_epi8(1);
+    const __m128i fe = _mm_set1_epi8(0xfe);
+    const __m128i ff = _mm_cmpeq_epi8(abs_p1p0, abs_p1p0);
+    __m128i abs_p0q0 = _mm_or_si128(_mm_subs_epu8(p0, q0),
+                                    _mm_subs_epu8(q0, p0));
+    __m128i abs_p1q1 = _mm_or_si128(_mm_subs_epu8(p1, q1),
+                                    _mm_subs_epu8(q1, p1));
+    __m128i work;
+    flat = _mm_max_epu8(abs_p1p0, abs_q1q0);
+    hev = _mm_subs_epu8(flat, thresh);
+    hev = _mm_xor_si128(_mm_cmpeq_epi8(hev, zero), ff);
+
+    abs_p0q0 =_mm_adds_epu8(abs_p0q0, abs_p0q0);
+    abs_p1q1 = _mm_srli_epi16(_mm_and_si128(abs_p1q1, fe), 1);
+    mask = _mm_subs_epu8(_mm_adds_epu8(abs_p0q0, abs_p1q1), blimit);
+    mask = _mm_xor_si128(_mm_cmpeq_epi8(mask, zero), ff);
+    // mask |= (abs(p0 - q0) * 2 + abs(p1 - q1) / 2  > blimit) * -1;
+    mask = _mm_max_epu8(flat, mask);
+    // mask |= (abs(p1 - p0) > limit) * -1;
+    // mask |= (abs(q1 - q0) > limit) * -1;
+    work = _mm_max_epu8(_mm_or_si128(_mm_subs_epu8(p2, p1),
+                                     _mm_subs_epu8(p1, p2)),
+                         _mm_or_si128(_mm_subs_epu8(p3, p2),
+                                      _mm_subs_epu8(p2, p3)));
+    mask = _mm_max_epu8(work, mask);
+    work = _mm_max_epu8(_mm_or_si128(_mm_subs_epu8(q2, q1),
+                                     _mm_subs_epu8(q1, q2)),
+                         _mm_or_si128(_mm_subs_epu8(q3, q2),
+                                      _mm_subs_epu8(q2, q3)));
+    mask = _mm_max_epu8(work, mask);
+    mask = _mm_subs_epu8(mask, limit);
+    mask = _mm_cmpeq_epi8(mask, zero);
+
+    work = _mm_max_epu8(_mm_or_si128(_mm_subs_epu8(p2, p0),
+                                     _mm_subs_epu8(p0, p2)),
+                         _mm_or_si128(_mm_subs_epu8(q2, q0),
+                                      _mm_subs_epu8(q0, q2)));
+    flat = _mm_max_epu8(work, flat);
+    work = _mm_max_epu8(_mm_or_si128(_mm_subs_epu8(p3, p0),
+                                     _mm_subs_epu8(p0, p3)),
+                         _mm_or_si128(_mm_subs_epu8(q3, q0),
+                                      _mm_subs_epu8(q0, q3)));
+    flat = _mm_max_epu8(work, flat);
+    work = _mm_max_epu8(_mm_or_si128(_mm_subs_epu8(p4, p0),
+                                     _mm_subs_epu8(p0, p4)),
+                         _mm_or_si128(_mm_subs_epu8(q4, q0),
+                                      _mm_subs_epu8(q0, q4)));
+    flat = _mm_max_epu8(work, flat);
+    flat = _mm_subs_epu8(flat, one);
+    flat = _mm_cmpeq_epi8(flat, zero);
+    flat = _mm_and_si128(flat, mask);
+  }
+  {
+    const __m128i four = _mm_set1_epi16(4);
+    unsigned char *src = s;
+    int i = 0;
+    do {
+      __m128i workp_a, workp_b, workp_shft;
+      p4 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src - 5 * p)), zero);
+      p3 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src - 4 * p)), zero);
+      p2 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src - 3 * p)), zero);
+      p1 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src - 2 * p)), zero);
+      p0 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src - 1 * p)), zero);
+      q0 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src - 0 * p)), zero);
+      q1 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src + 1 * p)), zero);
+      q2 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src + 2 * p)), zero);
+      q3 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src + 3 * p)), zero);
+      q4 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i *)(src + 4 * p)), zero);
+
+      workp_a = _mm_add_epi16(_mm_add_epi16(p4, p3), _mm_add_epi16(p2, p1));
+      workp_a = _mm_add_epi16(_mm_add_epi16(workp_a, four), p0);
+      workp_b = _mm_add_epi16(_mm_add_epi16(q0, p2), p4);
+      workp_shft = _mm_srli_epi16(_mm_add_epi16(workp_a, workp_b), 3);
+      _mm_storel_epi64((__m128i *)&flat_op2[i*8],
+                       _mm_packus_epi16(workp_shft, workp_shft));
+
+      workp_b = _mm_add_epi16(_mm_add_epi16(q0, q1), p1);
+      workp_shft = _mm_srli_epi16(_mm_add_epi16(workp_a, workp_b), 3);
+      _mm_storel_epi64((__m128i *)&flat_op1[i*8],
+                       _mm_packus_epi16(workp_shft, workp_shft));
+
+      workp_a = _mm_add_epi16(_mm_sub_epi16(workp_a, p4), q2);
+      workp_b = _mm_add_epi16(_mm_sub_epi16(workp_b, p1), p0);
+      workp_shft = _mm_srli_epi16(_mm_add_epi16(workp_a, workp_b), 3);
+      _mm_storel_epi64((__m128i *)&flat_op0[i*8],
+                       _mm_packus_epi16(workp_shft, workp_shft));
+
+      workp_a = _mm_add_epi16(_mm_sub_epi16(workp_a, p3), q3);
+      workp_b = _mm_add_epi16(_mm_sub_epi16(workp_b, p0), q0);
+      workp_shft = _mm_srli_epi16(_mm_add_epi16(workp_a, workp_b), 3);
+      _mm_storel_epi64((__m128i *)&flat_oq0[i*8],
+                       _mm_packus_epi16(workp_shft, workp_shft));
+
+      workp_a = _mm_add_epi16(_mm_sub_epi16(workp_a, p2), q4);
+      workp_b = _mm_add_epi16(_mm_sub_epi16(workp_b, q0), q1);
+      workp_shft = _mm_srli_epi16(_mm_add_epi16(workp_a, workp_b), 3);
+      _mm_storel_epi64((__m128i *)&flat_oq1[i*8],
+                       _mm_packus_epi16(workp_shft, workp_shft));
+
+      workp_a = _mm_add_epi16(_mm_sub_epi16(workp_a, p1), q4);
+      workp_b = _mm_add_epi16(_mm_sub_epi16(workp_b, q1), q2);
+      workp_shft = _mm_srli_epi16(_mm_add_epi16(workp_a, workp_b), 3);
+      _mm_storel_epi64((__m128i *)&flat_oq2[i*8],
+                       _mm_packus_epi16(workp_shft, workp_shft));
+
+      src += 8;
+    } while (++i < count);
+  }
+  // lp filter
+  {
+    const __m128i t4 = _mm_set1_epi8(4);
+    const __m128i t3 = _mm_set1_epi8(3);
+    const __m128i t80 = _mm_set1_epi8(0x80);
+    const __m128i te0 = _mm_set1_epi8(0xe0);
+    const __m128i t1f = _mm_set1_epi8(0x1f);
+    const __m128i t1 = _mm_set1_epi8(0x1);
+    const __m128i t7f = _mm_set1_epi8(0x7f);
+
+    const __m128i ps1 = _mm_xor_si128(_mm_loadu_si128((__m128i *)(s - 2 * p)),
+                                      t80);
+    const __m128i ps0 = _mm_xor_si128(_mm_loadu_si128((__m128i *)(s - 1 * p)),
+                                      t80);
+    const __m128i qs0 = _mm_xor_si128(_mm_loadu_si128((__m128i *)(s + 0 * p)),
+                                      t80);
+    const __m128i qs1 = _mm_xor_si128(_mm_loadu_si128((__m128i *)(s + 1 * p)),
+                                      t80);
+    __m128i vp8_filt;
+    __m128i work_a;
+    __m128i filter1, filter2;
+
+    vp8_filt = _mm_and_si128(_mm_subs_epi8(ps1, qs1), hev);
+    work_a = _mm_subs_epi8(qs0, ps0);
+    vp8_filt = _mm_adds_epi8(vp8_filt, work_a);
+    vp8_filt = _mm_adds_epi8(vp8_filt, work_a);
+    vp8_filt = _mm_adds_epi8(vp8_filt, work_a);
+    /* (vp8_filter + 3 * (qs0 - ps0)) & mask */
+    vp8_filt = _mm_and_si128(vp8_filt, mask);
+
+    filter1 = _mm_adds_epi8(vp8_filt, t4);
+    filter2 = _mm_adds_epi8(vp8_filt, t3);
+
+    /* Filter1 >> 3 */
+    work_a = _mm_cmpgt_epi8(zero, filter1);
+    filter1 = _mm_srli_epi16(filter1, 3);
+    work_a = _mm_and_si128(work_a, te0);
+    filter1 = _mm_and_si128(filter1, t1f);
+    filter1 = _mm_or_si128(filter1, work_a);
+
+    /* Filter2 >> 3 */
+    work_a = _mm_cmpgt_epi8(zero, filter2);
+    filter2 = _mm_srli_epi16(filter2, 3);
+    work_a = _mm_and_si128(work_a, te0);
+    filter2 = _mm_and_si128(filter2, t1f);
+    filter2 = _mm_or_si128(filter2, work_a);
+
+    /* vp8_filt >> 1 */
+    vp8_filt = _mm_adds_epi8(filter1, t1);
+    work_a = _mm_cmpgt_epi8(zero, vp8_filt);
+    vp8_filt = _mm_srli_epi16(vp8_filt, 1);
+    work_a = _mm_and_si128(work_a, t80);
+    vp8_filt = _mm_and_si128(vp8_filt, t7f);
+    vp8_filt = _mm_or_si128(vp8_filt, work_a);
+
+    vp8_filt = _mm_andnot_si128(hev, vp8_filt);
+
+    work_a = _mm_xor_si128(_mm_subs_epi8(qs0, filter1), t80);
+    q0 = _mm_load_si128((__m128i *)flat_oq0);
+    work_a = _mm_andnot_si128(flat, work_a);
+    q0 = _mm_and_si128(flat, q0);
+    q0 = _mm_or_si128(work_a, q0);
+
+    work_a = _mm_xor_si128(_mm_subs_epi8(qs1, vp8_filt), t80);
+    q1 = _mm_load_si128((__m128i *)flat_oq1);
+    work_a = _mm_andnot_si128(flat, work_a);
+    q1 = _mm_and_si128(flat, q1);
+    q1 = _mm_or_si128(work_a, q1);
+
+    work_a = _mm_loadu_si128((__m128i *)(s + 2 * p));
+    q2 = _mm_load_si128((__m128i *)flat_oq2);
+    work_a = _mm_andnot_si128(flat, work_a);
+    q2 = _mm_and_si128(flat, q2);
+    q2 = _mm_or_si128(work_a, q2);
+
+    work_a = _mm_xor_si128(_mm_adds_epi8(ps0, filter2), t80);
+    p0 = _mm_load_si128((__m128i *)flat_op0);
+    work_a = _mm_andnot_si128(flat, work_a);
+    p0 = _mm_and_si128(flat, p0);
+    p0 = _mm_or_si128(work_a, p0);
+
+    work_a = _mm_xor_si128(_mm_adds_epi8(ps1, vp8_filt), t80);
+    p1 = _mm_load_si128((__m128i *)flat_op1);
+    work_a = _mm_andnot_si128(flat, work_a);
+    p1 = _mm_and_si128(flat, p1);
+    p1 = _mm_or_si128(work_a, p1);
+
+    work_a = _mm_loadu_si128((__m128i *)(s - 3 * p));
+    p2 = _mm_load_si128((__m128i *)flat_op2);
+    work_a = _mm_andnot_si128(flat, work_a);
+    p2 = _mm_and_si128(flat, p2);
+    p2 = _mm_or_si128(work_a, p2);
+
+    if (count == 1) {
+      _mm_storel_epi64((__m128i *)(s - 3 * p), p2);
+      _mm_storel_epi64((__m128i *)(s - 2 * p), p1);
+      _mm_storel_epi64((__m128i *)(s - 1 * p), p0);
+      _mm_storel_epi64((__m128i *)(s + 0 * p), q0);
+      _mm_storel_epi64((__m128i *)(s + 1 * p), q1);
+      _mm_storel_epi64((__m128i *)(s + 2 * p), q2);
+    } else {
+      _mm_storeu_si128((__m128i *)(s - 3 * p), p2);
+      _mm_storeu_si128((__m128i *)(s - 2 * p), p1);
+      _mm_storeu_si128((__m128i *)(s - 1 * p), p0);
+      _mm_storeu_si128((__m128i *)(s + 0 * p), q0);
+      _mm_storeu_si128((__m128i *)(s + 1 * p), q1);
+      _mm_storeu_si128((__m128i *)(s + 2 * p), q2);
+    }
+  }
+}
+static __inline void transpose(unsigned char *src[], int in_p,
+                               unsigned char *dst[], int out_p,
+                               int num_8x8_to_transpose) {
+  int idx8x8 = 0;
+  __m128i x0, x1, x2, x3, x4, x5, x6, x7;
+  do {
+    unsigned char *in = src[idx8x8];
+    unsigned char *out = dst[idx8x8];
+
+    x0 = _mm_loadl_epi64((__m128i *)(in + 0*in_p));  // 00 01 02 03 04 05 06 07
+    x1 = _mm_loadl_epi64((__m128i *)(in + 1*in_p));  // 10 11 12 13 14 15 16 17
+    x2 = _mm_loadl_epi64((__m128i *)(in + 2*in_p));  // 20 21 22 23 24 25 26 27
+    x3 = _mm_loadl_epi64((__m128i *)(in + 3*in_p));  // 30 31 32 33 34 35 36 37
+    x4 = _mm_loadl_epi64((__m128i *)(in + 4*in_p));  // 40 41 42 43 44 45 46 47
+    x5 = _mm_loadl_epi64((__m128i *)(in + 5*in_p));  // 50 51 52 53 54 55 56 57
+    x6 = _mm_loadl_epi64((__m128i *)(in + 6*in_p));  // 60 61 62 63 64 65 66 67
+    x7 = _mm_loadl_epi64((__m128i *)(in + 7*in_p));  // 70 71 72 73 74 75 76 77
+    // 00 10 01 11 02 12 03 13 04 14 05 15 06 16 07 17
+    x0 = _mm_unpacklo_epi8(x0, x1);
+    // 20 30 21 31 22 32 23 33 24 34 25 35 26 36 27 37
+    x1 = _mm_unpacklo_epi8(x2, x3);
+    // 40 50 41 51 42 52 43 53 44 54 45 55 46 56 47 57
+    x2 = _mm_unpacklo_epi8(x4, x5);
+    // 60 70 61 71 62 72 63 73 64 74 65 75 66 76 67 77
+    x3 = _mm_unpacklo_epi8(x6, x7);
+    // 00 10 20 30 01 11 21 31 02 12 22 32 03 13 23 33
+    x4 = _mm_unpacklo_epi16(x0, x1);
+    // 40 50 60 70 41 51 61 71 42 52 62 72 43 53 63 73
+    x5 = _mm_unpacklo_epi16(x2, x3);
+    // 00 10 20 30 40 50 60 70 01 11 21 31 41 51 61 71
+    x6 = _mm_unpacklo_epi32(x4, x5);
+    // 02 12 22 32 42 52 62 72 03 13 23 33 43 53 63 73
+    x7 = _mm_unpackhi_epi32(x4, x5);
+
+    _mm_storel_pd((double *)(out + 0*out_p),
+                  _mm_castsi128_pd(x6));  // 00 10 20 30 40 50 60 70
+    _mm_storeh_pd((double *)(out + 1*out_p),
+                  _mm_castsi128_pd(x6));  // 01 11 21 31 41 51 61 71
+    _mm_storel_pd((double *)(out + 2*out_p),
+                  _mm_castsi128_pd(x7));  // 02 12 22 32 42 52 62 72
+    _mm_storeh_pd((double *)(out + 3*out_p),
+                  _mm_castsi128_pd(x7));  // 03 13 23 33 43 53 63 73
+
+    // 04 14 24 34 05 15 25 35 06 16 26 36 07 17 27 37
+    x4 = _mm_unpackhi_epi16(x0, x1);
+    // 44 54 64 74 45 55 65 75 46 56 66 76 47 57 67 77
+    x5 = _mm_unpackhi_epi16(x2, x3);
+    // 04 14 24 34 44 54 64 74 05 15 25 35 45 55 65 75
+    x6 = _mm_unpacklo_epi32(x4, x5);
+    // 06 16 26 36 46 56 66 76 07 17 27 37 47 57 67 77
+    x7 = _mm_unpackhi_epi32(x4, x5);
+
+    _mm_storel_pd((double *)(out + 4*out_p),
+                  _mm_castsi128_pd(x6));  // 04 14 24 34 44 54 64 74
+    _mm_storeh_pd((double *)(out + 5*out_p),
+                  _mm_castsi128_pd(x6));  // 05 15 25 35 45 55 65 75
+    _mm_storel_pd((double *)(out + 6*out_p),
+                  _mm_castsi128_pd(x7));  // 06 16 26 36 46 56 66 76
+    _mm_storeh_pd((double *)(out + 7*out_p),
+                  _mm_castsi128_pd(x7));  // 07 17 27 37 47 57 67 77
+  } while (++idx8x8 < num_8x8_to_transpose);
+}
+void vp8_mbloop_filter_vertical_edge_c_sse2
+(
+  unsigned char *s,
+  int p,
+  const unsigned char *blimit,
+  const unsigned char *limit,
+  const unsigned char *thresh,
+  int count
+) {
+  DECLARE_ALIGNED(16, unsigned char, t_dst[16 * 16]);
+  unsigned char *src[4];
+  unsigned char *dst[4];
+
+  src[0] = s - 5;
+  src[1] = s - 5 + 8;
+  src[2] = s - 5 + p*8;
+  src[3] = s - 5 + p*8 + 8;
+
+  dst[0] = t_dst;
+  dst[1] = t_dst + 16*8;
+  dst[2] = t_dst + 8;
+  dst[3] = t_dst + 16*8 + 8;
+
+  // 16x16->16x16 or 16x8->8x16
+  transpose(src, p, dst, 16, (1 << count));
+
+  vp8_mbloop_filter_horizontal_edge_c_sse2(t_dst + 5*16, 16, blimit, limit,
+                                           thresh, count);
+
+  dst[0] = s - 5;
+  dst[1] = s - 5 + p*8;
+
+  src[0] = t_dst;
+  src[1] = t_dst + 8;
+
+  // 16x8->8x16 or 8x8->8x8
+  transpose(src, 16, dst, p, (1 << (count - 1)));
+}
+
+/* Horizontal MB filtering */
 void vp8_loop_filter_mbh_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
                               int y_stride, int uv_stride, struct loop_filter_info *lfi) {
-  vp8_mbloop_filter_horizontal_edge_sse2(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
 
+  vp8_mbloop_filter_horizontal_edge_c_sse2(y_ptr, y_stride, lfi->mblim,
+                                           lfi->lim, lfi->hev_thr, 2);
+
+  /* TODO: write sse2 version with u,v interleaved */
   if (u_ptr)
-    vp8_mbloop_filter_horizontal_edge_uv_sse2(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, v_ptr);
+    vp8_mbloop_filter_horizontal_edge_c_sse2(u_ptr, uv_stride, lfi->mblim,
+                                             lfi->lim, lfi->hev_thr, 1);
+
+  if (v_ptr)
+    vp8_mbloop_filter_horizontal_edge_c_sse2(v_ptr, uv_stride, lfi->mblim,
+                                             lfi->lim, lfi->hev_thr, 1);
 }
 
+void vp8_loop_filter_bh8x8_sse2(unsigned char *y_ptr, unsigned char *u_ptr,
+                             unsigned char *v_ptr, int y_stride, int uv_stride,
+                             struct loop_filter_info *lfi) {
+  vp8_mbloop_filter_horizontal_edge_c_sse2(
+    y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
+}
 
 /* Vertical MB Filtering */
-void vp8_loop_filter_mbv_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
-                              int y_stride, int uv_stride, struct loop_filter_info *lfi) {
-  vp8_mbloop_filter_vertical_edge_sse2(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
+void vp8_loop_filter_mbv_sse2(unsigned char *y_ptr, unsigned char *u_ptr,
+                              unsigned char *v_ptr, int y_stride, int uv_stride,
+                              struct loop_filter_info *lfi) {
+  vp8_mbloop_filter_vertical_edge_c_sse2(y_ptr, y_stride, lfi->mblim, lfi->lim,
+                                         lfi->hev_thr, 2);
 
+  /* TODO: write sse2 version with u,v interleaved */
   if (u_ptr)
-    vp8_mbloop_filter_vertical_edge_uv_sse2(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, v_ptr);
+    vp8_mbloop_filter_vertical_edge_c_sse2(u_ptr, uv_stride, lfi->mblim,
+                                           lfi->lim, lfi->hev_thr, 1);
+
+  if (v_ptr)
+    vp8_mbloop_filter_vertical_edge_c_sse2(v_ptr, uv_stride, lfi->mblim,
+                                           lfi->lim, lfi->hev_thr, 1);
 }
 
+void vp8_loop_filter_bv8x8_sse2(unsigned char *y_ptr, unsigned char *u_ptr,
+                             unsigned char *v_ptr, int y_stride, int uv_stride,
+                             struct loop_filter_info *lfi) {
+  vp8_mbloop_filter_vertical_edge_c_sse2(
+    y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
+}
 
 /* Horizontal B Filtering */
 void vp8_loop_filter_bh_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
diff --git a/vp8/decoder/asm_dec_offsets.c b/vp8/decoder/asm_dec_offsets.c
index 1a6090b..8551bab 100644
--- a/vp8/decoder/asm_dec_offsets.c
+++ b/vp8/decoder/asm_dec_offsets.c
@@ -24,7 +24,6 @@
 DEFINE(detok_L,                                 offsetof(DETOK, L));
 
 DEFINE(detok_qcoeff_start_ptr,                  offsetof(DETOK, qcoeff_start_ptr));
-DEFINE(detok_current_bc,                        offsetof(DETOK, current_bc));
 DEFINE(detok_coef_probs,                        offsetof(DETOK, coef_probs));
 DEFINE(detok_eob,                               offsetof(DETOK, eob));
 
diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c
index fa15af9..0adc333 100644
--- a/vp8/decoder/decodemv.c
+++ b/vp8/decoder/decodemv.c
@@ -18,7 +18,7 @@
 #include "vp8/common/seg_common.h"
 #include "vp8/common/pred_common.h"
 #include "vp8/common/entropy.h"
-
+#include "vp8/decoder/decodemv.h"
 #if CONFIG_DEBUG
 #include <assert.h>
 #endif
@@ -73,12 +73,12 @@
 }
 
 extern const int vp8_i8x8_block[4];
-static void vp8_kfread_modes(VP8D_COMP *pbi,
-                             MODE_INFO *m,
-                             int mb_row,
-                             int mb_col) {
-  VP8_COMMON *const cm = & pbi->common;
-  vp8_reader *const bc = & pbi->bc;
+static void kfread_modes(VP8D_COMP *pbi,
+                         MODE_INFO *m,
+                         int mb_row,
+                         int mb_col,
+                         BOOL_DECODER* const bc) {
+  VP8_COMMON *const cm = &pbi->common;
   const int mis = pbi->common.mode_info_stride;
   int map_index = mb_row * pbi->common.mb_cols + mb_col;
   MB_PREDICTION_MODE y_mode;
@@ -97,7 +97,7 @@
                           m->mbmi.segment_id, SEG_LVL_EOB) ||
        (get_segdata(&pbi->mb,
                     m->mbmi.segment_id, SEG_LVL_EOB) != 0))) {
-    MACROBLOCKD *const xd  = & pbi->mb;
+    MACROBLOCKD *const xd  = &pbi->mb;
     m->mbmi.mb_skip_coeff = vp8_read(bc, get_pred_prob(cm, xd, PRED_MBSKIP));
   } else {
     if (segfeature_active(&pbi->mb,
@@ -170,16 +170,13 @@
   m->mbmi.second_uv_mode = (MB_PREDICTION_MODE)(DC_PRED - 1);
 #endif
 
-#if CONFIG_TX_SELECT
   if (cm->txfm_mode == TX_MODE_SELECT && m->mbmi.mb_skip_coeff == 0 &&
       m->mbmi.mode <= I8X8_PRED) {
     // FIXME(rbultje) code ternary symbol once all experiments are merged
     m->mbmi.txfm_size = vp8_read(bc, cm->prob_tx[0]);
     if (m->mbmi.txfm_size != TX_4X4 && m->mbmi.mode != I8X8_PRED)
       m->mbmi.txfm_size += vp8_read(bc, cm->prob_tx[1]);
-  } else
-#endif
-  if (cm->txfm_mode >= ALLOW_16X16 && m->mbmi.mode <= TM_PRED) {
+  } else if (cm->txfm_mode >= ALLOW_16X16 && m->mbmi.mode <= TM_PRED) {
     m->mbmi.txfm_size = TX_16X16;
   } else if (cm->txfm_mode >= ALLOW_8X8 && m->mbmi.mode != B_PRED) {
     m->mbmi.txfm_size = TX_8X8;
@@ -188,7 +185,6 @@
   }
 }
 
-#if CONFIG_NEWMVENTROPY
 static int read_nmv_component(vp8_reader *r,
                               int rv,
                               const nmv_component *mvcomp) {
@@ -207,7 +203,7 @@
   o = d << 3;
 
   z = vp8_get_mv_mag(c, o);
-  v = (s ? -(z + 1) : (z + 1));
+  v = (s ? -(z + 8) : (z + 8));
   return v;
 }
 
@@ -219,6 +215,7 @@
   int s, z, c, o, d, e, f;
   s = v < 0;
   z = (s ? -v : v) - 1;       /* magnitude - 1 */
+  z &= ~7;
 
   c = vp8_get_mv_class(z, &o);
   d = o >> 3;
@@ -332,124 +329,6 @@
   }
 }
 
-#else
-
-static int read_mvcomponent(vp8_reader *r, const MV_CONTEXT *mvc) {
-  const vp8_prob *const p = (const vp8_prob *) mvc;
-  int x = 0;
-
-  if (vp8_read(r, p [mvpis_short])) { /* Large */
-    int i = 0;
-
-    do {
-      x += vp8_read(r, p [MVPbits + i]) << i;
-    } while (++i < mvnum_short_bits);
-
-    i = mvlong_width - 1;  /* Skip bit 3, which is sometimes implicit */
-
-    do {
-      x += vp8_read(r, p [MVPbits + i]) << i;
-    } while (--i > mvnum_short_bits);
-
-    if (!(x & ~((2 << mvnum_short_bits) - 1))  ||  vp8_read(r, p [MVPbits + mvnum_short_bits]))
-      x += (mvnum_short);
-  } else /* small */
-    x = vp8_treed_read(r, vp8_small_mvtree, p + MVPshort);
-
-  if (x  &&  vp8_read(r, p [MVPsign]))
-    x = -x;
-
-  return x;
-}
-
-static void read_mv(vp8_reader *r, MV *mv, const MV_CONTEXT *mvc) {
-  mv->row = (short)(read_mvcomponent(r,   mvc) << 1);
-  mv->col = (short)(read_mvcomponent(r, ++mvc) << 1);
-#ifdef DEBUG_DEC_MV
-  int i;
-  printf("%d (np): %d %d\n", dec_mvcount++, mv->row, mv->col);
-  // for (i=0; i<MVPcount;++i) printf("  %d", (&mvc[-1])->prob[i]); printf("\n");
-  // for (i=0; i<MVPcount;++i) printf("  %d", (&mvc[0])->prob[i]); printf("\n");
-#endif
-}
-
-static void read_mvcontexts(vp8_reader *bc, MV_CONTEXT *mvc) {
-  int i = 0;
-
-  do {
-    const vp8_prob *up = vp8_mv_update_probs[i].prob;
-    vp8_prob *p = (vp8_prob *)(mvc + i);
-    vp8_prob *const pstop = p + MVPcount;
-
-    do {
-      if (vp8_read(bc, *up++)) {
-        const vp8_prob x = (vp8_prob)vp8_read_literal(bc, 7);
-
-        *p = x ? x << 1 : 1;
-      }
-    } while (++p < pstop);
-  } while (++i < 2);
-}
-
-static int read_mvcomponent_hp(vp8_reader *r, const MV_CONTEXT_HP *mvc) {
-  const vp8_prob *const p = (const vp8_prob *) mvc;
-  int x = 0;
-
-  if (vp8_read(r, p [mvpis_short_hp])) { /* Large */
-    int i = 0;
-
-    do {
-      x += vp8_read(r, p [MVPbits_hp + i]) << i;
-    } while (++i < mvnum_short_bits_hp);
-
-    i = mvlong_width_hp - 1;  /* Skip bit 3, which is sometimes implicit */
-
-    do {
-      x += vp8_read(r, p [MVPbits_hp + i]) << i;
-    } while (--i > mvnum_short_bits_hp);
-
-    if (!(x & ~((2 << mvnum_short_bits_hp) - 1))  ||  vp8_read(r, p [MVPbits_hp + mvnum_short_bits_hp]))
-      x += (mvnum_short_hp);
-  } else /* small */
-    x = vp8_treed_read(r, vp8_small_mvtree_hp, p + MVPshort_hp);
-
-  if (x  &&  vp8_read(r, p [MVPsign_hp]))
-    x = -x;
-
-  return x;
-}
-
-static void read_mv_hp(vp8_reader *r, MV *mv, const MV_CONTEXT_HP *mvc) {
-  mv->row = (short)(read_mvcomponent_hp(r,   mvc));
-  mv->col = (short)(read_mvcomponent_hp(r, ++mvc));
-#ifdef DEBUG_DEC_MV
-  int i;
-  printf("%d (hp): %d %d\n", dec_mvcount++, mv->row, mv->col);
-  // for (i=0; i<MVPcount_hp;++i) printf("  %d", (&mvc[-1])->prob[i]); printf("\n");
-  // for (i=0; i<MVPcount_hp;++i) printf("  %d", (&mvc[0])->prob[i]); printf("\n");
-#endif
-}
-
-static void read_mvcontexts_hp(vp8_reader *bc, MV_CONTEXT_HP *mvc) {
-  int i = 0;
-
-  do {
-    const vp8_prob *up = vp8_mv_update_probs_hp[i].prob;
-    vp8_prob *p = (vp8_prob *)(mvc + i);
-    vp8_prob *const pstop = p + MVPcount_hp;
-
-    do {
-      if (vp8_read(bc, *up++)) {
-        const vp8_prob x = (vp8_prob)vp8_read_literal(bc, 7);
-
-        *p = x ? x << 1 : 1;
-      }
-    } while (++p < pstop);
-  } while (++i < 2);
-}
-
-#endif  /* CONFIG_NEWMVENTROPY */
-
 // Read the referncence frame
 static MV_REFERENCE_FRAME read_ref_frame(VP8D_COMP *pbi,
                                          vp8_reader *const bc,
@@ -458,7 +337,7 @@
   int seg_ref_active;
   int seg_ref_count = 0;
 
-  VP8_COMMON *const cm = & pbi->common;
+  VP8_COMMON *const cm = &pbi->common;
   MACROBLOCKD *const xd = &pbi->mb;
 
   seg_ref_active = segfeature_active(xd,
@@ -596,13 +475,11 @@
   { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15}
 };
 
-#if CONFIG_SWITCHABLE_INTERP
-static void read_switchable_interp_probs(VP8D_COMP *pbi) {
-  VP8_COMMON *const cm = & pbi->common;
-  vp8_reader *const bc = & pbi->bc;
+static void read_switchable_interp_probs(VP8D_COMP* const pbi,
+                                         BOOL_DECODER* const bc) {
+  VP8_COMMON *const cm = &pbi->common;
   int i, j;
   for (j = 0; j <= VP8_SWITCHABLE_FILTERS; ++j) {
-  //for (j = 0; j <= 0; ++j) {
     for (i = 0; i < VP8_SWITCHABLE_FILTERS - 1; ++i) {
       cm->fc.switchable_interp_prob[j][i] = vp8_read_literal(bc, 8);
     }
@@ -610,37 +487,24 @@
   //printf("DECODER: %d %d\n", cm->fc.switchable_interp_prob[0],
   //cm->fc.switchable_interp_prob[1]);
 }
-#endif
 
-static void mb_mode_mv_init(VP8D_COMP *pbi) {
-  VP8_COMMON *const cm = & pbi->common;
-  vp8_reader *const bc = & pbi->bc;
-#if CONFIG_NEWMVENTROPY
+static void mb_mode_mv_init(VP8D_COMP *pbi, vp8_reader *bc) {
+  VP8_COMMON *const cm = &pbi->common;
   nmv_context *const nmvc = &pbi->common.fc.nmvc;
-#else
-  MV_CONTEXT *const mvc = pbi->common.fc.mvc;
-  MV_CONTEXT_HP *const mvc_hp = pbi->common.fc.mvc_hp;
-#endif
-  MACROBLOCKD *const xd  = & pbi->mb;
+  MACROBLOCKD *const xd  = &pbi->mb;
 
-  vpx_memset(cm->mbskip_pred_probs, 0, sizeof(cm->mbskip_pred_probs));
-  if (pbi->common.mb_no_coeff_skip) {
-    int k;
-    for (k = 0; k < MBSKIP_CONTEXTS; ++k)
-      cm->mbskip_pred_probs[k] = (vp8_prob)vp8_read_literal(bc, 8);
-  }
-
-  if (cm->frame_type != KEY_FRAME) {
+  if (cm->frame_type == KEY_FRAME) {
+    if (!cm->kf_ymode_probs_update)
+      cm->kf_ymode_probs_index = vp8_read_literal(bc, 3);
+  } else {
 #if CONFIG_PRED_FILTER
     cm->pred_filter_mode = (vp8_prob)vp8_read_literal(bc, 2);
 
     if (cm->pred_filter_mode == 2)
       cm->prob_pred_filter_off = (vp8_prob)vp8_read_literal(bc, 8);
 #endif
-#if CONFIG_SWITCHABLE_INTERP
     if (cm->mcomp_filter_type == SWITCHABLE)
-      read_switchable_interp_probs(pbi);
-#endif
+      read_switchable_interp_probs(pbi, bc);
     // Decode the baseline probabilities for decoding reference frame
     cm->prob_intra_coded = (vp8_prob)vp8_read_literal(bc, 8);
     cm->prob_last_coded  = (vp8_prob)vp8_read_literal(bc, 8);
@@ -666,14 +530,7 @@
         cm->fc.ymode_prob[i] = (vp8_prob) vp8_read_literal(bc, 8);
       } while (++i < VP8_YMODES - 1);
     }
-#if CONFIG_NEWMVENTROPY
     read_nmvprobs(bc, nmvc, xd->allow_high_precision_mv);
-#else
-    if (xd->allow_high_precision_mv)
-      read_mvcontexts_hp(bc, mvc_hp);
-    else
-      read_mvcontexts(bc, mvc);
-#endif
   }
 }
 
@@ -681,10 +538,10 @@
 // the bitstream or if the value is temporally predicted asserts the predicted
 // value
 static void read_mb_segment_id(VP8D_COMP *pbi,
-                               int mb_row, int mb_col) {
-  vp8_reader *const bc = & pbi->bc;
-  VP8_COMMON *const cm = & pbi->common;
-  MACROBLOCKD *const xd  = & pbi->mb;
+                               int mb_row, int mb_col,
+                               BOOL_DECODER* const bc) {
+  VP8_COMMON *const cm = &pbi->common;
+  MACROBLOCKD *const xd  = &pbi->mb;
   MODE_INFO *mi = xd->mode_info_context;
   MB_MODE_INFO *mbmi = &mi->mbmi;
   int index = mb_row * pbi->common.mb_cols + mb_col;
@@ -753,19 +610,14 @@
 
 static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
                              MODE_INFO *prev_mi,
-                             int mb_row, int mb_col) {
-  VP8_COMMON *const cm = & pbi->common;
-  vp8_reader *const bc = & pbi->bc;
-#if CONFIG_NEWMVENTROPY
+                             int mb_row, int mb_col,
+                             BOOL_DECODER* const bc) {
+  VP8_COMMON *const cm = &pbi->common;
   nmv_context *const nmvc = &pbi->common.fc.nmvc;
-#else
-  MV_CONTEXT *const mvc = pbi->common.fc.mvc;
-  MV_CONTEXT_HP *const mvc_hp = pbi->common.fc.mvc_hp;
-#endif
   const int mis = pbi->common.mode_info_stride;
-  MACROBLOCKD *const xd  = & pbi->mb;
+  MACROBLOCKD *const xd  = &pbi->mb;
 
-  int_mv *const mv = & mbmi->mv;
+  int_mv *const mv = &mbmi->mv;
   int mb_to_left_edge;
   int mb_to_right_edge;
   int mb_to_top_edge;
@@ -795,7 +647,7 @@
   xd->prev_mode_info_context = prev_mi;
 
   // Read the macroblock segment id.
-  read_mb_segment_id(pbi, mb_row, mb_col);
+  read_mb_segment_id(pbi, mb_row, mb_col, bc);
 
   if (pbi->common.mb_no_coeff_skip &&
       (!segfeature_active(xd,
@@ -899,19 +751,16 @@
         mbmi->pred_filter_enabled = cm->pred_filter_mode;
     }
 #endif
-#if CONFIG_SWITCHABLE_INTERP
     if (mbmi->mode >= NEARESTMV && mbmi->mode <= SPLITMV)
     {
       if (cm->mcomp_filter_type == SWITCHABLE) {
         mbmi->interp_filter = vp8_switchable_interp[
             vp8_treed_read(bc, vp8_switchable_interp_tree,
                            get_pred_probs(cm, xd, PRED_SWITCHABLE_INTERP))];
-        //printf("Reading: %d\n", mbmi->interp_filter);
       } else {
         mbmi->interp_filter = cm->mcomp_filter_type;
       }
     }
-#endif
 
     if (cm->comp_pred_mode == COMP_PREDICTION_ONLY ||
         (cm->comp_pred_mode == HYBRID_PREDICTION &&
@@ -1010,44 +859,20 @@
 
           switch (blockmode) {
             case NEW4X4:
-#if CONFIG_NEWMVENTROPY
               read_nmv(bc, &blockmv.as_mv, &best_mv.as_mv, nmvc);
               read_nmv_fp(bc, &blockmv.as_mv, &best_mv.as_mv, nmvc,
                           xd->allow_high_precision_mv);
               vp8_increment_nmv(&blockmv.as_mv, &best_mv.as_mv,
                                 &cm->fc.NMVcount, xd->allow_high_precision_mv);
-#else
-              if (xd->allow_high_precision_mv) {
-                read_mv_hp(bc, &blockmv.as_mv, (const MV_CONTEXT_HP *) mvc_hp);
-                cm->fc.MVcount_hp[0][mv_max_hp + (blockmv.as_mv.row)]++;
-                cm->fc.MVcount_hp[1][mv_max_hp + (blockmv.as_mv.col)]++;
-              } else {
-                read_mv(bc, &blockmv.as_mv, (const MV_CONTEXT *) mvc);
-                cm->fc.MVcount[0][mv_max + (blockmv.as_mv.row >> 1)]++;
-                cm->fc.MVcount[1][mv_max + (blockmv.as_mv.col >> 1)]++;
-              }
-#endif  /* CONFIG_NEWMVENTROPY */
               blockmv.as_mv.row += best_mv.as_mv.row;
               blockmv.as_mv.col += best_mv.as_mv.col;
 
               if (mbmi->second_ref_frame) {
-#if CONFIG_NEWMVENTROPY
                 read_nmv(bc, &secondmv.as_mv, &best_mv_second.as_mv, nmvc);
                 read_nmv_fp(bc, &secondmv.as_mv, &best_mv_second.as_mv, nmvc,
                             xd->allow_high_precision_mv);
                 vp8_increment_nmv(&secondmv.as_mv, &best_mv_second.as_mv,
                                   &cm->fc.NMVcount, xd->allow_high_precision_mv);
-#else
-                if (xd->allow_high_precision_mv) {
-                  read_mv_hp(bc, &secondmv.as_mv, (const MV_CONTEXT_HP *) mvc_hp);
-                  cm->fc.MVcount_hp[0][mv_max_hp + (secondmv.as_mv.row)]++;
-                  cm->fc.MVcount_hp[1][mv_max_hp + (secondmv.as_mv.col)]++;
-                } else {
-                  read_mv(bc, &secondmv.as_mv, (const MV_CONTEXT *) mvc);
-                  cm->fc.MVcount[0][mv_max + (secondmv.as_mv.row >> 1)]++;
-                  cm->fc.MVcount[1][mv_max + (secondmv.as_mv.col >> 1)]++;
-                }
-#endif  /* CONFIG_NEWMVENTROPY */
                 secondmv.as_mv.row += best_mv_second.as_mv.row;
                 secondmv.as_mv.col += best_mv_second.as_mv.col;
               }
@@ -1152,23 +977,11 @@
         break;
 
       case NEWMV:
-#if CONFIG_NEWMVENTROPY
         read_nmv(bc, &mv->as_mv, &best_mv.as_mv, nmvc);
         read_nmv_fp(bc, &mv->as_mv, &best_mv.as_mv, nmvc,
                     xd->allow_high_precision_mv);
         vp8_increment_nmv(&mv->as_mv, &best_mv.as_mv, &cm->fc.NMVcount,
                           xd->allow_high_precision_mv);
-#else
-        if (xd->allow_high_precision_mv) {
-          read_mv_hp(bc, &mv->as_mv, (const MV_CONTEXT_HP *) mvc_hp);
-          cm->fc.MVcount_hp[0][mv_max_hp + (mv->as_mv.row)]++;
-          cm->fc.MVcount_hp[1][mv_max_hp + (mv->as_mv.col)]++;
-        } else {
-          read_mv(bc, &mv->as_mv, (const MV_CONTEXT *) mvc);
-          cm->fc.MVcount[0][mv_max + (mv->as_mv.row >> 1)]++;
-          cm->fc.MVcount[1][mv_max + (mv->as_mv.col >> 1)]++;
-        }
-#endif  /* CONFIG_NEWMVENTROPY */
         mv->as_mv.row += best_mv.as_mv.row;
         mv->as_mv.col += best_mv.as_mv.col;
 
@@ -1183,23 +996,11 @@
                                                       mb_to_top_edge,
                                                       mb_to_bottom_edge);
         if (mbmi->second_ref_frame) {
-#if CONFIG_NEWMVENTROPY
           read_nmv(bc, &mbmi->mv[1].as_mv, &best_mv_second.as_mv, nmvc);
           read_nmv_fp(bc, &mbmi->mv[1].as_mv, &best_mv_second.as_mv, nmvc,
                       xd->allow_high_precision_mv);
           vp8_increment_nmv(&mbmi->mv[1].as_mv, &best_mv_second.as_mv,
                             &cm->fc.NMVcount, xd->allow_high_precision_mv);
-#else
-          if (xd->allow_high_precision_mv) {
-            read_mv_hp(bc, &mbmi->mv[1].as_mv, (const MV_CONTEXT_HP *) mvc_hp);
-            cm->fc.MVcount_hp[0][mv_max_hp + (mbmi->mv[1].as_mv.row)]++;
-            cm->fc.MVcount_hp[1][mv_max_hp + (mbmi->mv[1].as_mv.col)]++;
-          } else {
-            read_mv(bc, &mbmi->mv[1].as_mv, (const MV_CONTEXT *) mvc);
-            cm->fc.MVcount[0][mv_max + (mbmi->mv[1].as_mv.row >> 1)]++;
-            cm->fc.MVcount[1][mv_max + (mbmi->mv[1].as_mv.col >> 1)]++;
-          }
-#endif  /* CONFIG_NEWMVENTROPY */
           mbmi->mv[1].as_mv.row += best_mv_second.as_mv.row;
           mbmi->mv[1].as_mv.col += best_mv_second.as_mv.col;
           mbmi->need_to_clamp_secondmv |=
@@ -1239,6 +1040,14 @@
 #endif
       do {
         mi->bmi[j].as_mode.first = (B_PREDICTION_MODE)vp8_read_bmode(bc, pbi->common.fc.bmode_prob);
+        /*
+        {
+          int p;
+          for (p = 0; p < VP8_BINTRAMODES - 1; ++p)
+            printf(" %d", pbi->common.fc.bmode_prob[p]);
+          printf("\nbmode[%d][%d]: %d\n", pbi->common.current_video_frame, j, mi->bmi[j].as_mode.first);
+        }
+        */
         pbi->common.fc.bmode_counts[mi->bmi[j].as_mode.first]++;
 #if CONFIG_COMP_INTRA_PRED
         if (use_comp_pred) {
@@ -1279,129 +1088,51 @@
 #endif
   }
 
-#if CONFIG_TX_SELECT
   if (cm->txfm_mode == TX_MODE_SELECT && mbmi->mb_skip_coeff == 0 &&
       ((mbmi->ref_frame == INTRA_FRAME && mbmi->mode <= I8X8_PRED) ||
-       (mbmi->ref_frame != INTRA_FRAME && mbmi->mode != SPLITMV))) {
+       (mbmi->ref_frame != INTRA_FRAME && !(mbmi->mode == SPLITMV &&
+                           mbmi->partitioning == PARTITIONING_4X4)))) {
     // FIXME(rbultje) code ternary symbol once all experiments are merged
     mbmi->txfm_size = vp8_read(bc, cm->prob_tx[0]);
-    if (mbmi->txfm_size != TX_4X4 && mbmi->mode != I8X8_PRED)
+    if (mbmi->txfm_size != TX_4X4 && mbmi->mode != I8X8_PRED &&
+        mbmi->mode != SPLITMV)
       mbmi->txfm_size += vp8_read(bc, cm->prob_tx[1]);
-  } else
-#endif
-  if (cm->txfm_mode >= ALLOW_16X16 &&
+  } else if (cm->txfm_mode >= ALLOW_16X16 &&
       ((mbmi->ref_frame == INTRA_FRAME && mbmi->mode <= TM_PRED) ||
        (mbmi->ref_frame != INTRA_FRAME && mbmi->mode != SPLITMV))) {
     mbmi->txfm_size = TX_16X16;
   } else if (cm->txfm_mode >= ALLOW_8X8 &&
-      ((mbmi->ref_frame == INTRA_FRAME && mbmi->mode != B_PRED) ||
-       (mbmi->ref_frame != INTRA_FRAME && mbmi->mode != SPLITMV))) {
+      (!(mbmi->ref_frame == INTRA_FRAME && mbmi->mode == B_PRED) &&
+       !(mbmi->ref_frame != INTRA_FRAME && mbmi->mode == SPLITMV &&
+         mbmi->partitioning == PARTITIONING_4X4))) {
     mbmi->txfm_size = TX_8X8;
   } else {
     mbmi->txfm_size = TX_4X4;
   }
 }
 
-void vp8_decode_mode_mvs(VP8D_COMP *pbi) {
-  int i;
+void vpx_decode_mode_mvs_init(VP8D_COMP *pbi, BOOL_DECODER* const bc) {
   VP8_COMMON *cm = &pbi->common;
-  MODE_INFO *mi = cm->mi;
-  MACROBLOCKD *const xd  = &pbi->mb;
-  int sb_row, sb_col;
-  int sb_rows = (cm->mb_rows + 1) >> 1;
-  int sb_cols = (cm->mb_cols + 1) >> 1;
-  int row_delta[4] = { 0, +1,  0, -1};
-  int col_delta[4] = { +1, -1, +1, +1};
 
-  MODE_INFO *prev_mi = cm->prev_mi;
-
-  mb_mode_mv_init(pbi);
-
-  if (cm->frame_type == KEY_FRAME && !cm->kf_ymode_probs_update) {
-    cm->kf_ymode_probs_index = vp8_read_literal(&pbi->bc, 3);
+  vpx_memset(cm->mbskip_pred_probs, 0, sizeof(cm->mbskip_pred_probs));
+  if (pbi->common.mb_no_coeff_skip) {
+    int k;
+    for (k = 0; k < MBSKIP_CONTEXTS; ++k)
+      cm->mbskip_pred_probs[k] = (vp8_prob)vp8_read_literal(bc, 8);
   }
 
-  for (sb_row = 0; sb_row < sb_rows; sb_row++) {
-    int mb_col = 0;
-    int mb_row = (sb_row << 1);
-
-    for (sb_col = 0; sb_col < sb_cols; sb_col++) {
-#if CONFIG_SUPERBLOCKS
-      mi->mbmi.encoded_as_sb = vp8_read(&pbi->bc, cm->sb_coded);
-#endif
-      for (i = 0; i < 4; i++) {
-
-        int dy = row_delta[i];
-        int dx = col_delta[i];
-        int offset_extended = dy * cm->mode_info_stride + dx;
-
-        if ((mb_row >= cm->mb_rows) || (mb_col >= cm->mb_cols)) {
-          /* next macroblock */
-          mb_row += dy;
-          mb_col += dx;
-          mi += offset_extended;
-          prev_mi += offset_extended;
-          continue;
-        }
-#if CONFIG_SUPERBLOCKS
-        if (i)
-          mi->mbmi.encoded_as_sb = 0;
-#endif
-
-        // Make sure the MacroBlockD mode info pointer is set correctly
-        xd->mode_info_context = mi;
-        xd->prev_mode_info_context = prev_mi;
-
-        pbi->mb.mb_to_top_edge = -((mb_row * 16)) << 3;
-        pbi->mb.mb_to_bottom_edge =
-            ((pbi->common.mb_rows - 1 - mb_row) * 16) << 3;
-
-        if (cm->frame_type == KEY_FRAME)
-          vp8_kfread_modes(pbi, mi, mb_row, mb_col);
-        else
-          read_mb_modes_mv(pbi, mi, &mi->mbmi, prev_mi, mb_row,
-                           mb_col);
-
-#if CONFIG_SUPERBLOCKS
-        if (mi->mbmi.encoded_as_sb) {
-          assert(!i);
-          mb_col += 2;
-          mi[1] = mi[cm->mode_info_stride] =
-            mi[cm->mode_info_stride + 1] = mi[0];
-          mi += 2;
-          prev_mi += 2;
-          break;
-        }
-#endif
-
-        /* next macroblock */
-        mb_row += dy;
-        mb_col += dx;
-        mi += offset_extended;
-        prev_mi += offset_extended;
-      }
-    }
-
-    mi += cm->mode_info_stride + (1 - (cm->mb_cols & 0x1));
-    prev_mi += cm->mode_info_stride + (1 - (cm->mb_cols & 0x1));
-  }
-}
-
-void vpx_decode_mode_mvs_init(VP8D_COMP *pbi){
-  VP8_COMMON *cm = &pbi->common;
-  mb_mode_mv_init(pbi);
-  if (cm->frame_type == KEY_FRAME && !cm->kf_ymode_probs_update)
-    cm->kf_ymode_probs_index = vp8_read_literal(&pbi->bc, 3);
+  mb_mode_mv_init(pbi, bc);
 }
 void vpx_decode_mb_mode_mv(VP8D_COMP *pbi,
                            MACROBLOCKD *xd,
                            int mb_row,
-                           int mb_col){
+                           int mb_col,
+                           BOOL_DECODER* const bc) {
   MODE_INFO *mi = xd->mode_info_context;
   MODE_INFO *prev_mi = xd->prev_mode_info_context;
 
   if (pbi->common.frame_type == KEY_FRAME)
-    vp8_kfread_modes(pbi, mi, mb_row, mb_col);
+    kfread_modes(pbi, mi, mb_row, mb_col, bc);
   else
-    read_mb_modes_mv(pbi, mi, &mi->mbmi, prev_mi, mb_row, mb_col);
+    read_mb_modes_mv(pbi, mi, &mi->mbmi, prev_mi, mb_row, mb_col, bc);
 }
diff --git a/vp8/decoder/decodemv.h b/vp8/decoder/decodemv.h
index 17bbb5b..bfb815f 100644
--- a/vp8/decoder/decodemv.h
+++ b/vp8/decoder/decodemv.h
@@ -11,9 +11,9 @@
 
 #include "onyxd_int.h"
 
-void vp8_decode_mode_mvs(VP8D_COMP *);
-void vpx_decode_mb_mode_mv(VP8D_COMP *pbi,
-                           MACROBLOCKD *xd,
+void vpx_decode_mb_mode_mv(VP8D_COMP* const pbi,
+                           MACROBLOCKD* const xd,
                            int mb_row,
-                           int mb_col);
-void vpx_decode_mode_mvs_init(VP8D_COMP *pbi);
+                           int mb_col,
+                           BOOL_DECODER* const bc);
+void vpx_decode_mode_mvs_init(VP8D_COMP* const pbi, BOOL_DECODER* const bc);
diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c
index cd9b7d2..bc35b17 100644
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -77,7 +77,7 @@
 void vp8cx_init_de_quantizer(VP8D_COMP *pbi) {
   int i;
   int Q;
-  VP8_COMMON *const pc = & pbi->common;
+  VP8_COMMON *const pc = &pbi->common;
 
   for (Q = 0; Q < QINDEX_RANGE; Q++) {
     pc->Y1dequant[Q][0] = (short)vp8_dc_quant(Q, pc->y1dc_delta_q);
@@ -98,7 +98,7 @@
 void mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd) {
   int i;
   int QIndex;
-  VP8_COMMON *const pc = & pbi->common;
+  VP8_COMMON *const pc = &pbi->common;
   int segment_id = xd->mode_info_context->mbmi.segment_id;
 
   // Set the Q baseline allowing for any segment level adjustment
@@ -115,17 +115,13 @@
     }
   } else
     QIndex = pc->base_qindex;
+  xd->q_index = QIndex;
 
   /* Set up the block level dequant pointers */
   for (i = 0; i < 16; i++) {
     xd->block[i].dequant = pc->Y1dequant[QIndex];
   }
 
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
-  xd->q_index = QIndex;
-#endif
-
-
 #if CONFIG_LOSSLESS
   if (!QIndex) {
     pbi->common.rtcd.idct.idct1        = vp8_short_inv_walsh4x4_1_x8_c;
@@ -206,25 +202,18 @@
 }
 
 static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
-                              unsigned int mb_col) {
+                              unsigned int mb_col,
+                              BOOL_DECODER* const bc) {
   int eobtotal = 0;
   MB_PREDICTION_MODE mode;
   int i;
-  int tx_type;
+  int tx_size;
+  TX_TYPE tx_type;
 #if CONFIG_SUPERBLOCKS
   VP8_COMMON *pc = &pbi->common;
   int orig_skip_flag = xd->mode_info_context->mbmi.mb_skip_coeff;
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-  int QIndex;
-  int active_ht;
-#endif
-
-#if CONFIG_HYBRIDTRANSFORM16X16
-  int active_ht16;
-#endif
-
   // re-initialize macroblock dequantizer before detokenization
   if (xd->segmentation_enabled)
     mb_init_dequantizer(pbi, xd);
@@ -235,43 +224,9 @@
   }
 #endif
 
-  tx_type = xd->mode_info_context->mbmi.txfm_size;
+  tx_size = xd->mode_info_context->mbmi.txfm_size;
   mode = xd->mode_info_context->mbmi.mode;
 
-#if CONFIG_HYBRIDTRANSFORM
-  // parse transform types for intra 4x4 mode
-  QIndex = xd->q_index;
-  active_ht = (QIndex < ACTIVE_HT);
-  if (mode == B_PRED) {
-    for (i = 0; i < 16; i++) {
-      BLOCKD *b = &xd->block[i];
-      int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
-      if(active_ht)
-        txfm_map(b, b_mode);
-    } // loop over 4x4 blocks
-  }
-#endif
-
-#if CONFIG_HYBRIDTRANSFORM8X8
-  if (mode == I8X8_PRED) {
-    for (i = 0; i < 4; i++) {
-      int ib = vp8_i8x8_block[i];
-      BLOCKD *b = &xd->block[ib];
-      int i8x8mode = b->bmi.as_mode.first;
-      txfm_map(b, pred_mode_conv(i8x8mode));
-    }
-  }
-#endif
-
-#if CONFIG_HYBRIDTRANSFORM16X16
-  active_ht16 = (QIndex < ACTIVE_HT16);
-  if (mode < I8X8_PRED) {
-    BLOCKD *b = &xd->block[0];
-    if(active_ht16)
-      txfm_map(b, pred_mode_conv(mode));
-  }
-#endif
-
   if (xd->mode_info_context->mbmi.mb_skip_coeff) {
     vp8_reset_mb_tokens_context(xd);
 #if CONFIG_SUPERBLOCKS
@@ -283,30 +238,28 @@
       xd->left_context--;
     }
 #endif
-  } else if (!vp8dx_bool_error(xd->current_bc)) {
+  } else if (!vp8dx_bool_error(bc)) {
     for (i = 0; i < 25; i++) {
       xd->block[i].eob = 0;
       xd->eobs[i] = 0;
     }
-    if (tx_type == TX_16X16)
-      eobtotal = vp8_decode_mb_tokens_16x16(pbi, xd);
-    else if (tx_type == TX_8X8)
-      eobtotal = vp8_decode_mb_tokens_8x8(pbi, xd);
-    else
-      eobtotal = vp8_decode_mb_tokens(pbi, xd);
+    if (tx_size == TX_16X16) {
+      eobtotal = vp8_decode_mb_tokens_16x16(pbi, xd, bc);
+    } else if (tx_size == TX_8X8) {
+      eobtotal = vp8_decode_mb_tokens_8x8(pbi, xd, bc);
+    } else {
+      eobtotal = vp8_decode_mb_tokens(pbi, xd, bc);
+    }
   }
 
   //mode = xd->mode_info_context->mbmi.mode;
-#if CONFIG_SWITCHABLE_INTERP
   if (pbi->common.frame_type != KEY_FRAME)
     vp8_setup_interp_filters(xd, xd->mode_info_context->mbmi.interp_filter,
                              &pbi->common);
-#endif
 
   if (eobtotal == 0 && mode != B_PRED && mode != SPLITMV
       && mode != I8X8_PRED
-      && !vp8dx_bool_error(xd->current_bc)
-     ) {
+      && !vp8dx_bool_error(bc)) {
     /* Special case:  Force the loopfilter to skip when eobtotal and
      * mb_skip_coeff are zero.
      * */
@@ -338,13 +291,6 @@
       if (mode != B_PRED) {
         vp8_build_intra_predictors_mby(xd);
       }
-#if 0
-      // Intra-modes requiring recon data from top-right
-      // MB have been temporarily disabled.
-      else {
-        vp8_intra_prediction_down_copy(xd);
-      }
-#endif
     }
   } else {
 #if CONFIG_SUPERBLOCKS
@@ -379,14 +325,14 @@
       vp8_intra8x8_predict(b, i8x8mode, b->predictor);
 
       if (xd->mode_info_context->mbmi.txfm_size == TX_8X8) {
-#if CONFIG_HYBRIDTRANSFORM8X8
-        vp8_ht_dequant_idct_add_8x8_c(b->bmi.as_mode.tx_type,
-                                      q, dq, pre, dst, 16, stride);
+        tx_type = get_tx_type(xd, &xd->block[idx]);
+        if (tx_type != DCT_DCT) {
+          vp8_ht_dequant_idct_add_8x8_c(tx_type,
+                                        q, dq, pre, dst, 16, stride);
+        } else {
+          vp8_dequant_idct_add_8x8_c(q, dq, pre, dst, 16, stride);
+        }
         q += 64;
-#else
-        vp8_dequant_idct_add_8x8_c(q, dq, pre, dst, 16, stride);
-        q += 64;
-#endif
       } else {
         for (j = 0; j < 4; j++) {
           b = &xd->block[ib + iblock[j]];
@@ -396,7 +342,7 @@
       }
 
       b = &xd->block[16 + i];
-	  vp8_intra_uv4x4_predict(b, i8x8mode, b->predictor);
+      vp8_intra_uv4x4_predict(b, i8x8mode, b->predictor);
       DEQUANT_INVOKE(&pbi->dequant, idct_add)(b->qcoeff, b->dequant,
                                               b->predictor,
                                               *(b->base_dst) + b->dst, 8,
@@ -409,6 +355,7 @@
                                               b->dst_stride);
     }
   } else if (mode == B_PRED) {
+    vp8_intra_prediction_down_copy(xd);
     for (i = 0; i < 16; i++) {
       BLOCKD *b = &xd->block[i];
       int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
@@ -424,45 +371,35 @@
       }
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM
-      if(active_ht)
-        vp8_ht_dequant_idct_add_c( (TX_TYPE)b->bmi.as_mode.tx_type, b->qcoeff,
-                                   b->dequant, b->predictor,
-                                   *(b->base_dst) + b->dst, 16, b->dst_stride);
-      else
+      tx_type = get_tx_type(xd, b);
+      if (tx_type != DCT_DCT) {
+        vp8_ht_dequant_idct_add_c(tx_type, b->qcoeff,
+                                  b->dequant, b->predictor,
+                                  *(b->base_dst) + b->dst, 16, b->dst_stride);
+      } else {
         vp8_dequant_idct_add_c(b->qcoeff, b->dequant, b->predictor,
                                *(b->base_dst) + b->dst, 16, b->dst_stride);
-#else
-      if (xd->eobs[i] > 1)
-      {
-        DEQUANT_INVOKE(&pbi->dequant, idct_add)
-            (b->qcoeff, b->dequant,  b->predictor,
-             *(b->base_dst) + b->dst, 16, b->dst_stride);
-      } else {
-        IDCT_INVOKE(RTCD_VTABLE(idct), idct1_scalar_add)
-            (b->qcoeff[0] * b->dequant[0], b->predictor,
-             *(b->base_dst) + b->dst, 16, b->dst_stride);
-        ((int *)b->qcoeff)[0] = 0;
       }
-#endif
     }
   } else if (mode == SPLITMV) {
-    DEQUANT_INVOKE(&pbi->dequant, idct_add_y_block)
-    (xd->qcoeff, xd->block[0].dequant,
-     xd->predictor, xd->dst.y_buffer,
-     xd->dst.y_stride, xd->eobs);
+    if (tx_size == TX_8X8) {
+      vp8_dequant_idct_add_y_block_8x8_c(xd->qcoeff, xd->block[0].dequant,
+                                         xd->predictor, xd->dst.y_buffer,
+                                         xd->dst.y_stride, xd->eobs, xd);
+    } else {
+      DEQUANT_INVOKE(&pbi->dequant,
+                     idct_add_y_block)(xd->qcoeff, xd->block[0].dequant,
+                                       xd->predictor, xd->dst.y_buffer,
+                                       xd->dst.y_stride, xd->eobs);
+    }
   } else {
     BLOCKD *b = &xd->block[24];
 
-    if (tx_type == TX_16X16) {
-#if CONFIG_HYBRIDTRANSFORM16X16
-      if (mode < I8X8_PRED && active_ht16) {
-        BLOCKD *bd = &xd->block[0];
-        TX_TYPE txfm;
-        txfm_map(bd, pred_mode_conv(mode));
-        txfm = bd->bmi.as_mode.tx_type;
-
-        vp8_ht_dequant_idct_add_16x16_c(txfm, xd->qcoeff,
+    if (tx_size == TX_16X16) {
+      BLOCKD *bd = &xd->block[0];
+      tx_type = get_tx_type(xd, bd);
+      if (tx_type != DCT_DCT) {
+        vp8_ht_dequant_idct_add_16x16_c(tx_type, xd->qcoeff,
                                         xd->block[0].dequant, xd->predictor,
                                         xd->dst.y_buffer, 16, xd->dst.y_stride);
       } else {
@@ -470,13 +407,7 @@
                                      xd->predictor, xd->dst.y_buffer,
                                      16, xd->dst.y_stride);
       }
-#else
-      vp8_dequant_idct_add_16x16_c(xd->qcoeff, xd->block[0].dequant,
-                                   xd->predictor, xd->dst.y_buffer,
-                                   16, xd->dst.y_stride);
-#endif
-    }
-    else if (tx_type == TX_8X8) {
+    } else if (tx_size == TX_8X8) {
 #if CONFIG_SUPERBLOCKS
       void *orig = xd->mode_info_context;
       int n, num = xd->mode_info_context->mbmi.encoded_as_sb ? 4 : 1;
@@ -492,7 +423,7 @@
           xd->mode_info_context += (n & 1);
           xd->mode_info_context += (n >> 1) * pc->mode_info_stride;
           if (!orig_skip_flag) {
-            eobtotal = vp8_decode_mb_tokens_8x8(pbi, xd);
+            eobtotal = vp8_decode_mb_tokens_8x8(pbi, xd, bc);
             if (eobtotal == 0) // skip loopfilter
               xd->mode_info_context->mbmi.mb_skip_coeff = 1;
           } else {
@@ -561,9 +492,10 @@
 #if CONFIG_SUPERBLOCKS
   if (!xd->mode_info_context->mbmi.encoded_as_sb) {
 #endif
-    if ((tx_type == TX_8X8 &&
-         xd->mode_info_context->mbmi.mode != I8X8_PRED)
-        || tx_type == TX_16X16
+    if ((tx_size == TX_8X8 &&
+         xd->mode_info_context->mbmi.mode != I8X8_PRED &&
+         xd->mode_info_context->mbmi.mode != SPLITMV)
+        || tx_size == TX_16X16
        )
       DEQUANT_INVOKE(&pbi->dequant, idct_add_uv_block_8x8) //
           (xd->qcoeff + 16 * 16, xd->block[16].dequant,
@@ -604,7 +536,8 @@
 
 /* Decode a row of Superblocks (2x2 region of MBs) */
 static void
-decode_sb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mbrow, MACROBLOCKD *xd) {
+decode_sb_row(VP8D_COMP *pbi, VP8_COMMON *pc, int mbrow, MACROBLOCKD *xd,
+              BOOL_DECODER* const bc) {
   int i;
   int sb_col;
   int mb_row, mb_col;
@@ -627,8 +560,7 @@
     MODE_INFO *mi = xd->mode_info_context;
 
 #if CONFIG_SUPERBLOCKS
-    if (pbi->interleaved_decoding)
-      mi->mbmi.encoded_as_sb = vp8_read(&pbi->bc, pc->sb_coded);
+    mi->mbmi.encoded_as_sb = vp8_read(bc, pc->sb_coded);
 #endif
 
     // Process the 4 MBs within the SB in the order:
@@ -638,6 +570,8 @@
       int dx = col_delta[i];
       int offset_extended = dy * xd->mode_info_stride + dx;
 
+      xd->mb_index = i;
+
       mi = xd->mode_info_context;
       if ((mb_row >= pc->mb_rows) || (mb_col >= pc->mb_cols)) {
         // MB lies outside frame, skip on to next
@@ -677,8 +611,7 @@
       if (i)
         mi->mbmi.encoded_as_sb = 0;
 #endif
-      if(pbi->interleaved_decoding)
-        vpx_decode_mb_mode_mv(pbi, xd, mb_row, mb_col);
+      vpx_decode_mb_mode_mv(pbi, xd, mb_row, mb_col, bc);
 
       update_blockd_bmi(xd);
 
@@ -726,7 +659,7 @@
         mi[pc->mode_info_stride + 1] = mi[0];
       }
 #endif
-      decode_macroblock(pbi, xd, mb_col);
+      decode_macroblock(pbi, xd, mb_col, bc);
 #if CONFIG_SUPERBLOCKS
       if (xd->mode_info_context->mbmi.encoded_as_sb) {
         mi[1].mbmi.txfm_size = mi[0].mbmi.txfm_size;
@@ -736,7 +669,7 @@
 #endif
 
       /* check if the boolean decoder has suffered an error */
-      xd->corrupted |= vp8dx_bool_error(xd->current_bc);
+      xd->corrupted |= vp8dx_bool_error(bc);
 
 #if CONFIG_SUPERBLOCKS
       if (mi->mbmi.encoded_as_sb) {
@@ -775,21 +708,17 @@
 
 
 static void setup_token_decoder(VP8D_COMP *pbi,
-                                const unsigned char *cx_data) {
+                                const unsigned char *cx_data,
+                                BOOL_DECODER* const bool_decoder) {
   VP8_COMMON          *pc = &pbi->common;
   const unsigned char *user_data_end = pbi->Source + pbi->source_sz;
-  vp8_reader          *bool_decoder;
   const unsigned char *partition;
 
   ptrdiff_t            partition_size;
   ptrdiff_t            bytes_left;
 
-  // Dummy read for now
-  vp8_read_literal(&pbi->bc, 2);
-
   // Set up pointers to token partition
   partition = cx_data;
-  bool_decoder = &pbi->bc2;
   bytes_left = user_data_end - partition;
   partition_size = bytes_left;
 
@@ -809,8 +738,8 @@
 }
 
 static void init_frame(VP8D_COMP *pbi) {
-  VP8_COMMON *const pc = & pbi->common;
-  MACROBLOCKD *const xd  = & pbi->mb;
+  VP8_COMMON *const pc = &pbi->common;
+  MACROBLOCKD *const xd  = &pbi->mb;
 
   if (pc->frame_type == KEY_FRAME) {
     /* Various keyframe initializations */
@@ -887,8 +816,8 @@
 static void read_coef_probs2(VP8D_COMP *pbi) {
   const vp8_prob grpupd = 192;
   int i, j, k, l;
-  vp8_reader *const bc = & pbi->bc;
-  VP8_COMMON *const pc = & pbi->common;
+  vp8_reader *const bc = &pbi->bc;
+  VP8_COMMON *const pc = &pbi->common;
   for (l = 0; l < ENTROPY_NODES; l++) {
     if (vp8_read(bc, grpupd)) {
       // printf("Decoding %d\n", l);
@@ -928,10 +857,9 @@
 }
 #endif
 
-static void read_coef_probs(VP8D_COMP *pbi) {
+static void read_coef_probs(VP8D_COMP *pbi, BOOL_DECODER* const bc) {
   int i, j, k, l;
-  vp8_reader *const bc = & pbi->bc;
-  VP8_COMMON *const pc = & pbi->common;
+  VP8_COMMON *const pc = &pbi->common;
 
   {
     if (vp8_read_bit(bc)) {
@@ -952,7 +880,6 @@
           }
         }
   }
-#if CONFIG_HYBRIDTRANSFORM
   {
     if (vp8_read_bit(bc)) {
       /* read coef probability tree */
@@ -972,7 +899,6 @@
           }
         }
   }
-#endif
 
   if (pbi->common.txfm_mode != ONLY_4X4 && vp8_read_bit(bc)) {
     // read coef probability tree
@@ -992,7 +918,6 @@
           }
         }
   }
-#if CONFIG_HYBRIDTRANSFORM8X8
   if (pbi->common.txfm_mode != ONLY_4X4 && vp8_read_bit(bc)) {
     // read coef probability tree
     for (i = 0; i < BLOCK_TYPES_8X8; i++)
@@ -1011,7 +936,6 @@
           }
         }
   }
-#endif
 
   // 16x16
   if (pbi->common.txfm_mode > ALLOW_8X8 && vp8_read_bit(bc)) {
@@ -1032,7 +956,6 @@
           }
         }
   }
-#if CONFIG_HYBRIDTRANSFORM16X16
   if (pbi->common.txfm_mode > ALLOW_8X8 && vp8_read_bit(bc)) {
     // read coef probability tree
     for (i = 0; i < BLOCK_TYPES_16X16; ++i)
@@ -1051,13 +974,12 @@
           }
         }
   }
-#endif
 }
 
 int vp8_decode_frame(VP8D_COMP *pbi) {
-  vp8_reader *const bc = & pbi->bc;
-  VP8_COMMON *const pc = & pbi->common;
-  MACROBLOCKD *const xd  = & pbi->mb;
+  BOOL_DECODER header_bc, residual_bc;
+  VP8_COMMON *const pc = &pbi->common;
+  MACROBLOCKD *const xd  = &pbi->mb;
   const unsigned char *data = (const unsigned char *)pbi->Source;
   const unsigned char *data_end = data + pbi->source_sz;
   ptrdiff_t first_partition_length_in_bytes = 0;
@@ -1143,33 +1065,51 @@
 
   init_frame(pbi);
 
-  if (vp8dx_start_decode(bc, data, data_end - data))
+  if (vp8dx_start_decode(&header_bc, data, first_partition_length_in_bytes))
     vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR,
                        "Failed to allocate bool decoder 0");
   if (pc->frame_type == KEY_FRAME) {
-    pc->clr_type    = (YUV_TYPE)vp8_read_bit(bc);
-    pc->clamp_type  = (CLAMP_TYPE)vp8_read_bit(bc);
+    pc->clr_type    = (YUV_TYPE)vp8_read_bit(&header_bc);
+    pc->clamp_type  = (CLAMP_TYPE)vp8_read_bit(&header_bc);
   }
 
   /* Is segmentation enabled */
-  xd->segmentation_enabled = (unsigned char)vp8_read_bit(bc);
+  xd->segmentation_enabled = (unsigned char)vp8_read_bit(&header_bc);
 
   if (xd->segmentation_enabled) {
     // Read whether or not the segmentation map is being explicitly
     // updated this frame.
-    xd->update_mb_segmentation_map = (unsigned char)vp8_read_bit(bc);
+    xd->update_mb_segmentation_map = (unsigned char)vp8_read_bit(&header_bc);
 
     // If so what method will be used.
-    if (xd->update_mb_segmentation_map)
-      pc->temporal_update = (unsigned char)vp8_read_bit(bc);
+    if (xd->update_mb_segmentation_map) {
+      // Which macro block level features are enabled
 
+      // Read the probs used to decode the segment id for each macro
+      // block.
+      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
+          xd->mb_segment_tree_probs[i] = vp8_read_bit(&header_bc) ?
+              (vp8_prob)vp8_read_literal(&header_bc, 8) : 255;
+      }
+
+      // Read the prediction probs needed to decode the segment id
+      pc->temporal_update = (unsigned char)vp8_read_bit(&header_bc);
+      for (i = 0; i < PREDICTION_PROBS; i++) {
+        if (pc->temporal_update) {
+          pc->segment_pred_probs[i] = vp8_read_bit(&header_bc) ?
+              (vp8_prob)vp8_read_literal(&header_bc, 8) : 255;
+        } else {
+          pc->segment_pred_probs[i] = 255;
+        }
+      }
+    }
     // Is the segment data being updated
-    xd->update_mb_segmentation_data = (unsigned char)vp8_read_bit(bc);
+    xd->update_mb_segmentation_data = (unsigned char)vp8_read_bit(&header_bc);
 
     if (xd->update_mb_segmentation_data) {
       int data;
 
-      xd->mb_segment_abs_delta = (unsigned char)vp8_read_bit(bc);
+      xd->mb_segment_abs_delta = (unsigned char)vp8_read_bit(&header_bc);
 
       clearall_segfeatures(xd);
 
@@ -1180,11 +1120,11 @@
 
 #if CONFIG_FEATUREUPDATES
           // feature updated?
-          if (vp8_read_bit(bc)) {
+          if (vp8_read_bit(&header_bc)) {
             int active = 1;
 
             if (segfeature_active(xd, i, j))
-              active = vp8_read_bit(bc);
+              active = vp8_read_bit(&header_bc);
 
             // Is the feature enabled
             if (active) {
@@ -1192,11 +1132,11 @@
               enable_segfeature(xd, i, j);
 
               data = (signed char)vp8_read_literal(
-                       bc, seg_feature_data_bits(j));
+                       &header_bc, seg_feature_data_bits(j));
 
               // Is the segment data signed..
               if (is_segfeature_signed(j)) {
-                if (vp8_read_bit(bc))
+                if (vp8_read_bit(&header_bc))
                   data = - data;
               }
             } else
@@ -1207,16 +1147,16 @@
 
 #else
           // Is the feature enabled
-          if (vp8_read_bit(bc)) {
+          if (vp8_read_bit(&header_bc)) {
             // Update the feature data and mask
             enable_segfeature(xd, i, j);
 
             data = (signed char)vp8_read_literal(
-                     bc, seg_feature_data_bits(j));
+                     &header_bc, seg_feature_data_bits(j));
 
             // Is the segment data signed..
             if (is_segfeature_signed(j)) {
-              if (vp8_read_bit(bc))
+              if (vp8_read_bit(&header_bc))
                 data = - data;
             }
           } else
@@ -1227,38 +1167,6 @@
         }
       }
     }
-
-    if (xd->update_mb_segmentation_map) {
-      // Which macro block level features are enabled
-      vpx_memset(xd->mb_segment_tree_probs, 255,
-                 sizeof(xd->mb_segment_tree_probs));
-      vpx_memset(pc->segment_pred_probs, 255,
-                 sizeof(pc->segment_pred_probs));
-
-      // Read the probs used to decode the segment id for each macro
-      // block.
-      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
-        // If not explicitly set value is defaulted to 255 by
-        // memset above
-        if (vp8_read_bit(bc))
-          xd->mb_segment_tree_probs[i] =
-            (vp8_prob)vp8_read_literal(bc, 8);
-      }
-
-      // If predictive coding of segment map is enabled read the
-      // prediction probabilities.
-      if (pc->temporal_update) {
-        // Read the prediction probs needed to decode the segment id
-        // when predictive coding enabled
-        for (i = 0; i < PREDICTION_PROBS; i++) {
-          // If not explicitly set value is defaulted to 255 by
-          // memset above
-          if (vp8_read_bit(bc))
-            pc->segment_pred_probs[i] =
-              (vp8_prob)vp8_read_literal(bc, 8);
-        }
-      }
-    }
   }
 
   // Read common prediction model status flag probability updates for the
@@ -1270,81 +1178,78 @@
     pc->ref_pred_probs[2] = 40;
   } else {
     for (i = 0; i < PREDICTION_PROBS; i++) {
-      if (vp8_read_bit(bc))
-        pc->ref_pred_probs[i] = (vp8_prob)vp8_read_literal(bc, 8);
+      if (vp8_read_bit(&header_bc))
+        pc->ref_pred_probs[i] = (vp8_prob)vp8_read_literal(&header_bc, 8);
     }
   }
 
 #if CONFIG_SUPERBLOCKS
-  pc->sb_coded = vp8_read_literal(bc, 8);
+  pc->sb_coded = vp8_read_literal(&header_bc, 8);
 #endif
 
   /* Read the loop filter level and type */
-#if CONFIG_TX_SELECT
-  pc->txfm_mode = vp8_read_literal(bc, 2);
+  pc->txfm_mode = vp8_read_literal(&header_bc, 2);
   if (pc->txfm_mode == TX_MODE_SELECT) {
-    pc->prob_tx[0] = vp8_read_literal(bc, 8);
-    pc->prob_tx[1] = vp8_read_literal(bc, 8);
+    pc->prob_tx[0] = vp8_read_literal(&header_bc, 8);
+    pc->prob_tx[1] = vp8_read_literal(&header_bc, 8);
   }
-#else
-  pc->txfm_mode = (TXFM_MODE) vp8_read_bit(bc);
-  if (pc->txfm_mode == ALLOW_8X8)
-    pc->txfm_mode = ALLOW_16X16;
-#endif
 
-  pc->filter_type = (LOOPFILTERTYPE) vp8_read_bit(bc);
-  pc->filter_level = vp8_read_literal(bc, 6);
-  pc->sharpness_level = vp8_read_literal(bc, 3);
+  pc->filter_type = (LOOPFILTERTYPE) vp8_read_bit(&header_bc);
+  pc->filter_level = vp8_read_literal(&header_bc, 6);
+  pc->sharpness_level = vp8_read_literal(&header_bc, 3);
 
   /* Read in loop filter deltas applied at the MB level based on mode or ref frame. */
   xd->mode_ref_lf_delta_update = 0;
-  xd->mode_ref_lf_delta_enabled = (unsigned char)vp8_read_bit(bc);
+  xd->mode_ref_lf_delta_enabled = (unsigned char)vp8_read_bit(&header_bc);
 
   if (xd->mode_ref_lf_delta_enabled) {
     /* Do the deltas need to be updated */
-    xd->mode_ref_lf_delta_update = (unsigned char)vp8_read_bit(bc);
+    xd->mode_ref_lf_delta_update = (unsigned char)vp8_read_bit(&header_bc);
 
     if (xd->mode_ref_lf_delta_update) {
       /* Send update */
       for (i = 0; i < MAX_REF_LF_DELTAS; i++) {
-        if (vp8_read_bit(bc)) {
-          /*sign = vp8_read_bit( bc );*/
-          xd->ref_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6);
+        if (vp8_read_bit(&header_bc)) {
+          /*sign = vp8_read_bit( &header_bc );*/
+          xd->ref_lf_deltas[i] = (signed char)vp8_read_literal(&header_bc, 6);
 
-          if (vp8_read_bit(bc))        /* Apply sign */
+          if (vp8_read_bit(&header_bc))        /* Apply sign */
             xd->ref_lf_deltas[i] = xd->ref_lf_deltas[i] * -1;
         }
       }
 
       /* Send update */
       for (i = 0; i < MAX_MODE_LF_DELTAS; i++) {
-        if (vp8_read_bit(bc)) {
-          /*sign = vp8_read_bit( bc );*/
-          xd->mode_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6);
+        if (vp8_read_bit(&header_bc)) {
+          /*sign = vp8_read_bit( &header_bc );*/
+          xd->mode_lf_deltas[i] = (signed char)vp8_read_literal(&header_bc, 6);
 
-          if (vp8_read_bit(bc))        /* Apply sign */
+          if (vp8_read_bit(&header_bc))        /* Apply sign */
             xd->mode_lf_deltas[i] = xd->mode_lf_deltas[i] * -1;
         }
       }
     }
   }
 
-  setup_token_decoder(pbi, data + first_partition_length_in_bytes);
+  // Dummy read for now
+  vp8_read_literal(&header_bc, 2);
 
-  xd->current_bc = &pbi->bc2;
+  setup_token_decoder(pbi, data + first_partition_length_in_bytes,
+                      &residual_bc);
 
   /* Read the default quantizers. */
   {
     int Q, q_update;
 
-    Q = vp8_read_literal(bc, QINDEX_BITS);  /* AC 1st order Q = default */
+    Q = vp8_read_literal(&header_bc, QINDEX_BITS);
     pc->base_qindex = Q;
     q_update = 0;
-    pc->y1dc_delta_q = get_delta_q(bc, pc->y1dc_delta_q, &q_update);
-    pc->y2dc_delta_q = get_delta_q(bc, pc->y2dc_delta_q, &q_update);
-    pc->y2ac_delta_q = get_delta_q(bc, pc->y2ac_delta_q, &q_update);
-    pc->uvdc_delta_q = get_delta_q(bc, pc->uvdc_delta_q, &q_update);
-    pc->uvac_delta_q = get_delta_q(bc, pc->uvac_delta_q, &q_update);
+    /* AC 1st order Q = default */
+    pc->y1dc_delta_q = get_delta_q(&header_bc, pc->y1dc_delta_q, &q_update);
+    pc->y2dc_delta_q = get_delta_q(&header_bc, pc->y2dc_delta_q, &q_update);
+    pc->y2ac_delta_q = get_delta_q(&header_bc, pc->y2ac_delta_q, &q_update);
+    pc->uvdc_delta_q = get_delta_q(&header_bc, pc->uvdc_delta_q, &q_update);
+    pc->uvac_delta_q = get_delta_q(&header_bc, pc->uvac_delta_q, &q_update);
 
     if (q_update)
       vp8cx_init_de_quantizer(pbi);
@@ -1359,8 +1264,8 @@
    */
   if (pc->frame_type != KEY_FRAME) {
     /* Should the GF or ARF be updated from the current frame */
-    pc->refresh_golden_frame = vp8_read_bit(bc);
-    pc->refresh_alt_ref_frame = vp8_read_bit(bc);
+    pc->refresh_golden_frame = vp8_read_bit(&header_bc);
+    pc->refresh_alt_ref_frame = vp8_read_bit(&header_bc);
 
     if (pc->refresh_alt_ref_frame) {
       vpx_memcpy(&pc->fc, &pc->lfc_a, sizeof(pc->fc));
@@ -1378,37 +1283,35 @@
     pc->copy_buffer_to_gf = 0;
 
     if (!pc->refresh_golden_frame)
-      pc->copy_buffer_to_gf = vp8_read_literal(bc, 2);
+      pc->copy_buffer_to_gf = vp8_read_literal(&header_bc, 2);
 
     pc->copy_buffer_to_arf = 0;
 
     if (!pc->refresh_alt_ref_frame)
-      pc->copy_buffer_to_arf = vp8_read_literal(bc, 2);
+      pc->copy_buffer_to_arf = vp8_read_literal(&header_bc, 2);
 
-    pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp8_read_bit(bc);
-    pc->ref_frame_sign_bias[ALTREF_FRAME] = vp8_read_bit(bc);
+    pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp8_read_bit(&header_bc);
+    pc->ref_frame_sign_bias[ALTREF_FRAME] = vp8_read_bit(&header_bc);
 
     /* Is high precision mv allowed */
-    xd->allow_high_precision_mv = (unsigned char)vp8_read_bit(bc);
+    xd->allow_high_precision_mv = (unsigned char)vp8_read_bit(&header_bc);
     // Read the type of subpel filter to use
-#if CONFIG_SWITCHABLE_INTERP
-    if (vp8_read_bit(bc)) {
+    if (vp8_read_bit(&header_bc)) {
       pc->mcomp_filter_type = SWITCHABLE;
-    } else
-#endif
-    {
-      pc->mcomp_filter_type = vp8_read_literal(bc, 2);
+    } else {
+      pc->mcomp_filter_type = vp8_read_literal(&header_bc, 2);
     }
     /* To enable choice of different interploation filters */
     vp8_setup_interp_filters(xd, pc->mcomp_filter_type, pc);
   }
 
-  pc->refresh_entropy_probs = vp8_read_bit(bc);
+  pc->refresh_entropy_probs = vp8_read_bit(&header_bc);
   if (pc->refresh_entropy_probs == 0) {
     vpx_memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc));
   }
 
-  pc->refresh_last_frame = pc->frame_type == KEY_FRAME  ||  vp8_read_bit(bc);
+  pc->refresh_last_frame = (pc->frame_type == KEY_FRAME)
+                           || vp8_read_bit(&header_bc);
 
   if (0) {
     FILE *z = fopen("decodestats.stt", "a");
@@ -1424,62 +1327,40 @@
 
   vp8_copy(pbi->common.fc.pre_coef_probs,
            pbi->common.fc.coef_probs);
-#if CONFIG_HYBRIDTRANSFORM
   vp8_copy(pbi->common.fc.pre_hybrid_coef_probs,
            pbi->common.fc.hybrid_coef_probs);
-#endif
   vp8_copy(pbi->common.fc.pre_coef_probs_8x8,
            pbi->common.fc.coef_probs_8x8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_copy(pbi->common.fc.pre_hybrid_coef_probs_8x8,
            pbi->common.fc.hybrid_coef_probs_8x8);
-#endif
   vp8_copy(pbi->common.fc.pre_coef_probs_16x16,
            pbi->common.fc.coef_probs_16x16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_copy(pbi->common.fc.pre_hybrid_coef_probs_16x16,
            pbi->common.fc.hybrid_coef_probs_16x16);
-#endif
   vp8_copy(pbi->common.fc.pre_ymode_prob, pbi->common.fc.ymode_prob);
   vp8_copy(pbi->common.fc.pre_uv_mode_prob, pbi->common.fc.uv_mode_prob);
   vp8_copy(pbi->common.fc.pre_bmode_prob, pbi->common.fc.bmode_prob);
   vp8_copy(pbi->common.fc.pre_i8x8_mode_prob, pbi->common.fc.i8x8_mode_prob);
   vp8_copy(pbi->common.fc.pre_sub_mv_ref_prob, pbi->common.fc.sub_mv_ref_prob);
   vp8_copy(pbi->common.fc.pre_mbsplit_prob, pbi->common.fc.mbsplit_prob);
-#if CONFIG_NEWMVENTROPY
   pbi->common.fc.pre_nmvc = pbi->common.fc.nmvc;
-#else
-  vp8_copy(pbi->common.fc.pre_mvc, pbi->common.fc.mvc);
-  vp8_copy(pbi->common.fc.pre_mvc_hp, pbi->common.fc.mvc_hp);
-#endif
   vp8_zero(pbi->common.fc.coef_counts);
-#if CONFIG_HYBRIDTRANSFORM
   vp8_zero(pbi->common.fc.hybrid_coef_counts);
-#endif
   vp8_zero(pbi->common.fc.coef_counts_8x8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_zero(pbi->common.fc.hybrid_coef_counts_8x8);
-#endif
   vp8_zero(pbi->common.fc.coef_counts_16x16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_zero(pbi->common.fc.hybrid_coef_counts_16x16);
-#endif
   vp8_zero(pbi->common.fc.ymode_counts);
   vp8_zero(pbi->common.fc.uv_mode_counts);
   vp8_zero(pbi->common.fc.bmode_counts);
   vp8_zero(pbi->common.fc.i8x8_mode_counts);
   vp8_zero(pbi->common.fc.sub_mv_ref_counts);
   vp8_zero(pbi->common.fc.mbsplit_counts);
-#if CONFIG_NEWMVENTROPY
   vp8_zero(pbi->common.fc.NMVcount);
-#else
-  vp8_zero(pbi->common.fc.MVcount);
-  vp8_zero(pbi->common.fc.MVcount_hp);
-#endif
   vp8_zero(pbi->common.fc.mv_ref_ct);
   vp8_zero(pbi->common.fc.mv_ref_ct_a);
 
-  read_coef_probs(pbi);
+  read_coef_probs(pbi, &header_bc);
 
   vpx_memcpy(&xd->pre, &pc->yv12_fb[pc->lst_fb_idx], sizeof(YV12_BUFFER_CONFIG));
   vpx_memcpy(&xd->dst, &pc->yv12_fb[pc->new_fb_idx], sizeof(YV12_BUFFER_CONFIG));
@@ -1500,12 +1381,9 @@
   vpx_memset(xd->qcoeff, 0, sizeof(xd->qcoeff));
 
   /* Read the mb_no_coeff_skip flag */
-  pc->mb_no_coeff_skip = (int)vp8_read_bit(bc);
+  pc->mb_no_coeff_skip = (int)vp8_read_bit(&header_bc);
 
-  if(pbi->interleaved_decoding)
-    vpx_decode_mode_mvs_init(pbi);
-  else
-    vp8_decode_mode_mvs(pbi);
+  vpx_decode_mode_mvs_init(pbi, &header_bc);
 
   vpx_memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols);
 
@@ -1515,13 +1393,13 @@
 
   /* Decode a row of superblocks */
   for (mb_row = 0; mb_row < pc->mb_rows; mb_row += 2) {
-    decode_sb_row(pbi, pc, mb_row, xd);
+    decode_sb_row(pbi, pc, mb_row, xd, &residual_bc);
   }
   corrupt_tokens |= xd->corrupted;
 
   /* Collect information about decoder corruption. */
   /* 1. Check first boolean decoder for errors. */
-  pc->yv12_fb[pc->new_fb_idx].corrupted = vp8dx_bool_error(bc);
+  pc->yv12_fb[pc->new_fb_idx].corrupted = vp8dx_bool_error(&header_bc);
   /* 2. Check the macroblock information */
   pc->yv12_fb[pc->new_fb_idx].corrupted |= corrupt_tokens;
 
@@ -1534,15 +1412,10 @@
                          "A stream must start with a complete key frame");
   }
 
-  /* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes  \n",bc->pos+pbi->bc2.pos); */
   vp8_adapt_coef_probs(pc);
   if (pc->frame_type != KEY_FRAME) {
     vp8_adapt_mode_probs(pc);
-#if CONFIG_NEWMVENTROPY
     vp8_adapt_nmv_probs(pc, xd->allow_high_precision_mv);
-#else
-    vp8_adapt_mv_probs(pc);
-#endif
     vp8_update_mode_context(&pbi->common);
   }
 
@@ -1561,7 +1434,7 @@
 #ifdef PACKET_TESTING
   {
     FILE *f = fopen("decompressor.VP8", "ab");
-    unsigned int size = pbi->bc2.pos + pbi->bc.pos + 8;
+    unsigned int size = residual_bc.pos + header_bc.pos + 8;
     fwrite((void *) &size, 4, 1, f);
     fwrite((void *) pbi->Source, size, 1, f);
     fclose(f);
diff --git a/vp8/decoder/dequantize.c b/vp8/decoder/dequantize.c
index e55da75..db9c3b0 100644
--- a/vp8/decoder/dequantize.c
+++ b/vp8/decoder/dequantize.c
@@ -42,7 +42,6 @@
 }
 
 
-#if CONFIG_HYBRIDTRANSFORM
 void vp8_ht_dequant_idct_add_c(TX_TYPE tx_type, short *input, short *dq,
                                unsigned char *pred, unsigned char *dest,
                                int pitch, int stride) {
@@ -77,9 +76,7 @@
       pred += pitch;
   }
 }
-#endif
 
-#if CONFIG_HYBRIDTRANSFORM8X8
 void vp8_ht_dequant_idct_add_8x8_c(TX_TYPE tx_type, short *input, short *dq,
                                    unsigned char *pred, unsigned char *dest,
                                    int pitch, int stride) {
@@ -123,7 +120,6 @@
     pred = origpred + (b + 1) / 2 * 4 * pitch + ((b + 1) % 2) * 4;
   }
 }
-#endif
 
 void vp8_dequant_idct_add_c(short *input, short *dq, unsigned char *pred,
                             unsigned char *dest, int pitch, int stride) {
@@ -468,7 +464,6 @@
 #endif
 }
 
-#if CONFIG_HYBRIDTRANSFORM16X16
 void vp8_ht_dequant_idct_add_16x16_c(TX_TYPE tx_type, short *input, short *dq,
                                      unsigned char *pred, unsigned char *dest,
                                      int pitch, int stride) {
@@ -507,7 +502,6 @@
     pred += pitch;
   }
 }
-#endif
 
 void vp8_dequant_idct_add_16x16_c(short *input, short *dq, unsigned char *pred,
                                   unsigned char *dest, int pitch, int stride) {
diff --git a/vp8/decoder/dequantize.h b/vp8/decoder/dequantize.h
index 5b7b215..4ac7104 100644
--- a/vp8/decoder/dequantize.h
+++ b/vp8/decoder/dequantize.h
@@ -76,7 +76,6 @@
 #endif
 extern prototype_dequant_idct_add(vp8_dequant_idct_add);
 
-#if CONFIG_HYBRIDTRANSFORM
 // declare dequantization and inverse transform module of hybrid transform decoder
 #ifndef vp8_ht_dequant_idct_add
 #define vp8_ht_dequant_idct_add vp8_ht_dequant_idct_add_c
@@ -85,7 +84,6 @@
                                     unsigned char *pred, unsigned char *dest,
                                     int pitch, int stride);
 
-#endif
 
 #ifndef vp8_dequant_dc_idct_add
 #define vp8_dequant_dc_idct_add vp8_dequant_dc_idct_add_c
@@ -191,17 +189,13 @@
 #define DEQUANT_INVOKE(ctx,fn) vp8_dequant_##fn
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM8X8
 void vp8_ht_dequant_idct_add_8x8_c(TX_TYPE tx_type, short *input, short *dq,
                                    unsigned char *pred, unsigned char *dest,
                                    int pitch, int stride);
-#endif
 
-#if CONFIG_HYBRIDTRANSFORM16X16
 void vp8_ht_dequant_idct_add_16x16_c(TX_TYPE tx_type, short *input, short *dq,
                                      unsigned char *pred, unsigned char *dest,
                                      int pitch, int stride);
-#endif
 
 #if CONFIG_SUPERBLOCKS
 void vp8_dequant_dc_idct_add_y_block_8x8_inplace_c(short *q, short *dq,
diff --git a/vp8/decoder/detokenize.c b/vp8/decoder/detokenize.c
index 5b5ec7e..fa56865 100644
--- a/vp8/decoder/detokenize.c
+++ b/vp8/decoder/detokenize.c
@@ -135,7 +135,6 @@
   else return DCT_VAL_CATEGORY6;
 }
 
-#if CONFIG_HYBRIDTRANSFORM
 void static count_tokens_adaptive_scan(const MACROBLOCKD *xd, INT16 *qcoeff_ptr,
                                        int block, PLANE_TYPE type,
                                        TX_TYPE tx_type,
@@ -180,7 +179,6 @@
       fc->coef_counts[type][band][pt][DCT_EOB_TOKEN]++;
   }
 }
-#endif
 
 void static count_tokens(INT16 *qcoeff_ptr, int block, PLANE_TYPE type,
                          ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
@@ -202,9 +200,7 @@
 }
 
 void static count_tokens_8x8(INT16 *qcoeff_ptr, int block, PLANE_TYPE type,
-#if CONFIG_HYBRIDTRANSFORM8X8
                              TX_TYPE tx_type,
-#endif
                              ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
                              int eob, int seg_eob, FRAME_CONTEXT *fc) {
   int c, pt, token, band;
@@ -214,29 +210,23 @@
     int v = qcoeff_ptr[rc];
     band = (type == 1 ? vp8_coef_bands[c] : vp8_coef_bands_8x8[c]);
     token = get_token(v);
-#if CONFIG_HYBRIDTRANSFORM8X8
     if (tx_type != DCT_DCT)
       fc->hybrid_coef_counts_8x8[type][band][pt][token]++;
     else
-#endif
       fc->coef_counts_8x8[type][band][pt][token]++;
     pt = vp8_prev_token_class[token];
   }
   if (eob < seg_eob) {
     band = (type == 1 ? vp8_coef_bands[c] : vp8_coef_bands_8x8[c]);
-#if CONFIG_HYBRIDTRANSFORM8X8
     if (tx_type != DCT_DCT)
       fc->hybrid_coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN]++;
     else
-#endif
       fc->coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN]++;
   }
 }
 
 void static count_tokens_16x16(INT16 *qcoeff_ptr, int block, PLANE_TYPE type,
-#if CONFIG_HYBRIDTRANSFORM16X16
                                TX_TYPE tx_type,
-#endif
                                ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
                                int eob, int seg_eob, FRAME_CONTEXT *fc) {
   int c, pt, token;
@@ -246,21 +236,17 @@
     int v = qcoeff_ptr[rc];
     int band = vp8_coef_bands_16x16[c];
     token = get_token(v);
-#if CONFIG_HYBRIDTRANSFORM16X16
     if (tx_type != DCT_DCT)
       fc->hybrid_coef_counts_16x16[type][band][pt][token]++;
     else
-#endif
       fc->coef_counts_16x16[type][band][pt][token]++;
     pt = vp8_prev_token_class[token];
   }
   if (eob < seg_eob) {
     int band = vp8_coef_bands_16x16[c];
-#if CONFIG_HYBRIDTRANSFORM16X16
     if (tx_type != DCT_DCT)
       fc->hybrid_coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN]++;
     else
-#endif
       fc->coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN]++;
   }
 }
@@ -302,17 +288,15 @@
       val += (UINT16)(1 << bits_count);\
   } while (0);
 
-static int vp8_decode_coefs(VP8D_COMP *dx, const MACROBLOCKD *xd,
-                            ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
-                            PLANE_TYPE type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                            TX_TYPE tx_type,
-#endif
-                            int seg_eob, INT16 *qcoeff_ptr, int i,
-                            const int *const scan, int block_type,
-                            const int *coef_bands) {
+static int decode_coefs(VP8D_COMP *dx, const MACROBLOCKD *xd,
+                        BOOL_DECODER* const br,
+                        ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
+                        PLANE_TYPE type,
+                        TX_TYPE tx_type,
+                        int seg_eob, INT16 *qcoeff_ptr, int i,
+                        const int *const scan, int block_type,
+                        const int *coef_bands) {
   FRAME_CONTEXT *const fc = &dx->common.fc;
-  BOOL_DECODER *br = xd->current_bc;
   int tmp, c = (type == PLANE_TYPE_Y_NO_DC);
   const vp8_prob *prob, *coef_probs;
 
@@ -320,23 +304,17 @@
     default:
     case TX_4X4:
       coef_probs =
-#if CONFIG_HYBRIDTRANSFORM
         tx_type != DCT_DCT ? fc->hybrid_coef_probs[type][0][0] :
-#endif
         fc->coef_probs[type][0][0];
       break;
     case TX_8X8:
       coef_probs =
-#if CONFIG_HYBRIDTRANSFORM8X8
         tx_type != DCT_DCT ? fc->hybrid_coef_probs_8x8[type][0][0] :
-#endif
         fc->coef_probs_8x8[type][0][0];
       break;
     case TX_16X16:
       coef_probs =
-#if CONFIG_HYBRIDTRANSFORM16X16
         tx_type != DCT_DCT ? fc->hybrid_coef_probs_16x16[type][0][0] :
-#endif
         fc->coef_probs_16x16[type][0][0];
       break;
   }
@@ -422,31 +400,23 @@
   }
 
   if (block_type == TX_4X4) {
-#if CONFIG_HYBRIDTRANSFORM
     count_tokens_adaptive_scan(xd, qcoeff_ptr, i, type,
                                tx_type,
                                a, l, c, seg_eob, fc);
-#else
-    count_tokens(qcoeff_ptr, i, type,
-                 a, l, c, seg_eob, fc);
-#endif
   }
   else if (block_type == TX_8X8)
     count_tokens_8x8(qcoeff_ptr, i, type,
-#if CONFIG_HYBRIDTRANSFORM8X8
                      tx_type,
-#endif
                      a, l, c, seg_eob, fc);
   else
     count_tokens_16x16(qcoeff_ptr, i, type,
-#if CONFIG_HYBRIDTRANSFORM16X16
                        tx_type,
-#endif
                        a, l, c, seg_eob, fc);
   return c;
 }
 
-int vp8_decode_mb_tokens_16x16(VP8D_COMP *pbi, MACROBLOCKD *xd) {
+int vp8_decode_mb_tokens_16x16(VP8D_COMP *pbi, MACROBLOCKD *xd,
+                               BOOL_DECODER* const bc) {
   ENTROPY_CONTEXT* const A = (ENTROPY_CONTEXT *)xd->above_context;
   ENTROPY_CONTEXT* const L = (ENTROPY_CONTEXT *)xd->left_context;
 
@@ -456,12 +426,7 @@
   const int segment_id = xd->mode_info_context->mbmi.segment_id;
   const int seg_active = segfeature_active(xd, segment_id, SEG_LVL_EOB);
   INT16 *qcoeff_ptr = &xd->qcoeff[0];
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-  TX_TYPE tx_type = DCT_DCT;
-#endif
-#if CONFIG_HYBRIDTRANSFORM16X16
-  tx_type = get_tx_type(xd, &xd->block[0]);
-#endif
+  TX_TYPE tx_type = get_tx_type(xd, &xd->block[0]);
 
   type = PLANE_TYPE_Y_WITH_DC;
 
@@ -473,27 +438,21 @@
   // Luma block
   {
     const int* const scan = vp8_default_zig_zag1d_16x16;
-    c = vp8_decode_coefs(pbi, xd, A, L, type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                         tx_type,
-#endif
-                         seg_eob, qcoeff_ptr,
-                         0, scan, TX_16X16, coef_bands_x_16x16);
+    c = decode_coefs(pbi, xd, bc, A, L, type,
+                     tx_type,
+                     seg_eob, qcoeff_ptr,
+                     0, scan, TX_16X16, coef_bands_x_16x16);
     eobs[0] = c;
-    *A = *L = (c != !type);
-    for (i = 1; i < 16; i++) {
-      *(A + vp8_block2above[i]) = *(A);
-      *(L +  vp8_block2left[i]) = *(L);
-    }
+    A[0] = L[0] = (c != !type);
+    A[1] = A[2] = A[3] = A[0];
+    L[1] = L[2] = L[3] = L[0];
     eobtotal += c;
   }
 
   // 8x8 chroma blocks
   qcoeff_ptr += 256;
   type = PLANE_TYPE_UV;
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
   tx_type = DCT_DCT;
-#endif
   if (seg_active)
     seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB);
   else
@@ -503,12 +462,10 @@
     ENTROPY_CONTEXT* const l = L + vp8_block2left_8x8[i];
     const int* const scan = vp8_default_zig_zag1d_8x8;
 
-    c = vp8_decode_coefs(pbi, xd, a, l, type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                         tx_type,
-#endif
-                         seg_eob, qcoeff_ptr,
-                         i, scan, TX_8X8, coef_bands_x_8x8);
+    c = decode_coefs(pbi, xd, bc, a, l, type,
+                     tx_type,
+                     seg_eob, qcoeff_ptr,
+                     i, scan, TX_8X8, coef_bands_x_8x8);
     a[0] = l[0] = ((eobs[i] = c) != !type);
     a[1] = a[0];
     l[1] = l[0];
@@ -521,7 +478,8 @@
   return eobtotal;
 }
 
-int vp8_decode_mb_tokens_8x8(VP8D_COMP *pbi, MACROBLOCKD *xd) {
+int vp8_decode_mb_tokens_8x8(VP8D_COMP *pbi, MACROBLOCKD *xd,
+                             BOOL_DECODER* const bc) {
   ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
   ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;
 
@@ -531,11 +489,10 @@
   const int segment_id = xd->mode_info_context->mbmi.segment_id;
   const int seg_active = segfeature_active(xd, segment_id, SEG_LVL_EOB);
   INT16 *qcoeff_ptr = &xd->qcoeff[0];
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
   TX_TYPE tx_type = DCT_DCT;
-#endif
 
-  int bufthred = (xd->mode_info_context->mbmi.mode == I8X8_PRED) ? 16 : 24;
+  int bufthred = (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
+                  xd->mode_info_context->mbmi.mode == SPLITMV) ? 16 : 24;
   if (xd->mode_info_context->mbmi.mode != B_PRED &&
       xd->mode_info_context->mbmi.mode != SPLITMV &&
       xd->mode_info_context->mbmi.mode != I8X8_PRED) {
@@ -548,12 +505,10 @@
       seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB);
     else
       seg_eob = 4;
-    c = vp8_decode_coefs(pbi, xd, a, l, type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                         tx_type,
-#endif
-                         seg_eob, qcoeff_ptr + 24 * 16,
-                         24, scan, TX_8X8, coef_bands_x);
+    c = decode_coefs(pbi, xd, bc, a, l, type,
+                     tx_type,
+                     seg_eob, qcoeff_ptr + 24 * 16,
+                     24, scan, TX_8X8, coef_bands_x);
     a[0] = l[0] = ((eobs[24] = c) != !type);
 
     eobtotal += c - 4;
@@ -571,25 +526,18 @@
     ENTROPY_CONTEXT *const a = A + vp8_block2above_8x8[i];
     ENTROPY_CONTEXT *const l = L + vp8_block2left_8x8[i];
     const int *const scan = vp8_default_zig_zag1d_8x8;
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
     tx_type = DCT_DCT;
-#endif
 
     if (i == 16)
       type = PLANE_TYPE_UV;
-#if CONFIG_HYBRIDTRANSFORM8X8
-    if (type == PLANE_TYPE_Y_WITH_DC &&
-        xd->mode_info_context->mbmi.mode == I8X8_PRED) {
+    if (type == PLANE_TYPE_Y_WITH_DC) {
       tx_type = get_tx_type(xd, xd->block + i);
     }
-#endif
 
-    c = vp8_decode_coefs(pbi, xd, a, l, type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                         tx_type,
-#endif
-                         seg_eob, qcoeff_ptr,
-                         i, scan, TX_8X8, coef_bands_x_8x8);
+    c = decode_coefs(pbi, xd, bc, a, l, type,
+                     tx_type,
+                     seg_eob, qcoeff_ptr,
+                     i, scan, TX_8X8, coef_bands_x_8x8);
     a[0] = l[0] = ((eobs[i] = c) != !type);
     a[1] = a[0];
     l[1] = l[0];
@@ -600,9 +548,7 @@
 
   if (bufthred == 16) {
     type = PLANE_TYPE_UV;
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
     tx_type = DCT_DCT;
-#endif
     seg_eob = 16;
 
     // use 4x4 transform for U, V components in I8X8 prediction mode
@@ -611,12 +557,10 @@
       ENTROPY_CONTEXT *const l = L + vp8_block2left[i];
       const int *scan = vp8_default_zig_zag1d;
 
-      c = vp8_decode_coefs(pbi, xd, a, l, type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                           tx_type,
-#endif
-                           seg_eob, qcoeff_ptr,
-                           i, scan, TX_4X4, coef_bands_x);
+      c = decode_coefs(pbi, xd, bc, a, l, type,
+                       tx_type,
+                       seg_eob, qcoeff_ptr,
+                       i, scan, TX_4X4, coef_bands_x);
       a[0] = l[0] = ((eobs[i] = c) != !type);
 
       eobtotal += c;
@@ -628,7 +572,8 @@
 }
 
 
-int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *xd) {
+int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *xd,
+                         BOOL_DECODER* const bc) {
   ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
   ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;
 
@@ -649,12 +594,10 @@
     ENTROPY_CONTEXT *const l = L + vp8_block2left[24];
     type = PLANE_TYPE_Y2;
 
-    c = vp8_decode_coefs(dx, xd, a, l, type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                         DCT_DCT,
-#endif
-                         seg_eob, qcoeff_ptr + 24 * 16, 24,
-                         scan, TX_4X4, coef_bands_x);
+    c = decode_coefs(dx, xd, bc, a, l, type,
+                     DCT_DCT,
+                     seg_eob, qcoeff_ptr + 24 * 16, 24,
+                     scan, TX_4X4, coef_bands_x);
     a[0] = l[0] = ((eobs[24] = c) != !type);
     eobtotal += c - 16;
 
@@ -666,17 +609,11 @@
   for (i = 0; i < 24; ++i) {
     ENTROPY_CONTEXT *const a = A + vp8_block2above[i];
     ENTROPY_CONTEXT *const l = L + vp8_block2left[i];
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
     TX_TYPE tx_type = DCT_DCT;
-#endif
     if (i == 16)
       type = PLANE_TYPE_UV;
 
-#if CONFIG_HYBRIDTRANSFORM
-    if (type == PLANE_TYPE_Y_WITH_DC)
-      tx_type = get_tx_type(xd, &xd->block[i]);
-#endif
-#if CONFIG_HYBRIDTRANSFORM
+    tx_type = get_tx_type(xd, &xd->block[i]);
     switch(tx_type) {
       case ADST_DCT :
         scan = vp8_row_scan;
@@ -690,14 +627,10 @@
         scan = vp8_default_zig_zag1d;
         break;
     }
-#endif
 
-    c = vp8_decode_coefs(dx, xd, a, l, type,
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
-                         tx_type,
-#endif
-                         seg_eob, qcoeff_ptr,
-                         i, scan, TX_4X4, coef_bands_x);
+    c = decode_coefs(dx, xd, bc, a, l, type, tx_type,
+                     seg_eob, qcoeff_ptr,
+                     i, scan, TX_4X4, coef_bands_x);
     a[0] = l[0] = ((eobs[i] = c) != !type);
 
     eobtotal += c;
diff --git a/vp8/decoder/detokenize.h b/vp8/decoder/detokenize.h
index d02d4ca..df36efe 100644
--- a/vp8/decoder/detokenize.h
+++ b/vp8/decoder/detokenize.h
@@ -14,9 +14,12 @@
 
 #include "onyxd_int.h"
 
-void vp8_reset_mb_tokens_context(MACROBLOCKD *xd);
-int vp8_decode_mb_tokens(VP8D_COMP *, MACROBLOCKD *);
-int vp8_decode_mb_tokens_8x8(VP8D_COMP *, MACROBLOCKD *);
-int vp8_decode_mb_tokens_16x16(VP8D_COMP *, MACROBLOCKD *);
+void vp8_reset_mb_tokens_context(MACROBLOCKD* const);
+int vp8_decode_mb_tokens(VP8D_COMP* const, MACROBLOCKD* const,
+                         BOOL_DECODER* const);
+int vp8_decode_mb_tokens_8x8(VP8D_COMP* const, MACROBLOCKD* const,
+                             BOOL_DECODER* const);
+int vp8_decode_mb_tokens_16x16(VP8D_COMP* const, MACROBLOCKD* const,
+                               BOOL_DECODER* const);
 
 #endif /* DETOKENIZE_H */
diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c
index aa3ef81..2e77513 100644
--- a/vp8/decoder/onyxd_if.c
+++ b/vp8/decoder/onyxd_if.c
@@ -149,8 +149,6 @@
 
   pbi->decoded_key_frame = 0;
 
-  pbi->interleaved_decoding = CONFIG_NEWBESTREFMV || CONFIG_SUPERBLOCKS;
-
   return (VP8D_PTR) pbi;
 }
 
diff --git a/vp8/decoder/onyxd_int.h b/vp8/decoder/onyxd_int.h
index 53350b8..0a84256 100644
--- a/vp8/decoder/onyxd_int.h
+++ b/vp8/decoder/onyxd_int.h
@@ -45,7 +45,6 @@
   ENTROPY_CONTEXT_PLANES *L;
 
   INT16 *qcoeff_start_ptr;
-  BOOL_DECODER *current_bc;
 
   vp8_prob const *coef_probs[BLOCK_TYPES];
   vp8_prob const *coef_probs_8x8[BLOCK_TYPES_8X8];
@@ -60,8 +59,6 @@
 
   DECLARE_ALIGNED(16, VP8_COMMON, common);
 
-  vp8_reader bc, bc2;
-
   VP8D_CONFIG oxcf;
 
 
@@ -82,8 +79,6 @@
 
   int decoded_key_frame;
 
-  int interleaved_decoding;
-
 } VP8D_COMP;
 
 int vp8_decode_frame(VP8D_COMP *cpi);
diff --git a/vp8/encoder/asm_enc_offsets.c b/vp8/encoder/asm_enc_offsets.c
index c79e915..8e74901 100644
--- a/vp8/encoder/asm_enc_offsets.c
+++ b/vp8/encoder/asm_enc_offsets.c
@@ -68,7 +68,6 @@
 
 DEFINE(vp8_comp_tplist,                         offsetof(VP8_COMP, tplist));
 DEFINE(vp8_comp_common,                         offsetof(VP8_COMP, common));
-DEFINE(vp8_comp_bc2,                            offsetof(VP8_COMP, bc2));
 
 DEFINE(tokenlist_start,                         offsetof(TOKENLIST, start));
 DEFINE(tokenlist_stop,                          offsetof(TOKENLIST, stop));
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c
index 8125659..36776ab 100644
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -45,32 +45,26 @@
                               [COEF_BANDS]
                               [PREV_COEF_CONTEXTS]
                               [ENTROPY_NODES][2];
-#if CONFIG_HYBRIDTRANSFORM
 unsigned int hybrid_tree_update_hist [BLOCK_TYPES]
                                      [COEF_BANDS]
                                      [PREV_COEF_CONTEXTS]
                                      [ENTROPY_NODES][2];
-#endif
 unsigned int tree_update_hist_8x8 [BLOCK_TYPES_8X8]
                                   [COEF_BANDS]
                                   [PREV_COEF_CONTEXTS]
                                   [ENTROPY_NODES] [2];
-#if CONFIG_HYBRIDTRANSFORM8X8
 unsigned int hybrid_tree_update_hist_8x8 [BLOCK_TYPES_8X8]
                                          [COEF_BANDS]
                                          [PREV_COEF_CONTEXTS]
                                          [ENTROPY_NODES] [2];
-#endif
 unsigned int tree_update_hist_16x16 [BLOCK_TYPES_16X16]
                                     [COEF_BANDS]
                                     [PREV_COEF_CONTEXTS]
                                     [ENTROPY_NODES] [2];
-#if CONFIG_HYBRIDTRANSFORM16X16
 unsigned int hybrid_tree_update_hist_16x16 [BLOCK_TYPES_16X16]
                                            [COEF_BANDS]
                                            [PREV_COEF_CONTEXTS]
                                            [ENTROPY_NODES] [2];
-#endif
 
 extern unsigned int active_section;
 #endif
@@ -111,10 +105,10 @@
   return i;
 }
 
-static void write_prob_diff_update(vp8_writer *const w,
+static void write_prob_diff_update(vp8_writer *const bc,
                                    vp8_prob newp, vp8_prob oldp) {
   int delp = remap_prob(newp, oldp);
-  vp8_encode_term_subexp(w, delp, SUBEXP_PARAM, 255);
+  vp8_encode_term_subexp(bc, delp, SUBEXP_PARAM, 255);
 }
 
 static int prob_diff_update_cost(vp8_prob newp, vp8_prob oldp) {
@@ -186,7 +180,7 @@
 #endif
 
 static void update_mode(
-  vp8_writer *const w,
+  vp8_writer *const bc,
   int n,
   vp8_token tok               [/* n */],
   vp8_tree tree,
@@ -212,34 +206,33 @@
   if (new_b + (n << 8) < old_b) {
     int i = 0;
 
-    vp8_write_bit(w, 1);
+    vp8_write_bit(bc, 1);
 
     do {
       const vp8_prob p = Pnew[i];
 
-      vp8_write_literal(w, Pcur[i] = p ? p : 1, 8);
+      vp8_write_literal(bc, Pcur[i] = p ? p : 1, 8);
     } while (++i < n);
   } else
-    vp8_write_bit(w, 0);
+    vp8_write_bit(bc, 0);
 }
 
-static void update_mbintra_mode_probs(VP8_COMP *cpi) {
-  VP8_COMMON *const cm = & cpi->common;
-
-  vp8_writer *const w = & cpi->bc;
+static void update_mbintra_mode_probs(VP8_COMP* const cpi,
+                                      vp8_writer* const bc) {
+  VP8_COMMON *const cm = &cpi->common;
 
   {
     vp8_prob Pnew   [VP8_YMODES - 1];
     unsigned int bct [VP8_YMODES - 1] [2];
 
     update_mode(
-      w, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
+      bc, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
       Pnew, cm->fc.ymode_prob, bct, (unsigned int *)cpi->ymode_count
     );
   }
 }
 
-static __inline int get_prob(int num, int den) {
+static int get_prob(int num, int den) {
   int p;
   if (den <= 0)
     return 128;
@@ -251,85 +244,42 @@
   return p;
 }
 
+static int get_binary_prob(int n0, int n1) {
+  return get_prob(n0, n0 + n1);
+}
+
 void update_skip_probs(VP8_COMP *cpi) {
-  VP8_COMMON *const pc = & cpi->common;
+  VP8_COMMON *const pc = &cpi->common;
   int prob_skip_false[3] = {0, 0, 0};
   int k;
 
   for (k = 0; k < MBSKIP_CONTEXTS; ++k) {
-    if ((cpi->skip_false_count[k] + cpi->skip_true_count[k])) {
-      prob_skip_false[k] =
-        cpi->skip_false_count[k] * 256 /
-        (cpi->skip_false_count[k] + cpi->skip_true_count[k]);
-
-      if (prob_skip_false[k] <= 1)
-        prob_skip_false[k] = 1;
-
-      if (prob_skip_false[k] > 255)
-        prob_skip_false[k] = 255;
-    } else
-      prob_skip_false[k] = 128;
-
-    pc->mbskip_pred_probs[k] = prob_skip_false[k];
+    pc->mbskip_pred_probs[k] = get_binary_prob(cpi->skip_false_count[k],
+                                               cpi->skip_true_count[k]);
   }
 }
 
-#if CONFIG_SWITCHABLE_INTERP
-void update_switchable_interp_probs(VP8_COMP *cpi) {
-  VP8_COMMON *const pc = & cpi->common;
-  vp8_writer *const w = & cpi->bc;
+void update_switchable_interp_probs(VP8_COMP *cpi, vp8_writer* const bc) {
+  VP8_COMMON *const pc = &cpi->common;
   unsigned int branch_ct[32][2];
   int i, j;
   for (j = 0; j <= VP8_SWITCHABLE_FILTERS; ++j) {
-  //for (j = 0; j <= 0; ++j) {
-/*
-    if (!cpi->dummy_packing)
-#if VP8_SWITCHABLE_FILTERS == 3
-      printf("HELLO %d %d %d\n", cpi->switchable_interp_count[j][0],
-             cpi->switchable_interp_count[j][1], cpi->switchable_interp_count[j][2]);
-#else
-      printf("HELLO %d %d\n", cpi->switchable_interp_count[j][0],
-             cpi->switchable_interp_count[j][1]);
-#endif
-*/
     vp8_tree_probs_from_distribution(
         VP8_SWITCHABLE_FILTERS,
         vp8_switchable_interp_encodings, vp8_switchable_interp_tree,
-        pc->fc.switchable_interp_prob[j], branch_ct, cpi->switchable_interp_count[j],
-        256, 1
-        );
+        pc->fc.switchable_interp_prob[j], branch_ct,
+        cpi->switchable_interp_count[j], 256, 1);
     for (i = 0; i < VP8_SWITCHABLE_FILTERS - 1; ++i) {
       if (pc->fc.switchable_interp_prob[j][i] < 1)
         pc->fc.switchable_interp_prob[j][i] = 1;
-      vp8_write_literal(w, pc->fc.switchable_interp_prob[j][i], 8);
-/*
-      if (!cpi->dummy_packing)
-#if VP8_SWITCHABLE_FILTERS == 3
-        printf("Probs %d %d [%d]\n",
-               pc->fc.switchable_interp_prob[j][0],
-               pc->fc.switchable_interp_prob[j][1], pc->frame_type);
-#else
-        printf("Probs %d [%d]\n", pc->fc.switchable_interp_prob[j][0],
-               pc->frame_type);
-#endif
-*/
+      vp8_write_literal(bc, pc->fc.switchable_interp_prob[j][i], 8);
     }
   }
-  /*
-  if (!cpi->dummy_packing)
-#if VP8_SWITCHABLE_FILTERS == 3
-    printf("Probs %d %d [%d]\n",
-           pc->fc.switchable_interp_prob[0], pc->fc.switchable_interp_prob[1], pc->frame_type);
-#else
-    printf("Probs %d [%d]\n", pc->fc.switchable_interp_prob[0], pc->frame_type);
-#endif
-  */
 }
-#endif
 
 // This function updates the reference frame prediction stats
 static void update_refpred_stats(VP8_COMP *cpi) {
-  VP8_COMMON *const cm = & cpi->common;
+  VP8_COMMON *const cm = &cpi->common;
   int i;
   int tot_count;
   vp8_prob new_pred_probs[PREDICTION_PROBS];
@@ -347,15 +297,8 @@
   } else {
     // From the prediction counts set the probabilities for each context
     for (i = 0; i < PREDICTION_PROBS; i++) {
-      tot_count = cpi->ref_pred_count[i][0] + cpi->ref_pred_count[i][1];
-      if (tot_count) {
-        new_pred_probs[i] =
-          (cpi->ref_pred_count[i][0] * 255 + (tot_count >> 1)) / tot_count;
-
-        // Clamp to minimum allowed value
-        new_pred_probs[i] += !new_pred_probs[i];
-      } else
-        new_pred_probs[i] = 128;
+      new_pred_probs[i] = get_binary_prob(cpi->ref_pred_count[i][0],
+                                          cpi->ref_pred_count[i][1]);
 
       // Decide whether or not to update the reference frame probs.
       // Returned costs are in 1/256 bit units.
@@ -454,13 +397,15 @@
   return bestsavings;
 }
 
-static void pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount) {
-  const TOKENEXTRA *const stop = p + xcount;
+static void pack_mb_tokens(vp8_writer* const bc,
+                           TOKENEXTRA **tp,
+                           const TOKENEXTRA *const stop) {
   unsigned int split;
   unsigned int shift;
-  int count = w->count;
-  unsigned int range = w->range;
-  unsigned int lowvalue = w->lowvalue;
+  int count = bc->count;
+  unsigned int range = bc->range;
+  unsigned int lowvalue = bc->lowvalue;
+  TOKENEXTRA *p = *tp;
 
   while (p < stop) {
     const int t = p->Token;
@@ -471,6 +416,12 @@
     int v = a->value;
     int n = a->Len;
 
+    if (t == EOSB_TOKEN)
+    {
+      ++p;
+      break;
+    }
+
     /* skip one or two nodes */
     if (p->skip_eob_node) {
       n -= p->skip_eob_node;
@@ -497,17 +448,17 @@
         int offset = shift - count;
 
         if ((lowvalue << (offset - 1)) & 0x80000000) {
-          int x = w->pos - 1;
+          int x = bc->pos - 1;
 
-          while (x >= 0 && w->buffer[x] == 0xff) {
-            w->buffer[x] = (unsigned char)0;
+          while (x >= 0 && bc->buffer[x] == 0xff) {
+            bc->buffer[x] = (unsigned char)0;
             x--;
           }
 
-          w->buffer[x] += 1;
+          bc->buffer[x] += 1;
         }
 
-        w->buffer[w->pos++] = (lowvalue >> (24 - offset));
+        bc->buffer[bc->pos++] = (lowvalue >> (24 - offset));
         lowvalue <<= offset;
         shift = count;
         lowvalue &= 0xffffff;
@@ -547,17 +498,17 @@
             int offset = shift - count;
 
             if ((lowvalue << (offset - 1)) & 0x80000000) {
-              int x = w->pos - 1;
+              int x = bc->pos - 1;
 
-              while (x >= 0 && w->buffer[x] == 0xff) {
-                w->buffer[x] = (unsigned char)0;
+              while (x >= 0 && bc->buffer[x] == 0xff) {
+                bc->buffer[x] = (unsigned char)0;
                 x--;
               }
 
-              w->buffer[x] += 1;
+              bc->buffer[x] += 1;
             }
 
-            w->buffer[w->pos++] = (lowvalue >> (24 - offset));
+            bc->buffer[bc->pos++] = (lowvalue >> (24 - offset));
             lowvalue <<= offset;
             shift = count;
             lowvalue &= 0xffffff;
@@ -583,14 +534,14 @@
         range <<= 1;
 
         if ((lowvalue & 0x80000000)) {
-          int x = w->pos - 1;
+          int x = bc->pos - 1;
 
-          while (x >= 0 && w->buffer[x] == 0xff) {
-            w->buffer[x] = (unsigned char)0;
+          while (x >= 0 && bc->buffer[x] == 0xff) {
+            bc->buffer[x] = (unsigned char)0;
             x--;
           }
 
-          w->buffer[x] += 1;
+          bc->buffer[x] += 1;
 
         }
 
@@ -598,20 +549,19 @@
 
         if (!++count) {
           count = -8;
-          w->buffer[w->pos++] = (lowvalue >> 24);
+          bc->buffer[bc->pos++] = (lowvalue >> 24);
           lowvalue &= 0xffffff;
         }
       }
 
     }
-
     ++p;
   }
 
-  w->count = count;
-  w->lowvalue = lowvalue;
-  w->range = range;
-
+  bc->count = count;
+  bc->lowvalue = lowvalue;
+  bc->range = range;
+  *tp = p;
 }
 
 static void write_partition_size(unsigned char *cx_data, int size) {
@@ -628,107 +578,82 @@
 
 static void write_mv_ref
 (
-  vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p
+  vp8_writer *bc, MB_PREDICTION_MODE m, const vp8_prob *p
 ) {
 #if CONFIG_DEBUG
   assert(NEARESTMV <= m  &&  m <= SPLITMV);
 #endif
-  vp8_write_token(w, vp8_mv_ref_tree, p,
+  vp8_write_token(bc, vp8_mv_ref_tree, p,
                   vp8_mv_ref_encoding_array - NEARESTMV + m);
 }
 
 #if CONFIG_SUPERBLOCKS
-static void write_sb_mv_ref(vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p) {
+static void write_sb_mv_ref(vp8_writer *bc, MB_PREDICTION_MODE m,
+                            const vp8_prob *p) {
 #if CONFIG_DEBUG
   assert(NEARESTMV <= m  &&  m < SPLITMV);
 #endif
-  vp8_write_token(w, vp8_sb_mv_ref_tree, p,
+  vp8_write_token(bc, vp8_sb_mv_ref_tree, p,
                   vp8_sb_mv_ref_encoding_array - NEARESTMV + m);
 }
 #endif
 
 static void write_sub_mv_ref
 (
-  vp8_writer *w, B_PREDICTION_MODE m, const vp8_prob *p
+  vp8_writer *bc, B_PREDICTION_MODE m, const vp8_prob *p
 ) {
 #if CONFIG_DEBUG
   assert(LEFT4X4 <= m  &&  m <= NEW4X4);
 #endif
-  vp8_write_token(w, vp8_sub_mv_ref_tree, p,
+  vp8_write_token(bc, vp8_sub_mv_ref_tree, p,
                   vp8_sub_mv_ref_encoding_array - LEFT4X4 + m);
 }
 
-#if CONFIG_NEWMVENTROPY
-static void write_nmv (vp8_writer *w, const MV *mv, const int_mv *ref,
-                       const nmv_context *nmvc, int usehp) {
+static void write_nmv(vp8_writer *bc, const MV *mv, const int_mv *ref,
+                      const nmv_context *nmvc, int usehp) {
   MV e;
   e.row = mv->row - ref->as_mv.row;
   e.col = mv->col - ref->as_mv.col;
 
-  vp8_encode_nmv(w, &e, &ref->as_mv, nmvc);
-  vp8_encode_nmv_fp(w, &e, &ref->as_mv, nmvc, usehp);
+  vp8_encode_nmv(bc, &e, &ref->as_mv, nmvc);
+  vp8_encode_nmv_fp(bc, &e, &ref->as_mv, nmvc, usehp);
 }
 
-#else
-
-static void write_mv
-(
-  vp8_writer *w, const MV *mv, const int_mv *ref, const MV_CONTEXT *mvc
-) {
-  MV e;
-  e.row = mv->row - ref->as_mv.row;
-  e.col = mv->col - ref->as_mv.col;
-
-  vp8_encode_motion_vector(w, &e, mvc);
-}
-
-static void write_mv_hp
-(
-  vp8_writer *w, const MV *mv, const int_mv *ref, const MV_CONTEXT_HP *mvc
-) {
-  MV e;
-  e.row = mv->row - ref->as_mv.row;
-  e.col = mv->col - ref->as_mv.col;
-
-  vp8_encode_motion_vector_hp(w, &e, mvc);
-}
-#endif  /* CONFIG_NEWMVENTROPY */
-
 // This function writes the current macro block's segnment id to the bitstream
 // It should only be called if a segment map update is indicated.
-static void write_mb_segid(vp8_writer *w,
+static void write_mb_segid(vp8_writer *bc,
                            const MB_MODE_INFO *mi, const MACROBLOCKD *xd) {
   // Encode the MB segment id.
   if (xd->segmentation_enabled && xd->update_mb_segmentation_map) {
     switch (mi->segment_id) {
       case 0:
-        vp8_write(w, 0, xd->mb_segment_tree_probs[0]);
-        vp8_write(w, 0, xd->mb_segment_tree_probs[1]);
+        vp8_write(bc, 0, xd->mb_segment_tree_probs[0]);
+        vp8_write(bc, 0, xd->mb_segment_tree_probs[1]);
         break;
       case 1:
-        vp8_write(w, 0, xd->mb_segment_tree_probs[0]);
-        vp8_write(w, 1, xd->mb_segment_tree_probs[1]);
+        vp8_write(bc, 0, xd->mb_segment_tree_probs[0]);
+        vp8_write(bc, 1, xd->mb_segment_tree_probs[1]);
         break;
       case 2:
-        vp8_write(w, 1, xd->mb_segment_tree_probs[0]);
-        vp8_write(w, 0, xd->mb_segment_tree_probs[2]);
+        vp8_write(bc, 1, xd->mb_segment_tree_probs[0]);
+        vp8_write(bc, 0, xd->mb_segment_tree_probs[2]);
         break;
       case 3:
-        vp8_write(w, 1, xd->mb_segment_tree_probs[0]);
-        vp8_write(w, 1, xd->mb_segment_tree_probs[2]);
+        vp8_write(bc, 1, xd->mb_segment_tree_probs[0]);
+        vp8_write(bc, 1, xd->mb_segment_tree_probs[2]);
         break;
 
         // TRAP.. This should not happen
       default:
-        vp8_write(w, 0, xd->mb_segment_tree_probs[0]);
-        vp8_write(w, 0, xd->mb_segment_tree_probs[1]);
+        vp8_write(bc, 0, xd->mb_segment_tree_probs[0]);
+        vp8_write(bc, 0, xd->mb_segment_tree_probs[1]);
         break;
     }
   }
 }
 
 // This function encodes the reference frame
-static void encode_ref_frame(vp8_writer *const w,
+static void encode_ref_frame(vp8_writer *const bc,
                              VP8_COMMON *const cm,
                              MACROBLOCKD *xd,
                              int segment_id,
@@ -765,7 +690,7 @@
       (xd->mode_info_context->mbmi.ref_frame == pred_rf);
 
     set_pred_flag(xd, PRED_REF, prediction_flag);
-    vp8_write(w, prediction_flag, pred_prob);
+    vp8_write(bc, prediction_flag, pred_prob);
 
     // If not predicted correctly then code value explicitly
     if (!prediction_flag) {
@@ -787,18 +712,18 @@
       }
 
       if (mod_refprobs[0]) {
-        vp8_write(w, (rf != INTRA_FRAME), mod_refprobs[0]);
+        vp8_write(bc, (rf != INTRA_FRAME), mod_refprobs[0]);
       }
 
       // Inter coded
       if (rf != INTRA_FRAME) {
         if (mod_refprobs[1]) {
-          vp8_write(w, (rf != LAST_FRAME), mod_refprobs[1]);
+          vp8_write(bc, (rf != LAST_FRAME), mod_refprobs[1]);
         }
 
         if (rf != LAST_FRAME) {
           if (mod_refprobs[2]) {
-            vp8_write(w, (rf != GOLDEN_FRAME), mod_refprobs[2]);
+            vp8_write(bc, (rf != GOLDEN_FRAME), mod_refprobs[2]);
           }
         }
       }
@@ -811,50 +736,32 @@
 
 // Update the probabilities used to encode reference frame data
 static void update_ref_probs(VP8_COMP *const cpi) {
-  VP8_COMMON *const cm = & cpi->common;
+  VP8_COMMON *const cm = &cpi->common;
 
   const int *const rfct = cpi->count_mb_ref_frame_usage;
   const int rf_intra = rfct[INTRA_FRAME];
   const int rf_inter = rfct[LAST_FRAME] +
                        rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
 
-  cm->prob_intra_coded = (rf_intra + rf_inter)
-                         ? rf_intra * 255 / (rf_intra + rf_inter) : 1;
-
-  if (!cm->prob_intra_coded)
-    cm->prob_intra_coded = 1;
-
-  cm->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
-
-  if (!cm->prob_last_coded)
-    cm->prob_last_coded = 1;
-
-  cm->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
-                      ? (rfct[GOLDEN_FRAME] * 255) /
-                      (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
-
-  if (!cm->prob_gf_coded)
-    cm->prob_gf_coded = 1;
+  cm->prob_intra_coded = get_binary_prob(rf_intra, rf_inter);
+  cm->prob_last_coded = get_prob(rfct[LAST_FRAME], rf_inter);
+  cm->prob_gf_coded = get_binary_prob(rfct[GOLDEN_FRAME], rfct[ALTREF_FRAME]);
 
   // Compute a modified set of probabilities to use when prediction of the
   // reference frame fails
   compute_mod_refprobs(cm);
 }
 
-static void pack_inter_mode_mvs(VP8_COMP *const cpi) {
+static void pack_inter_mode_mvs(VP8_COMP *const cpi, vp8_writer *const bc) {
   int i;
-  VP8_COMMON *const pc = & cpi->common;
-  vp8_writer *const w = & cpi->bc;
-#if CONFIG_NEWMVENTROPY
+  VP8_COMMON *const pc = &cpi->common;
   const nmv_context *nmvc = &pc->fc.nmvc;
-#else
-  const MV_CONTEXT *mvc = pc->fc.mvc;
-  const MV_CONTEXT_HP *mvc_hp = pc->fc.mvc_hp;
-#endif
   MACROBLOCK *x = &cpi->mb;
   MACROBLOCKD *xd = &cpi->mb.e_mbd;
   MODE_INFO *m;
   MODE_INFO *prev_m;
+  TOKENEXTRA *tok = cpi->tok;
+  TOKENEXTRA *tok_end = tok + cpi->tok_count;
 
   const int mis = pc->mode_info_stride;
   int mb_row, mb_col;
@@ -871,73 +778,6 @@
 
   cpi->mb.partition_info = cpi->mb.pi;
 
-  // Update the probabilities used to encode reference frame data
-  update_ref_probs(cpi);
-
-#ifdef ENTROPY_STATS
-  active_section = 1;
-#endif
-
-  if (pc->mb_no_coeff_skip) {
-    int k;
-
-    update_skip_probs(cpi);
-    for (k = 0; k < MBSKIP_CONTEXTS; ++k)
-      vp8_write_literal(w, pc->mbskip_pred_probs[k], 8);
-  }
-
-#if CONFIG_PRED_FILTER
-  // Write the prediction filter mode used for this frame
-  vp8_write_literal(w, pc->pred_filter_mode, 2);
-
-  // Write prediction filter on/off probability if signaling at MB level
-  if (pc->pred_filter_mode == 2)
-    vp8_write_literal(w, pc->prob_pred_filter_off, 8);
-
-  // printf("pred_filter_mode:%d  prob_pred_filter_off:%d\n",
-  //       pc->pred_filter_mode, pc->prob_pred_filter_off);
-#endif
-#if CONFIG_SWITCHABLE_INTERP
-  if (pc->mcomp_filter_type == SWITCHABLE)
-    update_switchable_interp_probs(cpi);
-#endif
-
-  vp8_write_literal(w, pc->prob_intra_coded, 8);
-  vp8_write_literal(w, pc->prob_last_coded, 8);
-  vp8_write_literal(w, pc->prob_gf_coded, 8);
-
-  if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) {
-    vp8_write(w, 1, 128);
-    vp8_write(w, 1, 128);
-    for (i = 0; i < COMP_PRED_CONTEXTS; i++) {
-      if (cpi->single_pred_count[i] + cpi->comp_pred_count[i]) {
-        pc->prob_comppred[i] = cpi->single_pred_count[i] * 255 /
-                               (cpi->single_pred_count[i] + cpi->comp_pred_count[i]);
-        if (pc->prob_comppred[i] < 1)
-          pc->prob_comppred[i] = 1;
-      } else {
-        pc->prob_comppred[i] = 128;
-      }
-      vp8_write_literal(w, pc->prob_comppred[i], 8);
-    }
-  } else if (cpi->common.comp_pred_mode == SINGLE_PREDICTION_ONLY) {
-    vp8_write(w, 0, 128);
-  } else { /* compound prediction only */
-    vp8_write(w, 1, 128);
-    vp8_write(w, 0, 128);
-  }
-
-  update_mbintra_mode_probs(cpi);
-
-#if CONFIG_NEWMVENTROPY
-  vp8_write_nmvprobs(cpi, xd->allow_high_precision_mv);
-#else
-  if (xd->allow_high_precision_mv)
-    vp8_write_mvprobs_hp(cpi);
-  else
-    vp8_write_mvprobs(cpi);
-#endif
-
   mb_row = 0;
   for (row = 0; row < pc->mb_rows; row += 2) {
     m = pc->mi + row * mis;
@@ -950,7 +790,7 @@
       // Process the 4 MBs in the order:
       // top-left, top-right, bottom-left, bottom-right
 #if CONFIG_SUPERBLOCKS
-      vp8_write(w, m->mbmi.encoded_as_sb, pc->sb_coded);
+      vp8_write(bc, m->mbmi.encoded_as_sb, pc->sb_coded);
 #endif
       for (i = 0; i < 4; i++) {
         MB_MODE_INFO *mi;
@@ -972,7 +812,7 @@
           continue;
         }
 
-        mi = & m->mbmi;
+        mi = &m->mbmi;
         rf = mi->ref_frame;
         mode = mi->mode;
         segment_id = mi->segment_id;
@@ -1000,14 +840,14 @@
             pred_prob = get_pred_prob(pc, xd, PRED_SEG_ID);
 
             // Code the segment id prediction flag for this mb
-            vp8_write(w, prediction_flag, pred_prob);
+            vp8_write(bc, prediction_flag, pred_prob);
 
             // If the mb segment id wasn't predicted code explicitly
             if (!prediction_flag)
-              write_mb_segid(w, mi, &cpi->mb.e_mbd);
+              write_mb_segid(bc, mi, &cpi->mb.e_mbd);
           } else {
             // Normal unpredicted coding
-            write_mb_segid(w, mi, &cpi->mb.e_mbd);
+            write_mb_segid(bc, mi, &cpi->mb.e_mbd);
           }
         }
 
@@ -1022,12 +862,12 @@
             skip_coeff &= m[mis + 1].mbmi.mb_skip_coeff;
           }
 #endif
-          vp8_encode_bool(w, skip_coeff,
+          vp8_encode_bool(bc, skip_coeff,
                           get_pred_prob(pc, xd, PRED_MBSKIP));
         }
 
         // Encode the reference frame.
-        encode_ref_frame(w, pc, xd, segment_id, rf);
+        encode_ref_frame(bc, pc, xd, segment_id, rf);
 
         if (rf == INTRA_FRAME) {
 #ifdef ENTROPY_STATS
@@ -1037,7 +877,7 @@
           // TODO(rbultje) write using SB tree structure
 
           if (!segfeature_active(xd, segment_id, SEG_LVL_MODE)) {
-            write_ymode(w, mode, pc->fc.ymode_prob);
+            write_ymode(bc, mode, pc->fc.ymode_prob);
           }
 
           if (mode == B_PRED) {
@@ -1046,32 +886,40 @@
             int uses_second =
               m->bmi[0].as_mode.second !=
               (B_PREDICTION_MODE)(B_DC_PRED - 1);
-            vp8_write(w, uses_second, 128);
+            vp8_write(bc, uses_second, 128);
 #endif
             do {
 #if CONFIG_COMP_INTRA_PRED
               B_PREDICTION_MODE mode2 = m->bmi[j].as_mode.second;
 #endif
-              write_bmode(w, m->bmi[j].as_mode.first,
+              write_bmode(bc, m->bmi[j].as_mode.first,
                           pc->fc.bmode_prob);
+              /*
+              if (!cpi->dummy_packing) {
+                int p;
+                for (p = 0; p < VP8_BINTRAMODES - 1; ++p)
+                  printf(" %d", pc->fc.bmode_prob[p]);
+                printf("\nbmode[%d][%d]: %d\n", pc->current_video_frame, j, m->bmi[j].as_mode.first);
+              }
+              */
 #if CONFIG_COMP_INTRA_PRED
               if (uses_second) {
-                write_bmode(w, mode2, pc->fc.bmode_prob);
+                write_bmode(bc, mode2, pc->fc.bmode_prob);
               }
 #endif
             } while (++j < 16);
           }
           if (mode == I8X8_PRED) {
-            write_i8x8_mode(w, m->bmi[0].as_mode.first,
+            write_i8x8_mode(bc, m->bmi[0].as_mode.first,
                             pc->fc.i8x8_mode_prob);
-            write_i8x8_mode(w, m->bmi[2].as_mode.first,
+            write_i8x8_mode(bc, m->bmi[2].as_mode.first,
                             pc->fc.i8x8_mode_prob);
-            write_i8x8_mode(w, m->bmi[8].as_mode.first,
+            write_i8x8_mode(bc, m->bmi[8].as_mode.first,
                             pc->fc.i8x8_mode_prob);
-            write_i8x8_mode(w, m->bmi[10].as_mode.first,
+            write_i8x8_mode(bc, m->bmi[10].as_mode.first,
                             pc->fc.i8x8_mode_prob);
           } else {
-            write_uv_mode(w, mi->uv_mode,
+            write_uv_mode(bc, mi->uv_mode,
                           pc->fc.uv_mode_prob[mode]);
           }
         } else {
@@ -1103,11 +951,11 @@
           if (!segfeature_active(xd, segment_id, SEG_LVL_MODE)) {
 #if CONFIG_SUPERBLOCKS
             if (mi->encoded_as_sb) {
-              write_sb_mv_ref(w, mode, mv_ref_p);
+              write_sb_mv_ref(bc, mode, mv_ref_p);
             } else
 #endif
             {
-              write_mv_ref(w, mode, mv_ref_p);
+              write_mv_ref(bc, mode, mv_ref_p);
             }
             vp8_accum_mv_refs(&cpi->common, mode, ct);
           }
@@ -1116,28 +964,26 @@
           // Is the prediction filter enabled
           if (mode >= NEARESTMV && mode < SPLITMV) {
             if (cpi->common.pred_filter_mode == 2)
-              vp8_write(w, mi->pred_filter_enabled,
+              vp8_write(bc, mi->pred_filter_enabled,
                         pc->prob_pred_filter_off);
             else
               assert(mi->pred_filter_enabled ==
                      cpi->common.pred_filter_mode);
           }
 #endif
-#if CONFIG_SWITCHABLE_INTERP
           if (mode >= NEARESTMV && mode <= SPLITMV)
           {
             if (cpi->common.mcomp_filter_type == SWITCHABLE) {
-              vp8_write_token(w, vp8_switchable_interp_tree,
-                              get_pred_probs(&cpi->common, xd, PRED_SWITCHABLE_INTERP),
+              vp8_write_token(bc, vp8_switchable_interp_tree,
+                              get_pred_probs(&cpi->common, xd,
+                                             PRED_SWITCHABLE_INTERP),
                               vp8_switchable_interp_encodings +
                               vp8_switchable_interp_map[mi->interp_filter]);
-              //if (!cpi->dummy_packing) printf("Reading: %d\n", mi->interp_filter);
             } else {
               assert (mi->interp_filter ==
                       cpi->common.mcomp_filter_type);
             }
           }
-#endif
           if (mi->second_ref_frame &&
               (mode == NEWMV || mode == SPLITMV)) {
             int_mv n1, n2;
@@ -1155,7 +1001,7 @@
           // does the feature use compound prediction or not
           // (if not specified at the frame/segment level)
           if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) {
-            vp8_write(w, mi->second_ref_frame != INTRA_FRAME,
+            vp8_write(bc, mi->second_ref_frame != INTRA_FRAME,
                       get_pred_prob(pc, xd, PRED_COMP));
           }
 
@@ -1180,17 +1026,9 @@
 
                 }
 #endif
-#if CONFIG_NEWMVENTROPY
-                write_nmv(w, &mi->mv[0].as_mv, &best_mv,
+                write_nmv(bc, &mi->mv[0].as_mv, &best_mv,
                           (const nmv_context*) nmvc,
                           xd->allow_high_precision_mv);
-#else
-                if (xd->allow_high_precision_mv) {
-                  write_mv_hp(w, &mi->mv[0].as_mv, &best_mv, mvc_hp);
-                } else {
-                  write_mv(w, &mi->mv[0].as_mv, &best_mv, mvc);
-                }
-#endif
 
                 if (mi->second_ref_frame) {
 #if 0 //CONFIG_NEW_MVREF
@@ -1207,17 +1045,9 @@
                                      &best_second_mv);
                   cpi->best_ref_index_counts[best_index]++;
 #endif
-#if CONFIG_NEWMVENTROPY
-                  write_nmv(w, &mi->mv[1].as_mv, &best_second_mv,
+                  write_nmv(bc, &mi->mv[1].as_mv, &best_second_mv,
                             (const nmv_context*) nmvc,
                             xd->allow_high_precision_mv);
-#else
-                  if (xd->allow_high_precision_mv) {
-                    write_mv_hp(w, &mi->mv[1].as_mv, &best_second_mv, mvc_hp);
-                  } else {
-                    write_mv(w, &mi->mv[1].as_mv, &best_second_mv, mvc);
-                  }
-#endif
                 }
                 break;
               case SPLITMV: {
@@ -1227,7 +1057,7 @@
                 ++count_mb_seg [mi->partitioning];
 #endif
 
-                write_split(w, mi->partitioning, cpi->common.fc.mbsplit_prob);
+                write_split(bc, mi->partitioning, cpi->common.fc.mbsplit_prob);
                 cpi->mbsplit_count[mi->partitioning]++;
 
                 do {
@@ -1252,43 +1082,23 @@
                   abovemv.as_int = above_block_mv(m, k, mis);
                   mv_contz = vp8_mv_cont(&leftmv, &abovemv);
 
-                  write_sub_mv_ref(w, blockmode,
+                  write_sub_mv_ref(bc, blockmode,
                                    cpi->common.fc.sub_mv_ref_prob [mv_contz]);
                   cpi->sub_mv_ref_count[mv_contz][blockmode - LEFT4X4]++;
                   if (blockmode == NEW4X4) {
 #ifdef ENTROPY_STATS
                     active_section = 11;
 #endif
-#if CONFIG_NEWMVENTROPY
-                    write_nmv(w, &blockmv.as_mv, &best_mv,
+                    write_nmv(bc, &blockmv.as_mv, &best_mv,
                               (const nmv_context*) nmvc,
                               xd->allow_high_precision_mv);
-#else
-                    if (xd->allow_high_precision_mv) {
-                      write_mv_hp(w, &blockmv.as_mv, &best_mv,
-                                  (const MV_CONTEXT_HP *) mvc_hp);
-                    } else {
-                      write_mv(w, &blockmv.as_mv, &best_mv,
-                               (const MV_CONTEXT *) mvc);
-                    }
-#endif
 
                     if (mi->second_ref_frame) {
-#if CONFIG_NEWMVENTROPY
-                      write_nmv(w,
+                      write_nmv(bc,
                                 &cpi->mb.partition_info->bmi[j].second_mv.as_mv,
                                 &best_second_mv,
                                 (const nmv_context*) nmvc,
                                 xd->allow_high_precision_mv);
-#else
-                      if (xd->allow_high_precision_mv) {
-                        write_mv_hp(w, &cpi->mb.partition_info->bmi[j].second_mv.as_mv,
-                                    &best_second_mv, (const MV_CONTEXT_HP *) mvc_hp);
-                      } else {
-                        write_mv(w, &cpi->mb.partition_info->bmi[j].second_mv.as_mv,
-                                 &best_second_mv, (const MV_CONTEXT *) mvc);
-                      }
-#endif
                     }
                   }
                 } while (++j < cpi->mb.partition_info->count);
@@ -1300,20 +1110,25 @@
           }
         }
 
-#if CONFIG_TX_SELECT
         if (((rf == INTRA_FRAME && mode <= I8X8_PRED) ||
-             (rf != INTRA_FRAME && mode != SPLITMV)) &&
+             (rf != INTRA_FRAME && !(mode == SPLITMV &&
+                                     mi->partitioning == PARTITIONING_4X4))) &&
             pc->txfm_mode == TX_MODE_SELECT &&
             !((pc->mb_no_coeff_skip && mi->mb_skip_coeff) ||
               (segfeature_active(xd, segment_id, SEG_LVL_EOB) &&
                get_segdata(xd, segment_id, SEG_LVL_EOB) == 0))) {
           TX_SIZE sz = mi->txfm_size;
           // FIXME(rbultje) code ternary symbol once all experiments are merged
-          vp8_write(w, sz != TX_4X4, pc->prob_tx[0]);
-          if (sz != TX_4X4 && mode != I8X8_PRED)
-            vp8_write(w, sz != TX_8X8, pc->prob_tx[1]);
+          vp8_write(bc, sz != TX_4X4, pc->prob_tx[0]);
+          if (sz != TX_4X4 && mode != I8X8_PRED && mode != SPLITMV)
+            vp8_write(bc, sz != TX_8X8, pc->prob_tx[1]);
         }
+
+#ifdef ENTROPY_STATS
+        active_section = 1;
 #endif
+        assert(tok < tok_end);
+        pack_mb_tokens(bc, &tok, tok_end);
 
 #if CONFIG_SUPERBLOCKS
         if (m->mbmi.encoded_as_sb) {
@@ -1348,9 +1163,108 @@
 }
 
 
-static void write_kfmodes(VP8_COMP *cpi) {
-  vp8_writer *const bc = & cpi->bc;
-  VP8_COMMON *const c = & cpi->common;
+static void write_mb_modes_kf(const VP8_COMMON  *c,
+                              const MACROBLOCKD *xd,
+                              const MODE_INFO   *m,
+                              int                mode_info_stride,
+                              vp8_writer *const  bc) {
+  const int mis = mode_info_stride;
+  int ym;
+  int segment_id;
+
+  ym = m->mbmi.mode;
+  segment_id = m->mbmi.segment_id;
+
+  if (xd->update_mb_segmentation_map) {
+    write_mb_segid(bc, &m->mbmi, xd);
+  }
+
+  if (c->mb_no_coeff_skip &&
+      (!segfeature_active(xd, segment_id, SEG_LVL_EOB) ||
+       (get_segdata(xd, segment_id, SEG_LVL_EOB) != 0))) {
+        int skip_coeff = m->mbmi.mb_skip_coeff;
+#if CONFIG_SUPERBLOCKS
+        if (m->mbmi.encoded_as_sb) {
+          skip_coeff &= m[1].mbmi.mb_skip_coeff;
+          skip_coeff &= m[mis].mbmi.mb_skip_coeff;
+          skip_coeff &= m[mis + 1].mbmi.mb_skip_coeff;
+        }
+#endif
+        vp8_encode_bool(bc, skip_coeff,
+                    get_pred_prob(c, xd, PRED_MBSKIP));
+  }
+
+#if CONFIG_SUPERBLOCKS
+  if (m->mbmi.encoded_as_sb) {
+    sb_kfwrite_ymode(bc, ym,
+                     c->sb_kf_ymode_prob[c->kf_ymode_probs_index]);
+  } else
+#endif
+  {
+    kfwrite_ymode(bc, ym,
+                  c->kf_ymode_prob[c->kf_ymode_probs_index]);
+  }
+
+  if (ym == B_PRED) {
+    const int mis = c->mode_info_stride;
+    int i = 0;
+#if CONFIG_COMP_INTRA_PRED
+    int uses_second =
+      m->bmi[0].as_mode.second !=
+      (B_PREDICTION_MODE)(B_DC_PRED - 1);
+    vp8_write(bc, uses_second, 128);
+#endif
+    do {
+      const B_PREDICTION_MODE A = above_block_mode(m, i, mis);
+      const B_PREDICTION_MODE L = left_block_mode(m, i);
+      const int bm = m->bmi[i].as_mode.first;
+#if CONFIG_COMP_INTRA_PRED
+      const int bm2 = m->bmi[i].as_mode.second;
+#endif
+
+#ifdef ENTROPY_STATS
+      ++intra_mode_stats [A] [L] [bm];
+#endif
+
+      write_bmode(bc, bm, c->kf_bmode_prob [A] [L]);
+      // printf("    mode: %d\n", bm);
+#if CONFIG_COMP_INTRA_PRED
+      if (uses_second) {
+        write_bmode(bc, bm2, c->kf_bmode_prob [A] [L]);
+      }
+#endif
+    } while (++i < 16);
+  }
+  if (ym == I8X8_PRED) {
+    write_i8x8_mode(bc, m->bmi[0].as_mode.first,
+                    c->fc.i8x8_mode_prob);
+    // printf("    mode: %d\n", m->bmi[0].as_mode.first); fflush(stdout);
+    write_i8x8_mode(bc, m->bmi[2].as_mode.first,
+                    c->fc.i8x8_mode_prob);
+    // printf("    mode: %d\n", m->bmi[2].as_mode.first); fflush(stdout);
+    write_i8x8_mode(bc, m->bmi[8].as_mode.first,
+                    c->fc.i8x8_mode_prob);
+    // printf("    mode: %d\n", m->bmi[8].as_mode.first); fflush(stdout);
+    write_i8x8_mode(bc, m->bmi[10].as_mode.first,
+                    c->fc.i8x8_mode_prob);
+    // printf("    mode: %d\n", m->bmi[10].as_mode.first); fflush(stdout);
+  } else
+    write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob[ym]);
+
+  if (ym <= I8X8_PRED && c->txfm_mode == TX_MODE_SELECT &&
+      !((c->mb_no_coeff_skip && m->mbmi.mb_skip_coeff) ||
+        (segfeature_active(xd, segment_id, SEG_LVL_EOB) &&
+         get_segdata(xd, segment_id, SEG_LVL_EOB) == 0))) {
+    TX_SIZE sz = m->mbmi.txfm_size;
+    // FIXME(rbultje) code ternary symbol once all experiments are merged
+    vp8_write(bc, sz != TX_4X4, c->prob_tx[0]);
+    if (sz != TX_4X4 && ym <= TM_PRED)
+      vp8_write(bc, sz != TX_8X8, c->prob_tx[1]);
+  }
+}
+
+static void write_kfmodes(VP8_COMP* const cpi, vp8_writer* const bc) {
+  VP8_COMMON *const c = &cpi->common;
   const int mis = c->mode_info_stride;
   MACROBLOCKD *xd = &cpi->mb.e_mbd;
   MODE_INFO *m;
@@ -1359,16 +1273,8 @@
   int mb_row, mb_col;
   int row_delta[4] = { 0, +1,  0, -1};
   int col_delta[4] = { +1, -1, +1, +1};
-
-  if (c->mb_no_coeff_skip) {
-    update_skip_probs(cpi);
-    for (i = 0; i < MBSKIP_CONTEXTS; ++i)
-      vp8_write_literal(bc, c->mbskip_pred_probs[i], 8);
-  }
-
-  if (!c->kf_ymode_probs_update) {
-    vp8_write_literal(bc, c->kf_ymode_probs_index, 3);
-  }
+  TOKENEXTRA *tok = cpi->tok;
+  TOKENEXTRA *tok_end = tok + cpi->tok_count;
 
   mb_row = 0;
   for (row = 0; row < c->mb_rows; row += 2) {
@@ -1382,8 +1288,6 @@
       // Process the 4 MBs in the order:
       // top-left, top-right, bottom-left, bottom-right
       for (i = 0; i < 4; i++) {
-        int ym;
-        int segment_id;
         int dy = row_delta[i];
         int dx = col_delta[i];
         int offset_extended = dy * mis + dx;
@@ -1399,97 +1303,12 @@
         // Make sure the MacroBlockD mode info pointer is set correctly
         xd->mode_info_context = m;
 
-        ym = m->mbmi.mode;
-        segment_id = m->mbmi.segment_id;
-
-        if (cpi->mb.e_mbd.update_mb_segmentation_map) {
-          write_mb_segid(bc, &m->mbmi, &cpi->mb.e_mbd);
-        }
-
-        if (c->mb_no_coeff_skip &&
-            (!segfeature_active(xd, segment_id, SEG_LVL_EOB) ||
-             (get_segdata(xd, segment_id, SEG_LVL_EOB) != 0))) {
-              int skip_coeff = m->mbmi.mb_skip_coeff;
-#if CONFIG_SUPERBLOCKS
-              if (m->mbmi.encoded_as_sb) {
-                skip_coeff &= m[1].mbmi.mb_skip_coeff;
-                skip_coeff &= m[mis].mbmi.mb_skip_coeff;
-                skip_coeff &= m[mis + 1].mbmi.mb_skip_coeff;
-              }
-#endif
-              vp8_encode_bool(bc, skip_coeff,
-                          get_pred_prob(c, xd, PRED_MBSKIP));
-        }
-
-#if CONFIG_SUPERBLOCKS
-        if (m->mbmi.encoded_as_sb) {
-          sb_kfwrite_ymode(bc, ym,
-                           c->sb_kf_ymode_prob[c->kf_ymode_probs_index]);
-        } else
-#endif
-        {
-          kfwrite_ymode(bc, ym,
-                        c->kf_ymode_prob[c->kf_ymode_probs_index]);
-        }
-
-        if (ym == B_PRED) {
-          const int mis = c->mode_info_stride;
-          int i = 0;
-#if CONFIG_COMP_INTRA_PRED
-          int uses_second =
-            m->bmi[0].as_mode.second !=
-            (B_PREDICTION_MODE)(B_DC_PRED - 1);
-          vp8_write(bc, uses_second, 128);
-#endif
-          do {
-            const B_PREDICTION_MODE A = above_block_mode(m, i, mis);
-            const B_PREDICTION_MODE L = left_block_mode(m, i);
-            const int bm = m->bmi[i].as_mode.first;
-#if CONFIG_COMP_INTRA_PRED
-            const int bm2 = m->bmi[i].as_mode.second;
-#endif
-
+        write_mb_modes_kf(c, xd, m, mis, bc);
 #ifdef ENTROPY_STATS
-            ++intra_mode_stats [A] [L] [bm];
+        active_section = 8;
 #endif
-
-            write_bmode(bc, bm, c->kf_bmode_prob [A] [L]);
-            // printf("    mode: %d\n", bm);
-#if CONFIG_COMP_INTRA_PRED
-            if (uses_second) {
-              write_bmode(bc, bm2, c->kf_bmode_prob [A] [L]);
-            }
-#endif
-          } while (++i < 16);
-        }
-        if (ym == I8X8_PRED) {
-          write_i8x8_mode(bc, m->bmi[0].as_mode.first,
-                          c->fc.i8x8_mode_prob);
-          // printf("    mode: %d\n", m->bmi[0].as_mode.first); fflush(stdout);
-          write_i8x8_mode(bc, m->bmi[2].as_mode.first,
-                          c->fc.i8x8_mode_prob);
-          // printf("    mode: %d\n", m->bmi[2].as_mode.first); fflush(stdout);
-          write_i8x8_mode(bc, m->bmi[8].as_mode.first,
-                          c->fc.i8x8_mode_prob);
-          // printf("    mode: %d\n", m->bmi[8].as_mode.first); fflush(stdout);
-          write_i8x8_mode(bc, m->bmi[10].as_mode.first,
-                          c->fc.i8x8_mode_prob);
-          // printf("    mode: %d\n", m->bmi[10].as_mode.first); fflush(stdout);
-        } else
-          write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob[ym]);
-
-#if CONFIG_TX_SELECT
-        if (ym <= I8X8_PRED && c->txfm_mode == TX_MODE_SELECT &&
-            !((c->mb_no_coeff_skip && m->mbmi.mb_skip_coeff) ||
-              (segfeature_active(xd, segment_id, SEG_LVL_EOB) &&
-               get_segdata(xd, segment_id, SEG_LVL_EOB) == 0))) {
-          TX_SIZE sz = m->mbmi.txfm_size;
-          // FIXME(rbultje) code ternary symbol once all experiments are merged
-          vp8_write(bc, sz != TX_4X4, c->prob_tx[0]);
-          if (sz != TX_4X4 && ym <= TM_PRED)
-            vp8_write(bc, sz != TX_8X8, c->prob_tx[1]);
-        }
-#endif
+        assert(tok < tok_end);
+        pack_mb_tokens(bc, &tok, tok_end);
 
 #if CONFIG_SUPERBLOCKS
         if (m->mbmi.encoded_as_sb) {
@@ -1563,7 +1382,6 @@
       }
     }
   }
-#if CONFIG_HYBRIDTRANSFORM
   for (i = 0; i < BLOCK_TYPES; ++i) {
     for (j = 0; j < COEF_BANDS; ++j) {
       for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -1584,8 +1402,6 @@
       }
     }
   }
-#endif
-
 
   if (cpi->common.txfm_mode != ONLY_4X4) {
     for (i = 0; i < BLOCK_TYPES_8X8; ++i) {
@@ -1612,7 +1428,6 @@
         }
       }
     }
-#if CONFIG_HYBRIDTRANSFORM8X8
     for (i = 0; i < BLOCK_TYPES_8X8; ++i) {
       for (j = 0; j < COEF_BANDS; ++j) {
         for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -1637,7 +1452,6 @@
         }
       }
     }
-#endif
   }
 
   if (cpi->common.txfm_mode > ALLOW_8X8) {
@@ -1660,7 +1474,6 @@
       }
     }
   }
-#if CONFIG_HYBRIDTRANSFORM16X16
   for (i = 0; i < BLOCK_TYPES_16X16; ++i) {
     for (j = 0; j < COEF_BANDS; ++j) {
       for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -1679,14 +1492,13 @@
       }
     }
   }
-#endif
 }
 
 #if 0
 static void update_coef_probs2(VP8_COMP *cpi) {
   const vp8_prob grpupd = 192;
   int i, j, k, t;
-  vp8_writer *const w = & cpi->bc;
+  vp8_writer *const w = &cpi->bc;
   int update[2];
   int savings;
 
@@ -1851,9 +1663,8 @@
 }
 #endif
 
-static void update_coef_probs(VP8_COMP *cpi) {
+static void update_coef_probs(VP8_COMP* const cpi, vp8_writer* const bc) {
   int i, j, k, t;
-  vp8_writer *const w = & cpi->bc;
   int update[2] = {0, 0};
   int savings;
 
@@ -1906,10 +1717,10 @@
 
   // printf("Update %d %d, savings %d\n", update[0], update[1], savings);
   /* Is coef updated at all */
-  if (update[1] == 0 || savings < 0)
-    vp8_write_bit(w, 0);
-  else {
-    vp8_write_bit(w, 1);
+  if (update[1] == 0 || savings < 0) {
+    vp8_write_bit(bc, 0);
+  } else {
+    vp8_write_bit(bc, 1);
     for (i = 0; i < BLOCK_TYPES; ++i) {
       for (j = !i; j < COEF_BANDS; ++j) {
         int prev_coef_savings[ENTROPY_NODES] = {0};
@@ -1937,14 +1748,14 @@
             if (s > 0)
               u = 1;
 #endif
-            vp8_write(w, u, upd);
+            vp8_write(bc, u, upd);
 #ifdef ENTROPY_STATS
             if (!cpi->dummy_packing)
               ++ tree_update_hist [i][j][k][t] [u];
 #endif
             if (u) {
               /* send/use new probability */
-              write_prob_diff_update(w, newp, *Pold);
+              write_prob_diff_update(bc, newp, *Pold);
               *Pold = newp;
             }
           }
@@ -1953,7 +1764,6 @@
     }
   }
 
-#if CONFIG_HYBRIDTRANSFORM
   savings = 0;
   update[0] = update[1] = 0;
   for (i = 0; i < BLOCK_TYPES; ++i) {
@@ -1996,10 +1806,10 @@
 
   // printf("Update %d %d, savings %d\n", update[0], update[1], savings);
   /* Is coef updated at all */
-  if (update[1] == 0 || savings < 0)
-    vp8_write_bit(w, 0);
-  else {
-    vp8_write_bit(w, 1);
+  if (update[1] == 0 || savings < 0) {
+    vp8_write_bit(bc, 0);
+  } else {
+    vp8_write_bit(bc, 1);
     for (i = 0; i < BLOCK_TYPES; ++i) {
       for (j = !i; j < COEF_BANDS; ++j) {
         int prev_coef_savings[ENTROPY_NODES] = {0};
@@ -2027,14 +1837,14 @@
             if (s > 0)
               u = 1;
 #endif
-            vp8_write(w, u, upd);
+            vp8_write(bc, u, upd);
 #ifdef ENTROPY_STATS
             if (!cpi->dummy_packing)
               ++ hybrid_tree_update_hist [i][j][k][t] [u];
 #endif
             if (u) {
               /* send/use new probability */
-              write_prob_diff_update(w, newp, *Pold);
+              write_prob_diff_update(bc, newp, *Pold);
               *Pold = newp;
             }
           }
@@ -2042,7 +1852,6 @@
       }
     }
   }
-#endif
 
   /* do not do this if not even allowed */
   if (cpi->common.txfm_mode != ONLY_4X4) {
@@ -2081,10 +1890,10 @@
       }
     }
 
-    if (update[1] == 0 || savings < 0)
-      vp8_write_bit(w, 0);
-    else {
-      vp8_write_bit(w, 1);
+    if (update[1] == 0 || savings < 0) {
+      vp8_write_bit(bc, 0);
+    } else {
+      vp8_write_bit(bc, 1);
       for (i = 0; i < BLOCK_TYPES_8X8; ++i) {
         for (j = !i; j < COEF_BANDS; ++j) {
           for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -2105,14 +1914,14 @@
               s = prob_update_savings(ct, oldp, newp, upd);
               u = s > 0 ? 1 : 0;
 #endif
-              vp8_write(w, u, upd);
+              vp8_write(bc, u, upd);
 #ifdef ENTROPY_STATS
               if (!cpi->dummy_packing)
                 ++ tree_update_hist_8x8 [i][j][k][t] [u];
 #endif
               if (u) {
                 /* send/use new probability */
-                write_prob_diff_update(w, newp, oldp);
+                write_prob_diff_update(bc, newp, oldp);
                 *Pold = newp;
               }
             }
@@ -2120,7 +1929,6 @@
         }
       }
     }
-#if CONFIG_HYBRIDTRANSFORM8X8
     update[0] = update[1] = 0;
     savings = 0;
     for (i = 0; i < BLOCK_TYPES_8X8; ++i) {
@@ -2155,10 +1963,10 @@
       }
     }
 
-    if (update[1] == 0 || savings < 0)
-      vp8_write_bit(w, 0);
-    else {
-      vp8_write_bit(w, 1);
+    if (update[1] == 0 || savings < 0) {
+      vp8_write_bit(bc, 0);
+    } else {
+      vp8_write_bit(bc, 1);
       for (i = 0; i < BLOCK_TYPES_8X8; ++i) {
         for (j = !i; j < COEF_BANDS; ++j) {
           for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -2179,14 +1987,14 @@
               s = prob_update_savings(ct, oldp, newp, upd);
               u = s > 0 ? 1 : 0;
 #endif
-              vp8_write(w, u, upd);
+              vp8_write(bc, u, upd);
 #ifdef ENTROPY_STATS
               if (!cpi->dummy_packing)
                 ++ hybrid_tree_update_hist_8x8 [i][j][k][t] [u];
 #endif
               if (u) {
                 /* send/use new probability */
-                write_prob_diff_update(w, newp, oldp);
+                write_prob_diff_update(bc, newp, oldp);
                 *Pold = newp;
               }
             }
@@ -2194,7 +2002,6 @@
         }
       }
     }
-#endif
   }
 
   if (cpi->common.txfm_mode > ALLOW_8X8) {
@@ -2233,10 +2040,10 @@
     }
   }
 
-  if (update[1] == 0 || savings < 0)
-    vp8_write_bit(w, 0);
-  else {
-    vp8_write_bit(w, 1);
+  if (update[1] == 0 || savings < 0) {
+    vp8_write_bit(bc, 0);
+  } else {
+    vp8_write_bit(bc, 1);
     for (i = 0; i < BLOCK_TYPES_16X16; ++i) {
       for (j = !i; j < COEF_BANDS; ++j) {
         for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -2257,14 +2064,14 @@
             s = prob_update_savings(ct, oldp, newp, upd);
             u = s > 0 ? 1 : 0;
 #endif
-            vp8_write(w, u, upd);
+            vp8_write(bc, u, upd);
 #ifdef ENTROPY_STATS
             if (!cpi->dummy_packing)
               ++tree_update_hist_16x16[i][j][k][t][u];
 #endif
             if (u) {
               /* send/use new probability */
-              write_prob_diff_update(w, newp, oldp);
+              write_prob_diff_update(bc, newp, oldp);
               *Pold = newp;
             }
           }
@@ -2272,7 +2079,6 @@
       }
     }
   }
-#if CONFIG_HYBRIDTRANSFORM16X16
   update[0] = update[1] = 0;
   savings = 0;
   for (i = 0; i < BLOCK_TYPES_16X16; ++i) {
@@ -2307,10 +2113,10 @@
     }
   }
 
-  if (update[1] == 0 || savings < 0)
-    vp8_write_bit(w, 0);
-  else {
-    vp8_write_bit(w, 1);
+  if (update[1] == 0 || savings < 0) {
+    vp8_write_bit(bc, 0);
+  } else {
+    vp8_write_bit(bc, 1);
     for (i = 0; i < BLOCK_TYPES_16X16; ++i) {
       for (j = !i; j < COEF_BANDS; ++j) {
         for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
@@ -2331,14 +2137,14 @@
             s = prob_update_savings(ct, oldp, newp, upd);
             u = s > 0 ? 1 : 0;
 #endif
-            vp8_write(w, u, upd);
+            vp8_write(bc, u, upd);
 #ifdef ENTROPY_STATS
             if (!cpi->dummy_packing)
               ++hybrid_tree_update_hist_16x16[i][j][k][t][u];
 #endif
             if (u) {
               /* send/use new probability */
-              write_prob_diff_update(w, newp, oldp);
+              write_prob_diff_update(bc, newp, oldp);
               *Pold = newp;
             }
           }
@@ -2346,7 +2152,6 @@
       }
     }
   }
-#endif
   }
 }
 
@@ -2402,7 +2207,7 @@
   int ref[MAX_MB_SEGMENTS] = {0};
   int i, j;
   int mb_index = 0;
-  MACROBLOCKD *const xd = & cpi->mb.e_mbd;
+  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
 
   for (i = 0; i < oci->mb_rows; i++) {
     for (j = 0; j < oci->mb_cols; j++, mb_index++) {
@@ -2419,9 +2224,9 @@
 void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size) {
   int i, j;
   VP8_HEADER oh;
-  VP8_COMMON *const pc = & cpi->common;
-  vp8_writer *const bc = & cpi->bc;
-  MACROBLOCKD *const xd = & cpi->mb.e_mbd;
+  VP8_COMMON *const pc = &cpi->common;
+  vp8_writer header_bc, residual_bc;
+  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
   int extra_bytes_packed = 0;
 
   unsigned char *cx_data = dest;
@@ -2464,40 +2269,65 @@
     extra_bytes_packed = 7;
     cx_data += extra_bytes_packed;
 
-    vp8_start_encode(bc, cx_data);
+    vp8_start_encode(&header_bc, cx_data);
 
     // signal clr type
-    vp8_write_bit(bc, pc->clr_type);
-    vp8_write_bit(bc, pc->clamp_type);
+    vp8_write_bit(&header_bc, pc->clr_type);
+    vp8_write_bit(&header_bc, pc->clamp_type);
 
-  } else
-    vp8_start_encode(bc, cx_data);
+  } else {
+    vp8_start_encode(&header_bc, cx_data);
+  }
 
   // Signal whether or not Segmentation is enabled
-  vp8_write_bit(bc, (xd->segmentation_enabled) ? 1 : 0);
+  vp8_write_bit(&header_bc, (xd->segmentation_enabled) ? 1 : 0);
 
   // Indicate which features are enabled
   if (xd->segmentation_enabled) {
     // Indicate whether or not the segmentation map is being updated.
-    vp8_write_bit(bc, (xd->update_mb_segmentation_map) ? 1 : 0);
+    vp8_write_bit(&header_bc, (xd->update_mb_segmentation_map) ? 1 : 0);
 
     // If it is, then indicate the method that will be used.
     if (xd->update_mb_segmentation_map) {
       // Select the coding strategy (temporal or spatial)
       choose_segmap_coding_method(cpi);
+      // Send the tree probabilities used to decode unpredicted
+      // macro-block segments
+      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
+        int data = xd->mb_segment_tree_probs[i];
+
+        if (data != 255) {
+          vp8_write_bit(&header_bc, 1);
+          vp8_write_literal(&header_bc, data, 8);
+        } else {
+          vp8_write_bit(&header_bc, 0);
+        }
+      }
 
       // Write out the chosen coding method.
-      vp8_write_bit(bc, (pc->temporal_update) ? 1 : 0);
+      vp8_write_bit(&header_bc, (pc->temporal_update) ? 1 : 0);
+      if (pc->temporal_update) {
+        for (i = 0; i < PREDICTION_PROBS; i++) {
+          int data = pc->segment_pred_probs[i];
+
+          if (data != 255) {
+            vp8_write_bit(&header_bc, 1);
+            vp8_write_literal(&header_bc, data, 8);
+          } else {
+            vp8_write_bit(&header_bc, 0);
+          }
+        }
+      }
     }
 
-    vp8_write_bit(bc, (xd->update_mb_segmentation_data) ? 1 : 0);
+    vp8_write_bit(&header_bc, (xd->update_mb_segmentation_data) ? 1 : 0);
 
     // segment_reference_frames(cpi);
 
     if (xd->update_mb_segmentation_data) {
       signed char Data;
 
-      vp8_write_bit(bc, (xd->mb_segment_abs_delta) ? 1 : 0);
+      vp8_write_bit(&header_bc, (xd->mb_segment_abs_delta) ? 1 : 0);
 
       // For each segments id...
       for (i = 0; i < MAX_MB_SEGMENTS; i++) {
@@ -2510,67 +2340,67 @@
 
           // check if there's an update
           if (segfeature_changed(xd, i, j)) {
-            vp8_write_bit(bc, 1);
+            vp8_write_bit(&header_bc, 1);
 
             if (segfeature_active(xd, i, j)) {
               // this bit is to say we are still
               // active/  if we were inactive
               // this is unnecessary
               if (old_segfeature_active(xd, i, j)) {
-                vp8_write_bit(bc, 1);
+                vp8_write_bit(&header_bc, 1);
               }
               // Is the segment data signed..
               if (is_segfeature_signed(j)) {
                 // Encode the relevant feature data
                 if (Data < 0) {
                   Data = - Data;
-                  vp8_write_literal(bc, Data,
+                  vp8_write_literal(&header_bc, Data,
                                     seg_feature_data_bits(j));
-                  vp8_write_bit(bc, 1);
+                  vp8_write_bit(&header_bc, 1);
                 } else {
-                  vp8_write_literal(bc, Data,
+                  vp8_write_literal(&header_bc, Data,
                                     seg_feature_data_bits(j));
-                  vp8_write_bit(bc, 0);
+                  vp8_write_bit(&header_bc, 0);
                 }
               }
               // Unsigned data element so no sign bit needed
               else
-                vp8_write_literal(bc, Data,
+                vp8_write_literal(&header_bc, Data,
                                   seg_feature_data_bits(j));
             }
             // feature is inactive now
             else if (old_segfeature_active(xd, i, j)) {
-              vp8_write_bit(bc, 0);
+              vp8_write_bit(&header_bc, 0);
             }
           } else {
-            vp8_write_bit(bc, 0);
+            vp8_write_bit(&header_bc, 0);
           }
 #else
 
           // If the feature is enabled...
           if (segfeature_active(xd, i, j)) {
-            vp8_write_bit(bc, 1);
+            vp8_write_bit(&header_bc, 1);
 
             // Is the segment data signed..
             if (is_segfeature_signed(j)) {
               // Encode the relevant feature data
               if (Data < 0) {
                 Data = - Data;
-                vp8_write_literal(bc, Data,
+                vp8_write_literal(&header_bc, Data,
                                   seg_feature_data_bits(j));
-                vp8_write_bit(bc, 1);
+                vp8_write_bit(&header_bc, 1);
               } else {
-                vp8_write_literal(bc, Data,
+                vp8_write_literal(&header_bc, Data,
                                   seg_feature_data_bits(j));
-                vp8_write_bit(bc, 0);
+                vp8_write_bit(&header_bc, 0);
               }
             }
             // Unsigned data element so no sign bit needed
             else
-              vp8_write_literal(bc, Data,
+              vp8_write_literal(&header_bc, Data,
                                 seg_feature_data_bits(j));
           } else
-            vp8_write_bit(bc, 0);
+            vp8_write_bit(&header_bc, 0);
 #endif
         }
       }
@@ -2581,33 +2411,6 @@
     save_segment_info(xd);
 #endif
 
-    if (xd->update_mb_segmentation_map) {
-      // Send the tree probabilities used to decode unpredicted
-      // macro-block segments
-      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
-        int Data = xd->mb_segment_tree_probs[i];
-
-        if (Data != 255) {
-          vp8_write_bit(bc, 1);
-          vp8_write_literal(bc, Data, 8);
-        } else
-          vp8_write_bit(bc, 0);
-      }
-
-      // If predictive coding of segment map is enabled send the
-      // prediction probabilities.
-      if (pc->temporal_update) {
-        for (i = 0; i < PREDICTION_PROBS; i++) {
-          int Data = pc->segment_pred_probs[i];
-
-          if (Data != 255) {
-            vp8_write_bit(bc, 1);
-            vp8_write_literal(bc, Data, 8);
-          } else
-            vp8_write_bit(bc, 0);
-        }
-      }
-    }
   }
 
   // Encode the common prediction model status flag probability updates for
@@ -2616,27 +2419,24 @@
   if (pc->frame_type != KEY_FRAME) {
     for (i = 0; i < PREDICTION_PROBS; i++) {
       if (cpi->ref_pred_probs_update[i]) {
-        vp8_write_bit(bc, 1);
-        vp8_write_literal(bc, pc->ref_pred_probs[i], 8);
-      } else
-        vp8_write_bit(bc, 0);
+        vp8_write_bit(&header_bc, 1);
+        vp8_write_literal(&header_bc, pc->ref_pred_probs[i], 8);
+      } else {
+        vp8_write_bit(&header_bc, 0);
+      }
     }
   }
 
 #if CONFIG_SUPERBLOCKS
   {
     /* sb mode probability */
-    int sb_coded = 256 - (cpi->sb_count << 8) / (((pc->mb_rows + 1) >> 1) * ((pc->mb_cols + 1) >> 1));
-    if (sb_coded <= 0)
-      sb_coded = 1;
-    else if (sb_coded >= 256)
-      sb_coded = 255;
-    pc->sb_coded = sb_coded;
-    vp8_write_literal(bc, pc->sb_coded, 8);
+    const int sb_max = (((pc->mb_rows + 1) >> 1) * ((pc->mb_cols + 1) >> 1));
+
+    pc->sb_coded = get_prob(sb_max - cpi->sb_count, sb_max);
+    vp8_write_literal(&header_bc, pc->sb_coded, 8);
   }
 #endif
 
-#if CONFIG_TX_SELECT
   {
     if (pc->txfm_mode == TX_MODE_SELECT) {
       pc->prob_tx[0] = get_prob(cpi->txfm_count[0] + cpi->txfm_count_8x8p[0],
@@ -2647,29 +2447,26 @@
       pc->prob_tx[0] = 128;
       pc->prob_tx[1] = 128;
     }
-    vp8_write_literal(bc, pc->txfm_mode, 2);
+    vp8_write_literal(&header_bc, pc->txfm_mode, 2);
     if (pc->txfm_mode == TX_MODE_SELECT) {
-      vp8_write_literal(bc, pc->prob_tx[0], 8);
-      vp8_write_literal(bc, pc->prob_tx[1], 8);
+      vp8_write_literal(&header_bc, pc->prob_tx[0], 8);
+      vp8_write_literal(&header_bc, pc->prob_tx[1], 8);
     }
   }
-#else
-  vp8_write_bit(bc, !!pc->txfm_mode);
-#endif
 
   // Encode the loop filter level and type
-  vp8_write_bit(bc, pc->filter_type);
-  vp8_write_literal(bc, pc->filter_level, 6);
-  vp8_write_literal(bc, pc->sharpness_level, 3);
+  vp8_write_bit(&header_bc, pc->filter_type);
+  vp8_write_literal(&header_bc, pc->filter_level, 6);
+  vp8_write_literal(&header_bc, pc->sharpness_level, 3);
 
   // Write out loop filter deltas applied at the MB level based on mode or ref frame (if they are enabled).
-  vp8_write_bit(bc, (xd->mode_ref_lf_delta_enabled) ? 1 : 0);
+  vp8_write_bit(&header_bc, (xd->mode_ref_lf_delta_enabled) ? 1 : 0);
 
   if (xd->mode_ref_lf_delta_enabled) {
     // Do the deltas need to be updated
     int send_update = xd->mode_ref_lf_delta_update;
 
-    vp8_write_bit(bc, send_update);
+    vp8_write_bit(&header_bc, send_update);
     if (send_update) {
       int Data;
 
@@ -2680,18 +2477,19 @@
         // Frame level data
         if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i]) {
           xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i];
-          vp8_write_bit(bc, 1);
+          vp8_write_bit(&header_bc, 1);
 
           if (Data > 0) {
-            vp8_write_literal(bc, (Data & 0x3F), 6);
-            vp8_write_bit(bc, 0);    // sign
+            vp8_write_literal(&header_bc, (Data & 0x3F), 6);
+            vp8_write_bit(&header_bc, 0);    // sign
           } else {
             Data = -Data;
-            vp8_write_literal(bc, (Data & 0x3F), 6);
-            vp8_write_bit(bc, 1);    // sign
+            vp8_write_literal(&header_bc, (Data & 0x3F), 6);
+            vp8_write_bit(&header_bc, 1);    // sign
           }
-        } else
-          vp8_write_bit(bc, 0);
+        } else {
+          vp8_write_bit(&header_bc, 0);
+        }
       }
 
       // Send update
@@ -2700,41 +2498,42 @@
 
         if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i]) {
           xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i];
-          vp8_write_bit(bc, 1);
+          vp8_write_bit(&header_bc, 1);
 
           if (Data > 0) {
-            vp8_write_literal(bc, (Data & 0x3F), 6);
-            vp8_write_bit(bc, 0);    // sign
+            vp8_write_literal(&header_bc, (Data & 0x3F), 6);
+            vp8_write_bit(&header_bc, 0);    // sign
           } else {
             Data = -Data;
-            vp8_write_literal(bc, (Data & 0x3F), 6);
-            vp8_write_bit(bc, 1);    // sign
+            vp8_write_literal(&header_bc, (Data & 0x3F), 6);
+            vp8_write_bit(&header_bc, 1);    // sign
           }
-        } else
-          vp8_write_bit(bc, 0);
+        } else {
+          vp8_write_bit(&header_bc, 0);
+        }
       }
     }
   }
 
   // signal here is multi token partition is enabled
-  // vp8_write_literal(bc, pc->multi_token_partition, 2);
-  vp8_write_literal(bc, 0, 2);
+  // vp8_write_literal(&header_bc, pc->multi_token_partition, 2);
+  vp8_write_literal(&header_bc, 0, 2);
 
   // Frame Q baseline quantizer index
-  vp8_write_literal(bc, pc->base_qindex, QINDEX_BITS);
+  vp8_write_literal(&header_bc, pc->base_qindex, QINDEX_BITS);
 
   // Transmit Dc, Second order and Uv quantizer delta information
-  put_delta_q(bc, pc->y1dc_delta_q);
-  put_delta_q(bc, pc->y2dc_delta_q);
-  put_delta_q(bc, pc->y2ac_delta_q);
-  put_delta_q(bc, pc->uvdc_delta_q);
-  put_delta_q(bc, pc->uvac_delta_q);
+  put_delta_q(&header_bc, pc->y1dc_delta_q);
+  put_delta_q(&header_bc, pc->y2dc_delta_q);
+  put_delta_q(&header_bc, pc->y2ac_delta_q);
+  put_delta_q(&header_bc, pc->uvdc_delta_q);
+  put_delta_q(&header_bc, pc->uvac_delta_q);
 
   // When there is a key frame all reference buffers are updated using the new key frame
   if (pc->frame_type != KEY_FRAME) {
     // Should the GF or ARF be updated using the transmitted frame or buffer
-    vp8_write_bit(bc, pc->refresh_golden_frame);
-    vp8_write_bit(bc, pc->refresh_alt_ref_frame);
+    vp8_write_bit(&header_bc, pc->refresh_golden_frame);
+    vp8_write_bit(&header_bc, pc->refresh_alt_ref_frame);
 
     // For inter frames the current default behavior is that when
     // cm->refresh_golden_frame is set we copy the old GF over to
@@ -2744,18 +2543,17 @@
 
     // If not being updated from current frame should either GF or ARF be updated from another buffer
     if (!pc->refresh_golden_frame)
-      vp8_write_literal(bc, pc->copy_buffer_to_gf, 2);
+      vp8_write_literal(&header_bc, pc->copy_buffer_to_gf, 2);
 
     if (!pc->refresh_alt_ref_frame)
-      vp8_write_literal(bc, pc->copy_buffer_to_arf, 2);
+      vp8_write_literal(&header_bc, pc->copy_buffer_to_arf, 2);
 
     // Indicate reference frame sign bias for Golden and ARF frames (always 0 for last frame buffer)
-    vp8_write_bit(bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]);
-    vp8_write_bit(bc, pc->ref_frame_sign_bias[ALTREF_FRAME]);
+    vp8_write_bit(&header_bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]);
+    vp8_write_bit(&header_bc, pc->ref_frame_sign_bias[ALTREF_FRAME]);
 
     // Signal whether to allow high MV precision
-    vp8_write_bit(bc, (xd->allow_high_precision_mv) ? 1 : 0);
-#if CONFIG_SWITCHABLE_INTERP
+    vp8_write_bit(&header_bc, (xd->allow_high_precision_mv) ? 1 : 0);
     if (pc->mcomp_filter_type == SWITCHABLE) {
       /* Check to see if only one of the filters is actually used */
       int count[VP8_SWITCHABLE_FILTERS];
@@ -2778,16 +2576,15 @@
       }
     }
     // Signal the type of subpel filter to use
-    vp8_write_bit(bc, (pc->mcomp_filter_type == SWITCHABLE));
+    vp8_write_bit(&header_bc, (pc->mcomp_filter_type == SWITCHABLE));
     if (pc->mcomp_filter_type != SWITCHABLE)
-#endif  /* CONFIG_SWITCHABLE_INTERP */
-      vp8_write_literal(bc, (pc->mcomp_filter_type), 2);
+      vp8_write_literal(&header_bc, (pc->mcomp_filter_type), 2);
   }
 
-  vp8_write_bit(bc, pc->refresh_entropy_probs);
+  vp8_write_bit(&header_bc, pc->refresh_entropy_probs);
 
   if (pc->frame_type != KEY_FRAME)
-    vp8_write_bit(bc, pc->refresh_last_frame);
+    vp8_write_bit(&header_bc, pc->refresh_last_frame);
 
 #ifdef ENTROPY_STATS
   if (pc->frame_type == INTER_FRAME)
@@ -2799,62 +2596,93 @@
   vp8_clear_system_state();  // __asm emms;
 
   vp8_copy(cpi->common.fc.pre_coef_probs, cpi->common.fc.coef_probs);
-#if CONFIG_HYBRIDTRANSFORM
   vp8_copy(cpi->common.fc.pre_hybrid_coef_probs, cpi->common.fc.hybrid_coef_probs);
-#endif
   vp8_copy(cpi->common.fc.pre_coef_probs_8x8, cpi->common.fc.coef_probs_8x8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_copy(cpi->common.fc.pre_hybrid_coef_probs_8x8, cpi->common.fc.hybrid_coef_probs_8x8);
-#endif
   vp8_copy(cpi->common.fc.pre_coef_probs_16x16, cpi->common.fc.coef_probs_16x16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_copy(cpi->common.fc.pre_hybrid_coef_probs_16x16, cpi->common.fc.hybrid_coef_probs_16x16);
-#endif
   vp8_copy(cpi->common.fc.pre_ymode_prob, cpi->common.fc.ymode_prob);
   vp8_copy(cpi->common.fc.pre_uv_mode_prob, cpi->common.fc.uv_mode_prob);
   vp8_copy(cpi->common.fc.pre_bmode_prob, cpi->common.fc.bmode_prob);
   vp8_copy(cpi->common.fc.pre_sub_mv_ref_prob, cpi->common.fc.sub_mv_ref_prob);
   vp8_copy(cpi->common.fc.pre_mbsplit_prob, cpi->common.fc.mbsplit_prob);
   vp8_copy(cpi->common.fc.pre_i8x8_mode_prob, cpi->common.fc.i8x8_mode_prob);
-#if CONFIG_NEWMVENTROPY
   cpi->common.fc.pre_nmvc = cpi->common.fc.nmvc;
-#else
-  vp8_copy(cpi->common.fc.pre_mvc, cpi->common.fc.mvc);
-  vp8_copy(cpi->common.fc.pre_mvc_hp, cpi->common.fc.mvc_hp);
-#endif
   vp8_zero(cpi->sub_mv_ref_count);
   vp8_zero(cpi->mbsplit_count);
   vp8_zero(cpi->common.fc.mv_ref_ct)
   vp8_zero(cpi->common.fc.mv_ref_ct_a)
 
-  update_coef_probs(cpi);
+  update_coef_probs(cpi, &header_bc);
 
 #ifdef ENTROPY_STATS
   active_section = 2;
 #endif
 
   // Write out the mb_no_coeff_skip flag
-  vp8_write_bit(bc, pc->mb_no_coeff_skip);
+  vp8_write_bit(&header_bc, pc->mb_no_coeff_skip);
+  if (pc->mb_no_coeff_skip) {
+    int k;
+
+    update_skip_probs(cpi);
+    for (k = 0; k < MBSKIP_CONTEXTS; ++k)
+      vp8_write_literal(&header_bc, pc->mbskip_pred_probs[k], 8);
+  }
 
   if (pc->frame_type == KEY_FRAME) {
-    decide_kf_ymode_entropy(cpi);
-    write_kfmodes(cpi);
-
-#ifdef ENTROPY_STATS
-    active_section = 8;
-#endif
+    if (!pc->kf_ymode_probs_update) {
+      vp8_write_literal(&header_bc, pc->kf_ymode_probs_index, 3);
+    }
   } else {
-    pack_inter_mode_mvs(cpi);
-    vp8_update_mode_context(&cpi->common);
+    // Update the probabilities used to encode reference frame data
+    update_ref_probs(cpi);
 
 #ifdef ENTROPY_STATS
     active_section = 1;
 #endif
+
+#if CONFIG_PRED_FILTER
+    // Write the prediction filter mode used for this frame
+    vp8_write_literal(&header_bc, pc->pred_filter_mode, 2);
+
+    // Write prediction filter on/off probability if signaling at MB level
+    if (pc->pred_filter_mode == 2)
+      vp8_write_literal(&header_bc, pc->prob_pred_filter_off, 8);
+
+#endif
+    if (pc->mcomp_filter_type == SWITCHABLE)
+      update_switchable_interp_probs(cpi, &header_bc);
+
+    vp8_write_literal(&header_bc, pc->prob_intra_coded, 8);
+    vp8_write_literal(&header_bc, pc->prob_last_coded, 8);
+    vp8_write_literal(&header_bc, pc->prob_gf_coded, 8);
+
+    {
+      const int comp_pred_mode = cpi->common.comp_pred_mode;
+      const int use_compound_pred = (comp_pred_mode != SINGLE_PREDICTION_ONLY);
+      const int use_hybrid_pred = (comp_pred_mode == HYBRID_PREDICTION);
+
+      vp8_write(&header_bc, use_compound_pred, 128);
+      if (use_compound_pred) {
+        vp8_write(&header_bc, use_hybrid_pred, 128);
+        if (use_hybrid_pred) {
+          for (i = 0; i < COMP_PRED_CONTEXTS; i++) {
+            pc->prob_comppred[i] = get_binary_prob(cpi->single_pred_count[i],
+                                                   cpi->comp_pred_count[i]);
+            vp8_write_literal(&header_bc, pc->prob_comppred[i], 8);
+          }
+        }
+      }
+    }
+
+    update_mbintra_mode_probs(cpi, &header_bc);
+
+    vp8_write_nmvprobs(cpi, xd->allow_high_precision_mv, &header_bc);
   }
 
-  vp8_stop_encode(bc);
+  vp8_stop_encode(&header_bc);
 
-  oh.first_partition_length_in_bytes = cpi->bc.pos;
+  oh.first_partition_length_in_bytes = header_bc.pos;
 
   /* update frame tag */
   {
@@ -2868,15 +2696,21 @@
     dest[2] = v >> 16;
   }
 
-  *size = VP8_HEADER_SIZE + extra_bytes_packed + cpi->bc.pos;
+  *size = VP8_HEADER_SIZE + extra_bytes_packed + header_bc.pos;
+  vp8_start_encode(&residual_bc, cx_data + header_bc.pos);
 
-  vp8_start_encode(&cpi->bc2, cx_data + bc->pos);
+  if (pc->frame_type == KEY_FRAME) {
+    decide_kf_ymode_entropy(cpi);
+    write_kfmodes(cpi, &residual_bc);
+  } else {
+    pack_inter_mode_mvs(cpi, &residual_bc);
+    vp8_update_mode_context(&cpi->common);
+  }
 
-  pack_tokens(&cpi->bc2, cpi->tok, cpi->tok_count);
 
-  vp8_stop_encode(&cpi->bc2);
+  vp8_stop_encode(&residual_bc);
 
-  *size += cpi->bc2.pos;
+  *size += residual_bc.pos;
 
 }
 
@@ -2899,14 +2733,9 @@
       for (k = 0; k < PREV_COEF_CONTEXTS; k++) {
         fprintf(f, "      {");
         for (l = 0; l < ENTROPY_NODES; l++) {
-          Sum = tree_update_hist[i][j][k][l][0] + tree_update_hist[i][j][k][l][1];
-          if (Sum > 0) {
-            if (((tree_update_hist[i][j][k][l][0] * 255) / Sum) > 0)
-              fprintf(f, "%3ld, ", (tree_update_hist[i][j][k][l][0] * 255) / Sum);
-            else
-              fprintf(f, "%3ld, ", 1);
-          } else
-            fprintf(f, "%3ld, ", 128);
+          fprintf(f, "%3ld, ",
+              get_binary_prob(tree_update_hist[i][j][k][l][0],
+                              tree_update_hist[i][j][k][l][1]));
         }
         fprintf(f, "},\n");
       }
@@ -2928,14 +2757,9 @@
       for (k = 0; k < PREV_COEF_CONTEXTS; k++) {
         fprintf(f, "      {");
         for (l = 0; l < MAX_ENTROPY_TOKENS - 1; l++) {
-          Sum = tree_update_hist_8x8[i][j][k][l][0] + tree_update_hist_8x8[i][j][k][l][1];
-          if (Sum > 0) {
-            if (((tree_update_hist_8x8[i][j][k][l][0] * 255) / Sum) > 0)
-              fprintf(f, "%3ld, ", (tree_update_hist_8x8[i][j][k][l][0] * 255) / Sum);
-            else
-              fprintf(f, "%3ld, ", 1);
-          } else
-            fprintf(f, "%3ld, ", 128);
+          fprintf(f, "%3ld, ",
+              get_binary_prob(tree_update_hist_8x8[i][j][k][l][0],
+                              tree_update_hist_8x8[i][j][k][l][1]));
         }
         fprintf(f, "},\n");
       }
@@ -2956,14 +2780,9 @@
       for (k = 0; k < PREV_COEF_CONTEXTS; k++) {
         fprintf(f, "      {");
         for (l = 0; l < MAX_ENTROPY_TOKENS - 1; l++) {
-          Sum = tree_update_hist_16x16[i][j][k][l][0] + tree_update_hist_16x16[i][j][k][l][1];
-          if (Sum > 0) {
-            if (((tree_update_hist_16x16[i][j][k][l][0] * 255) / Sum) > 0)
-              fprintf(f, "%3ld, ", (tree_update_hist_16x16[i][j][k][l][0] * 255) / Sum);
-            else
-              fprintf(f, "%3ld, ", 1);
-          } else
-            fprintf(f, "%3ld, ", 128);
+          fprintf(f, "%3ld, ",
+              get_binary_prob(tree_update_hist_16x16[i][j][k][l][0],
+                              tree_update_hist_16x16[i][j][k][l][1]));
         }
         fprintf(f, "},\n");
       }
diff --git a/vp8/encoder/block.h b/vp8/encoder/block.h
index 8617004..48623be 100644
--- a/vp8/encoder/block.h
+++ b/vp8/encoder/block.h
@@ -79,9 +79,7 @@
   int hybrid_pred_diff;
   int comp_pred_diff;
   int single_pred_diff;
-#if CONFIG_TX_SELECT
   int64_t txfm_rd_diff[NB_TXFM_MODES];
-#endif
 } PICK_MODE_CONTEXT;
 
 typedef struct {
@@ -114,7 +112,6 @@
   int *mb_norm_activity_ptr;
   signed int act_zbin_adj;
 
-#if CONFIG_NEWMVENTROPY
   int nmvjointcost[MV_JOINTS];
   int nmvcosts[2][MV_VALS];
   int *nmvcost[2];
@@ -126,28 +123,17 @@
   int *nmvsadcost[2];
   int nmvsadcosts_hp[2][MV_VALS];
   int *nmvsadcost_hp[2];
-#else
-  int mvcosts[2][MVvals + 1];
-  int *mvcost[2];
-  int mvsadcosts[2][MVfpvals + 1];
-  int *mvsadcost[2];
-  int mvcosts_hp[2][MVvals_hp + 1];
-  int *mvcost_hp[2];
-  int mvsadcosts_hp[2][MVfpvals_hp + 1];
-  int *mvsadcost_hp[2];
-#endif  /* CONFIG_NEWMVENTROPY */
 
   int mbmode_cost[2][MB_MODE_COUNT];
   int intra_uv_mode_cost[2][MB_MODE_COUNT];
   int bmode_costs[VP8_BINTRAMODES][VP8_BINTRAMODES][VP8_BINTRAMODES];
   int i8x8_mode_costs[MB_MODE_COUNT];
   int inter_bmode_costs[B_MODE_COUNT];
-#if CONFIG_SWITCHABLE_INTERP
-  int switchable_interp_costs[VP8_SWITCHABLE_FILTERS+1]
+  int switchable_interp_costs[VP8_SWITCHABLE_FILTERS + 1]
                              [VP8_SWITCHABLE_FILTERS];
-#endif
 
-  // These define limits to motion vector components to prevent them from extending outside the UMV borders
+  // These define limits to motion vector components to prevent them
+  // from extending outside the UMV borders
   int mv_col_min;
   int mv_col_max;
   int mv_row_min;
@@ -164,13 +150,10 @@
 
   unsigned int token_costs[TX_SIZE_MAX][BLOCK_TYPES][COEF_BANDS]
     [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
   unsigned int hybrid_token_costs[TX_SIZE_MAX][BLOCK_TYPES][COEF_BANDS]
     [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
-#endif
 
   int optimize;
-  int q_index;
 
   // Structure to hold context for each of the 4 MBs within a SB:
   // when encoded as 4 independent MBs:
diff --git a/vp8/encoder/dct.c b/vp8/encoder/dct.c
index d81a547..0983b1c 100644
--- a/vp8/encoder/dct.c
+++ b/vp8/encoder/dct.c
@@ -14,8 +14,6 @@
 #include "vp8/common/idct.h"
 #include "vp8/common/systemdependent.h"
 
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
-
 #include "vp8/common/blockd.h"
 
 // TODO: these transforms can be converted into integer forms to reduce
@@ -71,9 +69,7 @@
   0.175227946595735,  -0.326790388032145,   0.434217976756762,  -0.483002021635509,
   0.466553967085785,  -0.387095214016348,   0.255357107325376,  -0.089131608307532
 };
-#endif
 
-#if CONFIG_HYBRIDTRANSFORM16X16 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8
 float dct_16[256] = {
   0.250000,  0.250000,  0.250000,  0.250000,  0.250000,  0.250000,  0.250000,  0.250000,
   0.250000,  0.250000,  0.250000,  0.250000,  0.250000,  0.250000,  0.250000,  0.250000,
@@ -143,7 +139,6 @@
   0.065889, -0.129396,  0.188227, -0.240255,  0.283599, -0.316693,  0.338341, -0.347761,
   0.344612, -0.329007,  0.301511, -0.263118,  0.215215, -0.159534,  0.098087, -0.033094
 };
-#endif
 
 static const int xC1S7 = 16069;
 static const int xC2S6 = 15137;
@@ -400,7 +395,6 @@
 
 }
 
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
 void vp8_fht_c(short *input, short *output, int pitch,
                TX_TYPE tx_type, int tx_dim) {
 
@@ -419,6 +413,7 @@
     // pointers to vertical and horizontal transforms
     float *ptv, *pth;
 
+    assert(tx_type != DCT_DCT);
     // load and convert residual array into floating-point
     for(j = 0; j < tx_dim; j++) {
       for(i = 0; i < tx_dim; i++) {
@@ -517,7 +512,6 @@
   }
   vp8_clear_system_state(); // Make it simd safe : __asm emms;
 }
-#endif
 
 void vp8_short_fdct4x4_c(short *input, short *output, int pitch) {
   int i;
diff --git a/vp8/encoder/dct.h b/vp8/encoder/dct.h
index 180192b..4ad1fe8 100644
--- a/vp8/encoder/dct.h
+++ b/vp8/encoder/dct.h
@@ -26,10 +26,8 @@
 #endif
 
 
-#if CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM16X16
 void vp8_fht_c(short *input, short *output, int pitch,
                TX_TYPE tx_type, int tx_dim);
-#endif
 
 #ifndef vp8_fdct_short16x16
 #define vp8_fdct_short16x16 vp8_short_fdct16x16_c
diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c
index f784cf4..0910cfd 100644
--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -120,8 +120,8 @@
    *  lambda using a non-linear combination (e.g., the smallest, or second
    *  smallest, etc.).
    */
-  act =     VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16)(x->src.y_buffer,
-                                                           x->src.y_stride, VP8_VAR_OFFS, 0, &sse);
+  act = vp8_variance16x16(x->src.y_buffer, x->src.y_stride, VP8_VAR_OFFS, 0,
+                          &sse);
   act = act << 4;
 
   /* If the region is flat, lower the activity some more. */
@@ -222,7 +222,7 @@
 #if USE_ACT_INDEX
 // Calculate and activity index for each mb
 static void calc_activity_index(VP8_COMP *cpi, MACROBLOCK *x) {
-  VP8_COMMON *const cm = & cpi->common;
+  VP8_COMMON *const cm = &cpi->common;
   int mb_row, mb_col;
 
   int64_t act;
@@ -276,9 +276,9 @@
 // Loop through all MBs. Note activity of each, average activity and
 // calculate a normalized activity for each
 static void build_activity_map(VP8_COMP *cpi) {
-  MACROBLOCK *const x = & cpi->mb;
+  MACROBLOCK *const x = &cpi->mb;
   MACROBLOCKD *xd = &x->e_mbd;
-  VP8_COMMON *const cm = & cpi->common;
+  VP8_COMMON *const cm = &cpi->common;
 
 #if ALT_ACT_MEASURE
   YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
@@ -411,7 +411,6 @@
     mbmi->mv[1].as_int = x->partition_info->bmi[15].second_mv.as_int;
   }
 
-#if CONFIG_TX_SELECT
   {
     int segment_id = mbmi->segment_id;
     if (!segfeature_active(xd, segment_id, SEG_LVL_EOB) ||
@@ -421,7 +420,6 @@
       }
     }
   }
-#endif
 
   if (cpi->common.frame_type == KEY_FRAME) {
     // Restore the coding modes to that held in the coding context
@@ -1051,9 +1049,6 @@
         cpi->inter_zz_count++;
     }
 
-    // TODO Partitioning is broken!
-    cpi->tplist[mb_row].stop = *tp;
-
 #if CONFIG_SUPERBLOCKS
     if (xd->mode_info_context->mbmi.encoded_as_sb) {
       x->src.y_buffer += 32;
@@ -1064,7 +1059,10 @@
       x->partition_info     += 2;
       xd->mode_info_context += 2;
       xd->prev_mode_info_context += 2;
-      
+
+      (*tp)->Token = EOSB_TOKEN;
+      (*tp)++;
+      if (mb_row < cm->mb_rows) cpi->tplist[mb_row].stop = *tp;
       break;
     }
 #endif
@@ -1086,6 +1084,9 @@
     assert((xd->prev_mode_info_context - cpi->common.prev_mip) ==
            (xd->mode_info_context - cpi->common.mip));
 #endif
+    (*tp)->Token = EOSB_TOKEN;
+    (*tp)++;
+    if (mb_row < cm->mb_rows) cpi->tplist[mb_row].stop = *tp;
   }
 
   // debug output
@@ -1216,9 +1217,9 @@
 }
 
 void init_encode_frame_mb_context(VP8_COMP *cpi) {
-  MACROBLOCK *const x = & cpi->mb;
-  VP8_COMMON *const cm = & cpi->common;
-  MACROBLOCKD *const xd = & x->e_mbd;
+  MACROBLOCK *const x = &cpi->mb;
+  VP8_COMMON *const cm = &cpi->common;
+  MACROBLOCKD *const xd = &x->e_mbd;
 
   // GF active flags data structure
   x->gf_active_ptr = (signed char *)cpi->gf_active_flags;
@@ -1287,9 +1288,9 @@
 
 static void encode_frame_internal(VP8_COMP *cpi) {
   int mb_row;
-  MACROBLOCK *const x = & cpi->mb;
-  VP8_COMMON *const cm = & cpi->common;
-  MACROBLOCKD *const xd = & x->e_mbd;
+  MACROBLOCK *const x = &cpi->mb;
+  VP8_COMMON *const cm = &cpi->common;
+  MACROBLOCKD *const xd = &x->e_mbd;
 
   TOKENEXTRA *tp = cpi->tok;
   int totalrate;
@@ -1339,37 +1340,18 @@
   cpi->pred_filter_on_count = 0;
   cpi->pred_filter_off_count = 0;
 #endif
-#if CONFIG_SWITCHABLE_INTERP
   vp8_zero(cpi->switchable_interp_count);
-#endif
-
-#if 0
-  // Experimental code
-  cpi->frame_distortion = 0;
-  cpi->last_mb_distortion = 0;
-#endif
 
   xd->mode_info_context = cm->mi;
   xd->prev_mode_info_context = cm->prev_mi;
 
-#if CONFIG_NEWMVENTROPY
   vp8_zero(cpi->NMVcount);
-#else
-  vp8_zero(cpi->MVcount);
-  vp8_zero(cpi->MVcount_hp);
-#endif
   vp8_zero(cpi->coef_counts);
-#if CONFIG_HYBRIDTRANSFORM
   vp8_zero(cpi->hybrid_coef_counts);
-#endif
   vp8_zero(cpi->coef_counts_8x8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_zero(cpi->hybrid_coef_counts_8x8);
-#endif
   vp8_zero(cpi->coef_counts_16x16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_zero(cpi->hybrid_coef_counts_16x16);
-#endif
 
   vp8cx_frame_init_quantizer(cpi);
 
@@ -1390,11 +1372,9 @@
   vpx_memset(cpi->rd_comp_pred_diff, 0, sizeof(cpi->rd_comp_pred_diff));
   vpx_memset(cpi->single_pred_count, 0, sizeof(cpi->single_pred_count));
   vpx_memset(cpi->comp_pred_count, 0, sizeof(cpi->comp_pred_count));
-#if CONFIG_TX_SELECT
   vpx_memset(cpi->txfm_count, 0, sizeof(cpi->txfm_count));
   vpx_memset(cpi->txfm_count_8x8p, 0, sizeof(cpi->txfm_count_8x8p));
   vpx_memset(cpi->rd_tx_select_diff, 0, sizeof(cpi->rd_tx_select_diff));
-#endif
   {
     struct vpx_usec_timer  emr_timer;
     vpx_usec_timer_start(&emr_timer);
@@ -1454,7 +1434,6 @@
   }
 }
 
-#if CONFIG_TX_SELECT
 static void reset_skip_txfm_size(VP8_COMP *cpi, TX_SIZE txfm_max) {
   VP8_COMMON *cm = &cpi->common;
   int mb_row, mb_col, mis = cm->mode_info_stride;
@@ -1478,7 +1457,6 @@
     }
   }
 }
-#endif
 
 void vp8_encode_frame(VP8_COMP *cpi) {
   if (cpi->sf.RD) {
@@ -1524,7 +1502,6 @@
       txfm_type = ONLY_4X4;
     } else
 #endif
-#if CONFIG_TX_SELECT
     /* FIXME (rbultje)
      * this is a hack (no really), basically to work around the complete
      * nonsense coefficient cost prediction for keyframes. The probabilities
@@ -1572,16 +1549,11 @@
                  cpi->rd_tx_select_threshes[frame_type][TX_MODE_SELECT] ?
     ALLOW_16X16 : TX_MODE_SELECT;
 #endif
-#else
-    txfm_type = ALLOW_16X16;
-#endif // CONFIG_TX_SELECT
     cpi->common.txfm_mode = txfm_type;
-#if CONFIG_TX_SELECT
     if (txfm_type != TX_MODE_SELECT) {
       cpi->common.prob_tx[0] = 128;
       cpi->common.prob_tx[1] = 128;
     }
-#endif
     cpi->common.comp_pred_mode = pred_type;
     encode_frame_internal(cpi);
 
@@ -1591,7 +1563,6 @@
       cpi->rd_prediction_type_threshes[frame_type][i] >>= 1;
     }
 
-#if CONFIG_TX_SELECT
     for (i = 0; i < NB_TXFM_MODES; ++i) {
       int64_t pd = cpi->rd_tx_select_diff[i];
       int diff;
@@ -1601,7 +1572,6 @@
       cpi->rd_tx_select_threshes[frame_type][i] += diff;
       cpi->rd_tx_select_threshes[frame_type][i] /= 2;
     }
-#endif
 
     if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) {
       int single_count_zero = 0;
@@ -1619,7 +1589,6 @@
       }
     }
 
-#if CONFIG_TX_SELECT
     if (cpi->common.txfm_mode == TX_MODE_SELECT) {
       const int count4x4 = cpi->txfm_count[TX_4X4] + cpi->txfm_count_8x8p[TX_4X4];
       const int count8x8 = cpi->txfm_count[TX_8X8];
@@ -1636,7 +1605,6 @@
         cpi->common.txfm_mode = ALLOW_16X16;
       }
     }
-#endif
   } else {
     encode_frame_internal(cpi);
   }
@@ -1719,7 +1687,7 @@
 }
 
 static void sum_intra_stats(VP8_COMP *cpi, MACROBLOCK *x) {
-  const MACROBLOCKD *xd = & x->e_mbd;
+  const MACROBLOCKD *xd = &x->e_mbd;
   const MB_PREDICTION_MODE m = xd->mode_info_context->mbmi.mode;
   const MB_PREDICTION_MODE uvm = xd->mode_info_context->mbmi.uv_mode;
 
@@ -1928,7 +1896,7 @@
     update_sb_skip_coeff_state(cpi, x, ta, tl, tp, t, skip);
   }
 }
-#endif
+#endif /* CONFIG_SUPERBLOCKS */
 
 void vp8cx_encode_intra_macro_block(VP8_COMP *cpi,
                                     MACROBLOCK *x,
@@ -1939,29 +1907,27 @@
     adjust_act_zbin(cpi, x);
     vp8_update_zbin_extra(cpi, x);
   }
-
   if (mbmi->mode == I8X8_PRED) {
     vp8_encode_intra8x8mby(IF_RTCD(&cpi->rtcd), x);
     vp8_encode_intra8x8mbuv(IF_RTCD(&cpi->rtcd), x);
-  } else if (mbmi->mode == B_PRED)
+  } else if (mbmi->mode == B_PRED) {
+    vp8_intra_prediction_down_copy(&x->e_mbd);
     vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
-  else
+  } else {
     vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
+  }
 
   if (mbmi->mode != I8X8_PRED) {
     vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
   }
 
   if (output_enabled) {
-#if CONFIG_TX_SELECT
     int segment_id = mbmi->segment_id;
-#endif
 
     // Tokenize
     sum_intra_stats(cpi, x);
     vp8_tokenize_mb(cpi, &x->e_mbd, t, 0);
 
-#if CONFIG_TX_SELECT
     if (cpi->common.txfm_mode == TX_MODE_SELECT &&
         !((cpi->common.mb_no_coeff_skip && mbmi->mb_skip_coeff) ||
           (segfeature_active(&x->e_mbd, segment_id, SEG_LVL_EOB) &&
@@ -1971,9 +1937,7 @@
       } else if (mbmi->mode == I8X8_PRED) {
         cpi->txfm_count_8x8p[mbmi->txfm_size]++;
       }
-    } else
-#endif
-    if (cpi->common.txfm_mode >= ALLOW_16X16 && mbmi->mode <= TM_PRED) {
+    } else if (cpi->common.txfm_mode >= ALLOW_16X16 && mbmi->mode <= TM_PRED) {
       mbmi->txfm_size = TX_16X16;
     } else
     if (cpi->common.txfm_mode >= ALLOW_8X8 && mbmi->mode != B_PRED) {
@@ -2008,9 +1972,7 @@
   assert(!xd->mode_info_context->mbmi.encoded_as_sb);
 #endif
 
-#if CONFIG_SWITCHABLE_INTERP
   vp8_setup_interp_filters(xd, mbmi->interp_filter, cm);
-#endif
   if (cpi->oxcf.tuning == VP8_TUNE_SSIM) {
     // Adjust the zbin based on this MB rate.
     adjust_act_zbin(cpi, x);
@@ -2047,6 +2009,7 @@
 
   if (mbmi->ref_frame == INTRA_FRAME) {
     if (mbmi->mode == B_PRED) {
+      vp8_intra_prediction_down_copy(xd);
       vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
       vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
     } else if (mbmi->mode == I8X8_PRED) {
@@ -2153,7 +2116,6 @@
   }
 
   if (output_enabled) {
-#if CONFIG_TX_SELECT
     int segment_id = mbmi->segment_id;
     if (cpi->common.txfm_mode == TX_MODE_SELECT &&
         !((cpi->common.mb_no_coeff_skip && mbmi->mb_skip_coeff) ||
@@ -2162,16 +2124,18 @@
       if (mbmi->mode != B_PRED && mbmi->mode != I8X8_PRED &&
           mbmi->mode != SPLITMV) {
         cpi->txfm_count[mbmi->txfm_size]++;
-      } else if (mbmi->mode == I8X8_PRED) {
+      } else if (mbmi->mode == I8X8_PRED ||
+                 (mbmi->mode == SPLITMV &&
+                  mbmi->partitioning != PARTITIONING_4X4)) {
         cpi->txfm_count_8x8p[mbmi->txfm_size]++;
       }
-    } else
-#endif
-    if (mbmi->mode != B_PRED && mbmi->mode != I8X8_PRED &&
+    } else if (mbmi->mode != B_PRED && mbmi->mode != I8X8_PRED &&
         mbmi->mode != SPLITMV && cpi->common.txfm_mode >= ALLOW_16X16) {
       mbmi->txfm_size = TX_16X16;
-    } else if (mbmi->mode != B_PRED && mbmi->mode != SPLITMV &&
-        cpi->common.txfm_mode >= ALLOW_8X8) {
+    } else if (mbmi->mode != B_PRED &&
+               !(mbmi->mode == SPLITMV &&
+                 mbmi->partitioning == PARTITIONING_4X4) &&
+               cpi->common.txfm_mode >= ALLOW_8X8) {
       mbmi->txfm_size = TX_8X8;
     } else {
       mbmi->txfm_size = TX_4X4;
diff --git a/vp8/encoder/encodeintra.c b/vp8/encoder/encodeintra.c
index 703a101..f44df22 100644
--- a/vp8/encoder/encodeintra.c
+++ b/vp8/encoder/encodeintra.c
@@ -48,7 +48,7 @@
     }
   }
 
-  intra_pred_var = VARIANCE_INVOKE(&cpi->rtcd.variance, getmbss)(x->src_diff);
+  intra_pred_var = vp8_get_mb_ss(x->src_diff);
 
   return intra_pred_var;
 }
@@ -57,6 +57,7 @@
                               MACROBLOCK *x, int ib) {
   BLOCKD *b = &x->e_mbd.block[ib];
   BLOCK *be = &x->block[ib];
+  TX_TYPE tx_type;
 
 #if CONFIG_COMP_INTRA_PRED
   if (b->bmi.as_mode.second == (B_PREDICTION_MODE)(B_DC_PRED - 1)) {
@@ -71,15 +72,12 @@
 
   ENCODEMB_INVOKE(&rtcd->encodemb, subb)(be, b, 16);
 
-#if CONFIG_HYBRIDTRANSFORM
-  if (x->q_index < ACTIVE_HT) {
-    txfm_map(b, b->bmi.as_mode.first);
-    vp8_fht_c(be->src_diff, be->coeff, 32, b->bmi.as_mode.tx_type, 4);
-    vp8_ht_quantize_b_4x4(be, b);
-    vp8_ihtllm_c(b->dqcoeff, b->diff, 32, b->bmi.as_mode.tx_type, 4);
-  } else
-#endif
-  {
+  tx_type = get_tx_type(&x->e_mbd, b);
+  if (tx_type != DCT_DCT) {
+    vp8_fht_c(be->src_diff, be->coeff, 32, tx_type, 4);
+    vp8_ht_quantize_b_4x4(be, b, tx_type);
+    vp8_ihtllm_c(b->dqcoeff, b->diff, 32, tx_type, 4);
+  } else {
     x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32) ;
     x->quantize_b_4x4(be, b) ;
     vp8_inverse_transform_b_4x4(IF_RTCD(&rtcd->common->idct), b, 32) ;
@@ -91,12 +89,6 @@
 void vp8_encode_intra4x4mby(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *mb) {
   int i;
 
-#if 0
-  MACROBLOCKD *xd = &mb->e_mbd;
-  // Intra modes requiring top-right MB reconstructed data have been disabled
-  vp8_intra_prediction_down_copy(xd);
-#endif
-
   for (i = 0; i < 16; i++)
     vp8_encode_intra4x4block(rtcd, mb, i);
   return;
@@ -106,9 +98,7 @@
   MACROBLOCKD *xd = &x->e_mbd;
   BLOCK *b = &x->block[0];
   TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size;
-#if CONFIG_HYBRIDTRANSFORM16X16
-  TX_TYPE txfm_type = xd->mode_info_context->bmi[0].as_mode.tx_type;
-#endif
+  TX_TYPE tx_type;
 
 #if CONFIG_COMP_INTRA_PRED
   if (xd->mode_info_context->mbmi.second_mode == (MB_PREDICTION_MODE)(DC_PRED - 1))
@@ -123,20 +113,15 @@
                                            xd->predictor, b->src_stride);
 
   if (tx_size == TX_16X16) {
-#if CONFIG_HYBRIDTRANSFORM16X16
-    if ((xd->mode_info_context->mbmi.mode < I8X8_PRED) &&
-        (x->q_index < ACTIVE_HT16)) {
-      BLOCKD  *bd = &xd->block[0];
-      txfm_map(bd, pred_mode_conv(xd->mode_info_context->mbmi.mode));
-      txfm_type = bd->bmi.as_mode.tx_type;
-      vp8_fht_c(b->src_diff, b->coeff, 32, txfm_type, 16);
+    BLOCKD  *bd = &xd->block[0];
+    tx_type = get_tx_type(xd, bd);
+    if (tx_type != DCT_DCT) {
+      vp8_fht_c(b->src_diff, b->coeff, 32, tx_type, 16);
       vp8_quantize_mby_16x16(x);
       if (x->optimize)
         vp8_optimize_mby_16x16(x, rtcd);
-      vp8_ihtllm_c(bd->dqcoeff, bd->diff, 32, txfm_type, 16);
-    } else
-#endif
-    {
+      vp8_ihtllm_c(bd->dqcoeff, bd->diff, 32, tx_type, 16);
+    } else {
       vp8_transform_mby_16x16(x);
       vp8_quantize_mby_16x16(x);
       if (x->optimize)
@@ -201,6 +186,7 @@
   BLOCK *be = &x->block[ib];
   const int iblock[4] = {0, 1, 4, 5};
   int i;
+  TX_TYPE tx_type;
 
 #if CONFIG_COMP_INTRA_PRED
   if (b->bmi.as_mode.second == (MB_PREDICTION_MODE)(DC_PRED - 1)) {
@@ -219,18 +205,18 @@
     // generate residual blocks
     vp8_subtract_4b_c(be, b, 16);
 
-#if CONFIG_HYBRIDTRANSFORM8X8
-    txfm_map(b, pred_mode_conv(b->bmi.as_mode.first));
-    vp8_fht_c(be->src_diff, (x->block + idx)->coeff, 32,
-              b->bmi.as_mode.tx_type, 8);
-    x->quantize_b_8x8(x->block + idx, xd->block + idx);
-    vp8_ihtllm_c(xd->block[idx].dqcoeff, xd->block[ib].diff, 32,
-                 b->bmi.as_mode.tx_type, 8);
-#else
-    x->vp8_short_fdct8x8(be->src_diff, (x->block + idx)->coeff, 32);
-    x->quantize_b_8x8(x->block + idx, xd->block + idx);
-    vp8_idct_idct8(xd->block[idx].dqcoeff, xd->block[ib].diff, 32);
-#endif
+    tx_type = get_tx_type(xd, xd->block + idx);
+    if (tx_type != DCT_DCT) {
+      vp8_fht_c(be->src_diff, (x->block + idx)->coeff, 32,
+                tx_type, 8);
+      x->quantize_b_8x8(x->block + idx, xd->block + idx);
+      vp8_ihtllm_c(xd->block[idx].dqcoeff, xd->block[ib].diff, 32,
+                   tx_type, 8);
+    } else {
+      x->vp8_short_fdct8x8(be->src_diff, (x->block + idx)->coeff, 32);
+      x->quantize_b_8x8(x->block + idx, xd->block + idx);
+      vp8_idct_idct8(xd->block[idx].dqcoeff, xd->block[ib].diff, 32);
+    }
   } else {
     for (i = 0; i < 4; i++) {
       b = &xd->block[ib + iblock[i]];
diff --git a/vp8/encoder/encodemb.c b/vp8/encoder/encodemb.c
index 50de2f2..d3bd0f1 100644
--- a/vp8/encoder/encodemb.c
+++ b/vp8/encoder/encodemb.c
@@ -267,7 +267,7 @@
 
 void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
                 ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
-                const VP8_ENCODER_RTCD *rtcd, int tx_type) {
+                const VP8_ENCODER_RTCD *rtcd, int tx_size) {
   BLOCK *b;
   BLOCKD *d;
   vp8_token_state tokens[65][2];
@@ -298,21 +298,18 @@
 
   b = &mb->block[i];
   d = &mb->e_mbd.block[i];
-  switch (tx_type) {
+  switch (tx_size) {
     default:
     case TX_4X4:
       scan = vp8_default_zig_zag1d;
       bands = vp8_coef_bands;
       default_eob = 16;
-#if CONFIG_HYBRIDTRANSFORM
       // TODO: this isn't called (for intra4x4 modes), but will be left in
       // since it could be used later
       {
-        int active_ht = (mb->q_index < ACTIVE_HT) &&
-                        (mb->e_mbd.mode_info_context->mbmi.mode == B_PRED);
-
-        if((type == PLANE_TYPE_Y_WITH_DC) && active_ht) {
-          switch (d->bmi.as_mode.tx_type) {
+        TX_TYPE tx_type = get_tx_type(&mb->e_mbd, d);
+        if (tx_type != DCT_DCT) {
+          switch (tx_type) {
             case ADST_DCT:
               scan = vp8_row_scan;
               break;
@@ -325,11 +322,10 @@
               scan = vp8_default_zig_zag1d;
               break;
           }
-
-        } else
+        } else {
           scan = vp8_default_zig_zag1d;
+        }
       }
-#endif
       break;
     case TX_8X8:
       scan = vp8_default_zig_zag1d_8x8;
@@ -380,9 +376,9 @@
         band = bands[i + 1];
         pt = vp8_prev_token_class[t0];
         rate0 +=
-          mb->token_costs[tx_type][type][band][pt][tokens[next][0].token];
+          mb->token_costs[tx_size][type][band][pt][tokens[next][0].token];
         rate1 +=
-          mb->token_costs[tx_type][type][band][pt][tokens[next][1].token];
+          mb->token_costs[tx_size][type][band][pt][tokens[next][1].token];
       }
       UPDATE_RD_COST();
       /* And pick the best. */
@@ -427,12 +423,12 @@
         band = bands[i + 1];
         if (t0 != DCT_EOB_TOKEN) {
           pt = vp8_prev_token_class[t0];
-          rate0 += mb->token_costs[tx_type][type][band][pt][
+          rate0 += mb->token_costs[tx_size][type][band][pt][
               tokens[next][0].token];
         }
         if (t1 != DCT_EOB_TOKEN) {
           pt = vp8_prev_token_class[t1];
-          rate1 += mb->token_costs[tx_type][type][band][pt][
+          rate1 += mb->token_costs[tx_size][type][band][pt][
               tokens[next][1].token];
         }
       }
@@ -464,11 +460,11 @@
       t1 = tokens[next][1].token;
       /* Update the cost of each path if we're past the EOB token. */
       if (t0 != DCT_EOB_TOKEN) {
-        tokens[next][0].rate += mb->token_costs[tx_type][type][band][0][t0];
+        tokens[next][0].rate += mb->token_costs[tx_size][type][band][0][t0];
         tokens[next][0].token = ZERO_TOKEN;
       }
       if (t1 != DCT_EOB_TOKEN) {
-        tokens[next][1].rate += mb->token_costs[tx_type][type][band][0][t1];
+        tokens[next][1].rate += mb->token_costs[tx_size][type][band][0][t1];
         tokens[next][1].token = ZERO_TOKEN;
       }
       /* Don't update next, because we didn't add a new node. */
@@ -484,8 +480,8 @@
   error1 = tokens[next][1].error;
   t0 = tokens[next][0].token;
   t1 = tokens[next][1].token;
-  rate0 += mb->token_costs[tx_type][type][band][pt][t0];
-  rate1 += mb->token_costs[tx_type][type][band][pt][t1];
+  rate0 += mb->token_costs[tx_size][type][band][pt][t0];
+  rate1 += mb->token_costs[tx_size][type][band][pt][t1];
   UPDATE_RD_COST();
   best = rd_cost1 < rd_cost0;
   final_eob = i0 - 1;
@@ -640,6 +636,7 @@
   ENTROPY_CONTEXT_PLANES t_above, t_left;
   ENTROPY_CONTEXT *ta;
   ENTROPY_CONTEXT *tl;
+  int has_2nd_order = x->e_mbd.mode_info_context->mbmi.mode != SPLITMV;
 
   if (!x->e_mbd.above_context || !x->e_mbd.left_context)
     return;
@@ -649,18 +646,21 @@
 
   ta = (ENTROPY_CONTEXT *)&t_above;
   tl = (ENTROPY_CONTEXT *)&t_left;
-  type = PLANE_TYPE_Y_NO_DC;
+  type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
   for (b = 0; b < 16; b += 4) {
     optimize_b(x, b, type,
-               ta + vp8_block2above[b], tl + vp8_block2left[b],
+               ta + vp8_block2above_8x8[b], tl + vp8_block2left_8x8[b],
                rtcd, TX_8X8);
-    *(ta + vp8_block2above_8x8[b] + 1) = *(ta + vp8_block2above_8x8[b]);
-    *(tl + vp8_block2left_8x8[b] + 1)  = *(tl + vp8_block2left_8x8[b]);
+    ta[vp8_block2above_8x8[b] + 1] = ta[vp8_block2above_8x8[b]];
+    tl[vp8_block2left_8x8[b] + 1]  = tl[vp8_block2left_8x8[b]];
   }
 
   // 8x8 always have 2nd roder haar block
-  check_reset_8x8_2nd_coeffs(&x->e_mbd,
-                             ta + vp8_block2above_8x8[24], tl + vp8_block2left_8x8[24]);
+  if (has_2nd_order) {
+    check_reset_8x8_2nd_coeffs(&x->e_mbd,
+                               ta + vp8_block2above_8x8[24],
+                               tl + vp8_block2left_8x8[24]);
+  }
 }
 
 void vp8_optimize_mbuv_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) {
@@ -682,8 +682,8 @@
     optimize_b(x, b, PLANE_TYPE_UV,
                ta + vp8_block2above_8x8[b], tl + vp8_block2left_8x8[b],
                rtcd, TX_8X8);
-    *(ta + vp8_block2above_8x8[b] + 1) = *(ta + vp8_block2above_8x8[b]);
-    *(tl + vp8_block2left_8x8[b] + 1) = *(tl + vp8_block2left_8x8[b]);
+    ta[vp8_block2above_8x8[b] + 1] = ta[vp8_block2above_8x8[b]];
+    tl[vp8_block2left_8x8[b] + 1]  = tl[vp8_block2left_8x8[b]];
   }
 }
 
@@ -900,11 +900,25 @@
       optimize_mb_16x16(x, rtcd);
     vp8_inverse_transform_mb_16x16(IF_RTCD(&rtcd->common->idct), xd);
   } else if (tx_size == TX_8X8) {
-    vp8_transform_mb_8x8(x);
-    vp8_quantize_mb_8x8(x);
-    if (x->optimize)
-      optimize_mb_8x8(x, rtcd);
-    vp8_inverse_transform_mb_8x8(IF_RTCD(&rtcd->common->idct), xd);
+    if (xd->mode_info_context->mbmi.mode == SPLITMV) {
+      assert(xd->mode_info_context->mbmi.partitioning != PARTITIONING_4X4);
+      vp8_transform_mby_8x8(x);
+      vp8_transform_mbuv_4x4(x);
+      vp8_quantize_mby_8x8(x);
+      vp8_quantize_mbuv_4x4(x);
+      if (x->optimize) {
+        vp8_optimize_mby_8x8(x, rtcd);
+        vp8_optimize_mbuv_4x4(x, rtcd);
+      }
+      vp8_inverse_transform_mby_8x8(IF_RTCD(&rtcd->common->idct), xd);
+      vp8_inverse_transform_mbuv_4x4(IF_RTCD(&rtcd->common->idct), xd);
+    } else {
+      vp8_transform_mb_8x8(x);
+      vp8_quantize_mb_8x8(x);
+      if (x->optimize)
+        optimize_mb_8x8(x, rtcd);
+      vp8_inverse_transform_mb_8x8(IF_RTCD(&rtcd->common->idct), xd);
+    }
   } else {
     transform_mb_4x4(x);
     vp8_quantize_mb_4x4(x);
diff --git a/vp8/encoder/encodemv.c b/vp8/encoder/encodemv.c
index 1289d89..75dad2f 100644
--- a/vp8/encoder/encodemv.c
+++ b/vp8/encoder/encodemv.c
@@ -22,44 +22,42 @@
 
 //extern int final_packing;
 
-#if CONFIG_NEWMVENTROPY
-
 #ifdef NMV_STATS
 nmv_context_counts tnmvcounts;
 #endif
 
-static void encode_nmv_component(vp8_writer *w,
+static void encode_nmv_component(vp8_writer* const bc,
                                  int v,
                                  int r,
-                                 const nmv_component *mvcomp) {
+                                 const nmv_component* const mvcomp) {
   int s, z, c, o, d;
   assert (v != 0);            /* should not be zero */
   s = v < 0;
-  vp8_write(w, s, mvcomp->sign);
+  vp8_write(bc, s, mvcomp->sign);
   z = (s ? -v : v) - 1;       /* magnitude - 1 */
 
   c = vp8_get_mv_class(z, &o);
 
-  vp8_write_token(w, vp8_mv_class_tree, mvcomp->classes,
+  vp8_write_token(bc, vp8_mv_class_tree, mvcomp->classes,
                   vp8_mv_class_encodings + c);
 
   d = (o >> 3);               /* int mv data */
 
   if (c == MV_CLASS_0) {
-    vp8_write_token(w, vp8_mv_class0_tree, mvcomp->class0,
+    vp8_write_token(bc, vp8_mv_class0_tree, mvcomp->class0,
                     vp8_mv_class0_encodings + d);
   } else {
     int i, b;
     b = c + CLASS0_BITS - 1;  /* number of bits */
     for (i = 0; i < b; ++i)
-      vp8_write(w, ((d >> i) & 1), mvcomp->bits[i]);
+      vp8_write(bc, ((d >> i) & 1), mvcomp->bits[i]);
   }
 }
 
-static void encode_nmv_component_fp(vp8_writer *w,
+static void encode_nmv_component_fp(vp8_writer *bc,
                                     int v,
                                     int r,
-                                    const nmv_component *mvcomp,
+                                    const nmv_component* const mvcomp,
                                     int usehp) {
   int s, z, c, o, d, f, e;
   assert (v != 0);            /* should not be zero */
@@ -74,24 +72,24 @@
 
   /* Code the fractional pel bits */
   if (c == MV_CLASS_0) {
-    vp8_write_token(w, vp8_mv_fp_tree, mvcomp->class0_fp[d],
+    vp8_write_token(bc, vp8_mv_fp_tree, mvcomp->class0_fp[d],
                     vp8_mv_fp_encodings + f);
   } else {
-    vp8_write_token(w, vp8_mv_fp_tree, mvcomp->fp,
+    vp8_write_token(bc, vp8_mv_fp_tree, mvcomp->fp,
                     vp8_mv_fp_encodings + f);
   }
   /* Code the high precision bit */
   if (usehp) {
     if (c == MV_CLASS_0) {
-      vp8_write(w, e, mvcomp->class0_hp);
+      vp8_write(bc, e, mvcomp->class0_hp);
     } else {
-      vp8_write(w, e, mvcomp->hp);
+      vp8_write(bc, e, mvcomp->hp);
     }
   }
 }
 
 static void build_nmv_component_cost_table(int *mvcost,
-                                           const nmv_component *mvcomp,
+                                           const nmv_component* const mvcomp,
                                            int usehp) {
   int i, v;
   int sign_cost[2], class_cost[MV_CLASSES], class0_cost[CLASS0_SIZE];
@@ -177,7 +175,7 @@
 }
 
 static int update_nmv(
-  vp8_writer *const w,
+  vp8_writer *const bc,
   const unsigned int ct[2],
   vp8_prob *const cur_p,
   const vp8_prob new_p,
@@ -199,15 +197,15 @@
 
   if (cur_b - mod_b > cost) {
     *cur_p = mod_p;
-    vp8_write(w, 1, upd_p);
+    vp8_write(bc, 1, upd_p);
 #ifdef LOW_PRECISION_MV_UPDATE
-    vp8_write_literal(w, mod_p >> 1, 7);
+    vp8_write_literal(bc, mod_p >> 1, 7);
 #else
-    vp8_write_literal(w, mod_p, 8);
+    vp8_write_literal(bc, mod_p, 8);
 #endif
     return 1;
   } else {
-    vp8_write(w, 0, upd_p);
+    vp8_write(bc, 0, upd_p);
     return 0;
   }
 }
@@ -318,7 +316,8 @@
   }
 }
 
-static void add_nmvcount(nmv_context_counts *dst, nmv_context_counts *src) {
+static void add_nmvcount(nmv_context_counts* const dst,
+                         const nmv_context_counts* const src) {
   int i, j, k;
   for (j = 0; j < MV_JOINTS; ++j) {
     dst->joints[j] += src->joints[j];
@@ -357,8 +356,7 @@
 }
 #endif
 
-void vp8_write_nmvprobs(VP8_COMP * cpi, int usehp) {
-  vp8_writer *const w  = & cpi->bc;
+void vp8_write_nmvprobs(VP8_COMP* const cpi, int usehp, vp8_writer* const bc) {
   int i, j;
   nmv_context prob;
   unsigned int branch_ct_joint[MV_JOINTS - 1][2];
@@ -443,37 +441,37 @@
     }
   }
   if (savings <= 0) {
-    vp8_write_bit(w, 0);
+    vp8_write_bit(bc, 0);
     return;
   }
-  vp8_write_bit(w, 1);
+  vp8_write_bit(bc, 1);
 #endif
 
   for (j = 0; j < MV_JOINTS - 1; ++j) {
-    update_nmv(w, branch_ct_joint[j],
+    update_nmv(bc, branch_ct_joint[j],
                &cpi->common.fc.nmvc.joints[j],
                prob.joints[j],
                VP8_NMV_UPDATE_PROB);
   }
   for (i = 0; i < 2; ++i) {
-    update_nmv(w, branch_ct_sign[i],
+    update_nmv(bc, branch_ct_sign[i],
                &cpi->common.fc.nmvc.comps[i].sign,
                prob.comps[i].sign,
                VP8_NMV_UPDATE_PROB);
     for (j = 0; j < MV_CLASSES - 1; ++j) {
-      update_nmv(w, branch_ct_classes[i][j],
+      update_nmv(bc, branch_ct_classes[i][j],
                  &cpi->common.fc.nmvc.comps[i].classes[j],
                  prob.comps[i].classes[j],
                  VP8_NMV_UPDATE_PROB);
     }
     for (j = 0; j < CLASS0_SIZE - 1; ++j) {
-      update_nmv(w, branch_ct_class0[i][j],
+      update_nmv(bc, branch_ct_class0[i][j],
                  &cpi->common.fc.nmvc.comps[i].class0[j],
                  prob.comps[i].class0[j],
                  VP8_NMV_UPDATE_PROB);
     }
     for (j = 0; j < MV_OFFSET_BITS; ++j) {
-      update_nmv(w, branch_ct_bits[i][j],
+      update_nmv(bc, branch_ct_bits[i][j],
                  &cpi->common.fc.nmvc.comps[i].bits[j],
                  prob.comps[i].bits[j],
                  VP8_NMV_UPDATE_PROB);
@@ -483,14 +481,14 @@
     for (j = 0; j < CLASS0_SIZE; ++j) {
       int k;
       for (k = 0; k < 3; ++k) {
-        update_nmv(w, branch_ct_class0_fp[i][j][k],
+        update_nmv(bc, branch_ct_class0_fp[i][j][k],
                    &cpi->common.fc.nmvc.comps[i].class0_fp[j][k],
                    prob.comps[i].class0_fp[j][k],
                    VP8_NMV_UPDATE_PROB);
       }
     }
     for (j = 0; j < 3; ++j) {
-      update_nmv(w, branch_ct_fp[i][j],
+      update_nmv(bc, branch_ct_fp[i][j],
                  &cpi->common.fc.nmvc.comps[i].fp[j],
                  prob.comps[i].fp[j],
                  VP8_NMV_UPDATE_PROB);
@@ -498,11 +496,11 @@
   }
   if (usehp) {
     for (i = 0; i < 2; ++i) {
-      update_nmv(w, branch_ct_class0_hp[i],
+      update_nmv(bc, branch_ct_class0_hp[i],
                  &cpi->common.fc.nmvc.comps[i].class0_hp,
                  prob.comps[i].class0_hp,
                  VP8_NMV_UPDATE_PROB);
-      update_nmv(w, branch_ct_hp[i],
+      update_nmv(bc, branch_ct_hp[i],
                  &cpi->common.fc.nmvc.comps[i].hp,
                  prob.comps[i].hp,
                  VP8_NMV_UPDATE_PROB);
@@ -510,34 +508,35 @@
   }
 }
 
-void vp8_encode_nmv(vp8_writer *w, const MV *mv, const MV *ref,
-                    const nmv_context *mvctx) {
+void vp8_encode_nmv(vp8_writer* const bc, const MV* const mv,
+                    const MV* const ref, const nmv_context* const mvctx) {
   MV_JOINT_TYPE j = vp8_get_mv_joint(*mv);
-  vp8_write_token(w, vp8_mv_joint_tree, mvctx->joints,
+  vp8_write_token(bc, vp8_mv_joint_tree, mvctx->joints,
                   vp8_mv_joint_encodings + j);
   if (j == MV_JOINT_HZVNZ || j == MV_JOINT_HNZVNZ) {
-    encode_nmv_component(w, mv->row, ref->col, &mvctx->comps[0]);
+    encode_nmv_component(bc, mv->row, ref->col, &mvctx->comps[0]);
   }
   if (j == MV_JOINT_HNZVZ || j == MV_JOINT_HNZVNZ) {
-    encode_nmv_component(w, mv->col, ref->col, &mvctx->comps[1]);
+    encode_nmv_component(bc, mv->col, ref->col, &mvctx->comps[1]);
   }
 }
 
-void vp8_encode_nmv_fp(vp8_writer *w, const MV *mv, const MV *ref,
-                       const nmv_context *mvctx, int usehp) {
+void vp8_encode_nmv_fp(vp8_writer* const bc, const MV* const mv,
+                       const MV* const ref, const nmv_context* const mvctx,
+                       int usehp) {
   MV_JOINT_TYPE j = vp8_get_mv_joint(*mv);
   usehp = usehp && vp8_use_nmv_hp(ref);
   if (j == MV_JOINT_HZVNZ || j == MV_JOINT_HNZVNZ) {
-    encode_nmv_component_fp(w, mv->row, ref->row, &mvctx->comps[0], usehp);
+    encode_nmv_component_fp(bc, mv->row, ref->row, &mvctx->comps[0], usehp);
   }
   if (j == MV_JOINT_HNZVZ || j == MV_JOINT_HNZVNZ) {
-    encode_nmv_component_fp(w, mv->col, ref->col, &mvctx->comps[1], usehp);
+    encode_nmv_component_fp(bc, mv->col, ref->col, &mvctx->comps[1], usehp);
   }
 }
 
 void vp8_build_nmv_cost_table(int *mvjoint,
                               int *mvcost[2],
-                              const nmv_context *mvctx,
+                              const nmv_context* const mvctx,
                               int usehp,
                               int mvc_flag_v,
                               int mvc_flag_h) {
@@ -548,588 +547,3 @@
   if (mvc_flag_h)
     build_nmv_component_cost_table(mvcost[1], &mvctx->comps[1], usehp);
 }
-
-#else  /* CONFIG_NEWMVENTROPY */
-
-static void encode_mvcomponent(
-  vp8_writer *const w,
-  const int v,
-  const struct mv_context *mvc
-) {
-  const vp8_prob *p = mvc->prob;
-  const int x = v < 0 ? -v : v;
-
-  if (x < mvnum_short) {   // Small
-    vp8_write(w, 0, p [mvpis_short]);
-    vp8_treed_write(w, vp8_small_mvtree, p + MVPshort, x, mvnum_short_bits);
-    if (!x)
-      return;         // no sign bit
-  } else {                // Large
-    int i = 0;
-
-    vp8_write(w, 1, p [mvpis_short]);
-
-    do
-      vp8_write(w, (x >> i) & 1, p [MVPbits + i]);
-
-    while (++i < mvnum_short_bits);
-
-    i = mvlong_width - 1;  /* Skip bit 3, which is sometimes implicit */
-
-    do
-      vp8_write(w, (x >> i) & 1, p [MVPbits + i]);
-
-    while (--i > mvnum_short_bits);
-
-    if (x & ~((2 << mvnum_short_bits) - 1))
-      vp8_write(w, (x >> mvnum_short_bits) & 1, p [MVPbits + mvnum_short_bits]);
-  }
-
-  vp8_write(w, v < 0, p [MVPsign]);
-}
-
-void vp8_encode_motion_vector(vp8_writer *w, const MV *mv, const MV_CONTEXT *mvc) {
-  encode_mvcomponent(w, mv->row >> 1, &mvc[0]);
-  encode_mvcomponent(w, mv->col >> 1, &mvc[1]);
-}
-
-
-static unsigned int cost_mvcomponent(const int v, const struct mv_context *mvc) {
-  const vp8_prob *p = mvc->prob;
-  const int x = v;   // v<0? -v:v;
-  unsigned int cost;
-
-  if (x < mvnum_short) {
-    cost = vp8_cost_zero(p [mvpis_short])
-           + vp8_treed_cost(vp8_small_mvtree, p + MVPshort, x, mvnum_short_bits);
-
-    if (!x)
-      return cost;
-  } else {
-    int i = 0;
-    cost = vp8_cost_one(p [mvpis_short]);
-
-    do
-      cost += vp8_cost_bit(p [MVPbits + i], (x >> i) & 1);
-
-    while (++i < mvnum_short_bits);
-
-    i = mvlong_width - 1;  /* Skip bit 3, which is sometimes implicit */
-
-    do
-      cost += vp8_cost_bit(p [MVPbits + i], (x >> i) & 1);
-
-    while (--i > mvnum_short_bits);
-
-    if (x & ~((2 << mvnum_short_bits) - 1))
-      cost += vp8_cost_bit(p [MVPbits + mvnum_short_bits], (x >> mvnum_short_bits) & 1);
-  }
-
-  return cost;   // + vp8_cost_bit( p [MVPsign], v < 0);
-}
-
-void vp8_build_component_cost_table(int *mvcost[2], const MV_CONTEXT *mvc, int mvc_flag[2]) {
-  int i = 1;   // -mv_max;
-  unsigned int cost0 = 0;
-  unsigned int cost1 = 0;
-
-  vp8_clear_system_state();
-
-  i = 1;
-
-  if (mvc_flag[0]) {
-    mvcost [0] [0] = cost_mvcomponent(0, &mvc[0]);
-
-    do {
-      // mvcost [0] [i] = cost_mvcomponent( i, &mvc[0]);
-      cost0 = cost_mvcomponent(i, &mvc[0]);
-
-      mvcost [0] [i] = cost0 + vp8_cost_zero(mvc[0].prob[MVPsign]);
-      mvcost [0] [-i] = cost0 + vp8_cost_one(mvc[0].prob[MVPsign]);
-    } while (++i <= mv_max);
-  }
-
-  i = 1;
-
-  if (mvc_flag[1]) {
-    mvcost [1] [0] = cost_mvcomponent(0, &mvc[1]);
-
-    do {
-      // mvcost [1] [i] = cost_mvcomponent( i, mvc[1]);
-      cost1 = cost_mvcomponent(i, &mvc[1]);
-
-      mvcost [1] [i] = cost1 + vp8_cost_zero(mvc[1].prob[MVPsign]);
-      mvcost [1] [-i] = cost1 + vp8_cost_one(mvc[1].prob[MVPsign]);
-    } while (++i <= mv_max);
-  }
-}
-
-
-// Motion vector probability table update depends on benefit.
-// Small correction allows for the fact that an update to an MV probability
-// may have benefit in subsequent frames as well as the current one.
-
-#define MV_PROB_UPDATE_CORRECTION   -1
-
-
-__inline static void calc_prob(vp8_prob *p, const unsigned int ct[2]) {
-  const unsigned int tot = ct[0] + ct[1];
-
-  if (tot) {
-    const vp8_prob x = ((ct[0] * 255) / tot) & -2;
-    *p = x ? x : 1;
-  }
-}
-
-static void update(
-  vp8_writer *const w,
-  const unsigned int ct[2],
-  vp8_prob *const cur_p,
-  const vp8_prob new_p,
-  const vp8_prob update_p,
-  int *updated
-) {
-  const int cur_b = vp8_cost_branch(ct, *cur_p);
-  const int new_b = vp8_cost_branch(ct, new_p);
-  const int cost = 7 + MV_PROB_UPDATE_CORRECTION + ((vp8_cost_one(update_p) - vp8_cost_zero(update_p) + 128) >> 8);
-
-  if (cur_b - new_b > cost) {
-    *cur_p = new_p;
-    vp8_write(w, 1, update_p);
-    vp8_write_literal(w, new_p >> 1, 7);
-    *updated = 1;
-
-  } else
-    vp8_write(w, 0, update_p);
-}
-
-static void write_component_probs(
-  vp8_writer *const w,
-  struct mv_context *cur_mvc,
-  const struct mv_context *default_mvc_,
-  const struct mv_context *update_mvc,
-  const unsigned int events [MVvals],
-  unsigned int rc,
-  int *updated
-) {
-  vp8_prob *Pcur = cur_mvc->prob;
-  const vp8_prob *default_mvc = default_mvc_->prob;
-  const vp8_prob *Pupdate = update_mvc->prob;
-  unsigned int is_short_ct[2], sign_ct[2];
-
-  unsigned int bit_ct [mvlong_width] [2];
-
-  unsigned int short_ct  [mvnum_short];
-  unsigned int short_bct [mvnum_short - 1] [2];
-
-  vp8_prob Pnew [MVPcount];
-
-  (void) rc;
-  vp8_copy_array(Pnew, default_mvc, MVPcount);
-
-  vp8_zero(is_short_ct)
-  vp8_zero(sign_ct)
-  vp8_zero(bit_ct)
-  vp8_zero(short_ct)
-  vp8_zero(short_bct)
-
-
-  // j=0
-  {
-    const int c = events [mv_max];
-
-    is_short_ct [0] += c;    // Short vector
-    short_ct [0] += c;       // Magnitude distribution
-  }
-
-  // j: 1 ~ mv_max (1023)
-  {
-    int j = 1;
-
-    do {
-      const int c1 = events [mv_max + j];  // positive
-      const int c2 = events [mv_max - j];  // negative
-      const int c  = c1 + c2;
-      int a = j;
-
-      sign_ct [0] += c1;
-      sign_ct [1] += c2;
-
-      if (a < mvnum_short) {
-        is_short_ct [0] += c;     // Short vector
-        short_ct [a] += c;       // Magnitude distribution
-      } else {
-        int k = mvlong_width - 1;
-        is_short_ct [1] += c;     // Long vector
-
-        /*  bit 3 not always encoded. */
-        do
-          bit_ct [k] [(a >> k) & 1] += c;
-
-        while (--k >= 0);
-      }
-    } while (++j <= mv_max);
-  }
-
-  calc_prob(Pnew + mvpis_short, is_short_ct);
-
-  calc_prob(Pnew + MVPsign, sign_ct);
-
-  {
-    vp8_prob p [mvnum_short - 1];    /* actually only need branch ct */
-    int j = 0;
-
-    vp8_tree_probs_from_distribution(
-      mvnum_short, vp8_small_mvencodings, vp8_small_mvtree,
-      p, short_bct, short_ct,
-      256, 1
-    );
-
-    do
-      calc_prob(Pnew + MVPshort + j, short_bct[j]);
-
-    while (++j < mvnum_short - 1);
-  }
-
-  {
-    int j = 0;
-
-    do
-      calc_prob(Pnew + MVPbits + j, bit_ct[j]);
-
-    while (++j < mvlong_width);
-  }
-
-  update(w, is_short_ct, Pcur + mvpis_short, Pnew[mvpis_short], *Pupdate++, updated);
-
-  update(w, sign_ct, Pcur + MVPsign, Pnew[MVPsign], *Pupdate++, updated);
-
-  {
-    const vp8_prob *const new_p = Pnew + MVPshort;
-    vp8_prob *const cur_p = Pcur + MVPshort;
-
-    int j = 0;
-
-    do
-
-      update(w, short_bct[j], cur_p + j, new_p[j], *Pupdate++, updated);
-
-    while (++j < mvnum_short - 1);
-  }
-
-  {
-    const vp8_prob *const new_p = Pnew + MVPbits;
-    vp8_prob *const cur_p = Pcur + MVPbits;
-
-    int j = 0;
-
-    do
-
-      update(w, bit_ct[j], cur_p + j, new_p[j], *Pupdate++, updated);
-
-    while (++j < mvlong_width);
-  }
-}
-
-void vp8_write_mvprobs(VP8_COMP *cpi) {
-  vp8_writer *const w  = & cpi->bc;
-  MV_CONTEXT *mvc = cpi->common.fc.mvc;
-  int flags[2] = {0, 0};
-#ifdef ENTROPY_STATS
-  active_section = 4;
-#endif
-  write_component_probs(
-    w, &mvc[0], &vp8_default_mv_context[0], &vp8_mv_update_probs[0], cpi->MVcount[0], 0, &flags[0]
-  );
-  write_component_probs(
-    w, &mvc[1], &vp8_default_mv_context[1], &vp8_mv_update_probs[1], cpi->MVcount[1], 1, &flags[1]
-  );
-
-  if (flags[0] || flags[1])
-    vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flags);
-
-#ifdef ENTROPY_STATS
-  active_section = 5;
-#endif
-}
-
-
-static void encode_mvcomponent_hp(
-  vp8_writer *const w,
-  const int v,
-  const struct mv_context_hp *mvc
-) {
-  const vp8_prob *p = mvc->prob;
-  const int x = v < 0 ? -v : v;
-
-  if (x < mvnum_short_hp) {   // Small
-    vp8_write(w, 0, p [mvpis_short_hp]);
-    vp8_treed_write(w, vp8_small_mvtree_hp, p + MVPshort_hp, x,
-                    mvnum_short_bits_hp);
-    if (!x)
-      return;         // no sign bit
-  } else {                // Large
-    int i = 0;
-
-    vp8_write(w, 1, p [mvpis_short_hp]);
-
-    do
-      vp8_write(w, (x >> i) & 1, p [MVPbits_hp + i]);
-
-    while (++i < mvnum_short_bits_hp);
-
-    i = mvlong_width_hp - 1;  /* Skip bit 3, which is sometimes implicit */
-
-    do
-      vp8_write(w, (x >> i) & 1, p [MVPbits_hp + i]);
-
-    while (--i > mvnum_short_bits_hp);
-
-    if (x & ~((2 << mvnum_short_bits_hp) - 1))
-      vp8_write(w, (x >> mvnum_short_bits_hp) & 1,
-                p [MVPbits_hp + mvnum_short_bits_hp]);
-  }
-
-  vp8_write(w, v < 0, p [MVPsign_hp]);
-}
-
-void vp8_encode_motion_vector_hp(vp8_writer *w, const MV *mv,
-                                 const MV_CONTEXT_HP *mvc) {
-
-  encode_mvcomponent_hp(w, mv->row, &mvc[0]);
-  encode_mvcomponent_hp(w, mv->col, &mvc[1]);
-}
-
-
-static unsigned int cost_mvcomponent_hp(const int v,
-                                        const struct mv_context_hp *mvc) {
-  const vp8_prob *p = mvc->prob;
-  const int x = v;   // v<0? -v:v;
-  unsigned int cost;
-
-  if (x < mvnum_short_hp) {
-    cost = vp8_cost_zero(p [mvpis_short_hp])
-           + vp8_treed_cost(vp8_small_mvtree_hp, p + MVPshort_hp, x,
-                            mvnum_short_bits_hp);
-
-    if (!x)
-      return cost;
-  } else {
-    int i = 0;
-    cost = vp8_cost_one(p [mvpis_short_hp]);
-
-    do
-      cost += vp8_cost_bit(p [MVPbits_hp + i], (x >> i) & 1);
-
-    while (++i < mvnum_short_bits_hp);
-
-    i = mvlong_width_hp - 1;  /* Skip bit 3, which is sometimes implicit */
-
-    do
-      cost += vp8_cost_bit(p [MVPbits_hp + i], (x >> i) & 1);
-
-    while (--i > mvnum_short_bits_hp);
-
-    if (x & ~((2 << mvnum_short_bits_hp) - 1))
-      cost += vp8_cost_bit(p [MVPbits_hp + mvnum_short_bits_hp],
-                           (x >> mvnum_short_bits_hp) & 1);
-  }
-
-  return cost;   // + vp8_cost_bit( p [MVPsign], v < 0);
-}
-
-void vp8_build_component_cost_table_hp(int *mvcost[2],
-                                       const MV_CONTEXT_HP *mvc,
-                                       int mvc_flag[2]) {
-  int i = 1;   // -mv_max;
-  unsigned int cost0 = 0;
-  unsigned int cost1 = 0;
-
-  vp8_clear_system_state();
-
-  i = 1;
-
-  if (mvc_flag[0]) {
-    mvcost [0] [0] = cost_mvcomponent_hp(0, &mvc[0]);
-
-    do {
-      // mvcost [0] [i] = cost_mvcomponent( i, &mvc[0]);
-      cost0 = cost_mvcomponent_hp(i, &mvc[0]);
-
-      mvcost [0] [i] = cost0 + vp8_cost_zero(mvc[0].prob[MVPsign_hp]);
-      mvcost [0] [-i] = cost0 + vp8_cost_one(mvc[0].prob[MVPsign_hp]);
-    } while (++i <= mv_max_hp);
-  }
-
-  i = 1;
-
-  if (mvc_flag[1]) {
-    mvcost [1] [0] = cost_mvcomponent_hp(0, &mvc[1]);
-
-    do {
-      // mvcost [1] [i] = cost_mvcomponent( i, mvc[1]);
-      cost1 = cost_mvcomponent_hp(i, &mvc[1]);
-
-      mvcost [1] [i] = cost1 + vp8_cost_zero(mvc[1].prob[MVPsign_hp]);
-      mvcost [1] [-i] = cost1 + vp8_cost_one(mvc[1].prob[MVPsign_hp]);
-    } while (++i <= mv_max_hp);
-  }
-}
-
-
-static void write_component_probs_hp(
-  vp8_writer *const w,
-  struct mv_context_hp *cur_mvc,
-  const struct mv_context_hp *default_mvc_,
-  const struct mv_context_hp *update_mvc,
-  const unsigned int events [MVvals_hp],
-  unsigned int rc,
-  int *updated
-) {
-  vp8_prob *Pcur = cur_mvc->prob;
-  const vp8_prob *default_mvc = default_mvc_->prob;
-  const vp8_prob *Pupdate = update_mvc->prob;
-  unsigned int is_short_ct[2], sign_ct[2];
-
-  unsigned int bit_ct [mvlong_width_hp] [2];
-
-  unsigned int short_ct  [mvnum_short_hp];
-  unsigned int short_bct [mvnum_short_hp - 1] [2];
-
-  vp8_prob Pnew [MVPcount_hp];
-
-  (void) rc;
-  vp8_copy_array(Pnew, default_mvc, MVPcount_hp);
-
-  vp8_zero(is_short_ct)
-  vp8_zero(sign_ct)
-  vp8_zero(bit_ct)
-  vp8_zero(short_ct)
-  vp8_zero(short_bct)
-
-
-  // j=0
-  {
-    const int c = events [mv_max_hp];
-
-    is_short_ct [0] += c;    // Short vector
-    short_ct [0] += c;       // Magnitude distribution
-  }
-
-  // j: 1 ~ mv_max (1023)
-  {
-    int j = 1;
-
-    do {
-      const int c1 = events [mv_max_hp + j];  // positive
-      const int c2 = events [mv_max_hp - j];  // negative
-      const int c  = c1 + c2;
-      int a = j;
-
-      sign_ct [0] += c1;
-      sign_ct [1] += c2;
-
-      if (a < mvnum_short_hp) {
-        is_short_ct [0] += c;     // Short vector
-        short_ct [a] += c;       // Magnitude distribution
-      } else {
-        int k = mvlong_width_hp - 1;
-        is_short_ct [1] += c;     // Long vector
-
-        /*  bit 3 not always encoded. */
-        do
-          bit_ct [k] [(a >> k) & 1] += c;
-
-        while (--k >= 0);
-      }
-    } while (++j <= mv_max_hp);
-  }
-
-  calc_prob(Pnew + mvpis_short_hp, is_short_ct);
-
-  calc_prob(Pnew + MVPsign_hp, sign_ct);
-
-  {
-    vp8_prob p [mvnum_short_hp - 1];    /* actually only need branch ct */
-    int j = 0;
-
-    vp8_tree_probs_from_distribution(
-      mvnum_short_hp, vp8_small_mvencodings_hp, vp8_small_mvtree_hp,
-      p, short_bct, short_ct,
-      256, 1
-    );
-
-    do
-      calc_prob(Pnew + MVPshort_hp + j, short_bct[j]);
-
-    while (++j < mvnum_short_hp - 1);
-  }
-
-  {
-    int j = 0;
-
-    do
-      calc_prob(Pnew + MVPbits_hp + j, bit_ct[j]);
-
-    while (++j < mvlong_width_hp);
-  }
-
-  update(w, is_short_ct, Pcur + mvpis_short_hp, Pnew[mvpis_short_hp],
-         *Pupdate++, updated);
-
-  update(w, sign_ct, Pcur + MVPsign_hp, Pnew[MVPsign_hp], *Pupdate++,
-         updated);
-
-  {
-    const vp8_prob *const new_p = Pnew + MVPshort_hp;
-    vp8_prob *const cur_p = Pcur + MVPshort_hp;
-
-    int j = 0;
-
-    do
-
-      update(w, short_bct[j], cur_p + j, new_p[j], *Pupdate++, updated);
-
-    while (++j < mvnum_short_hp - 1);
-  }
-
-  {
-    const vp8_prob *const new_p = Pnew + MVPbits_hp;
-    vp8_prob *const cur_p = Pcur + MVPbits_hp;
-
-    int j = 0;
-
-    do
-
-      update(w, bit_ct[j], cur_p + j, new_p[j], *Pupdate++, updated);
-
-    while (++j < mvlong_width_hp);
-  }
-}
-
-void vp8_write_mvprobs_hp(VP8_COMP *cpi) {
-  vp8_writer *const w  = & cpi->bc;
-  MV_CONTEXT_HP *mvc = cpi->common.fc.mvc_hp;
-  int flags[2] = {0, 0};
-#ifdef ENTROPY_STATS
-  active_section = 4;
-#endif
-  write_component_probs_hp(
-    w, &mvc[0], &vp8_default_mv_context_hp[0], &vp8_mv_update_probs_hp[0],
-    cpi->MVcount_hp[0], 0, &flags[0]
-  );
-  write_component_probs_hp(
-    w, &mvc[1], &vp8_default_mv_context_hp[1], &vp8_mv_update_probs_hp[1],
-    cpi->MVcount_hp[1], 1, &flags[1]
-  );
-
-  if (flags[0] || flags[1])
-    vp8_build_component_cost_table_hp(cpi->mb.mvcost_hp,
-                                      (const MV_CONTEXT_HP *)
-                                      cpi->common.fc.mvc_hp, flags);
-#ifdef ENTROPY_STATS
-  active_section = 5;
-#endif
-}
-
-#endif  /* CONFIG_NEWMVENTROPY */
diff --git a/vp8/encoder/encodemv.h b/vp8/encoder/encodemv.h
index e675fe0..2545365 100644
--- a/vp8/encoder/encodemv.h
+++ b/vp8/encoder/encodemv.h
@@ -14,31 +14,17 @@
 
 #include "onyx_int.h"
 
-#if CONFIG_NEWMVENTROPY
-void vp8_write_nmvprobs(VP8_COMP *, int usehp);
-void vp8_encode_nmv(vp8_writer *w, const MV *mv, const MV *ref,
-                    const nmv_context *mvctx);
-void vp8_encode_nmv_fp(vp8_writer *w, const MV *mv, const MV *ref,
-                       const nmv_context *mvctx, int usehp);
+void vp8_write_nmvprobs(VP8_COMP* const, int usehp, vp8_writer* const);
+void vp8_encode_nmv(vp8_writer* const w, const MV* const mv,
+                    const MV* const ref, const nmv_context* const mvctx);
+void vp8_encode_nmv_fp(vp8_writer* const w, const MV* const mv,
+                       const MV* const ref, const nmv_context *mvctx,
+                       int usehp);
 void vp8_build_nmv_cost_table(int *mvjoint,
                               int *mvcost[2],
                               const nmv_context *mvctx,
                               int usehp,
                               int mvc_flag_v,
                               int mvc_flag_h);
-#else  /* CONFIG_NEWMVENTROPY */
-void vp8_write_mvprobs(VP8_COMP *);
-void vp8_encode_motion_vector(vp8_writer *, const MV *,
-                              const MV_CONTEXT *);
-void vp8_build_component_cost_table(int *mvcost[2],
-                                    const MV_CONTEXT *mvc,
-                                    int mvc_flag[2]);
-void vp8_write_mvprobs_hp(VP8_COMP *);
-void vp8_encode_motion_vector_hp(vp8_writer *, const MV *,
-                                 const MV_CONTEXT_HP *);
-void vp8_build_component_cost_table_hp(int *mvcost[2],
-                                       const MV_CONTEXT_HP *mvc,
-                                       int mvc_flag[2]);
-#endif  /* CONFIG_NEWMVENTROPY */
 
 #endif
diff --git a/vp8/encoder/firstpass.c b/vp8/encoder/firstpass.c
index bad50b6..09d5a76 100644
--- a/vp8/encoder/firstpass.c
+++ b/vp8/encoder/firstpass.c
@@ -350,7 +350,7 @@
 }
 
 static void zz_motion_search(VP8_COMP *cpi, MACROBLOCK *x, YV12_BUFFER_CONFIG *recon_buffer, int *best_motion_err, int recon_yoffset) {
-  MACROBLOCKD *const xd = & x->e_mbd;
+  MACROBLOCKD *const xd = &x->e_mbd;
   BLOCK *b = &x->block[0];
   BLOCKD *d = &x->e_mbd.block[0];
 
@@ -364,14 +364,15 @@
 
   ref_ptr = (unsigned char *)(*(d->base_pre) + d->pre);
 
-  VARIANCE_INVOKE(IF_RTCD(&cpi->rtcd.variance), mse16x16)(src_ptr, src_stride, ref_ptr, ref_stride, (unsigned int *)(best_motion_err));
+  vp8_mse16x16(src_ptr, src_stride, ref_ptr, ref_stride,
+               (unsigned int *)(best_motion_err));
 }
 
 static void first_pass_motion_search(VP8_COMP *cpi, MACROBLOCK *x,
                                      int_mv *ref_mv, MV *best_mv,
                                      YV12_BUFFER_CONFIG *recon_buffer,
                                      int *best_motion_err, int recon_yoffset) {
-  MACROBLOCKD *const xd = & x->e_mbd;
+  MACROBLOCKD *const xd = &x->e_mbd;
   BLOCK *b = &x->block[0];
   BLOCKD *d = &x->e_mbd.block[0];
   int num00;
@@ -387,7 +388,7 @@
   int new_mv_mode_penalty = 256;
 
   // override the default variance function to use MSE
-  v_fn_ptr.vf    = VARIANCE_INVOKE(IF_RTCD(&cpi->rtcd.variance), mse16x16);
+  v_fn_ptr.vf = vp8_mse16x16;
 
   // Set up pointers for this macro block recon buffer
   xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
@@ -436,9 +437,9 @@
 
 void vp8_first_pass(VP8_COMP *cpi) {
   int mb_row, mb_col;
-  MACROBLOCK *const x = & cpi->mb;
-  VP8_COMMON *const cm = & cpi->common;
-  MACROBLOCKD *const xd = & x->e_mbd;
+  MACROBLOCK *const x = &cpi->mb;
+  VP8_COMMON *const cm = &cpi->common;
+  MACROBLOCKD *const xd = &x->e_mbd;
 
   int recon_yoffset, recon_uvoffset;
   YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx];
@@ -492,12 +493,7 @@
   {
     int flag[2] = {1, 1};
     vp8_init_mv_probs(cm);
-#if CONFIG_NEWMVENTROPY
     vp8_initialize_rd_consts(cpi, cm->base_qindex + cm->y1dc_delta_q);
-#else
-    vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
-    vp8_build_component_cost_table_hp(cpi->mb.mvcost_hp, (const MV_CONTEXT_HP *) cm->fc.mvc_hp, flag);
-#endif
   }
 
   // for each macroblock row in image
diff --git a/vp8/encoder/generic/csystemdependent.c b/vp8/encoder/generic/csystemdependent.c
index 356e32c..44e83fd 100644
--- a/vp8/encoder/generic/csystemdependent.c
+++ b/vp8/encoder/generic/csystemdependent.c
@@ -23,80 +23,6 @@
 void vp8_cmachine_specific_config(VP8_COMP *cpi) {
 #if CONFIG_RUNTIME_CPU_DETECT
   cpi->rtcd.common                    = &cpi->common.rtcd;
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.sad32x32              = vp8_sad32x32_c;
-#endif
-  cpi->rtcd.variance.sad16x16              = vp8_sad16x16_c;
-  cpi->rtcd.variance.sad16x8               = vp8_sad16x8_c;
-  cpi->rtcd.variance.sad8x16               = vp8_sad8x16_c;
-  cpi->rtcd.variance.sad8x8                = vp8_sad8x8_c;
-  cpi->rtcd.variance.sad4x4                = vp8_sad4x4_c;
-
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.sad32x32x3            = vp8_sad32x32x3_c;
-#endif
-  cpi->rtcd.variance.sad16x16x3            = vp8_sad16x16x3_c;
-  cpi->rtcd.variance.sad16x8x3             = vp8_sad16x8x3_c;
-  cpi->rtcd.variance.sad8x16x3             = vp8_sad8x16x3_c;
-  cpi->rtcd.variance.sad8x8x3              = vp8_sad8x8x3_c;
-  cpi->rtcd.variance.sad4x4x3              = vp8_sad4x4x3_c;
-
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.sad32x32x8            = vp8_sad32x32x8_c;
-#endif
-  cpi->rtcd.variance.sad16x16x8            = vp8_sad16x16x8_c;
-  cpi->rtcd.variance.sad16x8x8             = vp8_sad16x8x8_c;
-  cpi->rtcd.variance.sad8x16x8             = vp8_sad8x16x8_c;
-  cpi->rtcd.variance.sad8x8x8              = vp8_sad8x8x8_c;
-  cpi->rtcd.variance.sad4x4x8              = vp8_sad4x4x8_c;
-
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.sad32x32x4d           = vp8_sad32x32x4d_c;
-#endif
-  cpi->rtcd.variance.sad16x16x4d           = vp8_sad16x16x4d_c;
-  cpi->rtcd.variance.sad16x8x4d            = vp8_sad16x8x4d_c;
-  cpi->rtcd.variance.sad8x16x4d            = vp8_sad8x16x4d_c;
-  cpi->rtcd.variance.sad8x8x4d             = vp8_sad8x8x4d_c;
-  cpi->rtcd.variance.sad4x4x4d             = vp8_sad4x4x4d_c;
-#if ARCH_X86 || ARCH_X86_64
-  cpi->rtcd.variance.copy32xn              = vp8_copy32xn_c;
-#endif
-  cpi->rtcd.variance.var4x4                = vp8_variance4x4_c;
-  cpi->rtcd.variance.var8x8                = vp8_variance8x8_c;
-  cpi->rtcd.variance.var8x16               = vp8_variance8x16_c;
-  cpi->rtcd.variance.var16x8               = vp8_variance16x8_c;
-  cpi->rtcd.variance.var16x16              = vp8_variance16x16_c;
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.var32x32              = vp8_variance32x32_c;
-#endif
-
-  cpi->rtcd.variance.subpixvar4x4          = vp8_sub_pixel_variance4x4_c;
-  cpi->rtcd.variance.subpixvar8x8          = vp8_sub_pixel_variance8x8_c;
-  cpi->rtcd.variance.subpixvar8x16         = vp8_sub_pixel_variance8x16_c;
-  cpi->rtcd.variance.subpixvar16x8         = vp8_sub_pixel_variance16x8_c;
-  cpi->rtcd.variance.subpixvar16x16        = vp8_sub_pixel_variance16x16_c;
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.subpixvar32x32        = vp8_sub_pixel_variance32x32_c;
-#endif
-  cpi->rtcd.variance.halfpixvar16x16_h     = vp8_variance_halfpixvar16x16_h_c;
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.halfpixvar32x32_h     = vp8_variance_halfpixvar32x32_h_c;
-#endif
-  cpi->rtcd.variance.halfpixvar16x16_v     = vp8_variance_halfpixvar16x16_v_c;
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.halfpixvar32x32_v     = vp8_variance_halfpixvar32x32_v_c;
-#endif
-  cpi->rtcd.variance.halfpixvar16x16_hv    = vp8_variance_halfpixvar16x16_hv_c;
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.halfpixvar32x32_hv    = vp8_variance_halfpixvar32x32_hv_c;
-#endif
-  cpi->rtcd.variance.subpixmse16x16        = vp8_sub_pixel_mse16x16_c;
-#if CONFIG_SUPERBLOCKS
-  cpi->rtcd.variance.subpixmse32x32        = vp8_sub_pixel_mse32x32_c;
-#endif
-
-  cpi->rtcd.variance.mse16x16              = vp8_mse16x16_c;
-  cpi->rtcd.variance.getmbss               = vp8_get_mb_ss_c;
 
   cpi->rtcd.fdct.short8x8                  = vp8_short_fdct8x8_c;
   cpi->rtcd.fdct.short16x16                = vp8_short_fdct16x16_c;
@@ -118,16 +44,11 @@
   cpi->rtcd.search.refining_search         = vp8_refining_search_sad;
   cpi->rtcd.search.diamond_search          = vp8_diamond_search_sad;
   cpi->rtcd.temporal.apply                 = vp8_temporal_filter_apply_c;
-  cpi->rtcd.variance.satd16x16             = vp8_satd16x16_c;
   cpi->rtcd.fdct.short4x4                  = vp8_short_fdct4x4_c;
   cpi->rtcd.fdct.short8x4                  = vp8_short_fdct8x4_c;
   cpi->rtcd.fdct.fast4x4                   = vp8_short_fdct4x4_c;
   cpi->rtcd.fdct.fast8x4                   = vp8_short_fdct8x4_c;
   cpi->rtcd.fdct.walsh_short4x4            = vp8_short_walsh4x4_c;
-#if CONFIG_INTERNAL_STATS
-  cpi->rtcd.variance.ssimpf_8x8            = vp8_ssim_parms_8x8_c;
-  cpi->rtcd.variance.ssimpf_16x16          = vp8_ssim_parms_16x16_c;
-#endif
 #endif
 
   vp8_yv12_copy_partial_frame_ptr = vp8_yv12_copy_partial_frame;
diff --git a/vp8/encoder/mbgraph.c b/vp8/encoder/mbgraph.c
index 180ee58..2eecfcd 100644
--- a/vp8/encoder/mbgraph.c
+++ b/vp8/encoder/mbgraph.c
@@ -83,10 +83,8 @@
 
   vp8_set_mbmode_and_mvs(x, NEWMV, dst_mv);
   vp8_build_1st_inter16x16_predictors_mby(xd, xd->predictor, 16, 0);
-  // VARIANCE_INVOKE(&cpi->rtcd.variance, satd16x16)
-  best_err = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16)
-             (xd->dst.y_buffer, xd->dst.y_stride,
-              xd->predictor, 16, INT_MAX);
+  best_err = vp8_sad16x16(xd->dst.y_buffer, xd->dst.y_stride,
+                          xd->predictor, 16, INT_MAX);
 
   /* restore UMV window */
   x->mv_col_min = tmp_col_min;
@@ -130,11 +128,8 @@
   // FIXME should really use something like near/nearest MV and/or MV prediction
   xd->pre.y_buffer = ref->y_buffer + mb_y_offset;
   xd->pre.y_stride = ref->y_stride;
-  // VARIANCE_INVOKE(&cpi->rtcd.variance, satd16x16)
-  err = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16)
-        (ref->y_buffer + mb_y_offset,
-         ref->y_stride, xd->dst.y_buffer,
-         xd->dst.y_stride, INT_MAX);
+  err = vp8_sad16x16(ref->y_buffer + mb_y_offset, ref->y_stride,
+                     xd->dst.y_buffer, xd->dst.y_stride, INT_MAX);
   dst_mv->as_int = 0;
 
   // Test last reference frame using the previous best mv as the
@@ -193,10 +188,8 @@
   xd->pre.y_buffer = ref->y_buffer + mb_y_offset;
   xd->pre.y_stride = ref->y_stride;
   // VARIANCE_INVOKE(&cpi->rtcd.variance, satd16x16)
-  err = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16)
-        (ref->y_buffer + mb_y_offset,
-         ref->y_stride, xd->dst.y_buffer,
-         xd->dst.y_stride, INT_MAX);
+  err = vp8_sad16x16(ref->y_buffer + mb_y_offset, ref->y_stride,
+                     xd->dst.y_buffer, xd->dst.y_stride, INT_MAX);
 
   dst_mv->as_int = 0;
 
@@ -221,11 +214,8 @@
 
     xd->mode_info_context->mbmi.mode = mode;
     vp8_build_intra_predictors_mby(xd);
-    // VARIANCE_INVOKE(&cpi->rtcd.variance, satd16x16)
-    err = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16)
-          (xd->predictor, 16,
-           buf->y_buffer + mb_y_offset,
-           buf->y_stride, best_err);
+    err = vp8_sad16x16(xd->predictor, 16, buf->y_buffer + mb_y_offset,
+                       buf->y_stride, best_err);
     // find best
     if (err < best_err) {
       best_err  = err;
diff --git a/vp8/encoder/mcomp.c b/vp8/encoder/mcomp.c
index a6cf2f1..2108874 100644
--- a/vp8/encoder/mcomp.c
+++ b/vp8/encoder/mcomp.c
@@ -47,15 +47,9 @@
   MV v;
   v.row = (mv->as_mv.row - ref->as_mv.row);
   v.col = (mv->as_mv.col - ref->as_mv.col);
-#if CONFIG_NEWMVENTROPY
   return ((mvjcost[vp8_get_mv_joint(v)] +
            mvcost[0][v.row] + mvcost[1][v.col]) *
           Weight) >> 7;
-#else
-  return ((mvcost[0][v.row >> (ishp == 0)] +
-           mvcost[1][v.col >> (ishp == 0)])
-          * Weight) >> 7;
-#endif
 }
 
 static int mv_err_cost(int_mv *mv, int_mv *ref, DEC_MVCOSTS,
@@ -64,14 +58,9 @@
     MV v;
     v.row = (mv->as_mv.row - ref->as_mv.row);
     v.col = (mv->as_mv.col - ref->as_mv.col);
-#if CONFIG_NEWMVENTROPY
     return ((mvjcost[vp8_get_mv_joint(v)] +
              mvcost[0][v.row] + mvcost[1][v.col]) *
             error_per_bit + 128) >> 8;
-#else
-    return ((mvcost[0][v.row >> (ishp == 0)] +
-             mvcost[1][v.col >> (ishp == 0)]) * error_per_bit + 128) >> 8;
-#endif
   }
   return 0;
 }
@@ -83,14 +72,9 @@
     MV v;
     v.row = (mv->as_mv.row - ref->as_mv.row);
     v.col = (mv->as_mv.col - ref->as_mv.col);
-#if CONFIG_NEWMVENTROPY
     return ((mvjsadcost[vp8_get_mv_joint(v)] +
              mvsadcost[0][v.row] + mvsadcost[1][v.col]) *
             error_per_bit + 128) >> 8;
-#else
-    return ((mvsadcost[0][v.row] + mvsadcost[1][v.col])
-            * error_per_bit + 128) >> 8;
-#endif
   }
   return 0;
 }
@@ -220,35 +204,42 @@
  * could reduce the area.
  */
 
-#if CONFIG_NEWMVENTROPY
 /* estimated cost of a motion vector (r,c) */
-#define MVC(r,c) \
-  (mvcost ? \
-  ((mvjcost[((r)!=rr)*2 + ((c)!=rc)] + \
-    mvcost[0][((r)-rr)] + mvcost[1][((c)-rc)]) * error_per_bit + 128 )>>8 : 0)
-#else
-#define MVC(r,c) \
-  (mvcost ? \
-  ((mvcost[0][((r)-rr)>>(xd->allow_high_precision_mv==0)] + \
-    mvcost[1][((c)-rc)>>(xd->allow_high_precision_mv==0)]) * \
-    error_per_bit + 128 )>>8 : 0)
-#endif  /* CONFIG_NEWMVENTROPY */
+#define MVC(r, c)                                       \
+    (mvcost ?                                           \
+     ((mvjcost[((r) != rr) * 2 + ((c) != rc)] +         \
+       mvcost[0][((r) - rr)] + mvcost[1][((c) - rc)]) * \
+      error_per_bit + 128) >> 8 : 0)
 
-#define SP(x) (((x)&7)<<1) // convert motion vector component to offset for svf calc
+#define SP(x) (((x) & 7) << 1)  // convert motion vector component to offset
+                                // for svf calc
 
-#define IFMVCV(r,c,s,e) \
-  if ( c >= minc && c <= maxc && r >= minr && r <= maxr) s else e;
+#define IFMVCV(r, c, s, e)                                \
+    if (c >= minc && c <= maxc && r >= minr && r <= maxr) \
+      s                                                   \
+    else                                                  \
+      e;
 
 /* pointer to predictor base of a motionvector */
-#define PRE(r,c) (y + (((r)>>3) * y_stride + ((c)>>3) -(offset)))
+#define PRE(r, c) (y + (((r) >> 3) * y_stride + ((c) >> 3) -(offset)))
 
 /* returns subpixel variance error function */
-#define DIST(r,c) vfp->svf( PRE(r,c), y_stride, SP(c),SP(r), z,b->src_stride,&sse)
+#define DIST(r, c) \
+    vfp->svf(PRE(r, c), y_stride, SP(c), SP(r), z, b->src_stride, &sse)
 
-/* checks if (r,c) has better score than previous best */
-#define CHECK_BETTER(v,r,c) \
-  IFMVCV(r,c,{thismse = (DIST(r,c)); if((v = MVC(r,c)+thismse) < besterr) \
-  { besterr = v; br=r; bc=c; *distortion = thismse; *sse1 = sse; }}, v=INT_MAX;)
+/* checks if (r, c) has better score than previous best */
+#define CHECK_BETTER(v, r, c) \
+    IFMVCV(r, c, {                                                       \
+      thismse = (DIST(r, c));                                            \
+      if ((v = MVC(r, c) + thismse) < besterr) {                         \
+        besterr = v;                                                     \
+        br = r;                                                          \
+        bc = c;                                                          \
+        *distortion = thismse;                                           \
+        *sse1 = sse;                                                     \
+      }                                                                  \
+    },                                                                   \
+    v = INT_MAX;)
 
 #define MIN(x,y) (((x)<(y))?(x):(y))
 #define MAX(x,y) (((x)>(y))?(x):(y))
@@ -307,17 +298,10 @@
   br = bestmv->as_mv.row << 3;
   bc = bestmv->as_mv.col << 3;
   hstep = 4;
-#if CONFIG_NEWMVENTROPY
   minc = MAX(x->mv_col_min << 3, (ref_mv->as_mv.col) - ((1 << MV_MAX_BITS) - 1));
   maxc = MIN(x->mv_col_max << 3, (ref_mv->as_mv.col) + ((1 << MV_MAX_BITS) - 1));
   minr = MAX(x->mv_row_min << 3, (ref_mv->as_mv.row) - ((1 << MV_MAX_BITS) - 1));
   maxr = MIN(x->mv_row_max << 3, (ref_mv->as_mv.row) + ((1 << MV_MAX_BITS) - 1));
-#else
-  minc = MAX(x->mv_col_min << 3, (ref_mv->as_mv.col) - ((1 << mvlong_width_hp) - 1));
-  maxc = MIN(x->mv_col_max << 3, (ref_mv->as_mv.col) + ((1 << mvlong_width_hp) - 1));
-  minr = MAX(x->mv_row_min << 3, (ref_mv->as_mv.row) - ((1 << mvlong_width_hp) - 1));
-  maxr = MIN(x->mv_row_max << 3, (ref_mv->as_mv.row) + ((1 << mvlong_width_hp) - 1));
-#endif
 
   tr = br;
   tc = bc;
@@ -403,13 +387,11 @@
     tc = bc;
   }
 
-#if CONFIG_NEWMVENTROPY
   if (xd->allow_high_precision_mv) {
     usehp = vp8_use_nmv_hp(&ref_mv->as_mv);
   } else {
     usehp = 0;
   }
-#endif
 
   if (usehp) {
     hstep >>= 1;
@@ -771,13 +753,11 @@
     *sse1 = sse;
   }
 
-#if CONFIG_NEWMVENTROPY
   if (x->e_mbd.allow_high_precision_mv) {
     usehp = vp8_use_nmv_hp(&ref_mv->as_mv);
   } else {
     usehp = 0;
   }
-#endif
   if (!usehp)
     return bestmse;
 
@@ -1304,16 +1284,8 @@
   MACROBLOCKD *xd = &x->e_mbd;
   int_mv fcenter_mv;
 
-#if CONFIG_NEWMVENTROPY
   int *mvjsadcost = x->nmvjointsadcost;
   int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
-#else
-  int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
-  if (xd->allow_high_precision_mv) {
-    mvsadcost[0] = x->mvsadcost_hp[0];
-    mvsadcost[1] = x->mvsadcost_hp[1];
-  }
-#endif
 
   fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
   fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
@@ -1423,16 +1395,8 @@
   MACROBLOCKD *xd = &x->e_mbd;
   int_mv fcenter_mv;
 
-#if CONFIG_NEWMVENTROPY
   int *mvjsadcost = x->nmvjointsadcost;
   int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
-#else
-  int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
-  if (xd->allow_high_precision_mv) {
-    mvsadcost[0] = x->mvsadcost_hp[0];
-    mvsadcost[1] = x->mvsadcost_hp[1];
-  }
-#endif
 
   fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
   fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
@@ -1479,7 +1443,8 @@
         for (t = 0; t < 4; t++)
           block_offset[t] = ss[i + t].offset + best_address;
 
-        fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
+        fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride,
+                       sad_array);
 
         for (t = 0; t < 4; t++, i++) {
           if (sad_array[t] < bestsad) {
@@ -1631,16 +1596,8 @@
   int col_max = ref_col + distance;
   int_mv fcenter_mv;
 
-#if CONFIG_NEWMVENTROPY
   int *mvjsadcost = x->nmvjointsadcost;
   int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
-#else
-  int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
-  if (xd->allow_high_precision_mv) {
-    mvsadcost[0] = x->mvsadcost_hp[0];
-    mvsadcost[1] = x->mvsadcost_hp[1];
-  }
-#endif
 
   fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
   fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
@@ -1735,16 +1692,8 @@
   unsigned int sad_array[3];
   int_mv fcenter_mv;
 
-#if CONFIG_NEWMVENTROPY
   int *mvjsadcost = x->nmvjointsadcost;
   int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
-#else
-  int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
-  if (xd->allow_high_precision_mv) {
-    mvsadcost[0] = x->mvsadcost_hp[0];
-    mvsadcost[1] = x->mvsadcost_hp[1];
-  }
-#endif
 
   fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
   fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
@@ -1872,16 +1821,8 @@
   unsigned int sad_array[3];
   int_mv fcenter_mv;
 
-#if CONFIG_NEWMVENTROPY
   int *mvjsadcost = x->nmvjointsadcost;
   int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
-#else
-  int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
-  if (xd->allow_high_precision_mv) {
-    mvsadcost[0] = x->mvsadcost_hp[0];
-    mvsadcost[1] = x->mvsadcost_hp[1];
-  }
-#endif
 
   fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
   fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
@@ -2022,16 +1963,8 @@
   MACROBLOCKD *xd = &x->e_mbd;
   int_mv fcenter_mv;
 
-#if CONFIG_NEWMVENTROPY
   int *mvjsadcost = x->nmvjointsadcost;
   int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
-#else
-  int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
-  if (xd->allow_high_precision_mv) {
-    mvsadcost[0] = x->mvsadcost_hp[0];
-    mvsadcost[1] = x->mvsadcost_hp[1];
-  }
-#endif
 
   fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
   fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
@@ -2106,16 +2039,8 @@
   MACROBLOCKD *xd = &x->e_mbd;
   int_mv fcenter_mv;
 
-#if CONFIG_NEWMVENTROPY
   int *mvjsadcost = x->nmvjointsadcost;
   int *mvsadcost[2] = {x->nmvsadcost[0], x->nmvsadcost[1]};
-#else
-  int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
-  if (xd->allow_high_precision_mv) {
-    mvsadcost[0] = x->mvsadcost_hp[0];
-    mvsadcost[1] = x->mvsadcost_hp[1];
-  }
-#endif
 
   fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
   fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
diff --git a/vp8/encoder/mcomp.h b/vp8/encoder/mcomp.h
index afca580..f091069 100644
--- a/vp8/encoder/mcomp.h
+++ b/vp8/encoder/mcomp.h
@@ -15,21 +15,12 @@
 #include "block.h"
 #include "variance.h"
 
-#if CONFIG_NEWMVENTROPY
 #define MVCOSTS mvjcost, mvcost
 #define MVSADCOSTS mvjsadcost, mvsadcost
 #define DEC_MVCOSTS int *mvjcost, int *mvcost[2]
 #define DEC_MVSADCOSTS int *mvjsadcost, int *mvsadcost[2]
 #define NULLMVCOST NULL, NULL
 #define XMVCOST x->nmvjointcost, (x->e_mbd.allow_high_precision_mv?x->nmvcost_hp:x->nmvcost)
-#else
-#define MVCOSTS mvcost
-#define MVSADCOSTS mvsadcost
-#define DEC_MVCOSTS int *mvcost[2]
-#define DEC_MVSADCOSTS int *mvsadcost[2]
-#define NULLMVCOST NULL
-#define XMVCOST (x->e_mbd.allow_high_precision_mv?x->mvcost_hp:x->mvcost)
-#endif  /* CONFIG_NEWMVENTROPY */
 
 #ifdef ENTROPY_STATS
 extern void init_mv_ref_counts();
diff --git a/vp8/encoder/modecosts.c b/vp8/encoder/modecosts.c
index b1abd1e..23b9973 100644
--- a/vp8/encoder/modecosts.c
+++ b/vp8/encoder/modecosts.c
@@ -46,14 +46,11 @@
   vp8_cost_tokens(c->mb.i8x8_mode_costs,
                   x->fc.i8x8_mode_prob, vp8_i8x8_mode_tree);
 
-#if CONFIG_SWITCHABLE_INTERP
   {
     int i;
     for (i = 0; i <= VP8_SWITCHABLE_FILTERS; ++i)
-    //for (i = 0; i <= 0; ++i)
       vp8_cost_tokens((int *)c->mb.switchable_interp_costs[i],
                       x->fc.switchable_interp_prob[i],
                       vp8_switchable_interp_tree);
   }
-#endif
 }
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 717fe96..f11ff59 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -77,7 +77,7 @@
 extern void vp8_yv12_copy_src_frame_func_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
 #endif
 
-int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd);
+int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
 
 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
 
@@ -85,6 +85,7 @@
 
 extern const int vp8_gf_interval_table[101];
 
+#define DEFAULT_INTERP_FILTER EIGHTTAP  /* SWITCHABLE for better performance */
 #define SEARCH_BEST_FILTER 0            /* to search exhaustively for
                                            best filter */
 #define RESET_FOREACH_FILTER 0          /* whether to reset the encoder state
@@ -101,25 +102,14 @@
 #if CONFIG_INTERNAL_STATS
 #include "math.h"
 
-extern double vp8_calc_ssim
-(
-  YV12_BUFFER_CONFIG *source,
-  YV12_BUFFER_CONFIG *dest,
-  int lumamask,
-  double *weight,
-  const vp8_variance_rtcd_vtable_t *rtcd
-);
+extern double vp8_calc_ssim(YV12_BUFFER_CONFIG *source,
+                            YV12_BUFFER_CONFIG *dest, int lumamask,
+                            double *weight);
 
 
-extern double vp8_calc_ssimg
-(
-  YV12_BUFFER_CONFIG *source,
-  YV12_BUFFER_CONFIG *dest,
-  double *ssim_y,
-  double *ssim_u,
-  double *ssim_v,
-  const vp8_variance_rtcd_vtable_t *rtcd
-);
+extern double vp8_calc_ssimg(YV12_BUFFER_CONFIG *source,
+                             YV12_BUFFER_CONFIG *dest, double *ssim_y,
+                             double *ssim_u, double *ssim_v);
 
 
 #endif
@@ -149,12 +139,10 @@
 extern int intra_mode_stats[VP8_BINTRAMODES][VP8_BINTRAMODES][VP8_BINTRAMODES];
 #endif
 
-#if CONFIG_NEWMVENTROPY
 #ifdef NMV_STATS
 extern void init_nmvstats();
 extern void print_nmvstats();
 #endif
-#endif
 
 #ifdef SPEEDSTATS
 unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
@@ -608,7 +596,7 @@
 
 // DEBUG: Print out the segment id of each MB in the current frame.
 static void print_seg_map(VP8_COMP *cpi) {
-  VP8_COMMON *cm = & cpi->common;
+  VP8_COMMON *cm = &cpi->common;
   int row, col;
   int map_index = 0;
   FILE *statsfile;
@@ -1282,7 +1270,7 @@
 }
 
 void vp8_alloc_compressor_data(VP8_COMP *cpi) {
-  VP8_COMMON *cm = & cpi->common;
+  VP8_COMMON *cm = &cpi->common;
 
   int width = cm->Width;
   int height = cm->Height;
@@ -1363,7 +1351,8 @@
 
   vpx_free(cpi->tplist);
 
-  CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cpi->common.mb_rows));
+  CHECK_MEM_ERROR(cpi->tplist,
+                  vpx_malloc(sizeof(TOKENLIST) * (cpi->common.mb_rows)));
 }
 
 
@@ -1629,7 +1618,7 @@
   cpi->cq_target_quality = cpi->oxcf.cq_level;
 
   if (!cm->use_bilinear_mc_filter)
-    cm->mcomp_filter_type = EIGHTTAP;
+    cm->mcomp_filter_type = DEFAULT_INTERP_FILTER;
   else
     cm->mcomp_filter_type = BILINEAR;
 
@@ -1699,8 +1688,6 @@
 #define M_LOG2_E 0.693147180559945309417
 #define log2f(x) (log (x) / (float) M_LOG2_E)
 
-#if CONFIG_NEWMVENTROPY
-
 static void cal_nmvjointsadcost(int *mvjointsadcost) {
   mvjointsadcost[0] = 600;
   mvjointsadcost[1] = 300;
@@ -1738,40 +1725,6 @@
   } while (++i <= MV_MAX);
 }
 
-#else
-
-static void cal_mvsadcosts(int *mvsadcost[2]) {
-  int i = 1;
-
-  mvsadcost [0] [0] = 300;
-  mvsadcost [1] [0] = 300;
-
-  do {
-    double z = 256 * (2 * (log2f(8 * i) + .6));
-    mvsadcost [0][i] = (int) z;
-    mvsadcost [1][i] = (int) z;
-    mvsadcost [0][-i] = (int) z;
-    mvsadcost [1][-i] = (int) z;
-  } while (++i <= mvfp_max);
-}
-
-static void cal_mvsadcosts_hp(int *mvsadcost[2]) {
-  int i = 1;
-
-  mvsadcost [0] [0] = 300;
-  mvsadcost [1] [0] = 300;
-
-  do {
-    double z = 256 * (2 * (log2f(8 * i) + .6));
-    mvsadcost [0][i] = (int) z;
-    mvsadcost [1][i] = (int) z;
-    mvsadcost [0][-i] = (int) z;
-    mvsadcost [1][-i] = (int) z;
-  } while (++i <= mvfp_max_hp);
-}
-
-#endif  /* CONFIG_NEWMVENTROPY */
-
 VP8_PTR vp8_create_compressor(VP8_CONFIG *oxcf) {
   int i;
   volatile union {
@@ -1823,10 +1776,8 @@
 #endif
   for (i = 0; i < COMP_PRED_CONTEXTS; i++)
     cm->prob_comppred[i]         = 128;
-#if CONFIG_TX_SELECT
   for (i = 0; i < TX_SIZE_MAX - 1; i++)
     cm->prob_tx[i]               = 128;
-#endif
 
   // Prime the recent reference frame useage counters.
   // Hereafter they will be maintained as a sort of moving average
@@ -1887,11 +1838,9 @@
   vp8_zero(inter_uv_modes);
   vp8_zero(inter_b_modes);
 #endif
-#if CONFIG_NEWMVENTROPY
 #ifdef NMV_STATS
   init_nmvstats();
 #endif
-#endif
 
   /*Initialize the feed-forward activity masking.*/
   cpi->activity_avg = 90 << 12;
@@ -1957,7 +1906,6 @@
   cpi->gf_rate_correction_factor  = 1.0;
   cpi->twopass.est_max_qcorrection_factor  = 1.0;
 
-#if CONFIG_NEWMVENTROPY
   cal_nmvjointsadcost(cpi->mb.nmvjointsadcost);
   cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX];
   cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX];
@@ -1970,19 +1918,6 @@
   cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX];
   cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
   cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
-#else
-  cpi->mb.mvcost[0] = &cpi->mb.mvcosts[0][mv_max + 1];
-  cpi->mb.mvcost[1] = &cpi->mb.mvcosts[1][mv_max + 1];
-  cpi->mb.mvsadcost[0] = &cpi->mb.mvsadcosts[0][mvfp_max + 1];
-  cpi->mb.mvsadcost[1] = &cpi->mb.mvsadcosts[1][mvfp_max + 1];
-  cal_mvsadcosts(cpi->mb.mvsadcost);
-
-  cpi->mb.mvcost_hp[0] = &cpi->mb.mvcosts_hp[0][mv_max_hp + 1];
-  cpi->mb.mvcost_hp[1] = &cpi->mb.mvcosts_hp[1][mv_max_hp + 1];
-  cpi->mb.mvsadcost_hp[0] = &cpi->mb.mvsadcosts_hp[0][mvfp_max_hp + 1];
-  cpi->mb.mvsadcost_hp[1] = &cpi->mb.mvsadcosts_hp[1][mvfp_max_hp + 1];
-  cal_mvsadcosts_hp(cpi->mb.mvsadcost_hp);
-#endif  /* CONFIG_NEWMVENTROPY */
 
   for (i = 0; i < KEY_FRAME_CONTEXT; i++) {
     cpi->prior_key_frame_distance[i] = (int)cpi->output_frame_rate;
@@ -2026,74 +1961,48 @@
   init_mv_ref_counts();
 #endif
 
+#define BFP(BT, SDF, VF, SVF, SVFHH, SVFHV, SVFHHV, SDX3F, SDX8F, SDX4DF) \
+    cpi->fn_ptr[BT].sdf            = SDF; \
+    cpi->fn_ptr[BT].vf             = VF; \
+    cpi->fn_ptr[BT].svf            = SVF; \
+    cpi->fn_ptr[BT].svf_halfpix_h  = SVFHH; \
+    cpi->fn_ptr[BT].svf_halfpix_v  = SVFHV; \
+    cpi->fn_ptr[BT].svf_halfpix_hv = SVFHHV; \
+    cpi->fn_ptr[BT].sdx3f          = SDX3F; \
+    cpi->fn_ptr[BT].sdx8f          = SDX8F; \
+    cpi->fn_ptr[BT].sdx4df         = SDX4DF;
+
+
 #if CONFIG_SUPERBLOCKS
-  cpi->fn_ptr[BLOCK_32X32].sdf            = VARIANCE_INVOKE(&cpi->rtcd.variance, sad32x32);
-  cpi->fn_ptr[BLOCK_32X32].vf             = VARIANCE_INVOKE(&cpi->rtcd.variance, var32x32);
-  cpi->fn_ptr[BLOCK_32X32].svf            = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar32x32);
-  cpi->fn_ptr[BLOCK_32X32].svf_halfpix_h  = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar32x32_h);
-  cpi->fn_ptr[BLOCK_32X32].svf_halfpix_v  = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar32x32_v);
-  cpi->fn_ptr[BLOCK_32X32].svf_halfpix_hv = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar32x32_hv);
-  cpi->fn_ptr[BLOCK_32X32].sdx3f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad32x32x3);
-  cpi->fn_ptr[BLOCK_32X32].sdx8f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad32x32x8);
-  cpi->fn_ptr[BLOCK_32X32].sdx4df         = VARIANCE_INVOKE(&cpi->rtcd.variance, sad32x32x4d);
+  BFP(BLOCK_32X32, vp8_sad32x32, vp8_variance32x32, vp8_sub_pixel_variance32x32,
+      vp8_variance_halfpixvar32x32_h, vp8_variance_halfpixvar32x32_v,
+      vp8_variance_halfpixvar32x32_hv, vp8_sad32x32x3, vp8_sad32x32x8,
+      vp8_sad32x32x4d)
 #endif
 
-  cpi->fn_ptr[BLOCK_16X16].sdf            = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16);
-  cpi->fn_ptr[BLOCK_16X16].vf             = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16);
-  cpi->fn_ptr[BLOCK_16X16].svf            = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x16);
-  cpi->fn_ptr[BLOCK_16X16].svf_halfpix_h  = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_h);
-  cpi->fn_ptr[BLOCK_16X16].svf_halfpix_v  = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_v);
-  cpi->fn_ptr[BLOCK_16X16].svf_halfpix_hv = VARIANCE_INVOKE(&cpi->rtcd.variance, halfpixvar16x16_hv);
-  cpi->fn_ptr[BLOCK_16X16].sdx3f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x3);
-  cpi->fn_ptr[BLOCK_16X16].sdx8f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x8);
-  cpi->fn_ptr[BLOCK_16X16].sdx4df         = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x16x4d);
+  BFP(BLOCK_16X16, vp8_sad16x16, vp8_variance16x16, vp8_sub_pixel_variance16x16,
+       vp8_variance_halfpixvar16x16_h, vp8_variance_halfpixvar16x16_v,
+       vp8_variance_halfpixvar16x16_hv, vp8_sad16x16x3, vp8_sad16x16x8,
+       vp8_sad16x16x4d)
 
-  cpi->fn_ptr[BLOCK_16X8].sdf            = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8);
-  cpi->fn_ptr[BLOCK_16X8].vf             = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x8);
-  cpi->fn_ptr[BLOCK_16X8].svf            = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar16x8);
-  cpi->fn_ptr[BLOCK_16X8].svf_halfpix_h  = NULL;
-  cpi->fn_ptr[BLOCK_16X8].svf_halfpix_v  = NULL;
-  cpi->fn_ptr[BLOCK_16X8].svf_halfpix_hv = NULL;
-  cpi->fn_ptr[BLOCK_16X8].sdx3f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x3);
-  cpi->fn_ptr[BLOCK_16X8].sdx8f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x8);
-  cpi->fn_ptr[BLOCK_16X8].sdx4df         = VARIANCE_INVOKE(&cpi->rtcd.variance, sad16x8x4d);
+  BFP(BLOCK_16X8, vp8_sad16x8, vp8_variance16x8, vp8_sub_pixel_variance16x8,
+      NULL, NULL, NULL, vp8_sad16x8x3, vp8_sad16x8x8, vp8_sad16x8x4d)
 
-  cpi->fn_ptr[BLOCK_8X16].sdf            = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16);
-  cpi->fn_ptr[BLOCK_8X16].vf             = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x16);
-  cpi->fn_ptr[BLOCK_8X16].svf            = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x16);
-  cpi->fn_ptr[BLOCK_8X16].svf_halfpix_h  = NULL;
-  cpi->fn_ptr[BLOCK_8X16].svf_halfpix_v  = NULL;
-  cpi->fn_ptr[BLOCK_8X16].svf_halfpix_hv = NULL;
-  cpi->fn_ptr[BLOCK_8X16].sdx3f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x3);
-  cpi->fn_ptr[BLOCK_8X16].sdx8f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x8);
-  cpi->fn_ptr[BLOCK_8X16].sdx4df         = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x16x4d);
+  BFP(BLOCK_8X16, vp8_sad8x16, vp8_variance8x16, vp8_sub_pixel_variance8x16,
+      NULL, NULL, NULL, vp8_sad8x16x3, vp8_sad8x16x8, vp8_sad8x16x4d)
 
-  cpi->fn_ptr[BLOCK_8X8].sdf            = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8);
-  cpi->fn_ptr[BLOCK_8X8].vf             = VARIANCE_INVOKE(&cpi->rtcd.variance, var8x8);
-  cpi->fn_ptr[BLOCK_8X8].svf            = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar8x8);
-  cpi->fn_ptr[BLOCK_8X8].svf_halfpix_h  = NULL;
-  cpi->fn_ptr[BLOCK_8X8].svf_halfpix_v  = NULL;
-  cpi->fn_ptr[BLOCK_8X8].svf_halfpix_hv = NULL;
-  cpi->fn_ptr[BLOCK_8X8].sdx3f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x3);
-  cpi->fn_ptr[BLOCK_8X8].sdx8f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x8);
-  cpi->fn_ptr[BLOCK_8X8].sdx4df         = VARIANCE_INVOKE(&cpi->rtcd.variance, sad8x8x4d);
+  BFP(BLOCK_8X8, vp8_sad8x8, vp8_variance8x8, vp8_sub_pixel_variance8x8,
+      NULL, NULL, NULL, vp8_sad8x8x3, vp8_sad8x8x8, vp8_sad8x8x4d)
 
-  cpi->fn_ptr[BLOCK_4X4].sdf            = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4);
-  cpi->fn_ptr[BLOCK_4X4].vf             = VARIANCE_INVOKE(&cpi->rtcd.variance, var4x4);
-  cpi->fn_ptr[BLOCK_4X4].svf            = VARIANCE_INVOKE(&cpi->rtcd.variance, subpixvar4x4);
-  cpi->fn_ptr[BLOCK_4X4].svf_halfpix_h  = NULL;
-  cpi->fn_ptr[BLOCK_4X4].svf_halfpix_v  = NULL;
-  cpi->fn_ptr[BLOCK_4X4].svf_halfpix_hv = NULL;
-  cpi->fn_ptr[BLOCK_4X4].sdx3f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x3);
-  cpi->fn_ptr[BLOCK_4X4].sdx8f          = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x8);
-  cpi->fn_ptr[BLOCK_4X4].sdx4df         = VARIANCE_INVOKE(&cpi->rtcd.variance, sad4x4x4d);
+  BFP(BLOCK_4X4, vp8_sad4x4, vp8_variance4x4, vp8_sub_pixel_variance4x4,
+      NULL, NULL, NULL, vp8_sad4x4x3, vp8_sad4x4x8, vp8_sad4x4x4d)
 
 #if ARCH_X86 || ARCH_X86_64
-  cpi->fn_ptr[BLOCK_16X16].copymem        = VARIANCE_INVOKE(&cpi->rtcd.variance, copy32xn);
-  cpi->fn_ptr[BLOCK_16X8].copymem        = VARIANCE_INVOKE(&cpi->rtcd.variance, copy32xn);
-  cpi->fn_ptr[BLOCK_8X16].copymem        = VARIANCE_INVOKE(&cpi->rtcd.variance, copy32xn);
-  cpi->fn_ptr[BLOCK_8X8].copymem        = VARIANCE_INVOKE(&cpi->rtcd.variance, copy32xn);
-  cpi->fn_ptr[BLOCK_4X4].copymem        = VARIANCE_INVOKE(&cpi->rtcd.variance, copy32xn);
+  cpi->fn_ptr[BLOCK_16X16].copymem  = vp8_copy32xn;
+  cpi->fn_ptr[BLOCK_16X8].copymem   = vp8_copy32xn;
+  cpi->fn_ptr[BLOCK_8X16].copymem   = vp8_copy32xn;
+  cpi->fn_ptr[BLOCK_8X8].copymem    = vp8_copy32xn;
+  cpi->fn_ptr[BLOCK_4X4].copymem    = vp8_copy32xn;
 #endif
 
   cpi->full_search_sad = SEARCH_INVOKE(&cpi->rtcd.search, full_search);
@@ -2135,12 +2044,10 @@
       print_mode_context();
     }
 #endif
-#if CONFIG_NEWMVENTROPY
 #ifdef NMV_STATS
     if (cpi->pass != 1)
       print_nmvstats();
 #endif
-#endif
 
 #if CONFIG_INTERNAL_STATS
 
@@ -2369,8 +2276,7 @@
 
 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
                                  unsigned char *recon, int recon_stride,
-                                 unsigned int cols, unsigned int rows,
-                                 vp8_variance_rtcd_vtable_t *rtcd) {
+                                 unsigned int cols, unsigned int rows) {
   unsigned int row, col;
   uint64_t total_sse = 0;
   int diff;
@@ -2379,9 +2285,7 @@
     for (col = 0; col + 16 <= cols; col += 16) {
       unsigned int sse;
 
-      VARIANCE_INVOKE(rtcd, mse16x16)(orig + col, orig_stride,
-                                      recon + col, recon_stride,
-                                      &sse);
+      vp8_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
       total_sse += sse;
     }
 
@@ -2433,8 +2337,7 @@
   pkt.kind = VPX_CODEC_PSNR_PKT;
   sse = calc_plane_error(orig->y_buffer, orig->y_stride,
                          recon->y_buffer, recon->y_stride,
-                         width, height,
-                         IF_RTCD(&cpi->rtcd.variance));
+                         width, height);
   pkt.data.psnr.sse[0] = sse;
   pkt.data.psnr.sse[1] = sse;
   pkt.data.psnr.samples[0] = width * height;
@@ -2445,8 +2348,7 @@
 
   sse = calc_plane_error(orig->u_buffer, orig->uv_stride,
                          recon->u_buffer, recon->uv_stride,
-                         width, height,
-                         IF_RTCD(&cpi->rtcd.variance));
+                         width, height);
   pkt.data.psnr.sse[0] += sse;
   pkt.data.psnr.sse[2] = sse;
   pkt.data.psnr.samples[0] += width * height;
@@ -2454,8 +2356,7 @@
 
   sse = calc_plane_error(orig->v_buffer, orig->uv_stride,
                          recon->v_buffer, recon->uv_stride,
-                         width, height,
-                         IF_RTCD(&cpi->rtcd.variance));
+                         width, height);
   pkt.data.psnr.sse[0] += sse;
   pkt.data.psnr.sse[3] = sse;
   pkt.data.psnr.samples[0] += width * height;
@@ -3033,13 +2934,10 @@
 
   /* list of filters to search over */
   int mcomp_filters_to_search[] = {
-#if CONFIG_SWITCHABLE_INTERP
     EIGHTTAP, EIGHTTAP_SHARP, SIXTAP, SWITCHABLE
-#else
-    EIGHTTAP, EIGHTTAP_SHARP, SIXTAP,
-#endif
   };
-  int mcomp_filters = sizeof(mcomp_filters_to_search) / sizeof(*mcomp_filters_to_search);
+  int mcomp_filters = sizeof(mcomp_filters_to_search) /
+      sizeof(*mcomp_filters_to_search);
   int mcomp_filter_index = 0;
   INT64 mcomp_filter_cost[4];
 
@@ -3264,12 +3162,7 @@
       cm->mcomp_filter_type = mcomp_filters_to_search[0];
       mcomp_filter_index = 0;
     } else {
-#if CONFIG_SWITCHABLE_INTERP
-      cm->mcomp_filter_type = SWITCHABLE;
-#else
-      cm->mcomp_filter_type =
-          (Q < SHARP_FILTER_QTHRESH ? EIGHTTAP_SHARP : EIGHTTAP);
-#endif
+      cm->mcomp_filter_type = DEFAULT_INTERP_FILTER;
     }
     /* TODO: Decide this more intelligently */
     xd->allow_high_precision_mv = (Q < HIGH_PRECISION_MV_QTHRESH);
@@ -3427,8 +3320,7 @@
     if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
       int last_q = Q;
       int kf_err = vp8_calc_ss_err(cpi->Source,
-                                   &cm->yv12_fb[cm->new_fb_idx],
-                                   IF_RTCD(&cpi->rtcd.variance));
+                                   &cm->yv12_fb[cm->new_fb_idx]);
 
       int high_err_target = cpi->ambient_err;
       int low_err_target = (cpi->ambient_err >> 1);
@@ -3583,7 +3475,6 @@
     if (cpi->is_src_frame_alt_ref)
       Loop = FALSE;
 
-#if CONFIG_SWITCHABLE_INTERP
     if (cm->frame_type != KEY_FRAME &&
         !sf->search_best_filter &&
         cm->mcomp_filter_type == SWITCHABLE) {
@@ -3609,19 +3500,16 @@
           if (count[i]) {
             cm->mcomp_filter_type = vp8_switchable_interp[i];
             Loop = TRUE;  /* Make sure to loop since the filter changed */
-            //loop_count = -1;
             break;
           }
         }
       }
     }
-#endif
 
     if (Loop == FALSE && cm->frame_type != KEY_FRAME && sf->search_best_filter) {
       if (mcomp_filter_index < mcomp_filters) {
         INT64 err = vp8_calc_ss_err(cpi->Source,
-                                    &cm->yv12_fb[cm->new_fb_idx],
-                                    IF_RTCD(&cpi->rtcd.variance));
+                                    &cm->yv12_fb[cm->new_fb_idx]);
         INT64 rate = cpi->projected_frame_size << 8;
         mcomp_filter_cost[mcomp_filter_index] =
           (RDCOST(cpi->RDMULT, cpi->RDDIV, rate, err));
@@ -3683,8 +3571,7 @@
   // the force key frame
   if (cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0)) {
     cpi->ambient_err = vp8_calc_ss_err(cpi->Source,
-                                       &cm->yv12_fb[cm->new_fb_idx],
-                                       IF_RTCD(&cpi->rtcd.variance));
+                                       &cm->yv12_fb[cm->new_fb_idx]);
   }
 
   // This frame's MVs are saved and will be used in next frame's MV
@@ -3757,18 +3644,12 @@
 
   update_reference_frames(cm);
   vp8_copy(cpi->common.fc.coef_counts, cpi->coef_counts);
-#if CONFIG_HYBRIDTRANSFORM
   vp8_copy(cpi->common.fc.hybrid_coef_counts, cpi->hybrid_coef_counts);
-#endif
   vp8_copy(cpi->common.fc.coef_counts_8x8, cpi->coef_counts_8x8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_copy(cpi->common.fc.hybrid_coef_counts_8x8, cpi->hybrid_coef_counts_8x8);
-#endif
   vp8_copy(cpi->common.fc.coef_counts_16x16, cpi->coef_counts_16x16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_copy(cpi->common.fc.hybrid_coef_counts_16x16,
            cpi->hybrid_coef_counts_16x16);
-#endif
   vp8_adapt_coef_probs(&cpi->common);
   if (cpi->common.frame_type != KEY_FRAME) {
     vp8_copy(cpi->common.fc.ymode_counts, cpi->ymode_count);
@@ -3779,14 +3660,8 @@
     vp8_copy(cpi->common.fc.mbsplit_counts, cpi->mbsplit_count);
     vp8_adapt_mode_probs(&cpi->common);
 
-#if CONFIG_NEWMVENTROPY
     cpi->common.fc.NMVcount = cpi->NMVcount;
     vp8_adapt_nmv_probs(&cpi->common, cpi->mb.e_mbd.allow_high_precision_mv);
-#else
-    vp8_copy(cpi->common.fc.MVcount, cpi->MVcount);
-    vp8_copy(cpi->common.fc.MVcount_hp, cpi->MVcount_hp);
-    vp8_adapt_mv_probs(&cpi->common);
-#endif  /* CONFIG_NEWMVENTROPY */
     vp8_update_mode_context(&cpi->common);
   }
 
@@ -3902,8 +3777,7 @@
     vp8_clear_system_state();  // __asm emms;
 
     recon_err = vp8_calc_ss_err(cpi->Source,
-                                &cm->yv12_fb[cm->new_fb_idx],
-                                IF_RTCD(&cpi->rtcd.variance));
+                                &cm->yv12_fb[cm->new_fb_idx]);
 
     if (cpi->twopass.total_left_stats->coded_error != 0.0)
       fprintf(f, "%10d %10d %10d %10d %10d %10d %10d %10d"
@@ -4389,16 +4263,16 @@
         int64_t sq_error;
 
         ye = calc_plane_error(orig->y_buffer, orig->y_stride,
-                              recon->y_buffer, recon->y_stride, orig->y_width, orig->y_height,
-                              IF_RTCD(&cpi->rtcd.variance));
+                              recon->y_buffer, recon->y_stride, orig->y_width,
+                              orig->y_height);
 
         ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
-                              recon->u_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
-                              IF_RTCD(&cpi->rtcd.variance));
+                              recon->u_buffer, recon->uv_stride, orig->uv_width,
+                              orig->uv_height);
 
         ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
-                              recon->v_buffer, recon->uv_stride, orig->uv_width, orig->uv_height,
-                              IF_RTCD(&cpi->rtcd.variance));
+                              recon->v_buffer, recon->uv_stride, orig->uv_width,
+                              orig->uv_height);
 
         sq_error = ye + ue + ve;
 
@@ -4418,16 +4292,16 @@
           vp8_clear_system_state();
 
           ye = calc_plane_error(orig->y_buffer, orig->y_stride,
-                                pp->y_buffer, pp->y_stride, orig->y_width, orig->y_height,
-                                IF_RTCD(&cpi->rtcd.variance));
+                                pp->y_buffer, pp->y_stride, orig->y_width,
+                                orig->y_height);
 
           ue = calc_plane_error(orig->u_buffer, orig->uv_stride,
-                                pp->u_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
-                                IF_RTCD(&cpi->rtcd.variance));
+                                pp->u_buffer, pp->uv_stride, orig->uv_width,
+                                orig->uv_height);
 
           ve = calc_plane_error(orig->v_buffer, orig->uv_stride,
-                                pp->v_buffer, pp->uv_stride, orig->uv_width, orig->uv_height,
-                                IF_RTCD(&cpi->rtcd.variance));
+                                pp->v_buffer, pp->uv_stride, orig->uv_width,
+                                orig->uv_height);
 
           sq_error = ye + ue + ve;
 
@@ -4440,8 +4314,7 @@
           cpi->totalp  += frame_psnr2;
 
           frame_ssim2 = vp8_calc_ssim(cpi->Source,
-                                      &cm->post_proc_buffer, 1, &weight,
-                                      IF_RTCD(&cpi->rtcd.variance));
+                                      &cm->post_proc_buffer, 1, &weight);
 
           cpi->summed_quality += frame_ssim2 * weight;
           cpi->summed_weights += weight;
@@ -4460,7 +4333,7 @@
       if (cpi->b_calculate_ssimg) {
         double y, u, v, frame_all;
         frame_all =  vp8_calc_ssimg(cpi->Source, cm->frame_to_show,
-                                    &y, &u, &v, IF_RTCD(&cpi->rtcd.variance));
+                                    &y, &u, &v);
         cpi->total_ssimg_y += y;
         cpi->total_ssimg_u += u;
         cpi->total_ssimg_v += v;
@@ -4603,19 +4476,19 @@
 
 
 
-int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd) {
+int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest) {
   int i, j;
   int Total = 0;
 
   unsigned char *src = source->y_buffer;
   unsigned char *dst = dest->y_buffer;
-  (void)rtcd;
 
   // Loop through the Y plane raw and reconstruction data summing (square differences)
   for (i = 0; i < source->y_height; i += 16) {
     for (j = 0; j < source->y_width; j += 16) {
       unsigned int sse;
-      Total += VARIANCE_INVOKE(rtcd, mse16x16)(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
+      Total += vp8_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride,
+                            &sse);
     }
 
     src += 16 * source->y_stride;
diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h
index 1e74940..ab68025 100644
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -60,17 +60,10 @@
 #define VP8_TEMPORAL_ALT_REF 1
 
 typedef struct {
-#if CONFIG_NEWMVENTROPY
   nmv_context nmvc;
   int nmvjointcost[MV_JOINTS];
   int nmvcosts[2][MV_VALS];
   int nmvcosts_hp[2][MV_VALS];
-#else
-  MV_CONTEXT mvc[2];
-  int mvcosts[2][MVvals + 1];
-  MV_CONTEXT_HP mvc_hp[2];
-  int mvcosts_hp[2][MVvals_hp + 1];
-#endif
 
 #ifdef MODE_STATS
   // Stats
@@ -97,24 +90,18 @@
 
   vp8_prob coef_probs[BLOCK_TYPES]
       [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM
   vp8_prob hybrid_coef_probs[BLOCK_TYPES]
       [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES];
-#endif
 
   vp8_prob coef_probs_8x8[BLOCK_TYPES_8X8]
       [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_prob hybrid_coef_probs_8x8[BLOCK_TYPES_8X8]
       [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES];
-#endif
 
   vp8_prob coef_probs_16x16[BLOCK_TYPES_16X16]
       [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES];
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_prob hybrid_coef_probs_16x16[BLOCK_TYPES_16X16]
       [COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES];
-#endif
 
   vp8_prob ymode_prob [VP8_YMODES - 1]; /* interframe intra mode probs */
   vp8_prob uv_mode_prob [VP8_YMODES][VP8_UV_MODES - 1];
@@ -123,10 +110,8 @@
   vp8_prob sub_mv_ref_prob [SUBMVREF_COUNT][VP8_SUBMVREFS - 1];
   vp8_prob mbsplit_prob [VP8_NUMMBSPLITS - 1];
 
-#if CONFIG_SWITCHABLE_INTERP
   vp8_prob switchable_interp_prob[VP8_SWITCHABLE_FILTERS + 1]
                                  [VP8_SWITCHABLE_FILTERS - 1];
-#endif
 
   int mv_ref_ct[6][4][2];
   int mode_context[6][4];
@@ -365,7 +350,6 @@
 
 typedef struct VP8_ENCODER_RTCD {
   VP8_COMMON_RTCD            *common;
-  vp8_variance_rtcd_vtable_t  variance;
   vp8_fdct_rtcd_vtable_t      fdct;
   vp8_encodemb_rtcd_vtable_t  encodemb;
   vp8_search_rtcd_vtable_t    search;
@@ -373,10 +357,10 @@
 } VP8_ENCODER_RTCD;
 
 enum {
-  BLOCK_16X8,
-  BLOCK_8X16,
-  BLOCK_8X8,
-  BLOCK_4X4,
+  BLOCK_16X8 = PARTITIONING_16X8,
+  BLOCK_8X16 = PARTITIONING_8X16,
+  BLOCK_8X8 = PARTITIONING_8X8,
+  BLOCK_4X4 = PARTITIONING_4X4,
   BLOCK_16X16,
   BLOCK_MAX_SEGMENTS,
   BLOCK_32X32 = BLOCK_MAX_SEGMENTS,
@@ -420,9 +404,6 @@
 
   MACROBLOCK mb;
   VP8_COMMON common;
-  vp8_writer bc, bc2;
-  // bool_writer *bc2;
-
   VP8_CONFIG oxcf;
 
   struct lookahead_ctx    *lookahead;
@@ -468,13 +449,11 @@
   int rd_prediction_type_threshes[4][NB_PREDICTION_TYPES];
   int comp_pred_count[COMP_PRED_CONTEXTS];
   int single_pred_count[COMP_PRED_CONTEXTS];
-#if CONFIG_TX_SELECT
   // FIXME contextualize
   int txfm_count[TX_SIZE_MAX];
   int txfm_count_8x8p[TX_SIZE_MAX - 1];
   int64_t rd_tx_select_diff[NB_TXFM_MODES];
   int rd_tx_select_threshes[4][NB_TXFM_MODES];
-#endif
 
   int RDMULT;
   int RDDIV;
@@ -566,39 +545,28 @@
   // int uv_mode_count[VP8_UV_MODES];       /* intra MB type cts this frame */
   int y_uv_mode_count[VP8_YMODES][VP8_UV_MODES];
 
-#if CONFIG_NEWMVENTROPY
   nmv_context_counts NMVcount;
-#else
-  unsigned int MVcount [2] [MVvals];  /* (row,col) MV cts this frame */
-  unsigned int MVcount_hp [2] [MVvals_hp];  /* (row,col) MV cts this frame */
-#endif
 
   unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];  /* for this frame */
   vp8_prob frame_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
   unsigned int frame_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
-#if CONFIG_HYBRIDTRANSFORM
   unsigned int hybrid_coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];  /* for this frame */
   vp8_prob frame_hybrid_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
   unsigned int frame_hybrid_branch_ct [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
-#endif
 
   unsigned int coef_counts_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];  /* for this frame */
   vp8_prob frame_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
   unsigned int frame_branch_ct_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
-#if CONFIG_HYBRIDTRANSFORM8X8
   unsigned int hybrid_coef_counts_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];  /* for this frame */
   vp8_prob frame_hybrid_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
   unsigned int frame_hybrid_branch_ct_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
-#endif
 
   unsigned int coef_counts_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];  /* for this frame */
   vp8_prob frame_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
   unsigned int frame_branch_ct_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
-#if CONFIG_HYBRIDTRANSFORM16X16
   unsigned int hybrid_coef_counts_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];  /* for this frame */
   vp8_prob frame_hybrid_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
   unsigned int frame_hybrid_branch_ct_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES][2];
-#endif
 
   int gfu_boost;
   int last_boost;
@@ -783,10 +751,8 @@
   int pred_filter_on_count;
   int pred_filter_off_count;
 #endif
-#if CONFIG_SWITCHABLE_INTERP
-  unsigned int switchable_interp_count[VP8_SWITCHABLE_FILTERS+1]
+  unsigned int switchable_interp_count[VP8_SWITCHABLE_FILTERS + 1]
                                       [VP8_SWITCHABLE_FILTERS];
-#endif
 
 #if CONFIG_NEW_MVREF
   unsigned int best_ref_index_counts[MAX_MV_REFS];
diff --git a/vp8/encoder/picklpf.c b/vp8/encoder/picklpf.c
index 9549978..57bd414 100644
--- a/vp8/encoder/picklpf.c
+++ b/vp8/encoder/picklpf.c
@@ -21,7 +21,8 @@
 #include "vpx_ports/arm.h"
 #endif
 
-extern int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd);
+extern int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source,
+                           YV12_BUFFER_CONFIG *dest);
 #if HAVE_ARMV7
 extern void vp8_yv12_copy_frame_yonly_no_extend_frame_borders_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc);
 #endif
@@ -71,7 +72,8 @@
 
   vpx_memcpy(dst_y, src_y, ystride * (linestocopy + 16));
 }
-static int vp8_calc_partial_ssl_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, int Fraction, const vp8_variance_rtcd_vtable_t *rtcd) {
+static int vp8_calc_partial_ssl_err(YV12_BUFFER_CONFIG *source,
+                                    YV12_BUFFER_CONFIG *dest, int Fraction) {
   int i, j;
   int Total = 0;
   int srcoffset, dstoffset;
@@ -79,7 +81,6 @@
   unsigned char *dst = dest->y_buffer;
 
   int linestocopy = (source->y_height >> (Fraction + 4));
-  (void)rtcd;
 
   if (linestocopy < 1)
     linestocopy = 1;
@@ -97,7 +98,8 @@
   for (i = 0; i < linestocopy; i += 16) {
     for (j = 0; j < source->y_width; j += 16) {
       unsigned int sse;
-      Total += VARIANCE_INVOKE(rtcd, mse16x16)(src + j, source->y_stride, dst + j, dest->y_stride, &sse);
+      Total += vp8_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride,
+                            &sse);
     }
 
     src += 16 * source->y_stride;
@@ -179,7 +181,7 @@
   // Get the err using the previous frame's filter value.
   vp8_loop_filter_partial_frame(cm, &cpi->mb.e_mbd, filt_val);
 
-  best_err = vp8_calc_partial_ssl_err(sd, cm->frame_to_show, 3, IF_RTCD(&cpi->rtcd.variance));
+  best_err = vp8_calc_partial_ssl_err(sd, cm->frame_to_show, 3);
 
   //  Re-instate the unfiltered frame
   vp8_yv12_copy_partial_frame_ptr(&cpi->last_frame_uf, cm->frame_to_show, 3);
@@ -192,7 +194,7 @@
     vp8_loop_filter_partial_frame(cm, &cpi->mb.e_mbd, filt_val);
 
     // Get the err for filtered frame
-    filt_err = vp8_calc_partial_ssl_err(sd, cm->frame_to_show, 3, IF_RTCD(&cpi->rtcd.variance));
+    filt_err = vp8_calc_partial_ssl_err(sd, cm->frame_to_show, 3);
 
     //  Re-instate the unfiltered frame
     vp8_yv12_copy_partial_frame_ptr(&cpi->last_frame_uf, cm->frame_to_show, 3);
@@ -221,7 +223,7 @@
       vp8_loop_filter_partial_frame(cm, &cpi->mb.e_mbd, filt_val);
 
       // Get the err for filtered frame
-      filt_err = vp8_calc_partial_ssl_err(sd, cm->frame_to_show, 3, IF_RTCD(&cpi->rtcd.variance));
+      filt_err = vp8_calc_partial_ssl_err(sd, cm->frame_to_show, 3);
 
       //  Re-instate the unfiltered frame
       vp8_yv12_copy_partial_frame_ptr(&cpi->last_frame_uf, cm->frame_to_show, 3);
@@ -308,7 +310,7 @@
   vp8cx_set_alt_lf_level(cpi, filt_mid);
   vp8_loop_filter_frame_segment(cm, &cpi->mb.e_mbd, filt_mid, segment);
 
-  best_err = vp8_calc_ss_err(sd, cm->frame_to_show, IF_RTCD(&cpi->rtcd.variance));
+  best_err = vp8_calc_ss_err(sd, cm->frame_to_show);
   filt_best = filt_mid;
 
   //  Re-instate the unfiltered frame
@@ -348,7 +350,7 @@
       vp8cx_set_alt_lf_level(cpi, filt_low);
       vp8_loop_filter_frame_segment(cm, &cpi->mb.e_mbd, filt_low, segment);
 
-      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show, IF_RTCD(&cpi->rtcd.variance));
+      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show);
 
       //  Re-instate the unfiltered frame
 #if HAVE_ARMV7
@@ -383,7 +385,7 @@
       vp8cx_set_alt_lf_level(cpi, filt_high);
       vp8_loop_filter_frame_segment(cm, &cpi->mb.e_mbd, filt_high, segment);
 
-      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show, IF_RTCD(&cpi->rtcd.variance));
+      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show);
 
       //  Re-instate the unfiltered frame
 #if HAVE_ARMV7
@@ -517,7 +519,7 @@
   vp8cx_set_alt_lf_level(cpi, filt_mid);
   vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_mid);
 
-  best_err = vp8_calc_ss_err(sd, cm->frame_to_show, IF_RTCD(&cpi->rtcd.variance));
+  best_err = vp8_calc_ss_err(sd, cm->frame_to_show);
   filt_best = filt_mid;
 
   //  Re-instate the unfiltered frame
@@ -557,7 +559,7 @@
       vp8cx_set_alt_lf_level(cpi, filt_low);
       vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_low);
 
-      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show, IF_RTCD(&cpi->rtcd.variance));
+      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show);
 
       //  Re-instate the unfiltered frame
 #if HAVE_ARMV7
@@ -592,7 +594,7 @@
       vp8cx_set_alt_lf_level(cpi, filt_high);
       vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_high);
 
-      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show, IF_RTCD(&cpi->rtcd.variance));
+      filt_err = vp8_calc_ss_err(sd, cm->frame_to_show);
 
       //  Re-instate the unfiltered frame
 #if HAVE_ARMV7
diff --git a/vp8/encoder/quantize.c b/vp8/encoder/quantize.c
index 8ae3029..16b4e6e 100644
--- a/vp8/encoder/quantize.c
+++ b/vp8/encoder/quantize.c
@@ -21,8 +21,7 @@
 extern int enc_debug;
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM
-void vp8_ht_quantize_b_4x4(BLOCK *b, BLOCKD *d) {
+void vp8_ht_quantize_b_4x4(BLOCK *b, BLOCKD *d, TX_TYPE tx_type) {
   int i, rc, eob;
   int zbin;
   int x, y, z, sz;
@@ -39,7 +38,7 @@
 
   int const *pt_scan ;
 
-  switch(d->bmi.as_mode.tx_type) {
+  switch (tx_type) {
     case ADST_DCT :
       pt_scan = vp8_row_scan;
       break;
@@ -85,7 +84,6 @@
 
   d->eob = eob + 1;
 }
-#endif
 
 void vp8_regular_quantize_b_4x4(BLOCK *b, BLOCKD *d) {
   int i, rc, eob;
@@ -653,12 +651,12 @@
   }
 
   /* save this macroblock QIndex for vp8_update_zbin_extra() */
-  x->q_index = QIndex;
+  x->e_mbd.q_index = QIndex;
 }
 
 void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x) {
   int i;
-  int QIndex = x->q_index;
+  int QIndex = x->e_mbd.q_index;
   int zbin_extra;
 
   // Y
diff --git a/vp8/encoder/quantize.h b/vp8/encoder/quantize.h
index ad3a3fc..e39433f 100644
--- a/vp8/encoder/quantize.h
+++ b/vp8/encoder/quantize.h
@@ -30,9 +30,9 @@
 #include "arm/quantize_arm.h"
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM
-extern prototype_quantize_block(vp8_ht_quantize_b_4x4);
-#endif
+#define prototype_quantize_block_type(sym) \
+  void (sym)(BLOCK *b, BLOCKD *d, TX_TYPE type)
+extern prototype_quantize_block_type(vp8_ht_quantize_b_4x4);
 
 #ifndef vp8_quantize_quantb_4x4
 #define vp8_quantize_quantb_4x4 vp8_regular_quantize_b_4x4
diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c
index 2b5f699..cc3c82e 100644
--- a/vp8/encoder/ratectrl.c
+++ b/vp8/encoder/ratectrl.c
@@ -123,7 +123,7 @@
 
 
 void vp8_save_coding_context(VP8_COMP *cpi) {
-  CODING_CONTEXT *const cc = & cpi->coding_context;
+  CODING_CONTEXT *const cc = &cpi->coding_context;
   VP8_COMMON *cm = &cpi->common;
   MACROBLOCKD *xd = &cpi->mb.e_mbd;
 
@@ -132,17 +132,10 @@
   // intended for use in a re-code loop in vp8_compress_frame where the
   // quantizer value is adjusted between loop iterations.
 
-#if CONFIG_NEWMVENTROPY
   cc->nmvc = cm->fc.nmvc;
   vp8_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
   vp8_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
   vp8_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);
-#else
-  vp8_copy(cc->mvc,      cm->fc.mvc);
-  vp8_copy(cc->mvcosts,  cpi->mb.mvcosts);
-  vp8_copy(cc->mvc_hp,     cm->fc.mvc_hp);
-  vp8_copy(cc->mvcosts_hp,  cpi->mb.mvcosts_hp);
-#endif
 
   vp8_copy(cc->mv_ref_ct, cm->fc.mv_ref_ct);
   vp8_copy(cc->mode_context, cm->fc.mode_context);
@@ -178,41 +171,26 @@
   vp8_copy(cc->last_mode_lf_deltas, xd->last_mode_lf_deltas);
 
   vp8_copy(cc->coef_probs, cm->fc.coef_probs);
-#if CONFIG_HYBRIDTRANSFORM
   vp8_copy(cc->hybrid_coef_probs, cm->fc.hybrid_coef_probs);
-#endif
   vp8_copy(cc->coef_probs_8x8, cm->fc.coef_probs_8x8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_copy(cc->hybrid_coef_probs_8x8, cm->fc.hybrid_coef_probs_8x8);
-#endif
   vp8_copy(cc->coef_probs_16x16, cm->fc.coef_probs_16x16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_copy(cc->hybrid_coef_probs_16x16, cm->fc.hybrid_coef_probs_16x16);
-#endif
-#if CONFIG_SWITCHABLE_INTERP
   vp8_copy(cc->switchable_interp_prob, cm->fc.switchable_interp_prob);
-#endif
 }
 
 void vp8_restore_coding_context(VP8_COMP *cpi) {
-  CODING_CONTEXT *const cc = & cpi->coding_context;
+  CODING_CONTEXT *const cc = &cpi->coding_context;
   VP8_COMMON *cm = &cpi->common;
   MACROBLOCKD *xd = &cpi->mb.e_mbd;
 
   // Restore key state variables to the snapshot state stored in the
   // previous call to vp8_save_coding_context.
 
-#if CONFIG_NEWMVENTROPY
   cm->fc.nmvc = cc->nmvc;
   vp8_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
   vp8_copy(cpi->mb.nmvcosts, cc->nmvcosts);
   vp8_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
-#else
-  vp8_copy(cm->fc.mvc, cc->mvc);
-  vp8_copy(cpi->mb.mvcosts, cc->mvcosts);
-  vp8_copy(cm->fc.mvc_hp, cc->mvc_hp);
-  vp8_copy(cpi->mb.mvcosts_hp, cc->mvcosts_hp);
-#endif
 
   vp8_copy(cm->fc.mv_ref_ct, cc->mv_ref_ct);
   vp8_copy(cm->fc.mode_context, cc->mode_context);
@@ -249,20 +227,12 @@
   vp8_copy(xd->last_mode_lf_deltas, cc->last_mode_lf_deltas);
 
   vp8_copy(cm->fc.coef_probs, cc->coef_probs);
-#if CONFIG_HYBRIDTRANSFORM
   vp8_copy(cm->fc.hybrid_coef_probs, cc->hybrid_coef_probs);
-#endif
   vp8_copy(cm->fc.coef_probs_8x8, cc->coef_probs_8x8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   vp8_copy(cm->fc.hybrid_coef_probs_8x8, cc->hybrid_coef_probs_8x8);
-#endif
   vp8_copy(cm->fc.coef_probs_16x16, cc->coef_probs_16x16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   vp8_copy(cm->fc.hybrid_coef_probs_16x16, cc->hybrid_coef_probs_16x16);
-#endif
-#if CONFIG_SWITCHABLE_INTERP
   vp8_copy(cm->fc.switchable_interp_prob, cc->switchable_interp_prob);
-#endif
 }
 
 
@@ -275,16 +245,6 @@
   vp8_default_bmode_probs(cm->fc.bmode_prob);
 
   vp8_init_mv_probs(& cpi->common);
-#if CONFIG_NEWMVENTROPY == 0
-  /* this is not really required */
-  {
-    int flag[2] = {1, 1};
-    vp8_build_component_cost_table(
-        cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag);
-    vp8_build_component_cost_table_hp(
-        cpi->mb.mvcost_hp, (const MV_CONTEXT_HP *) cpi->common.fc.mvc_hp, flag);
-  }
-#endif
 
   // cpi->common.filter_level = 0;      // Reset every key frame.
   cpi->common.filter_level = cpi->common.base_qindex * 3 / 8;
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index c82a87d..97a38dd 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -60,10 +60,8 @@
 
 #define INVALID_MV 0x80008000
 
-#if CONFIG_SWITCHABLE_INTERP
 /* Factor to weigh the rate for switchable interp filters */
 #define SWITCHABLE_INTERP_RATE_FACTOR 1
-#endif
 
 static const int auto_speed_thresh[17] = {
   1000,
@@ -355,37 +353,31 @@
     cpi->mb.token_costs[TX_4X4],
     (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11]) cpi->common.fc.coef_probs,
     BLOCK_TYPES);
-#if CONFIG_HYBRIDTRANSFORM
   fill_token_costs(
     cpi->mb.hybrid_token_costs[TX_4X4],
     (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11])
     cpi->common.fc.hybrid_coef_probs,
     BLOCK_TYPES);
-#endif
 
   fill_token_costs(
     cpi->mb.token_costs[TX_8X8],
     (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11]) cpi->common.fc.coef_probs_8x8,
     BLOCK_TYPES_8X8);
-#if CONFIG_HYBRIDTRANSFORM8X8
   fill_token_costs(
     cpi->mb.hybrid_token_costs[TX_8X8],
     (const vp8_prob( *)[8][PREV_COEF_CONTEXTS][11])
     cpi->common.fc.hybrid_coef_probs_8x8,
     BLOCK_TYPES_8X8);
-#endif
 
   fill_token_costs(
     cpi->mb.token_costs[TX_16X16],
     (const vp8_prob(*)[8][PREV_COEF_CONTEXTS][11]) cpi->common.fc.coef_probs_16x16,
     BLOCK_TYPES_16X16);
-#if CONFIG_HYBRIDTRANSFORM16X16
   fill_token_costs(
     cpi->mb.hybrid_token_costs[TX_16X16],
     (const vp8_prob(*)[8][PREV_COEF_CONTEXTS][11])
     cpi->common.fc.hybrid_coef_probs_16x16,
     BLOCK_TYPES_16X16);
-#endif
 
   /*rough estimate for costing*/
   cpi->common.kf_ymode_probs_index = cpi->common.base_qindex >> 4;
@@ -393,14 +385,12 @@
 
   if (cpi->common.frame_type != KEY_FRAME)
   {
-#if CONFIG_NEWMVENTROPY
     vp8_build_nmv_cost_table(
         cpi->mb.nmvjointcost,
         cpi->mb.e_mbd.allow_high_precision_mv ?
         cpi->mb.nmvcost_hp : cpi->mb.nmvcost,
         &cpi->common.fc.nmvc,
         cpi->mb.e_mbd.allow_high_precision_mv, 1, 1);
-#endif
   }
 }
 
@@ -409,19 +399,6 @@
 
   milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_used) / 16;
 
-#if 0
-
-  if (0) {
-    FILE *f;
-
-    f = fopen("speed.stt", "a");
-    fprintf(f, " %8ld %10ld %10ld %10ld\n",
-            cpi->common.current_video_frame, cpi->Speed, milliseconds_for_compress, cpi->avg_pick_mode_time);
-    fclose(f);
-  }
-
-#endif
-
   /*
   // this is done during parameter valid check
   if( cpi->oxcf.cpu_used > 16)
@@ -520,7 +497,7 @@
   return error;
 }
 
-int VP8_UVSSE(MACROBLOCK *x, const vp8_variance_rtcd_vtable_t *rtcd) {
+int vp8_uvsse(MACROBLOCK *x) {
   unsigned char *uptr, *vptr;
   unsigned char *upred_ptr = (*(x->block[16].base_src) + x->block[16].src);
   unsigned char *vpred_ptr = (*(x->block[20].base_src) + x->block[20].src);
@@ -551,16 +528,14 @@
   vptr = x->e_mbd.pre.v_buffer + offset;
 
   if ((mv_row | mv_col) & 7) {
-    VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride,
-                                        (mv_col & 7) << 1, (mv_row & 7) << 1, upred_ptr, uv_stride, &sse2);
-    VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride,
-                                        (mv_col & 7) << 1, (mv_row & 7) << 1, vpred_ptr, uv_stride, &sse1);
+    vp8_sub_pixel_variance8x8(uptr, pre_stride, (mv_col & 7) << 1,
+                              (mv_row & 7) << 1, upred_ptr, uv_stride, &sse2);
+    vp8_sub_pixel_variance8x8(vptr, pre_stride, (mv_col & 7) << 1,
+                              (mv_row & 7) << 1, vpred_ptr, uv_stride, &sse1);
     sse2 += sse1;
   } else {
-    VARIANCE_INVOKE(rtcd, var8x8)(uptr, pre_stride,
-                                  upred_ptr, uv_stride, &sse2);
-    VARIANCE_INVOKE(rtcd, var8x8)(vptr, pre_stride,
-                                  vpred_ptr, uv_stride, &sse1);
+    vp8_variance8x8(uptr, pre_stride, upred_ptr, uv_stride, &sse2);
+    vp8_variance8x8(vptr, pre_stride, vpred_ptr, uv_stride, &sse1);
     sse2 += sse1;
   }
   return sse2;
@@ -607,9 +582,7 @@
   short *qcoeff_ptr = b->qcoeff;
   MACROBLOCKD *xd = &mb->e_mbd;
   MB_MODE_INFO *mbmi = &mb->e_mbd.mode_info_context->mbmi;
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
   TX_TYPE tx_type = DCT_DCT;
-#endif
   int segment_id = mbmi->segment_id;
 
   switch (tx_size) {
@@ -617,55 +590,47 @@
       scan = vp8_default_zig_zag1d;
       band = vp8_coef_bands;
       default_eob = 16;
-#if CONFIG_HYBRIDTRANSFORM
-      if (type == PLANE_TYPE_Y_WITH_DC &&
-          mb->q_index < ACTIVE_HT &&
-          mbmi->mode == B_PRED) {
-        tx_type = b->bmi.as_mode.tx_type;
-        switch (tx_type) {
-          case ADST_DCT:
-            scan = vp8_row_scan;
-            break;
+      if (type == PLANE_TYPE_Y_WITH_DC) {
+        tx_type = get_tx_type_4x4(xd, b);
+        if (tx_type != DCT_DCT) {
+          switch (tx_type) {
+            case ADST_DCT:
+              scan = vp8_row_scan;
+              break;
 
-          case DCT_ADST:
-            scan = vp8_col_scan;
-            break;
+            case DCT_ADST:
+              scan = vp8_col_scan;
+              break;
 
-          default:
-            scan = vp8_default_zig_zag1d;
-            break;
+            default:
+              scan = vp8_default_zig_zag1d;
+              break;
+          }
         }
-
       }
-#endif
+
       break;
     case TX_8X8:
       scan = vp8_default_zig_zag1d_8x8;
       band = vp8_coef_bands_8x8;
       default_eob = 64;
-#if CONFIG_HYBRIDTRANSFORM8X8
-      {
+      if (type == PLANE_TYPE_Y_WITH_DC) {
         BLOCKD *bb;
         int ib = (b - xd->block);
         if (ib < 16) {
           ib = (ib & 8) + ((ib & 4) >> 1);
           bb = xd->block + ib;
-          if (mbmi->mode == I8X8_PRED)
-            tx_type = bb->bmi.as_mode.tx_type;
+          tx_type = get_tx_type_8x8(xd, bb);
         }
       }
-#endif
       break;
     case TX_16X16:
       scan = vp8_default_zig_zag1d_16x16;
       band = vp8_coef_bands_16x16;
       default_eob = 256;
-#if CONFIG_HYBRIDTRANSFORM16X16
-      if (type == PLANE_TYPE_Y_WITH_DC &&
-          mbmi->mode < I8X8_PRED &&
-          mb->q_index < ACTIVE_HT16)
-          tx_type = b->bmi.as_mode.tx_type;
-#endif
+      if (type == PLANE_TYPE_Y_WITH_DC) {
+        tx_type = get_tx_type_16x16(xd, b);
+      }
       break;
     default:
       break;
@@ -675,11 +640,8 @@
   else
     seg_eob = default_eob;
 
-  //mbmi->mode = mode;
-
   VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
 
-#if CONFIG_HYBRIDTRANSFORM || CONFIG_HYBRIDTRANSFORM8X8 || CONFIG_HYBRIDTRANSFORM16X16
   if (tx_type != DCT_DCT) {
     for (; c < eob; c++) {
       int v = qcoeff_ptr[scan[c]];
@@ -691,9 +653,7 @@
     if (c < seg_eob)
       cost += mb->hybrid_token_costs[tx_size][type][band[c]]
           [pt][DCT_EOB_TOKEN];
-  } else
-#endif
-  {
+  } else {
     for (; c < eob; c++) {
       int v = qcoeff_ptr[scan[c]];
       int t = vp8_dct_value_tokens_ptr[v].Token;
@@ -871,6 +831,10 @@
 static void macro_block_yrd_16x16(MACROBLOCK *mb, int *Rate, int *Distortion,
                                   const VP8_ENCODER_RTCD *rtcd, int *skippable) {
   int d;
+  MACROBLOCKD *xd = &mb->e_mbd;
+  BLOCKD *b  = &mb->e_mbd.block[0];
+  BLOCK  *be = &mb->block[0];
+  TX_TYPE tx_type;
 
   ENCODEMB_INVOKE(&rtcd->encodemb, submby)(
     mb->src_diff,
@@ -878,27 +842,18 @@
     mb->e_mbd.predictor,
     mb->block[0].src_stride);
 
-#if CONFIG_HYBRIDTRANSFORM16X16
-  if ((mb->e_mbd.mode_info_context->mbmi.mode < I8X8_PRED) &&
-      (mb->q_index < ACTIVE_HT16)) {
-    BLOCKD *b  = &mb->e_mbd.block[0];
-    BLOCK  *be = &mb->block[0];
-    txfm_map(b, pred_mode_conv(mb->e_mbd.mode_info_context->mbmi.mode));
-    vp8_fht_c(be->src_diff, be->coeff, 32, b->bmi.as_mode.tx_type, 16);
+  tx_type = get_tx_type_16x16(xd, b);
+  if (tx_type != DCT_DCT) {
+    vp8_fht_c(be->src_diff, be->coeff, 32, tx_type, 16);
   } else
     vp8_transform_mby_16x16(mb);
-#else
-  vp8_transform_mby_16x16(mb);
-#endif
 
   vp8_quantize_mby_16x16(mb);
-#if CONFIG_HYBRIDTRANSFORM16X16
   // TODO(jingning) is it possible to quickly determine whether to force
   //                trailing coefficients to be zero, instead of running trellis
   //                optimization in the rate-distortion optimization loop?
   if (mb->e_mbd.mode_info_context->mbmi.mode < I8X8_PRED)
     vp8_optimize_mby_16x16(mb, rtcd);
-#endif
 
   d = ENCODEMB_INVOKE(&rtcd->encodemb, mberr)(mb, 0);
 
@@ -914,8 +869,6 @@
   VP8_COMMON *cm = &cpi->common;
   MB_MODE_INFO *mbmi = &x->e_mbd.mode_info_context->mbmi;
 
-#if CONFIG_TX_SELECT
-
   MACROBLOCKD *xd = &x->e_mbd;
   int can_skip = cm->mb_no_coeff_skip;
   vp8_prob skip_prob = can_skip ? get_pred_prob(cm, xd, PRED_MBSKIP) : 128;
@@ -1023,25 +976,6 @@
   else
     txfm_cache[TX_MODE_SELECT] = rd4x4s < rd8x8s ? rd4x4s : rd8x8s;
 
-#else /* CONFIG_TX_SELECT */
-
-  switch (cpi->common.txfm_mode) {
-    case ALLOW_16X16:
-      macro_block_yrd_16x16(x, rate, distortion, IF_RTCD(&cpi->rtcd), skippable);
-      mbmi->txfm_size = TX_16X16;
-      break;
-    case ALLOW_8X8:
-      macro_block_yrd_8x8(x, rate, distortion, IF_RTCD(&cpi->rtcd), skippable);
-      mbmi->txfm_size = TX_8X8;
-      break;
-    default:
-    case ONLY_4X4:
-      macro_block_yrd_4x4(x, rate, distortion, IF_RTCD(&cpi->rtcd), skippable);
-      mbmi->txfm_size = TX_4X4;
-      break;
-  }
-
-#endif /* CONFIG_TX_SELECT */
 }
 
 static void copy_predictor(unsigned char *dst, const unsigned char *predictor) {
@@ -1145,12 +1079,7 @@
                                      int *bestrate, int *bestratey,
                                      int *bestdistortion) {
   B_PREDICTION_MODE mode;
-
-#if CONFIG_HYBRIDTRANSFORM
-  int QIndex = x->q_index;
-  int active_ht = (QIndex < ACTIVE_HT);
-  TX_TYPE best_tx_type;
-#endif
+  MACROBLOCKD *xd = &x->e_mbd;
 
 #if CONFIG_COMP_INTRA_PRED
   B_PREDICTION_MODE mode2;
@@ -1161,6 +1090,8 @@
 
   ENTROPY_CONTEXT ta = *a, tempa = *a;
   ENTROPY_CONTEXT tl = *l, templ = *l;
+  TX_TYPE tx_type = DCT_DCT;
+  TX_TYPE best_tx_type = DCT_DCT;
   /*
    * The predictor buffer is a 2d buffer with a stride of 16.  Create
    * a temp buffer that meets the stride requirements, but we are only
@@ -1177,11 +1108,6 @@
       int64_t this_rd;
       int ratey;
 
-      // TODO Temporarily ignore modes that need the above-right data. SB
-      // encoding means this data is not available for the bottom right MB
-      // Do we need to do this for mode2 also?
-      if (mode == B_LD_PRED || mode == B_VL_PRED)
-        continue;
       b->bmi.as_mode.first = mode;
       rate = bmode_costs[mode];
 
@@ -1197,48 +1123,42 @@
 #endif
       ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), subb)(be, b, 16);
 
-#if CONFIG_HYBRIDTRANSFORM
-      if (active_ht) {
-        txfm_map(b, mode);
-        vp8_fht_c(be->src_diff, be->coeff, 32, b->bmi.as_mode.tx_type, 4);
-        vp8_ht_quantize_b_4x4(be, b);
+      b->bmi.as_mode.first = mode;
+      tx_type = get_tx_type_4x4(xd, b);
+      if (tx_type != DCT_DCT) {
+        vp8_fht_c(be->src_diff, be->coeff, 32, tx_type, 4);
+        vp8_ht_quantize_b_4x4(be, b, tx_type);
       } else {
         x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32);
         x->quantize_b_4x4(be, b);
       }
-#else
-        x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32);
-        x->quantize_b_4x4(be, b);
-#endif
 
-        tempa = ta;
-        templ = tl;
+      tempa = ta;
+      templ = tl;
 
-        ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ, TX_4X4);
-        rate += ratey;
-        distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(
-            be->coeff, b->dqcoeff, 16) >> 2;
+      ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ, TX_4X4);
+      rate += ratey;
+      distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(
+          be->coeff, b->dqcoeff, 16) >> 2;
 
-        this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
+      this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
 
-        if (this_rd < best_rd) {
-          *bestrate = rate;
-          *bestratey = ratey;
-          *bestdistortion = distortion;
-          best_rd = this_rd;
-          *best_mode = mode;
-#if CONFIG_HYBRIDTRANSFORM
-          best_tx_type = b->bmi.as_mode.tx_type ;
-#endif
+      if (this_rd < best_rd) {
+        *bestrate = rate;
+        *bestratey = ratey;
+        *bestdistortion = distortion;
+        best_rd = this_rd;
+        *best_mode = mode;
+        best_tx_type = tx_type;
 
 #if CONFIG_COMP_INTRA_PRED
-          *best_second_mode = mode2;
+        *best_second_mode = mode2;
 #endif
-          *a = tempa;
-          *l = templ;
-          copy_predictor(best_predictor, b->predictor);
-          vpx_memcpy(best_dqcoeff, b->dqcoeff, 32);
-        }
+        *a = tempa;
+        *l = templ;
+        copy_predictor(best_predictor, b->predictor);
+        vpx_memcpy(best_dqcoeff, b->dqcoeff, 32);
+      }
 #if CONFIG_COMP_INTRA_PRED
     }
 #endif
@@ -1248,18 +1168,12 @@
   b->bmi.as_mode.second = (B_PREDICTION_MODE)(*best_second_mode);
 #endif
 
-#if CONFIG_HYBRIDTRANSFORM
-  b->bmi.as_mode.tx_type = best_tx_type;
-
   // inverse transform
-  if (active_ht)
-    vp8_ihtllm_c(best_dqcoeff, b->diff, 32, b->bmi.as_mode.tx_type, 4);
+  if (best_tx_type != DCT_DCT)
+    vp8_ihtllm_c(best_dqcoeff, b->diff, 32, best_tx_type, 4);
   else
-    IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff,
-                                                                b->diff, 32);
-#else
-  IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff, 32);
-#endif
+    IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(
+        best_dqcoeff, b->diff, 32);
 
   vp8_recon_b(best_predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
 
@@ -1295,12 +1209,11 @@
     tl = (ENTROPY_CONTEXT *)&t_left;
   }
 
-  // TODO(agrange)
-  // vp8_intra_prediction_down_copy(xd);
-
   xd->mode_info_context->mbmi.mode = B_PRED;
   bmode_costs = mb->inter_bmode_costs;
 
+  vp8_intra_prediction_down_copy(xd);
+
   for (i = 0; i < 16; i++) {
     MODE_INFO *const mic = xd->mode_info_context;
     const int mis = xd->mode_info_stride;
@@ -1413,14 +1326,9 @@
   int64_t this_rd;
   MACROBLOCKD *xd = &x->e_mbd;
 
-#if CONFIG_HYBRIDTRANSFORM16X16
-  int best_txtype, rd_txtype;
-#endif
-#if CONFIG_TX_SELECT
   int i;
   for (i = 0; i < NB_TXFM_MODES; i++)
     txfm_cache[i] = INT64_MAX;
-#endif
 
   // Y Search for 16x16 intra prediction mode
   for (mode = DC_PRED; mode <= TM_PRED; mode++) {
@@ -1449,9 +1357,6 @@
 
       this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
 
-#if CONFIG_HYBRIDTRANSFORM16X16
-      rd_txtype = x->e_mbd.block[0].bmi.as_mode.tx_type;
-#endif
 
       if (this_rd < best_rd) {
         mode_selected = mode;
@@ -1463,13 +1368,9 @@
         *Rate = rate;
         *rate_y = ratey;
         *Distortion = distortion;
-#if CONFIG_HYBRIDTRANSFORM16X16
-        best_txtype = rd_txtype;
-#endif
         *skippable = skip;
       }
 
-#if CONFIG_TX_SELECT
       for (i = 0; i < NB_TXFM_MODES; i++) {
         int64_t adj_rd = this_rd + local_txfm_cache[i] -
                           local_txfm_cache[cpi->common.txfm_mode];
@@ -1477,7 +1378,6 @@
           txfm_cache[i] = adj_rd;
         }
       }
-#endif
 
 #if CONFIG_COMP_INTRA_PRED
     }
@@ -1486,9 +1386,6 @@
 
   mbmi->txfm_size = txfm_size;
   mbmi->mode = mode_selected;
-#if CONFIG_HYBRIDTRANSFORM16X16
-  x->e_mbd.block[0].bmi.as_mode.tx_type = best_txtype;
-#endif
 
 #if CONFIG_COMP_INTRA_PRED
   mbmi->second_mode = mode2_selected;
@@ -1539,6 +1436,7 @@
 
       // FIXME rate for compound mode and second intrapred mode
       rate = mode_costs[mode];
+      b->bmi.as_mode.first = mode;
 
 #if CONFIG_COMP_INTRA_PRED
       if (mode2 == (MB_PREDICTION_MODE)(DC_PRED - 1)) {
@@ -1554,21 +1452,18 @@
       vp8_subtract_4b_c(be, b, 16);
 
       if (xd->mode_info_context->mbmi.txfm_size == TX_8X8) {
-#if CONFIG_HYBRIDTRANSFORM8X8
-        txfm_map(b, pred_mode_conv(mode));
-        vp8_fht_c(be->src_diff, (x->block + idx)->coeff, 32,
-                  b->bmi.as_mode.tx_type, 8);
-
-#else
-        x->vp8_short_fdct8x8(be->src_diff, (x->block + idx)->coeff, 32);
-#endif
+        TX_TYPE tx_type = get_tx_type_8x8(xd, b);
+        if (tx_type != DCT_DCT)
+          vp8_fht_c(be->src_diff, (x->block + idx)->coeff, 32, tx_type, 8);
+        else
+          x->vp8_short_fdct8x8(be->src_diff, (x->block + idx)->coeff, 32);
         x->quantize_b_8x8(x->block + idx, xd->block + idx);
 
         // compute quantization mse of 8x8 block
         distortion = vp8_block_error_c((x->block + idx)->coeff,
                                        (xd->block + idx)->dqcoeff, 64);
-        ta0 = *(a + vp8_block2above_8x8[idx]);
-        tl0 = *(l + vp8_block2left_8x8 [idx]);
+        ta0 = a[vp8_block2above_8x8[idx]];
+        tl0 = l[vp8_block2left_8x8[idx]];
 
         rate_t = cost_coeffs(x, xd->block + idx, PLANE_TYPE_Y_WITH_DC,
                              &ta0, &tl0, TX_8X8);
@@ -1594,10 +1489,10 @@
         distortion += vp8_block_error_c((x->block + ib + 5)->coeff,
                                         (xd->block + ib + 5)->dqcoeff, 16);
 
-        ta0 = *(a + vp8_block2above[ib]);
-        ta1 = *(a + vp8_block2above[ib + 1]);
-        tl0 = *(l + vp8_block2above[ib]);
-        tl1 = *(l + vp8_block2above[ib + 4]);
+        ta0 = a[vp8_block2above[ib]];
+        ta1 = a[vp8_block2above[ib + 1]];
+        tl0 = l[vp8_block2left[ib]];
+        tl1 = l[vp8_block2left[ib + 4]];
         rate_t = cost_coeffs(x, xd->block + ib, PLANE_TYPE_Y_WITH_DC,
                              &ta0, &tl0, TX_4X4);
         rate_t += cost_coeffs(x, xd->block + ib + 1, PLANE_TYPE_Y_WITH_DC,
@@ -1639,15 +1534,15 @@
   vp8_encode_intra8x8(IF_RTCD(&cpi->rtcd), x, ib);
 
   if (xd->mode_info_context->mbmi.txfm_size == TX_8X8) {
-    *(a + vp8_block2above_8x8[idx])     = besta0;
-    *(a + vp8_block2above_8x8[idx] + 1) = besta1;
-    *(l + vp8_block2left_8x8 [idx])     = bestl0;
-    *(l + vp8_block2left_8x8 [idx] + 1) = bestl1;
+    a[vp8_block2above_8x8[idx]]     = besta0;
+    a[vp8_block2above_8x8[idx] + 1] = besta1;
+    l[vp8_block2left_8x8[idx]]      = bestl0;
+    l[vp8_block2left_8x8[idx] + 1]  = bestl1;
   } else {
-    *(a + vp8_block2above[ib])     = besta0;
-    *(a + vp8_block2above[ib + 1]) = besta1;
-    *(l + vp8_block2above[ib])     = bestl0;
-    *(l + vp8_block2above[ib + 4]) = bestl1;
+    a[vp8_block2above[ib]]     = besta0;
+    a[vp8_block2above[ib + 1]] = besta1;
+    l[vp8_block2left[ib]]      = bestl0;
+    l[vp8_block2left[ib + 4]]  = bestl1;
   }
 
   return best_rd;
@@ -1839,7 +1734,7 @@
 
 
 static int64_t rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
-                              int *distortion, int fullpixel) {
+                              int *distortion, int *skippable, int fullpixel) {
   vp8_build_inter4x4_predictors_mbuv(&x->e_mbd);
   ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), submbuv)(x->src_diff,
                                                          x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, x->src.uv_stride);
@@ -1849,6 +1744,7 @@
 
   *rate       = rd_cost_mbuv(x);
   *distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4;
+  *skippable  = mbuv_is_skippable_4x4(&x->e_mbd);
 
   return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
 }
@@ -2105,7 +2001,7 @@
   int_mv *best_ref_mv,
   int_mv *second_best_ref_mv,
   DEC_MVCOSTS) {
-  MACROBLOCKD *const xd = & x->e_mbd;
+  MACROBLOCKD *const xd = &x->e_mbd;
   MODE_INFO *const mic = xd->mode_info_context;
   MB_MODE_INFO * mbmi = &mic->mbmi;
   const int mis = xd->mode_info_stride;
@@ -2199,30 +2095,19 @@
   return cost;
 }
 
-static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels,
-                              int which_label, ENTROPY_CONTEXT *ta,
-                              ENTROPY_CONTEXT *tl) {
-  int b, cost = 0;
-  MACROBLOCKD *xd = &mb->e_mbd;
-
-  for (b = 0; b < 16; b++)
-    if (labels[ b] == which_label)
-      cost += cost_coeffs(mb, xd->block + b, PLANE_TYPE_Y_WITH_DC,
-                          ta + vp8_block2above[b],
-                          tl + vp8_block2left[b], TX_4X4);
-
-  return cost;
-
-}
-
-static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x,
-                                                int const *labels,
-                                                int which_label,
-                                                const VP8_ENCODER_RTCD *rtcd) {
+static int64_t encode_inter_mb_segment(MACROBLOCK *x,
+                                       int const *labels,
+                                       int which_label,
+                                       int *labelyrate,
+                                       int *distortion,
+                                       ENTROPY_CONTEXT *ta,
+                                       ENTROPY_CONTEXT *tl,
+                                       const VP8_ENCODER_RTCD *rtcd) {
   int i;
-  unsigned int distortion = 0;
   MACROBLOCKD *xd = &x->e_mbd;
 
+  *labelyrate = 0;
+  *distortion = 0;
   for (i = 0; i < 16; i++) {
     if (labels[i] == which_label) {
       BLOCKD *bd = &x->e_mbd.block[i];
@@ -2234,18 +2119,118 @@
         vp8_build_2nd_inter_predictors_b(bd, 16, xd->subpixel_predict_avg);
       ENCODEMB_INVOKE(&rtcd->encodemb, subb)(be, bd, 16);
       x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32);
-
-      // set to 0 no way to account for 2nd order DC so discount
-      // be->coeff[0] = 0;
       x->quantize_b_4x4(be, bd);
-      thisdistortion = ENCODEMB_INVOKE(&rtcd->encodemb, berr)(
-                         be->coeff, bd->dqcoeff, 16) / 4;
-      distortion += thisdistortion;
+      thisdistortion = vp8_block_error_c(be->coeff, bd->dqcoeff, 16);
+      *distortion += thisdistortion;
+      *labelyrate += cost_coeffs(x, bd, PLANE_TYPE_Y_WITH_DC,
+                                 ta + vp8_block2above[i],
+                                 tl + vp8_block2left[i], TX_4X4);
     }
   }
-  return distortion;
+  *distortion >>= 2;
+  return RDCOST(x->rdmult, x->rddiv, *labelyrate, *distortion);
 }
 
+static int64_t encode_inter_mb_segment_8x8(MACROBLOCK *x,
+                                           int const *labels,
+                                           int which_label,
+                                           int *labelyrate,
+                                           int *distortion,
+                                           int64_t *otherrd,
+                                           ENTROPY_CONTEXT *ta,
+                                           ENTROPY_CONTEXT *tl,
+                                           const VP8_ENCODER_RTCD *rtcd) {
+  int i, j;
+  MACROBLOCKD *xd = &x->e_mbd;
+  const int iblock[4] = { 0, 1, 4, 5 };
+  int othercost = 0, otherdist = 0;
+  ENTROPY_CONTEXT_PLANES tac, tlc;
+  ENTROPY_CONTEXT *tacp = (ENTROPY_CONTEXT *) &tac,
+                  *tlcp = (ENTROPY_CONTEXT *) &tlc;
+
+  if (otherrd) {
+    memcpy(&tac, ta, sizeof(ENTROPY_CONTEXT_PLANES));
+    memcpy(&tlc, tl, sizeof(ENTROPY_CONTEXT_PLANES));
+  }
+
+  *distortion = 0;
+  *labelyrate = 0;
+  for (i = 0; i < 4; i++) {
+    int ib = vp8_i8x8_block[i];
+
+    if (labels[ib] == which_label) {
+      int idx = (ib & 8) + ((ib & 2) << 1);
+      BLOCKD *bd = &xd->block[ib], *bd2 = &xd->block[idx];
+      BLOCK *be = &x->block[ib], *be2 = &x->block[idx];
+      int thisdistortion;
+
+      vp8_build_inter_predictors4b(xd, bd, 16);
+      if (xd->mode_info_context->mbmi.second_ref_frame)
+        vp8_build_2nd_inter_predictors4b(xd, bd, 16);
+      vp8_subtract_4b_c(be, bd, 16);
+
+      if (xd->mode_info_context->mbmi.txfm_size == TX_4X4) {
+        if (otherrd) {
+          x->vp8_short_fdct8x8(be->src_diff, be2->coeff, 32);
+          x->quantize_b_8x8(be2, bd2);
+          thisdistortion = vp8_block_error_c(be2->coeff, bd2->dqcoeff, 64);
+          otherdist += thisdistortion;
+          othercost += cost_coeffs(x, bd2, PLANE_TYPE_Y_WITH_DC,
+                                     tacp + vp8_block2above_8x8[idx],
+                                     tlcp + vp8_block2left_8x8[idx], TX_8X8);
+        }
+        for (j = 0; j < 4; j += 2) {
+          bd = &xd->block[ib + iblock[j]];
+          be = &x->block[ib + iblock[j]];
+          x->vp8_short_fdct8x4(be->src_diff, be->coeff, 32);
+          x->quantize_b_4x4_pair(be, be + 1, bd, bd + 1);
+          thisdistortion = vp8_block_error_c(be->coeff, bd->dqcoeff, 32);
+          *distortion += thisdistortion;
+          *labelyrate += cost_coeffs(x, bd, PLANE_TYPE_Y_WITH_DC,
+                                     ta + vp8_block2above[ib + iblock[j]],
+                                     tl + vp8_block2left[ib + iblock[j]],
+                                     TX_4X4);
+          *labelyrate += cost_coeffs(x, bd + 1, PLANE_TYPE_Y_WITH_DC,
+                                     ta + vp8_block2above[ib + iblock[j] + 1],
+                                     tl + vp8_block2left[ib + iblock[j]],
+                                     TX_4X4);
+        }
+      } else /* 8x8 */ {
+        if (otherrd) {
+          for (j = 0; j < 4; j += 2) {
+            BLOCKD *bd3 = &xd->block[ib + iblock[j]];
+            BLOCK *be3 = &x->block[ib + iblock[j]];
+            x->vp8_short_fdct8x4(be3->src_diff, be3->coeff, 32);
+            x->quantize_b_4x4_pair(be3, be3 + 1, bd3, bd3 + 1);
+            thisdistortion = vp8_block_error_c(be3->coeff, bd3->dqcoeff, 32);
+            otherdist += thisdistortion;
+            othercost += cost_coeffs(x, bd3, PLANE_TYPE_Y_WITH_DC,
+                                     tacp + vp8_block2above[ib + iblock[j]],
+                                     tlcp + vp8_block2left[ib + iblock[j]],
+                                     TX_4X4);
+            othercost += cost_coeffs(x, bd3 + 1, PLANE_TYPE_Y_WITH_DC,
+                                     tacp + vp8_block2above[ib + iblock[j] + 1],
+                                     tlcp + vp8_block2left[ib + iblock[j]],
+                                     TX_4X4);
+          }
+        }
+        x->vp8_short_fdct8x8(be->src_diff, be2->coeff, 32);
+        x->quantize_b_8x8(be2, bd2);
+        thisdistortion = vp8_block_error_c(be2->coeff, bd2->dqcoeff, 64);
+        *distortion += thisdistortion;
+        *labelyrate += cost_coeffs(x, bd2, PLANE_TYPE_Y_WITH_DC,
+                                   ta + vp8_block2above_8x8[idx],
+                                   tl + vp8_block2left_8x8[idx], TX_8X8);
+      }
+    }
+  }
+  *distortion >>= 2;
+  if (otherrd) {
+    othercost >>= 2;
+    *otherrd = RDCOST(x->rdmult, x->rddiv, othercost, otherdist);
+  }
+  return RDCOST(x->rdmult, x->rddiv, *labelyrate, *distortion);
+}
 
 static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0};
 
@@ -2255,13 +2240,14 @@
   int_mv mvp;
 
   int64_t segment_rd;
-  int segment_num;
+  SPLITMV_PARTITIONING_TYPE segment_num;
+  TX_SIZE txfm_size;
   int r;
   int d;
   int segment_yrate;
   B_PREDICTION_MODE modes[16];
   int_mv mvs[16], second_mvs[16];
-  unsigned char eobs[16];
+  int eobs[16];
 
   int mvthresh;
   int *mdcounts;
@@ -2281,21 +2267,27 @@
   return r;
 }
 
-static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
-                             BEST_SEG_INFO *bsi, unsigned int segmentation,
-                             int_mv seg_mvs[16 /* n_blocks */][MAX_REF_FRAMES - 1]) {
-  int i;
+static void rd_check_segment_txsize(VP8_COMP *cpi, MACROBLOCK *x,
+                                    BEST_SEG_INFO *bsi,
+                                    SPLITMV_PARTITIONING_TYPE segmentation,
+                                    TX_SIZE tx_size, int64_t *otherrds,
+                                    int64_t *rds, int *completed,
+                                    /* 16 = n_blocks */
+                                    int_mv seg_mvs[16 /* n_blocks */]
+                                                  [MAX_REF_FRAMES - 1]) {
+  int i, j;
   int const *labels;
   int br = 0, bd = 0;
   B_PREDICTION_MODE this_mode;
   MB_MODE_INFO * mbmi = &x->e_mbd.mode_info_context->mbmi;
 
   int label_count;
-  int64_t this_segment_rd = 0;
+  int64_t this_segment_rd = 0, other_segment_rd;
   int label_mv_thresh;
   int rate = 0;
   int sbr = 0, sbd = 0;
   int segmentyrate = 0;
+  int best_eobs[16] = { 0 };
 
   vp8_variance_fn_ptr_t *v_fn_ptr;
 
@@ -2323,20 +2315,23 @@
   label_mv_thresh = 1 * bsi->mvthresh / label_count;
 
   // Segmentation method overheads
-  rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + segmentation);
+  rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs,
+                        vp8_mbsplit_encodings + segmentation);
   rate += vp8_cost_mv_ref(cpi, SPLITMV, bsi->mdcounts);
   this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0);
   br += rate;
+  other_segment_rd = this_segment_rd;
 
-  for (i = 0; i < label_count; i++) {
+  mbmi->txfm_size = tx_size;
+  for (i = 0; i < label_count && this_segment_rd < bsi->segment_rd; i++) {
     int_mv mode_mv[B_MODE_COUNT], second_mode_mv[B_MODE_COUNT];
-    int64_t best_label_rd = INT64_MAX;
+    int64_t best_label_rd = INT64_MAX, best_other_rd = INT64_MAX;
     B_PREDICTION_MODE mode_selected = ZERO4X4;
     int bestlabelyrate = 0;
 
     // search for the best motion vector on this segment
     for (this_mode = LEFT4X4; this_mode <= NEW4X4; this_mode ++) {
-      int64_t this_rd;
+      int64_t this_rd, other_rd;
       int distortion;
       int labelyrate;
       ENTROPY_CONTEXT_PLANES t_above_s, t_left_s;
@@ -2358,21 +2353,23 @@
         BLOCK *c;
         BLOCKD *e;
 
-        // Is the best so far sufficiently good that we cant justify doing and new motion search.
+        /* Is the best so far sufficiently good that we cant justify doing
+         * and new motion search. */
         if (best_label_rd < label_mv_thresh)
           break;
 
         if (cpi->compressor_speed) {
-          if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8) {
+          if (segmentation == PARTITIONING_8X16 ||
+              segmentation == PARTITIONING_16X8) {
             bsi->mvp.as_int = bsi->sv_mvp[i].as_int;
-            if (i == 1 && segmentation == BLOCK_16X8)
+            if (i == 1 && segmentation == PARTITIONING_16X8)
               bsi->mvp.as_int = bsi->sv_mvp[2].as_int;
 
             step_param = bsi->sv_istep[i];
           }
 
           // use previous block's result as next block's MV predictor.
-          if (segmentation == BLOCK_4X4 && i > 0) {
+          if (segmentation == PARTITIONING_4X4 && i > 0) {
             bsi->mvp.as_int = x->e_mbd.block[i - 1].bmi.as_mv.first.as_int;
             if (i == 4 || i == 8 || i == 12)
               bsi->mvp.as_int = x->e_mbd.block[i - 4].bmi.as_mv.first.as_int;
@@ -2404,7 +2401,8 @@
           // Should we do a full search (best quality only)
           if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000) {
             /* Check if mvp_full is within the range. */
-            vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
+            vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max,
+                         x->mv_row_min, x->mv_row_max);
 
             thissme = cpi->full_search_sad(x, c, e, &mvp_full,
                                            sadpb, 16, v_fn_ptr,
@@ -2414,7 +2412,8 @@
               bestsme = thissme;
               mode_mv[NEW4X4].as_int = e->bmi.as_mv.first.as_int;
             } else {
-              // The full search result is actually worse so re-instate the previous best vector
+              /* The full search result is actually worse so re-instate the
+               * previous best vector */
               e->bmi.as_mv.first.as_int = mode_mv[NEW4X4].as_int;
             }
           }
@@ -2424,15 +2423,16 @@
           int distortion;
           unsigned int sse;
           cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4],
-                                       bsi->ref_mv, x->errorperbit, v_fn_ptr, XMVCOST,
-                                       &distortion, &sse);
+                                       bsi->ref_mv, x->errorperbit, v_fn_ptr,
+                                       XMVCOST, &distortion, &sse);
 
           // safe motion search result for use in compound prediction
           seg_mvs[i][mbmi->ref_frame - 1].as_int = mode_mv[NEW4X4].as_int;
         }
       } /* NEW4X4 */
       else if (mbmi->second_ref_frame && this_mode == NEW4X4) {
-        // motion search not completed? Then skip newmv for this block with comppred
+        /* motion search not completed? Then skip newmv for this block with
+         * comppred */
         if (seg_mvs[i][mbmi->second_ref_frame - 1].as_int == INVALID_MV ||
             seg_mvs[i][mbmi->ref_frame        - 1].as_int == INVALID_MV) {
           continue;
@@ -2454,21 +2454,39 @@
           mv_check_bounds(x, &second_mode_mv[this_mode]))
         continue;
 
-      distortion = vp8_encode_inter_mb_segment(
-                     x, labels, i,
-                     IF_RTCD(&cpi->rtcd));
-
-      labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s);
+      if (segmentation == PARTITIONING_4X4) {
+        this_rd = encode_inter_mb_segment(x, labels, i, &labelyrate,
+                                          &distortion,
+                                          ta_s, tl_s, IF_RTCD(&cpi->rtcd));
+        other_rd = this_rd;
+      } else {
+        this_rd = encode_inter_mb_segment_8x8(x, labels, i, &labelyrate,
+                                              &distortion, &other_rd,
+                                              ta_s, tl_s, IF_RTCD(&cpi->rtcd));
+      }
+      this_rd += RDCOST(x->rdmult, x->rddiv, rate, 0);
       rate += labelyrate;
 
-      this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
-
       if (this_rd < best_label_rd) {
         sbr = rate;
         sbd = distortion;
         bestlabelyrate = labelyrate;
         mode_selected = this_mode;
         best_label_rd = this_rd;
+        if (x->e_mbd.mode_info_context->mbmi.txfm_size == TX_4X4) {
+          for (j = 0; j < 16; j++)
+            if (labels[j] == i)
+              best_eobs[j] = x->e_mbd.block[j].eob;
+        } else {
+          for (j = 0; j < 4; j++) {
+            int ib = vp8_i8x8_block[j], idx = j * 4;
+
+            if (labels[ib] == i)
+              best_eobs[idx] = x->e_mbd.block[idx].eob;
+          }
+        }
+        if (other_rd < best_other_rd)
+          best_other_rd = other_rd;
 
         vpx_memcpy(ta_b, ta_s, sizeof(ENTROPY_CONTEXT_PLANES));
         vpx_memcpy(tl_b, tl_s, sizeof(ENTROPY_CONTEXT_PLANES));
@@ -2480,18 +2498,18 @@
     vpx_memcpy(tl, tl_b, sizeof(ENTROPY_CONTEXT_PLANES));
 
     labels2mode(x, labels, i, mode_selected, &mode_mv[mode_selected],
-                &second_mode_mv[mode_selected], seg_mvs[i], bsi->ref_mv, bsi->second_ref_mv, XMVCOST);
+                &second_mode_mv[mode_selected], seg_mvs[i],
+                bsi->ref_mv, bsi->second_ref_mv, XMVCOST);
 
     br += sbr;
     bd += sbd;
     segmentyrate += bestlabelyrate;
     this_segment_rd += best_label_rd;
-
-    if (this_segment_rd >= bsi->segment_rd) {
-      break;
-    }
-
-
+    other_segment_rd += best_other_rd;
+    if (rds)
+      rds[i] = this_segment_rd;
+    if (otherrds)
+      rds[i] = other_segment_rd;
   } /* for each label */
 
   if (this_segment_rd < bsi->segment_rd) {
@@ -2500,6 +2518,7 @@
     bsi->segment_yrate = segmentyrate;
     bsi->segment_rd = this_segment_rd;
     bsi->segment_num = segmentation;
+    bsi->txfm_size = mbmi->txfm_size;
 
     // store everything needed to come back to this!!
     for (i = 0; i < 16; i++) {
@@ -2509,7 +2528,106 @@
       if (mbmi->second_ref_frame)
         bsi->second_mvs[i].as_mv = x->partition_info->bmi[i].second_mv.as_mv;
       bsi->modes[i] = x->partition_info->bmi[i].mode;
-      bsi->eobs[i] = bd->eob;
+      bsi->eobs[i] = best_eobs[i];
+    }
+  }
+
+  if (completed) {
+    *completed = i;
+  }
+}
+
+static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x,
+                             BEST_SEG_INFO *bsi,
+                             unsigned int segmentation,
+                             /* 16 = n_blocks */
+                             int_mv seg_mvs[16][MAX_REF_FRAMES - 1],
+                             int64_t txfm_cache[NB_TXFM_MODES]) {
+  int i, n, c = vp8_mbsplit_count[segmentation];
+
+  if (segmentation == PARTITIONING_4X4) {
+    int64_t rd[16];
+
+    rd_check_segment_txsize(cpi, x, bsi, segmentation, TX_4X4, NULL,
+                            rd, &n, seg_mvs);
+    if (n == c) {
+      for (i = 0; i < NB_TXFM_MODES; i++) {
+        if (rd[c - 1] < txfm_cache[i])
+          txfm_cache[i] = rd[c - 1];
+      }
+    }
+  } else {
+    int64_t diff, base_rd;
+    int cost4x4 = vp8_cost_bit(cpi->common.prob_tx[0], 0);
+    int cost8x8 = vp8_cost_bit(cpi->common.prob_tx[0], 1);
+
+    if (cpi->common.txfm_mode == TX_MODE_SELECT) {
+      int64_t rd4x4[4], rd8x8[4];
+      int n4x4, n8x8, nmin;
+      BEST_SEG_INFO bsi4x4, bsi8x8;
+
+      /* factor in cost of cost4x4/8x8 in decision */
+      vpx_memcpy(&bsi4x4, bsi, sizeof(*bsi));
+      vpx_memcpy(&bsi8x8, bsi, sizeof(*bsi));
+      rd_check_segment_txsize(cpi, x, &bsi4x4, segmentation,
+                              TX_4X4, NULL, rd4x4, &n4x4, seg_mvs);
+      rd_check_segment_txsize(cpi, x, &bsi8x8, segmentation,
+                              TX_8X8, NULL, rd8x8, &n8x8, seg_mvs);
+      if (bsi4x4.segment_num == segmentation) {
+        bsi4x4.segment_rd += RDCOST(x->rdmult, x->rddiv, cost4x4, 0);
+        if (bsi4x4.segment_rd < bsi->segment_rd)
+          vpx_memcpy(bsi, &bsi4x4, sizeof(*bsi));
+      }
+      if (bsi8x8.segment_num == segmentation) {
+        bsi8x8.segment_rd += RDCOST(x->rdmult, x->rddiv, cost8x8, 0);
+        if (bsi8x8.segment_rd < bsi->segment_rd)
+          vpx_memcpy(bsi, &bsi8x8, sizeof(*bsi));
+      }
+      n = n4x4 > n8x8 ? n4x4 : n8x8;
+      if (n == c) {
+        nmin = n4x4 < n8x8 ? n4x4 : n8x8;
+        diff = rd8x8[nmin - 1] - rd4x4[nmin - 1];
+        if (n == n4x4) {
+          base_rd = rd4x4[c - 1];
+        } else {
+          base_rd = rd8x8[c - 1] - diff;
+        }
+      }
+    } else {
+      int64_t rd[4], otherrd[4];
+
+      if (cpi->common.txfm_mode == ONLY_4X4) {
+        rd_check_segment_txsize(cpi, x, bsi, segmentation, TX_4X4, otherrd,
+                                rd, &n, seg_mvs);
+        if (n == c) {
+          base_rd = rd[c - 1];
+          diff = otherrd[c - 1] - rd[c - 1];
+        }
+      } else /* use 8x8 transform */ {
+        rd_check_segment_txsize(cpi, x, bsi, segmentation, TX_8X8, otherrd,
+                                rd, &n, seg_mvs);
+        if (n == c) {
+          diff = rd[c - 1] - otherrd[c - 1];
+          base_rd = otherrd[c - 1];
+        }
+      }
+    }
+
+    if (n == c) {
+      if (base_rd < txfm_cache[ONLY_4X4]) {
+        txfm_cache[ONLY_4X4] = base_rd;
+      }
+      if (base_rd + diff < txfm_cache[1]) {
+        txfm_cache[ALLOW_8X8] = txfm_cache[ALLOW_16X16] = base_rd + diff;
+      }
+      if (diff < 0) {
+        base_rd += diff + RDCOST(x->rdmult, x->rddiv, cost8x8, 0);
+      } else {
+        base_rd += RDCOST(x->rdmult, x->rddiv, cost4x4, 0);
+      }
+      if (base_rd < txfm_cache[TX_MODE_SELECT]) {
+        txfm_cache[TX_MODE_SELECT] = base_rd;
+      }
     }
   }
 }
@@ -2527,17 +2645,26 @@
   *sp = MAX_MVSEARCH_STEPS - 1 - step;
 }
 
-static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
-                                           int_mv *best_ref_mv, int_mv *second_best_ref_mv, int64_t best_rd,
-                                           int *mdcounts, int *returntotrate,
-                                           int *returnyrate, int *returndistortion,
-                                           int mvthresh,
-                                           int_mv seg_mvs[BLOCK_MAX_SEGMENTS - 1][16 /* n_blocks */][MAX_REF_FRAMES - 1]) {
+static int rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
+                                       int_mv *best_ref_mv,
+                                       int_mv *second_best_ref_mv,
+                                       int64_t best_rd,
+                                       int *mdcounts,
+                                       int *returntotrate,
+                                       int *returnyrate,
+                                       int *returndistortion,
+                                       int *skippable, int mvthresh,
+                                       int_mv seg_mvs[NB_PARTITIONINGS]
+                                                     [16 /* n_blocks */]
+                                                     [MAX_REF_FRAMES - 1],
+                                       int64_t txfm_cache[NB_TXFM_MODES]) {
   int i;
   BEST_SEG_INFO bsi;
   MB_MODE_INFO * mbmi = &x->e_mbd.mode_info_context->mbmi;
 
   vpx_memset(&bsi, 0, sizeof(bsi));
+  for (i = 0; i < NB_TXFM_MODES; i++)
+    txfm_cache[i] = INT64_MAX;
 
   bsi.segment_rd = best_rd;
   bsi.ref_mv = best_ref_mv;
@@ -2545,6 +2672,7 @@
   bsi.mvp.as_int = best_ref_mv->as_int;
   bsi.mvthresh = mvthresh;
   bsi.mdcounts = mdcounts;
+  bsi.txfm_size = TX_4X4;
 
   for (i = 0; i < 16; i++)
     bsi.modes[i] = ZERO4X4;
@@ -2552,15 +2680,19 @@
   if (cpi->compressor_speed == 0) {
     /* for now, we will keep the original segmentation order
        when in best quality mode */
-    rd_check_segment(cpi, x, &bsi, BLOCK_16X8, seg_mvs[BLOCK_16X8]);
-    rd_check_segment(cpi, x, &bsi, BLOCK_8X16, seg_mvs[BLOCK_8X16]);
-    rd_check_segment(cpi, x, &bsi, BLOCK_8X8,  seg_mvs[BLOCK_8X8]);
-    rd_check_segment(cpi, x, &bsi, BLOCK_4X4,  seg_mvs[BLOCK_4X4]);
+    rd_check_segment(cpi, x, &bsi, PARTITIONING_16X8,
+                     seg_mvs[PARTITIONING_16X8], txfm_cache);
+    rd_check_segment(cpi, x, &bsi, PARTITIONING_8X16,
+                     seg_mvs[PARTITIONING_8X16], txfm_cache);
+    rd_check_segment(cpi, x, &bsi, PARTITIONING_8X8,
+                     seg_mvs[PARTITIONING_8X8], txfm_cache);
+    rd_check_segment(cpi, x, &bsi, PARTITIONING_4X4,
+                     seg_mvs[PARTITIONING_4X4], txfm_cache);
   } else {
     int sr;
 
-    rd_check_segment(cpi, x, &bsi, BLOCK_8X8, seg_mvs[BLOCK_8X8]);
-
+    rd_check_segment(cpi, x, &bsi, PARTITIONING_8X8,
+                     seg_mvs[PARTITIONING_8X8], txfm_cache);
 
     if (bsi.segment_rd < best_rd) {
       int tmp_col_min = x->mv_col_min;
@@ -2576,34 +2708,40 @@
       bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int;
       bsi.sv_mvp[3].as_int = bsi.mvs[10].as_int;
 
-      /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range according to the closeness of 2 MV. */
+      /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range
+       * according to the closeness of 2 MV. */
       /* block 8X16 */
-      {
-        sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row)) >> 3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col)) >> 3);
-        vp8_cal_step_param(sr, &bsi.sv_istep[0]);
+      sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row)) >> 3,
+                (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col)) >> 3);
+      vp8_cal_step_param(sr, &bsi.sv_istep[0]);
 
-        sr = MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3, (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
-        vp8_cal_step_param(sr, &bsi.sv_istep[1]);
+      sr = MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3,
+                (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
+      vp8_cal_step_param(sr, &bsi.sv_istep[1]);
 
-        rd_check_segment(cpi, x, &bsi, BLOCK_8X16, seg_mvs[BLOCK_8X16]);
-      }
+      rd_check_segment(cpi, x, &bsi, PARTITIONING_8X16,
+                       seg_mvs[PARTITIONING_8X16], txfm_cache);
 
       /* block 16X8 */
-      {
-        sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row)) >> 3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col)) >> 3);
-        vp8_cal_step_param(sr, &bsi.sv_istep[0]);
+      sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row)) >> 3,
+                (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col)) >> 3);
+      vp8_cal_step_param(sr, &bsi.sv_istep[0]);
 
-        sr = MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3, (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
-        vp8_cal_step_param(sr, &bsi.sv_istep[1]);
+      sr = MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3,
+                (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
+      vp8_cal_step_param(sr, &bsi.sv_istep[1]);
 
-        rd_check_segment(cpi, x, &bsi, BLOCK_16X8, seg_mvs[BLOCK_16X8]);
-      }
+      rd_check_segment(cpi, x, &bsi, PARTITIONING_16X8,
+                       seg_mvs[PARTITIONING_16X8], txfm_cache);
 
       /* If 8x8 is better than 16x8/8x16, then do 4x4 search */
       /* Not skip 4x4 if speed=0 (good quality) */
-      if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8) { /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */
+      if (cpi->sf.no_skip_block4x4_search ||
+          bsi.segment_num == PARTITIONING_8X8) {
+        /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */
         bsi.mvp.as_int = bsi.sv_mvp[0].as_int;
-        rd_check_segment(cpi, x, &bsi, BLOCK_4X4, seg_mvs[BLOCK_4X4]);
+        rd_check_segment(cpi, x, &bsi, PARTITIONING_4X4,
+                         seg_mvs[PARTITIONING_4X4], txfm_cache);
       }
 
       /* restore UMV window */
@@ -2627,8 +2765,12 @@
   *returntotrate = bsi.r;
   *returndistortion = bsi.d;
   *returnyrate = bsi.segment_yrate;
+  *skippable = bsi.txfm_size == TX_4X4 ?
+                    mby_is_skippable_4x4(&x->e_mbd, 0) :
+                    mby_is_skippable_8x8(&x->e_mbd, 0);
 
   /* save partitions */
+  mbmi->txfm_size = bsi.txfm_size;
   mbmi->partitioning = bsi.segment_num;
   x->partition_info->count = vp8_mbsplit_count[bsi.segment_num];
 
@@ -2874,9 +3016,7 @@
 void rd_update_mvcount(VP8_COMP *cpi, MACROBLOCK *x,
                        int_mv *best_ref_mv, int_mv *second_best_ref_mv) {
   MB_MODE_INFO * mbmi = &x->e_mbd.mode_info_context->mbmi;
-#if CONFIG_NEWMVENTROPY
   MV mv;
-#endif
 
   if (mbmi->mode == SPLITMV) {
     int i;
@@ -2884,7 +3024,6 @@
     for (i = 0; i < x->partition_info->count; i++) {
       if (x->partition_info->bmi[i].mode == NEW4X4) {
         if (x->e_mbd.allow_high_precision_mv) {
-#if CONFIG_NEWMVENTROPY
           mv.row = (x->partition_info->bmi[i].mv.as_mv.row
                     - best_ref_mv->as_mv.row);
           mv.col = (x->partition_info->bmi[i].mv.as_mv.col
@@ -2898,20 +3037,7 @@
             vp8_increment_nmv(&mv, &second_best_ref_mv->as_mv,
                               &cpi->NMVcount, 1);
           }
-#else
-          cpi->MVcount_hp[0][mv_max_hp + (x->partition_info->bmi[i].mv.as_mv.row
-                                          - best_ref_mv->as_mv.row)]++;
-          cpi->MVcount_hp[1][mv_max_hp + (x->partition_info->bmi[i].mv.as_mv.col
-                                          - best_ref_mv->as_mv.col)]++;
-          if (mbmi->second_ref_frame) {
-            cpi->MVcount_hp[0][mv_max_hp + (x->partition_info->bmi[i].second_mv.as_mv.row
-                                            - second_best_ref_mv->as_mv.row)]++;
-            cpi->MVcount_hp[1][mv_max_hp + (x->partition_info->bmi[i].second_mv.as_mv.col
-                                            - second_best_ref_mv->as_mv.col)]++;
-          }
-#endif
         } else {
-#if CONFIG_NEWMVENTROPY
           mv.row = (x->partition_info->bmi[i].mv.as_mv.row
                     - best_ref_mv->as_mv.row);
           mv.col = (x->partition_info->bmi[i].mv.as_mv.col
@@ -2925,24 +3051,11 @@
             vp8_increment_nmv(&mv, &second_best_ref_mv->as_mv,
                               &cpi->NMVcount, 0);
           }
-#else
-          cpi->MVcount[0][mv_max + ((x->partition_info->bmi[i].mv.as_mv.row
-                                     - best_ref_mv->as_mv.row) >> 1)]++;
-          cpi->MVcount[1][mv_max + ((x->partition_info->bmi[i].mv.as_mv.col
-                                     - best_ref_mv->as_mv.col) >> 1)]++;
-          if (mbmi->second_ref_frame) {
-            cpi->MVcount[0][mv_max + ((x->partition_info->bmi[i].second_mv.as_mv.row
-                                       - second_best_ref_mv->as_mv.row) >> 1)]++;
-            cpi->MVcount[1][mv_max + ((x->partition_info->bmi[i].second_mv.as_mv.col
-                                       - second_best_ref_mv->as_mv.col) >> 1)]++;
-          }
-#endif
         }
       }
     }
   } else if (mbmi->mode == NEWMV) {
     if (x->e_mbd.allow_high_precision_mv) {
-#if CONFIG_NEWMVENTROPY
       mv.row = (mbmi->mv[0].as_mv.row - best_ref_mv->as_mv.row);
       mv.col = (mbmi->mv[0].as_mv.col - best_ref_mv->as_mv.col);
       vp8_increment_nmv(&mv, &best_ref_mv->as_mv, &cpi->NMVcount, 1);
@@ -2951,20 +3064,7 @@
         mv.col = (mbmi->mv[1].as_mv.col - second_best_ref_mv->as_mv.col);
         vp8_increment_nmv(&mv, &second_best_ref_mv->as_mv, &cpi->NMVcount, 1);
       }
-#else
-      cpi->MVcount_hp[0][mv_max_hp + (mbmi->mv[0].as_mv.row
-                                      - best_ref_mv->as_mv.row)]++;
-      cpi->MVcount_hp[1][mv_max_hp + (mbmi->mv[0].as_mv.col
-                                      - best_ref_mv->as_mv.col)]++;
-      if (mbmi->second_ref_frame) {
-        cpi->MVcount_hp[0][mv_max_hp + (mbmi->mv[1].as_mv.row
-                                        - second_best_ref_mv->as_mv.row)]++;
-        cpi->MVcount_hp[1][mv_max_hp + (mbmi->mv[1].as_mv.col
-                                        - second_best_ref_mv->as_mv.col)]++;
-      }
-#endif
     } else {
-#if CONFIG_NEWMVENTROPY
       mv.row = (mbmi->mv[0].as_mv.row - best_ref_mv->as_mv.row);
       mv.col = (mbmi->mv[0].as_mv.col - best_ref_mv->as_mv.col);
       vp8_increment_nmv(&mv, &best_ref_mv->as_mv, &cpi->NMVcount, 0);
@@ -2973,18 +3073,6 @@
         mv.col = (mbmi->mv[1].as_mv.col - second_best_ref_mv->as_mv.col);
         vp8_increment_nmv(&mv, &second_best_ref_mv->as_mv, &cpi->NMVcount, 0);
       }
-#else
-      cpi->MVcount[0][mv_max + ((mbmi->mv[0].as_mv.row
-                                 - best_ref_mv->as_mv.row) >> 1)]++;
-      cpi->MVcount[1][mv_max + ((mbmi->mv[0].as_mv.col
-                                 - best_ref_mv->as_mv.col) >> 1)]++;
-      if (mbmi->second_ref_frame) {
-        cpi->MVcount[0][mv_max + ((mbmi->mv[1].as_mv.row
-                                   - second_best_ref_mv->as_mv.row) >> 1)]++;
-        cpi->MVcount[1][mv_max + ((mbmi->mv[1].as_mv.col
-                                   - second_best_ref_mv->as_mv.col) >> 1)]++;
-      }
-#endif
     }
   }
 }
@@ -3158,9 +3246,7 @@
                                  int hybrid_pred_diff,
                                  int64_t txfm_size_diff[NB_TXFM_MODES]) {
   MACROBLOCKD *xd = &x->e_mbd;
-#if CONFIG_TX_SELECT
   MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi;
-#endif
 
   // Take a snapshot of the coding context so it can be
   // restored if we decide to encode this way
@@ -3180,9 +3266,7 @@
   ctx->comp_pred_diff   = comp_pred_diff;
   ctx->hybrid_pred_diff = hybrid_pred_diff;
 
-#if CONFIG_TX_SELECT
   memcpy(ctx->txfm_rd_diff, txfm_size_diff, sizeof(ctx->txfm_rd_diff));
-#endif
 }
 
 static void inter_mode_cost(VP8_COMP *cpi, MACROBLOCK *x, int this_mode,
@@ -3299,9 +3383,7 @@
   int_mv ref_mv[MAX_REF_FRAMES] = {{0}};
 #endif
 
-#if CONFIG_SWITCHABLE_INTERP
   int switchable_filter_index = 0;
-#endif
 
   MB_PREDICTION_MODE uv_intra_mode;
   MB_PREDICTION_MODE uv_intra_mode_8x8 = 0;
@@ -3317,11 +3399,7 @@
   unsigned char *y_buffer[4], *u_buffer[4], *v_buffer[4];
 
   unsigned int ref_costs[MAX_REF_FRAMES];
-  int_mv seg_mvs[BLOCK_MAX_SEGMENTS - 1][16 /* n_blocks */][MAX_REF_FRAMES - 1];
-
-#if CONFIG_HYBRIDTRANSFORM16X16
-  int best_txtype, rd_txtype;
-#endif
+  int_mv seg_mvs[NB_PARTITIONINGS][16 /* n_blocks */][MAX_REF_FRAMES - 1];
 
   vpx_memset(mode8x8, 0, sizeof(mode8x8));
   vpx_memset(&frame_mv, 0, sizeof(frame_mv));
@@ -3336,7 +3414,7 @@
   for (i = 0; i < NB_TXFM_MODES; i++)
     best_txfm_rd[i] = INT64_MAX;
 
-  for (i = 0; i < BLOCK_MAX_SEGMENTS - 1; i++) {
+  for (i = 0; i < NB_PARTITIONINGS; i++) {
     int j, k;
 
     for (j = 0; j < 16; j++)
@@ -3402,12 +3480,8 @@
   // that depend on the current prediction etc.
   vp8_estimate_ref_frame_costs(cpi, segment_id, ref_costs);
 
-#if CONFIG_SWITCHABLE_INTERP
   for (mode_index = 0; mode_index < MAX_MODES;
        mode_index += (!switchable_filter_index)) {
-#else
-  for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) {
-#endif
     int64_t this_rd = INT64_MAX;
     int is_comp_pred;
     int disable_skip = 0, skippable = 0;
@@ -3435,19 +3509,16 @@
 #if CONFIG_PRED_FILTER
     mbmi->pred_filter_enabled = 0;
 #endif
-#if CONFIG_SWITCHABLE_INTERP
     if (cpi->common.mcomp_filter_type == SWITCHABLE &&
         this_mode >= NEARESTMV && this_mode <= SPLITMV) {
       mbmi->interp_filter =
           vp8_switchable_interp[switchable_filter_index++];
       if (switchable_filter_index == VP8_SWITCHABLE_FILTERS)
         switchable_filter_index = 0;
-        //printf("Searching %d (%d)\n", this_mode, switchable_filter_index);
     } else {
       mbmi->interp_filter = cpi->common.mcomp_filter_type;
     }
     vp8_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common);
-#endif
 
     // Test best rd so far against threshold for trying this mode.
     if (best_rd <= cpi->rd_threshes[mode_index])
@@ -3546,9 +3617,6 @@
           // FIXME compound intra prediction
           vp8_build_intra_predictors_mby(&x->e_mbd);
           macro_block_yrd(cpi, x, &rate_y, &distortion, &skippable, txfm_cache);
-#if CONFIG_HYBRIDTRANSFORM16X16
-          rd_txtype = x->e_mbd.block[0].bmi.as_mode.tx_type;
-#endif
           rate2 += rate_y;
           distortion2 += distortion;
           rate2 += x->mbmode_cost[x->e_mbd.frame_type][mbmi->mode];
@@ -3592,11 +3660,9 @@
         }
         break;
         case I8X8_PRED: {
-#if CONFIG_TX_SELECT
           int cost0 = vp8_cost_bit(cm->prob_tx[0], 0);
           int cost1 = vp8_cost_bit(cm->prob_tx[0], 1);
           int64_t tmp_rd_4x4s, tmp_rd_8x8s;
-#endif
           int64_t tmp_rd_4x4, tmp_rd_8x8, tmp_rd;
           int r4x4, tok4x4, d4x4, r8x8, tok8x8, d8x8;
           mbmi->txfm_size = TX_4X4;
@@ -3618,7 +3684,6 @@
           txfm_cache[ONLY_4X4]  = tmp_rd_4x4;
           txfm_cache[ALLOW_8X8] = tmp_rd_8x8;
           txfm_cache[ALLOW_16X16] = tmp_rd_8x8;
-#if CONFIG_TX_SELECT
           tmp_rd_4x4s = tmp_rd_4x4 + RDCOST(x->rdmult, x->rddiv, cost0, 0);
           tmp_rd_8x8s = tmp_rd_8x8 + RDCOST(x->rdmult, x->rddiv, cost1, 0);
           txfm_cache[TX_MODE_SELECT] = tmp_rd_4x4s < tmp_rd_8x8s ? tmp_rd_4x4s : tmp_rd_8x8s;
@@ -3647,9 +3712,7 @@
               mode8x8[1][3] = x->e_mbd.mode_info_context->bmi[10].as_mode.second;
 #endif
             }
-          } else
-#endif
-          if (cm->txfm_mode == ONLY_4X4) {
+          } else if (cm->txfm_mode == ONLY_4X4) {
             rate = r4x4;
             rate_y = tok4x4;
             distortion = d4x4;
@@ -3705,26 +3768,29 @@
               (mbmi->ref_frame == GOLDEN_FRAME) ?
           cpi->rd_threshes[THR_NEWG] : this_rd_thresh;
 
-      mbmi->txfm_size = TX_4X4; // FIXME use 8x8 in case of 8x8/8x16/16x8
-      tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv,
-                                               second_ref, best_yrd, mdcounts,
-                                               &rate, &rate_y, &distortion,
-                                               this_rd_thresh, seg_mvs);
+      tmp_rd = rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv,
+                                           second_ref, best_yrd, mdcounts,
+                                           &rate, &rate_y, &distortion,
+                                           &skippable,
+                                           this_rd_thresh, seg_mvs,
+                                           txfm_cache);
       rate2 += rate;
       distortion2 += distortion;
 
-#if CONFIG_SWITCHABLE_INTERP
       if (cpi->common.mcomp_filter_type == SWITCHABLE)
         rate2 += SWITCHABLE_INTERP_RATE_FACTOR * x->switchable_interp_costs
             [get_pred_context(&cpi->common, xd, PRED_SWITCHABLE_INTERP)]
                 [vp8_switchable_interp_map[mbmi->interp_filter]];
-#endif
       // If even the 'Y' rd value of split is higher than best so far
       // then dont bother looking at UV
       if (tmp_rd < best_yrd) {
-        rd_inter4x4_uv(cpi, x, &rate_uv, &distortion_uv, cpi->common.full_pixel);
+        int uv_skippable;
+
+        rd_inter4x4_uv(cpi, x, &rate_uv, &distortion_uv, &uv_skippable,
+                       cpi->common.full_pixel);
         rate2 += rate_uv;
         distortion2 += distortion_uv;
+        skippable = skippable && uv_skippable;
       } else {
         this_rd = INT64_MAX;
         disable_skip = 1;
@@ -3852,13 +3918,11 @@
       rate2 += vp8_cost_bit(cpi->common.prob_pred_filter_off,
                             xd->mode_info_context->mbmi.pred_filter_enabled);
 #endif
-#if CONFIG_SWITCHABLE_INTERP
       if (cpi->common.mcomp_filter_type == SWITCHABLE)
         rate2 += SWITCHABLE_INTERP_RATE_FACTOR * x->switchable_interp_costs
             [get_pred_context(&cpi->common, xd, PRED_SWITCHABLE_INTERP)]
             [vp8_switchable_interp_map[
             x->e_mbd.mode_info_context->mbmi.interp_filter]];
-#endif
 
       /* We don't include the cost of the second reference here, because there are only
        * three options: Last/Golden, ARF/Last or Golden/ARF, or in other words if you
@@ -3883,8 +3947,7 @@
         if (threshold < x->encode_breakout)
           threshold = x->encode_breakout;
 
-        var = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16)
-              (*(b->base_src), b->src_stride,
+        var = vp8_variance16x16(*(b->base_src), b->src_stride,
                x->e_mbd.predictor, 16, &sse);
 
         if (sse < threshold) {
@@ -3894,7 +3957,7 @@
           if ((sse - var < q2dc *q2dc >> 4) ||
               (sse / 2 > var && sse - var < 64)) {
             // Check u and v to make sure skip is ok
-            int sse2 =  VP8_UVSSE(x, IF_RTCD(&cpi->rtcd.variance));
+            int sse2 =  vp8_uvsse(x);
             if (sse2 * 2 < threshold) {
               x->skip = 1;
               distortion2 = sse + sse2;
@@ -3906,22 +3969,22 @@
 
               disable_skip = 1;
               this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
-
-              break;
             }
           }
         }
       }
 
-      vp8_build_1st_inter16x16_predictors_mbuv(&x->e_mbd, &xd->predictor[256],
-                                               &xd->predictor[320], 8);
-      if (is_comp_pred)
-        vp8_build_2nd_inter16x16_predictors_mbuv(&x->e_mbd,
-                                                 &xd->predictor[256],
+      if (!x->skip) {
+        vp8_build_1st_inter16x16_predictors_mbuv(&x->e_mbd, &xd->predictor[256],
                                                  &xd->predictor[320], 8);
-      inter_mode_cost(cpi, x, this_mode, &rate2, &distortion2,
-                      &rate_y, &distortion, &rate_uv, &distortion_uv,
-                      &skippable, txfm_cache);
+        if (is_comp_pred)
+          vp8_build_2nd_inter16x16_predictors_mbuv(&x->e_mbd,
+                                                   &xd->predictor[256],
+                                                   &xd->predictor[320], 8);
+        inter_mode_cost(cpi, x, this_mode, &rate2, &distortion2,
+                        &rate_y, &distortion, &rate_uv, &distortion_uv,
+                        &skippable, txfm_cache);
+      }
       if (is_comp_pred)
         mode_excluded = cpi->common.comp_pred_mode == SINGLE_PREDICTION_ONLY;
       else
@@ -4019,10 +4082,6 @@
           // Note index of best mode so far
           best_mode_index = mode_index;
 
-#if CONFIG_HYBRIDTRANSFORM16X16
-          best_txtype = rd_txtype;
-#endif
-
           if (this_mode <= B_PRED) {
             if (mbmi->txfm_size != TX_4X4
                 && this_mode != B_PRED
@@ -4106,7 +4165,7 @@
       if (!mode_excluded && this_rd != INT64_MAX) {
         for (i = 0; i < NB_TXFM_MODES; i++) {
           int64_t adj_rd;
-          if (this_mode != B_PRED && this_mode != SPLITMV) {
+          if (this_mode != B_PRED) {
             adj_rd = this_rd + txfm_cache[i] - txfm_cache[cm->txfm_mode];
           } else {
             adj_rd = this_rd;
@@ -4130,7 +4189,6 @@
   else
     ++cpi->pred_filter_off_count;
 #endif
-#if CONFIG_SWITCHABLE_INTERP
   if (cpi->common.mcomp_filter_type == SWITCHABLE &&
       best_mbmode.mode >= NEARESTMV &&
       best_mbmode.mode <= SPLITMV) {
@@ -4138,7 +4196,6 @@
         [get_pred_context(&cpi->common, xd, PRED_SWITCHABLE_INTERP)]
         [vp8_switchable_interp_map[best_mbmode.interp_filter]];
   }
-#endif
 
   // Reduce the activation RD thresholds for the best choice mode
   if ((cpi->rd_baseline_thresh[best_mode_index] > 0) &&
@@ -4164,11 +4221,9 @@
       (cpi->oxcf.arnr_max_frames == 0) &&
       (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME)) {
     mbmi->mode = ZEROMV;
-#if CONFIG_TX_SELECT
     if (cm->txfm_mode != TX_MODE_SELECT)
       mbmi->txfm_size = cm->txfm_mode;
     else
-#endif
       mbmi->txfm_size = TX_16X16;
     mbmi->ref_frame = ALTREF_FRAME;
     mbmi->mv[0].as_int = 0;
@@ -4195,11 +4250,6 @@
     }
   }
 
-#if CONFIG_HYBRIDTRANSFORM16X16
-  if (best_mbmode.mode < I8X8_PRED)
-    xd->mode_info_context->bmi[0].as_mode.tx_type = best_txtype;
-#endif
-
   if (best_mbmode.mode == I8X8_PRED)
     set_i8x8_block_modes(x, mode8x8);
 
@@ -4223,7 +4273,6 @@
       best_pred_diff[i] = best_rd - best_pred_rd[i];
   }
 
-#if CONFIG_TX_SELECT
   if (!x->skip) {
     for (i = 0; i < NB_TXFM_MODES; i++) {
       if (best_txfm_rd[i] == INT64_MAX)
@@ -4234,7 +4283,6 @@
   } else {
     vpx_memset(best_txfm_diff, 0, sizeof(best_txfm_diff));
   }
-#endif
 
 end:
   store_coding_context(x, &x->mb_context[xd->mb_index], best_mode_index, &best_partition,
@@ -4304,10 +4352,6 @@
   TX_SIZE txfm_size_16x16;
   int i;
 
-#if CONFIG_HYBRIDTRANSFORM16X16
-  int best_txtype;
-#endif
-
   mbmi->ref_frame = INTRA_FRAME;
   rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv,
                           &uv_intra_skippable);
@@ -4329,10 +4373,6 @@
                                           &rate16x16_tokenonly, &dist16x16,
                                           &y_intra16x16_skippable, txfm_cache);
   mode16x16 = mbmi->mode;
-#if CONFIG_HYBRIDTRANSFORM16X16
-  best_txtype = xd->block[0].bmi.as_mode.tx_type;
-  xd->mode_info_context->bmi[0].as_mode.tx_type = best_txtype;
-#endif
   txfm_size_16x16 = mbmi->txfm_size;
 
   // FIXME(rbultje) support transform-size selection
@@ -4373,10 +4413,8 @@
            vp8_cost_bit(get_pred_prob(cm, xd, PRED_MBSKIP), 1);
     dist = dist16x16 + (distuv8x8 >> 2);
     mbmi->txfm_size = txfm_size_16x16;
-#if CONFIG_TX_SELECT
     memset(x->mb_context[xd->mb_index].txfm_rd_diff, 0,
            sizeof(x->mb_context[xd->mb_index].txfm_rd_diff));
-#endif
   } else if (error8x8 > error16x16) {
     if (error4x4 < error16x16) {
       rate = rateuv;
@@ -4393,24 +4431,16 @@
       mbmi->mode = B_PRED;
       mbmi->txfm_size = TX_4X4;
       dist = dist4x4 + (distuv >> 2);
-#if CONFIG_TX_SELECT
       memset(x->mb_context[xd->mb_index].txfm_rd_diff, 0,
              sizeof(x->mb_context[xd->mb_index].txfm_rd_diff));
-#endif
     } else {
       mbmi->txfm_size = txfm_size_16x16;
       mbmi->mode = mode16x16;
       rate = rate16x16 + rateuv8x8;
       dist = dist16x16 + (distuv8x8 >> 2);
-#if CONFIG_HYBRIDTRANSFORM16X16
-      // save this into supermacroblock coding decision buffer
-      xd->mode_info_context->bmi[0].as_mode.tx_type = best_txtype;
-#endif
-#if CONFIG_TX_SELECT
       for (i = 0; i < NB_TXFM_MODES; i++) {
         x->mb_context[xd->mb_index].txfm_rd_diff[i] = error16x16 - txfm_cache[i];
       }
-#endif
     }
     if (cpi->common.mb_no_coeff_skip)
       rate += vp8_cost_bit(get_pred_prob(cm, xd, PRED_MBSKIP), 0);
@@ -4430,10 +4460,8 @@
       mbmi->mode = B_PRED;
       mbmi->txfm_size = TX_4X4;
       dist = dist4x4 + (distuv >> 2);
-#if CONFIG_TX_SELECT
       memset(x->mb_context[xd->mb_index].txfm_rd_diff, 0,
              sizeof(x->mb_context[xd->mb_index].txfm_rd_diff));
-#endif
     } else {
       // FIXME(rbultje) support transform-size selection
       mbmi->mode = I8X8_PRED;
@@ -4441,10 +4469,8 @@
       set_i8x8_block_modes(x, mode8x8);
       rate = rate8x8 + rateuv;
       dist = dist8x8 + (distuv >> 2);
-#if CONFIG_TX_SELECT
       memset(x->mb_context[xd->mb_index].txfm_rd_diff, 0,
              sizeof(x->mb_context[xd->mb_index].txfm_rd_diff));
-#endif
     }
     if (cpi->common.mb_no_coeff_skip)
       rate += vp8_cost_bit(get_pred_prob(cm, xd, PRED_MBSKIP), 0);
@@ -4801,8 +4827,8 @@
             if (threshold < x->encode_breakout)
               threshold = x->encode_breakout;
 
-            var = VARIANCE_INVOKE(&cpi->rtcd.variance, var32x32)(*(b->base_src),
-              b->src_stride, xd->dst.y_buffer, xd->dst.y_stride, &sse);
+            var = vp8_variance32x32(*(b->base_src), b->src_stride,
+                                    xd->dst.y_buffer, xd->dst.y_stride, &sse);
 
             if (sse < threshold) {
               unsigned int q2dc = xd->block[24].dequant[0];
@@ -4812,11 +4838,9 @@
                   (sse / 2 > var && sse - var < 64)) {
                 // Check u and v to make sure skip is ok
                 unsigned int sse2, sse3;
-                var += VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16)
-                                  (x->src.u_buffer, x->src.uv_stride,
+                var += vp8_variance16x16(x->src.u_buffer, x->src.uv_stride,
                                    xd->dst.u_buffer, xd->dst.uv_stride, &sse2);
-                var += VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16)
-                                  (x->src.v_buffer, x->src.uv_stride,
+                var += vp8_variance16x16(x->src.v_buffer, x->src.uv_stride,
                                    xd->dst.v_buffer, xd->dst.uv_stride, &sse3);
                 sse2 += sse3;
                 if (sse2 * 2 < threshold) {
diff --git a/vp8/encoder/sad_c.c b/vp8/encoder/sad_c.c
index 2e86a16..f15e687 100644
--- a/vp8/encoder/sad_c.c
+++ b/vp8/encoder/sad_c.c
@@ -10,33 +10,10 @@
 
 
 #include <stdlib.h>
+#include "vp8/common/sadmxn.h"
 #include "vpx_ports/config.h"
 #include "vpx/vpx_integer.h"
 
-static __inline
-unsigned int sad_mx_n_c(
-  const unsigned char *src_ptr,
-  int  src_stride,
-  const unsigned char *ref_ptr,
-  int  ref_stride,
-  int m,
-  int n) {
-
-  int r, c;
-  unsigned int sad = 0;
-
-  for (r = 0; r < n; r++) {
-    for (c = 0; c < m; c++) {
-      sad += abs(src_ptr[c] - ref_ptr[c]);
-    }
-
-    src_ptr += src_stride;
-    ref_ptr += ref_stride;
-  }
-
-  return sad;
-}
-
 unsigned int vp8_sad32x32_c(const unsigned char *src_ptr,
                             int  src_stride,
                             const unsigned char *ref_ptr,
@@ -97,25 +74,6 @@
   return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 4, 4);
 }
 
-#if CONFIG_NEWBESTREFMV
-unsigned int vp8_sad3x16_c(
-  const unsigned char *src_ptr,
-  int  src_stride,
-  const unsigned char *ref_ptr,
-  int  ref_stride,
-  int max_sad){
-  return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 3, 16);
-}
-unsigned int vp8_sad16x3_c(
-  const unsigned char *src_ptr,
-  int  src_stride,
-  const unsigned char *ref_ptr,
-  int  ref_stride,
-  int max_sad){
-  return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, 16, 3);
-}
-#endif
-
 void vp8_sad32x32x3_c(const unsigned char *src_ptr,
                       int  src_stride,
                       const unsigned char *ref_ptr,
diff --git a/vp8/encoder/segmentation.c b/vp8/encoder/segmentation.c
index e88b80d..e85bb45 100644
--- a/vp8/encoder/segmentation.c
+++ b/vp8/encoder/segmentation.c
@@ -161,8 +161,8 @@
 }
 
 void choose_segmap_coding_method(VP8_COMP *cpi) {
-  VP8_COMMON *const cm = & cpi->common;
-  MACROBLOCKD *const xd = & cpi->mb.e_mbd;
+  VP8_COMMON *const cm = &cpi->common;
+  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
 
   int i;
   int tot_count;
diff --git a/vp8/encoder/ssim.c b/vp8/encoder/ssim.c
index d3d9711..865496a 100644
--- a/vp8/encoder/ssim.c
+++ b/vp8/encoder/ssim.c
@@ -11,18 +11,10 @@
 
 #include "onyx_int.h"
 
-void vp8_ssim_parms_16x16_c
-(
-  unsigned char *s,
-  int sp,
-  unsigned char *r,
-  int rp,
-  unsigned long *sum_s,
-  unsigned long *sum_r,
-  unsigned long *sum_sq_s,
-  unsigned long *sum_sq_r,
-  unsigned long *sum_sxr
-) {
+void vp8_ssim_parms_16x16_c(unsigned char *s, int sp, unsigned char *r,
+                            int rp, unsigned long *sum_s, unsigned long *sum_r,
+                            unsigned long *sum_sq_s, unsigned long *sum_sq_r,
+                            unsigned long *sum_sxr) {
   int i, j;
   for (i = 0; i < 16; i++, s += sp, r += rp) {
     for (j = 0; j < 16; j++) {
@@ -34,18 +26,10 @@
     }
   }
 }
-void vp8_ssim_parms_8x8_c
-(
-  unsigned char *s,
-  int sp,
-  unsigned char *r,
-  int rp,
-  unsigned long *sum_s,
-  unsigned long *sum_r,
-  unsigned long *sum_sq_s,
-  unsigned long *sum_sq_r,
-  unsigned long *sum_sxr
-) {
+void vp8_ssim_parms_8x8_c(unsigned char *s, int sp, unsigned char *r, int rp,
+                          unsigned long *sum_s, unsigned long *sum_r,
+                          unsigned long *sum_sq_s, unsigned long *sum_sq_r,
+                          unsigned long *sum_sxr) {
   int i, j;
   for (i = 0; i < 8; i++, s += sp, r += rp) {
     for (j = 0; j < 8; j++) {
@@ -61,15 +45,9 @@
 const static int64_t cc1 =  26634; // (64^2*(.01*255)^2
 const static int64_t cc2 = 239708; // (64^2*(.03*255)^2
 
-static double similarity
-(
-  unsigned long sum_s,
-  unsigned long sum_r,
-  unsigned long sum_sq_s,
-  unsigned long sum_sq_r,
-  unsigned long sum_sxr,
-  int count
-) {
+static double similarity(unsigned long sum_s, unsigned long sum_r,
+                         unsigned long sum_sq_s, unsigned long sum_sq_r,
+                         unsigned long sum_sxr, int count) {
   int64_t ssim_n, ssim_d;
   int64_t c1, c2;
 
@@ -87,23 +65,22 @@
   return ssim_n * 1.0 / ssim_d;
 }
 
-static double ssim_16x16(unsigned char *s, int sp, unsigned char *r, int rp,
-                         const vp8_variance_rtcd_vtable_t *rtcd) {
+static double ssim_16x16(unsigned char *s, int sp, unsigned char *r, int rp) {
   unsigned long sum_s = 0, sum_r = 0, sum_sq_s = 0, sum_sq_r = 0, sum_sxr = 0;
-  SSIMPF_INVOKE(rtcd, 16x16)(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r, &sum_sxr);
+  vp8_ssim_parms_16x16(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r,
+                       &sum_sxr);
   return similarity(sum_s, sum_r, sum_sq_s, sum_sq_r, sum_sxr, 256);
 }
-static double ssim_8x8(unsigned char *s, int sp, unsigned char *r, int rp,
-                       const vp8_variance_rtcd_vtable_t *rtcd) {
+static double ssim_8x8(unsigned char *s, int sp, unsigned char *r, int rp) {
   unsigned long sum_s = 0, sum_r = 0, sum_sq_s = 0, sum_sq_r = 0, sum_sxr = 0;
-  SSIMPF_INVOKE(rtcd, 8x8)(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r, &sum_sxr);
+  vp8_ssim_parms_8x8(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r,
+                     &sum_sxr);
   return similarity(sum_s, sum_r, sum_sq_s, sum_sq_r, sum_sxr, 64);
 }
 
 // TODO: (jbb) tried to scale this function such that we may be able to use it
 // for distortion metric in mode selection code ( provided we do a reconstruction)
-long dssim(unsigned char *s, int sp, unsigned char *r, int rp,
-           const vp8_variance_rtcd_vtable_t *rtcd) {
+long dssim(unsigned char *s, int sp, unsigned char *r, int rp) {
   unsigned long sum_s = 0, sum_r = 0, sum_sq_s = 0, sum_sq_r = 0, sum_sxr = 0;
   int64_t ssim3;
   int64_t ssim_n1, ssim_n2;
@@ -115,7 +92,8 @@
   c1 = cc1 * 16;
   c2 = cc2 * 16;
 
-  SSIMPF_INVOKE(rtcd, 16x16)(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r, &sum_sxr);
+  vp8_ssim_parms_16x16(s, sp, r, rp, &sum_s, &sum_r, &sum_sq_s, &sum_sq_r,
+                       &sum_sxr);
   ssim_n1 = (2 * sum_s * sum_r + c1);
 
   ssim_n2 = ((int64_t) 2 * 256 * sum_sxr - (int64_t) 2 * sum_s * sum_r + c2);
@@ -137,16 +115,8 @@
 // We are using a 8x8 moving window with starting location of each 8x8 window
 // on the 4x4 pixel grid. Such arrangement allows the windows to overlap
 // block boundaries to penalize blocking artifacts.
-double vp8_ssim2
-(
-  unsigned char *img1,
-  unsigned char *img2,
-  int stride_img1,
-  int stride_img2,
-  int width,
-  int height,
-  const vp8_variance_rtcd_vtable_t *rtcd
-) {
+double vp8_ssim2(unsigned char *img1, unsigned char *img2, int stride_img1,
+                 int stride_img2, int width, int height) {
   int i, j;
   int samples = 0;
   double ssim_total = 0;
@@ -154,7 +124,7 @@
   // sample point start with each 4x4 location
   for (i = 0; i < height - 8; i += 4, img1 += stride_img1 * 4, img2 += stride_img2 * 4) {
     for (j = 0; j < width - 8; j += 4) {
-      double v = ssim_8x8(img1 + j, stride_img1, img2 + j, stride_img2, rtcd);
+      double v = ssim_8x8(img1 + j, stride_img1, img2 + j, stride_img2);
       ssim_total += v;
       samples++;
     }
@@ -162,28 +132,22 @@
   ssim_total /= samples;
   return ssim_total;
 }
-double vp8_calc_ssim
-(
-  YV12_BUFFER_CONFIG *source,
-  YV12_BUFFER_CONFIG *dest,
-  int lumamask,
-  double *weight,
-  const vp8_variance_rtcd_vtable_t *rtcd
-) {
+double vp8_calc_ssim(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest,
+                     int lumamask, double *weight) {
   double a, b, c;
   double ssimv;
 
   a = vp8_ssim2(source->y_buffer, dest->y_buffer,
                 source->y_stride, dest->y_stride, source->y_width,
-                source->y_height, rtcd);
+                source->y_height);
 
   b = vp8_ssim2(source->u_buffer, dest->u_buffer,
                 source->uv_stride, dest->uv_stride, source->uv_width,
-                source->uv_height, rtcd);
+                source->uv_height);
 
   c = vp8_ssim2(source->v_buffer, dest->v_buffer,
                 source->uv_stride, dest->uv_stride, source->uv_width,
-                source->uv_height, rtcd);
+                source->uv_height);
 
   ssimv = a * .8 + .1 * (b + c);
 
@@ -192,29 +156,22 @@
   return ssimv;
 }
 
-double vp8_calc_ssimg
-(
-  YV12_BUFFER_CONFIG *source,
-  YV12_BUFFER_CONFIG *dest,
-  double *ssim_y,
-  double *ssim_u,
-  double *ssim_v,
-  const vp8_variance_rtcd_vtable_t *rtcd
-) {
+double vp8_calc_ssimg(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest,
+                      double *ssim_y, double *ssim_u, double *ssim_v) {
   double ssim_all = 0;
   double a, b, c;
 
   a = vp8_ssim2(source->y_buffer, dest->y_buffer,
                 source->y_stride, dest->y_stride, source->y_width,
-                source->y_height, rtcd);
+                source->y_height);
 
   b = vp8_ssim2(source->u_buffer, dest->u_buffer,
                 source->uv_stride, dest->uv_stride, source->uv_width,
-                source->uv_height, rtcd);
+                source->uv_height);
 
   c = vp8_ssim2(source->v_buffer, dest->v_buffer,
                 source->uv_stride, dest->uv_stride, source->uv_width,
-                source->uv_height, rtcd);
+                source->uv_height);
   *ssim_y = a;
   *ssim_u = b;
   *ssim_v = c;
diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c
index c72c1e7..2ddae1c 100644
--- a/vp8/encoder/tokenize.c
+++ b/vp8/encoder/tokenize.c
@@ -26,38 +26,26 @@
 
 #ifdef ENTROPY_STATS
 INT64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#if CONFIG_HYBRIDTRANSFORM
 INT64 hybrid_context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
 
 INT64 context_counters_8x8[BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#if CONFIG_HYBRIDTRANSFORM8X8
 INT64 hybrid_context_counters_8x8[BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
 
 INT64 context_counters_16x16[BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#if CONFIG_HYBRIDTRANSFORM16X16
 INT64 hybrid_context_counters_16x16[BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
-#endif
 
 extern unsigned int tree_update_hist[BLOCK_TYPES][COEF_BANDS]
                     [PREV_COEF_CONTEXTS][ENTROPY_NODES][2];
-#if CONFIG_HYBRIDTRANSFORM
 extern unsigned int hybrid_tree_update_hist[BLOCK_TYPES][COEF_BANDS]
                     [PREV_COEF_CONTEXTS][ENTROPY_NODES][2];
-#endif
 extern unsigned int tree_update_hist_8x8[BLOCK_TYPES_8X8][COEF_BANDS]
                     [PREV_COEF_CONTEXTS][ENTROPY_NODES] [2];
-#if CONFIG_HYBRIDTRANSFORM8X8
 extern unsigned int hybrid_tree_update_hist_8x8[BLOCK_TYPES_8X8][COEF_BANDS]
                     [PREV_COEF_CONTEXTS][ENTROPY_NODES] [2];
-#endif
 extern unsigned int tree_update_hist_16x16[BLOCK_TYPES_16X16][COEF_BANDS]
                     [PREV_COEF_CONTEXTS][ENTROPY_NODES] [2];
-#if CONFIG_HYBRIDTRANSFORM16X16
 extern unsigned int hybrid_tree_update_hist_16x16[BLOCK_TYPES_16X16][COEF_BANDS]
                     [PREV_COEF_CONTEXTS][ENTROPY_NODES] [2];
-#endif
 #endif  /* ENTROPY_STATS */
 
 void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *xd, TOKENEXTRA **t, int dry_run);
@@ -134,9 +122,7 @@
   const int eob = b->eob;     /* one beyond last nonzero coeff */
   TOKENEXTRA *t = *tp;        /* store tokens starting here */
   const short *qcoeff_ptr = b->qcoeff;
-#if CONFIG_HYBRIDTRANSFORM16X16
   TX_TYPE tx_type = get_tx_type(xd, b);
-#endif
   int seg_eob = 256;
   int segment_id = xd->mode_info_context->mbmi.segment_id;
 
@@ -162,21 +148,18 @@
     }
 
     t->Token = x;
-#if CONFIG_HYBRIDTRANSFORM16X16
     if (tx_type != DCT_DCT)
       t->context_tree = cpi->common.fc.hybrid_coef_probs_16x16[type][band][pt];
     else
-#endif
       t->context_tree = cpi->common.fc.coef_probs_16x16[type][band][pt];
 
     t->skip_eob_node = pt == 0 && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) ||
                                    (band > 1 && type == PLANE_TYPE_Y_NO_DC));
+    assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0);
     if (!dry_run) {
-#if CONFIG_HYBRIDTRANSFORM16X16
       if (tx_type != DCT_DCT)
         ++cpi->hybrid_coef_counts_16x16[type][band][pt][x];
       else
-#endif
         ++cpi->coef_counts_16x16[type][band][pt][x];
     }
     pt = vp8_prev_token_class[x];
@@ -309,10 +292,7 @@
   int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0; /* start at DC unless type 0 */
   TOKENEXTRA *t = *tp;        /* store tokens starting here */
   const short *qcoeff_ptr = b->qcoeff;
-#if CONFIG_HYBRIDTRANSFORM8X8
-  TX_TYPE tx_type = xd->mode_info_context->mbmi.mode == I8X8_PRED ?
-      get_tx_type(xd, b) : DCT_DCT;
-#endif
+  TX_TYPE tx_type = get_tx_type(xd, b);
   const int eob = b->eob;
   int seg_eob = 64;
   int segment_id = xd->mode_info_context->mbmi.segment_id;
@@ -338,11 +318,9 @@
       x = DCT_EOB_TOKEN;
 
     t->Token = x;
-#if CONFIG_HYBRIDTRANSFORM8X8
     if (tx_type != DCT_DCT)
       t->context_tree = cpi->common.fc.hybrid_coef_probs_8x8[type][band][pt];
     else
-#endif
       t->context_tree = cpi->common.fc.coef_probs_8x8[type][band][pt];
 
     t->skip_eob_node = pt == 0 && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) ||
@@ -350,11 +328,9 @@
     assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0);
 
     if (!dry_run) {
-#if CONFIG_HYBRIDTRANSFORM8X8
       if (tx_type != DCT_DCT)
         ++cpi->hybrid_coef_counts_8x8[type][band][pt][x];
       else
-#endif
         ++cpi->coef_counts_8x8[type][band][pt][x];
     }
     pt = vp8_prev_token_class[x];
@@ -427,60 +403,47 @@
   }
 }
 
-#if CONFIG_HYBRIDTRANSFORM
-static void tokenize1st_order_ht_4x4(MACROBLOCKD *xd,
-                                     TOKENEXTRA **tp,
-                                     PLANE_TYPE type,
-                                     VP8_COMP *cpi,
-                                     int dry_run) {
+static void tokenize1st_order_b_4x4(MACROBLOCKD *xd,
+                                    TOKENEXTRA **tp,
+                                    PLANE_TYPE type,
+                                    VP8_COMP *cpi,
+                                    int dry_run) {
   unsigned int block;
   const BLOCKD *b = xd->block;
   int pt;             /* near block/prev token context index */
   TOKENEXTRA *t = *tp;/* store tokens starting here */
-  ENTROPY_CONTEXT * a;
-  ENTROPY_CONTEXT * l;
-  int const *pt_scan ;
+  ENTROPY_CONTEXT *a, *l;
   int seg_eob = 16;
   int segment_id = xd->mode_info_context->mbmi.segment_id;
+  int const *pt_scan = vp8_default_zig_zag1d;
 
-  if ( segfeature_active( xd, segment_id, SEG_LVL_EOB ) ) {
-    seg_eob = get_segdata( xd, segment_id, SEG_LVL_EOB );
+  if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) {
+    seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB);
   }
 
   /* Luma */
   for (block = 0; block < 16; block++, b++) {
     const int eob = b->eob;
-    TX_TYPE tx_type = DCT_DCT;
-    const int tmp1 = vp8_block2above[block];
-    const int tmp2 = vp8_block2left[block];
     const int16_t *qcoeff_ptr = b->qcoeff;
     int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0;
 
-    a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
-    l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
+    TX_TYPE tx_type = get_tx_type(xd, &xd->block[block]);
+    switch (tx_type) {
+      case ADST_DCT:
+        pt_scan = vp8_row_scan;
+        break;
+      case DCT_ADST:
+        pt_scan = vp8_col_scan;
+        break;
+      default :
+        pt_scan = vp8_default_zig_zag1d;
+        break;
+    }
+    a = (ENTROPY_CONTEXT *)xd->above_context + vp8_block2above[block];
+    l = (ENTROPY_CONTEXT *)xd->left_context + vp8_block2left[block];
     VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
 
-    if( xd->mode_info_context->mbmi.mode == B_PRED ) {
-      tx_type = get_tx_type(xd, b);
-    }
-
-    // assign scanning order for luma components coded in intra4x4 mode
-    if ((xd->mode_info_context->mbmi.mode == B_PRED) &&
-        (type == PLANE_TYPE_Y_WITH_DC)) {
-      switch (tx_type) {
-        case ADST_DCT:
-          pt_scan = vp8_row_scan;
-          break;
-        case DCT_ADST:
-          pt_scan = vp8_col_scan;
-          break;
-        default :
-          pt_scan = vp8_default_zig_zag1d;
-          break;
-      }
-    } else {
-      pt_scan = vp8_default_zig_zag1d;
-    }
+    assert(b->eob <= 16);
 
     do {
       const int band = vp8_coef_bands[c];
@@ -504,12 +467,11 @@
       t->skip_eob_node = pt == 0 && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) ||
                                      (band > 1 && type == PLANE_TYPE_Y_NO_DC));
       assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0);
-
       if (!dry_run) {
         if (tx_type != DCT_DCT)
           ++cpi->hybrid_coef_counts[type][band][pt][token];
         else
-          ++cpi->coef_counts       [type][band][pt][token];
+          ++cpi->coef_counts[type][band][pt][token];
       }
       pt = vp8_prev_token_class[token];
       ++t;
@@ -522,69 +484,6 @@
 
   tokenize1st_order_chroma_4x4(xd, tp, cpi, dry_run);
 }
-#endif
-
-static void tokenize1st_order_b_4x4(MACROBLOCKD *xd,
-                                    TOKENEXTRA **tp,
-                                    PLANE_TYPE type,
-                                    VP8_COMP *cpi,
-                                    int dry_run) {
-  unsigned int block;
-  const BLOCKD *b = xd->block;
-  int pt;             /* near block/prev token context index */
-  TOKENEXTRA *t = *tp;/* store tokens starting here */
-  ENTROPY_CONTEXT *a, *l;
-  int seg_eob = 16;
-  int segment_id = xd->mode_info_context->mbmi.segment_id;
-
-  if (segfeature_active(xd, segment_id, SEG_LVL_EOB)) {
-    seg_eob = get_segdata(xd, segment_id, SEG_LVL_EOB);
-  }
-
-  /* Luma */
-  for (block = 0; block < 16; block++, b++) {
-    const int eob = b->eob;
-    const int16_t *qcoeff_ptr = b->qcoeff;
-    int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0;
-
-    a = (ENTROPY_CONTEXT *)xd->above_context + vp8_block2above[block];
-    l = (ENTROPY_CONTEXT *)xd->left_context + vp8_block2left[block];
-    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
-
-    assert(b->eob <= 16);
-
-    do {
-      const int band = vp8_coef_bands[c];
-      int token;
-
-      if (c < eob) {
-        const int rc = vp8_default_zig_zag1d[c];
-        const int v = qcoeff_ptr[rc];
-
-        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
-        token    = vp8_dct_value_tokens_ptr[v].Token;
-      } else
-        token = DCT_EOB_TOKEN;
-
-      t->Token = token;
-      t->context_tree = cpi->common.fc.coef_probs[type][band][pt];
-
-      t->skip_eob_node = pt == 0 && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) ||
-                                     (band > 1 && type == PLANE_TYPE_Y_NO_DC));
-      assert(vp8_coef_encodings[t->Token].Len - t->skip_eob_node > 0);
-      if (!dry_run)
-        ++cpi->coef_counts[type][band][pt][token];
-      pt = vp8_prev_token_class[token];
-      ++t;
-    } while (c < eob && ++c < seg_eob);
-
-    *tp = t;
-    pt = (c != !type); /* 0 <-> all coeff data is zero */
-    *a = *l = pt;
-  }
-
-  tokenize1st_order_chroma_4x4(xd, tp, cpi, dry_run);
-}
 
 int mby_is_skippable_4x4(MACROBLOCKD *xd, int has_y2_block) {
   int skip = 1;
@@ -674,12 +573,6 @@
   int skip_inc;
   int segment_id = xd->mode_info_context->mbmi.segment_id;
 
-#if CONFIG_HYBRIDTRANSFORM
-    int QIndex = cpi->mb.q_index;
-    int active_ht = (QIndex < ACTIVE_HT) &&
-                    (xd->mode_info_context->mbmi.mode == B_PRED);
-#endif
-
   if (!segfeature_active(xd, segment_id, SEG_LVL_EOB) ||
       (get_segdata(xd, segment_id, SEG_LVL_EOB) != 0)) {
     skip_inc = 1;
@@ -696,7 +589,8 @@
       xd->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable_16x16(xd);
       break;
     case TX_8X8:
-      if (xd->mode_info_context->mbmi.mode == I8X8_PRED)
+      if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
+          xd->mode_info_context->mbmi.mode == SPLITMV)
         xd->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable_8x8_4x4uv(xd, 0);
       else
         xd->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable_8x8(xd, has_y2_block);
@@ -745,17 +639,15 @@
 
     tokenize1st_order_b_16x16(xd, xd->block, t, PLANE_TYPE_Y_WITH_DC,
                               A, L, cpi, dry_run);
+    A[1] = A[2] = A[3] = A[0];
+    L[1] = L[2] = L[3] = L[0];
 
-    for (b = 1; b < 16; b++) {
-      *(A + vp8_block2above[b]) = *(A);
-      *(L + vp8_block2left[b] ) = *(L);
-    }
     for (b = 16; b < 24; b += 4) {
       tokenize1st_order_b_8x8(xd, xd->block + b, t, PLANE_TYPE_UV,
                               A + vp8_block2above_8x8[b],
                               L + vp8_block2left_8x8[b], cpi, dry_run);
-      *(A + vp8_block2above_8x8[b]+1) = *(A + vp8_block2above_8x8[b]);
-      *(L + vp8_block2left_8x8[b]+1 ) = *(L + vp8_block2left_8x8[b]);
+      A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]];
+      L[vp8_block2left_8x8[b] + 1]  = L[vp8_block2left_8x8[b]];
     }
     vpx_memset(&A[8], 0, sizeof(A[8]));
     vpx_memset(&L[8], 0, sizeof(L[8]));
@@ -769,27 +661,23 @@
                               A + vp8_block2above_8x8[b],
                               L + vp8_block2left_8x8[b],
                               cpi, dry_run);
-      *(A + vp8_block2above_8x8[b] + 1) = *(A + vp8_block2above_8x8[b]);
-      *(L + vp8_block2left_8x8[b] + 1)  = *(L + vp8_block2left_8x8[b]);
+      A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]];
+      L[vp8_block2left_8x8[b] + 1]  = L[vp8_block2left_8x8[b]];
     }
-    if (xd->mode_info_context->mbmi.mode == I8X8_PRED) {
+    if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
+        xd->mode_info_context->mbmi.mode == SPLITMV) {
       tokenize1st_order_chroma_4x4(xd, t, cpi, dry_run);
     } else {
       for (b = 16; b < 24; b += 4) {
         tokenize1st_order_b_8x8(xd, xd->block + b, t, PLANE_TYPE_UV,
                                 A + vp8_block2above_8x8[b],
                                 L + vp8_block2left_8x8[b], cpi, dry_run);
-        *(A + vp8_block2above_8x8[b] + 1) = *(A + vp8_block2above_8x8[b]);
-        *(L + vp8_block2left_8x8[b] + 1) = *(L + vp8_block2left_8x8[b]);
+        A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]];
+        L[vp8_block2left_8x8[b] + 1]  = L[vp8_block2left_8x8[b]];
       }
     }
   } else {
-#if CONFIG_HYBRIDTRANSFORM
-    if (active_ht)
-      tokenize1st_order_ht_4x4(xd, t, plane_type, cpi, dry_run);
-    else
-#endif
-      tokenize1st_order_b_4x4(xd, t, plane_type, cpi, dry_run);
+    tokenize1st_order_b_4x4(xd, t, plane_type, cpi, dry_run);
   }
   if (dry_run)
     *t = t_backup;
@@ -1077,31 +965,24 @@
                                           int dry_run) {
   int pt; /* near block/prev token context index */
   TOKENEXTRA *t = *tp;        /* store tokens starting here */
-#if CONFIG_HYBRIDTRANSFORM8X8
-  TX_TYPE tx_type = xd->mode_info_context->mbmi.mode == I8X8_PRED ?
-      get_tx_type(xd, b) : DCT_DCT;
-#endif
+  TX_TYPE tx_type = get_tx_type(xd, b);
   const int band = vp8_coef_bands_8x8[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0];
   VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
   (void) b;
 
   t->Token = DCT_EOB_TOKEN;
-#if CONFIG_HYBRIDTRANSFORM8X8
   if (tx_type != DCT_DCT)
     t->context_tree = cpi->common.fc.hybrid_coef_probs_8x8[type][band][pt];
   else
-#endif
     t->context_tree = cpi->common.fc.coef_probs_8x8[type][band][pt];
   // t->section = 8;
   t->skip_eob_node = 0;
   ++t;
   *tp = t;
   if (!dry_run) {
-#if CONFIG_HYBRIDTRANSFORM8X8
     if (tx_type == DCT_DCT)
       ++cpi->hybrid_coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN];
     else
-#endif
       ++cpi->coef_counts_8x8[type][band][pt][DCT_EOB_TOKEN];
   }
   pt = 0; /* 0 <-> all coeff data is zero */
@@ -1157,8 +1038,8 @@
                          A + vp8_block2above_8x8[b],
                          L + vp8_block2left_8x8[b],
                          cpi, dry_run);
-    *(A + vp8_block2above_8x8[b] + 1) = *(A + vp8_block2above_8x8[b]);
-    *(L + vp8_block2left_8x8[b] + 1)  = *(L + vp8_block2left_8x8[b]);
+    A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]];
+    L[vp8_block2left_8x8[b] + 1]  = L[vp8_block2left_8x8[b]];
   }
 
   for (b = 16; b < 24; b += 4) {
@@ -1166,8 +1047,8 @@
                            A + vp8_block2above[b],
                            L + vp8_block2left[b],
                            cpi, dry_run);
-    *(A + vp8_block2above_8x8[b] + 1) = *(A + vp8_block2above_8x8[b]);
-    *(L + vp8_block2left_8x8[b] + 1) = *(L + vp8_block2left_8x8[b]);
+    A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]];
+    L[vp8_block2left_8x8[b] + 1]  = L[vp8_block2left_8x8[b]];
   }
   if (dry_run)
     *t = t_backup;
@@ -1183,29 +1064,23 @@
                                             int dry_run) {
   int pt; /* near block/prev token context index */
   TOKENEXTRA *t = *tp;        /* store tokens starting here */
-#if CONFIG_HYBRIDTRANSFORM16X16
   TX_TYPE tx_type = get_tx_type(xd, b);
-#endif
   const int band = vp8_coef_bands_16x16[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0];
   VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
   (void) b;
 
   t->Token = DCT_EOB_TOKEN;
-#if CONFIG_HYBRIDTRANSFORM16X16
   if (tx_type != DCT_DCT)
     t->context_tree = cpi->common.fc.hybrid_coef_probs_16x16[type][band][pt];
   else
-#endif
     t->context_tree = cpi->common.fc.coef_probs_16x16[type][band][pt];
   t->skip_eob_node = 0;
   ++t;
   *tp = t;
   if (!dry_run) {
-#if CONFIG_HYBRIDTRANSFORM16X16
     if (tx_type != DCT_DCT)
       ++cpi->hybrid_coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN];
     else
-#endif
       ++cpi->coef_counts_16x16[type][band][pt][DCT_EOB_TOKEN];
   }
   pt = 0; /* 0 <-> all coeff data is zero */
@@ -1221,17 +1096,15 @@
 
   stuff1st_order_b_16x16(xd, xd->block, t, PLANE_TYPE_Y_WITH_DC,
                          A, L, cpi, dry_run);
-  for (i = 1; i < 16; i++) {
-    *(A + vp8_block2above[i]) = *(A);
-    *(L +  vp8_block2left[i]) = *(L);
-  }
+  A[1] = A[2] = A[3] = A[0];
+  L[1] = L[2] = L[3] = L[0];
   for (b = 16; b < 24; b += 4) {
     stuff1st_order_buv_8x8(xd, xd->block + b, t,
         A + vp8_block2above[b],
         L + vp8_block2left[b],
         cpi, dry_run);
-    *(A + vp8_block2above_8x8[b]+1) = *(A + vp8_block2above_8x8[b]);
-    *(L + vp8_block2left_8x8[b]+1 ) = *(L + vp8_block2left_8x8[b]);
+    A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]];
+    L[vp8_block2left_8x8[b] + 1]  = L[vp8_block2left_8x8[b]];
   }
   vpx_memset(&A[8], 0, sizeof(A[8]));
   vpx_memset(&L[8], 0, sizeof(L[8]));
@@ -1272,28 +1145,22 @@
                                           int dry_run) {
   int pt; /* near block/prev token context index */
   TOKENEXTRA *t = *tp;        /* store tokens starting here */
-#if CONFIG_HYBRIDTRANSFORM
   TX_TYPE tx_type = get_tx_type(xd, b);
-#endif
   const int band = vp8_coef_bands[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0];
   VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
 
   t->Token = DCT_EOB_TOKEN;
-#if CONFIG_HYBRIDTRANSFORM
   if (tx_type != DCT_DCT)
     t->context_tree = cpi->common.fc.hybrid_coef_probs[type][band][pt];
   else
-#endif
     t->context_tree = cpi->common.fc.coef_probs[type][band][pt];
   t->skip_eob_node = 0;
   ++t;
   *tp = t;
   if (!dry_run) {
-#if CONFIG_HYBRIDTRANSFORM
     if (tx_type != DCT_DCT)
       ++cpi->hybrid_coef_counts[type][band][pt][DCT_EOB_TOKEN];
     else
-#endif
       ++cpi->coef_counts[type][band][pt][DCT_EOB_TOKEN];
   }
   pt = 0; /* 0 <-> all coeff data is zero */
@@ -1371,8 +1238,8 @@
                          A + vp8_block2above_8x8[b],
                          L + vp8_block2left_8x8[b],
                          cpi, dry_run);
-    *(A + vp8_block2above_8x8[b] + 1) = *(A + vp8_block2above_8x8[b]);
-    *(L + vp8_block2left_8x8[b] + 1)  = *(L + vp8_block2left_8x8[b]);
+    A[vp8_block2above_8x8[b] + 1] = A[vp8_block2above_8x8[b]];
+    L[vp8_block2left_8x8[b] + 1]  = L[vp8_block2left_8x8[b]];
   }
 
   for (b = 16; b < 24; b++)
@@ -1391,7 +1258,8 @@
   if (tx_size == TX_16X16) {
     vp8_stuff_mb_16x16(cpi, xd, t, dry_run);
   } else if (tx_size == TX_8X8) {
-    if (xd->mode_info_context->mbmi.mode == I8X8_PRED) {
+    if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
+        xd->mode_info_context->mbmi.mode == SPLITMV) {
       vp8_stuff_mb_8x8_4x4uv(cpi, xd, t, dry_run);
     } else {
       vp8_stuff_mb_8x8(cpi, xd, t, dry_run);
diff --git a/vp8/encoder/variance.h b/vp8/encoder/variance.h
index a2fadfc..cdeb390 100644
--- a/vp8/encoder/variance.h
+++ b/vp8/encoder/variance.h
@@ -12,507 +12,73 @@
 #ifndef VARIANCE_H
 #define VARIANCE_H
 
-#include "vpx_config.h"
+typedef unsigned int(*vp8_sad_fn_t)(const unsigned char *src_ptr,
+                                    int source_stride,
+                                    const unsigned char *ref_ptr,
+                                    int ref_stride,
+                                    unsigned int max_sad);
 
-#define prototype_sad(sym)\
-  unsigned int (sym)\
-  (\
-   const unsigned char *src_ptr, \
-   int source_stride, \
-   const unsigned char *ref_ptr, \
-   int  ref_stride, \
-   int max_sad\
-  )
+typedef void (*vp8_copy32xn_fn_t)(const unsigned char *src_ptr,
+                                  int source_stride,
+                                  const unsigned char *ref_ptr,
+                                  int ref_stride,
+                                  int n);
 
-#define prototype_sad_multi_same_address(sym)\
-  void (sym)\
-  (\
-   const unsigned char *src_ptr, \
-   int source_stride, \
-   const unsigned char *ref_ptr, \
-   int  ref_stride, \
-   unsigned int *sad_array\
-  )
+typedef void (*vp8_sad_multi_fn_t)(const unsigned char *src_ptr,
+                                   int source_stride,
+                                   const unsigned char *ref_ptr,
+                                   int  ref_stride,
+                                   unsigned int *sad_array);
 
-#define prototype_sad_multi_same_address_1(sym)\
-  void (sym)\
-  (\
-   const unsigned char *src_ptr, \
-   int source_stride, \
-   const unsigned char *ref_ptr, \
-   int  ref_stride, \
-   unsigned short *sad_array\
-  )
+typedef void (*vp8_sad_multi1_fn_t)(const unsigned char *src_ptr,
+                                    int source_stride,
+                                    const unsigned char *ref_ptr,
+                                    int  ref_stride,
+                                    unsigned short *sad_array);
 
-#define prototype_sad_multi_dif_address(sym)\
-  void (sym)\
-  (\
-   const unsigned char *src_ptr, \
-   int source_stride, \
-   unsigned char *ref_ptr[4], \
-   int  ref_stride, \
-   unsigned int *sad_array\
-  )
+typedef void (*vp8_sad_multi_d_fn_t)(const unsigned char *src_ptr,
+                                     int source_stride,
+                                     const unsigned char * const ref_ptr[],
+                                     int  ref_stride, unsigned int *sad_array);
 
-#define prototype_variance(sym) \
-  unsigned int (sym) \
-  (\
-   const unsigned char *src_ptr, \
-   int source_stride, \
-   const unsigned char *ref_ptr, \
-   int  ref_stride, \
-   unsigned int *sse\
-  )
+typedef unsigned int (*vp8_variance_fn_t)(const unsigned char *src_ptr,
+                                          int source_stride,
+                                          const unsigned char *ref_ptr,
+                                          int ref_stride,
+                                          unsigned int *sse);
 
-#define prototype_variance2(sym) \
-  unsigned int (sym) \
-  (\
-   const unsigned char *src_ptr, \
-   int source_stride, \
-   const unsigned char *ref_ptr, \
-   int  ref_stride, \
-   unsigned int *sse,\
-   int *sum\
-  )
+typedef unsigned int (*vp8_subpixvariance_fn_t)(const unsigned char  *src_ptr,
+                                                int source_stride,
+                                                int xoffset,
+                                                int yoffset,
+                                                const unsigned char *ref_ptr,
+                                                int Refstride,
+                                                unsigned int *sse);
 
-#define prototype_subpixvariance(sym) \
-  unsigned int (sym) \
-  ( \
-    const unsigned char  *src_ptr, \
-    int  source_stride, \
-    int  xoffset, \
-    int  yoffset, \
-    const unsigned char *ref_ptr, \
-    int Refstride, \
-    unsigned int *sse \
-  );
+typedef void (*vp8_ssimpf_fn_t)(unsigned char *s, int sp, unsigned char *r,
+                                int rp, unsigned long *sum_s,
+                                unsigned long *sum_r, unsigned long *sum_sq_s,
+                                unsigned long *sum_sq_r,
+                                unsigned long *sum_sxr);
 
-#define prototype_ssimpf(sym) \
-  void (sym) \
-  ( \
-    unsigned char *s, \
-    int sp, \
-    unsigned char *r, \
-    int rp, \
-    unsigned long *sum_s, \
-    unsigned long *sum_r, \
-    unsigned long *sum_sq_s, \
-    unsigned long *sum_sq_r, \
-    unsigned long *sum_sxr \
-  );
+typedef unsigned int (*vp8_getmbss_fn_t)(const short *);
 
-#define prototype_getmbss(sym) unsigned int (sym)(const short *)
+typedef unsigned int (*vp8_get16x16prederror_fn_t)(const unsigned char *src_ptr,
+                                                   int source_stride,
+                                                   const unsigned char *ref_ptr,
+                                                   int  ref_stride);
 
-#define prototype_get16x16prederror(sym)\
-  unsigned int (sym)\
-  (\
-   const unsigned char *src_ptr, \
-   int source_stride, \
-   const unsigned char *ref_ptr, \
-   int  ref_stride \
-  )
-
-#if ARCH_X86 || ARCH_X86_64
-#include "x86/variance_x86.h"
-#endif
-
-#if ARCH_ARM
-#include "arm/variance_arm.h"
-#endif
-
-#ifndef vp8_variance_sad4x4
-#define vp8_variance_sad4x4 vp8_sad4x4_c
-#endif
-extern prototype_sad(vp8_variance_sad4x4);
-
-#ifndef vp8_variance_sad8x8
-#define vp8_variance_sad8x8 vp8_sad8x8_c
-#endif
-extern prototype_sad(vp8_variance_sad8x8);
-
-#ifndef vp8_variance_sad8x16
-#define vp8_variance_sad8x16 vp8_sad8x16_c
-#endif
-extern prototype_sad(vp8_variance_sad8x16);
-
-#ifndef vp8_variance_sad16x8
-#define vp8_variance_sad16x8 vp8_sad16x8_c
-#endif
-extern prototype_sad(vp8_variance_sad16x8);
-
-#ifndef vp8_variance_sad16x16
-#define vp8_variance_sad16x16 vp8_sad16x16_c
-#endif
-extern prototype_sad(vp8_variance_sad16x16);
-
-#ifndef vp8_variance_sad32x32
-#define vp8_variance_sad32x32 vp8_sad32x32_c
-#endif
-extern prototype_sad(vp8_variance_sad32x32);
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-#ifndef vp8_variance_sad32x32x3
-#define vp8_variance_sad32x32x3 vp8_sad32x32x3_c
-#endif
-extern prototype_sad_multi_same_address(vp8_variance_sad32x32x3);
-
-#ifndef vp8_variance_sad16x16x3
-#define vp8_variance_sad16x16x3 vp8_sad16x16x3_c
-#endif
-extern prototype_sad_multi_same_address(vp8_variance_sad16x16x3);
-
-#ifndef vp8_variance_sad16x8x3
-#define vp8_variance_sad16x8x3 vp8_sad16x8x3_c
-#endif
-extern prototype_sad_multi_same_address(vp8_variance_sad16x8x3);
-
-#ifndef vp8_variance_sad8x8x3
-#define vp8_variance_sad8x8x3 vp8_sad8x8x3_c
-#endif
-extern prototype_sad_multi_same_address(vp8_variance_sad8x8x3);
-
-#ifndef vp8_variance_sad8x16x3
-#define vp8_variance_sad8x16x3 vp8_sad8x16x3_c
-#endif
-extern prototype_sad_multi_same_address(vp8_variance_sad8x16x3);
-
-#ifndef vp8_variance_sad4x4x3
-#define vp8_variance_sad4x4x3 vp8_sad4x4x3_c
-#endif
-extern prototype_sad_multi_same_address(vp8_variance_sad4x4x3);
-
-#ifndef vp8_variance_sad32x32x8
-#define vp8_variance_sad32x32x8 vp8_sad32x32x8_c
-#endif
-extern prototype_sad_multi_same_address_1(vp8_variance_sad32x32x8);
-
-#ifndef vp8_variance_sad16x16x8
-#define vp8_variance_sad16x16x8 vp8_sad16x16x8_c
-#endif
-extern prototype_sad_multi_same_address_1(vp8_variance_sad16x16x8);
-
-#ifndef vp8_variance_sad16x8x8
-#define vp8_variance_sad16x8x8 vp8_sad16x8x8_c
-#endif
-extern prototype_sad_multi_same_address_1(vp8_variance_sad16x8x8);
-
-#ifndef vp8_variance_sad8x8x8
-#define vp8_variance_sad8x8x8 vp8_sad8x8x8_c
-#endif
-extern prototype_sad_multi_same_address_1(vp8_variance_sad8x8x8);
-
-#ifndef vp8_variance_sad8x16x8
-#define vp8_variance_sad8x16x8 vp8_sad8x16x8_c
-#endif
-extern prototype_sad_multi_same_address_1(vp8_variance_sad8x16x8);
-
-#ifndef vp8_variance_sad4x4x8
-#define vp8_variance_sad4x4x8 vp8_sad4x4x8_c
-#endif
-extern prototype_sad_multi_same_address_1(vp8_variance_sad4x4x8);
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-#ifndef vp8_variance_sad32x32x4d
-#define vp8_variance_sad32x32x4d vp8_sad32x32x4d_c
-#endif
-extern prototype_sad_multi_dif_address(vp8_variance_sad32x32x4d);
-
-#ifndef vp8_variance_sad16x16x4d
-#define vp8_variance_sad16x16x4d vp8_sad16x16x4d_c
-#endif
-extern prototype_sad_multi_dif_address(vp8_variance_sad16x16x4d);
-
-#ifndef vp8_variance_sad16x8x4d
-#define vp8_variance_sad16x8x4d vp8_sad16x8x4d_c
-#endif
-extern prototype_sad_multi_dif_address(vp8_variance_sad16x8x4d);
-
-#ifndef vp8_variance_sad8x8x4d
-#define vp8_variance_sad8x8x4d vp8_sad8x8x4d_c
-#endif
-extern prototype_sad_multi_dif_address(vp8_variance_sad8x8x4d);
-
-#ifndef vp8_variance_sad8x16x4d
-#define vp8_variance_sad8x16x4d vp8_sad8x16x4d_c
-#endif
-extern prototype_sad_multi_dif_address(vp8_variance_sad8x16x4d);
-
-#ifndef vp8_variance_sad4x4x4d
-#define vp8_variance_sad4x4x4d vp8_sad4x4x4d_c
-#endif
-extern prototype_sad_multi_dif_address(vp8_variance_sad4x4x4d);
-
-#if ARCH_X86 || ARCH_X86_64
-#ifndef vp8_variance_copy32xn
-#define vp8_variance_copy32xn vp8_copy32xn_c
-#endif
-extern prototype_sad(vp8_variance_copy32xn);
-#endif
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-#ifndef vp8_variance_var4x4
-#define vp8_variance_var4x4 vp8_variance4x4_c
-#endif
-extern prototype_variance(vp8_variance_var4x4);
-
-#ifndef vp8_variance_var8x8
-#define vp8_variance_var8x8 vp8_variance8x8_c
-#endif
-extern prototype_variance(vp8_variance_var8x8);
-
-#ifndef vp8_variance_var8x16
-#define vp8_variance_var8x16 vp8_variance8x16_c
-#endif
-extern prototype_variance(vp8_variance_var8x16);
-
-#ifndef vp8_variance_var16x8
-#define vp8_variance_var16x8 vp8_variance16x8_c
-#endif
-extern prototype_variance(vp8_variance_var16x8);
-
-#ifndef vp8_variance_var16x16
-#define vp8_variance_var16x16 vp8_variance16x16_c
-#endif
-extern prototype_variance(vp8_variance_var16x16);
-
-#ifndef vp8_variance_var32x32
-#define vp8_variance_var32x32 vp8_variance32x32_c
-#endif
-extern prototype_variance(vp8_variance_var32x32);
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-#ifndef vp8_variance_subpixvar4x4
-#define vp8_variance_subpixvar4x4 vp8_sub_pixel_variance4x4_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixvar4x4);
-
-#ifndef vp8_variance_subpixvar8x8
-#define vp8_variance_subpixvar8x8 vp8_sub_pixel_variance8x8_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixvar8x8);
-
-#ifndef vp8_variance_subpixvar8x16
-#define vp8_variance_subpixvar8x16 vp8_sub_pixel_variance8x16_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixvar8x16);
-
-#ifndef vp8_variance_subpixvar16x8
-#define vp8_variance_subpixvar16x8 vp8_sub_pixel_variance16x8_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixvar16x8);
-
-#ifndef vp8_variance_subpixvar16x16
-#define vp8_variance_subpixvar16x16 vp8_sub_pixel_variance16x16_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixvar16x16);
-
-#ifndef vp8_variance_subpixvar32x32
-#define vp8_variance_subpixvar32x32 vp8_sub_pixel_variance32x32_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixvar32x32);
-
-#ifndef vp8_variance_halfpixvar16x16_h
-#define vp8_variance_halfpixvar16x16_h vp8_variance_halfpixvar16x16_h_c
-#endif
-extern prototype_variance(vp8_variance_halfpixvar16x16_h);
-
-#ifndef vp8_variance_halfpixvar32x32_h
-#define vp8_variance_halfpixvar32x32_h vp8_variance_halfpixvar32x32_h_c
-#endif
-extern prototype_variance(vp8_variance_halfpixvar32x32_h);
-
-#ifndef vp8_variance_halfpixvar16x16_v
-#define vp8_variance_halfpixvar16x16_v vp8_variance_halfpixvar16x16_v_c
-#endif
-extern prototype_variance(vp8_variance_halfpixvar16x16_v);
-
-#ifndef vp8_variance_halfpixvar32x32_v
-#define vp8_variance_halfpixvar32x32_v vp8_variance_halfpixvar32x32_v_c
-#endif
-extern prototype_variance(vp8_variance_halfpixvar32x32_v);
-
-#ifndef vp8_variance_halfpixvar16x16_hv
-#define vp8_variance_halfpixvar16x16_hv vp8_variance_halfpixvar16x16_hv_c
-#endif
-extern prototype_variance(vp8_variance_halfpixvar16x16_hv);
-
-#ifndef vp8_variance_halfpixvar32x32_hv
-#define vp8_variance_halfpixvar32x32_hv vp8_variance_halfpixvar32x32_hv_c
-#endif
-extern prototype_variance(vp8_variance_halfpixvar32x32_hv);
-
-#ifndef vp8_variance_subpixmse16x16
-#define vp8_variance_subpixmse16x16 vp8_sub_pixel_mse16x16_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixmse16x16);
-
-#ifndef vp8_variance_subpixmse32x32
-#define vp8_variance_subpixmse32x32 vp8_sub_pixel_mse32x32_c
-#endif
-extern prototype_subpixvariance(vp8_variance_subpixmse32x32);
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-#ifndef vp8_variance_getmbss
-#define vp8_variance_getmbss vp8_get_mb_ss_c
-#endif
-extern prototype_getmbss(vp8_variance_getmbss);
-
-#ifndef vp8_variance_mse16x16
-#define vp8_variance_mse16x16 vp8_mse16x16_c
-#endif
-extern prototype_variance(vp8_variance_mse16x16);
-
-#ifndef vp8_ssimpf_8x8
-#define vp8_ssimpf_8x8 vp8_ssim_parms_8x8_c
-#endif
-extern prototype_ssimpf(vp8_ssimpf_8x8)
-
-#ifndef vp8_ssimpf_16x16
-#define vp8_ssimpf_16x16 vp8_ssim_parms_16x16_c
-#endif
-extern prototype_ssimpf(vp8_ssimpf_16x16)
-
-#ifndef vp8_variance_satd16x16
-#define vp8_variance_satd16x16 vp8_satd16x16_c
-#endif
-extern prototype_variance(vp8_variance_satd16x16);
-
-typedef prototype_sad(*vp8_sad_fn_t);
-typedef prototype_sad_multi_same_address(*vp8_sad_multi_fn_t);
-typedef prototype_sad_multi_same_address_1(*vp8_sad_multi1_fn_t);
-typedef prototype_sad_multi_dif_address(*vp8_sad_multi_d_fn_t);
-typedef prototype_variance(*vp8_variance_fn_t);
-typedef prototype_variance2(*vp8_variance2_fn_t);
-typedef prototype_subpixvariance(*vp8_subpixvariance_fn_t);
-typedef prototype_getmbss(*vp8_getmbss_fn_t);
-typedef prototype_ssimpf(*vp8_ssimpf_fn_t);
-typedef prototype_get16x16prederror(*vp8_get16x16prederror_fn_t);
-
-typedef struct {
-  vp8_sad_fn_t             sad4x4;
-  vp8_sad_fn_t             sad8x8;
-  vp8_sad_fn_t             sad8x16;
-  vp8_sad_fn_t             sad16x8;
-  vp8_sad_fn_t             sad16x16;
-#if CONFIG_SUPERBLOCKS
-  vp8_sad_fn_t             sad32x32;
-#endif
-
-  vp8_variance_fn_t        var4x4;
-  vp8_variance_fn_t        var8x8;
-  vp8_variance_fn_t        var8x16;
-  vp8_variance_fn_t        var16x8;
-  vp8_variance_fn_t        var16x16;
-#if CONFIG_SUPERBLOCKS
-  vp8_variance_fn_t        var32x32;
-#endif
-
-  vp8_subpixvariance_fn_t  subpixvar4x4;
-  vp8_subpixvariance_fn_t  subpixvar8x8;
-  vp8_subpixvariance_fn_t  subpixvar8x16;
-  vp8_subpixvariance_fn_t  subpixvar16x8;
-  vp8_subpixvariance_fn_t  subpixvar16x16;
-#if CONFIG_SUPERBLOCKS
-  vp8_subpixvariance_fn_t  subpixvar32x32;
-#endif
-  vp8_variance_fn_t        halfpixvar16x16_h;
-  vp8_variance_fn_t        halfpixvar32x32_h;
-  vp8_variance_fn_t        halfpixvar16x16_v;
-#if CONFIG_SUPERBLOCKS
-  vp8_variance_fn_t        halfpixvar32x32_v;
-#endif
-  vp8_variance_fn_t        halfpixvar16x16_hv;
-#if CONFIG_SUPERBLOCKS
-  vp8_variance_fn_t        halfpixvar32x32_hv;
-#endif
-  vp8_subpixvariance_fn_t  subpixmse16x16;
-#if CONFIG_SUPERBLOCKS
-  vp8_subpixvariance_fn_t  subpixmse32x32;
-#endif
-
-  vp8_getmbss_fn_t         getmbss;
-  vp8_variance_fn_t        mse16x16;
-
-#if CONFIG_SUPERBLOCKS
-  vp8_sad_multi_fn_t       sad32x32x3;
-#endif
-  vp8_sad_multi_fn_t       sad16x16x3;
-  vp8_sad_multi_fn_t       sad16x8x3;
-  vp8_sad_multi_fn_t       sad8x16x3;
-  vp8_sad_multi_fn_t       sad8x8x3;
-  vp8_sad_multi_fn_t       sad4x4x3;
-
-#if CONFIG_SUPERBLOCKS
-  vp8_sad_multi1_fn_t      sad32x32x8;
-#endif
-  vp8_sad_multi1_fn_t      sad16x16x8;
-  vp8_sad_multi1_fn_t      sad16x8x8;
-  vp8_sad_multi1_fn_t      sad8x16x8;
-  vp8_sad_multi1_fn_t      sad8x8x8;
-  vp8_sad_multi1_fn_t      sad4x4x8;
-
-#if CONFIG_SUPERBLOCKS
-  vp8_sad_multi_d_fn_t     sad32x32x4d;
-#endif
-  vp8_sad_multi_d_fn_t     sad16x16x4d;
-  vp8_sad_multi_d_fn_t     sad16x8x4d;
-  vp8_sad_multi_d_fn_t     sad8x16x4d;
-  vp8_sad_multi_d_fn_t     sad8x8x4d;
-  vp8_sad_multi_d_fn_t     sad4x4x4d;
-
-#if ARCH_X86 || ARCH_X86_64
-  vp8_sad_fn_t             copy32xn;
-#endif
-
-#if CONFIG_INTERNAL_STATS
-  vp8_ssimpf_fn_t          ssimpf_8x8;
-  vp8_ssimpf_fn_t          ssimpf_16x16;
-#endif
-
-  vp8_variance_fn_t        satd16x16;
-} vp8_variance_rtcd_vtable_t;
-
-typedef struct {
-  vp8_sad_fn_t            sdf;
-  vp8_variance_fn_t       vf;
-  vp8_subpixvariance_fn_t svf;
-  vp8_variance_fn_t       svf_halfpix_h;
-  vp8_variance_fn_t       svf_halfpix_v;
-  vp8_variance_fn_t       svf_halfpix_hv;
-  vp8_sad_multi_fn_t      sdx3f;
-  vp8_sad_multi1_fn_t     sdx8f;
-  vp8_sad_multi_d_fn_t    sdx4df;
-#if ARCH_X86 || ARCH_X86_64
-  vp8_sad_fn_t            copymem;
-#endif
+typedef struct variance_vtable {
+    vp8_sad_fn_t            sdf;
+    vp8_variance_fn_t       vf;
+    vp8_subpixvariance_fn_t svf;
+    vp8_variance_fn_t       svf_halfpix_h;
+    vp8_variance_fn_t       svf_halfpix_v;
+    vp8_variance_fn_t       svf_halfpix_hv;
+    vp8_sad_multi_fn_t      sdx3f;
+    vp8_sad_multi1_fn_t     sdx8f;
+    vp8_sad_multi_d_fn_t    sdx4df;
+    vp8_copy32xn_fn_t       copymem;
 } vp8_variance_fn_ptr_t;
 
-#if CONFIG_RUNTIME_CPU_DETECT
-#define VARIANCE_INVOKE(ctx,fn) (ctx)->fn
-#define SSIMPF_INVOKE(ctx,fn) (ctx)->ssimpf_##fn
-#else
-#define VARIANCE_INVOKE(ctx,fn) vp8_variance_##fn
-#define SSIMPF_INVOKE(ctx,fn) vp8_ssimpf_##fn
-#endif
-
-#if CONFIG_NEWBESTREFMV
-unsigned int vp8_sad2x16_c(
-  const unsigned char *src_ptr,
-  int  src_stride,
-  const unsigned char *ref_ptr,
-  int  ref_stride,
-  int max_sad);
-unsigned int vp8_sad16x2_c(
-  const unsigned char *src_ptr,
-  int  src_stride,
-  const unsigned char *ref_ptr,
-  int  ref_stride,
-  int max_sad);
-#endif
-
 #endif
diff --git a/vp8/encoder/x86/variance_x86.h b/vp8/encoder/x86/variance_x86.h
deleted file mode 100644
index 0971f11..0000000
--- a/vp8/encoder/x86/variance_x86.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-
-#ifndef VARIANCE_X86_H
-#define VARIANCE_X86_H
-
-
-/* Note:
- *
- * This platform is commonly built for runtime CPU detection. If you modify
- * any of the function mappings present in this file, be sure to also update
- * them in the function pointer initialization code
- */
-#if HAVE_MMX
-extern prototype_sad(vp8_sad4x4_mmx);
-extern prototype_sad(vp8_sad8x8_mmx);
-extern prototype_sad(vp8_sad8x16_mmx);
-extern prototype_sad(vp8_sad16x8_mmx);
-extern prototype_sad(vp8_sad16x16_mmx);
-extern prototype_variance(vp8_variance4x4_mmx);
-extern prototype_variance(vp8_variance8x8_mmx);
-extern prototype_variance(vp8_variance8x16_mmx);
-extern prototype_variance(vp8_variance16x8_mmx);
-extern prototype_variance(vp8_variance16x16_mmx);
-extern prototype_subpixvariance(vp8_sub_pixel_variance4x4_mmx);
-extern prototype_subpixvariance(vp8_sub_pixel_variance8x8_mmx);
-extern prototype_subpixvariance(vp8_sub_pixel_variance8x16_mmx);
-extern prototype_subpixvariance(vp8_sub_pixel_variance16x8_mmx);
-extern prototype_subpixvariance(vp8_sub_pixel_variance16x16_mmx);
-extern prototype_variance(vp8_variance_halfpixvar16x16_h_mmx);
-extern prototype_variance(vp8_variance_halfpixvar16x16_v_mmx);
-extern prototype_variance(vp8_variance_halfpixvar16x16_hv_mmx);
-extern prototype_subpixvariance(vp8_sub_pixel_mse16x16_mmx);
-extern prototype_getmbss(vp8_get_mb_ss_mmx);
-extern prototype_variance(vp8_mse16x16_mmx);
-extern prototype_variance2(vp8_get8x8var_mmx);
-
-#if !CONFIG_RUNTIME_CPU_DETECT
-#undef  vp8_variance_sad4x4
-#define vp8_variance_sad4x4 vp8_sad4x4_mmx
-
-#undef  vp8_variance_sad8x8
-#define vp8_variance_sad8x8 vp8_sad8x8_mmx
-
-#undef  vp8_variance_sad8x16
-#define vp8_variance_sad8x16 vp8_sad8x16_mmx
-
-#undef  vp8_variance_sad16x8
-#define vp8_variance_sad16x8 vp8_sad16x8_mmx
-
-#undef  vp8_variance_sad16x16
-#define vp8_variance_sad16x16 vp8_sad16x16_mmx
-
-#undef  vp8_variance_var4x4
-#define vp8_variance_var4x4 vp8_variance4x4_mmx
-
-#undef  vp8_variance_var8x8
-#define vp8_variance_var8x8 vp8_variance8x8_mmx
-
-#undef  vp8_variance_var8x16
-#define vp8_variance_var8x16 vp8_variance8x16_mmx
-
-#undef  vp8_variance_var16x8
-#define vp8_variance_var16x8 vp8_variance16x8_mmx
-
-#undef  vp8_variance_var16x16
-#define vp8_variance_var16x16 vp8_variance16x16_mmx
-
-#undef  vp8_variance_subpixvar4x4
-#define vp8_variance_subpixvar4x4 vp8_sub_pixel_variance4x4_mmx
-
-#undef  vp8_variance_subpixvar8x8
-#define vp8_variance_subpixvar8x8 vp8_sub_pixel_variance8x8_mmx
-
-#undef  vp8_variance_subpixvar8x16
-#define vp8_variance_subpixvar8x16 vp8_sub_pixel_variance8x16_mmx
-
-#undef  vp8_variance_subpixvar16x8
-#define vp8_variance_subpixvar16x8 vp8_sub_pixel_variance16x8_mmx
-
-#undef  vp8_variance_subpixvar16x16
-#define vp8_variance_subpixvar16x16 vp8_sub_pixel_variance16x16_mmx
-
-#undef  vp8_variance_halfpixvar16x16_h
-#define vp8_variance_halfpixvar16x16_h vp8_variance_halfpixvar16x16_h_mmx
-
-#undef  vp8_variance_halfpixvar16x16_v
-#define vp8_variance_halfpixvar16x16_v vp8_variance_halfpixvar16x16_v_mmx
-
-#undef  vp8_variance_halfpixvar16x16_hv
-#define vp8_variance_halfpixvar16x16_hv vp8_variance_halfpixvar16x16_hv_mmx
-
-#undef  vp8_variance_subpixmse16x16
-#define vp8_variance_subpixmse16x16 vp8_sub_pixel_mse16x16_mmx
-
-#undef  vp8_variance_getmbss
-#define vp8_variance_getmbss vp8_get_mb_ss_mmx
-
-#undef  vp8_variance_mse16x16
-#define vp8_variance_mse16x16 vp8_mse16x16_mmx
-
-#endif
-#endif
-
-
-#if HAVE_SSE2
-extern prototype_sad(vp8_sad4x4_wmt);
-extern prototype_sad(vp8_sad8x8_wmt);
-extern prototype_sad(vp8_sad8x16_wmt);
-extern prototype_sad(vp8_sad16x8_wmt);
-extern prototype_sad(vp8_sad16x16_wmt);
-extern prototype_sad(vp8_copy32xn_sse2);
-extern prototype_variance(vp8_variance4x4_wmt);
-extern prototype_variance(vp8_variance8x8_wmt);
-extern prototype_variance(vp8_variance8x16_wmt);
-extern prototype_variance(vp8_variance16x8_wmt);
-extern prototype_variance(vp8_variance16x16_wmt);
-extern prototype_subpixvariance(vp8_sub_pixel_variance4x4_wmt);
-extern prototype_subpixvariance(vp8_sub_pixel_variance8x8_wmt);
-extern prototype_subpixvariance(vp8_sub_pixel_variance8x16_wmt);
-extern prototype_subpixvariance(vp8_sub_pixel_variance16x8_wmt);
-extern prototype_subpixvariance(vp8_sub_pixel_variance16x16_wmt);
-extern prototype_variance(vp8_variance_halfpixvar16x16_h_wmt);
-extern prototype_variance(vp8_variance_halfpixvar16x16_v_wmt);
-extern prototype_variance(vp8_variance_halfpixvar16x16_hv_wmt);
-extern prototype_subpixvariance(vp8_sub_pixel_mse16x16_wmt);
-extern prototype_getmbss(vp8_get_mb_ss_sse2);
-extern prototype_variance(vp8_mse16x16_wmt);
-extern prototype_variance2(vp8_get8x8var_sse2);
-extern prototype_variance2(vp8_get16x16var_sse2);
-extern prototype_ssimpf(vp8_ssim_parms_8x8_sse2)
-extern prototype_ssimpf(vp8_ssim_parms_16x16_sse2)
-
-#if !CONFIG_RUNTIME_CPU_DETECT
-#undef  vp8_variance_sad4x4
-#define vp8_variance_sad4x4 vp8_sad4x4_wmt
-
-#undef  vp8_variance_sad8x8
-#define vp8_variance_sad8x8 vp8_sad8x8_wmt
-
-#undef  vp8_variance_sad8x16
-#define vp8_variance_sad8x16 vp8_sad8x16_wmt
-
-#undef  vp8_variance_sad16x8
-#define vp8_variance_sad16x8 vp8_sad16x8_wmt
-
-#undef  vp8_variance_sad16x16
-#define vp8_variance_sad16x16 vp8_sad16x16_wmt
-
-#undef  vp8_variance_copy32xn
-#define vp8_variance_copy32xn vp8_copy32xn_sse2
-
-#undef  vp8_variance_var4x4
-#define vp8_variance_var4x4 vp8_variance4x4_wmt
-
-#undef  vp8_variance_var8x8
-#define vp8_variance_var8x8 vp8_variance8x8_wmt
-
-#undef  vp8_variance_var8x16
-#define vp8_variance_var8x16 vp8_variance8x16_wmt
-
-#undef  vp8_variance_var16x8
-#define vp8_variance_var16x8 vp8_variance16x8_wmt
-
-#undef  vp8_variance_var16x16
-#define vp8_variance_var16x16 vp8_variance16x16_wmt
-
-#undef  vp8_variance_subpixvar4x4
-#define vp8_variance_subpixvar4x4 vp8_sub_pixel_variance4x4_wmt
-
-#undef  vp8_variance_subpixvar8x8
-#define vp8_variance_subpixvar8x8 vp8_sub_pixel_variance8x8_wmt
-
-#undef  vp8_variance_subpixvar8x16
-#define vp8_variance_subpixvar8x16 vp8_sub_pixel_variance8x16_wmt
-
-#undef  vp8_variance_subpixvar16x8
-#define vp8_variance_subpixvar16x8 vp8_sub_pixel_variance16x8_wmt
-
-#undef  vp8_variance_subpixvar16x16
-#define vp8_variance_subpixvar16x16 vp8_sub_pixel_variance16x16_wmt
-
-#undef  vp8_variance_halfpixvar16x16_h
-#define vp8_variance_halfpixvar16x16_h vp8_variance_halfpixvar16x16_h_wmt
-
-#undef  vp8_variance_halfpixvar16x16_v
-#define vp8_variance_halfpixvar16x16_v vp8_variance_halfpixvar16x16_v_wmt
-
-#undef  vp8_variance_halfpixvar16x16_hv
-#define vp8_variance_halfpixvar16x16_hv vp8_variance_halfpixvar16x16_hv_wmt
-
-#undef  vp8_variance_subpixmse16x16
-#define vp8_variance_subpixmse16x16 vp8_sub_pixel_mse16x16_wmt
-
-#undef  vp8_variance_getmbss
-#define vp8_variance_getmbss vp8_get_mb_ss_sse2
-
-#undef  vp8_variance_mse16x16
-#define vp8_variance_mse16x16 vp8_mse16x16_wmt
-
-#if ARCH_X86_64
-#undef  vp8_ssimpf_8x8
-#define vp8_ssimpf_8x8 vp8_ssim_parms_8x8_sse2
-
-#undef  vp8_ssimpf_16x16
-#define vp8_ssimpf_16x16 vp8_ssim_parms_16x16_sse2
-#endif
-
-#endif
-#endif
-
-
-#if HAVE_SSE3
-extern prototype_sad(vp8_sad16x16_sse3);
-extern prototype_sad(vp8_sad16x8_sse3);
-extern prototype_sad_multi_same_address(vp8_sad16x16x3_sse3);
-extern prototype_sad_multi_same_address(vp8_sad16x8x3_sse3);
-extern prototype_sad_multi_same_address(vp8_sad8x16x3_sse3);
-extern prototype_sad_multi_same_address(vp8_sad8x8x3_sse3);
-extern prototype_sad_multi_same_address(vp8_sad4x4x3_sse3);
-
-extern prototype_sad_multi_dif_address(vp8_sad16x16x4d_sse3);
-extern prototype_sad_multi_dif_address(vp8_sad16x8x4d_sse3);
-extern prototype_sad_multi_dif_address(vp8_sad8x16x4d_sse3);
-extern prototype_sad_multi_dif_address(vp8_sad8x8x4d_sse3);
-extern prototype_sad_multi_dif_address(vp8_sad4x4x4d_sse3);
-extern prototype_sad(vp8_copy32xn_sse3);
-
-#if !CONFIG_RUNTIME_CPU_DETECT
-
-#undef  vp8_variance_sad16x16
-#define vp8_variance_sad16x16 vp8_sad16x16_sse3
-
-#undef  vp8_variance_sad16x16x3
-#define vp8_variance_sad16x16x3 vp8_sad16x16x3_sse3
-
-#undef  vp8_variance_sad16x8x3
-#define vp8_variance_sad16x8x3 vp8_sad16x8x3_sse3
-
-#undef  vp8_variance_sad8x16x3
-#define vp8_variance_sad8x16x3 vp8_sad8x16x3_sse3
-
-#undef  vp8_variance_sad8x8x3
-#define vp8_variance_sad8x8x3 vp8_sad8x8x3_sse3
-
-#undef  vp8_variance_sad4x4x3
-#define vp8_variance_sad4x4x3 vp8_sad4x4x3_sse3
-
-#undef  vp8_variance_sad16x16x4d
-#define vp8_variance_sad16x16x4d vp8_sad16x16x4d_sse3
-
-#undef  vp8_variance_sad16x8x4d
-#define vp8_variance_sad16x8x4d vp8_sad16x8x4d_sse3
-
-#undef  vp8_variance_sad8x16x4d
-#define vp8_variance_sad8x16x4d vp8_sad8x16x4d_sse3
-
-#undef  vp8_variance_sad8x8x4d
-#define vp8_variance_sad8x8x4d vp8_sad8x8x4d_sse3
-
-#undef  vp8_variance_sad4x4x4d
-#define vp8_variance_sad4x4x4d vp8_sad4x4x4d_sse3
-
-#undef  vp8_variance_copy32xn
-#define vp8_variance_copy32xn vp8_copy32xn_sse3
-
-#endif
-#endif
-
-
-#if HAVE_SSSE3
-extern prototype_sad_multi_same_address(vp8_sad16x16x3_ssse3);
-extern prototype_sad_multi_same_address(vp8_sad16x8x3_ssse3);
-extern prototype_subpixvariance(vp8_sub_pixel_variance16x8_ssse3);
-extern prototype_subpixvariance(vp8_sub_pixel_variance16x16_ssse3);
-
-#if !CONFIG_RUNTIME_CPU_DETECT
-#undef  vp8_variance_sad16x16x3
-#define vp8_variance_sad16x16x3 vp8_sad16x16x3_ssse3
-
-#undef  vp8_variance_sad16x8x3
-#define vp8_variance_sad16x8x3 vp8_sad16x8x3_ssse3
-
-#undef  vp8_variance_subpixvar16x8
-#define vp8_variance_subpixvar16x8 vp8_sub_pixel_variance16x8_ssse3
-
-#undef  vp8_variance_subpixvar16x16
-#define vp8_variance_subpixvar16x16 vp8_sub_pixel_variance16x16_ssse3
-
-#endif
-#endif
-
-
-#if HAVE_SSE4_1
-extern prototype_sad_multi_same_address_1(vp8_sad16x16x8_sse4);
-extern prototype_sad_multi_same_address_1(vp8_sad16x8x8_sse4);
-extern prototype_sad_multi_same_address_1(vp8_sad8x16x8_sse4);
-extern prototype_sad_multi_same_address_1(vp8_sad8x8x8_sse4);
-extern prototype_sad_multi_same_address_1(vp8_sad4x4x8_sse4);
-
-#if !CONFIG_RUNTIME_CPU_DETECT
-#undef  vp8_variance_sad16x16x8
-#define vp8_variance_sad16x16x8 vp8_sad16x16x8_sse4
-
-#undef  vp8_variance_sad16x8x8
-#define vp8_variance_sad16x8x8 vp8_sad16x8x8_sse4
-
-#undef  vp8_variance_sad8x16x8
-#define vp8_variance_sad8x16x8 vp8_sad8x16x8_sse4
-
-#undef  vp8_variance_sad8x8x8
-#define vp8_variance_sad8x8x8 vp8_sad8x8x8_sse4
-
-#undef  vp8_variance_sad4x4x8
-#define vp8_variance_sad4x4x8 vp8_sad4x4x8_sse4
-
-#endif
-#endif
-
-#endif
diff --git a/vp8/encoder/x86/x86_csystemdependent.c b/vp8/encoder/x86/x86_csystemdependent.c
index 71c51c1..a169b49 100644
--- a/vp8/encoder/x86/x86_csystemdependent.c
+++ b/vp8/encoder/x86/x86_csystemdependent.c
@@ -90,31 +90,6 @@
   /* Override default functions with fastest ones for this CPU. */
 #if HAVE_MMX
   if (flags & HAS_MMX) {
-    cpi->rtcd.variance.sad16x16              = vp8_sad16x16_mmx;
-    cpi->rtcd.variance.sad16x8               = vp8_sad16x8_mmx;
-    cpi->rtcd.variance.sad8x16               = vp8_sad8x16_mmx;
-    cpi->rtcd.variance.sad8x8                = vp8_sad8x8_mmx;
-    cpi->rtcd.variance.sad4x4                = vp8_sad4x4_mmx;
-
-    cpi->rtcd.variance.var4x4                = vp8_variance4x4_mmx;
-    cpi->rtcd.variance.var8x8                = vp8_variance8x8_mmx;
-    cpi->rtcd.variance.var8x16               = vp8_variance8x16_mmx;
-    cpi->rtcd.variance.var16x8               = vp8_variance16x8_mmx;
-    cpi->rtcd.variance.var16x16              = vp8_variance16x16_mmx;
-
-    cpi->rtcd.variance.subpixvar4x4          = vp8_sub_pixel_variance4x4_mmx;
-    cpi->rtcd.variance.subpixvar8x8          = vp8_sub_pixel_variance8x8_mmx;
-    cpi->rtcd.variance.subpixvar8x16         = vp8_sub_pixel_variance8x16_mmx;
-    cpi->rtcd.variance.subpixvar16x8         = vp8_sub_pixel_variance16x8_mmx;
-    cpi->rtcd.variance.subpixvar16x16        = vp8_sub_pixel_variance16x16_mmx;
-    cpi->rtcd.variance.halfpixvar16x16_h     = vp8_variance_halfpixvar16x16_h_mmx;
-    cpi->rtcd.variance.halfpixvar16x16_v     = vp8_variance_halfpixvar16x16_v_mmx;
-    cpi->rtcd.variance.halfpixvar16x16_hv    = vp8_variance_halfpixvar16x16_hv_mmx;
-    cpi->rtcd.variance.subpixmse16x16        = vp8_sub_pixel_mse16x16_mmx;
-
-    cpi->rtcd.variance.mse16x16              = vp8_mse16x16_mmx;
-    cpi->rtcd.variance.getmbss               = vp8_get_mb_ss_mmx;
-
     cpi->rtcd.encodemb.berr                  = vp8_block_error_mmx;
     cpi->rtcd.encodemb.mberr                 = vp8_mbblock_error_mmx;
     cpi->rtcd.encodemb.mbuverr               = vp8_mbuverror_mmx;
@@ -126,32 +101,6 @@
 
 #if HAVE_SSE2
   if (flags & HAS_SSE2) {
-    cpi->rtcd.variance.sad16x16              = vp8_sad16x16_wmt;
-    cpi->rtcd.variance.sad16x8               = vp8_sad16x8_wmt;
-    cpi->rtcd.variance.sad8x16               = vp8_sad8x16_wmt;
-    cpi->rtcd.variance.sad8x8                = vp8_sad8x8_wmt;
-    cpi->rtcd.variance.sad4x4                = vp8_sad4x4_wmt;
-    cpi->rtcd.variance.copy32xn              = vp8_copy32xn_sse2;
-
-    cpi->rtcd.variance.var4x4                = vp8_variance4x4_wmt;
-    cpi->rtcd.variance.var8x8                = vp8_variance8x8_wmt;
-    cpi->rtcd.variance.var8x16               = vp8_variance8x16_wmt;
-    cpi->rtcd.variance.var16x8               = vp8_variance16x8_wmt;
-    cpi->rtcd.variance.var16x16              = vp8_variance16x16_wmt;
-
-    cpi->rtcd.variance.subpixvar4x4          = vp8_sub_pixel_variance4x4_wmt;
-    cpi->rtcd.variance.subpixvar8x8          = vp8_sub_pixel_variance8x8_wmt;
-    cpi->rtcd.variance.subpixvar8x16         = vp8_sub_pixel_variance8x16_wmt;
-    cpi->rtcd.variance.subpixvar16x8         = vp8_sub_pixel_variance16x8_wmt;
-    cpi->rtcd.variance.subpixvar16x16        = vp8_sub_pixel_variance16x16_wmt;
-    cpi->rtcd.variance.halfpixvar16x16_h     = vp8_variance_halfpixvar16x16_h_wmt;
-    cpi->rtcd.variance.halfpixvar16x16_v     = vp8_variance_halfpixvar16x16_v_wmt;
-    cpi->rtcd.variance.halfpixvar16x16_hv    = vp8_variance_halfpixvar16x16_hv_wmt;
-    cpi->rtcd.variance.subpixmse16x16        = vp8_sub_pixel_mse16x16_wmt;
-
-    cpi->rtcd.variance.mse16x16              = vp8_mse16x16_wmt;
-    cpi->rtcd.variance.getmbss               = vp8_get_mb_ss_sse2;
-
     cpi->rtcd.encodemb.berr                  = vp8_block_error_xmm;
     cpi->rtcd.encodemb.mberr                 = vp8_mbblock_error_xmm;
     cpi->rtcd.encodemb.mbuverr               = vp8_mbuverror_xmm;
@@ -160,54 +109,20 @@
     cpi->rtcd.encodemb.submbuv               = vp8_subtract_mbuv_sse2;
     cpi->rtcd.temporal.apply                 = vp8_temporal_filter_apply_sse2;
 
-#if CONFIG_INTERNAL_STATS
-#if ARCH_X86_64
-    cpi->rtcd.variance.ssimpf_8x8            = vp8_ssim_parms_8x8_sse2;
-    cpi->rtcd.variance.ssimpf_16x16          = vp8_ssim_parms_16x16_sse2;
-#endif
-#endif
   }
 #endif
 
 #if HAVE_SSE3
   if (flags & HAS_SSE3) {
-    cpi->rtcd.variance.sad16x16              = vp8_sad16x16_sse3;
-    cpi->rtcd.variance.sad16x16x3            = vp8_sad16x16x3_sse3;
-    cpi->rtcd.variance.sad16x8x3             = vp8_sad16x8x3_sse3;
-    cpi->rtcd.variance.sad8x16x3             = vp8_sad8x16x3_sse3;
-    cpi->rtcd.variance.sad8x8x3              = vp8_sad8x8x3_sse3;
-    cpi->rtcd.variance.sad4x4x3              = vp8_sad4x4x3_sse3;
     cpi->rtcd.search.full_search             = vp8_full_search_sadx3;
-    cpi->rtcd.variance.sad16x16x4d           = vp8_sad16x16x4d_sse3;
-    cpi->rtcd.variance.sad16x8x4d            = vp8_sad16x8x4d_sse3;
-    cpi->rtcd.variance.sad8x16x4d            = vp8_sad8x16x4d_sse3;
-    cpi->rtcd.variance.sad8x8x4d             = vp8_sad8x8x4d_sse3;
-    cpi->rtcd.variance.sad4x4x4d             = vp8_sad4x4x4d_sse3;
-    cpi->rtcd.variance.copy32xn              = vp8_copy32xn_sse3;
     cpi->rtcd.search.diamond_search          = vp8_diamond_search_sadx4;
     cpi->rtcd.search.refining_search         = vp8_refining_search_sadx4;
   }
 #endif
 
-#if HAVE_SSSE3
-  if (flags & HAS_SSSE3) {
-    cpi->rtcd.variance.sad16x16x3            = vp8_sad16x16x3_ssse3;
-    cpi->rtcd.variance.sad16x8x3             = vp8_sad16x8x3_ssse3;
-
-    cpi->rtcd.variance.subpixvar16x8         = vp8_sub_pixel_variance16x8_ssse3;
-    cpi->rtcd.variance.subpixvar16x16        = vp8_sub_pixel_variance16x16_ssse3;
-  }
-#endif
-
-
 
 #if HAVE_SSE4_1
   if (flags & HAS_SSE4_1) {
-    cpi->rtcd.variance.sad16x16x8            = vp8_sad16x16x8_sse4;
-    cpi->rtcd.variance.sad16x8x8             = vp8_sad16x8x8_sse4;
-    cpi->rtcd.variance.sad8x16x8             = vp8_sad8x16x8_sse4;
-    cpi->rtcd.variance.sad8x8x8              = vp8_sad8x8x8_sse4;
-    cpi->rtcd.variance.sad4x4x8              = vp8_sad4x4x8_sse4;
     cpi->rtcd.search.full_search             = vp8_full_search_sadx8;
   }
 #endif
diff --git a/vp8/vp8_common.mk b/vp8/vp8_common.mk
index 25c4fe2..fbbdec1 100644
--- a/vp8/vp8_common.mk
+++ b/vp8/vp8_common.mk
@@ -53,6 +53,7 @@
 VP8_COMMON_SRCS-yes += common/reconintra4x4.h
 VP8_COMMON_SRCS-yes += common/rtcd.c
 VP8_COMMON_SRCS-yes += common/rtcd_defs.sh
+VP8_COMMON_SRCS-yes += common/sadmxn.h
 VP8_COMMON_SRCS-yes += common/seg_common.h
 VP8_COMMON_SRCS-yes += common/seg_common.c
 VP8_COMMON_SRCS-yes += common/setupintrarecon.h
@@ -119,6 +120,8 @@
 VP8_COMMON_SRCS-$(HAVE_SSE2) += common/x86/filter_sse2.c
 ifeq ($(HAVE_SSE2),yes)
 vp8/common/x86/filter_sse2.c.o: CFLAGS += -msse2
+vp8/common/x86/loopfilter_x86.c.o: CFLAGS += -msse2
+vp8/common/loopfilter_filters.c.o: CFLAGS += -msse2
 endif
 
 VP8_COMMON_SRCS-$(ARCH_ARM)  += common/arm/arm_systemdependent.c
diff --git a/vp8/vp8cx.mk b/vp8/vp8cx.mk
index 7058e31..6d2f180 100644
--- a/vp8/vp8cx.mk
+++ b/vp8/vp8cx.mk
@@ -92,7 +92,6 @@
 VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/encodemb_x86.h
 VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/dct_x86.h
 VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/mcomp_x86.h
-VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/variance_x86.h
 VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/quantize_x86.h
 VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/temporal_filter_x86.h
 VP8_CX_SRCS-$(ARCH_X86)$(ARCH_X86_64) += encoder/x86/x86_csystemdependent.c