diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
index ac70c68e72..1ec139da94 100644
--- a/gst/playback/gstplaysink.c
+++ b/gst/playback/gstplaysink.c
@@ -1002,10 +1002,19 @@ gen_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async,
      * need a lot of buffers as this consumes a lot of memory and we don't want
      * too little because else we would be context switching too quickly. */
     chain->queue = gst_element_factory_make ("queue", "vqueue");
-    g_object_set (G_OBJECT (chain->queue), "max-size-buffers", 3,
-        "max-size-bytes", 0, "max-size-time", (gint64) 0, NULL);
-    gst_bin_add (bin, chain->queue);
-    head = prev = chain->queue;
+    if (chain->queue == NULL) {
+      post_missing_element_message (playsink, "queue");
+      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+          (_("Missing element '%s' - check your GStreamer installation."),
+              "queue"), ("video rendering might be suboptimal"));
+      head = chain->sink;
+      prev = NULL;
+    } else {
+      g_object_set (G_OBJECT (chain->queue), "max-size-buffers", 3,
+          "max-size-bytes", 0, "max-size-time", (gint64) 0, NULL);
+      gst_bin_add (bin, chain->queue);
+      head = prev = chain->queue;
+    }
   } else {
     head = chain->sink;
     prev = NULL;
@@ -1214,10 +1223,17 @@ gen_text_chain (GstPlaySink * playsink)
     if (!(playsink->flags & GST_PLAY_FLAG_NATIVE_VIDEO)) {
       /* make a little queue */
       chain->queue = gst_element_factory_make ("queue", "vqueue");
-      g_object_set (G_OBJECT (chain->queue), "max-size-buffers", 3,
-          "max-size-bytes", 0, "max-size-time", (gint64) 0, NULL);
-      gst_bin_add (bin, chain->queue);
-      videosinkpad = gst_element_get_static_pad (chain->queue, "sink");
+      if (chain->queue == NULL) {
+        post_missing_element_message (playsink, "queue");
+        GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+            (_("Missing element '%s' - check your GStreamer installation."),
+                "queue"), ("video rendering might be suboptimal"));
+      } else {
+        g_object_set (G_OBJECT (chain->queue), "max-size-buffers", 3,
+            "max-size-bytes", 0, "max-size-time", (gint64) 0, NULL);
+        gst_bin_add (bin, chain->queue);
+        videosinkpad = gst_element_get_static_pad (chain->queue, "sink");
+      }
 
       chain->overlay =
           gst_element_factory_make ("subtitleoverlay", "suboverlay");
@@ -1250,11 +1266,18 @@ gen_text_chain (GstPlaySink * playsink)
      * thing we can do is insert an identity and ghost the src
      * and sink pads. */
     chain->identity = gst_element_factory_make ("identity", "tidentity");
-    g_object_set (chain->identity, "signal-handoffs", FALSE, NULL);
-    g_object_set (chain->identity, "silent", TRUE, NULL);
-    gst_bin_add (bin, chain->identity);
-    srcpad = gst_element_get_static_pad (chain->identity, "src");
-    videosinkpad = gst_element_get_static_pad (chain->identity, "sink");
+    if (chain->identity == NULL) {
+      post_missing_element_message (playsink, "identity");
+      GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+          (_("Missing element '%s' - check your GStreamer installation."),
+              "identity"), (NULL));
+    } else {
+      g_object_set (chain->identity, "signal-handoffs", FALSE, NULL);
+      g_object_set (chain->identity, "silent", TRUE, NULL);
+      gst_bin_add (bin, chain->identity);
+      srcpad = gst_element_get_static_pad (chain->identity, "src");
+      videosinkpad = gst_element_get_static_pad (chain->identity, "sink");
+    }
   }
 
   /* expose the ghostpads */
@@ -1362,8 +1385,17 @@ gen_audio_chain (GstPlaySink * playsink, gboolean raw, gboolean queue)
      * visualisations */
     GST_DEBUG_OBJECT (playsink, "adding audio queue");
     chain->queue = gst_element_factory_make ("queue", "aqueue");
-    gst_bin_add (bin, chain->queue);
-    prev = head = chain->queue;
+    if (chain->queue == NULL) {
+      post_missing_element_message (playsink, "queue");
+      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+          (_("Missing element '%s' - check your GStreamer installation."),
+              "queue"), ("audio playback and visualizations might not work"));
+      head = chain->sink;
+      prev = NULL;
+    } else {
+      gst_bin_add (bin, chain->queue);
+      prev = head = chain->queue;
+    }
   } else {
     head = chain->sink;
     prev = NULL;
@@ -1660,6 +1692,8 @@ gen_vis_chain (GstPlaySink * playsink)
   /* we're queuing raw audio here, we can remove this queue when we can disable
    * async behaviour in the video sink. */
   chain->queue = gst_element_factory_make ("queue", "visqueue");
+  if (chain->queue == NULL)
+    goto no_queue;
   gst_bin_add (bin, chain->queue);
 
   chain->conv = gst_element_factory_make ("audioconvert", "aconv");
@@ -1710,6 +1744,15 @@ gen_vis_chain (GstPlaySink * playsink)
   return chain;
 
   /* ERRORS */
+no_queue:
+  {
+    post_missing_element_message (playsink, "queue");
+    GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+        (_("Missing element '%s' - check your GStreamer installation."),
+            "queue"), (NULL));
+    free_chain ((GstPlayChain *) chain);
+    return NULL;
+  }
 no_audioconvert:
   {
     post_missing_element_message (playsink, "audioconvert");
@@ -2192,10 +2235,19 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
         /* create tee when needed. This element will feed the audio sink chain
          * and the vis chain. */
         playsink->audio_tee = gst_element_factory_make ("tee", "audiotee");
-        playsink->audio_tee_sink =
-            gst_element_get_static_pad (playsink->audio_tee, "sink");
-        gst_bin_add (GST_BIN_CAST (playsink), playsink->audio_tee);
-        gst_element_set_state (playsink->audio_tee, GST_STATE_PAUSED);
+        if (playsink->audio_tee == NULL) {
+          post_missing_element_message (playsink, "tee");
+          GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN,
+              (_("Missing element '%s' - check your GStreamer installation."),
+                  "tee"), (NULL));
+          res = NULL;
+          break;
+        } else {
+          playsink->audio_tee_sink =
+              gst_element_get_static_pad (playsink->audio_tee, "sink");
+          gst_bin_add (GST_BIN_CAST (playsink), playsink->audio_tee);
+          gst_element_set_state (playsink->audio_tee, GST_STATE_PAUSED);
+        }
       } else {
         gst_element_set_state (playsink->audio_tee, GST_STATE_PAUSED);
       }