diff --git a/sflphone-gtk/src/Makefile.am b/sflphone-gtk/src/Makefile.am
index 621b8f005c668a765a333b507043a86df4ad61f5..fa16c4c6678de1f98a0de82c2d0c4070caf87762 100644
--- a/sflphone-gtk/src/Makefile.am
+++ b/sflphone-gtk/src/Makefile.am
@@ -20,6 +20,7 @@ sflphone_gtk_SOURCES = \
   mainwindow.c \
   calllist.c \
   dialpad.c \
+  audioconf.c \
   menus.c \
   calltab.c \
   calltree.c \
@@ -34,7 +35,7 @@ sflphone_gtk_SOURCES = \
   codeclist.c \
   timestamp.c 
   
-noinst_HEADERS =  actions.h dbus.h sflnotify.h mainwindow.h calllist.h dialpad.h codeclist.h assistant.h\
+noinst_HEADERS =  actions.h dbus.h sflnotify.h mainwindow.h calllist.h dialpad.h audioconf.h codeclist.h assistant.h\
                   callmanager-glue.h errors.h sflphone_const.h configurationmanager-glue.h instance-glue.h menus.h calltab.h calltree.h configwindow.h \
                   accountlist.h accountwindow.h marshaller.h sliders.h $(STATUSICON_HEADER) timestamp.h historyfilter.c
 
