diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c
index 169f0729049337233d99d414dff5f3258e48c485..e528253b3bb60b2c803aed69c1ffc9f93abeddf3 100644
--- a/sflphone-gtk/src/actions.c
+++ b/sflphone-gtk/src/actions.c
@@ -190,7 +190,7 @@ sflphone_on_hold ()
         dbus_hold (selectedCall);
         break;
       default:
-        g_error("Should not happen!");
+        g_warning("Should not happen!");
         break;
     }
   }
@@ -208,7 +208,7 @@ sflphone_off_hold ()
         dbus_unhold (selectedCall);
         break;
       default:
-        g_error("Should not happen!");
+        g_warning("Should not happen!");
         break;
       }
   }
@@ -322,22 +322,24 @@ void process_dialing(call_t * c, guint keyval, gchar * key)
   
 }
 
-void process_new_call(guint keyval, gchar * key){
-  if (keyval < 255 || (keyval >65453 && keyval < 65466))
-    { 
-      /* Brackets mandatory because of local vars */
-      call_t * c = g_new0 (call_t, 1);
-      c->state = CALL_STATE_DIALING;
-      c->from = g_strconcat("\"\" <", key, ">", NULL);
-      
-      c->callID = g_new0(gchar, 100);
-      g_sprintf(c->callID, "%d", rand()); 
-      
-      c->to = g_strdup(key);
-      call_list_add(c);
-      screen_set_call(c);
-      update_call_tree_add(c);
-    }
+
+call_t * sflphone_new_call()
+{
+  call_t * c = g_new0 (call_t, 1);
+  c->state = CALL_STATE_DIALING;
+  c->from = g_strconcat("\"\" <>", NULL);
+  
+  c->callID = g_new0(gchar, 30);
+  g_sprintf(c->callID, "%d", rand()); 
+  
+  c->to = g_strdup("");
+  
+  call_list_add(c);
+  screen_set_call(c);
+  update_call_tree_add(c);  
+  update_menus();
+  
+  return c;
 }
 
 void 
@@ -347,20 +349,18 @@ sflphone_keypad( guint keyval, gchar * key)
   if(c)
   {
   
-    switch(c->state) // Currently dialing => edit number
+    switch(c->state) 
     {
-      case CALL_STATE_DIALING:
+      case CALL_STATE_DIALING: // Currently dialing => edit number
         process_dialing(c, keyval, key);
         break;
       case CALL_STATE_CURRENT:
-      case CALL_STATE_BUSY:
-      case CALL_STATE_FAILURE:
         switch (keyval)
         {
         case 65307: /* ESCAPE */
           dbus_hang_up(c);
           break;
-        default:
+        default:  // TODO should this be here?
           dbus_play_dtmf(key);
           if (keyval < 255 || (keyval >65453 && keyval < 65466))
           { 
@@ -398,11 +398,13 @@ sflphone_keypad( guint keyval, gchar * key)
           dbus_hang_up(c);
           break;
         default: // When a call is on hold, typing new numbers will create a new call
-          process_new_call(keyval, key);
+          process_dialing(sflphone_new_call(), keyval, key);
           break;
         }
         break;
       case CALL_STATE_RINGING:
+      case CALL_STATE_BUSY:
+      case CALL_STATE_FAILURE:
         switch (keyval)
         {
         case 65307: /* ESCAPE */
@@ -416,7 +418,18 @@ sflphone_keypad( guint keyval, gchar * key)
   }
   else 
   { // Not in a call, not dialing, create a new call 
-    process_new_call(keyval, key);
+    switch (keyval)
+    {
+    case 65293: /* ENTER */
+    case 65421: /* ENTER numpad */
+    case 65307: /* ESCAPE */
+      break;
+    default:
+      process_dialing(sflphone_new_call(), keyval, key);
+      break;
+    }
+        
+     
   }
 } 
 
diff --git a/sflphone-gtk/src/actions.h b/sflphone-gtk/src/actions.h
index a18959ca2a2cfe2f6fa9391ac67faee16c649767..e16922e1f2384e0d050ce9745681baa36eca78d4 100644
--- a/sflphone-gtk/src/actions.h
+++ b/sflphone-gtk/src/actions.h
@@ -49,6 +49,7 @@ void sflphone_hang_up ();
 
 void sflphone_on_hold ();
 void sflphone_off_hold ();
+call_t * sflphone_new_call();
 
 
 /**
diff --git a/sflphone-gtk/src/calltree.c b/sflphone-gtk/src/calltree.c
index 21b6a028b8413681516db780287ffe89a02cf237..bf85fc649eecb5787b028119e5cbc78c2c9ccd5f 100644
--- a/sflphone-gtk/src/calltree.c
+++ b/sflphone-gtk/src/calltree.c
@@ -27,6 +27,7 @@ GtkListStore * store;
 GtkWidget *view;
 
 GtkWidget * callButton;
+GtkWidget * pickupButton;
 GtkWidget * hangupButton;
 GtkWidget * holdButton;
 GtkWidget * transfertButton;
@@ -37,6 +38,15 @@ GtkWidget * unholdButton;
  */
 static void 
 call_button( GtkWidget *widget, gpointer   data )
+{
+  sflphone_new_call();
+}
+
+/**
+ * Pick up
+ */
+static void 
+pick_up( GtkWidget *widget, gpointer   data )
 {
   sflphone_pick_up();
 }
@@ -85,6 +95,7 @@ void
 update_buttons ()
 {
   gtk_widget_set_sensitive( GTK_WIDGET(callButton),       FALSE);
+  gtk_widget_set_sensitive( GTK_WIDGET(pickupButton),     FALSE);
   gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     FALSE);
   gtk_widget_set_sensitive( GTK_WIDGET(holdButton),       FALSE);
   gtk_widget_set_sensitive( GTK_WIDGET(transfertButton),  FALSE);
@@ -96,18 +107,19 @@ update_buttons ()
     switch(selectedCall->state) 
   	{
   	  case CALL_STATE_INCOMING:
-        gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
+        gtk_widget_set_sensitive( GTK_WIDGET(pickupButton),     TRUE);
         gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
         break;
       case CALL_STATE_HOLD:
     	  gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
         gtk_widget_set_sensitive( GTK_WIDGET(unholdButton),     TRUE);
+        gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
         break;
       case CALL_STATE_RINGING:
     	  gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
         break;
       case CALL_STATE_DIALING:
-        gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
+        gtk_widget_set_sensitive( GTK_WIDGET(pickupButton),     TRUE);
         gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
         break;
       case CALL_STATE_CURRENT:
@@ -115,6 +127,7 @@ update_buttons ()
         gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
         gtk_widget_set_sensitive( GTK_WIDGET(holdButton),       TRUE);
         gtk_widget_set_sensitive( GTK_WIDGET(transfertButton),  TRUE);
+        gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
         break;
       case CALL_STATE_BUSY:
       case CALL_STATE_FAILURE:
@@ -125,6 +138,10 @@ update_buttons ()
   	    break;
   	}
   }
+  else 
+  {
+    gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
+  }
 }
 /* Call back when the user click on a call in the list */
 static void 
@@ -232,7 +249,6 @@ create_call_tree (){
   hbox = gtk_hbox_new (FALSE, 5);       
   
   callButton = gtk_button_new ();
-  gtk_widget_set_state( GTK_WIDGET(callButton), GTK_STATE_INSENSITIVE);
   image = gtk_image_new_from_file( ICONS_DIR "/call.svg");
   gtk_button_set_image(GTK_BUTTON(callButton), image);
   //gtk_button_set_image_position( button, GTK_POS_TOP);
@@ -240,6 +256,15 @@ create_call_tree (){
   g_signal_connect (G_OBJECT (callButton), "clicked",
                     G_CALLBACK (call_button), NULL);
 
+  pickupButton = gtk_button_new ();
+  gtk_widget_set_state( GTK_WIDGET(pickupButton), GTK_STATE_INSENSITIVE);
+  image = gtk_image_new_from_file( ICONS_DIR "/accept.svg");
+  gtk_button_set_image(GTK_BUTTON(pickupButton), image);
+  //gtk_button_set_image_position( button, GTK_POS_TOP);
+  gtk_box_pack_start (GTK_BOX (hbox), pickupButton, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
+  g_signal_connect (G_OBJECT (pickupButton), "clicked",
+                    G_CALLBACK (pick_up), NULL);
+  
   hangupButton = gtk_button_new ();
   gtk_widget_hide( hangupButton );
   gtk_widget_set_state( GTK_WIDGET(hangupButton), GTK_STATE_INSENSITIVE);
diff --git a/sflphone-gtk/src/mainwindow.c b/sflphone-gtk/src/mainwindow.c
index 9b483522715dc8fbfbbcb6e77af9554f379f39d4..f15231664a97b5a934431abc1bdadaccb8043c06 100644
--- a/sflphone-gtk/src/mainwindow.c
+++ b/sflphone-gtk/src/mainwindow.c
@@ -99,6 +99,7 @@ on_key_released (GtkWidget   *widget,
      event->keyval == 34             || // "
      event->keyval == 65361          || // left arrow
      event->keyval == 65363          || // right arrow
+     event->keyval >= 65470          || // F-keys
      event->keyval == 32                // space
      )
     return FALSE;
diff --git a/sflphone-gtk/src/menus.c b/sflphone-gtk/src/menus.c
index 1edd6e0ea5ff64b41a83ed783877153d4b10632c..134a9a43110618fdf953703331ce77b542b1a94e 100644
--- a/sflphone-gtk/src/menus.c
+++ b/sflphone-gtk/src/menus.c
@@ -26,13 +26,20 @@
 
 GtkWidget * pickUpMenu;
 GtkWidget * hangUpMenu;
+GtkWidget * newCallMenu;
 GtkWidget * holdMenu;
+guint holdConnId;     //The hold_menu signal connection ID
 
 void update_menus()
-{
+{ 
+  //Block signals for holdMenu
+  gtk_signal_handler_block(GTK_OBJECT(holdMenu), holdConnId);
+  
   gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), FALSE);
   gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), FALSE);
+  gtk_widget_set_sensitive( GTK_WIDGET(newCallMenu),FALSE);
   gtk_widget_set_sensitive( GTK_WIDGET(holdMenu),   FALSE);
+  gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(holdMenu), FALSE);
 	
 	call_t * selectedCall = call_get_selected();
 	if (selectedCall)
@@ -46,6 +53,8 @@ void update_menus()
       case CALL_STATE_HOLD:
         gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE);
         gtk_widget_set_sensitive( GTK_WIDGET(holdMenu),   TRUE);
