Imported Upstream version 1.7.1
diff --git a/ChangeLog b/ChangeLog
index 039f8e4..524e195 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,16 +1,175 @@
-=== release 1.6.2 ===
+=== release 1.7.1 ===
 
-2015-12-14  Sebastian Dröge <slomo@coaxion.net>
+2015-12-24  Sebastian Dröge <slomo@coaxion.net>
 
 	* configure.ac:
-	  releasing 1.6.2
+	  releasing 1.7.1
 
-2015-12-14 18:59:00 +0100  Sebastian Dröge <sebastian@centricular.com>
+2015-12-24 12:21:21 +0100  Sebastian Dröge <sebastian@centricular.com>
 
+	* po/cs.po:
+	* po/de.po:
+	* po/fr.po:
 	* po/hu.po:
+	* po/nb.po:
+	* po/nl.po:
+	* po/pl.po:
+	* po/ru.po:
 	* po/sv.po:
+	* po/uk.po:
+	* po/vi.po:
+	* po/zh_CN.po:
 	  po: Update translations
 
+2015-12-21 00:43:49 +0100  Koop Mast <kwm@rainbow-runner.nl>
+
+	* configure.ac:
+	  configure: Make -Bsymbolic check work with clang.
+	  Update the -Bsymbolic check with the version glib has. This version
+	  works with clang.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759713
+
+2015-12-16 09:35:18 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* docs/plugins/gstreamer-plugins.args:
+	* docs/plugins/gstreamer-plugins.hierarchy:
+	* docs/plugins/gstreamer-plugins.signals:
+	* docs/plugins/inspect/plugin-coreelements.xml:
+	  docs: update to git
+
+2015-11-10 12:38:59 -0500  Xavier Claessens <xavier.claessens@collabora.com>
+
+	* gst/gstallocator.h:
+	* gst/gstatomicqueue.h:
+	* gst/gstbin.h:
+	* gst/gstbuffer.h:
+	* gst/gstbufferlist.h:
+	* gst/gstbus.h:
+	* gst/gstcaps.h:
+	* gst/gstcapsfeatures.h:
+	* gst/gstclock.h:
+	* gst/gstcontext.h:
+	* gst/gstcontrolbinding.h:
+	* gst/gstcontrolsource.h:
+	* gst/gstdatetime.h:
+	* gst/gstdevice.h:
+	* gst/gstdevicemonitor.h:
+	* gst/gstdeviceprovider.h:
+	* gst/gstdeviceproviderfactory.h:
+	* gst/gstelement.h:
+	* gst/gstelementfactory.h:
+	* gst/gstevent.h:
+	* gst/gstghostpad.h:
+	* gst/gstiterator.h:
+	* gst/gstmemory.h:
+	* gst/gstmessage.h:
+	* gst/gstobject.h:
+	* gst/gstpad.h:
+	* gst/gstpadtemplate.h:
+	* gst/gstparse.h:
+	* gst/gstpipeline.h:
+	* gst/gstplugin.h:
+	* gst/gstpluginfeature.h:
+	* gst/gstquery.h:
+	* gst/gstregistry.h:
+	* gst/gstsample.h:
+	* gst/gstsegment.h:
+	* gst/gststructure.h:
+	* gst/gstsystemclock.h:
+	* gst/gsttaglist.h:
+	* gst/gsttask.h:
+	* gst/gsttaskpool.h:
+	* gst/gsttoc.h:
+	* gst/gsttracer.h:
+	* gst/gsttracerfactory.h:
+	* gst/gsttypefindfactory.h:
+	* gst/gsturi.h:
+	* libs/gst/base/gstadapter.h:
+	* libs/gst/base/gstbaseparse.h:
+	* libs/gst/base/gstbasesink.h:
+	* libs/gst/base/gstbasesrc.h:
+	* libs/gst/base/gstbasetransform.h:
+	* libs/gst/base/gstcollectpads.h:
+	* libs/gst/base/gstdataqueue.h:
+	* libs/gst/base/gstflowcombiner.h:
+	* libs/gst/base/gstpushsrc.h:
+	* libs/gst/check/gsttestclock.h:
+	* libs/gst/controller/gstargbcontrolbinding.h:
+	* libs/gst/controller/gstdirectcontrolbinding.h:
+	* libs/gst/controller/gstinterpolationcontrolsource.h:
+	* libs/gst/controller/gstlfocontrolsource.h:
+	* libs/gst/controller/gsttimedvaluecontrolsource.h:
+	* libs/gst/controller/gsttriggercontrolsource.h:
+	* libs/gst/net/gstnetclientclock.h:
+	* libs/gst/net/gstnettimepacket.h:
+	* libs/gst/net/gstnettimeprovider.h:
+	* libs/gst/net/gstptpclock.h:
+	  core: Add g_autoptr() support to all types
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754464
+
+2015-12-14 13:06:57 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* plugins/elements/gsttee.c:
+	  tee: Check if parsing the name template with sscanf() was successful
+	  If not, go back to the automatic pad numbering.
+	  CID 1195129
+
+2015-12-14 11:20:43 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	* plugins/elements/gstqueue.c:
+	  queue/multiqueue: Don't special-case CAPS events in the event handlers
+	  For CAPS events we will never ever have a FALSE return value here, so just
+	  remove the dead code instead of causing future confusion.
+
+2015-12-14 11:16:50 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* plugins/elements/gstqueue.c:
+	  Revert "queue: Illegal memory access of sink event"
+	  This reverts commit 78614c505a2a761cb4dcb7f4e5f3e9f97c9a8e88.
+	  The code it was fixing does not have any effect anyway and will be removed in
+	  the next commit.
+
+2015-12-14 10:32:14 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* plugins/elements/gstqueue.c:
+	  queue: Illegal memory access of sink event
+	  Once event is pushed to pad, then queue should not access the event.
+	  This is leading to invalid read valgrind errors
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759430
+
+2015-12-14 10:10:04 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstelement.c:
+	  element: Unref event if GstElement::send_event() is not implemented
+	  Otherwise we'll take ownership of the event only if it's implemented, and
+	  leak the event in all other situations.
+
+2015-12-14 10:04:19 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* docs/manual/advanced-dataaccess.xml:
+	  manual: Fix dynamic pipeline example
+	  Use GST_PAD_PROBE_PASS to pass through all events other than EOS instead of
+	  blocking on the first non-EOS event forever. Also fix a typo in a comment in
+	  that function.
+	  Thanks to David Jaggard for reporting this on the mailing list.
+
+2015-12-13 00:37:39 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* docs/pwg/building-boiler.xml:
+	  docs:  typo in the location of make_element tool
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759352
+
+2015-12-12 01:13:59 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* plugins/elements/gstdownloadbuffer.c:
+	  downloadbuffer: drop unneeded macros for G_OS_WIN32
+
+2015-12-12 01:09:20 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* plugins/elements/gstfdsrc.c:
+	  fdsrc: drop unneeded macros for G_OS_WIN32
+
 2015-12-12 01:06:43 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
 
 	* plugins/elements/gstfdsrc.c:
@@ -23,35 +182,156 @@
 	  fdsink: enable large file support in Android
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758980
 
+2015-12-11 20:52:57 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* plugins/elements/gstqueue2.c:
+	  queue2: fix some typos
+
 2015-12-11 20:42:05 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
 
 	* plugins/elements/gstqueue2.c:
 	  queue2: enable large file support on Android
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758980
 
+2015-12-11 19:11:01 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* plugins/elements/gstdownloadbuffer.c:
+	  downloadbuffer: fix some typos
+
 2015-12-11 18:59:32 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
 
 	* plugins/elements/gstdownloadbuffer.c:
 	  downloadbuffer: enable large file support on Android
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758980
 
+2015-12-11 14:36:29 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* plugins/elements/gstsparsefile.c:
+	  sparsefile: drop bogus reference to file descriptor
+	  +fix typo on return value comment
+
 2015-12-11 14:07:27 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
 
 	* plugins/elements/gstsparsefile.c:
 	  sparsefile: enable large file support on Android
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758980
 
+2015-12-10 14:32:27 +0100  Aurélien Zanelli <aurelien.zanelli@parrot.com>
+
+	* gst/gstelement.c:
+	  element: unref message in _post_message when there is no implementation
+	  'gst_element_post_message' takes the ownership of the message, so it
+	  shall unref it when there is no post_message implementation. Otherwise
+	  message is leaked.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759300
+
+2015-12-10 11:35:05 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstelement.c:
+	  element: Don't hold state lock all the time while sending an event
+	  This lock seems to exist only to prevent elements from changing states while
+	  events are being processed. However events are going to be processed
+	  nonetheless in those elements if sent directly via pads, so protection must
+	  already be implemented inside the elements for event handling if it is needed.
+	  As such having the lock here is not very useful and is actually causing
+	  various deadlocks in different situations as described in
+	  https://bugzilla.gnome.org/show_bug.cgi?id=744040
+
+2015-12-07 20:27:45 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* plugins/elements/gstfilesrc.c:
+	  filesrc: enable large file support in Android
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758980
+
 2015-12-03 15:04:32 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
 
 	* plugins/elements/gstfilesink.c:
 	  filesink: enable large file support on Android
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758980
 
-2015-12-07 20:27:45 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+2015-12-03 15:01:27 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
 
-	* plugins/elements/gstfilesrc.c:
-	  filesrc: enable large file support in Android
-	  https://bugzilla.gnome.org/show_bug.cgi?id=758980
+	* plugins/elements/gstfilesink.c:
+	* plugins/elements/gstfilesink.h:
+	  filesink: indentation fixes
+
+2015-12-09 17:40:02 +0100  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: Don't use random segment.position from upstream
+	  segment.position is meant for internal usage only, but the various
+	  GST_EVENT_SEGMENT creationg/parsing functions won't clear that field.
+	  Use the appropriate segment boundary as an initial value instead
+
+2015-12-07 17:25:02 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstbin.c:
+	  bin: Post a LATENCY message with async-handling=TRUE if the PLAYING state is reached
+	  Otherwise each bin might have a different latency in the end, causing
+	  synchronization problems.
+	  The bin will still first handle latency internally as before, but gives the
+	  overall pipeline the opportunity to update the latency of the whole pipeline
+	  afterwards.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759125
+
+2015-12-07 18:20:35 +0200  Athanasios Oikonomou <athoik@gmail.com>
+
+	* libs/gst/base/gstbaseparse.c:
+	  baseparse: post tag list when avg bitrate changes at least 2%
+	  Watching videos with variant bitrate is common to have delta
+	  more than 10 kbps, resulting in tag list spam.
+	  Instead of relying on fixed 10 kpbs delta, it is better to
+	  calculale the difference in percentage and update tag list
+	  only when bitrate changes more than 2%.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759055
+
+2015-12-07 09:08:01 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+	* autogen.sh:
+	* common:
+	  Automatic update of common submodule
+	  From b319909 to 86e4663
+
+2015-12-07 12:59:39 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstelement.c:
+	  element: Check for an activated pad before adding, not a non-flushing one
+	  The pad could be activated but flushing because of a FLUSH_START event. That's
+	  not what we're looking for here, we want to check for activated pads.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758928
+
+2015-11-19 15:33:06 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* tests/check/elements/funnel.c:
+	  tests: funnel: remove state change from stress tests
+	  Changing states up and down while buffers are being pushed is not
+	  a valid use case. If a pad is deactivated and reactivated during
+	  a buffer push it is racy with the check of pushed sticky events
+	  and the actual chainfunction call. As it might call the chain
+	  without noticing the peer pad lost its previous sticky events.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758340
+
+2015-12-04 10:22:56 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+	* tools/gst-launch.c:
+	  gst-launch: Fix process return value on error
+	  In case of a run-time error message, the process return value was left
+	  unset. This would lead to error not being caught at shell level.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759019
+
+2015-12-04 10:45:25 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+	* tools/gst-launch.c:
+	  Revert "tools: gst-launch: return non-0 exit code on async error"
+	  This reverts commit 2ee4cba2485d7f1646d48e4559426aed4ba99c85.
+
+2015-12-04 15:09:39 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* tools/gst-launch.c:
+	  tools: gst-launch: return non-0 exit code on async error
+	  When an error happens in playing state, still return a
+	  non-0 exit code.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759019
 
 2015-12-04 14:39:29 +0000  Ross Burton <ross.burton@intel.com>
 
@@ -62,13 +342,135 @@
 	  the hooks need to be split too.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758029
 
-2015-12-04 10:22:56 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+2015-12-04 11:56:45 +0100  Wim Taymans <wtaymans@redhat.com>
 
-	* tools/gst-launch.c:
-	  gst-launch: Fix process return value on error
-	  In case of a run-time error message, the process return value was left
-	  unset. This would lead to error not being caught at shell level.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=759019
+	* gst/gstquery.c:
+	  query: fix docs
+	  The allocation query has parameters with the meta API, not flags.
+
+2015-12-02 15:02:25 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* libs/gst/base/Makefile.am:
+	* libs/gst/check/Makefile.am:
+	* libs/gst/controller/Makefile.am:
+	* libs/gst/net/Makefile.am:
+	  Drop usage of deprecated g-ir-scanner --strip-prefix flag
+
+2015-12-02 16:28:23 +0100  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: Fix set/get property
+	  Blame it on the rebasing :)
+
+2015-11-12 17:15:37 +0100  Edward Hervey <bilboed@bilboed.com>
+
+	* gst/gstpad.c:
+	* gst/gstpad.h:
+	* plugins/elements/gstmultiqueue.c:
+	* plugins/elements/gstqueue.c:
+	* win32/common/libgstreamer.def:
+	  pad: Implement GstPadEventFullFunction
+	  API: GstPadEventFullFunction
+	  Returns a GstFlowReturn, allows asynchronous elements to properly
+	  propagate flow returns
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757821
+
+2015-11-30 17:09:43 +0100  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	* plugins/elements/gstmultiqueue.h:
+	  multiqueue: Use signed clock values for running time calculation
+	  This improves the accuracy of queue levels and when to push buffers
+	  for buffers falling outside of the segment
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757193
+
+2015-11-27 09:45:29 +0100  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	* plugins/elements/gstmultiqueue.h:
+	  multiqueue: Add an extra cache time for unlinked streams
+	  When synchronizing the output by time, there are some use-cases (like
+	  allowing gapless playback downstream) where we want the unlinked streams
+	  to stay slightly behind the linked streams.
+	  The "unlinked-cache-time" property allows the user to specify by how
+	  much time the unlinked streams should wait before pushing again.
+
+2015-10-26 08:06:01 +0100  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	* plugins/elements/gstmultiqueue.h:
+	  multiqueue: Optimize multiqueue sizes based on interleave
+	  Multiqueue should only be used to cope with:
+	  * decoupling upstream and dowstream threading (i.e. having separate threads
+	  for elementary streams).
+	  * Ensuring individual queues have enough space to cope with upstream interleave
+	  (distance in stream time between co-located samples). This is to guarantee
+	  that we have enough room in each individual queues to provide new data in
+	  each, without being blocked.
+	  * Limit the queue sizes to that interleave distance (and an extra minimal
+	  buffering size). This is to ensure we don't consume too much memory.
+	  Based on that, multiqueue now continuously calculates the input interleave
+	  (per incoming streaming thread). Based on that, it calculates a target
+	  interleave (currently 1.5 x real_interleave + 250ms padding).
+	  If the target interleave is greater than the current max_size.time, it will
+	  update it accordingly (to allow enough margin to not block).
+	  If the target interleave goes down by more than 50%, we re-adjust it once
+	  we know we have gone past a safe distance (2 x current max_size.time).
+	  This mode can only be used for incoming streams that are guaranteed to be
+	  properly timestamped.
+	  Furthermore, we ignore sparse streams when calculating interleave and maximum
+	  size of queues.
+	  For the simplest of use-cases (single stream), multiqueue acts as a single
+	  queue with a time limit of 250ms.
+	  If there are multiple inputs, but each come from a different streaming thread,
+	  the maximum time limit will also end up being 250ms.
+	  On regular files (more than one input stream from the same upstream streaming
+	  thread), it can reduce the total memory used as much as 10x, ending up with
+	  max_size.time around 500ms.
+	  Due to the adaptive nature, it can also cope with changing interleave (which
+	  can happen commonly on some files at startup/pre-roll time)
+
+2013-01-08 21:16:42 +0000  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: use new stream-start event sparse flag to avoid overreading subtitles
+	  This will mean a much lower delay before a subtitles track changes take
+	  effect. Also avoids excessive memory usage in many cases.
+	  This will also consider sparse streams as (individually) never full, so
+	  as to avoid blocking all playback due to one sparse stream.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=600648
+
+2015-10-30 10:22:20 +0100  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: Fix high_time computation
+	  * Avoid the computation completely if we know we don't need it (not in
+	  sync time mode)
+	  * Make sure we don't override highest time with GST_CLOCK_TIME_NONE on
+	  unlinked pads
+	  * Ensure the high_time gets properly updated if all pads are not linked
+	  * Fix the comparision in the loop whether the target high time is the same
+	  as the current time
+	  * Split wake_up_next_non_linked method to avoid useless calculation
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757353
+
+2015-11-06 03:02:42 +1100  Jan Schmidt <jan@centricular.com>
+
+	* plugins/elements/gstqueue2.c:
+	  queue2: Don't report 0% unless empty
+	  When preparing a buffering message, don't report 0% if there
+	  is any bytes left in the queue at all. We still have something
+	  to push, so don't tell the app to start buffering - maybe
+	  we'll get more data before actually running dry.
+
+2015-11-30 17:11:33 +0100  Edward Hervey <edward@centricular.com>
+
+	* gst/gstclock.h:
+	  gstclock: Fix GST_STIME_ARGS
+	  It wasn't properly handling GST_CLOCK_STIME_NONE and always use the
+	  sign marker (+/-) to make it easier to identify signed values in
+	  logs
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758870
 
 2015-11-30 23:08:50 +0100  Thibault Saunier <tsaunier@gnome.org>
 
@@ -77,6 +479,78 @@
 	  As the names clash with gst_object_get_value[_array]
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756950
 
+2015-11-13 17:32:57 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst/gstplugin.c:
+	* gst/gstplugin.h:
+	  plugin: Add prefix support to dependencies
+	  This adds a new flags, GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX,
+	  which allow using the names as prefix for plugin depencies.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758083
+
+2015-11-13 16:32:31 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst/gstplugin.c:
+	  plugin: Allow device nodes as dependency
+	  This is useful for feature that are produced after probing a specific
+	  node. You want to reload this plugin if the specific node(s) have been
+	  removed, added, or reloaded.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758080
+
+2015-11-13 16:20:42 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst/gstplugin.c:
+	  plugin: Don't do lossy shift on hash
+	  In plugin is responsible for calculating a hash of the dependencies
+	  in order to determine if the cache should be invalidated or not.
+	  Currently, the hash combining method removes a bit of the original
+	  have before combining with an addition. As we use 32bits for our hash
+	  and shift 1 bit for each file and directory, that resulting hash only
+	  account for the last 32 files. And is more affected by the last file.
+	  Rotating technique (shifting, and adding back the ending bit), can be
+	  use to make the addition non-commutative. In a way that different order
+	  gives different hashes. In this case, I don't preserve this behaviour
+	  because the order in which the files are provided by the OS is
+	  irrelevant.
+	  In most cases, the XOR operation is used to combine hashes. In this
+	  code we use the addition. I decided to preserve the addition because
+	  we make use of non-random hash ((guint) -1) in the algorithm for
+	  matching files that are not really part of the hash (symlinks, special
+	  files). Doing successive XOR on this value, will simply switch from
+	  full ones, to full zero. The XOR used with whitelist has been preserved
+	  as it's based on a fairly randomized hash (g_str_hash).
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758078
+
+2015-11-23 21:40:34 +0000  Lukasz Forynski <lukasz.forynski@youview.com>
+
+	* gst/gstinfo.h:
+	  info: fix compiler warning with -Wpedantic and gcc 5
+	  Gstreamer compiled with gcc 5.2 and -Wpedantic produces the
+	  following warning:
+	  'ISO C does not support '__FUNCTION__' predefined identifier [-Wpedantic]
+	  const char *s = __FUNCTION__;'
+	  Since gcc 5 enables C99 by default, use __func__ if it's available
+	  instead of the non-standard __FUNCTION__ (as suggested in [2]).
+	  [1]: https://gcc.gnu.org/gcc-5/changes.html
+	  [2]: https://gcc.gnu.org/gcc-5/porting_to.html
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758541
+
+2015-11-20 19:45:39 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	  controller: fix annotation to make g-ir-scanner happy
+	  gstinterpolationcontrolsource.h:59: Warning: GstController: missing ":" at column 51:
+	  * @GST_INTERPOLATION_MODE_CUBIC_MONO: (Since 1.8) monotonic cubic interpolation, will not
+	  gstinterpolationcontrolsource.h:59: Warning: GstController: unknown annotation: since
+
+2014-09-29 14:03:13 +0530  Ravi Kiran K N <ravi.kiran@samsung.com>
+
+	* gst/gsttaglist.c:
+	* gst/gsttaglist.h:
+	  tags: add GST_TAG_PRIVATE_DATA
+	  Can be used to represent private data that may be
+	  contained in tags, such as ID3v2 PRIV frames.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=730926
+
 2015-11-19 00:51:44 -0300  Thiago Santos <thiagoss@osg.samsung.com>
 
 	* libs/gst/base/gstbaseparse.c:
@@ -88,11 +562,11 @@
 	  are adjusted, creating a discontinuity and leading to sync
 	  issues.
 
-2015-11-19 00:51:30 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+2015-11-17 18:47:48 -0300  Thiago Santos <thiagoss@osg.samsung.com>
 
 	* libs/gst/base/gstbaseparse.c:
 	  Revert "baseparse: simplify code a bit"
-	  This reverts commit 921816400bf3ad65f8978a50569a7d87ef05c806.
+	  This reverts commit 3984f7159a72c2eebe01905ee53716e3b2abcb30.
 
 2015-11-18 11:46:45 +0000  Tim-Philipp Müller <tim@centricular.com>
 
@@ -107,6 +581,12 @@
 	  ptp-helper: Disable multicast loopback
 	  We're not really interested in our own packets and ignore them anyway.
 
+2015-11-17 09:17:58 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/gstdebugutils.c:
+	  debugutils: Fix string memory leak
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758207
+
 2015-11-16 08:22:14 -0300  Thiago Santos <thiagoss@osg.samsung.com>
 
 	* libs/gst/base/gstbaseparse.c:
@@ -136,6 +616,15 @@
 	  header buffers.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757961
 
+2015-06-18 13:56:53 -0700  Aleix Conchillo Flaqué <aleix@oblong.com>
+
+	* plugins/elements/gstidentity.c:
+	* plugins/elements/gstidentity.h:
+	  identity: add drop-buffer-flags property
+	  New property drop-buffer-flags that will discard buffers that have the
+	  given flags set.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=751182
+
 2015-11-12 19:46:44 +0000  Ross Burton <ross.burton@intel.com>
 
 	* libs/gst/helpers/Makefile.am:
@@ -148,6 +637,161 @@
 	  twice in parallel (once via install-all, once via the hook's dependency).
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758029
 
+2015-11-12 16:14:18 +0100  Heinrich Fink <hfink@toolsonair.com>
+
+	* tests/check/gst/gstsystemclock.c:
+	  systemclock: Add test for gst_clock_get_resolution
+	  In a series of time measurements, the diff between now and previous
+	  timestamps is either 0 or at least as long as get_resolution returned.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758012
+
+2015-11-12 11:26:56 +0100  Heinrich Fink <hfink@toolsonair.com>
+
+	* gst/gstsystemclock.c:
+	  systemclock: Use mach_time on Apple platforms
+	  On iOS/OSX g_get_current_time was used by default. However, mach_time is
+	  the preferred high-resolution monotonic clock to be used on Apple
+	  platforms.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758012
+
+2015-11-11 11:11:23 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* plugins/tracers/gstlog.c:
+	  tracers: log: add missing hooks
+	  Log all possible hooks
+
+2015-10-29 08:40:32 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gstelement.c:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	  tracer: add element-change-state-pre/post hook
+	  Helps catching when a state change is starting and ending.
+	  It is also possible to track the end of state changes by checking the
+	  async-done or state-change messages.
+	  This is particularly important for elements that do async state changes.
+
+2015-11-11 14:32:44 +0100  Miguel París Díaz <mparisdiaz@gmail.com>
+
+	* tests/check/gst/gstpad.c:
+	  pad: test for checking the order of the probe calls
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757197
+
+2015-11-10 14:41:35 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gstcontext.c:
+	  context: fix some copy and paste leftover in docs
+
+2015-11-10 14:37:27 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gstcontext.c:
+	  context: add some more documentation
+	  Add a short paragraph on what means for a context to be persistent
+
+2015-11-09 18:02:09 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/gstutils.h:
+	  utils: use 'static inline' instead of 'inline static' for gtk-doc
+	  gtk-doc doesn't seem to recognise the former variant.
+
+2015-11-09 17:59:16 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/gstbuffer.h:
+	* gst/gstbufferlist.h:
+	* gst/gstcaps.h:
+	* gst/gstcontext.h:
+	* gst/gstevent.h:
+	* gst/gstmemory.h:
+	* gst/gstmessage.h:
+	* gst/gstquery.h:
+	* gst/gstsample.h:
+	* gst/gsttaglist.h:
+	* gst/gsturi.h:
+	* gst/gstutils.h:
+	* libs/gst/base/gstbytewriter.h:
+	  docs: remove dummy function declarations with G_INLINE_FUNCTION for gtk-doc
+	  gtk-doc can handle static inline functions just fine these days,
+	  there's no need for this stuff any more.
+
+2015-02-23 13:16:19 +1000  Duncan Palmer <dpalmer@digisoft.tv>
+
+	* plugins/elements/gstqueue2.c:
+	* plugins/elements/gstqueue2.h:
+	  queue2: Add the avg-in-rate property.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=733959
+
+2015-11-04 12:02:51 +0100  Philippe Normand <philn@igalia.com>
+
+	* plugins/elements/gstqueue2.c:
+	* plugins/elements/gstqueue2.h:
+	* tests/check/elements/queue2.c:
+	  queue2: add overrun signal
+	  Notifies that the queue2 is full, same as queue does
+	  https://bugzilla.gnome.org/show_bug.cgi?id=733959
+
+2015-09-29 21:14:19 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* tests/check/gst/gstpad.c:
+	  pad: tests for accept-caps handling with proxy pads
+	  Adds 3 new tests for testing accept-caps behavior with
+	  proxy-caps pads.
+	  1) A scenario where there is no proxy. The caps should be compared to the
+	  template caps of the pad
+	  2) A scenario where there is a compatible pad. The caps should be compared
+	  to the proxied pad caps (and also with the template)
+	  3) A scenario where there is an incompatible proxy pad. No caps should be
+	  possible at all.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754112
+
+2015-11-05 16:15:22 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gstpad.c:
+	  pad: check template caps for proxy pads in accept-caps
+	  Validate that the proxy pad indeed accepts the caps by also
+	  comparing with the pad template caps, otherwise when the pad
+	  had no internally linked pads it would always return true.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754112
+
+2015-11-06 12:58:42 +0100  Thibault Saunier <tsaunier@gnome.org>
+
+	* gst/gstpreset.c:
+	  Fix build with -Werror=maybe-uninitialized
+
+2015-11-06 12:05:18 +0100  Thibault Saunier <tsaunier@gnome.org>
+
+	* gst/gstpreset.c:
+	* scripts/gst-uninstalled:
+	  preset: Add a GST_PRESET_PATH env variable for presets to be usable uninstalled
+	  And start setting the various uninstalled presets paths.
+
+2015-11-05 08:56:43 +0100  Anton Bondarenko <antonbo@axis.com>
+
+	* plugins/elements/gstfilesink.c:
+	  filesink: continue element cleanup even if fclose fails
+	  Sometimes filesink cleanup during stop may fail due to fclose error.
+	  In this case object left partial cleanup with no file opened
+	  but still holding old file descriptor.
+	  It's not possible to change location property in a such state,
+	  so next start will cause old file overwrite if 'append' does not set.
+	  According to man page and POSIX standard about fclose behavior(extract):
+	  ------------------------------------------------------------------------
+	  The fclose() function shall cause the stream pointed to by stream
+	  to be flushed and the associated file to be closed.
+	  ...
+	  Whether or not the call succeeds, the stream shall be disassociated
+	  from the file and any buffer set by the setbuf() or setvbuf()
+	  function shall be disassociated from the stream.
+	  ...
+	  The fclose() function shall perform the equivalent of a close()
+	  on the file descriptor that is associated with the stream
+	  pointed to by stream.
+	  After the call to fclose(), any use of stream results
+	  in undefined behavior.
+	  ------------------------------------------------------------------------
+	  So file is in 'closed' state no matter if fclose succeed or not.
+	  And cleanup could be continued.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757596
+
 2015-11-01 00:04:27 +1100  Jan Schmidt <jan@centricular.com>
 
 	* gst/gstpad.c:
@@ -165,66 +809,20 @@
 	  Allow deactivation in pull-mode, since that implies we
 	  had a peer, activated in pull mode, then the peer disa-peer-ed ;)
 
-=== release 1.6.1 ===
+2015-10-28 17:31:07 -0300  Thiago Santos <thiagoss@osg.samsung.com>
 
-2015-10-30 16:38:10 +0200  Sebastian Dröge <sebastian@centricular.com>
+	* gst/gstelement.c:
+	* gst/gstelementfactory.c:
+	  element: emit tracer's element-new hook from 'constructed'
+	  It allows to properly emitting it for all newly created elements
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757045
 
-	* ChangeLog:
-	* NEWS:
-	* RELEASE:
-	* configure.ac:
-	* docs/plugins/inspect/plugin-coreelements.xml:
-	* gstreamer.doap:
-	* win32/common/config.h:
-	* win32/common/gstversion.h:
-	  Release 1.6.1
+2015-10-28 06:03:39 -0300  Thiago Santos <thiagoss@osg.samsung.com>
 
-2015-10-30 16:18:50 +0200  Sebastian Dröge <sebastian@centricular.com>
-
-	* po/af.po:
-	* po/az.po:
-	* po/be.po:
-	* po/bg.po:
-	* po/ca.po:
-	* po/da.po:
-	* po/el.po:
-	* po/en_GB.po:
-	* po/eo.po:
-	* po/es.po:
-	* po/eu.po:
-	* po/fi.po:
-	* po/fr.po:
-	* po/gl.po:
-	* po/hr.po:
-	* po/hu.po:
-	* po/id.po:
-	* po/it.po:
-	* po/ja.po:
-	* po/lt.po:
-	* po/nb.po:
-	* po/pt_BR.po:
-	* po/ro.po:
-	* po/rw.po:
-	* po/sk.po:
-	* po/sl.po:
-	* po/sq.po:
-	* po/sr.po:
-	* po/sv.po:
-	* po/tr.po:
-	* po/zh_TW.po:
-	  Update .po files
-
-2015-10-30 14:09:00 +0200  Sebastian Dröge <sebastian@centricular.com>
-
-	* po/cs.po:
-	* po/de.po:
-	* po/nl.po:
-	* po/pl.po:
-	* po/ru.po:
-	* po/uk.po:
-	* po/vi.po:
-	* po/zh_CN.po:
-	  po: Update translations
+	* plugins/tracers/gststats.c:
+	  stats: log the element-new hook properly
+	  To be able to get the time the elements were created instead of
+	  just logging them without a time
 
 2015-10-28 18:04:46 +0200  Sebastian Dröge <sebastian@centricular.com>
 
@@ -233,12 +831,191 @@
 	  Without this, flushing might not unblock the streaming thread and cause deadlocks.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757257
 
+2015-10-28 13:04:25 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstpad.c:
+	  pad: Document the order in which pad probes are called
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757197
+
+2015-10-27 18:05:05 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstpad.c:
+	  pad: Append hooks instead of prepending to call them in the order they were added
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757197
+
+2015-10-26 12:50:12 +0100  Stian Selnes <stian@pexip.com>
+
+	* libs/gst/net/gstnetaddressmeta.c:
+	* libs/gst/net/gstnetaddressmeta.h:
+	* win32/common/libgstnet.def:
+	  netaddressmeta: gst_buffer_get_net_address_meta() as function
+	  Implement gst_buffer_get_net_address_meta() as a function instead
+	  of a macro in order to get gobject-introspection to work.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=702921
+
+2015-10-26 18:07:11 +0530  Nirbheek Chauhan <nirbheek@centricular.com>
+
+	* gst/gstbuffer.h:
+	  buffer: flesh out docs for gst_buffer_make_writable() a little
+	  There is a similar explanation in gst_caps_make_writable, but the existing
+	  documentation can be misleading since it does not define what 'is already
+	  writable' means.
+	  Also note when this function is meant to be used.
+
+2015-10-26 17:35:34 +0530  Nirbheek Chauhan <nirbheek@centricular.com>
+
+	* gst/gstcaps.c:
+	  caps: clarify docs for a few functions that they don't update things in-place
+	  It is not necessarily clear from the existing introspection tags and
+	  documentation alone.
+
+2015-10-27 08:48:07 +0100  Edward Hervey <bilboed@bilboed.com>
+
+	* plugins/elements/gstqueue.c:
+	* plugins/elements/gstqueue2.c:
+	  queue/queue2: Use GST_BUFFER_DTS_OR_PTS
+	  The input of queue/queue2 might have DTS set, in which cas we want
+	  to take that into account (instead of the PTS) to calculate position
+	  and queue levels.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756507
+
+2015-10-13 17:20:26 +0200  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: Use buffer DTS if present, else PTS
+	  In order to accurately determine the amount (in time) of data
+	  travelling in queues, we should use an increasing value.
+	  If buffers are encoded and potentially reordered, we should be
+	  using their DTS (increasing) and not PTS (reordered)
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756507
+
+2015-10-27 08:33:41 +0100  Edward Hervey <bilboed@bilboed.com>
+
+	* libs/gst/base/gstcollectpads.c:
+	  collectpads: Use GST_BUFFER_DTS_OR_PTS
+	  Simplifies code a bit
+
+2015-10-26 07:59:54 +0100  Edward Hervey <edward@centricular.com>
+
+	* docs/gst/gstreamer-sections.txt:
+	* gst/gstbuffer.h:
+	  buffer: Add a GST_BUFFER_DTS_OR_PTS macro
+	  API: GST_BUFFER_DTS_OR_PTS
+	  Many scenarios/elements require dealing with streams of buffers that
+	  might have DTS set (i.e. encoded data, potentially reordered)
+	  To simplify getting the increasing "timestamp" of those buffers, create
+	  a macro that will return the DTS if valid, and if not the PTS
+
+2015-10-06 12:21:04 +0200  Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+	* docs/gst/gstreamer-sections.txt:
+	  doc: add GST_{PTR,SEGMENT}_FORMAT
+	  Very useful formats in debug output so best to have them in the
+	  generated doc.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756115
+
+2015-10-26 10:53:35 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstsegment.c:
+	  segment: Return -1 if gst_segment_to_stream_time_full() considers the position not inside the segment
+	  Fixes GstPipeline unit test.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756564
+
+2015-10-24 16:52:44 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst/gsturi.c:
+	  uri: fix behaviour for merging uris ending in .. without following /
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757065
+
 2015-10-24 16:43:59 +0100  Florin Apostol <florin.apostol@oregan.net>
 
 	* tests/check/gst/gsturi.c:
 	  uri: tests: added unit test for streams ending in .. without following /
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757065
 
+2015-08-27 12:43:28 +0200  Thibault Saunier <tsaunier@gnome.org>
+
+	* gst/gstdebugutils.c:
+	  debug: Dump pad properties values
+	  Currently we only show element properties values, we should also show
+	  pad properties values
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754166
+
+2015-10-23 20:04:42 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstsegment.c:
+	  segment: Remove leftover debug g_print()
+
+2015-10-15 14:49:37 +0300  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* docs/design/part-synchronisation.txt:
+	* docs/gst/gstreamer-sections.txt:
+	* gst/gstsegment.c:
+	* gst/gstsegment.h:
+	* tests/check/gst/gstsegment.c:
+	* win32/common/libgstreamer.def:
+	  segment: Add _full variants of all stream/running_time from/to segment position functions
+	  See formula clarifications in design docs for calculation details.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756564
+
+2015-09-26 01:29:07 +0300  Vivia Nikolaidou <vivia@toolsonair.com>
+
+	* scripts/gst-uninstalled:
+	  gst-uninstalled: Added env var for uninstalled PTP helper
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755651
+
+2015-10-22 12:00:42 +0200  Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+	* libs/gst/base/gstbasesink.h:
+	  basesink: rename argument of PREROLL_{COND,LOCK} macros
+	  They take a GstBaseSink instance as argument at not a GstPad. Rename the
+	  argument to 'obj' which is not miss leading and in line with
+	  GST_BASE_SINK_PAD(obj).
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756954
+
+2015-10-22 10:05:14 +0200  Mathieu Duponchelle <mathieu.duponchelle@opencreed.com>
+
+	* gst/gstcontrolsource.c:
+	  gstcontrolsource: Add missing (out) annotation
+
+2015-10-21 14:34:47 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* common:
+	  Automatic update of common submodule
+	  From b99800a to b319909
+
+2015-10-21 14:49:49 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstpad.c:
+	  pad: Fix docs/annotation of gst_pad_probe_info_get_buffer_list()
+	  It's not get_bufferlist(). Because of that it was ignored by the docs and
+	  G-I, leading to crashes because of broken ownership transfer.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756898
+
+2015-10-20 17:29:42 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	* gst/gstpad.c:
+	* libs/gst/base/gstbasetransform.c:
+	  Use new GST_ENABLE_EXTRA_CHECKS #define
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756870
+
+2015-10-21 14:25:40 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* README:
+	* common:
+	  Automatic update of common submodule
+	  From 9aed1d7 to b99800a
+
+2015-10-20 13:46:24 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* tools/gst-stats.c:
+	  stats: always free log
+	  We always want to free the open file log if fopen() succeeded. Independently
+	  of if fgets() succeeds or fails.
+	  CID 1326055
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756864
+
 2015-10-19 16:50:51 +0300  Vivia Nikolaidou <vivia@ahiru.eu>
 
 	* gst/gstsegment.c:
@@ -259,34 +1036,14 @@
 	  B.timestamp = S.stop - (stream_time - S.time) / ABS (S.applied_rate)
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756810
 
-2015-09-25 15:57:16 +0300  Vivia Nikolaidou <vivia@toolsonair.com>
+2015-10-19 21:39:19 +0200  Stefan Sauer <ensonic@users.sf.net>
 
-	* gst/gstsegment.c:
-	  segment: gst_segment_to_stream_time: Renamed 'result' to 'stream_time'
-	  Renamed the "result" variable to "stream_time" for better readability.
-
-2015-10-24 16:52:44 +0100  Florin Apostol <florin.apostol@oregan.net>
-
-	* gst/gsturi.c:
-	  uri: fix behaviour for merging uris ending in .. without following /
-	  https://bugzilla.gnome.org/show_bug.cgi?id=757065
-
-2015-10-21 14:49:49 +0300  Sebastian Dröge <sebastian@centricular.com>
-
-	* gst/gstpad.c:
-	  pad: Fix docs/annotation of gst_pad_probe_info_get_buffer_list()
-	  It's not get_bufferlist(). Because of that it was ignored by the docs and
-	  G-I, leading to crashes because of broken ownership transfer.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756898
-
-2015-10-17 22:13:08 +0300  Sebastian Dröge <sebastian@centricular.com>
-
-	* gst/gstbin.c:
-	  bin: Make sure to free all cached messages when going to NULL
-	  An ASYNC READY->PAUSED might have failed without the bin code noticing during
-	  the state change, in which case we will never get PAUSED->READY and would leak
-	  messages.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756611
+	* docs/design/draft-tracing.txt:
+	* docs/plugins/gstreamer-plugins-docs.sgml:
+	* gst/gsttracerutils.c:
+	  tracer: rename the envvar to GST_TRACER_PLUGINS
+	  The subsystem reused the GST_TRACE var that is allready in use by the alloc tracer.
+	  Fixes #756760
 
 2015-10-15 16:32:42 +0200  Edward Hervey <edward@centricular.com>
 
@@ -305,6 +1062,61 @@
 	  This would result in that thread never being woken up
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756645
 
+2015-09-26 18:16:07 +0800  Ting-Wei Lan <lantw@src.gnome.org>
+
+	* gst/gstutils.h:
+	  gstutils: Fix build with clang -Werror=cast-align
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755657
+
+2015-10-17 22:13:08 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstbin.c:
+	  bin: Make sure to free all cached messages when going to NULL
+	  An ASYNC READY->PAUSED might have failed without the bin code noticing during
+	  the state change, in which case we will never get PAUSED->READY and would leak
+	  messages.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756611
+
+2015-10-16 15:59:49 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* docs/gst/running.xml:
+	* gst/gstdebugutils.h:
+	* tools/gst-launch.1.in:
+	  docs: mention xdot utility to view .dot files directly
+
+2015-10-16 12:00:50 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/gsttrace.c:
+	  alloctrace: show details of events and messages leaked
+	  So it's clearer what leaked.
+
+2015-10-16 11:54:18 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* docs/manual/advanced-metadata.xml:
+	  docs: manual: improve advanced metadata example a bit
+	  Accept both filename and a URI as argument, and print
+	  the error from the error message if there's an error.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756630
+
+2015-10-15 19:05:21 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gstmemory.h:
+	  memory: fix typo in documentation
+	  It should be 1.2 unless this is a flag from the future
+
+2015-09-15 18:08:18 +0200  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: Accept STREAM_START after EOS
+	  In the same way core now allows STREAM_START to remove the flushing
+	  state from pads, we need to do the same thing in multiqueue
+
+2015-10-14 11:03:22 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/gst/gstsegment.c:
+	  segment: Convert function to macro in unit test to get proper line numbers on failures
+	  https://bugzilla.gnome.org/show_bug.cgi?id=748316
+
 2015-10-12 17:29:26 +0200  Edward Hervey <edward@centricular.com>
 
 	* libs/gst/base/gstbaseparse.c:
@@ -312,22 +1124,17 @@
 	  Our current position has nothing to do with being linked or not.
 	  Avoids having stray segment updates fired every 2s
 
-2015-10-05 21:29:49 +0200  Stefan Sauer <ensonic@users.sf.net>
+2015-10-07 22:55:44 +0100  Florin Apostol <florin.apostol@oregan.net>
 
-	* tests/check/gst/gsttag.c:
-	  tests: fix the tag test
-	  The previous change (see bgo #756069) was causing us to free the same pointer
-	  multiple times. If we actually get a sample back, the test fails, no need to
-	  free anything in that case.
+	* gst/gstpad.c:
+	  pad: fix memory leak when sending events to an EOS pad
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756208
 
-2015-10-05 11:12:47 +0900  Vineeth TM <vineeth.tm@samsung.com>
+2015-10-07 12:01:16 +0100  Sebastian Dröge <sebastian@centricular.com>
 
-	* tests/check/gst/gsttag.c:
-	* tools/gst-launch.c:
-	  tests/gst-launch: Fix sample memory leak
-	  When sample is got using gst_tag_list_get_sample_index, it should
-	  be free'd.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756069
+	* plugins/tracers/Makefile.am:
+	  tracers: Only link against libgstprintf.la if the debugging system is enabled
+	  It does not exist otherwise and linking will fail.
 
 2015-10-07 11:25:52 +0100  Sebastian Dröge <sebastian@centricular.com>
 
@@ -338,6 +1145,660 @@
 	  struct sockaddr ifru_addr;
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756136
 
+2015-10-07 12:22:34 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* configure.ac:
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gsttracers.c:
+	  Revert "tracers: Only build getrusage() tracer if RUSAGE_THREAD is available"
+	  This reverts commit 8ddbf76626a48420306869db1d171f854cc25310.
+
+2015-10-07 12:21:56 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstrusage.c:
+	  tracers/rusage: ifdef the RUSAGE_THREAD usage
+	  Some versions of andoid don't seem to have it.
+
+2015-10-07 11:11:30 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gsttracers.c:
+	  tracers: Only build getrusage() tracer if RUSAGE_THREAD is available
+
+2015-10-06 21:46:55 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* win32/common/libgstreamer.def:
+	  win32: remove gst_tracer_quark_id_get_type
+	  Revert addition from 777bbeea605051ae3d2fa7e02ad8589001e78ce0.
+
+2015-10-06 18:52:38 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.h:
+	* gst/gsttracerutils.h:
+	  tracer: move prototype to the right header
+	  Fixes the build when the tracing subsystem is disabled.
+
+2015-10-06 18:49:46 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gst.c:
+	* gst/gsttracerutils.h:
+	  tracer: mark GstTracerQuarkId as non GEnum
+	  This reverts 72ca02b1de4066eeae35c891e275386770117778 and marks the enum
+	  accordingly.
+
+2015-10-06 18:46:24 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gsttracers.c:
+	  tracers: disable the log tracer if debug logging is disabled
+
+2015-10-06 18:45:41 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/Makefile.am:
+	  makefile.am: Remove obsolete Android build cruft
+	  This is not needed any longer.
+
+2015-10-06 14:01:03 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracerutils.h:
+	  tracer: fix the build with debug (tracer) disabled
+	  Sync the macro definitions. The dummy defines has argument mismatches.
+
+2015-10-06 11:39:33 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracerutils.h:
+	  tracer: fix the build with debug (tracer) disabled
+	  Remove commas at the end of the macros.
+
+2015-09-01 16:39:30 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* plugins/tracers/gststats.c:
+	  tracers: stats: add message structure to output
+	  The name of the message is not enough. For example, state-change
+	  is not enough to know the transition.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754496
+
+2015-10-05 19:05:58 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gst.c:
+	  gst: adding tracer quark id to gst init and deinit
+	  Fixes issues at make check
+
+2015-10-05 18:50:48 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* win32/common/libgstreamer.def:
+	  win32: libgstreamer: add tracer functions
+
+2015-10-05 21:29:49 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* tests/check/gst/gsttag.c:
+	  tests: fix the tag test
+	  The previous change (see bgo #756069) was causing us to free the same pointer
+	  multiple times. If we actually get a sample back, the test fails, no need to
+	  free anything in that case.
+
+2015-06-04 01:50:34 +0200  Marcin Kolny <marcin.kolny@flytronic.pl>
+
+	* docs/design/draft-tracing.txt:
+	* gst/gstbin.c:
+	* gst/gstelement.c:
+	* gst/gstelementfactory.c:
+	* gst/gstpad.c:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	  tracer: add missing hooks
+	  Add following hooks: element-new, element-add-pad, element-remove-pad,
+	  bin-add-pre, bin-add-post, bin-remove-pre, bin-remove-post, pad-link-pre,
+	  pad-link-post, pad-unlink-pre, pad-unlink-post.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=733187
+
+2015-03-13 18:31:40 +0000  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* plugins/tracers/gststats.c:
+	  tracer: gststats: add thread-id to log line
+
+2015-03-13 13:10:42 +0000  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gstpad.c:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	* plugins/tracers/gststats.c:
+	  tracer: add pad query hooks
+
+2015-01-15 06:32:48 +0100  Mathieu Duponchelle <mathieu.duponchelle@opencreed.com>
+
+	* gst/gsttracer.c:
+	  tracer: strdup the passed parameters.
+
+2015-01-13 22:11:34 +0100  Mathieu Duponchelle <mathieu.duponchelle@opencreed.com>
+
+	* plugins/tracers/gstlog.c:
+	  tracer: Use GST_TIME_ARGS when printing with GST_TIME_FORMAT.
+
+2014-10-16 10:42:05 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	  tracing: update docs
+
+2014-10-02 19:52:03 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gststats.c:
+	* tools/gst-stats.c:
+	  stats: TIMESTAMP -> PTS
+
+2014-09-22 09:55:56 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gst.c:
+	* gst/gsttracer.h:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  tracing: rename the global api to gst_tracing
+	  This makes it more obvious what is the api for tracer elements and what is api
+	  for the global state.
+
+2014-09-18 08:28:48 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* tools/gst-stats.c:
+	  stats: fix cpu stats printing
+	  Only print them if we have them. Also scale them by 10.0 as the are in
+	  per-mille now.
+
+2014-09-18 08:26:19 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.h:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  tracers: eliminate var_args
+	  Register tracer hooks as GCallback. Use macros for hook dispatch and cast the
+	  hook functions back to the appropriate type.
+
+2014-09-17 09:41:46 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* tools/gst-stats.c:
+	  stats: don't warn on ".class" log lines
+
+2014-09-17 08:38:02 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gstrusage.h:
+	* plugins/tracers/gststats.c:
+	* plugins/tracers/gststats.h:
+	  tracers: code cleanups
+	  Move static variables to instance variables. Add finalize methods. Remove code
+	  that is commented out. Cleanup locking code.
+
+2014-09-15 22:27:11 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.h:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  tracer: use GQuark or strings for the hook id
+	  This way one can define new tracing probes without changing the core. We are
+	  using our own quark table, as 1) we only want to initialize them if we're
+	  tracing, 2) we want to share them with the tracers.
+
+2014-09-15 13:15:17 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  tracer: simplify hook api
+	  Instead of a single invoke() function and a 'mask', register to individual
+	  hooks. This avoids one level of indirection and allows us to remove the
+	  hook enums. The message enms are now renamed to hook enums.
+
+2014-09-12 18:43:52 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* gst/gsttracerutils.c:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  tracer: drop the HookId hid from the invoke method
+	  The MessageId is more detailed and anyway needed to interpret the varargs.
+
+2014-09-12 11:17:41 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gststats.c:
+	  stats: fixup doc name and remove commented code
+
+2014-09-12 08:40:01 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  tracers: add metadata for the logged values
+
+2014-09-11 13:02:51 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstrusage.c:
+	  rusage: improve cpu load meassurements
+	  Get the number of cpus and scale process cpu-load accordingly. Switch the
+	  cpuload to be per-mille to get smoother graphs. Add a bit more logging and use
+	  the _OBJECT variant.
+
+2014-09-11 13:00:59 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	  tracer: remove commented code
+
+2014-09-10 08:33:38 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	  design: update tracer design
+	  Update the tracer event classes section. Add a performance section.
+
+2014-09-10 08:32:18 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	  tracer: use GST_PTR_FORMAT to log the structure
+	  This way we only expand the structure when we're logging. This allows us to
+	  meassure the pure tracing seperately from the logging.
+	  Also add some comments on further improvements.
+
+2014-09-10 07:55:33 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstrusage.c:
+	* tools/gst-stats.c:
+	  rusage: implement windowing of cpuload
+	  Add a local help to the rusage plugin that supports windowing of values. We want
+	  to generalize this for use in other plugins.
+
+2014-09-04 10:11:52 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstrusage.c:
+	* tools/gst-stats.c:
+	  rusage: announce the data format
+	  Rusage will now announce what is meassures and how it is logged. Use the new format in stats.
+	  Cleanup the the code and naming.
+
+2014-07-28 22:08:49 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstrusage.c:
+	* tools/gst-stats.c:
+	  stats: improve cpu load meassurements
+	  Rename variables for clarity. Handle the initial disparity between debug time
+	  and the time already spent in the proc and main thread.
+
+2014-07-18 08:09:32 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	  design: update tracer design
+
+2014-07-28 08:49:38 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gstquark.c:
+	* gst/gstquark.h:
+	  quarks: revert the quark changes, we not using them anymore
+
+2014-07-18 07:49:38 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/Makefile.am:
+	* gst/gst.h:
+	* gst/gst_private.h:
+	* gst/gstelement.c:
+	* gst/gstpad.c:
+	* gst/gstregistrychunks.c:
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* gst/gsttracerfactory.c:
+	* gst/gsttracerfactory.h:
+	* gst/gsttracerutils.c:
+	* gst/gsttracerutils.h:
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gstlatency.h:
+	* plugins/tracers/gstlog.h:
+	* plugins/tracers/gstrusage.h:
+	* plugins/tracers/gststats.h:
+	  tracer: split into tracer and tracerutils
+	  Keep tracer base class in tracer and move core support into the utils module.
+	  Add a unstable-api guard to the tracer.h so that external modules would need to
+	  acknowledge the status by setting GST_USE_UNSTABLE_API.
+
+2014-07-16 18:48:52 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	* gst/gsttracerfactory.c:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  docs: add gtk-doc blobs
+
+2014-02-20 11:15:20 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstlatency.c:
+	  latency: take stop time when buffer is handled
+	  Now we meassure time from 'before buffer transfer on src' to when the 'buffer is processed on sink'.
+
+2014-07-15 09:49:23 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gststats.c:
+	  tracers: add a logging helper to remove identical copies from the tracers
+
+2014-02-18 16:15:44 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gststats.c:
+	  tracers: tweak the get_real_pad_parent()
+	  By using the we ended up on the actual element, not the parent.
+
+2014-02-18 11:06:10 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gstlatency.c:
+	* plugins/tracers/gstlatency.h:
+	* plugins/tracers/gsttracers.c:
+	  tracers: add a new latency tracer
+	  Add a new tracer with pushes extra events to meassure src-to-sink processing latency.
+
+2014-02-17 18:30:24 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	  design: update design docs
+	  Add new tracer idea.
+
+2013-11-22 19:10:04 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* tools/gst-stats.c:
+	  gst-stats: use the rusage stats
+	  Add cpuload info from rusage traces.
+
+2013-11-20 08:22:58 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* configure.ac:
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gstrusage.c:
+	* plugins/tracers/gstrusage.h:
+	* plugins/tracers/gsttracers.c:
+	  rusage: add a new rusage tracer
+	  The tracer hooks up to all probes and logs resource usage figures.
+
+2014-07-15 10:20:22 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* tools/gst-stats.c:
+	  gst-stats: filter complete thread section if we have no pads
+
+2013-11-19 08:04:38 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gststats.c:
+	* tools/gst-stats.c:
+	  stats: improve the handling of parentage
+	  Log new object after we did the check for parents.
+
+2013-11-17 11:37:14 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* tools/gst-stats.c:
+	  stats: print thread key for stats and filter empty pad-sections
+
+2013-11-17 11:15:36 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* tools/gst-stats.c:
+	  stats: update buffer flags
+	  Remove some buffer flags that were leftovers from 0.10 and handle new 1.0 buffer
+	  flags.
+
+2013-11-04 20:11:09 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gststats.c:
+	* plugins/tracers/gststats.h:
+	* tools/.gitignore:
+	* tools/Makefile.am:
+	* tools/gst-stats.c:
+	  stats: add a stats frontend
+	  Parse the log and collect data from tracer messages.
+
+2013-11-15 09:36:21 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.h:
+	  tracer: use the same timebase as the logging
+
+2014-07-16 09:22:37 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	  design: update design
+
+2014-07-16 09:41:48 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstlog.c:
+	  log: add query log category
+
+2013-11-02 18:24:56 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	  tracer: parse parameters
+
+2014-07-16 09:22:14 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gstelement.c:
+	* gst/gstpad.c:
+	* gst/gsttracer.h:
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gststats.c:
+	  tracer: add more hooks and handle it in the plugins
+
+2013-10-30 08:19:41 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gststats.c:
+	  stats: handle buffer lists
+
+2013-10-30 08:04:27 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	* plugins/tracers/gstlog.c:
+	  log: make the log tracer more verbose again
+	  Define log formats per message type and print details.
+
+2013-10-28 21:59:19 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gststats.c:
+	  tracer: use a macros for the enabled check
+	  Avoid a function call and check the variables from the macro.
+
+2013-10-28 21:39:52 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	* gst/gstpad.c:
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	  tracer: use macros for hooks
+	  Wrap the hook with a pre and post macro. This looks less intrusive than the
+	  previous version, although it is a little less optimized.
+
+2013-10-28 21:28:18 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gstpad.c:
+	* gst/gstquark.c:
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gststats.c:
+	  tracer: pass the timestamp directly
+	  Avoid the structure mashalling (and weird field naming).
+
+2013-10-28 08:08:20 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gststats.c:
+	* plugins/tracers/gststats.h:
+	* plugins/tracers/gsttracers.c:
+	  stats: add a tracer that collects pipeline statistics
+	  This is more or less equiv to the the statistics in gst-tracelib.
+
+2013-10-28 08:07:52 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* plugins/tracers/gstlog.h:
+	  log: add cast macro
+
+2013-10-27 20:43:25 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* plugins/tracers/gstlog.c:
+	  tracer: pass the instance to the vmethod
+
+2013-10-27 17:05:52 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	* plugins/tracers/gstlog.c:
+	  design: more planning
+
+2013-10-27 17:04:32 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst/gstpad.c:
+	* gst/gstquark.c:
+	* gst/gstquark.h:
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	  tracer: switch to quarks and add another hook for buffer flow
+	  Use pre-defines quarks as this will be called quite often.
+
+2013-10-27 12:45:54 +0100  Stefan Sauer <ensonic@users.sf.net>
+
+	* docs/design/draft-tracing.txt:
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* plugins/tracers/gstlog.c:
+	  tracer: add the hook-id to the invoke signature
+	  Tracers that subscribe to multiple hooks can know what hook was used.
+
+2013-10-26 22:05:13 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* tools/gst-inspect.c:
+	  inspect: add support for the new factory
+	  Handle tracer modules.
+
+2013-10-24 14:47:48 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* configure.ac:
+	* docs/design/draft-tracing.txt:
+	* gst/Makefile.am:
+	* gst/gst.c:
+	* gst/gst.h:
+	* gst/gst_private.h:
+	* gst/gstpad.c:
+	* gst/gstregistrybinary.h:
+	* gst/gstregistrychunks.c:
+	* gst/gsttracer.c:
+	* gst/gsttracer.h:
+	* gst/gsttracerfactory.c:
+	* gst/gsttracerfactory.h:
+	* plugins/Makefile.am:
+	* plugins/tracers/.gitignore:
+	* plugins/tracers/Makefile.am:
+	* plugins/tracers/gstlog.c:
+	* plugins/tracers/gstlog.h:
+	* plugins/tracers/gsttracers.c:
+	  tracer: initial prototype for the tracing subsystem
+
+2015-10-05 11:12:47 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* tests/check/gst/gsttag.c:
+	* tools/gst-launch.c:
+	  tests/gst-launch: Fix sample memory leak
+	  When sample is got using gst_tag_list_get_sample_index, it should
+	  be free'd.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756069
+
+2015-10-02 22:17:04 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	* gst/gst.c:
+	* gst/gsturi.c:
+	* gst/gstvalue.c:
+	  Update GLib dependency to 2.40.0
+
+2015-08-20 16:21:59 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* docs/manual/advanced-dataaccess.xml:
+	* docs/manual/appendix-integration.xml:
+	* docs/manual/basics-init.xml:
+	* libs/gst/helpers/gst-completion-helper.c:
+	* libs/gst/helpers/gst-ptp-helper.c:
+	* tests/benchmarks/capsnego.c:
+	* tests/examples/ptp/ptp-print-times.c:
+	* tools/gst-inspect.c:
+	* tools/gst-launch.c:
+	* tools/gst-typefind.c:
+	  gstreamer: Fix memory leaks when context parse fails
+	  When g_option_context_parse fails, context and error variables are not getting free'd
+	  which results in memory leaks. Free'ing the same.
+	  And replacing g_error_free with g_clear_error, which checks if the error being passed
+	  is not NULL and sets the variable to NULL on free'ing.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753851
+
+2015-09-23 23:03:29 +0200  Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+
+	* libs/gst/controller/gsttimedvaluecontrolsource.c:
+	  timedvaluecontrolsource: Use g_sequence_lookup where possible
+	  When looking for exact matches in the sequence, this results
+	  in much simpler code than when using g_sequence_search.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755498
+
+2015-10-01 22:09:58 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* libs/gst/controller/gstinterpolationcontrolsource.c:
+	  interpolationcontrolsource: fix write over the array size
+	  The '++' got incidentially added during the refactoring in
+	  2fe3939ce7ea84c45dd922e7f1097dd07f11fc5d.
+
+2015-09-30 17:29:16 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* libs/gst/controller/gsttimedvaluecontrolsource.h:
+	* tests/check/libs/struct_arm.h:
+	* tests/check/libs/struct_hppa.h:
+	* tests/check/libs/struct_i386.h:
+	* tests/check/libs/struct_ppc32.h:
+	* tests/check/libs/struct_ppc64.h:
+	* tests/check/libs/struct_sparc.h:
+	* tests/check/libs/struct_x86_64.h:
+	  controlpoint: change the padding to be of arch-independent size
+	  The default padding I introduced in d4f81fb4e62d34a4c1dabc65b23ede7ce7694c63 is
+	  actually only 4 pointers and on 32bit platforms already smaller than the union.
+	  Replace it with a fixed 64byte padding. Don't add the normal padding for now.
+	  Fixes #755822
+
+2015-08-21 17:42:52 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* scripts/gst-uninstalled:
+	  gstreamer-uninstalled: add path for OpenCV haar cascade files
+	  Some OpenCV plugins use haar cascade files that are included in the
+	  GStreamer sources. To be able to use these from uninstalled, they need
+	  to be found through an environment variable.
+	  Adding this environment variable pointing to haar cascade files to
+	  gst-uninstalled.
+
 2015-09-28 16:01:55 +0100  Tim-Philipp Müller <tim@centricular.com>
 
 	* libs/gst/check/gstcheck.c:
@@ -348,6 +1809,173 @@
 	  format string is passed then. Fix indentation differently.
 	  http://clang.llvm.org/docs/AttributeReference.html#format-gnu-format
 
+2015-09-28 16:45:47 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* tests/examples/manual/Makefile.am:
+	  tests: fix the manual tests by setting the right env-vars
+
+2015-09-28 16:22:36 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* libs/gst/controller/gstdirectcontrolbinding.h:
+	  directcontrolbinding: fix formatting
+
+2015-09-28 16:21:55 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* libs/gst/base/gstindex.h:
+	  index: mark two structs that don't have abi padding
+
+2015-09-28 16:19:40 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* libs/gst/controller/gsttimedvaluecontrolsource.h:
+	* tests/check/libs/struct_arm.h:
+	* tests/check/libs/struct_hppa.h:
+	* tests/check/libs/struct_i386.h:
+	* tests/check/libs/struct_ppc32.h:
+	* tests/check/libs/struct_ppc64.h:
+	* tests/check/libs/struct_sparc.h:
+	* tests/check/libs/struct_x86_64.h:
+	  controller: add the missing abi padding
+	  While this technically is an abi break, we decided to do this:
+	  1) the struct is documented to be internal
+	  2) the struct is alloced and freed inside the library
+	  3) there are no public methods that receive or return instances
+	  4) the only code known to use this struct are classes containd here
+
+2015-09-24 00:04:48 +1000  Matthew Waters <matthew@centricular.com>
+
+	* docs/gst/gstreamer-sections.txt:
+	* gst/gstbin.c:
+	* gst/gstelement.c:
+	* gst/gstelement.h:
+	* tests/check/gst/gstcontext.c:
+	* win32/common/libgstreamer.def:
+	  bin: implement context propagation when adding elements
+	  When adding an element to a bin we need to propagate the GstContext's
+	  to/from the element.
+	  This moves the GstContext list from GstBin to GstElement and adds
+	  convenience functions to get the currently set list of GstContext's.
+	  This does not deal with the collection of GstContext's propagated
+	  using GST_CONTEXT_QUERY.  Element subclasses are advised to call
+	  gst_element_set_context if they need to propagate GstContext's
+	  received from the context query.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=705579
+
+2015-09-07 09:39:32 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* libs/gst/controller/gstinterpolationcontrolsource.c:
+	* libs/gst/controller/gstinterpolationcontrolsource.h:
+	* libs/gst/controller/gsttimedvaluecontrolsource.h:
+	  interpolationcontrolsource: add cubic_mono interpolation
+	  This new mode won't overshoot the min/max y values set by the control-points.
+	  Fixes #754678
+	  API: GST_INTERPOLATION_MODE_CUBIC_MONO
+
+2015-09-07 09:37:05 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* libs/gst/controller/gstinterpolationcontrolsource.c:
+	  interpolationcontrolsource: refactor code
+	  Extract common code that looks up the control-points around the timestamp. Add
+	  some comments for future investigation.
+
+2015-09-04 16:38:37 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* configure.ac:
+	* tests/examples/controller/.gitignore:
+	* tests/examples/controller/Makefile.am:
+	* tests/examples/controller/controller-graph.c:
+	  tests/examples: add a demo for the interpolation control source modes
+	  This is in preparation for new modes to be added. In particullar it demonstrates
+	  how the cubic splines overshoot the range.
+
+2015-09-09 11:55:28 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* plugins/elements/gstcapsfilter.c:
+	  capsfilter: remove proxying of accept-caps downstream
+	  The design is to only do a local check
+
+2015-08-25 19:37:30 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst/gstpad.c:
+	  pad: don't fallback to caps queries with proxy pads
+	  A proxy-pad should always proxy the caps related queries
+	  and events to its down or upstream peers on the other side
+	  of the element. Falling back to a caps query seems wrong.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754112
+
+2015-09-26 11:03:24 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* libs/gst/check/gstharness.c:
+	  harness: minor doc fixes
+
+2015-09-02 17:58:38 +0300  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* docs/gst/gstreamer-sections.txt:
+	* gst/gstsegment.c:
+	* gst/gstsegment.h:
+	* libs/gst/base/gstbasesink.c:
+	* tests/check/gst/gstsegment.c:
+	* win32/common/libgstreamer.def:
+	  segment: Replaced gst_segment_to_position with gst_segment_position_from_running_time
+	  gst_segment_to_position might cause confusion, especially with the addition of
+	  gst_segment_position_from_stream_time . Deprecated gst_segment_to_position
+	  now, and replaced it with gst_segment_position_from_running_time.
+	  Also added unit tests.
+
+2015-09-02 17:38:25 +0300  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* tests/check/gst/gstsegment.c:
+	  segment: Added unit tests for gst_segment_position_from_stream_time
+
+2015-09-25 15:57:16 +0300  Vivia Nikolaidou <vivia@toolsonair.com>
+
+	* gst/gstsegment.c:
+	  segment: gst_segment_to_stream_time: Renamed 'result' to 'stream_time'
+	  Renamed the "result" variable to "stream_time" for better readability.
+
+2015-09-25 15:56:45 +0300  Vivia Nikolaidou <vivia@toolsonair.com>
+
+	* docs/gst/gstreamer-sections.txt:
+	* gst/gstsegment.c:
+	* gst/gstsegment.h:
+	* win32/common/libgstreamer.def:
+	  segment: Added gst_segment_position_from_stream_time()
+	  gst_segment_position_from_stream_time() will convert stream time into a
+	  position in the segment so that gst_segment_to_stream_time() with that
+	  position returns the same stream time. It will return -1 if the stream time
+	  given is not inside the segment.
+
+2015-09-02 16:36:35 +0300  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* docs/design/part-synchronisation.txt:
+	* gst/gstsegment.h:
+	  segment: Rewording of struct field descriptions
+	  The new wording makes it easier to understand exactly what each field of the
+	  GstSegment struct represents.
+
+2015-08-31 15:35:11 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstevent.c:
+	  event: Make sure that timestamp + diff in QoS events is never smaller than 0
+	  When a running-time-offset is stored in the event, it could become smaller
+	  than 0 although the event is otherwise correct. This can happen when pad
+	  offsets are used.
+	  To prevent this, we set the timestamp to -diff, so that in the end the sum of
+	  both is exactly 0.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754356
+
+2015-09-16 23:40:44 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/gst/gsturi.c:
+	  uri: Add test for correct absolute URI handling in gst_uri_from_string_with_base()
+	  If the second parameter is an absolute URI, the base should have no effect and
+	  the second parameter should be returned again.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755134
+
+2015-09-25 23:51:03 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	  Back to development
+
 === release 1.6.0 ===
 
 2015-09-25 23:14:33 +0200  Sebastian Dröge <sebastian@centricular.com>
diff --git a/Makefile.in b/Makefile.in
index 7e49416..d4aa3aa 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -404,6 +404,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -1262,6 +1264,9 @@
 	@if [ -d ../www/data/src ]; then \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../www/data/src/$(PACKAGE)/ ; \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../www/data/src/$(PACKAGE)/ ; \
+	elif [ -d ../../www/data/src ]; then \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../../www/data/src/$(PACKAGE)/ ; \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../../www/data/src/$(PACKAGE)/ ; \
 	fi
 	@echo "================================================================================================="
 
diff --git a/NEWS b/NEWS
index be30e41..a4bffc6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,37 +1,2 @@
-This is GStreamer 1.6.2
-
-The GStreamer team is proud to announce the second bugfix release in the stable
-1.6 release series of your favourite cross-platform multimedia framework!
-
-This release only contains bugfixes and it is safe to update from 1.6.0 and
-1.6.1. For a full list of bugfixes see Bugzilla:
-  https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&limit=0&list_id=83309&order=bug_id&product=GStreamer&resolution=FIXED&target_milestone=1.6.2
-
-See http://gstreamer.freedesktop.org/releases/1.6/ for the latest version of this document.
-
-Major bugfixes
-
-- Crashes in gst-libav with sinks that did not provide a buffer pool
-  but supported video metadata were fixed. This affected d3dvideosink
-  and some 3rd party sinks. Also related fixes for crashes when a downstream
-  buffer pool failed allocation.
-- Big GL performance improvement on iOS by a factor of 2 by using Apple's sync
-  extension.
-- Deadlocks in the DirectSound elements on Windows, and the behaviour of its
-  mute property were fixed.
-- The Direct3D video sink does not crash anymore when minimizing the window
-- The library soname generation on Android >= 6.0 was fixed, which previously
-  caused GStreamer to fail to load there.
-- File related elements have large-file (>2GB) support on Android now.
-- gst-libav was updated to ffmpeg 2.8.3.
-- Deserialization of custom events in the GDP depayloader was fixed.
-- Missing OpenGL context initialization in the Qt/QML video sink was fixed in
-  certain situations.
-- Interoperability with some broken RTSP servers using HTTP tunnel was
-  improved.
-- Various compilation fixes for Windows.
-- Various smaller memory leak and other fixes in different places.
-- and many, many more:
-  https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&limit=0&list_id=83309&order=bug_id&product=GStreamer&resolution=FIXED&target_milestone=1.6.2
-
+This is GStreamer 1.7.1
 
diff --git a/README b/README
index f175b1b..fa53f95 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-GStreamer 1.5.x development series
+GStreamer 1.7.x development series
 
 WHAT IT IS
 ----------
diff --git a/RELEASE b/RELEASE
index b63665b..12fd6db 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,14 +1,19 @@
-Release notes for GStreamer 1.6.2
+
+Release notes for GStreamer 1.7.1
 
 
-The GStreamer team is proud to announce the second bugfix release in the stable
-1.6 release series of your favourite cross-platform multimedia framework!
+The GStreamer team is pleased to announce the first release of the unstable
+1.7 release series. The 1.7 release series is adding new features on top of
+the 1.0, 1.2, 1.4 and 1.6 series and is part of the API and ABI-stable 1.x release
+series of the GStreamer multimedia framework. The unstable 1.7 release series
+will lead to the stable 1.8 release series in the next weeks. Any newly added
+API can still change until that point.
 
-This release only contains bugfixes and it is safe to update from 1.6.0 and 1.6.1. For a
-full list of bugfixes see Bugzilla.
 
-See http://gstreamer.freedesktop.org/releases/1.6/
-for the full release notes.
+Binaries for Android, iOS, Mac OS X and Windows will be provided separately
+during the unstable 1.7 release series.
+
+
 
 This module, gstreamer, only contains core functionality.
 For actual media playback, you will need other modules.
@@ -28,12 +33,58 @@
 contains a set of codecs plugins based on libav (formerly gst-ffmpeg)
 
 
+
+  
+
 Bugs fixed in this release
      
-      * 756950 : Error raised when calling get_value method
-      * 758029 : Install race in helpers
-      * 758276 : queue2: custom http-headers event sent by souphttpsrc causes g_warning in ring-buffer mode
-      * 759019 : gst-launch-1.0 returns 0 exit code on async error during playback
+      * 600648 : multiqueue: queues up too much data, excessive memory use with subtitle streams
+      * 755822 : test_ABI: failed ABI check
+      * 702921 : [pygi] python applications cannot interpret buffer metadata
+      * 733187 : integrating the tracer branch
+      * 744040 : bin: Deadlock when sending event
+      * 753851 : gstreamer: Fix memory leaks when context parse fails.
+      * 754112 : pad: don't fallback to caps queries with proxy pads
+      * 754166 : debug: Dump pad properties values
+      * 754356 : event: Make sure that timestamp + diff in QoS events is never smaller than 0
+      * 754418 : segment: Added gst_segment_position_from_stream_time()
+      * 754457 : segment: Rewording of struct field descriptions
+      * 754464 : Add support for g_autoptr() and friends
+      * 754496 : tracer: stats: log message structures
+      * 754678 : controller: the cubic interpolation we have implemented can overshoot min/max of the control-point values
+      * 755498 : timedvaluecontrolsource: Use g_sequence_lookup where possible
+      * 755651 : gst-uninstalled: Added env var for uninstalled PTP helper
+      * 755657 : Fix -Werror build for clang
+      * 755832 : interpolationcontrolsource: memory corruption due to wrong  assignment
+      * 756208 : pad: memory leak when pushing events to an EOS pad
+      * 756507 : multiqueue: Use buffer DTS if present, else PTS
+      * 756564 : segment: Don't return -1 for out-of-segment values in running/stream-time conversion functions
+      * 756760 : Tracer framework reuses existing GST_TRACE environment variable
+      * 756864 : stats: memory leak when fgets() fails
+      * 756870 : Don't disable assertions for releases and provide a new GST_ENABLE_EXTRA_CHECKS #define
+      * 756954 : basesink: rename 'pad' arg in LOCK/COND macros
+      * 757045 : tracer: Emit 'element-new' hook when using parse_launch
+      * 757193 : multiqueue: Handle negative DTS
+      * 757197 : pad: Append hooks instead of prepending to call them in the order they were added
+      * 757353 : multiqueue: Fix high_time computation
+      * 757596 : filesink: left in half cleaned in case of fclose failure
+      * 757821 : New GstPadEventFunction which returns a GstFlowReturn
+      * 758012 : systemclock: Use mach_time on Apple platforms
+      * 758078 : plugin: Dependency hash does not work with 32 or more files
+      * 758080 : plugin: Allow using device nodes as plugin dependency
+      * 758083 : plugin: Add prefix support to dependencies
+      * 758207 : debugutils: Fix string memory leak
+      * 758340 : tests: funnel test is racy
+      * 758541 : gstinfo: Fix ISO non-standard predefined identifier warning for __FUNCTION__ when compiled with gcc 5 -Wpedantic
+      * 758870 : clock: GST_STIME_ARGS does not handle GST_CLOCK_STIME_NONE
+      * 759055 : baseparse: post tag list updates on percentage delta instead of fixed delta
+      * 759089 : Add a fallback that copies the commit hook in autogen.sh
+      * 759125 : GstBin: async-handling latency handling is decoupled from parent pipeline
+      * 759300 : element: unref message in _post_message when there is no implementation
+      * 759430 : queue: Illegal memory access of sink event
+      * 759503 : Stopping a stream very soon after starting asserts
+      * 759713 : -Bsymbolic configure check doesn't work on FreeBSD.
+      * 751182 : identity: allow dropping buffers with specified flags
 
 ==== Download ====
 
@@ -70,12 +121,40 @@
         
 Contributors to this release
     
+      * Aleix Conchillo Flaqué
+      * Anton Bondarenko
+      * Athanasios Oikonomou
+      * Aurélien Zanelli
+      * Duncan Palmer
+      * Edward Hervey
+      * Florin Apostol
+      * Guillaume Desmottes
+      * Heinrich Fink
+      * Jan Alexander Steffens (heftig)
       * Jan Schmidt
+      * Koop Mast
+      * Luis de Bethencourt
+      * Lukasz Forynski
+      * Marcin Kolny
+      * Mathieu Duponchelle
+      * Matthew Waters
+      * Miguel París Díaz
       * Nicolas Dufresne
+      * Nirbheek Chauhan
+      * Philippe Normand
+      * Ravi Kiran K N
       * Reynaldo H. Verdejo Pinochet
       * Ross Burton
       * Sebastian Dröge
+      * Stefan Sauer
+      * Stian Selnes
       * Thiago Santos
       * Thibault Saunier
       * Tim-Philipp Müller

+      * Ting-Wei Lan
+      * Vincent Penquerc'h
+      * Vineeth TM
+      * Vivia Nikolaidou
+      * Wim Taymans
+      * Xavier Claessens

\ No newline at end of file
diff --git a/autogen.sh b/autogen.sh
index ed7101d..8961a1d 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -37,7 +37,11 @@
 if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \);
 then
     rm -f .git/hooks/pre-commit
-    ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit
+    if ! ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit 2> /dev/null
+    then
+        echo "Failed to create commit hook symlink, copying instead ..."
+        cp common/hooks/pre-commit.hook .git/hooks/pre-commit
+    fi
 fi
 
 # GNU gettext automake support doesn't get along with git.
diff --git a/common/Makefile.in b/common/Makefile.in
index c37a36c..37b5c55 100644
--- a/common/Makefile.in
+++ b/common/Makefile.in
@@ -333,6 +333,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/common/check.mak b/common/check.mak
index 8a90b5d..25a16e6 100644
--- a/common/check.mak
+++ b/common/check.mak
@@ -57,7 +57,7 @@
 	--show-possibly-lost=no                                 \
 	--leak-resolution=high --num-callers=20			\
 	./$* 2>&1 | tee $$valgrind_log ;			\
-	if grep "==" $$valgrind_log > /dev/null 2>&1; then	\
+	if grep "^==" $$valgrind_log > /dev/null 2>&1; then	\
 	    rm $$valgrind_log;					\
 	    exit 1;						\
 	fi ;							\
diff --git a/common/gst.supp b/common/gst.supp
index 81f98a9..2740e9a 100644
--- a/common/gst.supp
+++ b/common/gst.supp
@@ -3976,7 +3976,6 @@
 {
    closures aren't valgrind friendly (bgo#739850)
    Memcheck:Leak
-   match-leak-kinds: possible
    fun:calloc
    ...
    fun:g_cclosure_new
@@ -3985,7 +3984,6 @@
 {
    closures aren't valgrind friendly (bgo#739850)
    Memcheck:Leak
-   match-leak-kinds: possible
    fun:malloc
    ...
    fun:g_closure_add_invalidate_notifier
@@ -3994,7 +3992,6 @@
 {
    closures aren't valgrind friendly (bgo#739850)
    Memcheck:Leak
-   match-leak-kinds: possible
    fun:calloc
    ...
    fun:g_closure_new_simple
@@ -4020,3 +4017,12 @@
    Memcheck:Addr8
    fun:do_lookup_x
 }
+
+{
+   <quark tables are leaked on purpose when they are expanded, observed with glib 2.46 and gst-rtsp-server tests>
+   Memcheck:Leak
+   fun:malloc
+   ...
+   fun:g_quark_init
+   fun:glib_init_ctor
+}
diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in
index 6861659..5f05efd 100644
--- a/common/m4/Makefile.in
+++ b/common/m4/Makefile.in
@@ -273,6 +273,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/common/m4/gst-args.m4 b/common/m4/gst-args.m4
index b478c82..0628123 100644
--- a/common/m4/gst-args.m4
+++ b/common/m4/gst-args.m4
@@ -358,3 +358,29 @@
       fi
     ])
 ])
+
+dnl Enable extra checks by default only for development versions
+AC_DEFUN([AG_GST_ARG_ENABLE_EXTRA_CHECKS],
+[
+  AC_ARG_ENABLE(extra-check,
+    AC_HELP_STRING([--enable-extra-checks],
+                   [Enable extra runtime checks]),
+    [
+      case "${enableval}" in
+        yes) EXTRA_CHECKS=yes ;;
+        no)  EXTRA_CHECKS=no ;;
+        *)   AC_MSG_ERROR(bad value ${enableval} for --enable-extra-checks) ;;
+      esac
+    ],
+    [
+      if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
+        EXTRA_CHECKS=yes
+      else
+        EXTRA_CHECKS=no
+      fi
+    ])
+
+    if test "x$EXTRA_CHECKS" = "xyes"; then
+        AC_DEFINE(GST_ENABLE_EXTRA_CHECKS, 1, [Define if extra runtime checks should be enabled])
+    fi
+])
diff --git a/common/m4/gst-error.m4 b/common/m4/gst-error.m4
index d6487cc..0067588 100644
--- a/common/m4/gst-error.m4
+++ b/common/m4/gst-error.m4
@@ -52,31 +52,6 @@
   if test "x$1" != "xno"
   then
     AS_COMPILER_FLAG(-Werror, ERROR_CFLAGS="$ERROR_CFLAGS -Werror")
-
-    dnl if -Werror isn't suported, try -errwarn=%all (Sun Forte case)
-    if test "x$ERROR_CFLAGS" = "x"
-    then
-      AS_COMPILER_FLAG([-errwarn=%all], [
-          ERROR_CFLAGS="-errwarn=%all"
-          dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
-          dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
-          dnl no%E_MACRO_REDEFINED (Sun Forte case)
-          dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
-          dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
-          dnl "macro redefined" because of gst/gettext.h
-          dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
-          for f in 'no%E_EMPTY_DECLARATION' \
-                   'no%E_STATEMENT_NOT_REACHED' \
-                   'no%E_ARGUEMENT_MISMATCH' \
-                   'no%E_MACRO_REDEFINED' \
-                   'no%E_LOOP_NOT_ENTERED_AT_TOP'
-          do
-            AS_COMPILER_FLAG([-errwarn=%all,$f], [
-              ERROR_CFLAGS="$ERROR_CFLAGS,$f"
-            ])
-          done
-      ])
-    fi
   fi
 
   if test "x$2" != "x"
@@ -142,28 +117,6 @@
 	  AS_CXX_COMPILER_FLAG([-fno-strict-aliasing],
 	    ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing")
 	  ])
-    else
-      dnl if -Werror isn't suported, try -errwarn=%all
-      AS_CXX_COMPILER_FLAG([-errwarn=%all], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all")
-      if test "x$ERROR_CXXFLAGS" != "x"; then
-        dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
-        dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
-        dnl no%E_MACRO_REDEFINED (Sun Forte case)
-        dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
-        dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
-        dnl "macro redefined" because of gst/gettext.h
-        dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
-        dnl FIXME: do any of these work with the c++ compiler? if not, why
-        dnl do we check at all?
-        for f in 'no%E_EMPTY_DECLARATION' \
-                 'no%E_STATEMENT_NOT_REACHED' \
-                 'no%E_ARGUEMENT_MISMATCH' \
-                 'no%E_MACRO_REDEFINED' \
-                 'no%E_LOOP_NOT_ENTERED_AT_TOP'
-        do
-          AS_CXX_COMPILER_FLAG([-errwarn=%all,$f], [ERROR_CXXFLAGS="$ERROR_CXXFLAGS,$f"])
-        done
-      fi
     fi
   fi
 
@@ -227,28 +180,6 @@
 	  AS_OBJC_COMPILER_FLAG([-fno-strict-aliasing],
 	    ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -fno-strict-aliasing")
 	  ])
-    else
-      dnl if -Werror isn't suported, try -errwarn=%all
-      AS_OBJC_COMPILER_FLAG([-errwarn=%all], ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -errwarn=%all")
-      if test "x$ERROR_OBJCFLAGS" != "x"; then
-        dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
-        dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
-        dnl no%E_MACRO_REDEFINED (Sun Forte case)
-        dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
-        dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
-        dnl "macro redefined" because of gst/gettext.h
-        dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
-        dnl FIXME: do any of these work with the c++ compiler? if not, why
-        dnl do we check at all?
-        for f in 'no%E_EMPTY_DECLARATION' \
-                 'no%E_STATEMENT_NOT_REACHED' \
-                 'no%E_ARGUEMENT_MISMATCH' \
-                 'no%E_MACRO_REDEFINED' \
-                 'no%E_LOOP_NOT_ENTERED_AT_TOP'
-        do
-          AS_OBJC_COMPILER_FLAG([-errwarn=%all,$f], [ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS,$f"])
-        done
-      fi
     fi
   fi
 
diff --git a/common/m4/gst-glib2.m4 b/common/m4/gst-glib2.m4
index 5b9cd8b..5b72507 100644
--- a/common/m4/gst-glib2.m4
+++ b/common/m4/gst-glib2.m4
@@ -51,18 +51,9 @@
   fi
 
   AC_ARG_ENABLE(glib-asserts,
-    AS_HELP_STRING([--enable-glib-asserts[=@<:@no/auto/yes@:>@]],
+    AS_HELP_STRING([--enable-glib-asserts[=@<:@no/yes@:>@]],
       [Enable GLib assertion]),[enable_glib_assertions=$enableval],
-    [enable_glib_assertions=auto])
-
-  if test "x$enable_glib_assertions" = "xauto"; then
-    dnl Enable assertions only for development versions
-    if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
-      enable_glib_assertions=yes
-    else
-      enable_glib_assertions=no
-    fi
-  fi
+    [enable_glib_assertions=yes])
 
   if test "x$enable_glib_assertions" = "xno"; then
     GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
diff --git a/common/m4/gst-package-release-datetime.m4 b/common/m4/gst-package-release-datetime.m4
index bc885e3..4cf44e6 100644
--- a/common/m4/gst-package-release-datetime.m4
+++ b/common/m4/gst-package-release-datetime.m4
@@ -27,14 +27,16 @@
 AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME],
 [
   dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME()
-  dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes]...)
+  dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]...)
   if test "x$1" = "xno" -o "x$1" = "x"; then
     GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
   elif test "x$1" = "xyes"; then
-    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], ["YYYY-MM-DD"])
-    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], [DOAP-FILE], [RELEASE-VERSION])
-    if ( echo $1 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
-      GST_PACKAGE_RELEASE_DATETIME=$1
+    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [YYYY-MM-DD])
+    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [DOAP-FILE], [RELEASE-VERSION])
+changequote(<<, >>)dnl
+    if ( echo $2 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+changequote([, ])dnl
+      GST_PACKAGE_RELEASE_DATETIME=$2
     else
       dnl we assume the .doap file contains the date as YYYY-MM-DD
       YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $3 $2`;
@@ -47,7 +49,9 @@
       fi
     fi
   dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD])
+changequote(<<, >>)dnl
   elif ( echo $1 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+changequote([, ])dnl
     GST_PACKAGE_RELEASE_DATETIME=$1
   else
     AC_MSG_WARN([SET_PACKAGE_RELEASE_DATETIME: invalid first argument])
diff --git a/common/release.mak b/common/release.mak
index 715657b..c84c2f1 100644
--- a/common/release.mak
+++ b/common/release.mak
@@ -14,6 +14,9 @@
 	@if [ -d ../www/data/src ]; then \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../www/data/src/$(PACKAGE)/ ; \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../www/data/src/$(PACKAGE)/ ; \
+	elif [ -d ../../www/data/src ]; then \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../../www/data/src/$(PACKAGE)/ ; \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../../www/data/src/$(PACKAGE)/ ; \
 	fi
 	@echo "================================================================================================="
 
diff --git a/config.h.in b/config.h.in
index ebc6782..371b36f 100644
--- a/config.h.in
+++ b/config.h.in
@@ -37,6 +37,9 @@
 /* Define if pipeline parsing code is disabled */
 #undef GST_DISABLE_PARSE
 
+/* Define if extra runtime checks should be enabled */
+#undef GST_ENABLE_EXTRA_CHECKS
+
 /* Extra platform specific plugin suffix */
 #undef GST_EXTRA_MODULE_SUFFIX
 
@@ -191,6 +194,9 @@
 /* Define to 1 if you have the `getpid' function. */
 #undef HAVE_GETPID
 
+/* Define to 1 if you have the `getrusage' function. */
+#undef HAVE_GETRUSAGE
+
 /* Define if the GNU gettext() function is already present or preinstalled. */
 #undef HAVE_GETTEXT
 
@@ -352,6 +358,9 @@
 /* Define to 1 if you have the <sys/prctl.h> header file. */
 #undef HAVE_SYS_PRCTL_H
 
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #undef HAVE_SYS_SOCKET_H
 
diff --git a/configure b/configure
index 293e7bf..60b33eb 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GStreamer 1.6.2.
+# Generated by GNU Autoconf 2.69 for GStreamer 1.7.1.
 #
 # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
 #
@@ -591,8 +591,8 @@
 # Identity of this package.
 PACKAGE_NAME='GStreamer'
 PACKAGE_TARNAME='gstreamer'
-PACKAGE_VERSION='1.6.2'
-PACKAGE_STRING='GStreamer 1.6.2'
+PACKAGE_VERSION='1.7.1'
+PACKAGE_STRING='GStreamer 1.7.1'
 PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
 PACKAGE_URL=''
 
@@ -683,6 +683,10 @@
 GST_LICENSE
 HAVE_CHECK_FALSE
 HAVE_CHECK_TRUE
+HAVE_GTK_FALSE
+HAVE_GTK_TRUE
+GTK_LIBS
+GTK_CFLAGS
 GLIB_PREFIX
 GIO_LDFLAGS
 GIO_LIBS
@@ -702,6 +706,8 @@
 HAVE_MMAP_FALSE
 HAVE_MMAP_TRUE
 SOCKET_LIBS
+HAVE_GETRUSAGE_FALSE
+HAVE_GETRUSAGE_TRUE
 HAVE_GSL
 GSL_LIBS
 HAVE_GMP
@@ -1071,6 +1077,7 @@
 with_libiconv_prefix
 with_libintl_prefix
 enable_fatal_warnings
+enable_extra_check
 enable_gst_debug
 enable_parse
 enable_option_parsing
@@ -1135,7 +1142,9 @@
 GLIB_CFLAGS
 GLIB_LIBS
 GIO_CFLAGS
-GIO_LIBS'
+GIO_LIBS
+GTK_CFLAGS
+GTK_LIBS'
 
 
 # Initialize some variables set by options.
@@ -1686,7 +1695,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures GStreamer 1.6.2 to adapt to many kinds of systems.
+\`configure' configures GStreamer 1.7.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1758,7 +1767,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of GStreamer 1.6.2:";;
+     short | recursive ) echo "Configuration of GStreamer 1.7.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1784,6 +1793,7 @@
   --disable-rpath         do not hardcode runtime library paths
   --disable-fatal-warnings
                           Don't turn compiler warnings into fatal errors
+  --enable-extra-checks   Enable extra runtime checks
   --disable-gst-debug     disable debugging subsystem
   --disable-parse         disable command-line parser
   --disable-option-parsing
@@ -1813,7 +1823,7 @@
   --enable-gtk-doc-pdf    build documentation in pdf format [[default=no]]
   --enable-gobject-cast-checks=[no/auto/yes]
                           Enable GObject cast checks
-  --enable-glib-asserts=[no/auto/yes]
+  --enable-glib-asserts=[no/yes]
                           Enable GLib assertion
   --disable-check         disable building unit test libraries
   --disable-Bsymbolic     avoid linking with -Bsymbolic
@@ -1889,6 +1899,8 @@
   GLIB_LIBS   linker flags for GLIB, overriding pkg-config
   GIO_CFLAGS  C compiler flags for GIO, overriding pkg-config
   GIO_LIBS    linker flags for GIO, overriding pkg-config
+  GTK_CFLAGS  C compiler flags for GTK, overriding pkg-config
+  GTK_LIBS    linker flags for GTK, overriding pkg-config
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -1956,7 +1968,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-GStreamer configure 1.6.2
+GStreamer configure 1.7.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2815,7 +2827,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by GStreamer $as_me 1.6.2, which was
+It was created by GStreamer $as_me 1.7.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3796,7 +3808,7 @@
 
 # Define the identity of the package.
  PACKAGE='gstreamer'
- VERSION='1.6.2'
+ VERSION='1.7.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -4007,9 +4019,9 @@
 
 
 
-  PACKAGE_VERSION_MAJOR=$(echo 1.6.2 | cut -d'.' -f1)
-  PACKAGE_VERSION_MINOR=$(echo 1.6.2 | cut -d'.' -f2)
-  PACKAGE_VERSION_MICRO=$(echo 1.6.2 | cut -d'.' -f3)
+  PACKAGE_VERSION_MAJOR=$(echo 1.7.1 | cut -d'.' -f1)
+  PACKAGE_VERSION_MINOR=$(echo 1.7.1 | cut -d'.' -f2)
+  PACKAGE_VERSION_MICRO=$(echo 1.7.1 | cut -d'.' -f3)
 
 
 
@@ -4020,7 +4032,7 @@
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
 $as_echo_n "checking nano version... " >&6; }
 
-  NANO=$(echo 1.6.2 | cut -d'.' -f4)
+  NANO=$(echo 1.7.1 | cut -d'.' -f4)
 
   if test x"$NANO" = x || test "x$NANO" = "x0" ; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
@@ -8678,10 +8690,10 @@
 done
 
 
-  GST_CURRENT=602
+  GST_CURRENT=701
   GST_REVISION=0
-  GST_AGE=602
-  GST_LIBVERSION=602:0:602
+  GST_AGE=701
+  GST_LIBVERSION=701:0:701
 
 
 
@@ -15056,6 +15068,33 @@
 
 
 
+  # Check whether --enable-extra-check was given.
+if test "${enable_extra_check+set}" = set; then :
+  enableval=$enable_extra_check;
+      case "${enableval}" in
+        yes) EXTRA_CHECKS=yes ;;
+        no)  EXTRA_CHECKS=no ;;
+        *)   as_fn_error $? "bad value ${enableval} for --enable-extra-checks" "$LINENO" 5 ;;
+      esac
+
+else
+
+      if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
+        EXTRA_CHECKS=yes
+      else
+        EXTRA_CHECKS=no
+      fi
+
+fi
+
+
+    if test "x$EXTRA_CHECKS" = "xyes"; then
+
+$as_echo "#define GST_ENABLE_EXTRA_CHECKS 1" >>confdefs.h
+
+    fi
+
+
 
 
 
@@ -15793,8 +15832,8 @@
       if test "xyes" = "xno" -o "xyes" = "x"; then
     GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
   elif test "xyes" = "xyes"; then
-            if ( echo yes | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
-      GST_PACKAGE_RELEASE_DATETIME=yes
+            if ( echo  "${srcdir}/gstreamer.doap"  | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+      GST_PACKAGE_RELEASE_DATETIME= "${srcdir}/gstreamer.doap"
     else
             YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file"  $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO   "${srcdir}/gstreamer.doap" `;
       if test "x$YYYY_MM_DD" != "x"; then
@@ -15805,7 +15844,7 @@
         GST_PACKAGE_RELEASE_DATETIME=""
       fi
     fi
-    elif ( echo yes | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
+    elif ( echo yes | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
     GST_PACKAGE_RELEASE_DATETIME=yes
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
@@ -15832,8 +15871,8 @@
       if test "xno" = "xno" -o "xno" = "x"; then
     GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
   elif test "xno" = "xyes"; then
-            if ( echo no | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
-      GST_PACKAGE_RELEASE_DATETIME=no
+            if ( echo  | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+      GST_PACKAGE_RELEASE_DATETIME=
     else
             YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file"  `;
       if test "x$YYYY_MM_DD" != "x"; then
@@ -15844,7 +15883,7 @@
         GST_PACKAGE_RELEASE_DATETIME=""
       fi
     fi
-    elif ( echo no | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
+    elif ( echo no | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
     GST_PACKAGE_RELEASE_DATETIME=no
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
@@ -24809,6 +24848,37 @@
 fi
 done
 
+for ac_func in getrusage
+do :
+  ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage"
+if test "x$ac_cv_func_getrusage" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETRUSAGE 1
+_ACEOF
+
+fi
+done
+
+ if test "x$ac_cv_func_getrusage" = "xyes"; then
+  HAVE_GETRUSAGE_TRUE=
+  HAVE_GETRUSAGE_FALSE='#'
+else
+  HAVE_GETRUSAGE_TRUE='#'
+  HAVE_GETRUSAGE_FALSE=
+fi
+
+for ac_header in sys/resource.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_resource_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_RESOURCE_H 1
+_ACEOF
+
+fi
+
+done
+
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
@@ -25973,7 +26043,7 @@
 fi
 
 
-GLIB_REQ=2.32.0
+GLIB_REQ=2.40.0
 
 
 
@@ -26114,18 +26184,10 @@
 if test "${enable_glib_asserts+set}" = set; then :
   enableval=$enable_glib_asserts; enable_glib_assertions=$enableval
 else
-  enable_glib_assertions=auto
+  enable_glib_assertions=yes
 fi
 
 
-  if test "x$enable_glib_assertions" = "xauto"; then
-        if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
-      enable_glib_assertions=yes
-    else
-      enable_glib_assertions=no
-    fi
-  fi
-
   if test "x$enable_glib_assertions" = "xno"; then
     GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
   fi
@@ -26331,6 +26393,92 @@
 GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
 
 
+HAVE_GTK=no
+GTK_REQ=3.10
+if test "x$BUILD_EXAMPLES" = "xyes"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5
+$as_echo_n "checking for GTK... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTK_CFLAGS"; then
+        pkg_cv_GTK_CFLAGS="$GTK_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_REQ\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_REQ") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= $GTK_REQ" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GTK_LIBS"; then
+        pkg_cv_GTK_LIBS="$GTK_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_REQ\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_REQ") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= $GTK_REQ" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-3.0 >= $GTK_REQ"`
+        else
+	        GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-3.0 >= $GTK_REQ"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GTK_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                HAVE_GTK=no
+elif test $pkg_failed = untried; then
+	HAVE_GTK=no
+else
+	GTK_CFLAGS=$pkg_cv_GTK_CFLAGS
+	GTK_LIBS=$pkg_cv_GTK_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	HAVE_GTK=yes
+fi
+
+
+fi
+ if test "x$HAVE_GTK" = "xyes"; then
+  HAVE_GTK_TRUE=
+  HAVE_GTK_FALSE='#'
+else
+  HAVE_GTK_TRUE='#'
+  HAVE_GTK_FALSE=
+fi
+
+
 # Check whether --enable-check was given.
 if test "${enable_check+set}" = set; then :
   enableval=$enable_check;
@@ -26397,35 +26545,34 @@
 if test "${enable_Bsymbolic+set}" = set; then :
   enableval=$enable_Bsymbolic;
 else
-  SAVED_LDFLAGS="${LDFLAGS}"
+  SAVED_LDFLAGS="${LDFLAGS}" SAVED_LIBS="${LIBS}"
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Bsymbolic-functions linker flag" >&5
 $as_echo_n "checking for -Bsymbolic-functions linker flag... " >&6; }
                LDFLAGS=-Wl,-Bsymbolic-functions
+               LIBS=
                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
 main ()
 {
-int main (void) { return 0; }
+return 0
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-
-                           { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
                            enable_Bsymbolic=yes
 else
-
-                           { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
                            enable_Bsymbolic=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-               LDFLAGS="${SAVED_LDFLAGS}"
+               LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}"
 fi
 
 
@@ -26745,93 +26892,6 @@
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
 $as_echo "$flag_ok" >&6; }
 
-
-        if test "x$ERROR_CFLAGS" = "x"
-    then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all" >&5
-$as_echo_n "checking to see if compiler understands -errwarn=%all... " >&6; }
-
-  save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -errwarn=%all"
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS="$save_CFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-
-          ERROR_CFLAGS="-errwarn=%all"
-                                                                                for f in 'no%E_EMPTY_DECLARATION' \
-                   'no%E_STATEMENT_NOT_REACHED' \
-                   'no%E_ARGUEMENT_MISMATCH' \
-                   'no%E_MACRO_REDEFINED' \
-                   'no%E_LOOP_NOT_ENTERED_AT_TOP'
-          do
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all,$f" >&5
-$as_echo_n "checking to see if compiler understands -errwarn=%all,$f... " >&6; }
-
-  save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -errwarn=%all,$f"
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS="$save_CFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-
-              ERROR_CFLAGS="$ERROR_CFLAGS,$f"
-
-    true
-  else
-
-    true
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-          done
-
-    true
-  else
-
-    true
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-    fi
   fi
 
   if test "x-Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wundef -Wwrite-strings -Wformat-nonliteral -Wformat-security -Wold-style-definition -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return -Wno-multichar -Wnested-externs $NO_WARNINGS" != "x"
@@ -27941,7 +28001,7 @@
 
 
 
-ac_config_files="$ac_config_files Makefile data/Makefile gst/Makefile gst/gstconfig.h gst/gstversion.h gst/parse/Makefile gst/printf/Makefile libs/Makefile libs/gst/Makefile libs/gst/base/Makefile libs/gst/check/Makefile libs/gst/check/libcheck/Makefile libs/gst/check/internal-check.h:libs/gst/check/libcheck/check.h.in libs/gst/controller/Makefile libs/gst/helpers/Makefile libs/gst/net/Makefile plugins/Makefile plugins/elements/Makefile po/Makefile.in tests/Makefile tests/benchmarks/Makefile tests/check/Makefile tests/misc/Makefile tests/examples/Makefile tests/examples/adapter/Makefile tests/examples/controller/Makefile tests/examples/stepping/Makefile tests/examples/helloworld/Makefile tests/examples/manual/Makefile tests/examples/memory/Makefile tests/examples/netclock/Makefile tests/examples/ptp/Makefile tests/examples/streamiddemux/Makefile tests/examples/streams/Makefile tools/Makefile common/Makefile common/m4/Makefile docs/Makefile docs/design/Makefile docs/faq/Makefile docs/gst/Makefile docs/gst/gstreamer.types docs/libs/Makefile docs/plugins/Makefile docs/manual/Makefile docs/pwg/Makefile docs/slides/Makefile docs/xsl/Makefile docs/version.entities m4/Makefile pkgconfig/Makefile stamp.h pkgconfig/gstreamer.pc pkgconfig/gstreamer-uninstalled.pc pkgconfig/gstreamer-base.pc pkgconfig/gstreamer-base-uninstalled.pc pkgconfig/gstreamer-check.pc pkgconfig/gstreamer-check-uninstalled.pc pkgconfig/gstreamer-controller.pc pkgconfig/gstreamer-controller-uninstalled.pc pkgconfig/gstreamer-net.pc pkgconfig/gstreamer-net-uninstalled.pc gstreamer.spec"
+ac_config_files="$ac_config_files Makefile data/Makefile gst/Makefile gst/gstconfig.h gst/gstversion.h gst/parse/Makefile gst/printf/Makefile libs/Makefile libs/gst/Makefile libs/gst/base/Makefile libs/gst/check/Makefile libs/gst/check/libcheck/Makefile libs/gst/check/internal-check.h:libs/gst/check/libcheck/check.h.in libs/gst/controller/Makefile libs/gst/helpers/Makefile libs/gst/net/Makefile plugins/Makefile plugins/elements/Makefile plugins/tracers/Makefile po/Makefile.in tests/Makefile tests/benchmarks/Makefile tests/check/Makefile tests/misc/Makefile tests/examples/Makefile tests/examples/adapter/Makefile tests/examples/controller/Makefile tests/examples/stepping/Makefile tests/examples/helloworld/Makefile tests/examples/manual/Makefile tests/examples/memory/Makefile tests/examples/netclock/Makefile tests/examples/ptp/Makefile tests/examples/streamiddemux/Makefile tests/examples/streams/Makefile tools/Makefile common/Makefile common/m4/Makefile docs/Makefile docs/design/Makefile docs/faq/Makefile docs/gst/Makefile docs/gst/gstreamer.types docs/libs/Makefile docs/plugins/Makefile docs/manual/Makefile docs/pwg/Makefile docs/slides/Makefile docs/xsl/Makefile docs/version.entities m4/Makefile pkgconfig/Makefile stamp.h pkgconfig/gstreamer.pc pkgconfig/gstreamer-uninstalled.pc pkgconfig/gstreamer-base.pc pkgconfig/gstreamer-base-uninstalled.pc pkgconfig/gstreamer-check.pc pkgconfig/gstreamer-check-uninstalled.pc pkgconfig/gstreamer-controller.pc pkgconfig/gstreamer-controller-uninstalled.pc pkgconfig/gstreamer-net.pc pkgconfig/gstreamer-net-uninstalled.pc gstreamer.spec"
 
 
 sed \
@@ -28325,6 +28385,10 @@
   as_fn_error $? "conditional \"HAVE_WINSOCK2_H\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_GETRUSAGE_TRUE}" && test -z "${HAVE_GETRUSAGE_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GETRUSAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_MMAP_TRUE}" && test -z "${HAVE_MMAP_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_MMAP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -28337,6 +28401,10 @@
   as_fn_error $? "conditional \"GST_HAVE_MONOTONIC_CLOCK\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GTK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_CHECK_TRUE}" && test -z "${HAVE_CHECK_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_CHECK\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -28762,7 +28830,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by GStreamer $as_me 1.6.2, which was
+This file was extended by GStreamer $as_me 1.7.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -28828,7 +28896,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-GStreamer config.status 1.6.2
+GStreamer config.status 1.7.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -29382,6 +29450,7 @@
     "libs/gst/net/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/net/Makefile" ;;
     "plugins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Makefile" ;;
     "plugins/elements/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/elements/Makefile" ;;
+    "plugins/tracers/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/tracers/Makefile" ;;
     "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
     "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
     "tests/benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES tests/benchmarks/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index 1107cf8..f98bcfd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@
 dnl when going to/from release please set the nano (fourth number) right !
 dnl releases only do Wall, git and prerelease does Werror too
 dnl
-AC_INIT([GStreamer],[1.6.2],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gstreamer])
+AC_INIT([GStreamer],[1.7.1],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gstreamer])
 AG_GST_INIT
 
 dnl initialize automake (we require GNU make)
@@ -62,7 +62,7 @@
 dnl      1.10.9 (who knows) => 1009
 dnl
 dnl sets GST_LT_LDFLAGS
-AS_LIBTOOL(GST, 602, 0, 602)
+AS_LIBTOOL(GST, 701, 0, 701)
 
 dnl *** autotools stuff ****
 
@@ -81,6 +81,7 @@
 dnl *** check for arguments to configure ***
 
 AG_GST_ARG_DISABLE_FATAL_WARNINGS
+AG_GST_ARG_ENABLE_EXTRA_CHECKS
 
 dnl subsystems - can influence other decisions so needs to be high up
 dnl we need to AM_CONDITIONAL them here for automake 1.6.x compatibility
@@ -604,6 +605,9 @@
 AC_CHECK_FUNCS([gmtime_r])
 AC_CHECK_FUNCS([localtime_r])
 AC_CHECK_FUNCS([sigaction])
+AC_CHECK_FUNCS([getrusage])
+AM_CONDITIONAL(HAVE_GETRUSAGE, test "x$ac_cv_func_getrusage" = "xyes")
+AC_CHECK_HEADERS([sys/resource.h])
 
 dnl check for fseeko()
 AC_FUNC_FSEEKO
@@ -768,13 +772,23 @@
 dnl *** checks for dependency libraries ***
 
 dnl GLib
-GLIB_REQ=2.32.0
+GLIB_REQ=2.40.0
 AG_GST_GLIB_CHECK([$GLIB_REQ])
 
 dnl Check for documentation xrefs
 GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
 AC_SUBST(GLIB_PREFIX)
 
+dnl GTK is optional and only used in examples
+HAVE_GTK=no
+GTK_REQ=3.10
+if test "x$BUILD_EXAMPLES" = "xyes"; then
+  PKG_CHECK_MODULES(GTK, gtk+-3.0 >= $GTK_REQ, HAVE_GTK=yes, HAVE_GTK=no)
+  AC_SUBST(GTK_LIBS)
+  AC_SUBST(GTK_CFLAGS)
+fi
+AM_CONDITIONAL(HAVE_GTK, test "x$HAVE_GTK" = "xyes")
+
 dnl building of unit test libraries
 AC_ARG_ENABLE(check,
   AS_HELP_STRING([--disable-check],[disable building unit test libraries]),
@@ -818,15 +832,16 @@
 dnl intra-library PLT jumps, if available.
 AC_ARG_ENABLE(Bsymbolic,
               [AS_HELP_STRING([--disable-Bsymbolic],[avoid linking with -Bsymbolic])],,
-              [SAVED_LDFLAGS="${LDFLAGS}"
+              [SAVED_LDFLAGS="${LDFLAGS}" SAVED_LIBS="${LIBS}"
                AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
                LDFLAGS=-Wl,-Bsymbolic-functions
-               AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[int main (void) { return 0; }]])],[
+               LIBS=
+               AC_TRY_LINK([], [return 0],
                            AC_MSG_RESULT(yes)
-                           enable_Bsymbolic=yes],[
+                           enable_Bsymbolic=yes,
                            AC_MSG_RESULT(no)
-                           enable_Bsymbolic=no])
-               LDFLAGS="${SAVED_LDFLAGS}"])
+                           enable_Bsymbolic=no)
+               LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}"])
 
 
 dnl *** set variables based on configure arguments
@@ -980,6 +995,7 @@
 libs/gst/net/Makefile
 plugins/Makefile
 plugins/elements/Makefile
+plugins/tracers/Makefile
 po/Makefile.in
 tests/Makefile
 tests/benchmarks/Makefile
diff --git a/data/Makefile.in b/data/Makefile.in
index 1ff938f..00052a7 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -306,6 +306,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 0051f5c..ae300e5 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -338,6 +338,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/design/Makefile.in b/docs/design/Makefile.in
index c9d6782..939f0df 100644
--- a/docs/design/Makefile.in
+++ b/docs/design/Makefile.in
@@ -273,6 +273,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/design/draft-tracing.txt b/docs/design/draft-tracing.txt
index 6867d4f..98f75e6 100644
--- a/docs/design/draft-tracing.txt
+++ b/docs/design/draft-tracing.txt
@@ -1,36 +1,75 @@
 Tracing
 =======
 
-This subsystem will provide a mechanism to get structured tracing info from GStreamer
-applications. This can be used for post-run analysis as well as for live
-introspection.
+This subsystem will provide a mechanism to get structured tracing info from
+GStreamer applications. This can be used for post-run analysis as well as for
+live introspection.
 
-We are going to introduce a GstTracer object. There will be only a single instance
-per process or none if tracing is off (not enabled via envvar or compiled out).
+Use cases
+---------
+* I'd like to get statistics from a running application.
 
-Certain GStreamer core function (such as gst_pad_push or gst_element_add_pad) will
-call into the tracer. The tracer will dispatch into loaded tracing plugins.
+* I'd like to to understand which parts of my pipeline use how many resources.
+
+* I'd like to know which parts of the pipeline use how much memory.
+
+* I'd like to know about ref-counts of parts in the pipeline to find ref-count
+  issues.
+
+Non use-cases
+-------------
+* Some element in the pipeline does not play along the rules, find out which
+  one. This could be done with generic tests.
+
+Design
+------
+
+The system brings the following new items:
+core hooks: probes in the core api, that will expose internal state when tracing
+  is in use
+tracers: plugin features that can process data from the hooks and emit a log
+tracing front-ends: applications that consume logs from tracers
+
+Like the logging, the tracer hooks can be compiled out and if not use a local
+condition to check if active.
+
+Certain GStreamer core function (such as gst_pad_push or gst_element_add_pad)
+will call into the tracer subsystem to dispatch into active tracing modules.
 Developers will be able to select a list of plugins by setting an environment
-variable, such as GST_TRACE="meminfo,dbus". When then plugins are loaded, they will
-add them to certain hooks. Another env var GST_TRACE_CHANNEL can be used to send
-the tracing to a file or a socket (Do the same for GST_DEBUG_CHANNEL). The syntax
-could be GST_XXX_CHANNEL=file:///path/to/file or GST_XXX_CHANNEL=tcp://<ip>:<port>.
-If no channel is set, the tracing goes to stderr like the debug logging.
+variable, such as GST_TRACER_PLUGINS="meminfo;dbus". One can also pass parameters to
+plugins:  GST_TRACER_PLUGINS="log(events,buffers);stats(all)".
+When then plugins are loaded, we'll add them to certain hooks according to which
+they are interested in.
 
-TODO(ensonic): we might want to have GST_{DEBUG|TRACE)_FORMAT envars as well. These
-could be raw, ansi-color, binary, ...
+Right now tracing info is logged as GstStructures to the TRACE level. 
+Idea: Another env var GST_TRACE_CHANNEL could be used to send the tracing to a
+file or a socket. See https://bugzilla.gnome.org/show_bug.cgi?id=733188 for
+discussion on these environment variables.
 
-Hooks
------
-e.g. gst_pad_push() will do add this line:
-GST_TRACER_PUSH_BUFFER (pad, buffer)
+Hook api
+--------
+We'll wrap interesting api calls with two macros, e.g. gst_pad_push():
 
-If tracing is disable at compile time the macro will evaluate to nothing. Otherwise
-it will become something along the lines of:
-if (__tracer && __tracer_hook_is_used) {
-  gst_tracer_push_buffer (pad, buffer);
+GstFlowReturn
+gst_pad_push (GstPad * pad, GstBuffer * buffer)
+{
+  GstFlowReturn res;
+
+  g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+  g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
+  g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+
+  GST_TRACER_PAD_PUSH_PRE (pad, buffer);
+  res = gst_pad_push_data (pad,
+      GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH, buffer);
+  GST_TRACER_PAD_PUSH_POST (pad, res);
+  return res;
 }
 
+TODO(ensonic): gcc has some magic for wrapping functions
+- http://gcc.gnu.org/onlinedocs/gcc/Constructing-Calls.html
+- http://www.clifford.at/cfun/gccfeat/#gccfeat05.c
+
 TODO(ensonic): we should eval if we can use something like jump_label in the kernel
 - http://lwn.net/Articles/412072/ + http://lwn.net/Articles/435215/
 - http://lxr.free-electrons.com/source/kernel/jump_label.c
@@ -41,20 +80,144 @@
 - it is linux specific :/
 
 In addition to api hooks we should also provide timer hooks. Interval timers are
-useful to get e.g. resource usage snapshots. Also absolute timers might make sense. 
+useful to get e.g. resource usage snapshots. Also absolute timers might make
+sense. All this could be implemented with a clock thread. We can use another
+env-var GST_TRACE_TIMERS="100ms,75ms" to configure timers and then pass them to
+the tracers like, GST_TRACER_PLUGINS="rusage(timer=100ms);meminfo(timer=75ms)". Maybe
+we can create them ad-hoc and avoid the GST_TRACE_TIMERS var.
 
-Plugins can attach handlers to one or more hooks. When a hook such as
-gst_tracer_push_buffer () is called it will take a timestamp and call all attached
-handlers. Hooks will be called from misc threads. The trace plugins should only
-consume (=read) the provided data. Most trace plugins will log data to a trace
-channel.
+Hooks (* already implemented)
+-----
+* gst_bin_add
+* gst_bin_remove
+* gst_element_add_pad
+* gst_element_post_message
+* gst_element_query
+* gst_element_remove_pad
+* gst_element_factory_make
+* gst_pad_link
+* gst_pad_pull_range
+* gst_pad_push
+* gst_pad_push_list
+* gst_pad_push_event
+* gst_pad_unlink
 
-TODO(ensonic): use GSignal for the hooks?
+Tracer api
+----------
+Tracers are plugin features. They have a simple api:
 
-Plugins
-=======
+class init
+Here the tracers describe the data the will emit.
 
-meminfo
+instance init
+Tracers attach handlers to one or more hooks using gst_tracer_register_hook().
+In case the are configurable, they can read the options from the 'params'
+property. This is the extra detail from the environment var.
+
+hook functions
+Hooks marshal the parameters given to a trace hook into varargs and also
+add some extra into such as a timestamp. Hooks will be called from misc threads.
+The trace plugins should only consume (=read) the provided data. Expensive
+computation should be avoided to not affect the execution too much.
+Most trace plugins will log data to a trace channel.
+
+instance destruction
+Tracers can output results and release data. This would ideally be done at the
+end of the applications, but gst_deinit() is not mandatory. gst_tracelib was
+using a gcc_destructor. Ideally tracer modules log data as they have them and
+leave aggregation to a tool that processes the log.
+
+tracer event classes
+--------------------
+Most tracers will log some kind of 'events' : a data transfer, an event,
+a message, a query or a measurement. Every tracers should describe the data
+format. This way tools that process tracer logs can show the data in a
+meaningful way without having to know about the tracer plugin.
+
+One way would be to introspect the data from the plugin. This has the
+disadvantage that the postprocessing app needs to load the plugins or talk to
+the gstreamer registry. An alternative is to also log the format description
+into the log. Right now we're logging several nested GstStructure from the
+_tracer_class_init() function (except in the log tracer).
+
+// the name is the value name + ".class"
+// the content describes a single log record
+gst_structure_new ("thread-rusage.class",
+    // value in the log record (order does not matter)
+    // 'thread-id' is a 'key' to related the record to something as indicated
+    // by 'scope' substructure
+    "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+        // enum { process, thread, element, pad, context?, ... }
+        "related-to", G_TYPE_STRING, "thread",
+        NULL),
+    // next value in the record
+    // 'average-cpuload' is a measurement as indicated by the 'value'
+    // substructure
+    "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+        // value type
+        "type", G_TYPE_GTYPE, G_TYPE_UINT,
+        // human readable description, that can be used as a graph label
+        "description", G_TYPE_STRING, "average cpu usage per thread",
+        // flags that help to use the right graph type
+        // flags { aggregated, windowed, cumulative, ... }
+        "flags", G_TYPE_STRING, "aggregated",
+        // value range
+        "min", G_TYPE_UINT, 0, 
+        "max", G_TYPE_UINT, 100,
+        NULL),
+    ...
+    NULL);
+
+A few ideas that are not yet in the above spec:
+- it would be nice to describe the unit of values
+  - putting it into the description is not flexible though, e.g. time would be
+    a guint64 but a ui would reformat it to e.g. h:m:s.ms
+  - other units are e.g.: percent, per-mille, or kbit/s
+- we'd like to have some metadata on scopes
+  - e.g. we'd like to log the thread-names, so that a UI can show that instead
+    of thread-ids
+  - the stats tracer logs 'new-element' and 'new-pad' messages
+    - they add a unique 'ix' to each instance as the memory ptr can be reused
+      for new instances, the data is attached to the objects as qdata
+    - the latency tracer would like to also reference this metadata
+- enums and flags are logged as comma separated string to not require the front-
+  ends to know the flag values (is that okay?)
+- right now we log the classes as structures
+  - this is important so that the log is self contained
+  - it would be nice to add them to the registry, so that gst-inspect can show
+    them
+
+In addition to the above spec, each log event will contain a "ts" field as a
+G_TYPE_UINT64 to specify the time of the event.
+
+We could also consider to add each value as a READABLE gobject property. The
+property has name/description. We could use qdata for scope and flags (or have
+some new property flags).
+We would also need a new "notify" signal, so that value-change notifications 
+would include a time-stamp. This way the tracers would not needs to be aware of
+the logging. The core tracer would register the notify handlers and emit the
+log.
+Or we just add a gst_tracer_class_install_event() and that mimics the 
+g_object_class_install_property().
+
+Frontends can:
+- do an events over time histogram
+- plot curves of values over time or deltas
+- show gauges
+- collect statistics (min, max, avg, ...)
+
+Plugins ideas
+=============
+
+We can have some under gstreamer/plugins/tracers/
+
+latency
+-------
+- register to buffer and event flow
+- send custom event on buffer flow at source elements
+- catch events on event transfer at sink elements
+
+meminfo (not yet implemented)
 -------
 - register to an interval-timer hook.
 - call mallinfo() and log memory usage
@@ -64,42 +227,134 @@
 - register to an interval-timer hook.
 - call getrusage() and log resource usage
 
-dbus
+dbus (not yet implemented)
 ----
 - provide a dbus iface to announce applications that are traced
-- tracing UIs can use the dbus iface to find the channels where logging and tracing
-  is getting logged to, one would start the tracing UI first and when the
-  application is started with tracing activated, the dbus plugin will announce the
-  new application, upon which the tracing UI can start reading from the log channels
+- tracing UIs can use the dbus iface to find the channels where logging and
+  tracing is getting logged to
+- one would start the tracing UI first and when the application is started with
+  tracing activated, the dbus plugin will announce the new application,
+  upon which the tracing UI can start reading from the log channels, this avoid
+  missing some data
 
-topology
+topology (not yet implemented)
 --------
 - register to pipeline topology hooks
 - tracing UIs can show a live pipeline graph
 
-communication
--------------
+stats
+-----
 - register to buffer, event, message and query flow
 - tracing apps can do e.g. statistics
 
-UI
-==
+refcounts (not yet implemented)
+---------
+- log ref-counts of objects
+- just logging them outside of glib/gobject would still make it hard to detect
+  issues though
+
+opengl (not yet implemented)
+------
+- upload/download times
+- there is not hardware agnostic way to get e.g. memory usage info
+  (gl extensions)
+
+User interfaces
+===============
 
 gst-debug-viewer
 ----------------
-gst-debug-viewer could be given the tracelog in addition to the debug log.
-Alternatively it would show a dialog that shows all local apps (if the dbus plugin
-is loaded) and read the log streams from the sockets/files that are configured for
-the app.
+gst-debug-viewer could be given the trace log in addition to the debug log (or a
+combined log). Alternatively it would show a dialog that shows all local apps
+(if the dbus plugin is loaded) and read the log streams from the sockets/files
+that are configured for the app.
 
-gst-trace-stats
----------------
-Such a tool could read a trace and summarize the content like gst-tracelib did for
-stats in 0.10.
+gst-tracer
+----------
+Counterpart of gst-tracelib-ui.
+
+gst-stats
+---------
+A terminal app that shows summary/running stats like the summary gst-tracelib
+shows at the end of a run. Currently only shows an aggregated status.
+
+live-graphers
+-------------
+Maybe we can even feed the log into existing live graphers, with a little driver
+* https://github.com/dkogan/feedgnuplot
 
 
 Problems / Open items
 =====================
-- when connecting to a running app, we cant easily get the 'current' state if logging
-is using a socket, as past events are not stored
+- should tracers log into the debug.log or into a separate log?
+  - separate log
+    - use a binary format?
+    - worse performance (we're writing two logs at the same time)
+    - need to be careful when people to GST_DEBUG_CHANNEL=stderr and
+      GST_TRACE_CHANNEL=stderr (use a shared channel, but what about the
+      formats?)
+  - debug log
+    - the tracer subsystem would need to log the GST_TRACE at a level that is
+      active
+    - should the tracer call gst_debug_category_set_threshold() to ensure things
+      work, even though the levels don't make a lot of sense here
+  - make logging a tracer (a hook in gst_debug_log_valist, move
+    gst_debug_log_default() to the tracer module)
+    - log all debug log to the tracer log, some of the current logging
+      statements can be replaced by generic logging as shown in the log-tracer
+    - add tools/gst-debug to extract a human readable debug log from the trace
+      log
+  - we could maintain a list of log functions, where gst_tracer_log_trace() is
+    the default one. This way e.g. gst-validate could consume the traces
+    directly.
+
+- when hooking into a timer, should we just have some predefined intervals?
+  - can we add a tracer module that registers the timer hook? then we could do
+      GST_TRACER="timer(10ms);rusage"
+    right now the tracer hooks are defined as an enum though.
+
+- when connecting to a running app, we can't easily get the 'current' state if
+  logging is using a socket, as past events are not explicitly stored, we could 
+  determine the current topology and emit events with GST_CLOCK_TIME_NONE as ts                                      
+  to indicate that the events are synthetic.
+
+- we need stable ids for scopes (elements, pads)
+  - the address can be reused
+  - we can use gst_util_seqnum_next()
+  - something like gst_object_get_path_string() won't work as objects are 
+    initially without parent
+
+- right now the tracer is enabled/disabled from configure with 
+  --{enable,disable}-debug, we should probably add --{enable,disable}-tracer
+  although it is confusing with "--disable-trace disable tracing subsystem"
+  where we could at least change the doc-string to say "disable memory tracing
+  subsystem"
+
+Try it
+======
+GST_DEBUG="GST_TRACER:7,GST_BUFFER*:7,GST_EVENT:7,GST_MESSAGE:7" GST_TRACER_PLUGINS=log gst-launch-1.0 fakesrc num-buffers=10 ! fakesink
+- traces for buffer flow in TRACE level
+
+GST_DEBUG="GST_TRACER:7" GST_TRACER_PLUGINS="stats;rusage" GST_DEBUG_FILE=trace.log gst-launch-1.0 fakesrc num-buffers=10 sizetype=fixed ! queue ! fakesink
+gst-stats-1.0 trace.log
+- print some pipeline stats on exit
+
+GST_DEBUG="GST_TRACER:7" GST_TRACER_PLUGINS="stats;rusage" GST_DEBUG_FILE=trace.log /usr/bin/gst-play-1.0 --interactive $HOME/Videos/movie.mp4
+./scripts/gst-plot-traces.sh --format=png | gnuplot
+eog trace.log.*.png
+- get ts, average-cpuload, current-cpuload, time and plot
+
+GST_DEBUG="GST_TRACER:7" GST_TRACER_PLUGINS=latency gst-launch-1.0 audiotestsrc num-buffers=10 ! audioconvert ! volume volume=0.7 ! autoaudiosink
+- print processing latencies
+
+Performance
+===========
+run ./tests/benchmarks/tracing.sh <tracer(s)> <media>
+
+egrep -c "(proc|thread)-rusage" trace.log 
+658618
+grep -c "gst_tracer_log_trace" trace.log
+823351
+
+- we can optimize most of it by using quarks in structures or eventually avoid structures totally
 
diff --git a/docs/design/part-synchronisation.txt b/docs/design/part-synchronisation.txt
index 7694c1b..cac9f07 100644
--- a/docs/design/part-synchronisation.txt
+++ b/docs/design/part-synchronisation.txt
@@ -87,7 +87,7 @@
              timestamp.
   - S.stop: stop field in the SEGMENT event. This is the highers allowed
             timestamp.
-  - S.rate: rate field of SEGMENT event. This is the desired playback rate.
+  - S.rate: rate field of SEGMENT event. This is the playback rate.
   - S.base: a base time for the time. This is the total elapsed running_time of any
             previous segments.
   - S.offset: an offset to apply to S.start or S.stop. This is the amount that
@@ -101,8 +101,13 @@
 
   if (S.rate > 0.0)
     B.running_time = (B.timestamp - (S.start + S.offset)) / ABS (S.rate) + S.base
+    =>
+    B.timestamp = (B.running_time - S.base) * ABS (S.rate) + S.start + S.offset
   else
     B.running_time = ((S.stop - S.offset) - B.timestamp) / ABS (S.rate) + S.base
+    =>
+    B.timestamp = S.stop - S.offset - ((B.running_time - S.base) * ABS (S.rate))
+
 
 We write B.running_time as the running_time obtained from the SEGMENT event
 and the buffers of that segment.
@@ -185,15 +190,19 @@
 Additional fields in the SEGMENT are used:
 
   - S.time: time field in the SEGMENT event. This the stream-time of S.start
-  - S.applied_rate: The rate already applied to the stream.
+  - S.applied_rate: The rate already applied to the segment.
 
 Stream time is calculated using the buffer times and the preceding SEGMENT
 event as follows:
 
     stream_time = (B.timestamp - S.start) * ABS (S.applied_rate) + S.time
- 
+    => B.timestamp = (stream_time - S.time) / ABS(S.applied_rate) + S.start
+
 For negative rates, B.timestamp will go backwards from S.stop to S.start,
-making the stream time go backwards.
+making the stream time go backwards:
+
+    stream_time = (S.stop - B.timestamp) * ABS(S.applied_rate) + S.time
+    => B.timestamp = S.stop - (stream_time - S.time) / ABS(S.applied_rate)
 
 In the PLAYING state, it is also possible to use the pipeline clock to derive
 the current stream_time.
diff --git a/docs/faq/Makefile.in b/docs/faq/Makefile.in
index fe8f1be..79dfed5 100644
--- a/docs/faq/Makefile.in
+++ b/docs/faq/Makefile.in
@@ -327,6 +327,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/gst/Makefile.in b/docs/gst/Makefile.in
index 3f0df57..3dd3fc8 100644
--- a/docs/gst/Makefile.in
+++ b/docs/gst/Makefile.in
@@ -296,6 +296,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt
index 94b1356..6ba3254 100644
--- a/docs/gst/gstreamer-sections.txt
+++ b/docs/gst/gstreamer-sections.txt
@@ -175,6 +175,7 @@
 
 GST_BUFFER_PTS
 GST_BUFFER_DTS
+GST_BUFFER_DTS_OR_PTS
 GST_BUFFER_DURATION
 GST_BUFFER_OFFSET
 GST_BUFFER_OFFSET_END
@@ -702,8 +703,6 @@
 GST_DISABLE_PLUGIN
 <SUBSECTION Private>
 GST_HAVE_GLIB_2_8
-GST_PTR_FORMAT
-GST_SEGMENT_FORMAT
 GST_EXPORT
 GST_PLUGIN_EXPORT
 GST_PADDING
@@ -869,6 +868,9 @@
 gst_element_set_bus
 gst_element_get_bus
 gst_element_set_context
+gst_element_get_context
+gst_element_get_context_unlocked
+gst_element_get_contexts
 gst_element_get_factory
 gst_element_set_name
 gst_element_get_name
@@ -1351,6 +1353,8 @@
 GST_TIME_ARGS
 GST_STIME_FORMAT
 GST_STIME_ARGS
+GST_PTR_FORMAT
+GST_SEGMENT_FORMAT
 gst_debug_bin_to_dot_data
 gst_debug_bin_to_dot_file
 gst_debug_bin_to_dot_file_with_ts
@@ -2565,9 +2569,14 @@
 gst_segment_copy
 gst_segment_free
 gst_segment_do_seek
+gst_segment_position_from_stream_time
+gst_segment_position_from_stream_time_full
 gst_segment_to_running_time
 gst_segment_to_running_time_full
 gst_segment_to_stream_time
+gst_segment_to_stream_time_full
+gst_segment_position_from_running_time
+gst_segment_position_from_running_time_full
 gst_segment_to_position
 gst_segment_set_running_time
 gst_segment_copy_into
diff --git a/docs/gst/html/GstBuffer.html b/docs/gst/html/GstBuffer.html
index 191c275..749005b 100644
--- a/docs/gst/html/GstBuffer.html
+++ b/docs/gst/html/GstBuffer.html
@@ -79,6 +79,12 @@
 <tr>
 <td class="define_keyword">#define</td>
 <td class="function_name">
+<a class="link" href="GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS" title="GST_BUFFER_DTS_OR_PTS()">GST_BUFFER_DTS_OR_PTS</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
 <a class="link" href="GstBuffer.html#GST-BUFFER-DURATION:CAPS" title="GST_BUFFER_DURATION()">GST_BUFFER_DURATION</a><span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -871,13 +877,36 @@
 </div>
 <hr>
 <div class="refsect2">
+<a name="GST-BUFFER-DTS-OR-PTS:CAPS"></a><h3>GST_BUFFER_DTS_OR_PTS()</h3>
+<pre class="programlisting">#define GST_BUFFER_DTS_OR_PTS(buf)              (GST_BUFFER_DTS_IS_VALID(buf) ? GST_BUFFER_DTS(buf) : GST_BUFFER_PTS (buf))
+</pre>
+<p>Returns the buffer decoding timestamp (dts) if valid, else the buffer
+presentation time (pts)</p>
+<div class="refsect3">
+<a name="id-1.3.7.8.8.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>.:</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GST-BUFFER-DURATION:CAPS"></a><h3>GST_BUFFER_DURATION()</h3>
 <pre class="programlisting">#define GST_BUFFER_DURATION(buf)                (GST_BUFFER_CAST(buf)-&gt;duration)
 </pre>
 <p>The duration in nanoseconds (as a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>) of the data in the buffer.
 Value will be <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><code class="literal">GST_CLOCK_TIME_NONE</code></a> if the duration is unknown.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.8.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.9.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -899,7 +928,7 @@
 </pre>
 <p>The offset in the source file of the beginning of this buffer.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.9.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.10.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -921,7 +950,7 @@
 </pre>
 <p>The offset in the source file of the end of this buffer.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.10.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.11.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -950,7 +979,7 @@
 </pre>
 <p>Tests if the duration is known.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.12.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.13.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -972,7 +1001,7 @@
 </pre>
 <p>Tests if the pts is known.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.13.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.14.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -994,7 +1023,7 @@
 </pre>
 <p>Tests if the dts is known.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.14.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.15.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1016,7 +1045,7 @@
 </pre>
 <p>Tests if the start offset is known.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.15.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.16.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1038,7 +1067,7 @@
 </pre>
 <p>Tests if the end offset is known.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.16.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.17.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1060,7 +1089,7 @@
 </pre>
 <p>Tests if the buffer marks a discontinuity in the stream.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.17.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.18.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1083,7 +1112,7 @@
 <p>Creates a newly allocated buffer without any data.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.18.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.19.6"></a><h4>Returns</h4>
 <p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -1105,7 +1134,7 @@
  == 0, the buffer will not have memory associated with it.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.19.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.20.8"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1133,7 +1162,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.19.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.20.9"></a><h4>Returns</h4>
 <p> a new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>, or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
 the memory couldn't be allocated. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></p>
@@ -1150,7 +1179,7 @@
 with g_free and will be marked writable.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.20.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.21.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1173,7 +1202,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.20.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.21.7"></a><h4>Returns</h4>
 <p> a new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -1203,7 +1232,7 @@
  contains
 <a class="link" href="GstMemory.html#GST-MEMORY-FLAG-ZERO-PREFIXED:CAPS"><span class="type">GST_MEMORY_FLAG_ZERO_PREFIXED</span></a> and <a class="link" href="GstMemory.html#GST-MEMORY-FLAG-ZERO-PADDED:CAPS"><span class="type">GST_MEMORY_FLAG_ZERO_PADDED</span></a> respectively.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.21.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.22.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1253,7 +1282,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.21.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.22.8"></a><h4>Returns</h4>
 <p> a new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -1271,7 +1300,7 @@
 GstBuffer instances can potentially increase the number
 of memcpy operations in a pipeline.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.22.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.23.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1286,7 +1315,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.22.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.23.7"></a><h4>Returns</h4>
 <p> <em class="parameter"><code>buf</code></em>
 . </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -1300,7 +1329,7 @@
 <p>Decreases the refcount of the buffer. If the refcount reaches 0, the buffer
 with the associated metadata and memory will be freed.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.23.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.24.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1336,7 +1365,7 @@
  can be used to resize the
 buffer memory blocks with <a class="link" href="GstBuffer.html#gst-buffer-resize" title="gst_buffer_resize ()"><code class="function">gst_buffer_resize()</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.24.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.25.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1363,7 +1392,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.24.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.25.7"></a><h4>Returns</h4>
 <p> total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
 .</p>
 </div>
@@ -1376,7 +1405,7 @@
 <p>Get the total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.25.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.26.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1391,7 +1420,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.25.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.26.6"></a><h4>Returns</h4>
 <p> total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
 .</p>
 </div>
@@ -1425,7 +1454,7 @@
  can be used to resize the buffer memory blocks with
 <a class="link" href="GstBuffer.html#gst-buffer-resize-range" title="gst_buffer_resize_range ()"><code class="function">gst_buffer_resize_range()</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.26.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.27.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1462,7 +1491,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.26.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.27.7"></a><h4>Returns</h4>
 <p> total size of <em class="parameter"><code>length</code></em>
 memory blocks starting at <em class="parameter"><code>idx</code></em>
 in <em class="parameter"><code>buffer</code></em>
@@ -1484,7 +1513,7 @@
 <em class="parameter"><code>buffer</code></em>
 </p>
 <div class="refsect3">
-<a name="id-1.3.7.8.27.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.28.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1521,7 +1550,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.27.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.28.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if resizing succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
 </div>
 </div>
@@ -1535,7 +1564,7 @@
 <p>Set the offset and total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.28.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.29.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1571,7 +1600,7 @@
 <p>Set the total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.29.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.30.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1603,7 +1632,7 @@
 <p>When more memory blocks are added, existing memory blocks will be merged
 together to make room for the new block.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.30.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.31.6"></a><h4>Returns</h4>
 <p> the maximum amount of memory blocks that a buffer can hold.</p>
 </div>
 <p class="since">Since: <a class="link" href="ix06.html#api-index-1.2">1.2</a></p>
@@ -1622,7 +1651,7 @@
 any call that modifies the memory in <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.31.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.32.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1644,7 +1673,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.31.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.32.6"></a><h4>Returns</h4>
 <p> the <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> at <em class="parameter"><code>idx</code></em>
 . </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
@@ -1658,7 +1687,7 @@
 <p>Get the amount of memory blocks that this buffer has. This amount is never
 larger than what <a class="link" href="GstBuffer.html#gst-buffer-get-max-memory" title="gst_buffer_get_max_memory ()"><code class="function">gst_buffer_get_max_memory()</code></a> returns.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.32.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.33.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1673,7 +1702,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.32.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.33.6"></a><h4>Returns</h4>
 <p> the amount of memory block in this buffer. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -1695,7 +1724,7 @@
 added, existing memory blocks will automatically be merged to make room for
 the new memory.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.33.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.34.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1743,7 +1772,7 @@
 <p><em class="parameter"><code>buffer</code></em>
  should be writable.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.34.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.35.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1791,7 +1820,7 @@
  is -1, all memory starting from <em class="parameter"><code>idx</code></em>
  is merged.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.35.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.36.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1818,7 +1847,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.35.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.36.7"></a><h4>Returns</h4>
 <p> a <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> that contains the merged data of <em class="parameter"><code>length</code></em>
 blocks starting at <em class="parameter"><code>idx</code></em>
 . Use <a class="link" href="GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a> after usage. </p>
@@ -1840,7 +1869,7 @@
  can be -1, in which case all memory starting from <em class="parameter"><code>idx</code></em>
  is removed.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.36.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.37.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1898,7 +1927,7 @@
  can be -1 to get all the memory blocks after <em class="parameter"><code>idx</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.37.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.38.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1940,7 +1969,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.37.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.38.8"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when <em class="parameter"><code>size</code></em>
 bytes starting from <em class="parameter"><code>offset</code></em>
 could be found in
@@ -1965,7 +1994,7 @@
 <p>This function is identical to <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> with an index of 0.
 See <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> for more details.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.38.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.39.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2001,7 +2030,7 @@
 <p>This function is identical to <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> with an index of -1.
 See <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> for more details.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.39.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.40.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2035,7 +2064,7 @@
  with <em class="parameter"><code>mem</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.40.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.41.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2072,7 +2101,7 @@
  with <em class="parameter"><code>mem</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.41.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.42.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2104,7 +2133,7 @@
  in <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.42.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.43.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2126,7 +2155,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.42.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.43.6"></a><h4>Returns</h4>
 <p> a <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> that contains the data of the
 memory block at <em class="parameter"><code>idx</code></em>
 . Use <a class="link" href="GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a> after usage. </p>
@@ -2142,7 +2171,7 @@
 . The memory blocks will be merged
 into one large <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.43.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.44.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2157,7 +2186,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.43.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.44.6"></a><h4>Returns</h4>
 <p> a <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> that contains the merged memory.
 Use <a class="link" href="GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a> after usage. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2173,7 +2202,7 @@
  at index <em class="parameter"><code>i</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.44.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.45.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2203,7 +2232,7 @@
 <p>Remove all the memory blocks in <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.45.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.46.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2229,7 +2258,7 @@
  is writable, use
 <a class="link" href="GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()"><code class="function">gst_buffer_is_writable()</code></a> to check that if needed.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.46.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.47.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2244,7 +2273,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.46.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.47.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if all memory blocks in <em class="parameter"><code>buffer</code></em>
 are writable</p>
 </div>
@@ -2268,7 +2297,7 @@
  is writable, use
 <a class="link" href="GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()"><code class="function">gst_buffer_is_writable()</code></a> to check that if needed.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.47.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.48.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2295,7 +2324,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.47.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.48.8"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the memory range is writable</p>
 </div>
 <p class="since">Since: <a class="link" href="ix04.html#api-index-1.4">1.4</a></p>
@@ -2325,7 +2354,7 @@
  should be unmapped with <a class="link" href="GstBuffer.html#gst-buffer-unmap" title="gst_buffer_unmap ()"><code class="function">gst_buffer_unmap()</code></a> after
 usage.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.48.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.49.8"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2352,7 +2381,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.48.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.49.9"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the map succeeded and <em class="parameter"><code>info</code></em>
 contains valid data.</p>
 </div>
@@ -2388,7 +2417,7 @@
 <p>The memory in <em class="parameter"><code>info</code></em>
  should be unmapped with <a class="link" href="GstBuffer.html#gst-buffer-unmap" title="gst_buffer_unmap ()"><code class="function">gst_buffer_unmap()</code></a> after usage.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.49.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.50.8"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2425,7 +2454,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.49.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.50.9"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the map succeeded and <em class="parameter"><code>info</code></em>
 contains valid
 data.</p>
@@ -2439,7 +2468,7 @@
                   <em class="parameter"><code><a class="link" href="GstMemory.html#GstMapInfo" title="GstMapInfo"><span class="type">GstMapInfo</span></a> *info</code></em>);</pre>
 <p>Release the memory previously mapped with <a class="link" href="GstBuffer.html#gst-buffer-map" title="gst_buffer_map ()"><code class="function">gst_buffer_map()</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.50.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.51.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2475,7 +2504,7 @@
  with the memory in <em class="parameter"><code>mem</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.51.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.52.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2508,7 +2537,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.51.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.52.6"></a><h4>Returns</h4>
 <p> 0 if the memory is equal.</p>
 </div>
 </div>
@@ -2526,7 +2555,7 @@
  to <em class="parameter"><code>dest</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.52.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.53.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2558,7 +2587,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.52.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.53.6"></a><h4>Returns</h4>
 <p> The amount of bytes extracted. This value can be lower than <em class="parameter"><code>size</code></em>
 when <em class="parameter"><code>buffer</code></em>
 did not contain enough data.</p>
@@ -2579,7 +2608,7 @@
 newly-allocated memory. <em class="parameter"><code>dest</code></em>
  must be freed using <a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.53.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.54.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2633,7 +2662,7 @@
  at <em class="parameter"><code>offset</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.54.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.55.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2665,7 +2694,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.54.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.55.6"></a><h4>Returns</h4>
 <p> The amount of bytes copied. This value can be lower than <em class="parameter"><code>size</code></em>
 when <em class="parameter"><code>buffer</code></em>
 did not contain enough data.</p>
@@ -2685,7 +2714,7 @@
  starting from <em class="parameter"><code>offset</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.55.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.56.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2718,7 +2747,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.55.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.56.6"></a><h4>Returns</h4>
 <p> The amount of bytes filled. This value can be lower than <em class="parameter"><code>size</code></em>
 when <em class="parameter"><code>buffer</code></em>
 did not contain enough data.</p>
@@ -2750,7 +2779,7 @@
 Check <a class="link" href="GstBuffer.html#gst-buffer-copy-deep" title="gst_buffer_copy_deep ()"><code class="function">gst_buffer_copy_deep()</code></a> if you want to force the data
 to be copied to newly allocated memory.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.58.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.59.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2765,7 +2794,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.58.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.59.6"></a><h4>Returns</h4>
 <p> a new copy of <em class="parameter"><code>buf</code></em>
 . </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2792,7 +2821,7 @@
 <p><em class="parameter"><code>flags</code></em>
  indicate which fields will be copied.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.59.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.60.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2829,7 +2858,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.59.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.60.8"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the copying succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
 </div>
 </div>
@@ -2857,7 +2886,7 @@
 to <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a> and <a class="link" href="GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS" title="GST_BUFFER_OFFSET_NONE"><span class="type">GST_BUFFER_OFFSET_NONE</span></a>.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.60.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.61.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2891,7 +2920,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.60.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.61.7"></a><h4>Returns</h4>
 <p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the arguments were
 invalid. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2905,7 +2934,7 @@
 <p>Create a copy of the given buffer. This will make a newly allocated
 copy of the data the source buffer contains.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.61.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.62.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2920,7 +2949,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.61.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.62.6"></a><h4>Returns</h4>
 <p> a new copy of <em class="parameter"><code>buf</code></em>
 . </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2936,7 +2965,7 @@
 It is only safe to change buffer metadata when the current reference is
 writable, i.e. nobody can see the modifications you will make.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.62.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.63.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2956,11 +2985,25 @@
 <a name="gst-buffer-make-writable"></a><h3>gst_buffer_make_writable()</h3>
 <pre class="programlisting">#define         gst_buffer_make_writable(buf)   GST_BUFFER_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (buf)))
 </pre>
-<p>Makes a writable buffer from the given buffer. If the source buffer is
-already writable, this will simply return the same buffer. A copy will
-otherwise be made using <a class="link" href="GstBuffer.html#gst-buffer-copy" title="gst_buffer_copy ()"><code class="function">gst_buffer_copy()</code></a>.</p>
+<p>Returns a writable copy of <em class="parameter"><code>buf</code></em>
+. If the source buffer is
+already writable, this will simply return the same buffer.</p>
+<p>Use this function to ensure that a buffer can be safely modified before
+making changes to it, including changing the metadata such as PTS/DTS.</p>
+<p>If the reference count of the source buffer <em class="parameter"><code>buf</code></em>
+ is exactly one, the caller
+is the sole owner and this function will return the buffer object unchanged.</p>
+<p>If there is more than one reference on the object, a copy will be made using
+<a class="link" href="GstBuffer.html#gst-buffer-copy" title="gst_buffer_copy ()"><code class="function">gst_buffer_copy()</code></a>. The passed-in <em class="parameter"><code>buf</code></em>
+ will be unreffed in that case, and the
+caller will now own a reference to the new returned buffer object. Note
+that this just copies the buffer structure itself, the underlying memory is
+not copied if it can be shared amongst multiple buffers.</p>
+<p>In short, this function unrefs the buf in the argument and refs the buffer
+that it returns. Don't access the argument after calling this function unless
+you have an additional reference to it.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.63.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.64.9"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2975,7 +3018,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.63.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.64.10"></a><h4>Returns</h4>
 <p> a writable buffer which may or may not be the
 same as <em class="parameter"><code>buf</code></em>
 . </p>
@@ -2996,7 +3039,7 @@
  or the <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> pointed to by <em class="parameter"><code>obuf</code></em>
  may be <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.64.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.65.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3021,7 +3064,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.64.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.65.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when <em class="parameter"><code>obuf</code></em>
 was different from <em class="parameter"><code>nbuf</code></em>
 .</p>
@@ -3040,7 +3083,7 @@
  and <em class="parameter"><code>buf2</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.65.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.66.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3062,7 +3105,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.65.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.66.6"></a><h4>Returns</h4>
 <p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> that contains the memory
 of the two source buffers. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -3086,7 +3129,7 @@
 <em class="parameter"><code>buf2</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.66.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.67.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3120,7 +3163,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.66.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.67.6"></a><h4>Returns</h4>
 <p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> that contains the memory
 of the two source buffers. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -3140,7 +3183,7 @@
 given API use <a class="link" href="GstBuffer.html#gst-buffer-iterate-meta" title="gst_buffer_iterate_meta ()"><code class="function">gst_buffer_iterate_meta()</code></a> or <a class="link" href="GstBuffer.html#gst-buffer-foreach-meta" title="gst_buffer_foreach_meta ()"><code class="function">gst_buffer_foreach_meta()</code></a> instead
 and check the meta-&gt;info.api member for the API type.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.67.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.68.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3162,7 +3205,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.67.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.68.6"></a><h4>Returns</h4>
 <p> the metadata for <em class="parameter"><code>api</code></em>
 on
 <em class="parameter"><code>buffer</code></em>
@@ -3182,7 +3225,7 @@
  using the parameters in <em class="parameter"><code>params</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.68.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.69.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3210,7 +3253,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.68.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.69.6"></a><h4>Returns</h4>
 <p> the metadata for the api in <em class="parameter"><code>info</code></em>
 on <em class="parameter"><code>buffer</code></em>
 . </p>
@@ -3227,7 +3270,7 @@
  on <em class="parameter"><code>buffer</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.69.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.70.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3249,7 +3292,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.69.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.70.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the metadata existed and was removed, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if no such
 metadata was on <em class="parameter"><code>buffer</code></em>
 .</p>
@@ -3268,7 +3311,7 @@
 <p><em class="parameter"><code>state</code></em>
  will be updated with an opaque state pointer</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.70.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.71.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3290,7 +3333,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.70.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.71.7"></a><h4>Returns</h4>
 <p> The next <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
 when there are no more items. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></p>
@@ -3313,7 +3356,7 @@
 <p>When <em class="parameter"><code>meta</code></em>
  is set to <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the item will be removed from the buffer.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.71.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.72.8"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3340,7 +3383,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.71.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.72.9"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when <a class="link" href="GstBuffer.html#gst-buffer-foreach-meta" title="gst_buffer_foreach_meta ()"><code class="function">gst_buffer_foreach_meta()</code></a> should stop</p>
 </div>
 </div>
@@ -3361,7 +3404,7 @@
  define if this function returns or if the remaining metadata items
 in the buffer should be skipped.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.72.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.73.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3389,7 +3432,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.72.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.73.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when <em class="parameter"><code>func</code></em>
 returned <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> for one of the metadata.</p>
 </div>
@@ -3405,7 +3448,7 @@
 <em class="parameter"><code>ref</code></em>
  until the buffer is freed.</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.73.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.74.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3427,7 +3470,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.7.8.73.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.74.6"></a><h4>Returns</h4>
 <p> The <a class="link" href="GstBuffer.html#GstParentBufferMeta" title="struct GstParentBufferMeta"><span class="type">GstParentBufferMeta</span></a> that was added to the buffer. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -3440,7 +3483,7 @@
 <p>Find and return a <a class="link" href="GstBuffer.html#GstParentBufferMeta" title="struct GstParentBufferMeta"><span class="type">GstParentBufferMeta</span></a> if one exists on the
 buffer</p>
 <div class="refsect3">
-<a name="id-1.3.7.8.74.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.75.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
diff --git a/docs/gst/html/GstCaps.html b/docs/gst/html/GstCaps.html
index 7ae3d89..488f111 100644
--- a/docs/gst/html/GstCaps.html
+++ b/docs/gst/html/GstCaps.html
@@ -2508,7 +2508,10 @@
 <em class="parameter"><code>GstStructures</code></em>
 .</p>
 <p>This function takes ownership of <em class="parameter"><code>caps</code></em>
-.</p>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an additional
+reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
 <div class="refsect3">
 <a name="id-1.3.11.8.55.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
@@ -2540,10 +2543,15 @@
 same set of formats, but in a simpler form.  Component structures that are
 identical are merged.  Component structures that have values that can be
 merged are also merged.</p>
+<p>This function takes ownership of <em class="parameter"><code>caps</code></em>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it if necessary, so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an
+additional reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
 <p>This method does not preserve the original order of <em class="parameter"><code>caps</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.11.8.56.6"></a><h4>Parameters</h4>
+<a name="id-1.3.11.8.56.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2558,7 +2566,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.11.8.56.7"></a><h4>Returns</h4>
+<a name="id-1.3.11.8.56.8"></a><h4>Returns</h4>
 <p> The simplified caps.</p>
 </div>
 </div>
@@ -2811,8 +2819,13 @@
 <p>Discard all but the first structure from <em class="parameter"><code>caps</code></em>
 . Useful when
 fixating.</p>
+<p>This function takes ownership of <em class="parameter"><code>caps</code></em>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it if necessary, so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an
+additional reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.11.8.63.5"></a><h4>Parameters</h4>
+<a name="id-1.3.11.8.63.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2827,7 +2840,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.11.8.63.6"></a><h4>Returns</h4>
+<a name="id-1.3.11.8.63.7"></a><h4>Returns</h4>
 <p> truncated caps. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -2841,8 +2854,13 @@
  into a representation with only fixed
 values. First the caps will be truncated and then the first structure will be
 fixated with <a class="link" href="GstStructure.html#gst-structure-fixate" title="gst_structure_fixate ()"><code class="function">gst_structure_fixate()</code></a>.</p>
+<p>This function takes ownership of <em class="parameter"><code>caps</code></em>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an additional
+reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.11.8.64.5"></a><h4>Parameters</h4>
+<a name="id-1.3.11.8.64.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2857,7 +2875,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.11.8.64.6"></a><h4>Returns</h4>
+<a name="id-1.3.11.8.64.7"></a><h4>Returns</h4>
 <p> the fixated caps. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
diff --git a/docs/gst/html/GstContext.html b/docs/gst/html/GstContext.html
index d1bdbdb..28937b5 100644
--- a/docs/gst/html/GstContext.html
+++ b/docs/gst/html/GstContext.html
@@ -180,6 +180,11 @@
 <p>Bins will catch GST_MESSAGE_NEED_CONTEXT messages and will set any previously
 known context on the element that asks for it if possible. Otherwise the
 application should provide one if it can.</p>
+<p><a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a>s can be persistent.
+A persistent <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a> is kept in elements when they reach
+<a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a>, non-persistent ones will be removed.
+Also, a non-persistent context won't override a previous persistent
+context set to an element.</p>
 </div>
 <div class="refsect1">
 <a name="GstContext.functions_details"></a><h2>Functions</h2>
@@ -446,8 +451,8 @@
 <div class="refsect3">
 <a name="id-1.3.17.8.10.6"></a><h4>Returns</h4>
 <p> The structure of the context. The structure is still
-owned by the event, which means that you should not free it and
-that the pointer becomes invalid when you free the event.
+owned by the context, which means that you should not free it and
+that the pointer becomes invalid when you free the context.
 This function checks if <em class="parameter"><code>context</code></em>
 is writable.</p>
 </div>
diff --git a/docs/gst/html/GstControlSource.html b/docs/gst/html/GstControlSource.html
index 0b21e32..78a991f 100644
--- a/docs/gst/html/GstControlSource.html
+++ b/docs/gst/html/GstControlSource.html
@@ -252,8 +252,8 @@
 </tr>
 <tr>
 <td class="parameter_name"><p>value</p></td>
-<td class="parameter_description"><p>the value</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p> the value. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
diff --git a/docs/gst/html/GstElement.html b/docs/gst/html/GstElement.html
index e7e28db..fbf5355 100644
--- a/docs/gst/html/GstElement.html
+++ b/docs/gst/html/GstElement.html
@@ -465,6 +465,30 @@
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GstElement.html#gst-element-get-context" title="gst_element_get_context ()">gst_element_get_context</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GstElement.html#gst-element-get-context-unlocked" title="gst_element_get_context_unlocked ()">gst_element_get_context_unlocked</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GstElement.html#gst-element-get-contexts" title="gst_element_get_contexts ()">gst_element_get_contexts</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> *
 </td>
 <td class="function_name">
@@ -2886,12 +2910,116 @@
 </div>
 <hr>
 <div class="refsect2">
+<a name="gst-element-get-context"></a><h3>gst_element_get_context ()</h3>
+<pre class="programlisting"><a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+gst_element_get_context (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+                         <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *context_type</code></em>);</pre>
+<p>Gets the context with <em class="parameter"><code>context_type</code></em>
+ set on the element or NULL.</p>
+<p>MT safe.</p>
+<div class="refsect3">
+<a name="id-1.3.21.10.60.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>element</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the context of.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>context_type</p></td>
+<td class="parameter_description"><p>a name of a context to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.21.10.60.7"></a><h4>Returns</h4>
+<p> A <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a> or NULL. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-context-unlocked"></a><h3>gst_element_get_context_unlocked ()</h3>
+<pre class="programlisting"><a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+gst_element_get_context_unlocked (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+                                  <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *context_type</code></em>);</pre>
+<p>Gets the context with <em class="parameter"><code>context_type</code></em>
+ set on the element or NULL.</p>
+<div class="refsect3">
+<a name="id-1.3.21.10.61.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>element</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the context of.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>context_type</p></td>
+<td class="parameter_description"><p>a name of a context to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.21.10.61.6"></a><h4>Returns</h4>
+<p> A <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a> or NULL. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-contexts"></a><h3>gst_element_get_contexts ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+gst_element_get_contexts (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>Gets the contexts set on the element.</p>
+<p>MT safe.</p>
+<div class="refsect3">
+<a name="id-1.3.21.10.62.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>element</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to set the context of.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.21.10.62.7"></a><h4>Returns</h4>
+<p> List of <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a>. </p>
+<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.Context][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gst-element-get-factory"></a><h3>gst_element_get_factory ()</h3>
 <pre class="programlisting"><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> *
 gst_element_get_factory (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
 <p>Retrieves the factory that was used to create this element.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.60.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.63.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2906,7 +3034,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.60.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.63.6"></a><h4>Returns</h4>
 <p> the <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> used for creating this
 element. no refcounting is needed. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
@@ -2919,7 +3047,7 @@
 </pre>
 <p>Sets the name of the element, getting rid of the old name if there was one.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.61.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.64.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2952,7 +3080,7 @@
 For a nameless element, this returns <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, which you can safely <a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
 as well.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.62.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.65.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2968,7 +3096,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.62.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.65.6"></a><h4>Returns</h4>
 <p> the name of <em class="parameter"><code>elem</code></em>
 . <a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
 after usage. MT safe. </p>
@@ -2982,7 +3110,7 @@
 </pre>
 <p>Sets the parent of an element.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.63.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.66.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3011,7 +3139,7 @@
 </pre>
 <p>Get the parent of an element.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.64.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.67.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3026,7 +3154,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.64.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.67.6"></a><h4>Returns</h4>
 <p> the parent of an element. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -3041,7 +3169,7 @@
 refcount on the clock. Any previously set clock on the object
 is unreffed.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.65.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.68.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3063,7 +3191,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.65.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.68.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the element accepted the clock. An element can refuse a
 clock when it, for example, is not able to slave its internal clock to the
 <em class="parameter"><code>clock</code></em>
@@ -3081,7 +3209,7 @@
 <p>Elements in a pipeline will only have their clock set when the
 pipeline is in the PLAYING state.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.66.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.69.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3096,7 +3224,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.66.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.69.7"></a><h4>Returns</h4>
 <p> the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> of the element. unref after usage.</p>
 <p>MT safe. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -3111,7 +3239,7 @@
 <div class="note">An element is only required to provide a clock in the PAUSED
 state. Some elements can provide a clock in other states.</div>
 <div class="refsect3">
-<a name="id-1.3.21.10.67.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.70.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3126,7 +3254,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.67.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.70.7"></a><h4>Returns</h4>
 <p> the GstClock provided by the
 element or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if no clock could be provided.  Unref after usage.</p>
 <p>MT safe. </p>
@@ -3151,7 +3279,7 @@
 <p>State changes to <a class="link" href="GstElement.html#GST-STATE-READY:CAPS"><code class="literal">GST_STATE_READY</code></a> or <a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> never return
 <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><span class="type">GST_STATE_CHANGE_ASYNC</span></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.68.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.71.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3173,7 +3301,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.68.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.71.8"></a><h4>Returns</h4>
 <p> Result of the state change using <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a>.</p>
 <p>MT safe.</p>
 </div>
@@ -3204,7 +3332,7 @@
 an element is not producing data to complete the preroll. When setting the
 element to playing, the preroll will complete and playback will start.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.69.8"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.72.8"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3239,7 +3367,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.69.9"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.72.9"></a><h4>Returns</h4>
 <p> <a class="link" href="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></a> if the element has no more pending state
 and the last state change succeeded, <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a> if the
 element is still performing a state change or
@@ -3257,7 +3385,7 @@
 this element anymore.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.70.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.73.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3279,7 +3407,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.70.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.73.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the state was changed, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if bad parameters were given
 or the elements state-locking needed no change.</p>
 </div>
@@ -3296,7 +3424,7 @@
 state before changing the state from <a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><span class="type">GST_STATE_NULL</span></a>.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.71.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.74.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3311,7 +3439,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.71.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.74.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the element's state is locked.</p>
 </div>
 </div>
@@ -3326,7 +3454,7 @@
 <p>This function should be called with the STATE_LOCK held.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.72.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.75.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3357,7 +3485,7 @@
 <p>This method is used internally and should normally not be called by plugins
 or applications.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.73.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.76.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3379,7 +3507,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.73.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.76.8"></a><h4>Returns</h4>
 <p> The result of the commit state change.</p>
 <p>MT safe.</p>
 </div>
@@ -3403,7 +3531,7 @@
 <p>This function is used internally and should normally not be called from
 plugins or applications.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.74.8"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.77.8"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3425,7 +3553,7 @@
 gst_element_state_get_name (<em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</code></em>);</pre>
 <p>Gets a string representing the given state.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.75.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.78.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3440,7 +3568,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.75.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.78.6"></a><h4>Returns</h4>
 <p> a string with the name of the state. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -3453,7 +3581,7 @@
                                (<em class="parameter"><code><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> state_ret</code></em>);</pre>
 <p>Gets a string representing the given state change result.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.76.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.79.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3468,7 +3596,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.76.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.79.6"></a><h4>Returns</h4>
 <p> a string with the name of the state
 result. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
@@ -3482,7 +3610,7 @@
 <p>Tries to change the state of the element to the same as its parent.
 If this function returns <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, the state of element is undefined.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.77.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.80.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3497,7 +3625,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.77.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.80.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the element's state could be synced to the parent's state.</p>
 <p>MT safe.</p>
 </div>
@@ -3514,7 +3642,7 @@
 <p>This function must be called with STATE_LOCK held and is mainly used
 internally.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.78.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.81.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3536,7 +3664,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.78.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.81.7"></a><h4>Returns</h4>
 <p> the <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> of the state transition.</p>
 </div>
 </div>
@@ -3559,7 +3687,7 @@
 <a class="link" href="GstMessage.html#GST-MESSAGE-INFO:CAPS"><span class="type">GST_MESSAGE_INFO</span></a>.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.79.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.82.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3630,7 +3758,7 @@
 message; if you want to access the message after this call, you should add an
 additional reference before calling.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.80.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.83.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3652,7 +3780,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.80.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.83.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the message was successfully posted. The function returns
 <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if the element did not have a bus.</p>
 <p>MT safe.</p>
@@ -3670,7 +3798,7 @@
 random linked sinkpad of this element.</p>
 <p>Please note that some queries might need a running pipeline to work.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.81.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.84.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3692,7 +3820,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.81.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.84.8"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
 <p>MT safe.</p>
 </div>
@@ -3711,7 +3839,7 @@
  to <em class="parameter"><code>dest_format</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.82.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.85.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3748,7 +3876,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.82.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.85.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
 </div>
 </div>
@@ -3768,7 +3896,7 @@
 <p>If one repeatedly calls this function one can also create a query and reuse
 it in <a class="link" href="GstElement.html#gst-element-query" title="gst_element_query ()"><code class="function">gst_element_query()</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.83.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.86.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3796,7 +3924,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.83.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.86.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
 </div>
 </div>
@@ -3815,7 +3943,7 @@
 message on the pipeline bus, in which case you should re-query the duration
 using this function.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.84.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.87.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3842,7 +3970,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.84.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.87.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
 </div>
 </div>
@@ -3859,7 +3987,7 @@
 <a class="link" href="GstEvent.html#gst-event-ref" title="gst_event_ref ()"><code class="function">gst_event_ref()</code></a> it if you want to reuse the event after this call.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.85.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.88.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3881,7 +4009,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.85.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.88.8"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the event was handled. Events that trigger a preroll (such
 as flushing seeks and steps) will emit <a class="link" href="GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS"><code class="literal">GST_MESSAGE_ASYNC_DONE</code></a>.</p>
 </div>
@@ -3907,7 +4035,7 @@
 PAUSED. If the element supports seek in READY, it will always return <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when
 it receives the event in the READY state.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.86.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.89.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3943,7 +4071,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.86.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.89.8"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the seek operation succeeded. Flushing seeks will trigger a
 preroll, which will emit <a class="link" href="GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS"><code class="literal">GST_MESSAGE_ASYNC_DONE</code></a>.</p>
 </div>
@@ -3965,7 +4093,7 @@
 <a class="link" href="GstElement.html#gst-element-send-event" title="gst_element_send_event ()"><code class="function">gst_element_send_event()</code></a>.</p>
 <p>MT safe.</p>
 <div class="refsect3">
-<a name="id-1.3.21.10.87.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.90.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -4017,7 +4145,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.21.10.87.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.90.7"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the event was handled. Flushing seeks will trigger a
 preroll, which will emit <a class="link" href="GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS"><code class="literal">GST_MESSAGE_ASYNC_DONE</code></a>.</p>
 </div>
@@ -4055,6 +4183,9 @@
   guint16               numsinkpads;
   GList                *sinkpads;
   guint32               pads_cookie;
+
+  /* with object LOCK */
+  GList                *contexts;
 };
 </pre>
 <p>GStreamer element abstract base class.</p>
@@ -4170,6 +4301,11 @@
 <td class="struct_member_description"><p>updated whenever the a pad is added or removed</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
+<tr>
+<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *<em class="structfield"><code><a name="GstElement-struct.contexts"></a>contexts</code></em>;</p></td>
+<td> </td>
+<td> </td>
+</tr>
 </tbody>
 </table></div>
 </div>
diff --git a/docs/gst/html/GstMemory.html b/docs/gst/html/GstMemory.html
index 575cfbd..1f66ffd 100644
--- a/docs/gst/html/GstMemory.html
+++ b/docs/gst/html/GstMemory.html
@@ -1474,7 +1474,7 @@
 <tr>
 <td class="enum_member_name"><p><a name="GST-MEMORY-FLAG-PHYSICALLY-CONTIGUOUS:CAPS"></a>GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS</p></td>
 <td class="enum_member_description">
-<p>the memory is physically contiguous. (Since 2.2)</p>
+<p>the memory is physically contiguous. (Since 1.2)</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
diff --git a/docs/gst/html/GstPad.html b/docs/gst/html/GstPad.html
index a6d2b71..1895a76 100644
--- a/docs/gst/html/GstPad.html
+++ b/docs/gst/html/GstPad.html
@@ -2563,8 +2563,14 @@
 <p>Be notified of different states of pads. The provided callback is called for
 every state that matches <em class="parameter"><code>mask</code></em>
 .</p>
+<p>Probes are called in groups: First GST_PAD_PROBE_TYPE_BLOCK probes are
+called, then others, then finally GST_PAD_PROBE_TYPE_IDLE. The only
+exception here are GST_PAD_PROBE_TYPE_IDLE probes that are called
+immediately if the pad is already idle while calling <a class="link" href="GstPad.html#gst-pad-add-probe" title="gst_pad_add_probe ()"><code class="function">gst_pad_add_probe()</code></a>.
+In each of the groups, probes are called in the order in which they were
+added.</p>
 <div class="refsect3">
-<a name="id-1.3.33.10.44.5"></a><h4>Parameters</h4>
+<a name="id-1.3.33.10.44.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2602,7 +2608,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.33.10.44.6"></a><h4>Returns</h4>
+<a name="id-1.3.33.10.44.7"></a><h4>Returns</h4>
 <p> an id or 0 if no probe is pending. The id can be used to remove the
 probe with <a class="link" href="GstPad.html#gst-pad-remove-probe" title="gst_pad_remove_probe ()"><code class="function">gst_pad_remove_probe()</code></a>. When using GST_PAD_PROBE_TYPE_IDLE it can
 happen that the probe can be run immediately and if the probe returns
diff --git a/docs/gst/html/GstPlugin.html b/docs/gst/html/GstPlugin.html
index 2318182..e5741dc 100644
--- a/docs/gst/html/GstPlugin.html
+++ b/docs/gst/html/GstPlugin.html
@@ -1555,6 +1555,15 @@
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS"></a>GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX</p></td>
+<td class="enum_member_description">
+<p>interpret
+        filename argument as filter prefix and check all matching files in
+        the directory. Since 1.8.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
 </tbody>
 </table></div>
 </div>
diff --git a/docs/gst/html/GstPreset.html b/docs/gst/html/GstPreset.html
index 56f211d..7595858 100644
--- a/docs/gst/html/GstPreset.html
+++ b/docs/gst/html/GstPreset.html
@@ -180,7 +180,9 @@
 application specific directory and in the users home directory. When getting
 a list of presets individual presets are read and overlaid in 1) system, 
 2) application and 3) user order. Whenever an earlier entry is newer, the
-later entries will be updated.</p>
+later entries will be updated. Since 1.8 you can also provide extra paths
+where to find presets through the GST_PRESET_PATH environment variable.
+Presets found in those paths will be concidered as "app presets".</p>
 </div>
 <div class="refsect1">
 <a name="GstPreset.functions_details"></a><h2>Functions</h2>
diff --git a/docs/gst/html/GstQuery.html b/docs/gst/html/GstQuery.html
index 5911fce..6d54591 100644
--- a/docs/gst/html/GstQuery.html
+++ b/docs/gst/html/GstQuery.html
@@ -3782,7 +3782,7 @@
 </tr>
 <tr>
 <td class="parameter_name"><p>params</p></td>
-<td class="parameter_description"><p> API specific flags. </p></td>
+<td class="parameter_description"><p> API specific parameters. </p></td>
 <td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 </tbody>
@@ -3836,8 +3836,8 @@
  has metadata <em class="parameter"><code>api</code></em>
  set. When this function returns <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>,
 <em class="parameter"><code>index</code></em>
- will contain the index where the requested API and the flags can be
-found.</p>
+ will contain the index where the requested API and the parameters
+can be found.</p>
 <div class="refsect3">
 <a name="id-1.3.43.8.84.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
diff --git a/docs/gst/html/GstSegment.html b/docs/gst/html/GstSegment.html
index b7446bc..d002138 100644
--- a/docs/gst/html/GstSegment.html
+++ b/docs/gst/html/GstSegment.html
@@ -94,6 +94,22 @@
 <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
 </td>
 <td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time" title="gst_segment_position_from_stream_time ()">gst_segment_position_from_stream_time</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time-full" title="gst_segment_position_from_stream_time_full ()">gst_segment_position_from_stream_time_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+</td>
+<td class="function_name">
 <a class="link" href="GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()">gst_segment_to_running_time</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -115,6 +131,30 @@
 </tr>
 <tr>
 <td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-to-stream-time-full" title="gst_segment_to_stream_time_full ()">gst_segment_to_stream_time_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()">gst_segment_position_from_running_time</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time-full" title="gst_segment_position_from_running_time_full ()">gst_segment_position_from_running_time_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
 </td>
 <td class="function_name">
@@ -535,6 +575,117 @@
 </div>
 <hr>
 <div class="refsect2">
+<a name="gst-segment-position-from-stream-time"></a><h3>gst_segment_position_from_stream_time ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+gst_segment_position_from_stream_time (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+                                       <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+                                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> stream_time</code></em>);</pre>
+<p>Convert <em class="parameter"><code>stream_time</code></em>
+ into a position in the segment so that
+<a class="link" href="GstSegment.html#gst-segment-to-stream-time" title="gst_segment_to_stream_time ()"><code class="function">gst_segment_to_stream_time()</code></a> with that position returns <em class="parameter"><code>stream_time</code></em>
+.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.8.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_time</p></td>
+<td class="parameter_description"><p>the stream_time in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.8.6"></a><h4>Returns</h4>
+<p> the position in the segment for <em class="parameter"><code>stream_time</code></em>
+. This function returns
+-1 when <em class="parameter"><code>stream_time</code></em>
+is -1 or when it is not inside <em class="parameter"><code>segment</code></em>
+.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-position-from-stream-time-full"></a><h3>gst_segment_position_from_stream_time_full ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_segment_position_from_stream_time_full
+                               (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+                                <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> stream_time</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *position</code></em>);</pre>
+<p>Translate <em class="parameter"><code>stream_time</code></em>
+ to the segment position using the currently configured
+segment. Compared to <a class="link" href="GstSegment.html#gst-segment-position-from-stream-time" title="gst_segment_position_from_stream_time ()"><code class="function">gst_segment_position_from_stream_time()</code></a> this function can
+return negative segment position.</p>
+<p>This function is typically used by elements that need to synchronize buffers
+against the clock or each other.</p>
+<p><em class="parameter"><code>stream_time</code></em>
+ can be any value and the result of this function for values outside
+of the segment is extrapolated.</p>
+<p>When 1 is returned, <em class="parameter"><code>stream_time</code></em>
+ resulted in a positive position returned
+in <em class="parameter"><code>position</code></em>
+.</p>
+<p>When this function returns -1, the returned <em class="parameter"><code>position</code></em>
+ should be negated
+to get the real negative segment position.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.9.9"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_time</p></td>
+<td class="parameter_description"><p>the stream-time</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>the resulting position in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.9.10"></a><h4>Returns</h4>
+<p> a 1 or -1 on success, 0 on failure.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="gst-segment-to-running-time"></a><h3>gst_segment_to_running_time ()</h3>
 <pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
 gst_segment_to_running_time (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
@@ -551,7 +702,7 @@
 <p>This function returns -1 if the position is outside of <em class="parameter"><code>segment</code></em>
  start and stop.</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.8.7"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.10.7"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -578,7 +729,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.45.8.8.8"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.10.8"></a><h4>Returns</h4>
 <p> the position as the total running time or -1 when an invalid position
 was given.</p>
 </div>
@@ -608,7 +759,7 @@
  should be negated
 to get the real negative running time.</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.9.9"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.11.9"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -640,7 +791,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.45.8.9.10"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.11.10"></a><h4>Returns</h4>
 <p> a 1 or -1 on success, 0 on failure.</p>
 </div>
 <p class="since">Since: <a class="link" href="ix03.html#api-index-1.6">1.6</a></p>
@@ -666,7 +817,7 @@
 The stream time is always between 0 and the total duration of the
 media stream.</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.10.6"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.12.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -693,24 +844,88 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.45.8.10.7"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.12.7"></a><h4>Returns</h4>
 <p> the position in stream_time or -1 when an invalid position
 was given.</p>
 </div>
+<p class="since">Since: 1.8</p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gst-segment-to-position"></a><h3>gst_segment_to_position ()</h3>
+<a name="gst-segment-to-stream-time-full"></a><h3>gst_segment_to_stream_time_full ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_segment_to_stream_time_full (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+                                 <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+                                 <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> position</code></em>,
+                                 <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *stream_time</code></em>);</pre>
+<p>Translate <em class="parameter"><code>position</code></em>
+ to the total stream time using the currently configured
+segment. Compared to <a class="link" href="GstSegment.html#gst-segment-to-stream-time" title="gst_segment_to_stream_time ()"><code class="function">gst_segment_to_stream_time()</code></a> this function can return
+negative stream-time.</p>
+<p>This function is typically used by elements that need to synchronize buffers
+against the clock or eachother.</p>
+<p><em class="parameter"><code>position</code></em>
+ can be any value and the result of this function for values outside
+of the segment is extrapolated.</p>
+<p>When 1 is returned, <em class="parameter"><code>position</code></em>
+ resulted in a positive stream-time returned
+in <em class="parameter"><code>stream_time</code></em>
+.</p>
+<p>When this function returns -1, the returned <em class="parameter"><code>stream_time</code></em>
+ should be negated
+to get the real negative stream time.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.13.9"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>the position in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_time</p></td>
+<td class="parameter_description"><p>result stream-time</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.13.10"></a><h4>Returns</h4>
+<p> a 1 or -1 on success, 0 on failure.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-position-from-running-time"></a><h3>gst_segment_position_from_running_time ()</h3>
 <pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
-gst_segment_to_position (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
-                         <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
-                         <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>);</pre>
+gst_segment_position_from_running_time
+                               (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+                                <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>);</pre>
 <p>Convert <em class="parameter"><code>running_time</code></em>
  into a position in the segment so that
 <a class="link" href="GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()"><code class="function">gst_segment_to_running_time()</code></a> with that position returns <em class="parameter"><code>running_time</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.11.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.14.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -737,13 +952,126 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.45.8.11.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.14.6"></a><h4>Returns</h4>
 <p> the position in the segment for <em class="parameter"><code>running_time</code></em>
 . This function returns
 -1 when <em class="parameter"><code>running_time</code></em>
 is -1 or when it is not inside <em class="parameter"><code>segment</code></em>
 .</p>
 </div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-position-from-running-time-full"></a><h3>gst_segment_position_from_running_time_full ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_segment_position_from_running_time_full
+                               (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+                                <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *position</code></em>);</pre>
+<p>Translate <em class="parameter"><code>running_time</code></em>
+ to the segment position using the currently configured
+segment. Compared to <a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()"><code class="function">gst_segment_position_from_running_time()</code></a> this function can
+return negative segment position.</p>
+<p>This function is typically used by elements that need to synchronize buffers
+against the clock or each other.</p>
+<p><em class="parameter"><code>running_time</code></em>
+ can be any value and the result of this function for values
+outside of the segment is extrapolated.</p>
+<p>When 1 is returned, <em class="parameter"><code>running_time</code></em>
+ resulted in a positive position returned
+in <em class="parameter"><code>position</code></em>
+.</p>
+<p>When this function returns -1, the returned <em class="parameter"><code>position</code></em>
+ should be negated
+to get the real negative segment position.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.15.9"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>running_time</p></td>
+<td class="parameter_description"><p>the running-time</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>the resulting position in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.15.10"></a><h4>Returns</h4>
+<p> a 1 or -1 on success, 0 on failure.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-to-position"></a><h3>gst_segment_to_position ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+gst_segment_to_position (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+                         <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+                         <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>);</pre>
+<div class="warning"><p><code class="literal">gst_segment_to_position</code> is deprecated and should not be used in newly-written code.</p></div>
+<p>Convert <em class="parameter"><code>running_time</code></em>
+ into a position in the segment so that
+<a class="link" href="GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()"><code class="function">gst_segment_to_running_time()</code></a> with that position returns <em class="parameter"><code>running_time</code></em>
+.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.16.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>running_time</p></td>
+<td class="parameter_description"><p>the running_time in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.16.7"></a><h4>Returns</h4>
+<p> the position in the segment for <em class="parameter"><code>running_time</code></em>
+. This function returns
+-1 when <em class="parameter"><code>running_time</code></em>
+is -1 or when it is not inside <em class="parameter"><code>segment</code></em>
+.</p>
+<p>Deprecated. Use <a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()"><code class="function">gst_segment_position_from_running_time()</code></a> instead.</p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -757,7 +1085,7 @@
 buffer will be one with <em class="parameter"><code>running_time</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.12.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.17.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -784,7 +1112,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.45.8.12.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.17.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the segment could be updated successfully. If <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> is
 returned, <em class="parameter"><code>running_time</code></em>
 is -1 or not in <em class="parameter"><code>segment</code></em>
@@ -801,7 +1129,7 @@
  into <em class="parameter"><code>dest</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.13.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.18.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -835,7 +1163,7 @@
  is applied to all
 future running-time calculations.</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.14.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.19.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -862,7 +1190,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.45.8.14.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.19.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the segment could be updated successfully. If <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> is
 returned, <em class="parameter"><code>offset</code></em>
 is not in <em class="parameter"><code>segment</code></em>
@@ -879,7 +1207,7 @@
 <p>Checks for two segments being equal. Equality here is defined
 as perfect equality, including floating point values.</p>
 <div class="refsect3">
-<a name="id-1.3.45.8.15.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.20.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -901,7 +1229,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.3.45.8.15.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.20.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the segments are equal, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
 </div>
 <p class="since">Since: <a class="link" href="ix03.html#api-index-1.6">1.6</a></p>
@@ -946,7 +1274,7 @@
 </tr>
 <tr>
 <td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="GstSegment-struct.rate"></a>rate</code></em>;</p></td>
-<td class="struct_member_description"><p>the rate of the segment</p></td>
+<td class="struct_member_description"><p>the playback rate of the segment</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
@@ -961,35 +1289,34 @@
 </tr>
 <tr>
 <td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.base"></a>base</code></em>;</p></td>
-<td class="struct_member_description"><p>the base of the segment</p></td>
+<td class="struct_member_description"><p>the running time (plus elapsed time, see offset) of the segment start</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
 <td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.offset"></a>offset</code></em>;</p></td>
-<td class="struct_member_description"><p>the offset to apply to <em class="parameter"><code>start</code></em>
-or <em class="parameter"><code>stop</code></em>
-</p></td>
+<td class="struct_member_description"><p>the amount (in buffer timestamps) that has already been elapsed in
+the segment</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
 <td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.start"></a>start</code></em>;</p></td>
-<td class="struct_member_description"><p>the start of the segment</p></td>
+<td class="struct_member_description"><p>the start of the segment in buffer timestamp time (PTS)</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
 <td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.stop"></a>stop</code></em>;</p></td>
-<td class="struct_member_description"><p>the stop of the segment</p></td>
+<td class="struct_member_description"><p>the stop of the segment in buffer timestamp time (PTS)</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
 <td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.time"></a>time</code></em>;</p></td>
-<td class="struct_member_description"><p>the stream time of the segment</p></td>
+<td class="struct_member_description"><p>the stream time of the segment start</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
 <td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.position"></a>position</code></em>;</p></td>
-<td class="struct_member_description"><p>the position in the segment (used internally by elements
-such as sources, demuxers or parsers to track progress)</p></td>
+<td class="struct_member_description"><p>the buffer timestamp position in the segment (used internally by
+elements such as sources, demuxers or parsers to track progress)</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
diff --git a/docs/gst/html/gst-running.html b/docs/gst/html/gst-running.html
index 2582064..df7914f 100644
--- a/docs/gst/html/gst-running.html
+++ b/docs/gst/html/gst-running.html
@@ -289,6 +289,9 @@
   <span class="command"><strong>dot foo.dot -Tsvg -o foo.svg</strong></span> or
   <span class="command"><strong>dot foo.dot -Tpng -o foo.png</strong></span> or
   <span class="command"><strong>dot foo.dot -Tjpg -o foo.jpg</strong></span>.
+  
+There is also a utility called <span class="command"><strong>xdot</strong></span> which allows you to
+view the dot file directly without converting it first.
   </p>
 <p><a name="GST_REGISTRY"></a><b><code class="envar">GST_REGISTRY</code>, <code class="envar">GST_REGISTRY_1_0</code>. </b>
 Set this environment variable to make GStreamer use a different file for the
diff --git a/docs/gst/html/gstreamer-1.0.devhelp2 b/docs/gst/html/gstreamer-1.0.devhelp2
index e9feec5..890f73b 100644
--- a/docs/gst/html/gstreamer-1.0.devhelp2
+++ b/docs/gst/html/gstreamer-1.0.devhelp2
@@ -156,6 +156,7 @@
     <keyword type="macro" name="GST_BUFFER_FLAG_UNSET()" link="GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS"/>
     <keyword type="macro" name="GST_BUFFER_PTS()" link="GstBuffer.html#GST-BUFFER-PTS:CAPS"/>
     <keyword type="macro" name="GST_BUFFER_DTS()" link="GstBuffer.html#GST-BUFFER-DTS:CAPS"/>
+    <keyword type="macro" name="GST_BUFFER_DTS_OR_PTS()" link="GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS"/>
     <keyword type="macro" name="GST_BUFFER_DURATION()" link="GstBuffer.html#GST-BUFFER-DURATION:CAPS"/>
     <keyword type="macro" name="GST_BUFFER_OFFSET()" link="GstBuffer.html#GST-BUFFER-OFFSET:CAPS"/>
     <keyword type="macro" name="GST_BUFFER_OFFSET_END()" link="GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS"/>
@@ -615,6 +616,9 @@
     <keyword type="function" name="gst_element_set_bus ()" link="GstElement.html#gst-element-set-bus"/>
     <keyword type="function" name="gst_element_get_bus ()" link="GstElement.html#gst-element-get-bus"/>
     <keyword type="function" name="gst_element_set_context ()" link="GstElement.html#gst-element-set-context"/>
+    <keyword type="function" name="gst_element_get_context ()" link="GstElement.html#gst-element-get-context" since="1.8"/>
+    <keyword type="function" name="gst_element_get_context_unlocked ()" link="GstElement.html#gst-element-get-context-unlocked" since="1.8"/>
+    <keyword type="function" name="gst_element_get_contexts ()" link="GstElement.html#gst-element-get-contexts" since="1.8"/>
     <keyword type="function" name="gst_element_get_factory ()" link="GstElement.html#gst-element-get-factory"/>
     <keyword type="macro" name="gst_element_set_name()" link="GstElement.html#gst-element-set-name"/>
     <keyword type="macro" name="gst_element_get_name()" link="GstElement.html#gst-element-get-name"/>
@@ -1542,10 +1546,15 @@
     <keyword type="function" name="gst_segment_copy ()" link="GstSegment.html#gst-segment-copy"/>
     <keyword type="function" name="gst_segment_free ()" link="GstSegment.html#gst-segment-free"/>
     <keyword type="function" name="gst_segment_do_seek ()" link="GstSegment.html#gst-segment-do-seek"/>
+    <keyword type="function" name="gst_segment_position_from_stream_time ()" link="GstSegment.html#gst-segment-position-from-stream-time" since="1.8"/>
+    <keyword type="function" name="gst_segment_position_from_stream_time_full ()" link="GstSegment.html#gst-segment-position-from-stream-time-full" since="1.8"/>
     <keyword type="function" name="gst_segment_to_running_time ()" link="GstSegment.html#gst-segment-to-running-time"/>
     <keyword type="function" name="gst_segment_to_running_time_full ()" link="GstSegment.html#gst-segment-to-running-time-full" since="1.6"/>
-    <keyword type="function" name="gst_segment_to_stream_time ()" link="GstSegment.html#gst-segment-to-stream-time"/>
-    <keyword type="function" name="gst_segment_to_position ()" link="GstSegment.html#gst-segment-to-position"/>
+    <keyword type="function" name="gst_segment_to_stream_time ()" link="GstSegment.html#gst-segment-to-stream-time" since="1.8"/>
+    <keyword type="function" name="gst_segment_to_stream_time_full ()" link="GstSegment.html#gst-segment-to-stream-time-full" since="1.8"/>
+    <keyword type="function" name="gst_segment_position_from_running_time ()" link="GstSegment.html#gst-segment-position-from-running-time" since="1.8"/>
+    <keyword type="function" name="gst_segment_position_from_running_time_full ()" link="GstSegment.html#gst-segment-position-from-running-time-full" since="1.8"/>
+    <keyword type="function" name="gst_segment_to_position ()" link="GstSegment.html#gst-segment-to-position" deprecated=""/>
     <keyword type="function" name="gst_segment_set_running_time ()" link="GstSegment.html#gst-segment-set-running-time"/>
     <keyword type="function" name="gst_segment_copy_into ()" link="GstSegment.html#gst-segment-copy-into"/>
     <keyword type="function" name="gst_segment_offset_running_time ()" link="GstSegment.html#gst-segment-offset-running-time" since="1.2.3"/>
@@ -2276,6 +2285,8 @@
     <keyword type="variable" name="GST_CAT_DEFAULT" link="gstreamer-GstInfo.html#GST-CAT-DEFAULT:CAPS"/>
     <keyword type="macro" name="GST_TIME_FORMAT" link="gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS"/>
     <keyword type="macro" name="GST_STIME_FORMAT" link="gstreamer-GstInfo.html#GST-STIME-FORMAT:CAPS" since="1.6"/>
+    <keyword type="macro" name="GST_PTR_FORMAT" link="gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS"/>
+    <keyword type="macro" name="GST_SEGMENT_FORMAT" link="gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS"/>
     <keyword type="constant" name="GST_ALLOCATOR_FLAG_CUSTOM_ALLOC" link="GstAllocator.html#GST-ALLOCATOR-FLAG-CUSTOM-ALLOC:CAPS"/>
     <keyword type="constant" name="GST_ALLOCATOR_FLAG_LAST" link="GstAllocator.html#GST-ALLOCATOR-FLAG-LAST:CAPS"/>
     <keyword type="constant" name="GST_BIN_FLAG_NO_RESYNC" link="GstBin.html#GST-BIN-FLAG-NO-RESYNC:CAPS"/>
@@ -2642,6 +2653,7 @@
     <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_RECURSE" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS"/>
     <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS"/>
     <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS"/>
+    <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS"/>
     <keyword type="constant" name="GST_RANK_NONE" link="GstPluginFeature.html#GST-RANK-NONE:CAPS"/>
     <keyword type="constant" name="GST_RANK_MARGINAL" link="GstPluginFeature.html#GST-RANK-MARGINAL:CAPS"/>
     <keyword type="constant" name="GST_RANK_SECONDARY" link="GstPluginFeature.html#GST-RANK-SECONDARY:CAPS"/>
diff --git a/docs/gst/html/gstreamer-GstInfo.html b/docs/gst/html/gstreamer-GstInfo.html
index 40a621e..77bb2e8 100644
--- a/docs/gst/html/gstreamer-GstInfo.html
+++ b/docs/gst/html/gstreamer-GstInfo.html
@@ -652,6 +652,14 @@
 <td class="define_keyword">#define</td>
 <td class="function_name"><a class="link" href="gstreamer-GstInfo.html#GST-STIME-FORMAT:CAPS" title="GST_STIME_FORMAT">GST_STIME_FORMAT</a></td>
 </tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS" title="GST_PTR_FORMAT">GST_PTR_FORMAT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS" title="GST_SEGMENT_FORMAT">GST_SEGMENT_FORMAT</a></td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -782,7 +790,7 @@
 <hr>
 <div class="refsect2">
 <a name="GST-FUNCTION:CAPS"></a><h3>GST_FUNCTION</h3>
-<pre class="programlisting">#  define GST_FUNCTION     ((const char*) (__FUNCTION__))
+<pre class="programlisting">#  define GST_FUNCTION     ((const char*) (__func__))
 </pre>
 <p>This macro should evaluate to the name of the current function and be should
 be defined when configuring your project, as it is compiler dependant. If it
@@ -3005,7 +3013,7 @@
 </pre>
 <p>To aid debugging applications one can use this method to write out the whole
 network of gstreamer elements that form the pipeline into an dot file.
-This file can be processed with graphviz to get an image.</p>
+This file can be processed with graphviz to get an image, like this:</p>
 <div class="informalexample">
   <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
     <tbody>
@@ -3017,11 +3025,13 @@
   </table>
 </div>
 
+<p>There is also a utility called xdot which allows you to view the dot file
+directly without converting it first.</p>
 <p>The macro is only active if gstreamer is configured with
 "--gst-enable-gst-debug" and the environment variable
 GST_DEBUG_DUMP_DOT_DIR is set to a basepath (e.g. /tmp).</p>
 <div class="refsect3">
-<a name="id-1.5.3.7.77.7"></a><h4>Parameters</h4>
+<a name="id-1.5.3.7.77.8"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -3619,6 +3629,22 @@
 <p></p>
 <p class="since">Since: <a class="link" href="ix03.html#api-index-1.6">1.6</a></p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="GST-PTR-FORMAT:CAPS"></a><h3>GST_PTR_FORMAT</h3>
+<pre class="programlisting">#define GST_PTR_FORMAT     "p\aA"
+</pre>
+<p>printf format type used to debug GStreamer types.
+This can only be used on types whose size is &gt;= sizeof(gpointer).</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SEGMENT-FORMAT:CAPS"></a><h3>GST_SEGMENT_FORMAT</h3>
+<pre class="programlisting">#define GST_SEGMENT_FORMAT "p\aB"
+</pre>
+<p>printf format type used to debug GStreamer segments.
+This can only be used on pointers to GstSegment structures.</p>
+</div>
 </div>
 <div class="refsect1">
 <a name="gstreamer-GstInfo.see-also"></a><h2>See Also</h2>
diff --git a/docs/gst/html/gstreamer-GstVersion.html b/docs/gst/html/gstreamer-GstVersion.html
index 5e7084e..228e925 100644
--- a/docs/gst/html/gstreamer-GstVersion.html
+++ b/docs/gst/html/gstreamer-GstVersion.html
@@ -91,14 +91,14 @@
 <hr>
 <div class="refsect2">
 <a name="GST-VERSION-MINOR:CAPS"></a><h3>GST_VERSION_MINOR</h3>
-<pre class="programlisting">#define GST_VERSION_MINOR (6)
+<pre class="programlisting">#define GST_VERSION_MINOR (7)
 </pre>
 <p>The minor version of GStreamer at compile time:</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-VERSION-MICRO:CAPS"></a><h3>GST_VERSION_MICRO</h3>
-<pre class="programlisting">#define GST_VERSION_MICRO (2)
+<pre class="programlisting">#define GST_VERSION_MICRO (1)
 </pre>
 <p>The micro version of GStreamer at compile time:</p>
 </div>
diff --git a/docs/gst/html/index.html b/docs/gst/html/index.html
index d0a03a5..c1caeb8 100644
--- a/docs/gst/html/index.html
+++ b/docs/gst/html/index.html
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer 1.0 Core Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for GStreamer Core 1.0 (1.6.2)
+      for GStreamer Core 1.0 (1.7.1)
       The latest version of this documentation can be found on-line at
       <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/</a>.
     </p></div>
diff --git a/docs/gst/html/index.sgml b/docs/gst/html/index.sgml
index 57ba068..cb0a74a 100644
--- a/docs/gst/html/index.sgml
+++ b/docs/gst/html/index.sgml
@@ -118,6 +118,7 @@
 <ANCHOR id="GST-BUFFER-FLAG-UNSET:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS">
 <ANCHOR id="GST-BUFFER-PTS:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-PTS:CAPS">
 <ANCHOR id="GST-BUFFER-DTS:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-DTS:CAPS">
+<ANCHOR id="GST-BUFFER-DTS-OR-PTS:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS">
 <ANCHOR id="GST-BUFFER-DURATION:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-DURATION:CAPS">
 <ANCHOR id="GST-BUFFER-OFFSET:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-OFFSET:CAPS">
 <ANCHOR id="GST-BUFFER-OFFSET-END:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS">
@@ -764,6 +765,9 @@
 <ANCHOR id="gst-element-set-bus" href="gstreamer-1.0/GstElement.html#gst-element-set-bus">
 <ANCHOR id="gst-element-get-bus" href="gstreamer-1.0/GstElement.html#gst-element-get-bus">
 <ANCHOR id="gst-element-set-context" href="gstreamer-1.0/GstElement.html#gst-element-set-context">
+<ANCHOR id="gst-element-get-context" href="gstreamer-1.0/GstElement.html#gst-element-get-context">
+<ANCHOR id="gst-element-get-context-unlocked" href="gstreamer-1.0/GstElement.html#gst-element-get-context-unlocked">
+<ANCHOR id="gst-element-get-contexts" href="gstreamer-1.0/GstElement.html#gst-element-get-contexts">
 <ANCHOR id="gst-element-get-factory" href="gstreamer-1.0/GstElement.html#gst-element-get-factory">
 <ANCHOR id="gst-element-set-name" href="gstreamer-1.0/GstElement.html#gst-element-set-name">
 <ANCHOR id="gst-element-get-name" href="gstreamer-1.0/GstElement.html#gst-element-get-name">
@@ -1977,6 +1981,7 @@
 <ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS">
 <ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS">
 <ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS">
+<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS">
 <ANCHOR id="GstPlugin.see-also" href="gstreamer-1.0/GstPlugin.html#GstPlugin.see-also">
 <ANCHOR id="GstPluginFeature" href="gstreamer-1.0/GstPluginFeature.html">
 <ANCHOR id="GstPluginFeature.functions" href="gstreamer-1.0/GstPluginFeature.html#GstPluginFeature.functions">
@@ -2255,9 +2260,14 @@
 <ANCHOR id="gst-segment-copy" href="gstreamer-1.0/GstSegment.html#gst-segment-copy">
 <ANCHOR id="gst-segment-free" href="gstreamer-1.0/GstSegment.html#gst-segment-free">
 <ANCHOR id="gst-segment-do-seek" href="gstreamer-1.0/GstSegment.html#gst-segment-do-seek">
+<ANCHOR id="gst-segment-position-from-stream-time" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-stream-time">
+<ANCHOR id="gst-segment-position-from-stream-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-stream-time-full">
 <ANCHOR id="gst-segment-to-running-time" href="gstreamer-1.0/GstSegment.html#gst-segment-to-running-time">
 <ANCHOR id="gst-segment-to-running-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-to-running-time-full">
 <ANCHOR id="gst-segment-to-stream-time" href="gstreamer-1.0/GstSegment.html#gst-segment-to-stream-time">
+<ANCHOR id="gst-segment-to-stream-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-to-stream-time-full">
+<ANCHOR id="gst-segment-position-from-running-time" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-running-time">
+<ANCHOR id="gst-segment-position-from-running-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-running-time-full">
 <ANCHOR id="gst-segment-to-position" href="gstreamer-1.0/GstSegment.html#gst-segment-to-position">
 <ANCHOR id="gst-segment-set-running-time" href="gstreamer-1.0/GstSegment.html#gst-segment-set-running-time">
 <ANCHOR id="gst-segment-copy-into" href="gstreamer-1.0/GstSegment.html#gst-segment-copy-into">
@@ -3249,6 +3259,8 @@
 <ANCHOR id="GST-CAT-DEFAULT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-CAT-DEFAULT:CAPS">
 <ANCHOR id="GST-TIME-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS">
 <ANCHOR id="GST-STIME-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-STIME-FORMAT:CAPS">
+<ANCHOR id="GST-PTR-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS">
+<ANCHOR id="GST-SEGMENT-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS">
 <ANCHOR id="gstreamer-GstInfo.see-also" href="gstreamer-1.0/gstreamer-GstInfo.html#gstreamer-GstInfo.see-also">
 <ANCHOR id="annotation-glossterm-allow-none" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-allow-none">
 <ANCHOR id="annotation-glossterm-array" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-array">
diff --git a/docs/gst/html/ix01.html b/docs/gst/html/ix01.html
index 8571eac..f668f35 100644
--- a/docs/gst/html/ix01.html
+++ b/docs/gst/html/ix01.html
@@ -363,6 +363,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS" title="GST_BUFFER_DTS_OR_PTS()">GST_BUFFER_DTS_OR_PTS</a>, macro in <a class="link" href="GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GstBuffer.html#GST-BUFFER-DURATION:CAPS" title="GST_BUFFER_DURATION()">GST_BUFFER_DURATION</a>, macro in <a class="link" href="GstBuffer.html" title="GstBuffer">GstBuffer</a>
 </dt>
 <dd></dd>
@@ -2554,6 +2558,18 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GstElement.html#gst-element-get-context" title="gst_element_get_context ()">gst_element_get_context</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-contexts" title="gst_element_get_contexts ()">gst_element_get_contexts</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-context-unlocked" title="gst_element_get_context_unlocked ()">gst_element_get_context_unlocked</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GstElement.html#gst-element-get-factory" title="gst_element_get_factory ()">gst_element_get_factory</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
 </dt>
 <dd></dd>
@@ -5729,6 +5745,10 @@
 <a class="link" href="GstGhostPad.html#gst-proxy-pad-iterate-internal-links-default" title="gst_proxy_pad_iterate_internal_links_default ()">gst_proxy_pad_iterate_internal_links_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
 </dt>
 <dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS" title="GST_PTR_FORMAT">GST_PTR_FORMAT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
 <a name="idxQ"></a><h3 class="title">Q</h3>
 <dt>
 <a class="link" href="GstEvent.html#GstQOSType" title="enum GstQOSType">GstQOSType</a>, enum in <a class="link" href="GstEvent.html" title="GstEvent">GstEvent</a>
@@ -6449,6 +6469,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS" title="GST_SEGMENT_FORMAT">GST_SEGMENT_FORMAT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GstSegment.html#gst-segment-free" title="gst_segment_free ()">gst_segment_free</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
 </dt>
 <dd></dd>
@@ -6469,6 +6493,22 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()">gst_segment_position_from_running_time</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time-full" title="gst_segment_position_from_running_time_full ()">gst_segment_position_from_running_time_full</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time" title="gst_segment_position_from_stream_time ()">gst_segment_position_from_stream_time</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time-full" title="gst_segment_position_from_stream_time_full ()">gst_segment_position_from_stream_time_full</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GstSegment.html#gst-segment-set-running-time" title="gst_segment_set_running_time ()">gst_segment_set_running_time</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
 </dt>
 <dd></dd>
@@ -6489,6 +6529,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GstSegment.html#gst-segment-to-stream-time-full" title="gst_segment_to_stream_time_full ()">gst_segment_to_stream_time_full</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="gstreamer-Gst.html#gst-segtrap-is-enabled" title="gst_segtrap_is_enabled ()">gst_segtrap_is_enabled</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
 </dt>
 <dd></dd>
diff --git a/docs/gst/html/ix02.html b/docs/gst/html/ix02.html
index cd9ed14..5b29447 100644
--- a/docs/gst/html/ix02.html
+++ b/docs/gst/html/ix02.html
@@ -17,6 +17,8 @@
                      <span class="dim">|</span> 
                   <a class="shortcut" href="#idxO">O</a>
                      <span class="dim">|</span> 
+                  <a class="shortcut" href="#idxS">S</a>
+                     <span class="dim">|</span> 
                   <a class="shortcut" href="#idxT">T</a></span></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
@@ -36,6 +38,11 @@
 <a class="link" href="GstObject.html#gst-object-has-ancestor" title="gst_object_has_ancestor ()">gst_object_has_ancestor</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
 </dt>
 <dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-to-position" title="gst_segment_to_position ()">gst_segment_to_position</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
 <a name="idxT"></a><h3 class="title">T</h3>
 <dt>
 <a class="link" href="GstTagList.html#gst-tag-list-free" title="gst_tag_list_free()">gst_tag_list_free</a>, macro in <a class="link" href="GstTagList.html" title="GstTagList">GstTagList</a>
diff --git a/docs/gst/running.xml b/docs/gst/running.xml
index 103aebb..b034e6a 100644
--- a/docs/gst/running.xml
+++ b/docs/gst/running.xml
@@ -361,6 +361,11 @@
   <command>dot foo.dot -Tpng -o foo.png</command> or
   <command>dot foo.dot -Tjpg -o foo.jpg</command>.
   </para>
+  <para>
+There is also a utility called <command>xdot</command> which allows you to
+view the dot file directly without converting it first.
+  </para>
+
 
 </formalpara>
 
diff --git a/docs/libs/Makefile.in b/docs/libs/Makefile.in
index 53485f9..68ad7a5 100644
--- a/docs/libs/Makefile.in
+++ b/docs/libs/Makefile.in
@@ -296,6 +296,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/libs/html/GstBaseSink.html b/docs/libs/html/GstBaseSink.html
index bc15a4f..2d3eb60 100644
--- a/docs/libs/html/GstBaseSink.html
+++ b/docs/libs/html/GstBaseSink.html
@@ -1491,54 +1491,54 @@
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-GET-PREROLL-COND:CAPS"></a><h3>GST_BASE_SINK_GET_PREROLL_COND()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_COND(pad)   (&amp;GST_BASE_SINK_CAST(pad)-&gt;preroll_cond)
+<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_COND(obj)   (&amp;GST_BASE_SINK_CAST(obj)-&gt;preroll_cond)
 </pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-GET-PREROLL-LOCK:CAPS"></a><h3>GST_BASE_SINK_GET_PREROLL_LOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_LOCK(pad)   (&amp;GST_BASE_SINK_CAST(pad)-&gt;preroll_lock)
+<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_LOCK(obj)   (&amp;GST_BASE_SINK_CAST(obj)-&gt;preroll_lock)
 </pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-PREROLL-BROADCAST:CAPS"></a><h3>GST_BASE_SINK_PREROLL_BROADCAST()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_BROADCAST(pad)  g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (pad));
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_BROADCAST(obj)  g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (obj));
 </pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-PREROLL-LOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_LOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_LOCK(pad)       (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_LOCK(obj)       (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
 </pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-PREROLL-SIGNAL:CAPS"></a><h3>GST_BASE_SINK_PREROLL_SIGNAL()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_SIGNAL(pad)     g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (pad));
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_SIGNAL(obj)     g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (obj));
 </pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-PREROLL-TRYLOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_TRYLOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_TRYLOCK(pad)    (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_TRYLOCK(obj)    (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
 </pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-PREROLL-UNLOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_UNLOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_UNLOCK(pad)     (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_UNLOCK(obj)     (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
 </pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-PREROLL-WAIT:CAPS"></a><h3>GST_BASE_SINK_PREROLL_WAIT()</h3>
-<pre class="programlisting">#define             GST_BASE_SINK_PREROLL_WAIT(pad)</pre>
+<pre class="programlisting">#define             GST_BASE_SINK_PREROLL_WAIT(obj)</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GST-BASE-SINK-PREROLL-WAIT-UNTIL:CAPS"></a><h3>GST_BASE_SINK_PREROLL_WAIT_UNTIL()</h3>
-<pre class="programlisting">#define             GST_BASE_SINK_PREROLL_WAIT_UNTIL(pad, end_time)</pre>
+<pre class="programlisting">#define             GST_BASE_SINK_PREROLL_WAIT_UNTIL(obj, end_time)</pre>
 </div>
 </div>
 <div class="refsect1">
diff --git a/docs/libs/html/GstInterpolationControlSource.html b/docs/libs/html/GstInterpolationControlSource.html
index c34ab80..12ee8ac 100644
--- a/docs/libs/html/GstInterpolationControlSource.html
+++ b/docs/libs/html/GstInterpolationControlSource.html
@@ -159,7 +159,17 @@
 <tr>
 <td class="enum_member_name"><p><a name="GST-INTERPOLATION-MODE-CUBIC:CAPS"></a>GST_INTERPOLATION_MODE_CUBIC</p></td>
 <td class="enum_member_description">
-<p>cubic interpolation</p>
+<p>cubic interpolation (natural), may overshoot
+  the min or max values set by the control point, but is more 'curvy'</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS"></a>GST_INTERPOLATION_MODE_CUBIC_MONO</p></td>
+<td class="enum_member_description">
+<p>monotonic cubic interpolation, will not
+  produce any values outside of the min-max range set by the control points
+  (Since 1.8)</p>
 </td>
 <td class="enum_member_annotations"> </td>
 </tr>
diff --git a/docs/libs/html/GstTimedValueControlSource.html b/docs/libs/html/GstTimedValueControlSource.html
index 750ac1b..bc68906 100644
--- a/docs/libs/html/GstTimedValueControlSource.html
+++ b/docs/libs/html/GstTimedValueControlSource.html
@@ -448,7 +448,7 @@
   gdouble value;
 };
 </pre>
-<p>a internal structure for value+time and various temporary
+<p>An internal structure for value+time and various temporary
 values used for interpolation. This "inherits" from
 GstTimedValue.</p>
 <div class="refsect3">
diff --git a/docs/libs/html/gstreamer-libs-1.0.devhelp2 b/docs/libs/html/gstreamer-libs-1.0.devhelp2
index b2b835f..bd96956 100644
--- a/docs/libs/html/gstreamer-libs-1.0.devhelp2
+++ b/docs/libs/html/gstreamer-libs-1.0.devhelp2
@@ -563,7 +563,7 @@
     <keyword type="struct" name="struct GstTriggerControlSource" link="GstTriggerControlSource.html#GstTriggerControlSource-struct"/>
     <keyword type="property" name="The “tolerance” property" link="GstTriggerControlSource.html#GstTriggerControlSource--tolerance"/>
     <keyword type="function" name="gst_buffer_add_net_address_meta ()" link="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-add-net-address-meta"/>
-    <keyword type="macro" name="gst_buffer_get_net_address_meta()" link="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta"/>
+    <keyword type="function" name="gst_buffer_get_net_address_meta ()" link="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta"/>
     <keyword type="function" name="gst_net_address_meta_get_info ()" link="gstreamer-libs-GstNetAddressMeta.html#gst-net-address-meta-get-info"/>
     <keyword type="struct" name="struct GstNetAddressMeta" link="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta"/>
     <keyword type="function" name="gst_net_client_clock_new ()" link="GstNetClientClock.html#gst-net-client-clock-new"/>
@@ -785,6 +785,7 @@
     <keyword type="constant" name="GST_INTERPOLATION_MODE_NONE" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-NONE:CAPS"/>
     <keyword type="constant" name="GST_INTERPOLATION_MODE_LINEAR" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-LINEAR:CAPS"/>
     <keyword type="constant" name="GST_INTERPOLATION_MODE_CUBIC" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC:CAPS"/>
+    <keyword type="constant" name="GST_INTERPOLATION_MODE_CUBIC_MONO" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS"/>
     <keyword type="constant" name="GST_LFO_WAVEFORM_SINE" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SINE:CAPS"/>
     <keyword type="constant" name="GST_LFO_WAVEFORM_SQUARE" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SQUARE:CAPS"/>
     <keyword type="constant" name="GST_LFO_WAVEFORM_SAW" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SAW:CAPS"/>
diff --git a/docs/libs/html/gstreamer-libs-GstHarness.html b/docs/libs/html/gstreamer-libs-GstHarness.html
index 9d993f9..ca3040a 100644
--- a/docs/libs/html/gstreamer-libs-GstHarness.html
+++ b/docs/libs/html/gstreamer-libs-GstHarness.html
@@ -702,10 +702,10 @@
 </div>
 <div class="refsect1">
 <a name="gstreamer-libs-GstHarness.description"></a><h2>Description</h2>
-<p><a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is ment to make writing unit test for GStreamer much easier.
-It can be though of as a way of treating a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> as a black box,
-deterministially feeding it data, and controlling what data it outputs.</p>
-<p>The basic structure of <a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is two "floating" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a>, that connects
+<p><a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is meant to make writing unit test for GStreamer much easier.
+It can be thought of as a way of treating a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> as a black box,
+deterministically feeding it data, and controlling what data it outputs.</p>
+<p>The basic structure of <a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is two "floating" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a> that connect
 to the harnessed <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> src and sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a> like so:</p>
 <pre class="programlisting">
           __________________________
@@ -718,15 +718,15 @@
 </pre>
 <p>With this, you can now simulate any environment the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> might find
 itself in. By specifying the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> of the harness <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a>, using
-functions like gst_harness_set_src_caps or gst_harness_set_sink_caps_str,
-you can test how the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> interacts with different capssets.</p>
+functions like <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-set-src-caps" title="gst_harness_set_src_caps ()"><code class="function">gst_harness_set_src_caps()</code></a> or <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-set-sink-caps-str" title="gst_harness_set_sink_caps_str ()"><code class="function">gst_harness_set_sink_caps_str()</code></a>,
+you can test how the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> interacts with different caps sets.</p>
 <p>Your harnessed <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> can of course also be a bin, and using
-gst_harness_new_parse supporting standard gst-launch syntax, you can
+<a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-new-parse" title="gst_harness_new_parse ()"><code class="function">gst_harness_new_parse()</code></a> supporting standard gst-launch syntax, you can
 easily test a whole pipeline instead of just one element.</p>
 <p>You can then go on to push <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffers</span></a> and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstEvent.html"><span class="type">GstEvents</span></a> on to the srcpad,
-using functions like gst_harness_push and gst_harness_push_event, and
-then pull them out to examine them with gst_harness_pull and
-gst_harness_pull_event.</p>
+using functions like <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-push" title="gst_harness_push ()"><code class="function">gst_harness_push()</code></a> and <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-push-event" title="gst_harness_push_event ()"><code class="function">gst_harness_push_event()</code></a>, and
+then pull them out to examine them with <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-pull" title="gst_harness_pull ()"><code class="function">gst_harness_pull()</code></a> and
+<a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-pull-event" title="gst_harness_pull_event ()"><code class="function">gst_harness_pull_event()</code></a>.</p>
 <div class="example">
 <a name="id-1.2.7.6.6.8"></a><p class="title"><b>Example 1. A simple buffer-in buffer-out example</b></p>
 <div class="example-contents">
@@ -797,13 +797,13 @@
 <a class="link" href="GstTestClock.html" title="GstTestClock"><span class="type">GstTestClock</span></a>. Operating the <a class="link" href="GstTestClock.html" title="GstTestClock"><span class="type">GstTestClock</span></a> can be very challenging, but
 <a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> simplifies some of the most desired actions a lot, like wanting
 to manually advance the clock while at the same time releasing a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockID"><span class="type">GstClockID</span></a>
-that is waiting, with functions like gst_harness_crank_single_clock_wait.</p>
+that is waiting, with functions like <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-crank-single-clock-wait" title="gst_harness_crank_single_clock_wait ()"><code class="function">gst_harness_crank_single_clock_wait()</code></a>.</p>
 <p><a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> also supports sub-harnesses, as a way of generating and
 validating data. A sub-harness is another <a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> that is managed by
 the "parent" harness, and can either be created by using the standard
 gst_harness_new type functions directly on the (GstHarness *)-&gt;src_harness,
-or using the much more convenient gst_harness_add_src or
-gst_harness_add_sink_parse. If you have a decoder-element you want to test,
+or using the much more convenient <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-add-src" title="gst_harness_add_src ()"><code class="function">gst_harness_add_src()</code></a> or
+<a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-add-sink-parse" title="gst_harness_add_sink_parse ()"><code class="function">gst_harness_add_sink_parse()</code></a>. If you have a decoder-element you want to test,
 (like vp8dec) it can be very useful to add a src-harness with both a
 src-element (videotestsrc) and an encoder (vp8enc) to feed the decoder data
 with different configurations, by simply doing:</p>
diff --git a/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html b/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html
index 65de030..e64f65d 100644
--- a/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html
+++ b/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html
@@ -48,9 +48,11 @@
 </td>
 </tr>
 <tr>
-<td class="define_keyword">#define</td>
+<td class="function_type">
+<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="returnvalue">GstNetAddressMeta</span></a> *
+</td>
 <td class="function_name">
-<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta()">gst_buffer_get_net_address_meta</a><span class="c_punctuation">()</span>
+<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta ()">gst_buffer_get_net_address_meta</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
@@ -130,8 +132,33 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="gst-buffer-get-net-address-meta"></a><h3>gst_buffer_get_net_address_meta()</h3>
-<pre class="programlisting">#define             gst_buffer_get_net_address_meta(b)</pre>
+<a name="gst-buffer-get-net-address-meta"></a><h3>gst_buffer_get_net_address_meta ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="returnvalue">GstNetAddressMeta</span></a> *
+gst_buffer_get_net_address_meta (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>Find the <a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="type">GstNetAddressMeta</span></a> on <em class="parameter"><code>buffer</code></em>
+.</p>
+<div class="refsect3">
+<a name="id-1.2.6.3.7.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.6.3.7.3.6"></a><h4>Returns</h4>
+<p> the <a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="type">GstNetAddressMeta</span></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> when there
+is no such metadata on <em class="parameter"><code>buffer</code></em>
+. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
 </div>
 <hr>
 <div class="refsect2">
diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html
index 4f4894f..7546e3f 100644
--- a/docs/libs/html/index.html
+++ b/docs/libs/html/index.html
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer 1.0 Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for GStreamer Library 1.0 (1.6.2)
+      for GStreamer Library 1.0 (1.7.1)
       The latest version of this documentation can be found on-line at
       <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/</a>.
     </p></div>
diff --git a/docs/libs/html/index.sgml b/docs/libs/html/index.sgml
index b809ca4..d0c5aef 100644
--- a/docs/libs/html/index.sgml
+++ b/docs/libs/html/index.sgml
@@ -666,6 +666,7 @@
 <ANCHOR id="GST-INTERPOLATION-MODE-NONE:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-NONE:CAPS">
 <ANCHOR id="GST-INTERPOLATION-MODE-LINEAR:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-LINEAR:CAPS">
 <ANCHOR id="GST-INTERPOLATION-MODE-CUBIC:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC:CAPS">
+<ANCHOR id="GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS">
 <ANCHOR id="GstInterpolationControlSource.property-details" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GstInterpolationControlSource.property-details">
 <ANCHOR id="GstInterpolationControlSource--mode" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GstInterpolationControlSource--mode">
 <ANCHOR id="GstLFOControlSource" href="gstreamer-libs-1.0/GstLFOControlSource.html">
diff --git a/docs/libs/html/ix01.html b/docs/libs/html/ix01.html
index e416ff4..e30a991 100644
--- a/docs/libs/html/ix01.html
+++ b/docs/libs/html/ix01.html
@@ -899,7 +899,7 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta()">gst_buffer_get_net_address_meta</a>, macro in <a class="link" href="gstreamer-libs-GstNetAddressMeta.html" title="GstNetAddressMeta">GstNetAddressMeta</a>
+<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta ()">gst_buffer_get_net_address_meta</a>, function in <a class="link" href="gstreamer-libs-GstNetAddressMeta.html" title="GstNetAddressMeta">GstNetAddressMeta</a>
 </dt>
 <dd></dd>
 <dt>
diff --git a/docs/manual/Makefile.in b/docs/manual/Makefile.in
index 096dda1..e014b24 100644
--- a/docs/manual/Makefile.in
+++ b/docs/manual/Makefile.in
@@ -327,6 +327,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/manual/advanced-dataaccess.xml b/docs/manual/advanced-dataaccess.xml
index 555d0ba..eb297c8 100644
--- a/docs/manual/advanced-dataaccess.xml
+++ b/docs/manual/advanced-dataaccess.xml
@@ -915,7 +915,7 @@
 
   if (error != NULL) {
     g_print ("could not construct pipeline: %s\n", error->message);
-    g_error_free (error);
+    g_clear_error (&error);
     exit (-1);
   }
 
@@ -1392,11 +1392,11 @@
   GstElement *next;
 
   if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) != GST_EVENT_EOS)
-    return GST_PAD_PROBE_OK;
+    return GST_PAD_PROBE_PASS;
 
   gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
 
-  /* push current event back into the queue */
+  /* push current effect back into the queue */
   g_queue_push_tail (&effects, gst_object_ref (cur_effect));
   /* take next effect from the queue */
   next = g_queue_pop_head (&effects);
@@ -1475,7 +1475,7 @@
 
       gst_message_parse_error (msg, &err, &dbg);
       gst_object_default_error (msg->src, err, dbg);
-      g_error_free (err);
+      g_clear_error (&err);
       g_free (dbg);
       g_main_loop_quit (loop);
       break;
@@ -1505,6 +1505,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_print ("Error initializing: %s\n", err->message);
+    g_clear_error (&amp;err);
+    g_option_context_free (ctx);
     return 1;
   }
   g_option_context_free (ctx);
diff --git a/docs/manual/advanced-metadata.xml b/docs/manual/advanced-metadata.xml
index 78a3677..f975409 100644
--- a/docs/manual/advanced-metadata.xml
+++ b/docs/manual/advanced-metadata.xml
@@ -107,16 +107,23 @@
 {
   GstElement *pipe, *dec, *sink;
   GstMessage *msg;
+  gchar *uri;
 
   gst_init (&amp;argc, &amp;argv);
 
-  if (argc &lt; 2 || !gst_uri_is_valid (argv[1]))
-    g_error ("Usage: %s file:///path/to/file", argv[0]);
+  if (argc &lt; 2)
+    g_error ("Usage: %s FILE or URI", argv[0]);
+
+  if (gst_uri_is_valid (argv[1])) {
+    uri = g_strdup (argv[1]);
+  } else {
+    uri = gst_filename_to_uri (argv[1], NULL);
+  }
 
   pipe = gst_pipeline_new ("pipeline");
 
   dec = gst_element_factory_make ("uridecodebin", NULL);
-  g_object_set (dec, "uri", argv[1], NULL);
+  g_object_set (dec, "uri", uri, NULL);
   gst_bin_add (GST_BIN (pipe), dec);
 
   sink = gst_element_factory_make ("fakesink", NULL);
@@ -144,14 +151,20 @@
     gst_tag_list_unref (tags);
 
     gst_message_unref (msg);
-  };
+  }
 
-  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR)
-    g_error ("Got error");
+  if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
+    GError *err = NULL;
+
+    gst_message_parse_error (msg, &amp;err, NULL);
+    g_printerr ("Got error: %s\n", err->message);
+    g_error_free (err);
+  }
 
   gst_message_unref (msg);
   gst_element_set_state (pipe, GST_STATE_NULL);
   gst_object_unref (pipe);
+  g_free (uri);
   return 0;
 }
     </programlisting>
diff --git a/docs/manual/appendix-integration.xml b/docs/manual/appendix-integration.xml
index b558788..b288a6b 100644
--- a/docs/manual/appendix-integration.xml
+++ b/docs/manual/appendix-integration.xml
@@ -127,8 +127,11 @@
    * calls gtk_init() and gst_init() */
   if (!g_option_context_parse (ctx, &amp;argc, &amp;argv, &amp;err)) {
     g_print ("Error initializing: %s\n", err->message);
+    g_clear_error (&amp;err);
+    g_option_context_free (ctx);
     exit (1);
   }
+  g_option_context_free (ctx);
 
   /* any filenames we got passed on the command line? parse them! */
   if (cmd_filenames != NULL) {
diff --git a/docs/manual/basics-init.xml b/docs/manual/basics-init.xml
index 7a8467b..3a71be6 100644
--- a/docs/manual/basics-init.xml
+++ b/docs/manual/basics-init.xml
@@ -102,9 +102,11 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &amp;argc, &amp;argv, &amp;err)) {
     g_print ("Failed to initialize: %s\n", err->message);
-    g_error_free (err);
+    g_clear_error (&amp;err);
+    g_option_context_free (ctx);
     return 1;
   }
+  g_option_context_free (ctx);
 
   printf ("Run me with --help to see the Application options appended.\n");
 
diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in
index 9327733..dd02c7b 100644
--- a/docs/plugins/Makefile.in
+++ b/docs/plugins/Makefile.in
@@ -292,6 +292,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/plugins/gstreamer-plugins-docs.sgml b/docs/plugins/gstreamer-plugins-docs.sgml
index c97ddc4..89edb0c 100644
--- a/docs/plugins/gstreamer-plugins-docs.sgml
+++ b/docs/plugins/gstreamer-plugins-docs.sgml
@@ -20,19 +20,19 @@
     <xi:include href="xml/element-capsfilter.xml" />
     <xi:include href="xml/element-concat.xml" />
     <xi:include href="xml/element-downloadbuffer.xml" />
-    <xi:include href="xml/element-fakesrc.xml" />
     <xi:include href="xml/element-fakesink.xml" />
+    <xi:include href="xml/element-fakesrc.xml" />
     <xi:include href="xml/element-fdsink.xml" />
     <xi:include href="xml/element-fdsrc.xml" />
-    <xi:include href="xml/element-filesrc.xml" />
     <xi:include href="xml/element-filesink.xml" />
+    <xi:include href="xml/element-filesrc.xml" />
     <xi:include href="xml/element-funnel.xml" />
     <xi:include href="xml/element-identity.xml" />
     <xi:include href="xml/element-input-selector.xml" />
     <xi:include href="xml/element-multiqueue.xml" />
     <xi:include href="xml/element-output-selector.xml" />
-    <xi:include href="xml/element-queue.xml" />
     <xi:include href="xml/element-queue2.xml" />
+    <xi:include href="xml/element-queue.xml" />
     <xi:include href="xml/element-streamiddemux.xml" />
     <xi:include href="xml/element-tee.xml" />
     <xi:include href="xml/element-typefind.xml" />
diff --git a/docs/plugins/gstreamer-plugins.args b/docs/plugins/gstreamer-plugins.args
index c9bb39c..0796364 100644
--- a/docs/plugins/gstreamer-plugins.args
+++ b/docs/plugins/gstreamer-plugins.args
@@ -249,6 +249,16 @@
 </ARG>
 
 <ARG>
+<NAME>GstQueue2::avg-in-rate</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Input data rate (bytes/s)</NICK>
+<BLURB>Average input data rate (bytes/s).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
 <NAME>GstQueue::current-level-buffers</NAME>
 <TYPE>guint</TYPE>
 <RANGE></RANGE>
@@ -499,6 +509,26 @@
 </ARG>
 
 <ARG>
+<NAME>GstMultiQueue::unlinked-cache-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Unlinked cache time (ns)</NICK>
+<BLURB>Extra buffering in time for unlinked streams (if 'sync-by-running-time').</BLURB>
+<DEFAULT>250000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::use-interleave</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Use interleave</NICK>
+<BLURB>Adjust time limits based on input interleave.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
 <NAME>GstInputSelector::active-pad</NAME>
 <TYPE>GstPad*</TYPE>
 <RANGE></RANGE>
@@ -669,6 +699,16 @@
 </ARG>
 
 <ARG>
+<NAME>GstIdentity::drop-buffer-flags</NAME>
+<TYPE>GstBufferFlags</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Check flags to drop buffers</NICK>
+<BLURB>Drop buffers with the given flags.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
 <NAME>GstFileSrc::location</NAME>
 <TYPE>gchar*</TYPE>
 <RANGE></RANGE>
diff --git a/docs/plugins/gstreamer-plugins.hierarchy b/docs/plugins/gstreamer-plugins.hierarchy
index 892e984..480fce1 100644
--- a/docs/plugins/gstreamer-plugins.hierarchy
+++ b/docs/plugins/gstreamer-plugins.hierarchy
@@ -40,10 +40,16 @@
       GstPluginFeature
         GstDeviceProviderFactory
         GstElementFactory
+        GstTracerFactory
         GstTypeFindFactory
       GstRegistry
       GstTask
       GstTaskPool
+      GstTracer
+        GstLatencyTracer
+        GstLogTracer
+        GstRUsageTracer
+        GstStatsTracer
 GInterface
   GTypePlugin
   GstChildProxy
diff --git a/docs/plugins/gstreamer-plugins.signals b/docs/plugins/gstreamer-plugins.signals
index 026f5c2..a0cf066 100644
--- a/docs/plugins/gstreamer-plugins.signals
+++ b/docs/plugins/gstreamer-plugins.signals
@@ -84,3 +84,10 @@
 GstPad *arg2
 </SIGNAL>
 
+<SIGNAL>
+<NAME>GstQueue2::overrun</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstQueue2 *gstqueue2
+</SIGNAL>
+
diff --git a/docs/plugins/html/ch01.html b/docs/plugins/html/ch01.html
index 9ac4f07..7c219d7 100644
--- a/docs/plugins/html/ch01.html
+++ b/docs/plugins/html/ch01.html
@@ -33,10 +33,10 @@
 <span class="refentrytitle"><a href="gstreamer-plugins-downloadbuffer.html">downloadbuffer</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="gstreamer-plugins-fdsink.html">fdsink</a></span><span class="refpurpose"></span>
@@ -45,10 +45,10 @@
 <span class="refentrytitle"><a href="gstreamer-plugins-fdsrc.html">fdsrc</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="gstreamer-plugins-funnel.html">funnel</a></span><span class="refpurpose"></span>
@@ -66,10 +66,10 @@
 <span class="refentrytitle"><a href="gstreamer-plugins-output-selector.html">output-selector</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="gstreamer-plugins-streamiddemux.html">streamiddemux</a></span><span class="refpurpose"></span>
diff --git a/docs/plugins/html/gstreamer-plugins-1.0.devhelp2 b/docs/plugins/html/gstreamer-plugins-1.0.devhelp2
index ff3b17b..2676c58 100644
--- a/docs/plugins/html/gstreamer-plugins-1.0.devhelp2
+++ b/docs/plugins/html/gstreamer-plugins-1.0.devhelp2
@@ -5,19 +5,19 @@
       <sub name="capsfilter" link="gstreamer-plugins-capsfilter.html"/>
       <sub name="concat" link="gstreamer-plugins-concat.html"/>
       <sub name="downloadbuffer" link="gstreamer-plugins-downloadbuffer.html"/>
-      <sub name="fakesrc" link="gstreamer-plugins-fakesrc.html"/>
       <sub name="fakesink" link="gstreamer-plugins-fakesink.html"/>
+      <sub name="fakesrc" link="gstreamer-plugins-fakesrc.html"/>
       <sub name="fdsink" link="gstreamer-plugins-fdsink.html"/>
       <sub name="fdsrc" link="gstreamer-plugins-fdsrc.html"/>
-      <sub name="filesrc" link="gstreamer-plugins-filesrc.html"/>
       <sub name="filesink" link="gstreamer-plugins-filesink.html"/>
+      <sub name="filesrc" link="gstreamer-plugins-filesrc.html"/>
       <sub name="funnel" link="gstreamer-plugins-funnel.html"/>
       <sub name="identity" link="gstreamer-plugins-identity.html"/>
       <sub name="input-selector" link="gstreamer-plugins-input-selector.html"/>
       <sub name="multiqueue" link="gstreamer-plugins-multiqueue.html"/>
       <sub name="output-selector" link="gstreamer-plugins-output-selector.html"/>
-      <sub name="queue" link="gstreamer-plugins-queue.html"/>
       <sub name="queue2" link="gstreamer-plugins-queue2.html"/>
+      <sub name="queue" link="gstreamer-plugins-queue.html"/>
       <sub name="streamiddemux" link="gstreamer-plugins-streamiddemux.html"/>
       <sub name="tee" link="gstreamer-plugins-tee.html"/>
       <sub name="typefind" link="gstreamer-plugins-typefind.html"/>
@@ -43,6 +43,18 @@
     <keyword type="property" name="The “temp-location” property" link="gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-location"/>
     <keyword type="property" name="The “temp-remove” property" link="gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-remove"/>
     <keyword type="property" name="The “temp-template” property" link="gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-template"/>
+    <keyword type="struct" name="struct GstFakeSink" link="gstreamer-plugins-fakesink.html#GstFakeSink-struct"/>
+    <keyword type="enum" name="enum GstFakeSinkStateError" link="gstreamer-plugins-fakesink.html#GstFakeSinkStateError"/>
+    <keyword type="property" name="The “can-activate-pull” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull"/>
+    <keyword type="property" name="The “can-activate-push” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push"/>
+    <keyword type="property" name="The “dump” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--dump"/>
+    <keyword type="property" name="The “last-message” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--last-message"/>
+    <keyword type="property" name="The “num-buffers” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers"/>
+    <keyword type="property" name="The “signal-handoffs” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs"/>
+    <keyword type="property" name="The “silent” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--silent"/>
+    <keyword type="property" name="The “state-error” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--state-error"/>
+    <keyword type="signal" name="The “handoff” signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-handoff"/>
+    <keyword type="signal" name="The “preroll-handoff” signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff"/>
     <keyword type="struct" name="struct GstFakeSrc" link="gstreamer-plugins-fakesrc.html#GstFakeSrc-struct"/>
     <keyword type="enum" name="enum GstFakeSrcDataType" link="gstreamer-plugins-fakesrc.html#GstFakeSrcDataType"/>
     <keyword type="enum" name="enum GstFakeSrcFillType" link="gstreamer-plugins-fakesrc.html#GstFakeSrcFillType"/>
@@ -66,31 +78,19 @@
     <keyword type="property" name="The “sizetype” property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizetype"/>
     <keyword type="property" name="The “sync” property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sync"/>
     <keyword type="signal" name="The “handoff” signal" link="gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff"/>
-    <keyword type="struct" name="struct GstFakeSink" link="gstreamer-plugins-fakesink.html#GstFakeSink-struct"/>
-    <keyword type="enum" name="enum GstFakeSinkStateError" link="gstreamer-plugins-fakesink.html#GstFakeSinkStateError"/>
-    <keyword type="property" name="The “can-activate-pull” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull"/>
-    <keyword type="property" name="The “can-activate-push” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push"/>
-    <keyword type="property" name="The “dump” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--dump"/>
-    <keyword type="property" name="The “last-message” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--last-message"/>
-    <keyword type="property" name="The “num-buffers” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers"/>
-    <keyword type="property" name="The “signal-handoffs” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs"/>
-    <keyword type="property" name="The “silent” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--silent"/>
-    <keyword type="property" name="The “state-error” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--state-error"/>
-    <keyword type="signal" name="The “handoff” signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-handoff"/>
-    <keyword type="signal" name="The “preroll-handoff” signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff"/>
     <keyword type="struct" name="struct GstFdSink" link="gstreamer-plugins-fdsink.html#GstFdSink-struct"/>
     <keyword type="property" name="The “fd” property" link="gstreamer-plugins-fdsink.html#GstFdSink--fd"/>
     <keyword type="struct" name="struct GstFdSrc" link="gstreamer-plugins-fdsrc.html#GstFdSrc-struct"/>
     <keyword type="property" name="The “fd” property" link="gstreamer-plugins-fdsrc.html#GstFdSrc--fd"/>
     <keyword type="property" name="The “timeout” property" link="gstreamer-plugins-fdsrc.html#GstFdSrc--timeout"/>
-    <keyword type="struct" name="struct GstFileSrc" link="gstreamer-plugins-filesrc.html#GstFileSrc-struct"/>
-    <keyword type="property" name="The “location” property" link="gstreamer-plugins-filesrc.html#GstFileSrc--location"/>
     <keyword type="struct" name="struct GstFileSink" link="gstreamer-plugins-filesink.html#GstFileSink-struct"/>
     <keyword type="enum" name="enum GstFileSinkBufferMode" link="gstreamer-plugins-filesink.html#GstFileSinkBufferMode"/>
     <keyword type="property" name="The “append” property" link="gstreamer-plugins-filesink.html#GstFileSink--append"/>
     <keyword type="property" name="The “buffer-mode” property" link="gstreamer-plugins-filesink.html#GstFileSink--buffer-mode"/>
     <keyword type="property" name="The “buffer-size” property" link="gstreamer-plugins-filesink.html#GstFileSink--buffer-size"/>
     <keyword type="property" name="The “location” property" link="gstreamer-plugins-filesink.html#GstFileSink--location"/>
+    <keyword type="struct" name="struct GstFileSrc" link="gstreamer-plugins-filesrc.html#GstFileSrc-struct"/>
+    <keyword type="property" name="The “location” property" link="gstreamer-plugins-filesrc.html#GstFileSrc--location"/>
     <keyword type="struct" name="struct GstFunnel" link="gstreamer-plugins-funnel.html#GstFunnel-struct"/>
     <keyword type="property" name="The “forward-sticky-events” property" link="gstreamer-plugins-funnel.html#GstFunnel--forward-sticky-events"/>
     <keyword type="struct" name="struct GstIdentity" link="gstreamer-plugins-identity.html#GstIdentity-struct"/>
@@ -106,6 +106,7 @@
     <keyword type="property" name="The “single-segment” property" link="gstreamer-plugins-identity.html#GstIdentity--single-segment"/>
     <keyword type="property" name="The “sleep-time” property" link="gstreamer-plugins-identity.html#GstIdentity--sleep-time"/>
     <keyword type="property" name="The “sync” property" link="gstreamer-plugins-identity.html#GstIdentity--sync"/>
+    <keyword type="property" name="The “drop-buffer-flags” property" link="gstreamer-plugins-identity.html#GstIdentity--drop-buffer-flags"/>
     <keyword type="signal" name="The “handoff” signal" link="gstreamer-plugins-identity.html#GstIdentity-handoff"/>
     <keyword type="struct" name="struct GstInputSelector" link="gstreamer-plugins-input-selector.html#GstInputSelector-struct"/>
     <keyword type="enum" name="enum GstInputSelectorSyncMode" link="gstreamer-plugins-input-selector.html#GstInputSelectorSyncMode"/>
@@ -125,6 +126,8 @@
     <keyword type="property" name="The “max-size-time” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time"/>
     <keyword type="property" name="The “sync-by-running-time” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time"/>
     <keyword type="property" name="The “use-buffering” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering"/>
+    <keyword type="property" name="The “unlinked-cache-time” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--unlinked-cache-time"/>
+    <keyword type="property" name="The “use-interleave” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-interleave"/>
     <keyword type="signal" name="The “overrun” signal" link="gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun"/>
     <keyword type="signal" name="The “underrun” signal" link="gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun"/>
     <keyword type="struct" name="struct GstOutputSelector" link="gstreamer-plugins-output-selector.html#GstOutputSelector-struct"/>
@@ -132,6 +135,23 @@
     <keyword type="property" name="The “active-pad” property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad"/>
     <keyword type="property" name="The “pad-negotiation-mode” property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode"/>
     <keyword type="property" name="The “resend-latest” property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest"/>
+    <keyword type="struct" name="struct GstQueue2" link="gstreamer-plugins-queue2.html#GstQueue2-struct"/>
+    <keyword type="property" name="The “current-level-buffers” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers"/>
+    <keyword type="property" name="The “current-level-bytes” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes"/>
+    <keyword type="property" name="The “current-level-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-time"/>
+    <keyword type="property" name="The “high-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--high-percent"/>
+    <keyword type="property" name="The “low-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--low-percent"/>
+    <keyword type="property" name="The “max-size-buffers” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers"/>
+    <keyword type="property" name="The “max-size-bytes” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes"/>
+    <keyword type="property" name="The “max-size-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-time"/>
+    <keyword type="property" name="The “ring-buffer-max-size” property" link="gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size"/>
+    <keyword type="property" name="The “temp-location” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-location"/>
+    <keyword type="property" name="The “temp-remove” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-remove"/>
+    <keyword type="property" name="The “temp-template” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-template"/>
+    <keyword type="property" name="The “use-buffering” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-buffering"/>
+    <keyword type="property" name="The “use-rate-estimate” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate"/>
+    <keyword type="property" name="The “avg-in-rate” property" link="gstreamer-plugins-queue2.html#GstQueue2--avg-in-rate"/>
+    <keyword type="signal" name="The “overrun” signal" link="gstreamer-plugins-queue2.html#GstQueue2-overrun"/>
     <keyword type="struct" name="struct GstQueue" link="gstreamer-plugins-queue.html#GstQueue-struct"/>
     <keyword type="enum" name="enum GstQueueLeaky" link="gstreamer-plugins-queue.html#GstQueueLeaky"/>
     <keyword type="property" name="The “current-level-buffers” property" link="gstreamer-plugins-queue.html#GstQueue--current-level-buffers"/>
@@ -150,21 +170,6 @@
     <keyword type="signal" name="The “pushing” signal" link="gstreamer-plugins-queue.html#GstQueue-pushing"/>
     <keyword type="signal" name="The “running” signal" link="gstreamer-plugins-queue.html#GstQueue-running"/>
     <keyword type="signal" name="The “underrun” signal" link="gstreamer-plugins-queue.html#GstQueue-underrun"/>
-    <keyword type="struct" name="struct GstQueue2" link="gstreamer-plugins-queue2.html#GstQueue2-struct"/>
-    <keyword type="property" name="The “current-level-buffers” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers"/>
-    <keyword type="property" name="The “current-level-bytes” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes"/>
-    <keyword type="property" name="The “current-level-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-time"/>
-    <keyword type="property" name="The “high-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--high-percent"/>
-    <keyword type="property" name="The “low-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--low-percent"/>
-    <keyword type="property" name="The “max-size-buffers” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers"/>
-    <keyword type="property" name="The “max-size-bytes” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes"/>
-    <keyword type="property" name="The “max-size-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-time"/>
-    <keyword type="property" name="The “ring-buffer-max-size” property" link="gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size"/>
-    <keyword type="property" name="The “temp-location” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-location"/>
-    <keyword type="property" name="The “temp-remove” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-remove"/>
-    <keyword type="property" name="The “temp-template” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-template"/>
-    <keyword type="property" name="The “use-buffering” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-buffering"/>
-    <keyword type="property" name="The “use-rate-estimate” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate"/>
     <keyword type="struct" name="struct GstStreamidDemux" link="gstreamer-plugins-streamiddemux.html#GstStreamidDemux-struct"/>
     <keyword type="property" name="The “active-pad” property" link="gstreamer-plugins-streamiddemux.html#GstStreamidDemux--active-pad"/>
     <keyword type="struct" name="struct GstTee" link="gstreamer-plugins-tee.html#GstTee-struct"/>
@@ -185,6 +190,13 @@
     <keyword type="property" name="The “drop” property" link="gstreamer-plugins-valve.html#GstValve--drop"/>
     <keyword type="constant" name="GST_CAPS_FILTER_CAPS_CHANGE_MODE_IMMEDIATE" link="gstreamer-plugins-capsfilter.html#GST-CAPS-FILTER-CAPS-CHANGE-MODE-IMMEDIATE:CAPS"/>
     <keyword type="constant" name="GST_CAPS_FILTER_CAPS_CHANGE_MODE_DELAYED" link="gstreamer-plugins-capsfilter.html#GST-CAPS-FILTER-CAPS-CHANGE-MODE-DELAYED:CAPS"/>
+    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NONE" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS"/>
+    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NULL_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS"/>
+    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS"/>
+    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_PLAYING" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS"/>
+    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PLAYING_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS"/>
+    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS"/>
+    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_NULL" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS"/>
     <keyword type="constant" name="FAKE_SRC_DATA_ALLOCATE" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-ALLOCATE:CAPS"/>
     <keyword type="constant" name="FAKE_SRC_DATA_SUBBUFFER" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-SUBBUFFER:CAPS"/>
     <keyword type="constant" name="FAKE_SRC_FILLTYPE_NOTHING" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-NOTHING:CAPS"/>
@@ -203,13 +215,6 @@
     <keyword type="constant" name="FAKE_SRC_SIZETYPE_EMPTY" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-EMPTY:CAPS"/>
     <keyword type="constant" name="FAKE_SRC_SIZETYPE_FIXED" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-FIXED:CAPS"/>
     <keyword type="constant" name="FAKE_SRC_SIZETYPE_RANDOM" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-RANDOM:CAPS"/>
-    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NONE" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS"/>
-    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NULL_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS"/>
-    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS"/>
-    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_PLAYING" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS"/>
-    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PLAYING_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS"/>
-    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS"/>
-    <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_NULL" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS"/>
     <keyword type="constant" name="GST_FILE_SINK_BUFFER_MODE_DEFAULT" link="gstreamer-plugins-filesink.html#GST-FILE-SINK-BUFFER-MODE-DEFAULT:CAPS"/>
     <keyword type="constant" name="GST_FILE_SINK_BUFFER_MODE_FULL" link="gstreamer-plugins-filesink.html#GST-FILE-SINK-BUFFER-MODE-FULL:CAPS"/>
     <keyword type="constant" name="GST_FILE_SINK_BUFFER_MODE_LINE" link="gstreamer-plugins-filesink.html#GST-FILE-SINK-BUFFER-MODE-LINE:CAPS"/>
diff --git a/docs/plugins/html/gstreamer-plugins-downloadbuffer.html b/docs/plugins/html/gstreamer-plugins-downloadbuffer.html
index b02c09d..5352151 100644
--- a/docs/plugins/html/gstreamer-plugins-downloadbuffer.html
+++ b/docs/plugins/html/gstreamer-plugins-downloadbuffer.html
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
 <link rel="prev" href="gstreamer-plugins-concat.html" title="concat">
-<link rel="next" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
+<link rel="next" href="gstreamer-plugins-fakesink.html" title="fakesink">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,7 +22,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="gstreamer-plugins-concat.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-fakesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-fakesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-downloadbuffer"></a><div class="titlepage"></div>
@@ -113,7 +113,7 @@
 <p>With max-size-bytes and max-size-time you can configure the buffering limits.
 The downloadbuffer element will try to read-ahead these amounts of data. When
 the amount of read-ahead data drops below low-percent of the configured max,
-the element will start emiting BUFFERING messages until high-percent of max is
+the element will start emitting BUFFERING messages until high-percent of max is
 reached again.</p>
 <p>The downloadbuffer provides push and pull based scheduling on its source pad
 and will efficiently seek in the upstream element when needed.</p>
diff --git a/docs/plugins/html/gstreamer-plugins-fakesink.html b/docs/plugins/html/gstreamer-plugins-fakesink.html
index 1e45086..cc01fd1 100644
--- a/docs/plugins/html/gstreamer-plugins-fakesink.html
+++ b/docs/plugins/html/gstreamer-plugins-fakesink.html
@@ -6,8 +6,8 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
-<link rel="next" href="gstreamer-plugins-fdsink.html" title="fdsink">
+<link rel="prev" href="gstreamer-plugins-downloadbuffer.html" title="downloadbuffer">
+<link rel="next" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,8 +22,8 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-fakesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-fdsink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-downloadbuffer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-fakesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-fakesink"></a><div class="titlepage"></div>
@@ -142,7 +142,7 @@
 <a name="gstreamer-plugins-fakesink.description"></a><h2>Description</h2>
 <p>Dummy sink that swallows everything.</p>
 <div class="refsect2">
-<a name="id-1.2.6.8.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.5.8.3"></a><h3>Example launch line</h3>
 <div class="informalexample">
   <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
     <tbody>
@@ -158,7 +158,7 @@
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.6.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.5.8.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -184,7 +184,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.6.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.5.8.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -228,7 +228,7 @@
 <a name="GstFakeSinkStateError"></a><h3>enum GstFakeSinkStateError</h3>
 <p>Possible state change errors for the state-error property.</p>
 <div class="refsect3">
-<a name="id-1.2.6.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.5.10.3.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -368,7 +368,7 @@
                <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>     user_data)</pre>
 <p>This signal gets emitted before unreffing the buffer.</p>
 <div class="refsect3">
-<a name="id-1.2.6.12.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.5.12.2.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -411,7 +411,7 @@
                <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>     user_data)</pre>
 <p>This signal gets emitted before unreffing the buffer.</p>
 <div class="refsect3">
-<a name="id-1.2.6.12.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.5.12.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
diff --git a/docs/plugins/html/gstreamer-plugins-fakesrc.html b/docs/plugins/html/gstreamer-plugins-fakesrc.html
index 2596054..46ca1fa 100644
--- a/docs/plugins/html/gstreamer-plugins-fakesrc.html
+++ b/docs/plugins/html/gstreamer-plugins-fakesrc.html
@@ -6,8 +6,8 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-downloadbuffer.html" title="downloadbuffer">
-<link rel="next" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<link rel="prev" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<link rel="next" href="gstreamer-plugins-fdsink.html" title="fdsink">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,8 +22,8 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-downloadbuffer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-fakesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-fakesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-fdsink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-fakesrc"></a><div class="titlepage"></div>
@@ -196,7 +196,7 @@
 <p>It is mostly used as a testing element, one trivial example for testing
 basic <span class="application">GStreamer</span> core functionality is:</p>
 <div class="refsect2">
-<a name="id-1.2.5.8.4"></a><h3>Example launch line</h3>
+<a name="id-1.2.6.8.4"></a><h3>Example launch line</h3>
 <div class="informalexample">
   <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
     <tbody>
@@ -213,7 +213,7 @@
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.5.8.5.1"></a><h3>Element Information</h3>
+<a name="id-1.2.6.8.5.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -239,7 +239,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.5.8.5.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.6.8.5.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -283,7 +283,7 @@
 <a name="GstFakeSrcDataType"></a><h3>enum GstFakeSrcDataType</h3>
 <p>The different ways buffers are allocated.</p>
 <div class="refsect3">
-<a name="id-1.2.5.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.3.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -314,7 +314,7 @@
 <a name="GstFakeSrcFillType"></a><h3>enum GstFakeSrcFillType</h3>
 <p>The different ways of filling the buffers.</p>
 <div class="refsect3">
-<a name="id-1.2.5.10.4.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.4.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -366,7 +366,7 @@
 <a name="GstFakeSrcOutputType"></a><h3>enum GstFakeSrcOutputType</h3>
 <p>The different output types. Unused currently.</p>
 <div class="refsect3">
-<a name="id-1.2.5.10.5.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.5.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -439,7 +439,7 @@
 <a name="GstFakeSrcSizeType"></a><h3>enum GstFakeSrcSizeType</h3>
 <p>The different size of the allocated buffers.</p>
 <div class="refsect3">
-<a name="id-1.2.5.10.6.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.6.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -626,7 +626,7 @@
                <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>    user_data)</pre>
 <p>This signal gets emitted before sending the buffer.</p>
 <div class="refsect3">
-<a name="id-1.2.5.12.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.6.12.2.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
diff --git a/docs/plugins/html/gstreamer-plugins-fdsink.html b/docs/plugins/html/gstreamer-plugins-fdsink.html
index 1dff00f..b61effb 100644
--- a/docs/plugins/html/gstreamer-plugins-fdsink.html
+++ b/docs/plugins/html/gstreamer-plugins-fdsink.html
@@ -6,7 +6,7 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<link rel="prev" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
 <link rel="next" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -22,7 +22,7 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-fakesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-fakesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="gstreamer-plugins-fdsrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
diff --git a/docs/plugins/html/gstreamer-plugins-fdsrc.html b/docs/plugins/html/gstreamer-plugins-fdsrc.html
index 64f7bab..61d4c47 100644
--- a/docs/plugins/html/gstreamer-plugins-fdsrc.html
+++ b/docs/plugins/html/gstreamer-plugins-fdsrc.html
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
 <link rel="prev" href="gstreamer-plugins-fdsink.html" title="fdsink">
-<link rel="next" href="gstreamer-plugins-filesrc.html" title="filesrc">
+<link rel="next" href="gstreamer-plugins-filesink.html" title="filesink">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -23,7 +23,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="gstreamer-plugins-fdsink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-filesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-filesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-fdsrc"></a><div class="titlepage"></div>
diff --git a/docs/plugins/html/gstreamer-plugins-filesink.html b/docs/plugins/html/gstreamer-plugins-filesink.html
index e35ad20..54b7218 100644
--- a/docs/plugins/html/gstreamer-plugins-filesink.html
+++ b/docs/plugins/html/gstreamer-plugins-filesink.html
@@ -6,8 +6,8 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-filesrc.html" title="filesrc">
-<link rel="next" href="gstreamer-plugins-funnel.html" title="funnel">
+<link rel="prev" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
+<link rel="next" href="gstreamer-plugins-filesrc.html" title="filesrc">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,8 +22,8 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-filesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-funnel.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-fdsrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-filesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-filesink"></a><div class="titlepage"></div>
@@ -106,7 +106,7 @@
 <a name="gstreamer-plugins-filesink.description"></a><h2>Description</h2>
 <p>Write incoming data to a file in the local file system.</p>
 <div class="refsect2">
-<a name="id-1.2.10.8.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.9.8.3"></a><h3>Example launch line</h3>
 <div class="informalexample">
   <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
     <tbody>
@@ -122,7 +122,7 @@
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.10.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.9.8.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -148,7 +148,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.10.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.9.8.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -192,7 +192,7 @@
 <a name="GstFileSinkBufferMode"></a><h3>enum GstFileSinkBufferMode</h3>
 <p>File read buffering mode.</p>
 <div class="refsect3">
-<a name="id-1.2.10.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.9.10.3.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
diff --git a/docs/plugins/html/gstreamer-plugins-filesrc.html b/docs/plugins/html/gstreamer-plugins-filesrc.html
index a4b6890..702df05 100644
--- a/docs/plugins/html/gstreamer-plugins-filesrc.html
+++ b/docs/plugins/html/gstreamer-plugins-filesrc.html
@@ -6,8 +6,8 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
-<link rel="next" href="gstreamer-plugins-filesink.html" title="filesink">
+<link rel="prev" href="gstreamer-plugins-filesink.html" title="filesink">
+<link rel="next" href="gstreamer-plugins-funnel.html" title="funnel">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,8 +22,8 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-fdsrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-filesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-filesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-funnel.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-filesrc"></a><div class="titlepage"></div>
@@ -83,7 +83,7 @@
 <a name="gstreamer-plugins-filesrc.description"></a><h2>Description</h2>
 <p>Read data from a file in the local file system.</p>
 <div class="refsect2">
-<a name="id-1.2.9.8.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.10.8.3"></a><h3>Example launch line</h3>
 <div class="informalexample">
   <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
     <tbody>
@@ -99,7 +99,7 @@
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.9.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.10.8.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -125,7 +125,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.9.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.10.8.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gstreamer-plugins-funnel.html b/docs/plugins/html/gstreamer-plugins-funnel.html
index 2f9da4e..7989fed 100644
--- a/docs/plugins/html/gstreamer-plugins-funnel.html
+++ b/docs/plugins/html/gstreamer-plugins-funnel.html
@@ -6,7 +6,7 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-filesink.html" title="filesink">
+<link rel="prev" href="gstreamer-plugins-filesrc.html" title="filesrc">
 <link rel="next" href="gstreamer-plugins-identity.html" title="identity">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -21,7 +21,7 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-filesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-filesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="gstreamer-plugins-identity.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
diff --git a/docs/plugins/html/gstreamer-plugins-identity.html b/docs/plugins/html/gstreamer-plugins-identity.html
index cc0c202..4c625f3 100644
--- a/docs/plugins/html/gstreamer-plugins-identity.html
+++ b/docs/plugins/html/gstreamer-plugins-identity.html
@@ -104,6 +104,11 @@
 <td class="property_name"><a class="link" href="gstreamer-plugins-identity.html#GstIdentity--sync" title="The “sync” property">sync</a></td>
 <td class="property_flags">Read / Write</td>
 </tr>
+<tr>
+<td class="property_type"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html#GstBufferFlags"><span class="type">GstBufferFlags</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-identity.html#GstIdentity--drop-buffer-flags" title="The “drop-buffer-flags” property">drop-buffer-flags</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -342,6 +347,14 @@
 <p>Flags: Read / Write</p>
 <p>Default value: FALSE</p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--drop-buffer-flags"></a><h3>The <code class="literal">“drop-buffer-flags”</code> property</h3>
+<pre class="programlisting">  “drop-buffer-flags”        <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html#GstBufferFlags"><span class="type">GstBufferFlags</span></a></pre>
+<p>Drop buffers with the given flags.</p>
+<p>Flags: Read / Write</p>
+<p class="since">Since: 1.8</p>
+</div>
 </div>
 <div class="refsect1">
 <a name="gstreamer-plugins-identity.signal-details"></a><h2>Signal Details</h2>
diff --git a/docs/plugins/html/gstreamer-plugins-multiqueue.html b/docs/plugins/html/gstreamer-plugins-multiqueue.html
index 5cee73e..6959ce5 100644
--- a/docs/plugins/html/gstreamer-plugins-multiqueue.html
+++ b/docs/plugins/html/gstreamer-plugins-multiqueue.html
@@ -93,6 +93,16 @@
 <td class="property_name"><a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering" title="The “use-buffering” property">use-buffering</a></td>
 <td class="property_flags">Read / Write</td>
 </tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--unlinked-cache-time" title="The “unlinked-cache-time” property">unlinked-cache-time</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-interleave" title="The “use-interleave” property">use-interleave</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -406,6 +416,22 @@
 <p>Flags: Read / Write</p>
 <p>Default value: FALSE</p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--unlinked-cache-time"></a><h3>The <code class="literal">“unlinked-cache-time”</code> property</h3>
+<pre class="programlisting">  “unlinked-cache-time”      <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>Extra buffering in time for unlinked streams (if 'sync-by-running-time').</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 250000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--use-interleave"></a><h3>The <code class="literal">“use-interleave”</code> property</h3>
+<pre class="programlisting">  “use-interleave”           <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Adjust time limits based on input interleave.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
 </div>
 <div class="refsect1">
 <a name="gstreamer-plugins-multiqueue.signal-details"></a><h2>Signal Details</h2>
diff --git a/docs/plugins/html/gstreamer-plugins-output-selector.html b/docs/plugins/html/gstreamer-plugins-output-selector.html
index 7e019f0..7b40b80 100644
--- a/docs/plugins/html/gstreamer-plugins-output-selector.html
+++ b/docs/plugins/html/gstreamer-plugins-output-selector.html
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
 <link rel="prev" href="gstreamer-plugins-multiqueue.html" title="multiqueue">
-<link rel="next" href="gstreamer-plugins-queue.html" title="queue">
+<link rel="next" href="gstreamer-plugins-queue2.html" title="queue2">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,7 +22,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="gstreamer-plugins-multiqueue.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-queue.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-queue2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-output-selector"></a><div class="titlepage"></div>
diff --git a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
index 4760d67..d927a79 100644
--- a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
+++ b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
@@ -41,7 +41,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gstreamer-plugins-queue.html b/docs/plugins/html/gstreamer-plugins-queue.html
index 2536d4d..e7d80b4 100644
--- a/docs/plugins/html/gstreamer-plugins-queue.html
+++ b/docs/plugins/html/gstreamer-plugins-queue.html
@@ -6,8 +6,8 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-output-selector.html" title="output-selector">
-<link rel="next" href="gstreamer-plugins-queue2.html" title="queue2">
+<link rel="prev" href="gstreamer-plugins-queue2.html" title="queue2">
+<link rel="next" href="gstreamer-plugins-streamiddemux.html" title="streamiddemux">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,8 +22,8 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-output-selector.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-queue2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-queue2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-streamiddemux.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-queue"></a><div class="titlepage"></div>
@@ -194,7 +194,7 @@
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.16.8.8.1"></a><h3>Element Information</h3>
+<a name="id-1.2.17.8.8.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -220,7 +220,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.16.8.8.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.17.8.8.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -288,7 +288,7 @@
 <a name="GstQueueLeaky"></a><h3>enum GstQueueLeaky</h3>
 <p>Buffer dropping scheme to avoid the queue to block when full.</p>
 <div class="refsect3">
-<a name="id-1.2.16.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.17.10.3.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -441,7 +441,7 @@
 size) is higher than the boundary values which can be set through the
 GObject properties.</p>
 <div class="refsect3">
-<a name="id-1.2.16.12.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.2.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -473,7 +473,7 @@
 <p>Reports when the queue has enough data to start pushing data again on the
 source pad.</p>
 <div class="refsect3">
-<a name="id-1.2.16.12.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -506,7 +506,7 @@
 together with the underrun signal to pause the pipeline on underrun and
 wait for the queue to fill-up before resume playback.</p>
 <div class="refsect3">
-<a name="id-1.2.16.12.4.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.4.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -540,7 +540,7 @@
 size) is lower than the boundary values which can be set through the
 GObject properties.</p>
 <div class="refsect3">
-<a name="id-1.2.16.12.5.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.5.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
diff --git a/docs/plugins/html/gstreamer-plugins-queue2.html b/docs/plugins/html/gstreamer-plugins-queue2.html
index 0794103..4d04018 100644
--- a/docs/plugins/html/gstreamer-plugins-queue2.html
+++ b/docs/plugins/html/gstreamer-plugins-queue2.html
@@ -6,8 +6,8 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-queue.html" title="queue">
-<link rel="next" href="gstreamer-plugins-streamiddemux.html" title="streamiddemux">
+<link rel="prev" href="gstreamer-plugins-output-selector.html" title="output-selector">
+<link rel="next" href="gstreamer-plugins-queue.html" title="queue">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -17,12 +17,13 @@
 <a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
                   <a href="#gstreamer-plugins-queue2.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
                   <a href="#gstreamer-plugins-queue2.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties">  <span class="dim">|</span> 
-                  <a href="#gstreamer-plugins-queue2.properties" class="shortcut">Properties</a></span>
+                  <a href="#gstreamer-plugins-queue2.properties" class="shortcut">Properties</a></span><span id="nav_signals">  <span class="dim">|</span> 
+                  <a href="#gstreamer-plugins-queue2.signals" class="shortcut">Signals</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-queue.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-streamiddemux.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-output-selector.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-queue.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gstreamer-plugins-queue2"></a><div class="titlepage"></div>
@@ -114,9 +115,29 @@
 <td class="property_name"><a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate" title="The “use-rate-estimate” property">use-rate-estimate</a></td>
 <td class="property_flags">Read / Write</td>
 </tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--avg-in-rate" title="The “avg-in-rate” property">avg-in-rate</a></td>
+<td class="property_flags">Read</td>
+</tr>
 </tbody>
 </table></div>
 </div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table border="0">
+<colgroup>
+<col width="150px" class="signals_return">
+<col width="300px" class="signals_name">
+<col width="200px" class="signals_flags">
+</colgroup>
+<tbody><tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gstreamer-plugins-queue2.html#GstQueue2-overrun" title="The “overrun” signal">overrun</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS">Run First</a></td>
+</tr></tbody>
+</table></div>
+</div>
 <a name="GstQueue2"></a><div class="refsect1">
 <a name="gstreamer-plugins-queue2.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table width="100%" border="0">
@@ -161,7 +182,7 @@
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.17.7.8.1"></a><h3>Element Information</h3>
+<a name="id-1.2.16.8.8.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -187,7 +208,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.17.7.8.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.16.8.8.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -366,6 +387,52 @@
 <p>Flags: Read / Write</p>
 <p>Default value: TRUE</p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--avg-in-rate"></a><h3>The <code class="literal">“avg-in-rate”</code> property</h3>
+<pre class="programlisting">  “avg-in-rate”              <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a></pre>
+<p>The average input data rate.</p>
+<p>Flags: Read</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstQueue2-overrun"></a><h3>The <code class="literal">“overrun”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gstreamer-plugins-queue2.html#GstQueue2"><span class="type">GstQueue2</span></a> *queue,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Reports that the buffer became full (overrun).
+A buffer is full if the total amount of data inside it (num-buffers, time,
+size) is higher than the boundary values which can be set through the
+GObject properties.</p>
+<div class="refsect3">
+<a name="id-1.2.16.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>queue</p></td>
+<td class="parameter_description"><p>the queue2 instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS">Run First</a></p>
+<p class="since">Since: 1.8</p>
+</div>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/plugins/html/gstreamer-plugins-streamiddemux.html b/docs/plugins/html/gstreamer-plugins-streamiddemux.html
index 4c0280e..6c67fb2 100644
--- a/docs/plugins/html/gstreamer-plugins-streamiddemux.html
+++ b/docs/plugins/html/gstreamer-plugins-streamiddemux.html
@@ -6,7 +6,7 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-queue2.html" title="queue2">
+<link rel="prev" href="gstreamer-plugins-queue.html" title="queue">
 <link rel="next" href="gstreamer-plugins-tee.html" title="tee">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -21,7 +21,7 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-queue2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-queue.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="gstreamer-plugins-tee.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
index f81dfbe..6118e2f 100644
--- a/docs/plugins/html/index.html
+++ b/docs/plugins/html/index.html
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Core Plugins 1.0 Plugins Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for GStreamer Core Plugins 1.0 (1.6.2)
+      for GStreamer Core Plugins 1.0 (1.7.1)
       The latest version of this documentation can be found on-line at
       <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/</a>.
     </p></div>
@@ -35,10 +35,10 @@
 <span class="refentrytitle"><a href="gstreamer-plugins-downloadbuffer.html">downloadbuffer</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="gstreamer-plugins-fdsink.html">fdsink</a></span><span class="refpurpose"></span>
@@ -47,10 +47,10 @@
 <span class="refentrytitle"><a href="gstreamer-plugins-fdsrc.html">fdsrc</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="gstreamer-plugins-funnel.html">funnel</a></span><span class="refpurpose"></span>
@@ -68,10 +68,10 @@
 <span class="refentrytitle"><a href="gstreamer-plugins-output-selector.html">output-selector</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
 <span class="refentrytitle"><a href="gstreamer-plugins-streamiddemux.html">streamiddemux</a></span><span class="refpurpose"></span>
diff --git a/docs/plugins/html/index.sgml b/docs/plugins/html/index.sgml
index 4065783..3cde052 100644
--- a/docs/plugins/html/index.sgml
+++ b/docs/plugins/html/index.sgml
@@ -44,6 +44,37 @@
 <ANCHOR id="GstDownloadBuffer--temp-location" href="gstreamer-plugins-1.0/gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-location">
 <ANCHOR id="GstDownloadBuffer--temp-remove" href="gstreamer-plugins-1.0/gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-remove">
 <ANCHOR id="GstDownloadBuffer--temp-template" href="gstreamer-plugins-1.0/gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-template">
+<ANCHOR id="gstreamer-plugins-fakesink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html">
+<ANCHOR id="gstreamer-plugins-fakesink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.properties">
+<ANCHOR id="gstreamer-plugins-fakesink.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signals">
+<ANCHOR id="GstFakeSink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink">
+<ANCHOR id="gstreamer-plugins-fakesink.other" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other">
+<ANCHOR id="gstreamer-plugins-fakesink.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-fakesink.description" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.description">
+<ANCHOR id="gstreamer-plugins-fakesink.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.functions_details">
+<ANCHOR id="gstreamer-plugins-fakesink.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other_details">
+<ANCHOR id="GstFakeSink-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-struct">
+<ANCHOR id="GstFakeSinkStateError" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSinkStateError">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-NONE:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-NULL-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-NULL:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS">
+<ANCHOR id="gstreamer-plugins-fakesink.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.property-details">
+<ANCHOR id="GstFakeSink--can-activate-pull" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull">
+<ANCHOR id="GstFakeSink--can-activate-push" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push">
+<ANCHOR id="GstFakeSink--dump" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--dump">
+<ANCHOR id="GstFakeSink--last-message" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--last-message">
+<ANCHOR id="GstFakeSink--num-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers">
+<ANCHOR id="GstFakeSink--signal-handoffs" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs">
+<ANCHOR id="GstFakeSink--silent" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--silent">
+<ANCHOR id="GstFakeSink--state-error" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--state-error">
+<ANCHOR id="gstreamer-plugins-fakesink.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signal-details">
+<ANCHOR id="GstFakeSink-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-handoff">
+<ANCHOR id="GstFakeSink-preroll-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff">
+<ANCHOR id="gstreamer-plugins-fakesink.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.see-also">
 <ANCHOR id="gstreamer-plugins-fakesrc" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html">
 <ANCHOR id="gstreamer-plugins-fakesrc.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.properties">
 <ANCHOR id="gstreamer-plugins-fakesrc.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.signals">
@@ -97,37 +128,6 @@
 <ANCHOR id="gstreamer-plugins-fakesrc.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.signal-details">
 <ANCHOR id="GstFakeSrc-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff">
 <ANCHOR id="gstreamer-plugins-fakesrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.see-also">
-<ANCHOR id="gstreamer-plugins-fakesink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html">
-<ANCHOR id="gstreamer-plugins-fakesink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.properties">
-<ANCHOR id="gstreamer-plugins-fakesink.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signals">
-<ANCHOR id="GstFakeSink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink">
-<ANCHOR id="gstreamer-plugins-fakesink.other" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other">
-<ANCHOR id="gstreamer-plugins-fakesink.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.object-hierarchy">
-<ANCHOR id="gstreamer-plugins-fakesink.description" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.description">
-<ANCHOR id="gstreamer-plugins-fakesink.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.functions_details">
-<ANCHOR id="gstreamer-plugins-fakesink.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other_details">
-<ANCHOR id="GstFakeSink-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-struct">
-<ANCHOR id="GstFakeSinkStateError" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSinkStateError">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-NONE:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-NULL-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-NULL:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS">
-<ANCHOR id="gstreamer-plugins-fakesink.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.property-details">
-<ANCHOR id="GstFakeSink--can-activate-pull" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull">
-<ANCHOR id="GstFakeSink--can-activate-push" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push">
-<ANCHOR id="GstFakeSink--dump" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--dump">
-<ANCHOR id="GstFakeSink--last-message" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--last-message">
-<ANCHOR id="GstFakeSink--num-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers">
-<ANCHOR id="GstFakeSink--signal-handoffs" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs">
-<ANCHOR id="GstFakeSink--silent" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--silent">
-<ANCHOR id="GstFakeSink--state-error" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--state-error">
-<ANCHOR id="gstreamer-plugins-fakesink.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signal-details">
-<ANCHOR id="GstFakeSink-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-handoff">
-<ANCHOR id="GstFakeSink-preroll-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff">
-<ANCHOR id="gstreamer-plugins-fakesink.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.see-also">
 <ANCHOR id="gstreamer-plugins-fdsink" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsink.html">
 <ANCHOR id="gstreamer-plugins-fdsink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.properties">
 <ANCHOR id="GstFdSink" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsink.html#GstFdSink">
@@ -155,19 +155,6 @@
 <ANCHOR id="GstFdSrc--fd" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsrc.html#GstFdSrc--fd">
 <ANCHOR id="GstFdSrc--timeout" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsrc.html#GstFdSrc--timeout">
 <ANCHOR id="gstreamer-plugins-fdsrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.see-also">
-<ANCHOR id="gstreamer-plugins-filesrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html">
-<ANCHOR id="gstreamer-plugins-filesrc.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.properties">
-<ANCHOR id="GstFileSrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc">
-<ANCHOR id="gstreamer-plugins-filesrc.other" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other">
-<ANCHOR id="gstreamer-plugins-filesrc.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.object-hierarchy">
-<ANCHOR id="gstreamer-plugins-filesrc.implemented-interfaces" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.implemented-interfaces">
-<ANCHOR id="gstreamer-plugins-filesrc.description" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.description">
-<ANCHOR id="gstreamer-plugins-filesrc.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.functions_details">
-<ANCHOR id="gstreamer-plugins-filesrc.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other_details">
-<ANCHOR id="GstFileSrc-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc-struct">
-<ANCHOR id="gstreamer-plugins-filesrc.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.property-details">
-<ANCHOR id="GstFileSrc--location" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc--location">
-<ANCHOR id="gstreamer-plugins-filesrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.see-also">
 <ANCHOR id="gstreamer-plugins-filesink" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html">
 <ANCHOR id="gstreamer-plugins-filesink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.properties">
 <ANCHOR id="GstFileSink" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#GstFileSink">
@@ -189,6 +176,19 @@
 <ANCHOR id="GstFileSink--buffer-size" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#GstFileSink--buffer-size">
 <ANCHOR id="GstFileSink--location" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#GstFileSink--location">
 <ANCHOR id="gstreamer-plugins-filesink.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.see-also">
+<ANCHOR id="gstreamer-plugins-filesrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html">
+<ANCHOR id="gstreamer-plugins-filesrc.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.properties">
+<ANCHOR id="GstFileSrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc">
+<ANCHOR id="gstreamer-plugins-filesrc.other" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other">
+<ANCHOR id="gstreamer-plugins-filesrc.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-filesrc.implemented-interfaces" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.implemented-interfaces">
+<ANCHOR id="gstreamer-plugins-filesrc.description" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.description">
+<ANCHOR id="gstreamer-plugins-filesrc.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.functions_details">
+<ANCHOR id="gstreamer-plugins-filesrc.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other_details">
+<ANCHOR id="GstFileSrc-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc-struct">
+<ANCHOR id="gstreamer-plugins-filesrc.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.property-details">
+<ANCHOR id="GstFileSrc--location" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc--location">
+<ANCHOR id="gstreamer-plugins-filesrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.see-also">
 <ANCHOR id="gstreamer-plugins-funnel" href="gstreamer-plugins-1.0/gstreamer-plugins-funnel.html">
 <ANCHOR id="gstreamer-plugins-funnel.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-funnel.html#gstreamer-plugins-funnel.properties">
 <ANCHOR id="GstFunnel" href="gstreamer-plugins-1.0/gstreamer-plugins-funnel.html#GstFunnel">
@@ -223,6 +223,7 @@
 <ANCHOR id="GstIdentity--single-segment" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--single-segment">
 <ANCHOR id="GstIdentity--sleep-time" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--sleep-time">
 <ANCHOR id="GstIdentity--sync" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--sync">
+<ANCHOR id="GstIdentity--drop-buffer-flags" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--drop-buffer-flags">
 <ANCHOR id="gstreamer-plugins-identity.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#gstreamer-plugins-identity.signal-details">
 <ANCHOR id="GstIdentity-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity-handoff">
 <ANCHOR id="gstreamer-plugins-input-selector" href="gstreamer-plugins-1.0/gstreamer-plugins-input-selector.html">
@@ -265,6 +266,8 @@
 <ANCHOR id="GstMultiQueue--max-size-time" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time">
 <ANCHOR id="GstMultiQueue--sync-by-running-time" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time">
 <ANCHOR id="GstMultiQueue--use-buffering" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering">
+<ANCHOR id="GstMultiQueue--unlinked-cache-time" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--unlinked-cache-time">
+<ANCHOR id="GstMultiQueue--use-interleave" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--use-interleave">
 <ANCHOR id="gstreamer-plugins-multiqueue.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.signal-details">
 <ANCHOR id="GstMultiQueue-overrun" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun">
 <ANCHOR id="GstMultiQueue-underrun" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun">
@@ -287,6 +290,34 @@
 <ANCHOR id="GstOutputSelector--pad-negotiation-mode" href="gstreamer-plugins-1.0/gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode">
 <ANCHOR id="GstOutputSelector--resend-latest" href="gstreamer-plugins-1.0/gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest">
 <ANCHOR id="gstreamer-plugins-output-selector.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.see-also">
+<ANCHOR id="gstreamer-plugins-queue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html">
+<ANCHOR id="gstreamer-plugins-queue2.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.properties">
+<ANCHOR id="gstreamer-plugins-queue2.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.signals">
+<ANCHOR id="GstQueue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2">
+<ANCHOR id="gstreamer-plugins-queue2.other" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other">
+<ANCHOR id="gstreamer-plugins-queue2.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-queue2.description" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.description">
+<ANCHOR id="gstreamer-plugins-queue2.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.functions_details">
+<ANCHOR id="gstreamer-plugins-queue2.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other_details">
+<ANCHOR id="GstQueue2-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2-struct">
+<ANCHOR id="gstreamer-plugins-queue2.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.property-details">
+<ANCHOR id="GstQueue2--current-level-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers">
+<ANCHOR id="GstQueue2--current-level-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes">
+<ANCHOR id="GstQueue2--current-level-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-time">
+<ANCHOR id="GstQueue2--high-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--high-percent">
+<ANCHOR id="GstQueue2--low-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--low-percent">
+<ANCHOR id="GstQueue2--max-size-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers">
+<ANCHOR id="GstQueue2--max-size-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes">
+<ANCHOR id="GstQueue2--max-size-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-time">
+<ANCHOR id="GstQueue2--ring-buffer-max-size" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size">
+<ANCHOR id="GstQueue2--temp-location" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-location">
+<ANCHOR id="GstQueue2--temp-remove" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-remove">
+<ANCHOR id="GstQueue2--temp-template" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-template">
+<ANCHOR id="GstQueue2--use-buffering" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-buffering">
+<ANCHOR id="GstQueue2--use-rate-estimate" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate">
+<ANCHOR id="GstQueue2--avg-in-rate" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--avg-in-rate">
+<ANCHOR id="gstreamer-plugins-queue2.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.signal-details">
+<ANCHOR id="GstQueue2-overrun" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2-overrun">
 <ANCHOR id="gstreamer-plugins-queue" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html">
 <ANCHOR id="gstreamer-plugins-queue.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#gstreamer-plugins-queue.properties">
 <ANCHOR id="gstreamer-plugins-queue.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#gstreamer-plugins-queue.signals">
@@ -319,30 +350,6 @@
 <ANCHOR id="GstQueue-pushing" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#GstQueue-pushing">
 <ANCHOR id="GstQueue-running" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#GstQueue-running">
 <ANCHOR id="GstQueue-underrun" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#GstQueue-underrun">
-<ANCHOR id="gstreamer-plugins-queue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html">
-<ANCHOR id="gstreamer-plugins-queue2.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.properties">
-<ANCHOR id="GstQueue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2">
-<ANCHOR id="gstreamer-plugins-queue2.other" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other">
-<ANCHOR id="gstreamer-plugins-queue2.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.object-hierarchy">
-<ANCHOR id="gstreamer-plugins-queue2.description" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.description">
-<ANCHOR id="gstreamer-plugins-queue2.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.functions_details">
-<ANCHOR id="gstreamer-plugins-queue2.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other_details">
-<ANCHOR id="GstQueue2-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2-struct">
-<ANCHOR id="gstreamer-plugins-queue2.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.property-details">
-<ANCHOR id="GstQueue2--current-level-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers">
-<ANCHOR id="GstQueue2--current-level-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes">
-<ANCHOR id="GstQueue2--current-level-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-time">
-<ANCHOR id="GstQueue2--high-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--high-percent">
-<ANCHOR id="GstQueue2--low-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--low-percent">
-<ANCHOR id="GstQueue2--max-size-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers">
-<ANCHOR id="GstQueue2--max-size-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes">
-<ANCHOR id="GstQueue2--max-size-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-time">
-<ANCHOR id="GstQueue2--ring-buffer-max-size" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size">
-<ANCHOR id="GstQueue2--temp-location" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-location">
-<ANCHOR id="GstQueue2--temp-remove" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-remove">
-<ANCHOR id="GstQueue2--temp-template" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-template">
-<ANCHOR id="GstQueue2--use-buffering" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-buffering">
-<ANCHOR id="GstQueue2--use-rate-estimate" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate">
 <ANCHOR id="gstreamer-plugins-streamiddemux" href="gstreamer-plugins-1.0/gstreamer-plugins-streamiddemux.html">
 <ANCHOR id="gstreamer-plugins-streamiddemux.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-streamiddemux.html#gstreamer-plugins-streamiddemux.properties">
 <ANCHOR id="GstStreamidDemux" href="gstreamer-plugins-1.0/gstreamer-plugins-streamiddemux.html#GstStreamidDemux">
diff --git a/docs/plugins/inspect/plugin-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml
index 87d9f47..821a7b5 100644
--- a/docs/plugins/inspect/plugin-coreelements.xml
+++ b/docs/plugins/inspect/plugin-coreelements.xml
@@ -3,7 +3,7 @@
   <description>GStreamer core elements</description>
   <filename>../../plugins/elements/.libs/libgstcoreelements.so</filename>
   <basename>libgstcoreelements.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gstreamer</source>
   <package>GStreamer source release</package>
diff --git a/docs/plugins/inspect/plugin-coretracers.xml b/docs/plugins/inspect/plugin-coretracers.xml
new file mode 100644
index 0000000..0b4b05d
--- /dev/null
+++ b/docs/plugins/inspect/plugin-coretracers.xml
@@ -0,0 +1,13 @@
+<plugin>
+  <name>coretracers</name>
+  <description>GStreamer core tracers</description>
+  <filename>../../plugins/tracers/.libs/libgstcoretracers.so</filename>
+  <basename>libgstcoretracers.so</basename>
+  <version>1.7.1</version>
+  <license>LGPL</license>
+  <source>gstreamer</source>
+  <package>GStreamer source release</package>
+  <origin>Unknown package origin</origin>
+  <elements>
+  </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/pwg/Makefile.in b/docs/pwg/Makefile.in
index cc71bab..779acb9 100644
--- a/docs/pwg/Makefile.in
+++ b/docs/pwg/Makefile.in
@@ -327,6 +327,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/pwg/building-boiler.xml b/docs/pwg/building-boiler.xml
index fd171ad..5d78123 100644
--- a/docs/pwg/building-boiler.xml
+++ b/docs/pwg/building-boiler.xml
@@ -73,7 +73,7 @@
       and fill in some structures. As mentioned in the previous section, the
       easiest way to do this is to copy a template and add functionality
       according to your needs. To help you do so, there is a tool in the
-      <filename class="directory">./gst-plugins/tools/</filename> directory.
+      <filename class="directory">./gst-plugin/tools/</filename> directory.
       This tool, <filename>make_element</filename>, is a command line utility
       that creates the boilerplate code for you.
     </para>
diff --git a/docs/slides/Makefile.in b/docs/slides/Makefile.in
index c8f61b6..c4ccd26 100644
--- a/docs/slides/Makefile.in
+++ b/docs/slides/Makefile.in
@@ -273,6 +273,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/xsl/Makefile.in b/docs/xsl/Makefile.in
index ca505c0..c89cbe3 100644
--- a/docs/xsl/Makefile.in
+++ b/docs/xsl/Makefile.in
@@ -273,6 +273,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/gst/Makefile.am b/gst/Makefile.am
index 213e3fd..dda710f 100644
--- a/gst/Makefile.am
+++ b/gst/Makefile.am
@@ -115,6 +115,9 @@
 	gsttoc.c		\
 	gsttocsetter.c		\
 	$(GST_TRACE_SRC)	\
+	gsttracer.c		\
+	gsttracerfactory.c	\
+	gsttracerutils.c		\
 	gsttypefind.c		\
 	gsttypefindfactory.c	\
 	gsturi.c		\
@@ -218,6 +221,9 @@
 	gsttaskpool.h		\
 	gsttoc.h		\
 	gsttocsetter.h		\
+	gsttracer.h		\
+	gsttracerfactory.h	\
+	gsttracerutils.h		\
 	gsttypefind.h		\
 	gsttypefindfactory.h	\
 	gsturi.h		\
diff --git a/gst/Makefile.in b/gst/Makefile.in
index 8eebf5d..2b57749 100644
--- a/gst/Makefile.in
+++ b/gst/Makefile.in
@@ -195,7 +195,8 @@
 	gstprotection.c gstquark.c gstquery.c gstregistry.c \
 	gstregistrychunks.c gstsample.c gstsegment.c gststructure.c \
 	gstsystemclock.c gsttaglist.c gsttagsetter.c gsttask.c \
-	gsttaskpool.c gsttoc.c gsttocsetter.c gsttrace.c gsttypefind.c \
+	gsttaskpool.c gsttoc.c gsttocsetter.c gsttrace.c gsttracer.c \
+	gsttracerfactory.c gsttracerutils.c gsttypefind.c \
 	gsttypefindfactory.c gsturi.c gstutils.c gstvalue.c gstparse.c \
 	gstregistrybinary.c
 @GST_DISABLE_TRACE_FALSE@am__objects_1 = libgstreamer_@GST_API_VERSION@_la-gsttrace.lo
@@ -261,6 +262,9 @@
 	libgstreamer_@GST_API_VERSION@_la-gsttoc.lo \
 	libgstreamer_@GST_API_VERSION@_la-gsttocsetter.lo \
 	$(am__objects_1) \
+	libgstreamer_@GST_API_VERSION@_la-gsttracer.lo \
+	libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo \
+	libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo \
 	libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo \
 	libgstreamer_@GST_API_VERSION@_la-gsttypefindfactory.lo \
 	libgstreamer_@GST_API_VERSION@_la-gsturi.lo \
@@ -510,6 +514,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -772,6 +778,9 @@
 	gsttoc.c		\
 	gsttocsetter.c		\
 	$(GST_TRACE_SRC)	\
+	gsttracer.c		\
+	gsttracerfactory.c	\
+	gsttracerutils.c		\
 	gsttypefind.c		\
 	gsttypefindfactory.c	\
 	gsturi.c		\
@@ -877,6 +886,9 @@
 	gsttaskpool.h		\
 	gsttoc.h		\
 	gsttocsetter.h		\
+	gsttracer.h		\
+	gsttracerfactory.h	\
+	gsttracerutils.h		\
 	gsttypefind.h		\
 	gsttypefindfactory.h	\
 	gsturi.h		\
@@ -1067,6 +1079,9 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttoc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttocsetter.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttrace.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefindfactory.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsturi.Plo@am__quote@
@@ -1517,6 +1532,27 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttrace.lo `test -f 'gsttrace.c' || echo '$(srcdir)/'`gsttrace.c
 
+libgstreamer_@GST_API_VERSION@_la-gsttracer.lo: gsttracer.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttracer.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttracer.lo `test -f 'gsttracer.c' || echo '$(srcdir)/'`gsttracer.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsttracer.c' object='libgstreamer_@GST_API_VERSION@_la-gsttracer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttracer.lo `test -f 'gsttracer.c' || echo '$(srcdir)/'`gsttracer.c
+
+libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo: gsttracerfactory.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo `test -f 'gsttracerfactory.c' || echo '$(srcdir)/'`gsttracerfactory.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsttracerfactory.c' object='libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo `test -f 'gsttracerfactory.c' || echo '$(srcdir)/'`gsttracerfactory.c
+
+libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo: gsttracerutils.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo `test -f 'gsttracerutils.c' || echo '$(srcdir)/'`gsttracerutils.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsttracerutils.c' object='libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo `test -f 'gsttracerutils.c' || echo '$(srcdir)/'`gsttracerutils.c
+
 libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo: gsttypefind.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo `test -f 'gsttypefind.c' || echo '$(srcdir)/'`gsttypefind.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Plo
diff --git a/gst/gst.c b/gst/gst.c
index fcd966c..29d737e 100644
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -475,10 +475,6 @@
     GST_DEBUG ("already initialized");
     return TRUE;
   }
-#if !GLIB_CHECK_VERSION(2, 35, 0)
-  g_type_init ();
-#endif
-
 #ifndef GST_DISABLE_GST_DEBUG
   _priv_gst_debug_init ();
   priv_gst_dump_dot_dir = g_getenv ("GST_DEBUG_DUMP_DOT_DIR");
@@ -591,6 +587,7 @@
   g_type_class_ref (gst_pad_get_type ());
   g_type_class_ref (gst_element_factory_get_type ());
   g_type_class_ref (gst_element_get_type ());
+  g_type_class_ref (gst_tracer_factory_get_type ());
   g_type_class_ref (gst_type_find_factory_get_type ());
   g_type_class_ref (gst_bin_get_type ());
   g_type_class_ref (gst_bus_get_type ());
@@ -722,6 +719,10 @@
       GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
   GST_INFO ("initialized GStreamer successfully");
 
+#ifndef GST_DISABLE_GST_DEBUG
+  _priv_gst_tracing_init ();
+#endif
+
   return TRUE;
 }
 
@@ -955,6 +956,9 @@
     GST_DEBUG ("already deinitialized");
     return;
   }
+#ifndef GST_DISABLE_GST_DEBUG
+  _priv_gst_tracing_deinit ();
+#endif
 
   g_thread_pool_set_max_unused_threads (0);
   bin_class = GST_BIN_CLASS (g_type_class_peek (gst_bin_get_type ()));
@@ -988,6 +992,7 @@
   g_type_class_unref (g_type_class_peek (gst_pad_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_element_factory_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_element_get_type ()));
+  g_type_class_unref (g_type_class_peek (gst_tracer_factory_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_type_find_factory_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_bin_get_type ()));
   g_type_class_unref (g_type_class_peek (gst_bus_get_type ()));
diff --git a/gst/gst.h b/gst/gst.h
index 8ebd76c..a9c7dc4 100644
--- a/gst/gst.h
+++ b/gst/gst.h
@@ -77,6 +77,7 @@
 #include <gst/gsttaskpool.h>
 #include <gst/gsttoc.h>
 #include <gst/gsttocsetter.h>
+#include <gst/gsttracerfactory.h>
 #include <gst/gsttypefind.h>
 #include <gst/gsttypefindfactory.h>
 #include <gst/gsturi.h>
diff --git a/gst/gst_private.h b/gst/gst_private.h
index 6de9013..384dc7b 100644
--- a/gst/gst_private.h
+++ b/gst/gst_private.h
@@ -62,6 +62,8 @@
 
 #include "gstdatetime.h"
 
+#include "gsttracerutils.h"
+
 G_BEGIN_DECLS
 
 /* used by gstparse.c and grammar.y */
@@ -393,6 +395,27 @@
   gpointer _gst_reserved[GST_PADDING];
 };
 
+struct _GstTracerFactory {
+  GstPluginFeature              feature;
+  /* <private> */
+
+  GType                         type;
+
+  /*
+  gpointer                      user_data;
+  GDestroyNotify                user_data_notify;
+  */
+
+  gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstTracerFactoryClass {
+  GstPluginFeatureClass         parent;
+  /* <private> */
+
+  gpointer _gst_reserved[GST_PADDING];
+};
+
 struct _GstElementFactory {
   GstPluginFeature      parent;
 
diff --git a/gst/gstallocator.h b/gst/gstallocator.h
index f0e84d8..8293620 100644
--- a/gst/gstallocator.h
+++ b/gst/gstallocator.h
@@ -170,6 +170,10 @@
                                         gsize offset, gsize size, gpointer user_data,
                                         GDestroyNotify notify);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAllocationParams, gst_allocation_params_free)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_ALLOCATOR_H__ */
diff --git a/gst/gstatomicqueue.h b/gst/gstatomicqueue.h
index 3f674c3..a46e6ec 100644
--- a/gst/gstatomicqueue.h
+++ b/gst/gstatomicqueue.h
@@ -53,6 +53,10 @@
 
 guint              gst_atomic_queue_length      (GstAtomicQueue * queue);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAtomicQueue, gst_atomic_queue_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_ATOMIC_QUEUE_H__ */
diff --git a/gst/gstbin.c b/gst/gstbin.c
index 87eac49..4fb1cd9 100644
--- a/gst/gstbin.c
+++ b/gst/gstbin.c
@@ -197,8 +197,6 @@
 
   gboolean posted_eos;
   gboolean posted_playing;
-
-  GList *contexts;
 };
 
 typedef struct
@@ -228,6 +226,9 @@
 
 static gboolean gst_bin_add_func (GstBin * bin, GstElement * element);
 static gboolean gst_bin_remove_func (GstBin * bin, GstElement * element);
+static void gst_bin_update_context (GstBin * bin, GstContext * context);
+static void gst_bin_update_context_unlocked (GstBin * bin,
+    GstContext * context);
 
 #if 0
 static void gst_bin_set_index_func (GstElement * element, GstIndex * index);
@@ -530,8 +531,6 @@
         GST_STR_NULL (GST_OBJECT_NAME (object)));
   }
 
-  g_list_free_full (bin->priv->contexts, (GDestroyNotify) gst_context_unref);
-
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
@@ -1096,7 +1095,7 @@
   gboolean is_sink, is_source, provides_clock, requires_clock;
   GstMessage *clock_message = NULL, *async_message = NULL;
   GstStateChangeReturn ret;
-  GList *l;
+  GList *l, *elem_contexts, *need_context_messages;
 
   GST_DEBUG_OBJECT (bin, "element :%s", GST_ELEMENT_NAME (element));
 
@@ -1168,9 +1167,36 @@
    * a new clock will be selected */
   gst_element_set_clock (element, GST_ELEMENT_CLOCK (bin));
 
-  for (l = bin->priv->contexts; l; l = l->next)
+  /* get the element's list of contexts before propagating our own */
+  elem_contexts = gst_element_get_contexts (element);
+  for (l = GST_ELEMENT_CAST (bin)->contexts; l; l = l->next)
     gst_element_set_context (element, l->data);
 
+  need_context_messages = NULL;
+  for (l = elem_contexts; l; l = l->next) {
+    GstContext *replacement, *context = l->data;
+    const gchar *context_type;
+
+    context_type = gst_context_get_context_type (context);
+
+    /* we already set this context above? */
+    replacement =
+        gst_element_get_context_unlocked (GST_ELEMENT (bin), context_type);
+    if (replacement) {
+      gst_context_unref (replacement);
+    } else {
+      GstMessage *msg;
+      GstStructure *s;
+
+      /* ask our parent for the context */
+      msg = gst_message_new_need_context (GST_OBJECT_CAST (bin), context_type);
+      s = (GstStructure *) gst_message_get_structure (msg);
+      gst_structure_set (s, "bin.old.context", GST_TYPE_CONTEXT, context, NULL);
+
+      need_context_messages = g_list_prepend (need_context_messages, msg);
+    }
+  }
+
 #if 0
   /* set the cached index on the children */
   if (bin->priv->index)
@@ -1209,6 +1235,49 @@
 no_state_recalc:
   GST_OBJECT_UNLOCK (bin);
 
+  for (l = need_context_messages; l; l = l->next) {
+    GstMessage *msg = l->data;
+    GstStructure *s;
+    const gchar *context_type;
+    GstContext *replacement, *context;
+
+    gst_message_parse_context_type (msg, &context_type);
+
+    GST_LOG_OBJECT (bin, "asking parent for context type: %s "
+        "from %" GST_PTR_FORMAT, context_type, element);
+
+    s = (GstStructure *) gst_message_get_structure (msg);
+    gst_structure_get (s, "bin.old.context", GST_TYPE_CONTEXT, &context, NULL);
+    gst_structure_remove_field (s, "bin.old.context");
+    gst_element_post_message (GST_ELEMENT_CAST (bin), msg);
+
+    /* lock to avoid losing a potential write */
+    GST_OBJECT_LOCK (bin);
+    replacement =
+        gst_element_get_context_unlocked (GST_ELEMENT_CAST (bin), context_type);
+
+    if (replacement) {
+      /* we got the context set from GstElement::set_context */
+      gst_context_unref (replacement);
+      GST_OBJECT_UNLOCK (bin);
+    } else {
+      /* Propagate the element's context upwards */
+      GST_LOG_OBJECT (bin, "propagating existing context type: %s %p "
+          "from %" GST_PTR_FORMAT, context_type, context, element);
+
+      gst_bin_update_context_unlocked (bin, context);
+
+      msg =
+          gst_message_new_have_context (GST_OBJECT_CAST (bin),
+          gst_context_ref (context));
+      GST_OBJECT_UNLOCK (bin);
+      gst_element_post_message (GST_ELEMENT_CAST (bin), msg);
+    }
+    gst_context_unref (context);
+  }
+  g_list_free_full (elem_contexts, (GDestroyNotify) gst_context_unref);
+  g_list_free (need_context_messages);
+
   /* post the messages on the bus of the element so that the bin can handle
    * them */
   if (clock_message)
@@ -1301,7 +1370,9 @@
       GST_STR_NULL (GST_ELEMENT_NAME (element)),
       GST_STR_NULL (GST_ELEMENT_NAME (bin)));
 
+  GST_TRACER_BIN_ADD_PRE (bin, element);
   result = bclass->add_element (bin, element);
+  GST_TRACER_BIN_ADD_POST (bin, element, result);
 
   return result;
 
@@ -1625,7 +1696,9 @@
   GST_CAT_DEBUG (GST_CAT_PARENTAGE, "removing element %s from bin %s",
       GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin));
 
+  GST_TRACER_BIN_REMOVE_PRE (bin, element);
   result = bclass->remove_element (bin, element);
+  GST_TRACER_BIN_REMOVE_POST (bin, result);
 
   return result;
 
@@ -2595,14 +2668,18 @@
   switch (next) {
     case GST_STATE_PLAYING:
     {
-      gboolean toplevel;
+      gboolean toplevel, asynchandling;
 
       GST_OBJECT_LOCK (bin);
       toplevel = BIN_IS_TOPLEVEL (bin);
+      asynchandling = bin->priv->asynchandling;
       GST_OBJECT_UNLOCK (bin);
 
       if (toplevel)
         gst_bin_recalculate_latency (bin);
+      if (asynchandling)
+        gst_element_post_message (element,
+            gst_message_new_latency (GST_OBJECT_CAST (element)));
       break;
     }
     case GST_STATE_PAUSED:
@@ -2636,28 +2713,8 @@
       bin_remove_messages (bin, NULL, GST_MESSAGE_ANY);
       GST_OBJECT_UNLOCK (bin);
       if (current == GST_STATE_READY) {
-        GList *l;
-
         if (!(gst_bin_src_pads_activate (bin, FALSE)))
           goto activate_failure;
-
-        /* Remove all non-persistent contexts */
-        GST_OBJECT_LOCK (bin);
-        for (l = bin->priv->contexts; l;) {
-          GstContext *context = l->data;
-
-          if (!gst_context_is_persistent (context)) {
-            GList *next;
-
-            gst_context_unref (context);
-            next = l->next;
-            bin->priv->contexts = g_list_delete_link (bin->priv->contexts, l);
-            l = next;
-          } else {
-            l = l->next;
-          }
-        }
-        GST_OBJECT_UNLOCK (bin);
       }
       break;
     default:
@@ -3366,12 +3423,23 @@
 static void
 gst_bin_update_context (GstBin * bin, GstContext * context)
 {
-  GList *l;
-  const gchar *context_type;
-
   GST_OBJECT_LOCK (bin);
+  gst_bin_update_context_unlocked (bin, context);
+  GST_OBJECT_UNLOCK (bin);
+}
+
+static void
+gst_bin_update_context_unlocked (GstBin * bin, GstContext * context)
+{
+  const gchar *context_type;
+  GList *l, **contexts;
+
+  contexts = &GST_ELEMENT_CAST (bin)->contexts;
   context_type = gst_context_get_context_type (context);
-  for (l = bin->priv->contexts; l; l = l->next) {
+
+  GST_DEBUG_OBJECT (bin, "set context %p %" GST_PTR_FORMAT, context,
+      gst_context_get_structure (context));
+  for (l = *contexts; l; l = l->next) {
     GstContext *tmp = l->data;
     const gchar *tmp_type = gst_context_get_context_type (tmp);
 
@@ -3385,10 +3453,9 @@
     }
   }
   /* Not found? Add */
-  if (l == NULL)
-    bin->priv->contexts =
-        g_list_prepend (bin->priv->contexts, gst_context_ref (context));
-  GST_OBJECT_UNLOCK (bin);
+  if (l == NULL) {
+    *contexts = g_list_prepend (*contexts, gst_context_ref (context));
+  }
 }
 
 /* handle child messages:
@@ -3751,11 +3818,13 @@
     }
     case GST_MESSAGE_NEED_CONTEXT:{
       const gchar *context_type;
-      GList *l;
+      GList *l, *contexts;
 
       gst_message_parse_context_type (message, &context_type);
       GST_OBJECT_LOCK (bin);
-      for (l = bin->priv->contexts; l; l = l->next) {
+      contexts = GST_ELEMENT_CAST (bin)->contexts;
+      GST_LOG_OBJECT (bin, "got need-context message type: %s", context_type);
+      for (l = contexts; l; l = l->next) {
         GstContext *tmp = l->data;
         const gchar *tmp_type = gst_context_get_context_type (tmp);
 
@@ -4149,7 +4218,7 @@
 
   bin = GST_BIN (element);
 
-  gst_bin_update_context (bin, context);
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
 
   children = gst_bin_iterate_elements (bin);
   while (gst_iterator_foreach (children, set_context,
diff --git a/gst/gstbin.h b/gst/gstbin.h
index 33c8d98..c8ffeff 100644
--- a/gst/gstbin.h
+++ b/gst/gstbin.h
@@ -198,6 +198,10 @@
 gboolean        gst_bin_recalculate_latency      (GstBin * bin);
 
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBin, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 
diff --git a/gst/gstbuffer.h b/gst/gstbuffer.h
index 20154aa..f52fe91 100644
--- a/gst/gstbuffer.h
+++ b/gst/gstbuffer.h
@@ -94,6 +94,14 @@
  */
 #define GST_BUFFER_DTS(buf)                     (GST_BUFFER_CAST(buf)->dts)
 /**
+ * GST_BUFFER_DTS_OR_PTS:
+ * @buf: a #GstBuffer.:
+ *
+ * Returns the buffer decoding timestamp (dts) if valid, else the buffer
+ * presentation time (pts)
+ */
+#define GST_BUFFER_DTS_OR_PTS(buf)              (GST_BUFFER_DTS_IS_VALID(buf) ? GST_BUFFER_DTS(buf) : GST_BUFFER_PTS (buf))
+/**
  * GST_BUFFER_DURATION:
  * @buf: a #GstBuffer.
  *
@@ -337,10 +345,6 @@
  *
  * Returns: (transfer full): @buf
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBuffer * gst_buffer_ref (GstBuffer * buf);
-#endif
-
 static inline GstBuffer *
 gst_buffer_ref (GstBuffer * buf)
 {
@@ -354,10 +358,6 @@
  * Decreases the refcount of the buffer. If the refcount reaches 0, the buffer
  * with the associated metadata and memory will be freed.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_buffer_unref (GstBuffer * buf);
-#endif
-
 static inline void
 gst_buffer_unref (GstBuffer * buf)
 {
@@ -377,10 +377,6 @@
  *
  * Returns: (transfer full): a new copy of @buf.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBuffer * gst_buffer_copy (const GstBuffer * buf);
-#endif
-
 static inline GstBuffer *
 gst_buffer_copy (const GstBuffer * buf)
 {
@@ -454,9 +450,24 @@
  * gst_buffer_make_writable:
  * @buf: (transfer full): a #GstBuffer
  *
- * Makes a writable buffer from the given buffer. If the source buffer is
- * already writable, this will simply return the same buffer. A copy will
- * otherwise be made using gst_buffer_copy().
+ * Returns a writable copy of @buf. If the source buffer is
+ * already writable, this will simply return the same buffer.
+ *
+ * Use this function to ensure that a buffer can be safely modified before
+ * making changes to it, including changing the metadata such as PTS/DTS.
+ *
+ * If the reference count of the source buffer @buf is exactly one, the caller
+ * is the sole owner and this function will return the buffer object unchanged.
+ *
+ * If there is more than one reference on the object, a copy will be made using
+ * gst_buffer_copy(). The passed-in @buf will be unreffed in that case, and the
+ * caller will now own a reference to the new returned buffer object. Note
+ * that this just copies the buffer structure itself, the underlying memory is
+ * not copied if it can be shared amongst multiple buffers.
+ *
+ * In short, this function unrefs the buf in the argument and refs the buffer
+ * that it returns. Don't access the argument after calling this function unless
+ * you have an additional reference to it.
  *
  * Returns: (transfer full): a writable buffer which may or may not be the
  *     same as @buf
@@ -479,10 +490,6 @@
  *
  * Returns: %TRUE when @obuf was different from @nbuf.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_buffer_replace (GstBuffer **obuf, GstBuffer *nbuf);
-#endif
-
 static inline gboolean
 gst_buffer_replace (GstBuffer **obuf, GstBuffer *nbuf)
 {
@@ -607,6 +614,14 @@
 GstParentBufferMeta *gst_buffer_add_parent_buffer_meta (GstBuffer *buffer,
     GstBuffer *ref);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBuffer, gst_buffer_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBufferPool, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_BUFFER_H__ */
diff --git a/gst/gstbufferlist.h b/gst/gstbufferlist.h
index 96ea727..0d3315b 100644
--- a/gst/gstbufferlist.h
+++ b/gst/gstbufferlist.h
@@ -73,10 +73,6 @@
  *
  * Returns: (transfer full): @list
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBufferList * gst_buffer_list_ref (GstBufferList * list);
-#endif
-
 static inline GstBufferList *
 gst_buffer_list_ref (GstBufferList * list)
 {
@@ -91,10 +87,6 @@
  * Decreases the refcount of the buffer list. If the refcount reaches 0, the
  * buffer list will be freed.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_buffer_list_unref (GstBufferList * list);
-#endif
-
 static inline void
 gst_buffer_list_unref (GstBufferList * list)
 {
@@ -112,10 +104,6 @@
  *
  * Returns: (transfer full): a new copy of @list.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBufferList * gst_buffer_list_copy (const GstBufferList * list);
-#endif
-
 static inline GstBufferList *
 gst_buffer_list_copy (const GstBufferList * list)
 {
@@ -162,6 +150,10 @@
 
 #define gst_buffer_list_add(l,b) gst_buffer_list_insert((l),-1,(b));
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBufferList, gst_buffer_list_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_BUFFER_LIST_H__ */
diff --git a/gst/gstbus.h b/gst/gstbus.h
index d369682..ed49b2e 100644
--- a/gst/gstbus.h
+++ b/gst/gstbus.h
@@ -179,6 +179,10 @@
 void                    gst_bus_enable_sync_message_emission (GstBus * bus);
 void                    gst_bus_disable_sync_message_emission (GstBus * bus);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBus, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_BUS_H__ */
diff --git a/gst/gstcaps.c b/gst/gstcaps.c
index a8722da..d97bd34 100644
--- a/gst/gstcaps.c
+++ b/gst/gstcaps.c
@@ -951,6 +951,10 @@
  * Discard all but the first structure from @caps. Useful when
  * fixating.
  *
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it if necessary, so you must not use @caps afterwards unless you keep an
+ * additional reference to it with gst_caps_ref().
+ *
  * Returns: (transfer full): truncated caps
  */
 GstCaps *
@@ -1886,7 +1890,9 @@
  * @caps, but contains no lists.  Each list is expanded into separate
  * @GstStructures.
  *
- * This function takes ownership of @caps.
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it so you must not use @caps afterwards unless you keep an additional
+ * reference to it with gst_caps_ref().
  *
  * Returns: (transfer full): the normalized #GstCaps
  */
@@ -2043,6 +2049,10 @@
  * identical are merged.  Component structures that have values that can be
  * merged are also merged.
  *
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it if necessary, so you must not use @caps afterwards unless you keep an
+ * additional reference to it with gst_caps_ref().
+ *
  * This method does not preserve the original order of @caps.
  *
  * Returns: The simplified caps.
@@ -2113,6 +2123,10 @@
  * values. First the caps will be truncated and then the first structure will be
  * fixated with gst_structure_fixate().
  *
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it so you must not use @caps afterwards unless you keep an additional
+ * reference to it with gst_caps_ref().
+ *
  * Returns: (transfer full): the fixated caps
  */
 GstCaps *
diff --git a/gst/gstcaps.h b/gst/gstcaps.h
index 5cd1b78..b9d00dd 100644
--- a/gst/gstcaps.h
+++ b/gst/gstcaps.h
@@ -203,10 +203,6 @@
  *
  * Returns: the same #GstCaps object.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstCaps * gst_caps_ref (GstCaps * caps);
-#endif
-
 static inline GstCaps *
 gst_caps_ref (GstCaps * caps)
 {
@@ -220,10 +216,6 @@
  * Unref a #GstCaps and and free all its structures and the
  * structures' values when the refcount reaches 0.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_caps_unref (GstCaps * caps);
-#endif
-
 static inline void
 gst_caps_unref (GstCaps * caps)
 {
@@ -246,10 +238,6 @@
  *
  * Returns: the new #GstCaps
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstCaps * gst_caps_copy (const GstCaps * caps);
-#endif
-
 static inline GstCaps *
 gst_caps_copy (const GstCaps * caps)
 {
@@ -302,10 +290,6 @@
  *
  * Returns: %TRUE if @new_caps was different from @old_caps
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_caps_replace (GstCaps **old_caps, GstCaps *new_caps);
-#endif
-
 static inline gboolean
 gst_caps_replace (GstCaps **old_caps, GstCaps *new_caps)
 {
@@ -325,10 +309,6 @@
  *
  * Returns: %TRUE if @new_caps was different from @old_caps
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_caps_take (GstCaps **old_caps, GstCaps *new_caps);
-#endif
-
 static inline gboolean
 gst_caps_take (GstCaps **old_caps, GstCaps *new_caps)
 {
@@ -521,6 +501,10 @@
 gchar *           gst_caps_to_string               (const GstCaps *caps) G_GNUC_MALLOC;
 GstCaps *         gst_caps_from_string             (const gchar   *string) G_GNUC_WARN_UNUSED_RESULT;
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCaps, gst_caps_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_CAPS_H__ */
diff --git a/gst/gstcapsfeatures.h b/gst/gstcapsfeatures.h
index 618e43f..ba1e5c5 100644
--- a/gst/gstcapsfeatures.h
+++ b/gst/gstcapsfeatures.h
@@ -79,6 +79,10 @@
 void              gst_caps_features_remove (GstCapsFeatures * features, const gchar * feature);
 void              gst_caps_features_remove_id (GstCapsFeatures * features, GQuark feature);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCapsFeatures, gst_caps_features_free)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_CAPS_FEATURES_H__ */
diff --git a/gst/gstclock.h b/gst/gstclock.h
index cb82831..9c2f888 100644
--- a/gst/gstclock.h
+++ b/gst/gstclock.h
@@ -266,8 +266,16 @@
  *
  * Since: 1.6
  */
-#define GST_STIME_ARGS(t) \
-          ((t) >= 0) ? ' ' : '-', GST_TIME_ARGS (ABS (t))
+#define GST_STIME_ARGS(t)						\
+  ((t) == GST_CLOCK_STIME_NONE || (t) >= 0) ? '+' : '-',		\
+    GST_CLOCK_STIME_IS_VALID (t) ?					\
+    (guint) (((GstClockTime)(ABS(t))) / (GST_SECOND * 60 * 60)) : 99,	\
+    GST_CLOCK_STIME_IS_VALID (t) ?					\
+    (guint) ((((GstClockTime)(ABS(t))) / (GST_SECOND * 60)) % 60) : 99,	\
+    GST_CLOCK_STIME_IS_VALID (t) ?					\
+    (guint) ((((GstClockTime)(ABS(t))) / GST_SECOND) % 60) : 99,	\
+    GST_CLOCK_STIME_IS_VALID (t) ?					\
+    (guint) (((GstClockTime)(ABS(t))) % GST_SECOND) : 999999999
 
 typedef struct _GstClockEntry   GstClockEntry;
 typedef struct _GstClock        GstClock;
@@ -567,6 +575,10 @@
                                                          GstClockTime start_time,
                                                          GstClockTime interval);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstClock, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_CLOCK_H__ */
diff --git a/gst/gstcontext.c b/gst/gstcontext.c
index b535574..a90bd9c 100644
--- a/gst/gstcontext.c
+++ b/gst/gstcontext.c
@@ -49,6 +49,12 @@
  * known context on the element that asks for it if possible. Otherwise the
  * application should provide one if it can.
  *
+ * #GstContext<!-- -->s can be persistent.
+ * A persistent #GstContext is kept in elements when they reach
+ * %GST_STATE_NULL, non-persistent ones will be removed.
+ * Also, a non-persistent context won't override a previous persistent
+ * context set to an element.
+ *
  * Since: 1.2
  */
 
@@ -239,8 +245,8 @@
  * Get a writable version of the structure.
  *
  * Returns: The structure of the context. The structure is still
- * owned by the event, which means that you should not free it and
- * that the pointer becomes invalid when you free the event.
+ * owned by the context, which means that you should not free it and
+ * that the pointer becomes invalid when you free the context.
  * This function checks if @context is writable.
  *
  * Since: 1.2
diff --git a/gst/gstcontext.h b/gst/gstcontext.h
index f1f89f5..d8a126c 100644
--- a/gst/gstcontext.h
+++ b/gst/gstcontext.h
@@ -54,10 +54,6 @@
  *
  * Returns: @context (for convenience when doing assignments)
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstContext * gst_context_ref (GstContext * context);
-#endif
-
 static inline GstContext *
 gst_context_ref (GstContext * context)
 {
@@ -71,10 +67,6 @@
  * Convenience macro to decrease the reference count of the context, possibly
  * freeing it.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_context_unref (GstContext * context);
-#endif
-
 static inline void
 gst_context_unref (GstContext * context)
 {
@@ -92,10 +84,6 @@
  *
  * MT safe
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstContext * gst_context_copy (const GstContext * context);
-#endif
-
 static inline GstContext *
 gst_context_copy (const GstContext * context)
 {
@@ -138,10 +126,6 @@
  *
  * Returns: %TRUE if @new_context was different from @old_context
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_context_replace (GstContext **old_context, GstContext *new_context);
-#endif
-
 static inline gboolean
 gst_context_replace (GstContext **old_context, GstContext *new_context)
 {
@@ -158,6 +142,10 @@
 
 gboolean              gst_context_is_persistent            (const GstContext * context);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstContext, gst_context_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_CONTEXT_H__ */
diff --git a/gst/gstcontrolbinding.h b/gst/gstcontrolbinding.h
index f870d34..2f11f2e 100644
--- a/gst/gstcontrolbinding.h
+++ b/gst/gstcontrolbinding.h
@@ -115,6 +115,10 @@
 
 void                gst_control_binding_set_disabled       (GstControlBinding * binding, gboolean disabled);
 gboolean            gst_control_binding_is_disabled        (GstControlBinding * binding);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstControlBinding, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_CONTROL_BINDING_H__ */
diff --git a/gst/gstcontrolsource.c b/gst/gstcontrolsource.c
index 5165c6b..bb5474e 100644
--- a/gst/gstcontrolsource.c
+++ b/gst/gstcontrolsource.c
@@ -92,7 +92,7 @@
  * gst_control_source_get_value: (method)
  * @self: the #GstControlSource object
  * @timestamp: the time for which the value should be returned
- * @value: the value
+ * @value: (out): the value
  *
  * Gets the value for this #GstControlSource at a given timestamp.
  *
diff --git a/gst/gstcontrolsource.h b/gst/gstcontrolsource.h
index 655205b..b1b5b1b 100644
--- a/gst/gstcontrolsource.h
+++ b/gst/gstcontrolsource.h
@@ -133,6 +133,14 @@
 gboolean       gst_control_source_get_value_array       (GstControlSource *self, GstClockTime timestamp,
                                                          GstClockTime interval, guint n_values,
                                                          gdouble *values);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstControlSource, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstValueArray, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_CONTROL_SOURCE_H__ */
diff --git a/gst/gstdatetime.h b/gst/gstdatetime.h
index f2bfd02..2d579b9 100644
--- a/gst/gstdatetime.h
+++ b/gst/gstdatetime.h
@@ -118,6 +118,10 @@
 
 void            gst_date_time_unref              (GstDateTime * datetime);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDateTime, gst_date_time_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_DATE_TIME_H__ */
diff --git a/gst/gstdebugutils.c b/gst/gstdebugutils.c
index 2e3469e..8b4411d 100644
--- a/gst/gstdebugutils.c
+++ b/gst/gstdebugutils.c
@@ -95,8 +95,8 @@
 }
 
 static gchar *
-debug_dump_get_element_params (GstElement * element,
-    GstDebugGraphDetails details)
+debug_dump_get_object_params (GObject * object,
+    GstDebugGraphDetails details, const char *const *ignored_propnames)
 {
   gchar *param_name = NULL;
   GParamSpec **properties, *property;
@@ -107,10 +107,12 @@
 
   /* get paramspecs and show non-default properties */
   properties =
-      g_object_class_list_properties (G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS
-          (element)), &number_of_properties);
+      g_object_class_list_properties (G_OBJECT_GET_CLASS (object),
+      &number_of_properties);
   if (properties) {
     for (i = 0; i < number_of_properties; i++) {
+      gint j;
+      gboolean ignore = FALSE;
       property = properties[i];
 
       /* skip some properties */
@@ -119,8 +121,16 @@
       if (!strcmp (property->name, "name"))
         continue;
 
+      if (ignored_propnames)
+        for (j = 0; ignored_propnames[j]; j++)
+          if (!g_strcmp0 (ignored_propnames[j], property->name))
+            ignore = TRUE;
+
+      if (ignore)
+        continue;
+
       g_value_init (&value, property->value_type);
-      g_object_get_property (G_OBJECT (element), property->name, &value);
+      g_object_get_property (G_OBJECT (object), property->name, &value);
       if (!(g_param_value_defaults (property, &value))) {
         tmp = g_strdup_value_contents (&value);
         value_str = g_strescape (tmp, NULL);
@@ -166,8 +176,12 @@
 {
   GstPadTemplate *pad_templ;
   GstPadPresence presence;
-  gchar *pad_name;
+  gchar *pad_name, *param_name = NULL;
   const gchar *style_name;
+  static const char *const ignore_propnames[] =
+      { "parent", "direction", "template",
+    "caps", NULL
+  };
   const gchar *spc = MAKE_INDENT (indent);
 
   pad_name = debug_dump_make_object_name (GST_OBJECT (pad));
@@ -183,6 +197,9 @@
       style_name = "filled,dashed";
     }
   }
+
+  param_name =
+      debug_dump_get_object_params (G_OBJECT (pad), details, ignore_propnames);
   if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
     gchar pad_flags[4];
     const gchar *activation_mode = "-><";
@@ -216,16 +233,18 @@
     pad_flags[3] = '\0';
 
     g_string_append_printf (str,
-        "%s  %s_%s [color=black, fillcolor=\"%s\", label=\"%s\\n[%c][%s]%s\", height=\"0.2\", style=\"%s\"];\n",
+        "%s  %s_%s [color=black, fillcolor=\"%s\", label=\"%s%s\\n[%c][%s]%s\", height=\"0.2\", style=\"%s\"];\n",
         spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad),
+        (param_name ? param_name : ""),
         activation_mode[pad->mode], pad_flags, task_mode, style_name);
   } else {
     g_string_append_printf (str,
-        "%s  %s_%s [color=black, fillcolor=\"%s\", label=\"%s\", height=\"0.2\", style=\"%s\"];\n",
+        "%s  %s_%s [color=black, fillcolor=\"%s\", label=\"%s%s\", height=\"0.2\", style=\"%s\"];\n",
         spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad),
-        style_name);
+        (param_name ? param_name : ""), style_name);
   }
 
+  g_free (param_name);
   g_free (pad_name);
 }
 
@@ -555,8 +574,8 @@
           state_name = debug_dump_get_element_state (GST_ELEMENT (element));
         }
         if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
-          param_name = debug_dump_get_element_params (GST_ELEMENT (element),
-              details);
+          param_name = debug_dump_get_object_params (G_OBJECT (element),
+              details, NULL);
         }
         /* elements */
         g_string_append_printf (str, "%ssubgraph cluster_%s {\n", spc,
@@ -682,7 +701,7 @@
     state_name = debug_dump_get_element_state (GST_ELEMENT (bin));
   }
   if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
-    param_name = debug_dump_get_element_params (GST_ELEMENT (bin), details);
+    param_name = debug_dump_get_object_params (G_OBJECT (bin), details, NULL);
   }
 
   /* write header */
diff --git a/gst/gstdebugutils.h b/gst/gstdebugutils.h
index 06618f9..8363e2d 100644
--- a/gst/gstdebugutils.h
+++ b/gst/gstdebugutils.h
@@ -73,10 +73,12 @@
  *
  * To aid debugging applications one can use this method to write out the whole
  * network of gstreamer elements that form the pipeline into an dot file.
- * This file can be processed with graphviz to get an image.
+ * This file can be processed with graphviz to get an image, like this:
  * <informalexample><programlisting>
  *  dot -Tpng -oimage.png graph_lowlevel.dot
  * </programlisting></informalexample>
+ * There is also a utility called xdot which allows you to view the dot file
+ * directly without converting it first.
  *
  * The macro is only active if gstreamer is configured with
  * &quot;--gst-enable-gst-debug&quot; and the environment variable
diff --git a/gst/gstdevice.h b/gst/gstdevice.h
index 79eb908..f50efe2 100644
--- a/gst/gstdevice.h
+++ b/gst/gstdevice.h
@@ -102,6 +102,10 @@
                                                const gchar * classes);
 
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDevice, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_DEVICE_H__ */
diff --git a/gst/gstdevicemonitor.h b/gst/gstdevicemonitor.h
index 4d9c014..5564130 100644
--- a/gst/gstdevicemonitor.h
+++ b/gst/gstdevicemonitor.h
@@ -100,6 +100,10 @@
 void      gst_device_monitor_set_show_all_devices (GstDeviceMonitor * monitor, gboolean show_all);
 gboolean  gst_device_monitor_get_show_all_devices (GstDeviceMonitor * monitor);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDeviceMonitor, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_DEVICE_MONITOR_H__ */
diff --git a/gst/gstdeviceprovider.h b/gst/gstdeviceprovider.h
index 239faeb..a83447d 100644
--- a/gst/gstdeviceprovider.h
+++ b/gst/gstdeviceprovider.h
@@ -144,6 +144,10 @@
 /* factory management */
 GstDeviceProviderFactory * gst_device_provider_get_factory (GstDeviceProvider * provider);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDeviceProvider, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_DEVICE_PROVIDER_H__ */
diff --git a/gst/gstdeviceproviderfactory.h b/gst/gstdeviceproviderfactory.h
index edda736..8c7e24f 100644
--- a/gst/gstdeviceproviderfactory.h
+++ b/gst/gstdeviceproviderfactory.h
@@ -85,6 +85,10 @@
 GList *       gst_device_provider_factory_list_get_device_providers (
                                                        GstRank minrank) G_GNUC_MALLOC;
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDeviceProviderFactory, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_DEVICE_PROVIDER_FACTORY_H__ */
diff --git a/gst/gstelement.c b/gst/gstelement.c
index ccb3734..ce26493 100644
--- a/gst/gstelement.c
+++ b/gst/gstelement.c
@@ -90,6 +90,7 @@
 #include "gstutils.h"
 #include "gstinfo.h"
 #include "gstquark.h"
+#include "gsttracerutils.h"
 #include "gstvalue.h"
 #include "gst-i18n-lib.h"
 #include "glib-compat-private.h"
@@ -119,6 +120,7 @@
 static void gst_element_base_class_init (gpointer g_class);
 static void gst_element_base_class_finalize (gpointer g_class);
 
+static void gst_element_constructed (GObject * object);
 static void gst_element_dispose (GObject * object);
 static void gst_element_finalize (GObject * object);
 
@@ -133,6 +135,8 @@
 static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
 static gboolean gst_element_post_message_default (GstElement * element,
     GstMessage * message);
+static void gst_element_set_context_default (GstElement * element,
+    GstContext * context);
 
 static gboolean gst_element_default_send_event (GstElement * element,
     GstEvent * event);
@@ -229,6 +233,7 @@
 
   gobject_class->dispose = gst_element_dispose;
   gobject_class->finalize = gst_element_finalize;
+  gobject_class->constructed = gst_element_constructed;
 
   klass->change_state = GST_DEBUG_FUNCPTR (gst_element_change_state_func);
   klass->set_state = GST_DEBUG_FUNCPTR (gst_element_set_state_func);
@@ -239,6 +244,7 @@
   klass->send_event = GST_DEBUG_FUNCPTR (gst_element_default_send_event);
   klass->numpadtemplates = 0;
   klass->post_message = GST_DEBUG_FUNCPTR (gst_element_post_message_default);
+  klass->set_context = GST_DEBUG_FUNCPTR (gst_element_set_context_default);
 
   klass->elementfactory = NULL;
 }
@@ -299,6 +305,13 @@
   g_cond_init (&element->state_cond);
 }
 
+static void
+gst_element_constructed (GObject * object)
+{
+  GST_TRACER_ELEMENT_NEW (GST_ELEMENT_CAST (object));
+  G_OBJECT_CLASS (parent_class)->constructed (object);
+}
+
 /**
  * gst_element_release_request_pad:
  * @element: a #GstElement to release the request pad of.
@@ -634,7 +647,7 @@
 gst_element_add_pad (GstElement * element, GstPad * pad)
 {
   gchar *pad_name;
-  gboolean flushing;
+  gboolean active;
 
   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
@@ -644,7 +657,7 @@
   pad_name = g_strdup (GST_PAD_NAME (pad));
   GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "adding pad '%s'",
       GST_STR_NULL (pad_name));
-  flushing = GST_PAD_IS_FLUSHING (pad);
+  active = GST_PAD_IS_ACTIVE (pad);
   GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_NEED_PARENT);
   GST_OBJECT_UNLOCK (pad);
 
@@ -658,16 +671,13 @@
               GST_OBJECT_CAST (element))))
     goto had_parent;
 
-  /* check for flushing pads */
-  if (flushing && (GST_STATE (element) > GST_STATE_READY ||
+  /* check for active pads */
+  if (!active && (GST_STATE (element) > GST_STATE_READY ||
           GST_STATE_NEXT (element) == GST_STATE_PAUSED)) {
-    g_warning ("adding flushing pad '%s' to running element '%s', you need to "
+    g_warning ("adding inactive pad '%s' to running element '%s', you need to "
         "use gst_pad_set_active(pad,TRUE) before adding it.",
         GST_STR_NULL (pad_name), GST_ELEMENT_NAME (element));
-    /* unset flushing */
-    GST_OBJECT_LOCK (pad);
-    GST_PAD_UNSET_FLUSHING (pad);
-    GST_OBJECT_UNLOCK (pad);
+    gst_pad_set_active (pad, TRUE);
   }
 
   g_free (pad_name);
@@ -692,7 +702,7 @@
 
   /* emit the PAD_ADDED signal */
   g_signal_emit (element, gst_element_signals[PAD_ADDED], 0, pad);
-
+  GST_TRACER_ELEMENT_ADD_PAD (element, pad);
   return TRUE;
 
   /* ERROR cases */
@@ -804,7 +814,7 @@
 
   /* emit the PAD_REMOVED signal before unparenting and losing the last ref. */
   g_signal_emit (element, gst_element_signals[PAD_REMOVED], 0, pad);
-
+  GST_TRACER_ELEMENT_REMOVE_PAD (element, pad);
   gst_object_unparent (GST_OBJECT_CAST (pad));
 
   return TRUE;
@@ -1556,13 +1566,13 @@
 
   oclass = GST_ELEMENT_GET_CLASS (element);
 
-  GST_STATE_LOCK (element);
   if (oclass->send_event) {
     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send %s event on element %s",
         GST_EVENT_TYPE_NAME (event), GST_ELEMENT_NAME (element));
     result = oclass->send_event (element, event);
+  } else {
+    gst_event_unref (event);
   }
-  GST_STATE_UNLOCK (element);
 
   return result;
 }
@@ -1653,18 +1663,22 @@
 gst_element_query (GstElement * element, GstQuery * query)
 {
   GstElementClass *klass;
+  gboolean res = FALSE;
 
   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
   g_return_val_if_fail (query != NULL, FALSE);
 
+  GST_TRACER_ELEMENT_QUERY_PRE (element, query);
+
   klass = GST_ELEMENT_GET_CLASS (element);
   if (klass->query) {
     GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send query on element %s",
         GST_ELEMENT_NAME (element));
-    return klass->query (element, query);
+    res = klass->query (element, query);
   }
 
-  return FALSE;
+  GST_TRACER_ELEMENT_QUERY_POST (element, res);
+  return res;
 }
 
 static gboolean
@@ -1721,15 +1735,21 @@
 gst_element_post_message (GstElement * element, GstMessage * message)
 {
   GstElementClass *klass;
+  gboolean res = FALSE;
 
   g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
   g_return_val_if_fail (message != NULL, FALSE);
 
+  GST_TRACER_ELEMENT_POST_MESSAGE_PRE (element, message);
+
   klass = GST_ELEMENT_GET_CLASS (element);
   if (klass->post_message)
-    return klass->post_message (element, message);
+    res = klass->post_message (element, message);
+  else
+    gst_message_unref (message);
 
-  return FALSE;
+  GST_TRACER_ELEMENT_POST_MESSAGE_POST (element, res);
+  return res;
 }
 
 /**
@@ -2599,12 +2619,16 @@
 
   oclass = GST_ELEMENT_GET_CLASS (element);
 
+  GST_TRACER_ELEMENT_CHANGE_STATE_PRE (element, transition);
+
   /* call the state change function so it can set the state */
   if (oclass->change_state)
     ret = (oclass->change_state) (element, transition);
   else
     ret = GST_STATE_CHANGE_FAILURE;
 
+  GST_TRACER_ELEMENT_CHANGE_STATE_POST (element, transition, ret);
+
   switch (ret) {
     case GST_STATE_CHANGE_FAILURE:
       GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
@@ -2816,13 +2840,34 @@
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
-    case GST_STATE_CHANGE_READY_TO_NULL:
+    case GST_STATE_CHANGE_READY_TO_NULL:{
+      GList *l;
+
       /* deactivate pads in both cases, since they are activated on
          ready->paused but the element might not have made it to paused */
       if (!gst_element_pads_activate (element, FALSE)) {
         result = GST_STATE_CHANGE_FAILURE;
       }
+
+      /* Remove all non-persistent contexts */
+      GST_OBJECT_LOCK (element);
+      for (l = element->contexts; l;) {
+        GstContext *context = l->data;
+
+        if (!gst_context_is_persistent (context)) {
+          GList *next;
+
+          gst_context_unref (context);
+          next = l->next;
+          element->contexts = g_list_delete_link (element->contexts, l);
+          l = next;
+        } else {
+          l = l->next;
+        }
+      }
+      GST_OBJECT_UNLOCK (element);
       break;
+    }
     default:
       /* this will catch real but unhandled state changes;
        * can only be caused by:
@@ -2919,6 +2964,7 @@
   bus_p = &element->bus;
   gst_object_replace ((GstObject **) clock_p, NULL);
   gst_object_replace ((GstObject **) bus_p, NULL);
+  g_list_free_full (element->contexts, (GDestroyNotify) gst_context_unref);
   GST_OBJECT_UNLOCK (element);
 
   GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "parent class dispose");
@@ -3029,6 +3075,35 @@
   return result;
 }
 
+static void
+gst_element_set_context_default (GstElement * element, GstContext * context)
+{
+  const gchar *context_type;
+  GList *l;
+
+  GST_OBJECT_LOCK (element);
+  context_type = gst_context_get_context_type (context);
+  for (l = element->contexts; l; l = l->next) {
+    GstContext *tmp = l->data;
+    const gchar *tmp_type = gst_context_get_context_type (tmp);
+
+    /* Always store newest context but never replace
+     * a persistent one by a non-persistent one */
+    if (strcmp (context_type, tmp_type) == 0 &&
+        (gst_context_is_persistent (context) ||
+            !gst_context_is_persistent (tmp))) {
+      gst_context_replace ((GstContext **) & l->data, context);
+      break;
+    }
+  }
+  /* Not found? Add */
+  if (l == NULL) {
+    element->contexts =
+        g_list_prepend (element->contexts, gst_context_ref (context));
+  }
+  GST_OBJECT_UNLOCK (element);
+}
+
 /**
  * gst_element_set_context:
  * @element: a #GstElement to set the context of.
@@ -3054,3 +3129,95 @@
   if (oclass->set_context)
     oclass->set_context (element, context);
 }
+
+/**
+ * gst_element_get_contexts:
+ * @element: a #GstElement to set the context of.
+ *
+ * Gets the contexts set on the element.
+ *
+ * MT safe.
+ *
+ * Returns: (element-type Gst.Context) (transfer full): List of #GstContext
+ *
+ * Since: 1.8
+ */
+GList *
+gst_element_get_contexts (GstElement * element)
+{
+  GList *ret;
+
+  g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+  GST_OBJECT_LOCK (element);
+  ret = g_list_copy_deep (element->contexts, (GCopyFunc) gst_context_ref, NULL);
+  GST_OBJECT_UNLOCK (element);
+
+  return ret;
+}
+
+static gint
+_match_context_type (GstContext * c1, const gchar * context_type)
+{
+  const gchar *c1_type;
+
+  c1_type = gst_context_get_context_type (c1);
+
+  return g_strcmp0 (c1_type, context_type);
+}
+
+/**
+ * gst_element_get_context_unlocked:
+ * @element: a #GstElement to get the context of.
+ * @context_type: a name of a context to retrieve
+ *
+ * Gets the context with @context_type set on the element or NULL.
+ *
+ * Returns: (transfer full): A #GstContext or NULL
+ *
+ * Since: 1.8
+ */
+GstContext *
+gst_element_get_context_unlocked (GstElement * element,
+    const gchar * context_type)
+{
+  GstContext *ret = NULL;
+  GList *node;
+
+  g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+  node =
+      g_list_find_custom (element->contexts, context_type,
+      (GCompareFunc) _match_context_type);
+  if (node && node->data)
+    ret = gst_context_ref (node->data);
+
+  return ret;
+}
+
+/**
+ * gst_element_get_context:
+ * @element: a #GstElement to get the context of.
+ * @context_type: a name of a context to retrieve
+ *
+ * Gets the context with @context_type set on the element or NULL.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): A #GstContext or NULL
+ *
+ * Since: 1.8
+ */
+GstContext *
+gst_element_get_context (GstElement * element, const gchar * context_type)
+{
+  GstContext *ret = NULL;
+
+  g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+  GST_OBJECT_LOCK (element);
+  ret = gst_element_get_context_unlocked (element, context_type);
+  GST_OBJECT_UNLOCK (element);
+
+  return ret;
+}
diff --git a/gst/gstelement.h b/gst/gstelement.h
index 5f45988..0bd92d0 100644
--- a/gst/gstelement.h
+++ b/gst/gstelement.h
@@ -568,8 +568,11 @@
   GList                *sinkpads;
   guint32               pads_cookie;
 
+  /* with object LOCK */
+  GList                *contexts;
+
   /*< private >*/
-  gpointer _gst_reserved[GST_PADDING];
+  gpointer _gst_reserved[GST_PADDING-1];
 };
 
 /**
@@ -745,6 +748,9 @@
 
 /* context */
 void                    gst_element_set_context         (GstElement * element, GstContext * context);
+GList *                 gst_element_get_contexts        (GstElement * element);
+GstContext *            gst_element_get_context         (GstElement * element, const gchar * context_type);
+GstContext *            gst_element_get_context_unlocked (GstElement * element, const gchar * context_type);
 
 /* pad management */
 gboolean                gst_element_add_pad             (GstElement *element, GstPad *pad);
@@ -805,6 +811,10 @@
 /* factory management */
 GstElementFactory*      gst_element_get_factory         (GstElement *element);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstElement, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_ELEMENT_H__ */
diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c
index 486b9fe..22d420f 100644
--- a/gst/gstelementfactory.c
+++ b/gst/gstelementfactory.c
@@ -448,6 +448,7 @@
     goto create_failed;
 
   gst_object_unref (factory);
+
   return element;
 
   /* ERRORS */
diff --git a/gst/gstelementfactory.h b/gst/gstelementfactory.h
index 17e55ce..788f1c7 100644
--- a/gst/gstelementfactory.h
+++ b/gst/gstelementfactory.h
@@ -205,6 +205,10 @@
 GList *       gst_element_factory_list_filter       (GList *list, const GstCaps *caps,
                                                      GstPadDirection direction,
                                                      gboolean subsetonly) G_GNUC_MALLOC;
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstElementFactory, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_ELEMENT_FACTORY_H__ */
diff --git a/gst/gstevent.c b/gst/gstevent.c
index 421682c..baeb0f4 100644
--- a/gst/gstevent.c
+++ b/gst/gstevent.c
@@ -1057,6 +1057,9 @@
             GST_QUARK (DIFF)));
   if (timestamp) {
     gint64 offset = gst_event_get_running_time_offset (event);
+    GstClockTimeDiff diff_ =
+        g_value_get_int64 (gst_structure_id_get_value (structure,
+            GST_QUARK (DIFF)));
 
     *timestamp =
         g_value_get_uint64 (gst_structure_id_get_value (structure,
@@ -1066,6 +1069,11 @@
       *timestamp += offset;
     else
       *timestamp = 0;
+
+    /* Make sure that timestamp + diff is always >= 0. Because
+     * of the running time offset this might not be true */
+    if (diff_ < 0 && *timestamp < -diff_)
+      *timestamp = (GstClockTime) - diff_;
   }
 }
 
diff --git a/gst/gstevent.h b/gst/gstevent.h
index 9fe9bcf..e20c820 100644
--- a/gst/gstevent.h
+++ b/gst/gstevent.h
@@ -291,10 +291,6 @@
  *
  * Returns: %TRUE if @new_event was different from @old_event
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_event_replace (GstEvent **old_event, GstEvent *new_event);
-#endif
-
 static inline gboolean
 gst_event_replace (GstEvent **old_event, GstEvent *new_event)
 {
@@ -311,10 +307,6 @@
  *
  * Returns: the #GstEvent that was in @old_event
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstEvent * gst_event_steal (GstEvent **old_event);
-#endif
-
 static inline GstEvent *
 gst_event_steal (GstEvent **old_event)
 {
@@ -336,10 +328,6 @@
  *
  * Returns: %TRUE if @new_event was different from @old_event
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_event_take (GstEvent **old_event, GstEvent *new_event);
-#endif
-
 static inline gboolean
 gst_event_take (GstEvent **old_event, GstEvent *new_event)
 {
@@ -424,10 +412,6 @@
  *
  * Returns: (transfer full): @event (for convenience when doing assignments)
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstEvent * gst_event_ref (GstEvent * event);
-#endif
-
 static inline GstEvent *
 gst_event_ref (GstEvent * event)
 {
@@ -440,10 +424,6 @@
  *
  * Decrease the refcount of an event, freeing it if the refcount reaches 0.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_event_unref (GstEvent * event);
-#endif
-
 static inline void
 gst_event_unref (GstEvent * event)
 {
@@ -459,10 +439,6 @@
  *
  * Returns: (transfer full): the new event
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstEvent * gst_event_copy (const GstEvent * event);
-#endif
-
 static inline GstEvent *
 gst_event_copy (const GstEvent * event)
 {
@@ -587,6 +563,10 @@
 GstEvent*       gst_event_new_segment_done      (GstFormat format, gint64 position) G_GNUC_MALLOC;
 void            gst_event_parse_segment_done    (GstEvent *event, GstFormat *format, gint64 *position);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstEvent, gst_event_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_EVENT_H__ */
diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h
index cb09031..4e59ec0 100644
--- a/gst/gstghostpad.h
+++ b/gst/gstghostpad.h
@@ -123,6 +123,14 @@
 gboolean         gst_ghost_pad_internal_activate_mode_default   (GstPad * pad, GstObject * parent,
                                                                  GstPadMode mode, gboolean active);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGhostPad, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstProxyPad, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_GHOST_PAD_H__ */
diff --git a/gst/gstinfo.h b/gst/gstinfo.h
index d4678ac..bc7580d 100644
--- a/gst/gstinfo.h
+++ b/gst/gstinfo.h
@@ -250,10 +250,10 @@
  * function signature in C++ code.
  */
 #ifndef GST_FUNCTION
-#if defined (__GNUC__) || (defined (_MSC_VER) && _MSC_VER >= 1300)
-#  define GST_FUNCTION     ((const char*) (__FUNCTION__))
-#elif defined (__STDC__) && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#if defined (__STDC__) && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 #  define GST_FUNCTION     ((const char*) (__func__))
+#elif defined (__GNUC__) || (defined (_MSC_VER) && _MSC_VER >= 1300)
+#  define GST_FUNCTION     ((const char*) (__FUNCTION__))
 #else
 #  define GST_FUNCTION     ((const char*) ("???"))
 #endif
diff --git a/gst/gstiterator.h b/gst/gstiterator.h
index 264f197..6785672 100644
--- a/gst/gstiterator.h
+++ b/gst/gstiterator.h
@@ -268,6 +268,10 @@
 gboolean                gst_iterator_find_custom        (GstIterator *it, GCompareFunc func,
                                                          GValue *elem, gpointer user_data);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstIterator, gst_iterator_free)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_ITERATOR_H__ */
diff --git a/gst/gstmemory.h b/gst/gstmemory.h
index c8b8fd4..5d6edec 100644
--- a/gst/gstmemory.h
+++ b/gst/gstmemory.h
@@ -47,7 +47,7 @@
  * made when this memory needs to be shared between buffers.
  * @GST_MEMORY_FLAG_ZERO_PREFIXED: the memory prefix is filled with 0 bytes
  * @GST_MEMORY_FLAG_ZERO_PADDED: the memory padding is filled with 0 bytes
- * @GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS: the memory is physically contiguous. (Since 2.2)
+ * @GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS: the memory is physically contiguous. (Since 1.2)
  * @GST_MEMORY_FLAG_NOT_MAPPABLE: the memory can't be mapped via gst_memory_map() without any preconditions. (Since 1.2)
  * @GST_MEMORY_FLAG_LAST: first flag that can be used for custom purposes
  *
@@ -323,10 +323,6 @@
  *
  * Returns: (transfer full): @memory (for convenience when doing assignments)
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstMemory * gst_memory_ref (GstMemory * memory);
-#endif
-
 static inline GstMemory *
 gst_memory_ref (GstMemory * memory)
 {
@@ -339,10 +335,6 @@
  *
  * Decrease the refcount of an memory, freeing it if the refcount reaches 0.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_memory_unref (GstMemory * memory);
-#endif
-
 static inline void
 gst_memory_unref (GstMemory * memory)
 {
@@ -370,6 +362,14 @@
 /* span memory */
 gboolean       gst_memory_is_span      (GstMemory *mem1, GstMemory *mem2, gsize *offset);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstMemory, gst_memory_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAllocator, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_MEMORY_H__ */
diff --git a/gst/gstmessage.h b/gst/gstmessage.h
index 133d859..1ea4085 100644
--- a/gst/gstmessage.h
+++ b/gst/gstmessage.h
@@ -337,10 +337,6 @@
  *
  * Returns: @msg (for convenience when doing assignments)
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstMessage * gst_message_ref (GstMessage * msg);
-#endif
-
 static inline GstMessage *
 gst_message_ref (GstMessage * msg)
 {
@@ -354,10 +350,6 @@
  * Convenience macro to decrease the reference count of the message, possibly
  * freeing it.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_message_unref (GstMessage * msg);
-#endif
-
 static inline void
 gst_message_unref (GstMessage * msg)
 {
@@ -375,10 +367,6 @@
  *
  * MT safe
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstMessage * gst_message_copy (const GstMessage * msg);
-#endif
-
 static inline GstMessage *
 gst_message_copy (const GstMessage * msg)
 {
@@ -421,10 +409,6 @@
  *
  * Returns: %TRUE if @new_message was different from @old_message
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_message_replace (GstMessage **old_message, GstMessage *new_message);
-#endif
-
 static inline gboolean
 gst_message_replace (GstMessage **old_message, GstMessage *new_message)
 {
@@ -609,6 +593,10 @@
 void            gst_message_parse_device_removed  (GstMessage * message, GstDevice ** device);
 
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstMessage, gst_message_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_MESSAGE_H__ */
diff --git a/gst/gstobject.h b/gst/gstobject.h
index b478f3b..f5b9b36 100644
--- a/gst/gstobject.h
+++ b/gst/gstobject.h
@@ -265,6 +265,10 @@
 GstClockTime    gst_object_get_control_rate       (GstObject * object);
 void            gst_object_set_control_rate       (GstObject * object, GstClockTime control_rate);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstObject, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_OBJECT_H__ */
diff --git a/gst/gstpad.c b/gst/gstpad.c
index 7f1cb1d..aed3af7 100644
--- a/gst/gstpad.c
+++ b/gst/gstpad.c
@@ -94,6 +94,7 @@
 #include "gstutils.h"
 #include "gstinfo.h"
 #include "gsterror.h"
+#include "gsttracerutils.h"
 #include "gstvalue.h"
 #include "glib-compat-private.h"
 
@@ -1323,6 +1324,13 @@
  * Be notified of different states of pads. The provided callback is called for
  * every state that matches @mask.
  *
+ * Probes are called in groups: First GST_PAD_PROBE_TYPE_BLOCK probes are
+ * called, then others, then finally GST_PAD_PROBE_TYPE_IDLE. The only
+ * exception here are GST_PAD_PROBE_TYPE_IDLE probes that are called
+ * immediately if the pad is already idle while calling gst_pad_add_probe().
+ * In each of the groups, probes are called in the order in which they were
+ * added.
+ *
  * Returns: an id or 0 if no probe is pending. The id can be used to remove the
  * probe with gst_pad_remove_probe(). When using GST_PAD_PROBE_TYPE_IDLE it can
  * happen that the probe can be run immediately and if the probe returns
@@ -1364,7 +1372,7 @@
   PROBE_COOKIE (hook) = (pad->priv->probe_cookie - 1);
 
   /* add the probe */
-  g_hook_prepend (&pad->probes, hook);
+  g_hook_append (&pad->probes, hook);
   pad->num_probes++;
   /* incremenent cookie so that the new hook get's called */
   pad->priv->probe_list_cookie++;
@@ -1818,6 +1826,51 @@
       GST_DEBUG_FUNCPTR_NAME (event));
 }
 
+static gboolean
+event_wrap (GstPad * pad, GstObject * object, GstEvent * event)
+{
+  GstFlowReturn ret;
+
+  ret = GST_PAD_EVENTFULLFUNC (pad) (pad, object, event);
+  if (ret == GST_FLOW_OK)
+    return TRUE;
+  return FALSE;
+}
+
+/**
+ * gst_pad_set_event_full_function:
+ * @p: a #GstPad of either direction.
+ * @f: the #GstPadEventFullFunction to set.
+ *
+ * Calls gst_pad_set_event_full_function_full() with %NULL for the user_data and
+ * notify.
+ */
+/**
+ * gst_pad_set_event_full_function_full:
+ * @pad: a #GstPad of either direction.
+ * @event: the #GstPadEventFullFunction to set.
+ * @user_data: user_data passed to @notify
+ * @notify: notify called when @event will not be used anymore.
+ *
+ * Sets the given event handler for the pad.
+ */
+void
+gst_pad_set_event_full_function_full (GstPad * pad,
+    GstPadEventFullFunction event, gpointer user_data, GDestroyNotify notify)
+{
+  g_return_if_fail (GST_IS_PAD (pad));
+
+  if (pad->eventnotify)
+    pad->eventnotify (pad->eventdata);
+  GST_PAD_EVENTFULLFUNC (pad) = event;
+  GST_PAD_EVENTFUNC (pad) = event_wrap;
+  pad->eventdata = user_data;
+  pad->eventnotify = notify;
+
+  GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "eventfullfunc for set to %s",
+      GST_DEBUG_FUNCPTR_NAME (event));
+}
+
 /**
  * gst_pad_set_query_function:
  * @p: a #GstPad of either direction.
@@ -1986,6 +2039,8 @@
   g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
   g_return_val_if_fail (GST_PAD_IS_SINK (sinkpad), FALSE);
 
+  GST_TRACER_PAD_UNLINK_PRE (srcpad, sinkpad);
+
   GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinking %s:%s(%p) and %s:%s(%p)",
       GST_DEBUG_PAD_NAME (srcpad), srcpad,
       GST_DEBUG_PAD_NAME (sinkpad), sinkpad);
@@ -2053,6 +2108,7 @@
             GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK, parent, FALSE));
     gst_object_unref (parent);
   }
+  GST_TRACER_PAD_UNLINK_POST (srcpad, sinkpad, result);
   return result;
 
   /* ERRORS */
@@ -2494,7 +2550,13 @@
 GstPadLinkReturn
 gst_pad_link (GstPad * srcpad, GstPad * sinkpad)
 {
-  return gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
+  GstPadLinkReturn ret;
+
+  GST_TRACER_PAD_LINK_PRE (srcpad, sinkpad);
+  ret = gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
+  GST_TRACER_PAD_LINK_POST (srcpad, sinkpad, ret);
+
+  return ret;
 }
 
 static void
@@ -2965,7 +3027,7 @@
 gst_pad_query_accept_caps_default (GstPad * pad, GstQuery * query)
 {
   /* get the caps and see if it intersects to something not empty */
-  GstCaps *caps, *allowed;
+  GstCaps *caps, *allowed = NULL;
   gboolean result;
 
   GST_DEBUG_OBJECT (pad, "query accept-caps %" GST_PTR_FORMAT, query);
@@ -2973,19 +3035,22 @@
   /* first forward the query to internally linked pads when we are dealing with
    * a PROXY CAPS */
   if (GST_PAD_IS_PROXY_CAPS (pad)) {
-    if ((result = gst_pad_proxy_query_accept_caps (pad, query))) {
+    result = gst_pad_proxy_query_accept_caps (pad, query);
+    if (result)
+      allowed = gst_pad_get_pad_template_caps (pad);
+    else
       goto done;
-    }
   }
 
-  GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, pad,
-      "fallback ACCEPT_CAPS query, consider implementing a specialized version");
-
   gst_query_parse_accept_caps (query, &caps);
-  if (GST_PAD_IS_ACCEPT_TEMPLATE (pad))
-    allowed = gst_pad_get_pad_template_caps (pad);
-  else
-    allowed = gst_pad_query_caps (pad, caps);
+  if (!allowed) {
+    GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, pad,
+        "fallback ACCEPT_CAPS query, consider implementing a specialized version");
+    if (GST_PAD_IS_ACCEPT_TEMPLATE (pad))
+      allowed = gst_pad_get_pad_template_caps (pad);
+    else
+      allowed = gst_pad_query_caps (pad, caps);
+  }
 
   if (allowed) {
     if (GST_PAD_IS_ACCEPT_INTERSECT (pad)) {
@@ -3813,6 +3878,7 @@
 
   GST_DEBUG_OBJECT (pad, "doing query %p (%s)", query,
       GST_QUERY_TYPE_NAME (query));
+  GST_TRACER_PAD_QUERY_PRE (pad, query);
 
   serialized = GST_QUERY_IS_SERIALIZED (query);
   if (G_UNLIKELY (serialized))
@@ -3835,6 +3901,7 @@
 
   GST_DEBUG_OBJECT (pad, "sent query %p (%s), result %d", query,
       GST_QUERY_TYPE_NAME (query), res);
+  GST_TRACER_PAD_QUERY_POST (pad, res, query);
 
   if (res != TRUE)
     goto query_failed;
@@ -4044,7 +4111,7 @@
   if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PUSH))
     goto wrong_mode;
 
-#ifndef G_DISABLE_ASSERT
+#ifdef GST_ENABLE_EXTRA_CHECKS
   if (G_UNLIKELY (pad->priv->last_cookie != pad->priv->events_cookie)) {
     if (!find_event_by_type (pad, GST_EVENT_STREAM_START, 0)) {
       g_warning (G_STRLOC
@@ -4297,7 +4364,7 @@
   if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PUSH))
     goto wrong_mode;
 
-#ifndef G_DISABLE_ASSERT
+#ifdef GST_ENABLE_EXTRA_CHECKS
   if (G_UNLIKELY (pad->priv->last_cookie != pad->priv->events_cookie)) {
     if (!find_event_by_type (pad, GST_EVENT_STREAM_START, 0)) {
       g_warning (G_STRLOC
@@ -4447,12 +4514,17 @@
 GstFlowReturn
 gst_pad_push (GstPad * pad, GstBuffer * buffer)
 {
+  GstFlowReturn res;
+
   g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
   g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
   g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
 
-  return gst_pad_push_data (pad,
+  GST_TRACER_PAD_PUSH_PRE (pad, buffer);
+  res = gst_pad_push_data (pad,
       GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH, buffer);
+  GST_TRACER_PAD_PUSH_POST (pad, res);
+  return res;
 }
 
 /**
@@ -4482,12 +4554,17 @@
 GstFlowReturn
 gst_pad_push_list (GstPad * pad, GstBufferList * list)
 {
+  GstFlowReturn res;
+
   g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
   g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
   g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
 
-  return gst_pad_push_data (pad,
+  GST_TRACER_PAD_PUSH_LIST_PRE (pad, list);
+  res = gst_pad_push_data (pad,
       GST_PAD_PROBE_TYPE_BUFFER_LIST | GST_PAD_PROBE_TYPE_PUSH, list);
+  GST_TRACER_PAD_PUSH_LIST_POST (pad, res);
+  return res;
 }
 
 static GstFlowReturn
@@ -4751,6 +4828,8 @@
   g_return_val_if_fail (*buffer == NULL || (GST_IS_BUFFER (*buffer)
           && gst_buffer_get_size (*buffer) >= size), GST_FLOW_ERROR);
 
+  GST_TRACER_PAD_PULL_RANGE_PRE (pad, offset, size);
+
   GST_OBJECT_LOCK (pad);
   if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
     goto flushing;
@@ -4797,6 +4876,7 @@
 
   *buffer = res_buf;
 
+  GST_TRACER_PAD_PULL_RANGE_POST (pad, *buffer, ret);
   return ret;
 
   /* ERROR recovery here */
@@ -4806,7 +4886,8 @@
         "pullrange, but pad was flushing");
     pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
     GST_OBJECT_UNLOCK (pad);
-    return GST_FLOW_FLUSHING;
+    ret = GST_FLOW_FLUSHING;
+    goto done;
   }
 wrong_mode:
   {
@@ -4814,7 +4895,8 @@
         GST_DEBUG_PAD_NAME (pad));
     pad->ABI.abi.last_flowret = GST_FLOW_ERROR;
     GST_OBJECT_UNLOCK (pad);
-    return GST_FLOW_ERROR;
+    ret = GST_FLOW_ERROR;
+    goto done;
   }
 probe_stopped:
   {
@@ -4835,7 +4917,7 @@
     }
     pad->ABI.abi.last_flowret = ret;
     GST_OBJECT_UNLOCK (pad);
-    return ret;
+    goto done;
   }
 not_linked:
   {
@@ -4843,7 +4925,8 @@
         "pulling range, but it was not linked");
     pad->ABI.abi.last_flowret = GST_FLOW_NOT_LINKED;
     GST_OBJECT_UNLOCK (pad);
-    return GST_FLOW_NOT_LINKED;
+    ret = GST_FLOW_NOT_LINKED;
+    goto done;
   }
 pull_range_failed:
   {
@@ -4852,7 +4935,7 @@
     GST_CAT_LEVEL_LOG (GST_CAT_SCHEDULING,
         (ret >= GST_FLOW_EOS) ? GST_LEVEL_INFO : GST_LEVEL_WARNING,
         pad, "pullrange failed, flow: %s", gst_flow_get_name (ret));
-    return ret;
+    goto done;
   }
 probe_stopped_unref:
   {
@@ -4868,8 +4951,11 @@
 
     if (*buffer == NULL)
       gst_buffer_unref (res_buf);
-    return ret;
+    goto done;
   }
+done:
+  GST_TRACER_PAD_PULL_RANGE_POST (pad, NULL, ret);
+  return ret;
 }
 
 /* must be called with pad object lock */
@@ -5218,6 +5304,8 @@
   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
   g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
 
+  GST_TRACER_PAD_PUSH_EVENT_PRE (pad, event);
+
   if (GST_PAD_IS_SRC (pad)) {
     if (G_UNLIKELY (!GST_EVENT_IS_DOWNSTREAM (event)))
       goto wrong_direction;
@@ -5272,6 +5360,7 @@
   }
   GST_OBJECT_UNLOCK (pad);
 
+  GST_TRACER_PAD_PUSH_EVENT_POST (pad, res);
   return res;
 
   /* ERROR handling */
@@ -5280,28 +5369,31 @@
     g_warning ("pad %s:%s pushing %s event in wrong direction",
         GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event));
     gst_event_unref (event);
-    return FALSE;
+    goto done;
   }
 unknown_direction:
   {
     g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
     gst_event_unref (event);
-    return FALSE;
+    goto done;
   }
 flushed:
   {
     GST_DEBUG_OBJECT (pad, "We're flushing");
     GST_OBJECT_UNLOCK (pad);
     gst_event_unref (event);
-    return FALSE;
+    goto done;
   }
 eos:
   {
     GST_DEBUG_OBJECT (pad, "We're EOS");
     GST_OBJECT_UNLOCK (pad);
     gst_event_unref (event);
-    return FALSE;
+    goto done;
   }
+done:
+  GST_TRACER_PAD_PUSH_EVENT_POST (pad, FALSE);
+  return FALSE;
 }
 
 /* Check if we can call the event function with the given event */
@@ -5342,6 +5434,7 @@
   GstEventType event_type;
   gboolean serialized, need_unlock = FALSE, sticky;
   GstPadEventFunction eventfunc;
+  GstPadEventFullFunction eventfullfunc = NULL;
   GstObject *parent;
 
   GST_OBJECT_LOCK (pad);
@@ -5439,7 +5532,9 @@
 
   PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, event, probe_stopped);
 
-  if (G_UNLIKELY ((eventfunc = GST_PAD_EVENTFUNC (pad)) == NULL))
+  eventfullfunc = GST_PAD_EVENTFULLFUNC (pad);
+  eventfunc = GST_PAD_EVENTFUNC (pad);
+  if (G_UNLIKELY (eventfunc == NULL && eventfullfunc == NULL))
     goto no_function;
 
   ACQUIRE_PARENT (pad, parent, no_parent);
@@ -5452,7 +5547,9 @@
   if (sticky)
     gst_event_ref (event);
 
-  if (eventfunc (pad, parent, event)) {
+  if (eventfullfunc) {
+    ret = eventfullfunc (pad, parent, event);
+  } else if (eventfunc (pad, parent, event)) {
     ret = GST_FLOW_OK;
   } else {
     /* something went wrong */
diff --git a/gst/gstpad.h b/gst/gstpad.h
index 5f93112..20fd9a2 100644
--- a/gst/gstpad.h
+++ b/gst/gstpad.h
@@ -362,6 +362,26 @@
 typedef gboolean		(*GstPadEventFunction)		(GstPad *pad, GstObject *parent,
                                                                  GstEvent *event);
 
+/**
+ * GstPadEventFullFunction:
+ * @pad: the #GstPad to handle the event.
+ * @parent: (allow-none): the parent of @pad. If the #GST_PAD_FLAG_NEED_PARENT
+ *          flag is set, @parent is guaranteed to be not-%NULL and remain valid
+ *          during the execution of this function.
+ * @event: (transfer full): the #GstEvent to handle.
+ *
+ * Function signature to handle an event for the pad.
+ *
+ * This variant is for specific elements that will take into account the
+ * last downstream flow return (from a pad push), in which case they can
+ * return it.
+ *
+ * Returns: %GST_FLOW_OK if the event was handled properly, or any other
+ * #GstFlowReturn dependent on downstream state.
+ */
+typedef GstFlowReturn		(*GstPadEventFullFunction)	(GstPad *pad, GstObject *parent,
+                                                                 GstEvent *event);
+
 
 /* internal links */
 /**
@@ -756,6 +776,7 @@
     gpointer _gst_reserved[GST_PADDING];
     struct {
       GstFlowReturn last_flowret;
+      GstPadEventFullFunction eventfullfunc;
     } abi;
   } ABI;
 };
@@ -881,6 +902,17 @@
  */
 #define GST_PAD_EVENTFUNC(pad)		(GST_PAD_CAST(pad)->eventfunc)
 /**
+ * GST_PAD_EVENTFULLFUNC:
+ * @pad: a #GstPad
+ *
+ * Get the #GstPadEventFullFunction from the given @pad, which
+ * is the function that handles events on the pad. You can
+ * use this to set your own event handling function on a pad
+ * after you create it.  If your element derives from a base
+ * class, use the base class's virtual functions instead.
+ */
+#define GST_PAD_EVENTFULLFUNC(pad)	(GST_PAD_CAST(pad)->ABI.abi.eventfullfunc)
+/**
  * GST_PAD_QUERYFUNC:
  * @pad: a #GstPad
  *
@@ -1306,6 +1338,10 @@
                                                                  GstPadEventFunction event,
                                                                  gpointer user_data,
                                                                  GDestroyNotify notify);
+void			gst_pad_set_event_full_function_full	(GstPad *pad,
+                                                                 GstPadEventFullFunction event,
+                                                                 gpointer user_data,
+                                                                 GDestroyNotify notify);
 
 #define gst_pad_set_activate_function(p,f)      gst_pad_set_activate_function_full((p),(f),NULL,NULL)
 #define gst_pad_set_activatemode_function(p,f)  gst_pad_set_activatemode_function_full((p),(f),NULL,NULL)
@@ -1313,6 +1349,7 @@
 #define gst_pad_set_chain_list_function(p,f)    gst_pad_set_chain_list_function_full((p),(f),NULL,NULL)
 #define gst_pad_set_getrange_function(p,f)      gst_pad_set_getrange_function_full((p),(f),NULL,NULL)
 #define gst_pad_set_event_function(p,f)         gst_pad_set_event_function_full((p),(f),NULL,NULL)
+#define gst_pad_set_event_full_function(p,f)    gst_pad_set_event_full_function_full((p),(f),NULL,NULL)
 
 /* pad links */
 void			gst_pad_set_link_function_full		(GstPad *pad,
@@ -1396,6 +1433,10 @@
 gboolean		gst_pad_forward                         (GstPad *pad, GstPadForwardFunction forward,
 								 gpointer user_data);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPad, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PAD_H__ */
diff --git a/gst/gstpadtemplate.h b/gst/gstpadtemplate.h
index 636b143..9491647 100644
--- a/gst/gstpadtemplate.h
+++ b/gst/gstpadtemplate.h
@@ -188,6 +188,10 @@
 
 void                    gst_pad_template_pad_created            (GstPadTemplate * templ, GstPad * pad);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPadTemplate, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PAD_TEMPLATE_H__ */
diff --git a/gst/gstparse.h b/gst/gstparse.h
index b1ec83d..c2456c9 100644
--- a/gst/gstparse.h
+++ b/gst/gstparse.h
@@ -113,6 +113,10 @@
                                           GstParseFlags      flags,
                                           GError          ** error) G_GNUC_MALLOC;
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstParseContext, gst_parse_context_free)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PARSE_H__ */
diff --git a/gst/gstpipeline.h b/gst/gstpipeline.h
index 73fdeb4..ee0efe0 100644
--- a/gst/gstpipeline.h
+++ b/gst/gstpipeline.h
@@ -108,6 +108,10 @@
 void            gst_pipeline_set_auto_flush_bus (GstPipeline *pipeline, gboolean auto_flush);
 gboolean        gst_pipeline_get_auto_flush_bus (GstPipeline *pipeline);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPipeline, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PIPELINE_H__ */
diff --git a/gst/gstplugin.c b/gst/gstplugin.c
index 4b7a140..8bdf1b5 100644
--- a/gst/gstplugin.c
+++ b/gst/gstplugin.c
@@ -440,7 +440,7 @@
     gchar **w;
 
     for (w = _plugin_loading_whitelist; *w != NULL; ++w)
-      hash = (hash << 1) ^ g_str_hash (*w);
+      hash ^= g_str_hash (*w);
   }
 
   return hash;
@@ -1492,7 +1492,7 @@
 static guint
 gst_plugin_ext_dep_get_hash_from_stat_entry (GStatBuf * s)
 {
-  if (!(s->st_mode & (S_IFDIR | S_IFREG)))
+  if (!(s->st_mode & (S_IFDIR | S_IFREG | S_IFBLK | S_IFCHR)))
     return (guint) - 1;
 
   /* completely random formula */
@@ -1513,6 +1513,9 @@
     if (((flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX)) &&
         g_str_has_suffix (entry, *filenames)) {
       return TRUE;
+    } else if (((flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX)) &&
+        g_str_has_prefix (entry, *filenames)) {
+      return TRUE;
       /* else it's an exact match that's needed */
     } else if (strcmp (entry, *filenames) == 0) {
       return TRUE;
@@ -1575,7 +1578,7 @@
       continue;
     }
 
-    hash = (hash + fhash) << 1;
+    hash = hash + fhash;
     g_free (full_path);
   }
 
@@ -1589,7 +1592,7 @@
     GstPluginDependencyFlags flags)
 {
   const gchar *empty_filenames[] = { "", NULL };
-  gboolean recurse_into_dirs, partial_names;
+  gboolean recurse_into_dirs, partial_names = FALSE;
   guint i, hash = 0;
 
   /* to avoid special-casing below (FIXME?) */
@@ -1597,7 +1600,10 @@
     filenames = empty_filenames;
 
   recurse_into_dirs = ! !(flags & GST_PLUGIN_DEPENDENCY_FLAG_RECURSE);
-  partial_names = ! !(flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX);
+
+  if ((flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX) ||
+      (flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX))
+    partial_names = TRUE;
 
   /* if we can construct the exact paths to check with the data we have, just
    * stat them one by one; this is more efficient than opening the directory
@@ -1617,7 +1623,7 @@
         fhash = gst_plugin_ext_dep_get_hash_from_stat_entry (&s);
         GST_LOG_OBJECT (plugin, "stat: %s (result: %08x)", full_path, fhash);
       }
-      hash = (hash + fhash) << 1;
+      hash += fhash;
       g_free (full_path);
     }
   } else {
@@ -1661,7 +1667,6 @@
   while ((path = g_queue_pop_head (&scan_paths))) {
     scan_hash += gst_plugin_ext_dep_scan_path_with_filenames (plugin, path,
         (const gchar **) dep->names, dep->flags);
-    scan_hash = scan_hash << 1;
     g_free (path);
   }
 
diff --git a/gst/gstplugin.h b/gst/gstplugin.h
index c76302f..67e8e59 100644
--- a/gst/gstplugin.h
+++ b/gst/gstplugin.h
@@ -93,6 +93,9 @@
  * @GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX : interpret
  *         filename argument as filter suffix and check all matching files in
  *         the directory
+ * @GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX : interpret
+ *         filename argument as filter prefix and check all matching files in
+ *         the directory. Since 1.8.
  *
  * Flags used in connection with gst_plugin_add_dependency().
  */
@@ -100,7 +103,8 @@
   GST_PLUGIN_DEPENDENCY_FLAG_NONE = 0,
   GST_PLUGIN_DEPENDENCY_FLAG_RECURSE = (1 << 0),
   GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY = (1 << 1),
-  GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX = (1 << 2)
+  GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX = (1 << 2),
+  GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX = (1 << 3)
 } GstPluginDependencyFlags;
 
 /**
@@ -354,6 +358,10 @@
 
 void gst_plugin_list_free (GList *list);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPlugin, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PLUGIN_H__ */
diff --git a/gst/gstpluginfeature.h b/gst/gstpluginfeature.h
index 08abb73..38a489d 100644
--- a/gst/gstpluginfeature.h
+++ b/gst/gstpluginfeature.h
@@ -139,6 +139,10 @@
 gint            gst_plugin_feature_rank_compare_func    (gconstpointer p1,
 							 gconstpointer p2);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPluginFeature, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 
diff --git a/gst/gstpreset.c b/gst/gstpreset.c
index 1b42024..12f4cd4 100644
--- a/gst/gstpreset.c
+++ b/gst/gstpreset.c
@@ -42,8 +42,9 @@
  * application specific directory and in the users home directory. When getting
  * a list of presets individual presets are read and overlaid in 1) system, 
  * 2) application and 3) user order. Whenever an earlier entry is newer, the
- * later entries will be updated. 
- * 
+ * later entries will be updated. Since 1.8 you can also provide extra paths
+ * where to find presets through the GST_PRESET_PATH environment variable.
+ * Presets found in those paths will be concidered as "app presets".
  */
 /* FIXME:
  * - non racyness
@@ -365,15 +366,37 @@
     guint64 version_user = G_GUINT64_CONSTANT (0);
     guint64 version = G_GUINT64_CONSTANT (0);
     gboolean merged = FALSE;
-    GKeyFile *in_user, *in_app = NULL, *in_system;
+    GKeyFile *in_user = NULL, *in_app = NULL, *in_system;
 
-    preset_get_paths (preset, &preset_user_path, &preset_app_path,
-        &preset_system_path);
+    const gchar *envvar;
 
     /* try to load the user, app and system presets, we do this to get the
      * versions of all files. */
-    in_user = preset_open_and_parse_header (preset, preset_user_path,
-        &version_user);
+    envvar = g_getenv ("GST_PRESET_PATH");
+    if (envvar) {
+      gint i;
+      gchar **preset_dirs = g_strsplit (envvar, G_SEARCHPATH_SEPARATOR_S, -1);
+
+      for (i = 0; preset_dirs[i]; i++) {
+        gchar *preset_path = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s.prs",
+            preset_dirs[i], G_OBJECT_TYPE_NAME (preset));
+
+        in_user = preset_open_and_parse_header (preset, preset_path,
+            &version_user);
+        g_free (preset_path);
+        if (in_user)
+          break;
+      }
+      g_strfreev (preset_dirs);
+    }
+
+    preset_get_paths (preset, &preset_user_path, &preset_app_path,
+        &preset_system_path);
+    if (!in_user) {
+      in_user = preset_open_and_parse_header (preset, preset_user_path,
+          &version_user);
+    }
+
     if (preset_app_path) {
       in_app = preset_open_and_parse_header (preset, preset_app_path,
           &version_app);
diff --git a/gst/gstquery.c b/gst/gstquery.c
index 2828bd5..72d783d 100644
--- a/gst/gstquery.c
+++ b/gst/gstquery.c
@@ -1820,7 +1820,7 @@
  * gst_query_parse_nth_allocation_meta:
  * @query: a GST_QUERY_ALLOCATION type query #GstQuery
  * @index: position in the metadata API array to read
- * @params: (out) (transfer none) (allow-none): API specific flags
+ * @params: (out) (transfer none) (allow-none): API specific parameters
  *
  * Parse an available query and get the metadata API
  * at @index of the metadata API array.
@@ -1884,8 +1884,8 @@
  * @index: (out) (transfer none) (allow-none): the index
  *
  * Check if @query has metadata @api set. When this function returns %TRUE,
- * @index will contain the index where the requested API and the flags can be
- * found.
+ * @index will contain the index where the requested API and the parameters
+ * can be found.
  *
  * Returns: %TRUE when @api is in the list of metadata.
  */
diff --git a/gst/gstquery.h b/gst/gstquery.h
index 18a075c..9f7353c 100644
--- a/gst/gstquery.h
+++ b/gst/gstquery.h
@@ -210,10 +210,6 @@
  *
  * Returns: @q
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstQuery * gst_query_ref (GstQuery * q);
-#endif
-
 static inline GstQuery *
 gst_query_ref (GstQuery * q)
 {
@@ -227,10 +223,6 @@
  * Decreases the refcount of the query. If the refcount reaches 0, the query
  * will be freed.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_query_unref (GstQuery * q);
-#endif
-
 static inline void
 gst_query_unref (GstQuery * q)
 {
@@ -248,10 +240,6 @@
  *
  * Returns: (transfer full): a new copy of @q.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstQuery * gst_query_copy (const GstQuery * q);
-#endif
-
 static inline GstQuery *
 gst_query_copy (const GstQuery * q)
 {
@@ -290,10 +278,6 @@
  *
  * Returns: %TRUE if @new_query was different from @old_query
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_query_replace (GstQuery **old_query, GstQuery *new_query);
-#endif
-
 static inline gboolean
 gst_query_replace (GstQuery **old_query, GstQuery *new_query)
 {
@@ -495,6 +479,10 @@
 void            gst_query_set_context              (GstQuery *query, GstContext *context);
 void            gst_query_parse_context            (GstQuery *query, GstContext **context);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstQuery, gst_query_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_QUERY_H__ */
diff --git a/gst/gstregistry.h b/gst/gstregistry.h
index d0a665b..d72f497 100644
--- a/gst/gstregistry.h
+++ b/gst/gstregistry.h
@@ -99,6 +99,10 @@
                                                             guint        min_minor,
                                                             guint        min_micro);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstRegistry, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_REGISTRY_H__ */
diff --git a/gst/gstregistrybinary.h b/gst/gstregistrybinary.h
index f1102c7..22e56d1 100644
--- a/gst/gstregistrybinary.h
+++ b/gst/gstregistrybinary.h
@@ -55,7 +55,7 @@
  * This _must_ be updated whenever the registry format changes,
  * we currently use the core version where this change happened.
  */
-#define GST_MAGIC_BINARY_VERSION_STR "1.0.0"
+#define GST_MAGIC_BINARY_VERSION_STR "1.3.0"
 
 /*
  * GST_MAGIC_BINARY_VERSION_LEN:
diff --git a/gst/gstregistrychunks.c b/gst/gstregistrychunks.c
index f854865..7712fcf 100644
--- a/gst/gstregistrychunks.c
+++ b/gst/gstregistrychunks.c
@@ -31,6 +31,7 @@
 #include <gst/gst_private.h>
 #include <gst/gstconfig.h>
 #include <gst/gstelement.h>
+#include <gst/gsttracerfactory.h>
 #include <gst/gsttypefind.h>
 #include <gst/gsttypefindfactory.h>
 #include <gst/gstdeviceproviderfactory.h>
@@ -350,6 +351,13 @@
     /* pack element metadata strings */
     gst_registry_chunks_save_string (list,
         gst_structure_to_string (factory->metadata));
+  } else if (GST_IS_TRACER_FACTORY (feature)) {
+    /* Initialize with zeroes because of struct padding and
+     * valgrind complaining about copying unitialized memory
+     */
+    pf = g_slice_new0 (GstRegistryChunkPluginFeature);
+    pf_size = sizeof (GstRegistryChunkPluginFeature);
+    chk = gst_registry_chunks_make_data (pf, pf_size);
   } else {
     GST_WARNING_OBJECT (feature, "unhandled feature type '%s'", type_name);
   }
@@ -677,6 +685,7 @@
     GST_DEBUG
         ("Reading/casting for GstRegistryChunkPluginFeature at address %p",
         *in);
+
     unpack_element (*in, dmf, GstRegistryChunkDeviceProviderFactory, end, fail);
 
     pf = (GstRegistryChunkPluginFeature *) dmf;
@@ -692,6 +701,12 @@
         goto fail;
       }
     }
+  } else if (GST_IS_TRACER_FACTORY (feature)) {
+    align (*in);
+    GST_DEBUG
+        ("Reading/casting for GstRegistryChunkPluginFeature at address %p",
+        *in);
+    unpack_element (*in, pf, GstRegistryChunkPluginFeature, end, fail);
   } else {
     GST_WARNING ("unhandled factory type : %s", G_OBJECT_TYPE_NAME (feature));
     goto fail;
diff --git a/gst/gstsample.h b/gst/gstsample.h
index 71f48ee..6637fa3 100644
--- a/gst/gstsample.h
+++ b/gst/gstsample.h
@@ -71,10 +71,6 @@
  *
  * Returns: (transfer full): @sample
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstSample * gst_sample_ref (GstSample * sample);
-#endif
-
 static inline GstSample *
 gst_sample_ref (GstSample * sample)
 {
@@ -89,10 +85,6 @@
  * Decreases the refcount of the sample. If the refcount reaches 0, the
  * sample will be freed.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_sample_unref (GstSample * sample);
-#endif
-
 static inline void
 gst_sample_unref (GstSample * sample)
 {
@@ -111,10 +103,6 @@
  *
  * Since: 1.2
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstSample * gst_sample_copy (const GstSample * buf);
-#endif
-
 static inline GstSample *
 gst_sample_copy (const GstSample * buf)
 {
@@ -149,6 +137,10 @@
  */
 #define         gst_value_get_sample(v)         GST_SAMPLE_CAST (g_value_get_boxed(v))
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstSample, gst_sample_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_SAMPLE_H__ */
diff --git a/gst/gstsegment.c b/gst/gstsegment.c
index 2594d53..fbb71e3 100644
--- a/gst/gstsegment.c
+++ b/gst/gstsegment.c
@@ -375,6 +375,114 @@
 }
 
 /**
+ * gst_segment_to_stream_time_full:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @position: the position in the segment
+ * @stream_time: result stream-time
+ *
+ * Translate @position to the total stream time using the currently configured
+ * segment. Compared to gst_segment_to_stream_time() this function can return
+ * negative stream-time.
+ *
+ * This function is typically used by elements that need to synchronize buffers
+ * against the clock or eachother.
+ *
+ * @position can be any value and the result of this function for values outside
+ * of the segment is extrapolated.
+ *
+ * When 1 is returned, @position resulted in a positive stream-time returned
+ * in @stream_time.
+ *
+ * When this function returns -1, the returned @stream_time should be negated
+ * to get the real negative stream time.
+ *
+ * Returns: a 1 or -1 on success, 0 on failure.
+ *
+ * Since: 1.8
+ */
+gint
+gst_segment_to_stream_time_full (const GstSegment * segment, GstFormat format,
+    guint64 position, guint64 * stream_time)
+{
+  guint64 start, stop, time;
+  gdouble abs_applied_rate;
+  gint res;
+
+  /* format does not matter for -1 */
+  if (G_UNLIKELY (position == -1)) {
+    *stream_time = -1;
+    return 0;
+  }
+
+  g_return_val_if_fail (segment != NULL, 0);
+  g_return_val_if_fail (segment->format == format, 0);
+
+  stop = segment->stop;
+
+  start = segment->start;
+  time = segment->time;
+
+  /* time must be known */
+  if (G_UNLIKELY (time == -1))
+    return 0;
+
+  abs_applied_rate = ABS (segment->applied_rate);
+
+  /* add or subtract from segment time based on applied rate */
+  if (G_LIKELY (segment->applied_rate > 0.0)) {
+    if (G_LIKELY (position > start)) {
+      /* bring to uncorrected position in segment */
+      *stream_time = position - start;
+      /* correct for applied rate if needed */
+      if (G_UNLIKELY (abs_applied_rate != 1.0))
+        *stream_time *= abs_applied_rate;
+      /* correct for segment time */
+      *stream_time += time;
+      res = 1;
+    } else {
+      *stream_time = start - position;
+      if (G_UNLIKELY (abs_applied_rate != 1.0))
+        *stream_time *= abs_applied_rate;
+      if (*stream_time > time) {
+        *stream_time -= time;
+        res = -1;
+      } else {
+        *stream_time = time - *stream_time;
+        res = 1;
+      }
+    }
+  } else {
+    /* correct for segment time. Streams with a negative applied_rate
+     * have timestamps between start and stop, as usual, but have the
+     * time member starting high and going backwards.  */
+    /* cannot continue without a known segment stop */
+    if (G_UNLIKELY (stop == -1))
+      return 0;
+    if (G_UNLIKELY (position > stop)) {
+      *stream_time = position - stop;
+      if (G_UNLIKELY (abs_applied_rate != 1.0))
+        *stream_time *= abs_applied_rate;
+      if (*stream_time > time) {
+        *stream_time -= time;
+        res = -1;
+      } else {
+        *stream_time = time - *stream_time;
+        res = 1;
+      }
+    } else {
+      *stream_time = stop - position;
+      if (G_UNLIKELY (abs_applied_rate != 1.0))
+        *stream_time *= abs_applied_rate;
+      *stream_time += time;
+      res = 1;
+    }
+  }
+
+  return res;
+}
+
+/**
  * gst_segment_to_stream_time:
  * @segment: a #GstSegment structure.
  * @format: the format of the segment.
@@ -393,65 +501,194 @@
  *
  * Returns: the position in stream_time or -1 when an invalid position
  * was given.
+ *
+ * Since: 1.8
  */
 guint64
 gst_segment_to_stream_time (const GstSegment * segment, GstFormat format,
     guint64 position)
 {
-  guint64 stream_time, start, stop, time;
-  gdouble abs_applied_rate;
-
-  /* format does not matter for -1 */
-  if (G_UNLIKELY (position == -1))
-    return -1;
+  guint64 result;
 
   g_return_val_if_fail (segment != NULL, -1);
   g_return_val_if_fail (segment->format == format, -1);
 
-  stop = segment->stop;
-
-  /* outside of the segment boundary stop */
-  if (G_UNLIKELY (stop != -1 && position > stop))
+  /* before the segment boundary */
+  if (G_UNLIKELY (position < segment->start)) {
+    GST_DEBUG ("position(%" G_GUINT64_FORMAT ") < start(%" G_GUINT64_FORMAT
+        ")", position, segment->start);
     return -1;
+  }
+  /* after the segment boundary */
+  if (G_UNLIKELY (segment->stop != -1 && position > segment->stop)) {
+    GST_DEBUG ("position(%" G_GUINT64_FORMAT ") > stop(%" G_GUINT64_FORMAT
+        ")", position, segment->stop);
+    return -1;
+  }
+
+  if (gst_segment_to_stream_time_full (segment, format, position, &result) == 1)
+    return result;
+
+  return -1;
+}
+
+/**
+ * gst_segment_position_from_stream_time_full:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @stream_time: the stream-time
+ * @position: the resulting position in the segment
+ *
+ * Translate @stream_time to the segment position using the currently configured
+ * segment. Compared to gst_segment_position_from_stream_time() this function can
+ * return negative segment position.
+ *
+ * This function is typically used by elements that need to synchronize buffers
+ * against the clock or each other.
+ *
+ * @stream_time can be any value and the result of this function for values outside
+ * of the segment is extrapolated.
+ *
+ * When 1 is returned, @stream_time resulted in a positive position returned
+ * in @position.
+ *
+ * When this function returns -1, the returned @position should be negated
+ * to get the real negative segment position.
+ *
+ * Returns: a 1 or -1 on success, 0 on failure.
+ *
+ * Since: 1.8
+ */
+gint
+gst_segment_position_from_stream_time_full (const GstSegment * segment,
+    GstFormat format, guint64 stream_time, guint64 * position)
+{
+  guint64 start, time;
+  gdouble abs_applied_rate;
+  gint res;
+
+  /* format does not matter for -1 */
+  if (G_UNLIKELY (stream_time == -1)) {
+    *position = -1;
+    return 0;
+  }
+
+  g_return_val_if_fail (segment != NULL, -1);
+  g_return_val_if_fail (segment->format == format, -1);
 
   start = segment->start;
-
-  /* before the segment boundary */
-  if (G_UNLIKELY (position < start))
-    return -1;
-
   time = segment->time;
 
   /* time must be known */
   if (G_UNLIKELY (time == -1))
-    return -1;
+    return 0;
 
   abs_applied_rate = ABS (segment->applied_rate);
 
-  /* add or subtract from segment time based on applied rate */
   if (G_LIKELY (segment->applied_rate > 0.0)) {
-    if (G_UNLIKELY (position < start))
-      return -1;
-    /* bring to uncorrected position in segment */
-    stream_time = position - start;
+    if (G_LIKELY (stream_time > time)) {
+      res = 1;
+      *position = stream_time - time;
+    } else {
+      res = -1;
+      *position = time - stream_time;
+    }
     /* correct for applied rate if needed */
     if (G_UNLIKELY (abs_applied_rate != 1.0))
-      stream_time *= abs_applied_rate;
-    /* correct for segment time */
-    stream_time += time;
+      *position /= abs_applied_rate;
+
+    if (G_UNLIKELY (res == -1)) {
+      if (*position > start) {
+        *position -= start;
+      } else {
+        *position = start - *position;
+        res = 1;
+      }
+    } else {
+      *position += start;
+    }
   } else {
-    /* correct for segment time, clamp at 0. Streams with a negative
-     * applied_rate have timestamps between start and stop, as usual, but have
-     * the time member starting high and going backwards.  */
-    if (G_UNLIKELY (position > stop))
-      return -1;
-    stream_time = stop - position;
+    GstClockTime stop = segment->stop;
+    /* cannot continue without a known segment stop */
+    if (G_UNLIKELY (stop == -1))
+      return 0;
+    if (G_UNLIKELY (time > stream_time)) {
+      res = -1;
+      *position = time - stream_time;
+    } else {
+      res = 1;
+      *position = stream_time - time;
+    }
     if (G_UNLIKELY (abs_applied_rate != 1.0))
-      stream_time *= abs_applied_rate;
-    stream_time += time;
+      *position /= abs_applied_rate;
+    if (G_UNLIKELY (stop < *position)) {
+      if (G_LIKELY (res == 1)) {
+        *position -= stop;
+        res = -1;
+      } else {
+        *position += stop;
+        res = 1;
+      }
+    } else {
+      if (G_LIKELY (res == 1)) {
+        *position = stop - *position;
+        res = 1;
+      } else {
+        *position += stop;
+        res = 1;
+      }
+    }
   }
 
-  return stream_time;
+  return res;
+}
+
+/**
+ * gst_segment_position_from_stream_time:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @stream_time: the stream_time in the segment
+ *
+ * Convert @stream_time into a position in the segment so that
+ * gst_segment_to_stream_time() with that position returns @stream_time.
+ *
+ * Returns: the position in the segment for @stream_time. This function returns
+ * -1 when @stream_time is -1 or when it is not inside @segment.
+ *
+ * Since: 1.8
+ */
+guint64
+gst_segment_position_from_stream_time (const GstSegment * segment,
+    GstFormat format, guint64 stream_time)
+{
+  guint64 position;
+  gint res;
+
+  g_return_val_if_fail (segment != NULL, -1);
+  g_return_val_if_fail (segment->format == format, -1);
+
+  res =
+      gst_segment_position_from_stream_time_full (segment, format, stream_time,
+      &position);
+
+  /* before the segment boundary */
+  if (G_UNLIKELY (position < segment->start)) {
+    GST_DEBUG ("position(%" G_GUINT64_FORMAT ") < start(%" G_GUINT64_FORMAT
+        ")", position, segment->start);
+    return -1;
+  }
+
+  /* after the segment boundary */
+  if (G_UNLIKELY (segment->stop != -1 && position > segment->stop)) {
+    GST_DEBUG ("position(%" G_GUINT64_FORMAT ") > stop(%" G_GUINT64_FORMAT
+        ")", position, segment->stop);
+    return -1;
+  }
+
+  if (res == 1)
+    return position;
+
+  return -1;
 }
 
 /**
@@ -679,6 +916,154 @@
 }
 
 /**
+ * gst_segment_position_from_running_time:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @running_time: the running_time in the segment
+ *
+ * Convert @running_time into a position in the segment so that
+ * gst_segment_to_running_time() with that position returns @running_time.
+ *
+ * Returns: the position in the segment for @running_time. This function returns
+ * -1 when @running_time is -1 or when it is not inside @segment.
+ *
+ * Since: 1.8
+ */
+guint64
+gst_segment_position_from_running_time (const GstSegment * segment,
+    GstFormat format, guint64 running_time)
+{
+  guint64 position;
+  gint res;
+
+  g_return_val_if_fail (segment != NULL, -1);
+  g_return_val_if_fail (segment->format == format, -1);
+
+  res =
+      gst_segment_position_from_running_time_full (segment, format,
+      running_time, &position);
+
+  if (res != 1)
+    return -1;
+
+  /* before the segment boundary */
+  if (G_UNLIKELY (position < segment->start)) {
+    GST_DEBUG ("position(%" G_GUINT64_FORMAT ") < start(%" G_GUINT64_FORMAT
+        ")", position, segment->start);
+    return -1;
+  }
+
+  /* after the segment boundary */
+  if (G_UNLIKELY (segment->stop != -1 && position > segment->stop)) {
+    GST_DEBUG ("position(%" G_GUINT64_FORMAT ") > stop(%" G_GUINT64_FORMAT
+        ")", position, segment->stop);
+    return -1;
+  }
+
+  return position;
+}
+
+/**
+ * gst_segment_position_from_running_time_full:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @running_time: the running-time
+ * @position: the resulting position in the segment
+ *
+ * Translate @running_time to the segment position using the currently configured
+ * segment. Compared to gst_segment_position_from_running_time() this function can
+ * return negative segment position.
+ *
+ * This function is typically used by elements that need to synchronize buffers
+ * against the clock or each other.
+ *
+ * @running_time can be any value and the result of this function for values
+ * outside of the segment is extrapolated.
+ *
+ * When 1 is returned, @running_time resulted in a positive position returned
+ * in @position.
+ *
+ * When this function returns -1, the returned @position should be negated
+ * to get the real negative segment position.
+ *
+ * Returns: a 1 or -1 on success, 0 on failure.
+ *
+ * Since: 1.8
+ */
+gint
+gst_segment_position_from_running_time_full (const GstSegment * segment,
+    GstFormat format, guint64 running_time, guint64 * position)
+{
+  gint res;
+  guint64 start, stop, base;
+  gdouble abs_rate;
+
+  if (G_UNLIKELY (running_time == -1)) {
+    *position = -1;
+    return 0;
+  }
+
+  g_return_val_if_fail (segment != NULL, 0);
+  g_return_val_if_fail (segment->format == format, 0);
+
+  base = segment->base;
+
+  abs_rate = ABS (segment->rate);
+
+  start = segment->start;
+  stop = segment->stop;
+
+  if (G_LIKELY (segment->rate > 0.0)) {
+    /* start by subtracting the base time */
+    if (G_LIKELY (running_time >= base)) {
+      *position = running_time - base;
+      /* move into the segment at the right rate */
+      if (G_UNLIKELY (abs_rate != 1.0))
+        *position = ceil (*position * abs_rate);
+      /* bring to corrected position in segment */
+      *position += start + segment->offset;
+      res = 1;
+    } else {
+      *position = base - running_time;
+      if (G_UNLIKELY (abs_rate != 1.0))
+        *position = ceil (*position * abs_rate);
+      if (start + segment->offset > *position) {
+        *position -= start + segment->offset;
+        res = -1;
+      } else {
+        *position = start + segment->offset - *position;
+        res = 1;
+      }
+    }
+  } else {
+    if (G_LIKELY (running_time >= base)) {
+      *position = running_time - base;
+      if (G_UNLIKELY (abs_rate != 1.0))
+        *position = ceil (*position * abs_rate);
+      if (G_UNLIKELY (stop < *position + segment->offset)) {
+        *position += segment->offset - stop;
+        res = -1;
+      } else {
+        *position = stop - *position - segment->offset;
+        res = 1;
+      }
+    } else {
+      *position = base - running_time;
+      if (G_UNLIKELY (abs_rate != 1.0))
+        *position = ceil (*position * abs_rate);
+      if (G_UNLIKELY (stop < segment->offset - *position)) {
+        *position -= segment->offset - stop;
+        res = -1;
+      } else {
+        *position = stop + *position - segment->offset;
+        res = 1;
+      }
+    }
+  }
+  return res;
+}
+
+/**
  * gst_segment_to_position:
  * @segment: a #GstSegment structure.
  * @format: the format of the segment.
@@ -689,56 +1074,21 @@
  *
  * Returns: the position in the segment for @running_time. This function returns
  * -1 when @running_time is -1 or when it is not inside @segment.
+ *
+ * Deprecated. Use gst_segment_position_from_running_time() instead.
  */
+#ifndef GST_REMOVE_DEPRECATED
+#ifdef GST_DISABLE_DEPRECATED
+guint64 gst_segment_to_position (const GstSegment * segment, GstFormat format,
+    guint64 running_time);
+#endif
 guint64
 gst_segment_to_position (const GstSegment * segment, GstFormat format,
     guint64 running_time)
 {
-  guint64 result;
-  guint64 start, stop, base;
-  gdouble abs_rate;
-
-  if (G_UNLIKELY (running_time == -1))
-    return -1;
-
-  g_return_val_if_fail (segment != NULL, -1);
-  g_return_val_if_fail (segment->format == format, FALSE);
-
-  base = segment->base;
-
-  /* this running_time was for a previous segment */
-  if (running_time < base)
-    return -1;
-
-  /* start by subtracting the base time */
-  result = running_time - base;
-
-  /* move into the segment at the right rate */
-  abs_rate = ABS (segment->rate);
-  if (G_UNLIKELY (abs_rate != 1.0))
-    result = ceil (result * abs_rate);
-
-  start = segment->start;
-  stop = segment->stop;
-
-  if (G_LIKELY (segment->rate > 0.0)) {
-    /* bring to corrected position in segment */
-    result += start + segment->offset;
-
-    /* outside of the segment boundary stop */
-    if (G_UNLIKELY (stop != -1 && result > stop))
-      return -1;
-  } else {
-    /* cannot continue if no stop position set or outside of
-     * the segment. */
-    if (G_UNLIKELY (stop == -1 || result + start > stop))
-      return -1;
-
-    /* bring to corrected position in segment */
-    result = stop - result - segment->offset;
-  }
-  return result;
+  return gst_segment_position_from_running_time (segment, format, running_time);
 }
+#endif
 
 /**
  * gst_segment_set_running_time:
@@ -760,7 +1110,8 @@
   guint64 start, stop;
 
   /* start by bringing the running_time into the segment position */
-  position = gst_segment_to_position (segment, format, running_time);
+  position =
+      gst_segment_position_from_running_time (segment, format, running_time);
 
   /* we must have a valid position now */
   if (G_UNLIKELY (position == -1))
@@ -823,7 +1174,8 @@
       /* subtract all from segment.base, remainder in offset */
       offset -= segment->base;
       segment->base = 0;
-      position = gst_segment_to_position (segment, format, offset);
+      position =
+          gst_segment_position_from_running_time (segment, format, offset);
       if (position == -1)
         return FALSE;
 
diff --git a/gst/gstsegment.h b/gst/gstsegment.h
index 85aed25..1fcfd4a 100644
--- a/gst/gstsegment.h
+++ b/gst/gstsegment.h
@@ -172,16 +172,17 @@
 /**
  * GstSegment:
  * @flags: flags for this segment
- * @rate: the rate of the segment
+ * @rate: the playback rate of the segment
  * @applied_rate: the already applied rate to the segment
  * @format: the format of the segment values
- * @base: the base of the segment
- * @offset: the offset to apply to @start or @stop
- * @start: the start of the segment
- * @stop: the stop of the segment
- * @time: the stream time of the segment
- * @position: the position in the segment (used internally by elements
- *     such as sources, demuxers or parsers to track progress)
+ * @base: the running time (plus elapsed time, see offset) of the segment start
+ * @offset: the amount (in buffer timestamps) that has already been elapsed in
+ *     the segment
+ * @start: the start of the segment in buffer timestamp time (PTS)
+ * @stop: the stop of the segment in buffer timestamp time (PTS)
+ * @time: the stream time of the segment start
+ * @position: the buffer timestamp position in the segment (used internally by
+ *     elements such as sources, demuxers or parsers to track progress)
  * @duration: the duration of the segment
  *
  * A helper structure that holds the configured region of
@@ -217,12 +218,19 @@
 
 void         gst_segment_init                (GstSegment *segment, GstFormat format);
 
+gint         gst_segment_to_stream_time_full (const GstSegment *segment, GstFormat format, guint64 position, guint64 * stream_time);
 guint64      gst_segment_to_stream_time      (const GstSegment *segment, GstFormat format, guint64 position);
+gint         gst_segment_position_from_stream_time_full (const GstSegment * segment, GstFormat format, guint64 stream_time, guint64 * position);
+guint64      gst_segment_position_from_stream_time (const GstSegment * segment, GstFormat format, guint64 stream_time);
 guint64      gst_segment_to_running_time     (const GstSegment *segment, GstFormat format, guint64 position);
 
 gint         gst_segment_to_running_time_full (const GstSegment *segment, GstFormat format, guint64 position,
                                                guint64 * running_time);
+#ifndef GST_DISABLE_DEPRECATED
 guint64      gst_segment_to_position         (const GstSegment *segment, GstFormat format, guint64 running_time);
+#endif
+gint         gst_segment_position_from_running_time_full (const GstSegment *segment, GstFormat format, guint64 running_time, guint64 * position);
+guint64      gst_segment_position_from_running_time (const GstSegment *segment, GstFormat format, guint64 running_time);
 
 gboolean     gst_segment_set_running_time    (GstSegment *segment, GstFormat format, guint64 running_time);
 
@@ -238,6 +246,10 @@
                                               GstSeekType stop_type, guint64 stop, gboolean * update);
 gboolean     gst_segment_is_equal            (const GstSegment * s0, const GstSegment * s1);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstSegment, gst_segment_free)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_SEGMENT_H__ */
diff --git a/gst/gststructure.h b/gst/gststructure.h
index a2b7926..e746ab0 100644
--- a/gst/gststructure.h
+++ b/gst/gststructure.h
@@ -336,6 +336,10 @@
 GstStructure *        gst_structure_intersect     (const GstStructure * struct1,
                                                    const GstStructure * struct2) G_GNUC_MALLOC;
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstStructure, gst_structure_free)
+#endif
+
 G_END_DECLS
 
 #endif
diff --git a/gst/gstsystemclock.c b/gst/gstsystemclock.c
index 0527af2..8508166 100644
--- a/gst/gstsystemclock.c
+++ b/gst/gstsystemclock.c
@@ -55,6 +55,10 @@
 #  endif
 #endif /* G_OS_WIN32 */
 
+#ifdef __APPLE__
+#include <mach/mach_time.h>
+#endif
+
 #define GET_ENTRY_STATUS(e)          ((GstClockReturn) g_atomic_int_get(&GST_CLOCK_ENTRY_STATUS(e)))
 #define SET_ENTRY_STATUS(e,val)      (g_atomic_int_set(&GST_CLOCK_ENTRY_STATUS(e),(val)))
 #define CAS_ENTRY_STATUS(e,old,val)  (g_atomic_int_compare_and_exchange(\
@@ -85,6 +89,9 @@
   LARGE_INTEGER start;
   LARGE_INTEGER frequency;
 #endif                          /* G_OS_WIN32 */
+#ifdef __APPLE__
+  struct mach_timebase_info mach_timebase;
+#endif
 };
 
 #define GST_SYSTEM_CLOCK_GET_PRIVATE(obj)  \
@@ -195,6 +202,10 @@
     QueryPerformanceCounter (&priv->start);
 #endif /* G_OS_WIN32 */
 
+#ifdef __APPLE__
+  mach_timebase_info (&priv->mach_timebase);
+#endif
+
 #if 0
   /* Uncomment this to start the async clock thread straight away */
   GST_OBJECT_LOCK (clock);
@@ -547,6 +558,12 @@
 static GstClockTime
 gst_system_clock_get_internal_time (GstClock * clock)
 {
+#if defined __APPLE__
+  GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+  uint64_t mach_t = mach_absolute_time ();
+  return gst_util_uint64_scale (mach_t, sysclock->priv->mach_timebase.numer,
+      sysclock->priv->mach_timebase.denom);
+#else
 #ifdef G_OS_WIN32
   GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
 
@@ -582,11 +599,17 @@
     return GST_TIMESPEC_TO_TIME (ts);
   }
 #endif
+#endif /* __APPLE__ */
 }
 
 static guint64
 gst_system_clock_get_resolution (GstClock * clock)
 {
+#if defined __APPLE__
+  GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+  return gst_util_uint64_scale (GST_NSECOND,
+      sysclock->priv->mach_timebase.numer, sysclock->priv->mach_timebase.denom);
+#else
 #ifdef G_OS_WIN32
   GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
 
@@ -612,6 +635,7 @@
     return 1 * GST_USECOND;
   }
 #endif
+#endif /* __APPLE__ */
 }
 
 /* synchronously wait on the given GstClockEntry.
diff --git a/gst/gstsystemclock.h b/gst/gstsystemclock.h
index c142708..02105ee 100644
--- a/gst/gstsystemclock.h
+++ b/gst/gstsystemclock.h
@@ -83,6 +83,10 @@
 GstClock*               gst_system_clock_obtain         (void);
 void                    gst_system_clock_set_default    (GstClock *new_clock);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstSystemClock, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_SYSTEM_CLOCK_H__ */
diff --git a/gst/gsttaglist.c b/gst/gsttaglist.c
index 5b644dc..8018dda 100644
--- a/gst/gsttaglist.c
+++ b/gst/gsttaglist.c
@@ -401,6 +401,10 @@
   gst_tag_register_static (GST_TAG_MIDI_BASE_NOTE, GST_TAG_FLAG_META,
       G_TYPE_UINT,
       _("midi-base-note"), _("Midi note number of the audio track."), NULL);
+  gst_tag_register_static (GST_TAG_PRIVATE_DATA, GST_TAG_FLAG_META,
+      GST_TYPE_SAMPLE,
+      _("private-data"), _("Private data"), gst_tag_merge_use_first);
+
 }
 
 /**
diff --git a/gst/gsttaglist.h b/gst/gsttaglist.h
index 42f944b..21ff06d 100644
--- a/gst/gsttaglist.h
+++ b/gst/gsttaglist.h
@@ -389,10 +389,6 @@
  *
  * Returns: the same #GstTagList mini object.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstTagList * gst_tag_list_ref (GstTagList * taglist);
-#endif
-
 static inline GstTagList *
 gst_tag_list_ref (GstTagList * taglist)
 {
@@ -405,10 +401,6 @@
  *
  * Unref a #GstTagList, and and free all its memory when the refcount reaches 0.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_tag_list_unref (GstTagList * taglist);
-#endif
-
 static inline void
 gst_tag_list_unref (GstTagList * taglist)
 {
@@ -431,10 +423,6 @@
  *
  * Returns: the new #GstTagList
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstTagList * gst_tag_list_copy (const GstTagList * taglist);
-#endif
-
 static inline GstTagList *
 gst_tag_list_copy (const GstTagList * taglist)
 {
@@ -1072,6 +1060,27 @@
  * Since: 1.4
  */
 #define GST_TAG_MIDI_BASE_NOTE                    "midi-base-note"
+/**
+ * GST_TAG_PRIVATE_DATA:
+ *
+ * Any private data that may be contained in tags (sample).
+ *
+ * It is represented by #GstSample in which #GstBuffer contains the
+ * binary data and the sample's info #GstStructure may contain any
+ * extra information that identifies the origin or meaning of the data.
+ *
+ * Private frames in ID3v2 tags ('PRIV' frames) will be represented
+ * using this tag, in which case the GstStructure will be named
+ * "ID3PrivateFrame" and contain a field named "owner" of type string
+ * which contains the owner-identification string from the tag.
+ *
+ * Since: 1.8
+ */
+#define GST_TAG_PRIVATE_DATA                         "private-data"
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTagList, gst_tag_list_unref)
+#endif
 
 G_END_DECLS
 
diff --git a/gst/gsttask.h b/gst/gsttask.h
index 85117ff..c56cf5e 100644
--- a/gst/gsttask.h
+++ b/gst/gsttask.h
@@ -194,6 +194,10 @@
 
 gboolean        gst_task_join           (GstTask *task);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTask, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_TASK_H__ */
diff --git a/gst/gsttaskpool.h b/gst/gsttaskpool.h
index a1195dc..f8927c5 100644
--- a/gst/gsttaskpool.h
+++ b/gst/gsttaskpool.h
@@ -96,6 +96,10 @@
 
 void		gst_task_pool_cleanup     (GstTaskPool *pool);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTaskPool, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_TASK_POOL_H__ */
diff --git a/gst/gsttoc.h b/gst/gsttoc.h
index cb77862..68f3a35 100644
--- a/gst/gsttoc.h
+++ b/gst/gsttoc.h
@@ -184,6 +184,23 @@
 
 const gchar *      gst_toc_entry_type_get_nick     (GstTocEntryType type);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+static inline void
+_gst_autoptr_toc_unref (GstToc *toc)
+{
+  gst_toc_unref (toc);
+}
+
+static inline void
+_gst_autoptr_toc_entry_unref (GstTocEntry *entry)
+{
+  gst_toc_entry_unref (entry);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstToc, _gst_autoptr_toc_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTocEntry, _gst_autoptr_toc_entry_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_TOC_H__ */
diff --git a/gst/gsttrace.c b/gst/gsttrace.c
index 4087929..7cb0a3d 100644
--- a/gst/gsttrace.c
+++ b/gst/gsttrace.c
@@ -165,6 +165,20 @@
 
         if (type == GST_TYPE_CAPS) {
           extra = gst_caps_to_string (data);
+        } else if (type == GST_TYPE_EVENT) {
+          const GstStructure *s = gst_event_get_structure (data);
+
+          if (s == NULL)
+            extra = g_strdup_printf ("%s", GST_EVENT_TYPE_NAME (data));
+          else
+            extra = gst_structure_to_string (s);
+        } else if (type == GST_TYPE_MESSAGE) {
+          const GstStructure *s = gst_message_get_structure (data);
+
+          if (s == NULL)
+            extra = g_strdup_printf ("%s", GST_MESSAGE_TYPE_NAME (data));
+          else
+            extra = gst_structure_to_string (s);
         }
         refcount = GST_MINI_OBJECT_REFCOUNT_VALUE (data);
       }
diff --git a/gst/gsttracer.c b/gst/gsttracer.c
new file mode 100644
index 0000000..668b98a
--- /dev/null
+++ b/gst/gsttracer.c
@@ -0,0 +1,207 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracer.c: tracer base class
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gsttracer
+ * @short_description: Tracing base class
+ *
+ * Tracing modules will subclass #GstTracer and register through
+ * gst_tracer_register(). Modules can attach to various hook-types - see
+ * #GstTracerHook. When invoked they receive hook specific contextual data, 
+ * which they must not modify.
+ */
+
+#define GST_USE_UNSTABLE_API
+
+#include "gst_private.h"
+#include "gstenumtypes.h"
+#include "gsttracer.h"
+#include "gsttracerfactory.h"
+
+GST_DEBUG_CATEGORY_EXTERN (tracer_debug);
+#define GST_CAT_DEFAULT tracer_debug
+
+/* tracing plugins base class */
+
+enum
+{
+  PROP_0,
+  PROP_PARAMS,
+  PROP_LAST
+};
+
+static GParamSpec *properties[PROP_LAST];
+
+static void gst_tracer_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+static void gst_tracer_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+
+struct _GstTracerPrivate
+{
+  gchar *params;
+};
+
+#define gst_tracer_parent_class parent_class
+G_DEFINE_ABSTRACT_TYPE (GstTracer, gst_tracer, GST_TYPE_OBJECT);
+
+static void
+gst_tracer_dispose (GObject * object)
+{
+  GstTracer *tracer = GST_TRACER (object);
+  g_free (tracer->priv->params);
+}
+
+static void
+gst_tracer_class_init (GstTracerClass * klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property = gst_tracer_set_property;
+  gobject_class->get_property = gst_tracer_get_property;
+  gobject_class->dispose = gst_tracer_dispose;
+
+  properties[PROP_PARAMS] =
+      g_param_spec_string ("params", "Params", "Extra configuration parameters",
+      NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (gobject_class, PROP_LAST, properties);
+  g_type_class_add_private (klass, sizeof (GstTracerPrivate));
+}
+
+static void
+gst_tracer_init (GstTracer * tracer)
+{
+  tracer->priv = G_TYPE_INSTANCE_GET_PRIVATE (tracer, GST_TYPE_TRACER,
+      GstTracerPrivate);
+}
+
+static void
+gst_tracer_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstTracer *self = GST_TRACER_CAST (object);
+
+  switch (prop_id) {
+    case PROP_PARAMS:
+      self->priv->params = g_value_dup_string (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_tracer_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstTracer *self = GST_TRACER_CAST (object);
+
+  switch (prop_id) {
+    case PROP_PARAMS:
+      g_value_set_string (value, self->priv->params);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+/* tracing modules */
+
+gboolean
+gst_tracer_register (GstPlugin * plugin, const gchar * name, GType type)
+{
+  GstPluginFeature *existing_feature;
+  GstRegistry *registry;
+  GstTracerFactory *factory;
+
+  g_return_val_if_fail (name != NULL, FALSE);
+  g_return_val_if_fail (g_type_is_a (type, GST_TYPE_TRACER), FALSE);
+
+  registry = gst_registry_get ();
+  /* check if feature already exists, if it exists there is no need to update it
+   * when the registry is getting updated, outdated plugins and all their
+   * features are removed and readded.
+   */
+  existing_feature = gst_registry_lookup_feature (registry, name);
+  if (existing_feature) {
+    GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
+        existing_feature, name);
+    factory = GST_TRACER_FACTORY_CAST (existing_feature);
+    factory->type = type;
+    existing_feature->loaded = TRUE;
+    gst_object_unref (existing_feature);
+    return TRUE;
+  }
+
+  factory = g_object_newv (GST_TYPE_TRACER_FACTORY, 0, NULL);
+  GST_DEBUG_OBJECT (factory, "new tracer factory for %s", name);
+
+  gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
+  gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory),
+      GST_RANK_NONE);
+
+  factory->type = type;
+  GST_DEBUG_OBJECT (factory, "tracer factory for %u:%s",
+      (guint) type, g_type_name (type));
+
+  if (plugin && plugin->desc.name) {
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name; /* interned string */
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin = plugin;
+    g_object_add_weak_pointer ((GObject *) plugin,
+        (gpointer *) & GST_PLUGIN_FEATURE_CAST (factory)->plugin);
+  } else {
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
+    GST_PLUGIN_FEATURE_CAST (factory)->plugin = NULL;
+  }
+  GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
+
+  gst_registry_add_feature (gst_registry_get (),
+      GST_PLUGIN_FEATURE_CAST (factory));
+
+  return TRUE;
+}
+
+/* tracing module helpers */
+
+void
+gst_tracer_log_trace (GstStructure * s)
+{
+  GST_TRACE ("%" GST_PTR_FORMAT, s);
+  /* expands to:
+     gst_debug_log_valist (
+     GST_CAT_DEFAULT, GST_LEVEL_TRACE,
+     file, func, line, object
+     "%" GST_PTR_FORMAT, s);
+     // does it make sense to use the {file, line, func} from the tracer hook?
+     // a)
+     // - we'd need to pass them in the macros to gst_tracer_dispatch()
+     // - and each tracer needs to grab them from the va_list and pass them here
+     // b)
+     // - we create a content in dispatch, pass that to the tracer
+     // - and the tracer will pass that here
+     // ideally we also use *our* ts instead of the one that
+     // gst_debug_log_default() will pick
+   */
+  gst_structure_free (s);
+}
diff --git a/gst/gsttracer.h b/gst/gsttracer.h
new file mode 100644
index 0000000..a5953f2
--- /dev/null
+++ b/gst/gsttracer.h
@@ -0,0 +1,83 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracer.h: tracer base class
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_TRACER_H__
+#define __GST_TRACER_H__
+
+#ifndef GST_USE_UNSTABLE_API
+#warning "The tracer subsystem is unstable API and may change in future."
+#warning "You can define GST_USE_UNSTABLE_API to avoid this warning."
+#endif
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gst/gstconfig.h>
+#include <gst/gsttracerutils.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstTracer GstTracer;
+typedef struct _GstTracerPrivate GstTracerPrivate;
+typedef struct _GstTracerClass GstTracerClass;
+
+#define GST_TYPE_TRACER            (gst_tracer_get_type())
+#define GST_TRACER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TRACER,GstTracer))
+#define GST_TRACER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TRACER,GstTracerClass))
+#define GST_IS_TRACER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TRACER))
+#define GST_IS_TRACER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TRACER))
+#define GST_TRACER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_TRACER,GstTracerClass))
+#define GST_TRACER_CAST(obj)       ((GstTracer *)(obj))
+
+struct _GstTracer {
+  GstObject        parent;
+  /*< private >*/
+  GstTracerPrivate *priv;
+  gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstTracerClass {
+  GstObjectClass parent_class;
+    
+  /*< private >*/
+  gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_tracer_get_type          (void);
+
+void gst_tracing_register_hook (GstTracer *tracer, const gchar *detail, 
+  GCallback func);
+void gst_tracing_register_hook_id (GstTracer *tracer, GQuark detail, 
+  GCallback func);
+
+/* tracing modules */
+gboolean gst_tracer_register (GstPlugin * plugin, const gchar * name, GType type);
+
+/* tracing module helpers */
+void gst_tracer_log_trace (GstStructure * s);
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTracer, gst_object_unref)
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_TRACER_H__ */
+
diff --git a/gst/gsttracerfactory.c b/gst/gsttracerfactory.c
new file mode 100644
index 0000000..ec7ba53
--- /dev/null
+++ b/gst/gsttracerfactory.c
@@ -0,0 +1,76 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerfactory.c: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gsttracerfactory
+ * @short_description: Information about registered tracer functions
+ *
+ * Use gst_tracer_factory_get_list() to get a list of tracer factories known to
+ * GStreamer.
+ */
+
+#include "gst_private.h"
+#include "gstinfo.h"
+#include "gsttracerfactory.h"
+#include "gstregistry.h"
+
+GST_DEBUG_CATEGORY (tracer_debug);
+#define GST_CAT_DEFAULT tracer_debug
+
+#define _do_init \
+{ \
+  GST_DEBUG_CATEGORY_INIT (tracer_debug, "GST_TRACER", \
+      GST_DEBUG_FG_BLUE, "tracing subsystem"); \
+}
+
+#define gst_tracer_factory_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTracerFactory, gst_tracer_factory,
+    GST_TYPE_PLUGIN_FEATURE, _do_init);
+
+static void
+gst_tracer_factory_class_init (GstTracerFactoryClass * klass)
+{
+}
+
+static void
+gst_tracer_factory_init (GstTracerFactory * factory)
+{
+}
+
+/**
+ * gst_tracer_factory_get_list:
+ *
+ * Gets the list of all registered tracer factories. You must free the
+ * list using gst_plugin_feature_list_free().
+ *
+ * The returned factories are sorted by factory name.
+ *
+ * Free-function: gst_plugin_feature_list_free
+ *
+ * Returns: (transfer full) (element-type Gst.TracerFactory): the list of all
+ *     registered #GstTracerFactory.
+ */
+GList *
+gst_tracer_factory_get_list (void)
+{
+  return gst_registry_get_feature_list (gst_registry_get (),
+      GST_TYPE_TRACER_FACTORY);
+}
diff --git a/gst/gsttracerfactory.h b/gst/gsttracerfactory.h
new file mode 100644
index 0000000..09d357f
--- /dev/null
+++ b/gst/gsttracerfactory.h
@@ -0,0 +1,59 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerfactory.h: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_TRACER_FACTORY_H__
+#define __GST_TRACER_FACTORY_H__
+
+#include <gst/gstcaps.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TRACER_FACTORY                 (gst_tracer_factory_get_type())
+#define GST_TRACER_FACTORY(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TRACER_FACTORY, GstTracerFactory))
+#define GST_IS_TRACER_FACTORY(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TRACER_FACTORY))
+#define GST_TRACER_FACTORY_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TRACER_FACTORY, GstTracerFactoryClass))
+#define GST_IS_TRACER_FACTORY_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TRACER_FACTORY))
+#define GST_TRACER_FACTORY_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TRACER_FACTORY, GstTracerFactoryClass))
+#define GST_TRACER_FACTORY_CAST(obj)            ((GstTracerFactory *)(obj))
+
+/**
+ * GstTracerFactory:
+ *
+ * Opaque object that stores information about a tracer function.
+ */
+typedef struct _GstTracerFactory GstTracerFactory;
+typedef struct _GstTracerFactoryClass GstTracerFactoryClass;
+
+/* tracering interface */
+
+GType           gst_tracer_factory_get_type          (void);
+GList *         gst_tracer_factory_get_list          (void);
+
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTracerFactory, gst_object_unref)
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_TRACER_FACTORY_H__ */
diff --git a/gst/gsttracerutils.c b/gst/gsttracerutils.c
new file mode 100644
index 0000000..64c24af
--- /dev/null
+++ b/gst/gsttracerutils.c
@@ -0,0 +1,193 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerutils.c: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gsttracerutils
+ * @short_description: Tracing subsystem
+ *
+ * The tracing subsystem provides hooks in the core library and API for modules
+ * to attach to them.
+ *
+ * The user can activate tracers by setting the environment variable GST_TRACE
+ * to a ';' separated list of tracers.
+ */
+
+#define GST_USE_UNSTABLE_API
+
+#include "gst_private.h"
+#include "gsttracer.h"
+#include "gsttracerfactory.h"
+#include "gsttracerutils.h"
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+/* tracer quarks */
+
+/* These strings must match order and number declared in the GstTracerQuarkId
+ * enum in gsttracerutils.h! */
+static const gchar *_quark_strings[] = {
+  "pad-push-pre", "pad-push-post", "pad-push-list-pre", "pad-push-list-post",
+  "pad-pull-range-pre", "pad-pull-range-post", "pad-push-event-pre",
+  "pad-push-event-post", "pad-query-pre", "pad-query-post",
+  "element-post-message-pre",
+  "element-post-message-post", "element-query-pre", "element-query-post",
+  "element-new", "element-add-pad", "element-remove-pad",
+  "bin-add-pre", "bin-add-post", "bin-remove-pre", "bin-remove-post",
+  "pad-link-pre", "pad-link-post", "pad-unlink-pre", "pad-unlink-post",
+  "element-change-state-pre", "element-change-state-post"
+};
+
+GQuark _priv_gst_tracer_quark_table[GST_TRACER_QUARK_MAX];
+
+/* tracing helpers */
+
+gboolean _priv_tracer_enabled = FALSE;
+GHashTable *_priv_tracers = NULL;
+
+/* Initialize the tracing system */
+void
+_priv_gst_tracing_init (void)
+{
+  const gchar *env = g_getenv ("GST_TRACER_PLUGINS");
+
+  if (env != NULL && *env != '\0') {
+    GstRegistry *registry = gst_registry_get ();
+    GstPluginFeature *feature;
+    GstTracerFactory *factory;
+    gchar **t = g_strsplit_set (env, ";", 0);
+    gint i = 0;
+    gchar *params;
+
+    GST_INFO ("enabling tracers: '%s'", env);
+
+    if (G_N_ELEMENTS (_quark_strings) != GST_TRACER_QUARK_MAX)
+      g_warning ("the quark table is not consistent! %d != %d",
+          (gint) G_N_ELEMENTS (_quark_strings), GST_TRACER_QUARK_MAX);
+
+    for (i = 0; i < GST_TRACER_QUARK_MAX; i++) {
+      _priv_gst_tracer_quark_table[i] =
+          g_quark_from_static_string (_quark_strings[i]);
+    }
+
+    _priv_tracers = g_hash_table_new (NULL, NULL);
+
+    i = 0;
+    while (t[i]) {
+      // check t[i] for params
+      if ((params = strchr (t[i], '('))) {
+        gchar *end = strchr (&params[1], ')');
+        *params = '\0';
+        params++;
+        if (end)
+          *end = '\0';
+      } else {
+        params = NULL;
+      }
+
+      GST_INFO ("checking tracer: '%s'", t[i]);
+
+      if ((feature = gst_registry_lookup_feature (registry, t[i]))) {
+        factory = GST_TRACER_FACTORY (gst_plugin_feature_load (feature));
+        if (factory) {
+          GST_INFO_OBJECT (factory, "creating tracer: type-id=%u",
+              (guint) factory->type);
+
+          /* tracers register them self to the hooks */
+          gst_object_unref (g_object_new (factory->type, "params", params,
+                  NULL));
+        } else {
+          GST_WARNING_OBJECT (feature,
+              "loading plugin containing feature %s failed!", t[i]);
+        }
+      } else {
+        GST_WARNING ("no tracer named '%s'", t[i]);
+      }
+      i++;
+    }
+    g_strfreev (t);
+  }
+}
+
+void
+_priv_gst_tracing_deinit (void)
+{
+  GList *h_list, *h_node, *t_node;
+  GstTracerHook *hook;
+
+  _priv_tracer_enabled = FALSE;
+  if (!_priv_tracers)
+    return;
+
+  /* shutdown tracers for final reports */
+  h_list = g_hash_table_get_values (_priv_tracers);
+  for (h_node = h_list; h_node; h_node = g_list_next (h_node)) {
+    for (t_node = h_node->data; t_node; t_node = g_list_next (t_node)) {
+      hook = (GstTracerHook *) t_node->data;
+      gst_object_unref (hook->tracer);
+      g_slice_free (GstTracerHook, hook);
+    }
+    g_list_free (h_node->data);
+  }
+  g_list_free (h_list);
+  g_hash_table_destroy (_priv_tracers);
+  _priv_tracers = NULL;
+}
+
+/**
+ * gst_tracing_register_hook_id:
+ * @tracer: the tracer
+ * @detail: the detailed hook
+ * @func: (scope async): the callback
+ *
+ * Register @func to be called when the trace hook @detail is getting invoked.
+ */
+void
+gst_tracing_register_hook_id (GstTracer * tracer, GQuark detail, GCallback func)
+{
+  gpointer key = GINT_TO_POINTER (detail);
+  GList *list = g_hash_table_lookup (_priv_tracers, key);
+  GstTracerHook *hook = g_slice_new0 (GstTracerHook);
+  hook->tracer = gst_object_ref (tracer);
+  hook->func = func;
+
+  list = g_list_prepend (list, hook);
+  g_hash_table_replace (_priv_tracers, key, list);
+  GST_DEBUG ("registering tracer for '%s', list.len=%d",
+      (detail ? g_quark_to_string (detail) : "*"), g_list_length (list));
+  _priv_tracer_enabled = TRUE;
+}
+
+/**
+ * gst_tracing_register_hook:
+ * @tracer: the tracer
+ * @detail: the detailed hook
+ * @func: (scope async): the callback
+ *
+ * Register @func to be called when the trace hook @detail is getting invoked.
+ */
+void
+gst_tracing_register_hook (GstTracer * tracer, const gchar * detail,
+    GCallback func)
+{
+  gst_tracing_register_hook_id (tracer, g_quark_try_string (detail), func);
+}
+
+#endif /* GST_DISABLE_GST_DEBUG */
diff --git a/gst/gsttracerutils.h b/gst/gsttracerutils.h
new file mode 100644
index 0000000..52c9a37
--- /dev/null
+++ b/gst/gsttracerutils.h
@@ -0,0 +1,341 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerutils.h: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef __GST_TRACER_UTILS_H__
+#define __GST_TRACER_UTILS_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gst/gstconfig.h>
+#include <gst/gstbin.h>
+
+G_BEGIN_DECLS
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+/* tracing hooks */
+
+void _priv_gst_tracing_init (void);
+void _priv_gst_tracing_deinit (void);
+
+/* tracer quarks */
+
+/* These enums need to match the number and order
+ * of strings declared in _quark_table, in gsttracerutils.c */
+typedef enum /*< skip >*/
+{
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_PRE = 0,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_POST,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_LIST_PRE,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_LIST_POST,
+  GST_TRACER_QUARK_HOOK_PAD_PULL_RANGE_PRE,
+  GST_TRACER_QUARK_HOOK_PAD_PULL_RANGE_POST,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_EVENT_PRE ,
+  GST_TRACER_QUARK_HOOK_PAD_PUSH_EVENT_POST,
+  GST_TRACER_QUARK_HOOK_PAD_QUERY_PRE ,
+  GST_TRACER_QUARK_HOOK_PAD_QUERY_POST,
+  GST_TRACER_QUARK_HOOK_ELEMENT_POST_MESSAGE_PRE,
+  GST_TRACER_QUARK_HOOK_ELEMENT_POST_MESSAGE_POST,
+  GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_PRE,
+  GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_POST,
+  GST_TRACER_QUARK_HOOK_ELEMENT_NEW,
+  GST_TRACER_QUARK_HOOK_ELEMENT_ADD_PAD,
+  GST_TRACER_QUARK_HOOK_ELEMENT_REMOVE_PAD,
+  GST_TRACER_QUARK_HOOK_BIN_ADD_PRE,
+  GST_TRACER_QUARK_HOOK_BIN_ADD_POST,
+  GST_TRACER_QUARK_HOOK_BIN_REMOVE_PRE,
+  GST_TRACER_QUARK_HOOK_BIN_REMOVE_POST,
+  GST_TRACER_QUARK_HOOK_PAD_LINK_PRE,
+  GST_TRACER_QUARK_HOOK_PAD_LINK_POST,
+  GST_TRACER_QUARK_HOOK_PAD_UNLINK_PRE,
+  GST_TRACER_QUARK_HOOK_PAD_UNLINK_POST,
+  GST_TRACER_QUARK_HOOK_ELEMENT_CHANGE_STATE_PRE,
+  GST_TRACER_QUARK_HOOK_ELEMENT_CHANGE_STATE_POST,
+  GST_TRACER_QUARK_MAX
+} GstTracerQuarkId;
+
+extern GQuark _priv_gst_tracer_quark_table[GST_TRACER_QUARK_MAX];
+
+#define GST_TRACER_QUARK(q) _priv_gst_tracer_quark_table[GST_TRACER_QUARK_##q]
+
+/* tracing module helpers */
+
+typedef struct {
+  GObject *tracer;
+  GCallback func;
+} GstTracerHook;
+
+extern gboolean _priv_tracer_enabled;
+/* key are hook-id quarks, values are GstTracerHook */
+extern GHashTable *_priv_tracers; 
+
+#define GST_TRACER_IS_ENABLED (_priv_tracer_enabled)
+
+#define GST_TRACER_TS \
+  GST_CLOCK_DIFF (_priv_gst_info_start_time, gst_util_get_timestamp ())
+
+/* tracing hooks */
+
+#define GST_TRACER_ARGS h->tracer, ts
+#define GST_TRACER_DISPATCH(key,type,args) G_STMT_START{ \
+  if (GST_TRACER_IS_ENABLED) {                                         \
+    GstClockTime ts = GST_TRACER_TS;                                   \
+    GList *__l, *__n;                                                  \
+    GstTracerHook *h;                                                  \
+    __l = g_hash_table_lookup (_priv_tracers, GINT_TO_POINTER (key));  \
+    for (__n = __l; __n; __n = g_list_next (__n)) {                    \
+      h = (GstTracerHook *) __n->data;                                 \
+      ((type)(h->func)) args;                                          \
+    }                                                                  \
+    __l = g_hash_table_lookup (_priv_tracers, NULL);                   \
+    for (__n = __l; __n; __n = g_list_next (__n)) {                    \
+      h = (GstTracerHook *) __n->data;                                 \
+      ((type)(h->func)) args;                                          \
+    }                                                                  \
+  }                                                                    \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushPre) (GObject *, GstClockTime, GstPad *, 
+    GstBuffer *);
+#define GST_TRACER_PAD_PUSH_PRE(pad, buffer) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_PRE), \
+    GstTracerHookPadPushPre, (GST_TRACER_ARGS, pad, buffer)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushPost) (GObject *, GstClockTime, GstPad *, 
+    GstFlowReturn);
+#define GST_TRACER_PAD_PUSH_POST(pad, res) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_POST), \
+    GstTracerHookPadPushPost, (GST_TRACER_ARGS, pad, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushListPre) (GObject *, GstClockTime, GstPad *, 
+    GstBufferList *);
+#define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_PRE), \
+    GstTracerHookPadPushListPre, (GST_TRACER_ARGS, pad, list)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushListPost) (GObject *, GstClockTime, GstPad *, 
+    GstFlowReturn);
+#define GST_TRACER_PAD_PUSH_LIST_POST(pad, res) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_POST), \
+    GstTracerHookPadPushListPost, (GST_TRACER_ARGS, pad, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPullRangePre) (GObject *, GstClockTime, GstPad *, 
+    guint64, guint);
+#define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_PRE), \
+    GstTracerHookPadPullRangePre, (GST_TRACER_ARGS, pad, offset, size)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPullRangePost) (GObject *, GstClockTime,
+    GstPad *, GstBuffer *, GstFlowReturn);
+#define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_POST), \
+    GstTracerHookPadPullRangePost, (GST_TRACER_ARGS, pad, buffer, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushEventPre) (GObject *, GstClockTime, GstPad *, 
+    GstEvent *);
+#define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_PRE), \
+    GstTracerHookPadPushEventPre, (GST_TRACER_ARGS, pad, event)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushEventPost) (GObject *, GstClockTime, 
+    GstPad *, gboolean);
+#define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_POST), \
+    GstTracerHookPadPushEventPost, (GST_TRACER_ARGS, pad, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadQueryPre) (GObject *, GstClockTime, GstPad *,
+    GstQuery *);
+#define GST_TRACER_PAD_QUERY_PRE(pad, query) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_QUERY_PRE), \
+    GstTracerHookPadQueryPre, (GST_TRACER_ARGS, pad, query)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadQueryPost) (GObject *, GstClockTime,
+    GstPad *, gboolean, GstQuery *);
+#define GST_TRACER_PAD_QUERY_POST(pad, res, query) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_QUERY_POST), \
+    GstTracerHookPadQueryPost, (GST_TRACER_ARGS, pad, res, query)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementPostMessagePre) (GObject *, GstClockTime,
+    GstElement *, GstMessage *);
+#define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_PRE), \
+    GstTracerHookElementPostMessagePre, (GST_TRACER_ARGS, element, message)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementPostMessagePost) (GObject *, GstClockTime,
+    GstElement *, gboolean);
+#define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_POST), \
+    GstTracerHookElementPostMessagePost, (GST_TRACER_ARGS, element, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementQueryPre) (GObject *, GstClockTime,
+    GstElement *, GstQuery *);
+#define GST_TRACER_ELEMENT_QUERY_PRE(element, query) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_PRE), \
+    GstTracerHookElementQueryPre, (GST_TRACER_ARGS, element, query)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementQueryPost) (GObject *, GstClockTime,
+    GstElement *, gboolean);
+#define GST_TRACER_ELEMENT_QUERY_POST(element, res) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_POST), \
+    GstTracerHookElementQueryPost, (GST_TRACER_ARGS, element, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementNew) (GObject *, GstClockTime,
+    GstElement *);
+#define GST_TRACER_ELEMENT_NEW(element) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_NEW), \
+    GstTracerHookElementNew, (GST_TRACER_ARGS, element)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementAddPad) (GObject *, GstClockTime,
+    GstElement *, GstPad *);
+#define GST_TRACER_ELEMENT_ADD_PAD(element, pad) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_ADD_PAD), \
+    GstTracerHookElementAddPad, (GST_TRACER_ARGS, element, pad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementRemovePad) (GObject *, GstClockTime,
+    GstElement *, GstPad *);
+#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_REMOVE_PAD), \
+    GstTracerHookElementRemovePad, (GST_TRACER_ARGS, element, pad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementChangeStatePre) (GObject *, GstClockTime,
+    GstElement *, GstStateChange);
+#define GST_TRACER_ELEMENT_CHANGE_STATE_PRE(element, transition) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_CHANGE_STATE_PRE), \
+    GstTracerHookElementChangeStatePre, (GST_TRACER_ARGS, element, transition)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementChangeStatePost) (GObject *, GstClockTime,
+    GstElement *, GstStateChange, GstStateChangeReturn);
+#define GST_TRACER_ELEMENT_CHANGE_STATE_POST(element, transition, result) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_CHANGE_STATE_POST), \
+    GstTracerHookElementChangeStatePost, (GST_TRACER_ARGS, element, transition, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinAddPre) (GObject *, GstClockTime,
+    GstBin *, GstElement *);
+#define GST_TRACER_BIN_ADD_PRE(bin, element) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_PRE), \
+    GstTracerHookBinAddPre, (GST_TRACER_ARGS, bin, element)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinAddPost) (GObject *, GstClockTime,
+    GstBin *, GstElement *, gboolean);
+#define GST_TRACER_BIN_ADD_POST(bin, element, result) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_POST), \
+    GstTracerHookBinAddPost, (GST_TRACER_ARGS, bin, element, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinRemovePre) (GObject *, GstClockTime,
+    GstBin *, GstElement *);
+#define GST_TRACER_BIN_REMOVE_PRE(bin, element) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_PRE), \
+    GstTracerHookBinRemovePre, (GST_TRACER_ARGS, bin, element)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinRemovePost) (GObject *, GstClockTime,
+    GstBin *, gboolean);
+#define GST_TRACER_BIN_REMOVE_POST(bin, result) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_POST), \
+    GstTracerHookBinRemovePost, (GST_TRACER_ARGS, bin, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadLinkPre) (GObject *, GstClockTime,
+    GstPad *, GstPad *);
+#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_PRE), \
+    GstTracerHookPadLinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadLinkPost) (GObject *, GstClockTime,
+    GstPad *, GstPad *, GstPadLinkReturn);
+#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, result) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_POST), \
+    GstTracerHookPadLinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadUnlinkPre) (GObject *, GstClockTime,
+    GstPad *, GstPad *);
+#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_PRE), \
+    GstTracerHookPadUnlinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadUnlinkPost) (GObject *, GstClockTime,
+    GstPad *, GstPad *, gboolean);
+#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, result) G_STMT_START{ \
+  GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_POST), \
+    GstTracerHookPadUnlinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \
+}G_STMT_END
+
+#else /* !GST_DISABLE_GST_DEBUG */
+
+#define GST_TRACER_PAD_PUSH_PRE(pad, buffer)
+#define GST_TRACER_PAD_PUSH_POST(pad, res)
+#define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list)
+#define GST_TRACER_PAD_PUSH_LIST_POST(pad, res)
+#define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size)
+#define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res)
+#define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event)
+#define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res)
+#define GST_TRACER_PAD_QUERY_PRE(pad, query)
+#define GST_TRACER_PAD_QUERY_POST(pad, res, query)
+#define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message)
+#define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res)
+#define GST_TRACER_ELEMENT_QUERY_PRE(element, query)
+#define GST_TRACER_ELEMENT_QUERY_POST(element, res)
+#define GST_TRACER_ELEMENT_NEW(element)
+#define GST_TRACER_ELEMENT_ADD_PAD(element, pad)
+#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad)
+#define GST_TRACER_ELEMENT_CHANGE_STATE_PRE(element, transition)
+#define GST_TRACER_ELEMENT_CHANGE_STATE_POST(element, transition, res)
+#define GST_TRACER_BIN_ADD_PRE(bin, element)
+#define GST_TRACER_BIN_ADD_POST(bin, element, res)
+#define GST_TRACER_BIN_REMOVE_PRE(bin, element)
+#define GST_TRACER_BIN_REMOVE_POST(bin, res)
+#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad)
+#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, res)
+#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad)
+#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, res)
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+G_END_DECLS
+
+#endif /* __GST_TRACER_UTILS_H__ */
+
diff --git a/gst/gsttypefindfactory.h b/gst/gsttypefindfactory.h
index 64238ce..02573f7 100644
--- a/gst/gsttypefindfactory.h
+++ b/gst/gsttypefindfactory.h
@@ -57,6 +57,10 @@
 void            gst_type_find_factory_call_function     (GstTypeFindFactory *factory,
                                                          GstTypeFind *find);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTypeFindFactory, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_TYPE_FIND_FACTORY_H__ */
diff --git a/gst/gsturi.c b/gst/gsturi.c
index 52f951b..8623d44 100644
--- a/gst/gsturi.c
+++ b/gst/gsturi.c
@@ -118,25 +118,6 @@
 }
 #endif
 
-#if !GLIB_CHECK_VERSION (2, 33, 4)
-#define g_list_copy_deep gst_g_list_copy_deep
-static GList *
-gst_g_list_copy_deep (GList * list, GCopyFunc func, gpointer user_data)
-{
-  list = g_list_copy (list);
-
-  if (func != NULL) {
-    GList *l;
-
-    for (l = list; l != NULL; l = l->next) {
-      l->data = func (l->data, user_data);
-    }
-  }
-
-  return list;
-}
-#endif
-
 GType
 gst_uri_handler_get_type (void)
 {
diff --git a/gst/gsturi.h b/gst/gsturi.h
index 64dc65b..6e1504c 100644
--- a/gst/gsturi.h
+++ b/gst/gsturi.h
@@ -261,10 +261,6 @@
  * Returns: (transfer full): A new #GstUri object which is a copy of this
  *          #GstUri or %NULL.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstUri * gst_uri_copy (const GstUri * uri);
-#endif
-
 static inline GstUri *
 gst_uri_copy (const GstUri * uri)
 {
@@ -280,10 +276,6 @@
  *
  * Returns: This object with the reference count incremented.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstUri * gst_uri_ref (GstUri * uri);
-#endif
-
 static inline GstUri *
 gst_uri_ref (GstUri * uri)
 {
@@ -300,16 +292,16 @@
  *
  * See gst_mini_object_unref() for further info.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_uri_unref (GstUri * uri);
-#endif
-
 static inline void
 gst_uri_unref (GstUri * uri)
 {
   gst_mini_object_unref (GST_MINI_OBJECT_CAST (uri));
 }
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstUri, gst_uri_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_URI_H__ */
diff --git a/gst/gstutils.h b/gst/gstutils.h
index 186f439..457a76a 100644
--- a/gst/gstutils.h
+++ b/gst/gstutils.h
@@ -116,22 +116,22 @@
 #ifndef __GTK_DOC_IGNORE__
 #if GST_HAVE_UNALIGNED_ACCESS
 static inline guint16 __gst_fast_read16(const guint8 *v) {
-  return *(const guint16*)(v);
+  return *(const guint16*)(const void*)(v);
 }
 static inline guint32 __gst_fast_read32(const guint8 *v) {
-  return *(const guint32*)(v);
+  return *(const guint32*)(const void*)(v);
 }
 static inline guint64 __gst_fast_read64(const guint8 *v) {
-  return *(const guint64*)(v);
+  return *(const guint64*)(const void*)(v);
 }
 static inline guint16 __gst_fast_read_swap16(const guint8 *v) {
-  return GUINT16_SWAP_LE_BE(*(const guint16*)(v));
+  return GUINT16_SWAP_LE_BE(*(const guint16*)(const void*)(v));
 }
 static inline guint32 __gst_fast_read_swap32(const guint8 *v) {
-  return GUINT32_SWAP_LE_BE(*(const guint32*)(v));
+  return GUINT32_SWAP_LE_BE(*(const guint32*)(const void*)(v));
 }
 static inline guint64 __gst_fast_read_swap64(const guint8 *v) {
-  return GUINT64_SWAP_LE_BE(*(const guint64*)(v));
+  return GUINT64_SWAP_LE_BE(*(const guint64*)(const void*)(v));
 }
 # define _GST_FAST_READ(s, d) __gst_fast_read##s((const guint8 *)(d))
 # define _GST_FAST_READ_SWAP(s, d) __gst_fast_read_swap##s((const guint8 *)(d))
@@ -451,11 +451,7 @@
  *
  * Returns: @in byte-swapped.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gfloat GFLOAT_SWAP_LE_BE (gfloat in);
-#endif
-
-inline static gfloat
+static inline gfloat
 GFLOAT_SWAP_LE_BE(gfloat in)
 {
   union
@@ -477,11 +473,7 @@
  *
  * Returns: @in byte-swapped.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gdouble GDOUBLE_SWAP_LE_BE (gdouble in);
-#endif
-
-inline static gdouble
+static inline gdouble
 GDOUBLE_SWAP_LE_BE(gdouble in)
 {
   union
@@ -584,11 +576,7 @@
  *
  * Returns: The floating point value read from @data
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gfloat GST_READ_FLOAT_LE (const guint8 *data);
-#endif
-
-inline static gfloat
+static inline gfloat
 GST_READ_FLOAT_LE(const guint8 *data)
 {
   union
@@ -609,11 +597,7 @@
  *
  * Returns: The floating point value read from @data
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gfloat GST_READ_FLOAT_BE (const guint8 *data);
-#endif
-
-inline static gfloat
+static inline gfloat
 GST_READ_FLOAT_BE(const guint8 *data)
 {
   union
@@ -634,11 +618,7 @@
  *
  * Returns: The double-precision floating point value read from @data
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gdouble GST_READ_DOUBLE_LE (const guint8 *data);
-#endif
-
-inline static gdouble
+static inline gdouble
 GST_READ_DOUBLE_LE(const guint8 *data)
 {
   union
@@ -659,11 +639,7 @@
  *
  * Returns: The double-precision floating point value read from @data
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gdouble GST_READ_DOUBLE_BE (const guint8 *data);
-#endif
-
-inline static gdouble
+static inline gdouble
 GST_READ_DOUBLE_BE(const guint8 *data)
 {
   union
@@ -683,11 +659,7 @@
  *
  * Store a 32 bit float value in little endian format into the memory buffer.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_FLOAT_LE (guint8 *data, gfloat num);
-#endif
-
-inline static void
+static inline void
 GST_WRITE_FLOAT_LE(guint8 *data, gfloat num)
 {
   union
@@ -707,11 +679,7 @@
  *
  * Store a 32 bit float value in big endian format into the memory buffer.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_FLOAT_BE (guint8 *data, gfloat num);
-#endif
-
-inline static void
+static inline void
 GST_WRITE_FLOAT_BE(guint8 *data, gfloat num)
 {
   union
@@ -731,11 +699,7 @@
  *
  * Store a 64 bit double value in little endian format into the memory buffer.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_DOUBLE_LE (guint8 *data, gdouble num);
-#endif
-
-inline static void
+static inline void
 GST_WRITE_DOUBLE_LE(guint8 *data, gdouble num)
 {
   union
@@ -755,11 +719,7 @@
  *
  * Store a 64 bit double value in big endian format into the memory buffer.
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_DOUBLE_BE (guint8 *data, gdouble num);
-#endif
-
-inline static void
+static inline void
 GST_WRITE_DOUBLE_BE(guint8 *data, gdouble num)
 {
   union
diff --git a/gst/gstvalue.c b/gst/gstvalue.c
index 37a59bf..f876be0 100644
--- a/gst/gstvalue.c
+++ b/gst/gstvalue.c
@@ -6568,20 +6568,7 @@
 GType
 gst_g_thread_get_type (void)
 {
-#if GLIB_CHECK_VERSION(2,35,3)
   return G_TYPE_THREAD;
-#else
-  static volatile gsize type_id = 0;
-
-  if (g_once_init_enter (&type_id)) {
-    GType tmp =
-        g_boxed_type_register_static (g_intern_static_string ("GstGThread"),
-        (GBoxedCopyFunc) g_thread_ref, (GBoxedFreeFunc) g_thread_unref);
-    g_once_init_leave (&type_id, tmp);
-  }
-
-  return type_id;
-#endif
 }
 
 #define SERIAL_VTABLE(t,c,s,d) { t, c, s, d }
diff --git a/gst/parse/Makefile.in b/gst/parse/Makefile.in
index ab17d32..8375bd4 100644
--- a/gst/parse/Makefile.in
+++ b/gst/parse/Makefile.in
@@ -332,6 +332,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/gst/printf/Makefile.in b/gst/printf/Makefile.in
index a93e9e4..fd805fb 100644
--- a/gst/printf/Makefile.in
+++ b/gst/printf/Makefile.in
@@ -329,6 +329,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/gstreamer.doap b/gstreamer.doap
index 91fa19c..49483f0 100644
--- a/gstreamer.doap
+++ b/gstreamer.doap
@@ -40,6 +40,16 @@
 
  <release>
   <Version>
+   <revision>1.7.1</revision>
+   <branch>master</branch>
+   <name></name>
+   <created>2015-12-24</created>
+   <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.7.1.tar.xz" />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
    <revision>1.6.2</revision>
    <branch>1.6</branch>
    <name></name>
diff --git a/gstreamer.spec b/gstreamer.spec
index 742eff8..4d473a7 100644
--- a/gstreamer.spec
+++ b/gstreamer.spec
@@ -1,10 +1,10 @@
 %define		gstreamer	gstreamer1
 %define		majorminor	1.0
 
-%define 	_glib2		2.32.0
+%define 	_glib2		2.40.0
 
 Name: 		%{gstreamer}
-Version: 	1.6.2
+Version: 	1.7.1
 Release: 	1
 Summary: 	GStreamer streaming media framework runtime
 
diff --git a/libs/Makefile.in b/libs/Makefile.in
index 7c0f0e8..d831f14 100644
--- a/libs/Makefile.in
+++ b/libs/Makefile.in
@@ -333,6 +333,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/Makefile.in b/libs/gst/Makefile.in
index 97d94e6..cf98105 100644
--- a/libs/gst/Makefile.in
+++ b/libs/gst/Makefile.in
@@ -332,6 +332,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/base/Makefile.am b/libs/gst/base/Makefile.am
index 92424ab..fd26842 100644
--- a/libs/gst/base/Makefile.am
+++ b/libs/gst/base/Makefile.am
@@ -69,7 +69,8 @@
 		$(INTROSPECTION_SCANNER) -v --namespace GstBase \
 		--nsversion=@GST_API_VERSION@ \
 		--warn-all \
-		--strip-prefix=Gst \
+		--identifier-prefix=Gst \
+		--symbol-prefix=gst \
 		-I$(top_srcdir) \
 		-I$(top_srcdir)/libs \
 		-I$(top_builddir) \
diff --git a/libs/gst/base/Makefile.in b/libs/gst/base/Makefile.in
index a6f1742..4b39ab2 100644
--- a/libs/gst/base/Makefile.in
+++ b/libs/gst/base/Makefile.in
@@ -379,6 +379,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -1124,7 +1126,8 @@
 @HAVE_INTROSPECTION_TRUE@		$(INTROSPECTION_SCANNER) -v --namespace GstBase \
 @HAVE_INTROSPECTION_TRUE@		--nsversion=@GST_API_VERSION@ \
 @HAVE_INTROSPECTION_TRUE@		--warn-all \
-@HAVE_INTROSPECTION_TRUE@		--strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--symbol-prefix=gst \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir) \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir)/libs \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_builddir) \
diff --git a/libs/gst/base/gstadapter.h b/libs/gst/base/gstadapter.h
index a5cfb68..bb8c77d 100644
--- a/libs/gst/base/gstadapter.h
+++ b/libs/gst/base/gstadapter.h
@@ -82,6 +82,10 @@
 gssize                  gst_adapter_masked_scan_uint32_peek  (GstAdapter * adapter, guint32 mask,
                                                          guint32 pattern, gsize offset, gsize size, guint32 * value);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAdapter, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_ADAPTER_H__ */
diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
index c9a57c5..ac357d9 100644
--- a/libs/gst/base/gstbaseparse.c
+++ b/libs/gst/base/gstbaseparse.c
@@ -219,6 +219,9 @@
 #define MIN_FRAMES_TO_POST_BITRATE 10
 #define TARGET_DIFFERENCE          (20 * GST_SECOND)
 #define MAX_INDEX_ENTRIES          4096
+#define UPDATE_THRESHOLD           2
+
+#define ABSDIFF(a,b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
 
 GST_DEBUG_CATEGORY_STATIC (gst_base_parse_debug);
 #define GST_CAT_DEFAULT gst_base_parse_debug
@@ -1691,11 +1694,8 @@
 static void
 gst_base_parse_update_bitrates (GstBaseParse * parse, GstBaseParseFrame * frame)
 {
-  /* Only update the tag on a 10 kbps delta */
-  static const gint update_threshold = 10000;
-
   guint64 data_len, frame_dur;
-  gint overhead, frame_bitrate, old_avg_bitrate;
+  gint overhead, frame_bitrate;
   GstBuffer *buffer = frame->buffer;
 
   overhead = frame->overhead;
@@ -1755,11 +1755,14 @@
         parse->priv->tags_changed = TRUE;
     }
 
-    old_avg_bitrate = parse->priv->posted_avg_bitrate;
-    if (((gint) (old_avg_bitrate - parse->priv->avg_bitrate) > update_threshold
-            || (gint) (parse->priv->avg_bitrate - old_avg_bitrate) >
-            update_threshold) && parse->priv->post_avg_bitrate)
-      parse->priv->tags_changed = TRUE;
+    /* Only update the tag on a 2% change */
+    if (parse->priv->post_avg_bitrate && parse->priv->avg_bitrate) {
+      guint64 diffprev = gst_util_uint64_scale_int (100,
+          ABSDIFF (parse->priv->avg_bitrate, parse->priv->posted_avg_bitrate),
+          parse->priv->avg_bitrate);
+      if (diffprev >= UPDATE_THRESHOLD)
+        parse->priv->tags_changed = TRUE;
+    }
   }
 }
 
diff --git a/libs/gst/base/gstbaseparse.h b/libs/gst/base/gstbaseparse.h
index 94522cc..f3081ef 100644
--- a/libs/gst/base/gstbaseparse.h
+++ b/libs/gst/base/gstbaseparse.h
@@ -349,6 +349,14 @@
                                                  GstTagList    * tags,
                                                  GstTagMergeMode mode);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseParseFrame, gst_base_parse_frame_free)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseParse, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_BASE_PARSE_H__ */
diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c
index f5fea82..34ccdac 100644
--- a/libs/gst/base/gstbasesink.c
+++ b/libs/gst/base/gstbasesink.c
@@ -1659,7 +1659,9 @@
       /* update the segment clipping regions for non-flushing seeks */
       if (segment->rate > 0.0) {
         if (end != -1)
-          position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+          position =
+              gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+              end);
         else
           position = segment->stop;
 
@@ -1667,7 +1669,9 @@
         segment->position = position;
       } else {
         if (end != -1)
-          position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+          position =
+              gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+              end);
         else
           position = segment->start;
 
@@ -1803,10 +1807,14 @@
         step_end = TRUE;
         if (segment->rate > 0.0) {
           *rstart = end;
-          *cstart = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+          *cstart =
+              gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+              end);
         } else {
           *rstop = end;
-          *cstop = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+          *cstop =
+              gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+              end);
         }
       }
       GST_DEBUG_OBJECT (sink,
diff --git a/libs/gst/base/gstbasesink.h b/libs/gst/base/gstbasesink.h
index d09b7e8..1df5d65 100644
--- a/libs/gst/base/gstbasesink.h
+++ b/libs/gst/base/gstbasesink.h
@@ -44,18 +44,18 @@
  */
 #define GST_BASE_SINK_PAD(obj)          (GST_BASE_SINK_CAST (obj)->sinkpad)
 
-#define GST_BASE_SINK_GET_PREROLL_LOCK(pad)   (&GST_BASE_SINK_CAST(pad)->preroll_lock)
-#define GST_BASE_SINK_PREROLL_LOCK(pad)       (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
-#define GST_BASE_SINK_PREROLL_TRYLOCK(pad)    (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
-#define GST_BASE_SINK_PREROLL_UNLOCK(pad)     (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+#define GST_BASE_SINK_GET_PREROLL_LOCK(obj)   (&GST_BASE_SINK_CAST(obj)->preroll_lock)
+#define GST_BASE_SINK_PREROLL_LOCK(obj)       (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
+#define GST_BASE_SINK_PREROLL_TRYLOCK(obj)    (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
+#define GST_BASE_SINK_PREROLL_UNLOCK(obj)     (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
 
-#define GST_BASE_SINK_GET_PREROLL_COND(pad)   (&GST_BASE_SINK_CAST(pad)->preroll_cond)
-#define GST_BASE_SINK_PREROLL_WAIT(pad)       \
-      g_cond_wait (GST_BASE_SINK_GET_PREROLL_COND (pad), GST_BASE_SINK_GET_PREROLL_LOCK (pad))
-#define GST_BASE_SINK_PREROLL_WAIT_UNTIL(pad, end_time) \
-      g_cond_wait_until (GST_BASE_SINK_GET_PREROLL_COND (pad), GST_BASE_SINK_GET_PREROLL_LOCK (pad), end_time)
-#define GST_BASE_SINK_PREROLL_SIGNAL(pad)     g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (pad));
-#define GST_BASE_SINK_PREROLL_BROADCAST(pad)  g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (pad));
+#define GST_BASE_SINK_GET_PREROLL_COND(obj)   (&GST_BASE_SINK_CAST(obj)->preroll_cond)
+#define GST_BASE_SINK_PREROLL_WAIT(obj)       \
+      g_cond_wait (GST_BASE_SINK_GET_PREROLL_COND (obj), GST_BASE_SINK_GET_PREROLL_LOCK (obj))
+#define GST_BASE_SINK_PREROLL_WAIT_UNTIL(obj, end_time) \
+      g_cond_wait_until (GST_BASE_SINK_GET_PREROLL_COND (obj), GST_BASE_SINK_GET_PREROLL_LOCK (obj), end_time)
+#define GST_BASE_SINK_PREROLL_SIGNAL(obj)     g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (obj));
+#define GST_BASE_SINK_PREROLL_BROADCAST(obj)  g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (obj));
 
 typedef struct _GstBaseSink GstBaseSink;
 typedef struct _GstBaseSinkClass GstBaseSinkClass;
@@ -254,6 +254,10 @@
 GstFlowReturn   gst_base_sink_wait              (GstBaseSink *sink, GstClockTime time,
                                                  GstClockTimeDiff *jitter);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseSink, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_BASE_SINK_H__ */
diff --git a/libs/gst/base/gstbasesrc.h b/libs/gst/base/gstbasesrc.h
index 4ddfda9..a89c8a8 100644
--- a/libs/gst/base/gstbasesrc.h
+++ b/libs/gst/base/gstbasesrc.h
@@ -272,6 +272,10 @@
                                                GstAllocationParams *params);
 
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseSrc, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_BASE_SRC_H__ */
diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c
index aa169c3..de04a48 100644
--- a/libs/gst/base/gstbasetransform.c
+++ b/libs/gst/base/gstbasetransform.c
@@ -536,7 +536,7 @@
     ret = klass->transform_caps (trans, direction, caps, filter);
     GST_LOG_OBJECT (trans, "  to: %" GST_PTR_FORMAT, ret);
 
-#ifndef G_DISABLE_ASSERT
+#ifdef GST_ENABLE_EXTRA_CHECKS
     if (filter) {
       if (!gst_caps_is_subset (ret, filter)) {
         GstCaps *intersection;
diff --git a/libs/gst/base/gstbasetransform.h b/libs/gst/base/gstbasetransform.h
index ab795e8..2fe25ec 100644
--- a/libs/gst/base/gstbasetransform.h
+++ b/libs/gst/base/gstbasetransform.h
@@ -317,6 +317,10 @@
 void		gst_base_transform_reconfigure_src  (GstBaseTransform *trans);
 gboolean gst_base_transform_update_src_caps (GstBaseTransform *trans,
                                              GstCaps *updated_caps);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseTransform, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_BASE_TRANSFORM_H__ */
diff --git a/libs/gst/base/gstbytewriter.h b/libs/gst/base/gstbytewriter.h
index f5c5502..c01bfcb 100644
--- a/libs/gst/base/gstbytewriter.h
+++ b/libs/gst/base/gstbytewriter.h
@@ -90,11 +90,6 @@
  *
  * Returns: The current, initialized size of the data
  */
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC guint     gst_byte_writer_get_pos  (const GstByteWriter *writer);
-G_INLINE_FUNC gboolean  gst_byte_writer_set_pos  (GstByteWriter *writer, guint pos);
-G_INLINE_FUNC guint     gst_byte_writer_get_size (const GstByteWriter *writer);
-#else
 static inline guint
 gst_byte_writer_get_pos (const GstByteWriter *writer)
 {
@@ -112,7 +107,6 @@
 {
   return gst_byte_reader_get_size ((const GstByteReader *) writer);
 }
-#endif
 
 guint           gst_byte_writer_get_remaining     (const GstByteWriter *writer);
 gboolean        gst_byte_writer_ensure_free_space (GstByteWriter *writer, guint size);
diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c
index 8edfe41..dc18222 100644
--- a/libs/gst/base/gstcollectpads.c
+++ b/libs/gst/base/gstcollectpads.c
@@ -508,8 +508,7 @@
   *outbuf = buf;
 
   /* invalid left alone and passed */
-  if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buf))
-          || GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buf)))) {
+  if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS_OR_PTS (buf)))) {
     GstClockTime time;
     GstClockTime buf_dts, abs_dts;
     gint dts_sign;
@@ -1479,10 +1478,7 @@
     buffer = gst_collect_pads_peek (pads, data);
     /* if we have a buffer check if it is better then the current best one */
     if (buffer != NULL) {
-      timestamp = GST_BUFFER_DTS (buffer);
-      if (!GST_CLOCK_TIME_IS_VALID (timestamp)) {
-        timestamp = GST_BUFFER_PTS (buffer);
-      }
+      timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
       gst_buffer_unref (buffer);
       if (best == NULL || pads->priv->compare_func (pads, data, timestamp,
               best, best_time, pads->priv->compare_user_data) < 0) {
@@ -2207,9 +2203,7 @@
   if (G_LIKELY (data->segment.format == GST_FORMAT_TIME)) {
     GstClockTime timestamp;
 
-    timestamp = GST_BUFFER_DTS (buffer);
-    if (!GST_CLOCK_TIME_IS_VALID (timestamp))
-      timestamp = GST_BUFFER_PTS (buffer);
+    timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
 
     if (GST_CLOCK_TIME_IS_VALID (timestamp))
       data->segment.position = timestamp;
diff --git a/libs/gst/base/gstcollectpads.h b/libs/gst/base/gstcollectpads.h
index cfa29eb..0a73785 100644
--- a/libs/gst/base/gstcollectpads.h
+++ b/libs/gst/base/gstcollectpads.h
@@ -410,6 +410,10 @@
                                                 GstQuery * query, gboolean discard);
 
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCollectPads, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_COLLECT_PADS_H__ */
diff --git a/libs/gst/base/gstdataqueue.h b/libs/gst/base/gstdataqueue.h
index cc454f8..f1fd9be 100644
--- a/libs/gst/base/gstdataqueue.h
+++ b/libs/gst/base/gstdataqueue.h
@@ -161,6 +161,10 @@
 
 void           gst_data_queue_limits_changed (GstDataQueue * queue);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDataQueue, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_DATA_QUEUE_H__ */
diff --git a/libs/gst/base/gstflowcombiner.h b/libs/gst/base/gstflowcombiner.h
index 79e4bed..2ea3937 100644
--- a/libs/gst/base/gstflowcombiner.h
+++ b/libs/gst/base/gstflowcombiner.h
@@ -60,6 +60,10 @@
 
 GType             gst_flow_combiner_get_type (void);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstFlowCombiner, gst_flow_combiner_free)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_FLOW_COMBINER_H__ */
diff --git a/libs/gst/base/gstindex.h b/libs/gst/base/gstindex.h
index b943efb..c80fa6c 100644
--- a/libs/gst/base/gstindex.h
+++ b/libs/gst/base/gstindex.h
@@ -217,6 +217,7 @@
       const gchar       *key;
     } format;
   } data;
+  // FIXME 2.0: add padding
 };
 
 /**
@@ -238,6 +239,7 @@
 
   /* peer group that contains more certain entries */
   gint peergroup;
+  // FIXME 2.0: add padding
 };
 
 /**
diff --git a/libs/gst/base/gstpushsrc.h b/libs/gst/base/gstpushsrc.h
index 768d4ba..dbee559 100644
--- a/libs/gst/base/gstpushsrc.h
+++ b/libs/gst/base/gstpushsrc.h
@@ -84,6 +84,10 @@
 
 GType gst_push_src_get_type(void);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPushSrc, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PUSH_SRC_H__ */
diff --git a/libs/gst/check/Makefile.am b/libs/gst/check/Makefile.am
index 1791c83..57593ea 100644
--- a/libs/gst/check/Makefile.am
+++ b/libs/gst/check/Makefile.am
@@ -218,7 +218,8 @@
 		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 		$(INTROSPECTION_SCANNER) -v --namespace GstCheck \
 		--nsversion=@GST_API_VERSION@ \
-		--strip-prefix=Gst \
+		--identifier-prefix=Gst \
+		--symbol-prefix=gst \
 		--warn-all \
 		-I$(top_srcdir) \
 		-I$(top_srcdir)/libs \
diff --git a/libs/gst/check/Makefile.in b/libs/gst/check/Makefile.in
index 2de7b42..f7142d9 100644
--- a/libs/gst/check/Makefile.in
+++ b/libs/gst/check/Makefile.in
@@ -414,6 +414,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -1341,7 +1343,8 @@
 @HAVE_INTROSPECTION_TRUE@		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 @HAVE_INTROSPECTION_TRUE@		$(INTROSPECTION_SCANNER) -v --namespace GstCheck \
 @HAVE_INTROSPECTION_TRUE@		--nsversion=@GST_API_VERSION@ \
-@HAVE_INTROSPECTION_TRUE@		--strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--symbol-prefix=gst \
 @HAVE_INTROSPECTION_TRUE@		--warn-all \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir) \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir)/libs \
diff --git a/libs/gst/check/gstharness.c b/libs/gst/check/gstharness.c
index a196e48..68b6b4e 100644
--- a/libs/gst/check/gstharness.c
+++ b/libs/gst/check/gstharness.c
@@ -23,11 +23,11 @@
  * @short_description: A test-harness for writing GStreamer unit tests
  * @see_also: #GstTestClock,\
  *
- * #GstHarness is ment to make writing unit test for GStreamer much easier.
- * It can be though of as a way of treating a #GstElement as a black box,
- * deterministially feeding it data, and controlling what data it outputs.
+ * #GstHarness is meant to make writing unit test for GStreamer much easier.
+ * It can be thought of as a way of treating a #GstElement as a black box,
+ * deterministically feeding it data, and controlling what data it outputs.
  *
- * The basic structure of #GstHarness is two "floating" #GstPads, that connects
+ * The basic structure of #GstHarness is two "floating" #GstPads that connect
  * to the harnessed #GstElement src and sink #GstPads like so:
  *
  * <programlisting>
@@ -42,17 +42,17 @@
  *
  * With this, you can now simulate any environment the #GstElement might find
  * itself in. By specifying the #GstCaps of the harness #GstPads, using
- * functions like gst_harness_set_src_caps or gst_harness_set_sink_caps_str,
- * you can test how the #GstElement interacts with different capssets.
+ * functions like gst_harness_set_src_caps() or gst_harness_set_sink_caps_str(),
+ * you can test how the #GstElement interacts with different caps sets.
  *
  * Your harnessed #GstElement can of course also be a bin, and using
- * gst_harness_new_parse supporting standard gst-launch syntax, you can
+ * gst_harness_new_parse() supporting standard gst-launch syntax, you can
  * easily test a whole pipeline instead of just one element.
  *
  * You can then go on to push #GstBuffers and #GstEvents on to the srcpad,
- * using functions like gst_harness_push and gst_harness_push_event, and
- * then pull them out to examine them with gst_harness_pull and
- * gst_harness_pull_event.
+ * using functions like gst_harness_push() and gst_harness_push_event(), and
+ * then pull them out to examine them with gst_harness_pull() and
+ * gst_harness_pull_event().
  *
  * <example>
  * <title>A simple buffer-in buffer-out example</title>
@@ -92,14 +92,14 @@
  * #GstTestClock. Operating the #GstTestClock can be very challenging, but
  * #GstHarness simplifies some of the most desired actions a lot, like wanting
  * to manually advance the clock while at the same time releasing a #GstClockID
- * that is waiting, with functions like gst_harness_crank_single_clock_wait.
+ * that is waiting, with functions like gst_harness_crank_single_clock_wait().
  *
  * #GstHarness also supports sub-harnesses, as a way of generating and
  * validating data. A sub-harness is another #GstHarness that is managed by
  * the "parent" harness, and can either be created by using the standard
  * gst_harness_new type functions directly on the (GstHarness *)->src_harness,
- * or using the much more convenient gst_harness_add_src or
- * gst_harness_add_sink_parse. If you have a decoder-element you want to test,
+ * or using the much more convenient gst_harness_add_src() or
+ * gst_harness_add_sink_parse(). If you have a decoder-element you want to test,
  * (like vp8dec) it can be very useful to add a src-harness with both a
  * src-element (videotestsrc) and an encoder (vp8enc) to feed the decoder data
  * with different configurations, by simply doing:
diff --git a/libs/gst/check/gsttestclock.h b/libs/gst/check/gsttestclock.h
index af7a5f1..cccbae3 100644
--- a/libs/gst/check/gsttestclock.h
+++ b/libs/gst/check/gsttestclock.h
@@ -114,6 +114,10 @@
 
 GstClockTime  gst_test_clock_id_list_get_latest_time (const GList * pending_list);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTestClock, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_TEST_CLOCK_H__ */
diff --git a/libs/gst/check/libcheck/Makefile.in b/libs/gst/check/libcheck/Makefile.in
index 2e0a7f2..a03ca69 100644
--- a/libs/gst/check/libcheck/Makefile.in
+++ b/libs/gst/check/libcheck/Makefile.in
@@ -370,6 +370,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/controller/Makefile.am b/libs/gst/controller/Makefile.am
index c89aa9c..ffc4afd 100644
--- a/libs/gst/controller/Makefile.am
+++ b/libs/gst/controller/Makefile.am
@@ -41,7 +41,8 @@
 		$(INTROSPECTION_SCANNER) -v --namespace GstController \
 		--nsversion=@GST_API_VERSION@ \
 		--warn-all \
-		--strip-prefix=Gst \
+		--identifier-prefix=Gst \
+		--symbol-prefix=gst \
 		-I$(top_srcdir) \
 		-I$(top_srcdir)/libs \
 		-I$(top_builddir) \
diff --git a/libs/gst/controller/Makefile.in b/libs/gst/controller/Makefile.in
index 6b88ff9..7436270 100644
--- a/libs/gst/controller/Makefile.in
+++ b/libs/gst/controller/Makefile.in
@@ -354,6 +354,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -960,7 +962,8 @@
 @HAVE_INTROSPECTION_TRUE@		$(INTROSPECTION_SCANNER) -v --namespace GstController \
 @HAVE_INTROSPECTION_TRUE@		--nsversion=@GST_API_VERSION@ \
 @HAVE_INTROSPECTION_TRUE@		--warn-all \
-@HAVE_INTROSPECTION_TRUE@		--strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--symbol-prefix=gst \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir) \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir)/libs \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_builddir) \
diff --git a/libs/gst/controller/gstargbcontrolbinding.h b/libs/gst/controller/gstargbcontrolbinding.h
index 6b51197..c698b07 100644
--- a/libs/gst/controller/gstargbcontrolbinding.h
+++ b/libs/gst/controller/gstargbcontrolbinding.h
@@ -93,6 +93,10 @@
                                                             GstControlSource * cs_a, GstControlSource * cs_r,
                                                             GstControlSource * cs_g, GstControlSource * cs_b);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstARGBControlBinding, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_ARGB_CONTROL_BINDING_H__ */
diff --git a/libs/gst/controller/gstdirectcontrolbinding.h b/libs/gst/controller/gstdirectcontrolbinding.h
index 5b816c8..5732ad8 100644
--- a/libs/gst/controller/gstdirectcontrolbinding.h
+++ b/libs/gst/controller/gstdirectcontrolbinding.h
@@ -90,7 +90,8 @@
     struct {
       gboolean want_absolute;
     } abi;
-  } ABI;};
+  } ABI;
+};
 
 /**
  * GstDirectControlBindingClass:
@@ -118,6 +119,10 @@
 GstControlBinding * gst_direct_control_binding_new_absolute (GstObject * object, const gchar * property_name, 
                                                     GstControlSource * cs);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDirectControlBinding, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_DIRECT_CONTROL_BINDING_H__ */
diff --git a/libs/gst/controller/gstinterpolationcontrolsource.c b/libs/gst/controller/gstinterpolationcontrolsource.c
index b8a3c22..5957049 100644
--- a/libs/gst/controller/gstinterpolationcontrolsource.c
+++ b/libs/gst/controller/gstinterpolationcontrolsource.c
@@ -46,13 +46,67 @@
 #define GST_CAT_DEFAULT controller_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
 
+/* helper functions */
+
+static inline gboolean
+_get_nearest_control_points (GstTimedValueControlSource * self,
+    GstClockTime ts, GstControlPoint ** cp1, GstControlPoint ** cp2)
+{
+  GSequenceIter *iter;
+
+  iter = gst_timed_value_control_source_find_control_point_iter (self, ts);
+  if (iter) {
+    *cp1 = g_sequence_get (iter);
+    iter = g_sequence_iter_next (iter);
+    if (iter && !g_sequence_iter_is_end (iter)) {
+      *cp2 = g_sequence_get (iter);
+    } else {
+      *cp2 = NULL;
+    }
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static inline void
+_get_nearest_control_points2 (GstTimedValueControlSource * self,
+    GstClockTime ts, GstControlPoint ** cp1, GstControlPoint ** cp2,
+    GstClockTime * next_ts)
+{
+  GSequenceIter *iter1, *iter2 = NULL;
+
+  *cp1 = *cp2 = NULL;
+  iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
+  if (iter1) {
+    *cp1 = g_sequence_get (iter1);
+    iter2 = g_sequence_iter_next (iter1);
+  } else {
+    if (G_LIKELY (self->values)) {
+      /* all values in the control point list come after the given timestamp */
+      iter2 = g_sequence_get_begin_iter (self->values);
+      /* why this? if !cp1 we don't interpolate anyway
+       * if we can eliminate this, we can also use _get_nearest_control_points()
+       * here, is this just to set next_ts? */
+    } else {
+      /* no values */
+      iter2 = NULL;
+    }
+  }
+
+  if (iter2 && !g_sequence_iter_is_end (iter2)) {
+    *cp2 = g_sequence_get (iter2);
+    *next_ts = (*cp2)->timestamp;
+  } else {
+    *next_ts = GST_CLOCK_TIME_NONE;
+  }
+}
+
+
 /*  steps-like (no-)interpolation, default */
 /*  just returns the value for the most recent key-frame */
 static inline gdouble
-_interpolate_none (GstTimedValueControlSource * self, GSequenceIter * iter)
+_interpolate_none (GstTimedValueControlSource * self, GstControlPoint * cp)
 {
-  GstControlPoint *cp = g_sequence_get (iter);
-
   return cp->value;
 }
 
@@ -62,13 +116,15 @@
 {
   gboolean ret = FALSE;
   GSequenceIter *iter;
+  GstControlPoint *cp;
 
   g_mutex_lock (&self->lock);
 
   iter =
       gst_timed_value_control_source_find_control_point_iter (self, timestamp);
   if (iter) {
-    *value = _interpolate_none (self, iter);
+    cp = g_sequence_get (iter);
+    *value = _interpolate_none (self, cp);
     ret = TRUE;
   }
   g_mutex_unlock (&self->lock);
@@ -84,43 +140,24 @@
   guint i;
   GstClockTime ts = timestamp;
   GstClockTime next_ts = 0;
-  gdouble val;
-  GSequenceIter *iter1 = NULL, *iter2 = NULL;
+  GstControlPoint *cp1 = NULL, *cp2 = NULL;
 
   g_mutex_lock (&self->lock);
 
   for (i = 0; i < n_values; i++) {
     GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
         i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
-    val = NAN;
     if (ts >= next_ts) {
-      iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
-      if (!iter1) {
-        if (G_LIKELY (self->values))
-          iter2 = g_sequence_get_begin_iter (self->values);
-        else
-          iter2 = NULL;
-      } else {
-        iter2 = g_sequence_iter_next (iter1);
-      }
-
-      if (iter2 && !g_sequence_iter_is_end (iter2)) {
-        GstControlPoint *cp;
-
-        cp = g_sequence_get (iter2);
-        next_ts = cp->timestamp;
-      } else {
-        next_ts = GST_CLOCK_TIME_NONE;
-      }
+      _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
     }
-    if (iter1) {
-      val = _interpolate_none (self, iter1);
+    if (cp1) {
+      *values = _interpolate_none (self, cp1);
       ret = TRUE;
-      GST_LOG ("values[%3d]=%lf", i, val);
+      GST_LOG ("values[%3d]=%lf", i, *values);
     } else {
+      *values = NAN;
       GST_LOG ("values[%3d]=-", i);
     }
-    *values = val;
     ts += interval;
     values++;
   }
@@ -152,22 +189,11 @@
     GstClockTime timestamp, gdouble * value)
 {
   gboolean ret = FALSE;
-  GSequenceIter *iter;
   GstControlPoint *cp1, *cp2;
 
   g_mutex_lock (&self->lock);
 
-  iter =
-      gst_timed_value_control_source_find_control_point_iter (self, timestamp);
-  if (iter) {
-    cp1 = g_sequence_get (iter);
-    iter = g_sequence_iter_next (iter);
-    if (iter && !g_sequence_iter_is_end (iter)) {
-      cp2 = g_sequence_get (iter);
-    } else {
-      cp2 = NULL;
-    }
-
+  if (_get_nearest_control_points (self, timestamp, &cp1, &cp2)) {
     *value = _interpolate_linear (cp1->timestamp, cp1->value,
         (cp2 ? cp2->timestamp : GST_CLOCK_TIME_NONE),
         (cp2 ? cp2->value : 0.0), timestamp);
@@ -186,8 +212,6 @@
   guint i;
   GstClockTime ts = timestamp;
   GstClockTime next_ts = 0;
-  gdouble val;
-  GSequenceIter *iter1, *iter2 = NULL;
   GstControlPoint *cp1 = NULL, *cp2 = NULL;
 
   g_mutex_lock (&self->lock);
@@ -195,37 +219,19 @@
   for (i = 0; i < n_values; i++) {
     GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
         i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
-    val = NAN;
     if (ts >= next_ts) {
-      cp1 = cp2 = NULL;
-      iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
-      if (!iter1) {
-        if (G_LIKELY (self->values))
-          iter2 = g_sequence_get_begin_iter (self->values);
-        else
-          iter2 = NULL;
-      } else {
-        cp1 = g_sequence_get (iter1);
-        iter2 = g_sequence_iter_next (iter1);
-      }
-
-      if (iter2 && !g_sequence_iter_is_end (iter2)) {
-        cp2 = g_sequence_get (iter2);
-        next_ts = cp2->timestamp;
-      } else {
-        next_ts = GST_CLOCK_TIME_NONE;
-      }
+      _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
     }
     if (cp1) {
-      val = _interpolate_linear (cp1->timestamp, cp1->value,
+      *values = _interpolate_linear (cp1->timestamp, cp1->value,
           (cp2 ? cp2->timestamp : GST_CLOCK_TIME_NONE),
           (cp2 ? cp2->value : 0.0), ts);
       ret = TRUE;
-      GST_LOG ("values[%3d]=%lf", i, val);
+      GST_LOG ("values[%3d]=%lf", i, *values);
     } else {
+      *values = NAN;
       GST_LOG ("values[%3d]=-", i);
     }
-    *values = val;
     ts += interval;
     values++;
   }
@@ -366,7 +372,6 @@
     GstClockTime timestamp, gdouble * value)
 {
   gboolean ret = FALSE;
-  GSequenceIter *iter;
   GstControlPoint *cp1, *cp2 = NULL;
 
   if (self->nvalues <= 2)
@@ -374,16 +379,7 @@
 
   g_mutex_lock (&self->lock);
 
-  iter =
-      gst_timed_value_control_source_find_control_point_iter (self, timestamp);
-  if (iter) {
-    cp1 = g_sequence_get (iter);
-    iter = g_sequence_iter_next (iter);
-    if (iter && !g_sequence_iter_is_end (iter)) {
-      cp2 = g_sequence_get (iter);
-    } else {
-      cp2 = NULL;
-    }
+  if (_get_nearest_control_points (self, timestamp, &cp1, &cp2)) {
     *value = _interpolate_cubic (self, cp1, cp1->value, cp2,
         (cp2 ? cp2->value : 0.0), timestamp);
     ret = TRUE;
@@ -401,8 +397,6 @@
   guint i;
   GstClockTime ts = timestamp;
   GstClockTime next_ts = 0;
-  gdouble val;
-  GSequenceIter *iter1, *iter2 = NULL;
   GstControlPoint *cp1 = NULL, *cp2 = NULL;
 
   if (self->nvalues <= 2)
@@ -414,36 +408,18 @@
   for (i = 0; i < n_values; i++) {
     GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
         i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
-    val = NAN;
     if (ts >= next_ts) {
-      cp1 = cp2 = NULL;
-      iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
-      if (!iter1) {
-        if (G_LIKELY (self->values))
-          iter2 = g_sequence_get_begin_iter (self->values);
-        else
-          iter2 = NULL;
-      } else {
-        cp1 = g_sequence_get (iter1);
-        iter2 = g_sequence_iter_next (iter1);
-      }
-
-      if (iter2 && !g_sequence_iter_is_end (iter2)) {
-        cp2 = g_sequence_get (iter2);
-        next_ts = cp2->timestamp;
-      } else {
-        next_ts = GST_CLOCK_TIME_NONE;
-      }
+      _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
     }
     if (cp1) {
-      val = _interpolate_cubic (self, cp1, cp1->value, cp2,
+      *values = _interpolate_cubic (self, cp1, cp1->value, cp2,
           (cp2 ? cp2->value : 0.0), ts);
       ret = TRUE;
-      GST_LOG ("values[%3d]=%lf", i, val);
+      GST_LOG ("values[%3d]=%lf", i, *values);
     } else {
+      *values = NAN;
       GST_LOG ("values[%3d]=-", i);
     }
-    *values = val;
     ts += interval;
     values++;
   }
@@ -451,6 +427,176 @@
   return ret;
 }
 
+
+/*  monotonic cubic interpolation */
+
+/* the following functions implement monotonic cubic spline interpolation.
+ * For details: http://en.wikipedia.org/wiki/Monotone_cubic_interpolation
+ *
+ * In contrast to the previous cubic mode, the values won't overshoot.
+ */
+
+static void
+_interpolate_cubic_mono_update_cache (GstTimedValueControlSource * self)
+{
+  gint i, n = self->nvalues;
+  gdouble *dxs = g_new0 (gdouble, n);
+  gdouble *dys = g_new0 (gdouble, n);
+  gdouble *ms = g_new0 (gdouble, n);
+  gdouble *c1s = g_new0 (gdouble, n);
+
+  GSequenceIter *iter;
+  GstControlPoint *cp;
+  GstClockTime x, x_next, dx;
+  gdouble y, y_next, dy;
+
+  /* Get consecutive differences and slopes */
+  iter = g_sequence_get_begin_iter (self->values);
+  cp = g_sequence_get (iter);
+  x_next = cp->timestamp;
+  y_next = cp->value;
+  for (i = 0; i < n - 1; i++) {
+    x = x_next;
+    y = y_next;
+    iter = g_sequence_iter_next (iter);
+    cp = g_sequence_get (iter);
+    x_next = cp->timestamp;
+    y_next = cp->value;
+
+    dx = gst_guint64_to_gdouble (x_next - x);
+    dy = y_next - y;
+    dxs[i] = dx;
+    dys[i] = dy;
+    ms[i] = dy / dx;
+  }
+
+  /* Get degree-1 coefficients */
+  c1s[0] = ms[0];
+  for (i = 1; i < n; i++) {
+    gdouble m = ms[i - 1];
+    gdouble m_next = ms[i];
+
+    if (m * m_next <= 0) {
+      c1s[i] = 0.0;
+    } else {
+      gdouble dx_next, dx_sum;
+
+      dx = dxs[i], dx_next = dxs[i + 1], dx_sum = dx + dx_next;
+      c1s[i] = 3.0 * dx_sum / ((dx_sum + dx_next) / m + (dx_sum + dx) / m_next);
+    }
+  }
+  c1s[n - 1] = ms[n - 1];
+
+  /* Get degree-2 and degree-3 coefficients */
+  iter = g_sequence_get_begin_iter (self->values);
+  for (i = 0; i < n - 1; i++) {
+    gdouble c1, m, inv_dx, common;
+    cp = g_sequence_get (iter);
+
+    c1 = c1s[i];
+    m = ms[i];
+    inv_dx = 1.0 / dxs[i];
+    common = c1 + c1s[i + 1] - m - m;
+
+    cp->cache.cubic_mono.c1s = c1;
+    cp->cache.cubic_mono.c2s = (m - c1 - common) * inv_dx;
+    cp->cache.cubic_mono.c3s = common * inv_dx * inv_dx;
+
+    iter = g_sequence_iter_next (iter);
+  }
+
+  /* Free our temporary arrays */
+  g_free (dxs);
+  g_free (dys);
+  g_free (ms);
+  g_free (c1s);
+}
+
+static inline gdouble
+_interpolate_cubic_mono (GstTimedValueControlSource * self,
+    GstControlPoint * cp1, gdouble value1, GstControlPoint * cp2,
+    gdouble value2, GstClockTime timestamp)
+{
+  if (!self->valid_cache) {
+    _interpolate_cubic_mono_update_cache (self);
+    self->valid_cache = TRUE;
+  }
+
+  if (cp2) {
+    gdouble diff = gst_guint64_to_gdouble (timestamp - cp1->timestamp);
+    gdouble diff2 = diff * diff;
+    gdouble out;
+
+    out = value1 + cp1->cache.cubic_mono.c1s * diff;
+    out += cp1->cache.cubic_mono.c2s * diff2;
+    out += cp1->cache.cubic_mono.c3s * diff * diff2;
+    return out;
+  } else {
+    return value1;
+  }
+}
+
+static gboolean
+interpolate_cubic_mono_get (GstTimedValueControlSource * self,
+    GstClockTime timestamp, gdouble * value)
+{
+  gboolean ret = FALSE;
+  GstControlPoint *cp1, *cp2 = NULL;
+
+  if (self->nvalues <= 2)
+    return interpolate_linear_get (self, timestamp, value);
+
+  g_mutex_lock (&self->lock);
+
+  if (_get_nearest_control_points (self, timestamp, &cp1, &cp2)) {
+    *value = _interpolate_cubic_mono (self, cp1, cp1->value, cp2,
+        (cp2 ? cp2->value : 0.0), timestamp);
+    ret = TRUE;
+  }
+  g_mutex_unlock (&self->lock);
+  return ret;
+}
+
+static gboolean
+interpolate_cubic_mono_get_value_array (GstTimedValueControlSource * self,
+    GstClockTime timestamp, GstClockTime interval, guint n_values,
+    gdouble * values)
+{
+  gboolean ret = FALSE;
+  guint i;
+  GstClockTime ts = timestamp;
+  GstClockTime next_ts = 0;
+  GstControlPoint *cp1 = NULL, *cp2 = NULL;
+
+  if (self->nvalues <= 2)
+    return interpolate_linear_get_value_array (self, timestamp, interval,
+        n_values, values);
+
+  g_mutex_lock (&self->lock);
+
+  for (i = 0; i < n_values; i++) {
+    GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
+        i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
+    if (ts >= next_ts) {
+      _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
+    }
+    if (cp1) {
+      *values = _interpolate_cubic_mono (self, cp1, cp1->value, cp2,
+          (cp2 ? cp2->value : 0.0), ts);
+      ret = TRUE;
+      GST_LOG ("values[%3d]=%lf", i, *values);
+    } else {
+      *values = NAN;
+      GST_LOG ("values[%3d]=-", i);
+    }
+    ts += interval;
+    values++;
+  }
+  g_mutex_unlock (&self->lock);
+  return ret;
+}
+
+
 static struct
 {
   GstControlSourceGetValue get;
@@ -462,8 +608,10 @@
   (GstControlSourceGetValue) interpolate_linear_get,
         (GstControlSourceGetValueArray) interpolate_linear_get_value_array}, {
   (GstControlSourceGetValue) interpolate_cubic_get,
-        (GstControlSourceGetValueArray) interpolate_cubic_get_value_array}
-};
+        (GstControlSourceGetValueArray) interpolate_cubic_get_value_array}, {
+    (GstControlSourceGetValue) interpolate_cubic_mono_get,
+        (GstControlSourceGetValueArray)
+interpolate_cubic_mono_get_value_array}};
 
 static const guint num_interpolation_modes = G_N_ELEMENTS (interpolation_modes);
 
@@ -480,6 +628,8 @@
     {GST_INTERPOLATION_MODE_NONE, "GST_INTERPOLATION_MODE_NONE", "none"},
     {GST_INTERPOLATION_MODE_LINEAR, "GST_INTERPOLATION_MODE_LINEAR", "linear"},
     {GST_INTERPOLATION_MODE_CUBIC, "GST_INTERPOLATION_MODE_CUBIC", "cubic"},
+    {GST_INTERPOLATION_MODE_CUBIC_MONO, "GST_INTERPOLATION_MODE_CUBIC_MONO",
+        "cubic-mono"},
     {0, NULL, NULL}
   };
 
diff --git a/libs/gst/controller/gstinterpolationcontrolsource.h b/libs/gst/controller/gstinterpolationcontrolsource.h
index f4b2fbf..bb3d78d 100644
--- a/libs/gst/controller/gstinterpolationcontrolsource.h
+++ b/libs/gst/controller/gstinterpolationcontrolsource.h
@@ -54,7 +54,11 @@
  * GstInterpolationMode:
  * @GST_INTERPOLATION_MODE_NONE: steps-like interpolation, default
  * @GST_INTERPOLATION_MODE_LINEAR: linear interpolation
- * @GST_INTERPOLATION_MODE_CUBIC: cubic interpolation
+ * @GST_INTERPOLATION_MODE_CUBIC: cubic interpolation (natural), may overshoot
+ *   the min or max values set by the control point, but is more 'curvy'
+ * @GST_INTERPOLATION_MODE_CUBIC_MONO: monotonic cubic interpolation, will not
+ *   produce any values outside of the min-max range set by the control points
+ *   (Since 1.8)
  *
  * The various interpolation modes available.
  */
@@ -62,7 +66,8 @@
 {
   GST_INTERPOLATION_MODE_NONE,
   GST_INTERPOLATION_MODE_LINEAR,
-  GST_INTERPOLATION_MODE_CUBIC
+  GST_INTERPOLATION_MODE_CUBIC,
+  GST_INTERPOLATION_MODE_CUBIC_MONO,
 } GstInterpolationMode;
 
 /**
@@ -92,6 +97,10 @@
 
 GstControlSource * gst_interpolation_control_source_new (void);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstInterpolationControlSource, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_INTERPOLATION_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gstlfocontrolsource.h b/libs/gst/controller/gstlfocontrolsource.h
index 337ab53..8724229 100644
--- a/libs/gst/controller/gstlfocontrolsource.h
+++ b/libs/gst/controller/gstlfocontrolsource.h
@@ -95,6 +95,10 @@
 
 GstControlSource *gst_lfo_control_source_new (void);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstLFOControlSource, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_LFO_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gsttimedvaluecontrolsource.c b/libs/gst/controller/gsttimedvaluecontrolsource.c
index 4c8dca9..04101c2 100644
--- a/libs/gst/controller/gsttimedvaluecontrolsource.c
+++ b/libs/gst/controller/gsttimedvaluecontrolsource.c
@@ -171,36 +171,25 @@
 gst_timed_value_control_source_set_internal (GstTimedValueControlSource *
     self, GstClockTime timestamp, const gdouble value)
 {
-  GSequenceIter *iter;
   GstControlPoint *cp;
 
   g_mutex_lock (&self->lock);
 
   /* check if a control point for the timestamp already exists */
-  /* iter contains the iter right *after* timestamp */
   if (G_LIKELY (self->values)) {
-    iter =
-        g_sequence_search (self->values, &timestamp,
+    GSequenceIter *iter = g_sequence_lookup (self->values, &timestamp,
         (GCompareDataFunc) gst_control_point_find, NULL);
+
     if (iter) {
-      GSequenceIter *prev = g_sequence_iter_prev (iter);
+      GstControlPoint *cp = g_sequence_get (iter);
 
-      if (!g_sequence_iter_is_end (prev)) {
-        GstControlPoint *cp = g_sequence_get (prev);
+      /* update control point */
+      cp->value = value;
+      g_mutex_unlock (&self->lock);
 
-        /* If the timestamp is the same just update the control point value */
-        if (cp->timestamp == timestamp) {
-
-          /* update control point */
-          cp->value = value;
-          g_mutex_unlock (&self->lock);
-
-          g_signal_emit (self,
-              gst_timed_value_control_source_signals[VALUE_CHANGED_SIGNAL], 0,
-              cp);
-          goto done;
-        }
-      }
+      g_signal_emit (self,
+          gst_timed_value_control_source_signals[VALUE_CHANGED_SIGNAL], 0, cp);
+      goto done;
     }
   } else {
     self->values = g_sequence_new ((GDestroyNotify) gst_control_point_free);
@@ -337,24 +326,17 @@
   g_mutex_lock (&self->lock);
   /* check if a control point for the timestamp exists */
   if (G_LIKELY (self->values) && (iter =
-          g_sequence_search (self->values, &timestamp,
+          g_sequence_lookup (self->values, &timestamp,
               (GCompareDataFunc) gst_control_point_find, NULL))) {
 
     /* Iter contains the iter right after timestamp, i.e.
      * we need to get the previous one and check the timestamp
      */
-    iter = g_sequence_iter_prev (iter);
-    cp = g_sequence_get (iter);
-    if (cp->timestamp == timestamp) {
-      cp = g_slice_dup (GstControlPoint, cp);
-      g_sequence_remove (iter);
-      self->nvalues--;
-      self->valid_cache = FALSE;
-      res = TRUE;
-    } else {
-      cp = NULL;
-    }
-
+    cp = g_slice_dup (GstControlPoint, g_sequence_get (iter));
+    g_sequence_remove (iter);
+    self->nvalues--;
+    self->valid_cache = FALSE;
+    res = TRUE;
   }
   g_mutex_unlock (&self->lock);
 
diff --git a/libs/gst/controller/gsttimedvaluecontrolsource.h b/libs/gst/controller/gsttimedvaluecontrolsource.h
index b661da9..bfc5b07 100644
--- a/libs/gst/controller/gsttimedvaluecontrolsource.h
+++ b/libs/gst/controller/gsttimedvaluecontrolsource.h
@@ -55,7 +55,7 @@
  * @timestamp: timestamp of the value change
  * @value: the new value
  *
- * a internal structure for value+time and various temporary
+ * An internal structure for value+time and various temporary
  * values used for interpolation. This "inherits" from
  * GstTimedValue.
  */
@@ -70,12 +70,15 @@
   /* Caches for the interpolators */
   /* FIXME: we should not have this here already ... */
   union {
-    struct {
+    struct { /* 16 bytes */
       gdouble h;
       gdouble z;
     } cubic;
+    struct { /* 24 bytes */
+      gdouble c1s, c2s, c3s;
+    } cubic_mono;
+    guint8 _gst_reserved[64];
   } cache;
-
 };
 
 GType gst_control_point_get_type (void);
@@ -132,6 +135,10 @@
 gint            gst_timed_value_control_source_get_count      (GstTimedValueControlSource * self);
 void            gst_timed_value_control_invalidate_cache      (GstTimedValueControlSource * self);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTimedValueControlSource, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_TIMED_VALUE_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gsttriggercontrolsource.h b/libs/gst/controller/gsttriggercontrolsource.h
index 16e3ac9..2e9f21c 100644
--- a/libs/gst/controller/gsttriggercontrolsource.h
+++ b/libs/gst/controller/gsttriggercontrolsource.h
@@ -78,6 +78,10 @@
 
 GstControlSource *gst_trigger_control_source_new (void);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTriggerControlSource, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_TRIGGER_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/helpers/Makefile.in b/libs/gst/helpers/Makefile.in
index a8f55bd..db5c8d3 100644
--- a/libs/gst/helpers/Makefile.in
+++ b/libs/gst/helpers/Makefile.in
@@ -391,6 +391,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/helpers/gst-completion-helper.c b/libs/gst/helpers/gst-completion-helper.c
index e99b73b..95821c8 100644
--- a/libs/gst/helpers/gst-completion-helper.c
+++ b/libs/gst/helpers/gst-completion-helper.c
@@ -235,6 +235,8 @@
       g_printerr ("Error initializing: %s\n", GST_STR_NULL (err->message));
     else
       g_printerr ("Error initializing: Unknown error!\n");
+    g_clear_error (&err);
+    g_option_context_free (ctx);
     exit (1);
   }
   g_option_context_free (ctx);
diff --git a/libs/gst/helpers/gst-ptp-helper.c b/libs/gst/helpers/gst-ptp-helper.c
index ba5de97..423c4ef 100644
--- a/libs/gst/helpers/gst-ptp-helper.c
+++ b/libs/gst/helpers/gst-ptp-helper.c
@@ -99,6 +99,7 @@
   read = g_socket_receive (socket, buffer, sizeof (buffer), NULL, &err);
   if (read == -1)
     g_error ("Failed to read from socket: %s", err->message);
+  g_clear_error (&err);
 
   if (verbose)
     g_message ("Received %" G_GSSIZE_FORMAT " bytes from %s socket", read,
@@ -112,6 +113,7 @@
       sizeof (header), &written, &err);
   if (status == G_IO_STATUS_ERROR) {
     g_error ("Failed to write to stdout: %s", err->message);
+    g_clear_error (&err);
   } else if (status == G_IO_STATUS_EOF) {
     g_message ("EOF on stdout");
     exit (0);
@@ -125,6 +127,7 @@
       g_io_channel_write_chars (stdout_channel, buffer, read, &written, &err);
   if (status == G_IO_STATUS_ERROR) {
     g_error ("Failed to write to stdout: %s", err->message);
+    g_clear_error (&err);
   } else if (status == G_IO_STATUS_EOF) {
     g_message ("EOF on stdout");
     exit (0);
@@ -158,6 +161,7 @@
       &read, &err);
   if (status == G_IO_STATUS_ERROR) {
     g_error ("Failed to read from stdin: %s", err->message);
+    g_clear_error (&err);
   } else if (status == G_IO_STATUS_EOF) {
     g_message ("EOF on stdin");
     exit (0);
@@ -172,6 +176,7 @@
   status = g_io_channel_read_chars (channel, buffer, header.size, &read, &err);
   if (status == G_IO_STATUS_ERROR) {
     g_error ("Failed to read from stdin: %s", err->message);
+    g_clear_error (&err);
   } else if (status == G_IO_STATUS_EOF) {
     g_message ("EOF on stdin");
     exit (0);
@@ -193,7 +198,7 @@
         g_error ("Failed to write to socket: %s", err->message);
       else if (written != header.size)
         g_error ("Unexpected write size: %" G_GSSIZE_FORMAT, written);
-
+      g_clear_error (&err);
       if (verbose)
         g_message ("Sent %" G_GSSIZE_FORMAT " bytes to %s socket", read,
             (header.type == TYPE_EVENT ? "event" : "general"));
@@ -220,6 +225,7 @@
       G_SOCKET_PROTOCOL_UDP, &err);
   if (!socket_event)
     g_error ("Couldn't create event socket: %s", err->message);
+  g_clear_error (&err);
   g_socket_set_multicast_loopback (socket_event, FALSE);
 
   socket_general =
@@ -227,6 +233,7 @@
       G_SOCKET_PROTOCOL_UDP, &err);
   if (!socket_general)
     g_error ("Couldn't create general socket: %s", err->message);
+  g_clear_error (&err);
   g_socket_set_multicast_loopback (socket_general, FALSE);
 
   /* Bind sockets */
@@ -461,18 +468,22 @@
       if (!g_socket_join_multicast_group (socket_event, mcast_addr, FALSE, NULL,
               &err))
         g_error ("Couldn't join multicast group: %s", err->message);
+      g_clear_error (&err);
       if (!g_socket_join_multicast_group (socket_general, mcast_addr, FALSE,
               NULL, &err))
         g_error ("Couldn't join multicast group: %s", err->message);
+      g_clear_error (&err);
     }
   } else {
     /* Join multicast group without any interface */
     if (!g_socket_join_multicast_group (socket_event, mcast_addr, FALSE, NULL,
             &err))
       g_error ("Couldn't join multicast group: %s", err->message);
+    g_clear_error (&err);
     if (!g_socket_join_multicast_group (socket_general, mcast_addr, FALSE, NULL,
             &err))
       g_error ("Couldn't join multicast group: %s", err->message);
+    g_clear_error (&err);
   }
 
   event_saddr = g_inet_socket_address_new (mcast_addr, PTP_EVENT_PORT);
@@ -595,6 +606,7 @@
       sizeof (header), &written, &err);
   if (status == G_IO_STATUS_ERROR) {
     g_error ("Failed to write to stdout: %s", err->message);
+    g_clear_error (&err);
   } else if (status == G_IO_STATUS_EOF) {
     g_message ("EOF on stdout");
     exit (0);
@@ -609,6 +621,7 @@
       (const gchar *) clock_id_array, sizeof (clock_id_array), &written, &err);
   if (status == G_IO_STATUS_ERROR) {
     g_error ("Failed to write to stdout: %s", err->message);
+    g_clear_error (&err);
   } else if (status == G_IO_STATUS_EOF) {
     g_message ("EOF on stdout");
     exit (0);
@@ -657,6 +670,7 @@
   g_option_context_add_main_entries (opt_ctx, opt_entries, NULL);
   if (!g_option_context_parse (opt_ctx, &argc, &argv, &err))
     g_error ("Error parsing options: %s", err->message);
+  g_clear_error (&err);
   g_option_context_free (opt_ctx);
 
   setup_sockets ();
diff --git a/libs/gst/net/Makefile.am b/libs/gst/net/Makefile.am
index 3daf640..1fc581f 100644
--- a/libs/gst/net/Makefile.am
+++ b/libs/gst/net/Makefile.am
@@ -58,7 +58,8 @@
 	$(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" GI_SCANNER_DISABLE_CACHE=yes\
 		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 		$(INTROSPECTION_SCANNER) -v --namespace GstNet \
-		--strip-prefix=Gst \
+		--identifier-prefix=Gst \
+		--symbol-prefix=gst \
 		--warn-all \
 		--nsversion=@GST_API_VERSION@ \
 		-I$(top_srcdir) \
diff --git a/libs/gst/net/Makefile.in b/libs/gst/net/Makefile.in
index a5020bd..95ee785 100644
--- a/libs/gst/net/Makefile.in
+++ b/libs/gst/net/Makefile.in
@@ -375,6 +375,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -1052,7 +1054,8 @@
 @HAVE_INTROSPECTION_TRUE@	$(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" GI_SCANNER_DISABLE_CACHE=yes\
 @HAVE_INTROSPECTION_TRUE@		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 @HAVE_INTROSPECTION_TRUE@		$(INTROSPECTION_SCANNER) -v --namespace GstNet \
-@HAVE_INTROSPECTION_TRUE@		--strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--symbol-prefix=gst \
 @HAVE_INTROSPECTION_TRUE@		--warn-all \
 @HAVE_INTROSPECTION_TRUE@		--nsversion=@GST_API_VERSION@ \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir) \
diff --git a/libs/gst/net/gstnetaddressmeta.c b/libs/gst/net/gstnetaddressmeta.c
index c4cdd4d..e54d0c8 100644
--- a/libs/gst/net/gstnetaddressmeta.c
+++ b/libs/gst/net/gstnetaddressmeta.c
@@ -119,3 +119,19 @@
 
   return meta;
 }
+
+/**
+ * gst_buffer_get_net_address_meta:
+ * @buffer: a #GstBuffer
+ *
+ * Find the #GstNetAddressMeta on @buffer.
+ *
+ * Returns: (transfer none): the #GstNetAddressMeta or %NULL when there
+ * is no such metadata on @buffer.
+ */
+GstNetAddressMeta *
+gst_buffer_get_net_address_meta (GstBuffer * buffer)
+{
+  return (GstNetAddressMeta *)
+      gst_buffer_get_meta (buffer, GST_NET_ADDRESS_META_API_TYPE);
+}
diff --git a/libs/gst/net/gstnetaddressmeta.h b/libs/gst/net/gstnetaddressmeta.h
index ff8b523..01febb5 100644
--- a/libs/gst/net/gstnetaddressmeta.h
+++ b/libs/gst/net/gstnetaddressmeta.h
@@ -43,15 +43,13 @@
 GType gst_net_address_meta_api_get_type (void);
 #define GST_NET_ADDRESS_META_API_TYPE (gst_net_address_meta_api_get_type())
 
-#define gst_buffer_get_net_address_meta(b) \
-  ((GstNetAddressMeta*)gst_buffer_get_meta((b),GST_NET_ADDRESS_META_API_TYPE))
-
 /* implementation */
 const GstMetaInfo *gst_net_address_meta_get_info (void);
 #define GST_NET_ADDRESS_META_INFO (gst_net_address_meta_get_info())
 
 GstNetAddressMeta * gst_buffer_add_net_address_meta (GstBuffer      *buffer,
                                                      GSocketAddress *addr);
+GstNetAddressMeta * gst_buffer_get_net_address_meta (GstBuffer      *buffer);
 
 G_END_DECLS
 
diff --git a/libs/gst/net/gstnetclientclock.h b/libs/gst/net/gstnetclientclock.h
index 0839d73..47850f5 100644
--- a/libs/gst/net/gstnetclientclock.h
+++ b/libs/gst/net/gstnetclientclock.h
@@ -91,6 +91,14 @@
 GstClock*	gst_ntp_clock_new	        (const gchar *name, const gchar *remote_address,
                                                  gint remote_port, GstClockTime base_time);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNetClientClock, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNtpClock, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_NET_CLIENT_CLOCK_H__ */
diff --git a/libs/gst/net/gstnettimepacket.h b/libs/gst/net/gstnettimepacket.h
index 3f82264..cccf191 100644
--- a/libs/gst/net/gstnettimepacket.h
+++ b/libs/gst/net/gstnettimepacket.h
@@ -64,6 +64,10 @@
                                                          GSocketAddress         * dest_address,
                                                          GError                ** error);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNetTimePacket, gst_net_time_packet_free)
+#endif
+
 G_END_DECLS
 
 
diff --git a/libs/gst/net/gstnettimeprovider.h b/libs/gst/net/gstnettimeprovider.h
index d9834c2..f730d9e 100644
--- a/libs/gst/net/gstnettimeprovider.h
+++ b/libs/gst/net/gstnettimeprovider.h
@@ -68,6 +68,10 @@
                                                          const gchar *address,
                                                          gint port);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNetTimeProvider, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 
diff --git a/libs/gst/net/gstptpclock.h b/libs/gst/net/gstptpclock.h
index 7a85cab..1e69177 100644
--- a/libs/gst/net/gstptpclock.h
+++ b/libs/gst/net/gstptpclock.h
@@ -143,6 +143,10 @@
 GstClock*       gst_ptp_clock_new                  (const gchar *name,
                                                     guint domain);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPtpClock, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_PTP_CLOCK_H__ */
diff --git a/m4/Makefile.in b/m4/Makefile.in
index 73001ee..a294314 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -273,6 +273,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in
index 1e15507..19fc784 100644
--- a/pkgconfig/Makefile.in
+++ b/pkgconfig/Makefile.in
@@ -317,6 +317,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 4e46e71..cee04aa 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -1,3 +1,4 @@
-SUBDIRS = elements
+SUBDIRS = elements tracers
 
-DIST_SUBDIRS = elements
+DIST_SUBDIRS = elements tracers
+
diff --git a/plugins/Makefile.in b/plugins/Makefile.in
index cf163b9..ead0d07 100644
--- a/plugins/Makefile.in
+++ b/plugins/Makefile.in
@@ -332,6 +332,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -502,8 +504,8 @@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = elements
-DIST_SUBDIRS = elements
+SUBDIRS = elements tracers
+DIST_SUBDIRS = elements tracers
 all: all-recursive
 
 .SUFFIXES:
diff --git a/plugins/elements/Makefile.in b/plugins/elements/Makefile.in
index 9d3538f..239f6d1 100644
--- a/plugins/elements/Makefile.in
+++ b/plugins/elements/Makefile.in
@@ -380,6 +380,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/plugins/elements/gstcapsfilter.c b/plugins/elements/gstcapsfilter.c
index 74dbafb..6d5d180 100644
--- a/plugins/elements/gstcapsfilter.c
+++ b/plugins/elements/gstcapsfilter.c
@@ -359,19 +359,6 @@
       gst_base_transform_reconfigure_sink (base);
   }
 
-  if (ret) {
-    /* if we can intersect, see if the other end also accepts */
-    if (direction == GST_PAD_SRC)
-      ret =
-          gst_pad_peer_query_accept_caps (GST_BASE_TRANSFORM_SINK_PAD (base),
-          caps);
-    else
-      ret =
-          gst_pad_peer_query_accept_caps (GST_BASE_TRANSFORM_SRC_PAD (base),
-          caps);
-    GST_DEBUG_OBJECT (capsfilter, "peer accept: %d", ret);
-  }
-
   gst_caps_unref (filter_caps);
 
   return ret;
diff --git a/plugins/elements/gstdownloadbuffer.c b/plugins/elements/gstdownloadbuffer.c
index f805036..7be3afa 100644
--- a/plugins/elements/gstdownloadbuffer.c
+++ b/plugins/elements/gstdownloadbuffer.c
@@ -30,7 +30,7 @@
  * With max-size-bytes and max-size-time you can configure the buffering limits.
  * The downloadbuffer element will try to read-ahead these amounts of data. When
  * the amount of read-ahead data drops below low-percent of the configured max,
- * the element will start emiting BUFFERING messages until high-percent of max is
+ * the element will start emitting BUFFERING messages until high-percent of max is
  * reached again.
  *
  * The downloadbuffer provides push and pull based scheduling on its source pad
@@ -70,8 +70,6 @@
 #include <io.h>                 /* lseek, open, close, read */
 #undef lseek
 #define lseek _lseeki64
-#undef off_t
-#define off_t guint64
 #else
 #include <unistd.h>
 #endif
@@ -874,7 +872,7 @@
 
   GST_DEBUG_OBJECT (dlbuf, "opening temp file %s", dlbuf->temp_template);
 
-  /* If temp_template was set, allocate a filename and open that filen */
+  /* If temp_template was set, allocate a filename and open that file */
 
   /* nothing to do */
   if (dlbuf->temp_template == NULL)
diff --git a/plugins/elements/gstfdsrc.c b/plugins/elements/gstfdsrc.c
index fe607de..8a59907 100644
--- a/plugins/elements/gstfdsrc.c
+++ b/plugins/elements/gstfdsrc.c
@@ -64,8 +64,6 @@
 #include <io.h>                 /* lseek, open, close, read */
 #undef lseek
 #define lseek _lseeki64
-#undef off_t
-#define off_t guint64
 #endif
 
 #include <sys/stat.h>
diff --git a/plugins/elements/gstfilesink.c b/plugins/elements/gstfilesink.c
index b90d8a1..273ca91 100644
--- a/plugins/elements/gstfilesink.c
+++ b/plugins/elements/gstfilesink.c
@@ -226,7 +226,7 @@
 
   /**
    * GstFileSink:append
-   * 
+   *
    * Append to an already existing file.
    */
   g_object_class_install_property (gobject_class, PROP_APPEND,
@@ -446,7 +446,8 @@
 {
   if (sink->file) {
     if (fclose (sink->file) != 0)
-      goto close_failed;
+      GST_ELEMENT_ERROR (sink, RESOURCE, CLOSE,
+          (_("Error closing file \"%s\"."), sink->filename), GST_ERROR_SYSTEM);
 
     GST_DEBUG_OBJECT (sink, "closed file");
     sink->file = NULL;
@@ -454,15 +455,6 @@
     g_free (sink->buffer);
     sink->buffer = NULL;
   }
-  return;
-
-  /* ERRORS */
-close_failed:
-  {
-    GST_ELEMENT_ERROR (sink, RESOURCE, CLOSE,
-        (_("Error closing file \"%s\"."), sink->filename), GST_ERROR_SYSTEM);
-    return;
-  }
 }
 
 static gboolean
diff --git a/plugins/elements/gstfilesink.h b/plugins/elements/gstfilesink.h
index bd0e0ba..6e3897c 100644
--- a/plugins/elements/gstfilesink.h
+++ b/plugins/elements/gstfilesink.h
@@ -81,7 +81,7 @@
   gint    buffer_mode;
   guint   buffer_size;
   gchar  *buffer;
-  
+
   gboolean append;
 };
 
diff --git a/plugins/elements/gstidentity.c b/plugins/elements/gstidentity.c
index 0214596..f0e9833 100644
--- a/plugins/elements/gstidentity.c
+++ b/plugins/elements/gstidentity.c
@@ -63,6 +63,7 @@
 #define DEFAULT_DUPLICATE               1
 #define DEFAULT_ERROR_AFTER             -1
 #define DEFAULT_DROP_PROBABILITY        0.0
+#define DEFAULT_DROP_BUFFER_FLAGS       0
 #define DEFAULT_DATARATE                0
 #define DEFAULT_SILENT                  TRUE
 #define DEFAULT_SINGLE_SEGMENT          FALSE
@@ -78,6 +79,7 @@
   PROP_SLEEP_TIME,
   PROP_ERROR_AFTER,
   PROP_DROP_PROBABILITY,
+  PROP_DROP_BUFFER_FLAGS,
   PROP_DATARATE,
   PROP_SILENT,
   PROP_SINGLE_SEGMENT,
@@ -159,6 +161,19 @@
           "The Probability a buffer is dropped", 0.0, 1.0,
           DEFAULT_DROP_PROBABILITY,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  /**
+   * GstIdentity:drop-buffer-flags:
+   *
+   * Drop buffers with the given flags.
+   *
+   * Since: 1.8
+   **/
+  g_object_class_install_property (gobject_class, PROP_DROP_BUFFER_FLAGS,
+      g_param_spec_flags ("drop-buffer-flags", "Check flags to drop buffers",
+          "Drop buffers with the given flags",
+          GST_TYPE_BUFFER_FLAGS, DEFAULT_DROP_BUFFER_FLAGS,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
   g_object_class_install_property (gobject_class, PROP_DATARATE,
       g_param_spec_int ("datarate", "Datarate",
           "(Re)timestamps buffers with number of bytes per second (0 = inactive)",
@@ -251,6 +266,7 @@
   identity->sleep_time = DEFAULT_SLEEP_TIME;
   identity->error_after = DEFAULT_ERROR_AFTER;
   identity->drop_probability = DEFAULT_DROP_PROBABILITY;
+  identity->drop_buffer_flags = DEFAULT_DROP_BUFFER_FLAGS;
   identity->datarate = DEFAULT_DATARATE;
   identity->silent = DEFAULT_SILENT;
   identity->single_segment = DEFAULT_SINGLE_SEGMENT;
@@ -581,6 +597,9 @@
       goto dropped;
   }
 
+  if (GST_BUFFER_FLAG_IS_SET (buf, identity->drop_buffer_flags))
+    goto dropped;
+
   if (identity->dump) {
     GstMapInfo info;
 
@@ -687,6 +706,9 @@
     case PROP_DROP_PROBABILITY:
       identity->drop_probability = g_value_get_float (value);
       break;
+    case PROP_DROP_BUFFER_FLAGS:
+      identity->drop_buffer_flags = g_value_get_flags (value);
+      break;
     case PROP_DATARATE:
       identity->datarate = g_value_get_int (value);
       break;
@@ -730,6 +752,9 @@
     case PROP_DROP_PROBABILITY:
       g_value_set_float (value, identity->drop_probability);
       break;
+    case PROP_DROP_BUFFER_FLAGS:
+      g_value_set_flags (value, identity->drop_buffer_flags);
+      break;
     case PROP_DATARATE:
       g_value_set_int (value, identity->datarate);
       break;
diff --git a/plugins/elements/gstidentity.h b/plugins/elements/gstidentity.h
index 315cdbd..c562d47 100644
--- a/plugins/elements/gstidentity.h
+++ b/plugins/elements/gstidentity.h
@@ -65,6 +65,7 @@
   gboolean 	 check_imperfect_timestamp;
   gboolean 	 check_imperfect_offset;
   gboolean	 single_segment;
+  GstBufferFlags drop_buffer_flags;
   GstClockTime   prev_timestamp;
   GstClockTime   prev_duration;
   guint64        prev_offset;
diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c
index 479db52..bd0b06c 100644
--- a/plugins/elements/gstmultiqueue.c
+++ b/plugins/elements/gstmultiqueue.c
@@ -149,7 +149,9 @@
                                  * in every segment usage */
 
   /* position of src/sink */
-  GstClockTime sinktime, srctime;
+  GstClockTimeDiff sinktime, srctime;
+  /* cached input value, used for interleave */
+  GstClockTimeDiff cached_sinktime;
   /* TRUE if either position needs to be recalculated */
   gboolean sink_tainted, src_tainted;
 
@@ -158,20 +160,25 @@
   GstDataQueueSize max_size, extra_size;
   GstClockTime cur_time;
   gboolean is_eos;
+  gboolean is_sparse;
   gboolean flushing;
+  gboolean active;
 
   /* Protected by global lock */
   guint32 nextid;               /* ID of the next object waiting to be pushed */
   guint32 oldid;                /* ID of the last object pushed (last in a series) */
   guint32 last_oldid;           /* Previously observed old_id, reset to MAXUINT32 on flush */
-  GstClockTime next_time;       /* End running time of next buffer to be pushed */
-  GstClockTime last_time;       /* Start running time of last pushed buffer */
+  GstClockTimeDiff next_time;   /* End running time of next buffer to be pushed */
+  GstClockTimeDiff last_time;   /* Start running time of last pushed buffer */
   GCond turn;                   /* SingleQueue turn waiting conditional */
 
   /* for serialized queries */
   GCond query_handled;
   gboolean last_query;
   GstQuery *last_handled_query;
+
+  /* For interleave calculation */
+  GThread *thread;
 };
 
 
@@ -248,6 +255,8 @@
 #define DEFAULT_LOW_PERCENT   10
 #define DEFAULT_HIGH_PERCENT  99
 #define DEFAULT_SYNC_BY_RUNNING_TIME FALSE
+#define DEFAULT_USE_INTERLEAVE FALSE
+#define DEFAULT_UNLINKED_CACHE_TIME 250 * GST_MSECOND
 
 enum
 {
@@ -262,6 +271,8 @@
   PROP_LOW_PERCENT,
   PROP_HIGH_PERCENT,
   PROP_SYNC_BY_RUNNING_TIME,
+  PROP_USE_INTERLEAVE,
+  PROP_UNLINKED_CACHE_TIME,
   PROP_LAST
 };
 
@@ -281,6 +292,23 @@
   }                                                                      \
 } G_STMT_END
 
+/* Convenience function */
+static inline GstClockTimeDiff
+my_segment_to_running_time (GstSegment * segment, GstClockTime val)
+{
+  GstClockTimeDiff res = GST_CLOCK_STIME_NONE;
+
+  if (GST_CLOCK_TIME_IS_VALID (val)) {
+    gboolean sign =
+        gst_segment_to_running_time_full (segment, GST_FORMAT_TIME, val, &val);
+    if (sign > 0)
+      res = val;
+    else if (sign < 0)
+      res = -val;
+  }
+  return res;
+}
+
 static void gst_multi_queue_finalize (GObject * object);
 static void gst_multi_queue_set_property (GObject * object,
     guint prop_id, const GValue * value, GParamSpec * pspec);
@@ -428,6 +456,19 @@
           DEFAULT_SYNC_BY_RUNNING_TIME,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  g_object_class_install_property (gobject_class, PROP_USE_INTERLEAVE,
+      g_param_spec_boolean ("use-interleave", "Use interleave",
+          "Adjust time limits based on input interleave",
+          DEFAULT_USE_INTERLEAVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_UNLINKED_CACHE_TIME,
+      g_param_spec_uint64 ("unlinked-cache-time", "Unlinked cache time (ns)",
+          "Extra buffering in time for unlinked streams (if 'sync-by-running-time')",
+          0, G_MAXUINT64, DEFAULT_UNLINKED_CACHE_TIME,
+          G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING |
+          G_PARAM_STATIC_STRINGS));
+
+
   gobject_class->finalize = gst_multi_queue_finalize;
 
   gst_element_class_set_static_metadata (gstelement_class,
@@ -465,10 +506,12 @@
   mqueue->high_percent = DEFAULT_HIGH_PERCENT;
 
   mqueue->sync_by_running_time = DEFAULT_SYNC_BY_RUNNING_TIME;
+  mqueue->use_interleave = DEFAULT_USE_INTERLEAVE;
+  mqueue->unlinked_cache_time = DEFAULT_UNLINKED_CACHE_TIME;
 
   mqueue->counter = 1;
   mqueue->highid = -1;
-  mqueue->high_time = GST_CLOCK_TIME_NONE;
+  mqueue->high_time = GST_CLOCK_STIME_NONE;
 
   g_mutex_init (&mqueue->qlock);
   g_mutex_init (&mqueue->buffering_post_lock);
@@ -606,6 +649,15 @@
     case PROP_SYNC_BY_RUNNING_TIME:
       mq->sync_by_running_time = g_value_get_boolean (value);
       break;
+    case PROP_USE_INTERLEAVE:
+      mq->use_interleave = g_value_get_boolean (value);
+      break;
+    case PROP_UNLINKED_CACHE_TIME:
+      GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+      mq->unlinked_cache_time = g_value_get_uint64 (value);
+      GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+      gst_multi_queue_post_buffering (mq);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -651,6 +703,12 @@
     case PROP_SYNC_BY_RUNNING_TIME:
       g_value_set_boolean (value, mq->sync_by_running_time);
       break;
+    case PROP_USE_INTERLEAVE:
+      g_value_set_boolean (value, mq->use_interleave);
+      break;
+    case PROP_UNLINKED_CACHE_TIME:
+      g_value_set_uint64 (value, mq->unlinked_cache_time);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -865,12 +923,13 @@
     sq->nextid = 0;
     sq->oldid = 0;
     sq->last_oldid = G_MAXUINT32;
-    sq->next_time = GST_CLOCK_TIME_NONE;
-    sq->last_time = GST_CLOCK_TIME_NONE;
+    sq->next_time = GST_CLOCK_STIME_NONE;
+    sq->last_time = GST_CLOCK_STIME_NONE;
+    sq->cached_sinktime = GST_CLOCK_STIME_NONE;
     gst_data_queue_set_flushing (sq->queue, FALSE);
 
     /* Reset high time to be recomputed next */
-    mq->high_time = GST_CLOCK_TIME_NONE;
+    mq->high_time = GST_CLOCK_STIME_NONE;
 
     sq->flushing = FALSE;
     GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
@@ -898,7 +957,7 @@
       size.bytes, sq->max_size.bytes, sq->cur_time, sq->max_size.time);
 
   /* get bytes and time percentages and take the max */
-  if (sq->is_eos || sq->srcresult == GST_FLOW_NOT_LINKED) {
+  if (sq->is_eos || sq->srcresult == GST_FLOW_NOT_LINKED || sq->is_sparse) {
     percent = 100;
   } else {
     percent = 0;
@@ -984,22 +1043,111 @@
   g_mutex_unlock (&mq->buffering_post_lock);
 }
 
+static void
+calculate_interleave (GstMultiQueue * mq)
+{
+  GstClockTimeDiff low, high;
+  GstClockTime interleave;
+  GList *tmp;
+
+  low = high = GST_CLOCK_STIME_NONE;
+  interleave = mq->interleave;
+  /* Go over all single queues and calculate lowest/highest value */
+  for (tmp = mq->queues; tmp; tmp = tmp->next) {
+    GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+    /* Ignore sparse streams for interleave calculation */
+    if (sq->is_sparse)
+      continue;
+    /* If a stream is not active yet (hasn't received any buffers), set
+     * a maximum interleave to allow it to receive more data */
+    if (!sq->active) {
+      GST_LOG_OBJECT (mq,
+          "queue %d is not active yet, forcing interleave to 5s", sq->id);
+      mq->interleave = 5 * GST_SECOND;
+      /* Update max-size time */
+      mq->max_size.time = mq->interleave;
+      SET_CHILD_PROPERTY (mq, time);
+      goto beach;
+    }
+    if (GST_CLOCK_STIME_IS_VALID (sq->cached_sinktime)) {
+      if (low == GST_CLOCK_STIME_NONE || sq->cached_sinktime < low)
+        low = sq->cached_sinktime;
+      if (high == GST_CLOCK_STIME_NONE || sq->cached_sinktime > high)
+        high = sq->cached_sinktime;
+    }
+    GST_LOG_OBJECT (mq,
+        "queue %d , sinktime:%" GST_STIME_FORMAT " low:%" GST_STIME_FORMAT
+        " high:%" GST_STIME_FORMAT, sq->id,
+        GST_STIME_ARGS (sq->cached_sinktime), GST_STIME_ARGS (low),
+        GST_STIME_ARGS (high));
+  }
+
+  if (GST_CLOCK_STIME_IS_VALID (low) && GST_CLOCK_STIME_IS_VALID (high)) {
+    interleave = high - low;
+    /* Padding of interleave and minimum value */
+    /* FIXME : Make the minimum time interleave a property */
+    interleave = (150 * interleave / 100) + 250 * GST_MSECOND;
+
+    /* Update the stored interleave if:
+     * * No data has arrived yet (high == low)
+     * * Or it went higher
+     * * Or it went lower and we've gone past the previous interleave needed */
+    if (high == low || interleave > mq->interleave ||
+        ((mq->last_interleave_update + (2 * MIN (GST_SECOND,
+                        mq->interleave)) < low)
+            && interleave < (mq->interleave * 3 / 4))) {
+      /* Update the interleave */
+      mq->interleave = interleave;
+      mq->last_interleave_update = high;
+      /* Update max-size time */
+      mq->max_size.time = mq->interleave;
+      SET_CHILD_PROPERTY (mq, time);
+    }
+  }
+
+beach:
+  GST_DEBUG_OBJECT (mq,
+      "low:%" GST_STIME_FORMAT " high:%" GST_STIME_FORMAT " interleave:%"
+      GST_TIME_FORMAT " mq->interleave:%" GST_TIME_FORMAT
+      " last_interleave_update:%" GST_STIME_FORMAT, GST_STIME_ARGS (low),
+      GST_STIME_ARGS (high), GST_TIME_ARGS (interleave),
+      GST_TIME_ARGS (mq->interleave),
+      GST_STIME_ARGS (mq->last_interleave_update));
+}
+
+
 /* calculate the diff between running time on the sink and src of the queue.
  * This is the total amount of time in the queue. 
  * WITH LOCK TAKEN */
 static void
 update_time_level (GstMultiQueue * mq, GstSingleQueue * sq)
 {
-  gint64 sink_time, src_time;
+  GstClockTimeDiff sink_time, src_time;
 
   if (sq->sink_tainted) {
-    sink_time = sq->sinktime =
-        gst_segment_to_running_time (&sq->sink_segment, GST_FORMAT_TIME,
+    sink_time = sq->sinktime = my_segment_to_running_time (&sq->sink_segment,
         sq->sink_segment.position);
 
-    if (G_UNLIKELY (sink_time != GST_CLOCK_TIME_NONE))
+    GST_DEBUG_OBJECT (mq,
+        "queue %d sink_segment.position:%" GST_TIME_FORMAT ", sink_time:%"
+        GST_STIME_FORMAT, sq->id, GST_TIME_ARGS (sq->sink_segment.position),
+        GST_STIME_ARGS (sink_time));
+
+    if (G_UNLIKELY (sq->last_time == GST_CLOCK_STIME_NONE)) {
+      /* If the single queue still doesn't have a last_time set, this means
+       * that nothing has been pushed out yet.
+       * In order for the high_time computation to be as efficient as possible,
+       * we set the last_time */
+      sq->last_time = sink_time;
+    }
+    if (G_UNLIKELY (sink_time != GST_CLOCK_STIME_NONE)) {
       /* if we have a time, we become untainted and use the time */
       sq->sink_tainted = FALSE;
+      if (mq->use_interleave) {
+        sq->cached_sinktime = sink_time;
+        calculate_interleave (mq);
+      }
+    }
   } else
     sink_time = sq->sinktime;
 
@@ -1023,21 +1171,22 @@
       position = sq->sink_segment.position;
     }
 
-    src_time = sq->srctime =
-        gst_segment_to_running_time (segment, GST_FORMAT_TIME, position);
+    src_time = sq->srctime = my_segment_to_running_time (segment, position);
     /* if we have a time, we become untainted and use the time */
-    if (G_UNLIKELY (src_time != GST_CLOCK_TIME_NONE))
+    if (G_UNLIKELY (src_time != GST_CLOCK_STIME_NONE)) {
       sq->src_tainted = FALSE;
+    }
   } else
     src_time = sq->srctime;
 
   GST_DEBUG_OBJECT (mq,
-      "queue %d, sink %" GST_TIME_FORMAT ", src %" GST_TIME_FORMAT, sq->id,
-      GST_TIME_ARGS (sink_time), GST_TIME_ARGS (src_time));
+      "queue %d, sink %" GST_STIME_FORMAT ", src %" GST_STIME_FORMAT, sq->id,
+      GST_STIME_ARGS (sink_time), GST_STIME_ARGS (src_time));
 
   /* This allows for streams with out of order timestamping - sometimes the
    * emerging timestamp is later than the arriving one(s) */
-  if (G_LIKELY (sink_time != -1 && src_time != -1 && sink_time > src_time))
+  if (G_LIKELY (GST_CLOCK_STIME_IS_VALID (sink_time) &&
+          GST_CLOCK_STIME_IS_VALID (src_time) && sink_time > src_time))
     sq->cur_time = sink_time - src_time;
   else
     sq->cur_time = 0;
@@ -1068,6 +1217,12 @@
   }
   GST_MULTI_QUEUE_MUTEX_LOCK (mq);
 
+  /* Make sure we have a valid initial segment position (and not garbage
+   * from upstream) */
+  if (segment->rate > 0.0)
+    segment->position = segment->start;
+  else
+    segment->position = segment->stop;
   if (segment == &sq->sink_segment)
     sq->sink_tainted = TRUE;
   else {
@@ -1101,8 +1256,9 @@
   if (duration != GST_CLOCK_TIME_NONE)
     timestamp += duration;
 
-  GST_DEBUG_OBJECT (mq, "queue %d, position updated to %" GST_TIME_FORMAT,
-      sq->id, GST_TIME_ARGS (timestamp));
+  GST_DEBUG_OBJECT (mq, "queue %d, %s position updated to %" GST_TIME_FORMAT,
+      sq->id, segment == &sq->sink_segment ? "sink" : "src",
+      GST_TIME_ARGS (timestamp));
 
   segment->position = timestamp;
 
@@ -1149,21 +1305,21 @@
   gst_multi_queue_post_buffering (mq);
 }
 
-static GstClockTime
+static GstClockTimeDiff
 get_running_time (GstSegment * segment, GstMiniObject * object, gboolean end)
 {
-  GstClockTime time = GST_CLOCK_TIME_NONE;
+  GstClockTimeDiff time = GST_CLOCK_STIME_NONE;
 
   if (GST_IS_BUFFER (object)) {
     GstBuffer *buf = GST_BUFFER_CAST (object);
+    GstClockTime btime = GST_BUFFER_DTS_OR_PTS (buf);
 
-    if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
-      time = GST_BUFFER_TIMESTAMP (buf);
+    if (GST_CLOCK_TIME_IS_VALID (btime)) {
       if (end && GST_BUFFER_DURATION_IS_VALID (buf))
-        time += GST_BUFFER_DURATION (buf);
-      if (time > segment->stop)
-        time = segment->stop;
-      time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time);
+        btime += GST_BUFFER_DURATION (buf);
+      if (btime > segment->stop)
+        btime = segment->stop;
+      time = my_segment_to_running_time (segment, btime);
     }
   } else if (GST_IS_BUFFER_LIST (object)) {
     GstBufferList *list = GST_BUFFER_LIST_CAST (object);
@@ -1172,14 +1328,15 @@
 
     n = gst_buffer_list_length (list);
     for (i = 0; i < n; i++) {
+      GstClockTime btime;
       buf = gst_buffer_list_get (list, i);
-      if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
-        time = GST_BUFFER_TIMESTAMP (buf);
+      btime = GST_BUFFER_DTS_OR_PTS (buf);
+      if (GST_CLOCK_TIME_IS_VALID (btime)) {
         if (end && GST_BUFFER_DURATION_IS_VALID (buf))
-          time += GST_BUFFER_DURATION (buf);
-        if (time > segment->stop)
-          time = segment->stop;
-        time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time);
+          btime += GST_BUFFER_DURATION (buf);
+        if (btime > segment->stop)
+          btime = segment->stop;
+        time = my_segment_to_running_time (segment, btime);
         if (!end)
           goto done;
       } else if (!end) {
@@ -1196,7 +1353,7 @@
       gst_event_parse_segment (event, &new_segment);
       if (new_segment->format == GST_FORMAT_TIME) {
         time =
-            gst_segment_to_running_time (new_segment, GST_FORMAT_TIME,
+            my_segment_to_running_time ((GstSegment *) new_segment,
             new_segment->start);
       }
     }
@@ -1217,7 +1374,7 @@
     GstClockTime timestamp, duration;
 
     buffer = GST_BUFFER_CAST (object);
-    timestamp = GST_BUFFER_TIMESTAMP (buffer);
+    timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
     duration = GST_BUFFER_DURATION (buffer);
 
     apply_buffer (mq, sq, timestamp, duration, &sq->src_segment);
@@ -1376,7 +1533,7 @@
   GstMiniObject *object = NULL;
   guint32 newid;
   GstFlowReturn result;
-  GstClockTime next_time;
+  GstClockTimeDiff next_time;
   gboolean is_buffer;
   gboolean do_update_buffering = FALSE;
   gboolean dropping = FALSE;
@@ -1404,8 +1561,8 @@
 
   is_buffer = GST_IS_BUFFER (object);
 
-  /* Get running time of the item. Events will have GST_CLOCK_TIME_NONE */
-  next_time = get_running_time (&sq->src_segment, object, TRUE);
+  /* Get running time of the item. Events will have GST_CLOCK_STIME_NONE */
+  next_time = get_running_time (&sq->src_segment, object, FALSE);
 
   GST_LOG_OBJECT (mq, "SingleQueue %d : newid:%d , oldid:%d",
       sq->id, newid, sq->last_oldid);
@@ -1431,6 +1588,9 @@
 
     /* Update the nextid so other threads know when to wake us up */
     sq->nextid = newid;
+    /* Take into account the extra cache time since we're unlinked */
+    if (GST_CLOCK_STIME_IS_VALID (next_time))
+      next_time += mq->unlinked_cache_time;
     sq->next_time = next_time;
 
     /* Update the oldid (the last ID we output) for highid tracking */
@@ -1445,17 +1605,17 @@
       /* Recompute the high time */
       compute_high_time (mq);
 
-      while (((mq->sync_by_running_time && next_time != GST_CLOCK_TIME_NONE &&
-                  (mq->high_time == GST_CLOCK_TIME_NONE
-                      || next_time >= mq->high_time))
+      while (((mq->sync_by_running_time && GST_CLOCK_STIME_IS_VALID (next_time)
+                  && (mq->high_time == GST_CLOCK_STIME_NONE
+                      || next_time > mq->high_time))
               || (!mq->sync_by_running_time && newid > mq->highid))
           && sq->srcresult == GST_FLOW_NOT_LINKED) {
 
         GST_DEBUG_OBJECT (mq,
             "queue %d sleeping for not-linked wakeup with "
-            "newid %u, highid %u, next_time %" GST_TIME_FORMAT
-            ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid,
-            GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time));
+            "newid %u, highid %u, next_time %" GST_STIME_FORMAT
+            ", high_time %" GST_STIME_FORMAT, sq->id, newid, mq->highid,
+            GST_STIME_ARGS (next_time), GST_STIME_ARGS (mq->high_time));
 
         /* Wake up all non-linked pads before we sleep */
         wake_up_next_non_linked (mq);
@@ -1473,37 +1633,39 @@
         compute_high_time (mq);
 
         GST_DEBUG_OBJECT (mq, "queue %d woken from sleeping for not-linked "
-            "wakeup with newid %u, highid %u, next_time %" GST_TIME_FORMAT
-            ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid,
-            GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time));
+            "wakeup with newid %u, highid %u, next_time %" GST_STIME_FORMAT
+            ", high_time %" GST_STIME_FORMAT, sq->id, newid, mq->highid,
+            GST_STIME_ARGS (next_time), GST_STIME_ARGS (mq->high_time));
       }
 
       /* Re-compute the high_id in case someone else pushed */
       compute_high_id (mq);
+      compute_high_time (mq);
     } else {
       compute_high_id (mq);
+      compute_high_time (mq);
       /* Wake up all non-linked pads */
       wake_up_next_non_linked (mq);
     }
     /* We're done waiting, we can clear the nextid and nexttime */
     sq->nextid = 0;
-    sq->next_time = GST_CLOCK_TIME_NONE;
+    sq->next_time = GST_CLOCK_STIME_NONE;
   }
   GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
 
   if (sq->flushing)
     goto out_flushing;
 
-  GST_LOG_OBJECT (mq, "BEFORE PUSHING sq->srcresult: %s",
+  GST_LOG_OBJECT (mq, "sq:%d BEFORE PUSHING sq->srcresult: %s", sq->id,
       gst_flow_get_name (sq->srcresult));
 
   /* Update time stats */
   GST_MULTI_QUEUE_MUTEX_LOCK (mq);
-  next_time = get_running_time (&sq->src_segment, object, FALSE);
-  if (next_time != GST_CLOCK_TIME_NONE) {
-    if (sq->last_time == GST_CLOCK_TIME_NONE || sq->last_time < next_time)
+  next_time = get_running_time (&sq->src_segment, object, TRUE);
+  if (GST_CLOCK_STIME_IS_VALID (next_time)) {
+    if (sq->last_time == GST_CLOCK_STIME_NONE || sq->last_time < next_time)
       sq->last_time = next_time;
-    if (mq->high_time == GST_CLOCK_TIME_NONE || mq->high_time <= next_time) {
+    if (mq->high_time == GST_CLOCK_STIME_NONE || mq->high_time <= next_time) {
       /* Wake up all non-linked pads now that we advanced the high time */
       mq->high_time = next_time;
       wake_up_next_non_linked (mq);
@@ -1587,7 +1749,7 @@
       && result != GST_FLOW_EOS)
     goto out_flushing;
 
-  GST_LOG_OBJECT (mq, "AFTER PUSHING sq->srcresult: %s",
+  GST_LOG_OBJECT (mq, "sq:%d AFTER PUSHING sq->srcresult: %s", sq->id,
       gst_flow_get_name (sq->srcresult));
 
   GST_MULTI_QUEUE_MUTEX_LOCK (mq);
@@ -1665,16 +1827,44 @@
   if (sq->is_eos)
     goto was_eos;
 
+  sq->active = TRUE;
+
   /* Get a unique incrementing id */
   curid = g_atomic_int_add ((gint *) & mq->counter, 1);
 
-  GST_LOG_OBJECT (mq, "SingleQueue %d : about to enqueue buffer %p with id %d",
-      sq->id, buffer, curid);
+  timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
+  duration = GST_BUFFER_DURATION (buffer);
+
+  GST_LOG_OBJECT (mq,
+      "SingleQueue %d : about to enqueue buffer %p with id %d (pts:%"
+      GST_TIME_FORMAT " dts:%" GST_TIME_FORMAT " dur:%" GST_TIME_FORMAT ")",
+      sq->id, buffer, curid, GST_TIME_ARGS (GST_BUFFER_PTS (buffer)),
+      GST_TIME_ARGS (GST_BUFFER_DTS (buffer)), GST_TIME_ARGS (duration));
 
   item = gst_multi_queue_buffer_item_new (GST_MINI_OBJECT_CAST (buffer), curid);
 
-  timestamp = GST_BUFFER_TIMESTAMP (buffer);
-  duration = GST_BUFFER_DURATION (buffer);
+  /* Update interleave before pushing data into queue */
+  if (mq->use_interleave) {
+    GstClockTime val = timestamp;
+    GstClockTimeDiff dval;
+
+    GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+    if (val == GST_CLOCK_TIME_NONE)
+      val = sq->sink_segment.position;
+    if (duration != GST_CLOCK_TIME_NONE)
+      val += duration;
+
+    dval = my_segment_to_running_time (&sq->sink_segment, val);
+    if (GST_CLOCK_STIME_IS_VALID (dval)) {
+      sq->cached_sinktime = dval;
+      GST_DEBUG_OBJECT (mq,
+          "Queue %d cached sink time now %" G_GINT64_FORMAT " %"
+          GST_STIME_FORMAT, sq->id, sq->cached_sinktime,
+          GST_STIME_ARGS (sq->cached_sinktime));
+      calculate_interleave (mq);
+    }
+    GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+  }
 
   if (!(gst_data_queue_push (sq->queue, (GstDataQueueItem *) item)))
     goto flushing;
@@ -1759,14 +1949,15 @@
   return res;
 }
 
-static gboolean
+static GstFlowReturn
 gst_multi_queue_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 {
   GstSingleQueue *sq;
   GstMultiQueue *mq;
   guint32 curid;
   GstMultiQueueItem *item;
-  gboolean res;
+  gboolean res = TRUE;
+  GstFlowReturn flowret = GST_FLOW_OK;
   GstEventType type;
   GstEvent *sref = NULL;
 
@@ -1776,6 +1967,24 @@
   type = GST_EVENT_TYPE (event);
 
   switch (type) {
+    case GST_EVENT_STREAM_START:
+    {
+      if (mq->sync_by_running_time) {
+        GstStreamFlags stream_flags;
+        gst_event_parse_stream_flags (event, &stream_flags);
+        if ((stream_flags & GST_STREAM_FLAG_SPARSE)) {
+          GST_INFO_OBJECT (mq, "SingleQueue %d is a sparse stream", sq->id);
+          sq->is_sparse = TRUE;
+        }
+        sq->thread = g_thread_self ();
+      }
+
+      sq->thread = g_thread_self ();
+
+      /* Remove EOS flag */
+      sq->is_eos = FALSE;
+    }
+      break;
     case GST_EVENT_FLUSH_START:
       GST_DEBUG_OBJECT (mq, "SingleQueue %d : received flush start event",
           sq->id);
@@ -1795,10 +2004,28 @@
       goto done;
 
     case GST_EVENT_SEGMENT:
+      sref = gst_event_ref (event);
+      break;
     case GST_EVENT_GAP:
       /* take ref because the queue will take ownership and we need the event
        * afterwards to update the segment */
       sref = gst_event_ref (event);
+      if (mq->use_interleave) {
+        GstClockTime val, dur;
+        GstClockTime stime;
+        gst_event_parse_gap (event, &val, &dur);
+        if (GST_CLOCK_TIME_IS_VALID (val)) {
+          GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+          if (GST_CLOCK_TIME_IS_VALID (dur))
+            val += dur;
+          stime = my_segment_to_running_time (&sq->sink_segment, val);
+          if (GST_CLOCK_STIME_IS_VALID (stime)) {
+            sq->cached_sinktime = stime;
+            calculate_interleave (mq);
+          }
+          GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+        }
+      }
       break;
 
     default:
@@ -1822,7 +2049,7 @@
       "SingleQueue %d : Enqueuing event %p of type %s with id %d",
       sq->id, event, GST_EVENT_TYPE_NAME (event), curid);
 
-  if (!(res = gst_data_queue_push (sq->queue, (GstDataQueueItem *) item)))
+  if (!gst_data_queue_push (sq->queue, (GstDataQueueItem *) item))
     goto flushing;
 
   /* mark EOS when we received one, we must do that after putting the
@@ -1864,13 +2091,19 @@
       GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
       break;
     case GST_EVENT_GAP:
+      sq->active = TRUE;
       apply_gap (mq, sq, sref, &sq->sink_segment);
       gst_event_unref (sref);
     default:
       break;
   }
+
 done:
-  return res;
+  if (res == FALSE)
+    flowret = GST_FLOW_ERROR;
+  GST_DEBUG_OBJECT (mq, "SingleQueue %d : returning %s", sq->id,
+      gst_flow_get_name (flowret));
+  return flowret;
 
 flushing:
   {
@@ -1879,14 +2112,13 @@
     if (sref)
       gst_event_unref (sref);
     gst_multi_queue_item_destroy (item);
-    goto done;
+    return sq->srcresult;
   }
 was_eos:
   {
-    GST_DEBUG_OBJECT (mq, "we are EOS, dropping event, return FALSE");
+    GST_DEBUG_OBJECT (mq, "we are EOS, dropping event, return GST_FLOW_EOS");
     gst_event_unref (event);
-    res = FALSE;
-    goto done;
+    return GST_FLOW_EOS;
   }
 }
 
@@ -2046,15 +2278,23 @@
   if (mq->numwaiting < 1)
     return;
 
-  /* Else figure out which singlequeue(s) need waking up */
-  for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
-    GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
-
-    if (sq->srcresult == GST_FLOW_NOT_LINKED) {
-      if ((mq->sync_by_running_time && mq->high_time != GST_CLOCK_TIME_NONE
-              && sq->next_time != GST_CLOCK_TIME_NONE
-              && sq->next_time >= mq->high_time)
-          || (sq->nextid != 0 && sq->nextid <= mq->highid)) {
+  if (mq->sync_by_running_time && GST_CLOCK_STIME_IS_VALID (mq->high_time)) {
+    /* Else figure out which singlequeue(s) need waking up */
+    for (tmp = mq->queues; tmp; tmp = tmp->next) {
+      GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+      if (sq->srcresult == GST_FLOW_NOT_LINKED
+          && GST_CLOCK_STIME_IS_VALID (sq->next_time)
+          && sq->next_time <= mq->high_time) {
+        GST_LOG_OBJECT (mq, "Waking up singlequeue %d", sq->id);
+        g_cond_signal (&sq->turn);
+      }
+    }
+  } else {
+    /* Else figure out which singlequeue(s) need waking up */
+    for (tmp = mq->queues; tmp; tmp = tmp->next) {
+      GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+      if (sq->srcresult == GST_FLOW_NOT_LINKED &&
+          sq->nextid != 0 && sq->nextid <= mq->highid) {
         GST_LOG_OBJECT (mq, "Waking up singlequeue %d", sq->id);
         g_cond_signal (&sq->turn);
       }
@@ -2109,43 +2349,57 @@
 static void
 compute_high_time (GstMultiQueue * mq)
 {
-  /* The high-id is either the highest id among the linked pads, or if all
-   * pads are not-linked, it's the lowest not-linked pad */
+  /* The high-time is either the highest last time among the linked
+   * pads, or if all pads are not-linked, it's the lowest nex time of
+   * not-linked pad */
   GList *tmp;
-  GstClockTime highest = GST_CLOCK_TIME_NONE;
-  GstClockTime lowest = GST_CLOCK_TIME_NONE;
+  GstClockTimeDiff highest = GST_CLOCK_STIME_NONE;
+  GstClockTimeDiff lowest = GST_CLOCK_STIME_NONE;
 
-  for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
+  if (!mq->sync_by_running_time)
+    return;
+
+  for (tmp = mq->queues; tmp; tmp = tmp->next) {
     GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
 
     GST_LOG_OBJECT (mq,
-        "inspecting sq:%d , next_time:%" GST_TIME_FORMAT ", last_time:%"
-        GST_TIME_FORMAT ", srcresult:%s", sq->id, GST_TIME_ARGS (sq->next_time),
-        GST_TIME_ARGS (sq->last_time), gst_flow_get_name (sq->srcresult));
+        "inspecting sq:%d , next_time:%" GST_STIME_FORMAT ", last_time:%"
+        GST_STIME_FORMAT ", srcresult:%s", sq->id,
+        GST_STIME_ARGS (sq->next_time), GST_STIME_ARGS (sq->last_time),
+        gst_flow_get_name (sq->srcresult));
 
     if (sq->srcresult == GST_FLOW_NOT_LINKED) {
       /* No need to consider queues which are not waiting */
-      if (sq->next_time == GST_CLOCK_TIME_NONE) {
+      if (!GST_CLOCK_STIME_IS_VALID (sq->next_time)) {
         GST_LOG_OBJECT (mq, "sq:%d is not waiting - ignoring", sq->id);
         continue;
       }
 
-      if (lowest == GST_CLOCK_TIME_NONE || sq->next_time < lowest)
+      if (lowest == GST_CLOCK_STIME_NONE || sq->next_time < lowest)
         lowest = sq->next_time;
     } else if (sq->srcresult != GST_FLOW_EOS) {
-      /* If we don't have a global highid, or the global highid is lower than
-       * this single queue's last outputted id, store the queue's one, 
-       * unless the singlequeue is at EOS (srcresult = EOS) */
-      if (highest == GST_CLOCK_TIME_NONE || sq->last_time > highest)
+      /* If we don't have a global high time, or the global high time
+       * is lower than this single queue's last outputted time, store
+       * the queue's one, unless the singlequeue is at EOS (srcresult
+       * = EOS) */
+      if (highest == GST_CLOCK_STIME_NONE
+          || (sq->last_time != GST_CLOCK_STIME_NONE && sq->last_time > highest))
         highest = sq->last_time;
     }
+    GST_LOG_OBJECT (mq,
+        "highest now %" GST_STIME_FORMAT " lowest %" GST_STIME_FORMAT,
+        GST_STIME_ARGS (highest), GST_STIME_ARGS (lowest));
   }
 
-  mq->high_time = highest;
+  if (highest == GST_CLOCK_STIME_NONE)
+    mq->high_time = lowest;
+  else
+    mq->high_time = highest;
 
   GST_LOG_OBJECT (mq,
-      "High time is now : %" GST_TIME_FORMAT ", lowest non-linked %"
-      GST_TIME_FORMAT, GST_TIME_ARGS (mq->high_time), GST_TIME_ARGS (lowest));
+      "High time is now : %" GST_STIME_FORMAT ", lowest non-linked %"
+      GST_STIME_FORMAT, GST_STIME_ARGS (mq->high_time),
+      GST_STIME_ARGS (lowest));
 }
 
 #define IS_FILLED(q, format, value) (((q)->max_size.format) != 0 && \
@@ -2174,7 +2428,7 @@
   GST_MULTI_QUEUE_MUTEX_LOCK (mq);
 
   /* check if we reached the hard time/bytes limits */
-  if (sq->is_eos || IS_FILLED (sq, bytes, size.bytes) ||
+  if (sq->is_eos || sq->is_sparse || IS_FILLED (sq, bytes, size.bytes) ||
       IS_FILLED (sq, time, sq->cur_time)) {
     goto done;
   }
@@ -2192,7 +2446,7 @@
     }
 
     GST_LOG_OBJECT (mq, "Checking Queue %d", oq->id);
-    if (gst_data_queue_is_empty (oq->queue)) {
+    if (gst_data_queue_is_empty (oq->queue) && !oq->is_sparse) {
       GST_LOG_OBJECT (mq, "Queue %d is empty", oq->id);
       empty_found = TRUE;
       break;
@@ -2252,7 +2506,7 @@
         gst_data_queue_limits_changed (oq->queue);
       }
     }
-    if (!gst_data_queue_is_empty (oq->queue))
+    if (!gst_data_queue_is_empty (oq->queue) || oq->is_sparse)
       empty = FALSE;
   }
   GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
@@ -2284,7 +2538,19 @@
     return TRUE;
 
   /* check time or bytes */
-  res = IS_FILLED (sq, time, sq->cur_time) || IS_FILLED (sq, bytes, bytes);
+  res = IS_FILLED (sq, bytes, bytes);
+  /* We only care about limits in time if we're not a sparse stream or
+   * we're not syncing by running time */
+  if (!sq->is_sparse || !mq->sync_by_running_time) {
+    /* If unlinked, take into account the extra unlinked cache time */
+    if (mq->sync_by_running_time && sq->srcresult == GST_FLOW_NOT_LINKED) {
+      if (sq->cur_time > mq->unlinked_cache_time)
+        res |= IS_FILLED (sq, time, sq->cur_time - mq->unlinked_cache_time);
+      else
+        res = FALSE;
+    } else
+      res |= IS_FILLED (sq, time, sq->cur_time);
+  }
 
   return res;
 }
@@ -2397,19 +2663,21 @@
       (GstDataQueueFullCallback) single_queue_overrun_cb,
       (GstDataQueueEmptyCallback) single_queue_underrun_cb, sq);
   sq->is_eos = FALSE;
+  sq->is_sparse = FALSE;
   sq->flushing = FALSE;
+  sq->active = FALSE;
   gst_segment_init (&sq->sink_segment, GST_FORMAT_TIME);
   gst_segment_init (&sq->src_segment, GST_FORMAT_TIME);
 
   sq->nextid = 0;
   sq->oldid = 0;
-  sq->next_time = GST_CLOCK_TIME_NONE;
-  sq->last_time = GST_CLOCK_TIME_NONE;
+  sq->next_time = GST_CLOCK_STIME_NONE;
+  sq->last_time = GST_CLOCK_STIME_NONE;
   g_cond_init (&sq->turn);
   g_cond_init (&sq->query_handled);
 
-  sq->sinktime = GST_CLOCK_TIME_NONE;
-  sq->srctime = GST_CLOCK_TIME_NONE;
+  sq->sinktime = GST_CLOCK_STIME_NONE;
+  sq->srctime = GST_CLOCK_STIME_NONE;
   sq->sink_tainted = TRUE;
   sq->src_tainted = TRUE;
 
@@ -2421,7 +2689,7 @@
       GST_DEBUG_FUNCPTR (gst_multi_queue_chain));
   gst_pad_set_activatemode_function (sq->sinkpad,
       GST_DEBUG_FUNCPTR (gst_multi_queue_sink_activate_mode));
-  gst_pad_set_event_function (sq->sinkpad,
+  gst_pad_set_event_full_function (sq->sinkpad,
       GST_DEBUG_FUNCPTR (gst_multi_queue_sink_event));
   gst_pad_set_query_function (sq->sinkpad,
       GST_DEBUG_FUNCPTR (gst_multi_queue_sink_query));
diff --git a/plugins/elements/gstmultiqueue.h b/plugins/elements/gstmultiqueue.h
index d63eda5..98e4bc1 100644
--- a/plugins/elements/gstmultiqueue.h
+++ b/plugins/elements/gstmultiqueue.h
@@ -51,6 +51,7 @@
   GstElement element;
 
   gboolean sync_by_running_time;
+  gboolean use_interleave;
 
   /* number of queues */
   guint	nbqueues;
@@ -67,7 +68,7 @@
 
   guint    counter;	/* incoming object counter, use atomic accesses */
   guint32  highid;	/* contains highest id of last outputted object */
-  GstClockTime high_time; /* highest start running time */
+  GstClockTimeDiff high_time; /* highest start running time */
 
   GMutex   qlock;	/* Global queue lock (vs object lock or individual */
 			/* queues lock). Protects nbqueues, queues, global */
@@ -77,6 +78,11 @@
 
   gboolean percent_changed;
   GMutex buffering_post_lock; /* assures only one posted at a time */
+
+  GstClockTime interleave;	/* Input interleave */
+  GstClockTimeDiff last_interleave_update;
+
+  GstClockTime unlinked_cache_time;
 };
 
 struct _GstMultiQueueClass {
diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c
index 1d55522..72c915d 100644
--- a/plugins/elements/gstqueue.c
+++ b/plugins/elements/gstqueue.c
@@ -200,8 +200,8 @@
 static GstFlowReturn gst_queue_push_one (GstQueue * queue);
 static void gst_queue_loop (GstPad * pad);
 
-static gboolean gst_queue_handle_sink_event (GstPad * pad, GstObject * parent,
-    GstEvent * event);
+static GstFlowReturn gst_queue_handle_sink_event (GstPad * pad,
+    GstObject * parent, GstEvent * event);
 static gboolean gst_queue_handle_sink_query (GstPad * pad, GstObject * parent,
     GstQuery * query);
 
@@ -431,7 +431,7 @@
   gst_pad_set_chain_list_function (queue->sinkpad, gst_queue_chain_list);
   gst_pad_set_activatemode_function (queue->sinkpad,
       gst_queue_sink_activate_mode);
-  gst_pad_set_event_function (queue->sinkpad, gst_queue_handle_sink_event);
+  gst_pad_set_event_full_function (queue->sinkpad, gst_queue_handle_sink_event);
   gst_pad_set_query_function (queue->sinkpad, gst_queue_handle_sink_query);
   GST_PAD_SET_PROXY_CAPS (queue->sinkpad);
   gst_element_add_pad (GST_ELEMENT (queue), queue->sinkpad);
@@ -601,7 +601,7 @@
 {
   GstClockTime duration, timestamp;
 
-  timestamp = GST_BUFFER_TIMESTAMP (buffer);
+  timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
   duration = GST_BUFFER_DURATION (buffer);
 
   /* if no timestamp is set, assume it's continuous with the previous
@@ -631,14 +631,16 @@
 buffer_list_apply_time (GstBuffer ** buf, guint idx, gpointer user_data)
 {
   GstClockTime *timestamp = user_data;
+  GstClockTime btime;
 
-  GST_TRACE ("buffer %u has ts %" GST_TIME_FORMAT
-      " duration %" GST_TIME_FORMAT, idx,
-      GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buf)),
+  GST_TRACE ("buffer %u has pts %" GST_TIME_FORMAT " dts %" GST_TIME_FORMAT
+      " duration %" GST_TIME_FORMAT, idx, GST_TIME_ARGS (GST_BUFFER_DTS (*buf)),
+      GST_TIME_ARGS (GST_BUFFER_PTS (*buf)),
       GST_TIME_ARGS (GST_BUFFER_DURATION (*buf)));
 
-  if (GST_BUFFER_TIMESTAMP_IS_VALID (*buf))
-    *timestamp = GST_BUFFER_TIMESTAMP (*buf);
+  btime = GST_BUFFER_DTS_OR_PTS (*buf);
+  if (GST_CLOCK_TIME_IS_VALID (btime))
+    *timestamp = btime;
 
   if (GST_BUFFER_DURATION_IS_VALID (*buf))
     *timestamp += GST_BUFFER_DURATION (*buf);
@@ -895,7 +897,7 @@
   }
 }
 
-static gboolean
+static GstFlowReturn
 gst_queue_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 {
   gboolean ret = TRUE;
@@ -983,7 +985,9 @@
       }
       break;
   }
-  return ret;
+  if (ret == FALSE)
+    return GST_FLOW_ERROR;
+  return GST_FLOW_OK;
 
   /* ERRORS */
 out_eos:
@@ -991,7 +995,7 @@
     GST_CAT_LOG_OBJECT (queue_dataflow, queue, "refusing event, we are EOS");
     GST_QUEUE_MUTEX_UNLOCK (queue);
     gst_event_unref (event);
-    return FALSE;
+    return GST_FLOW_EOS;
   }
 out_flow_error:
   {
@@ -999,7 +1003,7 @@
         "refusing event, we have a downstream flow error: %s",
         gst_flow_get_name (queue->srcresult));
     gst_event_unref (event);
-    return FALSE;
+    return queue->srcresult;
   }
 }
 
@@ -1146,7 +1150,7 @@
     GstClockTime duration, timestamp;
     GstBuffer *buffer = GST_BUFFER_CAST (obj);
 
-    timestamp = GST_BUFFER_TIMESTAMP (buffer);
+    timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
     duration = GST_BUFFER_DURATION (buffer);
 
     GST_CAT_LOG_OBJECT (queue_dataflow, queue, "received buffer %p of size %"
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c
index 9dbf26c..167eaf4 100644
--- a/plugins/elements/gstqueue2.c
+++ b/plugins/elements/gstqueue2.c
@@ -97,6 +97,7 @@
 
 enum
 {
+  SIGNAL_OVERRUN,
   LAST_SIGNAL
 };
 
@@ -136,6 +137,7 @@
   PROP_TEMP_LOCATION,
   PROP_TEMP_REMOVE,
   PROP_RING_BUFFER_MAX_SIZE,
+  PROP_AVG_IN_RATE,
   PROP_LAST
 };
 
@@ -289,7 +291,7 @@
   GstMiniObject *item;
 } GstQueue2Item;
 
-/* static guint gst_queue2_signals[LAST_SIGNAL] = { 0 }; */
+static guint gst_queue2_signals[LAST_SIGNAL] = { 0 };
 
 static void
 gst_queue2_class_init (GstQueue2Class * klass)
@@ -300,6 +302,23 @@
   gobject_class->set_property = gst_queue2_set_property;
   gobject_class->get_property = gst_queue2_get_property;
 
+  /* signals */
+  /**
+   * GstQueue2::overrun:
+   * @queue: the queue2 instance
+   *
+   * Reports that the buffer became full (overrun).
+   * A buffer is full if the total amount of data inside it (num-buffers, time,
+   * size) is higher than the boundary values which can be set through the
+   * GObject properties.
+   *
+   * Since: 1.8
+   */
+  gst_queue2_signals[SIGNAL_OVERRUN] =
+      g_signal_new ("overrun", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+      G_STRUCT_OFFSET (GstQueue2Class, overrun), NULL, NULL,
+      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
   /* properties */
   g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_BYTES,
       g_param_spec_uint ("current-level-bytes", "Current level (kB)",
@@ -388,6 +407,16 @@
           0, G_MAXUINT64, DEFAULT_RING_BUFFER_MAX_SIZE,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  /**
+   * GstQueue2:avg-in-rate
+   *
+   * The average input data rate.
+   */
+  g_object_class_install_property (gobject_class, PROP_AVG_IN_RATE,
+      g_param_spec_int64 ("avg-in-rate", "Input data rate (bytes/s)",
+          "Average input data rate (bytes/s)",
+          0, G_MAXINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
   /* set several parent class virtual functions */
   gobject_class->finalize = gst_queue2_finalize;
 
@@ -705,7 +734,7 @@
   /* now configure the values, we use these to track timestamps on the
    * sinkpad. */
   if (segment->format != GST_FORMAT_TIME) {
-    /* non-time format, pretent the current time segment is closed with a
+    /* non-time format, pretend the current time segment is closed with a
      * 0 start and unknown stop time. */
     segment->format = GST_FORMAT_TIME;
     segment->start = 0;
@@ -758,7 +787,7 @@
 {
   GstClockTime duration, timestamp;
 
-  timestamp = GST_BUFFER_TIMESTAMP (buffer);
+  timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
   duration = GST_BUFFER_DURATION (buffer);
 
   /* if no timestamp is set, assume it's continuous with the previous
@@ -788,14 +817,17 @@
 buffer_list_apply_time (GstBuffer ** buf, guint idx, gpointer data)
 {
   GstClockTime *timestamp = data;
+  GstClockTime btime;
 
-  GST_TRACE ("buffer %u has ts %" GST_TIME_FORMAT
+  GST_TRACE ("buffer %u has pts %" GST_TIME_FORMAT " dts %" GST_TIME_FORMAT
       " duration %" GST_TIME_FORMAT, idx,
-      GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buf)),
+      GST_TIME_ARGS (GST_BUFFER_PTS (*buf)),
+      GST_TIME_ARGS (GST_BUFFER_DTS (*buf)),
       GST_TIME_ARGS (GST_BUFFER_DURATION (*buf)));
 
-  if (GST_BUFFER_TIMESTAMP_IS_VALID (*buf))
-    *timestamp = GST_BUFFER_TIMESTAMP (*buf);
+  btime = GST_BUFFER_DTS_OR_PTS (*buf);
+  if (GST_CLOCK_TIME_IS_VALID (btime))
+    *timestamp = btime;
 
   if (GST_BUFFER_DURATION_IS_VALID (*buf))
     *timestamp += GST_BUFFER_DURATION (*buf);
@@ -851,6 +883,11 @@
     perc = 100;
     GST_LOG_OBJECT (queue, "we are EOS");
   } else {
+    GST_LOG_OBJECT (queue,
+        "Cur level bytes/time/buffers %u/%" GST_TIME_FORMAT "/%u",
+        queue->cur_level.bytes, GST_TIME_ARGS (queue->cur_level.time),
+        queue->cur_level.buffers);
+
     /* figure out the percent we are filled, we take the max of all formats. */
     if (!QUEUE_IS_USING_RING_BUFFER (queue)) {
       perc = GET_PERCENT (bytes, 0);
@@ -864,6 +901,10 @@
     /* also apply the rate estimate when we need to */
     if (queue->use_rate_estimate)
       perc = MAX (perc, GET_PERCENT (rate_time, 0));
+
+    /* Don't get to 0% unless we're really empty */
+    if (queue->cur_level.bytes > 0)
+      perc = MAX (1, perc);
   }
 #undef GET_PERCENT
 
@@ -983,6 +1024,7 @@
   queue->byte_in_rate = 0.0;
   queue->byte_in_period = 0;
   queue->byte_out_rate = 0.0;
+  queue->last_update_in_rates_elapsed = 0.0;
   queue->last_in_elapsed = 0.0;
   queue->last_out_elapsed = 0.0;
   queue->in_timer_started = FALSE;
@@ -1013,7 +1055,8 @@
     return;
   }
 
-  elapsed = g_timer_elapsed (queue->in_timer, NULL);
+  queue->last_update_in_rates_elapsed = elapsed =
+      g_timer_elapsed (queue->in_timer, NULL);
 
   /* recalc after each interval. */
   if (queue->last_in_elapsed + RATE_INTERVAL < elapsed) {
@@ -1500,7 +1543,7 @@
 
   GST_DEBUG_OBJECT (queue, "opening temp file %s", queue->temp_template);
 
-  /* If temp_template was set, allocate a filename and open that filen */
+  /* If temp_template was set, allocate a filename and open that file */
 
   /* nothing to do */
   if (queue->temp_template == NULL)
@@ -1662,6 +1705,13 @@
     GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
         "queue is full, waiting for free space");
     do {
+      GST_QUEUE2_MUTEX_UNLOCK (queue);
+      g_signal_emit (queue, gst_queue2_signals[SIGNAL_OVERRUN], 0);
+      GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->srcresult, out_flushing);
+      /* we recheck, the signal could have changed the thresholds */
+      if (!gst_queue2_is_filled (queue))
+        break;
+
       /* Wait for space to be available, we could be unlocked because of a flush. */
       GST_QUEUE2_WAIT_DEL_CHECK (queue, queue->sinkresult, out_flushing);
     }
@@ -3605,6 +3655,19 @@
     case PROP_RING_BUFFER_MAX_SIZE:
       g_value_set_uint64 (value, queue->ring_buffer_max_size);
       break;
+    case PROP_AVG_IN_RATE:
+    {
+      gdouble in_rate = queue->byte_in_rate;
+
+      /* During the first RATE_INTERVAL, byte_in_rate will not have been
+       * calculated, so calculate it here. */
+      if (in_rate == 0.0 && queue->bytes_in
+          && queue->last_update_in_rates_elapsed > 0.0)
+        in_rate = queue->bytes_in / queue->last_update_in_rates_elapsed;
+
+      g_value_set_int64 (value, (gint64) in_rate);
+      break;
+    }
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
diff --git a/plugins/elements/gstqueue2.h b/plugins/elements/gstqueue2.h
index 9a881b0..1f4cd06 100644
--- a/plugins/elements/gstqueue2.h
+++ b/plugins/elements/gstqueue2.h
@@ -115,6 +115,7 @@
   /* for measuring input/output rates */
   GTimer *in_timer;
   gboolean in_timer_started;
+  gdouble last_update_in_rates_elapsed;
   gdouble last_in_elapsed;
   guint64 bytes_in;
   gdouble byte_in_rate;
@@ -165,6 +166,9 @@
 struct _GstQueue2Class
 {
   GstElementClass parent_class;
+
+  /* signals */
+  void (*overrun)       (GstQueue2 *queue2);
 };
 
 G_GNUC_INTERNAL GType gst_queue2_get_type (void);
diff --git a/plugins/elements/gstsparsefile.c b/plugins/elements/gstsparsefile.c
index 080be41..f8a0af1 100644
--- a/plugins/elements/gstsparsefile.c
+++ b/plugins/elements/gstsparsefile.c
@@ -145,7 +145,7 @@
 /**
  * gst_sparse_file_new:
  *
- * Make a new #GstSparseFile backed by the file represented with @fd.
+ * Make a new #GstSparseFile
  *
  * Returns: a new #GstSparseFile, gst_sparse_file_free() after usage.
  *
@@ -243,7 +243,7 @@
  * If @available is not %NULL, it will be updated with the amount of
  * data already available after the last written byte.
  *
- * Returns: The number of bytes written of 0 on error.
+ * Returns: The number of bytes written or 0 on error.
  *
  * Since: 1.4
  */
diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c
index 006ad26..ab726cd 100644
--- a/plugins/elements/gsttee.c
+++ b/plugins/elements/gsttee.c
@@ -361,8 +361,7 @@
 
   GST_OBJECT_LOCK (tee);
 
-  if (name_templ) {
-    sscanf (name_templ, "src_%u", &index);
+  if (name_templ && sscanf (name_templ, "src_%u", &index) == 1) {
     GST_LOG_OBJECT (element, "name: %s (index %d)", name_templ, index);
     if (g_hash_table_contains (tee->pad_indexes, GUINT_TO_POINTER (index))) {
       GST_ERROR_OBJECT (element, "pad name %s is not unique", name_templ);
diff --git a/plugins/tracers/Makefile.am b/plugins/tracers/Makefile.am
new file mode 100644
index 0000000..f6efee6
--- /dev/null
+++ b/plugins/tracers/Makefile.am
@@ -0,0 +1,46 @@
+
+plugin_LTLIBRARIES = libgstcoretracers.la
+
+if HAVE_GETRUSAGE
+RUSAGE_SOURCES = gstrusage.c
+else
+RUSAGE_SOURCES =
+endif
+
+if GST_DISABLE_GST_DEBUG
+LOG_SOURCES =
+GST_PRINTF_LA =
+else
+LOG_SOURCES = gstlog.c
+GST_PRINTF_LA = $(top_builddir)/gst/printf/libgstprintf.la
+endif
+
+libgstcoretracers_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_API_VERSION@.la
+libgstcoretracers_la_SOURCES = \
+  gstlatency.c \
+  $(LOG_SOURCES) \
+  $(RUSAGE_SOURCES) \
+  gststats.c \
+	gsttracers.c
+
+libgstcoretracers_la_CFLAGS = $(GST_OBJ_CFLAGS) \
+  -DGST_USE_UNSTABLE_API
+libgstcoretracers_la_LIBADD = \
+	$(GST_PRINTF_LA) \
+	$(GST_OBJ_LIBS)
+libgstcoretracers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoretracers_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+
+noinst_HEADERS = \
+  gstlatency.h \
+  gstlog.h \
+  gstrusage.h \
+  gststats.h
+
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+
+%.c.gcov: .libs/libgstcoretracers_la-%.gcda %.c
+	$(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoretracers_la_SOURCES:=.gcov)
+
diff --git a/plugins/tracers/Makefile.in b/plugins/tracers/Makefile.in
new file mode 100644
index 0000000..5fdaf46
--- /dev/null
+++ b/plugins/tracers/Makefile.in
@@ -0,0 +1,940 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = plugins/tracers
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
+	$(top_srcdir)/common/m4/as-auto-alt.m4 \
+	$(top_srcdir)/common/m4/as-compiler-flag.m4 \
+	$(top_srcdir)/common/m4/as-docbook.m4 \
+	$(top_srcdir)/common/m4/as-libtool.m4 \
+	$(top_srcdir)/common/m4/as-version.m4 \
+	$(top_srcdir)/common/m4/ax_create_stdint_h.m4 \
+	$(top_srcdir)/common/m4/ax_pthread.m4 \
+	$(top_srcdir)/common/m4/gst-arch.m4 \
+	$(top_srcdir)/common/m4/gst-args.m4 \
+	$(top_srcdir)/common/m4/gst-check.m4 \
+	$(top_srcdir)/common/m4/gst-doc.m4 \
+	$(top_srcdir)/common/m4/gst-error.m4 \
+	$(top_srcdir)/common/m4/gst-feature.m4 \
+	$(top_srcdir)/common/m4/gst-function.m4 \
+	$(top_srcdir)/common/m4/gst-gettext.m4 \
+	$(top_srcdir)/common/m4/gst-glib2.m4 \
+	$(top_srcdir)/common/m4/gst-package-release-datetime.m4 \
+	$(top_srcdir)/common/m4/gst-parser.m4 \
+	$(top_srcdir)/common/m4/gst-platform.m4 \
+	$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+	$(top_srcdir)/common/m4/gst-plugindir.m4 \
+	$(top_srcdir)/common/m4/gst.m4 \
+	$(top_srcdir)/common/m4/gtk-doc.m4 \
+	$(top_srcdir)/common/m4/introspection.m4 \
+	$(top_srcdir)/common/m4/pkg.m4 \
+	$(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/stdint_h.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+@GST_DISABLE_GST_DEBUG_FALSE@am__DEPENDENCIES_1 = $(top_builddir)/gst/printf/libgstprintf.la
+am__DEPENDENCIES_2 =
+am__libgstcoretracers_la_SOURCES_DIST = gstlatency.c gstlog.c \
+	gstrusage.c gststats.c gsttracers.c
+@GST_DISABLE_GST_DEBUG_FALSE@am__objects_1 =  \
+@GST_DISABLE_GST_DEBUG_FALSE@	libgstcoretracers_la-gstlog.lo
+@HAVE_GETRUSAGE_TRUE@am__objects_2 =  \
+@HAVE_GETRUSAGE_TRUE@	libgstcoretracers_la-gstrusage.lo
+am_libgstcoretracers_la_OBJECTS = libgstcoretracers_la-gstlatency.lo \
+	$(am__objects_1) $(am__objects_2) \
+	libgstcoretracers_la-gststats.lo \
+	libgstcoretracers_la-gsttracers.lo
+libgstcoretracers_la_OBJECTS = $(am_libgstcoretracers_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libgstcoretracers_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) \
+	$(libgstcoretracers_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libgstcoretracers_la_SOURCES)
+DIST_SOURCES = $(am__libgstcoretracers_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BASH_COMPLETION_CFLAGS = @BASH_COMPLETION_CFLAGS@
+BASH_COMPLETION_DIR = @BASH_COMPLETION_DIR@
+BASH_COMPLETION_LIBS = @BASH_COMPLETION_LIBS@
+BASH_HELPERS_DIR = @BASH_HELPERS_DIR@
+BISON_PATH = @BISON_PATH@
+CAP_LIBS = @CAP_LIBS@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_API_VERSION = @GST_API_VERSION@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+GST_LICENSE = @GST_LICENSE@
+GST_LT_LDFLAGS = @GST_LT_LDFLAGS@
+GST_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@
+GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@
+GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
+GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_LIBTOOLFLAGS = @GST_PLUGIN_LIBTOOLFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PTP_HELPER_INSTALLED = @GST_PTP_HELPER_INSTALLED@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_VERSION_MAJOR = @GST_VERSION_MAJOR@
+GST_VERSION_MICRO = @GST_VERSION_MICRO@
+GST_VERSION_MINOR = @GST_VERSION_MINOR@
+GST_VERSION_NANO = @GST_VERSION_NANO@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAVE_CAP = @HAVE_CAP@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FORK = @HAVE_FORK@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HAVE_XSLTPROC = @HAVE_XSLTPROC@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_INIT = @INTROSPECTION_INIT@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PRINTF_CFLAGS = @PRINTF_CFLAGS@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SETCAP = @SETCAP@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+plugindir = @plugindir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+plugin_LTLIBRARIES = libgstcoretracers.la
+@HAVE_GETRUSAGE_FALSE@RUSAGE_SOURCES = 
+@HAVE_GETRUSAGE_TRUE@RUSAGE_SOURCES = gstrusage.c
+@GST_DISABLE_GST_DEBUG_FALSE@LOG_SOURCES = gstlog.c
+@GST_DISABLE_GST_DEBUG_TRUE@LOG_SOURCES = 
+@GST_DISABLE_GST_DEBUG_FALSE@GST_PRINTF_LA = $(top_builddir)/gst/printf/libgstprintf.la
+@GST_DISABLE_GST_DEBUG_TRUE@GST_PRINTF_LA = 
+libgstcoretracers_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_API_VERSION@.la
+libgstcoretracers_la_SOURCES = \
+  gstlatency.c \
+  $(LOG_SOURCES) \
+  $(RUSAGE_SOURCES) \
+  gststats.c \
+	gsttracers.c
+
+libgstcoretracers_la_CFLAGS = $(GST_OBJ_CFLAGS) \
+  -DGST_USE_UNSTABLE_API
+
+libgstcoretracers_la_LIBADD = \
+	$(GST_PRINTF_LA) \
+	$(GST_OBJ_LIBS)
+
+libgstcoretracers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoretracers_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+noinst_HEADERS = \
+  gstlatency.h \
+  gstlog.h \
+  gstrusage.h \
+  gststats.h
+
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/tracers/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu plugins/tracers/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \
+	}
+
+uninstall-pluginLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \
+	done
+
+clean-pluginLTLIBRARIES:
+	-test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES)
+	@list='$(plugin_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libgstcoretracers.la: $(libgstcoretracers_la_OBJECTS) $(libgstcoretracers_la_DEPENDENCIES) $(EXTRA_libgstcoretracers_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libgstcoretracers_la_LINK) -rpath $(plugindir) $(libgstcoretracers_la_OBJECTS) $(libgstcoretracers_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gstlatency.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gstlog.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gstrusage.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gststats.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gsttracers.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+libgstcoretracers_la-gstlatency.lo: gstlatency.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gstlatency.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gstlatency.Tpo -c -o libgstcoretracers_la-gstlatency.lo `test -f 'gstlatency.c' || echo '$(srcdir)/'`gstlatency.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gstlatency.Tpo $(DEPDIR)/libgstcoretracers_la-gstlatency.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstlatency.c' object='libgstcoretracers_la-gstlatency.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gstlatency.lo `test -f 'gstlatency.c' || echo '$(srcdir)/'`gstlatency.c
+
+libgstcoretracers_la-gstlog.lo: gstlog.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gstlog.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gstlog.Tpo -c -o libgstcoretracers_la-gstlog.lo `test -f 'gstlog.c' || echo '$(srcdir)/'`gstlog.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gstlog.Tpo $(DEPDIR)/libgstcoretracers_la-gstlog.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstlog.c' object='libgstcoretracers_la-gstlog.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gstlog.lo `test -f 'gstlog.c' || echo '$(srcdir)/'`gstlog.c
+
+libgstcoretracers_la-gstrusage.lo: gstrusage.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gstrusage.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gstrusage.Tpo -c -o libgstcoretracers_la-gstrusage.lo `test -f 'gstrusage.c' || echo '$(srcdir)/'`gstrusage.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gstrusage.Tpo $(DEPDIR)/libgstcoretracers_la-gstrusage.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstrusage.c' object='libgstcoretracers_la-gstrusage.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gstrusage.lo `test -f 'gstrusage.c' || echo '$(srcdir)/'`gstrusage.c
+
+libgstcoretracers_la-gststats.lo: gststats.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gststats.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gststats.Tpo -c -o libgstcoretracers_la-gststats.lo `test -f 'gststats.c' || echo '$(srcdir)/'`gststats.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gststats.Tpo $(DEPDIR)/libgstcoretracers_la-gststats.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gststats.c' object='libgstcoretracers_la-gststats.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gststats.lo `test -f 'gststats.c' || echo '$(srcdir)/'`gststats.c
+
+libgstcoretracers_la-gsttracers.lo: gsttracers.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gsttracers.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gsttracers.Tpo -c -o libgstcoretracers_la-gsttracers.lo `test -f 'gsttracers.c' || echo '$(srcdir)/'`gsttracers.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gsttracers.Tpo $(DEPDIR)/libgstcoretracers_la-gsttracers.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsttracers.c' object='libgstcoretracers_la-gsttracers.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gsttracers.lo `test -f 'gsttracers.c' || echo '$(srcdir)/'`gsttracers.c
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(plugindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pluginLTLIBRARIES
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pluginLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pluginLTLIBRARIES install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-pluginLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+%.c.gcov: .libs/libgstcoretracers_la-%.gcda %.c
+	$(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoretracers_la_SOURCES:=.gcov)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/plugins/tracers/gstlatency.c b/plugins/tracers/gstlatency.c
new file mode 100644
index 0000000..3e19fba
--- /dev/null
+++ b/plugins/tracers/gstlatency.c
@@ -0,0 +1,244 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstlatency.c: tracing module that logs processing latency stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gstlatency
+ * @short_description: log processing latency stats
+ *
+ * A tracing module that determines src-to-sink latencies by injecting custom
+ * events at sources and process them at sinks. 
+ */
+/* TODO(ensonic): if there are two sources feeding into a mixer/muxer and later
+ * we fan-out with tee and have two sinks, each sink would get all two events,
+ * the later event would overwrite the former. Unfortunately when the buffer
+ * arrives on the sink we don't know to which event it correlates. Better would
+ * be to use the buffer meta in 1.0 instead of the event. Or we track a min/max
+ * latency.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "gstlatency.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_latency_debug);
+#define GST_CAT_DEFAULT gst_latency_debug
+
+#define _do_init \
+    GST_DEBUG_CATEGORY_INIT (gst_latency_debug, "latency", 0, "latency tracer");
+#define gst_latency_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstLatencyTracer, gst_latency_tracer, GST_TYPE_TRACER,
+    _do_init);
+
+static GQuark latency_probe_id;
+static GQuark latency_probe_pad;
+static GQuark latency_probe_ts;
+
+/* data helpers */
+
+/*
+ * Get the element/bin owning the pad. 
+ *
+ * in: a normal pad
+ * out: the element
+ *
+ * in: a proxy pad
+ * out: the element that contains the peer of the proxy
+ *
+ * in: a ghost pad
+ * out: the bin owning the ghostpad
+ */
+/* TODO(ensonic): gst_pad_get_parent_element() would not work here, should we
+ * add this as new api, e.g. gst_pad_find_parent_element();
+ */
+static GstElement *
+get_real_pad_parent (GstPad * pad)
+{
+  GstObject *parent;
+
+  if (!pad)
+    return NULL;
+
+  parent = GST_OBJECT_PARENT (pad);
+
+  /* if parent of pad is a ghost-pad, then pad is a proxy_pad */
+  if (parent && GST_IS_GHOST_PAD (parent)) {
+    pad = GST_PAD_CAST (parent);
+    parent = GST_OBJECT_PARENT (pad);
+  }
+  return GST_ELEMENT_CAST (parent);
+}
+
+/* hooks */
+
+static void
+log_latency (const GstStructure * data, GstPad * sink_pad, guint64 sink_ts)
+{
+  GstPad *src_pad;
+  guint64 src_ts;
+  gchar *src, *sink;
+
+  gst_structure_id_get (data,
+      latency_probe_pad, GST_TYPE_PAD, &src_pad,
+      latency_probe_ts, G_TYPE_UINT64, &src_ts, NULL);
+
+  src = g_strdup_printf ("%s_%s", GST_DEBUG_PAD_NAME (src_pad));
+  sink = g_strdup_printf ("%s_%s", GST_DEBUG_PAD_NAME (sink_pad));
+
+  /* TODO(ensonic): report format is still unstable */
+  gst_tracer_log_trace (gst_structure_new ("latency",
+          "src", G_TYPE_STRING, src,
+          "sink", G_TYPE_STRING, sink,
+          "time", G_TYPE_UINT64, GST_CLOCK_DIFF (src_ts, sink_ts), NULL));
+  g_free (src);
+  g_free (sink);
+}
+
+static void
+send_latency_probe (GstElement * parent, GstPad * pad, guint64 ts)
+{
+  if (parent && (!GST_IS_BIN (parent)) &&
+      GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SOURCE)) {
+    GstEvent *latency_probe = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
+        gst_structure_new_id (latency_probe_id,
+            latency_probe_pad, GST_TYPE_PAD, pad,
+            latency_probe_ts, G_TYPE_UINT64, ts,
+            NULL));
+    gst_pad_push_event (pad, latency_probe);
+  }
+}
+
+static void
+do_push_buffer_pre (GstTracer * self, guint64 ts, GstPad * pad)
+{
+  GstElement *parent = get_real_pad_parent (pad);
+
+  send_latency_probe (parent, pad, ts);
+}
+
+static void
+do_pull_range_pre (GstTracer * self, guint64 ts, GstPad * pad)
+{
+  GstPad *peer_pad = GST_PAD_PEER (pad);
+  GstElement *parent = get_real_pad_parent (peer_pad);
+
+  send_latency_probe (parent, peer_pad, ts);
+}
+
+static void
+calculate_latency (GstElement * parent, GstPad * pad, guint64 ts)
+{
+  if (parent && (!GST_IS_BIN (parent)) &&
+      GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SINK)) {
+    GstEvent *ev = g_object_get_qdata ((GObject *) pad, latency_probe_id);
+
+    log_latency (gst_event_get_structure (ev), pad, ts);
+    gst_event_unref (ev);
+  }
+}
+
+static void
+do_push_buffer_post (GstTracer * self, guint64 ts, GstPad * pad)
+{
+  GstPad *peer_pad = GST_PAD_PEER (pad);
+  GstElement *parent = get_real_pad_parent (peer_pad);
+
+  calculate_latency (parent, peer_pad, ts);
+}
+
+static void
+do_pull_range_post (GstTracer * self, guint64 ts, GstPad * pad)
+{
+  GstElement *parent = get_real_pad_parent (pad);
+
+  calculate_latency (parent, pad, ts);
+}
+
+static void
+do_push_event_pre (GstTracer * self, guint64 ts, GstPad * pad, GstEvent * ev)
+{
+  GstPad *peer_pad = GST_PAD_PEER (pad);
+  GstElement *parent = get_real_pad_parent (peer_pad);
+
+  if (parent && (!GST_IS_BIN (parent)) &&
+      GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SINK)) {
+    if (GST_EVENT_TYPE (ev) == GST_EVENT_CUSTOM_DOWNSTREAM) {
+      const GstStructure *data = gst_event_get_structure (ev);
+
+      if (gst_structure_get_name_id (data) == latency_probe_id) {
+        /* store event and calculate latency when the buffer that follows
+         * has been processed */
+        g_object_set_qdata ((GObject *) peer_pad, latency_probe_id,
+            gst_event_ref (ev));
+      }
+    }
+  }
+}
+
+/* tracer class */
+
+static void
+gst_latency_tracer_class_init (GstLatencyTracerClass * klass)
+{
+  latency_probe_id = g_quark_from_static_string ("latency_probe.id");
+  latency_probe_pad = g_quark_from_static_string ("latency_probe.pad");
+  latency_probe_ts = g_quark_from_static_string ("latency_probe.ts");
+
+  /* announce trace formats */
+  /* *INDENT-OFF* */
+  gst_tracer_log_trace (gst_structure_new ("latency.class",
+      "src", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "pad",  /* TODO: use genum */
+          NULL),
+      "sink", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "pad",  /* TODO: use genum */
+          NULL),
+      "time", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+          "description", G_TYPE_STRING,
+              "time it took for the buffer to go from src to sink ns",
+          "flags", G_TYPE_STRING, "aggregated",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+          "max", G_TYPE_UINT64, G_MAXUINT64,
+          NULL),
+      NULL));
+  /* *INDENT-ON* */
+}
+
+static void
+gst_latency_tracer_init (GstLatencyTracer * self)
+{
+  GstTracer *tracer = GST_TRACER (self);
+  gst_tracing_register_hook (tracer, "pad-push-pre",
+      G_CALLBACK (do_push_buffer_pre));
+  gst_tracing_register_hook (tracer, "pad-push-list-pre",
+      G_CALLBACK (do_push_buffer_pre));
+  gst_tracing_register_hook (tracer, "pad-push-post",
+      G_CALLBACK (do_push_buffer_post));
+  gst_tracing_register_hook (tracer, "pad-push-list-post",
+      G_CALLBACK (do_push_buffer_post));
+  gst_tracing_register_hook (tracer, "pad-pull-range-pre",
+      G_CALLBACK (do_pull_range_pre));
+  gst_tracing_register_hook (tracer, "pad-pull-range-post",
+      G_CALLBACK (do_pull_range_post));
+  gst_tracing_register_hook (tracer, "pad-push-event-pre",
+      G_CALLBACK (do_push_event_pre));
+}
diff --git a/plugins/tracers/gstlatency.h b/plugins/tracers/gstlatency.h
new file mode 100644
index 0000000..e234303
--- /dev/null
+++ b/plugins/tracers/gstlatency.h
@@ -0,0 +1,66 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstrusage.h: tracing module that logs resource usage stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_LATENCY_TRACER_H__
+#define __GST_LATENCY_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_LATENCY_TRACER \
+  (gst_latency_tracer_get_type())
+#define GST_LATENCY_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LATENCY_TRACER,GstLatencyTracer))
+#define GST_LATENCY_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LATENCY_TRACER,GstLatencyTracerClass))
+#define GST_IS_LATENCY_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LATENCY_TRACER))
+#define GST_IS_LATENCY_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LATENCY_TRACER))
+#define GST_LATENCY_TRACER_CAST(obj) ((GstLatencyTracer *)(obj))
+
+typedef struct _GstLatencyTracer GstLatencyTracer;
+typedef struct _GstLatencyTracerClass GstLatencyTracerClass;
+
+/**
+ * GstLatencyTracer:
+ *
+ * Opaque #GstLatencyTracer data structure
+ */
+struct _GstLatencyTracer {
+  GstTracer 	 parent;
+
+  /*< private >*/
+};
+
+struct _GstLatencyTracerClass {
+  GstTracerClass parent_class;
+
+  /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_latency_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_LATENCY_TRACER_H__ */
diff --git a/plugins/tracers/gstlog.c b/plugins/tracers/gstlog.c
new file mode 100644
index 0000000..ac9ae17
--- /dev/null
+++ b/plugins/tracers/gstlog.c
@@ -0,0 +1,358 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstlog.c: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gstlog
+ * @short_description: log hook event
+ *
+ * A tracing module that logs all data from all hooks. 
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "gstlog.h"
+
+#include <gst/printf/printf.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_log_debug);
+#define GST_CAT_DEFAULT gst_log_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_BIN);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER_LIST);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_EVENT);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_MESSAGE);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_QUERY);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_STATES);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_PADS);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_PADS);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_FACTORY);
+
+#define _do_init \
+    GST_DEBUG_CATEGORY_INIT (gst_log_debug, "log", 0, "log tracer"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER, "GST_BUFFER"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER_LIST, "GST_BUFFER_LIST"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_EVENT, "GST_EVENT"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_MESSAGE, "GST_MESSAGE"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_STATES, "GST_STATES"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_PADS, "GST_PADS"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_PADS, "GST_ELEMENT_PADS"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_FACTORY, "GST_ELEMENT_FACTORY"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_QUERY, "query"); \
+    GST_DEBUG_CATEGORY_GET (GST_CAT_BIN, "bin");
+#define gst_log_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstLogTracer, gst_log_tracer, GST_TYPE_TRACER,
+    _do_init);
+
+static void
+do_log (GstDebugCategory * cat, const char *fmt, ...)
+{
+  va_list var_args;
+
+  va_start (var_args, fmt);
+  gst_debug_log_valist (cat, GST_LEVEL_TRACE, "", "", 0, NULL, fmt, var_args);
+  va_end (var_args);
+}
+
+static void
+do_push_buffer_pre (GstTracer * self, guint64 ts, GstPad * pad,
+    GstBuffer * buffer)
+{
+  do_log (GST_CAT_BUFFER,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), pad, buffer);
+}
+
+static void
+do_push_buffer_post (GstTracer * self, guint64 ts, GstPad * pad,
+    GstFlowReturn res)
+{
+  do_log (GST_CAT_BUFFER,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
+      GST_TIME_ARGS (ts), pad, res);
+}
+
+static void
+do_push_buffer_list_pre (GstTracer * self, guint64 ts, GstPad * pad,
+    GstBufferList * list)
+{
+  do_log (GST_CAT_BUFFER_LIST,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", list=%p",
+      GST_TIME_ARGS (ts), pad, list);
+}
+
+static void
+do_push_buffer_list_post (GstTracer * self, guint64 ts, GstPad * pad,
+    GstFlowReturn res)
+{
+  do_log (GST_CAT_BUFFER_LIST,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
+      GST_TIME_ARGS (ts), pad, res);
+}
+
+static void
+do_pull_range_pre (GstTracer * self, guint64 ts, GstPad * pad, guint64 offset,
+    guint size)
+{
+  do_log (GST_CAT_BUFFER,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", offset=%" G_GUINT64_FORMAT
+      ", size=%u", GST_TIME_ARGS (ts), pad, offset, size);
+}
+
+static void
+do_pull_range_post (GstTracer * self, guint64 ts, GstPad * pad,
+    GstBuffer * buffer, GstFlowReturn res)
+{
+  do_log (GST_CAT_BUFFER,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT
+      ", res=%d", GST_TIME_ARGS (ts), pad, buffer, res);
+}
+
+static void
+do_push_event_pre (GstTracer * self, guint64 ts, GstPad * pad, GstEvent * event)
+{
+  do_log (GST_CAT_EVENT,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", event=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), pad, event);
+}
+
+static void
+do_push_event_post (GstTracer * self, guint64 ts, GstPad * pad, gboolean res)
+{
+  do_log (GST_CAT_EVENT,
+      "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
+      GST_TIME_ARGS (ts), pad, res);
+}
+
+static void
+do_post_message_pre (GstTracer * self, guint64 ts, GstElement * elem,
+    GstMessage * msg)
+{
+  do_log (GST_CAT_EVENT,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", message=%"
+      GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, msg);
+}
+
+static void
+do_post_message_post (GstTracer * self, guint64 ts, GstElement * elem,
+    gboolean res)
+{
+  do_log (GST_CAT_EVENT,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d",
+      GST_TIME_ARGS (ts), elem, res);
+}
+
+static void
+do_query_pre (GstTracer * self, guint64 ts, GstElement * elem, GstQuery * query)
+{
+  do_log (GST_CAT_QUERY,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", query=%"
+      GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, query);
+}
+
+static void
+do_query_post (GstTracer * self, guint64 ts, GstElement * elem, gboolean res)
+{
+  do_log (GST_CAT_QUERY,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d",
+      GST_TIME_ARGS (ts), elem, res);
+}
+
+static void
+do_element_new (GstTracer * self, guint64 ts, GstElement * elem)
+{
+  do_log (GST_CAT_ELEMENT_FACTORY,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), elem);
+}
+
+static void
+do_element_add_pad (GstTracer * self, guint64 ts, GstElement * elem,
+    GstPad * pad)
+{
+  do_log (GST_CAT_ELEMENT_PADS,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), elem, pad);
+}
+
+static void
+do_element_remove_pad (GstTracer * self, guint64 ts, GstElement * elem,
+    GstPad * pad)
+{
+  do_log (GST_CAT_ELEMENT_PADS,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), elem, pad);
+}
+
+static void
+do_element_change_state_pre (GstTracer * self, guint64 ts, GstElement * elem,
+    GstStateChange change)
+{
+  do_log (GST_CAT_STATES,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d",
+      GST_TIME_ARGS (ts), elem, (gint) change);
+}
+
+static void
+do_element_change_state_post (GstTracer * self, guint64 ts, GstElement * elem,
+    GstStateChange change, GstStateChangeReturn res)
+{
+  do_log (GST_CAT_STATES,
+      "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d, res=%d",
+      GST_TIME_ARGS (ts), elem, (gint) change, (gint) res);
+}
+
+static void
+do_bin_add_pre (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem)
+{
+  do_log (GST_CAT_BIN,
+      "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), bin, elem);
+}
+
+static void
+do_bin_add_post (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem,
+    gboolean res)
+{
+  do_log (GST_CAT_BIN,
+      "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT
+      ", res=%d", GST_TIME_ARGS (ts), bin, elem, res);
+}
+
+static void
+do_bin_remove_pre (GstTracer * self, guint64 ts, GstBin * bin,
+    GstElement * elem)
+{
+  do_log (GST_CAT_BIN,
+      "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), bin, elem);
+}
+
+static void
+do_bin_remove_post (GstTracer * self, guint64 ts, GstBin * bin, gboolean res)
+{
+  do_log (GST_CAT_BIN,
+      "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", res=%d",
+      GST_TIME_ARGS (ts), bin, res);
+}
+
+static void
+do_pad_link_pre (GstTracer * self, guint64 ts, GstPad * src, GstElement * sink)
+{
+  do_log (GST_CAT_PADS,
+      "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), src, sink);
+}
+
+static void
+do_pad_link_post (GstTracer * self, guint64 ts, GstPad * src, GstElement * sink,
+    GstPadLinkReturn res)
+{
+  do_log (GST_CAT_PADS,
+      "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
+      ", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
+}
+
+static void
+do_pad_unlink_pre (GstTracer * self, guint64 ts, GstPad * src,
+    GstElement * sink)
+{
+  do_log (GST_CAT_PADS,
+      "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
+      GST_TIME_ARGS (ts), src, sink);
+}
+
+static void
+do_pad_unlink_post (GstTracer * self, guint64 ts, GstPad * src,
+    GstElement * sink, gboolean res)
+{
+  do_log (GST_CAT_PADS,
+      "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
+      ", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
+}
+
+/* tracer class */
+
+static void
+gst_log_tracer_class_init (GstLogTracerClass * klass)
+{
+}
+
+static void
+gst_log_tracer_init (GstLogTracer * self)
+{
+  GstTracer *tracer = GST_TRACER (self);
+
+  gst_tracing_register_hook (tracer, "pad-push-pre",
+      G_CALLBACK (do_push_buffer_pre));
+  gst_tracing_register_hook (tracer, "pad-push-post",
+      G_CALLBACK (do_push_buffer_post));
+  gst_tracing_register_hook (tracer, "pad-push-list-pre",
+      G_CALLBACK (do_push_buffer_list_pre));
+  gst_tracing_register_hook (tracer, "pad-push-list-post",
+      G_CALLBACK (do_push_buffer_list_post));
+  gst_tracing_register_hook (tracer, "pad-pull-range-pre",
+      G_CALLBACK (do_pull_range_pre));
+  gst_tracing_register_hook (tracer, "pad-pull-range-post",
+      G_CALLBACK (do_pull_range_post));
+  gst_tracing_register_hook (tracer, "pad-push-event-pre",
+      G_CALLBACK (do_push_event_pre));
+  gst_tracing_register_hook (tracer, "pad-push-event-post",
+      G_CALLBACK (do_push_event_post));
+  gst_tracing_register_hook (tracer, "pad-query-pre",
+      G_CALLBACK (do_query_pre));
+  gst_tracing_register_hook (tracer, "pad-query-post",
+      G_CALLBACK (do_query_post));
+  gst_tracing_register_hook (tracer, "element-post-message-pre",
+      G_CALLBACK (do_post_message_pre));
+  gst_tracing_register_hook (tracer, "element-post-message-post",
+      G_CALLBACK (do_post_message_post));
+  gst_tracing_register_hook (tracer, "element-query-pre",
+      G_CALLBACK (do_query_pre));
+  gst_tracing_register_hook (tracer, "element-query-post",
+      G_CALLBACK (do_query_post));
+  gst_tracing_register_hook (tracer, "element-new",
+      G_CALLBACK (do_element_new));
+  gst_tracing_register_hook (tracer, "element-add-pad",
+      G_CALLBACK (do_element_add_pad));
+  gst_tracing_register_hook (tracer, "element-remove-pad",
+      G_CALLBACK (do_element_remove_pad));
+  gst_tracing_register_hook (tracer, "element-change-state-pre",
+      G_CALLBACK (do_element_change_state_pre));
+  gst_tracing_register_hook (tracer, "element-change-state-post",
+      G_CALLBACK (do_element_change_state_post));
+  gst_tracing_register_hook (tracer, "bin-add-pre",
+      G_CALLBACK (do_bin_add_pre));
+  gst_tracing_register_hook (tracer, "bin-add-post",
+      G_CALLBACK (do_bin_add_post));
+  gst_tracing_register_hook (tracer, "bin-remove-pre",
+      G_CALLBACK (do_bin_remove_pre));
+  gst_tracing_register_hook (tracer, "bin-remove-post",
+      G_CALLBACK (do_bin_remove_post));
+  gst_tracing_register_hook (tracer, "pad-link-pre",
+      G_CALLBACK (do_pad_link_pre));
+  gst_tracing_register_hook (tracer, "pad-link-post",
+      G_CALLBACK (do_pad_link_post));
+  gst_tracing_register_hook (tracer, "pad-unlink-pre",
+      G_CALLBACK (do_pad_unlink_pre));
+  gst_tracing_register_hook (tracer, "pad-unlink-post",
+      G_CALLBACK (do_pad_unlink_post));
+}
diff --git a/plugins/tracers/gstlog.h b/plugins/tracers/gstlog.h
new file mode 100644
index 0000000..6f0dd7f
--- /dev/null
+++ b/plugins/tracers/gstlog.h
@@ -0,0 +1,66 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstlog.h: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_LOG_TRACER_H__
+#define __GST_LOG_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_LOG_TRACER \
+  (gst_log_tracer_get_type())
+#define GST_LOG_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LOG_TRACER,GstLogTracer))
+#define GST_LOG_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LOG_TRACER,GstLogTracerClass))
+#define GST_IS_LOG_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LOG_TRACER))
+#define GST_IS_LOG_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LOG_TRACER))
+#define GST_LOG_TRACER_CAST(obj) ((GstLogTracer *)(obj))
+
+typedef struct _GstLogTracer GstLogTracer;
+typedef struct _GstLogTracerClass GstLogTracerClass;
+
+/**
+ * GstLogTracer:
+ *
+ * Opaque #GstLogTracer data structure
+ */
+struct _GstLogTracer {
+  GstTracer 	 parent;
+
+  /*< private >*/
+};
+
+struct _GstLogTracerClass {
+  GstTracerClass parent_class;
+
+  /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_log_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_LOG_TRACER_H__ */
diff --git a/plugins/tracers/gstrusage.c b/plugins/tracers/gstrusage.c
new file mode 100644
index 0000000..6ea2685
--- /dev/null
+++ b/plugins/tracers/gstrusage.c
@@ -0,0 +1,361 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstrusage.c: tracing module that logs resource usage stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gstrusage
+ * @short_description: log resource usage stats
+ *
+ * A tracing module that take rusage() snapshots and logs them. 
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <unistd.h>
+#include "gstrusage.h"
+
+#ifdef HAVE_SYS_RESOURCE_H
+#ifndef __USE_GNU
+# define __USE_GNU              /* RUSAGE_THREAD */
+#endif
+#include <sys/resource.h>
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (gst_rusage_debug);
+#define GST_CAT_DEFAULT gst_rusage_debug
+
+G_LOCK_DEFINE (_proc);
+
+#define _do_init \
+    GST_DEBUG_CATEGORY_INIT (gst_rusage_debug, "rusage", 0, "rusage tracer");
+#define gst_rusage_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstRUsageTracer, gst_rusage_tracer, GST_TYPE_TRACER,
+    _do_init);
+
+/* remember x measurements per self->window */
+#define WINDOW_SUBDIV 100
+
+/* number of cpus to scale cpu-usage in threads */
+static glong num_cpus = 1;
+
+typedef struct
+{
+  /* time spend in this thread */
+  GstClockTime tthread;
+  GstTraceValues *tvs_thread;
+} GstThreadStats;
+
+/* data helper */
+
+static void
+free_trace_value (gpointer data)
+{
+  g_slice_free (GstTraceValue, data);
+}
+
+static GstTraceValues *
+make_trace_values (GstClockTime window)
+{
+  GstTraceValues *self = g_slice_new0 (GstTraceValues);
+  self->window = window;
+  g_queue_init (&self->values);
+  return self;
+}
+
+static void
+free_trace_values (GstTraceValues * self)
+{
+  g_queue_free_full (&self->values, free_trace_value);
+  g_slice_free (GstTraceValues, self);
+}
+
+static gboolean
+update_trace_value (GstTraceValues * self, GstClockTime nts,
+    GstClockTime nval, GstClockTime * dts, GstClockTime * dval)
+{
+  GstTraceValue *lv;
+  GstClockTimeDiff dt;
+  GstClockTime window = self->window;
+  GQueue *q = &self->values;
+  GList *node = q->tail;
+  gboolean ret = FALSE;
+
+
+  /* search from the tail of the queue for a good GstTraceValue */
+  while (node) {
+    lv = node->data;
+    dt = GST_CLOCK_DIFF (lv->ts, nts);
+    if (dt < window) {
+      break;
+    } else {
+      node = g_list_previous (node);
+    }
+  }
+
+  if (node) {
+    /* calculate the windowed value */
+    *dts = dt;
+    *dval = GST_CLOCK_DIFF (lv->val, nval);
+
+    /* drop all older measurements */
+    while (q->tail != node) {
+      free_trace_value (g_queue_pop_tail (q));
+    }
+    ret = TRUE;
+  } else {
+    *dts = nts;
+    *dval = nval;
+  }
+
+  /* don't push too many data items */
+  lv = q->head ? q->head->data : NULL;
+  if (!lv || (GST_CLOCK_DIFF (lv->ts, nts) > (window / WINDOW_SUBDIV))) {
+    /* push the new measurement */
+    lv = g_slice_new0 (GstTraceValue);
+    lv->ts = nts;
+    lv->val = nval;
+    g_queue_push_head (q, lv);
+  }
+  return ret;
+}
+
+
+static void
+free_thread_stats (gpointer data)
+{
+  free_trace_values (((GstThreadStats *) data)->tvs_thread);
+  g_slice_free (GstThreadStats, data);
+}
+
+static void
+do_stats (GstTracer * obj, guint64 ts)
+{
+  GstRUsageTracer *self = GST_RUSAGE_TRACER_CAST (obj);
+  GstThreadStats *stats;
+  gpointer thread_id = g_thread_self ();
+  guint avg_cpuload, cur_cpuload;
+  struct rusage ru;
+  GstClockTime tproc = G_GUINT64_CONSTANT (0);
+  GstClockTime tthread = G_GUINT64_CONSTANT (0);
+  GstClockTime dts, dtproc;
+
+#ifdef HAVE_CLOCK_GETTIME
+  {
+    struct timespec now;
+
+    if (!clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &now)) {
+      tproc = GST_TIMESPEC_TO_TIME (now);
+    } else {
+      GST_WARNING_OBJECT (obj,
+          "clock_gettime (CLOCK_PROCESS_CPUTIME_ID,...) failed: %s",
+          g_strerror (errno));
+      getrusage (RUSAGE_SELF, &ru);
+      tproc =
+          GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+    }
+
+    /* cpu time per thread */
+    if (!clock_gettime (CLOCK_THREAD_CPUTIME_ID, &now)) {
+      tthread = GST_TIMESPEC_TO_TIME (now);
+    } else {
+      GST_WARNING_OBJECT (obj,
+          "clock_gettime (CLOCK_THREAD_CPUTIME_ID,...) failed: %s",
+          g_strerror (errno));
+#ifdef RUSAGE_THREAD
+      getrusage (RUSAGE_THREAD, &ru);
+      tthread =
+          GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+#endif
+    }
+  }
+#else
+  getrusage (RUSAGE_SELF, &ru);
+  tproc = GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+#ifdef RUSAGE_THREAD
+  getrusage (RUSAGE_THREAD, &ru);
+  tthread =
+      GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+#endif
+#endif
+  /* get stats record for current thread */
+  if (!(stats = g_hash_table_lookup (self->threads, thread_id))) {
+    stats = g_slice_new0 (GstThreadStats);
+    stats->tvs_thread = make_trace_values (GST_SECOND);
+    g_hash_table_insert (self->threads, thread_id, stats);
+  }
+  stats->tthread = tthread;
+
+  /* Calibrate ts for the process and main thread. For tthread[main] and tproc
+   * the time is larger than ts, as our base-ts is taken after the process has
+   * started.
+   */
+  if (G_UNLIKELY (thread_id == self->main_thread_id)) {
+    self->main_thread_id = NULL;
+    /* when the registry gets updated, the tproc is less than the debug time ? */
+    /* TODO(ensonic): we still see cases where tproc overtakes ts, especially
+     * when with sync=false, can this be due to multiple cores in use? */
+    if (tproc > ts) {
+      self->tproc_base = tproc - ts;
+      GST_DEBUG ("rusage: calibrating by %" G_GUINT64_FORMAT ", thread: %"
+          G_GUINT64_FORMAT ", proc: %" G_GUINT64_FORMAT,
+          self->tproc_base, stats->tthread, tproc);
+      stats->tthread -= self->tproc_base;
+    }
+  }
+  /* we always need to correct proc time */
+  tproc -= self->tproc_base;
+
+  /* FIXME: how can we take cpu-frequency scaling into account?
+   * - looking at /sys/devices/system/cpu/cpu0/cpufreq/
+   *   scale_factor=scaling_max_freq/scaling_cur_freq
+   * - as a workaround we can switch it via /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
+   *   cpufreq-selector -g performance
+   *   cpufreq-selector -g ondemand
+   */
+  /* *INDENT-OFF* */
+  avg_cpuload = (guint) gst_util_uint64_scale (stats->tthread,
+      G_GINT64_CONSTANT (1000), ts);
+  update_trace_value (stats->tvs_thread, ts, stats->tthread, &dts, &dtproc);
+  cur_cpuload = (guint) gst_util_uint64_scale (dtproc,
+      G_GINT64_CONSTANT (1000), dts);
+  gst_tracer_log_trace (gst_structure_new ("thread-rusage", 
+      "ts", G_TYPE_UINT64, ts, 
+      "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (thread_id), 
+      "average-cpuload", G_TYPE_UINT, MIN (avg_cpuload, 1000),
+      "current-cpuload", G_TYPE_UINT, MIN (cur_cpuload, 1000),
+      "time", G_TYPE_UINT64, stats->tthread,
+      NULL));
+
+  avg_cpuload = (guint) gst_util_uint64_scale (tproc / num_cpus,
+      G_GINT64_CONSTANT (1000), ts);
+  G_LOCK (_proc);
+  update_trace_value (self->tvs_proc, ts, tproc, &dts, &dtproc);
+  G_UNLOCK (_proc);
+  cur_cpuload = (guint) gst_util_uint64_scale (dtproc / num_cpus,
+      G_GINT64_CONSTANT (1000), dts);
+  gst_tracer_log_trace (gst_structure_new ("proc-rusage", 
+      "ts", G_TYPE_UINT64, ts, 
+      "average-cpuload", G_TYPE_UINT, MIN (avg_cpuload, 1000),
+      "current-cpuload", G_TYPE_UINT, MIN (cur_cpuload, 1000),
+      "time", G_TYPE_UINT64, tproc,
+      NULL));
+  /* *INDENT-ON* */
+}
+
+/* tracer class */
+
+static void
+gst_rusage_tracer_finalize (GObject * obj)
+{
+  GstRUsageTracer *self = GST_RUSAGE_TRACER (obj);
+
+  g_hash_table_destroy (self->threads);
+  free_trace_values (self->tvs_proc);
+
+  G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_rusage_tracer_class_init (GstRUsageTracerClass * klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize = gst_rusage_tracer_finalize;
+
+  if ((num_cpus = sysconf (_SC_NPROCESSORS_ONLN)) == -1) {
+    GST_WARNING ("failed to get number of cpus online");
+    if ((num_cpus = sysconf (_SC_NPROCESSORS_CONF)) == -1) {
+      GST_WARNING ("failed to get number of cpus, assuming 1");
+      num_cpus = 1;
+    }
+  }
+  GST_DEBUG ("rusage: num_cpus=%ld", num_cpus);
+
+  /* announce trace formats */
+  /* *INDENT-OFF* */
+  gst_tracer_log_trace (gst_structure_new ("thread-rusage.class",
+      "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "thread",  /* TODO: use genum */
+          NULL),
+      "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT,
+          "description", G_TYPE_STRING, "average cpu usage per thread in ‰",
+          "flags", G_TYPE_STRING, "aggregated",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT, 0, 
+          "max", G_TYPE_UINT, 1000,
+          NULL),
+      "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT,
+          "description", G_TYPE_STRING, "current cpu usage per thread in ‰",
+          "flags", G_TYPE_STRING, "windowed",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT, 0, 
+          "max", G_TYPE_UINT, 1000,
+          NULL),
+      "time", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+          "description", G_TYPE_STRING, "time spent in thread in ns",
+          "flags", G_TYPE_STRING, "aggregated",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+          "max", G_TYPE_UINT64, G_MAXUINT64,
+          NULL),
+      NULL));
+  gst_tracer_log_trace (gst_structure_new ("proc-rusage.class",
+      "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "process",  /* TODO: use genum */
+          NULL),
+      "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT,
+          "description", G_TYPE_STRING, "average cpu usage per process in ‰",
+          "flags", G_TYPE_STRING, "aggregated",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT, 0, 
+          "max", G_TYPE_UINT, 1000,
+          NULL),
+      "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT,
+          "description", G_TYPE_STRING, "current cpu usage per process in ‰",
+          "flags", G_TYPE_STRING, "windowed",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT, 0, 
+          "max", G_TYPE_UINT, 1000,
+          NULL),
+      "time", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+          "description", G_TYPE_STRING, "time spent in process in ns",
+          "flags", G_TYPE_STRING, "aggregated",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+          "max", G_TYPE_UINT64, G_MAXUINT64,
+          NULL),
+      NULL));
+  /* *INDENT-ON* */
+}
+
+static void
+gst_rusage_tracer_init (GstRUsageTracer * self)
+{
+  GstTracer *tracer = GST_TRACER (self);
+
+  gst_tracing_register_hook_id (tracer, 0, G_CALLBACK (do_stats));
+
+  self->threads = g_hash_table_new_full (NULL, NULL, NULL, free_thread_stats);
+  self->tvs_proc = make_trace_values (GST_SECOND);
+  self->main_thread_id = g_thread_self ();
+
+  GST_DEBUG ("rusage: main thread=%p", self->main_thread_id);
+}
diff --git a/plugins/tracers/gstrusage.h b/plugins/tracers/gstrusage.h
new file mode 100644
index 0000000..b5abbca
--- /dev/null
+++ b/plugins/tracers/gstrusage.h
@@ -0,0 +1,84 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstrusage.h: tracing module that logs resource usage stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_RUSAGE_TRACER_H__
+#define __GST_RUSAGE_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RUSAGE_TRACER \
+  (gst_rusage_tracer_get_type())
+#define GST_RUSAGE_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RUSAGE_TRACER,GstRUsageTracer))
+#define GST_RUSAGE_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RUSAGE_TRACER,GstRUsageTracerClass))
+#define GST_IS_RUSAGE_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RUSAGE_TRACER))
+#define GST_IS_RUSAGE_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RUSAGE_TRACER))
+#define GST_RUSAGE_TRACER_CAST(obj) ((GstRUsageTracer *)(obj))
+
+typedef struct _GstRUsageTracer GstRUsageTracer;
+typedef struct _GstRUsageTracerClass GstRUsageTracerClass;
+
+typedef struct
+{
+  GstClockTime ts;
+  GstClockTime val;
+} GstTraceValue;
+
+typedef struct
+{
+  GstClockTime window;
+  GQueue values;                /* GstTraceValue* */
+} GstTraceValues;
+
+/**
+ * GstRUsageTracer:
+ *
+ * Opaque #GstRUsageTracer data structure
+ */
+struct _GstRUsageTracer {
+  GstTracer 	 parent;
+
+  /*< private >*/        
+  GHashTable *threads;
+  GstTraceValues *tvs_proc;
+
+  /* for ts calibration */
+  gpointer main_thread_id;
+  guint64 tproc_base;
+};
+
+struct _GstRUsageTracerClass {
+  GstTracerClass parent_class;
+
+  /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_rusage_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_RUSAGE_TRACER_H__ */
diff --git a/plugins/tracers/gststats.c b/plugins/tracers/gststats.c
new file mode 100644
index 0000000..8296a8d
--- /dev/null
+++ b/plugins/tracers/gststats.c
@@ -0,0 +1,702 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gststats.c: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gststats
+ * @short_description: log event stats
+ *
+ * A tracing module that builds usage statistic for elements and pads. 
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "gststats.h"
+
+#include <stdio.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_stats_debug);
+#define GST_CAT_DEFAULT gst_stats_debug
+
+static GQuark data_quark;
+G_LOCK_DEFINE (_elem_stats);
+G_LOCK_DEFINE (_pad_stats);
+
+#define _do_init \
+    GST_DEBUG_CATEGORY_INIT (gst_stats_debug, "stats", 0, "stats tracer"); \
+    data_quark = g_quark_from_static_string ("gststats:data");
+#define gst_stats_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstStatsTracer, gst_stats_tracer, GST_TYPE_TRACER,
+    _do_init);
+
+typedef struct
+{
+  /* we can't rely on the address to be unique over time */
+  guint index;
+  /* for pre + post */
+  GstClockTime last_ts;
+  /* hierarchy */
+  guint parent_ix;
+} GstPadStats;
+
+typedef struct
+{
+  /* we can't rely on the address to be unique over time */
+  guint index;
+  /* for pre + post */
+  GstClockTime last_ts;
+  /* time spend in this element */
+  GstClockTime treal;
+  /* hierarchy */
+  guint parent_ix;
+} GstElementStats;
+
+/* data helper */
+
+static GstElementStats no_elem_stats = { 0, };
+
+static GstElementStats *
+fill_element_stats (GstStatsTracer * self, GstElement * element)
+{
+  GstElementStats *stats = g_slice_new0 (GstElementStats);
+
+  stats->index = self->num_elements++;
+  stats->parent_ix = G_MAXUINT;
+  return stats;
+}
+
+static void
+log_new_element_stats (GstElementStats * stats, GstElement * element,
+    GstClockTime elapsed)
+{
+  gst_tracer_log_trace (gst_structure_new ("new-element",
+          "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+          "ts", G_TYPE_UINT64, elapsed,
+          "ix", G_TYPE_UINT, stats->index,
+          "parent-ix", G_TYPE_UINT, stats->parent_ix,
+          "name", G_TYPE_STRING, GST_OBJECT_NAME (element),
+          "type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (element),
+          "is-bin", G_TYPE_BOOLEAN, GST_IS_BIN (element), NULL));
+}
+
+static void
+free_element_stats (gpointer data)
+{
+  g_slice_free (GstElementStats, data);
+}
+
+static GstElementStats *
+create_element_stats (GstStatsTracer * self, GstElement * element)
+{
+  GstElementStats *stats;
+
+  stats = fill_element_stats (self, element);
+  g_object_set_qdata_full ((GObject *) element, data_quark, stats,
+      free_element_stats);
+
+  return stats;
+}
+
+static inline GstElementStats *
+get_element_stats (GstStatsTracer * self, GstElement * element)
+{
+  GstElementStats *stats;
+  gboolean is_new = FALSE;
+
+  if (!element) {
+    no_elem_stats.index = G_MAXUINT;
+    return &no_elem_stats;
+  }
+
+  G_LOCK (_elem_stats);
+  if (!(stats = g_object_get_qdata ((GObject *) element, data_quark))) {
+    stats = create_element_stats (self, element);
+    is_new = TRUE;
+  }
+  G_UNLOCK (_elem_stats);
+  if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
+    GstElement *parent = GST_ELEMENT_PARENT (element);
+    if (parent) {
+      GstElementStats *parent_stats = get_element_stats (self, parent);
+      stats->parent_ix = parent_stats->index;
+    }
+  }
+  if (G_UNLIKELY (is_new)) {
+    log_new_element_stats (stats, element, GST_CLOCK_TIME_NONE);
+  }
+  return stats;
+}
+
+/*
+ * Get the element/bin owning the pad. 
+ *
+ * in: a normal pad
+ * out: the element
+ *
+ * in: a proxy pad
+ * out: the element that contains the peer of the proxy
+ *
+ * in: a ghost pad
+ * out: the bin owning the ghostpad
+ */
+/* TODO(ensonic): gst_pad_get_parent_element() would not work here, should we
+ * add this as new api, e.g. gst_pad_find_parent_element();
+ */
+static GstElement *
+get_real_pad_parent (GstPad * pad)
+{
+  GstObject *parent;
+
+  if (!pad)
+    return NULL;
+
+  parent = GST_OBJECT_PARENT (pad);
+
+  /* if parent of pad is a ghost-pad, then pad is a proxy_pad */
+  if (parent && GST_IS_GHOST_PAD (parent)) {
+    pad = GST_PAD_CAST (parent);
+    parent = GST_OBJECT_PARENT (pad);
+  }
+  return GST_ELEMENT_CAST (parent);
+}
+
+static GstPadStats no_pad_stats = { 0, };
+
+static GstPadStats *
+fill_pad_stats (GstStatsTracer * self, GstPad * pad)
+{
+  GstPadStats *stats = g_slice_new0 (GstPadStats);
+
+  stats->index = self->num_pads++;
+  stats->parent_ix = G_MAXUINT;
+
+  return stats;
+}
+
+static void
+log_new_pad_stats (GstPadStats * stats, GstPad * pad)
+{
+  gst_tracer_log_trace (gst_structure_new ("new-pad",
+          "ix", G_TYPE_UINT, stats->index,
+          "parent-ix", G_TYPE_UINT, stats->parent_ix,
+          "name", G_TYPE_STRING, GST_OBJECT_NAME (pad),
+          "type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (pad),
+          "is-ghostpad", G_TYPE_BOOLEAN, GST_IS_GHOST_PAD (pad),
+          "pad-direction", GST_TYPE_PAD_DIRECTION, GST_PAD_DIRECTION (pad),
+          "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), NULL));
+}
+
+static void
+free_pad_stats (gpointer data)
+{
+  g_slice_free (GstPadStats, data);
+}
+
+static GstPadStats *
+get_pad_stats (GstStatsTracer * self, GstPad * pad)
+{
+  GstPadStats *stats;
+  gboolean is_new = FALSE;
+
+  if (!pad) {
+    no_pad_stats.index = G_MAXUINT;
+    return &no_pad_stats;
+  }
+
+  G_LOCK (_pad_stats);
+  if (!(stats = g_object_get_qdata ((GObject *) pad, data_quark))) {
+    stats = fill_pad_stats (self, pad);
+    g_object_set_qdata_full ((GObject *) pad, data_quark, stats,
+        free_pad_stats);
+    is_new = TRUE;
+  }
+  G_UNLOCK (_pad_stats);
+  if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
+    GstElement *elem = get_real_pad_parent (pad);
+    if (elem) {
+      GstElementStats *elem_stats = get_element_stats (self, elem);
+
+      stats->parent_ix = elem_stats->index;
+    }
+  }
+  if (G_UNLIKELY (is_new)) {
+    log_new_pad_stats (stats, pad);
+  }
+  return stats;
+}
+
+static void
+do_buffer_stats (GstStatsTracer * self, GstPad * this_pad,
+    GstPadStats * this_pad_stats, GstPad * that_pad,
+    GstPadStats * that_pad_stats, GstBuffer * buf, GstClockTime elapsed)
+{
+  GstElement *this_elem = get_real_pad_parent (this_pad);
+  GstElementStats *this_elem_stats = get_element_stats (self, this_elem);
+  GstElement *that_elem = get_real_pad_parent (that_pad);
+  GstElementStats *that_elem_stats = get_element_stats (self, that_elem);
+
+  /* TODO(ensonic): need a quark-table (shared with the tracer-front-ends?) */
+  gst_tracer_log_trace (gst_structure_new ("buffer",
+          "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+          "ts", G_TYPE_UINT64, elapsed,
+          "pad-ix", G_TYPE_UINT, this_pad_stats->index,
+          "elem-ix", G_TYPE_UINT, this_elem_stats->index,
+          "peer-pad-ix", G_TYPE_UINT, that_pad_stats->index,
+          "peer-elem-ix", G_TYPE_UINT, that_elem_stats->index,
+          "buffer-size", G_TYPE_UINT, gst_buffer_get_size (buf),
+          "buffer-pts", G_TYPE_UINT64, GST_BUFFER_PTS (buf),
+          "buffer-dts", G_TYPE_UINT64, GST_BUFFER_DTS (buf),
+          "buffer-duration", G_TYPE_UINT64, GST_BUFFER_DURATION (buf),
+          "buffer-flags", GST_TYPE_BUFFER_FLAGS, GST_BUFFER_FLAGS (buf),
+          /*
+             scheduling-jitter: for this we need the last_ts on the pad
+           */
+          NULL));
+}
+
+static void
+do_query_stats (GstStatsTracer * self, GstPad * this_pad,
+    GstPadStats * this_pad_stats, GstPad * that_pad,
+    GstPadStats * that_pad_stats, GstQuery * qry, GstClockTime elapsed,
+    gboolean res, gboolean pre)
+{
+  GstElement *this_elem = get_real_pad_parent (this_pad);
+  GstElementStats *this_elem_stats = get_element_stats (self, this_elem);
+  GstElement *that_elem = get_real_pad_parent (that_pad);
+  GstElementStats *that_elem_stats = get_element_stats (self, that_elem);
+  GstStructure *s;
+
+  s = gst_structure_new ("query",
+      "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+      "ts", G_TYPE_UINT64, elapsed,
+      "pad-ix", G_TYPE_UINT, this_pad_stats->index,
+      "elem-ix", G_TYPE_UINT, this_elem_stats->index,
+      "peer-pad-ix", G_TYPE_UINT, that_pad_stats->index,
+      "peer-elem-ix", G_TYPE_UINT, that_elem_stats->index,
+      "name", G_TYPE_STRING, GST_QUERY_TYPE_NAME (qry),
+      "structure", GST_TYPE_STRUCTURE, gst_query_get_structure (qry), NULL);
+  if (!pre) {
+    gst_structure_set (s, "res", G_TYPE_BOOLEAN, res, NULL);
+  }
+  gst_tracer_log_trace (s);
+}
+
+static void
+do_element_stats (GstStatsTracer * self, GstPad * pad, GstClockTime elapsed1,
+    GstClockTime elapsed2)
+{
+  GstClockTimeDiff elapsed = GST_CLOCK_DIFF (elapsed1, elapsed2);
+  GstObject *parent = GST_OBJECT_PARENT (pad);
+  GstElement *this =
+      GST_ELEMENT_CAST (GST_IS_PAD (parent) ? GST_OBJECT_PARENT (parent) :
+      parent);
+  GstElementStats *this_stats = get_element_stats (self, this);
+  GstPad *peer_pad = GST_PAD_PEER (pad);
+  GstElementStats *peer_stats;
+
+  if (!peer_pad)
+    return;
+
+  /* walk the ghost pad chain downstream to get the real pad */
+  /* if parent of peer_pad is a ghost-pad, then peer_pad is a proxy_pad */
+  parent = GST_OBJECT_PARENT (peer_pad);
+  if (parent && GST_IS_GHOST_PAD (parent)) {
+    peer_pad = GST_PAD_CAST (parent);
+    /* if this is now the ghost pad, get the peer of this */
+    get_pad_stats (self, peer_pad);
+    if ((parent = GST_OBJECT_PARENT (peer_pad))) {
+      get_element_stats (self, GST_ELEMENT_CAST (parent));
+    }
+    peer_pad = GST_PAD_PEER (GST_GHOST_PAD_CAST (peer_pad));
+    parent = peer_pad ? GST_OBJECT_PARENT (peer_pad) : NULL;
+  }
+  /* walk the ghost pad chain upstream to get the real pad */
+  /* if peer_pad is a ghost-pad, then parent is a bin and it is the parent of
+   * a proxy_pad */
+  while (peer_pad && GST_IS_GHOST_PAD (peer_pad)) {
+    get_pad_stats (self, peer_pad);
+    get_element_stats (self, GST_ELEMENT_CAST (parent));
+    peer_pad = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (peer_pad));
+    parent = peer_pad ? GST_OBJECT_PARENT (peer_pad) : NULL;
+  }
+
+  if (!parent) {
+    printf ("%" GST_TIME_FORMAT
+        " transmission on unparented target pad %s_%s -> %s_%s\n",
+        GST_TIME_ARGS (elapsed), GST_DEBUG_PAD_NAME (pad),
+        GST_DEBUG_PAD_NAME (peer_pad));
+    return;
+  }
+  peer_stats = get_element_stats (self, GST_ELEMENT_CAST (parent));
+
+  /* we'd like to gather time spend in each element, but this does not make too
+   * much sense yet
+   * pure push/pull-based:
+   *   - the time spend in the push/pull_range is accounted for the peer and
+   *     removed from the current element
+   *   - this works for chains
+   *   - drawback is sink elements that block to sync have a high time usage
+   *     - we could rerun the ests with sync=false
+   * both:
+   *   - a.g. demuxers both push and pull. thus we subtract time for the pull
+   *     and the push operations, but never add anything.
+   *   - can we start a counter after push/pull in such elements and add then
+   *     time to the element upon next pad activity?
+   */
+#if 1
+  /* this does not make sense for demuxers */
+  this_stats->treal -= elapsed;
+  peer_stats->treal += elapsed;
+#else
+  /* this creates several >100% figures */
+  this_stats->treal += GST_CLOCK_DIFF (this_stats->last_ts, elapsed2) - elapsed;
+  peer_stats->treal += elapsed;
+  this_stats->last_ts = elapsed2;
+  peer_stats->last_ts = elapsed2;
+#endif
+}
+
+/* hooks */
+
+static void
+do_push_buffer_pre (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+    GstBuffer * buffer)
+{
+  GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+  GstPad *that_pad = GST_PAD_PEER (this_pad);
+  GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+  do_buffer_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+      buffer, ts);
+}
+
+static void
+do_push_buffer_post (GstStatsTracer * self, guint64 ts, GstPad * pad)
+{
+  GstPadStats *stats = get_pad_stats (self, pad);
+
+  do_element_stats (self, pad, stats->last_ts, ts);
+}
+
+typedef struct
+{
+  GstStatsTracer *self;
+  GstPad *this_pad;
+  GstPadStats *this_pad_stats;
+  GstPad *that_pad;
+  GstPadStats *that_pad_stats;
+  guint64 ts;
+} DoPushBufferListArgs;
+
+static gboolean
+do_push_buffer_list_item (GstBuffer ** buffer, guint idx, gpointer user_data)
+{
+  DoPushBufferListArgs *args = (DoPushBufferListArgs *) user_data;
+
+  do_buffer_stats (args->self, args->this_pad, args->this_pad_stats,
+      args->that_pad, args->that_pad_stats, *buffer, args->ts);
+  return TRUE;
+}
+
+static void
+do_push_buffer_list_pre (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+    GstBufferList * list)
+{
+  GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+  GstPad *that_pad = GST_PAD_PEER (this_pad);
+  GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+  DoPushBufferListArgs args = { self, this_pad, this_pad_stats, that_pad,
+    that_pad_stats, ts
+  };
+
+  gst_buffer_list_foreach (list, do_push_buffer_list_item, &args);
+}
+
+static void
+do_push_buffer_list_post (GstStatsTracer * self, guint64 ts, GstPad * pad)
+{
+  GstPadStats *stats = get_pad_stats (self, pad);
+
+  do_element_stats (self, pad, stats->last_ts, ts);
+}
+
+static void
+do_pull_range_pre (GstStatsTracer * self, guint64 ts, GstPad * pad)
+{
+  GstPadStats *stats = get_pad_stats (self, pad);
+  stats->last_ts = ts;
+}
+
+static void
+do_pull_range_post (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+    GstBuffer * buffer)
+{
+  GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+  guint64 last_ts = this_pad_stats->last_ts;
+  GstPad *that_pad = GST_PAD_PEER (this_pad);
+  GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+  if (buffer != NULL) {
+    do_buffer_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+        buffer, ts);
+  }
+  do_element_stats (self, this_pad, last_ts, ts);
+}
+
+static void
+do_push_event_pre (GstStatsTracer * self, guint64 ts, GstPad * pad,
+    GstEvent * ev)
+{
+  GstElement *elem = get_real_pad_parent (pad);
+  GstElementStats *elem_stats = get_element_stats (self, elem);
+  GstPadStats *pad_stats = get_pad_stats (self, pad);
+
+  elem_stats->last_ts = ts;
+  gst_tracer_log_trace (gst_structure_new ("event",
+          "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+          "ts", G_TYPE_UINT64, ts,
+          "pad-ix", G_TYPE_UINT, pad_stats->index,
+          "elem-ix", G_TYPE_UINT, elem_stats->index,
+          "name", G_TYPE_STRING, GST_EVENT_TYPE_NAME (ev), NULL));
+}
+
+static void
+do_post_message_pre (GstStatsTracer * self, guint64 ts, GstElement * elem,
+    GstMessage * msg)
+{
+  GstElementStats *stats = get_element_stats (self, elem);
+  const GstStructure *msg_s;
+  GstStructure *structure = gst_structure_new ("message",
+      "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+      "ts", G_TYPE_UINT64, ts,
+      "elem-ix", G_TYPE_UINT, stats->index,
+      "name", G_TYPE_STRING, GST_MESSAGE_TYPE_NAME (msg),
+      NULL);
+
+  stats->last_ts = ts;
+
+  if ((msg_s = gst_message_get_structure (msg))) {
+    gst_structure_set (structure, "structure", GST_TYPE_STRUCTURE, msg_s, NULL);
+  }
+
+  gst_tracer_log_trace (structure);
+}
+
+static void
+do_element_new (GstStatsTracer * self, guint64 ts, GstElement * elem)
+{
+  GstElementStats *stats;
+
+  stats = create_element_stats (self, elem);
+  log_new_element_stats (stats, elem, ts);
+}
+
+static void
+do_element_query_pre (GstStatsTracer * self, guint64 ts, GstElement * elem,
+    GstQuery * qry)
+{
+  GstElementStats *stats = get_element_stats (self, elem);
+
+  stats->last_ts = ts;
+  gst_tracer_log_trace (gst_structure_new ("element-query",
+          "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+          "ts", G_TYPE_UINT64, ts,
+          "elem-ix", G_TYPE_UINT, stats->index,
+          "name", G_TYPE_STRING, GST_QUERY_TYPE_NAME (qry), NULL));
+}
+
+static void
+do_query_pre (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+    GstQuery * qry)
+{
+  GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+  GstPad *that_pad = GST_PAD_PEER (this_pad);
+  GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+  do_query_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+      qry, ts, FALSE, TRUE);
+}
+
+static void
+do_query_post (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+    gboolean res, GstQuery * qry)
+{
+  GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+  GstPad *that_pad = GST_PAD_PEER (this_pad);
+  GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+  do_query_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+      qry, ts, res, FALSE);
+}
+
+/* tracer class */
+
+static void
+gst_stats_tracer_class_init (GstStatsTracerClass * klass)
+{
+  /* announce trace formats */
+  /* *INDENT-OFF* */
+  gst_tracer_log_trace (gst_structure_new ("buffer.class",
+      "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+          NULL),
+      "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "pad",  /* TODO: use genum */
+          NULL),
+      "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "element",  /* TODO: use genum */
+          NULL),
+      "peer-pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "pad",  /* TODO: use genum */
+          NULL),
+      "peer-element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "element",  /* TODO: use genum */
+          NULL),
+      "buffer-size", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT,
+          "description", G_TYPE_STRING, "size of buffer in bytes",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT, 0, 
+          "max", G_TYPE_UINT, G_MAXUINT,
+          NULL),
+      "buffer-ts", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+          "description", G_TYPE_STRING, "timestamp of the buffer in ns",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+          "max", G_TYPE_UINT64, G_MAXUINT64,
+          NULL),
+      "buffer-duration", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+          "description", G_TYPE_STRING, "duration of the buffer in ns",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+          "max", G_TYPE_UINT64, G_MAXUINT64,
+          NULL),
+      /* TODO(ensonic): "buffer-flags" */
+      NULL));
+  gst_tracer_log_trace (gst_structure_new ("event.class",
+      "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+          NULL),
+      "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "pad",  /* TODO: use genum */
+          NULL),
+      "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "element",  /* TODO: use genum */
+          NULL),
+      "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_STRING,
+          "description", G_TYPE_STRING, "name of the event",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          NULL),
+      NULL));
+  gst_tracer_log_trace (gst_structure_new ("message.class",
+      "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+          NULL),
+      "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "element",  /* TODO: use genum */
+          NULL),
+      "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_STRING,
+          "description", G_TYPE_STRING, "name of the message",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          NULL),
+      "structure", GST_TYPE_STRUCTURE, gst_structure_new ("structure",
+          "type", G_TYPE_GTYPE, GST_TYPE_STRUCTURE,
+          "description", G_TYPE_STRING, "message structure",
+          NULL),
+      NULL));
+  gst_tracer_log_trace (gst_structure_new ("elementquery.class",
+      "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+          NULL),
+      "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "element",  /* TODO: use genum */
+          NULL),
+      "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_STRING,
+          "description", G_TYPE_STRING, "name of the query",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          NULL),
+      NULL));
+  gst_tracer_log_trace (gst_structure_new ("query.class",
+      "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+          NULL),
+      "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "pad",  /* TODO: use genum */
+          NULL),
+      "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "element",  /* TODO: use genum */
+          NULL),
+      "peer-pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "pad",  /* TODO: use genum */
+          NULL),
+      "peer-element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+          "related-to", G_TYPE_STRING, "element",  /* TODO: use genum */
+          NULL),
+      "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, G_TYPE_STRING,
+          "description", G_TYPE_STRING, "name of the query",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          NULL),
+      "structure", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+          "type", G_TYPE_GTYPE, GST_TYPE_STRUCTURE,
+          "description", G_TYPE_STRING, "query structure",
+          "flags", G_TYPE_STRING, "",  /* TODO: use gflags */ 
+          NULL),
+      /* TODO(ensonic): "buffer-flags" */
+      NULL));
+  /* *INDENT-ON* */
+}
+
+static void
+gst_stats_tracer_init (GstStatsTracer * self)
+{
+  GstTracer *tracer = GST_TRACER (self);
+
+  gst_tracing_register_hook (tracer, "pad-push-pre",
+      G_CALLBACK (do_push_buffer_pre));
+  gst_tracing_register_hook (tracer, "pad-push-post",
+      G_CALLBACK (do_push_buffer_post));
+  gst_tracing_register_hook (tracer, "pad-push-list-pre",
+      G_CALLBACK (do_push_buffer_list_pre));
+  gst_tracing_register_hook (tracer, "pad-push-list-post",
+      G_CALLBACK (do_push_buffer_list_post));
+  gst_tracing_register_hook (tracer, "pad-pull-range-pre",
+      G_CALLBACK (do_pull_range_pre));
+  gst_tracing_register_hook (tracer, "pad-pull-range-post",
+      G_CALLBACK (do_pull_range_post));
+  gst_tracing_register_hook (tracer, "pad-push-event-pre",
+      G_CALLBACK (do_push_event_pre));
+  gst_tracing_register_hook (tracer, "element-new",
+      G_CALLBACK (do_element_new));
+  gst_tracing_register_hook (tracer, "element-post-message-pre",
+      G_CALLBACK (do_post_message_pre));
+  gst_tracing_register_hook (tracer, "element-query-pre",
+      G_CALLBACK (do_element_query_pre));
+  gst_tracing_register_hook (tracer, "pad-query-pre",
+      G_CALLBACK (do_query_pre));
+  gst_tracing_register_hook (tracer, "pad-query-post",
+      G_CALLBACK (do_query_post));
+}
diff --git a/plugins/tracers/gststats.h b/plugins/tracers/gststats.h
new file mode 100644
index 0000000..a846b1b
--- /dev/null
+++ b/plugins/tracers/gststats.h
@@ -0,0 +1,67 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gststats.h: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_STATS_TRACER_H__
+#define __GST_STATS_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_STATS_TRACER \
+  (gst_stats_tracer_get_type())
+#define GST_STATS_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STATS_TRACER,GstStatsTracer))
+#define GST_STATS_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STATS_TRACER,GstStatsTracerClass))
+#define GST_IS_STATS_TRACER(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STATS_TRACER))
+#define GST_IS_STATS_TRACER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STATS_TRACER))
+#define GST_STATS_TRACER_CAST(obj) ((GstStatsTracer *)(obj))
+
+typedef struct _GstStatsTracer GstStatsTracer;
+typedef struct _GstStatsTracerClass GstStatsTracerClass;
+
+/**
+ * GstStatsTracer:
+ *
+ * Opaque #GstStatsTracer data structure
+ */
+struct _GstStatsTracer {
+  GstTracer 	 parent;
+
+  /*< private >*/
+  guint num_elements, num_pads;
+};
+
+struct _GstStatsTracerClass {
+  GstTracerClass parent_class;
+
+  /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_stats_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_STATS_TRACER_H__ */
diff --git a/plugins/tracers/gsttracers.c b/plugins/tracers/gsttracers.c
new file mode 100644
index 0000000..010c185
--- /dev/null
+++ b/plugins/tracers/gsttracers.c
@@ -0,0 +1,52 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracers.c: tracing modules
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include "gstlatency.h"
+#include "gstlog.h"
+#include "gstrusage.h"
+#include "gststats.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+  if (!gst_tracer_register (plugin, "latency", gst_latency_tracer_get_type ()))
+    return FALSE;
+#ifndef GST_DISABLE_GST_DEBUG
+  if (!gst_tracer_register (plugin, "log", gst_log_tracer_get_type ()))
+    return FALSE;
+#endif
+#ifdef HAVE_GETRUSAGE
+  if (!gst_tracer_register (plugin, "rusage", gst_rusage_tracer_get_type ()))
+    return FALSE;
+#endif
+  if (!gst_tracer_register (plugin, "stats", gst_stats_tracer_get_type ()))
+    return FALSE;
+  return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, coretracers,
+    "GStreamer core tracers", plugin_init, VERSION, GST_LICENSE,
+    GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/po/af.gmo b/po/af.gmo
index 59a7360..77f3976 100644
--- a/po/af.gmo
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
index 1050b15..9c1ebe4 100644
--- a/po/af.po
+++ b/po/af.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.9.7\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2005-12-05 11:45+0200\n"
 "Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
 "Language-Team: Afrikaans <i18n@af.org.za>\n"
@@ -827,6 +827,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/az.gmo b/po/az.gmo
index d46e592..98ebcb4 100644
--- a/po/az.gmo
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
index 2ea3af5..74e9b06 100644
--- a/po/az.po
+++ b/po/az.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer-0.8.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2004-03-19 18:40+0200\n"
 "Last-Translator: Metin Amiroff <metin@karegen.com>\n"
 "Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
@@ -780,6 +780,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/be.gmo b/po/be.gmo
index e5e03a7..db2ff2c 100644
--- a/po/be.gmo
+++ b/po/be.gmo
Binary files differ
diff --git a/po/be.po b/po/be.po
index 7c08286..448f5bf 100644
--- a/po/be.po
+++ b/po/be.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.9.7\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2006-01-18 22:26+0200\n"
 "Last-Translator: Ales Nyakhaychyk <nab@mail.by>\n"
 "Language-Team: Belarusian <i18n@mova.org>\n"
@@ -786,6 +786,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ""
 
diff --git a/po/bg.gmo b/po/bg.gmo
index e14018f..199dd93 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index 75b2654..5d24952 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.32.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2011-04-26 22:40+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
@@ -819,6 +819,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/ca.gmo b/po/ca.gmo
index 2ff23fe..8aca101 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index 2e9b8ed..de16212 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.30.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2010-11-04 19:41+0100\n"
 "Last-Translator: Jordi Mallach <jordi@sindominio.net>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -828,6 +828,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/cs.gmo b/po/cs.gmo
index ce912c8..fe0dd58 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index b72b031..daeef2a 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-15 21:04+0200\n"
 "Last-Translator: Marek Černocký <marek@manet.cz>\n"
 "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
@@ -817,6 +817,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Číslo noty MIDI pro zvukovou stopu."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr "; "
 
diff --git a/po/da.gmo b/po/da.gmo
index 61a13a4..1215fc3 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index a96cc46..b18e6b3 100644
--- a/po/da.po
+++ b/po/da.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.3.90\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2014-07-16 13:26+0200\n"
 "Last-Translator: Mogens Jaeger <mogensjaeger@gmail.com>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -816,6 +816,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Midi-nodenummer på lydsporet."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/de.gmo b/po/de.gmo
index dccae71..f7af715 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index b2ba43e..7ea44d4 100644
--- a/po/de.po
+++ b/po/de.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-21 00:13+0200\n"
 "Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -844,6 +844,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Midi-Notenzahl der Tonspur."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/el.gmo b/po/el.gmo
index 6c321b9..f2ff7b5 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index 6e3ed39..9f357af 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer-0.10.30.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2010-11-29 11:14+0200\n"
 "Last-Translator: Michael Kotsarinis <mk73628@gmail.com>\n"
 "Language-Team: Greek <team@lists.gnome.gr>\n"
@@ -840,6 +840,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index 7fb7f77..487db6f 100644
--- a/po/en_GB.gmo
+++ b/po/en_GB.gmo
Binary files differ
diff --git a/po/en_GB.po b/po/en_GB.po
index 4ca1e33..aee667b 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.8.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2004-04-26 10:36-0400\n"
 "Last-Translator: Gareth Owen <gowen72@yahoo.com>\n"
 "Language-Team: English (British) <en_gb@li.org>\n"
@@ -831,6 +831,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/eo.gmo b/po/eo.gmo
index 4f3cf83..a84f589 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index 8f592f9..0c6a4c6 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.32.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2011-06-04 21:11+0100\n"
 "Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
 "Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
@@ -770,6 +770,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/es.gmo b/po/es.gmo
index 10609cb..48e54a8 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index e9d1861..17de2b1 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.32.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2011-10-02 15:45+0200\n"
 "Last-Translator: Jorge González González <aloriel@gmail.com>\n"
 "Language-Team: Spanish <es@li.org>\n"
@@ -831,6 +831,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/eu.gmo b/po/eu.gmo
index 15900a7..eed82b8 100644
--- a/po/eu.gmo
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
index 9b1cb88..1056f3a 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer-0.10.26.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2010-03-25 13:10+0100\n"
 "Last-Translator: Mikel Olasagasti Uranga <hey_neken@mundurat.net>\n"
 "Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
@@ -829,6 +829,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/fi.gmo b/po/fi.gmo
index 8e42759..0e85820 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index 85b4973..bc94f34 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -12,7 +12,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.30.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2010-11-17 23:10+0200\n"
 "Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n"
 "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
@@ -826,6 +826,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/fr.gmo b/po/fr.gmo
index 77cece8..ab1dabb 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index b360ade..1c784b6 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -8,10 +8,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gstreamer 1.4.1\n"
+"Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
-"PO-Revision-Date: 2015-04-26 19:49+0200\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
+"PO-Revision-Date: 2015-12-23 01:29+0100\n"
 "Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
 "Language-Team: French <traduc@traduc.org>\n"
 "Language: fr\n"
@@ -43,8 +43,8 @@
 "the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
 msgstr ""
 "Liste séparée par des virgules de paires nom_catégorie:niveau définissant "
-"des niveaux spécifiques pour chaque catégorie.\n"
-"Exemple : GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+"des niveaux spécifiques pour chaque catégorie. Exemple : GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
 
 msgid "LIST"
 msgstr "LISTE"
@@ -56,6 +56,8 @@
 "Changes coloring mode of the debug log. Possible modes: off, on, disable, "
 "auto, unix"
 msgstr ""
+"Modification du mode de coloration du journal de debug. Modes disponibles : "
+"off, on, disable, auto, unix"
 
 msgid "Disable debugging"
 msgstr "Désactive le débogage"
@@ -208,9 +210,8 @@
 msgid "No space left on the resource."
 msgstr "Espace libre insuffisant dans la ressource."
 
-#, fuzzy
 msgid "Not authorized to access resource."
-msgstr "Espace libre insuffisant dans la ressource."
+msgstr "Accès à la ressource interdit."
 
 msgid "GStreamer encountered a general stream error."
 msgstr "GStreamer a rencontré une erreur générale de flux."
@@ -265,7 +266,7 @@
 
 #, c-format
 msgid "Error writing registry cache to %s: %s"
-msgstr ""
+msgstr "Erreur d’écriture du cache de registre à %s : %s"
 
 msgid "title"
 msgstr "titre"
@@ -805,21 +806,29 @@
 "Indique la manière de pivoter ou de retourner l'image avant de l'afficher"
 
 msgid "publisher"
-msgstr ""
+msgstr "éditeur"
 
 msgid "Name of the label or publisher"
-msgstr ""
+msgstr "Nom de l’étiquette ou de l’éditeur"
 
 msgid "interpreted-by"
-msgstr ""
+msgstr "interprété-par"
 
 msgid "Information about the people behind a remix and similar interpretations"
 msgstr ""
+"Information sur les personnes qui ont fait un remix et interprétations "
+"similaires"
 
 msgid "midi-base-note"
-msgstr ""
+msgstr "midi-base-note"
 
 msgid "Midi note number of the audio track."
+msgstr "Numèro de note Midi d’une piste audio."
+
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
 msgstr ""
 
 msgid ", "
@@ -827,11 +836,11 @@
 
 #, c-format
 msgid "No URI handler for the %s protocol found"
-msgstr ""
+msgstr "Aucun gestionnaire d’URI trouvé pour le protocole %s"
 
 #, c-format
 msgid "URI scheme '%s' not supported"
-msgstr ""
+msgstr "schèma URI « %s » non pris en charge"
 
 #, c-format
 msgid "ERROR: from element %s: %s\n"
@@ -847,11 +856,11 @@
 
 #, c-format
 msgid "link has no source [sink=%s@%p]"
-msgstr ""
+msgstr "lien sans source [sink=%s@%p]"
 
 #, c-format
 msgid "link has no sink [source=%s@%p]"
-msgstr ""
+msgstr "lien sans sink [source=%s@%p]"
 
 #, c-format
 msgid "no property \"%s\" in element \"%s\""
@@ -871,11 +880,11 @@
 
 #, c-format
 msgid "unexpected reference \"%s\" - ignoring"
-msgstr ""
+msgstr "référence « %s » inattendue - ignoré"
 
 #, c-format
 msgid "unexpected pad-reference \"%s\" - ignoring"
-msgstr ""
+msgstr "pad-référence « %s » inattendue - ignoré"
 
 #, c-format
 msgid "could not parse caps \"%s\""
@@ -922,7 +931,7 @@
 msgstr "Erreur d'horloge interne."
 
 msgid "Failed to map buffer."
-msgstr ""
+msgstr "Impossible de mapper les buffer."
 
 msgid "Filter caps"
 msgstr "Capacités de filtrage"
@@ -936,10 +945,10 @@
 "fourni."
 
 msgid "Caps Change Mode"
-msgstr ""
+msgstr "Mode majuscule activé"
 
 msgid "Filter caps change behaviour"
-msgstr ""
+msgstr "Filtre de comportement de modification des majuscules"
 
 msgid "No Temp directory specified."
 msgstr "Aucun répertoire temporaire indiqué."
@@ -1007,9 +1016,8 @@
 msgid "force caps without doing a typefind"
 msgstr "force les capacités sans faire de recherche de type"
 
-#, fuzzy
 msgid "Stream contains not enough data."
-msgstr "Le flux ne contient aucune donnée."
+msgstr "Le flux ne contient pas assez de données."
 
 msgid "Stream contains no data."
 msgstr "Le flux ne contient aucune donnée."
@@ -1024,7 +1032,7 @@
 msgstr "accès en écriture"
 
 msgid "deprecated"
-msgstr ""
+msgstr "obsolète"
 
 msgid "controllable"
 msgstr "contrôlable"
@@ -1199,15 +1207,15 @@
 
 #, c-format
 msgid "Progress: (%s) %s\n"
-msgstr ""
+msgstr "Progression : (%s) %s\n"
 
 #, c-format
 msgid "Missing element: %s\n"
 msgstr "Élément manquant : %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Got context from element '%s': %s=%s\n"
-msgstr "AVERTISSEMENT : de l'élément %s : %s\n"
+msgstr "Contexte de l’élément « %s » : %s=%s\n"
 
 msgid "Output tags (also known as metadata)"
 msgstr "Affiche les balises (aussi connues sous le nom de métadonnées)"
@@ -1228,9 +1236,11 @@
 "Do not output status information for the specified property if verbose "
 "output is enabled (can be used multiple times)"
 msgstr ""
+"Ne pas afficher les informations de la propriété spécifiée si le mode "
+"verbeux est activé (peut être utilisé plusieurs fois)"
 
 msgid "PROPERTY-NAME"
-msgstr ""
+msgstr "NOM-PROPRIÉTÉ"
 
 msgid "Do not install a fault handler"
 msgstr "N'installe pas de gestionnaire de dysfonctionnement"
diff --git a/po/gl.gmo b/po/gl.gmo
index a6f7e82..04c1914 100644
--- a/po/gl.gmo
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
index 07d0f66..7dc05ed 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.0.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2012-12-15 03:29+0200\n"
 "Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n"
 "Language-Team: Galician <proxecto@trasno.net>\n"
@@ -819,6 +819,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/gstreamer-1.0.pot b/po/gstreamer-1.0.pot
index 4e422ec..820ef92 100644
--- a/po/gstreamer-1.0.pot
+++ b/po/gstreamer-1.0.pot
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: gstreamer 1.6.2\n"
+"Project-Id-Version: gstreamer 1.7.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -105,7 +105,7 @@
 msgid "Show GStreamer Options"
 msgstr ""
 
-#: gst/gst.c:884
+#: gst/gst.c:885
 msgid "Unknown option"
 msgstr ""
 
@@ -1004,16 +1004,24 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
-#: gst/gsttaglist.c:442
+#: gst/gsttaglist.c:406
+msgid "private-data"
+msgstr ""
+
+#: gst/gsttaglist.c:406
+msgid "Private data"
+msgstr ""
+
+#: gst/gsttaglist.c:446
 msgid ", "
 msgstr ""
 
-#: gst/gsturi.c:674
+#: gst/gsturi.c:655
 #, c-format
 msgid "No URI handler for the %s protocol found"
 msgstr ""
 
-#: gst/gsturi.c:849
+#: gst/gsturi.c:830
 #, c-format
 msgid "URI scheme '%s' not supported"
 msgstr ""
@@ -1107,22 +1115,22 @@
 msgid "empty pipeline not allowed"
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:2845
+#: libs/gst/base/gstbasesink.c:2853
 msgid "A lot of buffers are being dropped."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:3373
+#: libs/gst/base/gstbasesink.c:3381
 msgid "Internal data flow problem."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:4086
+#: libs/gst/base/gstbasesink.c:4094
 msgid "Internal data stream error."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:4096 libs/gst/base/gstbasesrc.c:2942
-#: libs/gst/base/gstbasesrc.c:2951 plugins/elements/gstdownloadbuffer.c:1353
-#: plugins/elements/gstqueue.c:966 plugins/elements/gstqueue.c:1513
-#: plugins/elements/gstqueue2.c:2368 plugins/elements/gstqueue2.c:2844
+#: libs/gst/base/gstbasesink.c:4104 libs/gst/base/gstbasesrc.c:2942
+#: libs/gst/base/gstbasesrc.c:2951 plugins/elements/gstdownloadbuffer.c:1351
+#: plugins/elements/gstqueue.c:968 plugins/elements/gstqueue.c:1517
+#: plugins/elements/gstqueue2.c:2418 plugins/elements/gstqueue2.c:2894
 msgid "Internal data flow error."
 msgstr ""
 
@@ -1152,22 +1160,22 @@
 msgid "Filter caps change behaviour"
 msgstr ""
 
-#: plugins/elements/gstdownloadbuffer.c:924 plugins/elements/gstqueue2.c:1550
+#: plugins/elements/gstdownloadbuffer.c:922 plugins/elements/gstqueue2.c:1593
 msgid "No Temp directory specified."
 msgstr ""
 
-#: plugins/elements/gstdownloadbuffer.c:930 plugins/elements/gstqueue2.c:1556
+#: plugins/elements/gstdownloadbuffer.c:928 plugins/elements/gstqueue2.c:1599
 #, c-format
 msgid "Could not create temp file \"%s\"."
 msgstr ""
 
-#: plugins/elements/gstdownloadbuffer.c:938 plugins/elements/gstfilesrc.c:529
-#: plugins/elements/gstqueue2.c:1564
+#: plugins/elements/gstdownloadbuffer.c:936 plugins/elements/gstfilesrc.c:529
+#: plugins/elements/gstqueue2.c:1607
 #, c-format
 msgid "Could not open file \"%s\" for reading."
 msgstr ""
 
-#: plugins/elements/gstdownloadbuffer.c:1262 plugins/elements/gstqueue2.c:1970
+#: plugins/elements/gstdownloadbuffer.c:1260 plugins/elements/gstqueue2.c:2020
 msgid "Error while writing to download file."
 msgstr ""
 
@@ -1180,18 +1188,18 @@
 msgid "Could not open file \"%s\" for writing."
 msgstr ""
 
-#: plugins/elements/gstfilesink.c:463
+#: plugins/elements/gstfilesink.c:450
 #, c-format
 msgid "Error closing file \"%s\"."
 msgstr ""
 
-#: plugins/elements/gstfilesink.c:627
+#: plugins/elements/gstfilesink.c:619
 #, c-format
 msgid "Error while seeking in file \"%s\"."
 msgstr ""
 
-#: plugins/elements/gstfilesink.c:635 plugins/elements/gstfilesink.c:712
-#: plugins/elements/gstfilesink.c:747
+#: plugins/elements/gstfilesink.c:627 plugins/elements/gstfilesink.c:704
+#: plugins/elements/gstfilesink.c:739
 #, c-format
 msgid "Error while writing to file \"%s\"."
 msgstr ""
@@ -1215,7 +1223,7 @@
 msgid "File \"%s\" is a socket."
 msgstr ""
 
-#: plugins/elements/gstidentity.c:641
+#: plugins/elements/gstidentity.c:660
 msgid "Failed after iterations as requested."
 msgstr ""
 
@@ -1316,15 +1324,15 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:1456
+#: tools/gst-inspect.c:1469
 msgid "Print all elements"
 msgstr ""
 
-#: tools/gst-inspect.c:1458
+#: tools/gst-inspect.c:1471
 msgid "Print list of blacklisted files"
 msgstr ""
 
-#: tools/gst-inspect.c:1460
+#: tools/gst-inspect.c:1473
 msgid ""
 "Print a machine-parsable list of features the specified plugin or all "
 "plugins provide.\n"
@@ -1332,30 +1340,30 @@
 "automatic plugin installation mechanisms"
 msgstr ""
 
-#: tools/gst-inspect.c:1465
+#: tools/gst-inspect.c:1478
 msgid "List the plugin contents"
 msgstr ""
 
-#: tools/gst-inspect.c:1467
+#: tools/gst-inspect.c:1480
 msgid "Check if the specified element or plugin exists"
 msgstr ""
 
-#: tools/gst-inspect.c:1470
+#: tools/gst-inspect.c:1483
 msgid ""
 "When checking if an element or plugin exists, also check that its version is "
 "at least the version specified"
 msgstr ""
 
-#: tools/gst-inspect.c:1474
+#: tools/gst-inspect.c:1487
 msgid "Print supported URI schemes, with the elements that implement them"
 msgstr ""
 
-#: tools/gst-inspect.c:1617
+#: tools/gst-inspect.c:1632
 #, c-format
 msgid "Could not load plugin file: %s\n"
 msgstr ""
 
-#: tools/gst-inspect.c:1622
+#: tools/gst-inspect.c:1637
 #, c-format
 msgid "No such element or plugin '%s'\n"
 msgstr ""
@@ -1524,92 +1532,92 @@
 msgid "Gather and print index statistics"
 msgstr ""
 
-#: tools/gst-launch.c:1002
+#: tools/gst-launch.c:1004
 #, c-format
 msgid "ERROR: pipeline could not be constructed: %s.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1006
+#: tools/gst-launch.c:1008
 msgid "ERROR: pipeline could not be constructed.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1010
+#: tools/gst-launch.c:1012
 #, c-format
 msgid "WARNING: erroneous pipeline: %s\n"
 msgstr ""
 
-#: tools/gst-launch.c:1026
+#: tools/gst-launch.c:1028
 msgid "ERROR: the 'pipeline' element wasn't found.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1057 tools/gst-launch.c:1158
+#: tools/gst-launch.c:1059 tools/gst-launch.c:1160
 msgid "Setting pipeline to PAUSED ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1062
+#: tools/gst-launch.c:1064
 msgid "ERROR: Pipeline doesn't want to pause.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1067
+#: tools/gst-launch.c:1069
 msgid "Pipeline is live and does not need PREROLL ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1071
+#: tools/gst-launch.c:1073
 msgid "Pipeline is PREROLLING ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1074 tools/gst-launch.c:1088
+#: tools/gst-launch.c:1076 tools/gst-launch.c:1090
 msgid "ERROR: pipeline doesn't want to preroll.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1081
+#: tools/gst-launch.c:1083
 msgid "Pipeline is PREROLLED ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1094
+#: tools/gst-launch.c:1096
 msgid "Setting pipeline to PLAYING ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1101
+#: tools/gst-launch.c:1103
 msgid "ERROR: pipeline doesn't want to play.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1120
+#: tools/gst-launch.c:1122
 msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
 msgstr ""
 
-#: tools/gst-launch.c:1124
+#: tools/gst-launch.c:1126
 msgid "EOS on shutdown enabled -- waiting for EOS after Error\n"
 msgstr ""
 
-#: tools/gst-launch.c:1127
+#: tools/gst-launch.c:1129
 msgid "Waiting for EOS...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1134
+#: tools/gst-launch.c:1136
 msgid "EOS received - stopping pipeline...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1138
+#: tools/gst-launch.c:1140
 msgid "Interrupt while waiting for EOS - stopping pipeline...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1143
+#: tools/gst-launch.c:1145
 msgid "An error happened while waiting for EOS\n"
 msgstr ""
 
-#: tools/gst-launch.c:1154
+#: tools/gst-launch.c:1156
 msgid "Execution ended after %"
 msgstr ""
 
-#: tools/gst-launch.c:1170
+#: tools/gst-launch.c:1172
 msgid "Setting pipeline to READY ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1182
+#: tools/gst-launch.c:1184
 msgid "Setting pipeline to NULL ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1186
+#: tools/gst-launch.c:1188
 msgid "Freeing pipeline ...\n"
 msgstr ""
diff --git a/po/hr.gmo b/po/hr.gmo
index eee439c..8083e18 100644
--- a/po/hr.gmo
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
index 2f19a43..61498e5 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.32.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2012-05-25 16:47+0200\n"
 "Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
 "Language-Team: Croatian <lokalizacija@linux.hr>\n"
@@ -813,6 +813,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/hu.gmo b/po/hu.gmo
index 87150d0..4a3890a 100644
--- a/po/hu.gmo
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
index 679dd29..b8abe90 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-11-20 23:51+0100\n"
 "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
@@ -815,6 +815,12 @@
 msgid "Midi note number of the audio track."
 msgstr "A hangsáv midi hangjegy száma."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/id.gmo b/po/id.gmo
index f0bfec2..f52bb72 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index 4265713..c17246b 100644
--- a/po/id.po
+++ b/po/id.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.3.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2014-05-31 22:06+0700\n"
 "Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n"
 "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
@@ -818,6 +818,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Nomor catatan midi dari jalur audio."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/it.gmo b/po/it.gmo
index 2681bf4..62fd5ca 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index 0a14b1c..6fe8b58 100644
--- a/po/it.po
+++ b/po/it.po
@@ -106,7 +106,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.30.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2010-10-25 10:03+0200\n"
 "Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
@@ -973,6 +973,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/ja.gmo b/po/ja.gmo
index f078534..dacbdcd 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index 712dc50..88e3883 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.0.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2013-08-20 14:56+0900\n"
 "Last-Translator: Makoto Kato <makoto.kt@gmail.com>\n"
 "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
@@ -784,6 +784,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/lt.gmo b/po/lt.gmo
index 1c63b4f..9ad6606 100644
--- a/po/lt.gmo
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
index 9038b98..39e3555 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.29.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2010-07-16 00:50+0300\n"
 "Last-Translator: Žygimantas Beručka <uid0@akl.lt>\n"
 "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
@@ -824,6 +824,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/nb.gmo b/po/nb.gmo
index 5f9ce3f..b21ce36 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index 723ef10..a84abb0 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -1,20 +1,23 @@
 # Norwegian bokmaal translation of gstreamer.
 # This file is put in the public domain.
+#
 # Kjartan Maraas <kmaraas@gnome.org>, 2004-2010.
+# Johnny A. Solbu <johnny@solbu.net>, 2015
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
-"PO-Revision-Date: 2010-10-24 21:36+0200\n"
-"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
+"PO-Revision-Date: 2015-12-23 02:02+0100\n"
+"Last-Translator: Johnny A. Solbu <johnny@solbu.net>\n"
 "Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
-"Language: \n"
+"Language: nb_NO\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.6.9\n"
 
 msgid "Print the GStreamer version"
 msgstr "Skriv ut versjonsnummer for GStreamer"
@@ -28,6 +31,8 @@
 msgid ""
 "Default debug level from 1 (only error) to 9 (anything) or 0 for no output"
 msgstr ""
+"Standard feilsøkingsnivå fra 1 (kun feil) til 9 (noe) eller 0 for ingen "
+"utdata"
 
 msgid "LEVEL"
 msgstr "NIVÅ"
@@ -36,6 +41,8 @@
 "Comma-separated list of category_name:level pairs to set specific levels for "
 "the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
 msgstr ""
+"Kommaseparert liste over kategori_navn:nivå par for å sette spesifikke "
+"nivåer for de enkelte kategoriene. eksempel: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
 
 msgid "LIST"
 msgstr "LISTE"
@@ -47,15 +54,17 @@
 "Changes coloring mode of the debug log. Possible modes: off, on, disable, "
 "auto, unix"
 msgstr ""
+"Endrer fargemodus for feilsøking logg. Mulige moduser: av, på, deaktivere, "
+"auto, unix"
 
 msgid "Disable debugging"
 msgstr "Slå av feilsøking"
 
 msgid "Enable verbose plugin loading diagnostics"
-msgstr ""
+msgstr "Aktiver utførlig diagnostikk ved lasting av programtillegg"
 
 msgid "Colon-separated paths containing plugins"
-msgstr ""
+msgstr "Kolon-separerte stier som inneholder programtillegg"
 
 msgid "PATHS"
 msgstr "STIER"
@@ -64,18 +73,20 @@
 "Comma-separated list of plugins to preload in addition to the list stored in "
 "environment variable GST_PLUGIN_PATH"
 msgstr ""
+"Kommaseparert liste av programtillegg til å forhåndslaste i tillegg til "
+"listen som er lagret i miljøvariabelen GST_PLUGIN_PATH"
 
 msgid "PLUGINS"
 msgstr "TILLEGG"
 
 msgid "Disable trapping of segmentation faults during plugin loading"
-msgstr ""
+msgstr "Deaktiver fangst av segmenteringsfeil under programtillegglasting"
 
 msgid "Disable updating the registry"
-msgstr ""
+msgstr "Deaktiver oppdatering av registeret"
 
 msgid "Disable spawning a helper process while scanning the registry"
-msgstr ""
+msgstr "Deaktiver forgrening av hjelperprosess under scanning av registeret"
 
 msgid "GStreamer Options"
 msgstr "GStreamer-flagg"
@@ -87,54 +98,59 @@
 msgstr "Ukjent flagg"
 
 msgid "GStreamer encountered a general core library error."
-msgstr ""
+msgstr "GStreamer møtte en generell kjernebiblioteksfeil."
 
 msgid ""
 "GStreamer developers were too lazy to assign an error code to this error."
 msgstr ""
+"GStreamerutviklerne var for lat til å tildele denne feilen en feilkode ."
 
 msgid "Internal GStreamer error: code not implemented."
-msgstr ""
+msgstr "Intern GStreamerfeil: kode ikke implementert."
 
 msgid ""
 "GStreamer error: state change failed and some element failed to post a "
 "proper error message with the reason for the failure."
 msgstr ""
+"GStreamerfeil: statusendring mislyktes og noen element mislyktes i å legge "
+"inn en skikkelig feilmelding med årsaken til svikten."
 
 msgid "Internal GStreamer error: pad problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: utfyllingsproblem."
 
 msgid "Internal GStreamer error: thread problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: trådproblem."
 
 msgid "GStreamer error: negotiation problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: forhandlingsproblem."
 
 msgid "Internal GStreamer error: event problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: hendelsesproblem."
 
 msgid "Internal GStreamer error: seek problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: søkeproblem."
 
 msgid "Internal GStreamer error: caps problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: caps-problem."
 
 msgid "Internal GStreamer error: tag problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: Taggproblem."
 
 msgid "Your GStreamer installation is missing a plug-in."
-msgstr ""
+msgstr "GStreamerinstallasjonen din mangler et programtillegg."
 
 msgid "GStreamer error: clock problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: klokkeproblem."
 
 msgid ""
 "This application is trying to use GStreamer functionality that has been "
 "disabled."
 msgstr ""
+"Dette programmet prøver å bruke GStreamerfunksjonalitet som har blitt "
+"deaktivert."
 
 msgid "GStreamer encountered a general supporting library error."
-msgstr ""
+msgstr "GStreamer har møtt et generelt støttebiblioteksfeil."
 
 msgid "Could not initialize supporting library."
 msgstr "Kunne ikke initiere støttebibliotek."
@@ -149,7 +165,7 @@
 msgstr "Feil i koding."
 
 msgid "GStreamer encountered a general resource error."
-msgstr ""
+msgstr "GStreamer har møtt en generelt resursfeil."
 
 msgid "Resource not found."
 msgstr "Ressursen ble ikke funnet."
@@ -187,24 +203,25 @@
 msgid "No space left on the resource."
 msgstr "Ingen plass igjen på ressursen."
 
-#, fuzzy
 msgid "Not authorized to access resource."
-msgstr "Ingen plass igjen på ressursen."
+msgstr "Ikke autorisert til å få tilgang til ressursen."
 
 msgid "GStreamer encountered a general stream error."
-msgstr ""
+msgstr "GStreamer har møtt en generelt strømmefeil."
 
 msgid "Element doesn't implement handling of this stream. Please file a bug."
 msgstr ""
+"Element implementerer ikke håndtering av denne strømmen. Send inn en "
+"feilrapport."
 
 msgid "Could not determine type of stream."
 msgstr "Kunne ikke bestemme type strøm."
 
 msgid "The stream is of a different type than handled by this element."
-msgstr ""
+msgstr "Strømmen er av en annen type enn det som håndteres av dette elementet."
 
 msgid "There is no codec present that can handle the stream's type."
-msgstr ""
+msgstr "Det er ingen kodek til stede som kan håndtere strømmens type."
 
 msgid "Could not decode stream."
 msgstr "Kunne ikke dekode strøm."
@@ -228,6 +245,8 @@
 "The stream is encrypted and can't be decrypted because no suitable key has "
 "been supplied."
 msgstr ""
+"Strømmen er kryptert og kan ikke dekrypteres fordi ingen passende nøkkel er "
+"oppgitt."
 
 #, c-format
 msgid "No error message for domain %s."
@@ -242,7 +261,7 @@
 
 #, c-format
 msgid "Error writing registry cache to %s: %s"
-msgstr ""
+msgstr "Kunne ikke skrive registerbuffer til %s: %s"
 
 msgid "title"
 msgstr "tittel"
@@ -251,7 +270,7 @@
 msgstr "ofte brukt tittel"
 
 msgid "title sortname"
-msgstr ""
+msgstr "tittelsorteringsstreng"
 
 msgid "commonly used title for sorting purposes"
 msgstr "ofte brukt tittel for sorteringsformål"
@@ -275,23 +294,22 @@
 msgstr "album som inneholder disse dataene"
 
 msgid "album sortname"
-msgstr ""
+msgstr "albumsorteringsstreng"
 
-#, fuzzy
 msgid "album containing this data for sorting purposes"
-msgstr "album som inneholder disse dataene"
+msgstr "album som inneholder disse dataene for sorteringsformål"
 
 msgid "album artist"
 msgstr "albumartist"
 
 msgid "The artist of the entire album, as it should be displayed"
-msgstr ""
+msgstr "Artisten av hele albumet, som det burde bli vist"
 
 msgid "album artist sortname"
-msgstr ""
+msgstr "album-, artistsorteringsstreng"
 
 msgid "The artist of the entire album, as it should be sorted"
-msgstr ""
+msgstr "Artisten av hele albumet, som det burde bli sortert"
 
 msgid "date"
 msgstr "dato"
@@ -302,10 +320,9 @@
 msgid "datetime"
 msgstr "datotid"
 
-#, fuzzy
 msgid "date and time the data was created (as a GstDateTime structure)"
 msgstr ""
-"dato for oppretting av dataene (kalenderdager i den Julianske kalenderen)"
+"dato og klokkeslett dataene ble opprettet (som et GstDateTime-struktur)"
 
 msgid "genre"
 msgstr "sjanger"
@@ -322,7 +339,6 @@
 msgid "extended comment"
 msgstr "utvidet kommentar"
 
-#, fuzzy
 msgid "free text commenting the data in key=value or key[en]=comment form"
 msgstr "fritekstkommentar som beskriver dataene"
 
@@ -336,19 +352,19 @@
 msgstr "antall spor"
 
 msgid "count of tracks inside collection this track belongs to"
-msgstr ""
+msgstr "telling av sporene inne i samlingen dette sporet tilhører"
 
 msgid "disc number"
 msgstr "platenummer"
 
 msgid "disc number inside a collection"
-msgstr ""
+msgstr "disknummer inne i en samling"
 
 msgid "disc count"
-msgstr ""
+msgstr "disktelling"
 
 msgid "count of discs inside collection this disc belongs to"
-msgstr ""
+msgstr "telling av diskene i samlingen denne disken tilhører"
 
 msgid "location"
 msgstr "plassering"
@@ -357,12 +373,15 @@
 "Origin of media as a URI (location, where the original of the file or stream "
 "is hosted)"
 msgstr ""
+"Opprinnelsen til mediet som en URI (plassering, hvor den originale fil eller "
+"strøm ligger)"
 
 msgid "homepage"
 msgstr "hjemmeside"
 
 msgid "Homepage for this media (i.e. artist or movie homepage)"
 msgstr ""
+"Hjemmesiden til dette mediet (dvs. hjemmesiden til artisten eller filmen)"
 
 msgid "description"
 msgstr "beskrivelse"
@@ -380,7 +399,7 @@
 msgstr "ISRC"
 
 msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
-msgstr ""
+msgstr "International Standard Recording Code - se http://www.ifpi.org/isrc/"
 
 msgid "organization"
 msgstr "organisasjon"
@@ -394,16 +413,14 @@
 msgid "copyright uri"
 msgstr "lenke til informasjon om opphavsrett"
 
-#, fuzzy
 msgid "URI to the copyright notice of the data"
-msgstr "melding om opphavsrett for data"
+msgstr "Lenke til melding om opphavsrett for data"
 
-#, fuzzy
 msgid "encoded by"
-msgstr "koder"
+msgstr "kodet av"
 
 msgid "name of the encoding person or organization"
-msgstr ""
+msgstr "Navnet på personen eller organisasjonen som kodet"
 
 msgid "contact"
 msgstr "kontakt"
@@ -420,9 +437,8 @@
 msgid "license uri"
 msgstr "lenke til lisens"
 
-#, fuzzy
 msgid "URI to the license of the data"
-msgstr "lisens for data"
+msgstr "Lenke til lisensen for dataene"
 
 msgid "performer"
 msgstr "utøver"
@@ -440,51 +456,49 @@
 msgstr "varighet"
 
 msgid "length in GStreamer time units (nanoseconds)"
-msgstr ""
+msgstr "lengde i GStreamer tidsenheter (nanosekunder)"
 
 msgid "codec"
 msgstr "codec"
 
 msgid "codec the data is stored in"
-msgstr ""
+msgstr "kodek dataene er lagret i"
 
 msgid "video codec"
-msgstr ""
+msgstr "videokodek"
 
 msgid "codec the video data is stored in"
-msgstr ""
+msgstr "kodek videodataene er lagret i"
 
 msgid "audio codec"
 msgstr "lydkodek"
 
 msgid "codec the audio data is stored in"
-msgstr ""
+msgstr "kodek lyddataene er lagret i"
 
-#, fuzzy
 msgid "subtitle codec"
-msgstr "lydkodek"
+msgstr "undertekstkodek"
 
 msgid "codec the subtitle data is stored in"
-msgstr ""
+msgstr "kodek undertekstdataene er lagret i"
 
-#, fuzzy
 msgid "container format"
-msgstr "kontaktinformasjon"
+msgstr "beholderformat"
 
 msgid "container format the data is stored in"
-msgstr ""
+msgstr "beholderformatet dataene er lagret i"
 
 msgid "bitrate"
 msgstr "bitrate"
 
 msgid "exact or average bitrate in bits/s"
-msgstr ""
+msgstr "eksakt eller gjennomsnittlig bitrate i bits/s"
 
 msgid "nominal bitrate"
 msgstr "nominell bitrate"
 
 msgid "nominal bitrate in bits/s"
-msgstr ""
+msgstr "nominell bitrate i bits/s"
 
 msgid "minimum bitrate"
 msgstr "minste bitrate"
@@ -496,19 +510,19 @@
 msgstr "maksimal bitrate"
 
 msgid "maximum bitrate in bits/s"
-msgstr ""
+msgstr "maksimal bitrate i bits/s"
 
 msgid "encoder"
 msgstr "koder"
 
 msgid "encoder used to encode this stream"
-msgstr ""
+msgstr "omkoder som skal brukes til å kode denne strømmen"
 
 msgid "encoder version"
 msgstr "versjon av koder"
 
 msgid "version of the encoder used to encode this stream"
-msgstr ""
+msgstr "versjon av omkoderen som brukes til å kode denne strømmen"
 
 msgid "serial"
 msgstr "serienummer"
@@ -517,66 +531,65 @@
 msgstr "serienummer for spor"
 
 msgid "replaygain track gain"
-msgstr ""
+msgstr "avspillingsforsterkning sporforsterkning"
 
 msgid "track gain in db"
-msgstr ""
+msgstr "sporforsterkning i db"
 
 msgid "replaygain track peak"
-msgstr ""
+msgstr "avspillingsforsterkning sportmaksimum"
 
 msgid "peak of the track"
-msgstr ""
+msgstr "sporets maksimum"
 
 msgid "replaygain album gain"
-msgstr ""
+msgstr "avspillingsforsterkning albumforsterkning"
 
 msgid "album gain in db"
-msgstr ""
+msgstr "albumforsterkning i db"
 
 msgid "replaygain album peak"
-msgstr ""
+msgstr "avspillingsforsterkning albummaksimum"
 
 msgid "peak of the album"
-msgstr ""
+msgstr "albumets maksimum"
 
 msgid "replaygain reference level"
-msgstr ""
+msgstr "avspillingsforsterkning referansenivå"
 
 msgid "reference level of track and album gain values"
-msgstr ""
+msgstr "referansenivå for spor- og albumforsterkningsverdier"
 
 msgid "language code"
 msgstr "språkkode"
 
 msgid "language code for this stream, conforming to ISO-639-1 or ISO-639-2"
-msgstr ""
+msgstr "språkkoden for denne strømmen, i samsvar med ISO-639-1 eller ISO-639-2"
 
-#, fuzzy
 msgid "language name"
-msgstr "språkkode"
+msgstr "språknavn"
 
 msgid "freeform name of the language this stream is in"
-msgstr ""
+msgstr "friformnavnet på språket denne strømmen er i"
 
 msgid "image"
 msgstr "bilde"
 
 msgid "image related to this stream"
-msgstr ""
+msgstr "bilde relatert til denne strømmen"
 
 #. TRANSLATORS: 'preview image' = image that shows a preview of the full image
 msgid "preview image"
-msgstr ""
+msgstr "forhåndsvis bilde"
 
 msgid "preview image related to this stream"
-msgstr ""
+msgstr "forhåndsvis bilde relatert til denne strømmen"
 
 msgid "attachment"
 msgstr "vedlegg"
 
 msgid "file attached to this stream"
-msgstr ""
+msgstr "fil vedlagt denne strømmen"
 
 msgid "beats per minute"
 msgstr "slag i minuttet"
@@ -590,138 +603,148 @@
 msgid "comma separated keywords describing the content"
 msgstr "kommaseparerte nøkkelord som beskriver innholdet"
 
-#, fuzzy
 msgid "geo location name"
-msgstr "plassering"
+msgstr "geografisk stedsnavn"
 
 msgid ""
 "human readable descriptive location of where the media has been recorded or "
 "produced"
 msgstr ""
+"lesbar beskrivende plassering av hvor mediene har blitt innspilt eller "
+"produsert"
 
 msgid "geo location latitude"
-msgstr ""
+msgstr "geografisk breddegrad"
 
 msgid ""
 "geo latitude location of where the media has been recorded or produced in "
 "degrees according to WGS84 (zero at the equator, negative values for "
 "southern latitudes)"
 msgstr ""
+"geografisk breddegradplassering hvor mediene har vært innspilt eller "
+"produsert i grader i henhold til WGS84 (null ved ekvator, negative verdier "
+"for sydlige breddegrader)"
 
 msgid "geo location longitude"
-msgstr ""
+msgstr "geografisk lengdegrad"
 
 msgid ""
 "geo longitude location of where the media has been recorded or produced in "
 "degrees according to WGS84 (zero at the prime meridian in Greenwich/UK,  "
 "negative values for western longitudes)"
 msgstr ""
+"geografisk lengdegradplassering hvor mediene har vært innspilt eller "
+"produsert i grader i henhold til WGS84 (null ved nullmeridianen i "
+"Greenwich / UK, negative verdier for vestlige lengdegrader)"
 
 msgid "geo location elevation"
-msgstr ""
+msgstr "geografisk høyde"
 
 msgid ""
 "geo elevation of where the media has been recorded or produced in meters "
 "according to WGS84 (zero is average sea level)"
 msgstr ""
+"geografisk høyde i meter der mediene er innspilt eller produsert, i henhold "
+"til WGS84 (null er gjennomsnittlig havnivå)"
 
-#, fuzzy
 msgid "geo location country"
-msgstr "plassering"
+msgstr "geografisk nasjon"
 
 msgid "country (english name) where the media has been recorded or produced"
-msgstr ""
+msgstr "land (engelsk navn) der mediene er innspilt eller produsert"
 
-#, fuzzy
 msgid "geo location city"
-msgstr "plassering"
+msgstr "geografisk by"
 
 msgid "city (english name) where the media has been recorded or produced"
-msgstr ""
+msgstr "by (engelsk navn) der mediene er innspilt eller produsert"
 
-#, fuzzy
 msgid "geo location sublocation"
-msgstr "plassering"
+msgstr "geografisk underlokasjon"
 
 msgid ""
 "a location within a city where the media has been produced or created (e.g. "
 "the neighborhood)"
 msgstr ""
+"et sted i en by hvor mediene har blitt produsert eller laget (f.eks "
+"nabolaget)"
 
-#, fuzzy
 msgid "geo location horizontal error"
-msgstr "plassering"
+msgstr "geografisk plassering horisontalfeil"
 
 msgid "expected error of the horizontal positioning measures (in meters)"
-msgstr ""
+msgstr "forventet feil i den horisontale posisjoneringsmål (i meter)"
 
-#, fuzzy
 msgid "geo location movement speed"
-msgstr "plassering"
+msgstr "geografisk bevegelseshastighet"
 
 msgid ""
 "movement speed of the capturing device while performing the capture in m/s"
-msgstr ""
+msgstr "bevegelseshastigheten til opptaksenheten mens du utfører opptak i m/s"
 
-#, fuzzy
 msgid "geo location movement direction"
-msgstr "plassering"
+msgstr "geografisk bevegelsesretning"
 
 msgid ""
 "indicates the movement direction of the device performing the capture of a "
 "media. It is represented as degrees in floating point representation, 0 "
 "means the geographic north, and increases clockwise"
 msgstr ""
+"indikerer bevegelsesretningen av innretningen som utfører opptak av et "
+"medium. Det er representert som grader i flyttall-representasjon, 0 betyr "
+"geografisk nord og øker med klokken"
 
-#, fuzzy
 msgid "geo location capture direction"
-msgstr "plassering"
+msgstr "geografisk opptaksretning"
 
 msgid ""
 "indicates the direction the device is pointing to when capturing  a media. "
 "It is represented as degrees in floating point  representation, 0 means the "
 "geographic north, and increases clockwise"
 msgstr ""
+"indikerer i hvilken retning enheten peker når du tar opp et medie. Det er "
+"representert som grader i flyttall-representasjon, 0 betyr geografisk nord "
+"og øker med klokken"
 
 #. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
 msgid "show name"
 msgstr "navn på program"
 
 msgid "Name of the tv/podcast/series show the media is from"
-msgstr ""
+msgstr "Navnet på serien tv- eller podcasten mediet stammer fra"
 
 #. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
 msgid "show sortname"
-msgstr ""
+msgstr "serie-sorteringsnavn"
 
 msgid ""
 "Name of the tv/podcast/series show the media is from, for sorting purposes"
 msgstr ""
+"Navnet på serien tv- eller podcasten mediet stammer fra, for sorteringsformål"
 
 msgid "episode number"
 msgstr "episodenummer"
 
 msgid "The episode number in the season the media is part of"
-msgstr ""
+msgstr "Episodenummeret i sesongen mediet er en del av"
 
 msgid "season number"
 msgstr "sesongnummer"
 
 msgid "The season number of the show the media is part of"
-msgstr ""
+msgstr "Sesongnummeret i serien mediet er en del av"
 
 msgid "lyrics"
 msgstr "tekster"
 
 msgid "The lyrics of the media, commonly used for songs"
-msgstr ""
+msgstr "Teksten til mediene, vanligvis brukt for sanger"
 
 msgid "composer sortname"
-msgstr ""
+msgstr "komponist-sorteringsnavn"
 
-#, fuzzy
 msgid "person(s) who composed the recording, for sorting purposes"
-msgstr "person(er) som er ansvarlige for opptaket"
+msgstr "person(er) som komponert opptaket, for sorteringsformål"
 
 msgid "grouping"
 msgstr "gruppering"
@@ -730,63 +753,71 @@
 "Groups related media that spans multiple tracks, like the different pieces "
 "of a concerto. It is a higher level than a track, but lower than an album"
 msgstr ""
+"Grupperelaterte media som går over flere spor, som de forskjellige delene av "
+"en konsert. Det er et høyere nivå enn et spor, men lavere enn et album"
 
-#, fuzzy
 msgid "user rating"
-msgstr "varighet"
+msgstr "brukerrangering"
 
 msgid ""
 "Rating attributed by a user. The higher the rank, the more the user likes "
 "this media"
 msgstr ""
+"Rating tilskrevet av en bruker. Jo høyere rang, jo mer liker brukeren dette "
+"mediet"
 
 msgid "device manufacturer"
-msgstr ""
+msgstr "enhetsprodusent"
 
 msgid "Manufacturer of the device used to create this media"
-msgstr ""
+msgstr "Produsenten av enheten som brukes til å lage dette mediet"
 
 msgid "device model"
-msgstr ""
+msgstr "enhetsmodell"
 
 msgid "Model of the device used to create this media"
-msgstr ""
+msgstr "Modell av enheten som brukes til å lage dette mediet"
 
-#, fuzzy
 msgid "application name"
-msgstr "plassering"
+msgstr "Programnavn"
 
 msgid "Application used to create the media"
-msgstr ""
+msgstr "Program brukt til å lage mediet"
 
 msgid "application data"
-msgstr ""
+msgstr "Programdata"
 
 msgid "Arbitrary application data to be serialized into the media"
-msgstr ""
+msgstr "Vilkårlige programdata som skal serialiseres i mediet"
 
 msgid "image orientation"
-msgstr ""
+msgstr "bildeorientering"
 
 msgid "How the image should be rotated or flipped before display"
-msgstr ""
+msgstr "Hvordan bildet skal roteres eller snus før visning"
 
 msgid "publisher"
-msgstr ""
+msgstr "utgiver"
 
 msgid "Name of the label or publisher"
-msgstr ""
+msgstr "Navnet på forlaget eller utgiveren"
 
 msgid "interpreted-by"
-msgstr ""
+msgstr "tolket av"
 
 msgid "Information about the people behind a remix and similar interpretations"
-msgstr ""
+msgstr "Informasjon om menneskene bak en remiks og lignende tolkninger"
 
 msgid "midi-base-note"
-msgstr ""
+msgstr "midi-base-node"
 
 msgid "Midi note number of the audio track."
+msgstr "Midi-nodenummer på lydsporet."
+
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
 msgstr ""
 
 msgid ", "
@@ -794,11 +825,11 @@
 
 #, c-format
 msgid "No URI handler for the %s protocol found"
-msgstr ""
+msgstr "Ingen URI-behandler for %s protokollen funnet"
 
 #, c-format
 msgid "URI scheme '%s' not supported"
-msgstr ""
+msgstr "URI-ordningen «%s» støttes ikke"
 
 #, c-format
 msgid "ERROR: from element %s: %s\n"
@@ -857,10 +888,10 @@
 msgstr ""
 
 msgid "syntax error"
-msgstr ""
+msgstr "Syntaksfeil"
 
 msgid "bin"
-msgstr ""
+msgstr "bin"
 
 #, c-format
 msgid "specified empty bin \"%s\", not allowed"
@@ -916,9 +947,8 @@
 msgid "Could not open file \"%s\" for reading."
 msgstr "Kunne ikke åpne fil «%s» for lesing."
 
-#, fuzzy
 msgid "Error while writing to download file."
-msgstr "Feil ved skriving til fil «%s»."
+msgstr ""
 
 msgid "No file name specified for writing."
 msgstr "Ingen filnavn oppgitt for skriving."
@@ -972,9 +1002,8 @@
 msgid "force caps without doing a typefind"
 msgstr ""
 
-#, fuzzy
 msgid "Stream contains not enough data."
-msgstr "Strømmen inneholder ikke data."
+msgstr "Strømmen inneholder ikke nok data."
 
 msgid "Stream contains no data."
 msgstr "Strømmen inneholder ikke data."
@@ -1071,25 +1100,25 @@
 msgid "Index statistics"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Got message #%u from element \"%s\" (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Got message #%u from pad \"%s:%s\" (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Got message #%u from object \"%s\" (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Got message #%u (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Got EOS from element \"%s\".\n"
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
 
 #, c-format
 msgid "FOUND TAG      : found by element \"%s\".\n"
@@ -1125,9 +1154,9 @@
 "INFO:\n"
 "%s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: from element %s: %s\n"
-msgstr "FEIL: fra element %s: %s\n"
+msgstr "ADVARSEL: fra element %s: %s\n"
 
 msgid "Prerolled, waiting for buffering to finish...\n"
 msgstr ""
@@ -1158,13 +1187,13 @@
 msgid "Progress: (%s) %s\n"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Missing element: %s\n"
-msgstr "ingen element «%s»"
+msgstr "Mangler element: %s\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Got context from element '%s': %s=%s\n"
-msgstr "FEIL: fra element %s: %s\n"
+msgstr "Fikk sammenheng fra element «%s»: %s=%s\n"
 
 msgid "Output tags (also known as metadata)"
 msgstr ""
@@ -1269,5 +1298,8 @@
 #~ msgid "TYPE1,TYPE2,..."
 #~ msgstr "TYPE1,TYPE2,..."
 
+#~ msgid "maximum"
+#~ msgstr "maksimum"
+
 #~ msgid "FILE"
 #~ msgstr "FIL"
diff --git a/po/nl.gmo b/po/nl.gmo
index f8eb7b3..4460abb 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index 7fbd028..b3735b7 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-17 12:38+0200\n"
 "Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -827,6 +827,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Midi notitienummer van de geluidstrack"
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/pl.gmo b/po/pl.gmo
index 6ba71e0..63dd1d9 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index 48c0fca..a4c5807 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-15 20:45+0200\n"
 "Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -820,6 +820,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Numer dźwięku MIDI ścieżki dźwiękowej."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 8ec3164..e90f06f 100644
--- a/po/pt_BR.gmo
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 849c6a4..c2a03be 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -17,7 +17,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer-1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2013-12-29 18:20-0200\n"
 "Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n"
 "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
@@ -835,6 +835,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/ro.gmo b/po/ro.gmo
index 847c059..c8f44eb 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index 013aef17..e51d846 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.10.29.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2010-08-16 01:10+0300\n"
 "Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n"
 "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
@@ -841,6 +841,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/ru.gmo b/po/ru.gmo
index c9f2931..8c13f8b 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index 27f5a60..d7bb92a 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-18 13:38+0300\n"
 "Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
 "Language-Team: Russian <gnu@d07.ru>\n"
@@ -819,6 +819,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Номер ноты midi на аудио дорожке."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/rw.gmo b/po/rw.gmo
index 754fed3..be23945 100644
--- a/po/rw.gmo
+++ b/po/rw.gmo
Binary files differ
diff --git a/po/rw.po b/po/rw.po
index 4841c2d..d04494f 100644
--- a/po/rw.po
+++ b/po/rw.po
@@ -15,7 +15,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.8.8\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2005-04-04 10:55-0700\n"
 "Last-Translator: Steven Michael Murphy <murf@e-tools.com>\n"
 "Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
@@ -984,6 +984,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/sk.gmo b/po/sk.gmo
index f844c0a..fe1df5b 100644
--- a/po/sk.gmo
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
index 18a6e4f..474e76a 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2014-01-30 10:24+0100\n"
 "Last-Translator: Peter Tuhársky <tuharsky@misbb.sk>\n"
 "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
@@ -820,6 +820,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/sl.gmo b/po/sl.gmo
index 2ccd09e..d5ffbb5 100644
--- a/po/sl.gmo
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
index 66ed8f2..eeb00df 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer-1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2014-04-09 22:38+0100\n"
 "Last-Translator: Klemen Košir <klemen913@gmail.com>\n"
 "Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
@@ -816,6 +816,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/sq.gmo b/po/sq.gmo
index fbc97fe..53ead54 100644
--- a/po/sq.gmo
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
index d5c3aaa..1db061f 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 0.8.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2004-08-07 23:46+0200\n"
 "Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
 "Language-Team: Albanian <begraj@hotmail.com>\n"
@@ -837,6 +837,12 @@
 msgid "Midi note number of the audio track."
 msgstr ""
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/sr.gmo b/po/sr.gmo
index 32d670a..1fe9e32 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 06ab679..a2f3ced 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer-1.3.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2014-06-18 20:12+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <(nothing)>\n"
@@ -818,6 +818,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Број миди ноте звучне нумере."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/sv.gmo b/po/sv.gmo
index eb27c93..fdfee55 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 2e08d3d..87551c7 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-11-01 00:50+0100\n"
 "Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -818,6 +818,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Midi-not-nummer för ljudspåret."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/tr.gmo b/po/tr.gmo
index e7a490a..208fa67 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index 8362798..bba4365 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.4.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-01-10 21:06+0100\n"
 "Last-Translator: Volkan Gezer <volkangezer@gmail.com>\n"
 "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
@@ -806,6 +806,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Ses kaydının midi notu numarası."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/uk.gmo b/po/uk.gmo
index 008faad..b041fef 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 536d0d6..04712d3 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-15 20:39+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
@@ -816,6 +816,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Номер ноти MIDI звукової доріжки."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/vi.gmo b/po/vi.gmo
index ab888ca..9d42c43 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index bdd1874..dd05539 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-16 08:03+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
@@ -820,6 +820,12 @@
 msgid "Midi note number of the audio track."
 msgstr "Số ghi chú midi của rãnh âm thanh."
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index 8d8aa64..f917259 100644
--- a/po/zh_CN.gmo
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index b993bb2..6c7b555 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2015-10-16 19:25+0800\n"
 "Last-Translator: Tianze Wang <zwpwjwtz@126.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -785,6 +785,12 @@
 msgid "Midi note number of the audio track."
 msgstr "音频轨的midi注解编号"
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ", "
 
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
index 433ed26..8749b66 100644
--- a/po/zh_TW.gmo
+++ b/po/zh_TW.gmo
Binary files differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 809b13a..9397e01 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -27,7 +27,7 @@
 msgstr ""
 "Project-Id-Version: gstreamer 1.3.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
 "PO-Revision-Date: 2014-06-08 00:22+0800\n"
 "Last-Translator: Wen Liao <wen.cf83@gmail.com>\n"
 "Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
@@ -810,6 +810,12 @@
 msgid "Midi note number of the audio track."
 msgstr "音軌Midi簡譜"
 
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
 msgid ", "
 msgstr ""
 
diff --git a/scripts/gst-uninstalled b/scripts/gst-uninstalled
index 648582a..5aa5531 100755
--- a/scripts/gst-uninstalled
+++ b/scripts/gst-uninstalled
@@ -107,6 +107,7 @@
   DYLD_LIBRARY_PATH=$GST/gst-plugins-bad/gst-libs/gst/$path/.libs:$DYLD_LIBRARY_PATH
   GI_TYPELIB_PATH=$GST/gst-plugins-bad/gst-libs/gst/$path:$GI_TYPELIB_PATH
 done
+export GST_HAAR_CASCADES_PATH=$GST/gst-plugins-bad/ext/opencv/
 
 # GStreamer core libraries
 for path in base check controller net
@@ -168,6 +169,16 @@
 :$GST/gst-editing-services/plugins/nle/.libs\
 ${GST_PLUGIN_PATH:+:$GST_PLUGIN_PATH}"
 
+export GST_PRESET_PATH="\
+$GST/gst-plugins-good/gst/equalizer/\
+:$GST/gst-plugins-good/gst/equalizer\
+:$GST/gst-plugins-good/ext/vpx/\
+:$GST/gst-plugins-ugly/ext/x264\
+:$GST/gst-plugins-ugly/ext/amrnb\
+:$GST/gst-plugins-bad/gst/freeverb\
+:$GST/gst-plugins-bad/ext/voamrwbenc\
+${GST_PRESET_PATH:+:$GST_PRESET_PATH}"
+
 # don't use any system-installed plug-ins at all
 export GST_PLUGIN_SYSTEM_PATH=
 # set our registry somewhere else so we don't mess up the registry generated
@@ -176,6 +187,8 @@
 export GST_REGISTRY=$GST/gstreamer/registry.dat
 # Point at the uninstalled plugin scanner
 export GST_PLUGIN_SCANNER=$GST/gstreamer/libs/gst/helpers/gst-plugin-scanner
+# Point at the uninstalled PTP helper
+export GST_PTP_HELPER=$GST/gstreamer/libs/gst/helpers/.libs/gst-ptp-helper
 
 # once MANPATH is set, it needs at least an "empty"component to keep pulling
 # in the system-configured man paths from man.config
diff --git a/tests/Makefile.in b/tests/Makefile.in
index cf4f293..02dc173 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -332,6 +332,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/benchmarks/Makefile.in b/tests/benchmarks/Makefile.in
index eec38dd..f09d503 100644
--- a/tests/benchmarks/Makefile.in
+++ b/tests/benchmarks/Makefile.in
@@ -372,6 +372,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/benchmarks/capsnego.c b/tests/benchmarks/capsnego.c
index e035ddc..dc60194 100644
--- a/tests/benchmarks/capsnego.c
+++ b/tests/benchmarks/capsnego.c
@@ -157,7 +157,7 @@
         gst_message_parse_warning (msg, &err, &dbg);
         GST_WARNING_OBJECT (GST_MESSAGE_SRC (msg), "%s (%s)", err->message,
             (dbg ? dbg : "no details"));
-        g_error_free (err);
+        g_clear_error (&err);
         g_free (dbg);
         break;
       }
@@ -168,7 +168,7 @@
         gst_message_parse_error (msg, &err, &dbg);
         GST_ERROR_OBJECT (GST_MESSAGE_SRC (msg), "%s (%s)", err->message,
             (dbg ? dbg : "no details"));
-        g_error_free (err);
+        g_clear_error (&err);
         g_free (dbg);
         running = FALSE;
         break;
@@ -218,6 +218,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
+    g_clear_error (&err);
+    g_option_context_free (ctx);
     return 1;
   }
   g_option_context_free (ctx);
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
index bbf784f..1c18760 100644
--- a/tests/check/Makefile.in
+++ b/tests/check/Makefile.in
@@ -1297,6 +1297,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -3657,7 +3659,7 @@
 	--show-possibly-lost=no                                 \
 	--leak-resolution=high --num-callers=20			\
 	./$* 2>&1 | tee $$valgrind_log ;			\
-	if grep "==" $$valgrind_log > /dev/null 2>&1; then	\
+	if grep "^==" $$valgrind_log > /dev/null 2>&1; then	\
 	    rm $$valgrind_log;					\
 	    exit 1;						\
 	fi ;							\
diff --git a/tests/check/elements/funnel.c b/tests/check/elements/funnel.c
index fa64a3a..af56d54 100644
--- a/tests/check/elements/funnel.c
+++ b/tests/check/elements/funnel.c
@@ -377,16 +377,16 @@
 {
   GstHarness *h0 = gst_harness_new_with_padnames ("funnel", "sink_0", "src");
   GstHarness *h1 = gst_harness_new_with_element (h0->element, "sink_1", NULL);
-  GstHarnessThread *state, *req, *push0, *push1;
-  GstPadTemplate *templ = gst_element_class_get_pad_template (
-      GST_ELEMENT_GET_CLASS (h0->element), "sink_%u");
+  GstHarnessThread *req, *push0, *push1;
+  GstPadTemplate *templ =
+      gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (h0->element),
+      "sink_%u");
   GstCaps *caps = gst_caps_from_string ("testcaps");
   GstBuffer *buf = gst_buffer_new ();
   GstSegment segment;
 
   gst_segment_init (&segment, GST_FORMAT_TIME);
 
-  state = gst_harness_stress_statechange_start (h0);
   req = gst_harness_stress_requestpad_start (h0, templ, NULL, NULL, TRUE);
   push0 = gst_harness_stress_push_buffer_start (h0, caps, &segment, buf);
   push1 = gst_harness_stress_push_buffer_start (h1, caps, &segment, buf);
@@ -400,7 +400,6 @@
   gst_harness_stress_thread_stop (push1);
   gst_harness_stress_thread_stop (push0);
   gst_harness_stress_thread_stop (req);
-  gst_harness_stress_thread_stop (state);
 
   gst_harness_teardown (h1);
   gst_harness_teardown (h0);
diff --git a/tests/check/elements/queue2.c b/tests/check/elements/queue2.c
index 18170c1..4970f03 100644
--- a/tests/check/elements/queue2.c
+++ b/tests/check/elements/queue2.c
@@ -269,6 +269,77 @@
 
 GST_END_TEST;
 
+static gint overrun_count;
+
+static void
+queue_overrun (GstElement * queue, gpointer user_data)
+{
+  overrun_count++;
+  GST_DEBUG ("queue overrun %d", overrun_count);
+}
+
+static gpointer
+pull_buffer (GstPad * srcpad)
+{
+  GstBuffer *buffer = NULL;
+  gst_pad_get_range (srcpad, 0, 1024, &buffer);
+  gst_buffer_unref (buffer);
+  return NULL;
+}
+
+GST_START_TEST (test_overrun)
+{
+  GstElement *queue2;
+  GstBuffer *buffer;
+  GstPad *sinkpad, *srcpad;
+  GstSegment segment;
+  GThread *thread;
+
+  overrun_count = 0;
+  queue2 = gst_element_factory_make ("queue2", NULL);
+  sinkpad = gst_element_get_static_pad (queue2, "sink");
+  srcpad = gst_element_get_static_pad (queue2, "src");
+
+  g_signal_connect (queue2, "overrun", G_CALLBACK (queue_overrun), srcpad);
+  g_object_set (queue2, "ring-buffer-max-size", (guint64) 4 * 1024,
+      "use-buffering", FALSE,
+      "max-size-buffers", (guint) 0, "max-size-time", (guint64) 0,
+      "max-size-bytes", (guint) 4 * 1024, NULL);
+
+
+  gst_pad_activate_mode (srcpad, GST_PAD_MODE_PULL, TRUE);
+  gst_element_set_state (queue2, GST_STATE_PLAYING);
+
+  gst_segment_init (&segment, GST_FORMAT_BYTES);
+  gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+  gst_pad_send_event (sinkpad, gst_event_new_segment (&segment));
+
+  /* Fill the queue */
+  buffer = gst_buffer_new_and_alloc (4 * 1024);
+  fail_unless (gst_pad_chain (sinkpad, buffer) == GST_FLOW_OK);
+
+
+  /* Make sure the queue doesn't remain full */
+  thread =
+      g_thread_try_new ("gst-check", (GThreadFunc) pull_buffer, srcpad, NULL);
+  fail_unless (thread != NULL);
+
+  /* Push a new buffer in the full queue, should trigger overrun */
+  buffer = gst_buffer_new_and_alloc (1024);
+  fail_unless (gst_pad_chain (sinkpad, buffer) == GST_FLOW_OK);
+  fail_unless (overrun_count == 1);
+
+  g_thread_join (thread);
+
+  gst_element_set_state (queue2, GST_STATE_NULL);
+
+  gst_object_unref (sinkpad);
+  gst_object_unref (srcpad);
+  gst_object_unref (queue2);
+}
+
+GST_END_TEST;
+
 
 static Suite *
 queue2_suite (void)
@@ -283,6 +354,7 @@
   tcase_add_test (tc_chain, test_simple_shutdown_while_running);
   tcase_add_test (tc_chain, test_simple_shutdown_while_running_ringbuffer);
   tcase_add_test (tc_chain, test_filled_read);
+  tcase_add_test (tc_chain, test_overrun);
   return s;
 }
 
diff --git a/tests/check/gst/gstcontext.c b/tests/check/gst/gstcontext.c
index 5ba0cd2..63d8b79 100644
--- a/tests/check/gst/gstcontext.c
+++ b/tests/check/gst/gstcontext.c
@@ -75,6 +75,9 @@
 {
   if (strcmp (gst_context_get_context_type (context), "foobar") == 0)
     ((GstContextElement *) element)->have_foobar = TRUE;
+
+  GST_ELEMENT_CLASS (gst_context_element_parent_class)->set_context (element,
+      context);
 }
 
 static GstStateChangeReturn
@@ -91,9 +94,7 @@
     if (celement->set_before_ready && !have_foobar)
       return GST_STATE_CHANGE_FAILURE;
     else if (celement->set_before_ready)
-      return
-          GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
-          (element, transition);
+      goto chain_up;
 
     if (celement->set_from_need_context && have_foobar)
       return GST_STATE_CHANGE_FAILURE;
@@ -109,9 +110,7 @@
     if (celement->set_from_need_context && !have_foobar)
       return GST_STATE_CHANGE_FAILURE;
     else if (celement->set_from_need_context)
-      return
-          GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
-          (element, transition);
+      goto chain_up;
 
     if (celement->create_self && have_foobar)
       return GST_STATE_CHANGE_FAILURE;
@@ -125,11 +124,9 @@
       gst_element_post_message (element, msg);
       gst_context_unref (context);
     }
-    return
-        GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
-        (element, transition);
   }
 
+chain_up:
   return
       GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
       (element, transition);
@@ -321,6 +318,117 @@
 
 GST_END_TEST;
 
+GST_START_TEST (test_add_element_to_bin)
+{
+  GstBus *bus;
+  GstElement *bin;
+  GstElement *element;
+  GList *contexts, *contexts2, *l;
+
+  /* Start with an element not inside a bin requesting a context. Add the
+   * element to a bin and check the context propagation. */
+  element = g_object_new (gst_context_element_get_type (), NULL);
+
+  ((GstContextElement *) element)->create_self = TRUE;
+
+  fail_unless (gst_element_set_state (element,
+          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+  fail_unless (((GstContextElement *) element)->have_foobar);
+
+  bin = gst_bin_new (NULL);
+
+  bus = gst_bus_new ();
+  gst_element_set_bus (bin, bus);
+
+  fail_unless (gst_element_set_state (bin,
+          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+  gst_bin_add (GST_BIN (bin), element);
+
+  /* check the contexts are the same */
+  contexts = gst_element_get_contexts (element);
+  contexts2 = gst_element_get_contexts (bin);
+  for (l = contexts; l; l = l->next)
+    fail_unless (g_list_find (contexts2, l->data));
+  g_list_free_full (contexts, (GDestroyNotify) gst_context_unref);
+  g_list_free_full (contexts2, (GDestroyNotify) gst_context_unref);
+
+  gst_element_set_bus (bin, NULL);
+  fail_unless (gst_element_set_state (bin,
+          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
+
+  gst_object_unref (bus);
+  gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_add_element_to_bin_collision)
+{
+  GstBus *bus;
+  GstElement *bin;
+  GstElement *element, *element2;
+  GList *contexts, *contexts2, *l;
+
+  /* Start with a bin containing an element that requests a context and then add
+   * another element to the bin that has already requested the same context. */
+
+  bin = gst_bin_new (NULL);
+  element = g_object_new (gst_context_element_get_type (), NULL);
+  gst_bin_add (GST_BIN (bin), element);
+
+  ((GstContextElement *) element)->create_self = TRUE;
+
+  bus = gst_bus_new ();
+  gst_element_set_bus (bin, bus);
+
+  fail_unless (gst_element_set_state (bin,
+          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+  fail_unless (((GstContextElement *) element)->have_foobar);
+
+  /* propagate a context without a parent bin */
+  element2 = g_object_new (gst_context_element_get_type (), NULL);
+  ((GstContextElement *) element2)->create_self = TRUE;
+
+  fail_unless (gst_element_set_state (element2,
+          GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+  fail_unless (((GstContextElement *) element2)->have_foobar);
+
+  ((GstContextElement *) element)->have_foobar = FALSE;
+  ((GstContextElement *) element2)->have_foobar = FALSE;
+
+  /* add element to bin should result in the propagation of contexts to the
+   * added element */
+  gst_bin_add (GST_BIN (bin), element2);
+
+  fail_unless (((GstContextElement *) element)->have_foobar == FALSE);
+  fail_unless (((GstContextElement *) element2)->have_foobar);
+
+  /* check the contexts are the same */
+  contexts = gst_element_get_contexts (element);
+  contexts2 = gst_element_get_contexts (element2);
+  for (l = contexts; l; l = l->next)
+    fail_unless (g_list_find (contexts2, l->data));
+  g_list_free_full (contexts, (GDestroyNotify) gst_context_unref);
+  contexts = gst_element_get_contexts (bin);
+  for (l = contexts; l; l = l->next)
+    fail_unless (g_list_find (contexts2, l->data));
+  g_list_free_full (contexts, (GDestroyNotify) gst_context_unref);
+  g_list_free_full (contexts2, (GDestroyNotify) gst_context_unref);
+
+  gst_element_set_bus (bin, NULL);
+  fail_unless (gst_element_set_state (bin,
+          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
+
+  gst_object_unref (bus);
+  gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
 static Suite *
 gst_context_suite (void)
 {
@@ -335,6 +443,8 @@
   tcase_add_test (tc_chain, test_element_set_from_need_context);
   tcase_add_test (tc_chain, test_element_create_self);
   tcase_add_test (tc_chain, test_element_bin_caching);
+  tcase_add_test (tc_chain, test_add_element_to_bin);
+  tcase_add_test (tc_chain, test_add_element_to_bin_collision);
 
   return s;
 }
diff --git a/tests/check/gst/gstpad.c b/tests/check/gst/gstpad.c
index f74318f..bb52088 100644
--- a/tests/check/gst/gstpad.c
+++ b/tests/check/gst/gstpad.c
@@ -1762,6 +1762,56 @@
 
 GST_END_TEST;
 
+#define NUM_PROBES 4
+static guint count;
+
+static GstPadProbeReturn
+order_others_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+  *(guint *) (user_data) = ++count;
+
+  return GST_PAD_PROBE_REMOVE;
+}
+
+GST_START_TEST (test_pad_probe_call_order)
+{
+  GstFlowReturn flow;
+  GstPad *src, *sink;
+  guint counters[NUM_PROBES];
+  guint i;
+
+  src = gst_pad_new ("src", GST_PAD_SRC);
+  gst_pad_set_active (src, TRUE);
+  sink = gst_pad_new ("sink", GST_PAD_SINK);
+  gst_pad_set_chain_function (sink, gst_check_chain_func);
+  gst_pad_set_active (sink, TRUE);
+
+  fail_unless (gst_pad_push_event (src,
+          gst_event_new_stream_start ("test")) == TRUE);
+  fail_unless (gst_pad_push_event (src,
+          gst_event_new_segment (&dummy_segment)) == TRUE);
+
+  fail_unless_equals_int (gst_pad_link (src, sink), GST_PAD_LINK_OK);
+
+  for (i = 0; i < NUM_PROBES; i++) {
+    gst_pad_add_probe (src,
+        GST_PAD_PROBE_TYPE_BUFFER, order_others_probe_cb, &(counters[i]), NULL);
+  }
+
+  /* push a buffer so the events are propagated downstream */
+  flow = gst_pad_push (src, gst_buffer_new ());
+  fail_unless_equals_int (flow, GST_FLOW_OK);
+
+  for (i = 0; i < NUM_PROBES; i++) {
+    fail_unless (counters[i] == i + 1);
+  }
+
+  gst_object_unref (src);
+  gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
 static gboolean got_notify;
 
 static void
@@ -2444,6 +2494,197 @@
 
 GST_END_TEST;
 
+/* For proxy caps flag tests */
+
+typedef struct _GstProxyTestElement GstProxyTestElement;
+typedef struct _GstProxyTestElementClass GstProxyTestElementClass;
+
+struct _GstProxyTestElement
+{
+  GstElement element;
+};
+
+struct _GstProxyTestElementClass
+{
+  GstElementClass parent_class;
+};
+
+G_GNUC_INTERNAL GType gst_proxytestelement_get_type (void);
+
+static GstStaticPadTemplate proxytestelement_peer_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("test/proxy, option=(int)1"));
+
+static GstStaticPadTemplate proxytestelement_peer_incompatible_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("test/proxy-incompatible"));
+
+static GstStaticPadTemplate proxytestelement_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("test/proxy"));
+
+static GstStaticPadTemplate proxytestelement_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS_ANY);
+
+G_DEFINE_TYPE (GstProxyTestElement, gst_proxytestelement, GST_TYPE_ELEMENT);
+
+static void
+gst_proxytestelement_class_init (GstProxyTestElementClass * klass)
+{
+  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+  gst_element_class_set_static_metadata (gstelement_class,
+      "Proxy Test Element", "Test", "Proxy test element",
+      "Thiago Santos <thiagoss@osg.samsung.com>");
+
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&proxytestelement_sink_template));
+}
+
+static void
+gst_proxytestelement_init (GstProxyTestElement * element)
+{
+  GstPad *sinkpad;
+  sinkpad =
+      gst_pad_new_from_static_template (&proxytestelement_sink_template,
+      "sink");
+  GST_PAD_SET_PROXY_CAPS (sinkpad);
+  gst_element_add_pad (GST_ELEMENT_CAST (element), sinkpad);
+}
+
+GST_START_TEST (test_proxy_accept_caps_no_proxy)
+{
+  GstElement *element;
+  GstPad *sinkpad;
+  GstCaps *caps;
+
+  gst_element_register (NULL, "proxytestelement", GST_RANK_NONE,
+      gst_proxytestelement_get_type ());
+  element = gst_element_factory_make ("proxytestelement", NULL);
+  sinkpad = gst_element_get_static_pad (element, "sink");
+
+  gst_element_set_state (element, GST_STATE_PLAYING);
+
+  caps = gst_caps_from_string ("test/proxy");
+  fail_unless (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  caps = gst_caps_from_string ("test/bad");
+  fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  gst_object_unref (sinkpad);
+  gst_element_set_state (element, GST_STATE_NULL);
+  gst_object_unref (element);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_proxy_accept_caps_with_proxy)
+{
+  GstElement *element;
+  GstPad *sinkpad, *srcpad;
+  GstPad *peerpad;
+  GstCaps *caps;
+
+  gst_element_register (NULL, "proxytestelement", GST_RANK_NONE,
+      gst_proxytestelement_get_type ());
+  element = gst_element_factory_make ("proxytestelement", NULL);
+
+  srcpad =
+      gst_pad_new_from_static_template (&proxytestelement_src_template, "src");
+  gst_element_add_pad (GST_ELEMENT_CAST (element), srcpad);
+
+  sinkpad = gst_element_get_static_pad (element, "sink");
+  srcpad = gst_element_get_static_pad (element, "src");
+
+  peerpad =
+      gst_pad_new_from_static_template (&proxytestelement_peer_template,
+      "sink");
+  fail_unless (gst_pad_link (srcpad, peerpad) == GST_PAD_LINK_OK);
+  gst_pad_set_active (peerpad, TRUE);
+
+  gst_element_set_state (element, GST_STATE_PLAYING);
+
+  caps = gst_caps_from_string ("test/bad");
+  fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  caps = gst_caps_from_string ("test/proxy, option=(int)1");
+  fail_unless (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  caps = gst_caps_from_string ("test/proxy, option=(int)2");
+  fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  gst_object_unref (sinkpad);
+  gst_object_unref (srcpad);
+  gst_pad_set_active (peerpad, FALSE);
+  gst_object_unref (peerpad);
+  gst_element_set_state (element, GST_STATE_NULL);
+  gst_object_unref (element);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_proxy_accept_caps_with_incompatible_proxy)
+{
+  GstElement *element;
+  GstPad *sinkpad, *srcpad;
+  GstPad *peerpad;
+  GstCaps *caps;
+
+  gst_element_register (NULL, "proxytestelement", GST_RANK_NONE,
+      gst_proxytestelement_get_type ());
+  element = gst_element_factory_make ("proxytestelement", NULL);
+
+  srcpad =
+      gst_pad_new_from_static_template (&proxytestelement_src_template, "src");
+  gst_element_add_pad (GST_ELEMENT_CAST (element), srcpad);
+
+  sinkpad = gst_element_get_static_pad (element, "sink");
+  srcpad = gst_element_get_static_pad (element, "src");
+
+  peerpad =
+      gst_pad_new_from_static_template
+      (&proxytestelement_peer_incompatible_template, "sink");
+  fail_unless (gst_pad_link (srcpad, peerpad) == GST_PAD_LINK_OK);
+
+  gst_element_set_state (element, GST_STATE_PLAYING);
+
+  caps = gst_caps_from_string ("test/bad");
+  fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  caps = gst_caps_from_string ("test/proxy");
+  fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  caps = gst_caps_from_string ("test/proxy-incompatible");
+  fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+  gst_caps_unref (caps);
+
+  gst_object_unref (sinkpad);
+  gst_object_unref (srcpad);
+  gst_pad_set_active (peerpad, FALSE);
+  gst_object_unref (peerpad);
+  gst_element_set_state (element, GST_STATE_NULL);
+  gst_object_unref (element);
+}
+
+GST_END_TEST;
+
 static Suite *
 gst_pad_suite (void)
 {
@@ -2481,6 +2722,7 @@
   tcase_add_test (tc_chain, test_pad_probe_block_add_remove);
   tcase_add_test (tc_chain, test_pad_probe_block_and_drop_buffer);
   tcase_add_test (tc_chain, test_pad_probe_flush_events);
+  tcase_add_test (tc_chain, test_pad_probe_call_order);
   tcase_add_test (tc_chain, test_events_query_unlinked);
   tcase_add_test (tc_chain, test_queue_src_caps_notify_linked);
   tcase_add_test (tc_chain, test_queue_src_caps_notify_not_linked);
@@ -2494,6 +2736,9 @@
   tcase_add_test (tc_chain, test_last_flow_return_push);
   tcase_add_test (tc_chain, test_last_flow_return_pull);
   tcase_add_test (tc_chain, test_flush_stop_inactive);
+  tcase_add_test (tc_chain, test_proxy_accept_caps_no_proxy);
+  tcase_add_test (tc_chain, test_proxy_accept_caps_with_proxy);
+  tcase_add_test (tc_chain, test_proxy_accept_caps_with_incompatible_proxy);
 
   return s;
 }
diff --git a/tests/check/gst/gstsegment.c b/tests/check/gst/gstsegment.c
index f0efd9f..f3433e8 100644
--- a/tests/check/gst/gstsegment.c
+++ b/tests/check/gst/gstsegment.c
@@ -22,20 +22,26 @@
 
 #include <gst/check/gstcheck.h>
 
-static void
-check_times (GstSegment * segment, guint64 position, guint64 stream_time,
-    guint64 running_time)
-{
-  guint64 st, rt;
-
-  st = gst_segment_to_stream_time (segment, segment->format, position);
-  rt = gst_segment_to_running_time (segment, segment->format, position);
-  GST_DEBUG ("position %" G_GUINT64_FORMAT ", st %" G_GUINT64_FORMAT ", rt %"
-      G_GUINT64_FORMAT, position, stream_time, running_time);
-
-  fail_unless_equals_int64 (st, stream_time);
-  fail_unless_equals_int64 (rt, running_time);
-}
+#define check_times(segment, position, stream_time, running_time) G_STMT_START { \
+  guint64 st, rt, pos; \
+  \
+  st = gst_segment_to_stream_time ((segment), (segment)->format, (position)); \
+  rt = gst_segment_to_running_time ((segment), (segment)->format, (position)); \
+  GST_DEBUG ("position %" G_GUINT64_FORMAT ", st %" G_GUINT64_FORMAT ", rt %" \
+      G_GUINT64_FORMAT, (guint64) (position), (guint64) (stream_time), (guint64) (running_time)); \
+  \
+  fail_unless_equals_int64 (st, (stream_time)); \
+  fail_unless_equals_int64 (rt, (running_time)); \
+  if ((stream_time) != -1) { \
+    pos = gst_segment_position_from_stream_time ((segment), (segment)->format, st); \
+    fail_unless_equals_int64 (pos, (position)); \
+  } \
+  \
+  if ((running_time) != -1) { \
+    pos = gst_segment_position_from_running_time ((segment), (segment)->format, rt); \
+    fail_unless_equals_int64 (pos, (position)); \
+  } \
+} G_STMT_END;
 
 /* mess with the segment structure in the bytes format */
 GST_START_TEST (segment_seek_nosize)
@@ -749,7 +755,7 @@
 GST_START_TEST (segment_full)
 {
   GstSegment segment;
-  guint64 rt;
+  guint64 rt, pos;
 
   gst_segment_init (&segment, GST_FORMAT_TIME);
 
@@ -764,9 +770,15 @@
   fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
           50, &rt) == 1);
   fail_unless (rt == 0);
+  fail_unless (gst_segment_position_from_running_time_full (&segment,
+          GST_FORMAT_TIME, rt, &pos) == 1);
+  fail_unless (pos == 50);
   fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
           200, &rt) == 1);
   fail_unless (rt == 150);
+  fail_unless (gst_segment_position_from_running_time_full (&segment,
+          GST_FORMAT_TIME, rt, &pos) == 1);
+  fail_unless (pos == 200);
   fail_unless (!gst_segment_clip (&segment, GST_FORMAT_TIME, 40, 40, NULL,
           NULL));
   fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME, 40,
@@ -779,6 +791,9 @@
           NULL));
   fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME, 201,
           &rt) == 1);
+  fail_unless (gst_segment_position_from_running_time_full (&segment,
+          GST_FORMAT_TIME, rt, &pos) == 1);
+  fail_unless (pos == 201);
 
   fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
           -50) == TRUE);
@@ -788,6 +803,99 @@
           50, &rt) == -1);
   GST_DEBUG ("%" G_GUINT64_FORMAT, rt);
   fail_unless (rt == 50);
+
+  segment.start = 50;
+  segment.stop = 300;
+  segment.position = 150;
+  segment.time = 0;
+  segment.offset = 0;
+  gst_segment_set_running_time (&segment, GST_FORMAT_TIME, 100);
+  fail_unless_equals_int (segment.base, 100);
+  fail_unless (gst_segment_position_from_running_time_full (&segment,
+          GST_FORMAT_TIME, 70, &pos) == -1);
+  fail_unless (gst_segment_position_from_running_time_full (&segment,
+          GST_FORMAT_TIME, 140, &pos) == 1);
+  fail_unless_equals_int (pos, 190);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (segment_stream_time_full)
+{
+  GstSegment segment;
+  guint64 st, pos;
+
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+
+  segment.start = 50;
+  segment.stop = 200;
+  segment.time = 30;
+  segment.position = 0;
+
+  fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+          0, &st) == -1);
+  fail_unless_equals_int (st, 20);
+  fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+          20, &st) == 1);
+  fail_unless_equals_int (st, 0);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 0, &pos) == 1);
+  fail_unless_equals_int (pos, 20);
+  fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+          10, &st) == -1);
+  fail_unless_equals_int (st, 10);
+  fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+          40, &st) == 1);
+  fail_unless_equals_int (st, 20);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, st, &pos) == 1);
+  fail_unless_equals_int (pos, 40);
+  segment.time = 100;
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 40, &pos) == -1);
+  fail_unless_equals_int (pos, 10);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 60, &pos) == 1);
+  fail_unless_equals_int (pos, 10);
+
+  segment.start = 50;
+  segment.position = 150;
+  segment.stop = 200;
+  segment.time = 0;
+  segment.applied_rate = -1;
+  segment.rate = -1;
+
+  fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+          0, &st) == 1);
+  fail_unless_equals_int (st, 200);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 200, &pos) == 1);
+  fail_unless_equals_int (pos, 0);
+  fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+          250, &st) == -1);
+  fail_unless_equals_int (st, 50);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 200, &pos) == 1);
+  fail_unless_equals_int (pos, 0);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 250, &pos) == -1);
+  fail_unless_equals_int (pos, 50);
+
+  segment.time = 70;
+  fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+          250, &st) == 1);
+  fail_unless_equals_int (st, 20);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 50, &pos) == 1);
+  fail_unless_equals_int (pos, 220);
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 90, &pos) == 1);
+  fail_unless_equals_int (pos, 180);
+
+  segment.stop = 60;
+  fail_unless (gst_segment_position_from_stream_time_full (&segment,
+          GST_FORMAT_TIME, 5, &pos) == 1);
+  fail_unless_equals_int (pos, 125);
 }
 
 GST_END_TEST;
@@ -891,6 +999,7 @@
   tcase_add_test (tc_chain, segment_full);
   tcase_add_test (tc_chain, segment_negative_rate);
   tcase_add_test (tc_chain, segment_negative_applied_rate);
+  tcase_add_test (tc_chain, segment_stream_time_full);
 
   return s;
 }
diff --git a/tests/check/gst/gstsystemclock.c b/tests/check/gst/gstsystemclock.c
index 86f012b..a8dbcca 100644
--- a/tests/check/gst/gstsystemclock.c
+++ b/tests/check/gst/gstsystemclock.c
@@ -670,6 +670,36 @@
 
 GST_END_TEST;
 
+GST_START_TEST (test_resolution)
+{
+  GstClock *clock;
+  GstClockTime now_t, prev_t, resolution;
+  int i;
+
+  now_t = prev_t = GST_CLOCK_TIME_NONE;
+  clock = gst_system_clock_obtain ();
+  fail_unless (clock != NULL, "Could not create default system clock");
+  resolution = gst_clock_get_resolution (clock);
+  fail_unless (resolution != GST_CLOCK_TIME_NONE);
+
+  for (i = 0; i < 100000; ++i) {
+    now_t = gst_clock_get_internal_time (clock);
+    fail_unless (now_t != GST_CLOCK_TIME_NONE);
+    if (prev_t != GST_CLOCK_TIME_NONE) {
+      GstClockTime diff;
+      fail_unless (now_t >= prev_t);
+      diff = now_t - prev_t;
+      fail_unless (diff == 0 || diff >= resolution);
+    }
+    prev_t = now_t;
+    g_thread_yield ();
+  }
+  g_object_unref (clock);
+  clock = NULL;
+}
+
+GST_END_TEST;
+
 static Suite *
 gst_systemclock_suite (void)
 {
@@ -688,6 +718,7 @@
   tcase_add_test (tc_chain, test_mixed);
   tcase_add_test (tc_chain, test_async_full);
   tcase_add_test (tc_chain, test_set_default);
+  tcase_add_test (tc_chain, test_resolution);
 
   return s;
 }
diff --git a/tests/check/gst/gsturi.c b/tests/check/gst/gsturi.c
index d3656c9..e7ce6df 100644
--- a/tests/check/gst/gsturi.c
+++ b/tests/check/gst/gsturi.c
@@ -800,6 +800,20 @@
   g_free (tmp_str);
   gst_uri_unref (url2);
 
+  url2 = gst_uri_from_string_with_base (url1, "http://foobar.com/bla");
+  fail_unless_equals_string (gst_uri_get_scheme (url2), "http");
+  fail_unless_equals_string (gst_uri_get_host (url2), "foobar.com");
+  fail_unless (gst_uri_get_port (url2) == 0);
+  tmp_str = gst_uri_get_path (url2);
+  fail_unless_equals_string (tmp_str, "/bla");
+  g_free (tmp_str);
+  fail_unless (gst_uri_get_query_table (url2) == NULL);
+  fail_unless (gst_uri_get_fragment (url2) == NULL);
+  tmp_str = gst_uri_to_string (url2);
+  fail_unless_equals_string (tmp_str, "http://foobar.com/bla");
+  g_free (tmp_str);
+  gst_uri_unref (url2);
+
   url2 = gst_uri_copy (url1);
   fail_unless (gst_uri_equal (url1, url2));
   gst_uri_set_query_value (url2, "key", "value");
diff --git a/tests/check/libs/struct_arm.h b/tests/check/libs/struct_arm.h
index 8c99bf2..21310de 100644
--- a/tests/check/libs/struct_arm.h
+++ b/tests/check/libs/struct_arm.h
@@ -22,7 +22,7 @@
   {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 152},
   {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
   {"GstLFOControlSource", sizeof (GstLFOControlSource), 120},
-  {"GstControlPoint", sizeof (GstControlPoint), 32},
+  {"GstControlPoint", sizeof (GstControlPoint), 80},
   {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
   {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 128},
   {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
diff --git a/tests/check/libs/struct_hppa.h b/tests/check/libs/struct_hppa.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_hppa.h
+++ b/tests/check/libs/struct_hppa.h
@@ -22,7 +22,7 @@
   {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
   {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
   {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
-  {"GstControlPoint", sizeof (GstControlPoint), 32},
+  {"GstControlPoint", sizeof (GstControlPoint), 80},
   {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
   {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
   {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/check/libs/struct_i386.h b/tests/check/libs/struct_i386.h
index 3f1e938..fd13063 100644
--- a/tests/check/libs/struct_i386.h
+++ b/tests/check/libs/struct_i386.h
@@ -22,7 +22,7 @@
   {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 140},
   {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
   {"GstLFOControlSource", sizeof (GstLFOControlSource), 108},
-  {"GstControlPoint", sizeof (GstControlPoint), 32},
+  {"GstControlPoint", sizeof (GstControlPoint), 80},
   {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
   {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 120},
   {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
diff --git a/tests/check/libs/struct_ppc32.h b/tests/check/libs/struct_ppc32.h
index 8c99bf2..21310de 100644
--- a/tests/check/libs/struct_ppc32.h
+++ b/tests/check/libs/struct_ppc32.h
@@ -22,7 +22,7 @@
   {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 152},
   {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
   {"GstLFOControlSource", sizeof (GstLFOControlSource), 120},
-  {"GstControlPoint", sizeof (GstControlPoint), 32},
+  {"GstControlPoint", sizeof (GstControlPoint), 80},
   {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
   {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 128},
   {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
diff --git a/tests/check/libs/struct_ppc64.h b/tests/check/libs/struct_ppc64.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_ppc64.h
+++ b/tests/check/libs/struct_ppc64.h
@@ -22,7 +22,7 @@
   {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
   {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
   {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
-  {"GstControlPoint", sizeof (GstControlPoint), 32},
+  {"GstControlPoint", sizeof (GstControlPoint), 80},
   {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
   {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
   {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/check/libs/struct_sparc.h b/tests/check/libs/struct_sparc.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_sparc.h
+++ b/tests/check/libs/struct_sparc.h
@@ -22,7 +22,7 @@
   {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
   {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
   {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
-  {"GstControlPoint", sizeof (GstControlPoint), 32},
+  {"GstControlPoint", sizeof (GstControlPoint), 80},
   {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
   {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
   {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/check/libs/struct_x86_64.h b/tests/check/libs/struct_x86_64.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_x86_64.h
+++ b/tests/check/libs/struct_x86_64.h
@@ -22,7 +22,7 @@
   {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
   {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
   {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
-  {"GstControlPoint", sizeof (GstControlPoint), 32},
+  {"GstControlPoint", sizeof (GstControlPoint), 80},
   {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
   {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
   {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in
index 5c47f83..4fffe09 100644
--- a/tests/examples/Makefile.in
+++ b/tests/examples/Makefile.in
@@ -338,6 +338,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/adapter/Makefile.in b/tests/examples/adapter/Makefile.in
index e074dc4..318169c 100644
--- a/tests/examples/adapter/Makefile.in
+++ b/tests/examples/adapter/Makefile.in
@@ -328,6 +328,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/controller/Makefile.am b/tests/examples/controller/Makefile.am
index 6ead70c..146416c 100644
--- a/tests/examples/controller/Makefile.am
+++ b/tests/examples/controller/Makefile.am
@@ -5,3 +5,13 @@
 LDADD = \
 	$(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
 	$(GST_OBJ_LIBS)
+
+if HAVE_GTK
+noinst_PROGRAMS += controller-graph
+
+controller_graph_CFLAGS = $(GST_OBJ_CFLAGS) $(GTK_CFLAGS)
+controller_graph_LDADD = \
+	$(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
+	$(GST_OBJ_LIBS) $(GTK_LIBS)
+
+endif
\ No newline at end of file
diff --git a/tests/examples/controller/Makefile.in b/tests/examples/controller/Makefile.in
index d17e8ed..c2781db 100644
--- a/tests/examples/controller/Makefile.in
+++ b/tests/examples/controller/Makefile.in
@@ -90,7 +90,9 @@
 host_triplet = @host@
 target_triplet = @target@
 noinst_PROGRAMS = audio-example$(EXEEXT) control-sources$(EXEEXT) \
-	text-color-example$(EXEEXT) absolute-example$(EXEEXT)
+	text-color-example$(EXEEXT) absolute-example$(EXEEXT) \
+	$(am__EXEEXT_1)
+@HAVE_GTK_TRUE@am__append_1 = controller-graph
 subdir = tests/examples/controller
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
@@ -136,6 +138,7 @@
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
+@HAVE_GTK_TRUE@am__EXEEXT_1 = controller-graph$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 absolute_example_SOURCES = absolute-example.c
 absolute_example_OBJECTS = absolute-example.$(OBJEXT)
@@ -157,6 +160,15 @@
 control_sources_LDADD = $(LDADD)
 control_sources_DEPENDENCIES = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
 	$(am__DEPENDENCIES_1)
+controller_graph_SOURCES = controller-graph.c
+controller_graph_OBJECTS =  \
+	controller_graph-controller-graph.$(OBJEXT)
+@HAVE_GTK_TRUE@controller_graph_DEPENDENCIES = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
+@HAVE_GTK_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+controller_graph_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(controller_graph_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
 text_color_example_SOURCES = text-color-example.c
 text_color_example_OBJECTS = text-color-example.$(OBJEXT)
 text_color_example_LDADD = $(LDADD)
@@ -197,9 +209,9 @@
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = absolute-example.c audio-example.c control-sources.c \
-	text-color-example.c
+	controller-graph.c text-color-example.c
 DIST_SOURCES = absolute-example.c audio-example.c control-sources.c \
-	text-color-example.c
+	controller-graph.c text-color-example.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -344,6 +356,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -519,6 +533,11 @@
 	$(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
 	$(GST_OBJ_LIBS)
 
+@HAVE_GTK_TRUE@controller_graph_CFLAGS = $(GST_OBJ_CFLAGS) $(GTK_CFLAGS)
+@HAVE_GTK_TRUE@controller_graph_LDADD = \
+@HAVE_GTK_TRUE@	$(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
+@HAVE_GTK_TRUE@	$(GST_OBJ_LIBS) $(GTK_LIBS)
+
 all: all-am
 
 .SUFFIXES:
@@ -574,6 +593,10 @@
 	@rm -f control-sources$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(control_sources_OBJECTS) $(control_sources_LDADD) $(LIBS)
 
+controller-graph$(EXEEXT): $(controller_graph_OBJECTS) $(controller_graph_DEPENDENCIES) $(EXTRA_controller_graph_DEPENDENCIES) 
+	@rm -f controller-graph$(EXEEXT)
+	$(AM_V_CCLD)$(controller_graph_LINK) $(controller_graph_OBJECTS) $(controller_graph_LDADD) $(LIBS)
+
 text-color-example$(EXEEXT): $(text_color_example_OBJECTS) $(text_color_example_DEPENDENCIES) $(EXTRA_text_color_example_DEPENDENCIES) 
 	@rm -f text-color-example$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(text_color_example_OBJECTS) $(text_color_example_LDADD) $(LIBS)
@@ -587,6 +610,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/absolute-example.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio-example.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control-sources.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/controller_graph-controller-graph.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text-color-example.Po@am__quote@
 
 .c.o:
@@ -613,6 +637,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+controller_graph-controller-graph.o: controller-graph.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_graph_CFLAGS) $(CFLAGS) -MT controller_graph-controller-graph.o -MD -MP -MF $(DEPDIR)/controller_graph-controller-graph.Tpo -c -o controller_graph-controller-graph.o `test -f 'controller-graph.c' || echo '$(srcdir)/'`controller-graph.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/controller_graph-controller-graph.Tpo $(DEPDIR)/controller_graph-controller-graph.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='controller-graph.c' object='controller_graph-controller-graph.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_graph_CFLAGS) $(CFLAGS) -c -o controller_graph-controller-graph.o `test -f 'controller-graph.c' || echo '$(srcdir)/'`controller-graph.c
+
+controller_graph-controller-graph.obj: controller-graph.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_graph_CFLAGS) $(CFLAGS) -MT controller_graph-controller-graph.obj -MD -MP -MF $(DEPDIR)/controller_graph-controller-graph.Tpo -c -o controller_graph-controller-graph.obj `if test -f 'controller-graph.c'; then $(CYGPATH_W) 'controller-graph.c'; else $(CYGPATH_W) '$(srcdir)/controller-graph.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/controller_graph-controller-graph.Tpo $(DEPDIR)/controller_graph-controller-graph.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='controller-graph.c' object='controller_graph-controller-graph.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_graph_CFLAGS) $(CFLAGS) -c -o controller_graph-controller-graph.obj `if test -f 'controller-graph.c'; then $(CYGPATH_W) 'controller-graph.c'; else $(CYGPATH_W) '$(srcdir)/controller-graph.c'; fi`
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/tests/examples/controller/controller-graph.c b/tests/examples/controller/controller-graph.c
new file mode 100644
index 0000000..ef90a27
--- /dev/null
+++ b/tests/examples/controller/controller-graph.c
@@ -0,0 +1,185 @@
+/* GStreamer
+ * Copyright (C) <2015> Stefan Sauer <ensonic@users.sf.net>
+ *
+ * controller-graph: explore interpolation types
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <gst/gst.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+
+GtkWidget *graph;
+GstControlSource *cs = NULL;
+gdouble yval[] = { 0.0, 0.2, 0.8, 0.1, 0.1, 1.0 };
+
+static gboolean
+on_graph_draw (GtkWidget * widget, cairo_t * cr, gpointer user_data)
+{
+  GtkStyleContext *style = gtk_widget_get_style_context (widget);
+  GtkAllocation alloc;
+  gint x, y, w, h;
+  gdouble *data;
+  guint64 ts, ts_step;
+  gint i;
+  GstTimedValueControlSource *tvcs = (GstTimedValueControlSource *) cs;
+
+  gtk_widget_get_allocation (widget, &alloc);
+  w = alloc.width;
+  h = alloc.height;
+  gtk_render_background (style, cr, 0, 0, w, h);
+  // add some border:
+  x = 5;
+  y = 5;
+  w -= (x + x);
+  h -= (y + y);
+
+  // build graph
+  ts = G_GUINT64_CONSTANT (0);
+  ts_step = w / (G_N_ELEMENTS (yval) - 1);
+  gst_timed_value_control_source_unset_all (tvcs);
+  for (i = 0; i < G_N_ELEMENTS (yval); i++) {
+    gst_timed_value_control_source_set (tvcs, ts, yval[i]);
+    ts += ts_step;
+  }
+  data = g_new (gdouble, w);
+  gst_control_source_get_value_array (cs, 0, 1, w, data);
+
+  // draw background
+  cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
+  cairo_rectangle (cr, x, y, w, h);
+  cairo_stroke_preserve (cr);
+  cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+  cairo_fill (cr);
+
+
+  // plot graph
+  cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+  cairo_set_line_width (cr, 1.0);
+  cairo_move_to (cr, x, y + data[0] * h);
+  for (i = 1; i < w; i++) {
+    cairo_line_to (cr, x + i, y + CLAMP (data[i], 0.0, 1.0) * h);
+  }
+  cairo_stroke (cr);
+
+  // plot control points
+  ts = G_GUINT64_CONSTANT (0);
+  for (i = 0; i < G_N_ELEMENTS (yval); i++) {
+    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+    cairo_arc (cr, x + ts, y + yval[i] * h, 3.0, 0.0, 2 * M_PI);
+    cairo_stroke_preserve (cr);
+    cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+    cairo_fill (cr);
+    ts += ts_step;
+  }
+
+  g_free (data);
+
+  return TRUE;
+}
+
+static void
+on_mode_changed (GtkComboBox * combo, gpointer user_data)
+{
+  g_object_set (cs, "mode", gtk_combo_box_get_active (combo), NULL);
+  gtk_widget_queue_draw (graph);
+}
+
+static void
+on_yval_changed (GtkSpinButton * spin, gpointer user_data)
+{
+  guint ix = GPOINTER_TO_UINT (user_data);
+  yval[ix] = gtk_spin_button_get_value (spin);
+  gtk_widget_queue_draw (graph);
+}
+
+int
+main (int argc, char **argv)
+{
+  GtkWidget *window;
+  GtkWidget *layout, *label, *combo, *box, *spin;
+  GEnumClass *enum_class;
+  GEnumValue *enum_value;
+  gint i;
+
+  gst_init (&argc, &argv);
+  gtk_init (&argc, &argv);
+
+  cs = gst_interpolation_control_source_new ();
+  g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  g_signal_connect (G_OBJECT (window), "delete-event", gtk_main_quit, NULL);
+  gtk_window_set_default_size (GTK_WINDOW (window), 320, 240);
+  gtk_window_set_title (GTK_WINDOW (window),
+      "GstInterpolationControlSource demo");
+
+  layout = gtk_grid_new ();
+
+  graph = gtk_drawing_area_new ();
+  gtk_widget_add_events (graph, GDK_POINTER_MOTION_MASK);
+  g_signal_connect (graph, "draw", G_CALLBACK (on_graph_draw), NULL);
+  g_object_set (graph, "hexpand", TRUE, "vexpand", TRUE, "margin-bottom", 3,
+      NULL);
+  gtk_grid_attach (GTK_GRID (layout), graph, 0, 0, 2, 1);
+
+  // add controls to move the yvals
+  box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+  g_object_set (box, "homogeneous", TRUE, "margin-bottom", 3, NULL);
+  for (i = 0; i < G_N_ELEMENTS (yval); i++) {
+    spin = gtk_spin_button_new_with_range (0.0, 1.0, 0.05);
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), yval[i]);
+    g_signal_connect (spin, "changed", G_CALLBACK (on_yval_changed),
+        GUINT_TO_POINTER (i));
+    gtk_container_add (GTK_CONTAINER (box), spin);
+  }
+  gtk_grid_attach (GTK_GRID (layout), box, 0, 1, 2, 1);
+
+  // combo for interpolation modes
+  label = gtk_label_new ("interpolation mode");
+  gtk_grid_attach (GTK_GRID (layout), label, 0, 2, 1, 1);
+
+  combo = gtk_combo_box_text_new ();
+  enum_class = g_type_class_ref (GST_TYPE_INTERPOLATION_MODE);
+  for (i = enum_class->minimum; i <= enum_class->maximum; i++) {
+    if ((enum_value = g_enum_get_value (enum_class, i))) {
+      gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),
+          enum_value->value_nick);
+    }
+  }
+  gtk_combo_box_set_active (GTK_COMBO_BOX (combo),
+      GST_INTERPOLATION_MODE_LINEAR);
+  g_signal_connect (combo, "changed", G_CALLBACK (on_mode_changed), NULL);
+  g_object_set (combo, "hexpand", TRUE, "margin-left", 3, NULL);
+  gtk_grid_attach (GTK_GRID (layout), combo, 1, 2, 1, 1);
+
+  gtk_container_set_border_width (GTK_CONTAINER (window), 6);
+  gtk_container_add (GTK_CONTAINER (window), layout);
+  gtk_widget_show_all (window);
+
+  gtk_main ();
+
+  return 0;
+}
diff --git a/tests/examples/helloworld/Makefile.in b/tests/examples/helloworld/Makefile.in
index ceb1ba1..bc83a6c 100644
--- a/tests/examples/helloworld/Makefile.in
+++ b/tests/examples/helloworld/Makefile.in
@@ -327,6 +327,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/manual/Makefile.am b/tests/examples/manual/Makefile.am
index 0e4da6b..42ae9e5 100644
--- a/tests/examples/manual/Makefile.am
+++ b/tests/examples/manual/Makefile.am
@@ -14,9 +14,9 @@
 
 AM_TESTS_ENVIRONMENT = \
         $(REGISTRY_ENVIRONMENT)                                 \
-        GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
-        GST_PLUGIN_SYSTEM_PATH=                                 \
-        GST_PLUGIN_PATH=$(top_builddir)/plugins
+        GST_PLUGIN_SCANNER_1_0=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+        GST_PLUGIN_SYSTEM_PATH_1_0=                                 \
+        GST_PLUGIN_PATH_1_0=$(top_builddir)/plugins
 
 EXTRA_DIST = extract.pl
 
diff --git a/tests/examples/manual/Makefile.in b/tests/examples/manual/Makefile.in
index 16e7b1b..7e9a67b 100644
--- a/tests/examples/manual/Makefile.in
+++ b/tests/examples/manual/Makefile.in
@@ -688,6 +688,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -873,9 +875,9 @@
 
 AM_TESTS_ENVIRONMENT = \
         $(REGISTRY_ENVIRONMENT)                                 \
-        GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
-        GST_PLUGIN_SYSTEM_PATH=                                 \
-        GST_PLUGIN_PATH=$(top_builddir)/plugins
+        GST_PLUGIN_SCANNER_1_0=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+        GST_PLUGIN_SYSTEM_PATH_1_0=                                 \
+        GST_PLUGIN_PATH_1_0=$(top_builddir)/plugins
 
 EXTRA_DIST = extract.pl
 EXAMPLES = $(GNOME) elementcreate elementmake elementfactory \
diff --git a/tests/examples/manual/appsink.c b/tests/examples/manual/appsink.c
index 40e1207..5c569e7 100644
--- a/tests/examples/manual/appsink.c
+++ b/tests/examples/manual/appsink.c
@@ -38,7 +38,7 @@
 
   if (error != NULL) {
     g_print ("could not construct pipeline: %s\n", error->message);
-    g_error_free (error);
+    g_clear_error (&error);
     exit (-1);
   }
 
diff --git a/tests/examples/manual/effectswitch.c b/tests/examples/manual/effectswitch.c
index 21ee712..3b0e56b 100644
--- a/tests/examples/manual/effectswitch.c
+++ b/tests/examples/manual/effectswitch.c
@@ -22,11 +22,11 @@
   GstElement *next;
 
   if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) != GST_EVENT_EOS)
-    return GST_PAD_PROBE_OK;
+    return GST_PAD_PROBE_PASS;
 
   gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
 
-  /* push current event back into the queue */
+  /* push current effect back into the queue */
   g_queue_push_tail (&effects, gst_object_ref (cur_effect));
   /* take next effect from the queue */
   next = g_queue_pop_head (&effects);
@@ -105,7 +105,7 @@
 
       gst_message_parse_error (msg, &err, &dbg);
       gst_object_default_error (msg->src, err, dbg);
-      g_error_free (err);
+      g_clear_error (&err);
       g_free (dbg);
       g_main_loop_quit (loop);
       break;
@@ -135,6 +135,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_print ("Error initializing: %s\n", err->message);
+    g_clear_error (&err);
+    g_option_context_free (ctx);
     return 1;
   }
   g_option_context_free (ctx);
diff --git a/tests/examples/memory/Makefile.in b/tests/examples/memory/Makefile.in
index 46995f0..f96c1af 100644
--- a/tests/examples/memory/Makefile.in
+++ b/tests/examples/memory/Makefile.in
@@ -329,6 +329,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/netclock/Makefile.in b/tests/examples/netclock/Makefile.in
index 372dba1..aebc630 100644
--- a/tests/examples/netclock/Makefile.in
+++ b/tests/examples/netclock/Makefile.in
@@ -339,6 +339,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/ptp/Makefile.in b/tests/examples/ptp/Makefile.in
index efbcc73..6021b7c 100644
--- a/tests/examples/ptp/Makefile.in
+++ b/tests/examples/ptp/Makefile.in
@@ -330,6 +330,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/ptp/ptp-print-times.c b/tests/examples/ptp/ptp-print-times.c
index e6c666f..b7de82a 100644
--- a/tests/examples/ptp/ptp-print-times.c
+++ b/tests/examples/ptp/ptp-print-times.c
@@ -70,6 +70,7 @@
   g_option_context_add_group (opt_ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (opt_ctx, &argc, &argv, &err))
     g_error ("Error parsing options: %s", err->message);
+  g_clear_error (&err);
   g_option_context_free (opt_ctx);
 
   if (!gst_ptp_init (GST_PTP_CLOCK_ID_NONE, NULL))
diff --git a/tests/examples/stepping/Makefile.in b/tests/examples/stepping/Makefile.in
index d9988e8..3d97504 100644
--- a/tests/examples/stepping/Makefile.in
+++ b/tests/examples/stepping/Makefile.in
@@ -327,6 +327,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/streamiddemux/Makefile.in b/tests/examples/streamiddemux/Makefile.in
index 06054d2..c0e945d 100644
--- a/tests/examples/streamiddemux/Makefile.in
+++ b/tests/examples/streamiddemux/Makefile.in
@@ -329,6 +329,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/streams/Makefile.in b/tests/examples/streams/Makefile.in
index f2d7d8d..62d4abd 100644
--- a/tests/examples/streams/Makefile.in
+++ b/tests/examples/streams/Makefile.in
@@ -336,6 +336,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/misc/Makefile.in b/tests/misc/Makefile.in
index d22badc..a9f8313 100644
--- a/tests/misc/Makefile.in
+++ b/tests/misc/Makefile.in
@@ -273,6 +273,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 46f814d..ffea17d 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,12 +1,17 @@
 
 bin_PROGRAMS = \
 	gst-inspect-@GST_API_VERSION@ \
+	gst-stats-@GST_API_VERSION@ \
 	gst-typefind-@GST_API_VERSION@
 
 gst_inspect_@GST_API_VERSION@_SOURCES = gst-inspect.c tools.h
 gst_inspect_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
 gst_inspect_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
 
+gst_stats_@GST_API_VERSION@_SOURCES = gst-stats.c tools.h
+gst_stats_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_stats_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
+
 gst_typefind_@GST_API_VERSION@_SOURCES = gst-typefind.c tools.h
 gst_typefind_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
 gst_typefind_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
diff --git a/tools/Makefile.in b/tools/Makefile.in
index b32f33f..7b96942 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -92,6 +92,7 @@
 host_triplet = @host@
 target_triplet = @target@
 bin_PROGRAMS = gst-inspect-@GST_API_VERSION@$(EXEEXT) \
+	gst-stats-@GST_API_VERSION@$(EXEEXT) \
 	gst-typefind-@GST_API_VERSION@$(EXEEXT) $(am__EXEEXT_1)
 @GST_DISABLE_PARSE_FALSE@am__append_1 = gst-launch-@GST_API_VERSION@
 @GST_DISABLE_PARSE_FALSE@am__append_2 = gst-launch-@GST_API_VERSION@.1
@@ -168,6 +169,15 @@
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(gst_launch_@GST_API_VERSION@_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
+am_gst_stats_@GST_API_VERSION@_OBJECTS =  \
+	gst_stats_@GST_API_VERSION@-gst-stats.$(OBJEXT)
+gst_stats_@GST_API_VERSION@_OBJECTS =  \
+	$(am_gst_stats_@GST_API_VERSION@_OBJECTS)
+gst_stats_@GST_API_VERSION@_DEPENDENCIES = $(am__DEPENDENCIES_1)
+gst_stats_@GST_API_VERSION@_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_gst_typefind_@GST_API_VERSION@_OBJECTS =  \
 	gst_typefind_@GST_API_VERSION@-gst-typefind.$(OBJEXT)
 gst_typefind_@GST_API_VERSION@_OBJECTS =  \
@@ -214,9 +224,11 @@
 am__v_CCLD_1 = 
 SOURCES = $(gst_inspect_@GST_API_VERSION@_SOURCES) \
 	$(gst_launch_@GST_API_VERSION@_SOURCES) \
+	$(gst_stats_@GST_API_VERSION@_SOURCES) \
 	$(gst_typefind_@GST_API_VERSION@_SOURCES)
 DIST_SOURCES = $(gst_inspect_@GST_API_VERSION@_SOURCES) \
 	$(am__gst_launch_@GST_API_VERSION@_SOURCES_DIST) \
+	$(gst_stats_@GST_API_VERSION@_SOURCES) \
 	$(gst_typefind_@GST_API_VERSION@_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -393,6 +405,8 @@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
 HAVE_CAP = @HAVE_CAP@
 HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
 HAVE_DVIPS = @HAVE_DVIPS@
@@ -566,6 +580,9 @@
 gst_inspect_@GST_API_VERSION@_SOURCES = gst-inspect.c tools.h
 gst_inspect_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
 gst_inspect_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
+gst_stats_@GST_API_VERSION@_SOURCES = gst-stats.c tools.h
+gst_stats_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_stats_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
 gst_typefind_@GST_API_VERSION@_SOURCES = gst-typefind.c tools.h
 gst_typefind_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
 gst_typefind_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
@@ -677,6 +694,10 @@
 	@rm -f gst-launch-@GST_API_VERSION@$(EXEEXT)
 	$(AM_V_CCLD)$(gst_launch_@GST_API_VERSION@_LINK) $(gst_launch_@GST_API_VERSION@_OBJECTS) $(gst_launch_@GST_API_VERSION@_LDADD) $(LIBS)
 
+gst-stats-@GST_API_VERSION@$(EXEEXT): $(gst_stats_@GST_API_VERSION@_OBJECTS) $(gst_stats_@GST_API_VERSION@_DEPENDENCIES) $(EXTRA_gst_stats_@GST_API_VERSION@_DEPENDENCIES) 
+	@rm -f gst-stats-@GST_API_VERSION@$(EXEEXT)
+	$(AM_V_CCLD)$(gst_stats_@GST_API_VERSION@_LINK) $(gst_stats_@GST_API_VERSION@_OBJECTS) $(gst_stats_@GST_API_VERSION@_LDADD) $(LIBS)
+
 gst-typefind-@GST_API_VERSION@$(EXEEXT): $(gst_typefind_@GST_API_VERSION@_OBJECTS) $(gst_typefind_@GST_API_VERSION@_DEPENDENCIES) $(EXTRA_gst_typefind_@GST_API_VERSION@_DEPENDENCIES) 
 	@rm -f gst-typefind-@GST_API_VERSION@$(EXEEXT)
 	$(AM_V_CCLD)$(gst_typefind_@GST_API_VERSION@_LINK) $(gst_typefind_@GST_API_VERSION@_OBJECTS) $(gst_typefind_@GST_API_VERSION@_LDADD) $(LIBS)
@@ -689,6 +710,7 @@
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_inspect_@GST_API_VERSION@-gst-inspect.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_launch_@GST_API_VERSION@-gst-launch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Po@am__quote@
 
 .c.o:
@@ -743,6 +765,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_launch_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -c -o gst_launch_@GST_API_VERSION@-gst-launch.obj `if test -f 'gst-launch.c'; then $(CYGPATH_W) 'gst-launch.c'; else $(CYGPATH_W) '$(srcdir)/gst-launch.c'; fi`
 
+gst_stats_@GST_API_VERSION@-gst-stats.o: gst-stats.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -MT gst_stats_@GST_API_VERSION@-gst-stats.o -MD -MP -MF $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo -c -o gst_stats_@GST_API_VERSION@-gst-stats.o `test -f 'gst-stats.c' || echo '$(srcdir)/'`gst-stats.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gst-stats.c' object='gst_stats_@GST_API_VERSION@-gst-stats.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -c -o gst_stats_@GST_API_VERSION@-gst-stats.o `test -f 'gst-stats.c' || echo '$(srcdir)/'`gst-stats.c
+
+gst_stats_@GST_API_VERSION@-gst-stats.obj: gst-stats.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -MT gst_stats_@GST_API_VERSION@-gst-stats.obj -MD -MP -MF $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo -c -o gst_stats_@GST_API_VERSION@-gst-stats.obj `if test -f 'gst-stats.c'; then $(CYGPATH_W) 'gst-stats.c'; else $(CYGPATH_W) '$(srcdir)/gst-stats.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gst-stats.c' object='gst_stats_@GST_API_VERSION@-gst-stats.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -c -o gst_stats_@GST_API_VERSION@-gst-stats.obj `if test -f 'gst-stats.c'; then $(CYGPATH_W) 'gst-stats.c'; else $(CYGPATH_W) '$(srcdir)/gst-stats.c'; fi`
+
 gst_typefind_@GST_API_VERSION@-gst-typefind.o: gst-typefind.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefind_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -MT gst_typefind_@GST_API_VERSION@-gst-typefind.o -MD -MP -MF $(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Tpo -c -o gst_typefind_@GST_API_VERSION@-gst-typefind.o `test -f 'gst-typefind.c' || echo '$(srcdir)/'`gst-typefind.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Tpo $(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Po
diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c
index 141c7bd..845f52e 100644
--- a/tools/gst-inspect.c
+++ b/tools/gst-inspect.c
@@ -1141,6 +1141,7 @@
   GList *features, *origlist;
   gint num_features = 0;
   gint num_elements = 0;
+  gint num_tracers = 0;
   gint num_typefinders = 0;
   gint num_devproviders = 0;
   gint num_other = 0;
@@ -1191,6 +1192,10 @@
           gst_device_provider_factory_get_metadata (factory,
               GST_ELEMENT_METADATA_LONGNAME));
       num_devproviders++;
+    } else if (GST_IS_TRACER_FACTORY (feature)) {
+      n_print ("  %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
+          g_type_name (G_OBJECT_TYPE (feature)));
+      num_tracers++;
     } else if (feature) {
       n_print ("  %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
           g_type_name (G_OBJECT_TYPE (feature)));
@@ -1210,6 +1215,8 @@
     n_print ("  +-- %d typefinders\n", num_typefinders);
   if (num_devproviders > 0)
     n_print ("  +-- %d device providers\n", num_devproviders);
+  if (num_tracers > 0)
+    n_print ("  +-- %d tracers\n", num_tracers);
   if (num_other > 0)
     n_print ("  +-- %d other objects\n", num_other);
 
@@ -1228,6 +1235,12 @@
     n_print ("%s: a typefind function\n", element_name);
     return 0;
   }
+  feature = gst_registry_find_feature (gst_registry_get (), element_name,
+      GST_TYPE_TRACER_FACTORY);
+  if (feature) {
+    n_print ("%s: a tracer module\n", element_name);
+    return 0;
+  }
 
   return -1;
 }
@@ -1499,6 +1512,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_printerr ("Error initializing: %s\n", err->message);
+    g_clear_error (&err);
+    g_option_context_free (ctx);
     return -1;
   }
   g_option_context_free (ctx);
@@ -1615,7 +1630,7 @@
             }
           } else {
             g_printerr (_("Could not load plugin file: %s\n"), error->message);
-            g_error_free (error);
+            g_clear_error (&error);
             return -1;
           }
         } else {
diff --git a/tools/gst-launch.1.in b/tools/gst-launch.1.in
index c04ddc6..409727f 100644
--- a/tools/gst-launch.1.in
+++ b/tools/gst-launch.1.in
@@ -429,7 +429,8 @@
 When set to a filesystem path, store 'dot' files of pipeline graphs there.
 These can then later be converted into an image using the 'dot' utility from
 the graphviz set of tools, like this: dot foo.dot -Tsvg -o foo.svg (png or jpg
-are also possible as output format)
+are also possible as output format). There is also a utility called 'xdot'
+which allows you to view the .dot file directly without converting it first.
 .TP
 \fBGST_REGISTRY\fR
 Path of the plugin registry file. Default is
diff --git a/tools/gst-launch.c b/tools/gst-launch.c
index 7c0da04..859f9db 100644
--- a/tools/gst-launch.c
+++ b/tools/gst-launch.c
@@ -325,7 +325,7 @@
   if (debug != NULL)
     g_printerr (_("Additional debug info:\n%s\n"), debug);
 
-  g_error_free (err);
+  g_clear_error (&err);
   g_free (debug);
   g_free (name);
 }
@@ -650,7 +650,7 @@
         if (debug) {
           PRINT (_("INFO:\n%s\n"), debug);
         }
-        g_error_free (gerror);
+        g_clear_error (&gerror);
         g_free (debug);
         g_free (name);
         break;
@@ -669,7 +669,7 @@
         if (debug) {
           PRINT (_("Additional debug info:\n%s\n"), debug);
         }
-        g_error_free (gerror);
+        g_clear_error (&gerror);
         g_free (debug);
         g_free (name);
         break;
@@ -974,6 +974,8 @@
       g_printerr ("Error initializing: %s\n", GST_STR_NULL (err->message));
     else
       g_printerr ("Error initializing: Unknown error!\n");
+    g_clear_error (&error);
+    g_option_context_free (ctx);
     exit (1);
   }
   g_option_context_free (ctx);
@@ -1001,7 +1003,7 @@
     if (error) {
       g_printerr (_("ERROR: pipeline could not be constructed: %s.\n"),
           GST_STR_NULL (error->message));
-      g_error_free (error);
+      g_clear_error (&error);
     } else {
       g_printerr (_("ERROR: pipeline could not be constructed.\n"));
     }
@@ -1009,7 +1011,7 @@
   } else if (error) {
     g_printerr (_("WARNING: erroneous pipeline: %s\n"),
         GST_STR_NULL (error->message));
-    g_error_free (error);
+    g_clear_error (&error);
     return 1;
   }
 
diff --git a/tools/gst-stats.c b/tools/gst-stats.c
new file mode 100644
index 0000000..f5efdda
--- /dev/null
+++ b/tools/gst-stats.c
@@ -0,0 +1,900 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gst-stats.c: statistics tracing front end
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "tools.h"
+
+/* log parser */
+static GRegex *raw_log = NULL;
+static GRegex *ansi_log = NULL;
+
+/* global statistics */
+static GHashTable *threads = NULL;
+static GPtrArray *elements = NULL;
+static GPtrArray *pads = NULL;
+static guint64 num_buffers = 0, num_events = 0, num_messages = 0, num_queries =
+    0;
+static guint num_elements = 0, num_bins = 0, num_pads = 0, num_ghostpads = 0;
+static GstClockTime last_ts = G_GUINT64_CONSTANT (0);
+static guint total_cpuload = 0;
+static gboolean have_cpuload = FALSE;
+
+typedef struct
+{
+  /* human readable pad name and details */
+  gchar *name, *type_name;
+  guint index;
+  gboolean is_ghost_pad;
+  GstPadDirection dir;
+  /* buffer statistics */
+  guint num_buffers;
+  guint num_live, num_decode_only, num_discont, num_resync, num_corrupted,
+      num_marker, num_header, num_gap, num_droppable, num_delta;
+  guint min_size, max_size, avg_size;
+  /* first and last activity on the pad, expected next_ts */
+  GstClockTime first_ts, last_ts, next_ts;
+  /* in which thread does it operate */
+  guint thread_id;
+  /* hierarchy */
+  guint parent_ix;
+} GstPadStats;
+
+typedef struct
+{
+  /* human readable element name */
+  gchar *name, *type_name;
+  guint index;
+  gboolean is_bin;
+  /* buffer statistics */
+  guint recv_buffers, sent_buffers;
+  guint64 recv_bytes, sent_bytes;
+  /* event, message statistics */
+  guint num_events, num_messages, num_queries;
+  /* first activity on the element */
+  GstClockTime first_ts, last_ts;
+  /* hierarchy */
+  guint parent_ix;
+} GstElementStats;
+
+typedef struct
+{
+  /* time spend in this thread */
+  GstClockTime tthread;
+  guint cpuload;
+} GstThreadStats;
+
+/* stats helper */
+
+static void
+free_element_stats (gpointer data)
+{
+  g_slice_free (GstElementStats, data);
+}
+
+static inline GstElementStats *
+get_element_stats (guint ix)
+{
+  return (ix != G_MAXUINT) ? g_ptr_array_index (elements, ix) : NULL;
+}
+
+static inline GstPadStats *
+get_pad_stats (guint ix)
+{
+  return (ix != G_MAXUINT) ? g_ptr_array_index (pads, ix) : NULL;
+}
+
+static void
+free_pad_stats (gpointer data)
+{
+  g_slice_free (GstPadStats, data);
+}
+
+static inline GstThreadStats *
+get_thread_stats (guint id)
+{
+  GstThreadStats *stats = g_hash_table_lookup (threads, GUINT_TO_POINTER (id));
+
+  if (G_UNLIKELY (!stats)) {
+    stats = g_slice_new0 (GstThreadStats);
+    stats->tthread = GST_CLOCK_TIME_NONE;
+    g_hash_table_insert (threads, GUINT_TO_POINTER (id), stats);
+  }
+  return stats;
+}
+
+static void
+new_pad_stats (GstStructure * s)
+{
+  GstPadStats *stats;
+  guint ix, parent_ix;
+  gchar *type, *name;
+  gboolean is_ghost_pad;
+  GstPadDirection dir;
+  guint thread_id;
+
+  gst_structure_get (s,
+      "ix", G_TYPE_UINT, &ix,
+      "parent-ix", G_TYPE_UINT, &parent_ix,
+      "name", G_TYPE_STRING, &name,
+      "type", G_TYPE_STRING, &type,
+      "is-ghostpad", G_TYPE_BOOLEAN, &is_ghost_pad,
+      "pad-direction", GST_TYPE_PAD_DIRECTION, &dir,
+      "thread-id", G_TYPE_UINT, &thread_id, NULL);
+
+  stats = g_slice_new0 (GstPadStats);
+  if (is_ghost_pad)
+    num_ghostpads++;
+  num_pads++;
+  stats->name = name;
+  stats->type_name = type;
+  stats->index = ix;
+  stats->is_ghost_pad = is_ghost_pad;
+  stats->dir = dir;
+  stats->min_size = G_MAXUINT;
+  stats->first_ts = stats->last_ts = stats->next_ts = GST_CLOCK_TIME_NONE;
+  stats->thread_id = thread_id;
+  stats->parent_ix = parent_ix;
+
+  if (pads->len <= ix)
+    g_ptr_array_set_size (pads, ix + 1);
+  g_ptr_array_index (pads, ix) = stats;
+}
+
+static void
+new_element_stats (GstStructure * s)
+{
+  GstElementStats *stats;
+  guint ix, parent_ix;
+  gchar *type, *name;
+  gboolean is_bin;
+
+  gst_structure_get (s,
+      "ix", G_TYPE_UINT, &ix,
+      "parent-ix", G_TYPE_UINT, &parent_ix,
+      "name", G_TYPE_STRING, &name,
+      "type", G_TYPE_STRING, &type, "is-bin", G_TYPE_BOOLEAN, &is_bin, NULL);
+
+  stats = g_slice_new0 (GstElementStats);
+  if (is_bin)
+    num_bins++;
+  num_elements++;
+  stats->index = ix;
+  stats->name = name;
+  stats->type_name = type;
+  stats->is_bin = is_bin;
+  stats->first_ts = GST_CLOCK_TIME_NONE;
+  stats->parent_ix = parent_ix;
+
+  if (elements->len <= ix)
+    g_ptr_array_set_size (elements, ix + 1);
+  g_ptr_array_index (elements, ix) = stats;
+}
+
+static void
+free_thread_stats (gpointer data)
+{
+  g_slice_free (GstThreadStats, data);
+}
+
+static void
+do_pad_stats (GstPadStats * stats, guint elem_ix, guint size, guint64 ts,
+    guint64 buffer_ts, guint64 buffer_dur, GstBufferFlags buffer_flags)
+{
+  gulong avg_size;
+
+  /* parentage */
+  if (stats->parent_ix == G_MAXUINT) {
+    stats->parent_ix = elem_ix;
+  }
+
+  if (stats->thread_id) {
+    get_thread_stats (stats->thread_id);
+  }
+
+  /* size stats */
+  avg_size = (((gulong) stats->avg_size * (gulong) stats->num_buffers) + size);
+  stats->num_buffers++;
+  stats->avg_size = (guint) (avg_size / stats->num_buffers);
+  if (size < stats->min_size)
+    stats->min_size = size;
+  else if (size > stats->max_size)
+    stats->max_size = size;
+  /* time stats */
+  if (!GST_CLOCK_TIME_IS_VALID (stats->last_ts))
+    stats->first_ts = ts;
+  stats->last_ts = ts;
+  /* flag stats */
+  if (buffer_flags & GST_BUFFER_FLAG_LIVE)
+    stats->num_live++;
+  if (buffer_flags & GST_BUFFER_FLAG_DECODE_ONLY)
+    stats->num_decode_only++;
+  if (buffer_flags & GST_BUFFER_FLAG_DISCONT)
+    stats->num_discont++;
+  if (buffer_flags & GST_BUFFER_FLAG_RESYNC)
+    stats->num_resync++;
+  if (buffer_flags & GST_BUFFER_FLAG_CORRUPTED)
+    stats->num_corrupted++;
+  if (buffer_flags & GST_BUFFER_FLAG_MARKER)
+    stats->num_marker++;
+  if (buffer_flags & GST_BUFFER_FLAG_HEADER)
+    stats->num_header++;
+  if (buffer_flags & GST_BUFFER_FLAG_GAP)
+    stats->num_gap++;
+  if (buffer_flags & GST_BUFFER_FLAG_DROPPABLE)
+    stats->num_droppable++;
+  if (buffer_flags & GST_BUFFER_FLAG_DELTA_UNIT)
+    stats->num_delta++;
+  /* update timestamps */
+  if (GST_CLOCK_TIME_IS_VALID (buffer_ts) &&
+      GST_CLOCK_TIME_IS_VALID (buffer_dur)) {
+    stats->next_ts = buffer_ts + buffer_dur;
+  } else {
+    stats->next_ts = GST_CLOCK_TIME_NONE;
+  }
+}
+
+static void
+do_element_stats (GstElementStats * stats, GstElementStats * peer_stats,
+    guint size, guint64 ts)
+{
+  stats->sent_buffers++;
+  peer_stats->recv_buffers++;
+  stats->sent_bytes += size;
+  peer_stats->recv_bytes += size;
+  /* time stats */
+  if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (stats->first_ts))) {
+    stats->first_ts = ts;
+  }
+  if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (peer_stats->first_ts))) {
+    peer_stats->first_ts = ts + 1;
+  }
+}
+
+static void
+do_buffer_stats (GstStructure * s)
+{
+  guint64 ts, buffer_pts, buffer_dur;
+  guint pad_ix, elem_ix, peer_elem_ix;
+  guint size;
+  GstBufferFlags buffer_flags;
+  GstPadStats *pad_stats;
+  GstElementStats *elem_stats, *peer_elem_stats;
+
+  num_buffers++;
+  gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+      "pad-ix", G_TYPE_UINT, &pad_ix,
+      "elem-ix", G_TYPE_UINT, &elem_ix,
+      "peer-elem-ix", G_TYPE_UINT, &peer_elem_ix,
+      "buffer-size", G_TYPE_UINT, &size,
+      "buffer-pts", G_TYPE_UINT64, &buffer_pts,
+      "buffer-duration", G_TYPE_UINT64, &buffer_dur,
+      "buffer-flags", GST_TYPE_BUFFER_FLAGS, &buffer_flags, NULL);
+  last_ts = MAX (last_ts, ts);
+  if (!(pad_stats = get_pad_stats (pad_ix))) {
+    GST_WARNING ("no pad stats found for ix=%u", pad_ix);
+    return;
+  }
+  if (!(elem_stats = get_element_stats (elem_ix))) {
+    GST_WARNING ("no element stats found for ix=%u", elem_ix);
+    return;
+  }
+  if (!(peer_elem_stats = get_element_stats (peer_elem_ix))) {
+    GST_WARNING ("no element stats found for ix=%u", peer_elem_ix);
+    return;
+  }
+  do_pad_stats (pad_stats, elem_ix, size, ts, buffer_pts, buffer_dur,
+      buffer_flags);
+  if (pad_stats->dir == GST_PAD_SRC) {
+    /* push */
+    do_element_stats (elem_stats, peer_elem_stats, size, ts);
+  } else {
+    /* pull */
+    do_element_stats (peer_elem_stats, elem_stats, size, ts);
+  }
+}
+
+static void
+do_event_stats (GstStructure * s)
+{
+  guint64 ts;
+  guint pad_ix, elem_ix;
+  GstPadStats *pad_stats;
+  GstElementStats *elem_stats;
+
+  num_events++;
+  gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+      "pad-ix", G_TYPE_UINT, &pad_ix, "elem-ix", G_TYPE_UINT, &elem_ix, NULL);
+  last_ts = MAX (last_ts, ts);
+  if (!(pad_stats = get_pad_stats (pad_ix))) {
+    GST_WARNING ("no pad stats found for ix=%u", pad_ix);
+    return;
+  }
+  if (!(elem_stats = get_element_stats (elem_ix))) {
+    // e.g. reconfigure events are send over unparented pads
+    GST_INFO ("no element stats found for ix=%u", elem_ix);
+    return;
+  }
+  elem_stats->num_events++;
+}
+
+static void
+do_message_stats (GstStructure * s)
+{
+  guint64 ts;
+  guint elem_ix;
+  GstElementStats *elem_stats;
+
+  num_messages++;
+  gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+      "elem-ix", G_TYPE_UINT, &elem_ix, NULL);
+  last_ts = MAX (last_ts, ts);
+  if (!(elem_stats = get_element_stats (elem_ix))) {
+    GST_WARNING ("no element stats found for ix=%u", elem_ix);
+    return;
+  }
+  elem_stats->num_messages++;
+}
+
+static void
+do_query_stats (GstStructure * s)
+{
+  guint64 ts;
+  guint elem_ix;
+  GstElementStats *elem_stats;
+
+  num_queries++;
+  gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+      "elem-ix", G_TYPE_UINT, &elem_ix, NULL);
+  last_ts = MAX (last_ts, ts);
+  if (!(elem_stats = get_element_stats (elem_ix))) {
+    GST_WARNING ("no element stats found for ix=%u", elem_ix);
+    return;
+  }
+  elem_stats->num_queries++;
+}
+
+static void
+do_thread_rusage_stats (GstStructure * s)
+{
+  guint64 ts, tthread;
+  guint thread_id, cpuload;
+  GstThreadStats *thread_stats;
+
+  gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+      "thread-id", G_TYPE_UINT, &thread_id,
+      "average-cpuload", G_TYPE_UINT, &cpuload, "time", G_TYPE_UINT64, &tthread,
+      NULL);
+  thread_stats = get_thread_stats (thread_id);
+  thread_stats->cpuload = cpuload;
+  thread_stats->tthread = tthread;
+  last_ts = MAX (last_ts, ts);
+}
+
+static void
+do_proc_rusage_stats (GstStructure * s)
+{
+  guint64 ts;
+
+  gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+      "average-cpuload", G_TYPE_UINT, &total_cpuload, NULL);
+  last_ts = MAX (last_ts, ts);
+  have_cpuload = TRUE;
+}
+
+/* reporting */
+
+static gint
+find_pad_stats_for_thread (gconstpointer value, gconstpointer user_data)
+{
+  const GstPadStats *stats = (const GstPadStats *) value;
+
+  if ((stats->thread_id == GPOINTER_TO_UINT (user_data)) &&
+      (stats->num_buffers)) {
+    return 0;
+  }
+  return 1;
+}
+
+static void
+print_pad_stats (gpointer value, gpointer user_data)
+{
+  GstPadStats *stats = (GstPadStats *) value;
+
+  if (stats->thread_id == GPOINTER_TO_UINT (user_data)) {
+    /* there seem to be some temporary pads */
+    if (stats->num_buffers) {
+      GstClockTimeDiff running =
+          GST_CLOCK_DIFF (stats->first_ts, stats->last_ts);
+      GstElementStats *elem_stats = get_element_stats (stats->parent_ix);
+      gchar fullname[30 + 1];
+
+      g_snprintf (fullname, 30, "%s.%s", elem_stats->name, stats->name);
+
+      printf
+          ("    %c %-30.30s: buffers %7u (live %5u,dec %5u,dis %5u,res %5u,"
+          "cor %5u,mar %5u,hdr %5u,gap %5u,drop %5u,dlt %5u),",
+          (stats->dir == GST_PAD_SRC) ? '>' : '<', fullname, stats->num_buffers,
+          stats->num_live, stats->num_decode_only, stats->num_discont,
+          stats->num_resync, stats->num_corrupted, stats->num_marker,
+          stats->num_header, stats->num_gap, stats->num_droppable,
+          stats->num_delta);
+      if (stats->min_size == stats->max_size) {
+        printf (" size (min/avg/max) ......./%7u/.......,", stats->avg_size);
+      } else {
+        printf (" size (min/avg/max) %7u/%7u/%7u,",
+            stats->min_size, stats->avg_size, stats->max_size);
+      }
+      printf (" time %" GST_TIME_FORMAT ","
+          " bytes/sec %lf\n",
+          GST_TIME_ARGS (running),
+          ((gdouble) (stats->num_buffers * stats->avg_size) * GST_SECOND) /
+          ((gdouble) running));
+    }
+  }
+}
+
+static void
+print_thread_stats (gpointer key, gpointer value, gpointer user_data)
+{
+  GSList *list = user_data;
+  GSList *node = g_slist_find_custom (list, key, find_pad_stats_for_thread);
+  GstThreadStats *stats = (GstThreadStats *) value;
+
+  /* skip stats if there are no pads for that thread (e.g. a pipeline) */
+  if (!node)
+    return;
+
+  printf ("Thread %p Statistics:\n", key);
+  if (GST_CLOCK_TIME_IS_VALID (stats->tthread)) {
+    printf ("  Time: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (stats->tthread));
+    printf ("  Avg CPU load: %4.1f %%\n", (gfloat) stats->cpuload / 10.0);
+  }
+
+  puts ("  Pad Statistics:");
+  g_slist_foreach (node, print_pad_stats, key);
+}
+
+static void
+print_element_stats (gpointer value, gpointer user_data)
+{
+  GstElementStats *stats = (GstElementStats *) value;
+
+  /* skip temporary elements */
+  if (stats->first_ts != GST_CLOCK_TIME_NONE) {
+    gchar fullname[45 + 1];
+
+    g_snprintf (fullname, 45, "%s:%s", stats->type_name, stats->name);
+
+    printf ("  %-45s:", fullname);
+    if (stats->recv_buffers)
+      printf (" buffers in/out %7u", stats->recv_buffers);
+    else
+      printf (" buffers in/out %7s", "-");
+    if (stats->sent_buffers)
+      printf ("/%7u", stats->sent_buffers);
+    else
+      printf ("/%7s", "-");
+    if (stats->recv_bytes)
+      printf (" bytes in/out %12" G_GUINT64_FORMAT, stats->recv_bytes);
+    else
+      printf (" bytes in/out %12s", "-");
+    if (stats->sent_bytes)
+      printf ("/%12" G_GUINT64_FORMAT, stats->sent_bytes);
+    else
+      printf ("/%12s", "-");
+    printf (" first activity %" GST_TIME_FORMAT ", "
+        " ev/msg/qry sent %5u/%5u/%5u\n", GST_TIME_ARGS (stats->first_ts),
+        stats->num_events, stats->num_messages, stats->num_queries);
+  }
+}
+
+static void
+accum_element_stats (gpointer value, gpointer user_data)
+{
+  GstElementStats *stats = (GstElementStats *) value;
+
+  if (stats->parent_ix != G_MAXUINT) {
+    GstElementStats *parent_stats = get_element_stats (stats->parent_ix);
+
+    parent_stats->num_events += stats->num_events;
+    parent_stats->num_messages += stats->num_messages;
+    parent_stats->num_queries += stats->num_queries;
+    if (!GST_CLOCK_TIME_IS_VALID (parent_stats->first_ts)) {
+      parent_stats->first_ts = stats->first_ts;
+    } else if (GST_CLOCK_TIME_IS_VALID (stats->first_ts)) {
+      parent_stats->first_ts = MIN (parent_stats->first_ts, stats->first_ts);
+    }
+    if (!GST_CLOCK_TIME_IS_VALID (parent_stats->last_ts)) {
+      parent_stats->last_ts = stats->last_ts;
+    } else if (GST_CLOCK_TIME_IS_VALID (stats->last_ts)) {
+      parent_stats->last_ts = MAX (parent_stats->last_ts, stats->last_ts);
+    }
+  }
+}
+
+/* sorting */
+
+static gint
+sort_pad_stats_by_first_activity (gconstpointer ps1, gconstpointer ps2)
+{
+  GstPadStats *s1 = (GstPadStats *) ps1;
+  GstPadStats *s2 = (GstPadStats *) ps2;
+
+  gint order = GST_CLOCK_DIFF (s2->first_ts, s1->first_ts);
+
+  if (!order) {
+    order = s1->dir - s2->dir;
+  }
+  return (order);
+}
+
+static void
+sort_pad_stats (gpointer value, gpointer user_data)
+{
+  GSList **list = user_data;
+
+  *list =
+      g_slist_insert_sorted (*list, value, sort_pad_stats_by_first_activity);
+}
+
+static gint
+sort_element_stats_by_first_activity (gconstpointer es1, gconstpointer es2)
+{
+  return (GST_CLOCK_DIFF (((GstElementStats *) es2)->first_ts,
+          ((GstElementStats *) es1)->first_ts));
+}
+
+static void
+sort_bin_stats (gpointer value, gpointer user_data)
+{
+  if (((GstElementStats *) value)->is_bin) {
+    GSList **list = user_data;
+
+    *list =
+        g_slist_insert_sorted (*list, value,
+        sort_element_stats_by_first_activity);
+  }
+}
+
+static void
+sort_element_stats (gpointer value, gpointer user_data)
+{
+  if (!(((GstElementStats *) value)->is_bin)) {
+    GSList **list = user_data;
+
+    *list =
+        g_slist_insert_sorted (*list, value,
+        sort_element_stats_by_first_activity);
+  }
+}
+
+static gboolean
+check_bin_parent (gpointer key, gpointer value, gpointer user_data)
+{
+  GstElementStats *stats = (GstElementStats *) value;
+
+  return (stats->parent_ix == GPOINTER_TO_UINT (user_data));
+}
+
+static gboolean
+process_leaf_bins (gpointer key, gpointer value, gpointer user_data)
+{
+  GHashTable *accum_bins = user_data;
+
+  /* if we find no bin that has this bin as a parent ... */
+  if (!g_hash_table_find (accum_bins, check_bin_parent, key)) {
+    /* accumulate stats to the parent and remove */
+    accum_element_stats (value, NULL);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/* main */
+
+static gboolean
+init (void)
+{
+  /* compile the parser regexps */
+  /* 0:00:00.004925027 31586      0x1c5c600 DEBUG           GST_REGISTRY gstregistry.c:463:gst_registry_add_plugin:<registry0> adding plugin 0x1c79160 for filename "/usr/lib/gstreamer-1.0/libgstxxx.so" */
+  raw_log = g_regex_new (
+      /* 1: ts */
+      "^([0-9:.]+) +"
+      /* 2: pid */
+      "([0-9]+) +"
+      /* 3: thread */
+      "(0x[0-9a-fA-F]+) +"
+      /* 4: level */
+      "([A-Z]+) +"
+      /* 5: category */
+      "([a-zA-Z_-]+) +"
+      /* 6: file:line:func: */
+      "([^:]+:[0-9]+:[^:]+:)"
+      /* 7: (obj)? log-text */
+      "(.*)$", 0, 0, NULL);
+  if (!raw_log) {
+    GST_WARNING ("failed to compile the 'raw' parser");
+    return FALSE;
+  }
+
+  ansi_log = g_regex_new (
+      /* 1: ts */
+      "^([0-9:.]+) +"
+      /* 2: pid */
+      "\\\e\\\[[0-9;]+m *([0-9]+)\\\e\\\[00m +"
+      /* 3: thread */
+      "(0x[0-9a-fA-F]+) +"
+      /* 4: level */
+      "(?:\\\e\\\[[0-9;]+m)?([A-Z]+) +\\\e\\\[00m +"
+      /* 5: category */
+      "\\\e\\\[[0-9;]+m +([a-zA-Z_-]+) +"
+      /* 6: file:line:func: */
+      "([^:]+:[0-9]+:[^:]+:)(?:\\\e\\\[00m)?"
+      /* 7: (obj)? log-text */
+      "(.*)$", 0, 0, NULL);
+  if (!raw_log) {
+    GST_WARNING ("failed to compile the 'ansi' parser");
+    return FALSE;
+  }
+
+  elements = g_ptr_array_new_with_free_func (free_element_stats);
+  pads = g_ptr_array_new_with_free_func (free_pad_stats);
+  threads = g_hash_table_new_full (NULL, NULL, NULL, free_thread_stats);
+
+  return TRUE;
+}
+
+static void
+done (void)
+{
+  if (pads)
+    g_ptr_array_free (pads, TRUE);
+  if (elements)
+    g_ptr_array_free (elements, TRUE);
+  if (threads)
+    g_hash_table_destroy (threads);
+
+  if (raw_log)
+    g_regex_unref (raw_log);
+  if (ansi_log)
+    g_regex_unref (ansi_log);
+}
+
+static void
+print_stats (void)
+{
+  guint num_threads = g_hash_table_size (threads);
+
+  /* print overall stats */
+  puts ("\nOverall Statistics:");
+  printf ("Number of Threads: %u\n", num_threads);
+  printf ("Number of Elements: %u\n", num_elements - num_bins);
+  printf ("Number of Bins: %u\n", num_bins);
+  printf ("Number of Pads: %u\n", num_pads - num_ghostpads);
+  printf ("Number of GhostPads: %u\n", num_ghostpads);
+  printf ("Number of Buffers passed: %" G_GUINT64_FORMAT "\n", num_buffers);
+  printf ("Number of Events sent: %" G_GUINT64_FORMAT "\n", num_events);
+  printf ("Number of Message sent: %" G_GUINT64_FORMAT "\n", num_messages);
+  printf ("Number of Queries sent: %" G_GUINT64_FORMAT "\n", num_queries);
+  printf ("Time: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (last_ts));
+  if (have_cpuload) {
+    printf ("Avg CPU load: %4.1f %%\n", (gfloat) total_cpuload / 10.0);
+  }
+  puts ("");
+
+  /* thread stats */
+  if (num_threads) {
+    GSList *list = NULL;
+
+    g_ptr_array_foreach (pads, sort_pad_stats, &list);
+    g_hash_table_foreach (threads, print_thread_stats, list);
+    puts ("");
+    g_slist_free (list);
+  }
+
+  /* element stats */
+  if (num_elements) {
+    GSList *list = NULL;
+
+    puts ("Element Statistics:");
+    /* sort by first_activity */
+    g_ptr_array_foreach (elements, sort_element_stats, &list);
+    /* attribute element stats to bins */
+    g_slist_foreach (list, accum_element_stats, NULL);
+    g_slist_foreach (list, print_element_stats, NULL);
+    puts ("");
+    g_slist_free (list);
+  }
+
+  /* bin stats */
+  if (num_bins) {
+    GSList *list = NULL;
+    guint i;
+    GHashTable *accum_bins = g_hash_table_new_full (NULL, NULL, NULL, NULL);
+
+    puts ("Bin Statistics:");
+    /* attribute bin stats to parent-bins */
+    for (i = 0; i < num_elements; i++) {
+      GstElementStats *stats = g_ptr_array_index (elements, i);
+      if (stats->is_bin) {
+        g_hash_table_insert (accum_bins, GUINT_TO_POINTER (i), stats);
+      }
+    }
+    while (g_hash_table_size (accum_bins)) {
+      g_hash_table_foreach_remove (accum_bins, process_leaf_bins, accum_bins);
+    }
+    g_hash_table_destroy (accum_bins);
+    /* sort by first_activity */
+    g_ptr_array_foreach (elements, sort_bin_stats, &list);
+    g_slist_foreach (list, print_element_stats, NULL);
+    puts ("");
+    g_slist_free (list);
+  }
+}
+
+static void
+collect_stats (const gchar * filename)
+{
+  FILE *log;
+
+  if ((log = fopen (filename, "rt"))) {
+    gchar line[5001];
+
+    /* probe format */
+    if (fgets (line, 5000, log)) {
+      GMatchInfo *match_info;
+      GRegex *parser;
+      GstStructure *s;
+      guint lnr = 0;
+      gchar *level, *data;
+
+      if (strchr (line, 27)) {
+        parser = ansi_log;
+        GST_INFO ("format is 'ansi'");
+      } else {
+        parser = raw_log;
+        GST_INFO ("format is 'raw'");
+      }
+      rewind (log);
+
+      /* parse the log */
+      while (!feof (log)) {
+        if (fgets (line, 5000, log)) {
+          if (g_regex_match (parser, line, 0, &match_info)) {
+            /* filter by level */
+            level = g_match_info_fetch (match_info, 4);
+            if (!strcmp (level, "TRACE")) {
+              data = g_match_info_fetch (match_info, 7);
+              if ((s = gst_structure_from_string (data, NULL))) {
+                const gchar *name = gst_structure_get_name (s);
+
+                if (!strcmp (name, "new-pad")) {
+                  new_pad_stats (s);
+                } else if (!strcmp (name, "new-element")) {
+                  new_element_stats (s);
+                } else if (!strcmp (name, "buffer")) {
+                  do_buffer_stats (s);
+                } else if (!strcmp (name, "event")) {
+                  do_event_stats (s);
+                } else if (!strcmp (name, "message")) {
+                  do_message_stats (s);
+                } else if (!strcmp (name, "query")) {
+                  do_query_stats (s);
+                } else if (!strcmp (name, "thread-rusage")) {
+                  do_thread_rusage_stats (s);
+                } else if (!strcmp (name, "proc-rusage")) {
+                  do_proc_rusage_stats (s);
+                } else {
+                  // TODO(ensonic): parse the xxx.class log lines
+                  if (!g_str_has_suffix (data, ".class")) {
+                    GST_WARNING ("unknown log entry: '%s'", data);
+                  }
+                }
+                gst_structure_free (s);
+              } else {
+                GST_WARNING ("unknown log entry: '%s'", data);
+              }
+            }
+          } else {
+            if (*line) {
+              GST_WARNING ("foreign log entry: %s:%d:'%s'", filename, lnr,
+                  g_strchomp (line));
+            }
+          }
+          g_match_info_free (match_info);
+          match_info = NULL;
+          lnr++;
+        } else {
+          if (!feof (log)) {
+            // TODO(ensonic): run wc -L on the log file
+            fprintf (stderr, "line too long");
+          }
+        }
+      }
+    } else {
+      GST_WARNING ("empty log");
+    }
+    fclose (log);
+  }
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+  gchar **filenames = NULL;
+  guint num;
+  GError *err = NULL;
+  GOptionContext *ctx;
+  GOptionEntry options[] = {
+    GST_TOOLS_GOPTION_VERSION,
+    // TODO(ensonic): add a summary flag, if set read the whole thing, print
+    // stats once, and exit
+    {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}
+    ,
+    {NULL}
+  };
+
+#ifdef ENABLE_NLS
+  bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+  textdomain (GETTEXT_PACKAGE);
+#endif
+
+  g_set_prgname ("gst-stats-" GST_API_VERSION);
+
+  ctx = g_option_context_new ("FILE");
+  g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
+  g_option_context_add_group (ctx, gst_init_get_option_group ());
+  if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+    g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
+    exit (1);
+  }
+  g_option_context_free (ctx);
+
+  gst_tools_print_version ();
+
+  if (filenames == NULL || *filenames == NULL) {
+    g_print ("Please give one filename to %s\n\n", g_get_prgname ());
+    return 1;
+  }
+  num = g_strv_length (filenames);
+  if (num == 0 || num > 1) {
+    g_print ("Please give exactly one filename to %s (%d given).\n\n",
+        g_get_prgname (), num);
+    return 1;
+  }
+
+  if (init ()) {
+    collect_stats (filenames[0]);
+    print_stats ();
+  }
+  done ();
+
+  g_strfreev (filenames);
+  return 0;
+}
diff --git a/tools/gst-typefind.c b/tools/gst-typefind.c
index 830d7e6..490aca8 100644
--- a/tools/gst-typefind.c
+++ b/tools/gst-typefind.c
@@ -106,7 +106,7 @@
       if (msg) {
         gst_message_parse_error (msg, &err, NULL);
         g_printerr ("%s - FAILED: %s\n", filename, err->message);
-        g_error_free (err);
+        g_clear_error (&err);
         gst_message_unref (msg);
       } else {
         g_printerr ("%s - FAILED: unknown error\n", filename);
@@ -162,6 +162,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
+    g_clear_error (&err);
+    g_option_context_free (ctx);
     exit (1);
   }
   g_option_context_free (ctx);
diff --git a/win32/common/config.h b/win32/common/config.h
index ace70cc..1f32ef2 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -40,6 +40,9 @@
 /* Define if pipeline parsing code is disabled */
 #undef GST_DISABLE_PARSE
 
+/* Define if extra runtime checks should be enabled */
+#undef GST_ENABLE_EXTRA_CHECKS
+
 /* Extra platform specific plugin suffix */
 #undef GST_EXTRA_MODULE_SUFFIX
 
@@ -65,7 +68,7 @@
 #define GST_PACKAGE_ORIGIN "Unknown package origin"
 
 /* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2015-12-14"
+#define GST_PACKAGE_RELEASE_DATETIME "2015-12-24"
 
 /* Define if static plugins should be built */
 #undef GST_PLUGIN_BUILD_STATIC
@@ -194,6 +197,9 @@
 /* Define to 1 if you have the `getpid' function. */
 #undef HAVE_GETPID
 
+/* Define to 1 if you have the `getrusage' function. */
+#undef HAVE_GETRUSAGE
+
 /* Define if the GNU gettext() function is already present or preinstalled. */
 #undef HAVE_GETTEXT
 
@@ -355,6 +361,9 @@
 /* Define to 1 if you have the <sys/prctl.h> header file. */
 #undef HAVE_SYS_PRCTL_H
 
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
 /* Define to 1 if you have the <sys/socket.h> header file. */
 #undef HAVE_SYS_SOCKET_H
 
@@ -454,7 +463,7 @@
 #define PACKAGE_NAME "GStreamer"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GStreamer 1.6.2"
+#define PACKAGE_STRING "GStreamer 1.7.1"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "gstreamer"
@@ -463,7 +472,7 @@
 #undef PACKAGE_URL
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "1.6.2"
+#define PACKAGE_VERSION "1.7.1"
 
 /* directory where plugins are located */
 #ifdef _DEBUG
@@ -507,7 +516,7 @@
 #undef USE_POISONING
 
 /* Version number of package */
-#define VERSION "1.6.2"
+#define VERSION "1.7.1"
 
 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    significant byte first (like Motorola and SPARC, unlike Intel). */
diff --git a/win32/common/gstenumtypes.c b/win32/common/gstenumtypes.c
index a29942a..7d7b337 100644
--- a/win32/common/gstenumtypes.c
+++ b/win32/common/gstenumtypes.c
@@ -1437,6 +1437,9 @@
     {C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX),
           "GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX",
         "file-name-is-suffix"},
+    {C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX),
+          "GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX",
+        "file-name-is-prefix"},
     {0, NULL, NULL}
   };
 
diff --git a/win32/common/gstversion.h b/win32/common/gstversion.h
index 0216c54..6842248 100644
--- a/win32/common/gstversion.h
+++ b/win32/common/gstversion.h
@@ -54,13 +54,13 @@
  *
  * The minor version of GStreamer at compile time:
  */
-#define GST_VERSION_MINOR (6)
+#define GST_VERSION_MINOR (7)
 /**
  * GST_VERSION_MICRO:
  *
  * The micro version of GStreamer at compile time:
  */
-#define GST_VERSION_MICRO (2)
+#define GST_VERSION_MICRO (1)
 /**
  * GST_VERSION_NANO:
  *
diff --git a/win32/common/libgstnet.def b/win32/common/libgstnet.def
index 9cbd905..6fdab1e 100644
--- a/win32/common/libgstnet.def
+++ b/win32/common/libgstnet.def
@@ -1,6 +1,7 @@
 EXPORTS
 	gst_buffer_add_net_address_meta
 	gst_buffer_add_net_control_message_meta
+	gst_buffer_get_net_address_meta
 	gst_net_address_meta_api_get_type
 	gst_net_address_meta_get_info
 	gst_net_client_clock_get_type
diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def
index 43979cc..ce553fa 100644
--- a/win32/common/libgstreamer.def
+++ b/win32/common/libgstreamer.def
@@ -511,6 +511,9 @@
 	gst_element_get_clock
 	gst_element_get_compatible_pad
 	gst_element_get_compatible_pad_template
+	gst_element_get_context
+	gst_element_get_context_unlocked
+	gst_element_get_contexts
 	gst_element_get_factory
 	gst_element_get_request_pad
 	gst_element_get_start_time
@@ -892,6 +895,7 @@
 	gst_pad_set_chain_function_full
 	gst_pad_set_chain_list_function_full
 	gst_pad_set_element_private
+	gst_pad_set_event_full_function_full
 	gst_pad_set_event_function_full
 	gst_pad_set_getrange_function_full
 	gst_pad_set_iterate_internal_links_function_full
@@ -1154,11 +1158,16 @@
 	gst_segment_is_equal
 	gst_segment_new
 	gst_segment_offset_running_time
+	gst_segment_position_from_running_time
+	gst_segment_position_from_running_time_full
+	gst_segment_position_from_stream_time
+	gst_segment_position_from_stream_time_full
 	gst_segment_set_running_time
 	gst_segment_to_position
 	gst_segment_to_running_time
 	gst_segment_to_running_time_full
 	gst_segment_to_stream_time
+	gst_segment_to_stream_time_full
 	gst_segtrap_is_enabled
 	gst_segtrap_set_enabled
 	gst_state_change_get_type
@@ -1375,6 +1384,13 @@
 	gst_toc_setter_get_type
 	gst_toc_setter_reset
 	gst_toc_setter_set_toc
+	gst_tracer_factory_get_list
+	gst_tracer_factory_get_type
+	gst_tracer_get_type
+	gst_tracer_log_trace
+	gst_tracer_register
+	gst_tracing_register_hook
+	gst_tracing_register_hook_id
 	gst_type_find_factory_call_function
 	gst_type_find_factory_get_caps
 	gst_type_find_factory_get_extensions