diff --git a/sflphone-gtk/src/actions.c b/sflphone-gtk/src/actions.c
index 4589bb5556970d50c8ac226d811f01a1f9028ac0..919476a4c74a4ad6930672302cd6b1d7c8de33fb 100644
--- a/sflphone-gtk/src/actions.c
+++ b/sflphone-gtk/src/actions.c
@@ -254,7 +254,7 @@ sflphone_keypad( guint keyval, gchar * key)
           dbus_hang_up(c);
           break;
         default:
-          //TODO send DTMF, 
+          dbus_play_dtmf(key);
           if (keyval < 255 || (keyval >65453 && keyval < 65466))
           { 
             gchar * temp = g_strconcat(call_get_number(c), key, NULL);
diff --git a/sflphone-gtk/src/callmanager-glue.h b/sflphone-gtk/src/callmanager-glue.h
index 538a8f72e8481febb602a3d169d537d27869c534..01bf51b3b7a33acef508e694b828d4db96867879 100644
--- a/sflphone-gtk/src/callmanager-glue.h
+++ b/sflphone-gtk/src/callmanager-glue.h
@@ -273,6 +273,43 @@ static
 inline
 #endif
 gboolean
+org_sflphone_SFLphone_CallManager_play_dt_mf (DBusGProxy *proxy, const char * IN_key, GError **error)
+
+{
+  return dbus_g_proxy_call (proxy, "playDTMF", error, G_TYPE_STRING, IN_key, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_sflphone_SFLphone_CallManager_play_dt_mf_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_sflphone_SFLphone_CallManager_play_dt_mf_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+  DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+  GError *error = NULL;
+  dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+  (*(org_sflphone_SFLphone_CallManager_play_dt_mf_reply)data->cb) (proxy, error, data->userdata);
+  return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_sflphone_SFLphone_CallManager_play_dt_mf_async (DBusGProxy *proxy, const char * IN_key, org_sflphone_SFLphone_CallManager_play_dt_mf_reply callback, gpointer userdata)
+
+{
+  DBusGAsyncData *stuff;
+  stuff = g_new (DBusGAsyncData, 1);
+  stuff->cb = G_CALLBACK (callback);
+  stuff->userdata = userdata;
+  return dbus_g_proxy_begin_call (proxy, "playDTMF", org_sflphone_SFLphone_CallManager_play_dt_mf_async_callback, stuff, g_free, G_TYPE_STRING, IN_key, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
 org_sflphone_SFLphone_CallManager_set_volume (DBusGProxy *proxy, const char * IN_device, const gdouble IN_value, GError **error)
 
 {
diff --git a/sflphone-gtk/src/dbus.c b/sflphone-gtk/src/dbus.c
index 9dc7372218f713be02a585986c7ea2e1efbc6e66..e967b00bf288b4f949cc40319bc46f149b92127b 100644
--- a/sflphone-gtk/src/dbus.c
+++ b/sflphone-gtk/src/dbus.c
@@ -487,3 +487,27 @@ dbus_get_volume(const gchar * device)
   }
   return value;
 }
+
+
+void
+dbus_play_dtmf(const gchar * key)
+{
+  GError *error = NULL;
+  
+  org_sflphone_SFLphone_CallManager_play_dt_mf(
+    callManagerProxy, 
+    key, 
+    &error);
+
+  if (error) 
+  {
+    g_printerr ("Failed to call playDTMF() on callManagerProxy: %s\n",
+                error->message);
+    g_error_free (error);
+  } 
+  else 
+  {
+    g_print ("DBus called playDTMF() on callManagerProxy\n");
+
+  }
+}
diff --git a/sflphone-gtk/src/dbus.h b/sflphone-gtk/src/dbus.h
index f6050142ce743652ed2008e427dd5c5f2266b83a..1da6c7af1208fda589d7649314f919fc5ff34f68 100644
--- a/sflphone-gtk/src/dbus.h
+++ b/sflphone-gtk/src/dbus.h
@@ -48,5 +48,6 @@ void dbus_set_account_details(account_t *a);
 void dbus_remove_account(gchar * accountID);
 void dbus_set_volume(const gchar * device, gdouble value);
 gdouble dbus_get_volume(const gchar * device);
+void dbus_play_dtmf(const gchar * key);
 
 #endif
diff --git a/src/dbus/callmanager-glue.h b/src/dbus/callmanager-glue.h
index f52f48626ad143c8fa158579818b2c33a2f3f1ab..e77c0ac076f56b56d36263160aa618e31a20aa17 100644
--- a/src/dbus/callmanager-glue.h
+++ b/src/dbus/callmanager-glue.h
@@ -27,6 +27,7 @@ public:
         register_method(CallManager, hold, _hold_stub);
         register_method(CallManager, unhold, _unhold_stub);
         register_method(CallManager, transfert, _transfert_stub);
+        register_method(CallManager, playDTMF, _playDTMF_stub);
         register_method(CallManager, setVolume, _setVolume_stub);
         register_method(CallManager, getVolume, _getVolume_stub);
         register_method(CallManager, getCallDetails, _getCallDetails_stub);
@@ -73,6 +74,11 @@ public:
             { "to", "s", true },
             { 0, 0, 0 }
         };
+        static ::DBus::IntrospectedArgument playDTMF_args[] = 
+        {
+            { "key", "s", true },
+            { 0, 0, 0 }
+        };
         static ::DBus::IntrospectedArgument setVolume_args[] = 
         {
             { "device", "s", true },
@@ -141,6 +147,7 @@ public:
             { "hold", hold_args },
             { "unhold", unhold_args },
             { "transfert", transfert_args },
+            { "playDTMF", playDTMF_args },
             { "setVolume", setVolume_args },
             { "getVolume", getVolume_args },
             { "getCallDetails", getCallDetails_args },
@@ -189,6 +196,7 @@ public:
     virtual void hold( const ::DBus::String& callID ) = 0;
     virtual void unhold( const ::DBus::String& callID ) = 0;
     virtual void transfert( const ::DBus::String& callID, const ::DBus::String& to ) = 0;
+    virtual void playDTMF( const ::DBus::String& key ) = 0;
     virtual void setVolume( const ::DBus::String& device, const ::DBus::Double& value ) = 0;
     virtual ::DBus::Double getVolume( const ::DBus::String& device ) = 0;
     virtual std::map< ::DBus::String, ::DBus::String > getCallDetails( const ::DBus::String& callID ) = 0;
@@ -317,6 +325,15 @@ private:
         ::DBus::ReturnMessage reply(call);
         return reply;
     }
+    ::DBus::Message _playDTMF_stub( const ::DBus::CallMessage& call )
+    {
+        ::DBus::MessageIter ri = call.reader();
+
+        ::DBus::String argin1; ri >> argin1;
+        playDTMF(argin1);
+        ::DBus::ReturnMessage reply(call);
+        return reply;
+    }
     ::DBus::Message _setVolume_stub( const ::DBus::CallMessage& call )
     {
         ::DBus::MessageIter ri = call.reader();
diff --git a/src/dbus/callmanager-introspec.xml b/src/dbus/callmanager-introspec.xml
index 2a5d84d1e057fb9644dd3d68710ba85cf2f8181a..fc4a042ac3e3eaadf636ea3de778caa042dab45c 100644
--- a/src/dbus/callmanager-introspec.xml
+++ b/src/dbus/callmanager-introspec.xml
@@ -33,6 +33,10 @@
       <arg type="s" name="to" direction="in"/>
     </method>
     
+    <method name="playDTMF">
+      <arg type="s" name="key" direction="in"/>
+    </method>
+    
     <method name="setVolume">
       <arg type="s" name="device" direction="in"/>
       <arg type="d" name="value" direction="in"/>
diff --git a/src/dbus/callmanager.cpp b/src/dbus/callmanager.cpp
index 6c779a36d7b354dac58e434832513a8aeaa55957..4708f7f6308ac534b3eb64005647012ded5ca317 100644
--- a/src/dbus/callmanager.cpp
+++ b/src/dbus/callmanager.cpp
@@ -133,4 +133,10 @@ CallManager::getCurrentCallID(  )
     return Manager::instance().getCurrentCallId();
 }
 
+void 
+CallManager::playDTMF( const ::DBus::String& key )
+{
+  Manager::instance().sendDtmf(Manager::instance().getCurrentCallId(), key.c_str()[0]);
+}
+
 
diff --git a/src/dbus/callmanager.h b/src/dbus/callmanager.h
index 906b7c479bbfe354367c0cc221cb6a4d9ce17a3e..f52d8ed6015bd929bae95d1e87bde76448f4af02 100644
--- a/src/dbus/callmanager.h
+++ b/src/dbus/callmanager.h
@@ -50,7 +50,8 @@ public:
     ::DBus::Double getVolume( const ::DBus::String& device );
     std::map< ::DBus::String, ::DBus::String > getCallDetails( const ::DBus::String& callID );
     ::DBus::String getCurrentCallID(  );
-
+    void playDTMF( const ::DBus::String& key );
+    
 };