diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
index 36db3a330ea3f8e40afbb0d51e1fd7edf7c67a37..5c9927b5c38bfdafe37dec6f953dc27e1889768c 100644
--- a/src/channel-display-gst.c
+++ b/src/channel-display-gst.c
@@ -495,11 +495,17 @@ static gboolean create_pipeline(SpiceGstDecoder *decoder)
     GstElement *playbin, *sink;
     SpiceGstPlayFlags flags;
     GstCaps *caps;
+    static bool playbin3_supported = true;
 
-    playbin = gst_element_factory_make("playbin", "playbin");
+    playbin = playbin3_supported ?
+              gst_element_factory_make("playbin3", "playbin") : NULL;
     if (playbin == NULL) {
-        spice_warning("error upon creation of 'playbin' element");
-        return FALSE;
+        playbin3_supported = false;
+        playbin = gst_element_factory_make("playbin", "playbin");
+        if (playbin == NULL) {
+            spice_warning("error upon creation of 'playbin' element");
+            return FALSE;
+        }
     }
 
     /* Passing the pipeline to widget, try to get window handle and