diff --git a/res/res_pjsip_transport_management.c b/res/res_pjsip_transport_management.c
index e4ade2b44ef3acf7f040795abcde8043fcd3aec5..8ba8c2da2615c0098c89c5a1537df630dd6a3ed9 100644
--- a/res/res_pjsip_transport_management.c
+++ b/res/res_pjsip_transport_management.c
@@ -24,6 +24,8 @@
 
 #include "asterisk.h"
 
+#include <signal.h>
+
 #include <pjsip.h>
 #include <pjsip_ua.h>
 
@@ -93,7 +95,7 @@ static void *keepalive_transport_thread(void *data)
 	/* Once loaded this module just keeps on going as it is unsafe to stop and change the underlying
 	 * callback for the transport manager.
 	 */
-	while (1) {
+	while (keepalive_interval) {
 		sleep(keepalive_interval);
 		ao2_callback(transports, OBJ_NODATA, keepalive_transport_cb, NULL);
 	}
@@ -347,7 +349,19 @@ static int load_module(void)
 
 static int unload_module(void)
 {
-	/* This will never get called */
+	pjsip_tpmgr *tpmgr = pjsip_endpt_get_tpmgr(ast_sip_get_pjsip_endpoint());
+
+	if (keepalive_interval) {
+		keepalive_interval = 0;
+		pthread_kill(keepalive_thread, SIGURG);
+		pthread_join(keepalive_thread, NULL);
+	}
+
+	ast_sched_context_destroy(sched);
+	ao2_ref(transports, -1);
+
+	ast_sip_unregister_service(&idle_monitor_module);
+	pjsip_tpmgr_set_state_cb(tpmgr, tpmgr_state_callback);
 	return 0;
 }