diff --git a/sflphone-client-gnome/src/actions.c b/sflphone-client-gnome/src/actions.c
index 9a5f6bf187ba75894cdafc90488ecfc92e4954c8..8f39264d30d634c5e3cc120a94326c54e2592634 100644
--- a/sflphone-client-gnome/src/actions.c
+++ b/sflphone-client-gnome/src/actions.c
@@ -305,6 +305,16 @@ sflphone_hang_up()
 }
 
 
+void
+sflphone_conference_hang_up()
+{
+    conference_obj_t * selectedConf = calltab_get_selected_conf();
+
+    if(selectedConf)
+	dbus_hang_up_conference(selectedConf);
+}
+
+
     void
 sflphone_pick_up()
 {
@@ -887,6 +897,19 @@ sflphone_add_conference()
     // dbus_join_participant(selected_call, dragged_call);
 }
 
+void
+sflphone_conference_on_hold()
+{
+
+}
+
+void
+sflphone_conference_off_hold()
+{
+
+}
+
+
     void
 sflphone_rec_call()
 {
diff --git a/sflphone-client-gnome/src/contacts/calllist.h b/sflphone-client-gnome/src/contacts/calllist.h
index ac914023c76adfb9d9c498ba18117ba3f8cafd3f..befb97048e8a867298551eb1afb69a2a584678b7 100644
--- a/sflphone-client-gnome/src/contacts/calllist.h
+++ b/sflphone-client-gnome/src/contacts/calllist.h
@@ -21,6 +21,7 @@
 #define __CALLLIST_H__
 
 #include <callable_obj.h>
+#include <conference_obj.h>
 #include <gtk/gtk.h>
 
 /** @file calllist.h
@@ -35,7 +36,9 @@ typedef struct {
 
         // Calllist vars
 	GQueue* callQueue;
+        gint selectedType;
 	callable_obj_t* selectedCall;
+        conference_obj_t* selectedConf;
         gchar *_name;
 } calltab_t;
 
diff --git a/sflphone-client-gnome/src/contacts/calltab.c b/sflphone-client-gnome/src/contacts/calltab.c
index 00cfc85343213d062e0b11d96d35dc2737300745..f832d6c561f5c65baa091b0e13b80c1c48d2cfe6 100644
--- a/sflphone-client-gnome/src/contacts/calltab.c
+++ b/sflphone-client-gnome/src/contacts/calltab.c
@@ -32,10 +32,11 @@ calltab_t* calltab_init (gboolean searchbar_type, gchar *name)
 	ret->store = NULL;
 	ret->view = NULL;
 	ret->tree = NULL;
-    ret->searchbar = NULL;
+        ret->searchbar = NULL;
 	ret->callQueue = NULL;
 	ret->selectedCall = NULL;
-    ret->_name = g_strdup (name);
+	ret->selectedConf = NULL;
+        ret->_name = g_strdup (name);
 
 	calltree_create (ret, searchbar_type);
 	calllist_init(ret);
@@ -47,16 +48,36 @@ calltab_t* calltab_init (gboolean searchbar_type, gchar *name)
 void
 calltab_select_call (calltab_t* tab, callable_obj_t * c )
 {
-  tab->selectedCall = c;
+    tab->selectedType = A_CALL;
+    tab->selectedCall = c;
 }
 
 
+void
+calltab_select_conf (conference_obj_t * c )
+{
+    current_calls->selectedType = A_CONFERENCE;
+    current_calls->selectedConf = c;
+}
+
+gint
+calltab_get_selected_type(calltab_t* tab)
+{
+    return tab->selectedType;
+}
+
 callable_obj_t *
 calltab_get_selected_call (calltab_t* tab)
 {
   return tab->selectedCall;
 }
 
+conference_obj_t*
+calltab_get_selected_conf ()
+{
+    return current_calls->selectedConf;
+}
+
 void
 calltab_create_searchbar (calltab_t* tab)
 {
diff --git a/sflphone-client-gnome/src/contacts/calltab.h b/sflphone-client-gnome/src/contacts/calltab.h
index dfa4dfda53480c08be64e68c3950cd2b8f315d2a..bf3b11b8407efda3ab1e7a74c4ff9b3050279860 100644
--- a/sflphone-client-gnome/src/contacts/calltab.h
+++ b/sflphone-client-gnome/src/contacts/calltab.h
@@ -31,17 +31,28 @@ calltab_t* contacts;
 
 calltab_t* calltab_init (gboolean searchbar_type, gchar *name);
 
+
+
 /** Mark a call as selected.  There can be only one selected call.  This call
   * is the currently highlighted one in the list.
   * @param c The call */
 void
 calltab_select_call (calltab_t*, callable_obj_t *);
 
+void
+calltab_select_conf (conference_obj_t *);
+
+gint
+calltab_get_selected_type(calltab_t* tab);
+
 /** Return the selected call.
   * @return The number of the caller */
 callable_obj_t *
 calltab_get_selected_call (calltab_t*);
 
+conference_obj_t *
+calltab_get_selected_conf ();
+
 void
 calltab_create_searchbar (calltab_t *);
 
diff --git a/sflphone-client-gnome/src/contacts/calltree.c b/sflphone-client-gnome/src/contacts/calltree.c
index 702d227ca0f94ade814dfad47bf552de26603925..d497534105d70f09c6cf2460535dbc6dfa0a9f4e 100644
--- a/sflphone-client-gnome/src/contacts/calltree.c
+++ b/sflphone-client-gnome/src/contacts/calltree.c
@@ -32,12 +32,6 @@ GtkCellRenderer *rend;
 GtkTreeViewColumn *col;
 GtkTreeSelection *sel;
 
-enum
-{
-    A_CALL,
-    A_CONFERENCE
-};
-
 gint dragged_type;
 gint selected_type;
 
@@ -105,6 +99,8 @@ selected(GtkTreeSelection *sel, void* data UNUSED )
 	val.g_type = 0;
 	gtk_tree_model_get_value (model, &iter, 2, &val);
 
+	calltab_select_conf((conference_obj_t*) g_value_get_pointer(&val));
+
 	selected_conf = (conference_obj_t*)g_value_get_pointer(&val);
 
 	selected_call_id = selected_conf->_confID;
diff --git a/sflphone-client-gnome/src/contacts/calltree.h b/sflphone-client-gnome/src/contacts/calltree.h
index 9efe2c5af3c28ae0d5b0941452d41dd4533f3625..f724c9817bece111c7258b3641a48979c2788758 100644
--- a/sflphone-client-gnome/src/contacts/calltree.h
+++ b/sflphone-client-gnome/src/contacts/calltree.h
@@ -29,6 +29,12 @@
   * @brief The GtkTreeView that list calls in the main window.
   */
 
+enum
+{
+    A_CALL,
+    A_CONFERENCE
+};
+
 /**
  * Create a new widget calltree
  * @return GtkWidget* A new widget
diff --git a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml
index 8eef3a25a660e3d1996bfa64581038b9523fabae..164272b29bd2a809f9d8855bed60ff3759aad152 100644
--- a/sflphone-client-gnome/src/dbus/callmanager-introspec.xml
+++ b/sflphone-client-gnome/src/dbus/callmanager-introspec.xml
@@ -19,6 +19,10 @@
     <method name="hangUp">
       <arg type="s" name="callID" direction="in"/>
     </method>
+
+    <method name="hangUpConference">
+      <arg type="s" name="confID" direction="in"/>
+    </method>
     
     <method name="hold">
       <arg type="s" name="callID" direction="in"/>
@@ -146,7 +150,7 @@
       <arg type="s" name="confID" direction="in"/>
     </method>
 
-    <method name="unHoldConference">
+    <method name="unholdConference">
       <arg type="s" name="confID" direction="in"/>
     </method>
     
diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c
index c73142467c49c18d5f95a10833a9c299c9fec278..174f2d3774c2a9c6f0e019fa3860736035f41e6f 100644
--- a/sflphone-client-gnome/src/dbus/dbus.c
+++ b/sflphone-client-gnome/src/dbus/dbus.c
@@ -501,6 +501,36 @@ dbus_unhold (const callable_obj_t * c)
     }
 }
 
+    void
+dbus_hold_conference (const conference_obj_t * c)
+{
+    DEBUG("dbus_hold_conference %s\n", c->_confID);
+
+    GError *error = NULL;
+    org_sflphone_SFLphone_CallManager_hold_conference ( callManagerProxy, c->_confID, &error);
+    if (error)
+    {
+        ERROR ("Failed to call hold() on CallManager: %s",
+                error->message);
+        g_error_free (error);
+    }
+}
+
+    void
+dbus_unhold_conference (const conference_obj_t * c)
+{
+    DEBUG("dbus_unhold_conference %s\n", c->_confID);
+
+    GError *error = NULL;
+    org_sflphone_SFLphone_CallManager_unhold_conference ( callManagerProxy, c->_confID, &error);
+    if (error)
+    {
+        ERROR ("Failed to call unhold() on CallManager: %s",
+                error->message);
+        g_error_free (error);
+    }
+}
+
     void
 dbus_hang_up (const callable_obj_t * c)
 {
@@ -516,6 +546,22 @@ dbus_hang_up (const callable_obj_t * c)
     }
 }
 
+
+    void
+dbus_hang_up_conference (const conference_obj_t * c)
+{
+    DEBUG("dbus_hang_up_conference %s\n", c->_confID);
+    
+    GError *error = NULL;
+    org_sflphone_SFLphone_CallManager_hang_up_conference ( callManagerProxy, c->_confID, &error);
+    if (error)
+    {
+        ERROR ("Failed to call hang_up() on CallManager: %s",
+                error->message);
+        g_error_free (error);
+    }
+}
+
     void
 dbus_transfert (const callable_obj_t * c)
 {
diff --git a/sflphone-client-gnome/src/menus.c b/sflphone-client-gnome/src/menus.c
index 558137c5165de2006b84516563f43e601b5c7063..ccfd6e0e1b588352fec6d691be86d7e7ffb43b4d 100644
--- a/sflphone-client-gnome/src/menus.c
+++ b/sflphone-client-gnome/src/menus.c
@@ -230,6 +230,26 @@ call_hold  (void* foo UNUSED)
     }
 }
 
+    static void
+conference_hold  (void* foo UNUSED)
+{
+    conference_obj_t * selectedConf = calltab_get_selected_conf();
+
+    if(selectedConf)
+    {
+        if(selectedConf->_state == CONFERENCE_STATE_HOLD)
+        {
+            gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM ( holdMenu ), gtk_image_new_from_file( ICONS_DIR "/icon_unhold.svg"));
+            sflphone_conference_off_hold();
+        }
+        else
+        {
+            gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM ( holdMenu ), gtk_image_new_from_file( ICONS_DIR "/icon_hold.svg"));
+            sflphone_conference_on_hold();
+        }
+    }
+}
+
     static void
 call_pick_up ( void * foo UNUSED)
 {
@@ -242,6 +262,12 @@ call_hang_up ( void * foo UNUSED)
     sflphone_hang_up();
 }
 
+    static void
+conference_hang_up ( void * foo UNUSED)
+{
+    sflphone_conference_hang_up();
+}
+
     static void
 call_record ( void * foo UNUSED)
 {
@@ -689,45 +715,81 @@ show_popup_menu (GtkWidget *my_widget, GdkEventButton *event)
 {
     // TODO update the selection to make sure the call under the mouse is the call selected
 
+    // call type boolean
     gboolean pickup = FALSE, hangup = FALSE, hold = FALSE, copy = FALSE, record = FALSE;
     gboolean accounts = FALSE;
 
-    callable_obj_t * selectedCall = calltab_get_selected_call(current_calls);
-    if (selectedCall)
+    // conference type boolean
+    gboolean hangup_conf = FALSE, hold_conf = FALSE; 
+
+    callable_obj_t * selectedCall;
+    conference_obj_t * selectedConf;
+
+    if (calltab_get_selected_type(current_calls) == A_CALL)
     {
-        copy = TRUE;
-        switch(selectedCall->_state)
-        {
-            case CALL_STATE_INCOMING:
-                pickup = TRUE;
-                hangup = TRUE;
-                break;
-            case CALL_STATE_HOLD:
-                hangup = TRUE;
-                hold   = TRUE;
-                break;
-            case CALL_STATE_RINGING:
-                hangup = TRUE;
-                break;
-            case CALL_STATE_DIALING:
-                pickup = TRUE;
-                hangup = TRUE;
-                accounts = TRUE;
-                break;
-            case CALL_STATE_RECORD:
-            case CALL_STATE_CURRENT:
-                hangup = TRUE;
-                hold   = TRUE;
-                record = TRUE;
-                break;
-            case CALL_STATE_BUSY:
-            case CALL_STATE_FAILURE:
-                hangup = TRUE;
-                break;
-            default:
-                WARN("Should not happen in show_popup_menu!");
-                break;
-        }
+	DEBUG("MENUS: SELECTED A CALL");
+        selectedCall = calltab_get_selected_call(current_calls);
+
+	if (selectedCall)
+	{
+	    copy = TRUE;
+	    switch(selectedCall->_state)
+	    {
+                case CALL_STATE_INCOMING:
+		    pickup = TRUE;
+		    hangup = TRUE;
+		    break;
+                case CALL_STATE_HOLD:
+		    hangup = TRUE;
+		    hold   = TRUE;
+		    break;
+                case CALL_STATE_RINGING:
+		    hangup = TRUE;
+		    break;
+                case CALL_STATE_DIALING:
+		    pickup = TRUE;
+		    hangup = TRUE;
+		    accounts = TRUE;
+		    break;
+                case CALL_STATE_RECORD:
+                case CALL_STATE_CURRENT:
+		    hangup = TRUE;
+		    hold   = TRUE;
+		    record = TRUE;
+		    break;
+                case CALL_STATE_BUSY:
+                case CALL_STATE_FAILURE:
+		    hangup = TRUE;
+		    break;
+                default:
+		    WARN("Should not happen in show_popup_menu for calls!");
+		    break;
+	    }
+	}
+    }
+    else
+    {
+        DEBUG("MENUS: SELECTED A CONF");	
+	selectedConf = calltab_get_selected_conf();
+
+	if (selectedConf)
+	{
+	    switch(selectedConf->_state)
+	    {
+	        case CONFERENCE_STATE_ACTIVE:
+		    hangup_conf = TRUE;
+		    hold_conf = TRUE;
+		    break;
+	        case CONFERENCE_STATE_HOLD:
+		    hangup_conf = TRUE;
+		    hold_conf = TRUE;
+		    break;
+	        default:
+		    WARN("Should not happen in show_popup_menu for conferences!");
+		    break;
+	    }
+	}
+
     }
 
     GtkWidget *menu;
@@ -738,94 +800,127 @@ show_popup_menu (GtkWidget *my_widget, GdkEventButton *event)
     menu = gtk_menu_new ();
     //g_signal_connect (menu, "deactivate",
     //       G_CALLBACK (gtk_widget_destroy), NULL);
-
-    if(copy)
-    {
-        menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_COPY, get_accel_group());
-        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-        g_signal_connect (G_OBJECT (menu_items), "activate",
-                G_CALLBACK (edit_copy),
-                NULL);
-        gtk_widget_show (menu_items);
-    }
-
-    menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PASTE, get_accel_group());
-    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-    g_signal_connect (G_OBJECT (menu_items), "activate",
-            G_CALLBACK (edit_paste),
-            NULL);
-    gtk_widget_show (menu_items);
-
-    if(pickup || hangup || hold)
-    {
-        menu_items = gtk_separator_menu_item_new ();
-        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-        gtk_widget_show (menu_items);
-    }
-
-    if(pickup)
-    {
-
-        menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Pick up"));
-        image = gtk_image_new_from_file( ICONS_DIR "/icon_accept.svg");
-        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image);
-        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-        g_signal_connect (G_OBJECT (menu_items), "activate",
-                G_CALLBACK (call_pick_up),
-                NULL);
-        gtk_widget_show (menu_items);
-    }
-
-    if(hangup)
+    if (calltab_get_selected_type(current_calls) == A_CALL)
     {
-        menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Hang up"));
-        image = gtk_image_new_from_file( ICONS_DIR "/icon_hangup.svg");
-        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image);
-        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-        g_signal_connect (G_OBJECT (menu_items), "activate",
-                G_CALLBACK (call_hang_up),
-                NULL);
-        gtk_widget_show (menu_items);
-    }
+	DEBUG("BUILD CALL MENU");
+
+	if(copy)
+	{
+	    menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_COPY, get_accel_group());
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    g_signal_connect (G_OBJECT (menu_items), "activate",
+			      G_CALLBACK (edit_copy),
+			      NULL);
+	    gtk_widget_show (menu_items);
+	}
+
+	menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PASTE, get_accel_group());
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	g_signal_connect (G_OBJECT (menu_items), "activate",
+			  G_CALLBACK (edit_paste),
+			  NULL);
+	gtk_widget_show (menu_items);
+	
+	if(pickup || hangup || hold)
+	{
+	    menu_items = gtk_separator_menu_item_new ();
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    gtk_widget_show (menu_items);
+	}
+	
+	if(pickup)
+	{
+	    
+	    menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Pick up"));
+	    image = gtk_image_new_from_file( ICONS_DIR "/icon_accept.svg");
+	    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image);
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    g_signal_connect (G_OBJECT (menu_items), "activate",
+			      G_CALLBACK (call_pick_up),
+			      NULL);
+	    gtk_widget_show (menu_items);
+	}
+
+	if(hangup)
+	{
+	    menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Hang up"));
+	    image = gtk_image_new_from_file( ICONS_DIR "/icon_hangup.svg");
+	    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image);
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    g_signal_connect (G_OBJECT (menu_items), "activate",
+			      G_CALLBACK (call_hang_up),
+			      NULL);
+	    gtk_widget_show (menu_items);
+	}
+
+	if(hold)
+	{
+	    menu_items = gtk_check_menu_item_new_with_mnemonic (_("On _Hold"));
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_items),
+					   (selectedCall->_state == CALL_STATE_HOLD ? TRUE : FALSE));
+	    g_signal_connect(G_OBJECT (menu_items), "activate",
+			     G_CALLBACK (call_hold),
+			     NULL);
+	    gtk_widget_show (menu_items);
+	}
+	
+	if(record)
+	{
+	    menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Record"));
+	    image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_MENU);
+	    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image);
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    g_signal_connect (G_OBJECT (menu_items), "activate",
+			      G_CALLBACK (call_record),
+			      NULL);
+	    gtk_widget_show (menu_items);
+	}
 
-    if(hold)
-    {
-        menu_items = gtk_check_menu_item_new_with_mnemonic (_("On _Hold"));
-        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_items),
-                (selectedCall->_state == CALL_STATE_HOLD ? TRUE : FALSE));
-        g_signal_connect(G_OBJECT (menu_items), "activate",
-                G_CALLBACK (call_hold),
-                NULL);
-        gtk_widget_show (menu_items);
     }
-
-    if(record)
+    else
     {
-        menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Record"));
-        image = gtk_image_new_from_stock (GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_MENU);
-        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image);
-        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-        g_signal_connect (G_OBJECT (menu_items), "activate",
-                G_CALLBACK (call_record),
-                NULL);
-        gtk_widget_show (menu_items);
+	DEBUG("BUILD CONFERENCE MENU");
+
+	if(hangup_conf)
+	{
+	    menu_items = gtk_image_menu_item_new_with_mnemonic(_("_Hang up"));
+	    image = gtk_image_new_from_file( ICONS_DIR "/icon_hangup.svg");
+	    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_items), image);
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    g_signal_connect (G_OBJECT (menu_items), "activate",
+			      G_CALLBACK (conference_hang_up),
+			      NULL);
+	    gtk_widget_show (menu_items);
+	}
+
+	if(hold_conf)
+	{
+	    menu_items = gtk_check_menu_item_new_with_mnemonic (_("On _Hold"));
+	    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+	    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_items),
+					   (selectedCall->_state == CALL_STATE_HOLD ? TRUE : FALSE));
+	    g_signal_connect(G_OBJECT (menu_items), "activate",
+			     G_CALLBACK (conference_hold),
+			     NULL);
+	    gtk_widget_show (menu_items);
+	}
     }
 
     if(accounts)
     {
-        add_registered_accounts_to_menu (menu);
+	add_registered_accounts_to_menu (menu);
     }
-
+	
     if (event)
     {
-        button = event->button;
-        event_time = event->time;
+	button = event->button;
+	event_time = event->time;
     }
     else
     {
-        button = 0;
-        event_time = gtk_get_current_event_time ();
+	button = 0;
+	event_time = gtk_get_current_event_time ();
     }
 
     gtk_menu_attach_to_widget (GTK_MENU (menu), my_widget, NULL);
diff --git a/sflphone-common/src/call.cpp b/sflphone-common/src/call.cpp
index 0cd939e8b245f164d8c15d1cc092856dd5705de6..8abdd972af50546a45ec57a455c6fb5052e253b8 100644
--- a/sflphone-common/src/call.cpp
+++ b/sflphone-common/src/call.cpp
@@ -27,6 +27,7 @@ Call::Call (const CallID& id, Call::CallType type)
         , _localAudioPort (0)
         , _localExternalAudioPort (0)
         , _id (id)
+	, _confID ("")
         , _type (type)
         , _connectionState (Call::Disconnected)
         , _callState (Call::Inactive)
diff --git a/sflphone-common/src/call.h b/sflphone-common/src/call.h
index d810ba9539ff773726abb75a1bf1594c13114161..c0d5805c27299075cfb6811012ac783c92a59251 100644
--- a/sflphone-common/src/call.h
+++ b/sflphone-common/src/call.h
@@ -83,6 +83,14 @@ class Call{
          */
         CallID& getCallId() {return _id; }
 
+	/** 
+         * Return a reference on the conference id
+         * @return call id
+         */
+        CallID& getConfId() {return _confID; }
+
+	void setConfId(CallID id) {_confID = id; }
+
         inline CallType getCallType (void)
         {
             return _type;
@@ -256,6 +264,9 @@ class Call{
         /** Unique ID of the call */
         CallID _id;
 
+	/** Unique conference ID, used exclusively in case of a conferece */
+	CallID _confID;
+
         /** Type of the call */
         CallType _type;
         /** Disconnected/Progressing/Trying/Ringing/Connected */
diff --git a/sflphone-common/src/dbus/callmanager-introspec.xml b/sflphone-common/src/dbus/callmanager-introspec.xml
index 25ae8c9fbed9828e8f68a663f429f71300d511ab..e17008068cfdfcc6f6ba52d870eca65cc9f36053 100644
--- a/sflphone-common/src/dbus/callmanager-introspec.xml
+++ b/sflphone-common/src/dbus/callmanager-introspec.xml
@@ -19,6 +19,10 @@
     <method name="hangUp">
       <arg type="s" name="callID" direction="in"/>
     </method>
+
+    <method name="hangUpConference">
+      <arg type="s" name="confID" direction="in"/>
+    </method>
     
     <method name="hold">
       <arg type="s" name="callID" direction="in"/>
@@ -146,7 +150,7 @@
       <arg type="s" name="confID" direction="in"/>
     </method>
 
-    <method name="unHoldConference">
+    <method name="unholdConference">
       <arg type="s" name="confID" direction="in"/>
     </method>
     
diff --git a/sflphone-common/src/dbus/callmanager.cpp b/sflphone-common/src/dbus/callmanager.cpp
index c07e2ad836bce22f78eecded5c9e38d8821f4232..6cc4c2231a489f5801fa5663fd4e1d0954775f9f 100644
--- a/sflphone-common/src/dbus/callmanager.cpp
+++ b/sflphone-common/src/dbus/callmanager.cpp
@@ -63,6 +63,15 @@ CallManager::hangUp (const std::string& callID)
 
 }
 
+void
+CallManager::hangUpConference (const std::string& confID)
+{
+    _debug ("CallManager::hangUpConference received %s\n", confID.c_str());
+    Manager::instance().hangupConference (confID);
+
+}
+
+
 void
 CallManager::hold (const std::string& callID)
 {
@@ -146,7 +155,7 @@ CallManager::holdConference (const std::string& confID)
 }
 
 void
-CallManager::unHoldConference (const std::string& confID)
+CallManager::unholdConference (const std::string& confID)
 {
     _debug ("CallManager::unHoldConference received %s\n", confID.c_str());
     Manager::instance().unHoldConference(confID);
diff --git a/sflphone-common/src/dbus/callmanager.h b/sflphone-common/src/dbus/callmanager.h
index 07a3dd3d57db977eb8ebacd722b202e258439da8..6994a874a4dfed2da24bfcf8d246ec18908e19ec 100644
--- a/sflphone-common/src/dbus/callmanager.h
+++ b/sflphone-common/src/dbus/callmanager.h
@@ -43,6 +43,7 @@ public:
     void refuse( const std::string& callID );
     void accept( const std::string& callID );
     void hangUp( const std::string& callID );
+    void hangUpConference( const std::string& confID );
     void hold( const std::string& callID );
     void unhold( const std::string& callID );
     void transfert( const std::string& callID, const std::string& to );
@@ -52,7 +53,7 @@ public:
     void addParticipant( const std::string& callID, const std::string& confID );
     void detachParticipant( const std::string& callID );
     void holdConference( const std::string& confID );
-    void unHoldConference( const std::string& confID );
+    void unholdConference( const std::string& confID );
     std::vector< std::string > getConferenceList (void);
     std::vector< std::string > getParticipantList (const std::string& confID);
     std::map< std::string, std::string > getConferenceDetails ( const std::string& callID );
diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp
index 939311ff0098e3086202c6e1d5b9b575de1af1ff..aee0a42e0d12c64a31b4cdee77f56ace346418c6 100644
--- a/sflphone-common/src/managerimpl.cpp
+++ b/sflphone-common/src/managerimpl.cpp
@@ -409,6 +409,46 @@ ManagerImpl::hangupCall (const CallID& id)
     return returnValue;
 }
 
+
+bool
+ManagerImpl::hangupConference (const ConfID& id)
+{
+    _debug ("ManagerImpl::hangupConference()\n");
+
+    Conference *conf;
+    ConferenceMap::iterator iter_conf = _conferencemap.find(id);
+
+    ConferenceCallMap tempmap = _conferencecall;
+
+    AccountID currentAccountId;
+
+    Call* call = NULL;
+
+    if(iter_conf != _conferencemap.end())
+    {
+	conf = iter_conf->second;
+ 
+	ConferenceCallMap::iterator iter_participant = tempmap.begin();
+
+	while(iter_participant != tempmap.end())
+	{
+	    _debug("ManagerImpl::hangupConference participant %s\n", iter_participant->first.c_str());
+	    currentAccountId = getAccountFromCall (iter_participant->first);
+	    call = getAccountLink (currentAccountId)->getCall (iter_participant->first);
+
+	    if(call->getConfId() == id)
+	        hangupCall (iter_participant->first);
+
+	    iter_participant++;
+
+	}
+
+    }
+
+    return true;
+}
+
+
 //THREAD=Main
 bool
 ManagerImpl::cancelCall (const CallID& id)
@@ -809,6 +849,10 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2)
     ConferenceMap::iterator iter = _conferencemap.find(default_conf);
     std::map<std::string, std::string>::iterator iter_details;
 
+
+    // currentAccountId = getAccountFromCall (iter_participant->first);
+    // call = getAccountLink (currentAccountId)->getCall (iter_participant->first);
+
     if(iter == _conferencemap.end()){
 
 	 _debug("NO CONFERENCE YET, CREATE ONE\n");
@@ -873,8 +917,19 @@ ManagerImpl::joinParticipant(const CallID& call_id1, const CallID& call_id2)
 
 	 }
 	 */
-    }    
-    
+    }
+
+    AccountID currentAccountId;
+
+    Call* call = NULL;
+
+    currentAccountId = getAccountFromCall (call_id1);
+    call = getAccountLink (currentAccountId)->getCall (call_id1);
+    call->setConfId (default_conf);
+
+    currentAccountId = getAccountFromCall (call_id2);
+    call = getAccountLink (currentAccountId)->getCall (call_id2);
+    call->setConfId (default_conf);
 }
 
 
@@ -901,6 +956,14 @@ ManagerImpl::detachParticipant(const CallID& call_id)
 
 	onHoldCall(call_id);
     }
+
+    AccountID currentAccountId;
+
+    Call* call = NULL;
+
+    currentAccountId = getAccountFromCall (call_id);
+    call = getAccountLink (currentAccountId)->getCall (default_conf);
+    call->setConfId (default_conf);
     
 }
 
diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h
index 60b2ee1faf9607efbfb6993068a18bfd02f2b7fb..2c827cb7ae358a66689a509baa626448e67d37f7 100644
--- a/sflphone-common/src/managerimpl.h
+++ b/sflphone-common/src/managerimpl.h
@@ -141,6 +141,14 @@ class ManagerImpl {
      */
     bool hangupCall(const CallID& id);
 
+
+    /**
+     * Functions which occur with a user's action
+     * Hangup the conference (hangup every participants)
+     * @param id  The call identifier
+     */
+    bool hangupConference(const ConfID& id);
+
     /**
      * Functions which occur with a user's action
      * Cancel the call