diff --git a/sflphone-gtk/src/audioconf.c b/sflphone-gtk/src/audioconf.c
new file mode 100644
index 0000000000000000000000000000000000000000..f54bb5f7b87ffad355af9e8804b14e67bb47d970
--- /dev/null
+++ b/sflphone-gtk/src/audioconf.c
@@ -0,0 +1,779 @@
+/*
+ *  Copyright (C) 2008 Savoir-Faire Linux inc.
+ *  Author: Emmanuel Milou <emmanuel.milou@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
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <audioconf.h>
+
+
+GtkListStore *pluginlist;
+GtkListStore *outputlist;
+GtkListStore *inputlist;
+
+GtkWidget *output;
+GtkWidget *input;
+GtkWidget *plugin;
+GtkWidget *codecMoveUpButton;
+GtkWidget *codecMoveDownButton;
+GtkWidget *codecTreeView;		// View used instead of store to get access to selection
+
+// Codec properties ID
+enum {
+  COLUMN_CODEC_ACTIVE,
+  COLUMN_CODEC_NAME,
+  COLUMN_CODEC_FREQUENCY,
+  COLUMN_CODEC_BITRATE,
+  COLUMN_CODEC_BANDWIDTH,
+  CODEC_COLUMN_COUNT
+};
+
+/**
+ * Fills the tree list with supported codecs
+ */
+  void
+config_window_fill_codec_list()
+{
+  GtkListStore *codecStore;
+  GtkTreeIter iter;
+
+  // Get model of view and clear it
+  codecStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(codecTreeView)));
+  gtk_list_store_clear(codecStore);
+
+  // Insert codecs
+  int i;
+  for(i = 0; i < codec_list_get_size(); i++)
+  {
+    codec_t *c = codec_list_get_nth(i);
+    printf("%s\n", c->name);
+    if(c)
+    {
+      gtk_list_store_append(codecStore, &iter);
+      gtk_list_store_set(codecStore, &iter,
+	  COLUMN_CODEC_ACTIVE,	c->is_active,									// Active
+	  COLUMN_CODEC_NAME,		c->name,										// Name
+	  COLUMN_CODEC_FREQUENCY,	g_strdup_printf("%d kHz", c->sample_rate/1000),	// Frequency (kHz)
+	  COLUMN_CODEC_BITRATE,	g_strdup_printf("%.1f kbps", c->_bitrate),		// Bitrate (kbps)
+	  COLUMN_CODEC_BANDWIDTH,	g_strdup_printf("%.1f kbps", c->_bandwidth),	// Bandwidth (kpbs)
+	  -1);
+    }
+  }
+}
+
+/**
+ * Fill store with output audio plugins
+ */
+  void
+config_window_fill_output_audio_plugin_list()
+{
+  GtkTreeIter iter;
+  gchar** list;
+  gchar* managerName;
+
+  gtk_list_store_clear(pluginlist);
+
+  // Call dbus to retreive list
+  list = dbus_get_output_audio_plugin_list();
+
+  // For each API name included in list
+  int c = 0;
+  for(managerName = list[c]; managerName != NULL; managerName = list[c])
+  {
+    c++;
+    gtk_list_store_append(pluginlist, &iter);
+    gtk_list_store_set(pluginlist, &iter, 0 , managerName, -1);
+  }
+}
+
+/**
+ * Fill output audio device store
+ */
+  void
+config_window_fill_output_audio_device_list()
+{
+  /*
+     GtkTreeIter iter;
+     gchar** list;
+     gchar** audioDevice;
+     int index;
+
+     gtk_list_store_clear(outputlist);
+
+  // Call dbus to retreive list
+  list = dbus_get_audio_output_device_list();
+
+  // For each device name included in list
+  int c = 0;
+  for(audioDevice = list; *list ; list++)
+  {
+  index = dbus_get_audio_device_index( *list );
+  gtk_list_store_append(outputlist, &iter);
+  gtk_list_store_set(outputlist, &iter, 0, *list, 1, index, -1);
+  c++;
+  }
+  */
+}
+
+/**
+ * Select active output audio device
+ */
+  void
+select_active_output_audio_device()
+{
+  /*
+     GtkTreeModel* model;
+     GtkTreeIter iter;
+     gchar** devices;
+     int currentDeviceIndex;
+     int deviceIndex;
+
+  // Select active output device on server
+  devices = dbus_get_current_audio_devices_index();
+  currentDeviceIndex = atoi(devices[0]);
+  printf(_("audio device index for output = %d\n"), currentDeviceIndex);
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(output));
+
+  // Find the currently set output device
+  gtk_tree_model_get_iter_first(model, &iter);
+  do {
+  gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
+  if(deviceIndex == currentDeviceIndex)
+  {
+  // Set current iteration the active one
+  gtk_combo_box_set_active_iter(GTK_COMBO_BOX(output), &iter);
+  return;
+  }
+  } while(gtk_tree_model_iter_next(model, &iter));
+
+  // No index was found, select first one
+  g_print("Warning : No active output device found");
+  gtk_combo_box_set_active(GTK_COMBO_BOX(output), 0);
+  */
+}
+
+/**
+ * Fill input audio device store
+ */
+  void
+config_window_fill_input_audio_device_list()
+{
+  /*
+     GtkTreeIter iter;
+     gchar** list;
+     gchar** audioDevice;
+     int index ;
+     gtk_list_store_clear(inputAudioDeviceManagerStore);
+
+  // Call dbus to retreive list
+  list = dbus_get_audio_input_device_list();
+
+  // For each device name included in list
+  //int c = 0;
+  for(audioDevice = list; *list; list++)
+  {
+  index = dbus_get_audio_device_index( *list );
+  gtk_list_store_append(inputAudioDeviceManagerStore, &iter);
+  gtk_list_store_set(inputAudioDeviceManagerStore, &iter, 0, *list, 1, index, -1);
+  //c++;
+  }
+  */
+}
+
+/**
+ * Select active input audio device
+ */
+  void
+select_active_input_audio_device()
+{
+  /*
+     GtkTreeModel* model;
+     GtkTreeIter iter;
+     gchar** devices;
+     int currentDeviceIndex;
+     int deviceIndex;
+
+  // Select active input device on server
+  devices = dbus_get_current_audio_devices_index();
+  currentDeviceIndex = atoi(devices[1]);
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(input));
+
+  // Find the currently set input device
+  gtk_tree_model_get_iter_first(model, &iter);
+  do {
+  gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
+  if(deviceIndex == currentDeviceIndex)
+  {
+  // Set current iteration the active one
+  gtk_combo_box_set_active_iter(GTK_COMBO_BOX(input), &iter);
+  return;
+  }
+  } while(gtk_tree_model_iter_next(model, &iter));
+
+  // No index was found, select first one
+  g_print("Warning : No active input device found");
+  gtk_combo_box_set_active(GTK_COMBO_BOX(input), 0);
+  */
+}
+
+/**
+ * Select the output audio plugin by calling the server
+ */
+  static void
+select_output_audio_plugin(GtkComboBox* widget, gpointer data)
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  int comboBoxIndex;
+  gchar* pluginName;
+
+  comboBoxIndex = gtk_combo_box_get_active(widget);
+
+  if(comboBoxIndex >= 0)
+  {
+    model = gtk_combo_box_get_model(widget);
+    gtk_combo_box_get_active_iter(widget, &iter);
+    gtk_tree_model_get(model, &iter, 0, &pluginName, -1);	
+    dbus_set_output_audio_plugin(pluginName);
+    //update_combo_box( pluginName);
+  }
+}
+
+/**
+ * Select active output audio plugin
+ */
+  void
+select_active_output_audio_plugin()
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  gchar* plugin;
+  gchar* tmp;
+
+  // Select active output device on server
+  plugin = dbus_get_current_audio_output_plugin();
+  tmp = plugin;
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(plugin));
+
+  // Find the currently alsa plugin
+  gtk_tree_model_get_iter_first(model, &iter);
+  do {
+    gtk_tree_model_get(model, &iter, 0, &plugin , -1);
+    if( g_strcasecmp( tmp , plugin ) == 0 )
+    {
+      // Set current iteration the active one
+      gtk_combo_box_set_active_iter(GTK_COMBO_BOX(plugin), &iter);
+      //update_combo_box( plugin );
+      return;
+    }
+  } while(gtk_tree_model_iter_next(model, &iter));
+
+  // No index was found, select first one
+  g_print("Warning : No active output device found\n");
+  gtk_combo_box_set_active(GTK_COMBO_BOX(plugin), 0);
+  //update_combo_box("default");
+}
+
+
+/**
+ * Set the audio output device on the server with its index
+ */
+  static void
+select_audio_output_device(GtkComboBox* comboBox, gpointer data)
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  int comboBoxIndex;
+  int deviceIndex;
+
+  comboBoxIndex = gtk_combo_box_get_active(comboBox);
+
+  if(comboBoxIndex >= 0)
+  {
+    model = gtk_combo_box_get_model(comboBox);
+    gtk_combo_box_get_active_iter(comboBox, &iter);
+    gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
+
+    dbus_set_audio_output_device(deviceIndex);
+  }
+}
+
+/**
+ * Set the audio input device on the server with its index
+ */
+  static void
+select_audio_input_device(GtkComboBox* comboBox, gpointer data)
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  int comboBoxIndex;
+  int deviceIndex;
+
+  comboBoxIndex = gtk_combo_box_get_active(comboBox);
+
+  if(comboBoxIndex >= 0)
+  {
+    model = gtk_combo_box_get_model(comboBox);
+    gtk_combo_box_get_active_iter(comboBox, &iter);
+    gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
+
+    dbus_set_audio_input_device(deviceIndex);
+  }
+}
+
+/**
+ * Toggle move buttons on if a codec is selected, off elsewise
+ */
+  static void
+select_codec(GtkTreeSelection *selection, GtkTreeModel *model)
+{
+  GtkTreeIter iter;
+
+  if(!gtk_tree_selection_get_selected(selection, &model, &iter))
+  {
+    gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE);
+    gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE);
+  }
+  else
+  {
+    gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), TRUE);
+    gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), TRUE);
+  }
+}
+
+/**
+ * Toggle active value of codec on click and update changes to the deamon
+ * and in configuration files
+ */
+  static void
+codec_active_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer data)
+{
+  GtkTreeIter iter;
+  GtkTreePath *treePath;
+  GtkTreeModel *model;
+  gboolean active;
+  char* name;
+
+  // Get path of clicked codec active toggle box
+  treePath = gtk_tree_path_new_from_string(path);
+  model = gtk_tree_view_get_model(GTK_TREE_VIEW(data));
+  gtk_tree_model_get_iter(model, &iter, treePath);
+
+  // Get active value and name at iteration
+  gtk_tree_model_get(model, &iter,
+      COLUMN_CODEC_ACTIVE, &active,
+      COLUMN_CODEC_NAME, &name,
+      -1);
+
+  printf("%s\n", name);
+
+  // Toggle active value
+  active = !active;
+
+  // Store value
+  gtk_list_store_set(GTK_LIST_STORE(model), &iter,
+      COLUMN_CODEC_ACTIVE, active,
+      -1);
+
+  gtk_tree_path_free(treePath);
+
+  // Modify codec queue to represent change	
+  if(active)
+    codec_set_active(name);
+  else
+    codec_set_inactive(name);
+
+  // Perpetuate changes to the deamon
+  codec_list_update_to_daemon();
+}
+
+
+/**
+ * Move codec in list depending on direction and selected codec and
+ * update changes in the daemon list and the configuration files
+ */
+  static void
+codec_move(gboolean moveUp, gpointer data)
+{
+  GtkTreeIter iter;
+  GtkTreeIter *iter2;
+  GtkTreeView *treeView;
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+  GtkTreePath *treePath;
+  gchar *path;
+
+  // Get view, model and selection of codec store
+  treeView = GTK_TREE_VIEW(data);
+  model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView));
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
+
+  // Find selected iteration and create a copy
+  gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter);
+  iter2 = gtk_tree_iter_copy(&iter);
+
+  // Find path of iteration
+  path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model), &iter);
+  treePath = gtk_tree_path_new_from_string(path);
+  gint *indices = gtk_tree_path_get_indices(treePath);
+  gint indice = indices[0];
+
+  // Depending on button direction get new path
+  if(moveUp)
+    gtk_tree_path_prev(treePath);
+  else
+    gtk_tree_path_next(treePath);
+  gtk_tree_model_get_iter(model, &iter, treePath);
+
+  // Swap iterations if valid
+  if(gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter))
+    gtk_list_store_swap(GTK_LIST_STORE(model), &iter, iter2);
+
+  // Scroll to new position
+  gtk_tree_view_scroll_to_cell(treeView, treePath, NULL, FALSE, 0, 0);
+
+  // Free resources
+  gtk_tree_path_free(treePath);
+  gtk_tree_iter_free(iter2);
+  g_free(path);
+
+  // Perpetuate changes in codec queue
+  if(moveUp)
+    codec_list_move_codec_up(indice);
+  else
+    codec_list_move_codec_down(indice);
+
+  // Perpetuate changes to the deamon
+  codec_list_update_to_daemon();
+}
+
+/**
+ * Called from move up codec button signal
+ */
+  static void
+codec_move_up(GtkButton *button, gpointer data)
+{
+  // Change tree view ordering and get indice changed
+  codec_move(TRUE, data);
+}
+
+/**
+ * Called from move down codec button signal
+ */
+  static void
+codec_move_down(GtkButton *button, gpointer data)
+{
+  // Change tree view ordering and get indice changed
+  codec_move(FALSE, data);
+}
+
+  int 
+is_ringtone_enabled( void )
+{
+  return dbus_is_ringtone_enabled();  
+}
+
+  void 
+ringtone_enabled( void )
+{
+  dbus_ringtone_enabled();  
+}
+
+  void
+ringtone_changed( GtkFileChooser *chooser , GtkLabel *label)
+{
+  gchar* tone = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( chooser ));
+  dbus_set_ringtone_choice( tone );
+}
+
+  gchar*
+get_ringtone_choice( void )
+{
+  return dbus_get_ringtone_choice();
+}
+
+
+GtkWidget* codecs_box()
+{
+  GtkWidget *ret;
+  GtkWidget *scrolledWindow;
+  GtkWidget *buttonBox;
+
+  GtkListStore *codecStore;
+  GtkCellRenderer *renderer;
+  GtkTreeSelection *treeSelection;
+  GtkTreeViewColumn *treeViewColumn;
+
+  ret = gtk_hbox_new(FALSE, 10);
+  gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
+
+  scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
+  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN);
+
+  gtk_box_pack_start(GTK_BOX(ret), scrolledWindow, TRUE, TRUE, 0);
+  codecStore = gtk_list_store_new(CODEC_COLUMN_COUNT,
+      G_TYPE_BOOLEAN,		// Active
+      G_TYPE_STRING,		// Name
+      G_TYPE_STRING,		// Frequency
+      G_TYPE_STRING,		// Bit rate
+      G_TYPE_STRING		// Bandwith
+      );
+
+  // Create codec tree view with list store
+  codecTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(codecStore));
+
+  // Get tree selection manager
+  treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(codecTreeView));
+  g_signal_connect(G_OBJECT(treeSelection), "changed",
+      G_CALLBACK (select_codec),
+      codecStore);
+
+  // Active column
+  renderer = gtk_cell_renderer_toggle_new();
+  treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_CODEC_ACTIVE, NULL);
+  gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
+
+  // Toggle codec active property on clicked
+  g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(codec_active_toggled), (gpointer)codecTreeView);
+
+  // Name column
+  renderer = gtk_cell_renderer_text_new();
+  treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "markup", COLUMN_CODEC_NAME, NULL);
+  gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
+
+  // Bit rate column
+  renderer = gtk_cell_renderer_text_new();
+  treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Frequency"), renderer, "text", COLUMN_CODEC_FREQUENCY, NULL);
+  gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
+
+  // Bandwith column
+  renderer = gtk_cell_renderer_text_new();
+  treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bitrate"), renderer, "text", COLUMN_CODEC_BITRATE, NULL);
+  gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
+
+  // Frequency column
+  renderer = gtk_cell_renderer_text_new();
+  treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bandwidth"), renderer, "text", COLUMN_CODEC_BANDWIDTH, NULL);
+  gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
+
+  g_object_unref(G_OBJECT(codecStore));
+  gtk_container_add(GTK_CONTAINER(scrolledWindow), codecTreeView);
+
+  // Create button box
+  buttonBox = gtk_vbox_new(FALSE, 0);
+  gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10);
+  gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0);
+
+  codecMoveUpButton = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
+  gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE);
+  gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveUpButton, FALSE, FALSE, 0);
+  g_signal_connect(G_OBJECT(codecMoveUpButton), "clicked", G_CALLBACK(codec_move_up), codecTreeView);
+
+  codecMoveDownButton = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
+  gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE);
+  gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveDownButton, FALSE, FALSE, 0);
+  g_signal_connect(G_OBJECT(codecMoveDownButton), "clicked", G_CALLBACK(codec_move_down), codecTreeView);
+
+  config_window_fill_codec_list();
+
+  return ret;
+}
+
+GtkWidget* api_box()
+{
+  GtkWidget *ret;
+  GtkWidget *alsa;
+  GtkWidget *pulse;
+
+  ret = gtk_hbox_new(FALSE, 10);
+  gtk_widget_show( ret );
+
+  pulse = gtk_radio_button_new_with_mnemonic( NULL , _("Pulseaudio"));
+  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(pulse), TRUE  );
+  gtk_box_pack_start( GTK_BOX(ret) , pulse , TRUE , TRUE , 1);
+  alsa = gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(pulse),  _("ALSA"));
+  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(alsa), FALSE );
+  gtk_box_pack_end( GTK_BOX(ret) , alsa , TRUE , TRUE , 1);
+
+  gtk_widget_show_all(ret);
+
+  return ret;
+}
+
+GtkWidget* alsa_box()
+{
+  GtkWidget *ret;
+  GtkWidget *table;
+  GtkWidget *item;
+  GtkCellRenderer *renderer;
+
+  ret = gtk_hbox_new(FALSE, 10);
+  gtk_widget_show( ret );
+
+  table = gtk_table_new(4, 3, FALSE);
+  gtk_table_set_col_spacing(GTK_TABLE(table), 0, 40);
+  gtk_box_pack_start( GTK_BOX(ret) , table , TRUE , TRUE , 1);
+  gtk_widget_show(table);
+
+  item = gtk_label_new(_("ALSA plugin"));
+  gtk_misc_set_alignment(GTK_MISC(item), 0, 0.5);
+  gtk_table_attach(GTK_TABLE(table), item, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
+  gtk_widget_show( item );
+  // Set choices of audio managers
+  pluginlist = gtk_list_store_new(1, G_TYPE_STRING);
+  config_window_fill_output_audio_plugin_list();
+  plugin = gtk_combo_box_new_with_model(GTK_TREE_MODEL(pluginlist));
+  //select_active_output_audio_plugin();
+  gtk_label_set_mnemonic_widget(GTK_LABEL(item), plugin);
+  //g_signal_connect(G_OBJECT(plugin), "changed", G_CALLBACK(select_output_audio_plugin), plugin);
+
+  // Set rendering
+  renderer = gtk_cell_renderer_text_new();
+  gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(plugin), renderer, TRUE);
+  gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(plugin), renderer, "text", 0, NULL);
+  gtk_table_attach(GTK_TABLE(table), plugin, 2, 3, 1, 2, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
+  gtk_widget_show(plugin);
+
+  // Device : Output device
+  // Create title label
+  item = gtk_label_new(_("Output"));
+  gtk_misc_set_alignment(GTK_MISC(item), 0, 0.5);
+  gtk_table_attach(GTK_TABLE(table), item, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
+  gtk_widget_show(item);
+  // Set choices of output devices
+  outputlist = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+  config_window_fill_output_audio_device_list();
+  output = gtk_combo_box_new_with_model(GTK_TREE_MODEL(outputlist));
+  //select_active_output_audio_device();
+  gtk_label_set_mnemonic_widget(GTK_LABEL(item), output);
+  //g_signal_connect(G_OBJECT(output), "changed", G_CALLBACK(select_audio_output_device), output);
+
+  // Set rendering
+  renderer = gtk_cell_renderer_text_new();
+  gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(output), renderer, TRUE);
+  gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(output), renderer, "text", 0, NULL);
+  gtk_table_attach(GTK_TABLE(table), output, 2, 3, 2, 3, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
+  gtk_widget_show(output);
+
+  // Device : Input device
+  // Create title label
+  item = gtk_label_new(_("Input"));
+  gtk_misc_set_alignment(GTK_MISC(item), 0, 0.5);
+  gtk_table_attach(GTK_TABLE(table), item, 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
+  gtk_widget_show(item);
+  // Set choices of output devices
+  inputlist = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+  config_window_fill_input_audio_device_list();
+  input = gtk_combo_box_new_with_model(GTK_TREE_MODEL(inputlist));
+  //select_active_input_audio_device();
+  gtk_label_set_mnemonic_widget(GTK_LABEL(item), input);
+  //g_signal_connect(G_OBJECT(input), "changed", G_CALLBACK(select_audio_input_device), input);
+
+  // Set rendering
+  renderer = gtk_cell_renderer_text_new();
+  gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(input), renderer, TRUE);
+  gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(input), renderer, "text", 0, NULL);
+  gtk_table_attach(GTK_TABLE(table), input, 2, 3, 3, 4, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
+  gtk_widget_show(input);
+
+  gtk_widget_show_all(ret);
+
+  return ret;
+}
+
+GtkWidget* ringtones_box()
+{
+  GtkWidget *ret;
+  GtkWidget *enableTone;
+  GtkWidget *fileChooser;
+
+  // check button to enable ringtones
+  ret = gtk_hbox_new( TRUE , 1);
+  enableTone = gtk_check_button_new_with_mnemonic( _("_Enable ringtones"));
+  gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(enableTone), dbus_is_ringtone_enabled() );
+  gtk_box_pack_start( GTK_BOX(ret) , enableTone , TRUE , TRUE , 1);
+  g_signal_connect(G_OBJECT( enableTone) , "clicked" , G_CALLBACK( ringtone_enabled ) , NULL);
+  // file chooser button
+  fileChooser = gtk_file_chooser_button_new(_("Choose a ringtone"), GTK_FILE_CHOOSER_ACTION_OPEN);
+  gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER( fileChooser) , g_get_home_dir());	
+  gtk_file_chooser_set_filename(GTK_FILE_CHOOSER( fileChooser) , get_ringtone_choice());	
+  g_signal_connect( G_OBJECT( fileChooser ) , "selection_changed" , G_CALLBACK( ringtone_changed ) , NULL );
+  GtkFileFilter *filter = gtk_file_filter_new();
+  gtk_file_filter_set_name( filter , _("Audio Files") );
+  gtk_file_filter_add_pattern(filter , "*.wav" );
+  gtk_file_filter_add_pattern(filter , "*.ul" );
+  gtk_file_filter_add_pattern(filter , "*.au" );
+  gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fileChooser ) , filter);
+  gtk_box_pack_start( GTK_BOX(ret) , fileChooser , TRUE , TRUE , 1);
+
+  return ret;
+}
+
+
+GtkWidget* create_audio_configuration()
+{
+  // Main widget
+  GtkWidget *ret;
+  // Main frames
+  GtkWidget *sound_conf;
+  GtkWidget *alsa_conf;
+  GtkWidget *codecs_conf;
+  GtkWidget *ringtones_conf;
+  // Sub boxes
+  GtkWidget *box;
+
+  ret = gtk_vbox_new(FALSE, 10);
+  gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
+
+  // Box for the audio manager selection
+  sound_conf = gtk_frame_new(_("Sound Manager"));
+  gtk_box_pack_start(GTK_BOX(ret), sound_conf, FALSE, FALSE, 0);
+  gtk_widget_show( sound_conf );
+  box = api_box();
+  gtk_container_add( GTK_CONTAINER(sound_conf) , box );
+
+  // Box for the ALSA configuration
+  alsa_conf = gtk_frame_new(_("ALSA configuration"));
+  gtk_box_pack_start(GTK_BOX(ret), alsa_conf, FALSE, FALSE, 0);
+  gtk_widget_show( alsa_conf );
+  box = alsa_box();
+  gtk_container_add( GTK_CONTAINER(alsa_conf) , box );
+
+  // Box for the codecs
+  codecs_conf = gtk_frame_new(_("Codecs"));
+  gtk_box_pack_start(GTK_BOX(ret), codecs_conf, FALSE, FALSE, 0);
+  gtk_widget_show( codecs_conf );
+  box = codecs_box();
+  gtk_container_add( GTK_CONTAINER(codecs_conf) , box );
+
+  // Box for the codecs
+  ringtones_conf = gtk_frame_new(_("Ringtones"));
+  gtk_box_pack_start(GTK_BOX(ret), ringtones_conf, FALSE, FALSE, 0);
+  gtk_widget_show( ringtones_conf );
+  box = ringtones_box();
+  gtk_container_add( GTK_CONTAINER(ringtones_conf) , box );
+
+  gtk_widget_show_all(ret);
+
+  return ret;
+}
+
+gboolean get_api()
+{
+  return gtk_widget_get_active()
+}
+
diff --git a/sflphone-gtk/src/audioconf.h b/sflphone-gtk/src/audioconf.h
new file mode 100644
index 0000000000000000000000000000000000000000..ab1f8411be29fa0494d9535e129ded2421ee2466
--- /dev/null
+++ b/sflphone-gtk/src/audioconf.h
@@ -0,0 +1,34 @@
+/*
+ *  Copyright (C) 2008 Savoir-Faire Linux inc.
+ *  Author: Emmanuel Milou <emmanuel.milou@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
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __AUDIO_CONF_H
+#define __AUDIO_CONF_H
+
+#include <actions.h>
+
+GtkWidget* create_audio_configuration();
+
+GtkWidget* api_box();
+GtkWidget* alsa_box();
+GtkWidget* codecs_box();
+GtkWidget* ringtone_box();
+
+gboolean get_api( );
+
+#endif // __AUDIO_CONF_H
diff --git a/sflphone-gtk/src/configwindow.c b/sflphone-gtk/src/configwindow.c
index 17db576770d29b6d547245597e5c1f9e4462cdd1..471dcb1b58e36cbd12bb343aa1c47bc65a5b4498 100644
--- a/sflphone-gtk/src/configwindow.c
+++ b/sflphone-gtk/src/configwindow.c
@@ -19,17 +19,19 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <gtk/gtk.h>
+
 #include <accountlist.h>
 #include <accountwindow.h>
 #include <actions.h>
 #include <config.h>
 #include <dbus.h>
 #include <mainwindow.h>
+#include <audioconf.h>
 
 #include <stdlib.h>
 #include <stdio.h>
 
-#include <gtk/gtk.h>
 
 /**
  * Local variables
@@ -38,13 +40,7 @@ gboolean dialogOpen = FALSE;
 gboolean ringtoneEnabled = TRUE;
 
 GtkListStore *accountStore;
-GtkWidget *codecTreeView;		// View used instead of store to get access to selection
 								// instead of keeping selected codec as a variable
-GtkListStore *inputAudioPluginStore;
-GtkListStore *outputAudioPluginStore;
-GtkListStore *outputAudioDeviceManagerStore;
-GtkListStore *inputAudioDeviceManagerStore;
-
 GtkWidget *addButton;
 GtkWidget *editButton;
 GtkWidget *deleteButton;
@@ -52,13 +48,6 @@ GtkWidget *restoreButton;
 GtkWidget *accountMoveDownButton;
 GtkWidget *accountMoveUpButton;
 
-GtkWidget *outputDeviceComboBox;
-GtkWidget *inputDeviceComboBox;
-GtkWidget *pluginComboBox;
-
-GtkWidget *codecMoveUpButton;
-GtkWidget *codecMoveDownButton;
-
 GtkWidget* status;
 
 account_t *selectedAccount;
@@ -73,15 +62,6 @@ enum {
 	COLUMN_ACCOUNT_COUNT
 };
 
-// Codec properties ID
-enum {
-	COLUMN_CODEC_ACTIVE,
-	COLUMN_CODEC_NAME,
-	COLUMN_CODEC_FREQUENCY,
-	COLUMN_CODEC_BITRATE,
-	COLUMN_CODEC_BANDWIDTH,
-	CODEC_COLUMN_COUNT
-};
 
 /**
  * Fills the treelist with accounts
@@ -117,332 +97,6 @@ config_window_fill_account_list()
 	}
 }
 
-/**
- * Fills the tree list with supported codecs
-*/
-void
-config_window_fill_codec_list()
-{
-	if(dialogOpen)
-	{
-		GtkListStore *codecStore;
-		GtkTreeIter iter;
-		
-		// Get model of view and clear it
-		codecStore = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(codecTreeView)));
-		gtk_list_store_clear(codecStore);
-
-		// Insert codecs
-		int i;
-		for(i = 0; i < codec_list_get_size(); i++)
-		{
-			codec_t *c = codec_list_get_nth(i);
-			printf("%s\n", c->name);
-			if(c)
-			{
-				gtk_list_store_append(codecStore, &iter);
-				gtk_list_store_set(codecStore, &iter,
-						COLUMN_CODEC_ACTIVE,	c->is_active,									// Active
-						COLUMN_CODEC_NAME,		c->name,										// Name
-						COLUMN_CODEC_FREQUENCY,	g_strdup_printf("%d kHz", c->sample_rate/1000),	// Frequency (kHz)
-						COLUMN_CODEC_BITRATE,	g_strdup_printf("%.1f kbps", c->_bitrate),		// Bitrate (kbps)
-						COLUMN_CODEC_BANDWIDTH,	g_strdup_printf("%.1f kbps", c->_bandwidth),	// Bandwidth (kpbs)
-						-1);
-			}
-		}
-	}
-}
-
-/**
- * Fill store with input audio plugins
- */
-void
-config_window_fill_input_audio_plugin_list()
-{
-	GtkTreeIter iter;
-	gchar** list;
-	gchar* managerName;
-
-	gtk_list_store_clear(inputAudioPluginStore);
-	
-	// Call dbus to retreive list
-	list = dbus_get_input_audio_plugin_list();
-	
-	// For each API name included in list
-	int c = 0;
-	for(managerName = list[c]; managerName != NULL; managerName = list[c])
-	{
-		c++;
-		gtk_list_store_append(inputAudioPluginStore, &iter);
-		gtk_list_store_set(inputAudioPluginStore, &iter, 0 , managerName, -1);
-	}
-}
-
-/**
- * Fill store with output audio plugins
- */
-void
-config_window_fill_output_audio_plugin_list()
-{
-	GtkTreeIter iter;
-	gchar** list;
-	gchar* managerName;
-
-	gtk_list_store_clear(outputAudioPluginStore);
-	
-	// Call dbus to retreive list
-	list = dbus_get_output_audio_plugin_list();
-	
-	// For each API name included in list
-	int c = 0;
-	for(managerName = list[c]; managerName != NULL; managerName = list[c])
-	{
-		c++;
-		gtk_list_store_append(outputAudioPluginStore, &iter);
-		gtk_list_store_set(outputAudioPluginStore, &iter, 0 , managerName, -1);
-	}
-}
-/**
- * Fill output audio device store
- */
-void
-config_window_fill_output_audio_device_list()
-{
-	GtkTreeIter iter;
-	gchar** list;
-	gchar** audioDevice;
-	int index;
-
-	gtk_list_store_clear(outputAudioDeviceManagerStore);
-	
-	// Call dbus to retreive list
-	list = dbus_get_audio_output_device_list();
-	
-	// For each device name included in list
-	int c = 0;
-	for(audioDevice = list; *list ; list++)
-	{
-		index = dbus_get_audio_device_index( *list );
-		gtk_list_store_append(outputAudioDeviceManagerStore, &iter);
-		gtk_list_store_set(outputAudioDeviceManagerStore, &iter, 0, *list, 1, index, -1);
-		c++;
-	}
-}
-
-/**
- * Select active output audio device
- */
-void
-select_active_output_audio_device()
-{
-	GtkTreeModel* model;
-	GtkTreeIter iter;
-	gchar** devices;
-	int currentDeviceIndex;
-	int deviceIndex;
-
-	// Select active output device on server
-	devices = dbus_get_current_audio_devices_index();
-	currentDeviceIndex = atoi(devices[0]);
-	printf(_("audio device index for output = %d\n"), currentDeviceIndex);
-	model = gtk_combo_box_get_model(GTK_COMBO_BOX(outputDeviceComboBox));
-	
-	// Find the currently set output device
-	gtk_tree_model_get_iter_first(model, &iter);
-	do {
-		gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
-		if(deviceIndex == currentDeviceIndex)
-		{
-			// Set current iteration the active one
-			gtk_combo_box_set_active_iter(GTK_COMBO_BOX(outputDeviceComboBox), &iter);
-			return;
-		}
-	} while(gtk_tree_model_iter_next(model, &iter));
-
-	// No index was found, select first one
-	g_print("Warning : No active output device found");
-	gtk_combo_box_set_active(GTK_COMBO_BOX(outputDeviceComboBox), 0);
-}
-
-/**
- * Fill input audio device store
- */
-void
-config_window_fill_input_audio_device_list()
-{
-	GtkTreeIter iter;
-	gchar** list;
-	gchar** audioDevice;
-	int index ;
-	gtk_list_store_clear(inputAudioDeviceManagerStore);
-	
-	// Call dbus to retreive list
-	list = dbus_get_audio_input_device_list();
-	
-	// For each device name included in list
-	//int c = 0;
-	for(audioDevice = list; *list; list++)
-	{
-		index = dbus_get_audio_device_index( *list );
-		gtk_list_store_append(inputAudioDeviceManagerStore, &iter);
-		gtk_list_store_set(inputAudioDeviceManagerStore, &iter, 0, *list, 1, index, -1);
-		//c++;
-	}
-}
-
-/**
- * Select active input audio device
- */
-void
-select_active_input_audio_device()
-{
-	GtkTreeModel* model;
-	GtkTreeIter iter;
-	gchar** devices;
-	int currentDeviceIndex;
-	int deviceIndex;
-
-	// Select active input device on server
-	devices = dbus_get_current_audio_devices_index();
-	currentDeviceIndex = atoi(devices[1]);
-	model = gtk_combo_box_get_model(GTK_COMBO_BOX(inputDeviceComboBox));
-	
-	// Find the currently set input device
-	gtk_tree_model_get_iter_first(model, &iter);
-	do {
-		gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
-		if(deviceIndex == currentDeviceIndex)
-		{
-			// Set current iteration the active one
-			gtk_combo_box_set_active_iter(GTK_COMBO_BOX(inputDeviceComboBox), &iter);
-			return;
-		}
-	} while(gtk_tree_model_iter_next(model, &iter));
-
-	// No index was found, select first one
-	g_print("Warning : No active input device found");
-	gtk_combo_box_set_active(GTK_COMBO_BOX(inputDeviceComboBox), 0);
-}
-
-void
-update_combo_box( gchar* plugin )
-{
-	// set insensitive the devices widget if the selected plugin is default
-	if( g_strcasecmp( plugin , "default" ) == 0)
-	{
-	  //gtk_widget_set_sensitive( GTK_WIDGET ( outputDeviceComboBox ) , FALSE );
-	  //gtk_widget_set_sensitive( GTK_WIDGET ( inputDeviceComboBox ) , FALSE );
-	}
-	else
-	{
-	  //gtk_widget_set_sensitive( GTK_WIDGET ( outputDeviceComboBox ) , TRUE );
-	  //gtk_widget_set_sensitive( GTK_WIDGET ( inputDeviceComboBox ) , TRUE );
-	}
-}
-/**
- * Select the output audio plugin by calling the server
- */
-static void
-select_output_audio_plugin(GtkComboBox* widget, gpointer data)
-{
-	GtkTreeModel* model;
-	GtkTreeIter iter;
-	int comboBoxIndex;
-	gchar* pluginName;
-	
-	comboBoxIndex = gtk_combo_box_get_active(widget);
-	
-	if(comboBoxIndex >= 0)
-	{
-		model = gtk_combo_box_get_model(widget);
-		gtk_combo_box_get_active_iter(widget, &iter);
-		gtk_tree_model_get(model, &iter, 0, &pluginName, -1);	
-		dbus_set_output_audio_plugin(pluginName);
-		//update_combo_box( pluginName);
-	}
-}
-
-/**
- * Select active output audio plugin
- */
-void
-select_active_output_audio_plugin()
-{
-	GtkTreeModel* model;
-	GtkTreeIter iter;
-	gchar* plugin;
-	gchar* tmp;
-
-	// Select active output device on server
-	plugin = dbus_get_current_audio_output_plugin();
-	tmp = plugin;
-	model = gtk_combo_box_get_model(GTK_COMBO_BOX(pluginComboBox));
-	  
-	// Find the currently alsa plugin
-	gtk_tree_model_get_iter_first(model, &iter);
-	do {
-		gtk_tree_model_get(model, &iter, 0, &plugin , -1);
-		if( g_strcasecmp( tmp , plugin ) == 0 )
-		{
-			// Set current iteration the active one
-			gtk_combo_box_set_active_iter(GTK_COMBO_BOX(pluginComboBox), &iter);
-			//update_combo_box( plugin );
-			return;
-		}
-	} while(gtk_tree_model_iter_next(model, &iter));
-
-	// No index was found, select first one
-	g_print("Warning : No active output device found\n");
-	gtk_combo_box_set_active(GTK_COMBO_BOX(pluginComboBox), 0);
-	//update_combo_box("default");
-}
-
-
-/**
- * Set the audio output device on the server with its index
- */
-static void
-select_audio_output_device(GtkComboBox* comboBox, gpointer data)
-{
-	GtkTreeModel* model;
-	GtkTreeIter iter;
-	int comboBoxIndex;
-	int deviceIndex;
-	
-	comboBoxIndex = gtk_combo_box_get_active(comboBox);
-	
-	if(comboBoxIndex >= 0)
-	{
-		model = gtk_combo_box_get_model(comboBox);
-		gtk_combo_box_get_active_iter(comboBox, &iter);
-		gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
-		
-		dbus_set_audio_output_device(deviceIndex);
-	}
-}
-
-/**
- * Set the audio input device on the server with its index
- */
-static void
-select_audio_input_device(GtkComboBox* comboBox, gpointer data)
-{
-	GtkTreeModel* model;
-	GtkTreeIter iter;
-	int comboBoxIndex;
-	int deviceIndex;
-	
-	comboBoxIndex = gtk_combo_box_get_active(comboBox);
-	
-	if(comboBoxIndex >= 0)
-	{
-		model = gtk_combo_box_get_model(comboBox);
-		gtk_combo_box_get_active_iter(comboBox, &iter);
-		gtk_tree_model_get(model, &iter, 1, &deviceIndex, -1);
-		
-		dbus_set_audio_input_device(deviceIndex);
-	}
-}
 
 /**
  * Refresh all audio settings
@@ -492,12 +146,6 @@ add_account(GtkWidget *widget, gpointer data)
 	show_account_window(NULL);
 }
 
-int 
-is_ringtone_enabled( void )
-{
-  return dbus_is_ringtone_enabled();  
-}
-
 void
 start_hidden( void )
 {
@@ -534,25 +182,6 @@ clean_history( void )
   call_list_clean_history();
 }
 
-void 
-ringtone_enabled( void )
-{
-  dbus_ringtone_enabled();  
-}
-
-void
-ringtone_changed( GtkFileChooser *chooser , GtkLabel *label)
-{
-  gchar* tone = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( chooser ));
-  dbus_set_ringtone_choice( tone );
-}
-
-gchar*
-get_ringtone_choice( void )
-{
-  return dbus_get_ringtone_choice();
-}
-
 /**
  * Call back when the user click on an account in the list
  */
