diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt
index 3671337..a33d50c 100644
--- a/docs/libs/gst-plugins-base-libs-sections.txt
+++ b/docs/libs/gst-plugins-base-libs-sections.txt
@@ -50,6 +50,7 @@ gst_app_sink_set_drop
 gst_app_sink_get_drop
 gst_app_sink_pull_preroll
 gst_app_sink_pull_buffer
+gst_app_sink_set_handoff_callback
 <SUBSECTION Standard>
 GstAppSinkClass
 GST_APP_SINK
diff --git a/gst-libs/gst/app/gstappsink.c b/gst-libs/gst/app/gstappsink.c
index 673426f..c67ed3c 100644
--- a/gst-libs/gst/app/gstappsink.c
+++ b/gst-libs/gst/app/gstappsink.c
@@ -400,6 +400,13 @@ gst_app_sink_dispose (GObject * obj)
     gst_caps_unref (appsink->priv->caps);
     appsink->priv->caps = NULL;
   }
+  if (appsink->handoff_notify) {
+    appsink->handoff_notify (appsink->handoff_userdata);
+  }
+  appsink->handoff_callback = NULL;
+  appsink->handoff_userdata = NULL;
+  appsink->handoff_notify = NULL;
+
   GST_OBJECT_UNLOCK (appsink);
 
   g_mutex_lock (appsink->priv->mutex);
@@ -658,6 +665,9 @@ gst_app_sink_render (GstBaseSink * psink, GstBuffer * buffer)
   if (emit)
     g_signal_emit (appsink, gst_app_sink_signals[SIGNAL_NEW_BUFFER], 0);
 
+  if (appsink->handoff_callback)
+    appsink->handoff_callback (appsink, buffer, appsink->handoff_userdata);
+
   return GST_FLOW_OK;
 
 flushing:
@@ -1073,3 +1083,31 @@ not_started:
     return NULL;
   }
 }
+
+/**
+ * gst_app_sink_set_handoff_callback:
+ * @appsink: a #GstAppSink
+ * @callback: a callback function pointer
+ * @callback_data: a user data argument for the callback
+ * @notify: a destroy notify function
+ *
+ * Set a callback which will be executed for each new buffer. This is an
+ * alternative to using the new-buffer signal. It has lower overhead and is thus
+ * less expensive, but also less flexible, than connecting to the signal.
+ *
+ * When using this method for buffer handling, the "drop" property should be
+ * set to TRUE to prevent the stream from blocking.
+ *
+ * Since: 0.10.x
+ */
+void
+gst_app_sink_set_handoff_callback (GstAppSink * appsink,
+                                   GstAppSinkHandoffFunction callback, gpointer callback_data,
+                                   GDestroyNotify notify)
+{
+  GST_OBJECT_LOCK (appsink);
+  appsink->handoff_callback = callback;
+  appsink->handoff_userdata = callback_data;
+  appsink->handoff_notify   = notify;
+  GST_OBJECT_UNLOCK (appsink);
+}
diff --git a/gst-libs/gst/app/gstappsink.h b/gst-libs/gst/app/gstappsink.h
index 3dbeb64..5757b70 100644
--- a/gst-libs/gst/app/gstappsink.h
+++ b/gst-libs/gst/app/gstappsink.h
@@ -40,6 +40,8 @@ typedef struct _GstAppSink GstAppSink;
 typedef struct _GstAppSinkClass GstAppSinkClass;
 typedef struct _GstAppSinkPrivate GstAppSinkPrivate;
 
+typedef void (*GstAppSinkHandoffFunction) (GstAppSink *, GstBuffer *, gpointer);
+
 struct _GstAppSink
 {
   GstBaseSink basesink;
@@ -48,7 +50,11 @@ struct _GstAppSink
   GstAppSinkPrivate *priv;
 
   /*< private >*/
-  gpointer     _gst_reserved[GST_PADDING];
+  GstAppSinkHandoffFunction handoff_callback;
+  gpointer handoff_userdata;
+  GDestroyNotify handoff_notify;
+
+  gpointer     _gst_reserved[GST_PADDING-3];
 };
 
 struct _GstAppSinkClass
@@ -87,6 +93,10 @@ gboolean        gst_app_sink_get_drop         (GstAppSink *appsink);
 GstBuffer *     gst_app_sink_pull_preroll     (GstAppSink *appsink);
 GstBuffer *     gst_app_sink_pull_buffer      (GstAppSink *appsink);
 
+void gst_app_sink_set_handoff_callback (GstAppSink * appsink,
+                                        GstAppSinkHandoffFunction callback, gpointer callback_data,
+                                        GDestroyNotify notify);
+
 G_END_DECLS
 
 #endif
