diff --git a/vp8/common/loopfilter.c b/vp8/common/loopfilter.c
index 0ee151e8263d3d57e8fd65352edc32c1ff1dda8d..98657fcc37bc89290119a6158acde38667904b09 100644
--- a/vp8/common/loopfilter.c
+++ b/vp8/common/loopfilter.c
@@ -227,11 +227,11 @@ void vp8_loop_filter_frame_init(VP8_COMMON *cm,
             /* Abs value */
             if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
             {
-                lvl_seg = xd->segment_feature_data[seg][SEG_LVL_ALT_LF];
+                lvl_seg = get_segdata( xd, seg, SEG_LVL_ALT_LF );
             }
             else  /* Delta Value */
             {
-                lvl_seg += xd->segment_feature_data[seg][SEG_LVL_ALT_LF];
+                lvl_seg += get_segdata( xd, seg, SEG_LVL_ALT_LF );;
                 lvl_seg = (lvl_seg > 0) ? ((lvl_seg > 63) ? 63: lvl_seg) : 0;
             }
         }
@@ -288,7 +288,7 @@ void vp8_loop_filter_frame_init(VP8_COMMON *cm,
 void vp8_loop_filter_frame
 (
     VP8_COMMON *cm,
-    MACROBLOCKD *mbd
+    MACROBLOCKD *xd
 )
 {
     YV12_BUFFER_CONFIG *post = cm->frame_to_show;
@@ -308,7 +308,7 @@ void vp8_loop_filter_frame
     const MODE_INFO *mode_info_context = cm->mi;
 
     /* Initialize the loop filter for this frame. */
-    vp8_loop_filter_frame_init(cm, mbd, cm->filter_level);
+    vp8_loop_filter_frame_init(cm, xd, cm->filter_level);
 
     /* Set up the buffer pointers */
     y_ptr = post->y_buffer;
@@ -396,7 +396,7 @@ void vp8_loop_filter_frame
 void vp8_loop_filter_frame_yonly
 (
     VP8_COMMON *cm,
-    MACROBLOCKD *mbd,
+    MACROBLOCKD *xd,
     int default_filt_lvl
 )
 {
@@ -421,7 +421,7 @@ void vp8_loop_filter_frame_yonly
 #endif
 
     /* Initialize the loop filter for this frame. */
-    vp8_loop_filter_frame_init( cm, mbd, default_filt_lvl);
+    vp8_loop_filter_frame_init( cm, xd, default_filt_lvl);
 
     /* Set up the buffer pointers */
     y_ptr = post->y_buffer;
@@ -503,7 +503,7 @@ void vp8_loop_filter_frame_yonly
 void vp8_loop_filter_partial_frame
 (
     VP8_COMMON *cm,
-    MACROBLOCKD *mbd,
+    MACROBLOCKD *xd,
     int default_filt_lvl
 )
 {
@@ -520,7 +520,7 @@ void vp8_loop_filter_partial_frame
     loop_filter_info lfi;
 
     int filter_level;
-    int alt_flt_enabled = mbd->segmentation_enabled;
+    int alt_flt_enabled = xd->segmentation_enabled;
     FRAME_TYPE frame_type = cm->frame_type;
 
     const MODE_INFO *mode_info_context;
@@ -545,15 +545,15 @@ void vp8_loop_filter_partial_frame
     {
         for (i = 0; i < MAX_MB_SEGMENTS; i++)
         {    /* Abs value */
-            if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA)
+            if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
             {
-                lvl_seg[i] = mbd->segment_feature_data[i][SEG_LVL_ALT_LF];
+                lvl_seg[i] = get_segdata( xd, i, SEG_LVL_ALT_LF );
             }
             /* Delta Value */
             else
             {
-                lvl_seg[i] = default_filt_lvl
-                        + mbd->segment_feature_data[i][SEG_LVL_ALT_LF];
+                lvl_seg[i] = default_filt_lvl +
+                             get_segdata( xd, i, SEG_LVL_ALT_LF );
                 lvl_seg[i] = (lvl_seg[i] > 0) ?
                         ((lvl_seg[i] > 63) ? 63: lvl_seg[i]) : 0;
             }
diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c
index fcafcccf049a132a9c7d545ed4b7d72dc1e7432d..d279ebaec0c7a48de9dc35c16e6a3b4d5cf2b729 100644
--- a/vp8/decoder/decodemv.c
+++ b/vp8/decoder/decodemv.c
@@ -96,8 +96,8 @@ static void vp8_kfread_modes(VP8D_COMP *pbi, MODE_INFO *m, int mb_row, int mb_co
             if ( pbi->common.mb_no_coeff_skip &&
                  ( !segfeature_active( &pbi->mb,
                                        m->mbmi.segment_id, SEG_LVL_EOB ) ||
-                   (pbi->mb.segment_feature_data[m->mbmi.segment_id]
-                                                [SEG_LVL_EOB] != 0) ) )
+                   ( get_segdata( &pbi->mb,
+                                  m->mbmi.segment_id, SEG_LVL_EOB ) != 0 ) ) )
             {
                 m->mbmi.mb_skip_coeff = vp8_read(bc, pbi->prob_skip_false);
             }
@@ -106,8 +106,8 @@ static void vp8_kfread_modes(VP8D_COMP *pbi, MODE_INFO *m, int mb_row, int mb_co
 //#if CONFIG_SEGFEATURES
                 if ( segfeature_active( &pbi->mb,
                                         m->mbmi.segment_id, SEG_LVL_EOB ) &&
-                     (pbi->mb.segment_feature_data[m->mbmi.segment_id]
-                                                  [SEG_LVL_EOB] == 0) )
+                     ( get_segdata( &pbi->mb,
+                                    m->mbmi.segment_id, SEG_LVL_EOB ) == 0 ) )
                 {
                     m->mbmi.mb_skip_coeff = 1;
                 }
@@ -278,9 +278,9 @@ static MV_REFERENCE_FRAME read_ref_frame( VP8D_COMP *pbi,
             if ( check_segref( xd, segment_id, INTRA_FRAME ) )
                 ref_frame = (MV_REFERENCE_FRAME) vp8_read(bc, pbi->prob_intra);
             else
-                ref_frame = 1;      // note this unchanged = LAST
+                ref_frame = LAST_FRAME;
 
-            if ( ref_frame )
+            if ( ref_frame == LAST_FRAME )
             {
                 // Now consider last vs (golden or alt) flag....
                 // If Last is not enabled
@@ -501,8 +501,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
     if ( pbi->common.mb_no_coeff_skip &&
          ( !segfeature_active( xd,
                                mbmi->segment_id, SEG_LVL_EOB ) ||
-           (xd->segment_feature_data[mbmi->segment_id]
-                                    [SEG_LVL_EOB] != 0) ) )
+           (get_segdata( xd, mbmi->segment_id, SEG_LVL_EOB ) != 0) ) )
     {
         // Read the macroblock coeff skip flag if this feature is in use,
         // else default to 0
@@ -513,8 +512,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
 //#if CONFIG_SEGFEATURES
         if ( segfeature_active( xd,
                                 mbmi->segment_id, SEG_LVL_EOB ) &&
-             (xd->segment_feature_data[mbmi->segment_id]
-                                      [SEG_LVL_EOB] == 0) )
+             (get_segdata( xd, mbmi->segment_id, SEG_LVL_EOB ) == 0) )
         {
             mbmi->mb_skip_coeff = 1;
         }
@@ -541,7 +539,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
         if ( segfeature_active( xd, mbmi->segment_id, SEG_LVL_MODE ) )
         {
             mbmi->mode =
-                xd->segment_feature_data[mbmi->segment_id][SEG_LVL_MODE];
+                get_segdata( xd, mbmi->segment_id, SEG_LVL_MODE );
         }
         else
         {
diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c
index e81a8c58b3107fd51c837931ed3a4e06727106ef..4fdc3ea3d139670f0bb72d4953da59548272314d 100644
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -85,13 +85,13 @@ void mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd)
     {
         /* Abs Value */
         if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
-            QIndex = xd->segment_feature_data[segment_id][SEG_LVL_ALT_Q];
+            QIndex = get_segdata( xd, segment_id, SEG_LVL_ALT_Q );
 
         /* Delta Value */
         else
         {
             QIndex = pc->base_qindex +
-                xd->segment_feature_data[segment_id][SEG_LVL_ALT_Q];
+                     get_segdata( xd, segment_id, SEG_LVL_ALT_Q );
             QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;    /* Clamp to valid range */
         }
     }
@@ -804,10 +804,7 @@ static void init_frame(VP8D_COMP *pbi)
         // Reset the segment feature data to the default stats:
         // Features disabled, 0, with delta coding (Default state).
 //#if CONFIG_SEGFEATURES
-        vpx_memset(xd->segment_feature_mask, 0,
-                   sizeof(xd->segment_feature_mask));
-        vpx_memset(xd->segment_feature_data, 0,
-                   sizeof(xd->segment_feature_data));
+        clearall_segfeatures( xd );
 
         xd->mb_segement_abs_delta = SEGMENT_DELTADATA;
 
diff --git a/vp8/decoder/detokenize.c b/vp8/decoder/detokenize.c
index e69a7d34f16c5d56c66f5bc54babf279031c4682..f2a5db8f12b90980b388dbab67b9d6d4f52a9853 100644
--- a/vp8/decoder/detokenize.c
+++ b/vp8/decoder/detokenize.c
@@ -656,7 +656,7 @@ int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *xd)
 
     if ( segfeature_active( xd, segment_id, SEG_LVL_EOB ) )
     {
-        seg_eob = xd->segment_feature_data[segment_id][SEG_LVL_EOB];
+        seg_eob = get_segdata( xd, segment_id, SEG_LVL_EOB );
     }
 
     type = 3;
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c
index ef21e2a86cb1c5eab36a61eb0d222382dc30517d..be99f38508de21e96e81ba370aa6946db26b7c23 100644
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -887,7 +887,7 @@ static void encode_ref_frame( vp8_writer *const w,
                                         segment_id,
                                         SEG_LVL_REF_FRAME );
 
-    // No segment features or segment reference frame featuure is disabled
+    // No segment features or segment reference frame feature is disabled
     if ( !seg_ref_active )
     {
         if (rf == INTRA_FRAME)
@@ -1108,7 +1108,7 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
 //#if CONFIG_SEGFEATURES
             if ( pc->mb_no_coeff_skip &&
                  ( !segfeature_active( xd, segment_id, SEG_LVL_EOB ) ||
-                   (xd->segment_feature_data[segment_id][SEG_LVL_EOB] != 0) ) )
+                   ( get_segdata( xd, segment_id, SEG_LVL_EOB ) != 0 ) ) )
             {
                 vp8_encode_bool(w, mi->mb_skip_coeff, prob_skip_false);
             }
@@ -1320,7 +1320,7 @@ static void write_kfmodes(VP8_COMP *cpi)
 //#if CONFIG_SEGFEATURES
             if ( c->mb_no_coeff_skip &&
                  ( !segfeature_active( xd, segment_id, SEG_LVL_EOB ) ||
-                   (xd->segment_feature_data[segment_id][SEG_LVL_EOB] != 0) ) )
+                   (get_segdata( xd, segment_id, SEG_LVL_EOB ) != 0) ) )
             {
                 vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false);
             }
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index a6ad0c705fbfd97f78025d0f32158dd4894c2b39..1902c7ca147d857ff381dfbd721ce9f8043319a0 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -336,10 +336,9 @@ static void setup_features(VP8_COMP *cpi)
     xd->update_mb_segmentation_map = 0;
     xd->update_mb_segmentation_data = 0;
     vpx_memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs));
