diff --git a/gst-libs/gst/baseparse/gstbaseparse.c b/gst-libs/gst/baseparse/gstbaseparse.c
index e465529..1a53432 100644
--- a/gst-libs/gst/baseparse/gstbaseparse.c
+++ b/gst-libs/gst/baseparse/gstbaseparse.c
@@ -259,6 +259,8 @@ struct _GstBaseParsePrivate
   guint posted_avg_bitrate;
 
   GList *pending_events;
+  /* buffers that are queued and ready to go on OK */
+  GList *queued_buffers_pending_ok;
 
   GstBuffer *cache;
 
@@ -427,6 +429,11 @@ gst_base_parse_finalize (GObject * object)
   g_list_free (parse->priv->pending_events);
   parse->priv->pending_events = NULL;
 
+  g_list_foreach (parse->priv->queued_buffers_pending_ok,
+      (GFunc) gst_mini_object_unref, NULL);
+  g_list_free (parse->priv->queued_buffers_pending_ok);
+  parse->priv->queued_buffers_pending_ok = NULL;
+
   if (parse->priv->index) {
     gst_object_unref (parse->priv->index);
     parse->priv->index = NULL;
@@ -1441,6 +1448,15 @@ gst_base_parse_check_media (GstBaseParse * parse)
   GST_DEBUG_OBJECT (parse, "media is video == %d", parse->priv->is_video);
 }
 
+static void
+gst_base_parse_push_pending_frame (GstBaseParseFrame * frame,
+    GstBaseParse * parse)
+{
+  gst_buffer_set_caps (frame->buffer,
+      GST_PAD_CAPS (GST_BASE_PARSE_SRC_PAD (parse)));
+  gst_base_parse_push_frame (parse, frame);
+}
+
 /**
  * gst_base_parse_handle_and_push_buffer:
  * @parse: #GstBaseParse.
@@ -1548,10 +1564,18 @@ gst_base_parse_handle_and_push_frame (GstBaseParse * parse,
   if (ret == GST_BASE_PARSE_FLOW_DROPPED) {
     gst_base_parse_frame_clear (parse, frame);
     return GST_FLOW_OK;
+  } else if (ret == GST_BASE_PARSE_FLOW_QUEUED) {
+    parse->priv->queued_buffers_pending_ok =
+        g_list_append (parse->priv->queued_buffers_pending_ok, frame);
+    return GST_FLOW_OK;
   } else if (ret != GST_FLOW_OK) {
     return ret;
+  } else {
+    g_list_foreach (parse->priv->queued_buffers_pending_ok,
+        (GFunc) gst_base_parse_push_pending_frame, parse);
+    g_list_free (parse->priv->queued_buffers_pending_ok);
+    parse->priv->queued_buffers_pending_ok = NULL;
   }
-
   return gst_base_parse_push_frame (parse, frame);
 }
 
diff --git a/gst-libs/gst/baseparse/gstbaseparse.h b/gst-libs/gst/baseparse/gstbaseparse.h
index d0f43ee..c80956a 100644
--- a/gst-libs/gst/baseparse/gstbaseparse.h
+++ b/gst-libs/gst/baseparse/gstbaseparse.h
@@ -90,6 +90,15 @@ G_BEGIN_DECLS
 #define GST_BASE_PARSE_FLOW_DROPPED     GST_FLOW_CUSTOM_SUCCESS
 
 /**
+ * GST_BASE_PARSE_FLOW_QUEUED:
+ * A #GstFlowReturn that can be returned from parse frame to indicate that
+ * the buffer will be queued to be pushed when the next OK
+ *
+ * Since: 0.10.x
+ */
+#define GST_BASE_PARSE_FLOW_QUEUED      GST_FLOW_CUSTOM_SUCCESS_1
+
+/**
  * GstBaseParseFrameFlags:
  * @GST_BASE_PARSE_FRAME_FLAG_NONE: no flag
  * @GST_BASE_PARSE_FRAME_FLAG_SYNC: indicates if parsing is 'in sync'
