diff --git a/res/res_smdi.c b/res/res_smdi.c
index c59bd4afa4dd702b8fc17ca7c5cf7b4926c6d85f..fcd715515581f7d95810a76b4f0eea1ea690f105 100644
--- a/res/res_smdi.c
+++ b/res/res_smdi.c
@@ -1389,37 +1389,37 @@ static struct ast_custom_function smdi_msg_function = {
 	.read = smdi_msg_read,
 };
 
-static int unload_module(void);
+static int _unload_module(int fromload);
 
 static int load_module(void)
 {
 	int res;
-	
+
 	/* initialize our containers */
 	memset(&smdi_ifaces, 0, sizeof(smdi_ifaces));
 	ASTOBJ_CONTAINER_INIT(&smdi_ifaces);
-	
+
 	ast_mutex_init(&mwi_monitor.lock);
 	ast_cond_init(&mwi_monitor.cond, NULL);
 
-	ast_custom_function_register(&smdi_msg_retrieve_function);
-	ast_custom_function_register(&smdi_msg_function);
-
 	/* load the config and start the listener threads*/
 	res = smdi_load(0);
 	if (res < 0) {
-		unload_module();
+		_unload_module(1);
 		return res;
 	} else if (res == 1) {
-		unload_module();
+		_unload_module(1);
 		ast_log(LOG_NOTICE, "No SMDI interfaces are available to listen on, not starting SMDI listener.\n");
 		return AST_MODULE_LOAD_DECLINE;
 	}
-	
+
+	ast_custom_function_register(&smdi_msg_retrieve_function);
+	ast_custom_function_register(&smdi_msg_function);
+
 	return AST_MODULE_LOAD_SUCCESS;
 }
 
-static int unload_module(void)
+static int _unload_module(int fromload)
 {
 	/* this destructor stops any running smdi_read threads */
 	ASTOBJ_CONTAINER_DESTROYALL(&smdi_ifaces, ast_smdi_interface_destroy);
@@ -1436,12 +1436,19 @@ static int unload_module(void)
 		pthread_join(mwi_monitor.thread, NULL);
 	}
 
-	ast_custom_function_unregister(&smdi_msg_retrieve_function);
-	ast_custom_function_unregister(&smdi_msg_function);
+	if (!fromload) {
+		ast_custom_function_unregister(&smdi_msg_retrieve_function);
+		ast_custom_function_unregister(&smdi_msg_function);
+	}
 
 	return 0;
 }
 
+static int unload_module(void)
+{
+	return _unload_module(0);
+}
+
 static int reload(void)
 {
 	int res;