-    vpx_memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data));
 
 //#if CONFIG_SEGFEATURES
-    vpx_memset(xd->segment_feature_mask, 0, sizeof(xd->segment_feature_mask));
+    clearall_segfeatures( xd );
 
     xd->mode_ref_lf_delta_enabled = 0;
     xd->mode_ref_lf_delta_update = 0;
@@ -529,9 +528,8 @@ static void init_seg_features(VP8_COMP *cpi)
             xd->update_mb_segmentation_map = 1;
             xd->update_mb_segmentation_data = 1;
 
-            xd->segment_feature_data[1][SEG_LVL_ALT_Q] =
-                -(2+(cpi->ni_av_qi >> 3));
-            xd->segment_feature_data[1][SEG_LVL_ALT_LF] = -2;
+            set_segdata( xd, 1, SEG_LVL_ALT_Q, -(2+(cpi->ni_av_qi >> 3)) );
+            set_segdata( xd, 1, SEG_LVL_ALT_LF, -2 );
 
             enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
             enable_segfeature(xd, 1, SEG_LVL_ALT_LF);
@@ -554,20 +552,21 @@ static void init_seg_features(VP8_COMP *cpi)
                 xd->update_mb_segmentation_data = 1;
                 xd->mb_segement_abs_delta = SEGMENT_DELTADATA;
 
