diff -uNr sent-upstream/as-sent-last/include/config.h ircii-pana-1.0-0c15/include/config.h
--- sent-upstream/as-sent-last/include/config.h	Sat Jan  8 04:19:04 2000
+++ ircii-pana-1.0-0c15/include/config.h	Sun Jan  9 06:40:56 2000
@@ -571,7 +571,7 @@
 #define WANT_DETACH ON	/* this is here for the detach/re-attach code
 			   which is essentially a mini-screen */
 #define ALLOW_DETACH ON
-
+#define DEFAULT_DETACH_ON_HUP ON
 
 #undef OLD_RANDOM_BEHAVIOR   /* semi randomness for randm() */
 
diff -uNr sent-upstream/as-sent-last/include/modval.h ircii-pana-1.0-0c15/include/modval.h
--- sent-upstream/as-sent-last/include/modval.h	Tue Jan  4 01:54:48 2000
+++ ircii-pana-1.0-0c15/include/modval.h	Sun Jan  9 06:01:54 2000
@@ -306,6 +306,7 @@
 #define get_window_server(x) ((int) (global[GET_WINDOW_SERVER]((unsigned int)x)))
 #define set_window_server(x, y, z) ((void) (global[SET_WINDOW_SERVER]((int)x, (int)y, (int)z)))
 #define window_check_servers ((void (*)())global[WINDOW_CHECK_SERVERS])
+#define window_close_server ((void (*)(int))global[WINDOW_CHECK_SERVERS])
 #define change_window_server(x, y) ((void) (global[CHANGE_WINDOW_SERVER]((int)x, (int)y))) 
 #define set_level_by_refnum(x, y) ((void) (global[SET_LEVEL_BY_REFNUM]((unsigned int)x, (int)y)))
 #define message_to(x) ((void) (global[MESSAGE_TO]((unsigned int)x)))
diff -uNr sent-upstream/as-sent-last/include/struct.h ircii-pana-1.0-0c15/include/struct.h
--- sent-upstream/as-sent-last/include/struct.h	Tue Jan  4 02:27:26 2000
+++ ircii-pana-1.0-0c15/include/struct.h	Sun Jan  9 06:13:17 2000
@@ -593,6 +593,7 @@
 	unsigned int	refnum;		/* the unique reference number,
 					 * assigned by IRCII */
 	int	server;			/* server index */
