diff --git a/include/asterisk/module.h b/include/asterisk/module.h
index 9a8a7153cc12d7ee5f2a1020e044dcae8786446c..59689ba0b4cdc9d43b698718b067dd81cbbbd8f5 100755
--- a/include/asterisk/module.h
+++ b/include/asterisk/module.h
@@ -27,7 +27,7 @@ int usecount(void);			/* How many channels provided by this module are in use? *
 char *description(void);		/* Description of this module */
 char *key(void);		/* Return the below mentioned key, unmodified */
 
-int reload(void);
+int reload(void);		/* reload configs */
 
 #define ASTERISK_GPL_KEY \
 	"This paragraph is Copyright (C) 2000, Linux Support Services, Inc.  \
@@ -61,6 +61,9 @@ int ast_loader_register(int (*updater)(void));
 /* No longer run me when modules are updated */
 int ast_loader_unregister(int (*updater)(void));
 
+/* Reload all modules */
+void ast_module_reload(void);
+
 /* Local user routines keep track of which channels are using a given module resource.
    They can help make removing modules safer, particularly if they're in use at the time
    they have been requested to be removed */
diff --git a/loader.c b/loader.c
index b216a07bc97e2b8b75d2f1c0961709cf9fa492fd..8293993f36544a32e8963dba68d49421bdfd0e7a 100755
--- a/loader.c
+++ b/loader.c
@@ -20,6 +20,7 @@
 #include <asterisk/options.h>
 #include <asterisk/config.h>
 #include <asterisk/logger.h>
+#include <asterisk/channel.h>
 #include <dlfcn.h>
 #include <asterisk/md5.h>
 #define __USE_GNU
@@ -93,7 +94,7 @@ int ast_unload_resource(char *resource_name, int force)
 {
 	struct module *m, *ml = NULL;
 	int res = -1;
-	if (pthread_mutex_lock(&modlock))
+	if (ast_pthread_mutex_lock(&modlock))
 		ast_log(LOG_WARNING, "Failed to lock\n");
 	m = module_list;
 	while(m) {
@@ -103,7 +104,7 @@ int ast_unload_resource(char *resource_name, int force)
 					ast_log(LOG_WARNING, "Warning:  Forcing removal of module %s with use count %d\n", resource_name, res);
 				else {
 					ast_log(LOG_WARNING, "Soft unload failed, '%s' has use count %d\n", resource_name, res);
-					pthread_mutex_unlock(&modlock);
+					ast_pthread_mutex_unlock(&modlock);
 					return -1;
 				}
 			}
@@ -111,7 +112,7 @@ int ast_unload_resource(char *resource_name, int force)
 			if (res) {
 				ast_log(LOG_WARNING, "Firm unload failed for %s\n", resource_name);
 				if (force <= AST_FORCE_FIRM) {
-					pthread_mutex_unlock(&modlock);
+					ast_pthread_mutex_unlock(&modlock);
 					return -1;
 				} else
 					ast_log(LOG_WARNING, "** Dangerous **: Unloading resource anyway, at user request\n");
@@ -126,11 +127,27 @@ int ast_unload_resource(char *resource_name, int force)
 		ml = m;
 		m = m->next;
 	}
-	pthread_mutex_unlock(&modlock);
+	ast_pthread_mutex_unlock(&modlock);
 	ast_update_use_count();
 	return res;
 }
 
+void ast_module_reload(void)
+{
+	struct module *m;
+	ast_pthread_mutex_lock(&modlock);
+	m = module_list;
+	while(m) {
+		if (m->reload) {
+			if (option_verbose > 2) 
+				ast_verbose(VERBOSE_PREFIX_3 "Reloading module '%s' (%s)\n", m->resource, m->description());
+			m->reload();
+		}
+		m = m->next;
+	}
+	ast_pthread_mutex_unlock(&modlock);
+}
+
 int ast_load_resource(char *resource_name)
 {
 	static char fn[256];
@@ -154,13 +171,13 @@ int ast_load_resource(char *resource_name)
 		ast_destroy(cfg);
 	}
 	