+        gtk_widget_set_sensitive( GTK_WIDGET(newCallMenu),TRUE);
+        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(holdMenu), TRUE);
         break;
       case CALL_STATE_RINGING:
         gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), TRUE);
@@ -58,6 +67,7 @@ void update_menus()
       case CALL_STATE_CURRENT:
         gtk_widget_set_sensitive( GTK_WIDGET(hangUpMenu), TRUE);
         gtk_widget_set_sensitive( GTK_WIDGET(holdMenu),   TRUE);
+        gtk_widget_set_sensitive( GTK_WIDGET(newCallMenu),TRUE);
         break;
       case CALL_STATE_BUSY:
       case CALL_STATE_FAILURE:
@@ -67,7 +77,13 @@ void update_menus()
   	    g_error("Should not happen!");
   	    break;
   	}
+  } 
+  else
+  {
+    gtk_widget_set_sensitive( GTK_WIDGET(newCallMenu), TRUE);
   }
+  gtk_signal_handler_unblock(holdMenu, holdConnId);
+  
 }
 /* ----------------------------------------------------------------- */
 void 
@@ -122,7 +138,6 @@ create_help_menu()
                   NULL);
   gtk_widget_show (menu_items);
     
-  
   root_menu = gtk_menu_item_new_with_mnemonic ("_Help");
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu);
 