@@ -586,72 +215,6 @@ select_account(GtkTreeSelection *selection, GtkTreeModel *model)
 	g_print("select");
 }
 
-/**
- * Toggle move buttons on if a codec is selected, off elsewise
- */
-static void
-select_codec(GtkTreeSelection *selection, GtkTreeModel *model)
-{
-	GtkTreeIter iter;
-	
-	if(!gtk_tree_selection_get_selected(selection, &model, &iter))
-	{
-		gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE);
-		gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE);
-	}
-	else
-	{
-		gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), TRUE);
-		gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), TRUE);
-	}
-}
-
-/**
- * Toggle active value of codec on click and update changes to the deamon
- * and in configuration files
- */
-static void
-codec_active_toggled(GtkCellRendererToggle *renderer, gchar *path, gpointer data)
-{
-	GtkTreeIter iter;
-	GtkTreePath *treePath;
-	GtkTreeModel *model;
-	gboolean active;
-	char* name;
-	
-	// Get path of clicked codec active toggle box
-	treePath = gtk_tree_path_new_from_string(path);
-	model = gtk_tree_view_get_model(GTK_TREE_VIEW(data));
-	gtk_tree_model_get_iter(model, &iter, treePath);
-
-	// Get active value and name at iteration
-	gtk_tree_model_get(model, &iter,
-			COLUMN_CODEC_ACTIVE, &active,
-			COLUMN_CODEC_NAME, &name,
-			-1);
-	
-	printf("%s\n", name);
-
-	// Toggle active value
-	active = !active;
-	
-	// Store value
-	gtk_list_store_set(GTK_LIST_STORE(model), &iter,
-			COLUMN_CODEC_ACTIVE, active,
-			-1);
-
-	gtk_tree_path_free(treePath);
-
-	// Modify codec queue to represent change	
-	if(active)
-		codec_set_active(name);
-	else
-		codec_set_inactive(name);
-	
-	// Perpetuate changes to the deamon
-	codec_list_update_to_daemon();
-}
-
 static void
 enable_account(GtkCellRendererToggle *rend , gchar* path,  gpointer data )
 {
@@ -685,65 +248,6 @@ enable_account(GtkCellRendererToggle *rend , gchar* path,  gpointer data )
   dbus_send_register( acc->accountID , enable );
 }
 
