diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index 7a2d5109e3458bede06a2fe024b0c8bd5f577232..e40b404d1da6b6465537796de70b0b9104bcb96c 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -1467,7 +1467,20 @@ dtmfSend(SIPCall &call, char code, const std::string &dtmf)
 
     int duration = Manager::instance().voipPreferences.getPulseLength();
     char dtmf_body[1000];
-    snprintf(dtmf_body, sizeof dtmf_body - 1, "Signal=%c\r\nDuration=%d\r\n", code, duration);
+
+    const char *normal_str= "Signal=%c\r\nDuration=%d\r\n";
+    const char *flash_str = "Signal=%d\r\nDuration=%d\r\n";
+    const char *str;
+
+    // handle flash code
+    if (code == '!') {
+        str = flash_str;
+        code = 16;
+    } else {
+        str = normal_str;
+    }
+
+    snprintf(dtmf_body, sizeof dtmf_body - 1, str, code, duration);
     sendSIPInfo(call, dtmf_body, "dtmf-relay");
 }