diff --git a/vp8/dixie/dixie.c b/vp8/dixie/dixie.c
index dd1b2060f62478464e31f8a3530777b04b5cde6e..be3a6a92e205314e0328c89632e0b9ca53d7a0dc 100644
--- a/vp8/dixie/dixie.c
+++ b/vp8/dixie/dixie.c
@@ -525,3 +525,12 @@ vp8_dixie_decode_frame(struct vp8_decoder_ctx *ctx,
 
     return ctx_->error.error_code;
 }
+
+
+void
+vp8_dixie_decode_destroy(struct vp8_decoder_ctx *ctx)
+{
+    vp8_dixie_predict_destroy(ctx);
+    vp8_dixie_tokens_destroy(ctx);
+    vp8_dixie_modemv_destroy(ctx);
+}
diff --git a/vp8/dixie/dixie.h b/vp8/dixie/dixie.h
index e3e7a95b6caf0c918dc2eb9735c695b950011c5b..eab5f2245eae699cec3e3efeab5336f35425cde7 100644
--- a/vp8/dixie/dixie.h
+++ b/vp8/dixie/dixie.h
@@ -315,6 +315,10 @@ void
 vp8_dixie_decode_init(struct vp8_decoder_ctx *ctx);
 
 
+void
+vp8_dixie_decode_destroy(struct vp8_decoder_ctx *ctx);
+
+
 vpx_codec_err_t
 vp8_parse_frame_header(const unsigned char   *data,
                        unsigned int           sz,
diff --git a/vp8/dixie/modemv.c b/vp8/dixie/modemv.c
index cc1f3e5fd6510d60732e8aed4fbcabfcfe950dc6..60ba197f58fbcda9ab6eef6c59957b934d06ba52 100644
--- a/vp8/dixie/modemv.c
+++ b/vp8/dixie/modemv.c
@@ -666,3 +666,13 @@ vp8_dixie_modemv_init(struct vp8_decoder_ctx *ctx)
 
     ctx->mb_info_rows = ctx->mb_info_rows_storage + 1;
 }
+
+
+void
+vp8_dixie_modemv_destroy(struct vp8_decoder_ctx *ctx)
+{
+    free(ctx->mb_info_storage);
+    ctx->mb_info_storage = NULL;
+    free(ctx->mb_info_rows_storage);
+    ctx->mb_info_rows_storage = NULL;
+}
diff --git a/vp8/dixie/modemv.h b/vp8/dixie/modemv.h
index 9afa187e87b1a9b7ea39e81e5f13ede076fde9b9..75cb5ef9f0d3058a01ff2aa2f299f955ffda1eb0 100644
--- a/vp8/dixie/modemv.h
+++ b/vp8/dixie/modemv.h
@@ -14,6 +14,10 @@ void
 vp8_dixie_modemv_init(struct vp8_decoder_ctx *ctx);
 
 
+void
+vp8_dixie_modemv_destroy(struct vp8_decoder_ctx *ctx);
+
+
 void
 vp8_dixie_modemv_process_row(struct vp8_decoder_ctx *ctx,
                              struct bool_decoder    *bool,
diff --git a/vp8/dixie/predict.c b/vp8/dixie/predict.c
index 05da4cd04f85d167a068f23f8683e984824abe5d..0a5f4cac629ccc191279b7cc453de13aeb581cc0 100644
--- a/vp8/dixie/predict.c
+++ b/vp8/dixie/predict.c
@@ -1836,6 +1836,20 @@ vp8_dixie_predict_init(struct vp8_decoder_ctx *ctx)
 }
 
 
+void
+vp8_dixie_predict_destroy(struct vp8_decoder_ctx *ctx)
+{
+    int i;
+
+    for (i = 0; i < NUM_REF_FRAMES; i++)
+    {
+        vpx_img_free(&ctx->frame_strg[i].img);
+        ctx->frame_strg[i].ref_cnt = 0;
+        ctx->ref_frames[i] = NULL;
+    }
+}
+
+
 void
 vp8_dixie_predict_process_row(struct vp8_decoder_ctx *ctx,
                               unsigned int            row,
diff --git a/vp8/dixie/predict.h b/vp8/dixie/predict.h
index 1eee7576961f0e68ddd70d33926680b39aa0a1e1..7e3a9c29ce6eb6567393399ac2bd49004d367397 100644
--- a/vp8/dixie/predict.h
+++ b/vp8/dixie/predict.h
@@ -14,6 +14,10 @@ void
 vp8_dixie_predict_init(struct vp8_decoder_ctx *ctx);
 
 
+void
+vp8_dixie_predict_destroy(struct vp8_decoder_ctx *ctx);
+
+
 void
 vp8_dixie_predict_process_row(struct vp8_decoder_ctx *ctx,
                               unsigned int            row,
diff --git a/vp8/dixie/tokens.c b/vp8/dixie/tokens.c
index 4a73be0a914302e95420a9426979735589b08e28..787aa202c2475c4d9ef79766210ea392d4a1c34d 100644
--- a/vp8/dixie/tokens.c
+++ b/vp8/dixie/tokens.c
@@ -479,3 +479,15 @@ vp8_dixie_tokens_init(struct vp8_decoder_ctx *ctx)
             vpx_internal_error(&ctx->error, VPX_CODEC_MEM_ERROR, NULL);
     }
 }
+
+
+void
+vp8_dixie_tokens_destroy(struct vp8_decoder_ctx *ctx)
+{
+    int i;
+
+    for (i = 0; i < MAX_PARTITIONS; i++)
+        free(ctx->tokens[i].coeffs);
+
+    free(ctx->above_token_entropy_ctx);
+}
diff --git a/vp8/dixie/tokens.h b/vp8/dixie/tokens.h
index 577f05e052508e4ffc9bdc69f00dd63a128d6362..4ecaba0448f4af49a8b6a5f84416d863982362c4 100644
--- a/vp8/dixie/tokens.h
+++ b/vp8/dixie/tokens.h
@@ -14,6 +14,10 @@ void
 vp8_dixie_tokens_init(struct vp8_decoder_ctx *ctx);
 
 
+void
+vp8_dixie_tokens_destroy(struct vp8_decoder_ctx *ctx);
+
+
 void
 vp8_dixie_tokens_process_row(struct vp8_decoder_ctx *ctx,
                              unsigned int            partition,
diff --git a/vp8/vp8_dixie_iface.c b/vp8/vp8_dixie_iface.c
index 5f0c7902c32a920d0fc14ace1904fcea72d8d526..f5e1de9ae74430a127d0e1f7d67da264ccb884a1 100644
--- a/vp8/vp8_dixie_iface.c
+++ b/vp8/vp8_dixie_iface.c
@@ -82,6 +82,7 @@ static vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx)
 
 static vpx_codec_err_t vp8_destroy(vpx_codec_alg_priv_t *ctx)
 {
+    vp8_dixie_decode_destroy(&ctx->decoder_ctx);
     vpx_free(ctx->base.alg_priv);
     return VPX_CODEC_OK;
 }