-/**
- * Move codec in list depending on direction and selected codec and
- * update changes in the daemon list and the configuration files
- */
-static void
-codec_move(gboolean moveUp, gpointer data)
-{
-	GtkTreeIter iter;
-	GtkTreeIter *iter2;
-	GtkTreeView *treeView;
-	GtkTreeModel *model;
-	GtkTreeSelection *selection;
-	GtkTreePath *treePath;
-	gchar *path;
-	
-	// Get view, model and selection of codec store
-	treeView = GTK_TREE_VIEW(data);
-	model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView));
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView));
-	
-	// Find selected iteration and create a copy
-	gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter);
-	iter2 = gtk_tree_iter_copy(&iter);
-	
-	// Find path of iteration
-	path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model), &iter);
-	treePath = gtk_tree_path_new_from_string(path);
-	gint *indices = gtk_tree_path_get_indices(treePath);
-	gint indice = indices[0];
-	
-	// Depending on button direction get new path
-	if(moveUp)
-		gtk_tree_path_prev(treePath);
-	else
-		gtk_tree_path_next(treePath);
-	gtk_tree_model_get_iter(model, &iter, treePath);
-	
-	// Swap iterations if valid
-	if(gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter))
-		gtk_list_store_swap(GTK_LIST_STORE(model), &iter, iter2);
-	
-	// Scroll to new position
-	gtk_tree_view_scroll_to_cell(treeView, treePath, NULL, FALSE, 0, 0);
-	
-	// Free resources
-	gtk_tree_path_free(treePath);
-	gtk_tree_iter_free(iter2);
-	g_free(path);
-	
-	// Perpetuate changes in codec queue
-	if(moveUp)
-		codec_list_move_codec_up(indice);
-	else
-		codec_list_move_codec_down(indice);
-	
-	// Perpetuate changes to the deamon
-	codec_list_update_to_daemon();
-}
-
 /**
  * Move account in list depending on direction and selected account
  */
