diff --git a/gnome/src/config/videoconf.c b/gnome/src/config/videoconf.c
index 25122af71367b09eef3f9d54941ff69f0fcec580..fbbaa2968126b28bf7659c17f5f9a91edb878cdd 100644
--- a/gnome/src/config/videoconf.c
+++ b/gnome/src/config/videoconf.c
@@ -1,6 +1,7 @@
 /*
- *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *  Copyright (C) 2004-2014 Savoir-Faire Linux Inc.
  *  Author: Tristan Matthews <tristan.matthews@savoirfairelinux.com>
+ *  Author: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -35,15 +36,10 @@
 #include "dbus.h"
 #include "codeclist.h"
 
-static GtkWidget *v4l2Device;
-static GtkWidget *v4l2Channel;
-static GtkWidget *v4l2Size;
-static GtkWidget *v4l2Rate;
-
-static GtkListStore *v4l2DeviceList;
-static GtkListStore *v4l2ChannelList;
-static GtkListStore *v4l2SizeList;
-static GtkListStore *v4l2RateList;
+static GtkComboBoxText *v4l2Device;
+static GtkComboBoxText *v4l2Channel;
+static GtkComboBoxText *v4l2Size;
+static GtkComboBoxText *v4l2Rate;
 
 static GtkWidget *v4l2_hbox;
 static GtkWidget *v4l2_nodev;
@@ -537,43 +533,21 @@ videocodecs_box(account_t *acc)
     return ret;
 }
 
-/* Gets a newly allocated string with the active text, the caller must
- * free this string */
-static gchar *
-get_active_text(GtkComboBox *box)
-{
-    gchar *text = NULL;
-    int comboBoxIndex = gtk_combo_box_get_active(box);
-    if (comboBoxIndex >= 0) {
-        GtkTreeIter iter;
-        gtk_combo_box_get_active_iter(box, &iter);
-        gtk_tree_model_get(gtk_combo_box_get_model(box), &iter, 0, &text, -1);
-    }
-    return text;
-}
 
-/* Return 0 if string was found in the combo box, != 0 if the string was not found */
-static int
-set_combo_index_from_str(GtkComboBox *box, const gchar *str, size_t max)
+static void
+reset_combo_box(GtkComboBoxText *combo, gchar **entries, const gchar *preferred)
 {
-    g_assert(str);
+    guint index = 0; /* first one if not found */
 
-    GtkTreeModel *model = gtk_combo_box_get_model(box);
-    GtkTreeIter iter;
-    unsigned idx = 0;
-    gtk_tree_model_get_iter_first(model, &iter);
-    do {
-        gchar *boxstr = 0;
-        gtk_tree_model_get(model, &iter, 0, &boxstr, -1);
-        if (boxstr && !g_strcmp0(boxstr, str))
-            break;
-    } while (idx++ < max && gtk_tree_model_iter_next(model, &iter));
+    gtk_combo_box_text_remove_all(combo);
 
-    if (idx >= max)
-        return 1;
+    for (guint i = 0; entries[i]; ++i) {
+        gtk_combo_box_text_insert_text(combo, i, entries[i]);
+        if (g_strcmp0(entries[i], preferred) == 0)
+            index = i;
+    }
 
-    gtk_combo_box_set_active(box, idx);
-    return 0;
+    gtk_combo_box_set_active(GTK_COMBO_BOX(combo), index);
 }
 
 
