diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c
index 79ea24a6..e796d78d 100644
--- a/cmd-kill-pane.c
+++ b/cmd-kill-pane.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-kill-pane.c,v 1.8 2009-07-14 06:43:32 nicm Exp $ */
+/* $Id: cmd-kill-pane.c,v 1.9 2009-07-18 11:07:14 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -61,8 +61,9 @@ cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 	}
 
 	if (window_count_panes(wl->window) == 1) {
-		ctx->error(ctx, "can't kill pane: %d", data->pane);
-		return (-1);
+		/* Only one pane, kill the window. */
+		server_kill_window(wl->window);
+		return (0);
 	}
 
 	window_remove_pane(wl->window, wp);
diff --git a/cmd-kill-window.c b/cmd-kill-window.c
index 397ffff9..6f467713 100644
--- a/cmd-kill-window.c
+++ b/cmd-kill-window.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-kill-window.c,v 1.17 2009-07-15 17:45:09 nicm Exp $ */
+/* $Id: cmd-kill-window.c,v 1.18 2009-07-18 11:07:14 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -44,37 +44,11 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 {
 	struct cmd_target_data	*data = self->data;
 	struct winlink		*wl;
-	struct window		*w;
-	struct session		*s;
-	struct client		*c;
-	u_int		 	 i, j;
-	int		 	 destroyed;
 
 	if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
 		return (-1);
-	w = wl->window;
 
-	for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
-		s = ARRAY_ITEM(&sessions, i);
-		if (s == NULL || !session_has(s, w))
-			continue;
-		if ((wl = winlink_find_by_window(&s->windows, w)) == NULL)
-			continue;
-
-		destroyed = session_detach(s, wl);
-		for (j = 0; j < ARRAY_LENGTH(&clients); j++) {
-			c = ARRAY_ITEM(&clients, j);
-			if (c == NULL || c->session != s)
-				continue;
-
-			if (destroyed) {
-				c->session = NULL;
-				server_write_client(c, MSG_EXIT, NULL, 0);
-			} else
-				server_redraw_client(c);
-		}
-	}
-	recalculate_sizes();
+	server_kill_window(wl->window);
 
 	return (0);
 }
diff --git a/server-fn.c b/server-fn.c
index 67910dee..f1986cae 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -1,4 +1,4 @@
-/* $Id: server-fn.c,v 1.74 2009-07-17 12:12:54 nicm Exp $ */
+/* $Id: server-fn.c,v 1.75 2009-07-18 11:07:14 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -228,3 +228,36 @@ wrong:
 
 	return (-1);
 }
+
+void
+server_kill_window(struct window *w)
+{
+	struct session	*s;
+	struct winlink	*wl;
+	struct client	*c;
+	u_int		 i, j;
+	int		 destroyed;
+
+	
+	for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
+		s = ARRAY_ITEM(&sessions, i);
+		if (s == NULL || !session_has(s, w))
+			continue;
+		if ((wl = winlink_find_by_window(&s->windows, w)) == NULL)
+			continue;
+		
+		destroyed = session_detach(s, wl);
+		for (j = 0; j < ARRAY_LENGTH(&clients); j++) {
+			c = ARRAY_ITEM(&clients, j);
+			if (c == NULL || c->session != s)
+				continue;
+			
+			if (destroyed) {
+				c->session = NULL;
+				server_write_client(c, MSG_EXIT, NULL, 0);
+			} else
+				server_redraw_client(c);
+		}
+	}
+	recalculate_sizes();
+}
diff --git a/tmux.1 b/tmux.1
index c749f199..897112c8 100644
--- a/tmux.1
+++ b/tmux.1
@@ -1,4 +1,4 @@
-.\" $Id: tmux.1,v 1.120 2009-07-18 11:06:09 nicm Exp $
+.\" $Id: tmux.1,v 1.121 2009-07-18 11:07:14 nicm Exp $
 .\"
 .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 .\"
@@ -768,6 +768,7 @@ returns success.
 .Xc
 .D1 (alias: Ic killp )
 Destroy the given pane.
+If no panes remain in the containing window, it is also destroyed.
 .It Xo Ic kill-server
 .Xc
 Kill the
diff --git a/tmux.h b/tmux.h
index 3c67285b..d67e9e5e 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1,4 +1,4 @@
-/* $Id: tmux.h,v 1.370 2009-07-18 11:06:09 nicm Exp $ */
+/* $Id: tmux.h,v 1.371 2009-07-18 11:07:14 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1283,6 +1283,7 @@ void	 server_redraw_window(struct window *);
 void	 server_status_window(struct window *);
 void	 server_lock(void);
 int	 server_unlock(const char *);
+void	 server_kill_window(struct window *);
 
 /* status.c */
 int	 status_redraw(struct client *);