@@ -799,26 +303,6 @@ account_move(gboolean moveUp, gpointer data)
 		account_list_move_down(indice);
 }
 
-/**
- * Called from move up codec button signal
- */
-static void
-codec_move_up(GtkButton *button, gpointer data)
-{
-  // Change tree view ordering and get indice changed
-  codec_move(TRUE, data);
-}
-
-/**
- * Called from move down codec button signal
- */
-static void
-codec_move_down(GtkButton *button, gpointer data)
-{
-  // Change tree view ordering and get indice changed
-  codec_move(FALSE, data);
-}
-
 /**
  * Called from move up account button signal
  */
@@ -839,93 +323,7 @@ account_move_down(GtkButton *button, gpointer data)
   account_move(FALSE, data);
 }
 
-GtkWidget*
-create_codec_table()
-{
-	GtkWidget *ret;
-	GtkWidget *scrolledWindow;
-	GtkWidget *buttonBox;
-	
-	GtkListStore *codecStore;
-	GtkCellRenderer *renderer;
-	GtkTreeSelection *treeSelection;
-	GtkTreeViewColumn *treeViewColumn;
-	
-	ret = gtk_hbox_new(FALSE, 10);
-	gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
-	
-	scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_SHADOW_IN);
-	
-	gtk_box_pack_start(GTK_BOX(ret), scrolledWindow, TRUE, TRUE, 0);
-	codecStore = gtk_list_store_new(CODEC_COLUMN_COUNT,
-			G_TYPE_BOOLEAN,		// Active
-			G_TYPE_STRING,		// Name
-			G_TYPE_STRING,		// Frequency
-			G_TYPE_STRING,		// Bit rate
-			G_TYPE_STRING		// Bandwith
-			);
-	
-	// Create codec tree view with list store
-	codecTreeView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(codecStore));
-	
-	// Get tree selection manager
-	treeSelection = gtk_tree_view_get_selection(GTK_TREE_VIEW(codecTreeView));
-	g_signal_connect(G_OBJECT(treeSelection), "changed",
-			G_CALLBACK (select_codec),
-			codecStore);
-	
-	// Active column
-	renderer = gtk_cell_renderer_toggle_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes("", renderer, "active", COLUMN_CODEC_ACTIVE, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
 
-	// Toggle codec active property on clicked
-	g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(codec_active_toggled), (gpointer)codecTreeView);
-	
-	// Name column
-	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "markup", COLUMN_CODEC_NAME, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
-	
-	// Bit rate column
-	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Frequency"), renderer, "text", COLUMN_CODEC_FREQUENCY, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
-	
-	// Bandwith column
-	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bitrate"), renderer, "text", COLUMN_CODEC_BITRATE, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
-	
-	// Frequency column
-	renderer = gtk_cell_renderer_text_new();
-	treeViewColumn = gtk_tree_view_column_new_with_attributes(_("Bandwidth"), renderer, "text", COLUMN_CODEC_BANDWIDTH, NULL);
-	gtk_tree_view_append_column(GTK_TREE_VIEW(codecTreeView), treeViewColumn);
-	
-	g_object_unref(G_OBJECT(codecStore));
-	gtk_container_add(GTK_CONTAINER(scrolledWindow), codecTreeView);
-	
-	// Create button box
-	buttonBox = gtk_vbox_new(FALSE, 0);
-	gtk_container_set_border_width(GTK_CONTAINER(buttonBox), 10);
-	gtk_box_pack_start(GTK_BOX(ret), buttonBox, FALSE, FALSE, 0);
-	
-	codecMoveUpButton = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
-	gtk_widget_set_sensitive(GTK_WIDGET(codecMoveUpButton), FALSE);
-	gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveUpButton, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(codecMoveUpButton), "clicked", G_CALLBACK(codec_move_up), codecTreeView);
-	
-	codecMoveDownButton = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
-	gtk_widget_set_sensitive(GTK_WIDGET(codecMoveDownButton), FALSE);
-	gtk_box_pack_start(GTK_BOX(buttonBox), codecMoveDownButton, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(codecMoveDownButton), "clicked", G_CALLBACK(codec_move_down), codecTreeView);
-	
-	config_window_fill_codec_list();
-
-	return ret;
-}
 
 /**
  * Account settings tab
@@ -1050,7 +448,7 @@ create_accounts_tab()
 GtkWidget*
 create_audio_tab ()
 {
-	GtkWidget *ret;
+/*	GtkWidget *ret;
 	
 	GtkWidget *deviceFrame;
 	GtkWidget *deviceBox;
@@ -1090,7 +488,7 @@ create_audio_tab ()
 	
 	// Device : Audio manager
 	// Create title label
-	/*
+	
 	titleLabel = gtk_label_new("Alsa plug-IN:");
 	gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5);
 	gtk_table_attach(GTK_TABLE(deviceTable), titleLabel, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
@@ -1109,7 +507,7 @@ create_audio_tab ()
 	gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(comboBox), renderer, "text", 0, NULL);
 	gtk_table_attach(GTK_TABLE(deviceTable), comboBox, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0);
 	gtk_widget_show(comboBox);
-	*/
+	
 	// Create title label
 	titleLabel = gtk_label_new(_("ALSA plugin"));
 	gtk_misc_set_alignment(GTK_MISC(titleLabel), 0, 0.5);
