diff --git a/CHANGES b/CHANGES
index 37144e0513cc10f4d9a407299fba450267d2ee82..f18e918d874dd0cafe573cb43ac4f79b16bca57d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -77,6 +77,10 @@ Applications
    regardless if the call has been answered or not.
  * Added functionality to the app_dial F() option to continue with execution
    at the current location when no parameters are provided.
+ * Added the 'a' option to app_dial to answer the calling channel before any
+   announcements or macros are executed.
+ * Modified app_dial to set answertime when the called channel answers even if
+   the called channel hangs up during playback of an announcement.
  * Added c() option to app_chanspy. This option allows custom DTMF to be set
    to cycle through the next available channel.  By default this is still '*'.
  * Added x() option to app_chanspy.  This option allows DTMF to be set to
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 7a74d8d2243fa51465e6d51e1224549ae4048f81..c6747bffc3f9e0e36c80161a25055e91fd34c205 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -94,6 +94,15 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 					</argument>
 					<para>Play an announcement to the called party, where <replaceable>x</replaceable> is the prompt to be played</para>
 				</option>
+				<option name="a">
+					<para>Immediately answer the calling channel when the called channel answers in
+					all cases. Normally, the calling channel is answered when the called channel
+					answers, but when options such as A() and M() are used, the calling channel is
+					not answered until all actions on the called channel (such as playing an
+					announcement) are completed.  This option can be used to answer the calling
+					channel before doing anything on the called channel. You will rarely need to use
+					this option, the default behavior is adequate in most cases.</para>
+				</option>
 				<option name="C">
 					<para>Reset the call detail record (CDR) for this call.</para>
 				</option>
@@ -508,6 +517,7 @@ enum {
 	OPT_CALLEE_GOSUB =      (1 << 28),
 	OPT_CALLEE_MIXMONITOR = (1 << 29),
 	OPT_CALLER_MIXMONITOR = (1 << 30),
+	OPT_CALLER_ANSWER =	(1 << 31),
 };
 
 #define DIAL_STILLGOING      (1 << 31)
@@ -537,6 +547,7 @@ enum {
 
 AST_APP_OPTIONS(dial_exec_options, BEGIN_OPTIONS
 	AST_APP_OPTION_ARG('A', OPT_ANNOUNCE, OPT_ARG_ANNOUNCE),
+	AST_APP_OPTION('a', OPT_CALLER_ANSWER),
 	AST_APP_OPTION('C', OPT_RESETCDR),
 	AST_APP_OPTION('c', OPT_CANCEL_ELSEWHERE),
 	AST_APP_OPTION('d', OPT_DTMF_EXIT),
@@ -1987,6 +1998,9 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 	} else {
 		const char *number;
 
+		if (ast_test_flag64(&opts, OPT_CALLER_ANSWER))
+			ast_answer(chan);
+
 		strcpy(pa.status, "ANSWER");
 		pbx_builtin_setvar_helper(chan, "DIALSTATUS", pa.status);
 		/* Ah ha!  Someone answered within the desired timeframe.  Of course after this
@@ -1994,9 +2008,11 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 		   conversation.  */
 		hanguptree(outgoing, peer, 1);
 		outgoing = NULL;
-		/* If appropriate, log that we have a destination channel */
-		if (chan->cdr)
+		/* If appropriate, log that we have a destination channel and set the answer time */
+		if (chan->cdr) {
 			ast_cdr_setdestchan(chan->cdr, peer->name);
+			ast_cdr_setanswer(chan->cdr, peer->cdr->answer);
+		}
 		if (peer->name)
 			pbx_builtin_setvar_helper(chan, "DIALEDPEERNAME", peer->name);