diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index b7e7757fae088b807bbf5109df6f97ec6f4b7711..d969f5eea73b08449da1932a79abe1638bb605eb 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -431,7 +431,7 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps)
     }
 
     s->sps = sps;
-    s->vps = s->vps_list[s->sps->vps_id];
+    s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
     return 0;
 
 fail:
@@ -2924,7 +2924,7 @@ static av_cold int hevc_decode_free(AVCodecContext *avctx)
     }
 
     for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++)
-        av_freep(&s->vps_list[i]);
+        av_buffer_unref(&s->vps_list[i]);
     for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
         av_buffer_unref(&s->sps_list[i]);
     for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
@@ -2999,6 +2999,15 @@ static int hevc_update_thread_context(AVCodecContext *dst,
         }
     }
 
+    for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) {
+        av_buffer_unref(&s->vps_list[i]);
+        if (s0->vps_list[i]) {
+            s->vps_list[i] = av_buffer_ref(s0->vps_list[i]);
+            if (!s->vps_list[i])
+                return AVERROR(ENOMEM);
+        }
+    }
+
     for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) {
         av_buffer_unref(&s->sps_list[i]);
         if (s0->sps_list[i]) {
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index d19f3122f53f25aca185901e1fe1f09912eddd91..bd6f50fdea6c1c4ee3190e3827cb8eeb34541e1d 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -843,7 +843,7 @@ typedef struct HEVCContext {
     const HEVCVPS *vps;
     const HEVCSPS *sps;
     const HEVCPPS *pps;
-    HEVCVPS     *vps_list[MAX_VPS_COUNT];
+    AVBufferRef *vps_list[MAX_VPS_COUNT];
     AVBufferRef *sps_list[MAX_SPS_COUNT];
     AVBufferRef *pps_list[MAX_PPS_COUNT];
 
diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
index 402c16fef83944063313841cb3388e4e674db6ed..d9811253ee8db3864a3e684c842032cf99481f2d 100644
--- a/libavcodec/hevc_ps.c
+++ b/libavcodec/hevc_ps.c
@@ -328,12 +328,13 @@ int ff_hevc_decode_nal_vps(HEVCContext *s)
     GetBitContext *gb = &s->HEVClc.gb;
     int vps_id = 0;
     HEVCVPS *vps;
+    AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps));
 
-    av_log(s->avctx, AV_LOG_DEBUG, "Decoding VPS\n");
+    if (!vps_buf)
+      return AVERROR(ENOMEM);
+    vps = (HEVCVPS*)vps_buf->data;
 
-    vps = av_mallocz(sizeof(*vps));
-    if (!vps)
-        return AVERROR(ENOMEM);
+    av_log(s->avctx, AV_LOG_DEBUG, "Decoding VPS\n");
 
     vps_id = get_bits(gb, 4);
     if (vps_id >= MAX_VPS_COUNT) {
@@ -410,12 +411,12 @@ int ff_hevc_decode_nal_vps(HEVCContext *s)
     }
     get_bits1(gb); /* vps_extension_flag */
 
-    av_free(s->vps_list[vps_id]);
-    s->vps_list[vps_id] = vps;
+    av_buffer_unref(&s->vps_list[vps_id]);
+    s->vps_list[vps_id] = vps_buf;
     return 0;
 
 err:
-    av_free(vps);
+    av_buffer_unref(&vps_buf);
     return AVERROR_INVALIDDATA;
 }