@@ -1142,7 +540,7 @@ create_audio_tab ()
 	outputDeviceComboBox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(outputAudioDeviceManagerStore));
 	select_active_output_audio_device();
   	gtk_label_set_mnemonic_widget(GTK_LABEL(titleLabel), outputDeviceComboBox);
-	g_signal_connect(G_OBJECT(outputDeviceComboBox), "changed", G_CALLBACK(select_audio_output_device), outputDeviceComboBox);
+	//g_signal_connect(G_OBJECT(outputDeviceComboBox), "changed", G_CALLBACK(select_audio_output_device), outputDeviceComboBox);
 
 	// Set rendering
 	renderer = gtk_cell_renderer_text_new();
@@ -1163,7 +561,7 @@ create_audio_tab ()
 	inputDeviceComboBox = gtk_combo_box_new_with_model(GTK_TREE_MODEL(inputAudioDeviceManagerStore));
 	select_active_input_audio_device();
 	gtk_label_set_mnemonic_widget(GTK_LABEL(titleLabel), inputDeviceComboBox);
-	g_signal_connect(G_OBJECT(inputDeviceComboBox), "changed", G_CALLBACK(select_audio_input_device), inputDeviceComboBox);
+	//g_signal_connect(G_OBJECT(inputDeviceComboBox), "changed", G_CALLBACK(select_audio_input_device), inputDeviceComboBox);
 
 	// Set rendering
 	renderer = gtk_cell_renderer_text_new();
