diff --git a/gst/playback/gstplaybin2.c b/gst/playback/gstplaybin2.c
index 12d72eb..b0b3967 100644
--- a/gst/playback/gstplaybin2.c
+++ b/gst/playback/gstplaybin2.c
@@ -392,6 +392,7 @@ struct _GstPlayBin
   GstElement *audio_sink;       /* configured audio sink, or NULL      */
   GstElement *video_sink;       /* configured video sink, or NULL      */
   GstElement *text_sink;        /* configured text sink, or NULL       */
+  GstElement *colorspace_bin;   /* configured text sink, or NULL       */
 
   struct
   {
@@ -452,6 +453,7 @@ struct _GstPlayBinClass
 #define DEFAULT_VIDEO_SINK        NULL
 #define DEFAULT_VIS_PLUGIN        NULL
 #define DEFAULT_TEXT_SINK         NULL
+#define DEFAULT_COLORSPACE_BIN    NULL
 #define DEFAULT_VOLUME            1.0
 #define DEFAULT_MUTE              FALSE
 #define DEFAULT_FRAME             NULL
@@ -479,6 +481,7 @@ enum
   PROP_VIDEO_SINK,
   PROP_VIS_PLUGIN,
   PROP_TEXT_SINK,
+  PROP_COLORSPACE_BIN,
   PROP_VOLUME,
   PROP_MUTE,
   PROP_FRAME,
@@ -727,6 +730,10 @@ gst_play_bin_class_init (GstPlayBinClass * klass)
       g_param_spec_object ("text-sink", "Text plugin",
           "the text output element to use (NULL = default textoverlay)",
           GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (gobject_klass, PROP_COLORSPACE_BIN,
+      g_param_spec_object ("colorspace-bin", "colorspace bin",
+          "the colorspace bin to use (NULL = default)",
+          GST_TYPE_ELEMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   /**
    * GstPlayBin2:volume:
@@ -1207,6 +1214,8 @@ gst_play_bin_finalize (GObject * object)
     gst_object_unref (playbin->audio_sink);
   if (playbin->text_sink)
     gst_object_unref (playbin->text_sink);
+  if (playbin->colorspace_bin)
+    gst_object_unref (playbin->colorspace_bin);
 
   if (playbin->elements)
     gst_plugin_feature_list_free (playbin->elements);
@@ -1785,6 +1794,10 @@ gst_play_bin_set_property (GObject * object, guint prop_id,
       gst_play_bin_set_sink (playbin, &playbin->text_sink, "text",
           g_value_get_object (value));
       break;
+    case PROP_COLORSPACE_BIN:
+      gst_play_sink_set_colorspace_bin (playbin->playsink,
+          g_value_get_object (value));
+      break;
     case PROP_VOLUME:
       gst_play_sink_set_volume (playbin->playsink, g_value_get_double (value));
       break;
@@ -1952,6 +1965,10 @@ gst_play_bin_get_property (GObject * object, guint prop_id, GValue * value,
           gst_play_bin_get_current_sink (playbin, &playbin->text_sink,
               "text", GST_PLAY_SINK_TYPE_TEXT));
       break;
+    case PROP_COLORSPACE_BIN:
+      g_value_take_object (value,
+          gst_play_sink_get_colorspace_bin (playbin->playsink));
+      break;
     case PROP_VOLUME:
       g_value_set_double (value, gst_play_sink_get_volume (playbin->playsink));
       break;
@@ -2868,8 +2885,8 @@ autoplug_continue_cb (GstElement * element, GstPad * pad, GstCaps * caps,
   GstPad *text_sinkpad = NULL;
 
   text_sink =
-      (group->playbin->text_sink) ? gst_object_ref (group->playbin->
-      text_sink) : NULL;
+      (group->playbin->text_sink) ? gst_object_ref (group->
+      playbin->text_sink) : NULL;
   if (text_sink)
     text_sinkpad = gst_element_get_static_pad (text_sink, "sink");
 
diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
index 80374f6..1a04799 100644
--- a/gst/playback/gstplaysink.c
+++ b/gst/playback/gstplaysink.c
@@ -171,6 +171,7 @@ struct _GstPlaySink
   GstElement *video_sink;
   GstElement *visualisation;
   GstElement *text_sink;
+  GstElement *colorspace_bin;
   gdouble volume;
   gboolean mute;
   gchar *font_desc;             /* font description */
@@ -447,6 +448,7 @@ gst_play_sink_init (GstPlaySink * playsink)
   playsink->audio_sink = NULL;
   playsink->visualisation = NULL;
   playsink->text_sink = NULL;
+  playsink->colorspace_bin = NULL;
   playsink->volume = 1.0;
   playsink->font_desc = NULL;
   playsink->subtitle_encoding = NULL;
@@ -511,6 +513,11 @@ gst_play_sink_dispose (GObject * object)
     gst_object_unref (playsink->text_sink);
     playsink->text_sink = NULL;
   }
+  if (playsink->colorspace_bin != NULL) {
+    gst_element_set_state (playsink->colorspace_bin, GST_STATE_NULL);
+    gst_object_unref (playsink->colorspace_bin);
+    playsink->colorspace_bin = NULL;
+  }
 
   free_chain ((GstPlayChain *) playsink->videodeinterlacechain);
   playsink->videodeinterlacechain = NULL;
@@ -771,6 +778,31 @@ gst_play_sink_get_vis_plugin (GstPlaySink * playsink)
 }
 
 void
+gst_play_sink_set_colorspace_bin (GstPlaySink * playsink,
+    GstElement * colorspace_bin)
+{
+  if (playsink->colorspace_bin) {
+    gst_element_set_state (playsink->colorspace_bin, GST_STATE_NULL);
+    gst_object_unref (playsink->colorspace_bin);
+  }
+  playsink->colorspace_bin = colorspace_bin;
+  gst_object_ref (playsink->colorspace_bin);
+}
+
+
+GstElement *
+gst_play_sink_get_colorspace_bin (GstPlaySink * playsink)
+{
+  GstElement *result = NULL;
+
+  if (playsink->colorspace_bin) {
+    result = gst_object_ref (playsink->colorspace_bin);
+  }
+
+  return result;
+}
+
+void
 gst_play_sink_set_volume (GstPlaySink * playsink, gdouble volume)
 {
   GstPlayAudioChain *chain;
@@ -1267,44 +1299,57 @@ gen_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
   }
 
   if (raw && !(playsink->flags & GST_PLAY_FLAG_NATIVE_VIDEO)) {
-    GST_DEBUG_OBJECT (playsink, "creating ffmpegcolorspace");
-    chain->conv = gst_element_factory_make ("ffmpegcolorspace", "vconv");
-    if (chain->conv == NULL) {
-      post_missing_element_message (playsink, "ffmpegcolorspace");
-      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
-          (_("Missing element '%s' - check your GStreamer installation."),
-              "ffmpegcolorspace"), ("video rendering might fail"));
-    } else {
-      gst_bin_add (bin, chain->conv);
+    if (playsink->colorspace_bin) {
+      GST_DEBUG_OBJECT (playsink, "use colorsapce bin");
+      gst_bin_add (bin, playsink->colorspace_bin);
       if (prev) {
-        if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
-                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+        if (!gst_element_link_pads_full (prev, "src", playsink->colorspace_bin,
+                "sink", GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
           goto link_failed;
       } else {
-        head = chain->conv;
+        head = playsink->colorspace_bin;
       }
-      prev = chain->conv;
-    }
-
-    GST_DEBUG_OBJECT (playsink, "creating videoscale");
-    chain->scale = gst_element_factory_make ("videoscale", "vscale");
-    if (chain->scale == NULL) {
-      post_missing_element_message (playsink, "videoscale");
-      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
-          (_("Missing element '%s' - check your GStreamer installation."),
-              "videoscale"), ("possibly a liboil version mismatch?"));
+      prev = playsink->colorspace_bin;
     } else {
-      /* Add black borders if necessary to keep the DAR */
-      g_object_set (chain->scale, "add-borders", TRUE, NULL);
-      gst_bin_add (bin, chain->scale);
-      if (prev) {
-        if (!gst_element_link_pads_full (prev, "src", chain->scale, "sink",
-                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
-          goto link_failed;
+      GST_DEBUG_OBJECT (playsink, "creating ffmpegcolorspace");
+      chain->conv = gst_element_factory_make ("ffmpegcolorspace", "vconv");
+      if (chain->conv == NULL) {
+        post_missing_element_message (playsink, "ffmpegcolorspace");
+        GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+            (_("Missing element '%s' - check your GStreamer installation."),
+                "ffmpegcolorspace"), ("video rendering might fail"));
+      } else {
+        gst_bin_add (bin, chain->conv);
+        if (prev) {
+          if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
+                  GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+            goto link_failed;
+        } else {
+          head = chain->conv;
+        }
+        prev = chain->conv;
+      }
+
+      GST_DEBUG_OBJECT (playsink, "creating videoscale");
+      chain->scale = gst_element_factory_make ("videoscale", "vscale");
+      if (chain->scale == NULL) {
+        post_missing_element_message (playsink, "videoscale");
+        GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+            (_("Missing element '%s' - check your GStreamer installation."),
+                "videoscale"), ("possibly a liboil version mismatch?"));
       } else {
-        head = chain->scale;
+        /* Add black borders if necessary to keep the DAR */
+        g_object_set (chain->scale, "add-borders", TRUE, NULL);
+        gst_bin_add (bin, chain->scale);
+        if (prev) {
+          if (!gst_element_link_pads_full (prev, "src", chain->scale, "sink",
+                  GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+            goto link_failed;
+        } else {
+          head = chain->scale;
+        }
+        prev = chain->scale;
       }
-      prev = chain->scale;
     }
   }
 
diff --git a/gst/playback/gstplaysink.h b/gst/playback/gstplaysink.h
index 3ca96d3..df3a625 100644
--- a/gst/playback/gstplaysink.h
+++ b/gst/playback/gstplaysink.h
@@ -25,7 +25,6 @@
 #include "gstplay-enum.h"
 
 G_BEGIN_DECLS
-
 #define GST_TYPE_PLAY_SINK \
   (gst_play_sink_get_type())
 #define GST_PLAY_SINK(obj) \
@@ -38,7 +37,6 @@ G_BEGIN_DECLS
   (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAY_SINK))
 #define GST_PLAY_SINK_CAST(obj) \
   ((GstPlaySink*)(obj))
-
 /**
  * GstPlaySinkType:
  * @GST_PLAY_SINK_TYPE_AUDIO: A non-raw audio pad
@@ -51,16 +49,17 @@ G_BEGIN_DECLS
  *
  * Types of pads that can be requested from the sinks.
  */
-typedef enum {
-  GST_PLAY_SINK_TYPE_AUDIO     = 0,
+    typedef enum
+{
+  GST_PLAY_SINK_TYPE_AUDIO = 0,
   GST_PLAY_SINK_TYPE_AUDIO_RAW = 1,
-  GST_PLAY_SINK_TYPE_VIDEO     = 2,
+  GST_PLAY_SINK_TYPE_VIDEO = 2,
   GST_PLAY_SINK_TYPE_VIDEO_RAW = 3,
-  GST_PLAY_SINK_TYPE_TEXT      = 4,
-  GST_PLAY_SINK_TYPE_LAST      = 5,
+  GST_PLAY_SINK_TYPE_TEXT = 4,
+  GST_PLAY_SINK_TYPE_LAST = 5,
 
   /* this is a dummy pad */
-  GST_PLAY_SINK_TYPE_FLUSHING  = 6
+  GST_PLAY_SINK_TYPE_FLUSHING = 6
 } GstPlaySinkType;
 
 typedef struct _GstPlaySink GstPlaySink;
@@ -68,38 +67,46 @@ typedef struct _GstPlaySinkClass GstPlaySinkClass;
 
 GType gst_play_sink_get_type (void);
 
-GstPad *         gst_play_sink_request_pad    (GstPlaySink *playsink, GstPlaySinkType type);
-void             gst_play_sink_release_pad    (GstPlaySink *playsink, GstPad *pad);
+GstPad *gst_play_sink_request_pad (GstPlaySink * playsink,
+    GstPlaySinkType type);
+void gst_play_sink_release_pad (GstPlaySink * playsink, GstPad * pad);
 
-void             gst_play_sink_set_sink       (GstPlaySink * playsink, GstPlaySinkType type, GstElement * sink);
-GstElement *     gst_play_sink_get_sink       (GstPlaySink * playsink, GstPlaySinkType type);
+void gst_play_sink_set_sink (GstPlaySink * playsink, GstPlaySinkType type,
+    GstElement * sink);
+GstElement *gst_play_sink_get_sink (GstPlaySink * playsink,
+    GstPlaySinkType type);
 
-void             gst_play_sink_set_vis_plugin (GstPlaySink * playsink, GstElement * vis);
-GstElement *     gst_play_sink_get_vis_plugin (GstPlaySink * playsink);
+void gst_play_sink_set_vis_plugin (GstPlaySink * playsink, GstElement * vis);
+GstElement *gst_play_sink_get_vis_plugin (GstPlaySink * playsink);
 
-void             gst_play_sink_set_volume     (GstPlaySink *playsink, gdouble volume);
-gdouble          gst_play_sink_get_volume     (GstPlaySink *playsink);
+void gst_play_sink_set_colorspace_bin (GstPlaySink * playsink,
+    GstElement * colorspace_bin);
+GstElement *gst_play_sink_get_colorspace_bin (GstPlaySink * playsink);
 
-void             gst_play_sink_set_mute       (GstPlaySink *playsink, gboolean mute);
-gboolean         gst_play_sink_get_mute       (GstPlaySink *playsink);
+void gst_play_sink_set_volume (GstPlaySink * playsink, gdouble volume);
+gdouble gst_play_sink_get_volume (GstPlaySink * playsink);
 
-gboolean         gst_play_sink_set_flags      (GstPlaySink * playsink, GstPlayFlags flags);
-GstPlayFlags     gst_play_sink_get_flags      (GstPlaySink * playsink);
+void gst_play_sink_set_mute (GstPlaySink * playsink, gboolean mute);
+gboolean gst_play_sink_get_mute (GstPlaySink * playsink);
 
-void             gst_play_sink_set_font_desc  (GstPlaySink *playsink, const gchar * desc);
-gchar *          gst_play_sink_get_font_desc  (GstPlaySink *playsink);
-void             gst_play_sink_set_subtitle_encoding  (GstPlaySink *playsink, const gchar * encoding);
-gchar *          gst_play_sink_get_subtitle_encoding  (GstPlaySink *playsink);
+gboolean gst_play_sink_set_flags (GstPlaySink * playsink, GstPlayFlags flags);
+GstPlayFlags gst_play_sink_get_flags (GstPlaySink * playsink);
 
-void             gst_play_sink_set_av_offset  (GstPlaySink *playsink, gint64 av_offset);
-gint64           gst_play_sink_get_av_offset  (GstPlaySink *playsink);
+void gst_play_sink_set_font_desc (GstPlaySink * playsink, const gchar * desc);
+gchar *gst_play_sink_get_font_desc (GstPlaySink * playsink);
+void gst_play_sink_set_subtitle_encoding (GstPlaySink * playsink,
+    const gchar * encoding);
+gchar *gst_play_sink_get_subtitle_encoding (GstPlaySink * playsink);
 
-GstBuffer *      gst_play_sink_get_last_frame (GstPlaySink * playsink);
-GstBuffer *      gst_play_sink_convert_frame  (GstPlaySink * playsink, GstCaps * caps);
+void gst_play_sink_set_av_offset (GstPlaySink * playsink, gint64 av_offset);
+gint64 gst_play_sink_get_av_offset (GstPlaySink * playsink);
 
-gboolean         gst_play_sink_reconfigure    (GstPlaySink * playsink);
+GstBuffer *gst_play_sink_get_last_frame (GstPlaySink * playsink);
+GstBuffer *gst_play_sink_convert_frame (GstPlaySink * playsink, GstCaps * caps);
 
-gboolean         gst_play_sink_plugin_init    (GstPlugin * plugin);
+gboolean gst_play_sink_reconfigure (GstPlaySink * playsink);
+
+gboolean gst_play_sink_plugin_init (GstPlugin * plugin);
 
 void
 gst_play_marshal_BUFFER__BOXED (GClosure * closure,
@@ -109,5 +116,4 @@ gst_play_marshal_BUFFER__BOXED (GClosure * closure,
     gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data);
 
 G_END_DECLS
-
 #endif /* __GST_PLAY_SINK_H__ */