+	int	last_server;		/* previous server index */
 	int	top;			/* The top line of the window, screen
 					 * coordinates */
 	int	bottom;			/* The botton line of the window, screen
diff -uNr sent-upstream/as-sent-last/include/vars.h ircii-pana-1.0-0c15/include/vars.h
--- sent-upstream/as-sent-last/include/vars.h	Tue Jan  4 02:27:26 2000
+++ ircii-pana-1.0-0c15/include/vars.h	Sun Jan  9 06:41:24 2000
@@ -103,6 +103,7 @@
 	DEOPFLOOD_TIME_VAR,
 	DEOP_ON_DEOPFLOOD_VAR,
 	DEOP_ON_KICKFLOOD_VAR,
+	DETACH_ON_HUP,
 	DISPATCH_UNKNOWN_COMMANDS_VAR,
 	DISPLAY_VAR ,
 	DISPLAY_ANSI_VAR,
diff -uNr sent-upstream/as-sent-last/include/window.h ircii-pana-1.0-0c15/include/window.h
--- sent-upstream/as-sent-last/include/window.h	Fri Oct 22 01:48:21 1999
+++ ircii-pana-1.0-0c15/include/window.h	Sun Jan  9 06:03:52 2000
@@ -31,6 +31,10 @@
 #define ON 1
 #define TOGGLE 2
 
+#define WINDOW_NO_SERVER	-1
+#define WINDOW_DLL		-2
+#define WINDOW_SERVER_CLOSED	-3
+
 	Window 	*new_window 			(struct ScreenStru *);
 	void	delete_window			(Window *);
 	void	add_to_invisible_list		(Window *);
@@ -71,7 +75,6 @@
 	char	*get_bound_channel		(Window *);
 	int	get_window_server		(unsigned);
 	void	set_window_server		(int, int, int);
-	void	window_check_servers		(void);
 	void	set_level_by_refnum		(unsigned, unsigned long);
 	void	message_to			(unsigned long);
 
@@ -145,6 +148,7 @@
 const	char	*query_host (void);
 const	char	*query_cmd (void);
 	void	window_check_servers(void);
+	void	window_close_server(int old_server);
 	void	window_change_server(int, int);
 	void	make_window_current_by_winref(int);
 	void	make_window_current_by_desc(char *);
diff -uNr sent-upstream/as-sent-last/source/commands.c ircii-pana-1.0-0c15/source/commands.c
--- sent-upstream/as-sent-last/source/commands.c	Tue Jan  4 01:43:35 2000
+++ ircii-pana-1.0-0c15/source/commands.c	Sun Jan  9 06:05:49 2000
@@ -1075,7 +1075,7 @@
 	set_server_reconnect(from_server, 1);
 	close_server(from_server,(args && *args) ? args : "Reconnecting");
 	clean_server_queues(from_server);
-	window_check_servers();
+	window_close_server(from_server);
 	servercmd(NULL, scommnd, empty_string, NULL);
 
 }
diff -uNr sent-upstream/as-sent-last/source/irc.c ircii-pana-1.0-0c15/source/irc.c
--- sent-upstream/as-sent-last/source/irc.c	Sat Jan  8 04:19:04 2000
+++ ircii-pana-1.0-0c15/source/irc.c	Sun Jan  9 06:49:38 2000
@@ -543,6 +543,14 @@
 	detachcmd(NULL, NULL, NULL, NULL);
 }
 
+void set_detach_on_hup(Window *dummy, char *unused, int value)
+{
+	if(value)
+		my_signal(SIGHUP, sig_detach, 0);
+	else
+		my_signal(SIGHUP, irc_exit_old, 0);
+}
+
 /* shows the version of irc */
 static	void versionreply(void)
 {
@@ -1506,7 +1514,7 @@
 #endif
 	my_signal(SIGQUIT, SIG_IGN, 0);
 #ifdef WANT_DETACH
-	my_signal(SIGHUP, sig_detach, 0);
+	set_detach_on_hup(NULL, NULL, DEFAULT_DETACH_ON_HUP);
 #else
 	my_signal(SIGHUP, irc_exit_old, 0);
 #endif
diff -uNr sent-upstream/as-sent-last/source/numbers.c ircii-pana-1.0-0c15/source/numbers.c
--- sent-upstream/as-sent-last/source/numbers.c	Sat Jan  1 19:24:50 2000
+++ ircii-pana-1.0-0c15/source/numbers.c	Sun Jan  9 06:06:34 2000
@@ -1105,7 +1105,7 @@
 		if (do_hook(current_numeric, "%s %s", from, *ArgList))
 			display_msg(from, ArgList);
 		close_server(from_server, empty_string);
-		window_check_servers();
+		window_close_server(from_server);
 		if (from_server == primary_server)
 			get_connected(from_server + 1, from_server);
 		break;
@@ -1149,7 +1149,7 @@
 			display_msg(from, ArgList);
 				
 		close_server(from_server, empty_string);
-		window_check_servers();
+		window_close_server(from_server);
 		if (server_list_size() > 1)
 			remove_from_server_list(klined);
 		if (klined == primary_server && (server_list_size() > 0))
diff -uNr sent-upstream/as-sent-last/source/parse.c ircii-pana-1.0-0c15/source/parse.c
--- sent-upstream/as-sent-last/source/parse.c	Tue Jan  4 02:30:07 2000
+++ ircii-pana-1.0-0c15/source/parse.c	Sun Jan  9 06:06:48 2000
@@ -1166,7 +1166,7 @@
 
 	close_server(from_server,empty_string);
 	clean_server_queues(from_server);
-	window_check_servers();
+	window_close_server(from_server);
 	set_input_prompt(current_window, get_string_var(INPUT_PROMPT_VAR), 0);
 	if (strchr(from, '.'))
         {
diff -uNr sent-upstream/as-sent-last/source/server.c ircii-pana-1.0-0c15/source/server.c
--- sent-upstream/as-sent-last/source/server.c	Tue Jan  4 01:43:35 2000
+++ ircii-pana-1.0-0c15/source/server.c	Sun Jan  9 06:25:16 2000
@@ -257,6 +257,7 @@
 						times = 1;
 						i++;
 					}
+					window_close_server(i);
 					get_connected(i, old_serv);
 					break;
 				}