@@ -1195,31 +593,12 @@ create_audio_tab ()
 	gtk_widget_set_size_request(GTK_WIDGET(codecTable), -1, 150);
 	gtk_box_pack_start(GTK_BOX(codecBox), codecTable, TRUE, TRUE, 0);
 	gtk_widget_show(codecTable);
+*/
 
-    // check button to enable ringtones
-	GtkWidget* box = gtk_hbox_new( TRUE , 1);
-	gtk_box_pack_start( GTK_BOX(ret) , box , FALSE , FALSE , 1);
-	enableTone = gtk_check_button_new_with_mnemonic( _("_Enable ringtones"));
-      gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(enableTone), dbus_is_ringtone_enabled() );
-      gtk_box_pack_start( GTK_BOX(box) , enableTone , TRUE , TRUE , 1);
-      g_signal_connect(G_OBJECT( enableTone) , "clicked" , G_CALLBACK( ringtone_enabled ) , NULL);
-    // file chooser button
-	fileChooser = gtk_file_chooser_button_new(_("Choose a ringtone"), GTK_FILE_CHOOSER_ACTION_OPEN);
-	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER( fileChooser) , g_get_home_dir());	
-	gtk_file_chooser_set_filename(GTK_FILE_CHOOSER( fileChooser) , get_ringtone_choice());	
-	g_signal_connect( G_OBJECT( fileChooser ) , "selection_changed" , G_CALLBACK( ringtone_changed ) , NULL );
-	GtkFileFilter *filter = gtk_file_filter_new();
-	gtk_file_filter_set_name( filter , _("Audio Files") );
-	gtk_file_filter_add_pattern(filter , "*.wav" );
-	gtk_file_filter_add_pattern(filter , "*.ul" );
-	gtk_file_filter_add_pattern(filter , "*.au" );
-	gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( fileChooser ) , filter);
-	gtk_box_pack_start( GTK_BOX(box) , fileChooser , TRUE , TRUE , 1);
-
-	// Show all
-	gtk_widget_show_all(ret);
+    	// Show all
+	//gtk_widget_show_all(ret);
 
