diff --git a/res/res_pjsip/pjsip_transport_events.c b/res/res_pjsip/pjsip_transport_events.c
index c6c5d21af3..aa575b7d58 100644
--- a/res/res_pjsip/pjsip_transport_events.c
+++ b/res/res_pjsip/pjsip_transport_events.c
@@ -138,27 +138,36 @@ static void transport_monitor_dtor(void *vdoomed)
  */
 static void transport_state_do_reg_callbacks(struct ao2_container *transports, pjsip_transport *transport)
 {
+	struct ao2_iterator *monitor_iter;
 	struct transport_monitor *monitored;
 	char key[IP6ADDR_COLON_PORT_BUFLEN];
+	int idx;
 
 	AST_SIP_MAKE_REMOTE_IPADDR_PORT_STR(transport, key);
 
-	monitored = ao2_find(transports, key, OBJ_SEARCH_KEY | OBJ_UNLINK);
-	if (monitored) {
-		int idx;
-
-		for (idx = AST_VECTOR_SIZE(&monitored->monitors); idx--;) {
-			struct transport_monitor_notifier *notifier;
-
-			notifier = AST_VECTOR_GET_ADDR(&monitored->monitors, idx);
-			ast_debug(3, "Transport %s(%s,%s) RefCnt: %ld : running callback %p(%p)\n",
-				monitored->key, monitored->transport->obj_name,
-				monitored->transport->type_name,
-				pj_atomic_get(monitored->transport->ref_cnt), notifier->cb, notifier->data);
-			notifier->cb(notifier->data);
+	monitor_iter = ao2_find(transports, key, OBJ_SEARCH_KEY | OBJ_MULTIPLE);
+	while ((monitored = ao2_iterator_next(monitor_iter))) {
+		if (monitored->transport == transport) {
+			ao2_unlink(transports, monitored);
+			for (idx = AST_VECTOR_SIZE(&monitored->monitors); idx--;) {
+				struct transport_monitor_notifier *notifier;
+
+				notifier = AST_VECTOR_GET_ADDR(&monitored->monitors, idx);
+				ast_debug(3, "Transport %s(%s,%s) RefCnt: %ld : running callback %p(%p)\n",
+						monitored->key, monitored->transport->obj_name,
+						monitored->transport->type_name,
+						pj_atomic_get(monitored->transport->ref_cnt), notifier->cb, notifier->data);
+				notifier->cb(notifier->data);
+			}
+		} else {
+			ast_debug(3, "Transport %s(%s,%s) RefCnt: %ld : ignored not matching %s\n",
+					monitored->key, monitored->transport->obj_name,
+					monitored->transport->type_name,
+					pj_atomic_get(monitored->transport->ref_cnt), transport->obj_name);
 		}
 		ao2_ref(monitored, -1);
 	}
+	ao2_iterator_destroy(monitor_iter);
 }
 
 static void verify_log_result(int log_level, const pjsip_transport *transport,
diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c
index 59a9fde5a5..b81057f083 100644
--- a/res/res_pjsip_outbound_registration.c
+++ b/res/res_pjsip_outbound_registration.c
@@ -1145,6 +1145,7 @@ static int monitor_matcher(void *a, void *b)
 static void registration_transport_monitor_setup(const char *transport_key, const char *registration_name)
 {
 	char *monitor;
+	enum ast_transport_monitor_reg monitor_res;
 
 	monitor = ao2_alloc_options(strlen(registration_name) + 1, NULL,
 		AO2_ALLOC_OPT_LOCK_NOLOCK);
@@ -1158,8 +1159,10 @@ static void registration_transport_monitor_setup(const char *transport_key, cons
 	 * register the monitor.  We might get into a message spamming infinite
 	 * loop of registration, shutdown, reregistration...
 	 */
-	ast_sip_transport_monitor_register_replace_key(transport_key, registration_transport_shutdown_cb,
-		monitor, monitor_matcher);
+	if((monitor_res = ast_sip_transport_monitor_register_replace_key(transport_key, registration_transport_shutdown_cb,
+		monitor, monitor_matcher))) {
+		ast_log(LOG_NOTICE, "Failed to register transport monitor for regisration %s: %d\n", registration_name, monitor_res);
+	}
 	ao2_ref(monitor, -1);
 }