diff --git a/channels/chan_brcm.c b/channels/chan_brcm.c
index d54a7720c120de48826eb25684bcbed2993422b0..19eecd8476504ec5d19433a606d8655aa78c7273 100644
--- a/channels/chan_brcm.c
+++ b/channels/chan_brcm.c
@@ -1950,7 +1950,7 @@ void handle_dtmf(enum LINE_EVENT event,
 	if (p->dtmf_first < 0) {
 		p->dtmf_first = dtmf_button;
 		ast_debug(9,"Pressed DTMF %s\n", dtmfMap->name);
-		if (owner && sub->channel_state == INCALL) {
+		if (owner && sub->channel_state == INCALL && !p->hf_detected) {
 			// INCALL
 			send_outgoing_dtmf(sub, owner, dtmf_button, AST_FRAME_DTMF_BEGIN);
 		}
@@ -1964,11 +1964,11 @@ void handle_dtmf(enum LINE_EVENT event,
 		if (p->hf_detected) {
 			ast_debug(2, "DTMF after HF\n");
 			p->hf_detected = 0;
-			/* HF while not in a call doesn't make sense */
 			if (sub->channel_state == INCALL &&
 				(brcm_in_callwaiting(p) || brcm_in_onhold(p) || brcm_in_conference(p))) {
 				handle_hookflash(sub, sub_peer, owner, peer_owner);
 			} else {
+				/* HF while not in a call doesn't make sense */
 				ast_debug(2, "DTMF after HF while not in call. \
 						state: %d, \
 						callwaiting: %d, \