-	return ret;
+	//return ret;
 }
 
 GtkWidget*
@@ -1353,7 +732,8 @@ show_config_window ()
 	gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
 	
 	// Audio tab
-	tab = create_audio_tab();	
+	//tab = create_audio_tab();	
+	tab = create_audio_configuration();	
 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Audio Settings")));
 	gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab);
 
@@ -1389,7 +769,7 @@ show_accounts_window( void )
 
         // Set window properties
         gtk_dialog_set_has_separator(dialog, FALSE);
-        gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 400);
+        gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 500);
         gtk_container_set_border_width(GTK_CONTAINER(dialog), 0);
 
 	accountFrame = gtk_frame_new( _("Accounts previously setup"));
diff --git a/src/audio/alsalayer.cpp b/src/audio/alsalayer.cpp
index 1003709b01a2fd5b5184e9542ef03c96f72de6dd..794328d742f0011fe8138beb6d9ff863acaa0281 100644
--- a/src/audio/alsalayer.cpp
+++ b/src/audio/alsalayer.cpp
@@ -454,6 +454,15 @@ AlsaLayer::read( void* buffer, int toCopy)
 
 }
 
+
+  int 
+AlsaLayer::putMain(void* buffer, int toCopy)
+{}
+
+  int
+AlsaLayer::putInCache( char code, void *buffer, int toCopy )
+{}
+
   void
 AlsaLayer::handle_xrun_capture( void )
 {
diff --git a/src/audio/alsalayer.h b/src/audio/alsalayer.h
index 05f5ebd79470ee1b542b8f1060aa6de886e683c2..f92bbfc6fc06bcecb6d20e676f52f137bd5f0e3d 100644
--- a/src/audio/alsalayer.h
+++ b/src/audio/alsalayer.h
@@ -179,6 +179,9 @@ class AlsaLayer : public AudioLayer {
      */
     std::string getAudioPlugin( void ) { return _audioPlugin; }
 
+    int putInCache( char code, void *buffer, int toCopy );
+    int putMain(void* buffer, int toCopy);
+
   private:
 
     /**
diff --git a/src/audio/pulselayer.cpp b/src/audio/pulselayer.cpp
index 97bad9027246f888038773c96c5721b8abeb782e..1a4a054cabb481150a29d09ef768721a042ff407 100644
--- a/src/audio/pulselayer.cpp
+++ b/src/audio/pulselayer.cpp
@@ -25,7 +25,6 @@
   static pa_volume_t volume;
   */
 int framesPerBuffer = 2048;
-const pa_buffer_attr *a;
 
   PulseLayer::PulseLayer(ManagerImpl* manager)
   : AudioLayer( manager , PULSEAUDIO )    
@@ -104,7 +103,7 @@ PulseLayer::createStreams( pa_context* c )
   record = new AudioStream(c, CAPTURE_STREAM, "SFLphone in");
   pa_stream_set_read_callback( record->pulseStream() , audioCallback, this);
   //pa_stream_set_underflow_callback( record , underflow , this);
-  //cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples");
+  cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples");
 
   pa_threaded_mainloop_signal(m , 0);
 }
diff --git a/src/audio/pulselayer.h b/src/audio/pulselayer.h
index 5e7038cbd25da813c1d3524695f3a260d2705b86..8c1e95506b279170368334d20496ec2c29f922b9 100644
--- a/src/audio/pulselayer.h
+++ b/src/audio/pulselayer.h
@@ -146,10 +146,7 @@ class PulseLayer : public AudioLayer {
 
     AudioStream* playback;
     AudioStream* record;
-    //AudioStream* cache;
-
-    //pa_stream* playback;
-    //pa_stream* record;
+    AudioStream* cache;
 };
 
 #endif // _PULSE_LAYER_H_
diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp
index 8053c79da38c2de7755b5f7f58e6177591fbcf54..a1aa8046f33a9b1783d106a686550071f2970d08 100644
--- a/src/managerimpl.cpp
+++ b/src/managerimpl.cpp
@@ -1160,9 +1160,13 @@ ManagerImpl::getInputAudioPluginList(void)
   std::vector<std::string> v;
   _debug("Get input audio plugin list");
 
-  v.push_back("default");
+  /*v.push_back("default");
   v.push_back("surround40");
   v.push_back("plug:hw");
+  */
+
+  v.push_back("alsa");
+  v.push_back("pulseaudio");
 
   return v;
 }
@@ -1176,10 +1180,12 @@ ManagerImpl::getOutputAudioPluginList(void)
   std::vector<std::string> v;
   _debug("Get output audio plugin list");
 
-  v.push_back( PCM_DEFAULT );
-  v.push_back( PCM_PLUGHW );
-  v.push_back( PCM_DMIX );
-  v.push_back( PCM_PULSE );
+  //v.push_back( PCM_DEFAULT );
+  //v.push_back( PCM_PLUGHW );
+  //v.push_back( PCM_DMIX );
+  //v.push_back( PCM_PULSE );
+  v.push_back("alsa");
+  v.push_back("pulseaudio");
 
   return v;
 }
@@ -1500,7 +1506,7 @@ ManagerImpl::initAudioDriver(void)
 {
   _debugInit("AudioLayer Creation");
   //_audiodriver = new AlsaLayer( this );
-  _audiodriver = new PulseLayer( this );
+  _audiodriver = new AlsaLayer( this );
   if (_audiodriver == 0) {
     _debug("Init audio driver error\n");
   } else {
@@ -1543,15 +1549,16 @@ ManagerImpl::selectAudioDriver (void)
   }
 
 #if CHECK_INTERFACE( layer , ALSA )
-  _debug("No good\n");
-  _debugInit(" AudioLayer Opening Device");
+  _debugInit(" ALSA audio driver \n");
   _audiodriver->setErrorMessage(-1);
   _audiodriver->openDevice( numCardIn , numCardOut, sampleRate, frameSize, SFL_PCM_BOTH, alsaPlugin ); 
   if( _audiodriver -> getErrorMessage() != -1 )
     notifyErrClient( _audiodriver -> getErrorMessage());
 #else
-  _debug("Good\n");
+  delete _audiodriver;
+  _audiodriver = new PulseLayer( this );
   _debug(" Pulse audio driver \n");
+  _audiodriver->setErrorMessage(-1);
   _audiodriver->openDevice( numCardIn , numCardOut, sampleRate, frameSize, SFL_PCM_BOTH, alsaPlugin ); 
   if( _audiodriver -> getErrorMessage() != -1 )
     notifyErrClient( _audiodriver -> getErrorMessage());