diff --git a/UPGRADE.txt b/UPGRADE.txt
index 6cb61480726d7d719896152c2f61adf896bb2bb0..569cc9222742998769991f804db2b2eaeb26c7db 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -33,6 +33,10 @@ Queue:
    their ringinuse value updated to the value of the queue. Previously, the
    ringinuse value for dynamic members was not updated on reload.
 
+Queue log:
+ - New RINGCANCELED event is logged when the caller hangs up while ringing.
+   The data1 field contains number of miliseconds since start of ringing.
+
 Channel Drivers:
 
 chan_dahdi:
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 9176f936093f186a39fa92a7193ea53adfbda9d6..5874a49f62b983e2f17680842d5d4347c2221e18 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -4760,6 +4760,7 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
 #endif
 	char *inchan_name;
 	struct timeval start_time_tv = ast_tvnow();
+	int canceled_by_caller = 0; /* 1 when caller hangs up or press digit or press * */
 
 	ast_channel_lock(qe->chan);
 	inchan_name = ast_strdupa(ast_channel_name(qe->chan));
@@ -5198,29 +5199,33 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte
 			if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass.integer == AST_CONTROL_HANGUP))) {
 				/* Got hung up */
 				*to = -1;
-				publish_dial_end_event(in, outgoing, NULL, "CANCEL");
 				if (f) {
 					if (f->data.uint32) {
 						ast_channel_hangupcause_set(in, f->data.uint32);
 					}
 					ast_frfree(f);
 				}
-				return NULL;
-			}
-
-			if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
+				canceled_by_caller = 1;
+			} else if ((f->frametype == AST_FRAME_DTMF) && caller_disconnect && (f->subclass.integer == '*')) {
 				ast_verb(3, "User hit %c to disconnect call.\n", f->subclass.integer);
 				*to = 0;
-				publish_dial_end_event(in, outgoing, NULL, "CANCEL");
 				ast_frfree(f);
-				return NULL;
-			}
-			if ((f->frametype == AST_FRAME_DTMF) && valid_exit(qe, f->subclass.integer)) {
+				canceled_by_caller = 1;
+			} else if ((f->frametype == AST_FRAME_DTMF) && valid_exit(qe, f->subclass.integer)) {
 				ast_verb(3, "User pressed digit: %c\n", f->subclass.integer);
 				*to = 0;
-				publish_dial_end_event(in, outgoing, NULL, "CANCEL");
 				*digit = f->subclass.integer;
 				ast_frfree(f);
+				canceled_by_caller = 1;
+			}
+			/* When caller hung up or pressed * or digit. */
+			if (canceled_by_caller) {
+				publish_dial_end_event(in, outgoing, NULL, "CANCEL");
+				for (o = start; o; o = o->call_next) {
+					if (o->chan) {
+						ast_queue_log(qe->parent->name, ast_channel_uniqueid(qe->chan), o->member->membername, "RINGCANCELED", "%d", (int) ast_tvdiff_ms(ast_tvnow(), start_time_tv));
+					}
+				}
 				return NULL;
 			}