diff --git a/apps/app_dial.c b/apps/app_dial.c
index 849c0c527991f1ce43dd8f64ec74522eae816a4d..671c8007c270c39852fcf0fa9bc48072c8772b0d 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1593,6 +1593,10 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
 		res = -1; /* reset default */
 	}
 
+	if (ast_test_flag64(&opts, OPT_DTMF_EXIT)) {
+		__ast_answer(chan, 0, 0);
+	}
+
 	if (continue_exec)
 		*continue_exec = 0;
 
diff --git a/apps/app_dictate.c b/apps/app_dictate.c
index b780182e3ef447bd28d9c705e735b7c45bfffbf3..b187998a8a2294eac8527bd70d6771f322dffd01 100644
--- a/apps/app_dictate.c
+++ b/apps/app_dictate.c
@@ -127,7 +127,9 @@ static int dictate_exec(struct ast_channel *chan, void *data)
 		return -1;
 	}
 
-	ast_answer(chan);
+	if (chan->_state != AST_STATE_UP) {
+		ast_answer(chan);
+	}
 	ast_safe_sleep(chan, 200);
 	for (res = 0; !res;) {
 		if (ast_strlen_zero(filename)) {
diff --git a/apps/app_waitforsilence.c b/apps/app_waitforsilence.c
index 1aa777575c55e32abb61ed3e5af2bf84b1c02295..f68b70ad3c9b810ac2838e950278bb571d1de748 100644
--- a/apps/app_waitforsilence.c
+++ b/apps/app_waitforsilence.c
@@ -210,7 +210,9 @@ static int waitfor_exec(struct ast_channel *chan, void *data, int wait_for_silen
 	int iterations = 1, i;
 	time_t waitstart;
 
-	res = ast_answer(chan); /* Answer the channel */
+	if (chan->_state != AST_STATE_UP) {
+		res = ast_answer(chan); /* Answer the channel */
+	}
 
 	if (!data || ( (sscanf(data, "%d,%d,%d", &timereqd, &iterations, &timeout) != 3) &&
 		(sscanf(data, "%d,%d", &timereqd, &iterations) != 2) &&
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 11f319849ebf7ee9bcfe95588a59256d2b2d6c63..183a36bbfb587581418beecfca5bbd18495f6085 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -971,7 +971,7 @@ void ast_channel_setwhentohangup_tv(struct ast_channel *chan, struct timeval off
  * \retval non-zero on failure
  */
 int ast_answer(struct ast_channel *chan);
-int __ast_answer(struct ast_channel *chan, unsigned int delay);
+int __ast_answer(struct ast_channel *chan, unsigned int delay, int cdr_answer);
 
 /*! \brief Make a call 
  * \param chan which channel to make the call on
diff --git a/main/channel.c b/main/channel.c
index 4510ce25231f00c40675af261b681e2fe35cc546..6c014449173db99815770ddb056c9106da43caee 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -1697,7 +1697,7 @@ int ast_hangup(struct ast_channel *chan)
 }
 
 #define ANSWER_WAIT_MS 500
-int __ast_answer(struct ast_channel *chan, unsigned int delay)
+int __ast_answer(struct ast_channel *chan, unsigned int delay,  int cdr_answer)
 {
 	int res = 0;
 
@@ -1725,7 +1725,9 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay)
 			res = chan->tech->answer(chan);
 		}
 		ast_setstate(chan, AST_STATE_UP);
-		ast_cdr_answer(chan->cdr);
+		if (cdr_answer) {
+			ast_cdr_answer(chan->cdr);
+		}
 		ast_channel_unlock(chan);
 		if (delay) {
 			ast_safe_sleep(chan, delay);
@@ -1761,6 +1763,12 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay)
 		}
 		break;
 	case AST_STATE_UP:
+		/* Calling ast_cdr_answer when it it has previously been called
+		 * is essentially a no-op, so it is safe.
+		 */
+		if (cdr_answer) {
+			ast_cdr_answer(chan->cdr);
+		}
 		break;
 	default:
 		break;
@@ -1774,7 +1782,7 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay)
 
 int ast_answer(struct ast_channel *chan)
 {
-	return __ast_answer(chan, 0);
+	return __ast_answer(chan, 0, 1);
 }
 
 void ast_deactivate_generator(struct ast_channel *chan)
diff --git a/main/pbx.c b/main/pbx.c
index 39a3d8ba222e8d3bfb5dcab8b612d47898dcf733..10792e5cd7938ce03f6ab800a73309ac2a37d948 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -97,6 +97,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 				<para>Asterisk will wait this number of milliseconds before returning to
 				the dialplan after answering the call.</para>
 			</parameter>
+			<parameter name="nocdr">
+				<para>Asterisk will send an answer signal to the calling phone, but will not
+				set the disposition or answer time in the CDR for this call.
+			</parameter>
 		</syntax>
 		<description>
 			<para>If the call has not been answered, this application will
@@ -8310,15 +8314,33 @@ static int pbx_builtin_congestion(struct ast_channel *chan, void *data)
 static int pbx_builtin_answer(struct ast_channel *chan, void *data)
 {
 	int delay = 0;
+	int answer_cdr = 1;
+	char *parse;
+	AST_DECLARE_APP_ARGS(args,
+		AST_APP_ARG(delay);
+		AST_APP_ARG(answer_cdr);
+	);
+
+	if (ast_strlen_zero(data)) {
+		return __ast_answer(chan, 0, 1);
+	}
 
-	if ((chan->_state != AST_STATE_UP) && !ast_strlen_zero(data))
+	parse = ast_strdupa(data);
+
+	AST_STANDARD_APP_ARGS(args, parse);
+
+	if (!ast_strlen_zero(args.delay) && (chan->_state != AST_STATE_UP))
 		delay = atoi(data);
 
 	if (delay < 0) {
 		delay = 0;
 	}
 
-	return __ast_answer(chan, delay);
+	if (!ast_strlen_zero(args.answer_cdr) && !strcasecmp(args.answer_cdr, "nocdr")) {
+		answer_cdr = 0;
+	}
+
+	return __ast_answer(chan, delay, answer_cdr);
 }
 
 static int pbx_builtin_incomplete(struct ast_channel *chan, void *data)
@@ -8335,7 +8357,7 @@ static int pbx_builtin_incomplete(struct ast_channel *chan, void *data)
 	if (ast_check_hangup(chan)) {
 		return -1;
 	} else if (chan->_state != AST_STATE_UP && answer) {
-		__ast_answer(chan, 0);
+		__ast_answer(chan, 0, 1);
 	}
 
 	return AST_PBX_INCOMPLETE;