Merge tag 'upstream/1.3.2' into debian-experimental

Upstream version 1.3.2
diff --git a/ChangeLog b/ChangeLog
index c90844f..9824c9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,1075 @@
-=== release 1.3.1 ===
+=== release 1.3.2 ===
 
-2014-05-03  Sebastian Dröge <slomo@coaxion.net>
+2014-05-21  Sebastian Dröge <slomo@coaxion.net>
 
 	* configure.ac:
-	  releasing 1.3.1
+	  releasing 1.3.2
+
+2014-05-21 19:47:22 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglfilter.c:
+	  gl/filter: fixup passthrough bufferpool
+	  In a pipeline like so:
+	  videotestsrc ! gleffects ! videoconvert ! sink
+	  gleffects was simply passing the videoconvert bufferpool to videotestsrc
+	  and not creating a glbufferpool. videobufferpool would then fail
+	  to allocate from the glallocator.
+
+2014-05-21 10:51:26 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* common:
+	  Automatic update of common submodule
+	  From 211fa5f to 1f5d3c3
+
+2014-05-21 08:53:03 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/mpegts/gst-dvb-section.c:
+	  dvb-section: Don't compare unsigned integers for >= 0
+	  gst-dvb-section.c:93:12: error: comparison of unsigned expression >= 0 is always true
+	  [-Werror,-Wtautological-compare]
+	  if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0
+	  ~~~~ ^  ~
+	  gst-dvb-section.c:93:40: error: comparison of unsigned expression >= 0 is always true
+	  [-Werror,-Wtautological-compare]
+	  if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0
+	  ~~~~~~ ^  ~
+	  gst-dvb-section.c:93:70: error: comparison of unsigned expression >= 0 is always true
+	  [-Werror,-Wtautological-compare]
+	  if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0
+	  ~~~~~~ ^  ~
+
+2014-05-20 17:09:43 +0200  L. Sorin <sorin@axis.com>
+
+	* ext/curl/gstcurlsshsink.c:
+	  curlsshsink: post error on bus in element, not transfer thread
+	  Looks like this file was missed in Bug 728960:
+	  https://bugzilla.gnome.org/show_bug.cgi?id=728960
+	  https://bugzilla.gnome.org/show_bug.cgi?id=730459
+
+2014-05-21 10:26:21 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: switch the 'master' texture for YUY2, UYVY
+	  From d4bcef3204709159713ff1630978ecac0bd91dc9 on, using a RGBA
+	  texture to hold the data causes the glmemory to have half width
+	  and a scaling of [2, 1].  Using a LA texture solves this problem
+	  however cannot be attached to the framebuffer for copying into
+	  a RGBA texture.  Which will be solved by moving to EXT_texture_rg.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=728890
+
+2014-05-14 17:59:52 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* ext/gl/gstglimagesink.c:
+	* gst-libs/gst/gl/egl/gsteglimagememory.c:
+	* gst-libs/gst/gl/egl/gstglcontext_egl.c:
+	* gst-libs/gst/gl/egl/gstglcontext_egl.h:
+	* gst-libs/gst/gl/gstglfilter.c:
+	  gl/eglimage: add eglimage context feature
+	  Allows us to selectively use EGLImages only when available
+	  https://bugzilla.gnome.org/show_bug.cgi?id=728234
+
+2014-05-14 17:33:21 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* gst-libs/gst/gl/gstglcontext.c:
+	* gst-libs/gst/gl/gstglcontext.h:
+	  gl/context: add generic feature checking
+	  At the moment it simply delegates to the subclass.
+
+2014-05-20 11:42:35 +0200  Wim Taymans <wtaymans@redhat.com>
+
+	* gst/bayer/gstbayerorc.orc:
+	  bayer: fix unused variable
+
+2014-01-28 14:04:11 +0100  L. Sorin <sorin@axis.com>
+
+	* ext/curl/gstcurlsshsink.c:
+	* ext/curl/gstcurlsshsink.h:
+	* tests/check/elements/curlsftpsink.c:
+	  curlsftpsink: authenticate remote host via public key fingerprint
+	  Expose one more libcurl option: CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.
+	  This allows authenticating the server by the MD5 fingerprint of
+	  the server's public key.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=723167
+
+2014-05-19 13:43:59 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* gst-libs/gst/mpegts/gst-dvb-section.c:
+	  mpegts: Check hour:minute:second values before creating datetime
+	  Avoids assertions when the packets are malformed and also add the case
+	  where the time isn't specified, only the date.
+
+2014-05-19 12:25:51 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: Check if context creation failed before trying to use it
+	  Otherwise we will cause assertions everywhere by passing NULL to functions
+	  and eventually crash when dereferencing a NULL pointer.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=730069
+
+2014-05-19 12:21:13 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglcontext.c:
+	  glcontext: Add more assertions to make sure that everything sets the GError during context creation if something fails
+
+2014-05-19 11:34:42 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/freeverb/gstfreeverb.c:
+	  freeverb: Don't pass floats to abs() but instead cast them to ints first
+	  gstfreeverb.c:781:29: error: using integer absolute value function 'abs' when
+	  argument is of floating point type [-Werror,-Wabsolute-value]
+	  if (abs (out_l2) > 0 || abs (out_r2) > 0)
+
+2014-05-19 09:12:14 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/rsvg/gstrsvgdec.c:
+	  rsvgdec: Unref handle and output state on error paths
+	  CID 1214604
+
+2014-05-16 09:10:48 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/opensles/openslesringbuffer.c:
+	  opensles: Work around race condition in Android < 4.2 that leads to deadlocks on shutdown
+	  We need to sleep a bit before destroying the player object
+	  because of a bug in Android in versions < 4.2.
+	  OpenSLES is using AudioTrack for rendering the sound. AudioTrack
+	  has a thread that pulls raw audio from the buffer queue and then
+	  passes it forward to AudioFlinger (AudioTrack::processAudioBuffer()).
+	  This thread is calling various callbacks on events, e.g. when
+	  an underrun happens or to request data. OpenSLES sets this callback
+	  on AudioTrack (audioTrack_callBack_pullFromBuffQueue() from
+	  android_AudioPlayer.cpp). Among other things this is taking a lock
+	  on the player interface.
+	  Now if we destroy the player interface object, it will first of all
+	  take the player interface lock (IObject_Destroy()). Then it destroys
+	  the audio player instance (android_audioPlayer_destroy()) which then
+	  calls stop() on the AudioTrack and deletes it. Now the destructor of
+	  AudioTrack will wait until the rendering thread (AudioTrack::processAudioBuffer())
+	  has finished.
+	  If all this happens with bad timing it can happen that the rendering
+	  thread is currently e.g. handling underrun but did not lock the player
+	  interface object yet. Then destroying happens and takes the lock and waits
+	  for the thread to finish. Then the thread tries to take the lock and waits
+	  forever.
+	  We wait a bit before destroying the player object to make sure that
+	  the rendering thread finished whatever it was doing, and then stops
+	  (note: we called gst_opensles_ringbuffer_stop() before this already).
+
+2014-05-15 20:34:48 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* gst-libs/gst/mpegts/gstmpegtsdescriptor.c:
+	  mpegts: mpegtsdescriptor: fix gobject-introspection warnings
+	  Adds missing : to gobject-introspection markers
+
+2014-05-15 19:16:30 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* gst-libs/gst/mpegts/gst-atsc-section.c:
+	* gst-libs/gst/mpegts/gst-dvb-section.c:
+	* gst-libs/gst/mpegts/gstmpegtssection.c:
+	  mpegts: sections: prevent assertion when packet parsing fails
+	  the descriptors entry can be left as NULL and freeing the structure
+	  will fail (assertion happens)
+
+2014-05-14 21:32:10 +0200  Nicola Murino <nicola.murino@gmail.com>
+
+	* ext/opencv/gstmotioncells.c:
+	  motioncells: fix memleak
+	  Check gst_buffer_map return and remember to unmap and free memory before
+	  returning
+	  https://bugzilla.gnome.org/show_bug.cgi?id=730133
+
+2014-05-14 11:47:03 +0200  Wim Taymans <wtaymans@redhat.com>
+
+	* sys/bluez/gstavdtputil.c:
+	  bluez: fix property names
+	  These were forgotten when they got renamed.
+	  Fixes https://bugzilla.gnome.org/show_bug.cgi?id=729731
+
+2014-05-13 14:13:57 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* ext/gl/gstgltestsrc.c:
+	* gst-libs/gst/gl/gstgldownload.c:
+	* gst-libs/gst/gl/gstgldownload.h:
+	* gst-libs/gst/gl/gstglfilter.c:
+	* gst-libs/gst/gl/gstglmixer.c:
+	  gl/download: update to be similar to the glupload semantics
+
+2014-05-13 14:07:39 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  gl/colorconvert: fix up alpha clobbering
+	  Previously it would only work if the alpha value was in the last
+	  component (RGBx, BGRx).  Now it works wherever the alpha value may
+	  be (xRGB, xBGR, etc).
+
+2014-05-14 00:23:35 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	  mxfdemux: post error message when erroring out on unsupported essence wrapping
+
+2014-04-10 16:10:06 +0200  Aurélien Zanelli <aurelien.zanelli@parrot.com>
+
+	* Android.mk:
+	  Add missing backslash in Android.mk
+	  https://bugzilla.gnome.org/show_bug.cgi?id=727968
+
+2014-05-13 16:29:46 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/hls/gsthlssink.c:
+	  hlssink: do not leak playlist object
+	  In finalize, also release the playlist
+
+2014-05-13 13:16:34 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglfilter.c:
+	  glfilter: Fix building without EGL support
+	  This fixes the OSX build and any builds with --disable-egl. That issue
+	  was introduced in "glfilter: rewrite transform_caps to preserve caps fields".
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729861
+
+2014-05-13 13:30:47 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglfilter.c:
+	  glfilter: rewrite transform_caps to preserve caps fields
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729861
+
+2014-05-13 10:53:19 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglcolorconvert.h:
+	  gl/colorconvert: use the texture scaling from the gl memory
+	  The colorconvert values were not being used at all.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729896
+
+2014-05-12 19:29:45 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglmemory.c:
+	  glmemory: Fix handling of stride with alignement larger then 8
+	  Setting a scaled factor for X coordinate is not enough as the indexer
+	  will still think stride is shorter and will not fully skip it. Instead,
+	  update width, so the lines are as expected. Combined with the scale, it
+	  will hide the cropped portion.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729896
+
+2014-05-13 11:22:58 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: mpdparser: properly unref gstdatetime
+	  Avoid leaking the GstDateTime instances when summing dates
+	  CID #1212143
+
+2014-05-13 10:24:51 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: mpdparser: avoid double free of segment timeline node
+	  The parsing function already frees the old value (if any), avoid a double
+	  free by not freeing it before calling the function without setting the
+	  pointer to NULL
+	  Coverity ID: 1212178
+
+2014-05-13 10:13:37 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: mpdparser: avoid double free
+	  The _parse_url function already frees the previous pointer, avoid
+	  freeing it before without setting to null or we have a double free.
+	  Coverity ID: 1212181
+	  Coverity ID: 1212180
+	  Coverity ID: 1212179
+
+2014-05-13 14:21:15 +0200  Edward Hervey <edward@collabora.com>
+
+	* ext/schroedinger/gstschrodec.c:
+	  schrodec: Use pool configuration
+	  It was leaking the config, but also not using it...
+	  CID #1212155
+
+2014-05-13 14:15:24 +0200  Edward Hervey <edward@collabora.com>
+
+	* ext/rsvg/gstrsvgdec.c:
+	  rsvg: Don't leak GstVideoCodecState
+	  And avoid useless call to _get_output_state (set_output_state() already
+	  returns it).
+	  CID #1212160
+	  CID #1212161
+
+2014-05-13 13:54:23 +0200  Edward Hervey <edward@collabora.com>
+
+	* gst/mpegtsdemux/mpegtsbase.c:
+	  mpegtbase: Small rewrite
+	  Setting done was useless anyway
+
+2014-05-13 13:52:48 +0200  Edward Hervey <edward@collabora.com>
+
+	* ext/dash/gstmpdparser.c:
+	  dash: Don't leak GstActiveStream
+	  CID #1212142
+
+2014-05-13 11:41:42 +0200  Edward Hervey <edward@collabora.com>
+
+	* sys/shm/gstshmsrc.c:
+	  shm: Don't leak GstShmPipe
+	  By reordering the leaking code path to before the allocation
+	  CID #1212153
+
+2014-05-13 11:38:44 +0200  Edward Hervey <edward@collabora.com>
+
+	* gst/vmnc/vmncdec.c:
+	  vmndec: Don't leak output state
+	  _set_output_state returns a reference to the codec state.
+	  CID #1212170
+
+2014-05-13 11:35:46 +0200  Edward Hervey <edward@collabora.com>
+
+	* gst/sdp/gstsdpdemux.c:
+	  sdpdemux: Don't leak adapter data
+	  CID #1212158
+
+2014-05-13 11:30:35 +0200  Edward Hervey <edward@collabora.com>
+
+	* gst/mpegpsmux/psmuxstream.c:
+	  mpegpsmux; Fix stream leak
+	  CID #1212164
+
+2014-05-13 11:23:42 +0200  Edward Hervey <edward@collabora.com>
+
+	* gst/jp2kdecimator/jp2kcodestream.c:
+	  jp2kdecimator: Don't leak various slices and arrays
+	  CID #1212139
+	  CID #1212140
+	  CID #1212141
+
+2014-05-13 11:19:24 +0200  Edward Hervey <edward@collabora.com>
+
+	* gst/asfmux/gstasfobjects.c:
+	  asfmux: Don't leak bytereader
+	  By making it go through the error path that takes care of cleanups
+	  CID #1212168
+
+2014-05-12 13:50:47 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: Ensure we still have a texture after upload_set_format()
+	  gst_gl_upload_set_format() resets the upload, hence the texture.
+	  So we need to ensure we have a texture after this call when
+	  uploading.
+
+2014-05-12 12:59:59 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: Correctly update the video info from video meta
+	  Using gst_video_info_set_format() isn't complete when updating
+	  a video info from video meta.
+
+2014-05-12 12:57:18 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: Correctly update video info in upload fallback
+	  When the upload accelerated method fails, we fallback to an upload,
+	  but the video info was not correctly updated.
+
+2014-05-12 18:28:45 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	  mssdemux: avoid deadlocking when erroring
+	  It might get stuck when posting the message while
+	  a reconfigure event is being pushed upstream
+
+2014-05-12 17:37:16 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	  mssdemux: fix caps leak
+
+2014-05-12 15:43:05 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	  mssdemux: handle error messages from internal source
+	  set up a bin message handler to get notified of error messages from
+	  the internal source element
+
+2014-05-12 14:58:45 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	  mssdemux: Always accept the latency configure event
+	  Upstream or internal elements are irrelevant and we should
+	  always succeed.
+
+2014-05-12 14:51:00 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	* ext/smoothstreaming/gstmssdemux.h:
+	  mssdemux: reenable segment tracking for streams
+	  Store the latest pushed timestamp so that mssdemux streams know
+	  where they are in time
+
+2014-05-12 14:23:15 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	  mssdemux: deprecate unused max-queue-size-buffers
+	  There is no internal storage of buffers anymore
+
+2014-05-12 14:18:13 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/Makefile.am:
+	* ext/smoothstreaming/gstdownloadrate.c:
+	* ext/smoothstreaming/gstdownloadrate.h:
+	* ext/smoothstreaming/gstmssdemux.c:
+	* ext/smoothstreaming/gstmssdemux.h:
+	  mssdemux: measure bitrate similarly to hlsdemux
+	  new bitrate = (old bitrate + (last fragment bitrate * 3)) / 4
+
+2014-05-12 13:40:19 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	* ext/smoothstreaming/gstmssdemux.h:
+	  mssdemux: remove uridownloader in favor of internal source
+	  Refactor mssdemux to remove uridownloader to use an internal
+	  source element which reduces startup latency and provides smaller
+	  buffers for better buffering management downstream
+
+2014-05-12 13:28:35 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: initialize the mutex and cond for fragment download
+
+2014-05-12 13:32:31 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: set out_tex after reset, not before
+	  Fix a regression introduced recently with the lazy init.
+	  It was happening when calling gst_video_gl_texture_upload_meta_upload
+	  from an aplication. So not using gst_gl_upload_perform_with_buffer.
+
+2014-05-11 12:48:52 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: update the video info on mapping a video frame
+	  The buffer should contain the most specific data on how the data is
+	  formatted.  We should use this information.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729896
+
+2014-05-12 21:56:06 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  gl/convert: clobber alpha channel when needed
+	  Needed in the conversion from padded RGB formats to formats with an
+	  alpha channel.  e.g. BGRx -> ABGR, etc
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729742
+
+2014-05-12 21:51:38 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: avoid performing color conversion when there is no need
+	  One such example is when the buffer contains GstGLMemory in the
+	  RGBA format
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729278
+
+2014-05-12 10:01:43 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/dvb/gstdvbsrc.c:
+	  dvbsrc: Don't free string we're still using
+	  CID 1213780
+
+2014-05-11 15:26:45 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	* ext/dash/gstdashdemux.h:
+	  dashdemux: remove unused stream uridownloader
+	  The uridownloader for the stream fragments isn't used anymore.
+
+2014-05-11 07:56:17 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/assrender/gstassrender.c:
+	  assrender: Do not try to add a feature to a caps features ANY
+	  It does not makes sense and asserts
+	  Based on 7f9aac386fd5d5921c80100889a5f212c0148a88 from gst-plugins-base.
+
+2014-05-11 07:55:59 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/dvbsuboverlay/gstdvbsuboverlay.c:
+	  dvbsuboverlay: Do not try to add a feature to a caps features ANY
+	  It does not makes sense and asserts.
+	  Based on 7f9aac386fd5d5921c80100889a5f212c0148a88 from gst-plugins-base.
+
+2014-05-11 14:02:34 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  gl/colorconvert: choose the right alpha component for AYUV -> RGBA
+
+2014-05-11 10:27:02 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: update the respective state when we cache textures/data
+
+2014-05-01 02:10:20 -0400  Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com>
+
+	* sys/dvb/gstdvbsrc.c:
+	  dvbsrc: drop C++ style comments
+	  This patch builds on previous work done by
+	  Fabrizio (Misto) Milo <mistobaan@gmail.com>
+	  https://bugzilla.gnome.org/show_bug.cgi?id=641204
+
+2014-05-01 01:58:03 -0400  Reynaldo H. Verdejo Pinochet <reynaldo@sisa.samsung.com>
+
+	* sys/dvb/gstdvbsrc.c:
+	  dvbsrc: fix up error reporting
+	  This patch builds on previous work done by
+	  Fabrizio (Misto) Milo <mistobaan@gmail.com>
+	  https://bugzilla.gnome.org/show_bug.cgi?id=641204
+
+2014-05-10 23:33:24 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: cache the textures that we are using
+
+2014-05-10 22:48:05 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: avoid recreating the GLMemory struct for output textures
+
+2014-04-11 19:38:32 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/rtmp/gstrtmpsrc.c:
+	  rtmpsrc: error out if we get EOS immediately without any data
+	  It's not really right to just go EOS as if nothing was wrong.
+
+2014-05-10 12:54:58 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: remove confusing debug log line
+
+2014-05-07 20:08:08 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	* gst/autoconvert/gstautoconvert.h:
+	  autoconvert: factories don't need the lock
+	  An atomic is enough, they can only be set once.
+
+2014-05-09 20:06:12 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  Revert "autoconvert: Handle caps query on internal srcpad"
+	  This is not needed anymore if the gst_pad_link checks nothing.
+	  This reverts commit a303375a3f5c12e97ca8bf50b5a93ce8652faf23.
+
+2014-05-09 20:12:27 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: No need to check anything when linking internal pads
+
+2014-05-09 20:05:07 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Don't ignore elements accepted ANY, it is valid
+
+2014-05-09 18:49:14 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Remove broken usage of the iterator
+	  We're a subclass, so we can just take the object lock and iterate the list
+	  directly.
+
+2014-05-08 19:35:07 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Process upstream getcaps
+	  Process it like downstream getcaps
+
+2014-05-07 20:00:08 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Return the GList of factories, to a pointer to it.
+
+2014-05-07 19:54:46 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	* gst/autoconvert/gstautoconvert.h:
+	  autoconvert: subelement can only be change with stream lock held
+	  It was already the case, now be more explicit about that, and remove useless
+	  lock/ref/unlock/unref dances.
+
+2014-05-07 19:48:49 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Keep a ref to the pads too
+	  Simplifies the code
+
+2014-05-07 19:47:04 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Remove uneeded if()
+	  NULL is valid GList
+
+2014-05-07 19:44:11 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Always push reconfigure upstream too
+	  A reconfigure could trigger a change of contents instead of just reconfiguring the internal element
+
+2014-05-07 19:43:13 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Remove unused internal parameter
+
+2014-05-09 18:59:46 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl: Fix some of the error handling
+
+2014-05-09 17:59:43 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: Update GstVideoInfo after the buffer is mapped
+	  gst_video_frame_map() will store an updated video info base
+	  on the video meta. In order to have the right stride and offset
+	  we should update that video info accordingly.
+
+2014-05-09 15:42:08 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglshadervariables.c:
+	  gl: Fix memory leak
+	  CID #1212171
+
+2014-05-09 15:26:31 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/hls/m3u8.c:
+	  hls: Remove invalid free
+	  data does not have to be freed at all here, it's a pointer to
+	  an arbitrary position inside the current line. Also don't reuse
+	  the data variable for anything else, that will cause crashes
+	  in playlists that have the I-frame playlist URI followed by
+	  other attributes.
+	  CID 1212127
+
+2014-05-09 14:31:57 +0200  Edward Hervey <bilboed@bilboed.com>
+
+	* gst-libs/gst/mpegts/gst-dvb-descriptor.c:
+	  mpegts: Fix leak
+	  The cell extension was never added to the parent cell
+	  CID #1212162
+
+2014-05-09 22:22:43 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  gl/colorconvert: preserve alpha in AYUV <-> RGBA conversions
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729743
+
+2014-05-09 18:07:03 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglcolorconvert.h:
+	* gst-libs/gst/gl/gstgldownload.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/colorconvert: implement lazy init
+
+2014-05-08 15:38:24 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: set initted to TRUE when _init_upload succeeded
+
+2014-05-08 22:49:33 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstgldisplay.c:
+	  gldisplay: Use GST_STR_NULL() for printing possibly NULL strings and print all variables we use
+	  Fixes compiler warning about set but not used platform_choice variable
+	  among other things.
+
+2014-05-08 16:08:08 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* ext/gl/gstgleffects.c:
+	  gleffects: use gl_vtable
+
+2014-05-08 17:28:11 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: fix compilation on OS X
+
+2014-05-08 15:40:33 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl/upload: fail propoerly if init fails
+
+2014-05-08 15:30:49 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglcolorconvert.h:
+	* gst-libs/gst/gl/gstglcontext.c:
+	* gst-libs/gst/gl/gstglcontext.h:
+	* gst-libs/gst/gl/gstgldisplay.c:
+	* gst-libs/gst/gl/gstgldownload.c:
+	* gst-libs/gst/gl/gstgldownload.h:
+	* gst-libs/gst/gl/gstglshader.c:
+	* gst-libs/gst/gl/gstglshader.h:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstglupload.h:
+	* gst-libs/gst/gl/gstglwindow.c:
+	* gst-libs/gst/gl/gstglwindow.h:
+	  gl: make all GObjects inherit from GstObject
+	  Aids memory leak debugging with GST_TRACE=mem-live
+
+2014-05-08 13:46:29 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* ext/gl/gstglimagesink.c:
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	* gst-libs/gst/gl/gstglfilter.c:
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglmixer.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstglupload.h:
+	* tests/check/libs/gstglupload.c:
+	  gl/upload: implement lazy init
+	  Rename init_format to set_format
+
+2014-05-08 00:59:42 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstglupload.h:
+	  gl/upload: add get_format method
+	  Simply retreives the format set by init_format
+
+2014-05-08 00:48:07 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglfilter.c:
+	  gl/filter: attempt to passthrough the pool if the caps are the same
+	  Reduces the number of glbufferpool instances required for >=2
+	  consecutive GL elements in a pipeline.
+
+2014-05-08 00:43:14 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglfilter.c:
+	  gl/filter: always initialize the upload object
+
+2014-05-07 21:45:53 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* ext/gl/gstglimagesink.c:
+	* ext/gl/gstgltestsrc.c:
+	* gst-libs/gst/gl/gstglfilter.c:
+	* gst-libs/gst/gl/gstglmemory.h:
+	* gst-libs/gst/gl/gstglmixer.c:
+	  gl: advertise GstGLMemory usage in the caps as capsfeatures
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729658
+
+2014-05-07 20:12:23 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* tests/examples/gl/clutter/clutteractor.c:
+	* tests/examples/gl/clutter/clutteractortee.c:
+	  gl/examples: fix compilation for clutter examples
+	  ClutterX11TexturePixmap is deprecated in Clutter 1.6 and we ask for
+	  at least 1.8
+
+2014-05-07 19:05:55 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstgldisplay.c:
+	  gl/display: avoid endless recursion for cocoa
+
+2014-05-06 08:52:27 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: deprecate max-buffering-time property
+	  It is not used as dashdemux doesn't have a internal buffer
+	  for fragments anymore
+
+2014-05-06 01:56:28 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: removing old unused code
+	  The 'catch up mode' isn't needed anymore since dashdemux
+	  is downloading and pushing from the same thread
+
+2014-05-05 10:13:15 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: remember to set starting fragment to new fragments
+
+2014-05-02 18:34:04 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: handle a few more error cases
+	  related to missing plugins, bad URI and a lockup on dealing with
+	  errors from the source.
+
+2014-05-02 18:32:56 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: Only set timestamp to the first buffer of fragments
+	  Setting it to the other parts of the fragment is slightly wrong
+	  and misleading as it isn't accurate enough.
+
+2014-05-02 18:30:05 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	* ext/dash/gstdashdemux.h:
+	  dashdemux: handle error messages from the sources
+	  Set up a message handling function to be able to catch errors
+	  from the source element and signal the cond to allow the download
+	  loop to retry the download.
+
+2014-05-01 21:04:54 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: check for errors between downloads
+	  To abort earlier in case of failures
+
+2014-05-01 21:00:32 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: Always accept the latency configure event
+	  Upstream or internal elements are irrelevant and we should
+	  always succeed.
+
+2014-05-01 12:04:51 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/Makefile.am:
+	* ext/dash/gstdashdemux.c:
+	* ext/dash/gstdashdemux.h:
+	* ext/dash/gstdownloadrate.c:
+	* ext/dash/gstdownloadrate.h:
+	  dashdemux: measure download rate just like hlsdemux
+	  new bitrate = (old bitrate + (last fragment bitrate * 3)) / 4
+
+2014-04-25 08:50:18 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/dash/gstdashdemux.c:
+	* ext/dash/gstdashdemux.h:
+	  dashdemux: remove uridownloader from fragments download
+	  Instead, use a source element linked to a ghostpad to provide
+	  smaller buffers and more granular control for downstream
+	  buffering elements while also reducing startup latency
+
+2014-05-07 09:11:25 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* ext/gl/gstglimagesink.c:
+	  gl/sink: make sure we always initialize the upload object
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729542
+
+2014-05-06 19:24:55 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: fix internal source event leaks
+
+2014-05-06 11:59:24 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl: do not allocate the target texture of an EGLImage
+	  The target texture of an EGLImage is the texture bind just
+	  before calling glEGLImageTargetTexture2D.
+	  As we currently only support a gl texture as the source of an EGLImage
+	  the gl texture is actually already allocated when creating the eglimage.
+	  I also see some cases where it fails to upload an eglimage when
+	  glTexImage2D is called on the target.
+
+2014-05-06 11:51:31 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglutils.c:
+	  gl: allow to avoid calling glTexImage2D(w, h, NULL) when generating a texture
+	  Just pass 0 as width or height to gst_gl_context_gen_texture.
+
+2014-05-06 11:27:47 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	  gl: no need to initialize a frame buffer object to upload an eglimage
+	  Fix https://bugzilla.gnome.org/show_bug.cgi?id=729588
+
+2014-05-06 11:21:56 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/egl/gsteglimagememory.c:
+	  gl: use GST_CAT_ERROR instead of GST_ERROR_OBJECT
+	  It fixes segault when GST_DEBUG is at least level 1 and eglCreateImage fails
+
+2014-05-06 10:14:26 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  gl: delete texture used with GstVideoGLTextureUploadMeta
+
+2014-05-06 14:23:34 +0100  Julien Isorce <julien.isorce@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  gl: use gst_gl_context_gen_shader helper instead of duplicating code
+
+2014-05-06 09:55:05 -0400  Luis de Bethencourt <luis@debethencourt.com>
+
+	* gst/pnm/gstpnmenc.c:
+	  pnmenc: remove empty line
+	  Remove trailing empty line from commit bfdc54395238c04fc6e5b51880c2d706f33e9011
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729614
+
+2013-11-20 12:16:17 +0100  Jesper Larsen <jesper.larsen@ixonos.com>
+
+	* gst/mpegtsmux/tsmux/tsmux.h:
+	  mpegtsmux: Remove unused data in TsMuxSection
+	  https://bugzilla.gnome.org/show_bug.cgi?id=721685
+
+2014-05-06 21:17:59 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* tests/check/Makefile.am:
+	  tests: reenable camerabin element test
+
+2014-05-06 16:39:06 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglcontext.c:
+	* gst-libs/gst/gl/gstgldisplay.c:
+	* gst-libs/gst/gl/gstgldisplay.h:
+	* tests/check/Makefile.am:
+	  gl/display: clean up pre gstglcontext api and struct fields
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729551
+
+2014-05-06 17:27:15 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* gst-libs/gst/gl/gstgldisplay.c:
+	* gst-libs/gst/gl/gstgldisplay.h:
+	  gl/display: add get_handle_type
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729551
+
+2014-05-06 17:08:18 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstgldisplay.c:
+	  gl/display: avoid opening the X11 display on systems with Cocoa (OS X)
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729551
+
+2014-05-06 16:39:55 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstglwindow.c:
+	  gl/window: fix string length check for eagl
+
+2014-05-06 16:31:28 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* gst-libs/gst/gl/gstgldisplay.c:
+	  gl/display: check the correct env variable for choosing an egl display
+	  GST_GL_WINDOW is used for window system specific choices.
+	  An EGLDisplay can be created from window systems with egl support by using
+	  eglGetDisplay().
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729551
+
+2014-05-06 12:56:25 +0200  Edward Hervey <bilboed@bilboed.com>
+
+	* gst-libs/gst/gl/cocoa/Makefile.am:
+	  gl/cocoa: Use OBJCFLAGS where needed
+	  Should fix usage of c-compiler-only flags with an objective-c compiler
+
+2014-05-06 09:48:58 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/pnm/gstpnmenc.c:
+	  pnmenc: fix flow return and buffer leak in not-negotiated case
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729614
+
+2014-05-06 09:40:01 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* tests/icles/.gitignore:
+	  tests: add new vp8parser-test binary to .gitignore
+
+2014-05-05 17:20:45 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* ext/srtp/gstsrtpdec.c:
+	  srtpdec: Don't reset stream if the key hasn't changed
+
+2014-05-05 17:00:02 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* ext/srtp/gstsrtpdec.c:
+	* ext/srtp/gstsrtpdec.h:
+	  srtpdec: Add "remove-key" action signal to remove a single key
+	  Removing all the keys can be a problem as it also resets the various
+	  counters, so instead add an option to remove a single key.
+
+2014-05-05 22:25:08 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* ext/srtp/gstsrtpenc.c:
+	  srtpenc: Use %u in templates to match rtpbin
+
+2014-05-06 00:11:26 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* ext/srtp/gstsrtpdec.c:
+	  srtpdec: Remove unused field
+
+2014-05-06 09:23:13 +0530  Sanjay NM <sanjay.nm@samsung.com>
+
+	* gst/pnm/gstpnmenc.c:
+	  Fix for not checking zero width and height
+	  Signed-off-by: Sanjay NM <sanjay.nm@samsung.com>
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729614
+
+2014-05-05 11:13:09 -0300  Thiago Santos <ts.santos@sisa.samsung.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: Only set the segment position if there is a timestamp
+	  Only the first buffer of a fragment has its timestamp set, so only
+	  update the segment.position when pushing those buffers to avoid
+	  having GST_CLOCK_TIME_NONE set to the position
+	  https://bugzilla.gnome.org/show_bug.cgi?id=729364
+
+2014-05-05 12:30:32 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	  configure: Use the same includes for GL that we would use later in the code for checking if GLES2 and OpenGL headers can both be included
+
+2014-05-05 20:06:29 +1000  Matthew Waters <ystreet00@gmail.com>
+
+	* configure.ac:
+	  gl: check if we can include both GL and GLES2 headers at the same time
+	  If we cannot, then default to GL over GLES2 unless GLES2 is required.
+
+2014-05-05 09:46:06 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: Set Cache-Control header according to the caching requirements of the playlist
+
+2014-05-05 09:38:14 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	  mssdemux: Update for uri downloader API changes
+
+2014-05-05 09:37:44 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: Update for uri downloader API changes
+
+2014-05-05 09:36:56 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/uridownloader/gsturidownloader.c:
+	* gst-libs/gst/uridownloader/gsturidownloader.h:
+	  uridownloader: Add parameter to disallow caching as required by HLS
+
+2014-05-05 09:34:56 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/hls/m3u8.c:
+	* ext/hls/m3u8.h:
+	  hls: Store allowcache playlist field in a boolean
+
+2014-05-04 22:22:14 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	  configure: Use the same #includes for checking GL types as later in the code
+
+2014-05-03 21:38:42 -0400  Luis de Bethencourt <luis@debethencourt.com>
+
+	* tests/examples/gl/clutter/cluttershare.c:
+	  gl/clutter: safer check for cogl version
+	  Use COGL_VERSION_ENCODE to check for the minimum required and maximum allowed
+	  cogl version. In certain situations just using the COGL_VERSION_* macro name can
+	  give you the following error:
+	  error "COGL_VERSION_MAX_ALLOWED must be >= COGL_VERSION_MIN_REQUIRED"
+
+2014-05-03 21:05:19 -0400  Luis de Bethencourt <luis@debethencourt.com>
+
+	* tests/examples/gl/generic/cube/main.cpp:
+	* tests/examples/gl/generic/cubeyuv/main.cpp:
+	* tests/examples/gl/generic/doublecube/main.cpp:
+	* tests/examples/gl/generic/recordgraphic/main.cpp:
+	  gl/examples/generic: remove trailing whitespaces
+
+2014-05-03 20:48:33 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	  Back to development
+
+=== release 1.3.1 ===
 
 2014-05-03 18:16:21 +0200  Sebastian Dröge <sebastian@centricular.com>
 
diff --git a/NEWS b/NEWS
index c8715a5..692e58d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-This is GStreamer Bad Plugins 1.3.1
+This is GStreamer Bad Plugins 1.3.2
 
 Changes since 1.2:
 
@@ -45,6 +45,8 @@
    events and merge custom tags into them consistently.
  • playbin/playsink has support for application provided audio and video
    filters.
+ • GstDiscoverer has new and simplified API to get details about missing
+   plugins and information to pass to the plugin installer.
  • The GL library was merged from gst-plugins-gl to gst-plugins-bad,
    providing a generic infrastructure for handling GL inside GStreamer
    pipelines and a plugin with some elements using these, especially
@@ -62,6 +64,14 @@
      of the existing V4L2 elements and the corresponding
      infrastructure.
      The v4l2videodec element replaces the mfcdec element.
+   ∘ New downloadbuffer element that replaces the download
+     buffering feature of queue2. Compared to queue2's code
+     it is much simpler and only for this single use case.
+     A noteworthy new feature is that it's downloading gaps
+     in the already downloaded stream parts when nothing else
+     is to be downloaded.
+     This is now used by playbin when download buffering is
+     enabled.
    ∘ rtpstreampay and rtpstreamdepay elements for transmitting
      RTP packets over a stream API (e.g. TCP) according to
      RFC 4571.
@@ -78,7 +88,7 @@
      are available on OS X and iOS now.
 
  • Other changes:
-   ∘ gst-libav now uses libav 10, and gained support for H265/HEVC.
+   ∘ gst-libav now uses libav 10.1, and gained support for H265/HEVC.
    ∘ Support for hardware codecs and special memory types has been
      improved with bugfixes and feature additions in various plugins
      and base classes.
@@ -95,6 +105,9 @@
      reliable now and supports more HLS features like trick modes.
      Also fragments are pushed downstream while they're downloaded
      now instead of waiting for each fragment to finish.
+   ∘ dashdemux and mssdemux are now also pushing fragments downstream
+     while they're downloaded instead of waiting for each fragment to
+     finish.
    ∘ videoflip can automatically flip based on the orientation tag.
    ∘ openjpeg supports the OpenJPEG2 API.
    ∘ gst-rtsp-server supports SRTP and MIKEY now.
@@ -107,4 +120,3 @@
    element.
  • The mfcdec element was removed and replaced by v4l2videodec.
  • osxvideosink is only available in OS X 10.6 or newer.
-
diff --git a/RELEASE b/RELEASE
index 3b179d8..650777d 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,8 +1,8 @@
 
-Release notes for GStreamer Bad Plugins 1.3.1
+Release notes for GStreamer Bad Plugins 1.3.2
 
 
-The GStreamer team is pleased to announce the first release of the unstable
+The GStreamer team is pleased to announce the second release of the unstable
 1.3 release series. The 1.3 release series is adding new features on top of
 the 1.0 and 1.2 series and is part of the API and ABI-stable 1.x release
 series of the GStreamer multimedia framework. The unstable 1.3 release series
@@ -75,138 +75,22 @@
 
 Bugs fixed in this release
      
-      * 709414 : dvbsrc: Uses deprecated field frontend type and add DVB S2/T2 support
-      * 723670 : Move  VideoToolBox elements from applemedia to a different plugin
-      * 728514 : glimagesink fails with gst-sdk android tutorial-5 / tutorial-4
-      * 728356 : jpegparse: Does not passthrough timestamps depending on downstream elements
-      * 519220 : Add W64/R64 support
-      * 574408 : audiomixer: Need an element to do synchronized audio mixing
-      * 628055 : tsdemux: Handle PCR/PTS/DTS discont/gaps
-      * 644395 : mpegtsdemux / mpegtsmux: data flow error
-      * 664443 : h264parse: Parsing shifts timestamps between frames
-      * 671136 : mpegtsmux: add support for SDT and NIT tables for DVB-S/DVB-T
-      * 675869 : hlsdemux: potential dead-lock using GstTask
-      * 695846 : hlsdemux: No longer switches pads on playlist changes
-      * 698748 : mpegtsmux: improper timestamping of output packets
-      * 699924 : smoothstreaming: no audio with BBC bigbuckbunny stream
-      * 701404 : dashdemux: should not buffer the entire Period
-      * 703342 : gl: implement support for DispManX (Raspberry Pi)
-      * 703343 : Add EGLImage support (consume and provide buffer pool)
-      * 706054 : move GstEGLImageBufferPool and allocator from eglglessink to gstegl lib
-      * 708345 : liveadder: round when calculation length from duration
-      * 708438 : codecparsers: HEVC bitstream parser
-      * 708629 : codecparsers: Fix the quantization matrix scan order for h264
-      * 708688 : Message EISS and SCTE signaling sections on bus similar to PSI
-      * 708914 : Add openni2 plugin and openni2src element
-      * 709174 : Add avfvideosrc to the OS X build in applemedia
-      * 709180 : mpegts: Return GstMpegTsDescriptor in mpegts_get_descriptor_from_*
-      * 709454 : dvdspu: make palette change event sticky
-      * 709795 : curlsftpsink - new libcurl-based sink element for SFTP
-      * 710391 : geometrictransform: rotate: fix angle property help text
-      * 710759 : mpegts: fix uninitialized variable warnings
-      * 710810 : geometrictransform: Add a plugin for a 2D perspective transform
-      * 710855 : ivfparse: Port to 1.0
-      * 711009 : h264parse: Remove explicit PAR calculation and use the values provided by h264 codecparser
-      * 711086 : hlssink: doesn't have the sink flag set
-      * 711140 : vtenc: use proper release callback type in CVPixelBufferCreateWithPlanarBytes
-      * 711159 : eglglessink: remove unused functions in the eagl backend
-      * 711223 : Port cdaudio element to 1.
-      * 711606 : applemedia: coremediabuffer: use correct retain/release functions on CMSampleBufferRef buffer
-      * 711614 : avfvideosrc: set rank to GST_PRIMARY
-      * 711620 : curlftpsink: Create a temporary file during FTP transfer/upload
-      * 711844 : avfvideosrc: build failure
-      * 711849 : smoothstreaming: Better handling of multi audio tracks
-      * 714998 : d3dvideosink: force-aspect-ratio=false causes errors due to usage of uninitialised destination rectangle
-      * 719519 : mpegtsmux: Does not prevent plugging unparsed stream
-      * 720382 : dvbsuboverlay: fix reading of display window in display definition segment
-      * 720434 : srtp: add 256-bit keys support
-      * 721027 : mfcdec: doesn't work in odroid with kernel 3.8: dequeueing failed in input_dqbuf
-      * 721073 : shm: test_shm_sysmem_alloc unit test fails with timeout after some time
-      * 721293 : POTFILES.in is out of date
-      * 721682 : examples: tsparser: Add DVB teletext/subtitling parsing
-      * 721950 : assrender: handle video/x-raw(ANY) if downstream supports the GstVideoOverlayCompositionMeta API
-      * 722078 : schroenc: oggmux drops buffers from schroenc because of unset buffer offsets
-      * 722081 : h265parse: Fix segfault when parsing VPS
-      * 722101 : h265parser: fix a trivial overrun in a loop
-      * 722145 : tsdemux: fix memleak of PCROffsetCurrent
-      * 722240 : h265parse: update caps when receive VPS/SPS
-      * 722462 : tsdemux: Fix leak of PCROffsetGroup
-      * 722590 : applemedia: Fails to build on iOS: 'VideoToolbox/VideoToolbox.h' file not found
-      * 722669 : h265parser: Crashes on broken streams because of freeing uninitialized pointer
-      * 722699 : mpegtsmux: don't leak pad name when treating events
-      * 722934 : mxfdemux: don't use pull mode when the sequential scheduler flag is set
-      * 723243 : h264parse: Default framerate to 25/1 when no informations found
-      * 723268 : hlsdemux: Does not take into account stop time of seek events
-      * 723508 : applemedia: Fails to build on Mac OS X 10.7: 'VideoToolbox/VideoToolbox.h' file not found
-      * 723892 : mpegts: Some bugfixes regarding packetizing
-      * 723953 : mpegts: Unit test for library RFC
-      * 723995 : winks: configure test is broken - missing braces
-      * 724003 : winks: headers are not mentioned in Makefile.am
-      * 724034 : mpegts: parse extended event, component and content descriptors
-      * 724069 : mpegts: add terrestrial delivery system descriptor
-      * 724077 : shm: use shutdown() instead of close()
-      * 724100 : error: unknown type name 'gst_ks_clock'
-      * 724125 : curlsmtpsink: Timezone information is missed out in the sending out smtp email header
-      * 724255 : mpegts: Provide original binary data in the public API
-      * 724464 : mpegts: does not check data sizes when parsing descriptors
-      * 724699 : katedec: Katedec overwrites tags from oggdemux
-      * 724716 : tsparse: setting pipeline to PLAYING - > READY - > PLAYING is broken
-      * 724790 : dashdemux: live MPDs are immediately reloaded
-      * 724875 : dashdemux: attempts to fetch fragments before they're available.
-      * 724981 : mpegts: Add support for creation of SDT and service descriptor
-      * 725090 : debugutilsbad: fails gst-indent check
-      * 725134 : hlsdemux: null pointer deref if media playlist contains no media
-      * 725278 : add missed dvbsrc, mpegts docs
-      * 725412 : srtpenc: unref caps in sink query
-      * 725463 : change bandwidth to DVBv5-API
-      * 725481 : gst-plugins-bad: Ignore gcov intermediate files
-      * 725563 : tsdemux: Support DTS/DTS-HD bluray streams
-      * 725659 : wininetsrc: " iradio-mode " to default to TRUE
-      * 725893 : dvdspu: set proxy allocation flag on video sink pad
-      * 726028 : mpegvideoparse: Differentiate the mpeg-2 stream from mpeg-1 based on pic_ext also
-      * 726069 : frei0rfilter: memory corruption when the size of the incoming buffers change
-      * 726098 : sbcenc: Allow user to set channel-mode
-      * 726156 : watchdog: Add handling of paused state
-      * 726463 : dvbsuboverlay: handle video/x-raw(ANY) if downstream supports the GstVideoOverlayCompositionMeta API
-      * 726572 : fatal error: bcm_host.h: No such file or directory
-      * 726591 : W32: GL plugins can't be built in -bad
-      * 726752 : h264parser: should also expose a framerate in the case of interlaced samples
-      * 726802 : rfbsrc: doesn't send stream start event
-      * 726979 : mpegts: bugfix delivery system descriptor parsing
-      * 727104 : configure.ac: fix OSX host check
-      * 727125 : fatal error: GL/wglext.h: No such file or directory
-      * 727159 : mpegts: use g_slice_new0 and g_slice_free
-      * 727187 : mpegts: add data broadcast descriptor, stream indentifier descriptor
-      * 727306 : Decklinksrc won't initialize some models of capture cards (Patch included!)
-      * 727356 : mpegts: add dvb-t2 delivery system descriptor and typo fix
-      * 727385 : dashdemux: use correct print format for gint64
-      * 727403 : mpegts: add linkage, data_broadcast_id, private_data_specifier and parental_rating descriptors
-      * 727460 : mpegts: add atsc terrestrial virtual channel table
-      * 727512 : srtpdec: assertion when checking rtcp ssrc
-      * 727560 : mpegts: add frequency list, scrambling and dvb ca indentifier descriptor
-      * 727812 : directsoundsrc: CRITICAL, debug category not defined
-      * 727843 : glimagesink: shows only a black screen
-      * 727855 : camerabin: does not send an error if linking vfsrc pad to viewfinder queue fails
-      * 727857 : camerabin: allow " ANY " feature in viewfinderbin static pad templates
-      * 727885 : coremediabuffer: handle stride alignment
-      * 727889 : mxf: avoid dereferencing NULL pointer and leak fixes
-      * 727894 : liveadder: fix minor memory leak in caps query handler
-      * 727906 : smoothstreaming: using manifest before we have it in seeking query
-      * 727953 : avfvideosrc: check if downstream supports the video meta API
-      * 727977 : dvb: Protect against symbols added in DVB_API v5 minor version > 5
-      * 728107 : gl: No surface resizing logic on Android/iOS
-      * 728127 : glimagesink: fails to create window from gst-launch process if OS X terminal is fullscreen
-      * 728128 : glimagesink: swapped UV on OS X with avdec_h264
-      * 728249 : iosavassetsrc: port to 1.0
-      * 728439 : glimagesink: does not takes in account strides
-      * 728451 : glimagesink: expects a NSWindow instead of a NSView as the window handle
-      * 728761 : glimagesink: Deadlock on errors
-      * 728815 : GstGLMemory mix stride and width
-      * 728872 : GstGLBufferPool should avoid to allocate upload resources that are not going to be used for sure
-      * 728947 : glcolorscale: only black frames on GLESv2
-      * 726255 : y4mdec: Should check for VIDEO_META_API not CROP_META_API
-      * 711232 : Remove cdaudio
-      * 702041 : winks: Port to 1.0
+      * 721685 : mpegtsmux: Remove unused data in TsMuxSection
+      * 723167 : curlsftpsink: allow remote host authentication by public key fingerprint
+      * 726666 : gl: error: redundant redeclaration of numerous GL functions
+      * 728234 : gl: Don't unconditonally use EGL extensions
+      * 729542 : glimagesink: pool may never be activated, which leads to crash
+      * 729588 : glimagesink: cannot play 1080p on RPI
+      * 729614 : PNM Encoder is Encoding 0 x 0 images
+      * 729658 : gl: wrong negotiated caps when using eglimage
+      * 729742 : glcolorconvert: Should set alpha to 1 if source is opaque
+      * 729743 : glcolorconvert: Should preserve alpha channel when doing AYUV - > ARGB
+      * 729861 : glfilter: lose some caps informations like the framerate
+      * 729896 : glupload: Ignores stride when uploading raw data
+      * 730069 : gl: Crash when setting invalid GST_GL_PLATFORM
+      * 730133 : motioncells:fix memleak
+      * 730459 : curlsshsink: post error on bus in element, not transfer  thread
+      * 729551 : GstGLDisplay: mix platform and window
 
 ==== Download ====
 
@@ -243,123 +127,20 @@
         
 Contributors to this release
     
-      * Adrien SCH
-      * Aleix Conchillo Flaqué
-      * Alessandro Decina
-      * Alex Ashley
-      * Alexey Chernov
-      * Amaury Medeiros
-      * Andoni Morales Alastruey
-      * Andres Gomez
-      * Andrey Utkin
-      * Andy Wingo
-      * Anthony Violo
-      * Antoni Silvestre
-      * Antonio Ospite
-      * Arnaud Vrac
       * Aurélien Zanelli
-      * Benjamin Gaignard
-      * Blake Tregre
-      * Brendan Long
-      * Carlos Rafael Giani
-      * Chen Jie
-      * Chris Bass
-      * Chris Paulson-Ellis
-      * Christian Fredrik Kalager Schaller
-      * Christian Schaller
-      * Colin Macdonald
-      * Cong Zhong
-      * Dan Kegel
-      * David Hoyt
-      * David Schleef
-      * Davide Bertola
-      * Dominik Röttsches
-      * Duncan Palmer
       * Edward Hervey
-      * Eric Anholt
-      * Filippo Argiolas
-      * Gil Pedersen
-      * Gilles Dartiguelongue
-      * Greg Rutz
-      * Guillaume Desmottes
-      * Gwenole Beauchesne
-      * Haakon Sporsheim (ieei)
-      * Halley Zhao
-      * Haridass Selvaraj
-      * Jan Schmidt
-      * Javier Jardón
       * Jesper Larsen
-      * Johan Dahlin
-      * Jonathan Matthew
-      * Jorge Zapata
-      * Josep Torra
-      * Julien
       * Julien Isorce
-      * Julien Moutte
-      * Justin Joy
-      * Kipp Cannon
       * L. Sorin
-      * LRN
-      * Li Xiaowei
-      * Lihua Liu
-      * Lubosz Sarnecki
-      * Luc Deschenaux
       * Luis de Bethencourt
-      * Mariusz Buras
-      * Mark Nauwelaerts
-      * Matej Knopp
-      * Mathieu Duponchelle
-      * Matthew
       * Matthew Waters
-      * Matthieu Bouron
-      * Michael Olbrich
-      * Miguel Casas-Sanchez
-      * Miguel París Díaz
-      * Miquel Àngel Farré
-      * Mohammed Sameer
-      * Nicholas Panayis
       * Nicola Murino
       * Nicolas Dufresne
       * Olivier Crête
-      * Per x Johansson
-      * Philippe Normand
-      * Pierre Pouzol
-      * Piotr Drąg
-      * Pratheesh Gangadhar
-      * Raimo Järvi
       * Reynaldo H. Verdejo Pinochet
-      * Rico Tzschichholz
-      * Roland Peffer
-      * Ronald S. Bultje
-      * Santiago Carot-Nemesio
+      * Sanjay NM
       * Sebastian Dröge
-      * Sebastian Rasmussen
-      * Sjoerd Simons
-      * Sreerenj Balachandran
-      * Stefan Kost
-      * Stefan Ringel
-      * Stefan Sauer
-      * Steve Maynard
       * Thiago Santos
-      * Thibault Saunier
-      * Thijs Vermeir
-      * Thomas Vander Stichele
       * Tim-Philipp Müller
-      * Todd Agulnick
-      * Tonu Jaansoo
-      * Vincent Penquerc'h
-      * Vinson Lee
-      * Víctor Manuel Jáquez Leal
-      * Wang Xin-yu (王昕宇)
-      * Wei Feng
       * Wim Taymans
-      * Xavi Artigas
-      * Zallesov
-      * Zhao, Halley
-      * duhui.lee
-      * julien
-      * julien User
-      * madmac
-      * unknown
-      * Руслан Ижбулатов
  
\ No newline at end of file
diff --git a/configure b/configure
index ebc912d..b2ad0b4 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 Bad Plug-ins 1.3.1.
+# Generated by GNU Autoconf 2.69 for GStreamer Bad Plug-ins 1.3.2.
 #
 # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
 #
@@ -591,8 +591,8 @@
 # Identity of this package.
 PACKAGE_NAME='GStreamer Bad Plug-ins'
 PACKAGE_TARNAME='gst-plugins-bad'
-PACKAGE_VERSION='1.3.1'
-PACKAGE_STRING='GStreamer Bad Plug-ins 1.3.1'
+PACKAGE_VERSION='1.3.2'
+PACKAGE_STRING='GStreamer Bad Plug-ins 1.3.2'
 PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
 PACKAGE_URL=''
 
@@ -2515,7 +2515,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 Bad Plug-ins 1.3.1 to adapt to many kinds of systems.
+\`configure' configures GStreamer Bad Plug-ins 1.3.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -2590,7 +2590,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of GStreamer Bad Plug-ins 1.3.1:";;
+     short | recursive ) echo "Configuration of GStreamer Bad Plug-ins 1.3.2:";;
    esac
   cat <<\_ACEOF
 
@@ -3199,7 +3199,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-GStreamer Bad Plug-ins configure 1.3.1
+GStreamer Bad Plug-ins configure 1.3.2
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -4172,7 +4172,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 Bad Plug-ins $as_me 1.3.1, which was
+It was created by GStreamer Bad Plug-ins $as_me 1.3.2, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -5154,7 +5154,7 @@
 
 # Define the identity of the package.
  PACKAGE='gst-plugins-bad'
- VERSION='1.3.1'
+ VERSION='1.3.2'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5365,9 +5365,9 @@
 
 
 
-  PACKAGE_VERSION_MAJOR=$(echo 1.3.1 | cut -d'.' -f1)
-  PACKAGE_VERSION_MINOR=$(echo 1.3.1 | cut -d'.' -f2)
-  PACKAGE_VERSION_MICRO=$(echo 1.3.1 | cut -d'.' -f3)
+  PACKAGE_VERSION_MAJOR=$(echo 1.3.2 | cut -d'.' -f1)
+  PACKAGE_VERSION_MINOR=$(echo 1.3.2 | cut -d'.' -f2)
+  PACKAGE_VERSION_MICRO=$(echo 1.3.2 | cut -d'.' -f3)
 
 
 
@@ -5378,7 +5378,7 @@
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
 $as_echo_n "checking nano version... " >&6; }
 
-  NANO=$(echo 1.3.1 | cut -d'.' -f4)
+  NANO=$(echo 1.3.2 | cut -d'.' -f4)
 
   if test x"$NANO" = x || test "x$NANO" = "x0" ; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
@@ -10035,10 +10035,10 @@
 done
 
 
-  GST_CURRENT=301
+  GST_CURRENT=302
   GST_REVISION=0
-  GST_AGE=301
-  GST_LIBVERSION=301:0:301
+  GST_AGE=302
+  GST_LIBVERSION=302:0:302
 
 
 
@@ -14363,8 +14363,8 @@
 
 
 
-GST_REQ=1.3.1
-GSTPB_REQ=1.3.1
+GST_REQ=1.3.2
+GSTPB_REQ=1.3.2
 
 
 
@@ -33710,6 +33710,71 @@
   fi
 fi
 
+if test "x$HAVE_GL" = "xyes" -a "x$HAVE_GLES2" = "xyes"; then
+  GL_INCLUDES="
+#ifndef GL_GLEXT_PROTOTYPES
+#define GL_GLEXT_PROTOTYPES 1
+#endif
+# ifdef __APPLE__
+#  include <OpenGLES/ES2/gl.h>
+#  include <OpenGLES/ES2/glext.h>
+# else
+#  include <GLES2/gl2.h>
+#  include <GLES2/gl2ext.h>
+# endif
+# if __APPLE__
+#  include <OpenGL/OpenGL.h>
+#  include <OpenGL/gl.h>
+#  include <OpenGL/glu.h>
+# else
+#  include <GL/gl.h>
+#  include <GL/glu.h>
+#  if __WIN32__ || _WIN32
+#   include <GL/glext.h>
+#  endif
+# endif
+"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is possible to include both GL and GLES2 headers" >&5
+$as_echo_n "checking whether it is possible to include both GL and GLES2 headers... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$GL_INCLUDES
+int
+main ()
+{
+
+    #if !defined(GL_FALSE)
+    #error Failed to include GL headers
+    #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    if test "x$NEED_GLES2" = "xyes"; then
+      if test "x$NEED_OPENGL" = "xyes"; then
+        as_fn_error $? "Cannot seem to include both GL and GLES2 headers. Try disabling one API" "$LINENO" 5
+      fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling Desktop GL support" >&5
+$as_echo "$as_me: WARNING: Disabling Desktop GL support" >&2;}
+      HAVE_OPENGL=no
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling GL|ES 2.0 support" >&5
+$as_echo "$as_me: WARNING: Disabling GL|ES 2.0 support" >&2;}
+      HAVE_GLES2=no
+    fi
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
 #dnl Check for OpenGL, GLU
 echo host is $host
 case $host in
@@ -34236,8 +34301,16 @@
 GL_INCLUDES=""
 if test "x$USE_GLES2" = "xyes"; then
   GL_INCLUDES="$GL_INCLUDES
-# include <GLES2/gl2.h>
-# include <GLES2/gl2ext.h>
+#ifndef GL_GLEXT_PROTOTYPES
+#define GL_GLEXT_PROTOTYPES 1
+#endif
+# ifdef __APPLE__
+#  include <OpenGLES/ES2/gl.h>
+#  include <OpenGLES/ES2/glext.h>
+# else
+#  include <GLES2/gl2.h>
+#  include <GLES2/gl2ext.h>
+# endif
 "
 fi
 
@@ -34246,9 +34319,10 @@
 # if __APPLE__
 #  include <OpenGL/OpenGL.h>
 #  include <OpenGL/gl.h>
+#  include <OpenGL/glu.h>
 # else
-#  include <GL/glu.h>
 #  include <GL/gl.h>
+#  include <GL/glu.h>
 #  if __WIN32__ || _WIN32
 #   include <GL/glext.h>
 #  endif
@@ -56007,7 +56081,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by GStreamer Bad Plug-ins $as_me 1.3.1, which was
+This file was extended by GStreamer Bad Plug-ins $as_me 1.3.2, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -56073,7 +56147,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 Bad Plug-ins config.status 1.3.1
+GStreamer Bad Plug-ins config.status 1.3.2
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index 6258f4a..f39ed8c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@
 dnl initialize autoconf
 dnl when going to/from release please set the nano (fourth number) right !
 dnl releases only do Wall, cvs and prerelease does Werror too
-AC_INIT([GStreamer Bad Plug-ins],[1.3.1],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gst-plugins-bad])
+AC_INIT([GStreamer Bad Plug-ins],[1.3.2],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gst-plugins-bad])
 
 AG_GST_INIT
 
@@ -48,11 +48,11 @@
 dnl - interfaces added -> increment AGE
 dnl - interfaces removed -> AGE = 0
 dnl sets GST_LT_LDFLAGS
-AS_LIBTOOL(GST, 301, 0, 301)
+AS_LIBTOOL(GST, 302, 0, 302)
 
 dnl *** required versions of GStreamer stuff ***
-GST_REQ=1.3.1
-GSTPB_REQ=1.3.1
+GST_REQ=1.3.2
+GSTPB_REQ=1.3.2
 
 dnl *** autotools stuff ****
 
@@ -812,6 +812,51 @@
   fi
 fi
 
+dnl check if we can include both GL and GLES2 at the same time
+if test "x$HAVE_GL" = "xyes" -a "x$HAVE_GLES2" = "xyes"; then
+  GL_INCLUDES="
+#ifndef GL_GLEXT_PROTOTYPES
+#define GL_GLEXT_PROTOTYPES 1
+#endif
+# ifdef __APPLE__
+#  include <OpenGLES/ES2/gl.h>
+#  include <OpenGLES/ES2/glext.h>
+# else
+#  include <GLES2/gl2.h>
+#  include <GLES2/gl2ext.h>
+# endif
+# if __APPLE__
+#  include <OpenGL/OpenGL.h>
+#  include <OpenGL/gl.h>
+#  include <OpenGL/glu.h>
+# else
+#  include <GL/gl.h>
+#  include <GL/glu.h>
+#  if __WIN32__ || _WIN32
+#   include <GL/glext.h>
+#  endif
+# endif
+"
+  AC_MSG_CHECKING([whether it is possible to include both GL and GLES2 headers])
+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$GL_INCLUDES]], [[
+    #if !defined(GL_FALSE)
+    #error Failed to include GL headers
+    #endif
+    ]])],[ AC_MSG_RESULT(yes)
+    ],[AC_MSG_RESULT(no)
+    if test "x$NEED_GLES2" = "xyes"; then
+      if test "x$NEED_OPENGL" = "xyes"; then
+        AC_MSG_ERROR([Cannot seem to include both GL and GLES2 headers. Try disabling one API])
+      fi
+      AC_MSG_WARN([Disabling Desktop GL support])
+      HAVE_OPENGL=no
+    else
+      AC_MSG_WARN([Disabling GL|ES 2.0 support])
+      HAVE_GLES2=no
+    fi
+  ])
+fi
+
 #dnl Check for OpenGL, GLU
 echo host is $host
 case $host in
@@ -1225,8 +1270,16 @@
 GL_INCLUDES=""
 if test "x$USE_GLES2" = "xyes"; then
   GL_INCLUDES="$GL_INCLUDES
-# include <GLES2/gl2.h>
-# include <GLES2/gl2ext.h>
+#ifndef GL_GLEXT_PROTOTYPES
+#define GL_GLEXT_PROTOTYPES 1
+#endif
+# ifdef __APPLE__
+#  include <OpenGLES/ES2/gl.h>
+#  include <OpenGLES/ES2/glext.h>
+# else
+#  include <GLES2/gl2.h>
+#  include <GLES2/gl2ext.h>
+# endif
 "
 fi
 
@@ -1235,9 +1288,10 @@
 # if __APPLE__
 #  include <OpenGL/OpenGL.h>
 #  include <OpenGL/gl.h>
+#  include <OpenGL/glu.h>
 # else
-#  include <GL/glu.h>
 #  include <GL/gl.h>
+#  include <GL/glu.h>
 #  if __WIN32__ || _WIN32
 #   include <GL/glext.h>
 #  endif
diff --git a/docs/libs/gst-plugins-bad-libs-sections.txt b/docs/libs/gst-plugins-bad-libs-sections.txt
index a06d2f7..50dba86 100644
--- a/docs/libs/gst-plugins-bad-libs-sections.txt
+++ b/docs/libs/gst-plugins-bad-libs-sections.txt
@@ -711,7 +711,6 @@
 GstGLColorConvertClass
 gst_gl_color_convert_new
 gst_gl_color_convert_init_format
-gst_gl_color_convert_set_texture_scaling
 gst_gl_color_convert_perform
 <SUBSECTION Standard>
 GstGLColorConvertPrivate
@@ -743,6 +742,7 @@
 gst_gl_context_get_gl_api
 gst_gl_context_get_gl_context
 gst_gl_context_get_platform
+gst_gl_context_check_feature
 <SUBSECTION Standard>
 GST_GL_CONTEXT
 GST_GL_IS_CONTEXT
@@ -826,8 +826,10 @@
 <SECTION>
 <FILE>gstgldisplay</FILE>
 <TITLE>GstGLDisplay</TITLE>
+GstGLDisplayType
 GstGLDisplay
 gst_gl_display_new
+gst_gl_display_get_handle_type
 gst_context_get_gl_display
 gst_context_set_gl_display
 <SUBSECTION Standard>
@@ -846,9 +848,8 @@
 <TITLE>GstGLDownload</TITLE>
 GstGLDownload
 gst_gl_download_new
-gst_gl_download_init_format
+gst_gl_download_set_format
 gst_gl_download_perform_with_data
-gst_gl_download_perform_with_memory
 <SUBSECTION Standard>
 GST_GL_DOWNLOAD
 GST_GL_DOWNLOAD_CAST
@@ -1008,7 +1009,8 @@
 <TITLE>GstGLUpload</TITLE>
 GstGLUpload
 gst_gl_upload_new
-gst_gl_upload_init_format
+gst_gl_upload_set_format
+gst_gl_upload_get_format
 gst_gl_upload_add_video_gl_texture_upload_meta
 gst_gl_upload_perform_with_data
 gst_gl_upload_perform_with_memory
diff --git a/docs/libs/html/GstGLBufferPool.html b/docs/libs/html/GstGLBufferPool.html
index 2cabbee..96a3432 100644
--- a/docs/libs/html/GstGLBufferPool.html
+++ b/docs/libs/html/GstGLBufferPool.html
@@ -41,7 +41,7 @@
 </colgroup>
 <tbody><tr>
 <td class="function_type">
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> *
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBufferPool.html"><span class="returnvalue">GstBufferPool</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="GstGLBufferPool.html#gst-gl-buffer-pool-new" title="gst_gl_buffer_pool_new ()">gst_gl_buffer_pool_new</a> <span class="c_punctuation">()</span>
@@ -73,7 +73,7 @@
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
     <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
         <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
-            <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool">GstBufferPool</a>
+            <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBufferPool.html">GstBufferPool</a>
                 <span class="lineart">╰──</span> GstGLBufferPool
 </pre>
 </div>
@@ -82,13 +82,13 @@
 <p>a <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool"><span class="type">GstGLBufferPool</span></a> is an object that allocates buffers with <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
 <p>A <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool"><span class="type">GstGLBufferPool</span></a> is created with <a class="link" href="GstGLBufferPool.html#gst-gl-buffer-pool-new" title="gst_gl_buffer_pool_new ()"><code class="function">gst_gl_buffer_pool_new()</code></a></p>
 <p><a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool"><span class="type">GstGLBufferPool</span></a> implements the VideoMeta buffer pool option 
-<span class="type">GST_BUFFER_POOL_OPTION_VIDEO_META</span></p>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-GstVideoPool.html#GST-BUFFER-POOL-OPTION-VIDEO-META:CAPS"><span class="type">GST_BUFFER_POOL_OPTION_VIDEO_META</span></a></p>
 </div>
 <div class="refsect1">
 <a name="GstGLBufferPool.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
 <a name="gst-gl-buffer-pool-new"></a><h3>gst_gl_buffer_pool_new ()</h3>
-<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> *
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBufferPool.html"><span class="returnvalue">GstBufferPool</span></a> *
 gst_gl_buffer_pool_new (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>);</pre>
 <div class="refsect3">
 <a name="id-1.2.7.3.7.2.4"></a><h4>Parameters</h4>
@@ -107,7 +107,7 @@
 </div>
 <div class="refsect3">
 <a name="id-1.2.7.3.7.2.5"></a><h4>Returns</h4>
-<p> a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="type">GstBufferPool</span></a> that allocates buffers with <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
+<p> a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBufferPool.html"><span class="type">GstBufferPool</span></a> that allocates buffers with <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
 <p></p>
 </div>
 </div>
@@ -131,7 +131,7 @@
 </div>
 <div class="refsect1">
 <a name="GstGLBufferPool.see-also"></a><h2>See Also</h2>
-<p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="type">GstBufferPool</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
+<p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBufferPool.html"><span class="type">GstBufferPool</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/libs/html/GstGLColorConvert.html b/docs/libs/html/GstGLColorConvert.html
index d5e9132..c5f8571 100644
--- a/docs/libs/html/GstGLColorConvert.html
+++ b/docs/libs/html/GstGLColorConvert.html
@@ -53,22 +53,6 @@
 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
 <td class="function_name">
-<a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-init-format" title="gst_gl_color_convert_init_format ()">gst_gl_color_convert_init_format</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-set-texture-scaling" title="gst_gl_color_convert_set_texture_scaling ()">gst_gl_color_convert_set_texture_scaling</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
 <a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-perform" title="gst_gl_color_convert_perform ()">gst_gl_color_convert_perform</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -105,7 +89,9 @@
 <div class="refsect1">
 <a name="GstGLColorConvert.object-hierarchy"></a><h2>Object Hierarchy</h2>
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> GstGLColorConvert
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstGLColorConvert
 </pre>
 </div>
 <div class="refsect1">
@@ -114,7 +100,7 @@
 formats using OpenGL Shaders.</p>
 <p>A <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert"><span class="type">GstGLColorConvert</span></a> can be created with <a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-new" title="gst_gl_color_convert_new ()"><code class="function">gst_gl_color_convert_new()</code></a>.</p>
 <p>For handling stride scaling in the shader, see
-<a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-set-texture-scaling" title="gst_gl_color_convert_set_texture_scaling ()"><code class="function">gst_gl_color_convert_set_texture_scaling()</code></a>.</p>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/GstGLColorConvert.html#gst-gl-color-convert-set-texture-scaling"><code class="function">gst_gl_color_convert_set_texture_scaling()</code></a>.</p>
 </div>
 <div class="refsect1">
 <a name="GstGLColorConvert.functions_details"></a><h2>Functions</h2>
@@ -125,82 +111,6 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="gst-gl-color-convert-init-format"></a><h3>gst_gl_color_convert_init_format ()</h3>
-<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_color_convert_init_format (<em class="parameter"><code><a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert"><span class="type">GstGLColorConvert</span></a> *convert</code></em>,
-                                  <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *in_info</code></em>,
-                                  <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *out_info</code></em>);</pre>
-<p>Initializes <em class="parameter"><code>convert</code></em>
- with the information required for conversion.</p>
-<div class="refsect3">
-<a name="id-1.2.7.4.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>convert</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert"><span class="type">GstGLColorConvert</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>in_info</p></td>
-<td class="parameter_description"><p>input <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>out_info</p></td>
-<td class="parameter_description"><p>output <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.7.4.7.3.6"></a><h4>Returns</h4>
-<p> whether the initialization was successful</p>
-<p></p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-color-convert-set-texture-scaling"></a><h3>gst_gl_color_convert_set_texture_scaling ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_color_convert_set_texture_scaling
-                               (<em class="parameter"><code><a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert"><span class="type">GstGLColorConvert</span></a> *convert</code></em>,
-                                <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> scaling[GST_VIDEO_MAX_PLANES][2]</code></em>);</pre>
-<p>Scales the input textures by the given amount.  Useful for performing stride
-scaling in a shader on OpenGL platforms that do not support
-GL_PIXEL_[UN]PACK_LENGTH such as GL|ES 2.0.</p>
-<div class="refsect3">
-<a name="id-1.2.7.4.7.4.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>convert</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert"><span class="type">GstGLColorConvert</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>scaling</p></td>
-<td class="parameter_description"><p>array of texture scaling coefficients stored in width, height
-order per texture being converted.</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
 <a name="gst-gl-color-convert-perform"></a><h3>gst_gl_color_convert_perform ()</h3>
 <pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 gst_gl_color_convert_perform (<em class="parameter"><code><a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert"><span class="type">GstGLColorConvert</span></a> *convert</code></em>,
@@ -208,9 +118,9 @@
                               <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> *out_tex[GST_VIDEO_MAX_PLANES]</code></em>);</pre>
 <p>Converts the data contained in in_tex into out_tex using the formats
 specified by the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a>s passed to
-<a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-init-format" title="gst_gl_color_convert_init_format ()"><code class="function">gst_gl_color_convert_init_format()</code></a></p>
+<code class="function">gst_gl_color_convert_set_format()</code></p>
 <div class="refsect3">
-<a name="id-1.2.7.4.7.5.5"></a><h4>Parameters</h4>
+<a name="id-1.2.7.4.7.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -237,7 +147,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.7.4.7.5.6"></a><h4>Returns</h4>
+<a name="id-1.2.7.4.7.3.6"></a><h4>Returns</h4>
 <p> whether the conversion was successful</p>
 <p></p>
 </div>
@@ -267,7 +177,7 @@
 <div class="refsect2">
 <a name="GstGLColorConvertClass"></a><h3>GstGLColorConvertClass</h3>
 <pre class="programlisting">typedef struct {
-  GObjectClass object_class;
+  GstObjectClass object_class;
 } GstGLColorConvertClass;
 </pre>
 <p>The <a class="link" href="GstGLColorConvert.html#GstGLColorConvertClass" title="GstGLColorConvertClass"><span class="type">GstGLColorConvertClass</span></a> struct only contains private data</p>
diff --git a/docs/libs/html/GstGLContext.html b/docs/libs/html/GstGLContext.html
index 18b299e..88c438c 100644
--- a/docs/libs/html/GstGLContext.html
+++ b/docs/libs/html/GstGLContext.html
@@ -148,6 +148,14 @@
 <a class="link" href="GstGLContext.html#gst-gl-context-get-gl-context" title="gst_gl_context_get_gl_context ()">gst_gl_context_get_gl_context</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
+<tr>
+<td class="function_type">
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstGLContext.html#gst-gl-context-check-feature" title="gst_gl_context_check_feature ()">gst_gl_context_check_feature</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
 </tbody>
 </table></div>
 </div>
@@ -173,7 +181,9 @@
 <div class="refsect1">
 <a name="GstGLContext.object-hierarchy"></a><h2>Object Hierarchy</h2>
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> GstGLContext
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstGLContext
 </pre>
 </div>
 <div class="refsect1">
@@ -579,6 +589,44 @@
 <p></p>
 </div>
 </div>
+<hr>
+<div class="refsect2">
+<a name="gst-gl-context-check-feature"></a><h3>gst_gl_context_check_feature ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_gl_context_check_feature (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
+                              <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *feature</code></em>);</pre>
+<p>Some features require that the context be created before it is possible to
+determine their existence and so will fail if that is not the case.</p>
+<div class="refsect3">
+<a name="id-1.2.7.5.7.16.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>context</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>feature</p></td>
+<td class="parameter_description"><p>a platform specific feature</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.7.5.7.16.6"></a><h4>Returns</h4>
+<p> Whether <em class="parameter"><code>feature</code></em>
+is supported by <em class="parameter"><code>context</code></em>
+</p>
+<p></p>
+</div>
+</div>
 </div>
 <div class="refsect1">
 <a name="GstGLContext.other_details"></a><h2>Types and Values</h2>
diff --git a/docs/libs/html/GstGLDisplay.html b/docs/libs/html/GstGLDisplay.html
index 812fdb7..54d16c3 100644
--- a/docs/libs/html/GstGLDisplay.html
+++ b/docs/libs/html/GstGLDisplay.html
@@ -50,6 +50,14 @@
 </tr>
 <tr>
 <td class="function_type">
+<a class="link" href="GstGLDisplay.html#GstGLDisplayType" title="enum GstGLDisplayType"><span class="returnvalue">GstGLDisplayType</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstGLDisplay.html#gst-gl-display-get-handle-type" title="gst_gl_display_get_handle_type ()">gst_gl_display_get_handle_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
 <td class="function_name">
@@ -74,22 +82,30 @@
 <col width="150px" class="name">
 <col class="description">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="GstGLDisplay.html#GstGLDisplayType" title="enum GstGLDisplayType">GstGLDisplayType</a></td>
+</tr>
+<tr>
 <td class="datatype_keyword"> </td>
 <td class="function_name"><a class="link" href="GstGLDisplay.html#GstGLDisplay-struct" title="GstGLDisplay">GstGLDisplay</a></td>
-</tr></tbody>
+</tr>
+</tbody>
 </table></div>
 </div>
 <div class="refsect1">
 <a name="GstGLDisplay.object-hierarchy"></a><h2>Object Hierarchy</h2>
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> GstGLDisplay
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstGLDisplay
 </pre>
 </div>
 <div class="refsect1">
 <a name="GstGLDisplay.description"></a><h2>Description</h2>
 <p><a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> represents a connection to the underlying windowing system. 
-Elements are required to make use of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstContext.html#GstContext"><span class="type">GstContext</span></a> to share and propogate
+Elements are required to make use of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstContext.html"><span class="type">GstContext</span></a> to share and propogate
 a <a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a>.</p>
 </div>
 <div class="refsect1">
@@ -106,10 +122,9 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="gst-context-get-gl-display"></a><h3>gst_context_get_gl_display ()</h3>
-<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_context_get_gl_display (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstContext.html#GstContext"><span class="type">GstContext</span></a> *context</code></em>,
-                            <em class="parameter"><code><a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> **display</code></em>);</pre>
+<a name="gst-gl-display-get-handle-type"></a><h3>gst_gl_display_get_handle_type ()</h3>
+<pre class="programlisting"><a class="link" href="GstGLDisplay.html#GstGLDisplayType" title="enum GstGLDisplayType"><span class="returnvalue">GstGLDisplayType</span></a>
+gst_gl_display_get_handle_type (<em class="parameter"><code><a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> *display</code></em>);</pre>
 <div class="refsect3">
 <a name="id-1.2.7.10.7.3.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
@@ -118,10 +133,38 @@
 <col class="parameters_description">
 <col width="200px" class="parameters_annotations">
 </colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>display</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.7.10.7.3.5"></a><h4>Returns</h4>
+<p> the <a class="link" href="GstGLDisplay.html#GstGLDisplayType" title="enum GstGLDisplayType"><span class="type">GstGLDisplayType</span></a> of <em class="parameter"><code>display</code></em>
+</p>
+<p></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-context-get-gl-display"></a><h3>gst_context_get_gl_display ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_context_get_gl_display (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstContext.html"><span class="type">GstContext</span></a> *context</code></em>,
+                            <em class="parameter"><code><a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> **display</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.7.10.7.4.4"></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>context</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstContext.html#GstContext"><span class="type">GstContext</span></a></p></td>
+<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstContext.html"><span class="type">GstContext</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -133,7 +176,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.7.10.7.3.5"></a><h4>Returns</h4>
+<a name="id-1.2.7.10.7.4.5"></a><h4>Returns</h4>
 <p> Whether <em class="parameter"><code>display</code></em>
 was in <em class="parameter"><code>context</code></em>
 </p>
@@ -144,13 +187,13 @@
 <div class="refsect2">
 <a name="gst-context-set-gl-display"></a><h3>gst_context_set_gl_display ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
-gst_context_set_gl_display (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstContext.html#GstContext"><span class="type">GstContext</span></a> *context</code></em>,
+gst_context_set_gl_display (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstContext.html"><span class="type">GstContext</span></a> *context</code></em>,
                             <em class="parameter"><code><a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> *display</code></em>);</pre>
 <p>Sets <em class="parameter"><code>display</code></em>
  on <em class="parameter"><code>context</code></em>
 </p>
 <div class="refsect3">
-<a name="id-1.2.7.10.7.4.5"></a><h4>Parameters</h4>
+<a name="id-1.2.7.10.7.5.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -160,7 +203,7 @@
 <tbody>
 <tr>
 <td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstContext.html#GstContext"><span class="type">GstContext</span></a></p></td>
+<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstContext.html"><span class="type">GstContext</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
@@ -176,6 +219,62 @@
 <div class="refsect1">
 <a name="GstGLDisplay.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
+<a name="GstGLDisplayType"></a><h3>enum GstGLDisplayType</h3>
+<div class="refsect3">
+<a name="id-1.2.7.10.8.2.3"></a><h4>Members</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-NONE:CAPS"></a>GST_GL_DISPLAY_TYPE_NONE</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-X11:CAPS"></a>GST_GL_DISPLAY_TYPE_X11</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-WAYLAND:CAPS"></a>GST_GL_DISPLAY_TYPE_WAYLAND</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-COCOA:CAPS"></a>GST_GL_DISPLAY_TYPE_COCOA</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-WIN32:CAPS"></a>GST_GL_DISPLAY_TYPE_WIN32</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-DISPMANX:CAPS"></a>GST_GL_DISPLAY_TYPE_DISPMANX</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-EGL:CAPS"></a>GST_GL_DISPLAY_TYPE_EGL</p></td>
+<td> </td>
+<td> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-GL-DISPLAY-TYPE-ANY:CAPS"></a>GST_GL_DISPLAY_TYPE_ANY</p></td>
+<td> </td>
+<td> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GstGLDisplay-struct"></a><h3>GstGLDisplay</h3>
 <pre class="programlisting">typedef struct _GstGLDisplay GstGLDisplay;</pre>
 <p>The contents of a <a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> are private and should only be accessed
@@ -184,7 +283,7 @@
 </div>
 <div class="refsect1">
 <a name="GstGLDisplay.see-also"></a><h2>See Also</h2>
-<p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstContext.html#GstContext"><span class="type">GstContext</span></a>, <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a>, <a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a></p>
+<p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstContext.html"><span class="type">GstContext</span></a>, <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a>, <a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a></p>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/libs/html/GstGLDownload.html b/docs/libs/html/GstGLDownload.html
index b9034d6..14c2d99 100644
--- a/docs/libs/html/GstGLDownload.html
+++ b/docs/libs/html/GstGLDownload.html
@@ -50,10 +50,10 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+<span class="returnvalue">void</span>
 </td>
 <td class="function_name">
-<a class="link" href="GstGLDownload.html#gst-gl-download-init-format" title="gst_gl_download_init_format ()">gst_gl_download_init_format</a> <span class="c_punctuation">()</span>
+<a class="link" href="GstGLDownload.html#gst-gl-download-set-format" title="gst_gl_download_set_format ()">gst_gl_download_set_format</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
@@ -64,14 +64,6 @@
 <a class="link" href="GstGLDownload.html#gst-gl-download-perform-with-data" title="gst_gl_download_perform_with_data ()">gst_gl_download_perform_with_data</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
-<tr>
-<td class="function_type">
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLDownload.html#gst-gl-download-perform-with-memory" title="gst_gl_download_perform_with_memory ()">gst_gl_download_perform_with_memory</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
 </tbody>
 </table></div>
 </div>
@@ -91,7 +83,9 @@
 <div class="refsect1">
 <a name="GstGLDownload.object-hierarchy"></a><h2>Object Hierarchy</h2>
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> GstGLDownload
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstGLDownload
 </pre>
 </div>
 <div class="refsect1">
@@ -128,12 +122,10 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="gst-gl-download-init-format"></a><h3>gst_gl_download_init_format ()</h3>
-<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_download_init_format (<em class="parameter"><code><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> *download</code></em>,
-                             <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoFormat"><span class="type">GstVideoFormat</span></a> v_format</code></em>,
-                             <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> out_width</code></em>,
-                             <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> out_height</code></em>);</pre>
+<a name="gst-gl-download-set-format"></a><h3>gst_gl_download_set_format ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_gl_download_set_format (<em class="parameter"><code><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> *download</code></em>,
+                            <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *out_info</code></em>);</pre>
 <p>Initializes <em class="parameter"><code>download</code></em>
  with the information required for download.</p>
 <div class="refsect3">
@@ -168,11 +160,6 @@
 </tbody>
 </table></div>
 </div>
-<div class="refsect3">
-<a name="id-1.2.7.11.7.3.6"></a><h4>Returns</h4>
-<p> whether the initialization was successful</p>
-<p></p>
-</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -185,7 +172,7 @@
  into <em class="parameter"><code>data</code></em>
 . <em class="parameter"><code>data</code></em>
  size and format is specified by
-the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoFormat"><span class="type">GstVideoFormat</span></a> passed to <a class="link" href="GstGLDownload.html#gst-gl-download-init-format" title="gst_gl_download_init_format ()"><code class="function">gst_gl_download_init_format()</code></a></p>
+the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoFormat"><span class="type">GstVideoFormat</span></a> passed to <a class="link" href="GstGLDownload.html#gst-gl-download-set-format" title="gst_gl_download_set_format ()"><code class="function">gst_gl_download_set_format()</code></a></p>
 <div class="refsect3">
 <a name="id-1.2.7.11.7.4.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
@@ -219,42 +206,6 @@
 <p></p>
 </div>
 </div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-download-perform-with-memory"></a><h3>gst_gl_download_perform_with_memory ()</h3>
-<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_download_perform_with_memory (<em class="parameter"><code><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> *download</code></em>,
-                                     <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> *gl_mem</code></em>);</pre>
-<p>Downloads the texture in <em class="parameter"><code>gl_mem</code></em>
-</p>
-<div class="refsect3">
-<a name="id-1.2.7.11.7.5.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>download</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>gl_mem</p></td>
-<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.7.11.7.5.6"></a><h4>Returns</h4>
-<p> whether the download was successful</p>
-<p></p>
-</div>
-</div>
 </div>
 <div class="refsect1">
 <a name="GstGLDownload.other_details"></a><h2>Types and Values</h2>
diff --git a/docs/libs/html/GstGLUpload.html b/docs/libs/html/GstGLUpload.html
index 6975e4d..d23ec05 100644
--- a/docs/libs/html/GstGLUpload.html
+++ b/docs/libs/html/GstGLUpload.html
@@ -50,10 +50,18 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+<span class="returnvalue">void</span>
 </td>
 <td class="function_name">
-<a class="link" href="GstGLUpload.html#gst-gl-upload-init-format" title="gst_gl_upload_init_format ()">gst_gl_upload_init_format</a> <span class="c_punctuation">()</span>
+<a class="link" href="GstGLUpload.html#gst-gl-upload-set-format" title="gst_gl_upload_set_format ()">gst_gl_upload_set_format</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="returnvalue">GstVideoInfo</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GstGLUpload.html#gst-gl-upload-get-format" title="gst_gl_upload_get_format ()">gst_gl_upload_get_format</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
 <tr>
@@ -115,7 +123,9 @@
 <div class="refsect1">
 <a name="GstGLUpload.object-hierarchy"></a><h2>Object Hierarchy</h2>
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> GstGLUpload
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstGLUpload
 </pre>
 </div>
 <div class="refsect1">
@@ -152,10 +162,10 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="gst-gl-upload-init-format"></a><h3>gst_gl_upload_init_format ()</h3>
-<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_upload_init_format (<em class="parameter"><code><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a> *upload</code></em>,
-                           <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *in_info</code></em>);</pre>
+<a name="gst-gl-upload-set-format"></a><h3>gst_gl_upload_set_format ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_gl_upload_set_format (<em class="parameter"><code><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a> *upload</code></em>,
+                          <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *in_info</code></em>);</pre>
 <p>Initializes <em class="parameter"><code>upload</code></em>
  with the information required for upload.</p>
 <div class="refsect3">
@@ -180,10 +190,31 @@
 </tbody>
 </table></div>
 </div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-gl-upload-get-format"></a><h3>gst_gl_upload_get_format ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="returnvalue">GstVideoInfo</span></a> *
+gst_gl_upload_get_format (<em class="parameter"><code><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a> *upload</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.3.6"></a><h4>Returns</h4>
-<p> whether the initialization was successful</p>
-<p></p>
+<a name="id-1.2.7.16.7.4.4"></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>upload</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.7.16.7.4.5"></a><h4>Returns</h4>
+<p> The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> set by <a class="link" href="GstGLUpload.html#gst-gl-upload-set-format" title="gst_gl_upload_set_format ()"><code class="function">gst_gl_upload_set_format()</code></a>. </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>
@@ -197,7 +228,7 @@
  using <em class="parameter"><code>upload</code></em>
 </p>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.4.5"></a><h4>Parameters</h4>
+<a name="id-1.2.7.16.7.5.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -219,7 +250,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.4.6"></a><h4>Returns</h4>
+<a name="id-1.2.7.16.7.5.6"></a><h4>Returns</h4>
 <p> whether it was successful</p>
 <p></p>
 </div>
@@ -234,9 +265,9 @@
 <p>Uploads <em class="parameter"><code>data</code></em>
  into <em class="parameter"><code>texture_id</code></em>
 . data size and format is specified by
-the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a>s passed to <a class="link" href="GstGLUpload.html#gst-gl-upload-init-format" title="gst_gl_upload_init_format ()"><code class="function">gst_gl_upload_init_format()</code></a></p>
+the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a>s passed to <a class="link" href="GstGLUpload.html#gst-gl-upload-set-format" title="gst_gl_upload_set_format ()"><code class="function">gst_gl_upload_set_format()</code></a></p>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.5.5"></a><h4>Parameters</h4>
+<a name="id-1.2.7.16.7.6.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -263,7 +294,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.5.6"></a><h4>Returns</h4>
+<a name="id-1.2.7.16.7.6.6"></a><h4>Returns</h4>
 <p> whether the upload was successful</p>
 <p></p>
 </div>
@@ -280,7 +311,7 @@
  into <em class="parameter"><code>texture_id</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.6.5"></a><h4>Parameters</h4>
+<a name="id-1.2.7.16.7.7.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -307,7 +338,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.6.6"></a><h4>Returns</h4>
+<a name="id-1.2.7.16.7.7.6"></a><h4>Returns</h4>
 <p> whether the upload was successful</p>
 <p></p>
 </div>
@@ -325,7 +356,7 @@
  is valid
 until <a class="link" href="GstGLUpload.html#gst-gl-upload-release-buffer" title="gst_gl_upload_release_buffer ()"><code class="function">gst_gl_upload_release_buffer()</code></a> is called.</p>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.7.5"></a><h4>Parameters</h4>
+<a name="id-1.2.7.16.7.8.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -352,7 +383,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.7.16.7.7.6"></a><h4>Returns</h4>
+<a name="id-1.2.7.16.7.8.6"></a><h4>Returns</h4>
 <p> whether the upload was successful</p>
 <p></p>
 </div>
diff --git a/docs/libs/html/GstGLWindow.html b/docs/libs/html/GstGLWindow.html
index 582def9..b3485e6 100644
--- a/docs/libs/html/GstGLWindow.html
+++ b/docs/libs/html/GstGLWindow.html
@@ -229,7 +229,9 @@
 <div class="refsect1">
 <a name="GstGLWindow.object-hierarchy"></a><h2>Object Hierarchy</h2>
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> GstGLWindow
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstGLWindow
 </pre>
 </div>
 <div class="refsect1">
@@ -816,7 +818,7 @@
 <div class="refsect2">
 <a name="GstGLWindowClass"></a><h3>GstGLWindowClass</h3>
 <pre class="programlisting">typedef struct {
-  GObjectClass parent_class;
+  GstObjectClass parent_class;
 
   guintptr (*get_display)        (GstGLWindow *window);
   void     (*set_window_handle)  (GstGLWindow *window, guintptr id);
@@ -842,7 +844,7 @@
 </colgroup>
 <tbody>
 <tr>
-<td class="struct_member_name"><p><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GstGLWindowClass.parent-class"></a>parent_class</code></em>;</p></td>
+<td class="struct_member_name"><p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#GstObjectClass"><span class="type">GstObjectClass</span></a> <em class="structfield"><code><a name="GstGLWindowClass.parent-class"></a>parent_class</code></em>;</p></td>
 <td class="struct_member_description"><p>Parent class</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
diff --git a/docs/libs/html/api-index-full.html b/docs/libs/html/api-index-full.html
index 524c4dd..0975a4a 100644
--- a/docs/libs/html/api-index-full.html
+++ b/docs/libs/html/api-index-full.html
@@ -304,6 +304,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GstGLDisplay.html#GstGLDisplayType" title="enum GstGLDisplayType">GstGLDisplayType</a>, enum in <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="GstGLDownload.html#GstGLDownload-struct" title="GstGLDownload">GstGLDownload</a>, struct in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
 </dt>
 <dd></dd>
@@ -484,10 +488,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-init-format" title="gst_gl_color_convert_init_format ()">gst_gl_color_convert_init_format</a>, function in <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-new" title="gst_gl_color_convert_new ()">gst_gl_color_convert_new</a>, function in <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
 </dt>
 <dd></dd>
@@ -496,10 +496,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLColorConvert.html#gst-gl-color-convert-set-texture-scaling" title="gst_gl_color_convert_set_texture_scaling ()">gst_gl_color_convert_set_texture_scaling</a>, function in <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="GstGLColorConvert.html#GST-GL-COLOR-CONVERT-VIDEO-CAPS" title="GST_GL_COLOR_CONVERT_VIDEO_CAPS">GST_GL_COLOR_CONVERT_VIDEO_CAPS</a>, macro in <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
 </dt>
 <dd></dd>
@@ -508,6 +504,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GstGLContext.html#gst-gl-context-check-feature" title="gst_gl_context_check_feature ()">gst_gl_context_check_feature</a>, function in <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="gst-plugins-bad-libs-Utilities.html#gst-gl-context-check-framebuffer-status" title="gst_gl_context_check_framebuffer_status ()">gst_gl_context_check_framebuffer_status</a>, function in <a class="link" href="gst-plugins-bad-libs-Utilities.html" title="Utilities">Utilities</a>
 </dt>
 <dd></dd>
@@ -620,11 +620,11 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLDisplay.html#gst-gl-display-new" title="gst_gl_display_new ()">gst_gl_display_new</a>, function in <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
+<a class="link" href="GstGLDisplay.html#gst-gl-display-get-handle-type" title="gst_gl_display_get_handle_type ()">gst_gl_display_get_handle_type</a>, function in <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLDownload.html#gst-gl-download-init-format" title="gst_gl_download_init_format ()">gst_gl_download_init_format</a>, function in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
+<a class="link" href="GstGLDisplay.html#gst-gl-display-new" title="gst_gl_display_new ()">gst_gl_display_new</a>, function in <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
 </dt>
 <dd></dd>
 <dt>
@@ -636,7 +636,7 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLDownload.html#gst-gl-download-perform-with-memory" title="gst_gl_download_perform_with_memory ()">gst_gl_download_perform_with_memory</a>, function in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
+<a class="link" href="GstGLDownload.html#gst-gl-download-set-format" title="gst_gl_download_set_format ()">gst_gl_download_set_format</a>, function in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
 </dt>
 <dd></dd>
 <dt>
@@ -896,7 +896,7 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLUpload.html#gst-gl-upload-init-format" title="gst_gl_upload_init_format ()">gst_gl_upload_init_format</a>, function in <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
+<a class="link" href="GstGLUpload.html#gst-gl-upload-get-format" title="gst_gl_upload_get_format ()">gst_gl_upload_get_format</a>, function in <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
 </dt>
 <dd></dd>
 <dt>
@@ -920,6 +920,10 @@
 </dt>
 <dd></dd>
 <dt>
+<a class="link" href="GstGLUpload.html#gst-gl-upload-set-format" title="gst_gl_upload_set_format ()">gst_gl_upload_set_format</a>, function in <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
+</dt>
+<dd></dd>
+<dt>
 <a class="link" href="gst-plugins-bad-libs-GstGLWindowAndroid.html#gst-gl-window-android-egl-new" title="gst_gl_window_android_egl_new ()">gst_gl_window_android_egl_new</a>, function in <a class="link" href="gst-plugins-bad-libs-GstGLWindowAndroid.html" title="GstGLWindowAndroid">GstGLWindowAndroid</a>
 </dt>
 <dd></dd>
diff --git a/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2 b/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
index 2082a03..c303a77 100644
--- a/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
+++ b/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
@@ -335,8 +335,6 @@
     <keyword type="struct" name="struct GstGLBufferPool" link="GstGLBufferPool.html#GstGLBufferPool-struct"/>
     <keyword type="struct" name="struct GstGLBufferPoolClass" link="GstGLBufferPool.html#GstGLBufferPoolClass"/>
     <keyword type="function" name="gst_gl_color_convert_new ()" link="GstGLColorConvert.html#gst-gl-color-convert-new"/>
-    <keyword type="function" name="gst_gl_color_convert_init_format ()" link="GstGLColorConvert.html#gst-gl-color-convert-init-format"/>
-    <keyword type="function" name="gst_gl_color_convert_set_texture_scaling ()" link="GstGLColorConvert.html#gst-gl-color-convert-set-texture-scaling"/>
     <keyword type="function" name="gst_gl_color_convert_perform ()" link="GstGLColorConvert.html#gst-gl-color-convert-perform"/>
     <keyword type="macro" name="GST_GL_COLOR_CONVERT_FORMATS" link="GstGLColorConvert.html#GST-GL-COLOR-CONVERT-FORMATS:CAPS"/>
     <keyword type="macro" name="GST_GL_COLOR_CONVERT_VIDEO_CAPS" link="GstGLColorConvert.html#GST-GL-COLOR-CONVERT-VIDEO-CAPS"/>
@@ -356,6 +354,7 @@
     <keyword type="function" name="gst_gl_context_get_display ()" link="GstGLContext.html#gst-gl-context-get-display"/>
     <keyword type="function" name="gst_gl_context_get_gl_api ()" link="GstGLContext.html#gst-gl-context-get-gl-api"/>
     <keyword type="function" name="gst_gl_context_get_gl_context ()" link="GstGLContext.html#gst-gl-context-get-gl-context"/>
+    <keyword type="function" name="gst_gl_context_check_feature ()" link="GstGLContext.html#gst-gl-context-check-feature"/>
     <keyword type="enum" name="enum GstGLContextError" link="GstGLContext.html#GstGLContextError"/>
     <keyword type="struct" name="GstGLContext" link="GstGLContext.html#GstGLContext-struct"/>
     <keyword type="function" name="gst_gl_context_cocoa_new ()" link="gst-plugins-bad-libs-GstGLContextCocoa.html#gst-gl-context-cocoa-new"/>
@@ -367,13 +366,14 @@
     <keyword type="function" name="gst_gl_context_wgl_new ()" link="gst-plugins-bad-libs-GstGLContextWGL.html#gst-gl-context-wgl-new"/>
     <keyword type="struct" name="struct GstGLContextWGL" link="gst-plugins-bad-libs-GstGLContextWGL.html#GstGLContextWGL"/>
     <keyword type="function" name="gst_gl_display_new ()" link="GstGLDisplay.html#gst-gl-display-new"/>
+    <keyword type="function" name="gst_gl_display_get_handle_type ()" link="GstGLDisplay.html#gst-gl-display-get-handle-type"/>
     <keyword type="function" name="gst_context_get_gl_display ()" link="GstGLDisplay.html#gst-context-get-gl-display"/>
     <keyword type="function" name="gst_context_set_gl_display ()" link="GstGLDisplay.html#gst-context-set-gl-display"/>
+    <keyword type="enum" name="enum GstGLDisplayType" link="GstGLDisplay.html#GstGLDisplayType"/>
     <keyword type="struct" name="GstGLDisplay" link="GstGLDisplay.html#GstGLDisplay-struct"/>
     <keyword type="function" name="gst_gl_download_new ()" link="GstGLDownload.html#gst-gl-download-new"/>
-    <keyword type="function" name="gst_gl_download_init_format ()" link="GstGLDownload.html#gst-gl-download-init-format"/>
+    <keyword type="function" name="gst_gl_download_set_format ()" link="GstGLDownload.html#gst-gl-download-set-format"/>
     <keyword type="function" name="gst_gl_download_perform_with_data ()" link="GstGLDownload.html#gst-gl-download-perform-with-data"/>
-    <keyword type="function" name="gst_gl_download_perform_with_memory ()" link="GstGLDownload.html#gst-gl-download-perform-with-memory"/>
     <keyword type="struct" name="GstGLDownload" link="GstGLDownload.html#GstGLDownload-struct"/>
     <keyword type="function" name="gst_gl_filter_draw_texture ()" link="GstGLFilter.html#gst-gl-filter-draw-texture"/>
     <keyword type="function" name="gst_gl_filter_render_to_target ()" link="GstGLFilter.html#gst-gl-filter-render-to-target"/>
@@ -462,7 +462,8 @@
     <keyword type="property" name="The “fragment-src” property" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader--fragment-src"/>
     <keyword type="property" name="The “vertex-src” property" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader--vertex-src"/>
     <keyword type="function" name="gst_gl_upload_new ()" link="GstGLUpload.html#gst-gl-upload-new"/>
-    <keyword type="function" name="gst_gl_upload_init_format ()" link="GstGLUpload.html#gst-gl-upload-init-format"/>
+    <keyword type="function" name="gst_gl_upload_set_format ()" link="GstGLUpload.html#gst-gl-upload-set-format"/>
+    <keyword type="function" name="gst_gl_upload_get_format ()" link="GstGLUpload.html#gst-gl-upload-get-format"/>
     <keyword type="function" name="gst_gl_upload_add_video_gl_texture_upload_meta ()" link="GstGLUpload.html#gst-gl-upload-add-video-gl-texture-upload-meta"/>
     <keyword type="function" name="gst_gl_upload_perform_with_data ()" link="GstGLUpload.html#gst-gl-upload-perform-with-data"/>
     <keyword type="function" name="gst_gl_upload_perform_with_gl_texture_upload_meta ()" link="GstGLUpload.html#gst-gl-upload-perform-with-gl-texture-upload-meta"/>
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html b/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html
index 5ac85c1..7418870 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstGLContextEGL.html
@@ -91,6 +91,10 @@
   EGLConfig  egl_config;
 
   GstGLAPI gl_api;
+
+  EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+      EGLClientBuffer buffer, const EGLint *attrib_list);
+  EGLBoolean (*eglDestroyImage) (EGLDisplay dpy, EGLImageKHR image);
 };
 </pre>
 </div>
diff --git a/docs/libs/html/gst-plugins-bad-libs-Utilities.html b/docs/libs/html/gst-plugins-bad-libs-Utilities.html
index 667f4c5..292255a 100644
--- a/docs/libs/html/gst-plugins-bad-libs-Utilities.html
+++ b/docs/libs/html/gst-plugins-bad-libs-Utilities.html
@@ -371,7 +371,7 @@
 <a name="gst-gl-handle-set-context"></a><h3>gst_gl_handle_set_context ()</h3>
 <pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 gst_gl_handle_set_context (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
-                           <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstContext.html#GstContext"><span class="type">GstContext</span></a> *context</code></em>,
+                           <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstContext.html"><span class="type">GstContext</span></a> *context</code></em>,
                            <em class="parameter"><code><a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> **display</code></em>);</pre>
 </div>
 <hr>
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html b/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html
index bc54d9e..e535ef6 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html
@@ -74,7 +74,7 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="returnvalue">GstMemory</span></a> *
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="returnvalue">GstMemory</span></a> *
 </td>
 <td class="function_name">
 <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc" title="gst_gl_memory_alloc ()">gst_gl_memory_alloc</a> <span class="c_punctuation">()</span>
@@ -177,7 +177,7 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglmemory.description"></a><h2>Description</h2>
-<p>GstGLMemory is a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="type">GstMemory</span></a> subclass providing support for the mapping of
+<p>GstGLMemory is a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> subclass providing support for the mapping of
 GL textures.  </p>
 <p><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> is created through <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc" title="gst_gl_memory_alloc ()"><code class="function">gst_gl_memory_alloc()</code></a> or system memory can
 be wrapped through <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped" title="gst_gl_memory_wrapped ()"><code class="function">gst_gl_memory_wrapped()</code></a>.</p>
@@ -311,7 +311,7 @@
 <hr>
 <div class="refsect2">
 <a name="gst-gl-memory-alloc"></a><h3>gst_gl_memory_alloc ()</h3>
-<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="returnvalue">GstMemory</span></a> *
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="returnvalue">GstMemory</span></a> *
 gst_gl_memory_alloc (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
                      <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>,
                      <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
@@ -341,7 +341,7 @@
 </div>
 <div class="refsect3">
 <a name="id-1.2.7.13.8.7.5"></a><h4>Returns</h4>
-<p> a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="type">GstMemory</span></a> object with a GL texture specified by <em class="parameter"><code>v_info</code></em>
+<p> a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> object with a GL texture specified by <em class="parameter"><code>v_info</code></em>
 from <em class="parameter"><code>context</code></em>
 </p>
 <p></p>
@@ -604,7 +604,7 @@
 <div class="refsect2">
 <a name="gst-is-gl-memory"></a><h3>gst_is_gl_memory ()</h3>
 <pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_is_gl_memory (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
+gst_is_gl_memory (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
 <div class="refsect3">
 <a name="id-1.2.7.13.8.13.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
@@ -615,7 +615,7 @@
 </colgroup>
 <tbody><tr>
 <td class="parameter_name"><p>mem</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="type">GstMemory</span></a></p></td>
+<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a></p></td>
 <td class="parameter_annotations"> </td>
 </tr></tbody>
 </table></div>
@@ -724,7 +724,7 @@
 </colgroup>
 <tbody>
 <tr>
-<td class="struct_member_name"><p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="type">GstMemory</span></a> <em class="structfield"><code><a name="GstGLMemory.mem"></a>mem</code></em>;</p></td>
+<td class="struct_member_name"><p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> <em class="structfield"><code><a name="GstGLMemory.mem"></a>mem</code></em>;</p></td>
 <td class="struct_member_description"><p>the parent object</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
@@ -770,7 +770,7 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglmemory.see-also"></a><h2>See Also</h2>
-<p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMemory.html#GstMemory"><span class="type">GstMemory</span></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a>, <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool"><span class="type">GstGLBufferPool</span></a></p>
+<p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a>, <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool"><span class="type">GstGLBufferPool</span></a></p>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstglshader.html b/docs/libs/html/gst-plugins-bad-libs-gstglshader.html
index 4841a3a..63134dc 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstglshader.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstglshader.html
@@ -439,7 +439,9 @@
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglshader.object-hierarchy"></a><h2>Object Hierarchy</h2>
 <pre class="screen">    <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> GstGLShader
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstGLShader
 </pre>
 </div>
 <div class="refsect1">
diff --git a/docs/libs/html/gstreamer-libs-hierarchy.html b/docs/libs/html/gstreamer-libs-hierarchy.html
index ad5af2a..cedbcde 100644
--- a/docs/libs/html/gstreamer-libs-hierarchy.html
+++ b/docs/libs/html/gstreamer-libs-hierarchy.html
@@ -24,27 +24,27 @@
 <a name="gstreamer-libs-hierarchy"></a>Part II. Object Hierarchy</h1></div></div></div>
 <pre class="screen">
     <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">├──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
-    <span class="lineart">│</span>   <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
-    <span class="lineart">│</span>       <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html">GstAllocator</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator">GstGLAllocator</a>
-    <span class="lineart">│</span>       <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html">GstPad</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstglmixer.html#GstGLMixerPad">GstGLMixerPad</a>
-    <span class="lineart">│</span>       <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-GstInsertbin.html#GstInsertBin">GstInsertBin</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="GstGLFilter.html" title="GstGLFilter">GstGLFilter</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstglmixer.html#GstGLMixer">GstGLMixer</a>
-    <span class="lineart">│</span>       <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool">GstBufferPool</a>
-    <span class="lineart">│</span>           <span class="lineart">╰──</span> <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool">GstGLBufferPool</a>
-    <span class="lineart">├──</span> <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
-    <span class="lineart">├──</span> <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
-    <span class="lineart">├──</span> <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
-    <span class="lineart">├──</span> <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
-    <span class="lineart">├──</span> <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
-    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader">GstGLShader</a>
-    <span class="lineart">╰──</span> <a class="link" href="GstGLWindow.html" title="GstGLWindow">GstGLWindow</a>
+    <span class="lineart">╰──</span> <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html">GstAllocator</a>
+            <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator">GstGLAllocator</a>
+            <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html">GstPad</a>
+            <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstglmixer.html#GstGLMixerPad">GstGLMixerPad</a>
+            <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+            <span class="lineart">│</span>   <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
+            <span class="lineart">│</span>   <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-GstInsertbin.html#GstInsertBin">GstInsertBin</a>
+            <span class="lineart">│</span>   <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+            <span class="lineart">│</span>   <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="GstGLFilter.html" title="GstGLFilter">GstGLFilter</a>
+            <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstglmixer.html#GstGLMixer">GstGLMixer</a>
+            <span class="lineart">├──</span> <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
+            <span class="lineart">├──</span> <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
+            <span class="lineart">├──</span> <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
+            <span class="lineart">├──</span> <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
+            <span class="lineart">├──</span> <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
+            <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader">GstGLShader</a>
+            <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBufferPool.html">GstBufferPool</a>
+            <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool">GstGLBufferPool</a>
+            <span class="lineart">╰──</span> <a class="link" href="GstGLWindow.html" title="GstGLWindow">GstGLWindow</a>
     GBoxed
     <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html#GstMpegTsSection">GstMpegTsSection</a>
     <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-descriptors.html#GstMpegTsDescriptor">GstMpegTsDescriptor</a>
diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html
index 8bb0eae..8428279 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 Bad Plugins 1.0 Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for GStreamer Bad Library 1.0 (1.3.0.1)
+      for GStreamer Bad Library 1.0 (1.3.2)
       <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/</a>.
     </p></div>
 </div>
diff --git a/docs/libs/html/index.sgml b/docs/libs/html/index.sgml
index 7654f64..61fefe7 100644
--- a/docs/libs/html/index.sgml
+++ b/docs/libs/html/index.sgml
@@ -413,8 +413,6 @@
 <ANCHOR id="GstGLColorConvert.description" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#GstGLColorConvert.description">
 <ANCHOR id="GstGLColorConvert.functions_details" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#GstGLColorConvert.functions_details">
 <ANCHOR id="gst-gl-color-convert-new" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#gst-gl-color-convert-new">
-<ANCHOR id="gst-gl-color-convert-init-format" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#gst-gl-color-convert-init-format">
-<ANCHOR id="gst-gl-color-convert-set-texture-scaling" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#gst-gl-color-convert-set-texture-scaling">
 <ANCHOR id="gst-gl-color-convert-perform" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#gst-gl-color-convert-perform">
 <ANCHOR id="GstGLColorConvert.other_details" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#GstGLColorConvert.other_details">
 <ANCHOR id="GST-GL-COLOR-CONVERT-FORMATS:CAPS" href="gst-plugins-bad-libs-1.0/GstGLColorConvert.html#GST-GL-COLOR-CONVERT-FORMATS:CAPS">
@@ -442,6 +440,7 @@
 <ANCHOR id="gst-gl-context-get-display" href="gst-plugins-bad-libs-1.0/GstGLContext.html#gst-gl-context-get-display">
 <ANCHOR id="gst-gl-context-get-gl-api" href="gst-plugins-bad-libs-1.0/GstGLContext.html#gst-gl-context-get-gl-api">
 <ANCHOR id="gst-gl-context-get-gl-context" href="gst-plugins-bad-libs-1.0/GstGLContext.html#gst-gl-context-get-gl-context">
+<ANCHOR id="gst-gl-context-check-feature" href="gst-plugins-bad-libs-1.0/GstGLContext.html#gst-gl-context-check-feature">
 <ANCHOR id="GstGLContext.other_details" href="gst-plugins-bad-libs-1.0/GstGLContext.html#GstGLContext.other_details">
 <ANCHOR id="GstGLContextError" href="gst-plugins-bad-libs-1.0/GstGLContext.html#GstGLContextError">
 <ANCHOR id="GstGLContext-struct" href="gst-plugins-bad-libs-1.0/GstGLContext.html#GstGLContext-struct">
@@ -489,9 +488,11 @@
 <ANCHOR id="GstGLDisplay.description" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay.description">
 <ANCHOR id="GstGLDisplay.functions_details" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay.functions_details">
 <ANCHOR id="gst-gl-display-new" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#gst-gl-display-new">
+<ANCHOR id="gst-gl-display-get-handle-type" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#gst-gl-display-get-handle-type">
 <ANCHOR id="gst-context-get-gl-display" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#gst-context-get-gl-display">
 <ANCHOR id="gst-context-set-gl-display" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#gst-context-set-gl-display">
 <ANCHOR id="GstGLDisplay.other_details" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay.other_details">
+<ANCHOR id="GstGLDisplayType" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplayType">
 <ANCHOR id="GstGLDisplay-struct" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay-struct">
 <ANCHOR id="GstGLDisplay.see-also" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay.see-also">
 <ANCHOR id="GstGLDownload" href="gst-plugins-bad-libs-1.0/GstGLDownload.html">
@@ -501,9 +502,8 @@
 <ANCHOR id="GstGLDownload.description" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.description">
 <ANCHOR id="GstGLDownload.functions_details" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.functions_details">
 <ANCHOR id="gst-gl-download-new" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-new">
-<ANCHOR id="gst-gl-download-init-format" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-init-format">
+<ANCHOR id="gst-gl-download-set-format" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-set-format">
 <ANCHOR id="gst-gl-download-perform-with-data" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-perform-with-data">
-<ANCHOR id="gst-gl-download-perform-with-memory" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-perform-with-memory">
 <ANCHOR id="GstGLDownload.other_details" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.other_details">
 <ANCHOR id="GstGLDownload-struct" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload-struct">
 <ANCHOR id="GstGLDownload.see-also" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.see-also">
@@ -638,7 +638,8 @@
 <ANCHOR id="GstGLUpload.description" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#GstGLUpload.description">
 <ANCHOR id="GstGLUpload.functions_details" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#GstGLUpload.functions_details">
 <ANCHOR id="gst-gl-upload-new" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-new">
-<ANCHOR id="gst-gl-upload-init-format" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-init-format">
+<ANCHOR id="gst-gl-upload-set-format" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-set-format">
+<ANCHOR id="gst-gl-upload-get-format" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-get-format">
 <ANCHOR id="gst-gl-upload-add-video-gl-texture-upload-meta" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-add-video-gl-texture-upload-meta">
 <ANCHOR id="gst-gl-upload-perform-with-data" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-perform-with-data">
 <ANCHOR id="gst-gl-upload-perform-with-gl-texture-upload-meta" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-perform-with-gl-texture-upload-meta">
diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args
index 7ea7bfb..a8303c5 100644
--- a/docs/plugins/gst-plugins-bad-plugins.args
+++ b/docs/plugins/gst-plugins-bad-plugins.args
@@ -60359,7 +60359,7 @@
 <RANGE>>= 2</RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>Maximum buffering time</NICK>
-<BLURB>Maximum number of seconds of buffer accumulated during playback.</BLURB>
+<BLURB>Maximum number of seconds of buffer accumulated during playback(deprecated).</BLURB>
 <DEFAULT>30</DEFAULT>
 </ARG>
 
@@ -60613,7 +60613,7 @@
 <RANGE></RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>Max queue size in buffers</NICK>
-<BLURB>Maximum buffers that can be stored in each internal stream queue (0 = infinite).</BLURB>
+<BLURB>Maximum buffers that can be stored in each internal stream queue (0 = infinite) (deprecated).</BLURB>
 <DEFAULT>0</DEFAULT>
 </ARG>
 
diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy
index e7cd556..9af1119 100644
--- a/docs/plugins/gst-plugins-bad-plugins.hierarchy
+++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy
@@ -64,8 +64,6 @@
           GstChecksumSink
           GstCurlBaseSink
             GstCurlFileSink
-            GstCurlSshSink
-              GstCurlSftpSink
             GstCurlTlsSink
               GstCurlFtpSink
               GstCurlHttpSink
@@ -202,9 +200,11 @@
           GstBaseCameraSrc
             GstUvcH264Src
             GstWrapperCameraBinSrc
+          GstDashDemux
           GstFPSDisplaySink
           GstHLSDemux
           GstHlsSink
+          GstMssDemux
           GstPipeline
             GstCameraBin
           GstSDPDemux
@@ -216,7 +216,6 @@
         GstCompare
         GstDVBSubOverlay
         GstDVDSpu
-        GstDashDemux
         GstDecklinkSink
         GstDecklinkSrc
         GstDisparity
@@ -249,7 +248,6 @@
         GstMpeg2enc
         GstMpegPSDemux
         GstMplex
-        GstMssDemux
         GstOpencvTextOverlay
         GstPcapParse
         GstPitch
@@ -298,6 +296,7 @@
           GstTSDemux
           MpegTSParse2
         MpegTsMux
+      GstGLContext
       GstPad
         GstGLMixerPad
       GstPadTemplate
@@ -311,7 +310,6 @@
       GstTaskPool
   GstColorBalanceChannel
   GstEncodingProfile
-  GstGLContext
   GstVdpDevice
   MXFMetadataBase
     MXFDescriptiveMetadata
diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces
index 1c33aea..e0c5528 100644
--- a/docs/plugins/gst-plugins-bad-plugins.interfaces
+++ b/docs/plugins/gst-plugins-bad-plugins.interfaces
@@ -16,6 +16,7 @@
 GstCameraBin2 GstChildProxy GstTagSetter
 GstCeltEnc GstPreset GstTagSetter
 GstDaalaEnc GstPreset
+GstDashDemux GstChildProxy
 GstDataURISrc GstURIHandler
 GstDfbVideoSink GstImplementsInterface GstNavigation GstColorBalance
 GstDfbVideoSink GstNavigation GstColorBalance
@@ -46,6 +47,7 @@
 GstKateTag GstTagSetter
 GstMMS GstURIHandler
 GstMpeg2enc GstPreset
+GstMssDemux GstChildProxy
 GstMythtvSrc GstURIHandler
 GstNeonhttpSrc GstURIHandler
 GstOpenJPEGEnc GstPreset
diff --git a/docs/plugins/gst-plugins-bad-plugins.signals b/docs/plugins/gst-plugins-bad-plugins.signals
index a497784..8affeb7 100644
--- a/docs/plugins/gst-plugins-bad-plugins.signals
+++ b/docs/plugins/gst-plugins-bad-plugins.signals
@@ -581,3 +581,11 @@
 guint  arg1
 </SIGNAL>
 
+<SIGNAL>
+<NAME>GstSrtpDec::remove-key</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>la</FLAGS>
+GstSrtpDec *gstsrtpdec
+guint  arg1
+</SIGNAL>
+
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html
index d483afe..8fee864 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html
index 8fd732e..b5fd63f 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html
index 59f019f..bbdfce8 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html
index 881addb..a944b63 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html
index 1e64e8d..b190f75 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html
index f23dc1d..7acd96e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html
index 05d5c75..e4a68f5 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html
index 7f968ae..7ede8e4 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -80,10 +80,6 @@
 <td>Upload data over HTTP/HTTPS protocol using libcurl</td>
 </tr>
 <tr>
-<td><p><span class="term">curlsftpsink</span></p></td>
-<td>Upload data over the SFTP protocol using libcurl</td>
-</tr>
-<tr>
 <td><p><span class="term">curlsmtpsink</span></p></td>
 <td>Upload data over SMTP protocol using libcurl</td>
 </tr>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html
index 9c92f47..0e2cf8a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html
index e67aa2b..2320e65 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html
index befb154..e077597 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html
index 87ef215..29d40a6 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html
index 16771aa..7fcd1bc 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html
index 67e238c..516ca70 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html
index ef06065..ab14782 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html
index c9510a3..c1feb65 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html
index cce3ac8..a157bd5 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html
index 7090164..30121d7 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html
index fbce629..75175e9 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
index 76867c6..b781a2a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-liveadder.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-liveadder.html
index 136a77d..4f0fb44 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-liveadder.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-liveadder.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
index a1b8994..f95fca6 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
index 0637ea9..4c13d1e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
index 578be73..c89980b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
index 3b4a8c6..3cb25bf 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.0.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -50,7 +50,7 @@
 </tr>
 <tr>
 <td><p><span class="term">package</span></p></td>
-<td>GStreamer Bad Plug-ins git</td>
+<td>GStreamer Bad Plug-ins source release</td>
 </tr>
 <tr>
 <td><p><span class="term">origin</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
index fb5dc24..641e1b9 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
index 96699c4..842ad62 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
index e7e8fb8..69b3640 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
index d9416ca..d3f9bf0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
index c8973a0..3f6154c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
index 3252092..13267b7 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html
index e05180e..341e165 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html
index d738288..63446e4 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html
index 23d5c63..165c9d2 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html
index d4c11c2..82917a3 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html
index f931271..475a991 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html
index ed4dd22..c0fa690 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.0.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -50,7 +50,7 @@
 </tr>
 <tr>
 <td><p><span class="term">package</span></p></td>
-<td>GStreamer Bad Plug-ins git</td>
+<td>GStreamer Bad Plug-ins source release</td>
 </tr>
 <tr>
 <td><p><span class="term">origin</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html
index 0b4d880..461cd68 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html
index b9edd2c..f0e31be 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html
index 2cb1075..74df8d0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
index 5f09d2f..ffa2d03 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.3.0.1</td>
+<td>1.3.2</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -50,7 +50,7 @@
 </tr>
 <tr>
 <td><p><span class="term">package</span></p></td>
-<td>GStreamer Bad Plug-ins git</td>
+<td>GStreamer Bad Plug-ins source release</td>
 </tr>
 <tr>
 <td><p><span class="term">origin</span></p></td>
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
index 568f2ff..30f4077 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 Bad Plugins 1.0 Plugins Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for GStreamer Bad Plugins 1.0 (1.3.1)
+      for GStreamer Bad Plugins 1.0 (1.3.2)
       The latest version of this documentation can be found on-line at
       <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad/html/</a>.
     </p></div>
diff --git a/docs/plugins/inspect/plugin-accurip.xml b/docs/plugins/inspect/plugin-accurip.xml
index 2984a1d..86883d7 100644
--- a/docs/plugins/inspect/plugin-accurip.xml
+++ b/docs/plugins/inspect/plugin-accurip.xml
@@ -3,7 +3,7 @@
   <description>Computes an AccurateRip CRC</description>
   <filename>../../gst/accurip/.libs/libgstaccurip.so</filename>
   <basename>libgstaccurip.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-adpcmdec.xml b/docs/plugins/inspect/plugin-adpcmdec.xml
index 7be7709..c8261c9 100644
--- a/docs/plugins/inspect/plugin-adpcmdec.xml
+++ b/docs/plugins/inspect/plugin-adpcmdec.xml
@@ -3,7 +3,7 @@
   <description>ADPCM decoder</description>
   <filename>../../gst/adpcmdec/.libs/libgstadpcmdec.so</filename>
   <basename>libgstadpcmdec.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-adpcmenc.xml b/docs/plugins/inspect/plugin-adpcmenc.xml
index 49afbf3..790723a 100644
--- a/docs/plugins/inspect/plugin-adpcmenc.xml
+++ b/docs/plugins/inspect/plugin-adpcmenc.xml
@@ -3,7 +3,7 @@
   <description>ADPCM encoder</description>
   <filename>../../gst/adpcmenc/.libs/libgstadpcmenc.so</filename>
   <basename>libgstadpcmenc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-aiff.xml b/docs/plugins/inspect/plugin-aiff.xml
index f6f4f15..283f0f3 100644
--- a/docs/plugins/inspect/plugin-aiff.xml
+++ b/docs/plugins/inspect/plugin-aiff.xml
@@ -3,7 +3,7 @@
   <description>Create and parse Audio Interchange File Format (AIFF) files</description>
   <filename>../../gst/aiff/.libs/libgstaiff.so</filename>
   <basename>libgstaiff.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-asfmux.xml b/docs/plugins/inspect/plugin-asfmux.xml
index dada47c..2f94787 100644
--- a/docs/plugins/inspect/plugin-asfmux.xml
+++ b/docs/plugins/inspect/plugin-asfmux.xml
@@ -3,7 +3,7 @@
   <description>ASF Muxer Plugin</description>
   <filename>../../gst/asfmux/.libs/libgstasfmux.so</filename>
   <basename>libgstasfmux.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-assrender.xml b/docs/plugins/inspect/plugin-assrender.xml
index bf1b1aa..16bb3df 100644
--- a/docs/plugins/inspect/plugin-assrender.xml
+++ b/docs/plugins/inspect/plugin-assrender.xml
@@ -3,7 +3,7 @@
   <description>ASS/SSA subtitle renderer</description>
   <filename>../../ext/assrender/.libs/libgstassrender.so</filename>
   <basename>libgstassrender.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-audiofxbad.xml b/docs/plugins/inspect/plugin-audiofxbad.xml
index df6d8a7..4b1a0fb 100644
--- a/docs/plugins/inspect/plugin-audiofxbad.xml
+++ b/docs/plugins/inspect/plugin-audiofxbad.xml
@@ -3,7 +3,7 @@
   <description>Audio filters from gst-plugins-bad</description>
   <filename>../../gst/audiofxbad/.libs/libgstaudiofxbad.so</filename>
   <basename>libgstaudiofxbad.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-audiomixer.xml b/docs/plugins/inspect/plugin-audiomixer.xml
index 7ce8b86..602c683 100644
--- a/docs/plugins/inspect/plugin-audiomixer.xml
+++ b/docs/plugins/inspect/plugin-audiomixer.xml
@@ -3,7 +3,7 @@
   <description>Mixes multiple audio streams</description>
   <filename>../../gst/audiomixer/.libs/libgstaudiomixer.so</filename>
   <basename>libgstaudiomixer.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-audiovisualizers.xml b/docs/plugins/inspect/plugin-audiovisualizers.xml
index 2bfb2c4..0c2c3ba 100644
--- a/docs/plugins/inspect/plugin-audiovisualizers.xml
+++ b/docs/plugins/inspect/plugin-audiovisualizers.xml
@@ -3,7 +3,7 @@
   <description>Creates video visualizations of audio input</description>
   <filename>../../gst/audiovisualizers/.libs/libgstaudiovisualizers.so</filename>
   <basename>libgstaudiovisualizers.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-autoconvert.xml b/docs/plugins/inspect/plugin-autoconvert.xml
index 614e9e4..e8ad756 100644
--- a/docs/plugins/inspect/plugin-autoconvert.xml
+++ b/docs/plugins/inspect/plugin-autoconvert.xml
@@ -3,7 +3,7 @@
   <description>Selects convertor element based on caps</description>
   <filename>../../gst/autoconvert/.libs/libgstautoconvert.so</filename>
   <basename>libgstautoconvert.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-bayer.xml b/docs/plugins/inspect/plugin-bayer.xml
index 56f4389..a35eff6 100644
--- a/docs/plugins/inspect/plugin-bayer.xml
+++ b/docs/plugins/inspect/plugin-bayer.xml
@@ -3,7 +3,7 @@
   <description>Elements to convert Bayer images</description>
   <filename>../../gst/bayer/.libs/libgstbayer.so</filename>
   <basename>libgstbayer.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-bz2.xml b/docs/plugins/inspect/plugin-bz2.xml
index 3de2a2a..d4a5216 100644
--- a/docs/plugins/inspect/plugin-bz2.xml
+++ b/docs/plugins/inspect/plugin-bz2.xml
@@ -3,7 +3,7 @@
   <description>Compress or decompress streams</description>
   <filename>../../ext/bz2/.libs/libgstbz2.so</filename>
   <basename>libgstbz2.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-camerabin.xml b/docs/plugins/inspect/plugin-camerabin.xml
index 948fc5a..32d1d89 100644
--- a/docs/plugins/inspect/plugin-camerabin.xml
+++ b/docs/plugins/inspect/plugin-camerabin.xml
@@ -3,7 +3,7 @@
   <description>Take image snapshots and record movies from camera</description>
   <filename>../../gst/camerabin2/.libs/libgstcamerabin2.so</filename>
   <basename>libgstcamerabin2.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-chromaprint.xml b/docs/plugins/inspect/plugin-chromaprint.xml
index 6de9276..4e2f41e 100644
--- a/docs/plugins/inspect/plugin-chromaprint.xml
+++ b/docs/plugins/inspect/plugin-chromaprint.xml
@@ -3,7 +3,7 @@
   <description>Calculate Chromaprint fingerprint from audio files</description>
   <filename>../../ext/chromaprint/.libs/libgstchromaprint.so</filename>
   <basename>libgstchromaprint.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-coloreffects.xml b/docs/plugins/inspect/plugin-coloreffects.xml
index 9d0837b..fff0333 100644
--- a/docs/plugins/inspect/plugin-coloreffects.xml
+++ b/docs/plugins/inspect/plugin-coloreffects.xml
@@ -3,7 +3,7 @@
   <description>Color Look-up Table filters</description>
   <filename>../../gst/coloreffects/.libs/libgstcoloreffects.so</filename>
   <basename>libgstcoloreffects.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-curl.xml b/docs/plugins/inspect/plugin-curl.xml
index 55c266f..2477e45 100644
--- a/docs/plugins/inspect/plugin-curl.xml
+++ b/docs/plugins/inspect/plugin-curl.xml
@@ -3,7 +3,7 @@
   <description>libcurl-based elements</description>
   <filename>../../ext/curl/.libs/libgstcurl.so</filename>
   <basename>libgstcurl.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -55,21 +55,6 @@
       </pads>
     </element>
     <element>
-      <name>curlsftpsink</name>
-      <longname>Curl sftp sink</longname>
-      <class>Sink/Network</class>
-      <description>Upload data over the SFTP protocol using libcurl</description>
-      <author>Sorin L. &lt;sorin@axis.com&gt;</author>
-      <pads>
-        <caps>
-          <name>sink</name>
-          <direction>sink</direction>
-          <presence>always</presence>
-          <details>ANY</details>
-        </caps>
-      </pads>
-    </element>
-    <element>
       <name>curlsmtpsink</name>
       <longname>Curl smtp sink</longname>
       <class>Sink/Network</class>
diff --git a/docs/plugins/inspect/plugin-dashdemux.xml b/docs/plugins/inspect/plugin-dashdemux.xml
index 4524fa9..03bfb03 100644
--- a/docs/plugins/inspect/plugin-dashdemux.xml
+++ b/docs/plugins/inspect/plugin-dashdemux.xml
@@ -3,7 +3,7 @@
   <description>DASH demuxer plugin</description>
   <filename>../../ext/dash/.libs/libgstdashdemux.so</filename>
   <basename>libgstdashdemux.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-dataurisrc.xml b/docs/plugins/inspect/plugin-dataurisrc.xml
index b9052de..94ec484 100644
--- a/docs/plugins/inspect/plugin-dataurisrc.xml
+++ b/docs/plugins/inspect/plugin-dataurisrc.xml
@@ -3,7 +3,7 @@
   <description>data: URI source</description>
   <filename>../../gst/dataurisrc/.libs/libgstdataurisrc.so</filename>
   <basename>libgstdataurisrc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-debugutilsbad.xml b/docs/plugins/inspect/plugin-debugutilsbad.xml
index 724767d..ba31620 100644
--- a/docs/plugins/inspect/plugin-debugutilsbad.xml
+++ b/docs/plugins/inspect/plugin-debugutilsbad.xml
@@ -3,7 +3,7 @@
   <description>Collection of elements that may or may not be useful for debugging</description>
   <filename>../../gst/debugutils/.libs/libgstdebugutilsbad.so</filename>
   <basename>libgstdebugutilsbad.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-decklink.xml b/docs/plugins/inspect/plugin-decklink.xml
index 40fa7c7..fa3191d 100644
--- a/docs/plugins/inspect/plugin-decklink.xml
+++ b/docs/plugins/inspect/plugin-decklink.xml
@@ -3,7 +3,7 @@
   <description>Blackmagic Decklink plugin</description>
   <filename>../../sys/decklink/.libs/libgstdecklink.so</filename>
   <basename>libgstdecklink.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml
index 630d528..902bcf5 100644
--- a/docs/plugins/inspect/plugin-dfbvideosink.xml
+++ b/docs/plugins/inspect/plugin-dfbvideosink.xml
@@ -3,7 +3,7 @@
   <description>DirectFB video output plugin</description>
   <filename>../../ext/directfb/.libs/libgstdfbvideosink.so</filename>
   <basename>libgstdfbvideosink.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dtsdec.xml b/docs/plugins/inspect/plugin-dtsdec.xml
index 27d1990..46a6ac7 100644
--- a/docs/plugins/inspect/plugin-dtsdec.xml
+++ b/docs/plugins/inspect/plugin-dtsdec.xml
@@ -3,7 +3,7 @@
   <description>Decodes DTS audio streams</description>
   <filename>../../ext/dts/.libs/libgstdtsdec.so</filename>
   <basename>libgstdtsdec.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dvb.xml b/docs/plugins/inspect/plugin-dvb.xml
index 2f2ed2e..5dd3b40 100644
--- a/docs/plugins/inspect/plugin-dvb.xml
+++ b/docs/plugins/inspect/plugin-dvb.xml
@@ -3,7 +3,7 @@
   <description>DVB elements</description>
   <filename>../../sys/dvb/.libs/libgstdvb.so</filename>
   <basename>libgstdvb.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dvbsuboverlay.xml b/docs/plugins/inspect/plugin-dvbsuboverlay.xml
index 067cf1f..6a44de9 100644
--- a/docs/plugins/inspect/plugin-dvbsuboverlay.xml
+++ b/docs/plugins/inspect/plugin-dvbsuboverlay.xml
@@ -3,7 +3,7 @@
   <description>DVB subtitle renderer</description>
   <filename>../../gst/dvbsuboverlay/.libs/libgstdvbsuboverlay.so</filename>
   <basename>libgstdvbsuboverlay.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dvdspu.xml b/docs/plugins/inspect/plugin-dvdspu.xml
index 96182da..3896b35 100644
--- a/docs/plugins/inspect/plugin-dvdspu.xml
+++ b/docs/plugins/inspect/plugin-dvdspu.xml
@@ -3,7 +3,7 @@
   <description>DVD Sub-picture Overlay element</description>
   <filename>../../gst/dvdspu/.libs/libgstdvdspu.so</filename>
   <basename>libgstdvdspu.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-faac.xml b/docs/plugins/inspect/plugin-faac.xml
index 8d1a5bd..75a31da 100644
--- a/docs/plugins/inspect/plugin-faac.xml
+++ b/docs/plugins/inspect/plugin-faac.xml
@@ -3,7 +3,7 @@
   <description>Free AAC Encoder (FAAC)</description>
   <filename>../../ext/faac/.libs/libgstfaac.so</filename>
   <basename>libgstfaac.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-faad.xml b/docs/plugins/inspect/plugin-faad.xml
index 2d7f0c5..0c8df3d 100644
--- a/docs/plugins/inspect/plugin-faad.xml
+++ b/docs/plugins/inspect/plugin-faad.xml
@@ -3,7 +3,7 @@
   <description>Free AAC Decoder (FAAD)</description>
   <filename>../../ext/faad/.libs/libgstfaad.so</filename>
   <basename>libgstfaad.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fbdevsink.xml b/docs/plugins/inspect/plugin-fbdevsink.xml
index b317ef7..8509297 100644
--- a/docs/plugins/inspect/plugin-fbdevsink.xml
+++ b/docs/plugins/inspect/plugin-fbdevsink.xml
@@ -3,7 +3,7 @@
   <description>Linux framebuffer video sink</description>
   <filename>../../sys/fbdev/.libs/libgstfbdevsink.so</filename>
   <basename>libgstfbdevsink.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-festival.xml b/docs/plugins/inspect/plugin-festival.xml
index 33f6e4c..a210a8c 100644
--- a/docs/plugins/inspect/plugin-festival.xml
+++ b/docs/plugins/inspect/plugin-festival.xml
@@ -3,7 +3,7 @@
   <description>Synthesizes plain text into audio</description>
   <filename>../../gst/festival/.libs/libgstfestival.so</filename>
   <basename>libgstfestival.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fieldanalysis.xml b/docs/plugins/inspect/plugin-fieldanalysis.xml
index f1313f9..f8d1fb1 100644
--- a/docs/plugins/inspect/plugin-fieldanalysis.xml
+++ b/docs/plugins/inspect/plugin-fieldanalysis.xml
@@ -3,7 +3,7 @@
   <description>Video field analysis</description>
   <filename>../../gst/fieldanalysis/.libs/libgstfieldanalysis.so</filename>
   <basename>libgstfieldanalysis.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-flite.xml b/docs/plugins/inspect/plugin-flite.xml
index 97c1b1f..85cfe2d 100644
--- a/docs/plugins/inspect/plugin-flite.xml
+++ b/docs/plugins/inspect/plugin-flite.xml
@@ -3,7 +3,7 @@
   <description>Flite speech synthesizer plugin</description>
   <filename>../../ext/flite/.libs/libgstflite.so</filename>
   <basename>libgstflite.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fluidsynthmidi.xml b/docs/plugins/inspect/plugin-fluidsynthmidi.xml
index 50b068a..f3d232d 100644
--- a/docs/plugins/inspect/plugin-fluidsynthmidi.xml
+++ b/docs/plugins/inspect/plugin-fluidsynthmidi.xml
@@ -3,7 +3,7 @@
   <description>Fluidsynth MIDI Plugin</description>
   <filename>../../ext/fluidsynth/.libs/libgstfluidsynthmidi.so</filename>
   <basename>libgstfluidsynthmidi.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fragmented.xml b/docs/plugins/inspect/plugin-fragmented.xml
index 71f7b44..55c6a73 100644
--- a/docs/plugins/inspect/plugin-fragmented.xml
+++ b/docs/plugins/inspect/plugin-fragmented.xml
@@ -3,7 +3,7 @@
   <description>Fragmented streaming plugins</description>
   <filename>../../ext/hls/.libs/libgstfragmented.so</filename>
   <basename>libgstfragmented.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-freeverb.xml b/docs/plugins/inspect/plugin-freeverb.xml
index 15b0da4..076e549 100644
--- a/docs/plugins/inspect/plugin-freeverb.xml
+++ b/docs/plugins/inspect/plugin-freeverb.xml
@@ -3,7 +3,7 @@
   <description>Reverberation/room effect</description>
   <filename>../../gst/freeverb/.libs/libgstfreeverb.so</filename>
   <basename>libgstfreeverb.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-frei0r.xml b/docs/plugins/inspect/plugin-frei0r.xml
index 0e509e9..f64e287 100644
--- a/docs/plugins/inspect/plugin-frei0r.xml
+++ b/docs/plugins/inspect/plugin-frei0r.xml
@@ -3,7 +3,7 @@
   <description>frei0r plugin library</description>
   <filename>../../gst/frei0r/.libs/libgstfrei0r.so</filename>
   <basename>libgstfrei0r.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gaudieffects.xml b/docs/plugins/inspect/plugin-gaudieffects.xml
index 1f29fab..e735cea 100644
--- a/docs/plugins/inspect/plugin-gaudieffects.xml
+++ b/docs/plugins/inspect/plugin-gaudieffects.xml
@@ -3,7 +3,7 @@
   <description>Gaudi video effects.</description>
   <filename>../../gst/gaudieffects/.libs/libgstgaudieffects.so</filename>
   <basename>libgstgaudieffects.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-gdp.xml b/docs/plugins/inspect/plugin-gdp.xml
index 0d593c1..f84d5a9 100644
--- a/docs/plugins/inspect/plugin-gdp.xml
+++ b/docs/plugins/inspect/plugin-gdp.xml
@@ -3,7 +3,7 @@
   <description>Payload/depayload GDP packets</description>
   <filename>../../gst/gdp/.libs/libgstgdp.so</filename>
   <basename>libgstgdp.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-geometrictransform.xml b/docs/plugins/inspect/plugin-geometrictransform.xml
index 6ce0d4b..230629a 100644
--- a/docs/plugins/inspect/plugin-geometrictransform.xml
+++ b/docs/plugins/inspect/plugin-geometrictransform.xml
@@ -3,7 +3,7 @@
   <description>Various geometric image transform elements</description>
   <filename>../../gst/geometrictransform/.libs/libgstgeometrictransform.so</filename>
   <basename>libgstgeometrictransform.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gmedec.xml b/docs/plugins/inspect/plugin-gmedec.xml
index 383abe8..d647c90 100644
--- a/docs/plugins/inspect/plugin-gmedec.xml
+++ b/docs/plugins/inspect/plugin-gmedec.xml
@@ -3,10 +3,10 @@
   <description>GME Audio Decoder</description>
   <filename>../../ext/gme/.libs/libgstgme.so</filename>
   <basename>libgstgme.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-gsm.xml b/docs/plugins/inspect/plugin-gsm.xml
index adc7efd..23c72cf 100644
--- a/docs/plugins/inspect/plugin-gsm.xml
+++ b/docs/plugins/inspect/plugin-gsm.xml
@@ -3,7 +3,7 @@
   <description>GSM encoder/decoder</description>
   <filename>../../ext/gsm/.libs/libgstgsm.so</filename>
   <basename>libgstgsm.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gstsiren.xml b/docs/plugins/inspect/plugin-gstsiren.xml
index 1a356c0..be9df02 100644
--- a/docs/plugins/inspect/plugin-gstsiren.xml
+++ b/docs/plugins/inspect/plugin-gstsiren.xml
@@ -3,7 +3,7 @@
   <description>Siren encoder/decoder/payloader/depayloader plugins</description>
   <filename>../../gst/siren/.libs/libgstsiren.so</filename>
   <basename>libgstsiren.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-id3tag.xml b/docs/plugins/inspect/plugin-id3tag.xml
index 9980d31..0e054eb 100644
--- a/docs/plugins/inspect/plugin-id3tag.xml
+++ b/docs/plugins/inspect/plugin-id3tag.xml
@@ -3,7 +3,7 @@
   <description>ID3 v1 and v2 muxing plugin</description>
   <filename>../../gst/id3tag/.libs/libgstid3tag.so</filename>
   <basename>libgstid3tag.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-inter.xml b/docs/plugins/inspect/plugin-inter.xml
index b0e37ec..8ec6872 100644
--- a/docs/plugins/inspect/plugin-inter.xml
+++ b/docs/plugins/inspect/plugin-inter.xml
@@ -3,7 +3,7 @@
   <description>plugin for inter-pipeline communication</description>
   <filename>../../gst/inter/.libs/libgstinter.so</filename>
   <basename>libgstinter.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-interlace.xml b/docs/plugins/inspect/plugin-interlace.xml
index 6074c87..a709b17 100644
--- a/docs/plugins/inspect/plugin-interlace.xml
+++ b/docs/plugins/inspect/plugin-interlace.xml
@@ -3,7 +3,7 @@
   <description>Create an interlaced video stream</description>
   <filename>../../gst/interlace/.libs/libgstinterlace.so</filename>
   <basename>libgstinterlace.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ivfparse.xml b/docs/plugins/inspect/plugin-ivfparse.xml
index acbc073..ae2002e 100644
--- a/docs/plugins/inspect/plugin-ivfparse.xml
+++ b/docs/plugins/inspect/plugin-ivfparse.xml
@@ -3,7 +3,7 @@
   <description>IVF parser</description>
   <filename>../../gst/ivfparse/.libs/libgstivfparse.so</filename>
   <basename>libgstivfparse.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ivtc.xml b/docs/plugins/inspect/plugin-ivtc.xml
index 153f7e4..1f9c162 100644
--- a/docs/plugins/inspect/plugin-ivtc.xml
+++ b/docs/plugins/inspect/plugin-ivtc.xml
@@ -3,7 +3,7 @@
   <description>Inverse Telecine</description>
   <filename>../../gst/ivtc/.libs/libgstivtc.so</filename>
   <basename>libgstivtc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-jp2kdecimator.xml b/docs/plugins/inspect/plugin-jp2kdecimator.xml
index be1428f..97a8619 100644
--- a/docs/plugins/inspect/plugin-jp2kdecimator.xml
+++ b/docs/plugins/inspect/plugin-jp2kdecimator.xml
@@ -3,7 +3,7 @@
   <description>JPEG2000 decimator</description>
   <filename>../../gst/jp2kdecimator/.libs/libgstjp2kdecimator.so</filename>
   <basename>libgstjp2kdecimator.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-jpegformat.xml b/docs/plugins/inspect/plugin-jpegformat.xml
index 1c54d1d..b247e5c 100644
--- a/docs/plugins/inspect/plugin-jpegformat.xml
+++ b/docs/plugins/inspect/plugin-jpegformat.xml
@@ -3,7 +3,7 @@
   <description>JPEG interchange format plugin</description>
   <filename>../../gst/jpegformat/.libs/libgstjpegformat.so</filename>
   <basename>libgstjpegformat.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-kate.xml b/docs/plugins/inspect/plugin-kate.xml
index 6277b01..3598900 100644
--- a/docs/plugins/inspect/plugin-kate.xml
+++ b/docs/plugins/inspect/plugin-kate.xml
@@ -3,7 +3,7 @@
   <description>Kate plugin</description>
   <filename>../../ext/kate/.libs/libgstkate.so</filename>
   <basename>libgstkate.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ladspa.xml b/docs/plugins/inspect/plugin-ladspa.xml
index 20dcb6e..36e163b 100644
--- a/docs/plugins/inspect/plugin-ladspa.xml
+++ b/docs/plugins/inspect/plugin-ladspa.xml
@@ -3,7 +3,7 @@
   <description>LADSPA plugin</description>
   <filename>../../ext/ladspa/.libs/libgstladspa.so</filename>
   <basename>libgstladspa.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-liveadder.xml b/docs/plugins/inspect/plugin-liveadder.xml
index ac89e25..bba2a30 100644
--- a/docs/plugins/inspect/plugin-liveadder.xml
+++ b/docs/plugins/inspect/plugin-liveadder.xml
@@ -3,7 +3,7 @@
   <description>Adds multiple live discontinuous streams</description>
   <filename>../../gst/liveadder/.libs/libgstliveadder.so</filename>
   <basename>libgstliveadder.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-midi.xml b/docs/plugins/inspect/plugin-midi.xml
index 49cd30f..06c3549 100644
--- a/docs/plugins/inspect/plugin-midi.xml
+++ b/docs/plugins/inspect/plugin-midi.xml
@@ -3,7 +3,7 @@
   <description>Parse MIDI files</description>
   <filename>../../gst/midi/.libs/libgstmidi.so</filename>
   <basename>libgstmidi.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mimic.xml b/docs/plugins/inspect/plugin-mimic.xml
index 88a9be2..c9401c0 100644
--- a/docs/plugins/inspect/plugin-mimic.xml
+++ b/docs/plugins/inspect/plugin-mimic.xml
@@ -3,7 +3,7 @@
   <description>Mimic codec</description>
   <filename>../../ext/mimic/.libs/libgstmimic.so</filename>
   <basename>libgstmimic.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mms.xml b/docs/plugins/inspect/plugin-mms.xml
index 6c13e53..3ec36c4 100644
--- a/docs/plugins/inspect/plugin-mms.xml
+++ b/docs/plugins/inspect/plugin-mms.xml
@@ -3,7 +3,7 @@
   <description>Microsoft Multi Media Server streaming protocol support</description>
   <filename>../../ext/libmms/.libs/libgstmms.so</filename>
   <basename>libgstmms.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-modplug.xml b/docs/plugins/inspect/plugin-modplug.xml
index 90e75b8..4b1ace3 100644
--- a/docs/plugins/inspect/plugin-modplug.xml
+++ b/docs/plugins/inspect/plugin-modplug.xml
@@ -3,7 +3,7 @@
   <description>.MOD audio decoding</description>
   <filename>../../ext/modplug/.libs/libgstmodplug.so</filename>
   <basename>libgstmodplug.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpeg2enc.xml b/docs/plugins/inspect/plugin-mpeg2enc.xml
index 8605b57..a6f2c95 100644
--- a/docs/plugins/inspect/plugin-mpeg2enc.xml
+++ b/docs/plugins/inspect/plugin-mpeg2enc.xml
@@ -3,10 +3,10 @@
   <description>High-quality MPEG-1/2 video encoder</description>
   <filename>../../ext/mpeg2enc/.libs/libgstmpeg2enc.so</filename>
   <basename>libgstmpeg2enc.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-mpegpsdemux.xml b/docs/plugins/inspect/plugin-mpegpsdemux.xml
index a402f22..76a9ab7 100644
--- a/docs/plugins/inspect/plugin-mpegpsdemux.xml
+++ b/docs/plugins/inspect/plugin-mpegpsdemux.xml
@@ -3,7 +3,7 @@
   <description>MPEG-PS demuxer</description>
   <filename>../../gst/mpegdemux/.libs/libgstmpegpsdemux.so</filename>
   <basename>libgstmpegpsdemux.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>unknown</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpegpsmux.xml b/docs/plugins/inspect/plugin-mpegpsmux.xml
index bf8dfe5..4ddf359 100644
--- a/docs/plugins/inspect/plugin-mpegpsmux.xml
+++ b/docs/plugins/inspect/plugin-mpegpsmux.xml
@@ -3,7 +3,7 @@
   <description>MPEG-PS muxer</description>
   <filename>../../gst/mpegpsmux/.libs/libgstmpegpsmux.so</filename>
   <basename>libgstmpegpsmux.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpegtsdemux.xml b/docs/plugins/inspect/plugin-mpegtsdemux.xml
index 647f363..0dda618 100644
--- a/docs/plugins/inspect/plugin-mpegtsdemux.xml
+++ b/docs/plugins/inspect/plugin-mpegtsdemux.xml
@@ -3,7 +3,7 @@
   <description>MPEG TS demuxer</description>
   <filename>../../gst/mpegtsdemux/.libs/libgstmpegtsdemux.so</filename>
   <basename>libgstmpegtsdemux.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml
index ffbfcee..0f1543c 100644
--- a/docs/plugins/inspect/plugin-mpegtsmux.xml
+++ b/docs/plugins/inspect/plugin-mpegtsmux.xml
@@ -3,7 +3,7 @@
   <description>MPEG-TS muxer</description>
   <filename>../../gst/mpegtsmux/.libs/libgstmpegtsmux.so</filename>
   <basename>libgstmpegtsmux.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpg123.xml b/docs/plugins/inspect/plugin-mpg123.xml
index 30dbd56..d48f3d4 100644
--- a/docs/plugins/inspect/plugin-mpg123.xml
+++ b/docs/plugins/inspect/plugin-mpg123.xml
@@ -3,7 +3,7 @@
   <description>mp3 decoding based on the mpg123 library</description>
   <filename>../../ext/mpg123/.libs/libgstmpg123.so</filename>
   <basename>libgstmpg123.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mplex.xml b/docs/plugins/inspect/plugin-mplex.xml
index cb6abee..8bfc786 100644
--- a/docs/plugins/inspect/plugin-mplex.xml
+++ b/docs/plugins/inspect/plugin-mplex.xml
@@ -3,7 +3,7 @@
   <description>High-quality MPEG/DVD/SVCD/VCD video/audio multiplexer</description>
   <filename>../../ext/mplex/.libs/libgstmplex.so</filename>
   <basename>libgstmplex.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml
index 0cd069c..579a21a 100644
--- a/docs/plugins/inspect/plugin-mxf.xml
+++ b/docs/plugins/inspect/plugin-mxf.xml
@@ -3,7 +3,7 @@
   <description>MXF plugin library</description>
   <filename>../../gst/mxf/.libs/libgstmxf.so</filename>
   <basename>libgstmxf.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-neon.xml b/docs/plugins/inspect/plugin-neon.xml
index 235afec..7afcd57 100644
--- a/docs/plugins/inspect/plugin-neon.xml
+++ b/docs/plugins/inspect/plugin-neon.xml
@@ -3,7 +3,7 @@
   <description>lib neon http client src</description>
   <filename>../../ext/neon/.libs/libgstneonhttpsrc.so</filename>
   <basename>libgstneonhttpsrc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ofa.xml b/docs/plugins/inspect/plugin-ofa.xml
index 23223ea..1f47b2c 100644
--- a/docs/plugins/inspect/plugin-ofa.xml
+++ b/docs/plugins/inspect/plugin-ofa.xml
@@ -3,7 +3,7 @@
   <description>Calculate MusicIP fingerprint from audio files</description>
   <filename>../../ext/ofa/.libs/libgstofa.so</filename>
   <basename>libgstofa.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-openal.xml b/docs/plugins/inspect/plugin-openal.xml
index 0efbc80..9e9ca20 100644
--- a/docs/plugins/inspect/plugin-openal.xml
+++ b/docs/plugins/inspect/plugin-openal.xml
@@ -3,7 +3,7 @@
   <description>OpenAL plugin library</description>
   <filename>../../ext/openal/.libs/libgstopenal.so</filename>
   <basename>libgstopenal.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-opencv.xml b/docs/plugins/inspect/plugin-opencv.xml
index 3cfd481..1f6e882 100644
--- a/docs/plugins/inspect/plugin-opencv.xml
+++ b/docs/plugins/inspect/plugin-opencv.xml
@@ -3,7 +3,7 @@
   <description>GStreamer OpenCV Plugins</description>
   <filename>../../ext/opencv/.libs/libgstopencv.so</filename>
   <basename>libgstopencv.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-openexr.xml b/docs/plugins/inspect/plugin-openexr.xml
index a3595c2..8b68292 100644
--- a/docs/plugins/inspect/plugin-openexr.xml
+++ b/docs/plugins/inspect/plugin-openexr.xml
@@ -3,7 +3,7 @@
   <description>OpenEXR image plugin</description>
   <filename>../../ext/openexr/.libs/libgstopenexr.so</filename>
   <basename>libgstopenexr.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-opengl.xml b/docs/plugins/inspect/plugin-opengl.xml
index 3ec003a..a70a2a4 100644
--- a/docs/plugins/inspect/plugin-opengl.xml
+++ b/docs/plugins/inspect/plugin-opengl.xml
@@ -3,7 +3,7 @@
   <description>OpenGL plugin</description>
   <filename>../../ext/gl/.libs/libgstopengl.so</filename>
   <basename>libgstopengl.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -20,13 +20,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -41,13 +41,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -62,13 +62,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -83,13 +83,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -104,13 +104,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -125,13 +125,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -146,13 +146,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -167,13 +167,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -188,13 +188,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -209,13 +209,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -230,13 +230,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -251,13 +251,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -272,7 +272,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -287,13 +287,13 @@
           <name>sink_%d</name>
           <direction>sink</direction>
           <presence>request</presence>
-          <details>video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -308,13 +308,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -329,13 +329,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -350,7 +350,7 @@
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -365,13 +365,13 @@
           <name>sink_%d</name>
           <direction>sink</direction>
           <presence>request</presence>
-          <details>video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
diff --git a/docs/plugins/inspect/plugin-openjpeg.xml b/docs/plugins/inspect/plugin-openjpeg.xml
index 061ec87..cdcfd5b 100644
--- a/docs/plugins/inspect/plugin-openjpeg.xml
+++ b/docs/plugins/inspect/plugin-openjpeg.xml
@@ -3,10 +3,10 @@
   <description>OpenJPEG-based JPEG2000 image decoder/encoder</description>
   <filename>../../ext/openjpeg/.libs/libgstopenjpeg.so</filename>
   <basename>libgstopenjpeg.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-opus.xml b/docs/plugins/inspect/plugin-opus.xml
index c8e05be..cffb920 100644
--- a/docs/plugins/inspect/plugin-opus.xml
+++ b/docs/plugins/inspect/plugin-opus.xml
@@ -3,10 +3,10 @@
   <description>OPUS plugin library</description>
   <filename>../../ext/opus/.libs/libgstopus.so</filename>
   <basename>libgstopus.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-pcapparse.xml b/docs/plugins/inspect/plugin-pcapparse.xml
index c3fdb0b..fb83797 100644
--- a/docs/plugins/inspect/plugin-pcapparse.xml
+++ b/docs/plugins/inspect/plugin-pcapparse.xml
@@ -3,7 +3,7 @@
   <description>Element parsing raw pcap streams</description>
   <filename>../../gst/pcapparse/.libs/libgstpcapparse.so</filename>
   <basename>libgstpcapparse.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-pnm.xml b/docs/plugins/inspect/plugin-pnm.xml
index 124e59a..13790bb 100644
--- a/docs/plugins/inspect/plugin-pnm.xml
+++ b/docs/plugins/inspect/plugin-pnm.xml
@@ -3,7 +3,7 @@
   <description>PNM plugin</description>
   <filename>../../gst/pnm/.libs/libgstpnm.so</filename>
   <basename>libgstpnm.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rawparse.xml b/docs/plugins/inspect/plugin-rawparse.xml
index daa3a6c..181a5ce 100644
--- a/docs/plugins/inspect/plugin-rawparse.xml
+++ b/docs/plugins/inspect/plugin-rawparse.xml
@@ -3,7 +3,7 @@
   <description>Parses byte streams into raw frames</description>
   <filename>../../gst/rawparse/.libs/libgstrawparse.so</filename>
   <basename>libgstrawparse.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-removesilence.xml b/docs/plugins/inspect/plugin-removesilence.xml
index fc279cb..8d9d800 100644
--- a/docs/plugins/inspect/plugin-removesilence.xml
+++ b/docs/plugins/inspect/plugin-removesilence.xml
@@ -3,7 +3,7 @@
   <description>Removes silence from an audio stream</description>
   <filename>../../gst/removesilence/.libs/libgstremovesilence.so</filename>
   <basename>libgstremovesilence.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-resindvd.xml b/docs/plugins/inspect/plugin-resindvd.xml
index a12da18..840fdda 100644
--- a/docs/plugins/inspect/plugin-resindvd.xml
+++ b/docs/plugins/inspect/plugin-resindvd.xml
@@ -3,7 +3,7 @@
   <description>Resin DVD playback elements</description>
   <filename>../../ext/resindvd/.libs/libgstresindvd.so</filename>
   <basename>libgstresindvd.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-rfbsrc.xml b/docs/plugins/inspect/plugin-rfbsrc.xml
index a448d10..da41ec5 100644
--- a/docs/plugins/inspect/plugin-rfbsrc.xml
+++ b/docs/plugins/inspect/plugin-rfbsrc.xml
@@ -3,7 +3,7 @@
   <description>Connects to a VNC server and decodes RFB stream</description>
   <filename>../../gst/librfb/.libs/libgstrfbsrc.so</filename>
   <basename>libgstrfbsrc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rsvg.xml b/docs/plugins/inspect/plugin-rsvg.xml
index fcc4d72..25d2e04 100644
--- a/docs/plugins/inspect/plugin-rsvg.xml
+++ b/docs/plugins/inspect/plugin-rsvg.xml
@@ -3,10 +3,10 @@
   <description>RSVG plugin library</description>
   <filename>../../ext/rsvg/.libs/libgstrsvg.so</filename>
   <basename>libgstrsvg.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-sbc.xml b/docs/plugins/inspect/plugin-sbc.xml
index 33a2a77..732ed7d 100644
--- a/docs/plugins/inspect/plugin-sbc.xml
+++ b/docs/plugins/inspect/plugin-sbc.xml
@@ -3,10 +3,10 @@
   <description>SBC bluetooth audio support</description>
   <filename>../../ext/sbc/.libs/libgstsbc.so</filename>
   <basename>libgstsbc.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-schro.xml b/docs/plugins/inspect/plugin-schro.xml
index 765cd18..278d721 100644
--- a/docs/plugins/inspect/plugin-schro.xml
+++ b/docs/plugins/inspect/plugin-schro.xml
@@ -3,10 +3,10 @@
   <description>Schroedinger plugin</description>
   <filename>../../ext/schroedinger/.libs/libgstschro.so</filename>
   <basename>libgstschro.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-sdp.xml b/docs/plugins/inspect/plugin-sdp.xml
index 54151a5..45aba36 100644
--- a/docs/plugins/inspect/plugin-sdp.xml
+++ b/docs/plugins/inspect/plugin-sdp.xml
@@ -3,7 +3,7 @@
   <description>configure streaming sessions using SDP</description>
   <filename>../../gst/sdp/.libs/libgstsdpelem.so</filename>
   <basename>libgstsdpelem.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-segmentclip.xml b/docs/plugins/inspect/plugin-segmentclip.xml
index 7e117ca..decfa34 100644
--- a/docs/plugins/inspect/plugin-segmentclip.xml
+++ b/docs/plugins/inspect/plugin-segmentclip.xml
@@ -3,7 +3,7 @@
   <description>Segment clip elements</description>
   <filename>../../gst/segmentclip/.libs/libgstsegmentclip.so</filename>
   <basename>libgstsegmentclip.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-shm.xml b/docs/plugins/inspect/plugin-shm.xml
index a35bcc9..9089e87 100644
--- a/docs/plugins/inspect/plugin-shm.xml
+++ b/docs/plugins/inspect/plugin-shm.xml
@@ -3,7 +3,7 @@
   <description>shared memory sink source</description>
   <filename>../../sys/shm/.libs/libgstshm.so</filename>
   <basename>libgstshm.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-smooth.xml b/docs/plugins/inspect/plugin-smooth.xml
index 7ab9478..17ed22a 100644
--- a/docs/plugins/inspect/plugin-smooth.xml
+++ b/docs/plugins/inspect/plugin-smooth.xml
@@ -3,7 +3,7 @@
   <description>Apply a smooth filter to an image</description>
   <filename>../../gst/smooth/.libs/libgstsmooth.so</filename>
   <basename>libgstsmooth.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-smoothstreaming.xml b/docs/plugins/inspect/plugin-smoothstreaming.xml
index 5a48d89..f8d6336 100644
--- a/docs/plugins/inspect/plugin-smoothstreaming.xml
+++ b/docs/plugins/inspect/plugin-smoothstreaming.xml
@@ -3,10 +3,10 @@
   <description>Microsoft&apos;s Smooth Streaming format support </description>
   <filename>../../ext/smoothstreaming/.libs/libgstsmoothstreaming.so</filename>
   <basename>libgstsmoothstreaming.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-sndfile.xml b/docs/plugins/inspect/plugin-sndfile.xml
index fac17dc..b5a149a 100644
--- a/docs/plugins/inspect/plugin-sndfile.xml
+++ b/docs/plugins/inspect/plugin-sndfile.xml
@@ -3,10 +3,10 @@
   <description>use libsndfile to read and write various audio formats</description>
   <filename>../../ext/sndfile/.libs/libgstsndfile.so</filename>
   <basename>libgstsndfile.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-soundtouch.xml b/docs/plugins/inspect/plugin-soundtouch.xml
index bf48fe2..fd41c61 100644
--- a/docs/plugins/inspect/plugin-soundtouch.xml
+++ b/docs/plugins/inspect/plugin-soundtouch.xml
@@ -3,10 +3,10 @@
   <description>Audio Pitch Controller &amp; BPM Detection</description>
   <filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename>
   <basename>libgstsoundtouch.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-spandsp.xml b/docs/plugins/inspect/plugin-spandsp.xml
index a683800..3261c62 100644
--- a/docs/plugins/inspect/plugin-spandsp.xml
+++ b/docs/plugins/inspect/plugin-spandsp.xml
@@ -3,10 +3,10 @@
   <description>libspandsp plugin</description>
   <filename>../../ext/spandsp/.libs/libgstspandsp.so</filename>
   <basename>libgstspandsp.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-speed.xml b/docs/plugins/inspect/plugin-speed.xml
index 0a277b6..d0bb029 100644
--- a/docs/plugins/inspect/plugin-speed.xml
+++ b/docs/plugins/inspect/plugin-speed.xml
@@ -3,7 +3,7 @@
   <description>Set speed/pitch on audio/raw streams (resampler)</description>
   <filename>../../gst/speed/.libs/libgstspeed.so</filename>
   <basename>libgstspeed.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-srtp.xml b/docs/plugins/inspect/plugin-srtp.xml
index 18e312d..7c6c14d 100644
--- a/docs/plugins/inspect/plugin-srtp.xml
+++ b/docs/plugins/inspect/plugin-srtp.xml
@@ -3,7 +3,7 @@
   <description>GStreamer SRTP</description>
   <filename>../../ext/srtp/.libs/libgstsrtp.so</filename>
   <basename>libgstsrtp.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
@@ -50,25 +50,25 @@
       <author>Gabriel Millaire &lt;millaire.gabriel@collabora.com&gt;</author>
       <pads>
         <caps>
-          <name>rtcp_sink_%d</name>
+          <name>rtcp_sink_%u</name>
           <direction>sink</direction>
           <presence>request</presence>
           <details>application/x-rtcp</details>
         </caps>
         <caps>
-          <name>rtp_sink_%d</name>
+          <name>rtp_sink_%u</name>
           <direction>sink</direction>
           <presence>request</presence>
           <details>application/x-rtp</details>
         </caps>
         <caps>
-          <name>rtcp_src_%d</name>
+          <name>rtcp_src_%u</name>
           <direction>source</direction>
           <presence>sometimes</presence>
           <details>application/x-srtcp</details>
         </caps>
         <caps>
-          <name>rtp_src_%d</name>
+          <name>rtp_src_%u</name>
           <direction>source</direction>
           <presence>sometimes</presence>
           <details>application/x-srtp</details>
diff --git a/docs/plugins/inspect/plugin-stereo.xml b/docs/plugins/inspect/plugin-stereo.xml
index 45cc532..2c9b844 100644
--- a/docs/plugins/inspect/plugin-stereo.xml
+++ b/docs/plugins/inspect/plugin-stereo.xml
@@ -3,7 +3,7 @@
   <description>Muck with the stereo signal, enhance it&apos;s &apos;stereo-ness&apos;</description>
   <filename>../../gst/stereo/.libs/libgststereo.so</filename>
   <basename>libgststereo.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-subenc.xml b/docs/plugins/inspect/plugin-subenc.xml
index 67d784a..3304936 100644
--- a/docs/plugins/inspect/plugin-subenc.xml
+++ b/docs/plugins/inspect/plugin-subenc.xml
@@ -3,7 +3,7 @@
   <description>subtitle encoders</description>
   <filename>../../gst/subenc/.libs/libgstsubenc.so</filename>
   <basename>libgstsubenc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-uvch264.xml b/docs/plugins/inspect/plugin-uvch264.xml
index bfd3fc3..47ec193 100644
--- a/docs/plugins/inspect/plugin-uvch264.xml
+++ b/docs/plugins/inspect/plugin-uvch264.xml
@@ -3,7 +3,7 @@
   <description>UVC compliant H264 encoding cameras plugin</description>
   <filename>../../sys/uvch264/.libs/libgstuvch264.so</filename>
   <basename>libgstuvch264.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-vdpau.xml b/docs/plugins/inspect/plugin-vdpau.xml
index 5929c86..d70cfe1 100644
--- a/docs/plugins/inspect/plugin-vdpau.xml
+++ b/docs/plugins/inspect/plugin-vdpau.xml
@@ -3,7 +3,7 @@
   <description>Various elements utilizing VDPAU</description>
   <filename>../../sys/vdpau/.libs/libgstvdpau.so</filename>
   <basename>libgstvdpau.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-videofiltersbad.xml b/docs/plugins/inspect/plugin-videofiltersbad.xml
index fe26d3c..81c4b77 100644
--- a/docs/plugins/inspect/plugin-videofiltersbad.xml
+++ b/docs/plugins/inspect/plugin-videofiltersbad.xml
@@ -3,7 +3,7 @@
   <description>Video filters in gst-plugins-bad</description>
   <filename>../../gst/videofilters/.libs/libgstvideofiltersbad.so</filename>
   <basename>libgstvideofiltersbad.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-videoparsersbad.xml b/docs/plugins/inspect/plugin-videoparsersbad.xml
index c7c19f6..2ed6fa4 100644
--- a/docs/plugins/inspect/plugin-videoparsersbad.xml
+++ b/docs/plugins/inspect/plugin-videoparsersbad.xml
@@ -3,7 +3,7 @@
   <description>videoparsers</description>
   <filename>../../gst/videoparsers/.libs/libgstvideoparsersbad.so</filename>
   <basename>libgstvideoparsersbad.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml
index 887cb86..0822e75 100644
--- a/docs/plugins/inspect/plugin-videosignal.xml
+++ b/docs/plugins/inspect/plugin-videosignal.xml
@@ -3,7 +3,7 @@
   <description>Various video signal analysers</description>
   <filename>../../gst/videosignal/.libs/libgstvideosignal.so</filename>
   <basename>libgstvideosignal.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-vmnc.xml b/docs/plugins/inspect/plugin-vmnc.xml
index 3dcb8f0..0e9bc6e 100644
--- a/docs/plugins/inspect/plugin-vmnc.xml
+++ b/docs/plugins/inspect/plugin-vmnc.xml
@@ -3,7 +3,7 @@
   <description>VmWare Video Codec plugins</description>
   <filename>../../gst/vmnc/.libs/libgstvmnc.so</filename>
   <basename>libgstvmnc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-voaacenc.xml b/docs/plugins/inspect/plugin-voaacenc.xml
index c778182..38d72e3 100644
--- a/docs/plugins/inspect/plugin-voaacenc.xml
+++ b/docs/plugins/inspect/plugin-voaacenc.xml
@@ -3,7 +3,7 @@
   <description>AAC audio encoder</description>
   <filename>../../ext/voaacenc/.libs/libgstvoaacenc.so</filename>
   <basename>libgstvoaacenc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-voamrwbenc.xml b/docs/plugins/inspect/plugin-voamrwbenc.xml
index 617dc29..20c5bf0 100644
--- a/docs/plugins/inspect/plugin-voamrwbenc.xml
+++ b/docs/plugins/inspect/plugin-voamrwbenc.xml
@@ -3,7 +3,7 @@
   <description>Adaptive Multi-Rate Wide-Band Encoder</description>
   <filename>../../ext/voamrwbenc/.libs/libgstvoamrwbenc.so</filename>
   <basename>libgstvoamrwbenc.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>unknown</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-waylandsink.xml b/docs/plugins/inspect/plugin-waylandsink.xml
index de3c2ca..750d11f 100644
--- a/docs/plugins/inspect/plugin-waylandsink.xml
+++ b/docs/plugins/inspect/plugin-waylandsink.xml
@@ -3,7 +3,7 @@
   <description>Wayland Video Sink</description>
   <filename>../../ext/wayland/.libs/libgstwaylandsink.so</filename>
   <basename>libgstwaylandsink.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-webp.xml b/docs/plugins/inspect/plugin-webp.xml
index 295cb96..a3577a7 100644
--- a/docs/plugins/inspect/plugin-webp.xml
+++ b/docs/plugins/inspect/plugin-webp.xml
@@ -3,10 +3,10 @@
   <description>WebP plugin</description>
   <filename>../../ext/webp/.libs/libgstwebp.so</filename>
   <basename>libgstwebp.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml
index 0d166be..5f79cfa 100644
--- a/docs/plugins/inspect/plugin-wildmidi.xml
+++ b/docs/plugins/inspect/plugin-wildmidi.xml
@@ -3,10 +3,10 @@
   <description>Wildmidi Plugin</description>
   <filename>../../ext/timidity/.libs/libgstwildmidi.so</filename>
   <basename>libgstwildmidi.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/docs/plugins/inspect/plugin-y4mdec.xml b/docs/plugins/inspect/plugin-y4mdec.xml
index d2ef561..7cee1f8 100644
--- a/docs/plugins/inspect/plugin-y4mdec.xml
+++ b/docs/plugins/inspect/plugin-y4mdec.xml
@@ -3,7 +3,7 @@
   <description>Demuxes/decodes YUV4MPEG streams</description>
   <filename>../../gst/y4m/.libs/libgsty4mdec.so</filename>
   <basename>libgsty4mdec.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-yadif.xml b/docs/plugins/inspect/plugin-yadif.xml
index 7f413b5..b90f482 100644
--- a/docs/plugins/inspect/plugin-yadif.xml
+++ b/docs/plugins/inspect/plugin-yadif.xml
@@ -3,7 +3,7 @@
   <description>YADIF deinterlacing filter</description>
   <filename>../../gst/yadif/.libs/libgstyadif.so</filename>
   <basename>libgstyadif.so</basename>
-  <version>1.3.1</version>
+  <version>1.3.2</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-zbar.xml b/docs/plugins/inspect/plugin-zbar.xml
index 307e33b..022e833 100644
--- a/docs/plugins/inspect/plugin-zbar.xml
+++ b/docs/plugins/inspect/plugin-zbar.xml
@@ -3,10 +3,10 @@
   <description>zbar barcode scanner</description>
   <filename>../../ext/zbar/.libs/libgstzbar.so</filename>
   <basename>libgstzbar.so</basename>
-  <version>1.3.0.1</version>
+  <version>1.3.2</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins git</package>
+  <package>GStreamer Bad Plug-ins source release</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c
index a04d94e..68462ca 100644
--- a/ext/assrender/gstassrender.c
+++ b/ext/assrender/gstassrender.c
@@ -521,7 +521,9 @@
   caps_size = gst_caps_get_size (new_caps);
   for (i = 0; i < caps_size; i++) {
     GstCapsFeatures *features = gst_caps_get_features (new_caps, i);
-    gst_caps_features_add (features, feature);
+    if (!gst_caps_features_is_any (features)) {
+      gst_caps_features_add (features, feature);
+    }
   }
 
   gst_caps_append (new_caps, gst_caps_intersect_full (caps,
diff --git a/ext/curl/gstcurlsshsink.c b/ext/curl/gstcurlsshsink.c
index 91f05f9..b4c6b77 100644
--- a/ext/curl/gstcurlsshsink.c
+++ b/ext/curl/gstcurlsshsink.c
@@ -48,8 +48,6 @@
 
 /* Default values */
 #define GST_CAT_DEFAULT    gst_curl_ssh_sink_debug
-#define DEFAULT_INSECURE   TRUE
-
 
 /* Plugin specific settings */
 
@@ -63,6 +61,7 @@
   PROP_SSH_PRIV_KEYFILE,
   PROP_SSH_KEY_PASSPHRASE,
   PROP_SSH_KNOWNHOSTS,
+  PROP_SSH_HOST_PUBLIC_KEY_MD5,
   PROP_SSH_ACCEPT_UNKNOWNHOST
 };
 
@@ -159,6 +158,13 @@
           "The complete path & filename of the SSH 'known_hosts' file",
           NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  g_object_class_install_property (gobject_class, PROP_SSH_HOST_PUBLIC_KEY_MD5,
+      g_param_spec_string ("ssh-host-pubkey-md5",
+          "MD5 checksum of the remote host's public key",
+          "MD5 checksum (32 hexadecimal digits, case-insensitive) of the "
+          "remote host's public key",
+          NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_property (gobject_class, PROP_SSH_ACCEPT_UNKNOWNHOST,
       g_param_spec_boolean ("ssh-accept-unknownhost",
           "SSH accept unknown host",
@@ -174,6 +180,7 @@
   sink->ssh_priv_keyfile = NULL;
   sink->ssh_key_passphrase = NULL;
   sink->ssh_knownhosts = NULL;
+  sink->ssh_host_public_key_md5 = NULL;
   sink->ssh_accept_unknownhost = FALSE;
 }
 
@@ -188,6 +195,7 @@
   g_free (this->ssh_priv_keyfile);
   g_free (this->ssh_key_passphrase);
   g_free (this->ssh_knownhosts);
+  g_free (this->ssh_host_public_key_md5);
 
   G_OBJECT_CLASS (parent_class)->finalize (gobject);
 }
@@ -242,6 +250,13 @@
       GST_DEBUG_OBJECT (sink, "ssh_knownhosts set to %s", sink->ssh_knownhosts);
       break;
 
+    case PROP_SSH_HOST_PUBLIC_KEY_MD5:
+      g_free (sink->ssh_host_public_key_md5);
+      sink->ssh_host_public_key_md5 = g_value_dup_string (value);
+      GST_DEBUG_OBJECT (sink, "ssh_host_public_key_md5 set to %s",
+          sink->ssh_host_public_key_md5);
+      break;
+
     case PROP_SSH_ACCEPT_UNKNOWNHOST:
       sink->ssh_accept_unknownhost = g_value_get_boolean (value);
       GST_DEBUG_OBJECT (sink, "ssh_accept_unknownhost set to %d",
@@ -285,6 +300,10 @@
       g_value_set_string (value, sink->ssh_knownhosts);
       break;
 
+    case PROP_SSH_HOST_PUBLIC_KEY_MD5:
+      g_value_set_string (value, sink->ssh_host_public_key_md5);
+      break;
+
     case PROP_SSH_ACCEPT_UNKNOWNHOST:
       g_value_set_boolean (value, sink->ssh_accept_unknownhost);
       break;
@@ -299,14 +318,14 @@
 gst_curl_ssh_sink_set_options_unlocked (GstCurlBaseSink * bcsink)
 {
   GstCurlSshSink *sink = GST_CURL_SSH_SINK (bcsink);
-  gint curl_err = CURLE_OK;
+  CURLcode curl_err = CURLE_OK;
 
   /* set SSH specific options here */
   if (sink->ssh_pub_keyfile) {
     if ((curl_err = curl_easy_setopt (bcsink->curl, CURLOPT_SSH_PUBLIC_KEYFILE,
                 sink->ssh_pub_keyfile)) != CURLE_OK) {
-      GST_ERROR_OBJECT (sink, "curl error: %d setting public key file: %s.",
-          curl_err, sink->ssh_pub_keyfile);
+      bcsink->error = g_strdup_printf ("failed to set public key file: %s",
+          curl_easy_strerror (curl_err));
       return FALSE;
     }
   }
@@ -314,8 +333,8 @@
   if (sink->ssh_priv_keyfile) {
     if ((curl_err = curl_easy_setopt (bcsink->curl, CURLOPT_SSH_PRIVATE_KEYFILE,
                 sink->ssh_priv_keyfile)) != CURLE_OK) {
-      GST_ERROR_OBJECT (sink, "curl error: %d setting private key file: %s.",
-          curl_err, sink->ssh_priv_keyfile);
+      bcsink->error = g_strdup_printf ("failed to set private key file: %s",
+          curl_easy_strerror (curl_err));
       return FALSE;
     }
   }
@@ -323,8 +342,27 @@
   if (sink->ssh_knownhosts) {
     if ((curl_err = curl_easy_setopt (bcsink->curl, CURLOPT_SSH_KNOWNHOSTS,
                 sink->ssh_knownhosts)) != CURLE_OK) {
-      GST_ERROR_OBJECT (sink, "curl error: %d setting known_hosts file: %s.",
-          curl_err, sink->ssh_knownhosts);
+      bcsink->error = g_strdup_printf ("failed to set known_hosts file: %s",
+          curl_easy_strerror (curl_err));
+      return FALSE;
+    }
+  }
+
+  if (sink->ssh_host_public_key_md5) {
+    /* libcurl is freaking tricky. If the input string is not exactly 32
+     * hexdigits long it silently ignores CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 and
+     * performs the transfer without authenticating the server! */
+    if (strlen (sink->ssh_host_public_key_md5) != 32) {
+      bcsink->error = g_strdup ("MD5-hash string has invalid length, "
+          "must be exactly 32 hexdigits!");
+      return FALSE;
+    }
+
+    if ((curl_err =
+            curl_easy_setopt (bcsink->curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
+                sink->ssh_host_public_key_md5)) != CURLE_OK) {
+      bcsink->error = g_strdup_printf ("failed to set remote host's public "
+          "key MD5: %s", curl_easy_strerror (curl_err));
       return FALSE;
     }
   }
@@ -337,8 +375,8 @@
     /* set the SSH_AUTH_TYPE */
     if ((curl_err = curl_easy_setopt (bcsink->curl, CURLOPT_SSH_AUTH_TYPES,
                 sink->ssh_auth_type)) != CURLE_OK) {
-      GST_ERROR_OBJECT (sink, "curl error: %d setting auth type: %d.", curl_err,
-          sink->ssh_auth_type);
+      bcsink->error = g_strdup_printf ("failed to set authentication type: %s",
+          curl_easy_strerror (curl_err));
       return FALSE;
     }
 
@@ -347,9 +385,8 @@
       if (sink->ssh_key_passphrase) {
         if ((curl_err = curl_easy_setopt (bcsink->curl, CURLOPT_KEYPASSWD,
                     sink->ssh_key_passphrase)) != CURLE_OK) {
-          GST_ERROR_OBJECT (sink,
-              "curl error: %d setting private key passphrase: %s.", curl_err,
-              sink->ssh_key_passphrase);
+          bcsink->error = g_strdup_printf ("failed to set private key "
+              "passphrase: %s", curl_easy_strerror (curl_err));
           return FALSE;
         }
       } else {
@@ -362,8 +399,8 @@
     }
 
   } else {
-    GST_ERROR_OBJECT (sink, "Error: unsupported authentication type: %d.",
-        sink->ssh_auth_type);
+    bcsink->error = g_strdup_printf ("Error: unsupported authentication type: "
+        "%d.", sink->ssh_auth_type);
     return FALSE;
   }
 
@@ -372,8 +409,8 @@
    * is also set! */
   if ((curl_err = curl_easy_setopt (bcsink->curl, CURLOPT_SSH_KEYFUNCTION,
               curl_ssh_sink_sshkey_cb)) != CURLE_OK) {
-    GST_ERROR_OBJECT (sink, "curl error: %d setting CURLOPT_SSH_KEYFUNCTION.",
-        curl_err);
+    bcsink->error = g_strdup_printf ("failed to set SSH_KEYFUNCTION callback: "
+        "%s", curl_easy_strerror (curl_err));
     return FALSE;
   } else {
     /* SSH_KEYFUNCTION callback successfully installed so go on and
@@ -381,8 +418,9 @@
     if ((curl_err =
             curl_easy_setopt (bcsink->curl, CURLOPT_SSH_KEYDATA,
                 sink)) != CURLE_OK) {
-      GST_ERROR_OBJECT (sink, "curl error: %d setting CURLOPT_SSH_KEYDATA.",
-          curl_err);
+      bcsink->error = g_strdup_printf ("failed to set CURLOPT_SSH_KEYDATA: %s",
+          curl_easy_strerror (curl_err));
+      return FALSE;
     }
   }
 
@@ -445,8 +483,8 @@
 
     default:
       /* something went wrong, we got some bogus key match result */
-      GST_ERROR_OBJECT (sink,
-          "libcurl internal error encountered during known_host matching");
+      GST_CURL_BASE_SINK (sink)->error =
+          g_strdup ("libcurl internal error during known_host matching");
       break;
   }
 
diff --git a/ext/curl/gstcurlsshsink.h b/ext/curl/gstcurlsshsink.h
index 4e502a3..1b56c4d 100644
--- a/ext/curl/gstcurlsshsink.h
+++ b/ext/curl/gstcurlsshsink.h
@@ -70,6 +70,8 @@
                                    CURLOPT_SSH_KNOWN_HOSTS */
   gboolean ssh_accept_unknownhost;      /* accept or reject unknown public key
                                            from remote host */
+  gchar *ssh_host_public_key_md5;   /* MD5-hash of the remote host's public key:
+                                       CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 */
 };
 
 struct _GstCurlSshSinkClass
diff --git a/ext/dash/Makefile.am b/ext/dash/Makefile.am
index b6e5446..97d8623 100644
--- a/ext/dash/Makefile.am
+++ b/ext/dash/Makefile.am
@@ -4,14 +4,12 @@
 libgstdashdemux_la_SOURCES =			\
 	gstmpdparser.c				\
 	gstdashdemux.c				\
-	gstplugin.c				\
-	gstdownloadrate.c
+	gstplugin.c
 
 # headers we need but don't want installed
 noinst_HEADERS =        \
         gstmpdparser.h	\
 	gstdashdemux.h	\
-	gstdownloadrate.h \
 	gstdash_debug.h
 
 # compiler and linker flags used to compile this plugin, set in configure.ac
diff --git a/ext/dash/Makefile.in b/ext/dash/Makefile.in
index 23e4f2a..d891907 100644
--- a/ext/dash/Makefile.in
+++ b/ext/dash/Makefile.in
@@ -159,8 +159,7 @@
 	$(am__DEPENDENCIES_1)
 am_libgstdashdemux_la_OBJECTS = libgstdashdemux_la-gstmpdparser.lo \
 	libgstdashdemux_la-gstdashdemux.lo \
-	libgstdashdemux_la-gstplugin.lo \
-	libgstdashdemux_la-gstdownloadrate.lo
+	libgstdashdemux_la-gstplugin.lo
 libgstdashdemux_la_OBJECTS = $(am_libgstdashdemux_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -729,15 +728,13 @@
 libgstdashdemux_la_SOURCES = \
 	gstmpdparser.c				\
 	gstdashdemux.c				\
-	gstplugin.c				\
-	gstdownloadrate.c
+	gstplugin.c
 
 
 # headers we need but don't want installed
 noinst_HEADERS = \
         gstmpdparser.h	\
 	gstdashdemux.h	\
-	gstdownloadrate.h \
 	gstdash_debug.h
 
 
@@ -829,7 +826,6 @@
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdashdemux_la-gstdashdemux.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdashdemux_la-gstdownloadrate.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdashdemux_la-gstmpdparser.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdashdemux_la-gstplugin.Plo@am__quote@
 
@@ -878,13 +874,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdashdemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdashdemux_la_CFLAGS) $(CFLAGS) -c -o libgstdashdemux_la-gstplugin.lo `test -f 'gstplugin.c' || echo '$(srcdir)/'`gstplugin.c
 
-libgstdashdemux_la-gstdownloadrate.lo: gstdownloadrate.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstdashdemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdashdemux_la_CFLAGS) $(CFLAGS) -MT libgstdashdemux_la-gstdownloadrate.lo -MD -MP -MF $(DEPDIR)/libgstdashdemux_la-gstdownloadrate.Tpo -c -o libgstdashdemux_la-gstdownloadrate.lo `test -f 'gstdownloadrate.c' || echo '$(srcdir)/'`gstdownloadrate.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstdashdemux_la-gstdownloadrate.Tpo $(DEPDIR)/libgstdashdemux_la-gstdownloadrate.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstdownloadrate.c' object='libgstdashdemux_la-gstdownloadrate.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 $(libgstdashdemux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstdashdemux_la_CFLAGS) $(CFLAGS) -c -o libgstdashdemux_la-gstdownloadrate.lo `test -f 'gstdownloadrate.c' || echo '$(srcdir)/'`gstdownloadrate.c
-
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c
index 372fe43..02c4b62 100644
--- a/ext/dash/gstdashdemux.c
+++ b/ext/dash/gstdashdemux.c
@@ -180,7 +180,6 @@
 #define DEFAULT_MAX_BITRATE        24000000     /* in bit/s  */
 
 #define DEFAULT_FAILED_COUNT 3
-#define DOWNLOAD_RATE_HISTORY_MAX 3
 
 #define GST_DASH_DEMUX_CLIENT_LOCK(d) g_mutex_lock (&d->client_lock)
 #define GST_DASH_DEMUX_CLIENT_UNLOCK(d) g_mutex_unlock (&d->client_lock)
@@ -196,6 +195,9 @@
 static GstStateChangeReturn
 gst_dash_demux_change_state (GstElement * element, GstStateChange transition);
 
+/* GstBin */
+static void gst_dash_demux_handle_message (GstBin * bin, GstMessage * msg);
+
 /* GstDashDemux */
 static GstFlowReturn gst_dash_demux_pad (GstPad * pad, GstObject * parent,
     GstBuffer * buf);
@@ -218,6 +220,8 @@
 static gboolean gst_dash_demux_advance_period (GstDashDemux * demux);
 static void gst_dash_demux_download_wait (GstDashDemuxStream * stream,
     GstClockTime time_diff);
+static void gst_dash_demux_stream_download_uri (GstDashDemux * demux,
+    GstDashDemuxStream * stream, const gchar * uri, gint64 start, gint64 end);
 
 static void gst_dash_demux_expose_streams (GstDashDemux * demux);
 static void gst_dash_demux_remove_streams (GstDashDemux * demux,
@@ -226,10 +230,11 @@
 static void gst_dash_demux_reset (GstDashDemux * demux, gboolean dispose);
 static GstCaps *gst_dash_demux_get_input_caps (GstDashDemux * demux,
     GstActiveStream * stream);
-static GstPad *gst_dash_demux_create_pad (GstDashDemux * demux);
+static GstPad *gst_dash_demux_create_pad (GstDashDemux * demux,
+    GstDashDemuxStream * stream);
 
 #define gst_dash_demux_parent_class parent_class
-G_DEFINE_TYPE_WITH_CODE (GstDashDemux, gst_dash_demux, GST_TYPE_ELEMENT,
+G_DEFINE_TYPE_WITH_CODE (GstDashDemux, gst_dash_demux, GST_TYPE_BIN,
     GST_DEBUG_CATEGORY_INIT (gst_dash_demux_debug, "dashdemux", 0,
         "dashdemux element");
     );
@@ -256,9 +261,11 @@
 {
   GObjectClass *gobject_class;
   GstElementClass *gstelement_class;
+  GstBinClass *gstbin_class;
 
   gobject_class = (GObjectClass *) klass;
   gstelement_class = (GstElementClass *) klass;
+  gstbin_class = (GstBinClass *) klass;
 
   gobject_class->set_property = gst_dash_demux_set_property;
   gobject_class->get_property = gst_dash_demux_get_property;
@@ -266,7 +273,8 @@
 
   g_object_class_install_property (gobject_class, PROP_MAX_BUFFERING_TIME,
       g_param_spec_uint ("max-buffering-time", "Maximum buffering time",
-          "Maximum number of seconds of buffer accumulated during playback",
+          "Maximum number of seconds of buffer accumulated during playback"
+          "(deprecated)",
           2, G_MAXUINT, DEFAULT_MAX_BUFFERING_TIME,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
@@ -299,6 +307,8 @@
       "David Corvoysier <david.corvoysier@orange.com>\n\
                 Hamid Zakari <hamid.zakari@gmail.com>\n\
                 Gianluca Gennari <gennarone@gmail.com>");
+
+  gstbin_class->handle_message = gst_dash_demux_handle_message;
 }
 
 static void
@@ -397,6 +407,48 @@
   return ret;
 }
 
+static void
+gst_dash_demux_handle_message (GstBin * bin, GstMessage * msg)
+{
+  GstDashDemux *demux = GST_DASH_DEMUX_CAST (bin);
+
+  switch (GST_MESSAGE_TYPE (msg)) {
+    case GST_MESSAGE_ERROR:{
+      GSList *iter;
+      GstDashDemuxStream *stream;
+      GError *err = NULL;
+      gchar *debug = NULL;
+
+      for (iter = demux->streams; iter; iter = g_slist_next (iter)) {
+        stream = iter->data;
+        if (GST_OBJECT_CAST (stream->src) == GST_MESSAGE_SRC (msg)) {
+          gst_message_parse_error (msg, &err, &debug);
+
+          GST_WARNING_OBJECT (stream->pad, "Source posted error: %d:%d %s (%s)",
+              err->domain, err->code, err->message, debug);
+
+          /* error, but ask to retry */
+          stream->last_ret = GST_FLOW_CUSTOM_ERROR;
+          g_cond_signal (&stream->fragment_download_cond);
+
+          g_error_free (err);
+          g_free (debug);
+          break;
+        }
+      }
+
+      gst_message_unref (msg);
+      msg = NULL;
+    }
+      break;
+    default:
+      break;
+  }
+
+  if (msg)
+    GST_BIN_CLASS (parent_class)->handle_message (bin, msg);
+}
+
 static gboolean
 gst_dash_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
 {
@@ -528,7 +580,6 @@
         for (iter = demux->streams; iter; iter = g_slist_next (iter)) {
           GstDashDemuxStream *stream = iter->data;
           stream->last_ret = GST_FLOW_OK;
-          gst_uri_downloader_reset (stream->downloader);
         }
         demux->timestamp_offset = 0;
         gst_uri_downloader_reset (demux->downloader);
@@ -562,6 +613,13 @@
       GST_DASH_DEMUX_CLIENT_UNLOCK (demux);
     }
       break;
+    case GST_EVENT_LATENCY:{
+      /* Upstream and our internal source are irrelevant
+       * for latency, and we should not fail here to
+       * configure the latency */
+      gst_event_unref (event);
+      return TRUE;
+    }
     default:
       break;
   }
@@ -652,18 +710,18 @@
     gst_task_set_lock (stream->download_task, &stream->download_task_lock);
     g_cond_init (&stream->download_cond);
     g_mutex_init (&stream->download_mutex);
-    stream->downloader = gst_uri_downloader_new ();
+    stream->download_total_time = 0;
+    stream->download_total_bytes = 0;
 
     stream->index = i;
     stream->input_caps = caps;
     stream->need_header = TRUE;
-    gst_download_rate_init (&stream->dnl_rate);
-    gst_download_rate_set_max_length (&stream->dnl_rate,
-        DOWNLOAD_RATE_HISTORY_MAX);
+    g_cond_init (&stream->fragment_download_cond);
+    g_mutex_init (&stream->fragment_download_lock);
 
     GST_LOG_OBJECT (demux, "Creating stream %d %" GST_PTR_FORMAT, i, caps);
     streams = g_slist_prepend (streams, stream);
-    stream->pad = gst_dash_demux_create_pad (demux);
+    stream->pad = gst_dash_demux_create_pad (demux, stream);
 
     stream_id =
         gst_pad_create_stream_id_printf (stream->pad,
@@ -958,6 +1016,7 @@
     GstDashDemuxStream *stream = iter->data;
 
     gst_task_join (stream->download_task);
+    gst_element_set_state (stream->src, GST_STATE_NULL);
   }
 }
 
@@ -979,22 +1038,29 @@
     stream->need_header = TRUE;
     gst_task_stop (stream->download_task);
     GST_TASK_SIGNAL (stream->download_task);
-    gst_uri_downloader_cancel (stream->downloader);
+    gst_element_set_state (stream->src, GST_STATE_READY);
+    g_cond_signal (&stream->fragment_download_cond);
   }
 }
 
 static GstPad *
-gst_dash_demux_create_pad (GstDashDemux * demux)
+gst_dash_demux_create_pad (GstDashDemux * demux, GstDashDemuxStream * stream)
 {
   GstPad *pad;
+  GstPadTemplate *tmpl;
+
+  tmpl = gst_static_pad_template_get (&srctemplate);
 
   /* Create and activate new pads */
-  pad = gst_pad_new_from_static_template (&srctemplate, NULL);
+  pad = gst_ghost_pad_new_no_target_from_template (NULL, tmpl);
+  gst_object_unref (tmpl);
+
   gst_pad_set_event_function (pad,
       GST_DEBUG_FUNCPTR (gst_dash_demux_src_event));
   gst_pad_set_query_function (pad,
       GST_DEBUG_FUNCPTR (gst_dash_demux_src_query));
-  gst_pad_set_element_private (pad, demux);
+  gst_pad_set_element_private (pad, stream);
+
   gst_pad_set_active (pad, TRUE);
   GST_INFO_OBJECT (demux, "Creating srcpad %s:%s", GST_DEBUG_PAD_NAME (pad));
   return pad;
@@ -1081,54 +1147,9 @@
   return TRUE;
 }
 
-static GstFlowReturn
-gst_dash_demux_push (GstDashDemuxStream * stream, GstBuffer * buffer)
-{
-  GstDashDemux *demux = stream->demux;
-  GstClockTime timestamp, duration;
-  GstFlowReturn ret = GST_FLOW_OK;
-
-  timestamp = GST_BUFFER_TIMESTAMP (buffer);
-
-  if (stream->pending_segment) {
-    if (demux->timestamp_offset == -1)
-      demux->timestamp_offset = timestamp;
-    else
-      demux->timestamp_offset = MIN (timestamp, demux->timestamp_offset);
-
-    /* And send a newsegment */
-    gst_pad_push_event (stream->pad, stream->pending_segment);
-    stream->pending_segment = NULL;
-  }
-
-  /* make timestamp start from 0 by subtracting the offset */
-  timestamp -= demux->timestamp_offset;
-  duration = GST_BUFFER_DURATION (buffer);
-
-  GST_BUFFER_TIMESTAMP (buffer) = timestamp;
-
-  GST_DEBUG_OBJECT (stream->pad,
-      "Pushing fragment %p #%" G_GUINT64_FORMAT " (stream %d) ts:%"
-      GST_TIME_FORMAT " dur:%" GST_TIME_FORMAT, buffer,
-      GST_BUFFER_OFFSET (buffer), stream->index,
-      GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
-      GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
-  ret = gst_pad_push (stream->pad, gst_buffer_ref (buffer));
-  GST_DEBUG_OBJECT (stream->pad, "Push result: %d %s", ret,
-      gst_flow_get_name (ret));
-
-  demux->segment.position = timestamp;
-  stream->position = timestamp;
-  if (GST_CLOCK_TIME_IS_VALID (duration))
-    stream->position += duration;
-
-  return ret;
-}
-
 static void
 gst_dash_demux_stream_free (GstDashDemuxStream * stream)
 {
-  gst_download_rate_deinit (&stream->dnl_rate);
   if (stream->input_caps) {
     gst_caps_unref (stream->input_caps);
     stream->input_caps = NULL;
@@ -1148,10 +1169,20 @@
   g_cond_clear (&stream->download_cond);
   g_mutex_clear (&stream->download_mutex);
 
-  if (stream->downloader != NULL) {
-    g_object_unref (stream->downloader);
+  if (stream->src_srcpad) {
+    gst_object_unref (stream->src_srcpad);
+    stream->src_srcpad = NULL;
   }
 
+  if (stream->src) {
+    gst_element_set_state (stream->src, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN_CAST (stream->demux), stream->src);
+    stream->src = NULL;
+  }
+
+  g_cond_clear (&stream->fragment_download_cond);
+  g_mutex_clear (&stream->fragment_download_lock);
+
   g_free (stream);
 }
 
@@ -1240,7 +1271,7 @@
     GST_DEBUG_OBJECT (demux, "Updating manifest file from URL %s",
         demux->client->mpd_uri);
     download = gst_uri_downloader_fetch_uri (demux->downloader,
-        demux->client->mpd_uri, NULL, TRUE, TRUE, NULL);
+        demux->client->mpd_uri, NULL, TRUE, TRUE, TRUE, NULL);
     if (download) {
       GstMpdClient *new_client = NULL;
 
@@ -1611,7 +1642,7 @@
   GList *rep_list = NULL;
   gint new_index;
   GstDashDemux *demux = stream->demux;
-  guint64 bitrate;
+  guint64 bitrate = 0;
 
   active_stream = stream->active_stream;
   if (active_stream == NULL)
@@ -1623,11 +1654,29 @@
   if (!rep_list)
     return FALSE;
 
-  bitrate =
-      gst_download_rate_get_current_rate (&stream->dnl_rate) *
-      demux->bandwidth_usage;
-  GST_DEBUG_OBJECT (demux, "Trying to change to bitrate: %" G_GUINT64_FORMAT,
-      bitrate);
+  /* compare the time when the fragment was downloaded with the time when it was
+   * scheduled */
+  if (stream->download_total_time)
+    bitrate =
+        (stream->download_total_bytes * 8) /
+        ((double) stream->download_total_time / G_GUINT64_CONSTANT (1000000));
+
+  GST_DEBUG_OBJECT (stream->pad,
+      "Downloaded %u bytes in %" GST_TIME_FORMAT ". Bitrate is : %d",
+      (guint) stream->download_total_bytes,
+      GST_TIME_ARGS (stream->download_total_time * GST_USECOND),
+      (gint) bitrate);
+
+  /* Take old rate into account too */
+  if (stream->current_download_rate != -1)
+    bitrate = (stream->current_download_rate + bitrate * 3) / 4;
+  if (bitrate > G_MAXINT)
+    bitrate = G_MAXINT;
+  stream->current_download_rate = bitrate;
+  bitrate *= demux->bandwidth_usage;
+
+  GST_DEBUG_OBJECT (stream->pad,
+      "Trying to change to bitrate: %" G_GUINT64_FORMAT, bitrate);
 
   /* get representation index with current max_bandwidth */
   new_index = gst_mpdparser_get_rep_idx_with_max_bandwidth (rep_list, bitrate);
@@ -1655,14 +1704,12 @@
   return NULL;
 }
 
-static GstBuffer *
+static void
 gst_dash_demux_download_header_fragment (GstDashDemux * demux,
     GstDashDemuxStream * stream, gchar * path, gint64 range_start,
     gint64 range_end)
 {
-  GstBuffer *buffer = NULL;
   gchar *next_header_uri;
-  GstFragment *fragment;
 
   if (strncmp (path, "http://", 7) != 0) {
     next_header_uri =
@@ -1673,56 +1720,37 @@
     next_header_uri = path;
   }
 
-  fragment = gst_uri_downloader_fetch_uri_with_range (stream->downloader,
-      next_header_uri, demux->client->mpd_uri, FALSE, FALSE, range_start,
-      range_end, NULL);
+  gst_dash_demux_stream_download_uri (demux, stream, next_header_uri,
+      range_start, range_end);
   g_free (next_header_uri);
-  if (fragment) {
-    buffer = gst_fragment_get_buffer (fragment);
-    g_object_unref (fragment);
-  }
-  return buffer;
 }
 
-static GstBuffer *
+static void
 gst_dash_demux_get_next_header (GstDashDemux * demux,
     GstDashDemuxStream * stream)
 {
   gchar *initializationURL;
-  GstBuffer *header_buffer, *index_buffer = NULL;
   gint64 range_start, range_end;
 
   if (!gst_mpd_client_get_next_header (demux->client, &initializationURL,
           stream->index, &range_start, &range_end))
-    return NULL;
+    return;
 
   GST_INFO_OBJECT (demux, "Fetching header %s %" G_GINT64_FORMAT "-%"
       G_GINT64_FORMAT, initializationURL, range_start, range_end);
-  header_buffer = gst_dash_demux_download_header_fragment (demux, stream,
+  gst_dash_demux_download_header_fragment (demux, stream,
       initializationURL, range_start, range_end);
 
   /* check if we have an index */
-  if (header_buffer
+  if (!demux->cancelled && stream->last_ret == GST_FLOW_OK      /* TODO check for other valid types */
       && gst_mpd_client_get_next_header_index (demux->client,
           &initializationURL, stream->index, &range_start, &range_end)) {
     GST_INFO_OBJECT (demux,
         "Fetching index %s %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT,
         initializationURL, range_start, range_end);
-    index_buffer =
-        gst_dash_demux_download_header_fragment (demux, stream,
+    gst_dash_demux_download_header_fragment (demux, stream,
         initializationURL, range_start, range_end);
   }
-
-  if (header_buffer == NULL) {
-    GST_WARNING_OBJECT (demux, "Unable to fetch header");
-    return NULL;
-  }
-
-  if (index_buffer) {
-    header_buffer = gst_buffer_append (header_buffer, index_buffer);
-  }
-
-  return header_buffer;
 }
 
 static GstCaps *
@@ -1847,19 +1875,289 @@
   }
 }
 
-static GstBuffer *
+static GstFlowReturn
+_src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
+{
+  GstPad *srcpad = (GstPad *) parent;
+  GstDashDemux *demux = (GstDashDemux *) GST_PAD_PARENT (srcpad);
+  GstDashDemuxStream *stream = gst_pad_get_element_private (srcpad);
+  GstFlowReturn ret;
+  gboolean discont = FALSE;
+
+  if (stream->starting_fragment) {
+    if (demux->segment.rate < 0)
+      /* Set DISCONT flag for every first buffer in reverse playback mode
+       * as each fragment for its own has to be reversed */
+      discont = TRUE;
+    stream->starting_fragment = FALSE;
+
+    GST_LOG_OBJECT (stream->pad, "set fragment pts=%" GST_TIME_FORMAT,
+        GST_TIME_ARGS (stream->current_fragment.timestamp));
+
+    GST_BUFFER_PTS (buffer) = stream->current_fragment.timestamp;
+
+    if (stream->pending_segment) {
+      if (demux->timestamp_offset == -1)
+        demux->timestamp_offset = GST_BUFFER_PTS (buffer);
+      else
+        demux->timestamp_offset =
+            MIN (GST_BUFFER_PTS (buffer), demux->timestamp_offset);
+
+      /* And send a newsegment */
+      gst_pad_push_event (stream->pad, stream->pending_segment);
+      stream->pending_segment = NULL;
+    }
+
+    /* make timestamp start from 0 by subtracting the offset */
+    GST_BUFFER_PTS (buffer) -= demux->timestamp_offset;
+
+    stream->position = demux->segment.position = GST_BUFFER_PTS (buffer);
+
+  } else {
+    GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE;
+  }
+
+  if (discont) {
+    GST_DEBUG_OBJECT (stream->pad, "Marking fragment as discontinuous");
+    GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+  } else {
+    GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);
+  }
+
+  GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
+  GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE;
+  GST_BUFFER_OFFSET (buffer) =
+      gst_mpd_client_get_segment_index (stream->active_stream) - 1;
+
+  /* accumulate time and size to get this chunk */
+  stream->download_total_time +=
+      g_get_monotonic_time () - stream->download_start_time;
+  stream->download_total_bytes += gst_buffer_get_size (buffer);
+
+  ret = gst_proxy_pad_chain_default (pad, parent, buffer);
+  stream->download_start_time = g_get_monotonic_time ();
+  GST_LOG_OBJECT (pad, "Chain res: %d %s", ret, gst_flow_get_name (ret));
+
+  if (ret != GST_FLOW_OK) {
+    if (ret < GST_FLOW_EOS) {
+      GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL),
+          ("stream stopped, reason %s", gst_flow_get_name (ret)));
+
+      /* TODO push this on all pads */
+      gst_pad_push_event (stream->pad, gst_event_new_eos ());
+    } else {
+      GST_DEBUG_OBJECT (stream->pad, "stream stopped, reason %s",
+          gst_flow_get_name (ret));
+    }
+
+    /* TODO properly stop tasks */
+    /* gst_hls_demux_pause_tasks (demux); */
+  }
+
+  /* avoid having the source handle the same error again */
+  stream->last_ret = ret;
+  ret = GST_FLOW_OK;
+
+  return ret;
+}
+
+static gboolean
+_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
+{
+  GstPad *srcpad = GST_PAD_CAST (parent);
+  GstDashDemuxStream *stream = gst_pad_get_element_private (srcpad);
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_EOS:
+      g_cond_signal (&stream->fragment_download_cond);
+      break;
+    default:
+      break;
+  }
+
+  gst_event_unref (event);
+
+  return TRUE;
+}
+
+static gboolean
+_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
+{
+  switch (GST_QUERY_TYPE (query)) {
+    case GST_QUERY_ALLOCATION:
+      return FALSE;
+      break;
+    default:
+      break;
+  }
+
+  return gst_pad_query_default (pad, parent, query);
+}
+
+static gboolean
+gst_dash_demux_stream_update_source (GstDashDemuxStream * stream,
+    const gchar * uri, const gchar * referer, gboolean refresh,
+    gboolean allow_cache)
+{
+  GstDashDemux *demux = stream->demux;
+
+  if (!gst_uri_is_valid (uri)) {
+    GST_WARNING_OBJECT (stream->pad, "Invalid URI: %s", uri);
+    stream->last_ret = GST_FLOW_ERROR;
+    return FALSE;
+  }
+
+  if (stream->src != NULL) {
+    gchar *old_protocol, *new_protocol;
+    gchar *old_uri;
+
+    old_uri = gst_uri_handler_get_uri (GST_URI_HANDLER (stream->src));
+    old_protocol = gst_uri_get_protocol (old_uri);
+    new_protocol = gst_uri_get_protocol (uri);
+
+    if (!g_str_equal (old_protocol, new_protocol)) {
+      gst_object_unref (stream->src_srcpad);
+      gst_element_set_state (stream->src, GST_STATE_NULL);
+      gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+      stream->src = NULL;
+      stream->src_srcpad = NULL;
+      GST_DEBUG_OBJECT (demux, "Can't re-use old source element");
+    } else {
+      GError *err = NULL;
+
+      GST_DEBUG_OBJECT (demux, "Re-using old source element");
+      if (!gst_uri_handler_set_uri (GST_URI_HANDLER (stream->src), uri, &err)) {
+        GST_DEBUG_OBJECT (demux, "Failed to re-use old source element: %s",
+            err->message);
+        g_clear_error (&err);
+        gst_element_set_state (stream->src, GST_STATE_NULL);
+        gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+        stream->src = NULL;
+      }
+    }
+    g_free (old_uri);
+    g_free (old_protocol);
+    g_free (new_protocol);
+  }
+
+  if (stream->src == NULL) {
+    GObjectClass *gobject_class;
+    GstPad *internal_pad;
+
+    stream->src = gst_element_make_from_uri (GST_URI_SRC, uri, NULL, NULL);
+    if (stream->src == NULL) {
+      GST_ELEMENT_ERROR (demux, CORE, MISSING_PLUGIN,
+          ("Missing plugin to handle URI: '%s'", uri), (NULL));
+      return FALSE;
+    }
+
+    gobject_class = G_OBJECT_GET_CLASS (stream->src);
+
+    if (g_object_class_find_property (gobject_class, "compress"))
+      g_object_set (stream->src, "compress", FALSE, NULL);
+    if (g_object_class_find_property (gobject_class, "keep-alive"))
+      g_object_set (stream->src, "keep-alive", TRUE, NULL);
+    if (g_object_class_find_property (gobject_class, "extra-headers")) {
+      if (referer || refresh || !allow_cache) {
+        GstStructure *extra_headers = gst_structure_new_empty ("headers");
+
+        if (referer)
+          gst_structure_set (extra_headers, "Referer", G_TYPE_STRING, referer,
+              NULL);
+
+        if (!allow_cache)
+          gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
+              "no-cache", NULL);
+        else if (refresh)
+          gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
+              "max-age=0", NULL);
+
+        g_object_set (stream->src, "extra-headers", extra_headers, NULL);
+
+        gst_structure_free (extra_headers);
+      } else {
+        g_object_set (stream->src, "extra-headers", NULL, NULL);
+      }
+    }
+
+    gst_element_set_locked_state (stream->src, TRUE);
+    gst_bin_add (GST_BIN_CAST (demux), stream->src);
+    stream->src_srcpad = gst_element_get_static_pad (stream->src, "src");
+
+    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (stream->pad),
+        stream->src_srcpad);
+
+    /* set up our internal pad to drop all events from
+     * the http src we don't care about. On the chain function
+     * we just push the buffer forward, but this way dash can get
+     * the flow return from downstream */
+    internal_pad =
+        GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (stream->pad)));
+    gst_pad_set_chain_function (GST_PAD_CAST (internal_pad), _src_chain);
+    gst_pad_set_event_function (GST_PAD_CAST (internal_pad), _src_event);
+    /* need to set query otherwise deadlocks happen with allocation queries */
+    gst_pad_set_query_function (GST_PAD_CAST (internal_pad), _src_query);
+    gst_object_unref (internal_pad);
+  }
+  return TRUE;
+}
+
+/* must be called with the stream's fragment_download_lock */
+static void
+gst_dash_demux_stream_download_uri (GstDashDemux * demux,
+    GstDashDemuxStream * stream, const gchar * uri, gint64 start, gint64 end)
+{
+  GST_DEBUG_OBJECT (stream->pad, "Downloading uri: %s, range:%" G_GINT64_FORMAT
+      " - %" G_GINT64_FORMAT, uri, start, end);
+
+  if (!gst_dash_demux_stream_update_source (stream, uri, NULL, FALSE, TRUE)) {
+    return;
+  }
+
+  if (gst_element_set_state (stream->src,
+          GST_STATE_READY) != GST_STATE_CHANGE_FAILURE) {
+    if (start != 0 || end != -1) {
+      if (!gst_element_send_event (stream->src, gst_event_new_seek (1.0,
+                  GST_FORMAT_BYTES, (GstSeekFlags) GST_SEEK_FLAG_FLUSH,
+                  GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, end))) {
+
+        /* looks like the source can't handle seeks in READY */
+/*
+        *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_NOT_IMPLEMENTED,
+            "Source element can't handle range requests");
+*/
+        stream->last_ret = GST_FLOW_ERROR;
+      }
+    }
+
+    if (G_LIKELY (stream->last_ret == GST_FLOW_OK)) {
+      /* flush the proxypads so that the EOS state is reset */
+      gst_pad_push_event (stream->src_srcpad, gst_event_new_flush_start ());
+      gst_pad_push_event (stream->src_srcpad, gst_event_new_flush_stop (TRUE));
+
+      stream->download_start_time = g_get_monotonic_time ();
+      gst_element_sync_state_with_parent (stream->src);
+
+      /* wait for the fragment to be completely downloaded */
+      GST_DEBUG_OBJECT (stream->pad,
+          "Waiting for fragment download to finish: %s", uri);
+      g_cond_wait (&stream->fragment_download_cond,
+          &stream->fragment_download_lock);
+    }
+  } else {
+    stream->last_ret = GST_FLOW_CUSTOM_ERROR;
+  }
+
+  gst_element_set_state (stream->src, GST_STATE_READY);
+}
+
+static void
 gst_dash_demux_stream_download_fragment (GstDashDemux * demux,
-    GstDashDemuxStream * stream, guint64 * size_buffer,
-    GstClockTime * download_time)
+    GstDashDemuxStream * stream)
 {
   GstActiveStream *active_stream;
-  GstFragment *download;
-  GTimeVal now;
-  GTimeVal start;
   guint stream_idx = stream->index;
-  GstBuffer *buffer = NULL;
-  GstBuffer *header_buffer;
-  GstMediaFragmentInfo fragment;
+  GstMediaFragmentInfo *fragment = &stream->current_fragment;
 
   if (G_UNLIKELY (stream->restart_download)) {
     GstClockTime cur, ts;
@@ -1882,8 +2180,7 @@
     }
 
     GST_DEBUG_OBJECT (stream->pad, "Restarting stream at "
-        "position %" GST_TIME_FORMAT ", current catch up %" GST_TIME_FORMAT,
-        GST_TIME_ARGS (ts), GST_TIME_ARGS (demux->segment.position));
+        "position %" GST_TIME_FORMAT, GST_TIME_ARGS (ts));
 
     if (GST_CLOCK_TIME_IS_VALID (ts)) {
       gst_mpd_client_stream_seek (demux->client, stream->active_stream, ts);
@@ -1894,104 +2191,94 @@
       }
     }
 
-    /* This stream might be entering into catching up mode,
-     * meaning that it will push buffers from this same download thread
-     * until it reaches 'catch_up_timestamp'.
-     *
-     * The reason for this is that in case of stream switching, the other
-     * stream that was previously active might be blocking the stream_loop
-     * in case it is ahead enough that all queues are filled.
-     * In this case, it is possible that a downstream input-selector is
-     * blocking waiting for the currently active stream to reach the
-     * same position of the old linked stream because of the 'sync-streams'
-     * behavior.
-     *
-     * We can push from this thread up to 'catch_up_timestamp' as all other
-     * streams should be around the same timestamp.
-     */
-    stream->last_ret = GST_FLOW_CUSTOM_SUCCESS;
-
     stream->restart_download = FALSE;
   }
 
-  if (gst_mpd_client_get_next_fragment (demux->client, stream_idx, &fragment)) {
-    g_get_current_time (&start);
+  g_mutex_lock (&stream->fragment_download_lock);
+  if (gst_mpd_client_get_next_fragment (demux->client, stream_idx, fragment)) {
     GST_INFO_OBJECT (stream->pad,
         "Fetching next fragment %s ts:%" GST_TIME_FORMAT " dur:%"
         GST_TIME_FORMAT " Range:%" G_GINT64_FORMAT "-%" G_GINT64_FORMAT,
-        fragment.uri, GST_TIME_ARGS (fragment.timestamp),
-        GST_TIME_ARGS (fragment.duration),
-        fragment.range_start, fragment.range_end);
+        fragment->uri, GST_TIME_ARGS (fragment->timestamp),
+        GST_TIME_ARGS (fragment->duration),
+        fragment->range_start, fragment->range_end);
 
-    download = gst_uri_downloader_fetch_uri_with_range (stream->downloader,
-        fragment.uri, demux->client->mpd_uri, FALSE, FALSE,
-        fragment.range_start, fragment.range_end, NULL);
+    /* Reset last flow return */
+    stream->last_ret = GST_FLOW_OK;
+    stream->starting_fragment = TRUE;
 
-    if (download == NULL) {
-      gst_media_fragment_info_clear (&fragment);
-      return NULL;
+    if (stream->need_header) {
+      /* We need to fetch a new header */
+      gst_dash_demux_get_next_header (demux, stream);
+      stream->need_header = FALSE;
+    }
+
+    if (stream->last_ret != GST_FLOW_OK) {
+      GST_WARNING_OBJECT (stream->pad, "Failed to download headers");
+      goto exit;
+    }
+
+    if (demux->cancelled)
+      goto exit;
+
+    /* it is possible to have an index per fragment, so check and download */
+    if (fragment->index_uri || fragment->index_range_start
+        || fragment->index_range_end != -1) {
+      const gchar *uri = fragment->index_uri;
+
+      if (!uri)                 /* fallback to default media uri */
+        uri = fragment->uri;
+
+      GST_DEBUG_OBJECT (stream->pad,
+          "Fragment index download: %s %" G_GINT64_FORMAT "-%"
+          G_GINT64_FORMAT, uri, fragment->index_range_start,
+          fragment->index_range_end);
+      gst_dash_demux_stream_download_uri (demux, stream, uri,
+          fragment->index_range_start, fragment->index_range_end);
+    }
+
+    if (stream->last_ret != GST_FLOW_OK) {
+      GST_WARNING_OBJECT (stream->pad, "Failed to download fragment headers");
+      goto exit;
+    }
+
+    if (demux->cancelled)
+      goto exit;
+
+    /* now get the real fragment */
+    gst_dash_demux_stream_download_uri (demux, stream, fragment->uri,
+        fragment->range_start, fragment->range_end);
+
+    if (stream->last_ret < GST_FLOW_EOS) {
+      gst_media_fragment_info_clear (fragment);
+      goto exit;
     }
 
     active_stream = stream->active_stream;
     if (active_stream == NULL) {
-      gst_media_fragment_info_clear (&fragment);
-      g_object_unref (download);
-      return NULL;
+      gst_media_fragment_info_clear (fragment);
+      stream->last_ret = GST_FLOW_ERROR;
+      goto exit;
     }
 
-    buffer = gst_fragment_get_buffer (download);
-    g_object_unref (download);
-
-    /* it is possible to have an index per fragment, so check and download */
-    if (fragment.index_uri || fragment.index_range_start
-        || fragment.index_range_end != -1) {
-      const gchar *uri = fragment.index_uri;
-      GstBuffer *index_buffer;
-
-      if (!uri)                 /* fallback to default media uri */
-        uri = fragment.uri;
-
-      GST_DEBUG_OBJECT (stream->pad,
-          "Fragment index download: %s %" G_GINT64_FORMAT "-%"
-          G_GINT64_FORMAT, uri, fragment.index_range_start,
-          fragment.index_range_end);
-      download =
-          gst_uri_downloader_fetch_uri_with_range (stream->downloader, uri,
-          demux->client->mpd_uri, FALSE, FALSE, fragment.index_range_start,
-          fragment.index_range_end, NULL);
-      if (download) {
-        index_buffer = gst_fragment_get_buffer (download);
-        if (index_buffer)
-          buffer = gst_buffer_append (index_buffer, buffer);
-        g_object_unref (download);
-      }
+    if (stream->last_ret == GST_FLOW_OK) {
+      stream->position += fragment->duration;
     }
 
-    if (stream->need_header) {
-      /* We need to fetch a new header */
-      if ((header_buffer =
-              gst_dash_demux_get_next_header (demux, stream)) != NULL) {
-        buffer = gst_buffer_append (header_buffer, buffer);
-      }
-      stream->need_header = FALSE;
-    }
-    g_get_current_time (&now);
-    *download_time = (GST_TIMEVAL_TO_TIME (now) - GST_TIMEVAL_TO_TIME (start));
-
-    buffer = gst_buffer_make_writable (buffer);
-
-    GST_BUFFER_TIMESTAMP (buffer) = fragment.timestamp;
-    GST_BUFFER_DURATION (buffer) = fragment.duration;
-    GST_BUFFER_OFFSET (buffer) =
-        gst_mpd_client_get_segment_index (active_stream) - 1;
-
-    gst_media_fragment_info_clear (&fragment);
-    *size_buffer += gst_buffer_get_size (buffer);
+    gst_media_fragment_info_clear (fragment);
   } else {
     GST_WARNING_OBJECT (demux, "Failed to download fragment for stream %p %d",
         stream, stream->index);
   }
-  return buffer;
+
+
+exit:
+  g_mutex_unlock (&stream->fragment_download_lock);
+
+  if (stream->last_ret == GST_FLOW_OK)
+    gst_element_set_state (stream->src, GST_STATE_READY);
+  else
+    gst_element_set_state (stream->src, GST_STATE_NULL);
 }
 
 /* gst_dash_demux_stream_get_next_fragment:
@@ -2008,9 +2295,6 @@
 gst_dash_demux_stream_get_next_fragment (GstDashDemuxStream * stream,
     GstClockTime * ts)
 {
-  guint64 buffer_size = 0;
-  GstClockTime diff;
-  GstBuffer *buffer = NULL;
   GstFlowReturn ret = GST_FLOW_OK;
   GstDashDemux *demux = stream->demux;
 
@@ -2048,34 +2332,14 @@
   }
 
   /* Get the fragment corresponding to each stream index */
-  buffer =
-      gst_dash_demux_stream_download_fragment (demux, stream,
-      &buffer_size, &diff);
+  gst_dash_demux_stream_download_fragment (demux, stream);
 
   demux->end_of_period = FALSE;
 
-  if (buffer) {
-    ret = gst_dash_demux_push (stream, buffer);
-  } else {
+  if (stream->last_ret < GST_FLOW_EOS) {
     GST_WARNING_OBJECT (stream->pad, "Failed to download fragment");
     return GST_FLOW_ERROR;
   }
-
-  if (buffer_size > 0 && diff > 0) {
-#ifndef GST_DISABLE_GST_DEBUG
-    guint64 brate;
-#endif
-
-    gst_download_rate_add_rate (&stream->dnl_rate, buffer_size, diff);
-
-#ifndef GST_DISABLE_GST_DEBUG
-    brate = (buffer_size * 8) / ((double) diff / GST_SECOND);
-#endif
-    GST_INFO_OBJECT (demux,
-        "Stream: %d Download rate = %" G_GUINT64_FORMAT " Kbits/s (%"
-        G_GUINT64_FORMAT " Ko in %.2f s)", stream->index, brate / 1000,
-        buffer_size / 1024, ((double) diff / GST_SECOND));
-  }
   return ret;
 }
 
diff --git a/ext/dash/gstdashdemux.h b/ext/dash/gstdashdemux.h
index 935e7e9..4e3a3ed 100644
--- a/ext/dash/gstdashdemux.h
+++ b/ext/dash/gstdashdemux.h
@@ -34,7 +34,6 @@
 #include <gst/base/gstadapter.h>
 #include <gst/base/gstdataqueue.h>
 #include "gstmpdparser.h"
-#include "gstdownloadrate.h"
 #include <gst/uridownloader/gsturidownloader.h>
 
 G_BEGIN_DECLS
@@ -48,6 +47,8 @@
         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DASH_DEMUX))
 #define GST_IS_DASH_DEMUX_CLASS(klass) \
         (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DASH_DEMUX))
+#define GST_DASH_DEMUX_CAST(obj) \
+	((GstDashDemux *)obj)
 
 typedef struct _GstDashDemuxStream GstDashDemuxStream;
 typedef struct _GstDashDemux GstDashDemux;
@@ -78,9 +79,18 @@
   GCond download_cond;
   GstTask *download_task;
   GRecMutex download_task_lock;
-  GstUriDownloader *downloader;
 
-  GstDownloadRate dnl_rate;
+  /* download tooling */
+  GstElement *src;
+  GstPad *src_srcpad;
+  GMutex fragment_download_lock;
+  GCond fragment_download_cond;
+  GstMediaFragmentInfo current_fragment;
+  gboolean starting_fragment;
+  gint64 download_start_time;
+  gint64 download_total_time;
+  gint64 download_total_bytes;
+  gint current_download_rate;
 };
 
 /**
@@ -90,7 +100,7 @@
  */
 struct _GstDashDemux
 {
-  GstElement parent;
+  GstBin parent;
   GstPad *sinkpad;
 
   gboolean have_group_id;
@@ -123,7 +133,7 @@
 
 struct _GstDashDemuxClass
 {
-  GstElementClass parent_class;
+  GstBinClass parent_class;
 };
 
 GType gst_dash_demux_get_type (void);
diff --git a/ext/dash/gstdownloadrate.c b/ext/dash/gstdownloadrate.c
deleted file mode 100644
index ce25b18..0000000
--- a/ext/dash/gstdownloadrate.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* GStreamer
- * Copyright (C) 2011 Andoni Morales Alastruey <ylatuya@gmail.com>
- * Copyright (C) 2012 Smart TV Alliance
- *  Author: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>, Collabora Ltd.
- *
- * gstfragment.c:
- *
- * 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., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <glib.h>
-#include "gstdownloadrate.h"
-
-static void
-_gst_download_rate_check_remove_rates (GstDownloadRate * rate)
-{
-  if (rate->max_length == 0)
-    return;
-
-  while (g_queue_get_length (&rate->queue) > rate->max_length) {
-    guint bitrate = GPOINTER_TO_UINT (g_queue_pop_head (&rate->queue));
-
-    rate->total -= bitrate;
-  }
-}
-
-void
-gst_download_rate_init (GstDownloadRate * rate)
-{
-  g_queue_init (&rate->queue);
-  g_mutex_init (&rate->mutex);
-  rate->total = 0;
-  rate->max_length = 0;
-}
-
-void
-gst_download_rate_deinit (GstDownloadRate * rate)
-{
-  gst_download_rate_clear (rate);
-  g_mutex_clear (&rate->mutex);
-}
-
-void
-gst_download_rate_set_max_length (GstDownloadRate * rate, gint max_length)
-{
-  g_mutex_lock (&rate->mutex);
-  rate->max_length = max_length;
-  _gst_download_rate_check_remove_rates (rate);
-  g_mutex_unlock (&rate->mutex);
-}
-
-gint
-gst_download_rate_get_max_length (GstDownloadRate * rate)
-{
-  guint ret;
-  g_mutex_lock (&rate->mutex);
-  ret = rate->max_length;
-  g_mutex_unlock (&rate->mutex);
-
-  return ret;
-}
-
-void
-gst_download_rate_clear (GstDownloadRate * rate)
-{
-  g_mutex_lock (&rate->mutex);
-  g_queue_clear (&rate->queue);
-  rate->total = 0;
-  g_mutex_unlock (&rate->mutex);
-}
-
-void
-gst_download_rate_add_rate (GstDownloadRate * rate, guint bytes, guint64 time)
-{
-  guint64 bitrate;
-  g_mutex_lock (&rate->mutex);
-
-  /* convert from bytes / nanoseconds to bits per second */
-  bitrate = G_GUINT64_CONSTANT (8000000000) * bytes / time;
-
-  g_queue_push_tail (&rate->queue, GUINT_TO_POINTER ((guint) bitrate));
-  rate->total += bitrate;
-
-  _gst_download_rate_check_remove_rates (rate);
-  g_mutex_unlock (&rate->mutex);
-}
-
-guint
-gst_download_rate_get_current_rate (GstDownloadRate * rate)
-{
-  guint ret;
-  g_mutex_lock (&rate->mutex);
-  if (g_queue_get_length (&rate->queue))
-    ret = rate->total / g_queue_get_length (&rate->queue);
-  else
-    ret = G_MAXUINT;
-  g_mutex_unlock (&rate->mutex);
-
-  return ret;
-}
diff --git a/ext/dash/gstdownloadrate.h b/ext/dash/gstdownloadrate.h
deleted file mode 100644
index 2ea704b..0000000
--- a/ext/dash/gstdownloadrate.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* GStreamer
- * Copyright (C) 2012 Smart TV Alliance
- *  Author: Thiago Sousa Santos <thiago.sousa.santos@collabora.com>, Collabora Ltd.
- *
- * gstdownloadrate.h:
- *
- * 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., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GST_DOWNLOAD_RATE_H__
-#define __GST_DOWNLOAD_RATE_H__
-
-#include <glib-object.h>
-#include <gst/gst.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GstDownloadRate GstDownloadRate;
-
-struct _GstDownloadRate
-{
-  GQueue queue;
-  GMutex mutex;
-
-  gint max_length;
-
-  guint64 total;
-};
-
-void gst_download_rate_init (GstDownloadRate * rate);
-void gst_download_rate_deinit (GstDownloadRate * rate);
-
-void gst_download_rate_set_max_length (GstDownloadRate * rate, gint max_length);
-gint gst_download_rate_get_max_length (GstDownloadRate * rate);
-
-void gst_download_rate_clear (GstDownloadRate * rate);
-void gst_download_rate_add_rate (GstDownloadRate * rate, guint bytes, guint64 time);
-
-guint gst_download_rate_get_current_rate (GstDownloadRate * rate);
-
-G_END_DECLS
-#endif /* __GST_DOWNLOAD_RATE_H__ */
diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c
index ab60adf..b1e30fd 100644
--- a/ext/dash/gstmpdparser.c
+++ b/ext/dash/gstmpdparser.c
@@ -1213,16 +1213,12 @@
     if (cur_node->type == XML_ELEMENT_NODE) {
       if (xmlStrcmp (cur_node->name, (xmlChar *) "Initialization") == 0 ||
           xmlStrcmp (cur_node->name, (xmlChar *) "Initialisation") == 0) {
-        if (seg_base_type->Initialization) {
-          gst_mpdparser_free_url_type_node (seg_base_type->Initialization);
-        }
+        /* parse will free the previous pointer to create a new one */
         gst_mpdparser_parse_url_type_node (&seg_base_type->Initialization,
             cur_node);
       } else if (xmlStrcmp (cur_node->name,
               (xmlChar *) "RepresentationIndex") == 0) {
-        if (seg_base_type->RepresentationIndex) {
-          gst_mpdparser_free_url_type_node (seg_base_type->RepresentationIndex);
-        }
+        /* parse will free the previous pointer to create a new one */
         gst_mpdparser_parse_url_type_node (&seg_base_type->RepresentationIndex,
             cur_node);
       }
@@ -1361,18 +1357,12 @@
   for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) {
     if (cur_node->type == XML_ELEMENT_NODE) {
       if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentTimeline") == 0) {
-        if (mult_seg_base_type->SegmentTimeline) {
-          gst_mpdparser_free_segment_timeline_node
-              (mult_seg_base_type->SegmentTimeline);
-        }
+        /* parse frees the segmenttimeline if any */
         gst_mpdparser_parse_segment_timeline_node
             (&mult_seg_base_type->SegmentTimeline, cur_node);
       } else if (xmlStrcmp (cur_node->name,
               (xmlChar *) "BitstreamSwitching") == 0) {
-        if (mult_seg_base_type->BitstreamSwitching) {
-          gst_mpdparser_free_url_type_node
-              (mult_seg_base_type->BitstreamSwitching);
-        }
+        /* parse frees the old url before setting the new one */
         gst_mpdparser_parse_url_type_node
             (&mult_seg_base_type->BitstreamSwitching, cur_node);
       }
@@ -3370,6 +3360,7 @@
 
   if (!representation) {
     GST_WARNING ("No valid representation in the MPD file, aborting...");
+    g_slice_free (GstActiveStream, stream);
     return FALSE;
   }
   stream->mimeType =
@@ -3486,11 +3477,16 @@
     return -1;
 
   if (stream_period && stream_period->period) {
-    /* intentionally not unreffing avail_start */
-    avail_start = gst_mpd_client_add_time_difference (avail_start,
+    GstDateTime *t;
+
+    t = gst_mpd_client_add_time_difference (avail_start,
         stream_period->period->start * 1000);
+    gst_date_time_unref (avail_start);
+    avail_start = t;
   }
   diff = gst_mpd_client_calculate_time_difference (avail_start, time);
+  gst_date_time_unref (avail_start);
+
   if (diff < 0)
     return -2;
   if (diff > gst_mpd_client_get_media_presentation_duration (client))
diff --git a/ext/gl/gstgleffects.c b/ext/gl/gstgleffects.c
index 4f7338a..4027e9c 100644
--- a/ext/gl/gstgleffects.c
+++ b/ext/gl/gstgleffects.c
@@ -193,19 +193,20 @@
 gst_gl_effects_init_gl_resources (GstGLFilter * filter)
 {
   GstGLEffects *effects = GST_GL_EFFECTS (filter);
-  gint i;
+  GstGLFuncs *gl = filter->context->gl_vtable;
+  gint i = 0;
 
   for (i = 0; i < NEEDED_TEXTURES; i++) {
-    glGenTextures (1, &effects->midtexture[i]);
-    glBindTexture (GL_TEXTURE_2D, effects->midtexture[i]);
-    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8,
+    gl->GenTextures (1, &effects->midtexture[i]);
+    gl->BindTexture (GL_TEXTURE_2D, effects->midtexture[i]);
+    gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8,
         GST_VIDEO_INFO_WIDTH (&filter->out_info),
         GST_VIDEO_INFO_HEIGHT (&filter->out_info),
         0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+    gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   }
 }
 
@@ -214,14 +215,15 @@
 gst_gl_effects_reset_gl_resources (GstGLFilter * filter)
 {
   GstGLEffects *effects = GST_GL_EFFECTS (filter);
-  gint i;
+  GstGLFuncs *gl = filter->context->gl_vtable;
+  gint i = 0;
 
   for (i = 0; i < NEEDED_TEXTURES; i++) {
-    glDeleteTextures (1, &effects->midtexture[i]);
+    gl->DeleteTextures (1, &effects->midtexture[i]);
     effects->midtexture[i] = 0;
   }
   for (i = 0; i < GST_GL_EFFECTS_N_CURVES; i++) {
-    glDeleteTextures (1, &effects->curve[i]);
+    gl->DeleteTextures (1, &effects->curve[i]);
     effects->curve[i] = 0;
   }
 }
diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c
index 7b3d171..1311319 100644
--- a/ext/gl/gstglimagesink.c
+++ b/ext/gl/gstglimagesink.c
@@ -151,7 +151,9 @@
     GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "RGBA") "; "
 #if GST_GL_HAVE_PLATFORM_EGL
         GST_VIDEO_CAPS_MAKE_WITH_FEATURES
         (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, "RGBA") "; "
@@ -386,6 +388,8 @@
     GstGLWindow *window;
 
     gl_sink->context = gst_gl_context_new (gl_sink->display);
+    if (!gl_sink->context)
+      goto context_creation_error;
 
     window = gst_gl_context_get_window (gl_sink->context);
 
@@ -419,6 +423,13 @@
 
   return TRUE;
 
+context_creation_error:
+  {
+    GST_ELEMENT_ERROR (gl_sink, RESOURCE, NOT_FOUND,
+        ("Failed to create GL context"), (NULL));
+    return FALSE;
+  }
+
 context_error:
   {
     GST_ELEMENT_ERROR (gl_sink, RESOURCE, NOT_FOUND, ("%s", error->message),
@@ -687,8 +698,12 @@
     gst_object_unref (oldpool);
   }
 
+  if (glimage_sink->upload)
+    gst_object_unref (glimage_sink->upload);
   glimage_sink->upload = gst_object_ref (GST_GL_BUFFER_POOL (newpool)->upload);
 
+  gst_gl_upload_set_format (glimage_sink->upload, &vinfo);
+
   return TRUE;
 }
 
@@ -918,9 +933,12 @@
   gst_object_unref (allocator);
 
 #if GST_GL_HAVE_PLATFORM_EGL
-  allocator = gst_allocator_find (GST_EGL_IMAGE_MEMORY_TYPE);
-  gst_query_add_allocation_param (query, allocator, &params);
-  gst_object_unref (allocator);
+  if (gst_gl_context_check_feature (glimage_sink->context,
+          "EGL_KHR_image_base")) {
+    allocator = gst_allocator_find (GST_EGL_IMAGE_MEMORY_TYPE);
+    gst_query_add_allocation_param (query, allocator, &params);
+    gst_object_unref (allocator);
+  }
 #endif
 
   return TRUE;
diff --git a/ext/gl/gstgltestsrc.c b/ext/gl/gstgltestsrc.c
index b7b2792..52e0e5e 100644
--- a/ext/gl/gstgltestsrc.c
+++ b/ext/gl/gstgltestsrc.c
@@ -47,6 +47,10 @@
 #include "gltestsrc.h"
 #include <gst/gst-i18n-plugin.h>
 
+#if GST_GL_HAVE_PLATFORM_EGL
+#include <gst/gl/egl/gsteglimagememory.h>
+#endif
+
 #define USE_PEER_BUFFERALLOC
 
 GST_DEBUG_CATEGORY_STATIC (gl_test_src_debug);
@@ -61,6 +65,21 @@
       /* FILL ME */
 };
 
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "RGBA") "; "
+#if GST_GL_HAVE_PLATFORM_EGL
+        GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE,
+            "RGBA") "; "
+#endif
+        GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
+            "RGBA") "; " GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS))
+    );
+
 #define gst_gl_test_src_parent_class parent_class
 G_DEFINE_TYPE (GstGLTestSrc, gst_gl_test_src, GST_TYPE_PUSH_SRC);
 
@@ -159,8 +178,7 @@
       "David A. Schleef <ds@schleef.org>");
 
   gst_element_class_add_pad_template (element_class,
-      gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
-          gst_caps_from_string (GST_GL_COLOR_CONVERT_VIDEO_CAPS)));
+      gst_static_pad_template_get (&src_factory));
 
   element_class->set_context = gst_gl_test_src_set_context;
 
@@ -476,19 +494,10 @@
     }
     out_tex = src->out_tex_id;
 
-    if (!src->download) {
+    if (!src->download)
       src->download = gst_gl_download_new (src->context);
 
-      if (!gst_gl_download_init_format (src->download,
-              GST_VIDEO_FRAME_FORMAT (&out_frame),
-              GST_VIDEO_FRAME_WIDTH (&out_frame),
-              GST_VIDEO_FRAME_HEIGHT (&out_frame))) {
-        GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
-            ("%s", "Failed to init download format"), (NULL));
-        return FALSE;
-      }
-    }
-
+    gst_gl_download_set_format (src->download, &out_frame.info);
     out_gl_wrapped = TRUE;
   }
 
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c
index 41e2548..3e21f59 100644
--- a/ext/hls/gsthlsdemux.c
+++ b/ext/hls/gsthlsdemux.c
@@ -810,7 +810,9 @@
         key_fragment =
             gst_uri_downloader_fetch_uri (demux->downloader,
             demux->current_key, demux->client->main ?
-            demux->client->main->uri : NULL, FALSE, FALSE, &err);
+            demux->client->main->uri : NULL, FALSE, FALSE,
+            demux->client->current ? demux->client->current->allowcache : TRUE,
+            &err);
         if (key_fragment == NULL)
           goto key_failed;
         demux->key_url = g_strdup (demux->current_key);
@@ -866,6 +868,7 @@
        * as each fragment for its own has to be reversed */
       demux->discont = TRUE;
     demux->starting_fragment = FALSE;
+    demux->segment.position = GST_BUFFER_PTS (buffer);
   } else {
     GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE;
   }
@@ -904,8 +907,6 @@
 
   demux->starting_fragment = FALSE;
 
-  demux->segment.position = GST_BUFFER_TIMESTAMP (buffer);
-
   if (demux->need_segment) {
     /* And send a newsegment */
     GST_DEBUG_OBJECT (demux, "Sending segment event: %"
@@ -1001,6 +1002,8 @@
       break;
   }
 
+  gst_event_unref (event);
+
   return TRUE;
 }
 
@@ -1491,7 +1494,8 @@
 
   download =
       gst_uri_downloader_fetch_uri (demux->downloader, uri,
-      demux->client->main ? demux->client->main->uri : NULL, TRUE, TRUE, err);
+      demux->client->main ? demux->client->main->uri : NULL, TRUE, TRUE, TRUE,
+      err);
   if (download == NULL)
     return FALSE;
 
@@ -1797,7 +1801,7 @@
 
 static gboolean
 gst_hls_demux_update_source (GstHLSDemux * demux, const gchar * uri,
-    const gchar * referer)
+    const gchar * referer, gboolean refresh, gboolean allow_cache)
 {
   if (!gst_uri_is_valid (uri))
     return FALSE;
@@ -1851,10 +1855,19 @@
     if (g_object_class_find_property (gobject_class, "keep-alive"))
       g_object_set (demux->src, "keep-alive", TRUE, NULL);
     if (g_object_class_find_property (gobject_class, "extra-headers")) {
-      if (referer) {
-        GstStructure *extra_headers =
-            gst_structure_new ("headers", "Referer", G_TYPE_STRING, referer,
-            NULL);
+      if (referer || refresh || !allow_cache) {
+        GstStructure *extra_headers = gst_structure_new_empty ("headers");
+
+        if (referer)
+          gst_structure_set (extra_headers, "Referer", G_TYPE_STRING, referer,
+              NULL);
+
+        if (!allow_cache)
+          gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
+              "no-cache", NULL);
+        else if (refresh)
+          gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
+              "max-age=0", NULL);
 
         g_object_set (demux->src, "extra-headers", extra_headers, NULL);
 
@@ -1909,8 +1922,11 @@
   demux->last_ret = GST_FLOW_OK;
 
   if (!gst_hls_demux_update_source (demux, next_fragment_uri,
-          demux->client->main ? demux->client->main->uri : NULL)) {
-    *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN,
+          demux->client->main ? demux->client->main->uri : NULL,
+          FALSE,
+          demux->client->current ? demux->client->current->allowcache : TRUE)) {
+    *err =
+        g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN,
         "Missing plugin to handle URI: '%s'", next_fragment_uri);
     g_mutex_unlock (&demux->fragment_download_lock);
     return FALSE;
diff --git a/ext/hls/gsthlssink.c b/ext/hls/gsthlssink.c
index 8a3c305..44093a6 100644
--- a/ext/hls/gsthlssink.c
+++ b/ext/hls/gsthlssink.c
@@ -100,6 +100,8 @@
   g_free (sink->location);
   g_free (sink->playlist_location);
   g_free (sink->playlist_root);
+  if (sink->playlist)
+    gst_m3u8_playlist_free (sink->playlist);
 
   G_OBJECT_CLASS (parent_class)->finalize ((GObject *) sink);
 }
diff --git a/ext/hls/m3u8.c b/ext/hls/m3u8.c
index e21590d..5c7fd17 100644
--- a/ext/hls/m3u8.c
+++ b/ext/hls/m3u8.c
@@ -65,7 +65,6 @@
   g_return_if_fail (self != NULL);
 
   g_free (self->uri);
-  g_free (self->allowcache);
   g_free (self->codecs);
   g_free (self->key);
 
@@ -299,6 +298,9 @@
     self->files = NULL;
   }
 
+  /* By default, allow caching */
+  self->allowcache = TRUE;
+
   list = NULL;
   duration = 0;
   title = NULL;
@@ -425,12 +427,12 @@
           if (uri[0] == '"')
             uri += 1;
 
-          data = uri_join (self->uri, uri);
+          uri = uri_join (self->uri, uri);
           g_free (urip);
 
-          if (data == NULL)
+          if (uri == NULL)
             continue;
-          gst_m3u8_set_uri (new_list, data);
+          gst_m3u8_set_uri (new_list, uri);
         }
       }
 
@@ -439,7 +441,6 @@
                 (GCompareFunc) _m3u8_compare_uri)) {
           GST_DEBUG ("Already have a list with this URI");
           gst_m3u8_free (new_list);
-          g_free (data);
         } else {
           self->iframe_lists = g_list_append (self->iframe_lists, new_list);
         }
@@ -461,8 +462,7 @@
       /* <YYYY-MM-DDThh:mm:ssZ> */
       GST_DEBUG ("FIXME parse date");
     } else if (g_str_has_prefix (data, "#EXT-X-ALLOW-CACHE:")) {
-      g_free (self->allowcache);
-      self->allowcache = g_strdup (data + 19);
+      self->allowcache = g_ascii_strcasecmp (data + 19, "YES") == 0;
     } else if (g_str_has_prefix (data, "#EXT-X-KEY:")) {
       gchar *v, *a;
 
diff --git a/ext/hls/m3u8.h b/ext/hls/m3u8.h
index 599ab44..096287a 100644
--- a/ext/hls/m3u8.h
+++ b/ext/hls/m3u8.h
@@ -42,7 +42,7 @@
   gboolean endlist;             /* if ENDLIST has been reached */
   gint version;                 /* last EXT-X-VERSION */
   GstClockTime targetduration;  /* last EXT-X-TARGETDURATION */
-  gchar *allowcache;            /* last EXT-X-ALLOWCACHE */
+  gboolean allowcache;          /* last EXT-X-ALLOWCACHE */
   gchar *key;
 
   gint bandwidth;
diff --git a/ext/opencv/gstmotioncells.c b/ext/opencv/gstmotioncells.c
index 598a13f..d5e037e 100644
--- a/ext/opencv/gstmotioncells.c
+++ b/ext/opencv/gstmotioncells.c
@@ -879,215 +879,223 @@
     motioncellidx *motioncellsidx;
 
     buf = gst_buffer_make_writable (buf);
-    gst_buffer_map (buf, &info, GST_MAP_WRITE);
-    filter->cvImage->imageData = (char *) info.data;
-    if (filter->firstframe) {
-      setPrevFrame (filter->cvImage, filter->id);
-      filter->firstframe = FALSE;
-    }
-    minimum_motion_frames = filter->minimum_motion_frames;
-    postnomotion = filter->postnomotion;
-    sensitivity = filter->sensitivity;
-    framerate = filter->framerate;
-    gridx = filter->gridx;
-    gridy = filter->gridy;
-    display = filter->display;
-    motionmaskcoord_count = filter->motionmaskcoord_count;
-    motionmaskcoords =
-        g_new0 (motionmaskcoordrect, filter->motionmaskcoord_count);
-    for (i = 0; i < filter->motionmaskcoord_count; i++) {       //we need divide 2 because we use gauss pyramid in C++ side
-      motionmaskcoords[i].upper_left_x =
-          filter->motionmaskcoords[i].upper_left_x / 2;
-      motionmaskcoords[i].upper_left_y =
-          filter->motionmaskcoords[i].upper_left_y / 2;
-      motionmaskcoords[i].lower_right_x =
-          filter->motionmaskcoords[i].lower_right_x / 2;
-      motionmaskcoords[i].lower_right_y =
-          filter->motionmaskcoords[i].lower_right_y / 2;
-    }
-
-    motioncellscolor.R_channel_value =
-        filter->motioncellscolor->R_channel_value;
-    motioncellscolor.G_channel_value =
-        filter->motioncellscolor->G_channel_value;
-    motioncellscolor.B_channel_value =
-        filter->motioncellscolor->B_channel_value;
-
-    if ((filter->changed_gridx || filter->changed_gridy
-            || filter->changed_startime)) {
-      if ((g_strcmp0 (filter->cur_datafile, NULL) != 0)) {
-        GFREE (filter->cur_datafile);
-        filter->datafileidx++;
-        filter->cur_datafile =
-            g_strdup_printf ("%s-%d.%s", filter->basename_datafile,
-            filter->datafileidx, filter->datafile_extension);
-        filter->changed_datafile = TRUE;
-        motion_cells_free_resources (filter->id);
+    if (gst_buffer_map (buf, &info, GST_MAP_WRITE)) {
+      filter->cvImage->imageData = (char *) info.data;
+      if (filter->firstframe) {
+        setPrevFrame (filter->cvImage, filter->id);
+        filter->firstframe = FALSE;
       }
-      if (filter->motioncells_count > 0)
-        gst_motioncells_update_motion_cells (filter);
-      if (filter->motionmaskcells_count > 0)
-        gst_motioncells_update_motion_masks (filter);
-      filter->changed_gridx = FALSE;
-      filter->changed_gridy = FALSE;
-      filter->changed_startime = FALSE;
-    }
-    datafile = g_strdup (filter->cur_datafile);
-    filter->cur_buff_timestamp = (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
-    filter->starttime +=
-        (filter->cur_buff_timestamp - filter->prev_buff_timestamp);
-    starttime = filter->starttime;
-    if (filter->changed_datafile || filter->diff_timestamp < 0)
-      filter->diff_timestamp =
-          (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
-    changed_datafile = filter->changed_datafile;
-    motionmaskcells_count = filter->motionmaskcells_count;
-    motionmaskcellsidx = g_new0 (motioncellidx, filter->motionmaskcells_count);
-    for (i = 0; i < filter->motionmaskcells_count; i++) {
-      motionmaskcellsidx[i].lineidx = filter->motionmaskcellsidx[i].lineidx;
-      motionmaskcellsidx[i].columnidx = filter->motionmaskcellsidx[i].columnidx;
-    }
-    motioncells_count = filter->motioncells_count;
-    motioncellsidx = g_new0 (motioncellidx, filter->motioncells_count);
-    for (i = 0; i < filter->motioncells_count; i++) {
-      motioncellsidx[i].lineidx = filter->motioncellsidx[i].lineidx;
-      motioncellsidx[i].columnidx = filter->motioncellsidx[i].columnidx;
-    }
-    useAlpha = filter->usealpha;
-    thickness = filter->thickness;
-    success =
-        perform_detection_motion_cells (filter->cvImage, sensitivity, framerate,
-        gridx, gridy,
-        (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND) -
-        filter->diff_timestamp, display, useAlpha, motionmaskcoord_count,
-        motionmaskcoords, motionmaskcells_count, motionmaskcellsidx,
-        motioncellscolor, motioncells_count, motioncellsidx, starttime,
-        datafile, changed_datafile, thickness, filter->id);
+      minimum_motion_frames = filter->minimum_motion_frames;
+      postnomotion = filter->postnomotion;
+      sensitivity = filter->sensitivity;
+      framerate = filter->framerate;
+      gridx = filter->gridx;
+      gridy = filter->gridy;
+      display = filter->display;
+      motionmaskcoord_count = filter->motionmaskcoord_count;
+      motionmaskcoords =
+          g_new0 (motionmaskcoordrect, filter->motionmaskcoord_count);
+      for (i = 0; i < filter->motionmaskcoord_count; i++) {     //we need divide 2 because we use gauss pyramid in C++ side
+        motionmaskcoords[i].upper_left_x =
+            filter->motionmaskcoords[i].upper_left_x / 2;
+        motionmaskcoords[i].upper_left_y =
+            filter->motionmaskcoords[i].upper_left_y / 2;
+        motionmaskcoords[i].lower_right_x =
+            filter->motionmaskcoords[i].lower_right_x / 2;
+        motionmaskcoords[i].lower_right_y =
+            filter->motionmaskcoords[i].lower_right_y / 2;
+      }
 
-    if ((success == 1) && (filter->sent_init_error_msg == false)) {
-      char *initfailedreason;
-      int initerrorcode;
-      GstStructure *s;
-      GstMessage *m;
-      initfailedreason = getInitDataFileFailed (filter->id);
-      initerrorcode = getInitErrorCode (filter->id);
-      s = gst_structure_new ("motion", "init_error_code", G_TYPE_INT,
-          initerrorcode, "details", G_TYPE_STRING, initfailedreason, NULL);
-      m = gst_message_new_element (GST_OBJECT (filter), s);
-      gst_element_post_message (GST_ELEMENT (filter), m);
-      filter->sent_init_error_msg = TRUE;
-    }
-    if ((success == -1) && (filter->sent_save_error_msg == false)) {
-      char *savefailedreason;
-      int saveerrorcode;
-      GstStructure *s;
-      GstMessage *m;
-      savefailedreason = getSaveDataFileFailed (filter->id);
-      saveerrorcode = getSaveErrorCode (filter->id);
-      s = gst_structure_new ("motion", "save_error_code", G_TYPE_INT,
-          saveerrorcode, "details", G_TYPE_STRING, savefailedreason, NULL);
-      m = gst_message_new_element (GST_OBJECT (filter), s);
-      gst_element_post_message (GST_ELEMENT (filter), m);
-      filter->sent_save_error_msg = TRUE;
-    }
-    if (success == -2) {        //frame dropped
+      motioncellscolor.R_channel_value =
+          filter->motioncellscolor->R_channel_value;
+      motioncellscolor.G_channel_value =
+          filter->motioncellscolor->G_channel_value;
+      motioncellscolor.B_channel_value =
+          filter->motioncellscolor->B_channel_value;
+
+      if ((filter->changed_gridx || filter->changed_gridy
+              || filter->changed_startime)) {
+        if ((g_strcmp0 (filter->cur_datafile, NULL) != 0)) {
+          GFREE (filter->cur_datafile);
+          filter->datafileidx++;
+          filter->cur_datafile =
+              g_strdup_printf ("%s-%d.%s", filter->basename_datafile,
+              filter->datafileidx, filter->datafile_extension);
+          filter->changed_datafile = TRUE;
+          motion_cells_free_resources (filter->id);
+        }
+        if (filter->motioncells_count > 0)
+          gst_motioncells_update_motion_cells (filter);
+        if (filter->motionmaskcells_count > 0)
+          gst_motioncells_update_motion_masks (filter);
+        filter->changed_gridx = FALSE;
+        filter->changed_gridy = FALSE;
+        filter->changed_startime = FALSE;
+      }
+      datafile = g_strdup (filter->cur_datafile);
+      filter->cur_buff_timestamp = (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
+      filter->starttime +=
+          (filter->cur_buff_timestamp - filter->prev_buff_timestamp);
+      starttime = filter->starttime;
+      if (filter->changed_datafile || filter->diff_timestamp < 0)
+        filter->diff_timestamp =
+            (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
+      changed_datafile = filter->changed_datafile;
+      motionmaskcells_count = filter->motionmaskcells_count;
+      motionmaskcellsidx =
+          g_new0 (motioncellidx, filter->motionmaskcells_count);
+      for (i = 0; i < filter->motionmaskcells_count; i++) {
+        motionmaskcellsidx[i].lineidx = filter->motionmaskcellsidx[i].lineidx;
+        motionmaskcellsidx[i].columnidx =
+            filter->motionmaskcellsidx[i].columnidx;
+      }
+      motioncells_count = filter->motioncells_count;
+      motioncellsidx = g_new0 (motioncellidx, filter->motioncells_count);
+      for (i = 0; i < filter->motioncells_count; i++) {
+        motioncellsidx[i].lineidx = filter->motioncellsidx[i].lineidx;
+        motioncellsidx[i].columnidx = filter->motioncellsidx[i].columnidx;
+      }
+      useAlpha = filter->usealpha;
+      thickness = filter->thickness;
+      success =
+          perform_detection_motion_cells (filter->cvImage, sensitivity,
+          framerate, gridx, gridy,
+          (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND) -
+          filter->diff_timestamp, display, useAlpha, motionmaskcoord_count,
+          motionmaskcoords, motionmaskcells_count, motionmaskcellsidx,
+          motioncellscolor, motioncells_count, motioncellsidx, starttime,
+          datafile, changed_datafile, thickness, filter->id);
+
+      if ((success == 1) && (filter->sent_init_error_msg == false)) {
+        char *initfailedreason;
+        int initerrorcode;
+        GstStructure *s;
+        GstMessage *m;
+        initfailedreason = getInitDataFileFailed (filter->id);
+        initerrorcode = getInitErrorCode (filter->id);
+        s = gst_structure_new ("motion", "init_error_code", G_TYPE_INT,
+            initerrorcode, "details", G_TYPE_STRING, initfailedreason, NULL);
+        m = gst_message_new_element (GST_OBJECT (filter), s);
+        gst_element_post_message (GST_ELEMENT (filter), m);
+        filter->sent_init_error_msg = TRUE;
+      }
+      if ((success == -1) && (filter->sent_save_error_msg == false)) {
+        char *savefailedreason;
+        int saveerrorcode;
+        GstStructure *s;
+        GstMessage *m;
+        savefailedreason = getSaveDataFileFailed (filter->id);
+        saveerrorcode = getSaveErrorCode (filter->id);
+        s = gst_structure_new ("motion", "save_error_code", G_TYPE_INT,
+            saveerrorcode, "details", G_TYPE_STRING, savefailedreason, NULL);
+        m = gst_message_new_element (GST_OBJECT (filter), s);
+        gst_element_post_message (GST_ELEMENT (filter), m);
+        filter->sent_save_error_msg = TRUE;
+      }
+      if (success == -2) {      //frame dropped
+        gst_buffer_unmap (buf, &info);
+        filter->prev_buff_timestamp = filter->cur_buff_timestamp;
+        //free
+        GFREE (datafile);
+        GFREE (motionmaskcoords);
+        GFREE (motionmaskcellsidx);
+        GFREE (motioncellsidx);
+        GST_OBJECT_UNLOCK (filter);
+        return gst_pad_push (filter->srcpad, buf);
+      }
+      filter->changed_datafile = getChangedDataFile (filter->id);
+      motioncellsidxcnt = getMotionCellsIdxCnt (filter->id);
+      numberOfCells = filter->gridx * filter->gridy;
+      motioncellsnumber = motioncellsidxcnt / MSGLEN;
+      cellsOfInterestNumber = (filter->motioncells_count > 0) ? //how many cells interest for us
+          (filter->motioncells_count) : (numberOfCells);
+      mincellsOfInterestNumber =
+          floor ((double) cellsOfInterestNumber * filter->threshold);
+      GST_OBJECT_UNLOCK (filter);
+      motiondetect = (motioncellsnumber >= mincellsOfInterestNumber) ? 1 : 0;
+      if ((motioncellsidxcnt > 0) && (motiondetect == 1)) {
+        char *detectedmotioncells;
+        filter->last_motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
+        detectedmotioncells = getMotionCellsIdx (filter->id);
+        if (detectedmotioncells) {
+          filter->consecutive_motion++;
+          if ((filter->previous_motion == false)
+              && (filter->consecutive_motion >= minimum_motion_frames)) {
+            GstStructure *s;
+            GstMessage *m;
+            filter->previous_motion = true;
+            filter->motion_begin_timestamp = GST_BUFFER_TIMESTAMP (buf);
+            s = gst_structure_new ("motion", "motion_cells_indices",
+                G_TYPE_STRING, detectedmotioncells, "motion_begin",
+                G_TYPE_UINT64, filter->motion_begin_timestamp, NULL);
+            m = gst_message_new_element (GST_OBJECT (filter), s);
+            gst_element_post_message (GST_ELEMENT (filter), m);
+          } else if (filter->postallmotion) {
+            GstStructure *s;
+            GstMessage *m;
+            filter->motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
+            s = gst_structure_new ("motion", "motion_cells_indices",
+                G_TYPE_STRING, detectedmotioncells, "motion", G_TYPE_UINT64,
+                filter->motion_timestamp, NULL);
+            m = gst_message_new_element (GST_OBJECT (filter), s);
+            gst_element_post_message (GST_ELEMENT (filter), m);
+          }
+        } else {
+          GstStructure *s;
+          GstMessage *m;
+          s = gst_structure_new ("motion", "motion_cells_indices",
+              G_TYPE_STRING, "error", NULL);
+          m = gst_message_new_element (GST_OBJECT (filter), s);
+          gst_element_post_message (GST_ELEMENT (filter), m);
+        }
+      } else {
+        filter->consecutive_motion = 0;
+        if ((((GST_BUFFER_TIMESTAMP (buf) -
+                        filter->last_motion_timestamp) / 1000000000l) >=
+                filter->gap)
+            && (filter->last_motion_timestamp > 0)) {
+          GST_DEBUG ("POST MOTION FINISHED MSG\n");
+          if (filter->previous_motion) {
+            GstStructure *s;
+            GstMessage *m;
+            filter->previous_motion = false;
+            s = gst_structure_new ("motion", "motion_finished", G_TYPE_UINT64,
+                filter->last_motion_timestamp, NULL);
+            m = gst_message_new_element (GST_OBJECT (filter), s);
+            gst_element_post_message (GST_ELEMENT (filter), m);
+          }
+        }
+      }
+      if (postnomotion > 0) {
+        guint64 last_buf_timestamp = GST_BUFFER_TIMESTAMP (buf) / 1000000000l;
+        if ((last_buf_timestamp -
+                (filter->last_motion_timestamp / 1000000000l)) >=
+            filter->postnomotion) {
+          GST_DEBUG ("POST NO MOTION MSG\n");
+          if ((last_buf_timestamp -
+                  (filter->last_nomotion_notified / 1000000000l)) >=
+              filter->postnomotion) {
+            GstStructure *s;
+            GstMessage *m;
+            filter->last_nomotion_notified = GST_BUFFER_TIMESTAMP (buf);
+            s = gst_structure_new ("motion", "no_motion", G_TYPE_UINT64,
+                filter->last_motion_timestamp, NULL);
+            m = gst_message_new_element (GST_OBJECT (filter), s);
+            gst_element_post_message (GST_ELEMENT (filter), m);
+          }
+        }
+      }
+      gst_buffer_unmap (buf, &info);
       filter->prev_buff_timestamp = filter->cur_buff_timestamp;
       //free
       GFREE (datafile);
       GFREE (motionmaskcoords);
       GFREE (motionmaskcellsidx);
       GFREE (motioncellsidx);
-      GST_OBJECT_UNLOCK (filter);
-      return gst_pad_push (filter->srcpad, buf);
-    }
-    filter->changed_datafile = getChangedDataFile (filter->id);
-    motioncellsidxcnt = getMotionCellsIdxCnt (filter->id);
-    numberOfCells = filter->gridx * filter->gridy;
-    motioncellsnumber = motioncellsidxcnt / MSGLEN;
-    cellsOfInterestNumber = (filter->motioncells_count > 0) ?   //how many cells interest for us
-        (filter->motioncells_count) : (numberOfCells);
-    mincellsOfInterestNumber =
-        floor ((double) cellsOfInterestNumber * filter->threshold);
-    GST_OBJECT_UNLOCK (filter);
-    motiondetect = (motioncellsnumber >= mincellsOfInterestNumber) ? 1 : 0;
-    if ((motioncellsidxcnt > 0) && (motiondetect == 1)) {
-      char *detectedmotioncells;
-      filter->last_motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
-      detectedmotioncells = getMotionCellsIdx (filter->id);
-      if (detectedmotioncells) {
-        filter->consecutive_motion++;
-        if ((filter->previous_motion == false)
-            && (filter->consecutive_motion >= minimum_motion_frames)) {
-          GstStructure *s;
-          GstMessage *m;
-          filter->previous_motion = true;
-          filter->motion_begin_timestamp = GST_BUFFER_TIMESTAMP (buf);
-          s = gst_structure_new ("motion", "motion_cells_indices",
-              G_TYPE_STRING, detectedmotioncells, "motion_begin", G_TYPE_UINT64,
-              filter->motion_begin_timestamp, NULL);
-          m = gst_message_new_element (GST_OBJECT (filter), s);
-          gst_element_post_message (GST_ELEMENT (filter), m);
-        } else if (filter->postallmotion) {
-          GstStructure *s;
-          GstMessage *m;
-          filter->motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
-          s = gst_structure_new ("motion", "motion_cells_indices",
-              G_TYPE_STRING, detectedmotioncells, "motion", G_TYPE_UINT64,
-              filter->motion_timestamp, NULL);
-          m = gst_message_new_element (GST_OBJECT (filter), s);
-          gst_element_post_message (GST_ELEMENT (filter), m);
-        }
-      } else {
-        GstStructure *s;
-        GstMessage *m;
-        s = gst_structure_new ("motion", "motion_cells_indices", G_TYPE_STRING,
-            "error", NULL);
-        m = gst_message_new_element (GST_OBJECT (filter), s);
-        gst_element_post_message (GST_ELEMENT (filter), m);
-      }
     } else {
-      filter->consecutive_motion = 0;
-      if ((((GST_BUFFER_TIMESTAMP (buf) -
-                      filter->last_motion_timestamp) / 1000000000l) >=
-              filter->gap)
-          && (filter->last_motion_timestamp > 0)) {
-        GST_DEBUG ("POST MOTION FINISHED MSG\n");
-        if (filter->previous_motion) {
-          GstStructure *s;
-          GstMessage *m;
-          filter->previous_motion = false;
-          s = gst_structure_new ("motion", "motion_finished", G_TYPE_UINT64,
-              filter->last_motion_timestamp, NULL);
-          m = gst_message_new_element (GST_OBJECT (filter), s);
-          gst_element_post_message (GST_ELEMENT (filter), m);
-        }
-      }
+      GST_WARNING_OBJECT (filter, "error mapping input buffer");
+      GST_OBJECT_UNLOCK (filter);
     }
-    if (postnomotion > 0) {
-      guint64 last_buf_timestamp = GST_BUFFER_TIMESTAMP (buf) / 1000000000l;
-      if ((last_buf_timestamp -
-              (filter->last_motion_timestamp / 1000000000l)) >=
-          filter->postnomotion) {
-        GST_DEBUG ("POST NO MOTION MSG\n");
-        if ((last_buf_timestamp -
-                (filter->last_nomotion_notified / 1000000000l)) >=
-            filter->postnomotion) {
-          GstStructure *s;
-          GstMessage *m;
-          filter->last_nomotion_notified = GST_BUFFER_TIMESTAMP (buf);
-          s = gst_structure_new ("motion", "no_motion", G_TYPE_UINT64,
-              filter->last_motion_timestamp, NULL);
-          m = gst_message_new_element (GST_OBJECT (filter), s);
-          gst_element_post_message (GST_ELEMENT (filter), m);
-        }
-      }
-    }
-    filter->prev_buff_timestamp = filter->cur_buff_timestamp;
-    //free
-    GFREE (datafile);
-    GFREE (motionmaskcoords);
-    GFREE (motionmaskcellsidx);
-    GFREE (motioncellsidx);
   } else {
     GST_OBJECT_UNLOCK (filter);
   }
diff --git a/ext/rsvg/gstrsvgdec.c b/ext/rsvg/gstrsvgdec.c
index a7d42e8..a17c935 100644
--- a/ext/rsvg/gstrsvgdec.c
+++ b/ext/rsvg/gstrsvgdec.c
@@ -180,17 +180,18 @@
       || GST_VIDEO_INFO_HEIGHT (&output_state->info) != dimension.height) {
 
     /* Create the output state */
-    gst_video_decoder_set_output_state (decoder, GST_RSVG_VIDEO_FORMAT,
-        dimension.width, dimension.height, rsvg->input_state);
     if (output_state)
       gst_video_codec_state_unref (output_state);
-    output_state = gst_video_decoder_get_output_state (decoder);
+    output_state =
+        gst_video_decoder_set_output_state (decoder, GST_RSVG_VIDEO_FORMAT,
+        dimension.width, dimension.height, rsvg->input_state);
   }
 
   ret = gst_video_decoder_allocate_output_frame (decoder, frame);
 
   if (ret != GST_FLOW_OK) {
     g_object_unref (handle);
+    gst_video_codec_state_unref (output_state);
     GST_ERROR_OBJECT (rsvg, "Buffer allocation failed %s",
         gst_flow_get_name (ret));
     return ret;
@@ -205,6 +206,8 @@
           &gst_video_decoder_get_output_state (decoder)->info,
           frame->output_buffer, GST_MAP_READWRITE)) {
     GST_ERROR_OBJECT (rsvg, "Failed to get SVG image");
+    g_object_unref (handle);
+    gst_video_codec_state_unref (output_state);
     return GST_FLOW_ERROR;
   }
   surface =
@@ -261,9 +264,10 @@
   rsvg->input_state = gst_video_codec_state_ref (state);
 
   /* Create the output state */
-  gst_video_decoder_set_output_state (decoder, GST_RSVG_VIDEO_FORMAT,
+  state = gst_video_decoder_set_output_state (decoder, GST_RSVG_VIDEO_FORMAT,
       GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info),
       rsvg->input_state);
+  gst_video_codec_state_unref (state);
 
   return TRUE;
 }
diff --git a/ext/rtmp/gstrtmpsrc.c b/ext/rtmp/gstrtmpsrc.c
index a38b8b8..b6c4048 100644
--- a/ext/rtmp/gstrtmpsrc.c
+++ b/ext/rtmp/gstrtmpsrc.c
@@ -389,8 +389,14 @@
 eos:
   {
     gst_buffer_unref (buf);
-    GST_DEBUG_OBJECT (src, "Reading data gave EOS");
-    return GST_FLOW_EOS;
+    if (src->cur_offset == 0) {
+      GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
+          ("Failed to read any data from stream, check your URL"));
+      return GST_FLOW_ERROR;
+    } else {
+      GST_DEBUG_OBJECT (src, "Reading data gave EOS");
+      return GST_FLOW_EOS;
+    }
   }
 }
 
diff --git a/ext/schroedinger/gstschrodec.c b/ext/schroedinger/gstschrodec.c
index 00f442e..0a273fa 100644
--- a/ext/schroedinger/gstschrodec.c
+++ b/ext/schroedinger/gstschrodec.c
@@ -573,7 +573,7 @@
     gst_buffer_pool_config_add_option (config,
         GST_BUFFER_POOL_OPTION_VIDEO_META);
   }
-
+  gst_buffer_pool_set_config (pool, config);
   gst_object_unref (pool);
 
   return TRUE;
diff --git a/ext/smoothstreaming/Makefile.am b/ext/smoothstreaming/Makefile.am
index ad3314a..a683f75 100644
--- a/ext/smoothstreaming/Makefile.am
+++ b/ext/smoothstreaming/Makefile.am
@@ -13,13 +13,11 @@
 libgstsmoothstreaming_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS}
 libgstsmoothstreaming_la_SOURCES = gstsmoothstreaming-plugin.c \
 	gstmssdemux.c \
-	gstmssmanifest.c \
-	gstdownloadrate.c
+	gstmssmanifest.c
 libgstsmoothstreaming_la_LIBTOOLFLAGS = --tag=disable-static
 
 noinst_HEADERS = gstmssdemux.h \
-	gstmssmanifest.h \
-	gstdownloadrate.h
+	gstmssmanifest.h
 
 Android.mk: Makefile.am $(BUILT_SOURCES)
 	androgenizer \
diff --git a/ext/smoothstreaming/Makefile.in b/ext/smoothstreaming/Makefile.in
index ca5a867..4875022 100644
--- a/ext/smoothstreaming/Makefile.in
+++ b/ext/smoothstreaming/Makefile.in
@@ -161,8 +161,7 @@
 am_libgstsmoothstreaming_la_OBJECTS =  \
 	libgstsmoothstreaming_la-gstsmoothstreaming-plugin.lo \
 	libgstsmoothstreaming_la-gstmssdemux.lo \
-	libgstsmoothstreaming_la-gstmssmanifest.lo \
-	libgstsmoothstreaming_la-gstdownloadrate.lo
+	libgstsmoothstreaming_la-gstmssmanifest.lo
 libgstsmoothstreaming_la_OBJECTS =  \
 	$(am_libgstsmoothstreaming_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
@@ -743,13 +742,11 @@
 libgstsmoothstreaming_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS}
 libgstsmoothstreaming_la_SOURCES = gstsmoothstreaming-plugin.c \
 	gstmssdemux.c \
-	gstmssmanifest.c \
-	gstdownloadrate.c
+	gstmssmanifest.c
 
 libgstsmoothstreaming_la_LIBTOOLFLAGS = --tag=disable-static
 noinst_HEADERS = gstmssdemux.h \
-	gstmssmanifest.h \
-	gstdownloadrate.h
+	gstmssmanifest.h
 
 all: all-am
 
@@ -830,7 +827,6 @@
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmoothstreaming_la-gstdownloadrate.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmoothstreaming_la-gstmssdemux.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmoothstreaming_la-gstmssmanifest.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstsmoothstreaming_la-gstsmoothstreaming-plugin.Plo@am__quote@
@@ -880,13 +876,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmoothstreaming_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmoothstreaming_la_CFLAGS) $(CFLAGS) -c -o libgstsmoothstreaming_la-gstmssmanifest.lo `test -f 'gstmssmanifest.c' || echo '$(srcdir)/'`gstmssmanifest.c
 
-libgstsmoothstreaming_la-gstdownloadrate.lo: gstdownloadrate.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstsmoothstreaming_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmoothstreaming_la_CFLAGS) $(CFLAGS) -MT libgstsmoothstreaming_la-gstdownloadrate.lo -MD -MP -MF $(DEPDIR)/libgstsmoothstreaming_la-gstdownloadrate.Tpo -c -o libgstsmoothstreaming_la-gstdownloadrate.lo `test -f 'gstdownloadrate.c' || echo '$(srcdir)/'`gstdownloadrate.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstsmoothstreaming_la-gstdownloadrate.Tpo $(DEPDIR)/libgstsmoothstreaming_la-gstdownloadrate.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstdownloadrate.c' object='libgstsmoothstreaming_la-gstdownloadrate.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 $(libgstsmoothstreaming_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstsmoothstreaming_la_CFLAGS) $(CFLAGS) -c -o libgstsmoothstreaming_la-gstdownloadrate.lo `test -f 'gstdownloadrate.c' || echo '$(srcdir)/'`gstdownloadrate.c
-
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/ext/smoothstreaming/gstdownloadrate.c b/ext/smoothstreaming/gstdownloadrate.c
deleted file mode 100644
index ce25b18..0000000
--- a/ext/smoothstreaming/gstdownloadrate.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* GStreamer
- * Copyright (C) 2011 Andoni Morales Alastruey <ylatuya@gmail.com>
- * Copyright (C) 2012 Smart TV Alliance
- *  Author: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>, Collabora Ltd.
- *
- * gstfragment.c:
- *
- * 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., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <glib.h>
-#include "gstdownloadrate.h"
-
-static void
-_gst_download_rate_check_remove_rates (GstDownloadRate * rate)
-{
-  if (rate->max_length == 0)
-    return;
-
-  while (g_queue_get_length (&rate->queue) > rate->max_length) {
-    guint bitrate = GPOINTER_TO_UINT (g_queue_pop_head (&rate->queue));
-
-    rate->total -= bitrate;
-  }
-}
-
-void
-gst_download_rate_init (GstDownloadRate * rate)
-{
-  g_queue_init (&rate->queue);
-  g_mutex_init (&rate->mutex);
-  rate->total = 0;
-  rate->max_length = 0;
-}
-
-void
-gst_download_rate_deinit (GstDownloadRate * rate)
-{
-  gst_download_rate_clear (rate);
-  g_mutex_clear (&rate->mutex);
-}
-
-void
-gst_download_rate_set_max_length (GstDownloadRate * rate, gint max_length)
-{
-  g_mutex_lock (&rate->mutex);
-  rate->max_length = max_length;
-  _gst_download_rate_check_remove_rates (rate);
-  g_mutex_unlock (&rate->mutex);
-}
-
-gint
-gst_download_rate_get_max_length (GstDownloadRate * rate)
-{
-  guint ret;
-  g_mutex_lock (&rate->mutex);
-  ret = rate->max_length;
-  g_mutex_unlock (&rate->mutex);
-
-  return ret;
-}
-
-void
-gst_download_rate_clear (GstDownloadRate * rate)
-{
-  g_mutex_lock (&rate->mutex);
-  g_queue_clear (&rate->queue);
-  rate->total = 0;
-  g_mutex_unlock (&rate->mutex);
-}
-
-void
-gst_download_rate_add_rate (GstDownloadRate * rate, guint bytes, guint64 time)
-{
-  guint64 bitrate;
-  g_mutex_lock (&rate->mutex);
-
-  /* convert from bytes / nanoseconds to bits per second */
-  bitrate = G_GUINT64_CONSTANT (8000000000) * bytes / time;
-
-  g_queue_push_tail (&rate->queue, GUINT_TO_POINTER ((guint) bitrate));
-  rate->total += bitrate;
-
-  _gst_download_rate_check_remove_rates (rate);
-  g_mutex_unlock (&rate->mutex);
-}
-
-guint
-gst_download_rate_get_current_rate (GstDownloadRate * rate)
-{
-  guint ret;
-  g_mutex_lock (&rate->mutex);
-  if (g_queue_get_length (&rate->queue))
-    ret = rate->total / g_queue_get_length (&rate->queue);
-  else
-    ret = G_MAXUINT;
-  g_mutex_unlock (&rate->mutex);
-
-  return ret;
-}
diff --git a/ext/smoothstreaming/gstdownloadrate.h b/ext/smoothstreaming/gstdownloadrate.h
deleted file mode 100644
index 2ea704b..0000000
--- a/ext/smoothstreaming/gstdownloadrate.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* GStreamer
- * Copyright (C) 2012 Smart TV Alliance
- *  Author: Thiago Sousa Santos <thiago.sousa.santos@collabora.com>, Collabora Ltd.
- *
- * gstdownloadrate.h:
- *
- * 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., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GST_DOWNLOAD_RATE_H__
-#define __GST_DOWNLOAD_RATE_H__
-
-#include <glib-object.h>
-#include <gst/gst.h>
-
-G_BEGIN_DECLS
-
-typedef struct _GstDownloadRate GstDownloadRate;
-
-struct _GstDownloadRate
-{
-  GQueue queue;
-  GMutex mutex;
-
-  gint max_length;
-
-  guint64 total;
-};
-
-void gst_download_rate_init (GstDownloadRate * rate);
-void gst_download_rate_deinit (GstDownloadRate * rate);
-
-void gst_download_rate_set_max_length (GstDownloadRate * rate, gint max_length);
-gint gst_download_rate_get_max_length (GstDownloadRate * rate);
-
-void gst_download_rate_clear (GstDownloadRate * rate);
-void gst_download_rate_add_rate (GstDownloadRate * rate, guint bytes, guint64 time);
-
-guint gst_download_rate_get_current_rate (GstDownloadRate * rate);
-
-G_END_DECLS
-#endif /* __GST_DOWNLOAD_RATE_H__ */
diff --git a/ext/smoothstreaming/gstmssdemux.c b/ext/smoothstreaming/gstmssdemux.c
index 15326b7..14954f0 100644
--- a/ext/smoothstreaming/gstmssdemux.c
+++ b/ext/smoothstreaming/gstmssdemux.c
@@ -81,7 +81,6 @@
 #define DEFAULT_MAX_QUEUE_SIZE_BUFFERS 0
 #define DEFAULT_BITRATE_LIMIT 0.8
 
-#define DOWNLOAD_RATE_MAX_HISTORY_LENGTH 5
 #define MAX_DOWNLOAD_ERROR_COUNT 3
 
 enum
@@ -114,7 +113,7 @@
     GST_STATIC_CAPS_ANY);
 
 #define gst_mss_demux_parent_class parent_class
-G_DEFINE_TYPE (GstMssDemux, gst_mss_demux, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMssDemux, gst_mss_demux, GST_TYPE_BIN);
 
 static void gst_mss_demux_dispose (GObject * object);
 static void gst_mss_demux_set_property (GObject * object, guint prop_id,
@@ -123,6 +122,7 @@
     GValue * value, GParamSpec * pspec);
 static GstStateChangeReturn gst_mss_demux_change_state (GstElement * element,
     GstStateChange transition);
+static void gst_mss_demux_handle_message (GstBin * bin, GstMessage * msg);
 static GstFlowReturn gst_mss_demux_chain (GstPad * pad, GstObject * parent,
     GstBuffer * buffer);
 static GstFlowReturn gst_mss_demux_event (GstPad * pad, GstObject * parent,
@@ -131,8 +131,6 @@
     GstQuery * query);
 
 static void gst_mss_demux_download_loop (GstMssDemuxStream * stream);
-static GstFlowReturn gst_mss_demux_stream_push (GstMssDemuxStream * stream,
-    GstBuffer * buffer);
 static GstFlowReturn gst_mss_demux_stream_push_event (GstMssDemuxStream *
     stream, GstEvent * event);
 static GstFlowReturn gst_mss_demux_combine_flows (GstMssDemux * mssdemux);
@@ -146,9 +144,11 @@
 {
   GObjectClass *gobject_class;
   GstElementClass *gstelement_class;
+  GstBinClass *gstbin_class;
 
   gobject_class = (GObjectClass *) klass;
   gstelement_class = (GstElementClass *) klass;
+  gstbin_class = (GstBinClass *) klass;
 
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&gst_mss_demux_sink_template));
@@ -174,7 +174,8 @@
   g_object_class_install_property (gobject_class, PROP_MAX_QUEUE_SIZE_BUFFERS,
       g_param_spec_uint ("max-queue-size-buffers", "Max queue size in buffers",
           "Maximum buffers that can be stored in each internal stream queue "
-          "(0 = infinite)", 0, G_MAXUINT, DEFAULT_MAX_QUEUE_SIZE_BUFFERS,
+          "(0 = infinite) (deprecated)", 0, G_MAXUINT,
+          DEFAULT_MAX_QUEUE_SIZE_BUFFERS,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class, PROP_BITRATE_LIMIT,
@@ -187,6 +188,8 @@
   gstelement_class->change_state =
       GST_DEBUG_FUNCPTR (gst_mss_demux_change_state);
 
+  gstbin_class->handle_message = gst_mss_demux_handle_message;
+
   GST_DEBUG_CATEGORY_INIT (mssdemux_debug, "mssdemux", 0, "mssdemux plugin");
 }
 
@@ -215,7 +218,6 @@
   GstMssDemuxStream *stream;
 
   stream = g_new0 (GstMssDemuxStream, 1);
-  stream->downloader = gst_uri_downloader_new ();
 
   /* Downloading task */
   g_rec_mutex_init (&stream->download_lock);
@@ -227,11 +229,10 @@
   stream->pad = srcpad;
   stream->manifest_stream = manifeststream;
   stream->parent = mssdemux;
-  gst_download_rate_init (&stream->download_rate);
-  gst_download_rate_set_max_length (&stream->download_rate,
-      DOWNLOAD_RATE_MAX_HISTORY_LENGTH);
 
   gst_segment_init (&stream->segment, GST_FORMAT_TIME);
+  g_cond_init (&stream->fragment_download_cond);
+  g_mutex_init (&stream->fragment_download_lock);
 
   return stream;
 }
@@ -243,7 +244,7 @@
     if (GST_TASK_STATE (stream->download_task) != GST_TASK_STOPPED) {
       GST_DEBUG_OBJECT (stream->parent, "Leaving streaming task %s:%s",
           GST_DEBUG_PAD_NAME (stream->pad));
-      gst_uri_downloader_cancel (stream->downloader);
+      g_cond_signal (&stream->fragment_download_cond);
       gst_task_stop (stream->download_task);
       GST_LOG_OBJECT (stream->parent, "Waiting for task to finish");
       gst_task_join (stream->download_task);
@@ -254,16 +255,25 @@
     stream->download_task = NULL;
   }
 
-  gst_download_rate_deinit (&stream->download_rate);
-  if (stream->pending_newsegment) {
-    gst_event_unref (stream->pending_newsegment);
-    stream->pending_newsegment = NULL;
+  if (stream->pending_segment) {
+    gst_event_unref (stream->pending_segment);
+    stream->pending_segment = NULL;
   }
 
-  if (stream->downloader != NULL) {
-    g_object_unref (stream->downloader);
-    stream->downloader = NULL;
+  if (stream->src_srcpad) {
+    gst_object_unref (stream->src_srcpad);
+    stream->src_srcpad = NULL;
   }
+
+  if (stream->src) {
+    gst_element_set_state (stream->src, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN_CAST (stream->parent), stream->src);
+    stream->src = NULL;
+  }
+
+  g_cond_clear (&stream->fragment_download_cond);
+  g_mutex_clear (&stream->fragment_download_lock);
+
   if (stream->pad) {
     gst_object_unref (stream->pad);
     stream->pad = NULL;
@@ -389,6 +399,49 @@
   return result;
 }
 
+static void
+gst_mss_demux_handle_message (GstBin * bin, GstMessage * msg)
+{
+  GstMssDemux *demux = GST_MSS_DEMUX_CAST (bin);
+
+  switch (GST_MESSAGE_TYPE (msg)) {
+    case GST_MESSAGE_ERROR:{
+      GSList *iter;
+      GstMssDemuxStream *stream;
+      GError *err = NULL;
+      gchar *debug = NULL;
+
+      for (iter = demux->streams; iter; iter = g_slist_next (iter)) {
+        stream = iter->data;
+        if (GST_OBJECT_CAST (stream->src) == GST_MESSAGE_SRC (msg)) {
+          gst_message_parse_error (msg, &err, &debug);
+
+          GST_WARNING_OBJECT (stream->pad, "Source posted error: %d:%d %s (%s)",
+              err->domain, err->code, err->message, debug);
+
+          /* error, but ask to retry */
+          stream->last_ret = GST_FLOW_CUSTOM_ERROR;
+          g_cond_signal (&stream->fragment_download_cond);
+
+          g_error_free (err);
+          g_free (debug);
+          break;
+        }
+      }
+
+      gst_message_unref (msg);
+      msg = NULL;
+    }
+      break;
+    default:
+      break;
+  }
+
+  if (msg)
+    GST_BIN_CLASS (parent_class)->handle_message (bin, msg);
+}
+
+
 static GstFlowReturn
 gst_mss_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
 {
@@ -479,7 +532,7 @@
     gst_task_stop (stream->download_task);
     stream->cancelled = TRUE;
     if (immediate)
-      gst_uri_downloader_cancel (stream->downloader);
+      g_cond_signal (&stream->fragment_download_cond);
   }
   GST_OBJECT_UNLOCK (mssdemux);
 
@@ -497,7 +550,6 @@
   GSList *iter;
   for (iter = mssdemux->streams; iter; iter = g_slist_next (iter)) {
     GstMssDemuxStream *stream = iter->data;
-    gst_uri_downloader_reset (stream->downloader);
     stream->cancelled = FALSE;
     gst_task_start (stream->download_task);
   }
@@ -562,9 +614,9 @@
 
         newsegment = gst_event_new_segment (&stream->segment);
         gst_event_set_seqnum (newsegment, gst_event_get_seqnum (event));
-        if (stream->pending_newsegment)
-          gst_event_unref (stream->pending_newsegment);
-        stream->pending_newsegment = newsegment;
+        if (stream->pending_segment)
+          gst_event_unref (stream->pending_segment);
+        stream->pending_segment = newsegment;
       }
 
       if (flags & GST_SEEK_FLAG_FLUSH) {
@@ -601,6 +653,13 @@
       }
     }
       break;
+    case GST_EVENT_LATENCY:{
+      /* Upstream and our internal source are irrelevant
+       * for latency, and we should not fail here to
+       * configure the latency */
+      gst_event_unref (event);
+      return TRUE;
+    }
     default:
       break;
   }
@@ -698,9 +757,10 @@
 static GstPad *
 _create_pad (GstMssDemux * mssdemux, GstMssStream * manifeststream)
 {
-  gchar *name;
+  gchar *name = NULL;
   GstPad *srcpad = NULL;
   GstMssStreamType streamtype;
+  GstPadTemplate *tmpl = NULL;
 
   streamtype = gst_mss_stream_get_type (manifeststream);
   GST_DEBUG_OBJECT (mssdemux, "Found stream of type: %s",
@@ -709,18 +769,18 @@
   /* TODO use stream's name/bitrate/index as the pad name? */
   if (streamtype == MSS_STREAM_TYPE_VIDEO) {
     name = g_strdup_printf ("video_%02u", mssdemux->n_videos++);
-    srcpad =
-        gst_pad_new_from_static_template (&gst_mss_demux_videosrc_template,
-        name);
-    g_free (name);
+    tmpl = gst_static_pad_template_get (&gst_mss_demux_videosrc_template);
   } else if (streamtype == MSS_STREAM_TYPE_AUDIO) {
     name = g_strdup_printf ("audio_%02u", mssdemux->n_audios++);
-    srcpad =
-        gst_pad_new_from_static_template (&gst_mss_demux_audiosrc_template,
-        name);
-    g_free (name);
+    tmpl = gst_static_pad_template_get (&gst_mss_demux_audiosrc_template);
   }
 
+  if (tmpl != NULL) {
+    srcpad =
+        GST_PAD_CAST (gst_ghost_pad_new_no_target_from_template (name, tmpl));
+    g_free (name);
+    gst_object_unref (tmpl);
+  }
   if (!srcpad) {
     GST_WARNING_OBJECT (mssdemux, "Ignoring unknown type stream");
     return NULL;
@@ -756,6 +816,7 @@
     }
 
     stream = gst_mss_demux_stream_new (mssdemux, manifeststream, srcpad);
+    gst_pad_set_element_private (srcpad, stream);
     gst_mss_stream_set_active (manifeststream, TRUE);
     mssdemux->streams = g_slist_append (mssdemux->streams, stream);
   }
@@ -822,6 +883,8 @@
     g_free (name);
 
     gst_pad_set_caps (pad, caps);
+    if (stream->caps)
+      gst_caps_unref (stream->caps);
     stream->caps = caps;
 
     lang = gst_mss_stream_get_lang (stream->manifest_stream);
@@ -940,7 +1003,7 @@
 
   manifest_data =
       gst_uri_downloader_fetch_uri (downloader, mssdemux->manifest_uri, NULL,
-      TRUE, TRUE, NULL);
+      TRUE, TRUE, TRUE, NULL);
   manifest_buffer = gst_fragment_get_buffer (manifest_data);
   g_object_unref (manifest_data);
 
@@ -956,19 +1019,28 @@
 {
   GstEvent *capsevent = NULL;
   GstMssDemux *mssdemux = stream->parent;
-  guint64 new_bitrate;
+  guint64 bitrate = 0;
 
-  new_bitrate =
-      mssdemux->bitrate_limit *
-      gst_download_rate_get_current_rate (&stream->download_rate);
+  if (stream->download_total_time)
+    bitrate =
+        (stream->download_total_bytes * 8) /
+        ((double) stream->download_total_time / G_GUINT64_CONSTANT (1000000));
+
+  if (stream->current_download_rate != -1)
+    bitrate = (stream->current_download_rate + bitrate * 3) / 4;
+  if (bitrate > G_MAXINT)
+    bitrate = G_MAXINT;
+  stream->current_download_rate = bitrate;
+  bitrate *= mssdemux->bitrate_limit;
+
   if (mssdemux->connection_speed) {
-    new_bitrate = MIN (mssdemux->connection_speed, new_bitrate);
+    bitrate = MIN (mssdemux->connection_speed, bitrate);
   }
 
   GST_DEBUG_OBJECT (stream->pad,
-      "Current stream download bitrate %" G_GUINT64_FORMAT, new_bitrate);
+      "Current stream download bitrate %" G_GUINT64_FORMAT, bitrate);
 
-  if (gst_mss_stream_select_bitrate (stream->manifest_stream, new_bitrate)) {
+  if (gst_mss_stream_select_bitrate (stream->manifest_stream, bitrate)) {
     GstCaps *caps;
     caps = gst_mss_stream_get_caps (stream->manifest_stream);
 
@@ -977,13 +1049,14 @@
     if (stream->caps)
       gst_caps_unref (stream->caps);
     stream->caps = create_mss_caps (stream, caps);
-    gst_caps_unref (caps);
 
     GST_DEBUG_OBJECT (stream->pad,
         "Stream changed bitrate to %" G_GUINT64_FORMAT " caps: %"
         GST_PTR_FORMAT,
         gst_mss_stream_get_current_bitrate (stream->manifest_stream), caps);
 
+    gst_caps_unref (caps);
+
     capsevent = gst_event_new_caps (stream->caps);
     GST_DEBUG_OBJECT (stream->pad, "Finished streams reconfiguration");
   }
@@ -991,16 +1064,281 @@
 }
 
 static GstFlowReturn
-gst_mss_demux_stream_download_fragment (GstMssDemuxStream * stream,
-    GstBuffer ** _buffer)
+_src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
+{
+  GstPad *srcpad = (GstPad *) parent;
+  GstMssDemux *demux = (GstMssDemux *) GST_PAD_PARENT (srcpad);
+  GstMssDemuxStream *stream = gst_pad_get_element_private (srcpad);
+  GstFlowReturn ret;
+  gboolean discont = FALSE;
+
+  if (stream->starting_fragment) {
+#if 0
+    if (demux->segment.rate < 0)
+      /* Set DISCONT flag for every first buffer in reverse playback mode
+       * as each fragment for its own has to be reversed */
+      discont = TRUE;
+#endif
+    stream->starting_fragment = FALSE;
+
+    GST_BUFFER_PTS (buffer) =
+        gst_mss_stream_get_fragment_gst_timestamp (stream->manifest_stream);
+
+    GST_LOG_OBJECT (stream->pad, "set fragment pts=%" GST_TIME_FORMAT,
+        GST_TIME_ARGS (GST_BUFFER_PTS (buffer)));
+
+    if (stream->pending_segment) {
+      /* And send a newsegment */
+      gst_pad_push_event (stream->pad, stream->pending_segment);
+      stream->pending_segment = NULL;
+    }
+    stream->segment.position = GST_BUFFER_PTS (buffer);
+
+  } else {
+    GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE;
+  }
+
+  if (discont) {
+    GST_DEBUG_OBJECT (stream->pad, "Marking fragment as discontinuous");
+    GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+  } else {
+    GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);
+  }
+
+  GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
+  GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE;
+
+  /* accumulate time and size to get this chunk */
+  stream->download_total_time +=
+      g_get_monotonic_time () - stream->download_start_time;
+  stream->download_total_bytes += gst_buffer_get_size (buffer);
+
+  stream->have_data = TRUE;
+
+  ret = gst_proxy_pad_chain_default (pad, parent, buffer);
+  stream->download_start_time = g_get_monotonic_time ();
+  GST_LOG_OBJECT (pad, "Chain res: %d %s", ret, gst_flow_get_name (ret));
+
+  if (ret != GST_FLOW_OK) {
+    if (ret < GST_FLOW_EOS) {
+      GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL),
+          ("stream stopped, reason %s", gst_flow_get_name (ret)));
+
+      /* TODO push this on all pads */
+      gst_pad_push_event (stream->pad, gst_event_new_eos ());
+    } else {
+      GST_DEBUG_OBJECT (stream->pad, "stream stopped, reason %s",
+          gst_flow_get_name (ret));
+    }
+
+    /* TODO properly stop tasks */
+    /* gst_hls_demux_pause_tasks (demux); */
+  }
+
+  /* avoid having the source handle the same error again */
+  stream->last_ret = ret;
+  ret = GST_FLOW_OK;
+
+  return ret;
+}
+
+static gboolean
+_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
+{
+  GstPad *srcpad = GST_PAD_CAST (parent);
+  GstMssDemuxStream *stream = gst_pad_get_element_private (srcpad);
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_EOS:
+      g_cond_signal (&stream->fragment_download_cond);
+      break;
+    default:
+      break;
+  }
+
+  gst_event_unref (event);
+
+  return TRUE;
+}
+
+static gboolean
+_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
+{
+  switch (GST_QUERY_TYPE (query)) {
+    case GST_QUERY_ALLOCATION:
+      return FALSE;
+      break;
+    default:
+      break;
+  }
+
+  return gst_pad_query_default (pad, parent, query);
+}
+
+static gboolean
+gst_mss_demux_stream_update_source (GstMssDemuxStream * stream,
+    const gchar * uri, const gchar * referer, gboolean refresh,
+    gboolean allow_cache)
+{
+  GstMssDemux *demux = stream->parent;
+
+  if (!gst_uri_is_valid (uri)) {
+    GST_WARNING_OBJECT (stream->pad, "Invalid URI: %s", uri);
+    stream->last_ret = GST_FLOW_ERROR;
+    return FALSE;
+  }
+
+  if (stream->src != NULL) {
+    gchar *old_protocol, *new_protocol;
+    gchar *old_uri;
+
+    old_uri = gst_uri_handler_get_uri (GST_URI_HANDLER (stream->src));
+    old_protocol = gst_uri_get_protocol (old_uri);
+    new_protocol = gst_uri_get_protocol (uri);
+
+    if (!g_str_equal (old_protocol, new_protocol)) {
+      gst_object_unref (stream->src_srcpad);
+      gst_element_set_state (stream->src, GST_STATE_NULL);
+      gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+      stream->src = NULL;
+      stream->src_srcpad = NULL;
+      GST_DEBUG_OBJECT (demux, "Can't re-use old source element");
+    } else {
+      GError *err = NULL;
+
+      GST_DEBUG_OBJECT (demux, "Re-using old source element");
+      if (!gst_uri_handler_set_uri (GST_URI_HANDLER (stream->src), uri, &err)) {
+        GST_DEBUG_OBJECT (demux, "Failed to re-use old source element: %s",
+            err->message);
+        g_clear_error (&err);
+        gst_element_set_state (stream->src, GST_STATE_NULL);
+        gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+        stream->src = NULL;
+      }
+    }
+    g_free (old_uri);
+    g_free (old_protocol);
+    g_free (new_protocol);
+  }
+
+  if (stream->src == NULL) {
+    GObjectClass *gobject_class;
+    GstPad *internal_pad;
+
+    stream->src = gst_element_make_from_uri (GST_URI_SRC, uri, NULL, NULL);
+    if (stream->src == NULL) {
+      GST_ELEMENT_ERROR (demux, CORE, MISSING_PLUGIN,
+          ("Missing plugin to handle URI: '%s'", uri), (NULL));
+      return FALSE;
+    }
+
+    gobject_class = G_OBJECT_GET_CLASS (stream->src);
+
+    if (g_object_class_find_property (gobject_class, "compress"))
+      g_object_set (stream->src, "compress", FALSE, NULL);
+    if (g_object_class_find_property (gobject_class, "keep-alive"))
+      g_object_set (stream->src, "keep-alive", TRUE, NULL);
+    if (g_object_class_find_property (gobject_class, "extra-headers")) {
+      if (referer || refresh || !allow_cache) {
+        GstStructure *extra_headers = gst_structure_new_empty ("headers");
+
+        if (referer)
+          gst_structure_set (extra_headers, "Referer", G_TYPE_STRING, referer,
+              NULL);
+
+        if (!allow_cache)
+          gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
+              "no-cache", NULL);
+        else if (refresh)
+          gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
+              "max-age=0", NULL);
+
+        g_object_set (stream->src, "extra-headers", extra_headers, NULL);
+
+        gst_structure_free (extra_headers);
+      } else {
+        g_object_set (stream->src, "extra-headers", NULL, NULL);
+      }
+    }
+
+    gst_element_set_locked_state (stream->src, TRUE);
+    gst_bin_add (GST_BIN_CAST (demux), stream->src);
+    stream->src_srcpad = gst_element_get_static_pad (stream->src, "src");
+
+    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (stream->pad),
+        stream->src_srcpad);
+
+    /* set up our internal pad to drop all events from
+     * the http src we don't care about. On the chain function
+     * we just push the buffer forward, but this way dash can get
+     * the flow return from downstream */
+    internal_pad =
+        GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (stream->pad)));
+    gst_pad_set_chain_function (GST_PAD_CAST (internal_pad), _src_chain);
+    gst_pad_set_event_function (GST_PAD_CAST (internal_pad), _src_event);
+    /* need to set query otherwise deadlocks happen with allocation queries */
+    gst_pad_set_query_function (GST_PAD_CAST (internal_pad), _src_query);
+    gst_object_unref (internal_pad);
+  }
+  return TRUE;
+}
+
+/* must be called with the stream's fragment_download_lock */
+static void
+gst_mss_demux_stream_download_uri (GstMssDemux * demux,
+    GstMssDemuxStream * stream, const gchar * uri, gint64 start, gint64 end)
+{
+  GST_DEBUG_OBJECT (stream->pad, "Downloading uri: %s, range:%" G_GINT64_FORMAT
+      " - %" G_GINT64_FORMAT, uri, start, end);
+
+  if (!gst_mss_demux_stream_update_source (stream, uri, NULL, FALSE, TRUE)) {
+    return;
+  }
+
+  if (gst_element_set_state (stream->src,
+          GST_STATE_READY) != GST_STATE_CHANGE_FAILURE) {
+    if (start != 0 || end != -1) {
+      if (!gst_element_send_event (stream->src, gst_event_new_seek (1.0,
+                  GST_FORMAT_BYTES, (GstSeekFlags) GST_SEEK_FLAG_FLUSH,
+                  GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, end))) {
+
+        /* looks like the source can't handle seeks in READY */
+/*
+        *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_NOT_IMPLEMENTED,
+            "Source element can't handle range requests");
+*/
+        stream->last_ret = GST_FLOW_ERROR;
+      }
+    }
+
+    if (G_LIKELY (stream->last_ret == GST_FLOW_OK)) {
+      /* flush the proxypads so that the EOS state is reset */
+      gst_pad_push_event (stream->src_srcpad, gst_event_new_flush_start ());
+      gst_pad_push_event (stream->src_srcpad, gst_event_new_flush_stop (TRUE));
+
+      stream->download_start_time = g_get_monotonic_time ();
+      gst_element_sync_state_with_parent (stream->src);
+
+      /* wait for the fragment to be completely downloaded */
+      GST_DEBUG_OBJECT (stream->pad,
+          "Waiting for fragment download to finish: %s", uri);
+      g_cond_wait (&stream->fragment_download_cond,
+          &stream->fragment_download_lock);
+    }
+  } else {
+    stream->last_ret = GST_FLOW_CUSTOM_ERROR;
+  }
+
+  gst_element_set_state (stream->src, GST_STATE_READY);
+}
+
+static GstFlowReturn
+gst_mss_demux_stream_download_fragment (GstMssDemuxStream * stream)
 {
   GstMssDemux *mssdemux = stream->parent;
-  gchar *path;
-  gchar *url;
-  GstFragment *fragment;
-  GstBuffer *buffer;
+  gchar *path = NULL;
+  gchar *url = NULL;
   GstFlowReturn ret = GST_FLOW_OK;
-  guint64 before_download, after_download;
 
   /* special case for not-linked streams */
   if (stream->last_ret == GST_FLOW_NOT_LINKED) {
@@ -1009,20 +1347,24 @@
     return GST_FLOW_NOT_LINKED;
   }
 
-  before_download = g_get_real_time ();
-
+  g_mutex_lock (&stream->fragment_download_lock);
   GST_DEBUG_OBJECT (stream->pad, "Getting url for stream");
   ret = gst_mss_stream_get_fragment_url (stream->manifest_stream, &path);
   switch (ret) {
     case GST_FLOW_OK:
       break;                    /* all is good, let's go */
     case GST_FLOW_EOS:
+      g_free (path);
       if (gst_mss_manifest_is_live (mssdemux->manifest)) {
         gst_mss_demux_reload_manifest (mssdemux);
+        g_mutex_unlock (&stream->fragment_download_lock);
         return GST_FLOW_OK;
       }
+      g_mutex_unlock (&stream->fragment_download_lock);
       return GST_FLOW_EOS;
     case GST_FLOW_ERROR:
+      g_mutex_unlock (&stream->fragment_download_lock);
+      g_free (path);
       goto error;
     default:
       break;
@@ -1036,48 +1378,26 @@
 
   GST_DEBUG_OBJECT (mssdemux, "Got url '%s' for stream %p", url, stream);
 
-  fragment =
-      gst_uri_downloader_fetch_uri (stream->downloader, url,
-      mssdemux->manifest_uri, FALSE, FALSE, NULL);
+  stream->starting_fragment = TRUE;
+
+  gst_mss_demux_stream_download_uri (mssdemux, stream, url, 0, -1);
+
   g_free (path);
   g_free (url);
+  g_mutex_unlock (&stream->fragment_download_lock);
 
-  if (!fragment) {
+  if (stream->last_ret != GST_FLOW_OK) {
     GST_INFO_OBJECT (mssdemux, "No fragment downloaded");
     /* TODO check if we are truly stoping */
-    if (gst_mss_manifest_is_live (mssdemux->manifest)) {
+    if (stream->last_ret != GST_FLOW_ERROR
+        && gst_mss_manifest_is_live (mssdemux->manifest)) {
       /* looks like there is no way of knowing when a live stream has ended
        * Have to assume we are falling behind and cause a manifest reload */
       return GST_FLOW_OK;
     }
-    return GST_FLOW_ERROR;
   }
 
-  buffer = gst_fragment_get_buffer (fragment);
-  *_buffer = buffer = gst_buffer_make_writable (buffer);
-  GST_BUFFER_TIMESTAMP (buffer) =
-      gst_mss_stream_get_fragment_gst_timestamp (stream->manifest_stream);
-  GST_BUFFER_DURATION (buffer) =
-      gst_mss_stream_get_fragment_gst_duration (stream->manifest_stream);
-
-  g_object_unref (fragment);
-
-  after_download = g_get_real_time ();
-  {
-#ifndef GST_DISABLE_GST_DEBUG
-    guint64 bitrate = (8 * gst_buffer_get_size (buffer) * 1000000LLU) /
-        (after_download - before_download);
-#endif
-
-    GST_DEBUG_OBJECT (mssdemux,
-        "Measured download bitrate: %s %" G_GUINT64_FORMAT " bps",
-        GST_PAD_NAME (stream->pad), bitrate);
-    gst_download_rate_add_rate (&stream->download_rate,
-        gst_buffer_get_size (buffer),
-        1000 * (after_download - before_download));
-  }
-
-  return ret;
+  return stream->last_ret;
 
 no_url_error:
   {
@@ -1100,8 +1420,6 @@
 {
   GstMssDemux *mssdemux = stream->parent;
   GstFlowReturn ret;
-  GstBuffer *buffer = NULL;
-  gboolean buffer_downloaded = FALSE;
   GstEvent *gap = NULL;
   GstEvent *capsevent = NULL;
 
@@ -1115,8 +1433,7 @@
     GST_DEBUG_OBJECT (stream->pad,
         "Activating stream due to reconfigure event");
 
-    cur = GST_CLOCK_TIME_IS_VALID (stream->next_timestamp) ?
-        stream->next_timestamp : 0;
+    cur = stream->segment.position;
 
     if (gst_pad_peer_query_position (stream->pad, GST_FORMAT_TIME, &pos)) {
       ts = (GstClockTime) pos;
@@ -1129,7 +1446,7 @@
     }
 
     /* we might have already pushed this data */
-    ts = MAX (ts, stream->next_timestamp);
+    ts = MAX (ts, cur);
 
     GST_DEBUG_OBJECT (stream->pad, "Restarting stream at "
         "position %" GST_TIME_FORMAT, GST_TIME_ARGS (ts));
@@ -1153,32 +1470,21 @@
   if (G_UNLIKELY (capsevent != NULL))
     gst_pad_push_event (stream->pad, capsevent);
 
-  ret = gst_mss_demux_stream_download_fragment (stream, &buffer);
-  buffer_downloaded = buffer != NULL;
+  ret = gst_mss_demux_stream_download_fragment (stream);
 
   GST_OBJECT_LOCK (mssdemux);
   if (stream->cancelled) {
-    if (buffer)
-      gst_buffer_unref (buffer);
     GST_OBJECT_UNLOCK (mssdemux);
-    goto cancelled;
-  }
-  GST_OBJECT_UNLOCK (mssdemux);
-
-  if (buffer) {
-    ret = gst_mss_demux_stream_push (stream, buffer);
-  }
-
-  GST_OBJECT_LOCK (mssdemux);
-  stream->last_ret = ret;
-
-  if (stream->cancelled) {
-    GST_OBJECT_UNLOCK (mssdemux);
+    stream->last_ret = GST_FLOW_FLUSHING;
     goto cancelled;
   }
 
   switch (ret) {
     case GST_FLOW_OK:
+      stream->download_error_count = 0;
+      stream->segment.position +=
+          gst_mss_stream_get_fragment_gst_duration (stream->manifest_stream);
+      gst_mss_stream_advance_fragment (stream->manifest_stream);
       break;                    /* all is good, let's go */
 
     case GST_FLOW_EOS:
@@ -1211,16 +1517,9 @@
 
     default:
       if (ret <= GST_FLOW_ERROR) {
-        if (buffer_downloaded) {
-          GST_ERROR_OBJECT (mssdemux, "Error while pushing fragment");
-        } else {
-          GST_WARNING_OBJECT (mssdemux, "Error while downloading fragment");
-          if (++stream->download_error_count >=
-              DOWNLOAD_RATE_MAX_HISTORY_LENGTH) {
-            GST_ELEMENT_ERROR (mssdemux, RESOURCE, NOT_FOUND,
-                (_("Couldn't download fragments")),
-                ("fragment downloading has failed too much consecutive times"));
-          }
+        GST_WARNING_OBJECT (mssdemux, "Error while downloading fragment");
+        if (++stream->download_error_count >= MAX_DOWNLOAD_ERROR_COUNT) {
+          goto download_error;
         }
       }
       break;
@@ -1231,18 +1530,22 @@
     gst_mss_demux_stream_push_event (stream, gst_event_new_eos ());
   }
 
-  if (buffer_downloaded) {
-    stream->download_error_count = 0;
-    gst_mss_stream_advance_fragment (stream->manifest_stream);
-  }
-
+end:
   GST_LOG_OBJECT (stream->pad, "download loop end");
   return;
 
 cancelled:
   {
     GST_DEBUG_OBJECT (stream->pad, "Stream has been cancelled");
-    return;
+    goto end;
+  }
+download_error:
+  {
+    GST_OBJECT_UNLOCK (mssdemux);
+    GST_ELEMENT_ERROR (mssdemux, RESOURCE, NOT_FOUND,
+        (_("Couldn't download fragments")),
+        ("fragment downloading has failed too much consecutive times"));
+    goto end;
   }
 }
 
@@ -1268,44 +1571,6 @@
 }
 
 static gboolean
-gst_mss_demux_stream_push (GstMssDemuxStream * stream, GstBuffer * buf)
-{
-  GstFlowReturn ret;
-
-  if (G_UNLIKELY (stream->pending_newsegment)) {
-    gst_pad_push_event (stream->pad, stream->pending_newsegment);
-    stream->pending_newsegment = NULL;
-  }
-
-  if (GST_BUFFER_TIMESTAMP (buf) != stream->next_timestamp) {
-    GST_DEBUG_OBJECT (stream->pad, "Marking buffer %p as discont buffer:%"
-        GST_TIME_FORMAT " != expected:%" GST_TIME_FORMAT, buf,
-        GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
-        GST_TIME_ARGS (stream->next_timestamp));
-    GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
-  }
-
-  GST_DEBUG_OBJECT (stream->pad,
-      "Pushing buffer %p %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT
-      " discont:%d", buf,
-      GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
-      GST_TIME_ARGS (GST_BUFFER_DURATION (buf)),
-      GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT));
-
-  stream->next_timestamp =
-      GST_BUFFER_TIMESTAMP (buf) + GST_BUFFER_DURATION (buf);
-
-  stream->have_data = TRUE;
-  stream->segment.position = GST_BUFFER_TIMESTAMP (buf);
-
-  ret = gst_pad_push (stream->pad, GST_BUFFER_CAST (buf));
-  GST_DEBUG_OBJECT (stream->pad, "Pushed. result: %d (%s)",
-      ret, gst_flow_get_name (ret));
-
-  return ret;
-}
-
-static gboolean
 gst_mss_demux_stream_push_event (GstMssDemuxStream * stream, GstEvent * event)
 {
   gboolean ret;
diff --git a/ext/smoothstreaming/gstmssdemux.h b/ext/smoothstreaming/gstmssdemux.h
index 72cb1d1..284c59d 100644
--- a/ext/smoothstreaming/gstmssdemux.h
+++ b/ext/smoothstreaming/gstmssdemux.h
@@ -28,7 +28,6 @@
 #include <gst/base/gstdataqueue.h>
 #include "gstmssmanifest.h"
 #include <gst/uridownloader/gsturidownloader.h>
-#include "gstdownloadrate.h"
 
 G_BEGIN_DECLS
 
@@ -61,11 +60,12 @@
 
   GstMssStream *manifest_stream;
 
+#if 0
   GstUriDownloader *downloader;
+#endif
 
-  GstEvent *pending_newsegment;
+  GstEvent *pending_segment;
 
-  GstClockTime next_timestamp;
   GstSegment segment;
 
   /* Downloading task */
@@ -78,13 +78,22 @@
   gboolean cancelled;
   gboolean restart_download;
 
-  GstDownloadRate download_rate;
-
   guint download_error_count;
+
+  /* download tooling */
+  GstElement *src;
+  GstPad *src_srcpad;
+  GMutex fragment_download_lock;
+  GCond fragment_download_cond;
+  gboolean starting_fragment;
+  gint64 download_start_time;
+  gint64 download_total_time;
+  gint64 download_total_bytes;
+  gint current_download_rate;
 };
 
 struct _GstMssDemux {
-  GstElement element;
+  GstBin bin;
 
   /* pads */
   GstPad *sinkpad;
@@ -111,7 +120,7 @@
 };
 
 struct _GstMssDemuxClass {
-  GstElementClass parent_class;
+  GstBinClass parent_class;
 };
 
 GType gst_mss_demux_get_type (void);
diff --git a/ext/srtp/gstsrtpdec.c b/ext/srtp/gstsrtpdec.c
index 876879c..b82a0a6 100644
--- a/ext/srtp/gstsrtpdec.c
+++ b/ext/srtp/gstsrtpdec.c
@@ -124,6 +124,7 @@
   SIGNAL_CLEAR_KEYS,
   SIGNAL_SOFT_LIMIT,
   SIGNAL_HARD_LIMIT,
+  SIGNAL_REMOVE_KEY,
   LAST_SIGNAL
 };
 
@@ -169,6 +170,7 @@
 G_DEFINE_TYPE (GstSrtpDec, gst_srtp_dec, GST_TYPE_ELEMENT);
 
 static void gst_srtp_dec_clear_streams (GstSrtpDec * filter);
+static void gst_srtp_dec_remove_stream (GstSrtpDec * filter, guint ssrc);
 
 static gboolean gst_srtp_dec_sink_event_rtp (GstPad * pad, GstObject * parent,
     GstEvent * event);
@@ -201,7 +203,6 @@
 {
   guint32 ssrc;
 
-  GstCaps *caps;
   GstBuffer *key;
   GstSrtpCipherType rtp_cipher;
   GstSrtpAuthType rtp_auth;
@@ -240,6 +241,7 @@
   gstelement_class->change_state =
       GST_DEBUG_FUNCPTR (gst_srtp_dec_change_state);
   klass->clear_streams = GST_DEBUG_FUNCPTR (gst_srtp_dec_clear_streams);
+  klass->remove_stream = GST_DEBUG_FUNCPTR (gst_srtp_dec_remove_stream);
 
   /**
    * GstSrtpDec::request-key:
@@ -297,6 +299,20 @@
   gst_srtp_dec_signals[SIGNAL_HARD_LIMIT] =
       g_signal_new ("hard-limit", G_TYPE_FROM_CLASS (klass),
       G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, GST_TYPE_CAPS, 1, G_TYPE_UINT);
+
+  /**
+   * GstSrtpDec::remove-key:
+   * @gstsrtpdec: the element on which the signal is emitted
+   * @ssrc: The SSRC for which to remove the key.
+   *
+   * Removes keys for a specific SSRC
+   */
+  gst_srtp_dec_signals[SIGNAL_REMOVE_KEY] =
+      g_signal_new ("remove-key", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+      G_STRUCT_OFFSET (GstSrtpDecClass, remove_stream), NULL, NULL, NULL,
+      G_TYPE_NONE, 1, G_TYPE_UINT);
+
 }
 
 /* initialize the new element
@@ -356,10 +372,13 @@
 }
 
 static void
-remove_stream_by_ssrc (GstSrtpDec * filter, guint32 ssrc)
+gst_srtp_dec_remove_stream (GstSrtpDec * filter, guint ssrc)
 {
   GstSrtpDecSsrcStream *stream = NULL;
 
+  if (filter->streams == NULL)
+    return;
+
   stream = g_hash_table_lookup (filter->streams, GUINT_TO_POINTER (ssrc));
 
   if (stream) {
@@ -547,6 +566,14 @@
   return request_key_with_signal (filter, *ssrc, SIGNAL_REQUEST_KEY);
 }
 
+static void
+free_stream (GstSrtpDecSsrcStream * stream)
+{
+  if (stream->key)
+    gst_buffer_unref (stream->key);
+  g_slice_free (GstSrtpDecSsrcStream, stream);
+}
+
 /* Create new stream from params in caps
  */
 static GstSrtpDecSsrcStream *
@@ -554,15 +581,41 @@
     GstCaps * caps)
 {
   GstSrtpDecSsrcStream *stream = NULL;
+  GstSrtpDecSsrcStream *old_stream = NULL;
   err_status_t err;
 
   g_return_val_if_fail (GST_IS_SRTP_DEC (filter), NULL);
   g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
 
-  /* Remove existing stream, if any */
-  remove_stream_by_ssrc (filter, ssrc);
   stream = get_stream_from_caps (filter, caps, ssrc);
 
+  old_stream = find_stream_by_ssrc (filter, ssrc);
+  if (stream && old_stream &&
+      stream->rtp_cipher == old_stream->rtp_cipher &&
+      stream->rtcp_cipher == old_stream->rtcp_cipher &&
+      stream->rtp_auth == old_stream->rtp_auth &&
+      stream->rtcp_auth == old_stream->rtcp_auth &&
+      stream->key && old_stream->key &&
+      gst_buffer_get_size (stream->key) ==
+      gst_buffer_get_size (old_stream->key)) {
+    GstMapInfo info;
+
+    if (gst_buffer_map (old_stream->key, &info, GST_MAP_READ)) {
+      gboolean equal;
+
+      equal = (gst_buffer_memcmp (stream->key, 0, info.data, info.size) == 0);
+      gst_buffer_unmap (old_stream->key, &info);
+
+      if (equal) {
+        free_stream (stream);
+        return old_stream;
+      }
+    }
+  }
+
+  /* Remove existing stream, if any */
+  gst_srtp_dec_remove_stream (filter, ssrc);
+
   if (stream) {
     /* Create new session stream */
     err = init_session_stream (filter, ssrc, stream);
@@ -578,14 +631,6 @@
   return stream;
 }
 
-static void
-clear_stream (GstSrtpDecSsrcStream * stream)
-{
-  if (stream->key)
-    gst_buffer_unref (stream->key);
-  g_slice_free (GstSrtpDecSsrcStream, stream);
-}
-
 static gboolean
 remove_yes (gpointer key, gpointer value, gpointer user_data)
 {
@@ -1071,7 +1116,7 @@
   switch (transition) {
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       filter->streams = g_hash_table_new_full (g_direct_hash, g_direct_equal,
-          NULL, (GDestroyNotify) clear_stream);
+          NULL, (GDestroyNotify) free_stream);
       filter->rtp_has_segment = FALSE;
       filter->rtcp_has_segment = FALSE;
       break;
diff --git a/ext/srtp/gstsrtpdec.h b/ext/srtp/gstsrtpdec.h
index 9d210fa..8129dc0 100644
--- a/ext/srtp/gstsrtpdec.h
+++ b/ext/srtp/gstsrtpdec.h
@@ -88,6 +88,7 @@
   GstElementClass parent_class;
 
   void (*clear_streams) (GstSrtpDec * filter);
+  void (*remove_stream) (GstSrtpDec * filter, guint ssrc);
 };
 
 GType gst_srtp_dec_get_type (void);
diff --git a/ext/srtp/gstsrtpenc.c b/ext/srtp/gstsrtpenc.c
index 5afaaf7..adee368 100644
--- a/ext/srtp/gstsrtpenc.c
+++ b/ext/srtp/gstsrtpenc.c
@@ -155,28 +155,28 @@
  * describe the real formats here.
  */
 static GstStaticPadTemplate rtp_sink_template =
-GST_STATIC_PAD_TEMPLATE ("rtp_sink_%d",
+GST_STATIC_PAD_TEMPLATE ("rtp_sink_%u",
     GST_PAD_SINK,
     GST_PAD_REQUEST,
     GST_STATIC_CAPS ("application/x-rtp")
     );
 
 static GstStaticPadTemplate rtp_src_template =
-GST_STATIC_PAD_TEMPLATE ("rtp_src_%d",
+GST_STATIC_PAD_TEMPLATE ("rtp_src_%u",
     GST_PAD_SRC,
     GST_PAD_SOMETIMES,
     GST_STATIC_CAPS ("application/x-srtp")
     );
 
 static GstStaticPadTemplate rtcp_sink_template =
-GST_STATIC_PAD_TEMPLATE ("rtcp_sink_%d",
+GST_STATIC_PAD_TEMPLATE ("rtcp_sink_%u",
     GST_PAD_SINK,
     GST_PAD_REQUEST,
     GST_STATIC_CAPS ("application/x-rtcp")
     );
 
 static GstStaticPadTemplate rtcp_src_template =
-GST_STATIC_PAD_TEMPLATE ("rtcp_src_%d",
+GST_STATIC_PAD_TEMPLATE ("rtcp_src_%u",
     GST_PAD_SRC,
     GST_PAD_SOMETIMES,
     GST_STATIC_CAPS ("application/x-srtcp")
@@ -427,14 +427,14 @@
 {
   GstPad *sinkpad, *srcpad;
   gchar *sinkpadname, *srcpadname;
-  gint nb = 0;
+  guint nb = 0;
 
   GST_DEBUG_OBJECT (filter, "creating RTP sink pad");
   sinkpad = gst_pad_new_from_static_template (&rtp_sink_template, name);
 
   sinkpadname = gst_pad_get_name (sinkpad);
-  sscanf (sinkpadname, "rtp_sink_%d", &nb);
-  srcpadname = g_strdup_printf ("rtp_src_%d", nb);
+  sscanf (sinkpadname, "rtp_sink_%u", &nb);
+  srcpadname = g_strdup_printf ("rtp_src_%u", nb);
 
   GST_DEBUG_OBJECT (filter, "creating RTP source pad");
   srcpad = gst_pad_new_from_static_template (&rtp_src_template, srcpadname);
@@ -471,14 +471,14 @@
 {
   GstPad *srcpad, *sinkpad;
   gchar *sinkpadname, *srcpadname;
-  gint nb = 0;
+  guint nb = 0;
 
   GST_DEBUG_OBJECT (filter, "creating RTCP sink pad");
   sinkpad = gst_pad_new_from_static_template (&rtcp_sink_template, name);
 
   sinkpadname = gst_pad_get_name (sinkpad);
-  sscanf (sinkpadname, "rtcp_sink_%d", &nb);
-  srcpadname = g_strdup_printf ("rtcp_src_%d", nb);
+  sscanf (sinkpadname, "rtcp_sink_%u", &nb);
+  srcpadname = g_strdup_printf ("rtcp_src_%u", nb);
 
   GST_DEBUG_OBJECT (filter, "creating RTCP source pad");
   srcpad = gst_pad_new_from_static_template (&rtcp_src_template, srcpadname);
@@ -521,10 +521,10 @@
 
   GST_INFO_OBJECT (element, "New pad requested");
 
-  if (templ == gst_element_class_get_pad_template (klass, "rtp_sink_%d"))
+  if (templ == gst_element_class_get_pad_template (klass, "rtp_sink_%u"))
     return create_rtp_sink (filter, name);
 
-  if (templ == gst_element_class_get_pad_template (klass, "rtcp_sink_%d"))
+  if (templ == gst_element_class_get_pad_template (klass, "rtcp_sink_%u"))
     return create_rtcp_sink (filter, name);
 
   GST_ERROR_OBJECT (element, "Could not find specified template");
diff --git a/gst-libs/gst/gl/cocoa/Makefile.am b/gst-libs/gst/gl/cocoa/Makefile.am
index 9e6422a..b374079 100644
--- a/gst-libs/gst/gl/cocoa/Makefile.am
+++ b/gst-libs/gst/gl/cocoa/Makefile.am
@@ -22,11 +22,10 @@
 libgstgl_cocoa_la_OBJCFLAGS = \
 	-I$(top_srcdir)/gst-libs \
 	-I$(top_builddir)/gst-libs \
-	$(GL_CFLAGS) \
 	$(GL_OBJCFLAGS) \
 	$(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) \
-	$(GST_CFLAGS)
+	$(GST_OBJCFLAGS)
 
 libgstgl_cocoa_la_LDFLAGS = \
 	$(GST_LIB_LDFLAGS) \
diff --git a/gst-libs/gst/gl/cocoa/Makefile.in b/gst-libs/gst/gl/cocoa/Makefile.in
index b2b60b4..8f7a1bb 100644
--- a/gst-libs/gst/gl/cocoa/Makefile.in
+++ b/gst-libs/gst/gl/cocoa/Makefile.in
@@ -713,11 +713,10 @@
 libgstgl_cocoa_la_OBJCFLAGS = \
 	-I$(top_srcdir)/gst-libs \
 	-I$(top_builddir)/gst-libs \
-	$(GL_CFLAGS) \
 	$(GL_OBJCFLAGS) \
 	$(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) \
-	$(GST_CFLAGS)
+	$(GST_OBJCFLAGS)
 
 libgstgl_cocoa_la_LDFLAGS = \
 	$(GST_LIB_LDFLAGS) \
diff --git a/gst-libs/gst/gl/egl/gsteglimagememory.c b/gst-libs/gst/gl/egl/gsteglimagememory.c
index e4a58d3..5a023a5 100644
--- a/gst-libs/gst/gl/egl/gsteglimagememory.c
+++ b/gst-libs/gst/gl/egl/gsteglimagememory.c
@@ -122,7 +122,7 @@
 
   /* Shared memory should not destroy all the data */
   if (!mem->parent) {
-    eglDestroyImageKHR (emem->context->egl_display, emem->image);
+    emem->context->eglDestroyImage (emem->context->egl_display, emem->image);
 
     if (emem->user_data_destroy)
       emem->user_data_destroy (emem->context, emem->user_data);
@@ -163,8 +163,18 @@
   return FALSE;
 }
 
-typedef GstAllocator GstEGLImageAllocator;
-typedef GstAllocatorClass GstEGLImageAllocatorClass;
+typedef struct _GstEGLImageAllocator GstEGLImageAllocator;
+typedef struct _GstEGLImageAllocatorClass GstEGLImageAllocatorClass;
+
+struct _GstEGLImageAllocator
+{
+  GstAllocator parent;
+};
+
+struct _GstEGLImageAllocatorClass
+{
+  GstAllocatorClass parent_class;
+};
 
 GType gst_egl_image_allocator_get_type (void);
 G_DEFINE_TYPE (GstEGLImageAllocator, gst_egl_image_allocator,
@@ -212,7 +222,7 @@
   return allocator;
 }
 
-static GstAllocator *
+static GstEGLImageAllocator *
 gst_egl_image_allocator_obtain (void)
 {
   static GOnce once = G_ONCE_INIT;
@@ -221,7 +231,7 @@
 
   g_return_val_if_fail (once.retval != NULL, NULL);
 
-  return GST_ALLOCATOR (g_object_ref (once.retval));
+  return (GstEGLImageAllocator *) (g_object_ref (once.retval));
 }
 
 void
@@ -239,7 +249,7 @@
 }
 
 static GstMemory *
-gst_egl_image_allocator_wrap (GstAllocator * allocator,
+gst_egl_image_allocator_wrap (GstEGLImageAllocator * allocator,
     GstGLContextEGL * context, EGLImageKHR image, GstVideoGLTextureType type,
     GstMemoryFlags flags, gsize size, gpointer user_data,
     GstEGLImageDestroyNotify user_data_destroy)
@@ -255,7 +265,7 @@
 
   mem = g_slice_new (GstEGLImageMemory);
   gst_memory_init (GST_MEMORY_CAST (mem), flags,
-      allocator, NULL, size, 0, 0, size);
+      GST_ALLOCATOR (allocator), NULL, size, 0, 0, size);
 
   gst_object_unref (allocator);
 
@@ -339,12 +349,14 @@
   EGLImageKHR image = EGL_NO_IMAGE_KHR;
   EGLClientBuffer client_buffer_tex[3] = { 0, 0, 0 };
   GstVideoGLTextureType texture_types[] = { 0, 0, 0, 0 };
-  GstAllocator *allocator = gst_egl_image_allocator_obtain ();
+  GstEGLImageAllocator *allocator = gst_egl_image_allocator_obtain ();
   GstGLContextEGL *context = GST_GL_CONTEXT_EGL (ctx);
 
   g_return_val_if_fail (ctx, FALSE);
   g_return_val_if_fail (info, FALSE);
   g_return_val_if_fail (buffer, FALSE);
+  g_return_val_if_fail (gst_gl_context_check_feature (ctx,
+          "EGL_KHR_image_base"), FALSE);
 
   memset (stride, 0, sizeof (stride));
   memset (offset, 0, sizeof (offset));
@@ -408,7 +420,7 @@
         gst_gl_generate_texture_full (GST_GL_CONTEXT (context), info, 0, stride,
             offset, &size, (GLuint *) & client_buffer_tex[0]);
 
-        image = eglCreateImageKHR (context->egl_display,
+        image = context->eglCreateImage (context->egl_display,
             context->egl_context, EGL_GL_TEXTURE_2D_KHR, client_buffer_tex[0],
             NULL);
         if (eglGetError () != EGL_SUCCESS)
@@ -461,7 +473,7 @@
           gst_gl_generate_texture_full (GST_GL_CONTEXT (context), info, 0,
               stride, offset, size, (GLuint *) & client_buffer_tex[i]);
 
-          image = eglCreateImageKHR (context->egl_display,
+          image = context->eglCreateImage (context->egl_display,
               context->egl_context, EGL_GL_TEXTURE_2D_KHR, client_buffer_tex[i],
               NULL);
           if (eglGetError () != EGL_SUCCESS)
@@ -527,7 +539,7 @@
           gst_gl_generate_texture_full (GST_GL_CONTEXT (context), info, i,
               stride, offset, size, (GLuint *) & client_buffer_tex[i]);
 
-          image = eglCreateImageKHR (context->egl_display,
+          image = context->eglCreateImage (context->egl_display,
               context->egl_context, EGL_GL_TEXTURE_2D_KHR, client_buffer_tex[i],
               NULL);
           if (eglGetError () != EGL_SUCCESS)
@@ -563,7 +575,7 @@
 
 mem_error:
   {
-    GST_ERROR_OBJECT (GST_CAT_DEFAULT, "Failed to create EGLImage");
+    GST_CAT_ERROR (GST_CAT_DEFAULT, "Failed to create EGLImage");
 
     for (i = 0; i < 3; i++) {
       if (client_buffer_tex[i])
diff --git a/gst-libs/gst/gl/egl/gstglcontext_egl.c b/gst-libs/gst/gl/egl/gstglcontext_egl.c
index 06e7a9b..d3c8d96 100644
--- a/gst-libs/gst/gl/egl/gstglcontext_egl.c
+++ b/gst-libs/gst/gl/egl/gstglcontext_egl.c
@@ -53,6 +53,8 @@
     context);
 static gpointer gst_gl_context_egl_get_proc_address (GstGLContext * context,
     const gchar * name);
+static gboolean gst_gl_context_egl_check_feature (GstGLContext * context,
+    const gchar * feature);
 
 G_DEFINE_TYPE (GstGLContextEGL, gst_gl_context_egl, GST_GL_TYPE_CONTEXT);
 
@@ -78,6 +80,8 @@
       GST_DEBUG_FUNCPTR (gst_gl_context_egl_get_gl_platform);
   context_class->get_proc_address =
       GST_DEBUG_FUNCPTR (gst_gl_context_egl_get_proc_address);
+  context_class->check_feature =
+      GST_DEBUG_FUNCPTR (gst_gl_context_egl_check_feature);
 }
 
 static void
@@ -404,6 +408,23 @@
     }
   }
 
+  /* EGLImage functions */
+  if (GST_GL_CHECK_GL_VERSION (majorVersion, minorVersion, 1, 5)) {
+    egl->eglCreateImage = gst_gl_context_get_proc_address (context,
+        "eglCreateImage");
+    egl->eglDestroyImage = gst_gl_context_get_proc_address (context,
+        "eglDestroyImage");
+  } else if (gst_gl_check_extension ("EGL_KHR_image_base", egl_exts)) {
+    egl->eglCreateImage = gst_gl_context_get_proc_address (context,
+        "eglCreateImageKHR");
+    egl->eglDestroyImage = gst_gl_context_get_proc_address (context,
+        "eglDestroyImageKHR");
+  }
+  if (egl->eglCreateImage == NULL || egl->eglDestroyImage == NULL) {
+    egl->eglCreateImage = NULL;
+    egl->eglDestroyImage = NULL;
+  }
+
   if (window)
     gst_object_unref (window);
 
@@ -525,3 +546,16 @@
 
   return result;
 }
+
+static gboolean
+gst_gl_context_egl_check_feature (GstGLContext * context, const gchar * feature)
+{
+  GstGLContextEGL *context_egl = GST_GL_CONTEXT_EGL (context);
+
+  if (g_strcmp0 (feature, "EGL_KHR_image_base") == 0) {
+    return context_egl->eglCreateImage != NULL &&
+        context_egl->eglDestroyImage != NULL;
+  }
+
+  return FALSE;
+}
diff --git a/gst-libs/gst/gl/egl/gstglcontext_egl.h b/gst-libs/gst/gl/egl/gstglcontext_egl.h
index 5e84d3e..9601865 100644
--- a/gst-libs/gst/gl/egl/gstglcontext_egl.h
+++ b/gst-libs/gst/gl/egl/gstglcontext_egl.h
@@ -45,6 +45,10 @@
   EGLConfig  egl_config;
 
   GstGLAPI gl_api;
+
+  EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+      EGLClientBuffer buffer, const EGLint *attrib_list);
+  EGLBoolean (*eglDestroyImage) (EGLDisplay dpy, EGLImageKHR image);
 };
 
 struct _GstGLContextEGLClass {
diff --git a/gst-libs/gst/gl/gstglbufferpool.c b/gst-libs/gst/gl/gstglbufferpool.c
index b3df2a0..517d05e 100644
--- a/gst-libs/gst/gl/gstglbufferpool.c
+++ b/gst-libs/gst/gl/gstglbufferpool.c
@@ -175,16 +175,9 @@
   GstGLBufferPool *glpool = GST_GL_BUFFER_POOL_CAST (pool);
   GstGLBufferPoolPrivate *priv = glpool->priv;
 
-  if (!gst_gl_upload_init_format (glpool->upload, &priv->info))
-    goto upload_error;
+  gst_gl_upload_set_format (glpool->upload, &priv->info);
 
   return GST_BUFFER_POOL_CLASS (parent_class)->start (pool);
-
-upload_error:
-  {
-    GST_WARNING_OBJECT (glpool, "Failed to initialize upload");
-    return FALSE;
-  }
 }
 
 /* This function handles GstBuffer creation */
diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c
index eb8143f..5882057 100644
--- a/gst-libs/gst/gl/gstglcolorconvert.c
+++ b/gst-libs/gst/gl/gstglcolorconvert.c
@@ -48,9 +48,8 @@
 #define USING_GLES3(context) (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES3)
 
 static void _do_convert (GstGLContext * context, GstGLColorConvert * convert);
-static void _init_convert (GstGLContext * context, GstGLColorConvert * convert);
-static gboolean _init_convert_fbo (GstGLContext * context,
-    GstGLColorConvert * convert);
+static gboolean _init_convert (GstGLColorConvert * convert);
+static gboolean _init_convert_fbo (GstGLColorConvert * convert);
 static gboolean _gst_gl_color_convert_perform_unlocked (GstGLColorConvert *
     convert, GstGLMemory * in_tex[GST_VIDEO_MAX_PLANES],
     GstGLMemory * out_tex[GST_VIDEO_MAX_PLANES]);
@@ -134,6 +133,7 @@
       "void main(void)\n"
       "{\n"
       " vec4 t = texture2D(tex, v_texcoord * tex_scale0);\n"
+      " %s\n" /* clobber alpha channel? */
       " gl_FragColor = vec4(t.%c, t.%c, t.%c, t.%c);\n"
       "}";
 
@@ -176,13 +176,13 @@
     YUV_TO_RGB_COEFFICIENTS
     "void main(void) {\n"
     "  float r,g,b,a;\n"
-    "  vec3 yuv;\n"
-    "  yuv  = texture2D(tex,v_texcoord * tex_scale0).gba;\n"
-    "  yuv += offset;\n"
-    "  r = dot(yuv, coeff1);\n"
-    "  g = dot(yuv, coeff2);\n"
-    "  b = dot(yuv, coeff3);\n"
-    "  a = 1.0;\n"
+    "  vec4 texel;\n"
+    "  texel = texture2D(tex, v_texcoord * tex_scale0);\n"
+    "  texel.gba += offset;\n"
+    "  r = dot(texel.gba, coeff1);\n"
+    "  g = dot(texel.gba, coeff2);\n"
+    "  b = dot(texel.gba, coeff3);\n"
+    "  a = texel.r;\n"
     "  gl_FragColor=vec4(%c,%c,%c,%c);\n"
     "}";
 
@@ -195,7 +195,7 @@
     RGB_TO_YUV_COEFFICIENTS
     "void main(void) {\n"
     "  vec4 texel;\n"
-    "  float y, u, v;\n"
+    "  float y, u, v, a;\n"
     "  texel = texture2D(tex, v_texcoord).%c%c%c%c;\n"
     "  y = dot(texel.rgb, coeff1);\n"
     "  u = dot(texel.rgb, coeff2);\n"
@@ -203,7 +203,8 @@
     "  y += offset.x;\n"
     "  u += offset.y;\n"
     "  v += offset.z;\n"
-    "  gl_FragColor = vec4(1.0,y,u,v);\n"
+    "  a = %s;\n"
+    "  gl_FragColor = vec4(a,y,u,v);\n"
     "}\n";
 
 /** YUV to RGB conversion */
@@ -348,7 +349,6 @@
   gint out_n_textures;
   gchar *frag_prog;
   const gchar *shader_tex_names[GST_VIDEO_MAX_PLANES];
-  gfloat shader_scaling[GST_VIDEO_MAX_PLANES][2];
   gfloat *cms_offset;
   gfloat *cms_coeff1;           /* r,y */
   gfloat *cms_coeff2;           /* g,u */
@@ -374,9 +374,10 @@
 #define DEBUG_INIT \
   GST_DEBUG_CATEGORY_INIT (gst_gl_color_convert_debug, "glconvert", 0, "convert");
 
-G_DEFINE_TYPE_WITH_CODE (GstGLColorConvert, gst_gl_color_convert, G_TYPE_OBJECT,
-    DEBUG_INIT);
+G_DEFINE_TYPE_WITH_CODE (GstGLColorConvert, gst_gl_color_convert,
+    GST_TYPE_OBJECT, DEBUG_INIT);
 static void gst_gl_color_convert_finalize (GObject * object);
+static void gst_gl_color_convert_reset (GstGLColorConvert * convert);
 
 #define GST_GL_COLOR_CONVERT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
     GST_TYPE_GL_COLOR_CONVERT, GstGLColorConvertPrivate))
@@ -415,6 +416,9 @@
   priv = convert->priv;
 
   priv->draw = _do_convert_draw;
+  gst_video_info_set_format (&convert->in_info, GST_VIDEO_FORMAT_ENCODED, 0, 0);
+  gst_video_info_set_format (&convert->out_info, GST_VIDEO_FORMAT_ENCODED, 0,
+      0);
 
   return convert;
 }
@@ -423,10 +427,26 @@
 gst_gl_color_convert_finalize (GObject * object)
 {
   GstGLColorConvert *convert;
-  guint i;
 
   convert = GST_GL_COLOR_CONVERT (object);
 
+  gst_gl_color_convert_reset (convert);
+
+  if (convert->context) {
+    gst_object_unref (convert->context);
+    convert->context = NULL;
+  }
+
+  g_mutex_clear (&convert->lock);
+
+  G_OBJECT_CLASS (gst_gl_color_convert_parent_class)->finalize (object);
+}
+
+static void
+gst_gl_color_convert_reset (GstGLColorConvert * convert)
+{
+  guint i;
+
   if (convert->fbo || convert->depth_buffer) {
     gst_gl_context_del_fbo (convert->context, convert->fbo,
         convert->depth_buffer);
@@ -449,69 +469,49 @@
     gst_memory_unref ((GstMemory *) convert->priv->scratch);
     convert->priv->scratch = NULL;
   }
-
-  if (convert->context) {
-    gst_object_unref (convert->context);
-    convert->context = NULL;
-  }
-
-  g_mutex_clear (&convert->lock);
-
-  G_OBJECT_CLASS (gst_gl_color_convert_parent_class)->finalize (object);
 }
 
-static gboolean
-_gst_gl_color_convert_init_format_unlocked (GstGLColorConvert * convert,
+static void
+_gst_gl_color_convert_set_format_unlocked (GstGLColorConvert * convert,
     GstVideoInfo * in_info, GstVideoInfo * out_info)
 {
-  g_return_val_if_fail (convert != NULL, FALSE);
-  g_return_val_if_fail (in_info, FALSE);
-  g_return_val_if_fail (out_info, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
-      GST_VIDEO_FORMAT_UNKNOWN, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
-      GST_VIDEO_FORMAT_ENCODED, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
-      GST_VIDEO_FORMAT_UNKNOWN, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
-      GST_VIDEO_FORMAT_ENCODED, FALSE);
+  g_return_if_fail (convert != NULL);
+  g_return_if_fail (in_info);
+  g_return_if_fail (out_info);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
+      GST_VIDEO_FORMAT_UNKNOWN);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
+      GST_VIDEO_FORMAT_ENCODED);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
+      GST_VIDEO_FORMAT_UNKNOWN);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
+      GST_VIDEO_FORMAT_ENCODED);
 
-  if (convert->initted) {
-    return TRUE;
-  } else {
-    convert->initted = TRUE;
-  }
+  if (gst_video_info_is_equal (&convert->in_info, in_info) &&
+      gst_video_info_is_equal (&convert->out_info, out_info))
+    return;
 
+  gst_gl_color_convert_reset (convert);
   convert->in_info = *in_info;
   convert->out_info = *out_info;
-
-  gst_gl_context_thread_add (convert->context,
-      (GstGLContextThreadFunc) _init_convert, convert);
-
-  return convert->priv->result;
+  convert->initted = FALSE;
 }
 
 /**
- * gst_gl_color_convert_init_format:
+ * gst_gl_color_convert_set_format:
  * @convert: a #GstGLColorConvert
  * @in_info: input #GstVideoInfo
  * @out_info: output #GstVideoInfo
  *
  * Initializes @convert with the information required for conversion.
- *
- * Returns: whether the initialization was successful
  */
-gboolean
-gst_gl_color_convert_init_format (GstGLColorConvert * convert,
+void
+gst_gl_color_convert_set_format (GstGLColorConvert * convert,
     GstVideoInfo * in_info, GstVideoInfo * out_info)
 {
-  gboolean ret;
-
   g_mutex_lock (&convert->lock);
-  ret = _gst_gl_color_convert_init_format_unlocked (convert, in_info, out_info);
+  _gst_gl_color_convert_set_format_unlocked (convert, in_info, out_info);
   g_mutex_unlock (&convert->lock);
-
-  return ret;
 }
 
 /**
@@ -522,7 +522,7 @@
  *
  * Converts the data contained in in_tex into out_tex using the formats
  * specified by the #GstVideoInfo<!--  -->s passed to
- * gst_gl_color_convert_init_format() 
+ * gst_gl_color_convert_set_format() 
  *
  * Returns: whether the conversion was successful
  */
@@ -542,30 +542,6 @@
   return ret;
 }
 
-/**
- * gst_gl_color_convert_set_texture_scaling:
- * @convert: a #GstGLColorConvert
- * @scaling: array of texture scaling coefficients stored in width, height
- *           order per texture being converted.
- *
- * Scales the input textures by the given amount.  Useful for performing stride
- * scaling in a shader on OpenGL platforms that do not support
- * GL_PIXEL_[UN]PACK_LENGTH such as GL|ES 2.0.
- */
-void
-gst_gl_color_convert_set_texture_scaling (GstGLColorConvert * convert,
-    gfloat scaling[GST_VIDEO_MAX_PLANES][2])
-{
-  guint i;
-
-  g_return_if_fail (convert != NULL);
-
-  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
-    convert->priv->convert_info.shader_scaling[i][0] = scaling[i][0];
-    convert->priv->convert_info.shader_scaling[i][1] = scaling[i][1];
-  }
-}
-
 static gboolean
 _gst_gl_color_convert_perform_unlocked (GstGLColorConvert * convert,
     GstGLMemory * in_tex[GST_VIDEO_MAX_PLANES],
@@ -593,35 +569,21 @@
   gst_gl_context_thread_add (convert->context,
       (GstGLContextThreadFunc) _do_convert, convert);
 
-  return TRUE;
+  return convert->priv->result;
 }
 
-static gboolean
-_create_shader (GstGLContext * context, const gchar * vertex_src,
-    const gchar * fragment_src, GstGLShader ** out_shader)
+static inline gboolean
+_is_RGBx (GstVideoFormat v_format)
 {
-  GstGLShader *shader;
-  GError *error = NULL;
-
-  g_return_val_if_fail (vertex_src != NULL || fragment_src != NULL, FALSE);
-
-  shader = gst_gl_shader_new (context);
-
-  if (vertex_src)
-    gst_gl_shader_set_vertex_source (shader, vertex_src);
-  if (fragment_src)
-    gst_gl_shader_set_fragment_source (shader, fragment_src);
-
-  if (!gst_gl_shader_compile (shader, &error)) {
-    gst_gl_context_set_error (context, "%s", error->message);
-    g_error_free (error);
-    gst_gl_context_clear_shader (context);
-    gst_object_unref (shader);
-    return FALSE;
+  switch (v_format) {
+    case GST_VIDEO_FORMAT_RGBx:
+    case GST_VIDEO_FORMAT_xRGB:
+    case GST_VIDEO_FORMAT_BGRx:
+    case GST_VIDEO_FORMAT_xBGR:
+      return TRUE;
+    default:
+      return FALSE;
   }
-
-  *out_shader = shader;
-  return TRUE;
 }
 
 static inline gchar
@@ -704,7 +666,7 @@
 }
 
 static void
-_RGB_to_RGB (GstGLContext * context, GstGLColorConvert * convert)
+_RGB_to_RGB (GstGLColorConvert * convert)
 {
   struct ConvertInfo *info = &convert->priv->convert_info;
   GstVideoFormat in_format = GST_VIDEO_INFO_FORMAT (&convert->in_info);
@@ -712,18 +674,21 @@
   GstVideoFormat out_format = GST_VIDEO_INFO_FORMAT (&convert->out_info);
   const gchar *out_format_str = gst_video_format_to_string (out_format);
   gchar *pixel_order = _RGB_pixel_order (in_format_str, out_format_str);
+  gchar *alpha = NULL;
 
   info->in_n_textures = 1;
   info->out_n_textures = 1;
-  info->frag_prog = g_strdup_printf (frag_REORDER, pixel_order[0],
-      pixel_order[1], pixel_order[2], pixel_order[3]);
+  if (_is_RGBx (in_format))
+    alpha = g_strdup_printf ("t.%c = 1.0;", pixel_order[3]);
+  info->frag_prog = g_strdup_printf (frag_REORDER, alpha ? alpha : "",
+      pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
   info->shader_tex_names[0] = "tex";
-  info->shader_scaling[0][0] = 1.0f;
-  info->shader_scaling[0][1] = 1.0f;
+
+  g_free (alpha);
 }
 
 static void
-_YUV_to_RGB (GstGLContext * context, GstGLColorConvert * convert)
+_YUV_to_RGB (GstGLColorConvert * convert)
 {
   struct ConvertInfo *info = &convert->priv->convert_info;
   GstVideoFormat out_format = GST_VIDEO_INFO_FORMAT (&convert->out_info);
@@ -732,13 +697,6 @@
 
   info->out_n_textures = 1;
 
-  info->shader_scaling[0][0] = 1.0f;
-  info->shader_scaling[0][1] = 1.0f;
-  info->shader_scaling[1][0] = 1.0f;
-  info->shader_scaling[1][1] = 1.0f;
-  info->shader_scaling[2][0] = 1.0f;
-  info->shader_scaling[2][1] = 1.0f;
-
   switch (GST_VIDEO_INFO_FORMAT (&convert->in_info)) {
     case GST_VIDEO_FORMAT_AYUV:
       info->frag_prog = g_strdup_printf (frag_AYUV_to_RGB, pixel_order[0],
@@ -769,11 +727,12 @@
       info->frag_prog = g_strdup_printf (frag_YUY2_UYVY_to_RGB, 'r', 'g', 'a',
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
       info->in_n_textures = 1;
-      info->shader_tex_names[1] = "Ytex";
-      info->shader_tex_names[0] = "UVtex";
-      convert->priv->scratch = (GstGLMemory *) gst_gl_memory_alloc (context,
-          GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA,
-          GST_VIDEO_INFO_WIDTH (&convert->in_info),
+      info->shader_tex_names[0] = "Ytex";
+      info->shader_tex_names[1] = "UVtex";
+      convert->priv->scratch =
+          (GstGLMemory *) gst_gl_memory_alloc (convert->context,
+          GST_VIDEO_GL_TEXTURE_TYPE_RGBA,
+          GST_VIDEO_INFO_COMP_WIDTH (&convert->in_info, 1),
           GST_VIDEO_INFO_HEIGHT (&convert->in_info),
           GST_VIDEO_INFO_PLANE_STRIDE (&convert->in_info, 0));
       break;
@@ -795,11 +754,12 @@
       info->frag_prog = g_strdup_printf (frag_YUY2_UYVY_to_RGB, 'a', 'r', 'b',
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
       info->in_n_textures = 1;
-      info->shader_tex_names[1] = "Ytex";
-      info->shader_tex_names[0] = "UVtex";
-      convert->priv->scratch = (GstGLMemory *) gst_gl_memory_alloc (context,
-          GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA,
-          GST_VIDEO_INFO_WIDTH (&convert->in_info),
+      info->shader_tex_names[0] = "Ytex";
+      info->shader_tex_names[1] = "UVtex";
+      convert->priv->scratch =
+          (GstGLMemory *) gst_gl_memory_alloc (convert->context,
+          GST_VIDEO_GL_TEXTURE_TYPE_RGBA,
+          GST_VIDEO_INFO_COMP_WIDTH (&convert->in_info, 1),
           GST_VIDEO_INFO_HEIGHT (&convert->in_info),
           GST_VIDEO_INFO_PLANE_STRIDE (&convert->in_info, 0));
       break;
@@ -825,29 +785,24 @@
 }
 
 static void
-_RGB_to_YUV (GstGLContext * context, GstGLColorConvert * convert)
+_RGB_to_YUV (GstGLColorConvert * convert)
 {
   struct ConvertInfo *info = &convert->priv->convert_info;
   GstVideoFormat in_format = GST_VIDEO_INFO_FORMAT (&convert->in_info);
   const gchar *in_format_str = gst_video_format_to_string (in_format);
   gchar *pixel_order = _RGB_pixel_order (in_format_str, "rgba");
+  const gchar *alpha;
 
   info->frag_prog = NULL;
   info->in_n_textures = 1;
 
   info->shader_tex_names[0] = "tex";
 
-  info->shader_scaling[0][0] = 1.0f;
-  info->shader_scaling[0][1] = 1.0f;
-  info->shader_scaling[1][0] = 1.0f;
-  info->shader_scaling[1][1] = 1.0f;
-  info->shader_scaling[2][0] = 1.0f;
-  info->shader_scaling[2][1] = 1.0f;
-
   switch (GST_VIDEO_INFO_FORMAT (&convert->out_info)) {
     case GST_VIDEO_FORMAT_AYUV:
+      alpha = _is_RGBx (in_format) ? "1.0" : "texel.a";
       info->frag_prog = g_strdup_printf (frag_RGB_to_AYUV, pixel_order[0],
-          pixel_order[1], pixel_order[2], pixel_order[3]);
+          pixel_order[1], pixel_order[2], pixel_order[3], alpha);
       info->out_n_textures = 1;
       break;
     case GST_VIDEO_FORMAT_I420:
@@ -896,35 +851,35 @@
 }
 
 static void
-_RGB_to_GRAY (GstGLContext * context, GstGLColorConvert * convert)
+_RGB_to_GRAY (GstGLColorConvert * convert)
 {
   struct ConvertInfo *info = &convert->priv->convert_info;
   GstVideoFormat in_format = GST_VIDEO_INFO_FORMAT (&convert->in_info);
   const gchar *in_format_str = gst_video_format_to_string (in_format);
   gchar *pixel_order = _RGB_pixel_order (in_format_str, "rgba");
+  gchar *alpha = NULL;
 
   info->in_n_textures = 1;
   info->out_n_textures = 1;
   info->shader_tex_names[0] = "tex";
-  info->shader_scaling[0][0] = 1.0f;
-  info->shader_scaling[0][1] = 1.0f;
-  info->shader_scaling[1][0] = 1.0f;
-  info->shader_scaling[1][1] = 1.0f;
-  info->shader_scaling[2][0] = 1.0f;
-  info->shader_scaling[2][1] = 1.0f;
+
+  if (_is_RGBx (in_format))
+    alpha = g_strdup_printf ("t.%c = 1.0;", pixel_order[3]);
 
   switch (GST_VIDEO_INFO_FORMAT (&convert->out_info)) {
     case GST_VIDEO_FORMAT_GRAY8:
-      info->frag_prog = g_strdup_printf (frag_REORDER, pixel_order[0],
-          pixel_order[0], pixel_order[0], pixel_order[3]);
+      info->frag_prog = g_strdup_printf (frag_REORDER, alpha ? alpha : "",
+          pixel_order[0], pixel_order[0], pixel_order[0], pixel_order[3]);
       break;
     default:
       break;
   }
+
+  g_free (alpha);
 }
 
 static void
-_GRAY_to_RGB (GstGLContext * context, GstGLColorConvert * convert)
+_GRAY_to_RGB (GstGLColorConvert * convert)
 {
   struct ConvertInfo *info = &convert->priv->convert_info;
   GstVideoFormat out_format = GST_VIDEO_INFO_FORMAT (&convert->out_info);
@@ -934,16 +889,10 @@
   info->in_n_textures = 1;
   info->out_n_textures = 1;
   info->shader_tex_names[0] = "tex";
-  info->shader_scaling[0][0] = 1.0f;
-  info->shader_scaling[0][1] = 1.0f;
-  info->shader_scaling[1][0] = 1.0f;
-  info->shader_scaling[1][1] = 1.0f;
-  info->shader_scaling[2][0] = 1.0f;
-  info->shader_scaling[2][1] = 1.0f;
 
   switch (GST_VIDEO_INFO_FORMAT (&convert->in_info)) {
     case GST_VIDEO_FORMAT_GRAY8:
-      info->frag_prog = g_strdup_printf (frag_REORDER, pixel_order[0],
+      info->frag_prog = g_strdup_printf (frag_REORDER, "", pixel_order[0],
           pixel_order[1], pixel_order[2], pixel_order[3]);
       break;
     case GST_VIDEO_FORMAT_GRAY16_LE:
@@ -960,53 +909,56 @@
 }
 
 /* Called in the gl thread */
-void
-_init_convert (GstGLContext * context, GstGLColorConvert * convert)
+static gboolean
+_init_convert (GstGLColorConvert * convert)
 {
   GstGLFuncs *gl;
   gboolean res;
   struct ConvertInfo *info = &convert->priv->convert_info;
   gint i;
 
-  gl = context->gl_vtable;
+  gl = convert->context->gl_vtable;
+
+  if (convert->initted)
+    return TRUE;
 
   GST_INFO ("Initializing color conversion from %s to %s",
       gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->in_info)),
       gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->out_info)));
 
   if (!gl->CreateProgramObject && !gl->CreateProgram) {
-    gst_gl_context_set_error (context,
+    gst_gl_context_set_error (convert->context,
         "Cannot perform color conversion without OpenGL shaders");
     goto error;
   }
 
   if (GST_VIDEO_INFO_IS_RGB (&convert->in_info)) {
     if (GST_VIDEO_INFO_IS_RGB (&convert->out_info)) {
-      _RGB_to_RGB (context, convert);
+      _RGB_to_RGB (convert);
     }
   }
 
   if (GST_VIDEO_INFO_IS_YUV (&convert->in_info)) {
     if (GST_VIDEO_INFO_IS_RGB (&convert->out_info)) {
-      _YUV_to_RGB (context, convert);
+      _YUV_to_RGB (convert);
     }
   }
 
   if (GST_VIDEO_INFO_IS_RGB (&convert->in_info)) {
     if (GST_VIDEO_INFO_IS_YUV (&convert->out_info)) {
-      _RGB_to_YUV (context, convert);
+      _RGB_to_YUV (convert);
     }
   }
 
   if (GST_VIDEO_INFO_IS_RGB (&convert->in_info)) {
     if (GST_VIDEO_INFO_IS_GRAY (&convert->out_info)) {
-      _RGB_to_GRAY (context, convert);
+      _RGB_to_GRAY (convert);
     }
   }
 
   if (GST_VIDEO_INFO_IS_GRAY (&convert->in_info)) {
     if (GST_VIDEO_INFO_IS_RGB (&convert->out_info)) {
-      _GRAY_to_RGB (context, convert);
+      _GRAY_to_RGB (convert);
     }
   }
 
@@ -1014,15 +966,16 @@
     goto unhandled_format;
 
   /* multiple draw targets not supported on GLES2...yet */
-  if (info->out_n_textures > 1 && (!gl->DrawBuffers || USING_GLES2 (context))) {
+  if (info->out_n_textures > 1 && (!gl->DrawBuffers ||
+          USING_GLES2 (convert->context))) {
     g_free (info->frag_prog);
     GST_ERROR ("Conversion requires output to multiple draw buffers");
     goto incompatible_api;
   }
 
   res =
-      _create_shader (context, text_vertex_shader, info->frag_prog,
-      &convert->shader);
+      gst_gl_context_gen_shader (convert->context, text_vertex_shader,
+      info->frag_prog, &convert->shader);
   g_free (info->frag_prog);
   if (!res)
     goto error;
@@ -1047,69 +1000,64 @@
   }
 
   for (i = info->in_n_textures; i >= 0; i--) {
-    gchar *scale_name = g_strdup_printf ("tex_scale%u", i);
-
     if (info->shader_tex_names[i])
       gst_gl_shader_set_uniform_1i (convert->shader, info->shader_tex_names[i],
           i);
-    gst_gl_shader_set_uniform_2fv (convert->shader, scale_name, 1,
-        info->shader_scaling[i]);
-
-    g_free (scale_name);
   }
 
   gst_gl_shader_set_uniform_1f (convert->shader, "width",
       GST_VIDEO_INFO_WIDTH (&convert->in_info));
 
-  gst_gl_context_clear_shader (context);
+  gst_gl_context_clear_shader (convert->context);
 
-  if (!_init_convert_fbo (context, convert)) {
+  if (!_init_convert_fbo (convert)) {
     goto error;
   }
 
   gl->BindTexture (GL_TEXTURE_2D, 0);
 
-  convert->priv->result = TRUE;
-  return;
+  convert->initted = TRUE;
+
+  return TRUE;
 
 unhandled_format:
-  gst_gl_context_set_error (context, "Don't know how to convert from %s to %s",
+  gst_gl_context_set_error (convert->context,
+      "Don't know how to convert from %s to %s",
       gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->in_info)),
       gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->out_info)));
 
 error:
-  convert->priv->result = FALSE;
-  return;
+  return FALSE;
 
 incompatible_api:
   {
-    gst_gl_context_set_error (context, "Converting from %s to %s requires "
+    gst_gl_context_set_error (convert->context,
+        "Converting from %s to %s requires "
         "functionality that the current OpenGL setup does not support",
         gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->in_info)),
         gst_video_format_to_string (GST_VIDEO_INFO_FORMAT
             (&convert->out_info)));
-    convert->priv->result = FALSE;
-    return;
+    return FALSE;
   }
 }
 
 
 /* called by _init_convert (in the gl thread) */
-gboolean
-_init_convert_fbo (GstGLContext * context, GstGLColorConvert * convert)
+static gboolean
+_init_convert_fbo (GstGLColorConvert * convert)
 {
   GstGLFuncs *gl;
   guint out_width, out_height;
   GLuint fake_texture = 0;      /* a FBO must hava texture to init */
 
-  gl = context->gl_vtable;
+  gl = convert->context->gl_vtable;
 
   out_width = GST_VIDEO_INFO_WIDTH (&convert->out_info);
   out_height = GST_VIDEO_INFO_HEIGHT (&convert->out_info);
 
   if (!gl->GenFramebuffers) {
     /* turn off the pipeline because Frame buffer object is a not present */
-    gst_gl_context_set_error (context,
+    gst_gl_context_set_error (convert->context,
         "Context, EXT_framebuffer_object supported: no");
     return FALSE;
   }
@@ -1123,13 +1071,13 @@
   /* setup the render buffer for depth */
   gl->GenRenderbuffers (1, &convert->depth_buffer);
   gl->BindRenderbuffer (GL_RENDERBUFFER, convert->depth_buffer);
-  if (USING_OPENGL (context)) {
+  if (USING_OPENGL (convert->context)) {
     gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT,
         out_width, out_height);
     gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
         out_width, out_height);
   }
-  if (USING_GLES2 (context)) {
+  if (USING_GLES2 (convert->context)) {
     gl->RenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
         out_width, out_height);
   }
@@ -1152,13 +1100,14 @@
   gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
       GL_RENDERBUFFER, convert->depth_buffer);
 
-  if (USING_OPENGL (context)) {
+  if (USING_OPENGL (convert->context)) {
     gl->FramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
         GL_RENDERBUFFER, convert->depth_buffer);
   }
 
-  if (!gst_gl_context_check_framebuffer_status (context)) {
-    gst_gl_context_set_error (context, "GL framebuffer status incomplete");
+  if (!gst_gl_context_check_framebuffer_status (convert->context)) {
+    gst_gl_context_set_error (convert->context,
+        "GL framebuffer status incomplete");
     return FALSE;
   }
 
@@ -1185,6 +1134,11 @@
   in_width = GST_VIDEO_INFO_WIDTH (&convert->in_info);
   in_height = GST_VIDEO_INFO_HEIGHT (&convert->in_info);
 
+  if (!_init_convert (convert)) {
+    convert->priv->result = FALSE;
+    return;
+  }
+
   GST_TRACE ("converting to textures:%p,%p,%p,%p dimensions:%ux%u, "
       "from textures:%p,%p,%p,%p dimensions:%ux%u", convert->out_tex[0],
       convert->out_tex[1], convert->out_tex[2], convert->out_tex[3],
@@ -1325,11 +1279,20 @@
   gl->EnableVertexAttribArray (convert->shader_attr_texture_loc);
 
   if (convert->priv->scratch) {
+    gchar *scale_name = g_strdup_printf ("tex_scale%u", c_info->in_n_textures);
+
     gl->ActiveTexture (GL_TEXTURE0 + c_info->in_n_textures);
     gl->BindTexture (GL_TEXTURE_2D, convert->priv->scratch->tex_id);
+
+    gst_gl_shader_set_uniform_2fv (convert->shader, scale_name, 1,
+        convert->priv->scratch->tex_scaling);
+
+    g_free (scale_name);
   }
 
   for (i = c_info->in_n_textures - 1; i >= 0; i--) {
+    gchar *scale_name = g_strdup_printf ("tex_scale%u", i);
+
     gl->ActiveTexture (GL_TEXTURE0 + i);
     gl->BindTexture (GL_TEXTURE_2D, convert->in_tex[i]->tex_id);
 
@@ -1337,6 +1300,11 @@
     gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+    gst_gl_shader_set_uniform_2fv (convert->shader, scale_name, 1,
+        convert->in_tex[i]->tex_scaling);
+
+    g_free (scale_name);
   }
 
   gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
diff --git a/gst-libs/gst/gl/gstglcolorconvert.h b/gst-libs/gst/gl/gstglcolorconvert.h
index 9b416a5..976653d 100644
--- a/gst-libs/gst/gl/gstglcolorconvert.h
+++ b/gst-libs/gst/gl/gstglcolorconvert.h
@@ -44,7 +44,7 @@
 struct _GstGLColorConvert
 {
   /* <private> */
-  GObject          parent;
+  GstObject        parent;
 
   GMutex           lock;
 
@@ -79,7 +79,7 @@
  */
 struct _GstGLColorConvertClass
 {
-  GObjectClass object_class;
+  GstObjectClass object_class;
 };
 
 /**
@@ -101,12 +101,9 @@
 
 GstGLColorConvert * gst_gl_color_convert_new (GstGLContext * context);
 
-gboolean gst_gl_color_convert_init_format    (GstGLColorConvert * convert,
-                                              GstVideoInfo * in_info,
-                                              GstVideoInfo * out_info);
-
-void     gst_gl_color_convert_set_texture_scaling (GstGLColorConvert * convert,
-                                                   gfloat scaling[GST_VIDEO_MAX_PLANES][2]);
+void     gst_gl_color_convert_set_format    (GstGLColorConvert * convert,
+                                             GstVideoInfo * in_info,
+                                             GstVideoInfo * out_info);
 
 gboolean gst_gl_color_convert_perform        (GstGLColorConvert * convert,
                                               GstGLMemory * in_tex[GST_VIDEO_MAX_PLANES],
diff --git a/gst-libs/gst/gl/gstglcontext.c b/gst-libs/gst/gl/gstglcontext.c
index 8b5ab29..a2f1909 100644
--- a/gst-libs/gst/gl/gstglcontext.c
+++ b/gst-libs/gst/gl/gstglcontext.c
@@ -65,12 +65,6 @@
 #include "eagl/gstglcontext_eagl.h"
 #endif
 
-#define USING_OPENGL(display) (display->gl_api & GST_GL_API_OPENGL)
-#define USING_OPENGL3(display) (display->gl_api & GST_GL_API_OPENGL3)
-#define USING_GLES(display) (display->gl_api & GST_GL_API_GLES)
-#define USING_GLES2(display) (display->gl_api & GST_GL_API_GLES2)
-#define USING_GLES3(display) (display->gl_api & GST_GL_API_GLES3)
-
 static GModule *module_self;
 
 #if GST_GL_HAVE_OPENGL
@@ -128,7 +122,7 @@
 GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
 
 #define gst_gl_context_parent_class parent_class
-G_DEFINE_ABSTRACT_TYPE (GstGLContext, gst_gl_context, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE (GstGLContext, gst_gl_context, GST_TYPE_OBJECT);
 
 #define GST_GL_CONTEXT_GET_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_GL_TYPE_CONTEXT, GstGLContextPrivate))
@@ -726,10 +720,9 @@
 {
   GstGLContextClass *context_class;
   GstGLWindowClass *window_class;
-  GstGLDisplay *display;
   GstGLFuncs *gl;
   gboolean ret = FALSE;
-  GstGLAPI compiled_api, user_api;
+  GstGLAPI compiled_api, user_api, gl_api;
   gchar *api_string;
   gchar *compiled_api_s;
   gchar *user_api_string;
@@ -748,11 +741,12 @@
   window_class = GST_GL_WINDOW_GET_CLASS (context->window);
 
   if (window_class->open) {
-    if (!window_class->open (context->window, error))
+    if (!window_class->open (context->window, error)) {
+      g_assert (error == NULL || *error != NULL);
       goto failure;
+    }
   }
 
-  display = context->priv->display;
   gl = context->gl_vtable;
   compiled_api = _compiled_api ();
 
@@ -801,14 +795,13 @@
     goto failure;
   }
 
-  display->gl_api = gst_gl_context_get_gl_api (context);
-  g_assert (display->gl_api != GST_GL_API_NONE
-      && display->gl_api != GST_GL_API_ANY);
+  gl_api = gst_gl_context_get_gl_api (context);
+  g_assert (gl_api != GST_GL_API_NONE && gl_api != GST_GL_API_ANY);
 
-  api_string = gst_gl_api_to_string (display->gl_api);
+  api_string = gst_gl_api_to_string (gl_api);
   GST_INFO ("available GL APIs: %s", api_string);
 
-  if (((compiled_api & display->gl_api) & user_api) == GST_GL_API_NONE) {
+  if (((compiled_api & gl_api) & user_api) == GST_GL_API_NONE) {
     g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_WRONG_API,
         "failed to create context, context "
         "could not provide correct api. user (%s), compiled (%s), context (%s)",
@@ -835,16 +828,18 @@
   }
 
   /* gl api specific code */
-  if (!ret && USING_OPENGL (display))
+  if (!ret && gl_api & GST_GL_API_OPENGL)
     ret = _create_context_opengl (context, &context->priv->gl_major,
         &context->priv->gl_minor, error);
-  if (!ret && USING_GLES2 (display))
+  if (!ret && gl_api & GST_GL_API_GLES2)
     ret =
         _create_context_gles2 (context, &context->priv->gl_major,
         &context->priv->gl_minor, error);
 
-  if (!ret)
+  if (!ret) {
+    g_assert (error == NULL || *error != NULL);
     goto failure;
+  }
 
   /* GL core contexts and GLES3 */
   if (gl->GetIntegerv && gl->GetStringi && context->priv->gl_major >= 3)
@@ -1037,6 +1032,31 @@
     *min = context->priv->gl_minor;
 }
 
+/**
+ * gst_gl_context_check_feature:
+ * @context: a #GstGLContext
+ * @feature: a platform specific feature
+ *
+ * Some features require that the context be created before it is possible to
+ * determine their existence and so will fail if that is not the case.
+ *
+ * Returns: Whether @feature is supported by @context
+ */
+gboolean
+gst_gl_context_check_feature (GstGLContext * context, const gchar * feature)
+{
+  GstGLContextClass *context_class;
+
+  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
+  g_return_val_if_fail (feature != NULL, FALSE);
+
+  context_class = GST_GL_CONTEXT_GET_CLASS (context);
+  if (!context_class->check_feature)
+    return FALSE;
+
+  return context_class->check_feature (context, feature);
+}
+
 static GstGLAPI
 gst_gl_wrapped_context_get_gl_api (GstGLContext * context)
 {
diff --git a/gst-libs/gst/gl/gstglcontext.h b/gst-libs/gst/gl/gstglcontext.h
index 97e4326..269a51d 100644
--- a/gst-libs/gst/gl/gstglcontext.h
+++ b/gst-libs/gst/gl/gstglcontext.h
@@ -68,7 +68,7 @@
  */
 struct _GstGLContext {
   /*< private >*/
-  GObject parent;
+  GstObject parent;
 
   GstGLWindow  *window;
 
@@ -91,7 +91,7 @@
  * @swap_buffers: swap the default framebuffer's front/back buffers
  */
 struct _GstGLContextClass {
-  GObjectClass parent_class;
+  GstObjectClass parent_class;
 
   guintptr      (*get_gl_context)     (GstGLContext *context);
   GstGLAPI      (*get_gl_api)         (GstGLContext *context);
@@ -103,6 +103,7 @@
                                        GstGLContext *other_context, GError ** error);
   void          (*destroy_context)    (GstGLContext *context);
   void          (*swap_buffers)       (GstGLContext *context);
+  gboolean      (*check_feature)      (GstGLContext *context, const gchar *feature);
 
   /*< private >*/
   gpointer _reserved[GST_PADDING];
@@ -132,6 +133,7 @@
 GstGLWindow * gst_gl_context_get_window (GstGLContext *context);
 
 void          gst_gl_context_get_gl_version (GstGLContext *context, gint *maj, gint *min);
+gboolean      gst_gl_context_check_feature (GstGLContext *context, const gchar *feature);
 
 /* FIXME: remove */
 void gst_gl_context_thread_add (GstGLContext * context,
diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c
index 20cb51e..ad1e79f 100644
--- a/gst-libs/gst/gl/gstgldisplay.c
+++ b/gst-libs/gst/gl/gstgldisplay.c
@@ -55,7 +55,7 @@
   GST_DEBUG_CATEGORY_INIT (gst_gl_display_debug, "gldisplay", 0, "opengl display"); \
   GST_DEBUG_CATEGORY_GET (gst_context, "GST_CONTEXT");
 
-G_DEFINE_TYPE_WITH_CODE (GstGLDisplay, gst_gl_display, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (GstGLDisplay, gst_gl_display, GST_TYPE_OBJECT,
     DEBUG_INIT);
 
 #define GST_GL_DISPLAY_GET_PRIVATE(o) \
@@ -84,7 +84,6 @@
 {
   display->priv = GST_GL_DISPLAY_GET_PRIVATE (display);
 
-  display->gl_api = GST_GL_API_ANY;
   display->type = GST_GL_DISPLAY_TYPE_ANY;
 
   GST_TRACE ("init %p", display);
@@ -99,13 +98,6 @@
 static void
 gst_gl_display_finalize (GObject * object)
 {
-  GstGLDisplay *display = GST_GL_DISPLAY (object);
-
-  if (display->context) {
-    gst_object_unref (display->context);
-    display->context = NULL;
-  }
-
   GST_TRACE ("finalize %p", object);
 
   G_OBJECT_CLASS (gst_gl_display_parent_class)->finalize (object);
@@ -120,7 +112,7 @@
 gst_gl_display_new (void)
 {
   GstGLDisplay *display = NULL;
-  const gchar *user_choice;
+  const gchar *user_choice, *platform_choice;
   static volatile gsize _init = 0;
 
   if (g_once_init_enter (&_init)) {
@@ -130,20 +122,28 @@
   }
 
   user_choice = g_getenv ("GST_GL_WINDOW");
-  GST_INFO ("creating a window, user choice:%s", user_choice);
+  platform_choice = g_getenv ("GST_GL_PLATFORM");
+  GST_INFO ("creating a display, user choice:%s (platform: %s)",
+      GST_STR_NULL (user_choice), GST_STR_NULL (platform_choice));
 
+#if GST_GL_HAVE_WINDOW_COCOA
+  if (!display && (!user_choice || g_strstr_len (user_choice, 5, "cocoa")))
+    display = g_object_new (GST_TYPE_GL_DISPLAY, NULL);
+#endif
 #if GST_GL_HAVE_WINDOW_X11
   if (!display && (!user_choice || g_strstr_len (user_choice, 3, "x11")))
     display = GST_GL_DISPLAY (gst_gl_display_x11_new (NULL));
 #endif
 #if GST_GL_HAVE_PLATFORM_EGL
-  if (!display && (!user_choice || g_strstr_len (user_choice, 3, "egl")))
+  if (!display && (!platform_choice
+          || g_strstr_len (platform_choice, 3, "egl")))
     display = GST_GL_DISPLAY (gst_gl_display_egl_new ());
 #endif
   if (!display) {
     /* subclass returned a NULL window */
-    GST_WARNING ("Could not create display. user specified %s, creating dummy",
-        user_choice ? user_choice : "(null)");
+    GST_WARNING ("Could not create display. user specified %s "
+        "(platform: %s), creating dummy",
+        GST_STR_NULL (user_choice), GST_STR_NULL (platform_choice));
 
     return g_object_new (GST_TYPE_GL_DISPLAY, NULL);
   }
@@ -151,14 +151,6 @@
   return display;
 }
 
-GstGLAPI
-gst_gl_display_get_gl_api (GstGLDisplay * display)
-{
-  g_return_val_if_fail (GST_IS_GL_DISPLAY (display), GST_GL_API_NONE);
-
-  return display->gl_api;
-}
-
 guintptr
 gst_gl_display_get_handle (GstGLDisplay * display)
 {
@@ -178,6 +170,20 @@
 }
 
 /**
+ * gst_gl_display_get_handle_type:
+ * @display: a #GstGLDisplay
+ *
+ * Returns: the #GstGLDisplayType of @display
+ */
+GstGLDisplayType
+gst_gl_display_get_handle_type (GstGLDisplay * display)
+{
+  g_return_val_if_fail (GST_IS_GL_DISPLAY (display), GST_GL_DISPLAY_TYPE_NONE);
+
+  return display->type;
+}
+
+/**
  * gst_context_set_gl_display:
  * @context: a #GstContext
  * @display: resulting #GstGLDisplay
diff --git a/gst-libs/gst/gl/gstgldisplay.h b/gst-libs/gst/gl/gstgldisplay.h
index 0d451f9..09489a6 100644
--- a/gst-libs/gst/gl/gstgldisplay.h
+++ b/gst-libs/gst/gl/gstgldisplay.h
@@ -66,9 +66,6 @@
 
   GstGLDisplayType      type;
 
-  GstGLContext         *context;
-  GstGLAPI              gl_api;
-
   GstGLDisplayPrivate  *priv;
 };
 
@@ -84,9 +81,8 @@
 #define gst_gl_display_lock(display)        GST_OBJECT_LOCK (display)
 #define gst_gl_display_unlock(display)      GST_OBJECT_UNLOCK (display)
 
-GstGLAPI       gst_gl_display_get_gl_api             (GstGLDisplay * display);
-gpointer       gst_gl_display_get_gl_vtable          (GstGLDisplay * display);
-guintptr       gst_gl_display_get_handle             (GstGLDisplay * display);
+guintptr         gst_gl_display_get_handle             (GstGLDisplay * display);
+GstGLDisplayType gst_gl_display_get_handle_type        (GstGLDisplay * display);
 
 #define GST_GL_DISPLAY_CONTEXT_TYPE "gst.gl.GLDisplay"
 void     gst_context_set_gl_display (GstContext * context, GstGLDisplay * display);
diff --git a/gst-libs/gst/gl/gstgldownload.c b/gst-libs/gst/gl/gstgldownload.c
index fd8216e..bef1e9e 100644
--- a/gst-libs/gst/gl/gstgldownload.c
+++ b/gst-libs/gst/gl/gstgldownload.c
@@ -44,9 +44,10 @@
 #define USING_GLES3(context) (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES3)
 
 static void _do_download (GstGLContext * context, GstGLDownload * download);
-static void _init_download (GstGLContext * context, GstGLDownload * download);
+static gboolean _init_download (GstGLDownload * download);
 static gboolean _gst_gl_download_perform_with_data_unlocked (GstGLDownload *
     download, GLuint texture_id, gpointer data[GST_VIDEO_MAX_PLANES]);
+static void gst_gl_download_reset (GstGLDownload * download);
 
 /* *INDENT-ON* */
 
@@ -67,7 +68,7 @@
 #define DEBUG_INIT \
   GST_DEBUG_CATEGORY_INIT (gst_gl_download_debug, "gldownload", 0, "download");
 
-G_DEFINE_TYPE_WITH_CODE (GstGLDownload, gst_gl_download, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (GstGLDownload, gst_gl_download, GST_TYPE_OBJECT,
     DEBUG_INIT);
 static void gst_gl_download_finalize (GObject * object);
 
@@ -116,21 +117,11 @@
 gst_gl_download_finalize (GObject * object)
 {
   GstGLDownload *download;
-  guint i;
 
   download = GST_GL_DOWNLOAD (object);
 
-  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
-    if (download->out_texture[i]) {
-      gst_memory_unref ((GstMemory *) download->out_texture[i]);
-      download->out_texture[i] = NULL;
-    }
-  }
+  gst_gl_download_reset (download);
 
-  if (download->in_texture) {
-    gst_gl_context_del_texture (download->context, &download->in_texture);
-    download->in_texture = 0;
-  }
   if (download->convert) {
     gst_object_unref (download->convert);
     download->convert = NULL;
@@ -146,91 +137,56 @@
   G_OBJECT_CLASS (gst_gl_download_parent_class)->finalize (object);
 }
 
+static void
+gst_gl_download_reset (GstGLDownload * download)
+{
+  guint i;
+
+  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
+    if (download->out_tex[i]) {
+      gst_memory_unref ((GstMemory *) download->out_tex[i]);
+      download->out_tex[i] = NULL;
+    }
+  }
+
+  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
+    if (download->in_tex[i]) {
+      gst_memory_unref ((GstMemory *) download->in_tex[i]);
+      download->in_tex[i] = NULL;
+    }
+  }
+}
+
 /**
- * gst_gl_download_init_format:
+ * gst_gl_download_set_format:
  * @download: a #GstGLDownload
  * @v_format: a #GstVideoFormat
  * @out_width: the width to download to
  * @out_height: the height to download to
  *
  * Initializes @download with the information required for download.
- *
- * Returns: whether the initialization was successful
  */
-gboolean
-gst_gl_download_init_format (GstGLDownload * download, GstVideoFormat v_format,
-    guint out_width, guint out_height)
+void
+gst_gl_download_set_format (GstGLDownload * download, GstVideoInfo * out_info)
 {
-  GstVideoInfo info;
-  gboolean ret;
-
-  g_return_val_if_fail (download != NULL, FALSE);
-  g_return_val_if_fail (v_format != GST_VIDEO_FORMAT_UNKNOWN, FALSE);
-  g_return_val_if_fail (v_format != GST_VIDEO_FORMAT_ENCODED, FALSE);
-  g_return_val_if_fail (out_width > 0 && out_height > 0, FALSE);
+  g_return_if_fail (download != NULL);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
+      GST_VIDEO_FORMAT_UNKNOWN);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
+      GST_VIDEO_FORMAT_ENCODED);
 
   g_mutex_lock (&download->lock);
 
-  if (download->initted) {
+  if (gst_video_info_is_equal (&download->info, out_info)) {
     g_mutex_unlock (&download->lock);
-    return FALSE;
+    return;
   }
 
-  gst_video_info_set_format (&info, v_format, out_width, out_height);
-
-  download->info = info;
-
-  gst_gl_context_thread_add (download->context,
-      (GstGLContextThreadFunc) _init_download, download);
-
-  ret = download->initted = download->priv->result;
+  gst_gl_download_reset (download);
+  download->initted = FALSE;
+  download->info = *out_info;
 
   g_mutex_unlock (&download->lock);
-
-  return ret;
-}
-
-/**
- * gst_gl_download_perform_with_memory:
- * @download: a #GstGLDownload
- * @gl_mem: a #GstGLMemory
- *
- * Downloads the texture in @gl_mem
- *
- * Returns: whether the download was successful
- */
-gboolean
-gst_gl_download_perform_with_memory (GstGLDownload * download,
-    GstGLMemory * gl_mem)
-{
-  gpointer data[GST_VIDEO_MAX_PLANES];
-  guint i;
-  gboolean ret;
-
-  if (!GST_GL_MEMORY_FLAG_IS_SET (gl_mem, GST_GL_MEMORY_FLAG_DOWNLOAD_INITTED))
-    return FALSE;
-
-  if (!GST_GL_MEMORY_FLAG_IS_SET (gl_mem, GST_GL_MEMORY_FLAG_NEED_DOWNLOAD)) {
-    return FALSE;
-  }
-
-  g_mutex_lock (&download->lock);
-
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&download->info); i++) {
-    data[i] = (guint8 *) gl_mem->data +
-        GST_VIDEO_INFO_PLANE_OFFSET (&download->info, i);
-  }
-
-  ret =
-      _gst_gl_download_perform_with_data_unlocked (download, gl_mem->tex_id,
-      data);
-
-  if (ret)
-    GST_GL_MEMORY_FLAG_UNSET (gl_mem, GST_GL_MEMORY_FLAG_NEED_DOWNLOAD);
-
-  g_mutex_unlock (&download->lock);
-
-  return ret;
 }
 
 /**
@@ -240,7 +196,7 @@
  * @data: (out): where the downloaded data should go
  *
  * Downloads @texture_id into @data. @data size and format is specified by
- * the #GstVideoFormat passed to gst_gl_download_init_format() 
+ * the #GstVideoFormat passed to gst_gl_download_set_format() 
  *
  * Returns: whether the download was successful
  */
@@ -266,7 +222,6 @@
 _gst_gl_download_perform_with_data_unlocked (GstGLDownload * download,
     GLuint texture_id, gpointer data[GST_VIDEO_MAX_PLANES])
 {
-  gboolean realloc = FALSE;
   gpointer temp_data;
   guint i;
 
@@ -281,28 +236,28 @@
     g_return_val_if_fail (data[i] != NULL, FALSE);
   }
 
-  download->in_texture = texture_id;
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&download->info); i++) {
-    if (download->data[i] != data[i])
-      realloc = TRUE;
+  if (!download->in_tex[0])
+    download->in_tex[0] = gst_gl_memory_wrapped_texture (download->context,
+        texture_id, GST_VIDEO_GL_TEXTURE_TYPE_RGBA,
+        GST_VIDEO_INFO_WIDTH (&download->info),
+        GST_VIDEO_INFO_HEIGHT (&download->info), NULL, NULL);
+
+  download->in_tex[0]->tex_id = texture_id;
+
+  if (!download->out_tex[0]) {
+    gst_gl_memory_setup_wrapped (download->context, &download->info,
+        data, download->out_tex);
   }
 
-  if (realloc) {
-    for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&download->info); i++) {
-      if (download->out_texture[i])
-        gst_memory_unref ((GstMemory *) download->out_texture[i]);
-      download->data[i] = data[i];
-    }
+  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&download->info); i++) {
+    download->out_tex[i]->data = data[i];
+  }
 
-    if (GST_VIDEO_INFO_FORMAT (&download->info) == GST_VIDEO_FORMAT_YV12) {
-      /* YV12 same as I420 except planes 1+2 swapped */
-      temp_data = download->data[1];
-      download->data[1] = download->data[2];
-      download->data[2] = temp_data;
-    }
-
-    gst_gl_memory_setup_wrapped (download->context, &download->info,
-        download->data, download->out_texture);
+  if (GST_VIDEO_INFO_FORMAT (&download->info) == GST_VIDEO_FORMAT_YV12) {
+    /* YV12 same as I420 except planes 1+2 swapped */
+    temp_data = download->out_tex[1]->data;
+    download->out_tex[1]->data = download->out_tex[2]->data;
+    download->out_tex[2]->data = temp_data;
   }
 
   gst_gl_context_thread_add (download->context,
@@ -311,8 +266,8 @@
   return download->priv->result;
 }
 
-static void
-_init_download (GstGLContext * context, GstGLDownload * download)
+static gboolean
+_init_download (GstGLDownload * download)
 {
   GstVideoFormat v_format;
   guint out_width, out_height;
@@ -322,29 +277,28 @@
   out_width = GST_VIDEO_INFO_WIDTH (&download->info);
   out_height = GST_VIDEO_INFO_HEIGHT (&download->info);
 
+  if (download->initted)
+    return TRUE;
+
   GST_TRACE ("initializing texture download for format %s",
       gst_video_format_to_string (v_format));
 
-  if (USING_GLES2 (context) && !USING_GLES3 (context)) {
+  if (USING_GLES2 (download->context) && !USING_GLES3 (download->context)) {
     /* GL_RGBA is the only officially supported texture format in GLES2 */
     if (v_format == GST_VIDEO_FORMAT_RGB || v_format == GST_VIDEO_FORMAT_BGR) {
-      gst_gl_context_set_error (context, "Cannot download RGB textures in "
-          "GLES2");
-      download->priv->result = FALSE;
-      return;
+      gst_gl_context_set_error (download->context, "Cannot download RGB "
+          "textures in GLES2");
+      return FALSE;
     }
   }
 
   gst_video_info_set_format (&in_info, GST_VIDEO_FORMAT_RGBA, out_width,
       out_height);
 
-  download->priv->result =
-      gst_gl_color_convert_init_format (download->convert, &in_info,
+  gst_gl_color_convert_set_format (download->convert, &in_info,
       &download->info);
-  if (!download->priv->result)
-    return;
 
-  download->priv->result = TRUE;
+  return TRUE;
 }
 
 static void
@@ -352,29 +306,28 @@
 {
   guint out_width, out_height;
   GstMapInfo map_info;
-  GstGLMemory *in_tex[GST_VIDEO_MAX_PLANES] = { 0, };
   gint i;
 
   out_width = GST_VIDEO_INFO_WIDTH (&download->info);
   out_height = GST_VIDEO_INFO_HEIGHT (&download->info);
 
-  GST_TRACE ("doing YUV download of texture:%u (%ux%u)",
-      download->in_texture, out_width, out_height);
+  if (!download->initted) {
+    if (!(download->priv->result = _init_download (download)))
+      return;
+  }
 
-  in_tex[0] = gst_gl_memory_wrapped_texture (context, download->in_texture,
-      GST_VIDEO_GL_TEXTURE_TYPE_RGBA, out_width, out_height, NULL, NULL);
+  GST_TRACE ("doing download of texture:%u (%ux%u)",
+      download->in_tex[0]->tex_id, out_width, out_height);
 
   download->priv->result =
-      gst_gl_color_convert_perform (download->convert, in_tex,
-      download->out_texture);
+      gst_gl_color_convert_perform (download->convert, download->in_tex,
+      download->out_tex);
   if (!download->priv->result)
     return;
 
   for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&download->info); i++) {
-    gst_memory_map ((GstMemory *) download->out_texture[i], &map_info,
+    gst_memory_map ((GstMemory *) download->out_tex[i], &map_info,
         GST_MAP_READ);
-    gst_memory_unmap ((GstMemory *) download->out_texture[i], &map_info);
+    gst_memory_unmap ((GstMemory *) download->out_tex[i], &map_info);
   }
-
-  gst_memory_unref ((GstMemory *) in_tex[0]);
 }
diff --git a/gst-libs/gst/gl/gstgldownload.h b/gst-libs/gst/gl/gstgldownload.h
index 831b2cf..972c0aa 100644
--- a/gst-libs/gst/gl/gstgldownload.h
+++ b/gst-libs/gst/gl/gstgldownload.h
@@ -44,7 +44,7 @@
 struct _GstGLDownload
 {
   /* <private> */
-  GObject          parent;
+  GstObject        parent;
 
   GMutex           lock;
 
@@ -54,12 +54,11 @@
   /* output data */
   GstVideoInfo     info;
 
-  gpointer         data[GST_VIDEO_MAX_PLANES];
   gboolean         initted;
 
   /* used for the conversion */
-  GLuint           in_texture;
-  GstGLMemory *    out_texture[GST_VIDEO_MAX_PLANES];
+  GstGLMemory *    in_tex[GST_VIDEO_MAX_PLANES];
+  GstGLMemory *    out_tex[GST_VIDEO_MAX_PLANES];
 
   GstGLDownloadPrivate *priv;
 
@@ -74,15 +73,13 @@
 struct _GstGLDownloadClass
 {
   /* <private> */
-  GObjectClass object_class;
+  GstObjectClass object_class;
 };
 
 GstGLDownload * gst_gl_download_new          (GstGLContext * context);
 
-gboolean gst_gl_download_init_format                (GstGLDownload * download, GstVideoFormat v_format,
-                                                     guint out_width, guint out_height);
+void gst_gl_download_set_format                (GstGLDownload * download, GstVideoInfo * out_info);
 
-gboolean gst_gl_download_perform_with_memory        (GstGLDownload * download, GstGLMemory * gl_mem);
 gboolean gst_gl_download_perform_with_data          (GstGLDownload * download, GLuint texture_id,
                                                      gpointer data[GST_VIDEO_MAX_PLANES]);
 
diff --git a/gst-libs/gst/gl/gstglfilter.c b/gst-libs/gst/gl/gstglfilter.c
index 4874851..4007ac2 100644
--- a/gst-libs/gst/gl/gstglfilter.c
+++ b/gst-libs/gst/gl/gstglfilter.c
@@ -38,7 +38,9 @@
     GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "RGBA") "; "
 #if GST_GL_HAVE_PLATFORM_EGL
         GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE,
             "RGBA") "; "
@@ -52,7 +54,9 @@
     GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "RGBA") "; "
 #if GST_GL_HAVE_PLATFORM_EGL
         GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_EGL_IMAGE,
             "RGBA") "; "
@@ -656,31 +660,72 @@
   return othercaps;
 }
 
+
+static GstCaps *
+gst_gl_filter_set_caps_features (const GstCaps * caps,
+    const gchar * feature_name)
+{
+  GstCaps *tmp = gst_caps_copy (caps);
+  guint n = gst_caps_get_size (tmp);
+  guint i = 0;
+
+  for (i = 0; i < n; i++) {
+    GstCapsFeatures *features = gst_caps_get_features (tmp, i);
+    if (features) {
+      guint n_f = gst_caps_features_get_size (features);
+      guint j = 0;
+      for (j = 0; j < n_f; j++) {
+        gst_caps_features_remove_id (features,
+            gst_caps_features_get_nth_id (features, j));
+      }
+    }
+
+    gst_caps_features_add (features, feature_name);
+    gst_caps_set_simple (tmp, "format", G_TYPE_STRING, "RGBA", NULL);
+  }
+
+  return tmp;
+}
+
 static GstCaps *
 gst_gl_filter_transform_caps (GstBaseTransform * bt,
     GstPadDirection direction, GstCaps * caps, GstCaps * filter)
 {
-  GstCaps *newcaps, *result;
+  GstCaps *tmp = NULL;
+  GstCaps *result = NULL;
 
-  if (direction == GST_PAD_SINK)
-    newcaps =
-        gst_static_pad_template_get_caps (&gst_gl_filter_src_pad_template);
-  else if (direction == GST_PAD_SRC)
-    newcaps =
-        gst_static_pad_template_get_caps (&gst_gl_filter_sink_pad_template);
-  else
-    newcaps = gst_caps_new_any ();
+  if (direction == GST_PAD_SINK) {
+    GstCaps *glcaps = gst_gl_filter_set_caps_features (caps,
+        GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+#if GST_GL_HAVE_PLATFORM_EGL
+    GstCaps *eglcaps = gst_gl_filter_set_caps_features (caps,
+        GST_CAPS_FEATURE_MEMORY_EGL_IMAGE);
+#endif
+    GstCaps *uploadcaps = gst_gl_filter_set_caps_features (caps,
+        GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META);
 
-  if (filter) {
-    result =
-        gst_caps_intersect_full (filter, newcaps, GST_CAPS_INTERSECT_FIRST);
-    gst_caps_unref (newcaps);
-    newcaps = result;
+    tmp = gst_caps_new_empty ();
+
+    tmp = gst_caps_merge (tmp, glcaps);
+#if GST_GL_HAVE_PLATFORM_EGL
+    tmp = gst_caps_merge (tmp, eglcaps);
+#endif
+    tmp = gst_caps_merge (tmp, uploadcaps);
+    tmp = gst_caps_merge (tmp, gst_caps_copy (caps));
+  } else {
+    tmp = gst_caps_copy (caps);
   }
 
-  GST_DEBUG_OBJECT (bt, "returning caps: %" GST_PTR_FORMAT, newcaps);
+  if (filter) {
+    result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
+    gst_caps_unref (tmp);
+  } else {
+    result = tmp;
+  }
 
-  return newcaps;
+  GST_DEBUG_OBJECT (bt, "returning caps: %" GST_PTR_FORMAT, result);
+
+  return result;
 }
 
 
@@ -742,7 +787,7 @@
   GstGLFilter *filter = GST_GL_FILTER (trans);
   GstBufferPool *pool;
   GstStructure *config;
-  GstCaps *caps;
+  GstCaps *caps, *decide_caps;
   guint size;
   gboolean need_pool;
   GError *error = NULL;
@@ -788,20 +833,29 @@
 
   if (pool == NULL && need_pool) {
     GstVideoInfo info;
+    GstBufferPool *decide_pool;
 
     if (!gst_video_info_from_caps (&info, caps))
       goto invalid_caps;
 
-    GST_DEBUG_OBJECT (filter, "create new pool");
-    pool = gst_gl_buffer_pool_new (filter->context);
+    gst_query_parse_allocation (decide_query, &decide_caps, NULL);
+    decide_pool = gst_base_transform_get_buffer_pool (trans);
+    if (GST_IS_GL_BUFFER_POOL (decide_pool)
+        && gst_caps_is_equal_fixed (decide_caps, caps)) {
+      pool = decide_pool;
+    } else {
+      GST_DEBUG_OBJECT (filter, "create new pool");
+      gst_object_unref (decide_pool);
+      pool = gst_gl_buffer_pool_new (filter->context);
 
-    /* the normal size of a frame */
-    size = info.size;
+      /* the normal size of a frame */
+      size = info.size;
 
-    config = gst_buffer_pool_get_config (pool);
-    gst_buffer_pool_config_set_params (config, caps, size, 0, 0);
-    if (!gst_buffer_pool_set_config (pool, config))
-      goto config_failed;
+      config = gst_buffer_pool_get_config (pool);
+      gst_buffer_pool_config_set_params (config, caps, size, 0, 0);
+      if (!gst_buffer_pool_set_config (pool, config))
+        goto config_failed;
+    }
   }
   /* we need at least 2 buffer because we hold on to the last one */
   if (pool) {
@@ -837,9 +891,11 @@
   gst_object_unref (allocator);
 
 #if GST_GL_HAVE_PLATFORM_EGL
-  allocator = gst_allocator_find (GST_EGL_IMAGE_MEMORY_TYPE);
-  gst_query_add_allocation_param (query, allocator, &params);
-  gst_object_unref (allocator);
+  if (gst_gl_context_check_feature (filter->context, "EGL_KHR_image_base")) {
+    allocator = gst_allocator_find (GST_EGL_IMAGE_MEMORY_TYPE);
+    gst_query_add_allocation_param (query, allocator, &params);
+    gst_object_unref (allocator);
+  }
 #endif
 
   return TRUE;
@@ -1058,19 +1114,10 @@
     GST_LOG ("Output Buffer does not contain correct memory, "
         "attempting to wrap for download");
 
-    if (!filter->download) {
+    if (!filter->download)
       filter->download = gst_gl_download_new (filter->context);
 
-      if (!gst_gl_download_init_format (filter->download,
-              GST_VIDEO_FRAME_FORMAT (&out_frame),
-              GST_VIDEO_FRAME_WIDTH (&out_frame),
-              GST_VIDEO_FRAME_HEIGHT (&out_frame))) {
-        GST_ELEMENT_ERROR (filter, RESOURCE, NOT_FOUND,
-            ("%s", "Failed to init download format"), (NULL));
-        ret = FALSE;
-        goto error;
-      }
-    }
+    gst_gl_download_set_format (filter->download, &out_frame.info);
     out_tex = filter->out_tex_id;
   }
 
@@ -1123,9 +1170,8 @@
       filter->upload = gst_object_ref (GST_GL_BUFFER_POOL (pool)->upload);
     } else {
       filter->upload = gst_gl_upload_new (filter->context);
-      if (!gst_gl_upload_init_format (filter->upload, &filter->in_info))
-        goto upload_error;
     }
+    gst_gl_upload_set_format (filter->upload, &filter->in_info);
 
     gst_caps_unref (in_caps);
     gst_caps_unref (out_caps);
@@ -1140,15 +1186,6 @@
     gst_gl_filter_filter_texture (filter, inbuf, outbuf);
 
   return GST_FLOW_OK;
-
-upload_error:
-  {
-    GST_ELEMENT_ERROR (filter, RESOURCE, NOT_FOUND, ("Failed to init upload"),
-        (NULL));
-    gst_object_unref (filter->upload);
-    filter->upload = NULL;
-    return GST_FLOW_ERROR;
-  }
 }
 
 /* convenience functions to simplify filter development */
diff --git a/gst-libs/gst/gl/gstglmemory.c b/gst-libs/gst/gl/gstglmemory.c
index 8d3d65d..45d4c1c 100644
--- a/gst-libs/gst/gl/gstglmemory.c
+++ b/gst-libs/gst/gl/gstglmemory.c
@@ -208,7 +208,7 @@
       break;
     case GST_VIDEO_FORMAT_YUY2:
     case GST_VIDEO_FORMAT_UYVY:
-      return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
+      return GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA;
       break;
     case GST_VIDEO_FORMAT_NV12:
     case GST_VIDEO_FORMAT_NV21:
@@ -233,11 +233,6 @@
 static inline guint
 _get_plane_width (GstVideoInfo * info, guint plane)
 {
-  if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_YUY2
-      || GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_UYVY) {
-    return GST_VIDEO_INFO_COMP_WIDTH (info, 1);
-  }
-
   if (GST_VIDEO_INFO_IS_YUV (info))
     /* For now component width and plane width are the same and the
      * plane-component mapping matches
@@ -400,6 +395,7 @@
           gl_mem->unpack_length = j;
           gl_mem->tex_scaling[0] =
               (gfloat) (gl_mem->width * n_gl_bytes) / (gfloat) gl_mem->stride;
+          gl_mem->width = gl_mem->stride / n_gl_bytes;
           break;
         }
         j >>= 1;
@@ -511,9 +507,12 @@
 {
   GstGLMemory *mem;
   GenTexture data = { 0, };
+  mem = g_slice_new0 (GstGLMemory);
+  _gl_mem_init (mem, allocator, parent, context, tex_type, width, height,
+      stride, user_data, notify);
 
-  data.width = width;
-  data.height = height;
+  data.width = mem->width;
+  data.height = mem->height;
   data.gl_format = _gst_gl_format_from_gl_texture_type (tex_type);
   data.gl_type = GL_UNSIGNED_BYTE;
   if (tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
@@ -528,10 +527,6 @@
 
   GST_CAT_TRACE (GST_CAT_GL_MEMORY, "created texture %u", data.result);
 
-  mem = g_slice_new0 (GstGLMemory);
-  _gl_mem_init (mem, allocator, parent, context, tex_type, width, height,
-      stride, user_data, notify);
-
   mem->tex_id = data.result;
 
   return mem;
@@ -673,8 +668,8 @@
   gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
       GL_TEXTURE_2D, src->tex_id, 0);
 
-  if (!gst_gl_context_check_framebuffer_status (src->context))
-    goto fbo_error;
+//  if (!gst_gl_context_check_framebuffer_status (src->context))
+//    goto fbo_error;
 
   gl->BindTexture (GL_TEXTURE_2D, tex_id);
   if (copy_params->respecify) {
diff --git a/gst-libs/gst/gl/gstglmemory.h b/gst-libs/gst/gl/gstglmemory.h
index 559e62d..535bea7 100644
--- a/gst-libs/gst/gl/gstglmemory.h
+++ b/gst-libs/gst/gl/gstglmemory.h
@@ -104,6 +104,8 @@
   gpointer              _gst_reserved[GST_PADDING];
 };
 
+#define GST_CAPS_FEATURE_MEMORY_GL_MEMORY "memory:GLMemory"
+
 /**
  * GST_GL_MEMORY_ALLOCATOR:
  *
diff --git a/gst-libs/gst/gl/gstglmixer.c b/gst-libs/gst/gl/gstglmixer.c
index 238f4e1..89b68db 100644
--- a/gst-libs/gst/gl/gstglmixer.c
+++ b/gst-libs/gst/gl/gstglmixer.c
@@ -533,19 +533,25 @@
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS) "; "
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "RGBA") "; "
         GST_VIDEO_CAPS_MAKE_WITH_FEATURES
         (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
-            "RGBA"))
+            "RGBA")
+        "; " GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS))
     );
 
 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%d",
     GST_PAD_SINK,
     GST_PAD_REQUEST,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS) "; "
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "RGBA") "; "
         GST_VIDEO_CAPS_MAKE_WITH_FEATURES
         (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
-            "RGBA"))
+            "RGBA")
+        "; " GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS))
     );
 
 static gboolean gst_gl_mixer_src_query (GstPad * pad, GstObject * object,
@@ -1632,19 +1638,10 @@
 
     out_tex = mix->out_tex_id;;
 
-    if (!mix->download) {
+    if (!mix->download)
       mix->download = gst_gl_download_new (mix->context);
-      if (!gst_gl_download_init_format (mix->download,
-              GST_VIDEO_FRAME_FORMAT (&out_frame),
-              GST_VIDEO_FRAME_WIDTH (&out_frame),
-              GST_VIDEO_FRAME_HEIGHT (&out_frame))) {
-        GST_ELEMENT_ERROR (mix, RESOURCE, NOT_FOUND,
-            ("%s", "Failed to init upload format"), (NULL));
-        res = FALSE;
-        goto out;
-      }
-    }
 
+    gst_gl_download_set_format (mix->download, &out_frame.info);
     out_gl_wrapped = TRUE;
   }
 
@@ -1679,12 +1676,7 @@
       if (!pad->upload) {
         pad->upload = gst_gl_upload_new (mix->context);
 
-        if (!gst_gl_upload_init_format (pad->upload, &pad->in_info)) {
-          GST_ELEMENT_ERROR (mix, RESOURCE, NOT_FOUND, ("%s",
-                  "Failed to init upload format"), (NULL));
-          res = FALSE;
-          goto out;
-        }
+        gst_gl_upload_set_format (pad->upload, &pad->in_info);
       }
 
       if (!gst_gl_upload_perform_with_buffer (pad->upload, mixcol->buffer,
diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c
index 3482a04..f274b77 100644
--- a/gst-libs/gst/gl/gstglshader.c
+++ b/gst-libs/gst/gl/gstglshader.c
@@ -115,7 +115,8 @@
 
 #define DEBUG_INIT \
   GST_DEBUG_CATEGORY_INIT (gst_gl_shader_debug, "glshader", 0, "shader");
-G_DEFINE_TYPE_WITH_CODE (GstGLShader, gst_gl_shader, G_TYPE_OBJECT, DEBUG_INIT);
+G_DEFINE_TYPE_WITH_CODE (GstGLShader, gst_gl_shader, GST_TYPE_OBJECT,
+    DEBUG_INIT);
 
 static void
 _cleanup_shader (GstGLContext * context, GstGLShader * shader)
diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h
index 73cc8eb..a56b642 100644
--- a/gst-libs/gst/gl/gstglshader.h
+++ b/gst-libs/gst/gl/gstglshader.h
@@ -48,7 +48,7 @@
 
 struct _GstGLShader {
   /*< private >*/
-  GObject parent;
+  GstObject parent;
 
   GstGLContext *context;
 
@@ -57,7 +57,7 @@
 
 struct _GstGLShaderClass {
   /*< private >*/
-  GObjectClass parent_class;
+  GstObjectClass parent_class;
 };
 
 /* methods */
diff --git a/gst-libs/gst/gl/gstglshadervariables.c b/gst-libs/gst/gl/gstglshadervariables.c
index 156d68b..325a71f 100644
--- a/gst-libs/gst/gl/gstglshadervariables.c
+++ b/gst-libs/gst/gl/gstglshadervariables.c
@@ -256,8 +256,10 @@
       if (arraysize) {
         char *s = g_malloc (strlen (vartype) + 32);
         sprintf (s, "%s[%d]", vartype, arraysize);
-        if (strcmp (t, s))
+        if (strcmp (t, s)) {
+          g_free (s);
           goto parse_error;
+        }
       } else {
         if (strcmp (t, vartype))
           goto parse_error;
diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c
index aa7dbdc..fb87153 100644
--- a/gst-libs/gst/gl/gstglupload.c
+++ b/gst-libs/gst/gl/gstglupload.c
@@ -27,6 +27,10 @@
 #include "gl.h"
 #include "gstglupload.h"
 
+#if GST_GL_HAVE_PLATFORM_EGL
+#include "egl/gsteglimagememory.h"
+#endif
+
 /**
  * SECTION:gstglupload
  * @short_description: an object that uploads to GL textures
@@ -46,11 +50,12 @@
 static gboolean _upload_memory (GstGLUpload * upload);
 //static gboolean _do_upload_fill (GstGLContext * context, GstGLUpload * upload);
 //static gboolean _do_upload_make (GstGLContext * context, GstGLUpload * upload);
-static void _init_upload (GstGLContext * context, GstGLUpload * upload);
+static gboolean _init_upload (GstGLUpload * upload);
 //static gboolean _init_upload_fbo (GstGLContext * context, GstGLUpload * upload);
 static gboolean _gst_gl_upload_perform_with_data_unlocked (GstGLUpload * upload,
     GLuint texture_id, gpointer data[GST_VIDEO_MAX_PLANES]);
 static void _do_upload_with_meta (GstGLContext * context, GstGLUpload * upload);
+static void gst_gl_upload_reset (GstGLUpload * upload);
 
 /* *INDENT-OFF* */
 
@@ -87,9 +92,10 @@
 #define DEBUG_INIT \
   GST_DEBUG_CATEGORY_INIT (gst_gl_upload_debug, "glupload", 0, "upload");
 
-G_DEFINE_TYPE_WITH_CODE (GstGLUpload, gst_gl_upload, G_TYPE_OBJECT, DEBUG_INIT);
+G_DEFINE_TYPE_WITH_CODE (GstGLUpload, gst_gl_upload, GST_TYPE_OBJECT, DEBUG_INIT);
 static void gst_gl_upload_finalize (GObject * object);
 
+
 #define GST_GL_UPLOAD_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
     GST_TYPE_GL_UPLOAD, GstGLUploadPrivate))
 
@@ -107,6 +113,9 @@
   upload->priv = GST_GL_UPLOAD_GET_PRIVATE (upload);
 
   upload->context = NULL;
+  upload->priv->tex_id = 0;
+
+  gst_video_info_set_format (&upload->in_info, GST_VIDEO_FORMAT_ENCODED, 0, 0);
 
   g_mutex_init (&upload->lock);
 }
@@ -137,14 +146,7 @@
 
   upload = GST_GL_UPLOAD (object);
 
-  if (upload->convert) {
-    gst_object_unref (upload->convert);
-  }
-
-  if (upload->out_tex) {
-    gst_memory_unref ((GstMemory *) upload->out_tex);
-    upload->out_tex = NULL;
-  }
+  gst_gl_upload_reset (upload);
 
   if (upload->context) {
     gst_object_unref (upload->context);
@@ -156,48 +158,85 @@
   G_OBJECT_CLASS (gst_gl_upload_parent_class)->finalize (object);
 }
 
-static gboolean
-_gst_gl_upload_init_format_unlocked (GstGLUpload * upload,
-    GstVideoInfo *in_info)
+static void
+gst_gl_upload_reset (GstGLUpload * upload)
 {
-  g_return_val_if_fail (upload != NULL, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
-      GST_VIDEO_FORMAT_UNKNOWN, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
-      GST_VIDEO_FORMAT_ENCODED, FALSE);
+  guint i;
 
-  if (upload->initted) {
-    return TRUE;
+  if (upload->priv->tex_id) {
+    gst_gl_context_del_texture (upload->context, &upload->priv->tex_id);
+    upload->priv->tex_id = 0;
   }
 
+  if (upload->convert) {
+    gst_object_unref (upload->convert);
+    upload->convert = NULL;
+  }
+
+  if (upload->out_tex) {
+    gst_memory_unref ((GstMemory *) upload->out_tex);
+    upload->out_tex = NULL;
+  }
+
+  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
+    if (upload->in_tex[i]) {
+      gst_memory_unref ((GstMemory *) upload->in_tex[i]);
+      upload->in_tex[i] = NULL;
+    }
+  }
+}
+
+static void
+_gst_gl_upload_set_format_unlocked (GstGLUpload * upload,
+    GstVideoInfo *in_info)
+{
+  g_return_if_fail (upload != NULL);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
+      GST_VIDEO_FORMAT_UNKNOWN);
+  g_return_if_fail (GST_VIDEO_INFO_FORMAT (in_info) !=
+      GST_VIDEO_FORMAT_ENCODED);
+
+  if (gst_video_info_is_equal (&upload->in_info, in_info))
+    return;
+
+  gst_gl_upload_reset (upload);
+  upload->convert = gst_gl_color_convert_new (upload->context);
   upload->in_info = *in_info;
-
-  gst_gl_context_thread_add (upload->context,
-      (GstGLContextThreadFunc) _init_upload, upload);
-
-  upload->initted = upload->priv->result;
-
-  return upload->initted;
+  upload->initted = FALSE;
 }
 
 
 /**
- * gst_gl_upload_init_format:
+ * gst_gl_upload_set_format:
  * @upload: a #GstGLUpload
  * @in_info: input #GstVideoInfo
  *
  * Initializes @upload with the information required for upload.
- *
- * Returns: whether the initialization was successful
  */
-gboolean
-gst_gl_upload_init_format (GstGLUpload * upload, GstVideoInfo * in_info)
+void
+gst_gl_upload_set_format (GstGLUpload * upload, GstVideoInfo * in_info)
 {
-  gboolean ret;
+  g_mutex_lock (&upload->lock);
+
+  _gst_gl_upload_set_format_unlocked (upload, in_info);
+
+  g_mutex_unlock (&upload->lock);
+}
+
+/**
+ * gst_gl_upload_get_format:
+ * @upload: a #GstGLUpload
+ *
+ * Returns: (transfer none): The #GstVideoInfo set by gst_gl_upload_set_format()
+ */
+GstVideoInfo *
+gst_gl_upload_get_format (GstGLUpload * upload)
+{
+  GstVideoInfo *ret;
 
   g_mutex_lock (&upload->lock);
 
-  ret = _gst_gl_upload_init_format_unlocked (upload, in_info);
+  ret = &upload->in_info;
 
   g_mutex_unlock (&upload->lock);
 
@@ -223,6 +262,7 @@
   GstVideoGLTextureUploadMeta *gl_tex_upload_meta;
   guint texture_ids[] = { 0, 0, 0, 0 };
   gint i;
+  gboolean ret;
 
   g_return_val_if_fail (upload != NULL, FALSE);
   g_return_val_if_fail (buffer != NULL, FALSE);
@@ -233,23 +273,42 @@
   mem = gst_buffer_peek_memory (buffer, 0);
 
   if (gst_is_gl_memory (mem)) {
+    if (GST_VIDEO_INFO_FORMAT (&upload->in_info) == GST_VIDEO_FORMAT_RGBA) {
+      GstMapInfo map_info;
+
+      gst_memory_map (mem, &map_info, GST_MAP_READ | GST_MAP_GL);
+      gst_memory_unmap (mem, &map_info);
+
+      *tex_id = ((GstGLMemory *) mem)->tex_id;
+      return TRUE;
+    }
+
     if (!upload->out_tex)
       upload->out_tex = (GstGLMemory *) gst_gl_memory_alloc (upload->context,
           GST_VIDEO_GL_TEXTURE_TYPE_RGBA, GST_VIDEO_INFO_WIDTH (&upload->in_info),
           GST_VIDEO_INFO_HEIGHT (&upload->in_info),
-          GST_VIDEO_INFO_PLANE_STRIDE (&upload->in_info, 0));
+          4 * GST_VIDEO_INFO_WIDTH (&upload->in_info));
 
     GST_LOG_OBJECT (upload, "Attempting upload with GstGLMemory");
     for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->in_info); i++) {
       upload->in_tex[i] = (GstGLMemory *) gst_buffer_peek_memory (buffer, i);
     }
 
-    _upload_memory (upload);
+    ret = _upload_memory (upload);
 
     *tex_id = upload->out_tex->tex_id;
-    return TRUE;
+    for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->in_info); i++) {
+      upload->in_tex[i] = NULL;
+    }
+    return ret;
   }
 
+#if GST_GL_HAVE_PLATFORM_EGL
+  if (!upload->priv->tex_id && gst_is_egl_image_memory (mem))
+    gst_gl_context_gen_texture (upload->context, &upload->priv->tex_id,
+          GST_VIDEO_FORMAT_RGBA, 0, 0);
+#endif
+
   if (!upload->priv->tex_id)
     gst_gl_context_gen_texture (upload->context, &upload->priv->tex_id,
         GST_VIDEO_FORMAT_RGBA, GST_VIDEO_INFO_WIDTH (&upload->in_info),
@@ -281,6 +340,14 @@
     return FALSE;
   }
 
+  /* update the video info from the one updated by frame_map using video meta */
+  gst_gl_upload_set_format (upload, &upload->priv->frame.info);
+
+  if (!upload->priv->tex_id)
+    gst_gl_context_gen_texture (upload->context, &upload->priv->tex_id,
+        GST_VIDEO_FORMAT_RGBA, GST_VIDEO_INFO_WIDTH (&upload->in_info),
+        GST_VIDEO_INFO_HEIGHT (&upload->in_info));
+
   if (!gst_gl_upload_perform_with_data (upload, upload->priv->tex_id,
           upload->priv->frame.data)) {
     return FALSE;
@@ -307,7 +374,6 @@
 static gboolean
 _do_upload_for_meta (GstGLUpload * upload, GstVideoGLTextureUploadMeta * meta)
 {
-  GstVideoMeta *v_meta;
   GstVideoInfo in_info;
   GstVideoFrame frame;
   GstMemory *mem;
@@ -316,25 +382,6 @@
   g_return_val_if_fail (upload != NULL, FALSE);
   g_return_val_if_fail (meta != NULL, FALSE);
 
-  v_meta = gst_buffer_get_video_meta (upload->priv->buffer);
-
-  if (!upload->initted) {
-    GstVideoFormat v_format;
-    guint width, height;
-
-    if (v_meta == NULL)
-      return FALSE;
-
-    v_format = v_meta->format;
-    width = v_meta->width;
-    height = v_meta->height;
-
-    gst_video_info_set_format (&in_info, v_format, width, height);
-
-    if (!_gst_gl_upload_init_format_unlocked (upload, &in_info))
-      return FALSE;
-  }
-
   /* GstGLMemory */
   mem = gst_buffer_peek_memory (upload->priv->buffer, 0);
 
@@ -342,25 +389,27 @@
     GstGLMemory *gl_mem = (GstGLMemory *) mem;
 
     upload->in_tex[0] = gl_mem;
-    _upload_memory (upload);
+    ret = _upload_memory (upload);
     upload->in_tex[0] = NULL;
 
-    if (upload->priv->result)
+    if (ret)
       return TRUE;
   }
 
-  if (v_meta == NULL)
-    return FALSE;
-
-  gst_video_info_set_format (&in_info, v_meta->format, v_meta->width,
-      v_meta->height);
-
   if (!gst_video_frame_map (&frame, &in_info, upload->priv->buffer,
           GST_MAP_READ)) {
     GST_ERROR ("failed to map video frame");
     return FALSE;
   }
 
+  /* update the video info from the one updated by frame_map using video meta */
+  gst_gl_upload_set_format (upload, &upload->priv->frame.info);
+
+  if (!upload->priv->tex_id)
+    gst_gl_context_gen_texture (upload->context, &upload->priv->tex_id,
+        GST_VIDEO_FORMAT_RGBA, GST_VIDEO_INFO_WIDTH (&upload->in_info),
+        GST_VIDEO_INFO_HEIGHT (&upload->in_info));
+
   ret = _gst_gl_upload_perform_with_data_unlocked (upload,
       upload->out_tex->tex_id, frame.data);
 
@@ -452,19 +501,43 @@
 
   g_mutex_lock (&upload->lock);
 
-  upload->out_tex = gst_gl_memory_wrapped_texture (upload->context,
-      texture_id[0], GST_VIDEO_GL_TEXTURE_TYPE_RGBA,
-      GST_VIDEO_INFO_WIDTH (&upload->in_info),
-      GST_VIDEO_INFO_HEIGHT (&upload->in_info), NULL, NULL);;
+  if (!upload->initted) {
+    GstVideoInfo in_info;
+    GstVideoMeta *v_meta = gst_buffer_get_video_meta (upload->priv->buffer);
+    gint i;
+
+    if (v_meta == NULL)
+      return FALSE;
+
+    gst_video_info_init (&in_info);
+    in_info.finfo = gst_video_format_get_info (v_meta->format);
+    in_info.width = v_meta->width;
+    in_info.height = v_meta->height;
+
+    for (i = 0; i < in_info.finfo->n_planes; i++) {
+      in_info.offset[i] = v_meta->offset[i];
+      in_info.stride[i] = v_meta->stride[i];
+    }
+
+    _gst_gl_upload_set_format_unlocked (upload, &in_info);
+
+    upload->out_tex = gst_gl_memory_wrapped_texture (upload->context,
+        texture_id[0], GST_VIDEO_GL_TEXTURE_TYPE_RGBA,
+        GST_VIDEO_INFO_WIDTH (&upload->in_info),
+        GST_VIDEO_INFO_HEIGHT (&upload->in_info), NULL, NULL);
+  }
+
+  /* FIXME: kinda breaks the abstraction */
+  if (upload->out_tex->tex_id != texture_id[0]) {
+    upload->out_tex->tex_id = texture_id[0];
+    GST_GL_MEMORY_FLAG_SET (upload->out_tex, GST_GL_MEMORY_FLAG_NEED_DOWNLOAD);
+  }
 
   GST_LOG ("Uploading for meta with textures %i,%i,%i,%i", texture_id[0],
       texture_id[1], texture_id[2], texture_id[3]);
 
   ret = _do_upload_for_meta (upload, meta);
 
-  gst_memory_unref ((GstMemory *) upload->out_tex);
-  upload->out_tex = NULL;
-
   g_mutex_unlock (&upload->lock);
 
   return ret;
@@ -513,7 +586,7 @@
  * @data: where the downloaded data should go
  *
  * Uploads @data into @texture_id. data size and format is specified by
- * the #GstVideoInfo<!--  -->s passed to gst_gl_upload_init_format() 
+ * the #GstVideoInfo<!--  -->s passed to gst_gl_upload_set_format() 
  *
  * Returns: whether the upload was successful
  */
@@ -527,15 +600,19 @@
 
   g_mutex_lock (&upload->lock);
 
-  upload->out_tex = gst_gl_memory_wrapped_texture (upload->context, texture_id,
-      GST_VIDEO_GL_TEXTURE_TYPE_RGBA, GST_VIDEO_INFO_WIDTH (&upload->in_info),
-      GST_VIDEO_INFO_HEIGHT (&upload->in_info), NULL, NULL);
+  if (!upload->out_tex)
+    upload->out_tex = gst_gl_memory_wrapped_texture (upload->context, texture_id,
+        GST_VIDEO_GL_TEXTURE_TYPE_RGBA, GST_VIDEO_INFO_WIDTH (&upload->in_info),
+        GST_VIDEO_INFO_HEIGHT (&upload->in_info), NULL, NULL);
+
+  /* FIXME: kinda breaks the abstraction */
+  if (upload->out_tex->tex_id != texture_id) {
+    upload->out_tex->tex_id = texture_id;
+    GST_GL_MEMORY_FLAG_SET (upload->out_tex, GST_GL_MEMORY_FLAG_NEED_DOWNLOAD);
+  }
 
   ret = _gst_gl_upload_perform_with_data_unlocked (upload, texture_id, data);
 
-  gst_memory_unref ((GstMemory *) upload->out_tex);
-  upload->out_tex = NULL;
-
   g_mutex_unlock (&upload->lock);
 
   return ret;
@@ -550,30 +627,31 @@
   g_return_val_if_fail (upload != NULL, FALSE);
   g_return_val_if_fail (texture_id > 0, FALSE);
 
-  gst_gl_memory_setup_wrapped (upload->context, &upload->in_info, data,
-      upload->in_tex);
+  if (!upload->in_tex[0])
+    gst_gl_memory_setup_wrapped (upload->context, &upload->in_info, data,
+        upload->in_tex);
+
+  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
+    if (upload->in_tex[i] && upload->in_tex[i]->data != data[i]) {
+      upload->in_tex[i]->data = data[i];
+      GST_GL_MEMORY_FLAG_SET (upload->in_tex[i], GST_GL_MEMORY_FLAG_NEED_UPLOAD);
+    }
+  }
 
   GST_LOG ("Uploading data into texture %u", texture_id);
 
-  _upload_memory (upload);
-
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->in_info); i++) {
-    gst_memory_unref ((GstMemory *) upload->in_tex[i]);
-    upload->in_tex[i] = NULL;
-  }
-
-  return upload->priv->result;
+  return _upload_memory (upload);
 }
 
 /* Called in the gl thread */
-static void
-_init_upload (GstGLContext * context, GstGLUpload * upload)
+static gboolean
+_init_upload (GstGLUpload * upload)
 {
   GstGLFuncs *gl;
   GstVideoFormat v_format;
   GstVideoInfo out_info;
 
-  gl = context->gl_vtable;
+  gl = upload->context->gl_vtable;
 
   v_format = GST_VIDEO_INFO_FORMAT (&upload->in_info);
 
@@ -581,7 +659,7 @@
       gst_video_format_to_string (v_format));
 
   if (!gl->CreateProgramObject && !gl->CreateProgram) {
-    gst_gl_context_set_error (context,
+    gst_gl_context_set_error (upload->context,
         "Cannot upload YUV formats without OpenGL shaders");
     goto error;
   }
@@ -590,15 +668,14 @@
       GST_VIDEO_INFO_WIDTH (&upload->in_info),
       GST_VIDEO_INFO_HEIGHT (&upload->in_info));
 
-  if (!gst_gl_color_convert_init_format (upload->convert, &upload->in_info,
-        &out_info))
-    goto error;
+  gst_gl_color_convert_set_format (upload->convert, &upload->in_info, &out_info);
 
-  upload->priv->result = TRUE;
-  return;
+  upload->initted = TRUE;
+
+  return TRUE;
 
 error:
-  upload->priv->result = FALSE;
+  return FALSE;
 }
 
 static gboolean
@@ -607,21 +684,18 @@
   guint in_width, in_height;
   guint in_texture[GST_VIDEO_MAX_PLANES];
   GstGLMemory *out_texture[GST_VIDEO_MAX_PLANES] = {upload->out_tex, 0, 0, 0};
-  GstMapInfo map_infos[GST_VIDEO_MAX_PLANES];
-  gboolean res = TRUE;
   gint i;
 
   in_width = GST_VIDEO_INFO_WIDTH (&upload->in_info);
   in_height = GST_VIDEO_INFO_HEIGHT (&upload->in_info);
 
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->in_info); i++) {
-    if (!gst_memory_map ((GstMemory *) upload->in_tex[i], &map_infos[i],
-          GST_MAP_READ | GST_MAP_GL)) {
-      gst_gl_context_set_error (upload->context, "Failed to map GL memory %u", i);
-      res = FALSE;
-      goto out;
+  if (!upload->initted) {
+    if (!_init_upload (upload)) {
+      return FALSE;
     }
+  }
 
+  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->in_info); i++) {
     in_texture[i] = upload->in_tex[i]->tex_id;
   }
 
@@ -629,12 +703,5 @@
       out_texture[0]->tex_id, in_texture[0], in_texture[1], in_texture[2],
       in_width, in_height);
 
-  gst_gl_color_convert_perform (upload->convert, upload->in_tex, out_texture);
-
-out:
-  for (i--; i >= 0; i--) {
-    gst_memory_unmap ((GstMemory *) upload->in_tex[i], &map_infos[i]);
-  }
-
-  return res;
+  return gst_gl_color_convert_perform (upload->convert, upload->in_tex, out_texture);
 }
diff --git a/gst-libs/gst/gl/gstglupload.h b/gst-libs/gst/gl/gstglupload.h
index 5cb6333..51ee131 100644
--- a/gst-libs/gst/gl/gstglupload.h
+++ b/gst-libs/gst/gl/gstglupload.h
@@ -44,7 +44,7 @@
 struct _GstGLUpload
 {
   /* <private> */
-  GObject          parent;
+  GstObject        parent;
 
   GMutex           lock;
 
@@ -72,12 +72,13 @@
  */
 struct _GstGLUploadClass
 {
-  GObjectClass object_class;
+  GstObjectClass object_class;
 };
 
 GstGLUpload * gst_gl_upload_new            (GstGLContext * context);
 
-gboolean gst_gl_upload_init_format         (GstGLUpload * upload, GstVideoInfo * in_info);
+void           gst_gl_upload_set_format    (GstGLUpload * upload, GstVideoInfo * in_info);
+GstVideoInfo * gst_gl_upload_get_format    (GstGLUpload * upload);
 
 gboolean gst_gl_upload_add_video_gl_texture_upload_meta (GstGLUpload * upload, GstBuffer * buffer);
 
diff --git a/gst-libs/gst/gl/gstglutils.c b/gst-libs/gst/gl/gstglutils.c
index 4976992..d5df84b 100644
--- a/gst-libs/gst/gl/gstglutils.c
+++ b/gst-libs/gst/gl/gstglutils.c
@@ -111,8 +111,10 @@
 
   gl->GenTextures (1, &data->result);
   gl->BindTexture (GL_TEXTURE_2D, data->result);
-  gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, data->width,
-      data->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+
+  if (data->width > 0 && data->height > 0)
+    gl->TexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, data->width,
+        data->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
 
   gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   gl->TexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
diff --git a/gst-libs/gst/gl/gstglwindow.c b/gst-libs/gst/gl/gstglwindow.c
index 49ab3ca..329327b 100644
--- a/gst-libs/gst/gl/gstglwindow.c
+++ b/gst-libs/gst/gl/gstglwindow.c
@@ -72,7 +72,7 @@
 GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
 
 #define gst_gl_window_parent_class parent_class
-G_DEFINE_ABSTRACT_TYPE (GstGLWindow, gst_gl_window, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE (GstGLWindow, gst_gl_window, GST_TYPE_OBJECT);
 
 #define GST_GL_WINDOW_GET_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_GL_TYPE_WINDOW, GstGLWindowPrivate))
@@ -182,7 +182,7 @@
     window = GST_GL_WINDOW (gst_gl_window_android_egl_new ());
 #endif
 #if GST_GL_HAVE_WINDOW_EAGL
-  if (!window && (!user_choice || g_strstr_len (user_choice, 7, "eagl")))
+  if (!window && (!user_choice || g_strstr_len (user_choice, 4, "eagl")))
     window = GST_GL_WINDOW (gst_gl_window_eagl_new ());
 #endif
   if (!window) {
diff --git a/gst-libs/gst/gl/gstglwindow.h b/gst-libs/gst/gl/gstglwindow.h
index 217f03c..518661f 100644
--- a/gst-libs/gst/gl/gstglwindow.h
+++ b/gst-libs/gst/gl/gstglwindow.h
@@ -64,7 +64,7 @@
  */
 struct _GstGLWindow {
   /*< private >*/
-  GObject parent;
+  GstObject parent;
 
   GMutex        lock;
 
@@ -109,7 +109,7 @@
  * @close: close the connection to the display
  */
 struct _GstGLWindowClass {
-  GObjectClass parent_class;
+  GstObjectClass parent_class;
 
   guintptr (*get_display)        (GstGLWindow *window);
   void     (*set_window_handle)  (GstGLWindow *window, guintptr id);
diff --git a/gst-libs/gst/mpegts/gst-atsc-section.c b/gst-libs/gst/mpegts/gst-atsc-section.c
index 8452cdf..a56be15 100644
--- a/gst-libs/gst/mpegts/gst-atsc-section.c
+++ b/gst-libs/gst/mpegts/gst-atsc-section.c
@@ -49,7 +49,8 @@
 static void
 _gst_mpegts_atsc_tvct_source_free (GstMpegTsAtscTVCTSource * source)
 {
-  g_ptr_array_unref (source->descriptors);
+  if (source->descriptors)
+    g_ptr_array_unref (source->descriptors);
   g_slice_free (GstMpegTsAtscTVCTSource, source);
 }
 
@@ -73,7 +74,8 @@
 _gst_mpegts_atsc_tvct_free (GstMpegTsAtscTVCT * tvct)
 {
   g_ptr_array_unref (tvct->sources);
-  g_ptr_array_unref (tvct->descriptors);
+  if (tvct->descriptors)
+    g_ptr_array_unref (tvct->descriptors);
   g_slice_free (GstMpegTsAtscTVCT, tvct);
 }
 
diff --git a/gst-libs/gst/mpegts/gst-dvb-descriptor.c b/gst-libs/gst/mpegts/gst-dvb-descriptor.c
index f0cd62a..279a9a9 100644
--- a/gst-libs/gst/mpegts/gst-dvb-descriptor.c
+++ b/gst-libs/gst/mpegts/gst-dvb-descriptor.c
@@ -1661,6 +1661,7 @@
         GstMpegTsT2DeliverySystemCellExtension *cell_ext;
         cell_ext = g_slice_new0 (GstMpegTsT2DeliverySystemCellExtension);
 
+        g_ptr_array_add (cell->sub_cells, cell_ext);
         cell_ext->cell_id_extension = *data;
         data += 1;
 
diff --git a/gst-libs/gst/mpegts/gst-dvb-section.c b/gst-libs/gst/mpegts/gst-dvb-section.c
index ad2b3fb..dc66773 100644
--- a/gst-libs/gst/mpegts/gst-dvb-section.c
+++ b/gst-libs/gst/mpegts/gst-dvb-section.c
@@ -82,7 +82,7 @@
 
   utc_ptr = data + 2;
 
-  /* First digit of hours cannot exceeed 2 (max: 23 hours) */
+  /* First digit of hours cannot exceed 1 (max: 23 hours) */
   hour = ((utc_ptr[0] & 0x30) >> 4) * 10 + (utc_ptr[0] & 0x0F);
   /* First digit of minutes cannot exced 5 (max: 59 mins) */
   minute = ((utc_ptr[1] & 0x70) >> 4) * 10 + (utc_ptr[1] & 0x0F);
@@ -90,8 +90,14 @@
   second = ((utc_ptr[2] & 0x70) >> 4) * 10 + (utc_ptr[2] & 0x0F);
 
   /* Time is UTC */
-  return gst_date_time_new (0.0, year, month, day, hour, minute,
-      (gdouble) second);
+  if (hour < 24 && minute < 60 && second < 60) {
+    return gst_date_time_new (0.0, year, month, day, hour, minute,
+        (gdouble) second);
+  } else if (utc_ptr[0] == 0xFF && utc_ptr[1] == 0xFF && utc_ptr[2] == 0xFF) {
+    return gst_date_time_new (0.0, year, month, day, -1, -1, -1);
+  }
+
+  return NULL;
 }
 
 /* Event Information Table */
@@ -112,7 +118,8 @@
 {
   if (eit->start_time)
     gst_date_time_unref (eit->start_time);
-  g_ptr_array_unref (eit->descriptors);
+  if (eit->descriptors)
+    g_ptr_array_unref (eit->descriptors);
   g_slice_free (GstMpegTsEITEvent, eit);
 }
 
@@ -141,7 +148,6 @@
 G_DEFINE_BOXED_TYPE (GstMpegTsEIT, gst_mpegts_eit,
     (GBoxedCopyFunc) _gst_mpegts_eit_copy, (GFreeFunc) _gst_mpegts_eit_free);
 
-
 static gpointer
 _parse_eit (GstMpegTsSection * section)
 {
@@ -267,7 +273,8 @@
 static void
 _gst_mpegts_bat_stream_free (GstMpegTsBATStream * bat)
 {
-  g_ptr_array_unref (bat->descriptors);
+  if (bat->descriptors)
+    g_ptr_array_unref (bat->descriptors);
   g_slice_free (GstMpegTsBATStream, bat);
 }
 
@@ -290,8 +297,10 @@
 static void
 _gst_mpegts_bat_free (GstMpegTsBAT * bat)
 {
-  g_ptr_array_unref (bat->descriptors);
-  g_ptr_array_unref (bat->streams);
+  if (bat->descriptors)
+    g_ptr_array_unref (bat->descriptors);
+  if (bat->streams)
+    g_ptr_array_unref (bat->streams);
   g_slice_free (GstMpegTsBAT, bat);
 }
 
@@ -443,7 +452,8 @@
 static void
 _gst_mpegts_nit_stream_free (GstMpegTsNITStream * nit)
 {
-  g_ptr_array_unref (nit->descriptors);
+  if (nit->descriptors)
+    g_ptr_array_unref (nit->descriptors);
   g_slice_free (GstMpegTsNITStream, nit);
 }
 
@@ -465,7 +475,8 @@
 static void
 _gst_mpegts_nit_free (GstMpegTsNIT * nit)
 {
-  g_ptr_array_unref (nit->descriptors);
+  if (nit->descriptors)
+    g_ptr_array_unref (nit->descriptors);
   g_ptr_array_unref (nit->streams);
   g_slice_free (GstMpegTsNIT, nit);
 }
@@ -786,7 +797,8 @@
 static void
 _gst_mpegts_sdt_service_free (GstMpegTsSDTService * sdt)
 {
-  g_ptr_array_unref (sdt->descriptors);
+  if (sdt->descriptors)
+    g_ptr_array_unref (sdt->descriptors);
   g_slice_free (GstMpegTsSDTService, sdt);
 }
 
@@ -1142,7 +1154,8 @@
 {
   if (tot->utc_time)
     gst_date_time_unref (tot->utc_time);
-  g_ptr_array_unref (tot->descriptors);
+  if (tot->descriptors)
+    g_ptr_array_unref (tot->descriptors);
   g_slice_free (GstMpegTsTOT, tot);
 }
 
diff --git a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
index eceaf9f..395b9ae 100644
--- a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
+++ b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
@@ -279,7 +279,7 @@
 /**
  * dvb_text_from_utf8:
  * @text: The text to convert. This should be in UTF-8 format
- * @out_size: (out) the byte length of the new text
+ * @out_size: (out): the byte length of the new text
  *
  * Converts UTF-8 strings to text characters compliant with EN 300 468.
  * The converted text can be used directly in DVB #GstMpegTsDescriptor
@@ -292,7 +292,7 @@
  * If no character map that contains all characters could be found, the
  * string is converted to ISO 6937 with unknown characters set to `?`.
  *
- * Returns: (transfer full) byte array of size @out_size
+ * Returns: (transfer full): byte array of size @out_size
  */
 guint8 *
 dvb_text_from_utf8 (const gchar * text, gsize * out_size)
diff --git a/gst-libs/gst/mpegts/gstmpegtssection.c b/gst-libs/gst/mpegts/gstmpegtssection.c
index 3769118..97a7e4a 100644
--- a/gst-libs/gst/mpegts/gstmpegtssection.c
+++ b/gst-libs/gst/mpegts/gstmpegtssection.c
@@ -606,7 +606,8 @@
 static void
 _gst_mpegts_pmt_stream_free (GstMpegTsPMTStream * pmt)
 {
-  g_ptr_array_unref (pmt->descriptors);
+  if (pmt->descriptors)
+    g_ptr_array_unref (pmt->descriptors);
   g_slice_free (GstMpegTsPMTStream, pmt);
 }
 
@@ -620,7 +621,8 @@
   GstMpegTsPMT *copy;
 
   copy = g_slice_dup (GstMpegTsPMT, pmt);
-  copy->descriptors = g_ptr_array_ref (pmt->descriptors);
+  if (pmt->descriptors)
+    copy->descriptors = g_ptr_array_ref (pmt->descriptors);
   copy->streams = g_ptr_array_ref (pmt->streams);
 
   return copy;
@@ -629,7 +631,8 @@
 static void
 _gst_mpegts_pmt_free (GstMpegTsPMT * pmt)
 {
-  g_ptr_array_unref (pmt->descriptors);
+  if (pmt->descriptors)
+    g_ptr_array_unref (pmt->descriptors);
   g_ptr_array_unref (pmt->streams);
   g_slice_free (GstMpegTsPMT, pmt);
 }
diff --git a/gst-libs/gst/uridownloader/gsturidownloader.c b/gst-libs/gst/uridownloader/gsturidownloader.c
index f0deee6..99d88e8 100644
--- a/gst-libs/gst/uridownloader/gsturidownloader.c
+++ b/gst-libs/gst/uridownloader/gsturidownloader.c
@@ -323,7 +323,8 @@
 
 static gboolean
 gst_uri_downloader_set_uri (GstUriDownloader * downloader, const gchar * uri,
-    const gchar * referer, gboolean compress, gboolean refresh)
+    const gchar * referer, gboolean compress, gboolean refresh,
+    gboolean allow_cache)
 {
   GstPad *pad;
   GObjectClass *gobject_class;
@@ -379,13 +380,17 @@
   if (g_object_class_find_property (gobject_class, "keep-alive"))
     g_object_set (downloader->priv->urisrc, "keep-alive", TRUE, NULL);
   if (g_object_class_find_property (gobject_class, "extra-headers")) {
-    if (referer || refresh) {
+    if (referer || refresh || !allow_cache) {
       GstStructure *extra_headers = gst_structure_new_empty ("headers");
 
       if (referer)
         gst_structure_set (extra_headers, "Referer", G_TYPE_STRING, referer,
             NULL);
-      if (refresh)
+
+      if (!allow_cache)
+        gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
+            "no-cache", NULL);
+      else if (refresh)
         gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
             "max-age=0", NULL);
 
@@ -415,10 +420,10 @@
 GstFragment *
 gst_uri_downloader_fetch_uri (GstUriDownloader * downloader,
     const gchar * uri, const gchar * referer, gboolean compress,
-    gboolean refresh, GError ** err)
+    gboolean refresh, gboolean allow_cache, GError ** err)
 {
   return gst_uri_downloader_fetch_uri_with_range (downloader, uri,
-      referer, compress, refresh, 0, -1, err);
+      referer, compress, refresh, allow_cache, 0, -1, err);
 }
 
 /**
@@ -433,7 +438,8 @@
 GstFragment *
 gst_uri_downloader_fetch_uri_with_range (GstUriDownloader *
     downloader, const gchar * uri, const gchar * referer, gboolean compress,
-    gboolean refresh, gint64 range_start, gint64 range_end, GError ** err)
+    gboolean refresh, gboolean allow_cache,
+    gint64 range_start, gint64 range_end, GError ** err)
 {
   GstStateChangeReturn ret;
   GstFragment *download = NULL;
@@ -450,7 +456,8 @@
     goto quit;
   }
 
-  if (!gst_uri_downloader_set_uri (downloader, uri, referer, compress, refresh)) {
+  if (!gst_uri_downloader_set_uri (downloader, uri, referer, compress, refresh,
+          allow_cache)) {
     GST_WARNING_OBJECT (downloader, "Failed to set URI");
     goto quit;
   }
diff --git a/gst-libs/gst/uridownloader/gsturidownloader.h b/gst-libs/gst/uridownloader/gsturidownloader.h
index a087fd1..c40a460 100644
--- a/gst-libs/gst/uridownloader/gsturidownloader.h
+++ b/gst-libs/gst/uridownloader/gsturidownloader.h
@@ -56,8 +56,8 @@
 GType gst_uri_downloader_get_type (void);
 
 GstUriDownloader * gst_uri_downloader_new (void);
-GstFragment * gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri, const gchar * referer, gboolean compress, gboolean refresh, GError ** err);
-GstFragment * gst_uri_downloader_fetch_uri_with_range (GstUriDownloader * downloader, const gchar * uri, const gchar * referer, gboolean compress, gboolean refresh, gint64 range_start, gint64 range_end, GError ** err);
+GstFragment * gst_uri_downloader_fetch_uri (GstUriDownloader * downloader, const gchar * uri, const gchar * referer, gboolean compress, gboolean refresh, gboolean allow_cache, GError ** err);
+GstFragment * gst_uri_downloader_fetch_uri_with_range (GstUriDownloader * downloader, const gchar * uri, const gchar * referer, gboolean compress, gboolean refresh, gboolean allow_cache, gint64 range_start, gint64 range_end, GError ** err);
 void gst_uri_downloader_reset (GstUriDownloader *downloader);
 void gst_uri_downloader_cancel (GstUriDownloader *downloader);
 void gst_uri_downloader_free (GstUriDownloader *downloader);
diff --git a/gst-plugins-bad.doap b/gst-plugins-bad.doap
index 86b4dac..3a5b5a3 100644
--- a/gst-plugins-bad.doap
+++ b/gst-plugins-bad.doap
@@ -35,6 +35,16 @@
 
 <release>
   <Version>
+   <revision>1.3.2</revision>
+   <branch>1.3</branch>
+   <name></name>
+   <created>2014-05-21</created>
+   <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.3.2.tar.xz" />
+  </Version>
+ </release>
+
+<release>
+  <Version>
    <revision>1.3.1</revision>
    <branch>1.3</branch>
    <name></name>
diff --git a/gst-plugins-bad.spec b/gst-plugins-bad.spec
index 155ee5b..51d3e41 100644
--- a/gst-plugins-bad.spec
+++ b/gst-plugins-bad.spec
@@ -6,7 +6,7 @@
 
 Summary: GStreamer streaming media framework "bad" plug-ins
 Name: %{gstreamer}-plugins-bad
-Version: 1.3.1
+Version: 1.3.2
 Release: 1.gst
 # The freeze and nfs plugins are LGPLv2 (only)
 License: LGPLv2+ and LGPLv2
diff --git a/gst/asfmux/gstasfobjects.c b/gst/asfmux/gstasfobjects.c
index 798ec64..0719f5c 100644
--- a/gst/asfmux/gstasfobjects.c
+++ b/gst/asfmux/gstasfobjects.c
@@ -597,7 +597,7 @@
     if (first & 0x60) {
       GST_ERROR ("Error correction data length should be "
           "set to 0 and is reserved for future use.");
-      return FALSE;
+      goto error;
     }
     err_cor_len = (first & 0x0F);
     err_length += err_cor_len;
diff --git a/gst/autoconvert/gstautoconvert.c b/gst/autoconvert/gstautoconvert.c
index 6ff2f34..230a15c 100644
--- a/gst/autoconvert/gstautoconvert.c
+++ b/gst/autoconvert/gstautoconvert.c
@@ -91,7 +91,7 @@
 static void gst_auto_convert_dispose (GObject * object);
 
 static GstElement *gst_auto_convert_get_subelement (GstAutoConvert *
-    autoconvert, gboolean query_only);
+    autoconvert);
 static GstPad *gst_auto_convert_get_internal_sinkpad (GstAutoConvert *
     autoconvert);
 static GstPad *gst_auto_convert_get_internal_srcpad (GstAutoConvert *
@@ -211,19 +211,19 @@
 {
   GstAutoConvert *autoconvert = GST_AUTO_CONVERT (object);
 
-  GST_AUTOCONVERT_LOCK (autoconvert);
-  if (autoconvert->current_subelement) {
-    gst_object_unref (autoconvert->current_subelement);
-    autoconvert->current_subelement = NULL;
-    autoconvert->current_internal_sinkpad = NULL;
-    autoconvert->current_internal_srcpad = NULL;
-  }
+  g_clear_object (&autoconvert->current_subelement);
+  g_clear_object (&autoconvert->current_internal_sinkpad);
+  g_clear_object (&autoconvert->current_internal_srcpad);
 
-  if (autoconvert->factories) {
-    gst_plugin_feature_list_free (autoconvert->factories);
-    autoconvert->factories = NULL;
+  for (;;) {
+    GList *factories = g_atomic_pointer_get (&autoconvert->factories);
+
+    if (g_atomic_pointer_compare_and_exchange (&autoconvert->factories,
+            factories, NULL)) {
+      gst_plugin_feature_list_free (factories);
+      break;
+    }
   }
-  GST_AUTOCONVERT_UNLOCK (autoconvert);
 
   G_OBJECT_CLASS (gst_auto_convert_parent_class)->dispose (object);
 }
@@ -239,15 +239,18 @@
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     case PROP_FACTORIES:
-      GST_AUTOCONVERT_LOCK (autoconvert);
-      if (autoconvert->factories == NULL) {
+      if (g_atomic_pointer_get (&autoconvert->factories) == NULL) {
         GList *factories = g_value_get_pointer (value);
-        autoconvert->factories = g_list_copy (factories);
-        g_list_foreach (autoconvert->factories, (GFunc) g_object_ref, NULL);
-      } else
+        factories = g_list_copy (factories);
+        if (g_atomic_pointer_compare_and_exchange (&autoconvert->factories,
+                NULL, factories))
+          g_list_foreach (factories, (GFunc) g_object_ref, NULL);
+        else
+          g_list_free (factories);
+      } else {
         GST_WARNING_OBJECT (object, "Can not reset factories after they"
             " have been set or auto-discovered");
-      GST_AUTOCONVERT_UNLOCK (autoconvert);
+      }
       break;
   }
 }
@@ -263,9 +266,8 @@
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     case PROP_FACTORIES:
-      GST_AUTOCONVERT_LOCK (autoconvert);
-      g_value_set_pointer (value, &autoconvert->factories);
-      GST_AUTOCONVERT_UNLOCK (autoconvert);
+      g_value_set_pointer (value,
+          g_atomic_pointer_get (&autoconvert->factories));
       break;
   }
 }
@@ -274,48 +276,24 @@
 static GstElement *
 gst_auto_convert_get_element_by_type (GstAutoConvert * autoconvert, GType type)
 {
-  GstIterator *iter = NULL;
-  gboolean done;
-  GValue item = { 0, };
+  GList *item;
+  GstBin *bin = GST_BIN (autoconvert);
+  GstElement *element = NULL;
 
   g_return_val_if_fail (type != 0, NULL);
 
-  iter = gst_bin_iterate_elements (GST_BIN (autoconvert));
+  GST_OBJECT_LOCK (autoconvert);
 
-  if (!iter)
-    return NULL;
-
-  done = FALSE;
-  while (!done) {
-    switch (gst_iterator_next (iter, &item)) {
-      case GST_ITERATOR_OK:
-        if (G_TYPE_CHECK_VALUE_TYPE (&item, type))
-          done = TRUE;
-        else
-          g_value_unset (&item);
-        break;
-      case GST_ITERATOR_RESYNC:
-        gst_iterator_resync (iter);
-        g_value_unset (&item);
-        break;
-      case GST_ITERATOR_ERROR:
-        GST_ERROR ("Error iterating elements in bin");
-        g_value_unset (&item);
-        done = TRUE;
-        break;
-      case GST_ITERATOR_DONE:
-        g_value_unset (&item);
-        done = TRUE;
-        break;
+  for (item = bin->children; item; item = item->next) {
+    if (G_TYPE_CHECK_INSTANCE_TYPE (item->data, type)) {
+      element = gst_object_ref (item->data);
+      break;
     }
   }
-  gst_iterator_free (iter);
 
-  /* Don't need to dup, the value on the stack has a ref, we steal it */
-  if (G_VALUE_HOLDS_OBJECT (&item))
-    return g_value_get_object (&item);
-  else
-    return NULL;
+  GST_OBJECT_UNLOCK (autoconvert);
+
+  return element;
 }
 
 /**
@@ -390,8 +368,7 @@
 }
 
 static GstElement *
-gst_auto_convert_get_subelement (GstAutoConvert * autoconvert,
-    gboolean query_only)
+gst_auto_convert_get_subelement (GstAutoConvert * autoconvert)
 {
   GstElement *element = NULL;
 
@@ -512,7 +489,8 @@
   gst_pad_set_query_function (internal_srcpad,
       GST_DEBUG_FUNCPTR (gst_auto_convert_internal_src_query));
 
-  padlinkret = gst_pad_link (internal_srcpad, sinkpad);
+  padlinkret = gst_pad_link_full (internal_srcpad, sinkpad,
+      GST_PAD_LINK_CHECK_NOTHING);
   if (GST_PAD_LINK_FAILED (padlinkret)) {
     GST_WARNING_OBJECT (autoconvert, "Could not links pad %s:%s to %s:%s"
         " for reason %d",
@@ -521,7 +499,8 @@
     goto error;
   }
 
-  padlinkret = gst_pad_link (srcpad, internal_sinkpad);
+  padlinkret = gst_pad_link_full (srcpad, internal_sinkpad,
+      GST_PAD_LINK_CHECK_NOTHING);
   if (GST_PAD_LINK_FAILED (padlinkret)) {
     GST_WARNING_OBJECT (autoconvert, "Could not links pad %s:%s to %s:%s"
         " for reason %d",
@@ -667,9 +646,12 @@
   }
 
   GST_AUTOCONVERT_LOCK (autoconvert);
-  autoconvert->current_subelement = element;
-  autoconvert->current_internal_srcpad = internal_srcpad;
-  autoconvert->current_internal_sinkpad = internal_sinkpad;
+  gst_object_replace ((GstObject **) & autoconvert->current_subelement,
+      GST_OBJECT (element));
+  gst_object_replace ((GstObject **) & autoconvert->current_internal_srcpad,
+      GST_OBJECT (internal_srcpad));
+  gst_object_replace ((GstObject **) & autoconvert->current_internal_sinkpad,
+      GST_OBJECT (internal_sinkpad));
   GST_AUTOCONVERT_UNLOCK (autoconvert);
 
   gst_pad_sticky_events_foreach (autoconvert->sinkpad, sticky_event_push,
@@ -677,9 +659,10 @@
 
   gst_pad_push_event (autoconvert->sinkpad, gst_event_new_reconfigure ());
 
-  GST_INFO_OBJECT (autoconvert,
-      "Selected element %s",
-      GST_OBJECT_NAME (GST_OBJECT (autoconvert->current_subelement)));
+  GST_INFO_OBJECT (autoconvert, "Selected element %s",
+      GST_OBJECT_NAME (GST_OBJECT (element)));
+
+  gst_object_unref (element);
 
   return TRUE;
 }
@@ -721,7 +704,6 @@
 gst_auto_convert_sink_setcaps (GstAutoConvert * autoconvert, GstCaps * caps)
 {
   GList *elem;
-  GstElement *subelement;
   GstCaps *other_caps = NULL;
   GList *factories;
   GstCaps *current_caps;
@@ -737,9 +719,7 @@
     gst_caps_unref (current_caps);
   }
 
-  subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
-
-  if (subelement) {
+  if (autoconvert->current_subelement) {
     if (gst_pad_peer_query_accept_caps (autoconvert->current_internal_srcpad,
             caps)) {
       /* If we can set the new caps on the current element,
@@ -747,29 +727,22 @@
        */
       GST_DEBUG_OBJECT (autoconvert, "Could set %s:%s to %" GST_PTR_FORMAT,
           GST_DEBUG_PAD_NAME (autoconvert->current_internal_srcpad), caps);
-      gst_object_unref (subelement);
       goto get_out;
     } else {
       /* If the current element doesn't work,
        * then we remove the current element before finding a new one.
        */
       GST_AUTOCONVERT_LOCK (autoconvert);
-      if (autoconvert->current_subelement == subelement) {
-        gst_object_unref (autoconvert->current_subelement);
-        autoconvert->current_subelement = NULL;
-        autoconvert->current_internal_srcpad = NULL;
-        autoconvert->current_internal_sinkpad = NULL;
-      }
+      g_clear_object (&autoconvert->current_subelement);
+      g_clear_object (&autoconvert->current_internal_sinkpad);
+      g_clear_object (&autoconvert->current_internal_srcpad);
       GST_AUTOCONVERT_UNLOCK (autoconvert);
-      gst_object_unref (subelement);
     }
   }
 
   other_caps = gst_pad_peer_query_caps (autoconvert->srcpad, NULL);
 
-  GST_AUTOCONVERT_LOCK (autoconvert);
-  factories = autoconvert->factories;
-  GST_AUTOCONVERT_UNLOCK (autoconvert);
+  factories = g_atomic_pointer_get (&autoconvert->factories);
 
   if (!factories)
     factories = gst_auto_convert_load_factories (autoconvert);
@@ -906,7 +879,6 @@
 gst_auto_convert_load_factories (GstAutoConvert * autoconvert)
 {
   GList *all_factories;
-  GList *out_factories;
 
   all_factories =
       gst_registry_feature_filter (gst_registry_get (),
@@ -916,20 +888,12 @@
 
   g_assert (all_factories);
 
-  GST_AUTOCONVERT_LOCK (autoconvert);
-  if (autoconvert->factories == NULL) {
-    autoconvert->factories = all_factories;
-    all_factories = NULL;
-  }
-  out_factories = autoconvert->factories;
-  GST_AUTOCONVERT_UNLOCK (autoconvert);
-
-  if (all_factories) {
-    /* In this case, someone set the property while we were looking! */
+  if (g_atomic_pointer_compare_and_exchange (&autoconvert->factories, NULL,
+          all_factories)) {
     gst_plugin_feature_list_free (all_factories);
   }
 
-  return out_factories;
+  return g_atomic_pointer_get (&autoconvert->factories);
 }
 
 /* In this case, we should almost always have an internal element, because
@@ -942,20 +906,13 @@
 {
   GstFlowReturn ret = GST_FLOW_NOT_NEGOTIATED;
   GstAutoConvert *autoconvert = GST_AUTO_CONVERT (parent);
-  GstPad *internal_srcpad;
 
-  internal_srcpad = gst_auto_convert_get_internal_srcpad (autoconvert);
-  if (internal_srcpad) {
-    ret = gst_pad_push (internal_srcpad, buffer);
-    gst_object_unref (internal_srcpad);
-    if (ret != GST_FLOW_OK) {
-      GstElement *child = gst_auto_convert_get_subelement (autoconvert, TRUE);
+  if (autoconvert->current_internal_srcpad) {
+    ret = gst_pad_push (autoconvert->current_internal_srcpad, buffer);
+    if (ret != GST_FLOW_OK)
       GST_DEBUG_OBJECT (autoconvert,
-          "Child element %" GST_PTR_FORMAT "returned flow %s", child,
-          gst_flow_get_name (ret));
-      if (child)
-        gst_object_unref (child);
-    }
+          "Child element %" GST_PTR_FORMAT "returned flow %s",
+          autoconvert->current_subelement, gst_flow_get_name (ret));
   } else {
     GST_ERROR_OBJECT (autoconvert, "Got buffer without an negotiated element,"
         " returning not-negotiated");
@@ -1021,7 +978,7 @@
     return TRUE;
   }
 
-  subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+  subelement = gst_auto_convert_get_subelement (autoconvert);
   if (subelement) {
     GstPad *sub_sinkpad = get_pad_by_direction (subelement, GST_PAD_SINK);
 
@@ -1096,9 +1053,7 @@
     goto out;
   }
 
-  GST_AUTOCONVERT_LOCK (autoconvert);
-  factories = autoconvert->factories;
-  GST_AUTOCONVERT_UNLOCK (autoconvert);
+  factories = g_atomic_pointer_get (&autoconvert->factories);
 
   if (!factories)
     factories = gst_auto_convert_load_factories (autoconvert);
@@ -1143,16 +1098,14 @@
 
       element_caps = gst_pad_peer_query_caps (internal_pad, filter);
 
-      if (element_caps) {
-        if (!gst_caps_is_any (element_caps) &&
-            !gst_caps_is_empty (element_caps)) {
-          caps = gst_caps_merge (caps, element_caps);
-        } else {
-          gst_caps_unref (element_caps);
-        }
-      }
+      if (element_caps)
+        caps = gst_caps_merge (caps, element_caps);
 
       gst_object_unref (element);
+
+      /* Early out, any is absorbing */
+      if (gst_caps_is_any (caps))
+        goto out;
     } else {
       const GList *tmp;
 
@@ -1163,10 +1116,13 @@
         if (GST_PAD_TEMPLATE_DIRECTION (template) == dir) {
           GstCaps *static_caps = gst_static_pad_template_get_caps (template);
 
-          if (static_caps && !gst_caps_is_any (static_caps) &&
-              !gst_caps_is_empty (static_caps)) {
+          if (static_caps) {
             caps = gst_caps_merge (caps, static_caps);
           }
+
+          /* Early out, any is absorbing */
+          if (gst_caps_is_any (caps))
+            goto out;
         }
       }
     }
@@ -1192,11 +1148,14 @@
   GstAutoConvert *autoconvert = GST_AUTO_CONVERT (parent);
   GstPad *internal_sinkpad;
 
+  if (GST_EVENT_TYPE (event) == GST_EVENT_RECONFIGURE)
+    gst_pad_push_event (autoconvert->sinkpad, gst_event_ref (event));
+
   internal_sinkpad = gst_auto_convert_get_internal_sinkpad (autoconvert);
   if (internal_sinkpad) {
     ret = gst_pad_push_event (internal_sinkpad, event);
     gst_object_unref (internal_sinkpad);
-  } else {
+  } else if (GST_EVENT_TYPE (event) != GST_EVENT_RECONFIGURE) {
     GST_WARNING_OBJECT (autoconvert,
         "Got upstream event while no element was selected," "forwarding.");
     ret = gst_pad_push_event (autoconvert->sinkpad, event);
@@ -1214,16 +1173,17 @@
   GstElement *subelement;
 
   if (GST_QUERY_TYPE (query) == GST_QUERY_CAPS) {
-    GstCaps *caps;
+    GstCaps *filter, *caps;
 
-    caps = gst_caps_new_any ();
+    gst_query_parse_caps (query, &filter);
+    caps = gst_auto_convert_getcaps (autoconvert, filter, GST_PAD_SRC);
     gst_query_set_caps_result (query, caps);
     gst_caps_unref (caps);
 
     return TRUE;
   }
 
-  subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+  subelement = gst_auto_convert_get_subelement (autoconvert);
   if (subelement) {
     GstPad *sub_srcpad = get_pad_by_direction (subelement, GST_PAD_SRC);
 
@@ -1318,15 +1278,5 @@
       GST_AUTO_CONVERT (g_object_get_qdata (G_OBJECT (pad),
           parent_quark));
 
-  if (GST_QUERY_TYPE (query) == GST_QUERY_CAPS) {
-    GstCaps *caps;
-
-    caps = gst_caps_new_any ();
-    gst_query_set_caps_result (query, caps);
-    gst_caps_unref (caps);
-
-    return TRUE;
-  }
-
   return gst_pad_peer_query (autoconvert->sinkpad, query);
 }
diff --git a/gst/autoconvert/gstautoconvert.h b/gst/autoconvert/gstautoconvert.h
index 49e6b2a..ae40e63 100644
--- a/gst/autoconvert/gstautoconvert.h
+++ b/gst/autoconvert/gstautoconvert.h
@@ -41,14 +41,15 @@
   /*< private >*/
   GstBin bin;                   /* we extend GstBin */
 
-  /* Protected by the object lock too */
-  GList *factories;
+  volatile GList *factories;
 
   GstPad *sinkpad;
   GstPad *srcpad;
 
   /* Have to be set all at once
-   * Protected by the object lock */
+   * Protected by the object lock and the stream lock
+   * Both must be held to modify these
+   */
   GstElement *current_subelement;
   GstPad *current_internal_srcpad;
   GstPad *current_internal_sinkpad;
diff --git a/gst/bayer/gstbayerorc-dist.c b/gst/bayer/gstbayerorc-dist.c
index 661fd57..1dc708d 100644
--- a/gst/bayer/gstbayerorc-dist.c
+++ b/gst/bayer/gstbayerorc-dist.c
@@ -407,19 +407,17 @@
   orc_union16 *ORC_RESTRICT ptr0;
   orc_union16 *ORC_RESTRICT ptr1;
   const orc_union16 *ORC_RESTRICT ptr4;
+  orc_union16 var37;
+  orc_union16 var38;
   orc_union16 var39;
   orc_union16 var40;
-  orc_union16 var41;
-  orc_union16 var42;
+  orc_int8 var41;
+  orc_int8 var42;
   orc_int8 var43;
-  orc_int8 var44;
+  orc_union16 var44;
   orc_int8 var45;
   orc_int8 var46;
-  orc_union16 var47;
-  orc_int8 var48;
-  orc_int8 var49;
-  orc_int8 var50;
-  orc_int8 var51;
+  orc_int8 var47;
 
   ptr0 = (orc_union16 *) d1;
   ptr1 = (orc_union16 *) d2;
@@ -428,54 +426,52 @@
 
   for (i = 0; i < n; i++) {
     /* 0: loadoffw */
-    var42 = ptr4[i + -1];
-    /* 1: splitwb */
+    var40 = ptr4[i + -1];
+    /* 1: select1wb */
     {
       orc_union16 _src;
-      _src.i = var42.i;
-      var43 = _src.x2[1];
-      var44 = _src.x2[0];
+      _src.i = var40.i;
+      var41 = _src.x2[1];
     }
     /* 2: loadw */
-    var39 = ptr4[i];
+    var37 = ptr4[i];
     /* 3: splitwb */
     {
       orc_union16 _src;
-      _src.i = var39.i;
-      var45 = _src.x2[1];
-      var46 = _src.x2[0];
+      _src.i = var37.i;
+      var42 = _src.x2[1];
+      var43 = _src.x2[0];
     }
     /* 4: loadoffw */
-    var47 = ptr4[i + 1];
-    /* 5: splitwb */
+    var44 = ptr4[i + 1];
+    /* 5: select0wb */
     {
       orc_union16 _src;
-      _src.i = var47.i;
-      var48 = _src.x2[1];
-      var49 = _src.x2[0];
+      _src.i = var44.i;
+      var45 = _src.x2[0];
     }
     /* 6: avgub */
-    var50 = ((orc_uint8) var46 + (orc_uint8) var49 + 1) >> 1;
+    var46 = ((orc_uint8) var43 + (orc_uint8) var45 + 1) >> 1;
     /* 7: mergebw */
     {
       orc_union16 _dest;
-      _dest.x2[0] = var46;
-      _dest.x2[1] = var50;
-      var40.i = _dest.i;
+      _dest.x2[0] = var43;
+      _dest.x2[1] = var46;
+      var38.i = _dest.i;
     }
     /* 8: storew */
-    ptr0[i] = var40;
+    ptr0[i] = var38;
     /* 9: avgub */
-    var51 = ((orc_uint8) var43 + (orc_uint8) var45 + 1) >> 1;
+    var47 = ((orc_uint8) var41 + (orc_uint8) var42 + 1) >> 1;
     /* 10: mergebw */
     {
       orc_union16 _dest;
-      _dest.x2[0] = var51;
-      _dest.x2[1] = var45;
-      var41.i = _dest.i;
+      _dest.x2[0] = var47;
+      _dest.x2[1] = var42;
+      var39.i = _dest.i;
     }
     /* 11: storew */
-    ptr1[i] = var41;
+    ptr1[i] = var39;
   }
 
 }
@@ -489,19 +485,17 @@
   orc_union16 *ORC_RESTRICT ptr0;
   orc_union16 *ORC_RESTRICT ptr1;
   const orc_union16 *ORC_RESTRICT ptr4;
+  orc_union16 var37;
+  orc_union16 var38;
   orc_union16 var39;
   orc_union16 var40;
-  orc_union16 var41;
-  orc_union16 var42;
+  orc_int8 var41;
+  orc_int8 var42;
   orc_int8 var43;
-  orc_int8 var44;
+  orc_union16 var44;
   orc_int8 var45;
   orc_int8 var46;
-  orc_union16 var47;
-  orc_int8 var48;
-  orc_int8 var49;
-  orc_int8 var50;
-  orc_int8 var51;
+  orc_int8 var47;
 
   ptr0 = (orc_union16 *) ex->arrays[0];
   ptr1 = (orc_union16 *) ex->arrays[1];
@@ -510,54 +504,52 @@
 
   for (i = 0; i < n; i++) {
     /* 0: loadoffw */
-    var42 = ptr4[i + -1];
-    /* 1: splitwb */
+    var40 = ptr4[i + -1];
+    /* 1: select1wb */
     {
       orc_union16 _src;
-      _src.i = var42.i;
-      var43 = _src.x2[1];
-      var44 = _src.x2[0];
+      _src.i = var40.i;
+      var41 = _src.x2[1];
     }
     /* 2: loadw */
-    var39 = ptr4[i];
+    var37 = ptr4[i];
     /* 3: splitwb */
     {
       orc_union16 _src;
-      _src.i = var39.i;
-      var45 = _src.x2[1];
-      var46 = _src.x2[0];
+      _src.i = var37.i;
+      var42 = _src.x2[1];
+      var43 = _src.x2[0];
     }
     /* 4: loadoffw */
-    var47 = ptr4[i + 1];
-    /* 5: splitwb */
+    var44 = ptr4[i + 1];
+    /* 5: select0wb */
     {
       orc_union16 _src;
-      _src.i = var47.i;
-      var48 = _src.x2[1];
-      var49 = _src.x2[0];
+      _src.i = var44.i;
+      var45 = _src.x2[0];
     }
     /* 6: avgub */
-    var50 = ((orc_uint8) var46 + (orc_uint8) var49 + 1) >> 1;
+    var46 = ((orc_uint8) var43 + (orc_uint8) var45 + 1) >> 1;
     /* 7: mergebw */
     {
       orc_union16 _dest;
-      _dest.x2[0] = var46;
-      _dest.x2[1] = var50;
-      var40.i = _dest.i;
+      _dest.x2[0] = var43;
+      _dest.x2[1] = var46;
+      var38.i = _dest.i;
     }
     /* 8: storew */
-    ptr0[i] = var40;
+    ptr0[i] = var38;
     /* 9: avgub */
-    var51 = ((orc_uint8) var43 + (orc_uint8) var45 + 1) >> 1;
+    var47 = ((orc_uint8) var41 + (orc_uint8) var42 + 1) >> 1;
     /* 10: mergebw */
     {
       orc_union16 _dest;
-      _dest.x2[0] = var51;
-      _dest.x2[1] = var45;
-      var41.i = _dest.i;
+      _dest.x2[0] = var47;
+      _dest.x2[1] = var42;
+      var39.i = _dest.i;
     }
     /* 11: storew */
-    ptr1[i] = var41;
+    ptr1[i] = var39;
   }
 
 }
@@ -581,10 +573,9 @@
         1, 9, 24, 98, 97, 121, 101, 114, 95, 111, 114, 99, 95, 104, 111, 114,
         105, 122, 95, 117, 112, 115, 97, 109, 112, 108, 101, 11, 2, 2, 11, 2,
         2, 12, 2, 2, 14, 4, 255, 255, 255, 255, 14, 4, 1, 0, 0, 0,
-        20, 2, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 83, 32,
-        4, 16, 199, 34, 33, 32, 199, 36, 35, 4, 83, 32, 4, 17, 199, 38,
-        37, 32, 39, 37, 35, 37, 196, 0, 35, 37, 39, 34, 34, 36, 196, 1,
-        34, 36, 2, 0,
+        20, 2, 20, 1, 20, 1, 20, 1, 20, 1, 83, 32, 4, 16, 189, 33,
+        32, 199, 35, 34, 4, 83, 32, 4, 17, 188, 36, 32, 39, 36, 34, 36,
+        196, 0, 34, 36, 39, 33, 33, 35, 196, 1, 33, 35, 2, 0,
       };
       p = orc_program_new_from_static_bytecode (bc);
       orc_program_set_backup_function (p, _backup_bayer_orc_horiz_upsample);
@@ -602,26 +593,24 @@
       orc_program_add_temporary (p, 1, "t3");
       orc_program_add_temporary (p, 1, "t4");
       orc_program_add_temporary (p, 1, "t5");
-      orc_program_add_temporary (p, 1, "t6");
-      orc_program_add_temporary (p, 1, "t7");
 
       orc_program_append_2 (p, "loadoffw", 0, ORC_VAR_T1, ORC_VAR_S1,
           ORC_VAR_C1, ORC_VAR_D1);
-      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T1,
-          ORC_VAR_D1);
-      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1,
+      orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T1,
+          ORC_VAR_D1, ORC_VAR_D1);
+      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_S1,
           ORC_VAR_D1);
       orc_program_append_2 (p, "loadoffw", 0, ORC_VAR_T1, ORC_VAR_S1,
           ORC_VAR_C2, ORC_VAR_D1);
-      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_T1,
+      orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T5, ORC_VAR_T1,
+          ORC_VAR_D1, ORC_VAR_D1);
+      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T5,
           ORC_VAR_D1);
-      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T6, ORC_VAR_T4, ORC_VAR_T6,
+      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T5,
           ORC_VAR_D1);
-      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T6,
+      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T4,
           ORC_VAR_D1);
-      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T5,
-          ORC_VAR_D1);
-      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_T5,
+      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_T4,
           ORC_VAR_D1);
 #endif
 
diff --git a/gst/bayer/gstbayerorc.orc b/gst/bayer/gstbayerorc.orc
index 30e8426..d86a819 100644
--- a/gst/bayer/gstbayerorc.orc
+++ b/gst/bayer/gstbayerorc.orc
@@ -24,18 +24,16 @@
 .dest 2 d1 guint8
 .source 2 s guint8
 .temp 2 t
-.temp 1 a
 .temp 1 b
 .temp 1 c
 .temp 1 d
 .temp 1 e
-.temp 1 f
 
 loadoffw t, s, -1
-splitwb b, a, t
+select1wb b, t
 splitwb d, c, s
 loadoffw t, s, 1
-splitwb f, e, t
+select0wb e, t
 avgub e, c, e
 mergebw d0, c, e
 avgub b, b, d
diff --git a/gst/dvbsuboverlay/gstdvbsuboverlay.c b/gst/dvbsuboverlay/gstdvbsuboverlay.c
index 25d86b8..eaf1ca1 100644
--- a/gst/dvbsuboverlay/gstdvbsuboverlay.c
+++ b/gst/dvbsuboverlay/gstdvbsuboverlay.c
@@ -458,7 +458,9 @@
   caps_size = gst_caps_get_size (new_caps);
   for (i = 0; i < caps_size; i++) {
     GstCapsFeatures *features = gst_caps_get_features (new_caps, i);
-    gst_caps_features_add (features, feature);
+    if (!gst_caps_features_is_any (features)) {
+      gst_caps_features_add (features, feature);
+    }
   }
 
   gst_caps_append (new_caps, gst_caps_intersect_full (caps,
diff --git a/gst/freeverb/gstfreeverb.c b/gst/freeverb/gstfreeverb.c
index 30bcb1c..819d08c 100644
--- a/gst/freeverb/gstfreeverb.c
+++ b/gst/freeverb/gstfreeverb.c
@@ -701,7 +701,6 @@
   gboolean drained = TRUE;
 
   for (k = 0; k < num_samples; k++) {
-
     out_l1 = out_r1 = 0.0;
 
     /* The original Freeverb code expects a stereo signal and 'input_1'
@@ -729,10 +728,12 @@
     /* Calculate output */
     out_l2 = out_l1 * priv->wet1 + out_r1 * priv->wet2 + input_2 * priv->dry;
     out_r2 = out_r1 * priv->wet1 + out_l1 * priv->wet2 + input_2 * priv->dry;
-    *odata++ = (gint16) CLAMP (out_l2, G_MININT16, G_MAXINT16);
-    *odata++ = (gint16) CLAMP (out_r2, G_MININT16, G_MAXINT16);
+    out_l2 = CLAMP (out_l2, G_MININT16, G_MAXINT16);
+    out_r2 = CLAMP (out_r2, G_MININT16, G_MAXINT16);
+    *odata++ = (gint16) out_l2;
+    *odata++ = (gint16) out_r2;
 
-    if (abs (out_l2) > 0 || abs (out_r2) > 0)
+    if (abs ((gint16) out_l2) > 0 || abs ((gint16) out_r2) > 0)
       drained = FALSE;
   }
   return drained;
@@ -749,7 +750,6 @@
   gboolean drained = TRUE;
 
   for (k = 0; k < num_samples; k++) {
-
     out_l1 = out_r1 = 0.0;
 
     input_2l = (gfloat) * idata++;
@@ -775,10 +775,12 @@
     /* Calculate output */
     out_l2 = out_l1 * priv->wet1 + out_r1 * priv->wet2 + input_2l * priv->dry;
     out_r2 = out_r1 * priv->wet1 + out_l1 * priv->wet2 + input_2r * priv->dry;
-    *odata++ = (gint16) CLAMP (out_l2, G_MININT16, G_MAXINT16);
-    *odata++ = (gint16) CLAMP (out_r2, G_MININT16, G_MAXINT16);
+    out_l2 = CLAMP (out_l2, G_MININT16, G_MAXINT16);
+    out_r2 = CLAMP (out_r2, G_MININT16, G_MAXINT16);
+    *odata++ = (gint16) out_l2;
+    *odata++ = (gint16) out_r2;
 
-    if (abs (out_l2) > 0 || abs (out_r2) > 0)
+    if (abs ((gint16) out_l2) > 0 || abs ((gint16) out_r2) > 0)
       drained = FALSE;
   }
   return drained;
@@ -795,7 +797,6 @@
   gboolean drained = TRUE;
 
   for (k = 0; k < num_samples; k++) {
-
     out_l1 = out_r1 = 0.0;
 
     /* The original Freeverb code expects a stereo signal and 'input_1'
@@ -843,7 +844,6 @@
   gboolean drained = TRUE;
 
   for (k = 0; k < num_samples; k++) {
-
     out_l1 = out_r1 = 0.0;
 
     input_2l = *idata++;
diff --git a/gst/jp2kdecimator/jp2kcodestream.c b/gst/jp2kdecimator/jp2kcodestream.c
index d4f5451..943d837 100644
--- a/gst/jp2kdecimator/jp2kcodestream.c
+++ b/gst/jp2kdecimator/jp2kcodestream.c
@@ -887,6 +887,7 @@
       if (!gst_byte_reader_peek_uint16_be (reader, &marker)) {
         GST_ERROR_OBJECT (self, "Truncated file");
         ret = GST_FLOW_ERROR;
+        g_slice_free (Packet, p);
         goto done;
       }
 
@@ -898,12 +899,14 @@
         if (!gst_byte_reader_get_uint16_be (reader, &dummy)) {
           GST_ERROR_OBJECT (self, "Truncated file");
           ret = GST_FLOW_ERROR;
+          g_slice_free (Packet, p);
           goto done;
         }
 
         if (!gst_byte_reader_get_uint16_be (reader, &seqno)) {
           GST_ERROR_OBJECT (self, "Truncated file");
           ret = GST_FLOW_ERROR;
+          g_slice_free (Packet, p);
           goto done;
         }
         p->data = gst_byte_reader_peek_data_unchecked (reader);
@@ -1169,8 +1172,10 @@
         PacketLengthTilePart *plt = g_slice_new (PacketLengthTilePart);
 
         ret = parse_plt (self, reader, plt, length);
-        if (ret != GST_FLOW_OK)
+        if (ret != GST_FLOW_OK) {
+          g_slice_free (PacketLengthTilePart, plt);
           goto done;
+        }
 
         tile->plt = g_list_append (tile->plt, plt);
         break;
@@ -1787,6 +1792,8 @@
       if (l == NULL) {
         GST_ERROR_OBJECT (self, "Not enough packets");
         ret = GST_FLOW_ERROR;
+        g_array_free (plt->packet_lengths, TRUE);
+        g_slice_free (PacketLengthTilePart, plt);
         goto done;
       }
 
diff --git a/gst/mpegpsmux/psmuxstream.c b/gst/mpegpsmux/psmuxstream.c
index 9c29ec4..43f7070 100644
--- a/gst/mpegpsmux/psmuxstream.c
+++ b/gst/mpegpsmux/psmuxstream.c
@@ -147,6 +147,7 @@
   if (stream->stream_id == 0) {
     g_critical ("Number of elementary streams of type %04x exceeds maximum",
         stream->stream_type);
+    g_slice_free (PsMuxStream, stream);
     return NULL;
   }
 
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index bd105c8..0fef7c7 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -1194,12 +1194,10 @@
     GST_DEBUG ("Grabbing %d => %d", i * 65536, 65536);
 
     ret = gst_pad_pull_range (base->sinkpad, i * 65536, 65536, &buf);
-    if (G_UNLIKELY (ret == GST_FLOW_EOS)) {
-      done = TRUE;
+    if (G_UNLIKELY (ret == GST_FLOW_EOS))
       break;
-    } else if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+    if (G_UNLIKELY (ret != GST_FLOW_OK))
       goto beach;
-    }
 
     /* Push to packetizer */
     mpegts_packetizer_push (base->packetizer, buf);
@@ -1247,12 +1245,10 @@
     GST_DEBUG ("Grabbing %" G_GUINT64_FORMAT " => %d", seek_pos, 65536);
 
     ret = gst_pad_pull_range (base->sinkpad, seek_pos, 65536, &buf);
-    if (G_UNLIKELY (ret == GST_FLOW_EOS)) {
-      done = TRUE;
+    if (G_UNLIKELY (ret == GST_FLOW_EOS))
       break;
-    } else if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+    if (G_UNLIKELY (ret != GST_FLOW_OK))
       goto beach;
-    }
 
     /* Push to packetizer */
     mpegts_packetizer_push (base->packetizer, buf);
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c
index 5427388..957e532 100644
--- a/gst/mpegtsdemux/tsdemux.c
+++ b/gst/mpegtsdemux/tsdemux.c
@@ -937,7 +937,6 @@
         case DRF_ID_DTS2:
         case DRF_ID_DTS3:
           /* SMPTE registered DTS */
-          GST_LOG ("subtitling");
           template = gst_static_pad_template_get (&private_template);
           name = g_strdup_printf ("private_%04x", bstream->pid);
           caps = gst_caps_new_empty_simple ("audio/x-dts");
diff --git a/gst/mpegtsmux/tsmux/tsmux.h b/gst/mpegtsmux/tsmux/tsmux.h
index 93eba33..2368378 100644
--- a/gst/mpegtsmux/tsmux/tsmux.h
+++ b/gst/mpegtsmux/tsmux/tsmux.h
@@ -90,7 +90,6 @@
 G_BEGIN_DECLS
 
 #define TSMUX_MAX_ES_INFO_LENGTH ((1 << 12) - 1)
-#define TSMUX_MAX_SECTION_LENGTH (4096)
 
 #define TSMUX_PID_AUTO ((guint16)-1)
 
@@ -107,9 +106,6 @@
 struct TsMuxSection {
   TsMuxPacketInfo pi;
   GstMpegTsSection *section;
-
-  /* Private sections can be up to 4096 bytes */
-  guint8 data[TSMUX_MAX_SECTION_LENGTH];
 };
 
 /* Information for the streams associated with one program */
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index c2ee741..eb7fd4a 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -861,12 +861,19 @@
         caps = NULL;
       }
 
+      if (etrack->handler != NULL) {
+        MXFEssenceWrapping track_wrapping;
 
-      if (etrack->handler
-          && etrack->handler->get_track_wrapping (track) !=
-          MXF_ESSENCE_WRAPPING_FRAME_WRAPPING) {
-        GST_ERROR_OBJECT (demux, "Only frame wrapping currently supported");
-        return GST_FLOW_ERROR;
+        track_wrapping = etrack->handler->get_track_wrapping (track);
+        if (track_wrapping == MXF_ESSENCE_WRAPPING_CLIP_WRAPPING) {
+          GST_ELEMENT_ERROR (demux, STREAM, NOT_IMPLEMENTED, (NULL),
+              ("Clip essence wrapping is not implemented yet."));
+          return GST_FLOW_ERROR;
+        } else if (track_wrapping == MXF_ESSENCE_WRAPPING_CUSTOM_WRAPPING) {
+          GST_ELEMENT_ERROR (demux, STREAM, NOT_IMPLEMENTED, (NULL),
+              ("Custom essence wrappings are not supported."));
+          return GST_FLOW_ERROR;
+        }
       }
 
       etrack->source_package = package;
diff --git a/gst/pnm/gstpnmenc.c b/gst/pnm/gstpnmenc.c
index cfca151..dc09c6f 100644
--- a/gst/pnm/gstpnmenc.c
+++ b/gst/pnm/gstpnmenc.c
@@ -111,6 +111,9 @@
   gchar *header;
   GstBuffer *out;
 
+  if (s->info.width == 0 || s->info.height == 0 || s->info.fields == 0)
+    goto not_negotiated;
+
   /* Assumption: One buffer, one image. That is, always first write header. */
   header = g_strdup_printf ("P%i\n%i %i\n%i\n",
       s->info.type + 3 * (1 - s->info.encoding), s->info.width, s->info.height,
@@ -177,6 +180,12 @@
 out:
 
   return r;
+
+not_negotiated:
+  {
+    gst_buffer_unref (buf);
+    return GST_FLOW_NOT_NEGOTIATED;
+  }
 }
 
 static gboolean
diff --git a/gst/sdp/gstsdpdemux.c b/gst/sdp/gstsdpdemux.c
index 41fd99f..17e2e05 100644
--- a/gst/sdp/gstsdpdemux.c
+++ b/gst/sdp/gstsdpdemux.c
@@ -1397,6 +1397,7 @@
   }
   GST_SDP_STREAM_UNLOCK (demux);
   gst_sdp_message_uninit (&sdp);
+  g_free (data);
 
   return TRUE;
 
@@ -1405,6 +1406,7 @@
   {
     GST_SDP_STREAM_UNLOCK (demux);
     gst_sdp_message_uninit (&sdp);
+    g_free (data);
     return FALSE;
   }
 transport_failed:
diff --git a/gst/vmnc/vmncdec.c b/gst/vmnc/vmncdec.c
index 8e0830e..6d33bdd 100644
--- a/gst/vmnc/vmncdec.c
+++ b/gst/vmnc/vmncdec.c
@@ -156,6 +156,7 @@
   gint bpp, tc;
   guint32 redmask, greenmask, bluemask;
   guint32 endianness, dataendianness;
+  GstVideoCodecState *state;
 
   /* A WMVi rectangle has a 16byte payload */
   if (len < 16) {
@@ -249,8 +250,9 @@
   }
 
 
-  gst_video_decoder_set_output_state (GST_VIDEO_DECODER (dec), format,
+  state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (dec), format,
       rect->width, rect->height, dec->input_state);
+  gst_video_codec_state_unref (state);
 
   g_free (dec->imagedata);
   dec->imagedata = g_malloc (dec->format.width * dec->format.height *
diff --git a/po/af.gmo b/po/af.gmo
index 785886f..2749d1d 100644
--- a/po/af.gmo
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
index 86b1b5a..03b1309 100644
--- a/po/af.po
+++ b/po/af.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins 0.7.6\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2004-03-18 14:16+0200\n"
 "Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
 "Language-Team: Afrikaans <i18n@af.org.za>\n"
diff --git a/po/az.gmo b/po/az.gmo
index 4552fa5..77a33cc 100644
--- a/po/az.gmo
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
index c950f2a..43b1b8e 100644
--- a/po/az.po
+++ b/po/az.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-0.8.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2004-03-19 18:29+0200\n"
 "Last-Translator: Metin Amiroff <metin@karegen.com>\n"
 "Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
diff --git a/po/bg.gmo b/po/bg.gmo
index d871a4e..bfacf90 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index c48a81e..919ce8c 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-04-26 22:30+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
diff --git a/po/ca.gmo b/po/ca.gmo
index 5bd7b43..c891fa6 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index 728c24a..4c69aae 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2012-01-01 14:19+0100\n"
 "Last-Translator: Gil Forcada <gforcada@gnome.org>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
diff --git a/po/cs.gmo b/po/cs.gmo
index fa0ebf7..43d5917 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index 82b043e..568ac7e 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-09-18 10:05+0200\n"
 "Last-Translator: Marek Černocký <marek@manet.cz>\n"
 "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
diff --git a/po/da.gmo b/po/da.gmo
index 7370b28..b8b44a6 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index a4edf04..88d4209 100644
--- a/po/da.po
+++ b/po/da.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-12-08 11:28+0200\n"
 "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
diff --git a/po/de.gmo b/po/de.gmo
index bc68a41..b8050e3 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index 1a51239..099356d 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-09-21 13:34+0100\n"
 "Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
diff --git a/po/el.gmo b/po/el.gmo
index b3f4729..1df489c 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index 952769d..6bb88ca 100644
--- a/po/el.po
+++ b/po/el.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2012-05-05 19:17+0100\n"
 "Last-Translator: Savvas Radevic <vicedar@gmail.com>\n"
 "Language-Team: Greek <team@lists.gnome.gr>\n"
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index a617cc6..6fcce58 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 c744d91..30694d6 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins 0.8.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2004-04-26 10:41-0400\n"
 "Last-Translator: Gareth Owen <gowen72@yahoo.com>\n"
 "Language-Team: English (British) <en_gb@li.org>\n"
diff --git a/po/eo.gmo b/po/eo.gmo
index 0ed5013..2decad7 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index 3638b4f..a661d72 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-06-04 22:18+0200\n"
 "Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
 "Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
diff --git a/po/es.gmo b/po/es.gmo
index aff9869..90cd2ef 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index 7b5d785..7252713 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-10-02 15:47+0200\n"
 "Last-Translator: Jorge González González <aloriel@gmail.com>\n"
 "Language-Team: Spanish <es@li.org>\n"
diff --git a/po/eu.gmo b/po/eu.gmo
index e0fac7d..98ed0f0 100644
--- a/po/eu.gmo
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
index 66b2b31..c6fb647 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-0.10.17.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2010-03-25 12:30+0100\n"
 "Last-Translator: Mikel Olasagasti Uranga <hey_neken@mundurat.net>\n"
 "Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
diff --git a/po/fi.gmo b/po/fi.gmo
index 445964d..9c5ed4d 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index f5921c5..ad799a8 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.13.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2009-08-12 22:13+0300\n"
 "Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n"
 "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
diff --git a/po/fr.gmo b/po/fr.gmo
index 2f57335..9552fe7 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index 3da82bf..5430e9f 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-04-28 09:13+0200\n"
 "Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
 "Language-Team: French <traduc@traduc.org>\n"
diff --git a/po/gl.gmo b/po/gl.gmo
index 6d45f04..997ed16 100644
--- a/po/gl.gmo
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
index 7a19907..df8130d 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-09-05 12:50+0200\n"
 "Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n"
 "Language-Team: Galician <proxecto@trasno.net>\n"
diff --git a/po/gst-plugins-bad-1.0.pot b/po/gst-plugins-bad-1.0.pot
index cebdd09..d54f147 100644
--- a/po/gst-plugins-bad-1.0.pot
+++ b/po/gst-plugins-bad-1.0.pot
@@ -5,9 +5,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: gst-plugins-bad 1.3.1\n"
+"Project-Id-Version: gst-plugins-bad 1.3.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\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"
@@ -39,25 +39,25 @@
 msgid "Could not read DVD."
 msgstr ""
 
-#: ext/smoothstreaming/gstmssdemux.c:742 ext/smoothstreaming/gstmssdemux.c:923
+#: ext/smoothstreaming/gstmssdemux.c:802 ext/smoothstreaming/gstmssdemux.c:986
 msgid "This file contains no playable streams."
 msgstr ""
 
-#: ext/smoothstreaming/gstmssdemux.c:889
+#: ext/smoothstreaming/gstmssdemux.c:952
 msgid "Couldn't get the Manifest's URI"
 msgstr ""
 
-#: ext/smoothstreaming/gstmssdemux.c:1085
+#: ext/smoothstreaming/gstmssdemux.c:1405
 msgid "Failed to get fragment URL."
 msgstr ""
 
-#: ext/smoothstreaming/gstmssdemux.c:1194 ext/sndfile/gstsfsink.c:439
-#: gst/mpegtsdemux/mpegtsbase.c:1338 gst/mpegtsdemux/mpegtsbase.c:1342
+#: ext/smoothstreaming/gstmssdemux.c:1500 ext/sndfile/gstsfsink.c:439
+#: gst/mpegtsdemux/mpegtsbase.c:1334 gst/mpegtsdemux/mpegtsbase.c:1338
 #: gst/nuvdemux/gstnuvdemux.c:737
 msgid "Internal data stream error."
 msgstr ""
 
-#: ext/smoothstreaming/gstmssdemux.c:1221
+#: ext/smoothstreaming/gstmssdemux.c:1546
 msgid "Couldn't download fragments"
 msgstr ""
 
diff --git a/po/hr.gmo b/po/hr.gmo
index fdd2ae9..ecb3517 100644
--- a/po/hr.gmo
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
index 2d176c7..2a89cb1 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2012-04-16 02:06+0200\n"
 "Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
 "Language-Team: Croatian <lokalizacija@linux.hr>\n"
diff --git a/po/hu.gmo b/po/hu.gmo
index 7ae8394..6a2e677 100644
--- a/po/hu.gmo
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
index a9a3095..13f4122 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2014-03-16 12:02+0100\n"
 "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
diff --git a/po/id.gmo b/po/id.gmo
index 16ce1c2..a3e30fc 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index 4f362d7..dccc8fb 100644
--- a/po/id.po
+++ b/po/id.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-10-15 15:39+0700\n"
 "Last-Translator: Andika Triwidada <andika@gmail.com>\n"
 "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
diff --git a/po/it.gmo b/po/it.gmo
index cc7b3db..c88afce 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index a82d3e5..0f36d07 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.13.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2009-08-14 00:12+0200\n"
 "Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
diff --git a/po/ja.gmo b/po/ja.gmo
index ac520eb..9c4e4c8 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index 1a7c216..e9b0895 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-04-26 19:38+0900\n"
 "Last-Translator: Makoto Kato <makoto.kt@gmail.com>\n"
 "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
diff --git a/po/ky.gmo b/po/ky.gmo
index 7209d86..239f684 100644
--- a/po/ky.gmo
+++ b/po/ky.gmo
Binary files differ
diff --git a/po/ky.po b/po/ky.po
index b38a18a..32674de 100644
--- a/po/ky.po
+++ b/po/ky.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.5\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2007-11-13 17:16+0600\n"
 "Last-Translator: Ilyas Bakirov <just_ilyas@yahoo.com>\n"
 "Language-Team: Kirghiz <i18n-team-ky-kyrgyz@lists.sourceforge.net>\n"
diff --git a/po/lt.gmo b/po/lt.gmo
index 922a864..3302a1b 100644
--- a/po/lt.gmo
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
index 84007a8..233d5a7 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-0.10.6.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2008-05-14 02:13+0300\n"
 "Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
 "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
diff --git a/po/lv.gmo b/po/lv.gmo
index 29b5928..56deb8b 100644
--- a/po/lv.gmo
+++ b/po/lv.gmo
Binary files differ
diff --git a/po/lv.po b/po/lv.po
index 80595de..1c646e1 100644
--- a/po/lv.po
+++ b/po/lv.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2014-04-20 15:52+0300\n"
 "Last-Translator: Rihards Prieditis <rprieditis@gmail.com>\n"
 "Language-Team: Latvian <translation-team-lv@lists.sourceforge.net>\n"
diff --git a/po/mt.gmo b/po/mt.gmo
index c082c85..29d3143 100644
--- a/po/mt.gmo
+++ b/po/mt.gmo
Binary files differ
diff --git a/po/mt.po b/po/mt.po
index b4fc23b..1304486 100644
--- a/po/mt.po
+++ b/po/mt.po
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-0.10.8.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2008-10-26 20:27+0100\n"
 "Last-Translator: Michel Bugeja <michelbugeja@rabatmalta.com>\n"
 "Language-Team: Maltese <translation-team-mt@lists.sourceforge.net>\n"
diff --git a/po/nb.gmo b/po/nb.gmo
index 88396f2..f22f671 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index 171016d..9f4ed30 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2014-01-22 17:56+0100\n"
 "Last-Translator: Johnny A. Solbu <johnny@solbu.net>\n"
 "Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
diff --git a/po/nl.gmo b/po/nl.gmo
index ea9c47a..62f3992 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index e7fa1a9..cde7b74 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-09-15 13:26+0200\n"
 "Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
diff --git a/po/or.gmo b/po/or.gmo
index ea0c2bb..d5e3814 100644
--- a/po/or.gmo
+++ b/po/or.gmo
Binary files differ
diff --git a/po/or.po b/po/or.po
index 1b56345..cf7efe4 100644
--- a/po/or.po
+++ b/po/or.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-0.8.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2004-09-27 13:32+0530\n"
 "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n"
 "Language-Team: Oriya <gora_mohanty@yahoo.co.in>\n"
diff --git a/po/pl.gmo b/po/pl.gmo
index c1b0ddb..c36b37f 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index 9515fe4..4bd5a96 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-09-15 11:29+0200\n"
 "Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 2460f72..0649922 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 fef563d..750fd5a 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-12-17 01:09-0200\n"
 "Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n"
 "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
diff --git a/po/ro.gmo b/po/ro.gmo
index 1ce3af1..03d63ad 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index 6f060a7..84c4407 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.18.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2010-08-16 03:11+0300\n"
 "Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n"
 "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
diff --git a/po/ru.gmo b/po/ru.gmo
index 9c7303b..68b9f98 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index 1789b78..b2b07e1 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-09-15 08:26+0400\n"
 "Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
 "Language-Team: Russian <gnu@mx.ru>\n"
diff --git a/po/sk.gmo b/po/sk.gmo
index ad760b5..7ccdf3b 100644
--- a/po/sk.gmo
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
index 9271fe0..7c3db41 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2014-01-30 10:44+0100\n"
 "Last-Translator: Peter Tuharsky <tuharsky@misbb.sk>\n"
 "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
diff --git a/po/sl.gmo b/po/sl.gmo
index 5c28d3a..6f90f12 100644
--- a/po/sl.gmo
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
index b460f9d..faba9d4 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-04-26 15:21+0100\n"
 "Last-Translator: Klemen Košir <klemen.kosir@gmx.com>\n"
 "Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
diff --git a/po/sq.gmo b/po/sq.gmo
index 1b422a3..63670b3 100644
--- a/po/sq.gmo
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
index 249570d..5dfbed5 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.7.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2008-08-15 16:07+0200\n"
 "Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
 "Language-Team: Albanian <translation-team-sq@lists.sourceforge.net>\n"
diff --git a/po/sr.gmo b/po/sr.gmo
index 1de5d9c..094ab1e 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 4aba672..efe1f54 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-10-04 11:47+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <(nothing)>\n"
diff --git a/po/sv.gmo b/po/sv.gmo
index 39bc903..dd0631c 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 3d42c3f..31bcc68 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.13.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2009-08-12 20:29+0100\n"
 "Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
diff --git a/po/tr.gmo b/po/tr.gmo
index 892a618..5d193fe 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index 4088063..647c65c 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2011-04-26 19:21+0200\n"
 "Last-Translator: Server Acim <serveracim@gmail.com>\n"
 "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
diff --git a/po/uk.gmo b/po/uk.gmo
index 571254f..d0f6d4d 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 281d755..20a51aa 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-09-14 22:32+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
diff --git a/po/vi.gmo b/po/vi.gmo
index 5a2c156..ed16783 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index 79b21ec..ddd91c8 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-1.1.4\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2013-09-16 14:18+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index a8c2f1b..2a47d04 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 440d27d..9a0a587 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.16.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:12+0200\n"
+"POT-Creation-Date: 2014-05-21 12:31+0200\n"
 "PO-Revision-Date: 2009-11-20 18:12中国标准时间\n"
 "Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
diff --git a/sys/bluez/gstavdtputil.c b/sys/bluez/gstavdtputil.c
index ed5c276..caf7275 100644
--- a/sys/bluez/gstavdtputil.c
+++ b/sys/bluez/gstavdtputil.c
@@ -344,9 +344,9 @@
     gst_value_list_prepend_value (list, value);
   }
   if (gst_value_list_get_size (list) == 1)
-    gst_structure_set_value (structure, "mode", value);
+    gst_structure_set_value (structure, "channel-mode", value);
   else
-    gst_structure_take_value (structure, "mode", list);
+    gst_structure_take_value (structure, "channel-mode", list);
 
   g_value_unset (value);
   g_value_reset (list);
@@ -406,9 +406,9 @@
     gst_value_list_prepend_value (list, value);
   }
   if (gst_value_list_get_size (list) == 1)
-    gst_structure_set_value (structure, "allocation", value);
+    gst_structure_set_value (structure, "allocation-method", value);
   else
-    gst_structure_take_value (structure, "allocation", list);
+    gst_structure_take_value (structure, "allocation-method", list);
 
   g_value_unset (value);
   g_value_reset (list);
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index 9e24023..027281b 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -1308,7 +1308,6 @@
   object = GST_DVBSRC (element);
   GST_LOG ("fd_dvr: %d", object->fd_dvr);
 
-  //g_object_get(G_OBJECT(object), "blocksize", &buffer_size, NULL);
   buffer_size = DEFAULT_BUFFER_SIZE;
 
   /* device can not be tuned during read */
@@ -1625,7 +1624,8 @@
   props.props = dvb_prop;
 
   if (ioctl (object->fd_frontend, FE_GET_PROPERTY, &props) < 0) {
-    g_warning ("Error enumarating delsys: %s", strerror (errno));
+    GST_WARNING_OBJECT (object, "Error enumerating delsys: %s",
+        g_strerror (errno));
 
     return FALSE;
   }
@@ -1640,7 +1640,8 @@
     props.num = 1;
     props.props = dvb_prop;
     if (ioctl (object->fd_frontend, FE_SET_PROPERTY, &props) < 0) {
-      g_warning ("Error resetting tuner: %s", strerror (errno));
+      GST_WARNING_OBJECT (object, "Error resetting tuner: %s",
+          g_strerror (errno));
     }
     /* First three entries are reserved */
     n = 3;
@@ -1650,7 +1651,7 @@
       case SYS_TURBO:
         object->tone = SEC_TONE_OFF;
         if (freq > 2200000) {
-          // this must be an absolute frequency
+          /* this must be an absolute frequency */
           if (freq < SLOF) {
             freq -= LOF1;
           } else {
@@ -1676,15 +1677,15 @@
         if (object->diseqc_src == -1 || object->send_diseqc == FALSE) {
           set_prop (dvb_prop, &n, DTV_VOLTAGE, voltage);
 
-          // DTV_TONE not yet implemented
-          // set_prop (fe_props_array, &n, DTV_TONE, object->tone)
+          /* DTV_TONE not yet implemented
+           * set_prop (fe_props_array, &n, DTV_TONE, object->tone) */
         } else {
           GST_DEBUG_OBJECT (object, "Sending DISEqC");
           diseqc (object->fd_frontend, object->diseqc_src, voltage,
               object->tone);
           /* Once diseqc source is set, do not set it again until
-           * app decides to change it */
-          //object->send_diseqc = FALSE;
+           * app decides to change it
+           * object->send_diseqc = FALSE; */
         }
 
         if ((object->delsys == SYS_DVBS2) || (object->delsys == SYS_TURBO))
@@ -1730,7 +1731,7 @@
         set_prop (dvb_prop, &n, DTV_MODULATION, object->modulation);
         break;
       default:
-        g_error ("Unknown frontend type: %d", object->delsys);
+        GST_ERROR_OBJECT (object, "Unknown frontend type %u", object->delsys);
         return FALSE;
     }
     g_usleep (100000);
@@ -1746,7 +1747,8 @@
 
     GST_DEBUG_OBJECT (object, "Setting %d properties", props.num);
     if (ioctl (object->fd_frontend, FE_SET_PROPERTY, &props) < 0) {
-      g_warning ("Error tuning channel: %s", strerror (errno));
+      GST_WARNING_OBJECT (object, "Error tuning channel: %s",
+          g_strerror (errno));
     }
     for (i = 0; i < 50; i++) {
       g_usleep (100000);
@@ -1805,8 +1807,9 @@
 
     close (*fd);
     if ((*fd = open (demux_dev, O_RDWR)) < 0) {
-      g_error ("Error opening demuxer: %s (%s)", strerror (errno), demux_dev);
-      g_free (demux_dev);
+      GST_ERROR_OBJECT (object, "Error opening demuxer: %s (%s)",
+          g_strerror (errno), demux_dev);
+      continue;
     }
     g_return_if_fail (*fd != -1);
 
@@ -1821,7 +1824,7 @@
 
     if (ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter) < 0)
       GST_WARNING_OBJECT (object, "Error setting PES filter on %s: %s",
-          demux_dev, strerror (errno));
+          demux_dev, g_strerror (errno));
   }
 
   g_free (demux_dev);
diff --git a/sys/opensles/openslesringbuffer.c b/sys/opensles/openslesringbuffer.c
index 6e7f50a..59db1bb 100644
--- a/sys/opensles/openslesringbuffer.c
+++ b/sys/opensles/openslesringbuffer.c
@@ -801,8 +801,39 @@
 
   thiz = GST_OPENSLES_RING_BUFFER (rb);
 
+  /* XXX: We need to sleep a bit before destroying the player object
+   * because of a bug in Android in versions < 4.2.
+   *
+   * OpenSLES is using AudioTrack for rendering the sound. AudioTrack
+   * has a thread that pulls raw audio from the buffer queue and then
+   * passes it forward to AudioFlinger (AudioTrack::processAudioBuffer()).
+   * This thread is calling various callbacks on events, e.g. when
+   * an underrun happens or to request data. OpenSLES sets this callback
+   * on AudioTrack (audioTrack_callBack_pullFromBuffQueue() from
+   * android_AudioPlayer.cpp). Among other things this is taking a lock
+   * on the player interface.
+   *
+   * Now if we destroy the player interface object, it will first of all
+   * take the player interface lock (IObject_Destroy()). Then it destroys
+   * the audio player instance (android_audioPlayer_destroy()) which then
+   * calls stop() on the AudioTrack and deletes it. Now the destructor of
+   * AudioTrack will wait until the rendering thread (AudioTrack::processAudioBuffer())
+   * has finished.
+   *
+   * If all this happens with bad timing it can happen that the rendering
+   * thread is currently e.g. handling underrun but did not lock the player
+   * interface object yet. Then destroying happens and takes the lock and waits
+   * for the thread to finish. Then the thread tries to take the lock and waits
+   * forever.
+   *
+   * We wait a bit before destroying the player object to make sure that
+   * the rendering thread finished whatever it was doing, and then stops
+   * (note: we called gst_opensles_ringbuffer_stop() before this already).
+   */
+
   /* Destroy audio player object, and invalidate all associated interfaces */
   if (thiz->playerObject) {
+    g_usleep (50000);
     (*thiz->playerObject)->Destroy (thiz->playerObject);
     thiz->playerObject = NULL;
     thiz->playerPlay = NULL;
@@ -811,6 +842,7 @@
 
   /* Destroy audio recorder object, and invalidate all associated interfaces */
   if (thiz->recorderObject) {
+    g_usleep (50000);
     (*thiz->recorderObject)->Destroy (thiz->recorderObject);
     thiz->recorderObject = NULL;
     thiz->recorderRecord = NULL;
diff --git a/sys/shm/gstshmsrc.c b/sys/shm/gstshmsrc.c
index d8ee560..8af1f34 100644
--- a/sys/shm/gstshmsrc.c
+++ b/sys/shm/gstshmsrc.c
@@ -214,10 +214,7 @@
 static gboolean
 gst_shm_src_start_reading (GstShmSrc * self)
 {
-  GstShmPipe *gstpipe = g_slice_new0 (GstShmPipe);
-
-  gstpipe->use_count = 1;
-  gstpipe->src = gst_object_ref (self);
+  GstShmPipe *gstpipe;
 
   if (!self->socket_path) {
     GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
@@ -225,6 +222,10 @@
     return FALSE;
   }
 
+  gstpipe = g_slice_new0 (GstShmPipe);
+  gstpipe->use_count = 1;
+  gstpipe->src = gst_object_ref (self);
+
   GST_DEBUG_OBJECT (self, "Opening socket %s", self->socket_path);
 
   GST_OBJECT_LOCK (self);
diff --git a/tests/check/elements/curlsftpsink.c b/tests/check/elements/curlsftpsink.c
index 04774b4..3dd265b 100644
--- a/tests/check/elements/curlsftpsink.c
+++ b/tests/check/elements/curlsftpsink.c
@@ -51,6 +51,7 @@
   gchar *res_privkey_file = NULL;
   gchar *res_passphrase = NULL;
   gchar *res_kh_file = NULL;
+  gchar *res_host_pubkey_md5 = NULL;
   guint res_auth_type = 0;
   gboolean res_accept_unkh = FALSE;
 
@@ -73,6 +74,8 @@
   g_object_set (G_OBJECT (sink), "ssh-pub-keyfile", "public_key_file", NULL);
   g_object_set (G_OBJECT (sink), "ssh-priv-keyfile", "private_key_file", NULL);
   g_object_set (G_OBJECT (sink), "ssh-knownhosts", "known_hosts", NULL);
+  g_object_set (G_OBJECT (sink), "ssh-host-pubkey-md5",
+      "00112233445566778899aabbccddeeff", NULL);
   g_object_set (G_OBJECT (sink), "ssh-accept-unknownhost", TRUE, NULL);
   g_object_set (G_OBJECT (sink), "ssh-key-passphrase", "SoMePaSsPhRaSe", NULL);
 
@@ -86,6 +89,7 @@
       "timeout", &res_timeout, "qos-dscp", &res_qos_dscp,
       "ssh-auth-type", &res_auth_type, "ssh-pub-keyfile", &res_pubkey_file,
       "ssh-priv-keyfile", &res_privkey_file, "ssh-knownhosts", &res_kh_file,
+      "ssh-host-pubkey-md5", &res_host_pubkey_md5,
       "ssh-accept-unknownhost", &res_accept_unkh,
       "create-dirs", &res_create_dirs, "ssh-key-passphrase", &res_passphrase,
       NULL);
@@ -107,6 +111,8 @@
           strlen ("private_key_file")) == 0);
   fail_unless (strncmp (res_kh_file, "known_hosts", strlen ("known_hosts"))
       == 0);
+  fail_unless (strncmp (res_host_pubkey_md5, "00112233445566778899aabbccddeeff",
+          strlen ("00112233445566778899aabbccddeeff")) == 0);
   fail_unless (strncmp (res_passphrase, "SoMePaSsPhRaSe",
           strlen ("SoMePaSsPhRaSe")) == 0);
   fail_unless (res_accept_unkh == TRUE);
@@ -120,6 +126,7 @@
   g_free (res_privkey_file);
   g_free (res_passphrase);
   g_free (res_kh_file);
+  g_free (res_host_pubkey_md5);
 
   /* ------- change properties ------------- */
 
@@ -136,6 +143,8 @@
   g_object_set (G_OBJECT (sink), "ssh-pub-keyfile", "/xxx/pub_key", NULL);
   g_object_set (G_OBJECT (sink), "ssh-priv-keyfile", "/yyy/pvt_key", NULL);
   g_object_set (G_OBJECT (sink), "ssh-knownhosts", "/zzz/known_hosts", NULL);
+  g_object_set (G_OBJECT (sink), "ssh-host-pubkey-md5",
+      "ffeeddccbbaa99887766554433221100", NULL);
   g_object_set (G_OBJECT (sink), "ssh-accept-unknownhost", FALSE, NULL);
   g_object_set (G_OBJECT (sink), "ssh-key-passphrase", "OtherPASSphrase", NULL);
 
@@ -150,6 +159,7 @@
       "ssh-auth-type", &res_auth_type, "ssh-pub-keyfile", &res_pubkey_file,
       "ssh-priv-keyfile", &res_privkey_file, "ssh-knownhosts", &res_kh_file,
       "ssh-accept-unknownhost", &res_accept_unkh,
+      "ssh-host-pubkey-md5", &res_host_pubkey_md5,
       "ssh-key-passphrase", &res_passphrase, "create-dirs", &res_create_dirs,
       NULL);
 
@@ -170,6 +180,8 @@
           strlen ("/yyy/pvt_key")) == 0);
   fail_unless (strncmp (res_kh_file, "/zzz/known_hosts",
           strlen ("/zzz/known_host")) == 0);
+  fail_unless (strncmp (res_host_pubkey_md5, "ffeeddccbbaa99887766554433221100",
+          strlen ("ffeeddccbbaa99887766554433221100")) == 0);
   fail_unless (strncmp (res_passphrase, "OtherPASSphrase",
           strlen ("OtherPASSphrase")) == 0);
   fail_unless (res_accept_unkh == FALSE);
@@ -183,6 +195,7 @@
   g_free (res_privkey_file);
   g_free (res_passphrase);
   g_free (res_kh_file);
+  g_free (res_host_pubkey_md5);
 
   cleanup_curlsftpsink (sink);
 }
diff --git a/tests/check/libs/gstglupload.c b/tests/check/libs/gstglupload.c
index b6b5e52..66f0339 100644
--- a/tests/check/libs/gstglupload.c
+++ b/tests/check/libs/gstglupload.c
@@ -224,34 +224,6 @@
   context_class->swap_buffers (context);
 }
 
-GST_START_TEST (test_shader_compile)
-{
-  const gchar *formats[] = { "RGB", "RGBx", "RGBA", "BGR", "BGRx", "BGRA",
-    "xRGB", "xBGR", "ARGB", "ABGR", "Y444", "I420", "YV12", "Y42B", "Y41B",
-    "NV12", "NV21", "YUY2", "UYVY", "AYUV", "GRAY8", "GRAY16_LE", "GRAY16_BE"
-  };
-  guint i;
-  gboolean res;
-
-  for (i = 0; i < G_N_ELEMENTS (formats); i++) {
-    GstVideoInfo info;
-    GstVideoFormat v_format;
-
-    v_format = gst_video_format_from_string (formats[i]);
-
-    gst_video_info_set_format (&info, v_format, 320, 240);
-
-    res = gst_gl_upload_init_format (upload, &info);
-    fail_if (res == FALSE, "Failed to init upload for video format %s\n",
-        formats[i]);
-
-    gst_object_unref (upload);
-    upload = gst_gl_upload_new (context);
-  }
-}
-
-GST_END_TEST;
-
 GST_START_TEST (test_upload_data)
 {
   gpointer data[GST_VIDEO_MAX_PLANES] = { rgba_data, NULL, NULL, NULL };
@@ -264,7 +236,7 @@
   gst_gl_context_gen_texture (context, &tex_id, GST_VIDEO_FORMAT_RGBA, WIDTH,
       HEIGHT);
 
-  gst_gl_upload_init_format (upload, &in_info);
+  gst_gl_upload_set_format (upload, &in_info);
 
   res = gst_gl_upload_perform_with_data (upload, tex_id, data);
   fail_if (res == FALSE, "Failed to upload buffer: %s\n",
@@ -301,7 +273,7 @@
       rgba_data, NULL, NULL);
   gst_buffer_append_memory (buffer, (GstMemory *) gl_mem);
 
-  gst_gl_upload_init_format (upload, &in_info);
+  gst_gl_upload_set_format (upload, &in_info);
 
   res = gst_gl_upload_perform_with_buffer (upload, buffer, &tex_id);
   fail_if (res == FALSE, "Failed to upload buffer: %s\n",
@@ -343,7 +315,7 @@
   gst_gl_context_gen_texture (context, &tex_ids[0], GST_VIDEO_FORMAT_RGBA,
       WIDTH, HEIGHT);
 
-  gst_gl_upload_init_format (upload, &in_info);
+  gst_gl_upload_set_format (upload, &in_info);
   gst_buffer_add_video_meta_full (buffer, 0, GST_VIDEO_FORMAT_RGBA, WIDTH,
       HEIGHT, 1, in_info.offset, in_info.stride);
   gst_gl_upload_add_video_gl_texture_upload_meta (upload, buffer);
@@ -379,7 +351,6 @@
 
   suite_add_tcase (s, tc_chain);
   tcase_add_checked_fixture (tc_chain, setup, teardown);
-  tcase_add_test (tc_chain, test_shader_compile);
   tcase_add_test (tc_chain, test_upload_data);
   tcase_add_test (tc_chain, test_upload_buffer);
   tcase_add_test (tc_chain, test_upload_meta_producer);
diff --git a/tests/check/orc/bayer.c b/tests/check/orc/bayer.c
index 7473377..a158be8 100644
--- a/tests/check/orc/bayer.c
+++ b/tests/check/orc/bayer.c
@@ -199,19 +199,17 @@
   orc_union16 * ORC_RESTRICT ptr0;
   orc_union16 * ORC_RESTRICT ptr1;
   const orc_union16 * ORC_RESTRICT ptr4;
+  orc_union16 var37;
+  orc_union16 var38;
   orc_union16 var39;
   orc_union16 var40;
-  orc_union16 var41;
-  orc_union16 var42;
+  orc_int8 var41;
+  orc_int8 var42;
   orc_int8 var43;
-  orc_int8 var44;
+  orc_union16 var44;
   orc_int8 var45;
   orc_int8 var46;
-  orc_union16 var47;
-  orc_int8 var48;
-  orc_int8 var49;
-  orc_int8 var50;
-  orc_int8 var51;
+  orc_int8 var47;
 
   ptr0 = (orc_union16 *)ex->arrays[0];
   ptr1 = (orc_union16 *)ex->arrays[1];
@@ -220,54 +218,52 @@
 
   for (i = 0; i < n; i++) {
     /* 0: loadoffw */
-    var42 = ptr4[i + -1];
-    /* 1: splitwb */
+    var40 = ptr4[i + -1];
+    /* 1: select1wb */
     {
        orc_union16 _src;
-       _src.i = var42.i;
-       var43 = _src.x2[1];
-       var44 = _src.x2[0];
+       _src.i = var40.i;
+       var41 = _src.x2[1];
     }
     /* 2: loadw */
-    var39 = ptr4[i];
+    var37 = ptr4[i];
     /* 3: splitwb */
     {
        orc_union16 _src;
-       _src.i = var39.i;
-       var45 = _src.x2[1];
-       var46 = _src.x2[0];
+       _src.i = var37.i;
+       var42 = _src.x2[1];
+       var43 = _src.x2[0];
     }
     /* 4: loadoffw */
-    var47 = ptr4[i + 1];
-    /* 5: splitwb */
+    var44 = ptr4[i + 1];
+    /* 5: select0wb */
     {
        orc_union16 _src;
-       _src.i = var47.i;
-       var48 = _src.x2[1];
-       var49 = _src.x2[0];
+       _src.i = var44.i;
+       var45 = _src.x2[0];
     }
     /* 6: avgub */
-    var50 = ((orc_uint8)var46 + (orc_uint8)var49 + 1)>>1;
+    var46 = ((orc_uint8)var43 + (orc_uint8)var45 + 1)>>1;
     /* 7: mergebw */
     {
        orc_union16 _dest;
-       _dest.x2[0] = var46;
-       _dest.x2[1] = var50;
-       var40.i = _dest.i;
+       _dest.x2[0] = var43;
+       _dest.x2[1] = var46;
+       var38.i = _dest.i;
     }
     /* 8: storew */
-    ptr0[i] = var40;
+    ptr0[i] = var38;
     /* 9: avgub */
-    var51 = ((orc_uint8)var43 + (orc_uint8)var45 + 1)>>1;
+    var47 = ((orc_uint8)var41 + (orc_uint8)var42 + 1)>>1;
     /* 10: mergebw */
     {
        orc_union16 _dest;
-       _dest.x2[0] = var51;
-       _dest.x2[1] = var45;
-       var41.i = _dest.i;
+       _dest.x2[0] = var47;
+       _dest.x2[1] = var42;
+       var39.i = _dest.i;
     }
     /* 11: storew */
-    ptr1[i] = var41;
+    ptr1[i] = var39;
   }
 
 }
@@ -1480,18 +1476,16 @@
     orc_program_add_temporary (p, 1, "t3");
     orc_program_add_temporary (p, 1, "t4");
     orc_program_add_temporary (p, 1, "t5");
-    orc_program_add_temporary (p, 1, "t6");
-    orc_program_add_temporary (p, 1, "t7");
 
       orc_program_append_2 (p, "loadoffw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1, ORC_VAR_D1);
-      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1);
-      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_S1, ORC_VAR_D1);
+      orc_program_append_2 (p, "select1wb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
+      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_D1);
       orc_program_append_2 (p, "loadoffw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C2, ORC_VAR_D1);
-      orc_program_append_2 (p, "splitwb", 0, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1);
-      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T6, ORC_VAR_T4, ORC_VAR_T6, ORC_VAR_D1);
-      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T4, ORC_VAR_T6, ORC_VAR_D1);
-      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T5, ORC_VAR_D1);
-      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D2, ORC_VAR_T3, ORC_VAR_T5, ORC_VAR_D1);
+      orc_program_append_2 (p, "select0wb", 0, ORC_VAR_T5, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
+      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T5, ORC_VAR_T3, ORC_VAR_T5, ORC_VAR_D1);
+      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D1, ORC_VAR_T3, ORC_VAR_T5, ORC_VAR_D1);
+      orc_program_append_2 (p, "avgub", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T4, ORC_VAR_D1);
+      orc_program_append_2 (p, "mergebw", 0, ORC_VAR_D2, ORC_VAR_T2, ORC_VAR_T4, ORC_VAR_D1);
 
     if (benchmark) {
       printf ("    cycles (emulate) :   %g\n",
diff --git a/tests/examples/gl/clutter/clutteractor.c b/tests/examples/gl/clutter/clutteractor.c
index 44c97ba..1fcae0e 100644
--- a/tests/examples/gl/clutter/clutteractor.c
+++ b/tests/examples/gl/clutter/clutteractor.c
@@ -51,7 +51,7 @@
   //ClutterTimeline *timeline;
   ClutterAnimation *animation = NULL;
 
-  actor->texture = g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP,
+  actor->texture = g_object_new (CLUTTER_X11_TYPE_TEXTURE_PIXMAP,
       "window", actor->win, "automatic-updates", TRUE, NULL);
   clutter_container_add_actor (CLUTTER_CONTAINER (actor->stage),
       actor->texture);
diff --git a/tests/examples/gl/clutter/clutteractortee.c b/tests/examples/gl/clutter/clutteractortee.c
index a46f323..73f7a60 100644
--- a/tests/examples/gl/clutter/clutteractortee.c
+++ b/tests/examples/gl/clutter/clutteractortee.c
@@ -53,7 +53,7 @@
 {
   static gint xpos = 0;
   static gint ypos = 0;
-  actor->texture = g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP,
+  actor->texture = g_object_new (CLUTTER_X11_TYPE_TEXTURE_PIXMAP,
       "window", actor->win, "automatic-updates", TRUE, NULL);
   clutter_container_add_actor (CLUTTER_CONTAINER (actor->stage),
       actor->texture);
diff --git a/tests/examples/gl/clutter/cluttershare.c b/tests/examples/gl/clutter/cluttershare.c
index d3f1b1e..de7cd66 100644
--- a/tests/examples/gl/clutter/cluttershare.c
+++ b/tests/examples/gl/clutter/cluttershare.c
@@ -25,8 +25,8 @@
 
 #define CLUTTER_VERSION_MIN_REQUIRED CLUTTER_VERSION_1_8
 #define CLUTTER_VERSION_MAX_ALLOWED CLUTTER_VERSION_1_10
-#define COGL_VERSION_MIN_REQUIRED COGL_VERSION_1_16
-#define COGL_VERSION_MAX_ALLOWED COGL_VERSION_1_18
+#define COGL_VERSION_MIN_REQUIRED COGL_VERSION_ENCODE (1, 16, 0)
+#define COGL_VERSION_MAX_ALLOWED COGL_VERSION_ENCODE (1, 18, 0)
 #include <clutter/clutter.h>
 #ifndef WIN32
 #include <clutter/x11/clutter-x11.h>
diff --git a/tests/examples/gl/generic/cube/main.cpp b/tests/examples/gl/generic/cube/main.cpp
index b3b167c..e7ebaae 100644
--- a/tests/examples/gl/generic/cube/main.cpp
+++ b/tests/examples/gl/generic/cube/main.cpp
@@ -75,7 +75,6 @@
 }
 
 //client draw callback
-
 static gboolean drawCallback (GLuint texture, GLuint width, GLuint height, gpointer data)
 {
     static GLfloat	xrot = 0;
@@ -244,5 +243,4 @@
     gst_object_unref (pipeline);
 
     return 0;
-
 }
diff --git a/tests/examples/gl/generic/cubeyuv/main.cpp b/tests/examples/gl/generic/cubeyuv/main.cpp
index 6e17b6a..1796447 100644
--- a/tests/examples/gl/generic/cubeyuv/main.cpp
+++ b/tests/examples/gl/generic/cubeyuv/main.cpp
@@ -33,13 +33,13 @@
 {
     GMainLoop *loop = (GMainLoop*)data;
 
-    switch (GST_MESSAGE_TYPE (msg)) 
+    switch (GST_MESSAGE_TYPE (msg))
     {
         case GST_MESSAGE_EOS:
               g_print ("End-of-stream\n");
               g_main_loop_quit (loop);
               break;
-        case GST_MESSAGE_ERROR: 
+        case GST_MESSAGE_ERROR:
           {
               gchar *debug = NULL;
               GError *err = NULL;
@@ -49,7 +49,7 @@
               g_print ("Error: %s\n", err->message);
               g_error_free (err);
 
-              if (debug) 
+              if (debug)
               {
                   g_print ("Debug deails: %s\n", debug);
                   g_free (debug);
@@ -57,7 +57,7 @@
 
               g_main_loop_quit (loop);
               break;
-          } 
+          }
         default:
           break;
     }
@@ -72,7 +72,7 @@
     static GstClockTime last_timestamp = 0;
     static gint nbFrames = 0 ;
 
-    //display estimated video FPS 
+    //display estimated video FPS
     nbFrames++ ;
     if (GST_BUFFER_TIMESTAMP(buffer) - last_timestamp >= 1000000000)
     {
@@ -81,7 +81,7 @@
         std::string s(oss.str()) ;
         g_object_set(G_OBJECT(textoverlay), "text", s.c_str(), NULL);
         last_timestamp = GST_BUFFER_TIMESTAMP(buffer) ;
-        nbFrames = 0 ; 
+        nbFrames = 0 ;
     }
 }
 
@@ -92,32 +92,31 @@
     glViewport(0, 0, width, height);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
-    gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100);  
-    glMatrixMode(GL_MODELVIEW);	
+    gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100);
+    glMatrixMode(GL_MODELVIEW);
 }
 
 
 //client draw callback
 static gboolean drawCallback (GLuint texture, GLuint width, GLuint height)
 {
-    
     static GLfloat	xrot = 0;
-    static GLfloat	yrot = 0;				
+    static GLfloat	yrot = 0;
     static GLfloat	zrot = 0;
     static GTimeVal current_time;
     static glong last_sec = current_time.tv_sec;
-    static gint nbFrames = 0;  
+    static gint nbFrames = 0;
 
     g_get_current_time (&current_time);
     nbFrames++ ;
-    
+
     if ((current_time.tv_sec - last_sec) >= 1)
     {
         std::cout << "GRPHIC FPS = " << nbFrames << std::endl;
         nbFrames = 0;
         last_sec = current_time.tv_sec;
     }
-  
+
     glEnable(GL_DEPTH_TEST);
 
     glEnable (GL_TEXTURE_2D);
@@ -131,7 +130,7 @@
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
-	
+
     glTranslatef(0.0f,0.0f,-5.0f);
 
     glRotatef(xrot,1.0f,0.0f,0.0f);
@@ -169,7 +168,7 @@
 	      glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
 	      glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f,  1.0f,  1.0f);
 	      glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f,  1.0f, -1.0f);
-    glEnd(); 
+    glEnd();
 
 	xrot+=0.03f;
     yrot+=0.02f;
@@ -192,9 +191,9 @@
 static void cb_new_pad (GstElement* decodebin, GstPad* pad, GstElement* identity)
 {
     GstPad* identity_pad = gst_element_get_static_pad (identity, "sink");
-    
-    //only link once 
-    if (GST_PAD_IS_LINKED (identity_pad)) 
+
+    //only link once
+    if (GST_PAD_IS_LINKED (identity_pad))
     {
         gst_object_unref (identity_pad);
         return;
@@ -202,7 +201,7 @@
 
     GstCaps* caps = gst_pad_get_current_caps (pad);
     GstStructure* str = gst_caps_get_structure (caps, 0);
-    if (!g_strrstr (gst_structure_get_name (str), "video")) 
+    if (!g_strrstr (gst_structure_get_name (str), "video"))
     {
         gst_caps_unref (caps);
         gst_object_unref (identity_pad);
@@ -211,8 +210,8 @@
     gst_caps_unref (caps);
 
     GstPadLinkReturn ret = gst_pad_link (pad, identity_pad);
-    if (ret != GST_PAD_LINK_OK) 
-        g_warning ("Failed to link with decodebin!\n");   
+    if (ret != GST_PAD_LINK_OK)
+        g_warning ("Failed to link with decodebin!\n");
 }
 
 
@@ -223,9 +222,9 @@
         g_warning ("usage: cubeyuv.exe videolocation\n");
         return -1;
     }
-    
+
     std::string video_location(argv[1]);
-    
+
     /* initialization */
     gst_init (&argc, &argv);
     GMainLoop* loop = g_main_loop_new (NULL, FALSE);
@@ -267,7 +266,7 @@
     g_object_set(G_OBJECT(textoverlay), "font_desc", "Ahafoni CLM Bold 30", NULL);
     g_object_set(G_OBJECT(glimagesink), "client-reshape-callback", reshapeCallback, NULL);
     g_object_set(G_OBJECT(glimagesink), "client-draw-callback", drawCallback, NULL);
-    
+
     /* add elements */
     gst_bin_add_many (GST_BIN (pipeline), videosrc, decodebin, identity,
         textoverlay, glcolorscale, glimagesink, NULL);
@@ -277,7 +276,7 @@
 
     g_signal_connect (decodebin, "pad-added", G_CALLBACK (cb_new_pad), identity);
 
-    if (!gst_element_link_pads(identity, "src", textoverlay, "video_sink")) 
+    if (!gst_element_link_pads(identity, "src", textoverlay, "video_sink"))
     {
         g_print ("Failed to link identity to textoverlay!\n");
         return -1;
@@ -292,16 +291,16 @@
         g_warning("Failed to link textoverlay to glimagesink!\n") ;
         return -1 ;
     }
-    
+
     /* run */
     GstStateChangeReturn ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
-    if (ret == GST_STATE_CHANGE_FAILURE) 
+    if (ret == GST_STATE_CHANGE_FAILURE)
     {
         g_print ("Failed to start up pipeline!\n");
 
         /* check if there is an error message with details on the bus */
         GstMessage* msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
-        if (msg) 
+        if (msg)
         {
           GError *err = NULL;
 
@@ -320,6 +319,4 @@
     gst_object_unref (pipeline);
 
     return 0;
-
 }
-    
diff --git a/tests/examples/gl/generic/doublecube/main.cpp b/tests/examples/gl/generic/doublecube/main.cpp
index 4f28336..4ff6338 100644
--- a/tests/examples/gl/generic/doublecube/main.cpp
+++ b/tests/examples/gl/generic/doublecube/main.cpp
@@ -33,13 +33,13 @@
 {
     GMainLoop *loop = (GMainLoop*)data;
 
-    switch (GST_MESSAGE_TYPE (msg)) 
+    switch (GST_MESSAGE_TYPE (msg))
     {
         case GST_MESSAGE_EOS:
               g_print ("End-of-stream\n");
               g_main_loop_quit (loop);
               break;
-        case GST_MESSAGE_ERROR: 
+        case GST_MESSAGE_ERROR:
           {
               gchar *debug = NULL;
               GError *err = NULL;
@@ -49,7 +49,7 @@
               g_print ("Error: %s\n", err->message);
               g_error_free (err);
 
-              if (debug) 
+              if (debug)
               {
                   g_print ("Debug details: %s\n", debug);
                   g_free (debug);
@@ -57,7 +57,7 @@
 
               g_main_loop_quit (loop);
               break;
-          } 
+          }
         default:
           break;
     }
@@ -72,16 +72,16 @@
   static GstClockTime last_timestamp = 0;
   static gint nbFrames = 0 ;
 
-  //display estimated video FPS 
+  //display estimated video FPS
   nbFrames++ ;
   if (GST_BUFFER_TIMESTAMP(info->data) - last_timestamp >= 1000000000)
   {
-    std::ostringstream oss ;
+    std::ostringstream oss;
     oss << "video framerate = " << nbFrames ;
-    std::string s(oss.str()) ;    
+    std::string s(oss.str());
     g_object_set(G_OBJECT(textoverlay), "text", s.c_str(), NULL);
     last_timestamp = GST_BUFFER_TIMESTAMP(info->data) ;
-    nbFrames = 0 ; 
+    nbFrames = 0;
   }
 
   return GST_PAD_PROBE_OK;
@@ -94,8 +94,8 @@
     glViewport(0, 0, width, height);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
-    gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100);  
-    glMatrixMode(GL_MODELVIEW);	
+    gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100);
+    glMatrixMode(GL_MODELVIEW);
 }
 
 
@@ -103,15 +103,15 @@
 static gboolean drawCallback (GLuint texture, GLuint width, GLuint height)
 {
     static GLfloat	xrot = 0;
-    static GLfloat	yrot = 0;				
+    static GLfloat	yrot = 0;
     static GLfloat	zrot = 0;
     static GTimeVal current_time;
     static glong last_sec = current_time.tv_sec;
-    static gint nbFrames = 0;  
+    static gint nbFrames = 0;
 
     g_get_current_time (&current_time);
     nbFrames++ ;
-    
+
     if ((current_time.tv_sec - last_sec) >= 1)
     {
         std::cout << "GRAPHIC FPS of the scene which contains the custom cube) = " << nbFrames << std::endl;
@@ -132,7 +132,7 @@
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
-	
+
     glTranslatef(0.0f,0.0f,-5.0f);
 
     glRotatef(xrot,1.0f,0.0f,0.0f);
@@ -193,9 +193,9 @@
 static void cb_new_pad (GstElement* decodebin, GstPad* pad, GstElement* element)
 {
     GstPad* element_pad = gst_element_get_static_pad (element, "sink");
-    
-    //only link once 
-    if (!element_pad || GST_PAD_IS_LINKED (element_pad)) 
+
+    //only link once
+    if (!element_pad || GST_PAD_IS_LINKED (element_pad))
     {
         gst_object_unref (element_pad);
         return;
@@ -203,11 +203,11 @@
 
     GstCaps* caps = gst_pad_get_current_caps (pad);
     GstStructure* str = gst_caps_get_structure (caps, 0);
-    
+
     GstCaps* caps2 = gst_pad_query_caps (element_pad, NULL);
     gst_caps_unref (caps2);
-    
-    if (!g_strrstr (gst_structure_get_name (str), "video")) 
+
+    if (!g_strrstr (gst_structure_get_name (str), "video"))
     {
         gst_caps_unref (caps);
         gst_object_unref (element_pad);
@@ -216,7 +216,7 @@
     gst_caps_unref (caps);
 
     GstPadLinkReturn ret = gst_pad_link (pad, element_pad);
-    if (ret != GST_PAD_LINK_OK) 
+    if (ret != GST_PAD_LINK_OK)
         g_warning ("Failed to link with decodebin %d!\n", ret);
     gst_object_unref (element_pad);
 }
@@ -224,13 +224,12 @@
 
 gint main (gint argc, gchar *argv[])
 {
-
     if (argc != 2)
     {
         g_warning ("usage: doublecube.exe videolocation\n");
         return -1;
     }
-    
+
     std::string video_location(argv[1]);
 
     /* initialization */
@@ -267,7 +266,7 @@
     if (!videosrc || !decodebin || !videoconvert || !textoverlay || !tee ||
         !queue0 || !glimagesink0 ||
         !queue1 || !glfiltercube || !glimagesink1 ||
-        !queue2 || !glimagesink2) 
+        !queue2 || !glimagesink2)
     {
         g_warning ("one element could not be found \n");
         return -1;
@@ -284,33 +283,33 @@
     g_object_set(G_OBJECT(textoverlay), "font_desc", "Ahafoni CLM Bold 30", NULL);
     g_object_set(G_OBJECT(glimagesink0), "client-reshape-callback", reshapeCallback, NULL);
     g_object_set(G_OBJECT(glimagesink0), "client-draw-callback", drawCallback, NULL);
-    
+
     /* add elements */
     gst_bin_add_many (GST_BIN (pipeline), videosrc, decodebin, videoconvert, textoverlay, tee, 
                                           queue0, glimagesink0,
-                                          queue1, glfiltercube, glimagesink1, 
+                                          queue1, glfiltercube, glimagesink1,
                                           queue2, glimagesink2, NULL);
-    
+
     GstPad* textoverlay_sink_pad = gst_element_get_static_pad (textoverlay, "video_sink");
-    gst_pad_add_probe (textoverlay_sink_pad, GST_PAD_PROBE_TYPE_BUFFER, 
+    gst_pad_add_probe (textoverlay_sink_pad, GST_PAD_PROBE_TYPE_BUFFER,
                        (GstPadProbeCallback) textoverlay_sink_pad_probe_cb, (gpointer)textoverlay, NULL);
     gst_object_unref (textoverlay_sink_pad);
 
-    if (!gst_element_link_many(videoconvert, textoverlay, tee, NULL)) 
+    if (!gst_element_link_many(videoconvert, textoverlay, tee, NULL))
     {
         g_print ("Failed to link videoconvert to tee!\n");
         return -1;
     }
 
-    if (!gst_element_link(videosrc, decodebin)) 
+    if (!gst_element_link(videosrc, decodebin))
     {
         g_print ("Failed to link videosrc to decodebin!\n");
         return -1;
     }
 
     g_signal_connect (decodebin, "pad-added", G_CALLBACK (cb_new_pad), videoconvert);
-    
-    if (!gst_element_link_many(tee, queue0, NULL)) 
+
+    if (!gst_element_link_many(tee, queue0, NULL))
     {
         g_warning ("Failed to link one or more elements bettween tee and queue0!\n");
         return -1;
@@ -324,27 +323,27 @@
         return -1 ;
     }
 
-    if (!gst_element_link_many(tee, queue1, glfiltercube, glimagesink1, NULL)) 
+    if (!gst_element_link_many(tee, queue1, glfiltercube, glimagesink1, NULL))
     {
         g_warning ("Failed to link one or more elements bettween tee and glimagesink1!\n");
         return -1;
     }
 
-    if (!gst_element_link_many(tee, queue2, glimagesink2, NULL)) 
+    if (!gst_element_link_many(tee, queue2, glimagesink2, NULL))
     {
         g_warning ("Failed to link one or more elements bettween tee and glimagesink2!\n");
         return -1;
     }
-    
+
     /* run */
     GstStateChangeReturn ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
-    if (ret == GST_STATE_CHANGE_FAILURE) 
+    if (ret == GST_STATE_CHANGE_FAILURE)
     {
         g_print ("Failed to start up pipeline!\n");
 
         /* check if there is an error message with details on the bus */
         GstMessage* msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
-        if (msg) 
+        if (msg)
         {
           GError *err = NULL;
 
@@ -363,6 +362,4 @@
     gst_object_unref (pipeline);
 
     return 0;
-
 }
-    
diff --git a/tests/examples/gl/generic/recordgraphic/main.cpp b/tests/examples/gl/generic/recordgraphic/main.cpp
index fd0ceb0..7771ac2 100644
--- a/tests/examples/gl/generic/recordgraphic/main.cpp
+++ b/tests/examples/gl/generic/recordgraphic/main.cpp
@@ -33,13 +33,13 @@
 {
     GMainLoop *loop = (GMainLoop*)data;
 
-    switch (GST_MESSAGE_TYPE (msg)) 
+    switch (GST_MESSAGE_TYPE (msg))
     {
         case GST_MESSAGE_EOS:
               g_print ("End-of-stream\n");
               g_main_loop_quit (loop);
               break;
-        case GST_MESSAGE_ERROR: 
+        case GST_MESSAGE_ERROR:
           {
               gchar *debug = NULL;
               GError *err = NULL;
@@ -49,7 +49,7 @@
               g_print ("Error: %s\n", err->message);
               g_error_free (err);
 
-              if (debug) 
+              if (debug)
               {
                   g_print ("Debug details: %s\n", debug);
                   g_free (debug);
@@ -57,7 +57,7 @@
 
               g_main_loop_quit (loop);
               break;
-          } 
+          }
         default:
           break;
     }
@@ -71,8 +71,8 @@
     glViewport(0, 0, width, height);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
-    gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100);  
-    glMatrixMode(GL_MODELVIEW);	
+    gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100);
+    glMatrixMode(GL_MODELVIEW);
 }
 
 
@@ -80,22 +80,22 @@
 static gboolean drawCallback (GLuint width, GLuint height, GLuint texture, gpointer data)
 {
     static GLfloat	xrot = 0;
-    static GLfloat	yrot = 0;				
+    static GLfloat	yrot = 0;
     static GLfloat	zrot = 0;
     static GTimeVal current_time;
     static glong last_sec = current_time.tv_sec;
-    static gint nbFrames = 0;  
+    static gint nbFrames = 0;
 
     g_get_current_time (&current_time);
     nbFrames++ ;
-    
+
     if ((current_time.tv_sec - last_sec) >= 1)
     {
         std::cout << "GRPHIC FPS = " << nbFrames << std::endl;
         nbFrames = 0;
         last_sec = current_time.tv_sec;
     }
-  
+
     glEnable(GL_DEPTH_TEST);
 
     glEnable (GL_TEXTURE_2D);
@@ -109,7 +109,7 @@
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
-	
+
     glTranslatef(0.0f,0.0f,-5.0f);
 
     glRotatef(xrot,1.0f,0.0f,0.0f);
@@ -159,8 +159,8 @@
 }
 
 
-//equivalent command line: 
-//gst-launch-1.0 videotestsrc num_buffers=400 ! gleffects effect=0 ! 
+//equivalent command line:
+//gst-launch-1.0 videotestsrc num_buffers=400 ! gleffects effect=0 !
 //avenc_mpeg4 ! avimux ! filesink location="record.avi"
 // or
 //gst-launch-1.0 videotestsrc num_buffers=400 ! gleffects effect=0 ! "video/x-raw, width=320, height=240" ! glfiltercube ! "video/x-raw, width=720, height=576" ! 
@@ -193,7 +193,7 @@
     filesink  = gst_element_factory_make ("filesink", "filesink0");
 
 
-    if (!videosrc || !glfilterapp || !avenc_mpeg4 || !avimux || !filesink) 
+    if (!videosrc || !glfilterapp || !avenc_mpeg4 || !avimux || !filesink)
     {
         g_print ("one element could not be found \n");
         return -1;
@@ -219,11 +219,11 @@
     g_object_set(G_OBJECT(glfilterapp), "client-draw-callback", drawCallback, NULL);
     g_object_set(G_OBJECT(glfilterapp), "client-data", NULL, NULL);
     g_object_set(G_OBJECT(filesink), "location", "record.avi", NULL);
-    
+
     /* add elements */
-    gst_bin_add_many (GST_BIN (pipeline), videosrc, glfilterapp, 
+    gst_bin_add_many (GST_BIN (pipeline), videosrc, glfilterapp,
         avenc_mpeg4, avimux, filesink, NULL);
-    
+
     /* link elements */
     gboolean link_ok = gst_element_link_filtered(videosrc, glfilterapp, caps) ;
     gst_caps_unref(caps) ;
@@ -240,22 +240,22 @@
         g_warning("Failed to link glfilterapp to avenc_mpeg4!\n") ;
         return -1 ;
     }
-    if (!gst_element_link_many(avenc_mpeg4, avimux, filesink, NULL)) 
+    if (!gst_element_link_many(avenc_mpeg4, avimux, filesink, NULL))
     {
         g_print ("Failed to link one or more elements!\n");
         return -1;
     }
 
-    
+
     /* run */
     ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
-    if (ret == GST_STATE_CHANGE_FAILURE) 
+    if (ret == GST_STATE_CHANGE_FAILURE)
     {
         g_print ("Failed to start up pipeline!\n");
 
         /* check if there is an error message with details on the bus */
         GstMessage* msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
-        if (msg) 
+        if (msg)
         {
           GError *err = NULL;
 
@@ -274,5 +274,4 @@
     gst_object_unref (pipeline);
 
     return 0;
-
 }
diff --git a/win32/common/config.h b/win32/common/config.h
index 6a9ab67..dd4fefb 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -86,7 +86,7 @@
 #define GST_PACKAGE_ORIGIN "Unknown package origin"
 
 /* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2014-05-03"
+#define GST_PACKAGE_RELEASE_DATETIME "2014-05-21"
 
 /* Define if static plugins should be built */
 #undef GST_PLUGIN_BUILD_STATIC
@@ -631,7 +631,7 @@
 #define PACKAGE_NAME "GStreamer Bad Plug-ins"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GStreamer Bad Plug-ins 1.3.1"
+#define PACKAGE_STRING "GStreamer Bad Plug-ins 1.3.2"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "gst-plugins-bad"
@@ -640,7 +640,7 @@
 #undef PACKAGE_URL
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "1.3.1"
+#define PACKAGE_VERSION "1.3.2"
 
 /* directory where plugins are located */
 #ifdef _DEBUG
@@ -680,7 +680,7 @@
 #undef USE_EGL_RPI
 
 /* Version number of package */
-#define VERSION "1.3.1"
+#define VERSION "1.3.2"
 
 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    significant byte first (like Motorola and SPARC, unlike Intel). */