@@ -583,17 +557,12 @@ set_combo_index_from_str(GtkComboBox *box, const gchar *str, size_t max)
 static void
 preferences_dialog_fill_video_input_device_rate_list()
 {
-    GtkTreeIter iter;
     gchar** list = NULL;
 
-    if (v4l2RateList)
-        gtk_list_store_clear(v4l2RateList);
+    gchar *dev  = gtk_combo_box_text_get_active_text(v4l2Device);
+    gchar *chan = gtk_combo_box_text_get_active_text(v4l2Channel);
+    gchar *size = gtk_combo_box_text_get_active_text(v4l2Size);
 
-    gchar *dev  = get_active_text(GTK_COMBO_BOX(v4l2Device));
-    gchar *chan = get_active_text(GTK_COMBO_BOX(v4l2Channel));
-    gchar *size = get_active_text(GTK_COMBO_BOX(v4l2Size));
-
-    // Call dbus to retreive list
     if (dev && chan && size)
         list = dbus_get_video_device_rate_list(dev, chan, size);
 
@@ -603,26 +572,15 @@ preferences_dialog_fill_video_input_device_rate_list()
 
     // For each device name included in list
     if (list && *list) {
-        gint c = 0;
-        for (gchar **tmp = list; *tmp; c++, tmp++) {
-            gtk_list_store_append(v4l2RateList, &iter);
-            gtk_list_store_set(v4l2RateList, &iter, 0, *tmp, 1, c, -1);
-        }
+        gchar *rate = dbus_get_active_video_device_rate();
+        reset_combo_box(v4l2Rate, list, rate);
         g_strfreev(list);
+        g_free(rate);
 
-        gchar *rate = dbus_get_active_video_device_rate();
-        if (!rate || !*rate || set_combo_index_from_str(GTK_COMBO_BOX(v4l2Rate), rate, c)) {
-            // if setting is invalid, choose first entry
-            gtk_combo_box_set_active(GTK_COMBO_BOX(v4l2Rate), 0);
-            gchar *selected = get_active_text(GTK_COMBO_BOX(v4l2Rate));
-            if (selected) {
-                dbus_set_active_video_device_rate(selected);
-                g_free(selected);
-            }
-        }
+        rate = gtk_combo_box_text_get_active_text(v4l2Rate);
+        dbus_set_active_video_device_rate(rate);
         g_free(rate);
-    } else
-        g_warning("No video rate list found for device");
+    }
 }
 
 
@@ -630,9 +588,9 @@ preferences_dialog_fill_video_input_device_rate_list()
  * Set the video input device rate on the server
  */
 static void