-                xd->segment_feature_data[1][SEG_LVL_ALT_Q] = 5;
-                xd->segment_feature_data[1][SEG_LVL_ALT_LF] = -2;
-
+                set_segdata( xd, 1, SEG_LVL_ALT_Q, 5 );
                 enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
+
+                set_segdata( xd, 1, SEG_LVL_ALT_LF, -2 );
                 enable_segfeature(xd, 1, SEG_LVL_ALT_LF);
 
                 if ( high_q )
                 {
                     set_segref(xd, 1, ALTREF_FRAME);
-                    xd->segment_feature_data[1][SEG_LVL_MODE] = ZEROMV;
-                    xd->segment_feature_data[1][SEG_LVL_EOB] = 0;
-
                     enable_segfeature(xd, 1, SEG_LVL_REF_FRAME);
+
+                    set_segdata( xd, 1, SEG_LVL_MODE, ZEROMV );
                     enable_segfeature(xd, 1, SEG_LVL_MODE);
+
+                    set_segdata( xd, 1, SEG_LVL_EOB, 0 );
                     enable_segfeature(xd, 1, SEG_LVL_EOB);
                 }
             }
@@ -601,16 +600,16 @@ static void init_seg_features(VP8_COMP *cpi)
             set_segref(xd, 0, ALTREF_FRAME);
             clear_segref(xd, 1);
             set_segref(xd, 1, ALTREF_FRAME);
