diff --git a/libempathy-gtk/empathy-video-src.c b/libempathy-gtk/empathy-video-src.c
index c203bfd..74bbb2f 100644
--- a/libempathy-gtk/empathy-video-src.c
+++ b/libempathy-gtk/empathy-video-src.c
@@ -105,36 +105,73 @@ static void
 empathy_video_src_init (EmpathyGstVideoSrc *obj)
 {
   EmpathyGstVideoSrcPrivate *priv = EMPATHY_GST_VIDEO_SRC_GET_PRIVATE (obj);
-  GstElement *scale, *colorspace, *capsfilter;
+  GstElement *maxrate, *scale, *noisefilter, *colorspace, *capsfilter;
   GstPad *ghost, *src;
   GstCaps *caps;
 
+  /* allocate caps here, so we can update it by optional elements */
+  caps = gst_caps_new_simple ("video/x-raw-yuv",
+    "width", G_TYPE_INT, 320,
+    "height", G_TYPE_INT, 240,
+    NULL);
+
   /* allocate any data required by the object here */
   priv->src = empathy_gst_make_to_bin (GST_BIN (obj), NULL, "gconfvideosrc");
   if (!priv->src)
     g_error ("gst-plugins-good is probably missing. exit");
 
-  scale = empathy_gst_make_to_bin (GST_BIN (obj), priv->src, "videoscale");
+  /* videomaxrate is curently optional plugin, becouse it depend on
+   * gst-plugins-bad. So we won't fail if it not exist.
+   * todo: in some time videorate will probably replace videomaxrate */
+  maxrate = empathy_gst_make_to_bin (GST_BIN (obj), priv->src, "videomaxrate");
+  if (!maxrate)
+  {
+    g_warning ("gst-plugins-bad is probably missing.");
+
+    scale = empathy_gst_make_to_bin (GST_BIN (obj), priv->src, "videoscale");
+  }
+  else
+  {
+    gst_caps_set_simple (caps,
+      "framerate", GST_TYPE_FRACTION, 15, 1,
+      NULL); 
+
+    scale = empathy_gst_make_to_bin (GST_BIN (obj), maxrate, "videoscale");
+  }
+
+  g_debug ("Current video src caps are : %s", gst_caps_to_string(caps));
+
   if (!scale)
     g_error ("gst-plugins-base is probably missing. exit");
 
-  colorspace = empathy_gst_make_to_bin (GST_BIN (obj),
-                                       scale, "ffmpegcolorspace");
+  /* postproc_tmpnois is other optional plugin, it depend on gst-ffmpeg.
+   * may be some day it will go to gst-plugins-base, than we can restrickt it. */
+  noisefilter = empathy_gst_make_to_bin (GST_BIN (obj),
+                                        scale, "postproc_tmpnoise");
+  if (!noisefilter)
+  {
+    g_warning ("gst-ffmpeg is probably missing.");
+
+    colorspace = empathy_gst_make_to_bin (GST_BIN (obj),
+                                         scale, "ffmpegcolorspace");
+  }
+  else
+  {
+    colorspace = empathy_gst_make_to_bin (GST_BIN (obj),
+                                         noisefilter, "ffmpegcolorspace");
+  }
+
   if (!colorspace)
     g_error ("gst-plugins-base is probably missing. exit");
 
-  capsfilter = empathy_gst_make_to_bin (GST_BIN (obj), scale, "capsfilter");
+  capsfilter = empathy_gst_make_to_bin (GST_BIN (obj), colorspace, "capsfilter");
   if (!capsfilter)
     g_error ("core libgstreamer is probably missing. exit");
 
-  caps = gst_caps_new_simple ("video/x-raw-yuv",
-    "width", G_TYPE_INT, 320,
-    "height", G_TYPE_INT, 240,
-    NULL);
-
   g_object_set (G_OBJECT (capsfilter), "caps", caps, NULL);
 
-  src = gst_element_get_static_pad (colorspace, "src");
+
+  src = gst_element_get_static_pad (capsfilter, "src");
   if (!src)
     g_error ("src pad not found. exit");
 
