diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c
index 8b7af2d..9bcd3ce 100644
--- a/src/empathy-call-window.c
+++ b/src/empathy-call-window.c
@@ -1701,7 +1701,6 @@ empathy_call_window_update_timer (gpointer user_data)
 
 static void
 display_error (EmpathyCallWindow *self,
-    EmpathyTpCall *call,
     const gchar *img,
     const gchar *title,
     const gchar *desc,
@@ -1855,11 +1854,11 @@ empathy_call_window_stream_error (EmpathyCallWindow *self,
     {
       /* No description, use the error message. That's not great as it's not
        * localized but it's better than nothing. */
-      display_error (self, call, icon, title, msg, NULL);
+      display_error (self, icon, title, msg, NULL);
     }
   else
     {
-      display_error (self, call, icon, title, desc, msg);
+      display_error (self, icon, title, desc, msg);
       g_free (desc);
     }
 }
@@ -1942,6 +1941,31 @@ empathy_call_window_connected (gpointer user_data)
   return FALSE;
 }
 
+static void
+pad_linking_error (EmpathyCallWindow *self,
+    gboolean audio,
+    const gchar *msg)
+{
+  const gchar *icon, *title;
+
+  if (audio)
+    {
+      icon = "gnome-stock-mic";
+      title = _("Can't establish audio stream");
+    }
+  else
+    {
+      icon = "camera-web";
+      title = _("Can't establish video stream");
+    }
+
+  DEBUG ("%s", msg);
+
+  display_error (self, icon, title,
+      _("There was a failure in the multimedia engine"), msg);
+
+  empathy_call_window_disconnected (self);
+}
 
 /* Called from the streaming thread */
 static void
@@ -1976,7 +2000,17 @@ empathy_call_window_src_added_cb (EmpathyCallHandler *handler,
         g_assert_not_reached ();
     }
 
-  gst_pad_link (src, pad);
+  if (GST_PAD_LINK_FAILED (gst_pad_link (src, pad)))
+    {
+      if (media_type == TP_MEDIA_STREAM_TYPE_AUDIO)
+        {
+          pad_linking_error (self, TRUE, "Failed to link output audio sink");
+        }
+      else
+        {
+          pad_linking_error (self, FALSE, "Failed to link output video sink");
+        }
+    }
   gst_object_unref (pad);
 
   g_mutex_unlock (priv->lock);
@@ -1997,7 +2031,9 @@ empathy_call_window_sink_added_cb (EmpathyCallHandler *handler,
         gst_bin_add (GST_BIN (priv->pipeline), priv->audio_input);
 
         pad = gst_element_get_static_pad (priv->audio_input, "src");
-        gst_pad_link (pad, sink);
+
+        if (GST_PAD_LINK_FAILED (gst_pad_link (pad, sink)))
+          pad_linking_error (self, TRUE, "Failed to link audio source");
 
         gst_element_set_state (priv->audio_input, GST_STATE_PLAYING);
         break;
@@ -2007,7 +2043,8 @@ empathy_call_window_sink_added_cb (EmpathyCallHandler *handler,
             if (priv->video_tee != NULL)
               {
                 pad = gst_element_get_request_pad (priv->video_tee, "src%d");
-                gst_pad_link (pad, sink);
+                if (GST_PAD_LINK_FAILED (gst_pad_link (pad, sink)))
+                  pad_linking_error (self, TRUE, "Failed to link video source");
               }
           }
         break;
