diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c
index 593e8bfa13c755d7559f52c84c4dd0f8b7817fec..74d8668ee807850a608379a49597c76b5c7b012e 100644
--- a/sflphone-gtk/src/actions.c
+++ b/sflphone-gtk/src/actions.c
@@ -181,7 +181,7 @@ sflphone_hang_up()
         dbus_hang_up (selectedCall);
         break;
       default:
-        g_warning("Should not happen!");
+        g_warning("Should not happen in sflphone_hang_up()!");
         break;
     }
   }
@@ -209,7 +209,7 @@ sflphone_pick_up()
         dbus_transfert (selectedCall);
         break;
       default:
-        g_warning("Should not happen!");
+        g_warning("Should not happen in sflphone_pick_up()!");
         break;
     }
   }
@@ -227,7 +227,7 @@ sflphone_on_hold ()
         dbus_hold (selectedCall);
         break;
       default:
-        g_warning("Should not happen!");
+        g_warning("Should not happen in sflphone_on_hold!");
         break;
     }
   }
@@ -245,7 +245,7 @@ sflphone_off_hold ()
         dbus_unhold (selectedCall);
         break;
       default:
-        g_warning("Should not happen!");
+        g_warning("Should not happen in sflphone_off_hold ()!");
         break;
       }
   }
diff --git a/sflphone-gtk/src/calltree.c b/sflphone-gtk/src/calltree.c
index 07e37a8105ce4387f3a0e835121ab0fb4eb77180..5329a0b164f9892102248f78b2f2d45b7e1b0808 100644
--- a/sflphone-gtk/src/calltree.c
+++ b/sflphone-gtk/src/calltree.c
@@ -43,16 +43,24 @@ GtkWidget *accounts_list;
 /**
  * Show popup menu
  */
-gboolean            
+static gboolean            
 popup_menu (GtkWidget *widget,
             gpointer   user_data)
 {
-  g_print("POPIP");
   show_popup_menu(widget, NULL);
   return TRUE;
 }            
             
-
+static gboolean
+button_pressed(GtkWidget* widget, GdkEventButton *event, gpointer user_data)
+{
+  if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+  {
+    show_popup_menu(widget,  event);
+    return TRUE;
+  }
+  return FALSE;
+}
 /**
  * Make a call
  */
@@ -343,7 +351,6 @@ create_call_tree (){
 			G_TYPE_POINTER  // Pointer to the Object
 			);
 
-
 	view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
 	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE);
 	g_signal_connect (G_OBJECT (view), "row-activated",
@@ -354,6 +361,9 @@ create_call_tree (){
 	g_signal_connect (G_OBJECT (view), "popup-menu",
 			G_CALLBACK (popup_menu), 
 			NULL);
+	g_signal_connect (G_OBJECT (view), "button-press-event",
+			G_CALLBACK (button_pressed), 
+			NULL);
 
 	rend = gtk_cell_renderer_pixbuf_new();
 	col = gtk_tree_view_column_new_with_attributes ("Icon",
@@ -385,7 +395,8 @@ create_call_tree (){
 	return ret;
 
 }
-	void 
+
+void 
 update_call_tree_remove (call_t * c)
 {
 	GtkTreeIter iter;
@@ -416,7 +427,7 @@ update_call_tree_remove (call_t * c)
 	toolbar_update_buttons();
 }
 
-	void 
+void 
 update_call_tree (call_t * c)
 {
 	GdkPixbuf *pixbuf;
@@ -508,7 +519,7 @@ update_call_tree (call_t * c)
 
 }
 
-	void 
+void 
 update_call_tree_add (call_t * c)
 {
 	GdkPixbuf *pixbuf;
diff --git a/sflphone-gtk/src/menus.c b/sflphone-gtk/src/menus.c
index 25a630fb1b51a41805d8cfd955e3d7e56da9325a..85ad8b72daab2411353b558f487640df7acd8bf5 100644
--- a/sflphone-gtk/src/menus.c
+++ b/sflphone-gtk/src/menus.c
@@ -85,7 +85,7 @@ void update_menus()
         gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE);
         break; 
   	  default:
-  	    g_warning("Should not happen!");
+  	    g_warning("Should not happen in update_menus()!");
   	    break;
   	}
   } 
@@ -97,7 +97,7 @@ void update_menus()
   
 }
 /* ----------------------------------------------------------------- */