-select_video_input_device_rate_cb(GtkComboBox* comboBox, G_GNUC_UNUSED gpointer data)
+select_video_input_device_rate_cb(GtkComboBoxText* combo, G_GNUC_UNUSED gpointer data)
 {
-    gchar *str = get_active_text(comboBox);
+    gchar *str = gtk_combo_box_text_get_active_text(combo);
     if (str)
         dbus_set_active_video_device_rate(str);
     g_free(str);
@@ -644,14 +602,11 @@ select_video_input_device_rate_cb(GtkComboBox* comboBox, G_GNUC_UNUSED gpointer
 static void
 preferences_dialog_fill_video_input_device_size_list()
 {
-    if (v4l2SizeList)
-        gtk_list_store_clear(v4l2SizeList);
-
-    gchar *dev  = get_active_text(GTK_COMBO_BOX(v4l2Device));
-    gchar *chan = get_active_text(GTK_COMBO_BOX(v4l2Channel));
+    gchar *dev  = gtk_combo_box_text_get_active_text(v4l2Device);
+    gchar *chan = gtk_combo_box_text_get_active_text(v4l2Channel);
 
     gchar** list = NULL;
-    // Call dbus to retrieve list
+
     if (dev && chan)
         list = dbus_get_video_device_size_list(dev, chan);
 
@@ -659,36 +614,23 @@ preferences_dialog_fill_video_input_device_size_list()
     g_free(dev);
 
     if (list && *list) {
-        // For each device name included in list
-        gint c = 0;
-        for (gchar **tmp = list; *tmp; c++, tmp++) {
-            GtkTreeIter iter;
-            gtk_list_store_append(v4l2SizeList, &iter);
-            gtk_list_store_set(v4l2SizeList, &iter, 0, *tmp, 1, c, -1);
-        }
-        g_strfreev(list);
         gchar *size = dbus_get_active_video_device_size();
-        if (!size || !*size || set_combo_index_from_str(GTK_COMBO_BOX(v4l2Size), size, c)) {
-            // if setting is invalid, choose first entry
-            gtk_combo_box_set_active(GTK_COMBO_BOX(v4l2Size), 0);
-            gchar *selected = get_active_text(GTK_COMBO_BOX(v4l2Size));
-            if (selected) {
-                dbus_set_active_video_device_size(selected);
-                g_free(selected);
-            }
-        }
+        reset_combo_box(v4l2Size, list, size);
+        g_free(size);
+
+        size = gtk_combo_box_text_get_active_text(v4l2Size);
+        dbus_set_active_video_device_size(size);
         g_free(size);
-    } else
-        g_warning("No device size list found");
+    }
 }
 
 /**
  * Set the video input device size on the server
  */
 static void
-select_video_input_device_size_cb(GtkComboBox* comboBox, G_GNUC_UNUSED gpointer data)
+select_video_input_device_size_cb(GtkComboBoxText* combo, G_GNUC_UNUSED gpointer data)
 {
-    gchar *str = get_active_text(comboBox);
+    gchar *str = gtk_combo_box_text_get_active_text(combo);
     if (str) {
         dbus_set_active_video_device_size(str);
         preferences_dialog_fill_video_input_device_rate_list();
@@ -702,54 +644,45 @@ select_video_input_device_size_cb(GtkComboBox* comboBox, G_GNUC_UNUSED gpointer
 static void
 preferences_dialog_fill_video_input_device_channel_list()
 {
-    if (v4l2ChannelList)
-        gtk_list_store_clear(v4l2ChannelList);
+    gchar *name = gtk_combo_box_text_get_active_text(v4l2Device);
+    gchar **channels = NULL;
 
-    gchar *dev = get_active_text(GTK_COMBO_BOX(v4l2Device));
+    if (name) {
+        channels = dbus_get_video_device_channel_list(name);
+        g_free(name);
+    }
 
-    gchar **list = NULL;
-    // Call dbus to retrieve list
-    if (dev) {
-        list = dbus_get_video_device_channel_list(dev);
-        g_free(dev);
+    if (!channels) {
+       g_warning("no channel");
+       return;
     }
 
-    if (list && *list) {
-        // For each device name included in list
-        int c = 0;
-        for (gchar **tmp = list; *tmp; c++, tmp++) {
-            GtkTreeIter iter;
-            gtk_list_store_append(v4l2ChannelList, &iter);
-            gtk_list_store_set(v4l2ChannelList, &iter, 0, *tmp, 1, c, -1);
-        }
-        g_strfreev(list);
-        gchar *channel = dbus_get_active_video_device_channel();
-        if (!channel || !*channel || set_combo_index_from_str(GTK_COMBO_BOX(v4l2Channel), channel, c)) {
-            // if setting is invalid, choose first entry
-            gtk_combo_box_set_active(GTK_COMBO_BOX(v4l2Channel), 0);
-            gchar *selected = get_active_text(GTK_COMBO_BOX(v4l2Channel));
-            if (selected) {
-                dbus_set_active_video_device_channel(selected);
-                g_free(selected);
-            }
-        }
+    gchar *channel = dbus_get_active_video_device_channel();
+    reset_combo_box(v4l2Channel, channels, channel);
+    g_strfreev(channels);
+    g_free(channel);
+
+    channel = gtk_combo_box_text_get_active_text(v4l2Channel);
+    if (channel) {
+        dbus_set_active_video_device_channel(channel);
         g_free(channel);
-    } else
-        g_warning("No channel list found");
+    }
 }
 
 /**
  * Set the video input device input on the server
  */
 static void
-select_video_input_device_channel_cb(GtkComboBox* comboBox, G_GNUC_UNUSED gpointer data)
+select_video_input_device_channel_cb(GtkComboBoxText* combo, G_GNUC_UNUSED gpointer data)
 {
-    gchar *str = get_active_text(comboBox);
-    if (str) {
-        dbus_set_active_video_device_channel(str);
-        preferences_dialog_fill_video_input_device_size_list();
-        g_free(str);
-    }
+    gchar *str = gtk_combo_box_text_get_active_text(combo);
+
+    if (!str)
+        return;
+
+    dbus_set_active_video_device_channel(str);
+    preferences_dialog_fill_video_input_device_size_list();
+    g_free(str);
 }
 
 /**
@@ -758,49 +691,39 @@ select_video_input_device_channel_cb(GtkComboBox* comboBox, G_GNUC_UNUSED gpoint
 static gboolean
 preferences_dialog_fill_video_input_device_list()
 {
-    gtk_list_store_clear(v4l2DeviceList);
+    gchar **devices = dbus_get_video_device_list();
 
-    // Call dbus to retrieve list
-    gchar **list = dbus_get_video_device_list();
-    if (!list || !*list) {
-        g_warning("No device list found");
+    if (!devices || !*devices) {
+        g_warning("no entries");
         return FALSE;
-    } else {
-        // For each device name included in list
-        gint c = 0;
-        for (gchar **tmp = list; *tmp; c++, tmp++) {
-            GtkTreeIter iter;
-            gtk_list_store_append(v4l2DeviceList, &iter);
-            gtk_list_store_set(v4l2DeviceList, &iter, 0, *tmp, 1, c, -1);
-        }
-        g_strfreev(list);
-        gchar *dev = dbus_get_active_video_device();
-        if (!dev || !*dev || set_combo_index_from_str(GTK_COMBO_BOX(v4l2Device), dev, c)) {
-            // if setting is invalid, choose first entry
-            gtk_combo_box_set_active(GTK_COMBO_BOX(v4l2Device), 0);
-            gchar *selected = get_active_text(GTK_COMBO_BOX(v4l2Device));
-            if (selected) {
-                dbus_set_active_video_device(selected);
-                g_free(selected);
-            }
-        }
-        g_free(dev);
-        return TRUE;
     }
+
+    gchar *default_device = dbus_get_active_video_device();
+    reset_combo_box(v4l2Device, devices, default_device);
+    g_strfreev(devices);
+    g_free(default_device);
+
+    /* Save the (new?) default device */
+    default_device = gtk_combo_box_text_get_active_text(v4l2Device);
+    if (default_device) {
+        dbus_set_active_video_device(default_device);
+        g_free(default_device);
+    }
+
+    return TRUE;
 }
 
 /**
  * Set the video input device on the server
  */
 static void
-select_video_input_device_cb(GtkComboBox* comboBox, G_GNUC_UNUSED gpointer data)
+select_video_input_device_cb(GtkComboBoxText* combo, G_GNUC_UNUSED gpointer data)
 {
-    gchar *str = get_active_text(comboBox);
-    if (str) {
-        g_debug("Setting video input device to %s", str);
-        dbus_set_active_video_device(str);
+    gchar *name = gtk_combo_box_text_get_active_text(combo);
+    if (name) {
+        dbus_set_active_video_device(name);
         preferences_dialog_fill_video_input_device_channel_list();
-        g_free(str);
+        g_free(name);
     }
 }
 
@@ -825,6 +748,21 @@ video_device_event_cb(G_GNUC_UNUSED DBusGProxy *proxy, G_GNUC_UNUSED gpointer fo
 }
 
 
+static GtkComboBoxText *
+attach_combo_box(GtkGrid *grid, const guint row, const gchar *label, GCallback callback)
+{
+    /* Attach the label on left */
+    GtkWidget *item = gtk_label_new(_(label));
+    gtk_grid_attach(grid, item, 0, row, 1, 1);
+
+    /* Attach the combo combo on right */
+    GtkWidget *combo = gtk_combo_box_text_new();
+    g_signal_connect(G_OBJECT(combo), "changed", callback, NULL);
+    gtk_grid_attach(grid, combo, 1, row, 1, 1);
+
+    return GTK_COMBO_BOX_TEXT(combo);
+}
+
 static GtkWidget *
 v4l2_box()
 {
@@ -840,58 +778,10 @@ v4l2_box()
     gtk_grid_set_column_spacing(GTK_GRID(grid), 40);
     gtk_box_pack_start(GTK_BOX(v4l2_hbox), grid, TRUE, TRUE, 1);
 
-    // Set choices of input devices
-    GtkWidget *item = gtk_label_new(_("Device"));
-    v4l2DeviceList = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
-    v4l2Device = gtk_combo_box_new_with_model(GTK_TREE_MODEL(v4l2DeviceList));
-
-    g_signal_connect(G_OBJECT(v4l2Device), "changed", G_CALLBACK(select_video_input_device_cb), NULL);
-    gtk_grid_attach(GTK_GRID(grid), item, 0, 0, 1, 1);
-
-    // Set rendering
-    GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
-    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(v4l2Device), renderer, TRUE);
-    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(v4l2Device), renderer, "text", 0, NULL);
-    gtk_grid_attach(GTK_GRID(grid), v4l2Device, 1, 0, 1, 1);
-
-    // Set choices of input
-    item = gtk_label_new(_("Channel"));
-    v4l2ChannelList = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
-    v4l2Channel = gtk_combo_box_new_with_model(GTK_TREE_MODEL(v4l2ChannelList));
-    g_signal_connect(G_OBJECT(v4l2Channel), "changed", G_CALLBACK(select_video_input_device_channel_cb), NULL);
-    gtk_grid_attach(GTK_GRID(grid), item, 0, 1, 1, 1);
-
-    // Set rendering
-    renderer = gtk_cell_renderer_text_new();
-    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(v4l2Channel), renderer, TRUE);
-    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(v4l2Channel), renderer, "text", 0, NULL);
-    gtk_grid_attach(GTK_GRID(grid), v4l2Channel, 1, 1, 1, 1);
-
-    // Set choices of sizes
-    item = gtk_label_new(_("Size"));
-    v4l2SizeList = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
-    v4l2Size = gtk_combo_box_new_with_model(GTK_TREE_MODEL(v4l2SizeList));
-    g_signal_connect(G_OBJECT(v4l2Size), "changed", G_CALLBACK(select_video_input_device_size_cb), NULL);
-    gtk_grid_attach(GTK_GRID(grid), item, 0, 2, 1, 1);
-
-    // Set rendering
-    renderer = gtk_cell_renderer_text_new();
-    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(v4l2Size), renderer, TRUE);
-    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(v4l2Size), renderer, "text", 0, NULL);
-    gtk_grid_attach(GTK_GRID(grid), v4l2Size, 1, 2, 1, 1);
-
-    // Set choices of rates
-    item = gtk_label_new(_("Rate"));
-    v4l2RateList = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
-    v4l2Rate = gtk_combo_box_new_with_model(GTK_TREE_MODEL(v4l2RateList));
-    g_signal_connect(G_OBJECT(v4l2Rate), "changed", G_CALLBACK(select_video_input_device_rate_cb), NULL);
-    gtk_grid_attach(GTK_GRID(grid), item, 0, 3, 1, 1);
-
-    // Set rendering
-    renderer = gtk_cell_renderer_text_new();
-    gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(v4l2Rate), renderer, TRUE);
-    gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(v4l2Rate), renderer, "text", 0, NULL);
-    gtk_grid_attach(GTK_GRID(grid), v4l2Rate, 1, 3, 1, 1);
+    v4l2Device = attach_combo_box(GTK_GRID(grid), 0, "Device", G_CALLBACK(select_video_input_device_cb));
+    v4l2Channel = attach_combo_box(GTK_GRID(grid), 1, "Channel", G_CALLBACK(select_video_input_device_channel_cb));
+    v4l2Size = attach_combo_box(GTK_GRID(grid), 2, "Size", G_CALLBACK(select_video_input_device_size_cb));
+    v4l2Rate = attach_combo_box(GTK_GRID(grid), 3, "Rate", G_CALLBACK(select_video_input_device_rate_cb));
 
     return ret;
 }