diff --git a/asterisk.c b/asterisk.c
index fc1d2363cca7cc89b803422c6bf8b3cea94dafd9..f84a738e4ba1a82703770a1241bc09c52f9c01c8 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -446,7 +446,7 @@ static void hup_handler(int num)
 	if (restartnow)
 		execvp(_argv[0], _argv);
 	/* XXX This could deadlock XXX */
-	ast_module_reload();
+	ast_module_reload(NULL);
 }
 
 static void child_handler(int sig)
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index cafe99e14d47e2c973586b5e47143e56a3e4723f..660c59c480447ebe655a961a46b18e18e1260cb5 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -6291,6 +6291,8 @@ static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch,
 #endif
 		if (!p->radio)
 		{
+			if (!p->sig || (p->sig == SIG_FXSLS))
+				return 1;
 			/* Check hook state */
 			if (p->subs[SUB_REAL].zfd > -1)
 				res = ioctl(p->subs[SUB_REAL].zfd, ZT_GET_PARAMS, &par);
@@ -6301,10 +6303,12 @@ static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch,
 			}
 			if (res) {
 				ast_log(LOG_WARNING, "Unable to check hook state on channel %d\n", p->channel);
-			} else if ((p->sig == SIG_FXSKS) || (p->sig == SIG_FXSLS) ||
-				(p->sig == SIG_FXSGS) || !p->sig) {
+			} else if ((p->sig == SIG_FXSKS) || (p->sig == SIG_FXSGS)) {
 				/* When "onhook" that means no battery on the line, and thus
-				  it is out of service... */
+				  it is out of service..., if it's on a TDM card... If it's a channel
+				  bank, there is no telling... */
+				if (par.rxbits > -1)
+					return 1;
 				if (par.rxisoffhook)
 					return 1;
 				else
diff --git a/cli.c b/cli.c
index 898c95555bba8b06aa3872cc9f88050e1da32913..0aaf0d2d65f374452712197898a5f7301ea4c25c 100755
--- a/cli.c
+++ b/cli.c
@@ -109,9 +109,14 @@ static int handle_load(int fd, int argc, char *argv[])
 
 static int handle_reload(int fd, int argc, char *argv[])
 {
-	if (argc != 1)
+	int x;
+	if (argc < 1)
 		return RESULT_SHOWUSAGE;
-	ast_module_reload();
+	if (argc > 1) { 
+		for (x=1;x<argc;x++) 
+			ast_module_reload(argv[x]);
+	} else
+		ast_module_reload(NULL);
 	return RESULT_SUCCESS;
 }
 
diff --git a/include/asterisk/module.h b/include/asterisk/module.h
index 83f44ebe9e1e9f0e399564da035237bd3bff7007..87aa590f91e21ffbc292a35acd718c784ff17c34 100755
--- a/include/asterisk/module.h
+++ b/include/asterisk/module.h
@@ -138,7 +138,7 @@ int ast_loader_unregister(int (*updater)(void));
  * This reloads all modules set to load in asterisk.  It does NOT run the unload
  * routine and then loads them again, it runs the given reload routine.
  */
-void ast_module_reload(void);
+void ast_module_reload(const char *name);
 
 int ast_register_atexit(void (*func)(void));
 void ast_unregister_atexit(void (*func)(void));
diff --git a/loader.c b/loader.c
index c6a0ca24de0ee64e8264f83b045f67ae12620284..d09514c813976881b8c8403c85c2121c87db529e 100755
--- a/loader.c
+++ b/loader.c
@@ -3,9 +3,9 @@
  *
  * Module Loader
  * 
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999-2004, Digium, Inc.
  *
- * Mark Spencer <markster@linux-support.net>
+ * Mark Spencer <markster@digium.com>
  *
  * This program is free software, distributed under the terms of
  * the GNU General Public License
@@ -147,7 +147,7 @@ int ast_unload_resource(char *resource_name, int force)
 	return res;
 }
 
-void ast_module_reload(void)
+void ast_module_reload(const char *name)
 {
 	struct module *m;
 
@@ -166,10 +166,12 @@ void ast_module_reload(void)
 	ast_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();
+		if (!name || !strcasecmp(name, m->resource)) {
+			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;
 	}