-void 
+static void 
 help_about ( void * foo)
 {
   gchar *authors[] = {
@@ -155,38 +155,43 @@ create_help_menu()
   return root_menu;
 }
 /* ----------------------------------------------------------------- */
-void 
+static void 
 call_new_call ( void * foo)
 {
   sflphone_new_call();
 }
 
-void 
+static void 
 call_quit ( void * foo)
 {
   sflphone_quit();
 }
 
-void 
+static void 
 call_hold  (void* foo)
 {
-  if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(holdMenu)))
-  {
-    sflphone_on_hold();
-  }
-  else
+  call_t * selectedCall = call_get_selected();
+  
+  if(selectedCall)
   {
-    sflphone_off_hold();
+    if(selectedCall->state == CALL_STATE_HOLD)
+    {
+      sflphone_off_hold();
+    }
+    else
+    {
+      sflphone_on_hold();
+    } 
   } 
 }
 
-void 
+static void 
 call_pick_up ( void * foo)
 {
   sflphone_pick_up();
 }
 
-void 
+static void 
 call_hang_up ( void * foo)
 {
   sflphone_hang_up();
@@ -255,14 +260,14 @@ create_call_menu()
 }
 /* ----------------------------------------------------------------- */
 
-void 
+static void 
 edit_preferences ( void * foo)
 {
   show_config_window();
 }
 
 // The menu Edit/Copy should copy the current selected call's number
-void 
+static void 
 edit_copy ( void * foo)
 {
   GtkClipboard* clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
@@ -294,7 +299,7 @@ edit_copy ( void * foo)
 }
 
 // The menu Edit/Paste should paste the clipboard into the current selected call
-void 
+static void 
 edit_paste ( void * foo)
 {
   GtkClipboard* clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
@@ -425,7 +430,7 @@ create_edit_menu()
   return root_menu;
 }
 /* ----------------------------------------------------------------- */
-void 
+static void 
 view_dial_pad  (GtkCheckMenuItem *checkmenuitem,
                 void* foo)
 {
@@ -502,28 +507,115 @@ create_menus ( )
 void
 show_popup_menu (GtkWidget *my_widget, GdkEventButton *event)
 {
-  g_print("Popup\n");
+  // TODO update the selection to make sure the call under the mouse is the call selected
+  
+  gboolean pickup = FALSE, hangup = FALSE, hold = FALSE, copy = FALSE;
+  
+	call_t * selectedCall = call_get_selected();
+	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;
+        break;
+      case CALL_STATE_CURRENT:
+        hangup = TRUE;
+        hold   = TRUE;
+        break;
+      case CALL_STATE_BUSY:
+      case CALL_STATE_FAILURE:
+        hangup = TRUE;
+        break; 
+  	  default:
+  	    g_warning("Should not happen in show_popup_menu!");
+  	    break;
+  	}
+  } 
+  
   GtkWidget *menu;
+  //GtkWidget *image;
   int button, event_time;
   GtkWidget * menu_items;
 
   menu = gtk_menu_new ();
-  g_signal_connect (menu, "deactivate", 
-                    G_CALLBACK (gtk_widget_destroy), NULL);
+  //g_signal_connect (menu, "deactivate", 
+  //       G_CALLBACK (gtk_widget_destroy), NULL);
 
-  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_swapped (G_OBJECT (menu_items), "activate",
-                  G_CALLBACK (edit_copy), 
-                  NULL);
-  gtk_widget_show (copyMenu);
+  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_swapped (G_OBJECT (menu_items), "activate",
+  g_signal_connect (G_OBJECT (menu_items), "activate",
                   G_CALLBACK (edit_paste), 
                   NULL);
-  gtk_widget_show (pasteMenu);
+  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 "/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 "/hang_up.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 (event)
   {
     button = event->button;