-            xd->segment_feature_data[0][SEG_LVL_MODE] = ZEROMV;
-            xd->segment_feature_data[1][SEG_LVL_MODE] = ZEROMV;
+            set_segdata( xd, 0, SEG_LVL_MODE, ZEROMV );
+            set_segdata( xd, 1, SEG_LVL_MODE, ZEROMV );
 
             // Skip all MBs if high Q
             if ( high_q )
             {
                 enable_segfeature(xd, 0, SEG_LVL_EOB);
                 enable_segfeature(xd, 1, SEG_LVL_EOB);
-                xd->segment_feature_data[0][SEG_LVL_EOB] = 0;
-                xd->segment_feature_data[1][SEG_LVL_EOB] = 0;
+                set_segdata( xd, 0, SEG_LVL_EOB, 0 );
+                set_segdata( xd, 1, SEG_LVL_EOB, 0 );
             }
 
             // Enable data udpate
diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c
index ee9c43a15c2bc601bdd1212257e8f2a841fce54b..5fd0c905e3fbf2f5f375f30e80fbf78429acc815 100644
--- a/vp8/encoder/pickinter.c
+++ b/vp8/encoder/pickinter.c
@@ -536,7 +536,7 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
             }
             if ( segfeature_active( xd, segment_id, SEG_LVL_MODE )  &&
                  ( this_mode !=
-                   xd->segment_feature_data[segment_id][SEG_LVL_MODE]))
+                   get_segdata( xd, segment_id, SEG_LVL_MODE ) ) )
             {
                 continue;
             }
