diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c
index a024abc..3bf554e 100644
--- a/libs/gst/base/gstcollectpads.c
+++ b/libs/gst/base/gstcollectpads.c
@@ -89,6 +89,11 @@ static void gst_collect_pads_init (GstCollectPads * pads,
 static void ref_data (GstCollectData * data);
 static void unref_data (GstCollectData * data);
 
+struct _GstCollectPadsPrivate
+{
+  gboolean error;
+};
+
 static void
 gst_collect_pads_base_init (gpointer g_class)
 {
@@ -103,6 +108,8 @@ gst_collect_pads_class_init (GstCollectPadsClass * klass)
   GST_DEBUG_CATEGORY_INIT (collect_pads_debug, "collectpads", 0,
       "GstCollectPads");
 
+  g_type_class_add_private (klass, sizeof (GstCollectPadsPrivate));
+
   gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_collect_pads_finalize);
 }
 
@@ -121,6 +128,10 @@ gst_collect_pads_init (GstCollectPads * pads, GstCollectPadsClass * g_class)
   pads->abidata.ABI.pad_lock = g_mutex_new ();
   pads->abidata.ABI.pad_cookie = 0;
   pads->abidata.ABI.pad_list = NULL;
+
+  pads->abidata.ABI.priv =
+      G_TYPE_INSTANCE_GET_PRIVATE (pads, GST_TYPE_COLLECT_PADS,
+      GstCollectPadsPrivate);
 }
 
 static void
@@ -582,6 +593,9 @@ gst_collect_pads_start (GstCollectPads * pads)
   /* make pads streamable */
   GST_COLLECT_PADS_PAD_LOCK (pads);
 
+  /* Reset error state */
+  pads->abidata.ABI.priv->error = FALSE;
+
   /* loop over the master pad list and reset the segment */
   collected = pads->abidata.ABI.pad_list;
   for (; collected; collected = g_slist_next (collected)) {
@@ -630,6 +644,9 @@ gst_collect_pads_stop (GstCollectPads * pads)
   pads->eospads = 0;
   pads->queuedpads = 0;
 
+  /* Reset error state */
+  pads->abidata.ABI.priv->error = FALSE;
+
   /* loop over the master pad list and flush buffers */
   collected = pads->abidata.ABI.pad_list;
   for (; collected; collected = g_slist_next (collected)) {
@@ -1018,6 +1035,12 @@ gst_collect_pads_check_collected (GstCollectPads * pads)
   /* check for new pads, update stats etc.. */
   gst_collect_pads_check_pads (pads);
 
+  /* If we had an error in the past just return here */
+  if (pads->abidata.ABI.priv->error) {
+    GST_WARNING ("Had error in the past, returning");
+    return GST_FLOW_ERROR;
+  }
+
   if (G_UNLIKELY (pads->eospads == pads->numpads)) {
     /* If all our pads are EOS just collect once to let the element
      * do its final EOS handling. */
@@ -1050,6 +1073,10 @@ gst_collect_pads_check_collected (GstCollectPads * pads)
       GST_DEBUG ("Not all active pads (%d) have data, continuing",
           pads->numpads);
   }
+
+  if (flow_ret != GST_FLOW_OK)
+    pads->abidata.ABI.priv->error = TRUE;
+
   return flow_ret;
 }
 
diff --git a/libs/gst/base/gstcollectpads.h b/libs/gst/base/gstcollectpads.h
index 4cebd4d..647c644 100644
--- a/libs/gst/base/gstcollectpads.h
+++ b/libs/gst/base/gstcollectpads.h
@@ -35,6 +35,7 @@ G_BEGIN_DECLS
 
 typedef struct _GstCollectData GstCollectData;
 typedef struct _GstCollectPads GstCollectPads;
+typedef struct _GstCollectPadsPrivate GstCollectPadsPrivate;
 typedef struct _GstCollectPadsClass GstCollectPadsClass;
 
 /**
@@ -136,6 +137,7 @@ struct _GstCollectPads {
       GMutex    *pad_lock;		/* used to serialize add/remove */
       GSList    *pad_list;              /* updated pad list */
       guint32	 pad_cookie;            /* updated cookie */
+      GstCollectPadsPrivate *priv;
     } ABI;
     /* adding + 0 to mark ABI change to be undone later */
     gpointer _gst_reserved[GST_PADDING + 0];
