diff --git a/libempathy-gtk/empathy-audio-src.c b/libempathy-gtk/empathy-audio-src.c
index a3416f2..516fa27 100644
--- a/libempathy-gtk/empathy-audio-src.c
+++ b/libempathy-gtk/empathy-audio-src.c
@@ -92,6 +92,8 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj)
 {
   EmpathyGstAudioSrcPrivate *priv = EMPATHY_GST_AUDIO_SRC_GET_PRIVATE (obj);
   GstPad *ghost, *src;
+  GstElement *capsfilter;
+  GstCaps *caps;
 
   priv->peak_level = -G_MAXDOUBLE;
   priv->lock = g_mutex_new ();
@@ -105,11 +107,22 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj)
 
   fs_element_added_notifier_add (priv->notifier, GST_BIN (priv->src));
 
+  capsfilter = gst_element_factory_make ("capsfilter", NULL);
+  caps = gst_caps_new_simple ("audio/x-raw-int",
+    "rate", G_TYPE_INT, 8000,
+    "width", G_TYPE_INT, 16,
+    "depth", G_TYPE_INT, 16,
+    NULL);
+
+  g_object_set (G_OBJECT (capsfilter), "caps", caps, NULL);
+  gst_bin_add (GST_BIN (obj), capsfilter);
+  gst_element_link (priv->src, capsfilter);
+
   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);
+  gst_element_link (capsfilter, priv->volume);
 
   priv->level = gst_element_factory_make ("level", NULL);
   gst_bin_add (GST_BIN (obj), priv->level);
diff --git a/libempathy-gtk/empathy-video-src.c b/libempathy-gtk/empathy-video-src.c
index aa4d35a..3d42c16 100644
--- a/libempathy-gtk/empathy-video-src.c
+++ b/libempathy-gtk/empathy-video-src.c
@@ -56,6 +56,45 @@ struct _EmpathyGstVideoSrcPrivate
 #define EMPATHY_GST_VIDEO_SRC_GET_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), EMPATHY_TYPE_GST_VIDEO_SRC, \
     EmpathyGstVideoSrcPrivate))
+/**
+ * empathy_gst_make_to_bin - make gst faktory, add to bin and link it.
+ * @bin - bit to add to.
+ * @src - Element to link new crated element with. IF src == NULL,
+ *        we will only create Factory and add it to the bin.
+ * @factoryname - factory name of factory to create.
+ * we will return  pointer to new Element
+ */
+GstElement *
+empathy_gst_make_to_bin (GstBin *bin, GstElement *src,
+  const gchar *factoryname)
+{
+  GstElement *ret;
+
+  if (!(ret = gst_element_factory_make (factoryname, NULL)))
+  {
+    g_error ("Factory \"%s\" not found.", factoryname);
+    return NULL;
+  }
+
+  if (!gst_bin_add (bin, ret))
+  {
+    g_error ("Can't add \"%s\" do bin.", factoryname);
+    return NULL;
+  }
+
+  /* do not link if src == NULL, just exit here */
+  if (src == NULL)
+    return ret;
+
+  if (!gst_element_link (src, ret))
+  {
+    g_warning ("Can't link \"%s\".", factoryname);
+    return NULL;
+  }
+
+  return ret;
+}
+
 
 static void
 empathy_video_src_init (EmpathyGstVideoSrc *obj)
@@ -66,10 +105,21 @@ empathy_video_src_init (EmpathyGstVideoSrc *obj)
   GstCaps *caps;
 
   /* allocate any data required by the object here */
-  scale = gst_element_factory_make ("videoscale", NULL);
-  colorspace = gst_element_factory_make ("ffmpegcolorspace", NULL);
+  priv->src = empathy_gst_make_to_bin (GST_BIN (obj), NULL, "gconfvideosrc");
+
+  /* if this is brocken no sence to continue */
+  /* todo: create error handling */
+//  if(!priv->src)
+//    goto error;
+
+  scale = empathy_gst_make_to_bin (GST_BIN (obj), priv->src, "videoscale");
+
+  colorspace = empathy_gst_make_to_bin (GST_BIN (obj),
+                                       scale, "ffmpegcolorspace");
+
+  capsfilter = empathy_gst_make_to_bin (GST_BIN (obj),
+                                       colorspace, "capsfilter");
 
-  capsfilter = gst_element_factory_make ("capsfilter", NULL);
   caps = gst_caps_new_simple ("video/x-raw-yuv",
     "width", G_TYPE_INT, 320,
     "height", G_TYPE_INT, 240,
@@ -77,12 +127,6 @@ empathy_video_src_init (EmpathyGstVideoSrc *obj)
 
   g_object_set (G_OBJECT (capsfilter), "caps", caps, NULL);
 
-  priv->src = gst_element_factory_make ("gconfvideosrc", NULL);
-
-  gst_bin_add_many (GST_BIN (obj), priv->src, scale, colorspace, capsfilter,
-    NULL);
-  gst_element_link_many (priv->src, scale, colorspace, capsfilter, NULL);
-
   src = gst_element_get_static_pad (capsfilter, "src");
 
   ghost = gst_ghost_pad_new ("src", src);
diff --git a/libempathy-gtk/empathy-video-src.h b/libempathy-gtk/empathy-video-src.h
index 4197d7f..d36e486 100644
--- a/libempathy-gtk/empathy-video-src.h
+++ b/libempathy-gtk/empathy-video-src.h
@@ -81,6 +81,8 @@ void empathy_video_src_set_channel (GstElement *src,
 guint empathy_video_src_get_channel (GstElement *src,
   EmpathyGstVideoSrcChannel channel);
 
+GstElement *empathy_gst_make_to_bin (GstBin *bin, GstElement *src,
+  const gchar *factoryname);
 
 G_END_DECLS
 
