diff --git a/sflphone-client-gnome/src/shortcuts.c b/sflphone-client-gnome/src/shortcuts.c
index c87d9b8cc9abdeb5fb2a459711a42a4bda54c0e6..9ebad5c1b22e5a8906a19a0ce6a710c9c7374f7b 100644
--- a/sflphone-client-gnome/src/shortcuts.c
+++ b/sflphone-client-gnome/src/shortcuts.c
@@ -42,6 +42,39 @@ static GHashTable* shortcutsMap;
  * Callbacks
  */
 
+static void
+toggle_pick_up_hang_up_callback ()
+{
+  callable_obj_t * selectedCall = calltab_get_selected_call (active_calltree);
+  conference_obj_t * selectedConf = calltab_get_selected_conf (active_calltree);
+
+  g_print("toggle_pick_up_hang_up_callback\n");
+
+  if (selectedCall)
+    {
+      switch (selectedCall->_state)
+        {
+      case CALL_STATE_DIALING:
+      case CALL_STATE_INCOMING:
+      case CALL_STATE_TRANSFERT:
+        sflphone_pick_up ();
+        break;
+      case CALL_STATE_HOLD:
+      case CALL_STATE_CURRENT:
+      case CALL_STATE_RECORD:
+      case CALL_STATE_RINGING:
+        sflphone_hang_up ();
+        break;
+        }
+    }
+  else if (selectedConf)
+    {
+      dbus_hang_up_conference (selectedConf);
+    }
+  else
+    sflphone_pick_up ();
+}
+
 static void
 pick_up_callback ()
 {
@@ -54,6 +87,33 @@ hang_up_callback ()
   sflphone_hang_up ();
 }
 
+static void
+toggle_hold_callback ()
+{
+  callable_obj_t * selectedCall = calltab_get_selected_call (current_calls);
+  conference_obj_t * selectedConf = calltab_get_selected_conf (active_calltree);
+
+  if (selectedCall)
+    {
+      switch (selectedCall->_state)
+        {
+      case CALL_STATE_CURRENT:
+      case CALL_STATE_RECORD:
+        g_print("on hold\n");
+        sflphone_on_hold();
+        break;
+      case CALL_STATE_HOLD:
+        g_print("off hold\n");
+        sflphone_off_hold();
+        break;
+        }
+    }
+  else if (selectedConf)
+    dbus_hold_conference (selectedConf);
+  else
+    ERROR("Should not happen");
+}
+
 static void
 popup_window_callback ()
 {
@@ -84,6 +144,12 @@ get_action_callback (const gchar* action)
   if (strcmp (action, "popup_window") == 0)
     return popup_window_callback;
 
+  if (strcmp (action, "toggle_pick_up_hang_up") == 0)
+    return toggle_pick_up_hang_up_callback;
+
+  if (strcmp (action, "toggle_hold") == 0)
+    return toggle_hold_callback;
+
   return default_callback;
 }
 
@@ -226,24 +292,24 @@ initialize_accelerators_list ()
 }
 
 static void
-update_bindings_data(const guint index, const guint code)
+update_bindings_data (const guint index, const guint code)
 {
-    // we need to be sure this code is not already affected
-    // to another action
-    int i = 0;
-    while (accelerators_list[i].action != NULL)
-      {
-        if(accelerators_list[i].value == code)
-          {
-            // disable old binding
-            accelerators_list[i].value = 0;
-
-            // update config table
-            g_hash_table_replace (shortcutsMap,
-                  g_strdup (accelerators_list[i].action), GINT_TO_POINTER (0));
-          }
-        i++;
-      }
+  // we need to be sure this code is not already affected
+  // to another action
+  int i = 0;
+  while (accelerators_list[i].action != NULL)
+    {
+      if (accelerators_list[i].value == code)
+        {
+          // disable old binding
+          accelerators_list[i].value = 0;
+
+          // update config table
+          g_hash_table_replace (shortcutsMap, g_strdup (
+              accelerators_list[i].action), GINT_TO_POINTER (0));
+        }
+      i++;
+    }
 
   // store new value
   accelerators_list[index].value = code;
@@ -268,7 +334,7 @@ shortcuts_update_bindings (const guint index, const guint code)
   remove_bindings ();
 
   // update data
-  update_bindings_data(index, code);
+  update_bindings_data (index, code);
 
   // recreate all bindings
   create_bindings ();
diff --git a/sflphone-client-gnome/src/shortcuts.h b/sflphone-client-gnome/src/shortcuts.h
index dcad5019ebfe0a59aa52d4d4cd23d4235b25b1e1..3bc1a44cdb77c46b7929adf38197c169d588e63f 100644
--- a/sflphone-client-gnome/src/shortcuts.h
+++ b/sflphone-client-gnome/src/shortcuts.h
@@ -50,6 +50,12 @@ pick_up_callback ();
 static void
 hang_up_callback ();
 
+static void
+toggle_pick_up_hang_up_callback ();
+
+static void
+toggle_hold_callback ();
+
 static void
 initialize_binding (const gchar* action, const guint code);
 
diff --git a/sflphone-common/src/dbus/configurationmanager.cpp b/sflphone-common/src/dbus/configurationmanager.cpp
index 6c4be309b14917c9a074715db047e2b4c4aedc22..b243157e772af3b07b793a7a13138b17dc846f51 100644
--- a/sflphone-common/src/dbus/configurationmanager.cpp
+++ b/sflphone-common/src/dbus/configurationmanager.cpp
@@ -33,6 +33,8 @@ ConfigurationManager::ConfigurationManager(DBus::Connection& connection) :
 	shortcutsKeys.push_back("pick_up");
 	shortcutsKeys.push_back("hang_up");
 	shortcutsKeys.push_back("popup_window");
+	shortcutsKeys.push_back("toggle_pick_up_hang_up");
+	shortcutsKeys.push_back("toggle_hold");
 }
 
 std::map<std::string, std::string> ConfigurationManager::getAccountDetails(
diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp
index 2e0934d170be5f9c332214fe6d2acdb8d6a310ca..af885c9964af77e6a9000d2fc603fe00e906cb21 100644
--- a/sflphone-common/src/managerimpl.cpp
+++ b/sflphone-common/src/managerimpl.cpp
@@ -727,7 +727,7 @@ bool ManagerImpl::refuseCall (const CallID& id) {
 	// AudioLayer* audiolayer = getAudioDriver();
 
 	if (nbCalls <= 1) {
-		_debug ("    hangupCall: stop audio stream, ther is only %i call(s) remaining", nbCalls);
+		_debug ("    refuseCall: stop audio stream, ther is only %i call(s) remaining", nbCalls);
 
 		AudioLayer* audiolayer = getAudioDriver();
 		audiolayer->stopStream();
@@ -744,7 +744,7 @@ bool ManagerImpl::refuseCall (const CallID& id) {
 		accountid = getAccountFromCall(id);
 
 		if (accountid == AccountNULL) {
-			_debug ("! Manager OffHold Call: Call doesn't exists");
+			_debug ("! Manager refuseCall: Call doesn't exists");
 			return false;
 		}