diff -uNr tmux-1.1/layout-set.c tmux-1.1.lbedford/layout-set.c
--- tmux-1.1/layout-set.c	2009-08-19 15:47:14.000000000 +0200
+++ tmux-1.1.lbedford/layout-set.c	2010-02-03 01:18:23.000000000 +0100
@@ -31,6 +31,7 @@
 void	layout_set_even_v(struct window *);
 void	layout_set_main_h(struct window *);
 void	layout_set_main_v(struct window *);
+void	layout_set_tiled(struct window *);
 
 const struct {
 	const char	*name;
@@ -40,6 +41,7 @@
 	{ "even-vertical", layout_set_even_v },
 	{ "main-horizontal", layout_set_main_h },
 	{ "main-vertical", layout_set_main_v },
+	{ "tiled", layout_set_tiled },
 };
 
 const char *
@@ -443,3 +445,94 @@
 
 	server_redraw_window(w);
 }
+
+void
+layout_set_tiled(struct window *w)
+{
+	struct window_pane	*wp;
+	struct layout_cell	*lc, *lcmain, *lcrow, *lcchild;
+	u_int			 n, mainheight, width, height, used;
+	u_int			 i, j, columns, rows, totalrows;
+
+	layout_print_cell(w->layout_root, __func__, 1);
+
+	/* Get number of panes. */
+	n = window_count_panes(w);
+	if (n <= 1)
+		return;
+	/* How many rows and columns will be needed? */
+	/* start with 2 rows */
+	rows = 2;
+	columns = (w->sx / (PANE_MINIMUM + 1)) / 2;	/* maximum columns */
+
+	/* should make this cleverer. it will currently try to make as
+	 * many columns as possible before adding another row */
+	while (n / rows > columns) {
+		rows++;
+	}
+	columns = 1 + (n - 1) / rows;
+	width = w->sx / columns;
+
+	height = w->sy / rows;
+
+	/* Free old tree and create a new root. */
+	layout_free(w);
+	lc = w->layout_root = layout_create_cell(NULL);
+	layout_set_size(lc, width * columns, height * rows, 0, 0);
+	layout_make_node(lc, LAYOUT_TOPBOTTOM);
+
+	/* Create a grid of the cells. */
+	wp = TAILQ_FIRST(&w->panes);
+	for (j = 0; j < rows; j++) {
+
+		/* Create the new row. */
+		lcrow = layout_create_cell(lc);
+		layout_set_size(lcrow, w->sx, height - 1, 0, 0);
+		TAILQ_INSERT_TAIL(&lc->cells, lcrow, entry);
+
+		/* If only one column, just use the row directly. */
+		if (n - (j * columns) == 1) {
+			layout_make_leaf(lcrow, wp);
+			wp = TAILQ_NEXT(wp, entry);
+			continue;
+		}
+
+ 		/* Add in the columns. */
+		layout_make_node(lcrow, LAYOUT_LEFTRIGHT);
+		for (i = 0; i < columns; i++) {
+			/* Create and add a pane cell. */
+			lcchild = layout_create_cell(lcrow);
+			layout_set_size(lcchild, width - 1, height - 1, 0, 0);
+			layout_make_leaf(lcchild, wp);
+			TAILQ_INSERT_TAIL(&lcrow->cells, lcchild, entry);
+
+			/* Move to the next cell. */
+			if ((wp = TAILQ_NEXT(wp, entry)) == NULL)
+				break;
+		}
+
+		/* Adjust the row to fit the full width if necessary. */
+		if (i == columns)
+			i--;
+ 		used = ((i + 1) * width) - 1;
+ 		if (w->sx <= used)
+ 			continue;
+ 		lcchild = TAILQ_LAST(&lcrow->cells, layout_cells);
+ 		layout_resize_adjust(lcchild, LAYOUT_LEFTRIGHT, w->sx - used);
+	}
+
+	/* Adjust the last row height to fit if necessary. */
+	used = (rows * height) - 1;
+	if (w->sy > used) {
+		lcrow = TAILQ_LAST(&lc->cells, layout_cells);
+		layout_resize_adjust(lcrow, LAYOUT_TOPBOTTOM, w->sy - used);
+	}
+
+	/* Fix cell offsets. */
+	layout_fix_offsets(lc);
+	layout_fix_panes(w, w->sx, w->sy);
+
+	layout_print_cell(w->layout_root, __func__, 1);
+
+	server_redraw_window(w);
+}