@@ -1162,7 +1163,7 @@
 			    return;
 			}
 			close_server(i, "closing server");
-			window_check_servers();
+			window_close_server(i);
 		}
 		else
 			get_connected(from_server - 1, from_server);
@@ -2100,6 +2101,7 @@
 		clear_channel_list(i);
 		close_server(i, message);
 		server_list[i].eof = 1;
+		window_close_server(i);
 	}
 done:
 	window_check_servers();
diff -uNr sent-upstream/as-sent-last/source/vars.c ircii-pana-1.0-0c15/source/vars.c
--- sent-upstream/as-sent-last/source/vars.c	Tue Jan  4 02:27:26 2000
+++ ircii-pana-1.0-0c15/source/vars.c	Sun Jan  9 06:52:18 2000
@@ -95,6 +95,8 @@
 static	void	set_nat_address (Window *, char *, int);
 extern	void	debug_window (Window *, char *, int);
 	
+extern	void	set_detach_on_hup (Window *, char *, int);
+
 /*
  * irc_variable: all the irc variables used.  Note that the integer and
  * boolean defaults are set here, which the string default value are set in
@@ -199,6 +201,7 @@
 	{ "DEOPFLOOD_TIME",0,		INT_TYPE_VAR,	DEFAULT_DEOPFLOOD_TIME, NULL, NULL, 0, VIF_BITCHX },
 	{ "DEOP_ON_DEOPFLOOD",0,	INT_TYPE_VAR,	DEFAULT_DEOP_ON_DEOPFLOOD, NULL, NULL, 0, VIF_BITCHX },
 	{ "DEOP_ON_KICKFLOOD",0,	INT_TYPE_VAR,	DEFAULT_DEOP_ON_KICKFLOOD, NULL, NULL, 0, VIF_BITCHX },
+	{ "DETACH_ON_HUP",0,		BOOL_TYPE_VAR,	DEFAULT_DETACH_ON_HUP, NULL, set_detach_on_hup, 0, 0 },
 	{ "DISPATCH_UNKNOWN_COMMANDS",0,BOOL_TYPE_VAR,	DEFAULT_DISPATCH_UNKNOWN_COMMANDS, NULL, NULL, 0, 0 },
 	{ "DISPLAY",0,			BOOL_TYPE_VAR,	DEFAULT_DISPLAY, NULL, NULL, 0, 0 },
 	{ "DISPLAY_ANSI",0,		BOOL_TYPE_VAR,	DEFAULT_DISPLAY_ANSI, NULL, toggle_reverse_status, 0, 0 },
diff -uNr sent-upstream/as-sent-last/source/window.c ircii-pana-1.0-0c15/source/window.c
--- sent-upstream/as-sent-last/source/window.c	Tue Jan  4 02:27:26 2000
+++ ircii-pana-1.0-0c15/source/window.c	Sun Jan  9 06:18:15 2000
@@ -1784,7 +1784,7 @@
 		if ((window = get_window_by_refnum(refnum)) == NULL)
 			window = current_window;
 		old = window->server;
-		if (misc)
+		if (misc || old == WINDOW_SERVER_CLOSED)
 		{
 			while ((traverse_all_windows(&tmp)))
 			{
@@ -1850,6 +1850,30 @@
 	}
 	update_all_status(current_window, NULL, 0);
 	cursor_to_input();
+}
+
+/*
+ * window_close_server: this is like window_check_servers but it gets called
+ * with old_server as the refnum of a server that just got closed.  It marks
+ * every window that used to be connected to old_server as WINDOW_SERVER_CLOSED
+ * and sets last_server for those windows.  It doesn't touch windows that
+ * already had no server.
+ */
+
+void window_close_server(int old_server)
+{
+	Window	*tmp;
+	int	cnt, max, i, not_connected, prime = -1;
+
+	tmp = NULL;
+	while ((traverse_all_windows(&tmp)))
+	{
+		if (tmp->server == old_server)
+		{
+			tmp->server = WINDOW_SERVER_CLOSED;
+			tmp->last_server = old_server;
+		}
+	}
 }
 
 /*