@@ -130,15 +145,15 @@ create_help_menu()
 }
 /* ----------------------------------------------------------------- */
 void 
-call_quit ( void * foo)
+call_new_call ( void * foo)
 {
-  sflphone_quit();
+  sflphone_new_call();
 }
 
 void 
-call_preferences ( void * foo)
+call_quit ( void * foo)
 {
-  show_config_window();
+  sflphone_quit();
 }
 
 void 
@@ -174,7 +189,17 @@ create_call_menu()
   GtkWidget * menu_items;
   
   menu      = gtk_menu_new ();
-
+ 
+  newCallMenu = gtk_image_menu_item_new_with_mnemonic("_New call...");
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), newCallMenu);
+  g_signal_connect_swapped (G_OBJECT (newCallMenu), "activate",
+                  G_CALLBACK (call_new_call), 
+                  NULL);
+  gtk_widget_show (newCallMenu);
+  
+  menu_items = gtk_separator_menu_item_new ();
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+  
   pickUpMenu = gtk_image_menu_item_new_with_mnemonic("_Pick up");
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), pickUpMenu);
   gtk_widget_set_sensitive( GTK_WIDGET(pickUpMenu), FALSE);
@@ -191,20 +216,16 @@ create_call_menu()
                   NULL);
   gtk_widget_show (hangUpMenu);
   
