diff --git a/libempathy-gtk/empathy-audio-src.c b/libempathy-gtk/empathy-audio-src.c
index a3416f2..72f9aff 100644
--- a/libempathy-gtk/empathy-audio-src.c
+++ b/libempathy-gtk/empathy-audio-src.c
@@ -25,6 +25,9 @@
 #include <gst/farsight/fs-element-added-notifier.h>
 #include "empathy-audio-src.h"
 
+/* we need include empathy_gst_add_to_bin from here */
+#include "empathy-video-src.h"
+
 G_DEFINE_TYPE(EmpathyGstAudioSrc, empathy_audio_src, GST_TYPE_BIN)
 
 /* signal enum */
@@ -100,25 +103,30 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj)
   g_signal_connect (priv->notifier, "element-added",
     G_CALLBACK (empathy_audio_src_element_added_cb), obj);
 
-  priv->src = gst_element_factory_make ("gconfaudiosrc", NULL);
-  gst_bin_add (GST_BIN (obj), priv->src);
+  if ((priv->src = empathy_gst_add_to_bin (GST_BIN (obj),
+      NULL, "gconfaudiosrc")) == NULL)
+    g_error ("Couldn't add \"gconfaudiosrc\" (gst-plugins-good missing?)");
 
   fs_element_added_notifier_add (priv->notifier, GST_BIN (priv->src));
 
-  priv->volume = gst_element_factory_make ("volume", NULL);
-  g_object_ref (priv->volume);
-
-  gst_bin_add (GST_BIN (obj), priv->volume);
-  gst_element_link (priv->src, priv->volume);
+  if ((priv->volume = empathy_gst_add_to_bin (GST_BIN (obj),
+      priv->src, "volume")) == NULL)
+    g_error ("Couldn't add \"volume\" (gst-plugins-base missing?)");
 
-  priv->level = gst_element_factory_make ("level", NULL);
-  gst_bin_add (GST_BIN (obj), priv->level);
-  gst_element_link (priv->volume, priv->level);
+  if ((priv->level = empathy_gst_add_to_bin (GST_BIN (obj),
+      priv->volume, "level")) == NULL)
+    g_error ("Couldn't add \"level\" (gst-plugins-good missing?)");
 
   src = gst_element_get_static_pad (priv->level, "src");
+  g_assert (src != NULL);
 
   ghost = gst_ghost_pad_new ("src", src);
-  gst_element_add_pad (GST_ELEMENT (obj), ghost);
+  if (ghost == NULL)
+    g_error ("Unable to create ghost pad for the videosrc");
+
+  if (!gst_element_add_pad (GST_ELEMENT (obj), ghost))
+    g_error ("pad with the same name already existed or "
+            "the pad already had another parent.");
 
   gst_object_unref (G_OBJECT (src));
 }
diff --git a/libempathy-gtk/empathy-video-src.c b/libempathy-gtk/empathy-video-src.c
index 5c865da..5e85267 100644
--- a/libempathy-gtk/empathy-video-src.c
+++ b/libempathy-gtk/empathy-video-src.c
@@ -64,7 +64,7 @@ struct _EmpathyGstVideoSrcPrivate
  *
  * Returns: The newly created element ot %NULL on failure
  */
-static GstElement *
+GstElement *
 empathy_gst_add_to_bin (GstBin *bin,
   GstElement *src,
   const gchar *factoryname)
diff --git a/libempathy-gtk/empathy-video-src.h b/libempathy-gtk/empathy-video-src.h
index fae5563..c89cc97 100644
--- a/libempathy-gtk/empathy-video-src.h
+++ b/libempathy-gtk/empathy-video-src.h
@@ -81,6 +81,9 @@ void empathy_video_src_set_channel (GstElement *src,
 guint empathy_video_src_get_channel (GstElement *src,
   EmpathyGstVideoSrcChannel channel);
 
+GstElement *empathy_gst_add_to_bin (GstBin *bin,
+  GstElement *src, const gchar *factoryname);
+
 G_END_DECLS
 
 #endif /* #ifndef __EMPATHY_GST_VIDEO_SRC_H__*/