diff --git a/vp8/encoder/quantize.c b/vp8/encoder/quantize.c
index c34749c970c066c27e8d9a1636891aab9aa61bca..e95fa60e6eca628401a043a98872c0c32de73a7a 100644
--- a/vp8/encoder/quantize.c
+++ b/vp8/encoder/quantize.c
@@ -1179,13 +1179,13 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
     {
         // Abs Value
         if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
-            QIndex = xd->segment_feature_data[segment_id][SEG_LVL_ALT_Q];
+            QIndex = get_segdata( xd, segment_id, SEG_LVL_ALT_Q );
 
         // Delta Value
         else
         {
             QIndex = cpi->common.base_qindex +
-                     xd->segment_feature_data[segment_id][SEG_LVL_ALT_Q];
+                     get_segdata( xd, segment_id, SEG_LVL_ALT_Q );
 
             // Clamp to valid range
             QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;
@@ -1215,7 +1215,7 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
         if ( segfeature_active( xd, segment_id, SEG_LVL_EOB ) )
         {
             x->block[i].eob_max_offset =
-                xd->segment_feature_data[segment_id][SEG_LVL_EOB];
+                get_segdata( xd, segment_id, SEG_LVL_EOB );
         }
         else
             x->block[i].eob_max_offset = 16;
@@ -1242,7 +1242,7 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
         if ( segfeature_active( xd, segment_id, SEG_LVL_EOB ) )
         {
             x->block[i].eob_max_offset =
-                xd->segment_feature_data[segment_id][SEG_LVL_EOB];
+                get_segdata( xd, segment_id, SEG_LVL_EOB );
         }
         else
             x->block[i].eob_max_offset = 16;
@@ -1269,7 +1269,7 @@ void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
     if ( segfeature_active( xd, segment_id, SEG_LVL_EOB ) )
     {
         x->block[24].eob_max_offset =
-            xd->segment_feature_data[segment_id][SEG_LVL_EOB];
+            get_segdata( xd, segment_id, SEG_LVL_EOB );
     }
     else
         x->block[24].eob_max_offset = 16;
diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c
index a2d132e5c6ded4cca3726395f318ce149ca7e20c..b8ae6c06602f0152dd611176b7f06384cb8c270c 100644
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -2138,8 +2138,8 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
                 continue;
             }
             if ( segfeature_active( xd, segment_id, SEG_LVL_MODE )  &&
-                ( this_mode !=
-                  xd->segment_feature_data[segment_id][SEG_LVL_MODE]))
+                 ( this_mode !=
+                   get_segdata( xd, segment_id, SEG_LVL_MODE ) ) )
             {
                 continue;
             }
diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c
index 24be76bd9410b4b39b1d2f56e03a6a6cd1fd464f..362d9bfafdf30c52d0ade6c86fd2634c4d6c14f5 100644
--- a/vp8/encoder/tokenize.c
+++ b/vp8/encoder/tokenize.c
@@ -190,7 +190,7 @@ static void tokenize2nd_order_b
 
     if ( segfeature_active( xd, segment_id, SEG_LVL_EOB ) )
     {
-        seg_eob = xd->segment_feature_data[segment_id][SEG_LVL_EOB];
+        seg_eob = get_segdata( xd, segment_id, SEG_LVL_EOB );
     }
 
     b = xd->block + 24;
@@ -326,7 +326,7 @@ static void tokenize1st_order_b
 
     if ( segfeature_active( xd, segment_id, SEG_LVL_EOB ) )
     {
-        seg_eob = xd->segment_feature_data[segment_id][SEG_LVL_EOB];
+        seg_eob = get_segdata( xd, segment_id, SEG_LVL_EOB );
     }
 
     b = xd->block;
@@ -487,7 +487,7 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t)
     int segment_id = x->mode_info_context->mbmi.segment_id;
 
     if ( !segfeature_active( x, segment_id, SEG_LVL_EOB ) ||
-         (x->segment_feature_data[segment_id][SEG_LVL_EOB] != 0) )
+         ( get_segdata( x, segment_id, SEG_LVL_EOB ) != 0) )
     {
         skip_inc = 1;
     }