-  menu_items = gtk_separator_menu_item_new ();
-  gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-  
   holdMenu = gtk_check_menu_item_new_with_mnemonic ("On _Hold");
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), holdMenu);
   gtk_widget_set_sensitive( GTK_WIDGET(holdMenu),   FALSE);
   //Here we connect only to activate
   //The toggled state is managed from update_menus()
-  g_signal_connect(G_OBJECT (holdMenu), "activate",
+  holdConnId = g_signal_connect(G_OBJECT (holdMenu), "activate",
                   G_CALLBACK (call_hold), 
                   NULL);
   gtk_widget_show (menu_items);
   
-  
   menu_items = gtk_separator_menu_item_new ();
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
   
@@ -223,6 +244,48 @@ create_call_menu()
 }
 /* ----------------------------------------------------------------- */
 
+void 
+edit_preferences ( void * foo)
+{
+  show_config_window();
+}
+
+GtkWidget * 
+create_edit_menu()
+{
+  GtkWidget * menu;
+  GtkWidget * root_menu;
+  GtkWidget * menu_items;
+  
+  menu      = gtk_menu_new ();
+
+  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);
+  gtk_widget_set_sensitive( GTK_WIDGET(menu_items),   FALSE);
+  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);
+  gtk_widget_set_sensitive( GTK_WIDGET(menu_items),   FALSE);
+  gtk_widget_show (menu_items);
+  
+  menu_items = gtk_separator_menu_item_new ();
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+  
+  menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PREFERENCES, 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_preferences), 
+                  NULL);
+  gtk_widget_show (menu_items);  
+    
+  
+  root_menu = gtk_menu_item_new_with_mnemonic ("_Edit");
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu);
+
+  return root_menu;
+}
+/* ----------------------------------------------------------------- */
 void 
 view_dial_pad  (GtkCheckMenuItem *checkmenuitem,
                 void* foo)
@@ -246,13 +309,19 @@ create_view_menu()
                   NULL);
   gtk_widget_show (menu_items);
   
-  menu_items = gtk_separator_menu_item_new ();
+  menu_items = gtk_check_menu_item_new_with_mnemonic ("_Volume controls");
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
+  gtk_widget_set_sensitive( GTK_WIDGET(menu_items),   FALSE);
+  g_signal_connect(G_OBJECT (menu_items), "toggled",
+                  G_CALLBACK (view_dial_pad), 
+                  NULL);
+  gtk_widget_show (menu_items);
   
-  menu_items = gtk_image_menu_item_new_from_stock( GTK_STOCK_PREFERENCES, get_accel_group());
+  menu_items = gtk_check_menu_item_new_with_mnemonic ("_Toolbar");
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
-  g_signal_connect_swapped (G_OBJECT (menu_items), "activate",
-                  G_CALLBACK (call_preferences), 
+  gtk_widget_set_sensitive( GTK_WIDGET(menu_items),   FALSE);
+  g_signal_connect(G_OBJECT (menu_items), "toggled",
+                  G_CALLBACK (view_dial_pad), 
                   NULL);
   gtk_widget_show (menu_items);
   
@@ -268,21 +337,21 @@ create_menus ( )
 
   GtkWidget * menu_bar;
   GtkWidget * root_menu;
-  
 
   menu_bar  = gtk_menu_bar_new ();
   
   root_menu = create_call_menu();
   gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu);
   
+  root_menu = create_edit_menu();
+  gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu);
+  
   root_menu = create_view_menu();
   gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu);
 
   root_menu = create_help_menu();
   gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu);
 
-  
-  
   gtk_widget_show (menu_bar);