-	if (pthread_mutex_lock(&modlock))
+	if (ast_pthread_mutex_lock(&modlock))
 		ast_log(LOG_WARNING, "Failed to lock\n");
 	m = module_list;
 	while(m) {
 		if (!strcasecmp(m->resource, resource_name)) {
 			ast_log(LOG_WARNING, "Module '%s' already exists\n", resource_name);
-			pthread_mutex_unlock(&modlock);
+			ast_pthread_mutex_unlock(&modlock);
 			return -1;
 		}
 		m = m->next;
@@ -168,7 +185,7 @@ int ast_load_resource(char *resource_name)
 	m = malloc(sizeof(struct module));	
 	if (!m) {
 		ast_log(LOG_WARNING, "Out of memory\n");
-		pthread_mutex_unlock(&modlock);
+		ast_pthread_mutex_unlock(&modlock);
 		return -1;
 	}
 	strncpy(m->resource, resource_name, sizeof(m->resource));
@@ -181,7 +198,7 @@ int ast_load_resource(char *resource_name)
 	if (!m->lib) {
 		ast_log(LOG_WARNING, "%s\n", dlerror());
 		free(m);
-		pthread_mutex_unlock(&modlock);
+		ast_pthread_mutex_unlock(&modlock);
 		return -1;
 	}
 	m->load_module = dlsym(m->lib, "load_module");
@@ -223,7 +240,7 @@ int ast_load_resource(char *resource_name)
 		ast_log(LOG_WARNING, "%d error(s) loading module %s, aborted\n", errors, fn);
 		dlclose(m->lib);
 		free(m);
-		pthread_mutex_unlock(&modlock);
+		ast_pthread_mutex_unlock(&modlock);
 		return -1;
 	}
 	if (!fully_booted) {
@@ -238,7 +255,7 @@ int ast_load_resource(char *resource_name)
 	m->next = module_list;
 	
 	module_list = m;
-	pthread_mutex_unlock(&modlock);
+	ast_pthread_mutex_unlock(&modlock);
 	if ((res = m->load_module())) {
 		ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, res);
 		ast_unload_resource(resource_name, 0);
@@ -251,7 +268,7 @@ int ast_load_resource(char *resource_name)
 static int ast_resource_exists(char *resource)
 {
 	struct module *m;
-	if (pthread_mutex_lock(&modlock))
+	if (ast_pthread_mutex_lock(&modlock))
 		ast_log(LOG_WARNING, "Failed to lock\n");
 	m = module_list;
 	while(m) {
@@ -259,7 +276,7 @@ static int ast_resource_exists(char *resource)
 			break;
 		m = m->next;
 	}
-	pthread_mutex_unlock(&modlock);
+	ast_pthread_mutex_unlock(&modlock);
 	if (m)
 		return -1;
 	else
@@ -352,14 +369,14 @@ void ast_update_use_count(void)
 	/* Notify any module monitors that the use count for a 
 	   resource has changed */
 	struct loadupdate *m;
-	if (pthread_mutex_lock(&modlock))
+	if (ast_pthread_mutex_lock(&modlock))
 		ast_log(LOG_WARNING, "Failed to lock\n");
 	m = updaters;
 	while(m) {
 		m->updater();
 		m = m->next;
 	}
-	pthread_mutex_unlock(&modlock);
+	ast_pthread_mutex_unlock(&modlock);
 	
 }
 
@@ -375,7 +392,7 @@ int ast_update_module_list(int (*modentry)(char *module, char *description, int
 		m = m->next;
 	}
 	if (unlock)
-		pthread_mutex_unlock(&modlock);
+		ast_pthread_mutex_unlock(&modlock);
 	return 0;
 }
 
@@ -385,11 +402,11 @@ int ast_loader_register(int (*v)(void))
 	/* XXX Should be more flexible here, taking > 1 verboser XXX */
 	if ((tmp = malloc(sizeof (struct loadupdate)))) {
 		tmp->updater = v;
-		if (pthread_mutex_lock(&modlock))
+		if (ast_pthread_mutex_lock(&modlock))
 			ast_log(LOG_WARNING, "Failed to lock\n");
 		tmp->next = updaters;
 		updaters = tmp;
-		pthread_mutex_unlock(&modlock);
+		ast_pthread_mutex_unlock(&modlock);
 		return 0;
 	}
 	return -1;
@@ -399,7 +416,7 @@ int ast_loader_unregister(int (*v)(void))
 {
 	int res = -1;
 	struct loadupdate *tmp, *tmpl=NULL;
-	if (pthread_mutex_lock(&modlock))
+	if (ast_pthread_mutex_lock(&modlock))
 		ast_log(LOG_WARNING, "Failed to lock\n");
 	tmp = updaters;
 	while(tmp) {
@@ -415,6 +432,6 @@ int ast_loader_unregister(int (*v)(void))
 	}
 	if (tmp)
 		res = 0;
-	pthread_mutex_unlock(&modlock);
+	ast_pthread_mutex_unlock(&modlock);
 	return res;
 }