diff --git a/apps/app_queue.c b/apps/app_queue.c
index 084f25b..064b69b 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -1351,6 +1351,7 @@
 				<ref type="managerEvent">AgentRingNoAnswer</ref>
 				<ref type="managerEvent">AgentComplete</ref>
 				<ref type="managerEvent">AgentConnect</ref>
+				<ref type="managerEvent">AgentAbandoned</ref>
 			</see-also>
 		</managerEventInstance>
 	</managerEvent>
@@ -1434,6 +1435,23 @@
 			</see-also>
 		</managerEventInstance>
 	</managerEvent>
+	<managerEvent language="en_US" name="AgentAbandoned">
+		<managerEventInstance class="EVENT_FLAG_AGENT">
+			<synopsis>Raised when a caller leaves the queue while ringing at queue member(s)</synopsis>
+			<syntax>
+				<channel_snapshot/>
+				<channel_snapshot prefix="Dest"/>
+				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Queue'])" />
+				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='MemberName'])" />
+				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueMemberStatus']/managerEventInstance/syntax/parameter[@name='Interface'])" />
+				<xi:include xpointer="xpointer(/docs/managerEvent[@name='AgentRingNoAnswer']/managerEventInstance/syntax/parameter[@name='RingTime'])" />
+				<xi:include xpointer="xpointer(/docs/managerEvent[@name='QueueCallerAbandon']/managerEventInstance/syntax/parameter[@name='HoldTime'])" />
+			</syntax>
+			<see-also>
+				<ref type="managerEvent">AgentCalled</ref>
+			</see-also>
+		</managerEventInstance>
+	</managerEvent>
  ***/
 
 enum {
@@ -2268,6 +2286,11 @@
 	return queue_multi_channel_to_ami("AgentRingNoAnswer", message);
 }
 
+static struct ast_manager_event_blob *queue_agent_abandoned_to_ami(struct stasis_message *message)
+{
+	return queue_multi_channel_to_ami("AgentAbandoned", message);
+}
+
 STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_called_type,
 	.to_ami = queue_agent_called_to_ami,
 	);
@@ -2283,6 +2306,9 @@
 STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_ringnoanswer_type,
 	.to_ami = queue_agent_ringnoanswer_to_ami,
 	);
+STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_abandoned_type,
+	.to_ami = queue_agent_abandoned_to_ami,
+	);
 
 static void queue_publish_multi_channel_snapshot_blob(struct stasis_topic *topic,
 		struct ast_channel_snapshot *caller_snapshot,
@@ -5018,6 +5044,20 @@
 
 	ast_channel_publish_cached_blob(qe->chan, queue_caller_abandon_type(), blob);
 }
+static void record_agent_abandoned(int ringtime, struct queue_ent *qe, struct ast_channel *peer, char *interface, char *membername)
+{
+	RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
+
+	ast_verb(3, "Ringing agent %s abandoned by caller", membername);
+
+	blob = ast_json_pack("{s: s, s: s, s: s, s: I, s: I}",
+			     "Queue", qe->parent->name,
+			     "Interface", interface,
+			     "MemberName", membername,
+			     "HoldTime", (ast_json_int_t)(time(NULL) - qe->start),
+			     "RingTime", ringtime);
+	queue_publish_multi_channel_blob(qe->chan, peer, queue_agent_abandoned_type(), blob);
+}
 
 /*! \brief RNA == Ring No Answer. Common code that is executed when we try a queue member and they don't answer. */
 static void rna(int rnatime, struct queue_ent *qe, struct ast_channel *peer, char *interface, char *membername, int autopause)
@@ -5580,8 +5620,11 @@
 			/* When caller hung up or pressed * or digit. */
 			if (canceled_by_caller) {
 				publish_dial_end_event(in, outgoing, NULL, "CANCEL");
+				endtime = (long) time(NULL);
+				endtime -= starttime;
 				for (o = start; o; o = o->call_next) {
 					if (o->chan) {
+						record_agent_abandoned(endtime * 1000, qe, o->chan, o->member->interface, o->member->membername);
 						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));
 					}
 				}
@@ -11530,6 +11573,7 @@
 	STASIS_MESSAGE_TYPE_CLEANUP(queue_agent_complete_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(queue_agent_dump_type);
 	STASIS_MESSAGE_TYPE_CLEANUP(queue_agent_ringnoanswer_type);
+	STASIS_MESSAGE_TYPE_CLEANUP(queue_agent_abandoned_type);
 
 	ast_cli_unregister_multiple(cli_queue, ARRAY_LEN(cli_queue));
 	ast_manager_unregister("QueueStatus");
@@ -11724,6 +11768,7 @@
 	err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_complete_type);
 	err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_dump_type);
 	err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_ringnoanswer_type);
+	err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_abandoned_type);
 
 	if (err) {
 		unload_module();

