diff --git a/src/nano.c b/src/nano.c
index 3045cd1fbe35bb11f35d7f663f5dceb799de1338..8339f7193291849cb5d252537619f522559f9bd6 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -686,28 +686,37 @@ void die_save_file(const char *die_filename, struct stat *die_stat)
     free(targetname);
 }
 
-#define TOP_ROWS    (ISSET(MORE_SPACE) ? 1 : 2)
-#define BOTTOM_ROWS    (ISSET(NO_HELP) ? 1 : 3)
-
 /* Initialize the three window portions nano uses. */
 void window_init(void)
 {
     /* First delete existing windows, in case of resizing. */
     delwin(topwin);
+    topwin = NULL;
     delwin(edit);
     delwin(bottomwin);
 
-    /* Compute how many lines the edit subwindow will have. */
-    editwinrows = LINES - TOP_ROWS - BOTTOM_ROWS;
+    /* If the terminal is very flat, don't set up a titlebar. */
+    if (LINES < 3) {
+	editwinrows = 1;
+	/* Set up two subwindows.  If the terminal is just one line,
+	 * edit window and statusbar window will cover each other. */
+	edit = newwin(1, COLS, 0, 0);
+	bottomwin = newwin(1, COLS, LINES - 1, 0);
+    } else {
+	int toprows = (ISSET(MORE_SPACE) ? 1 : (LINES < 6) ? 1 : 2);
+	int bottomrows = (ISSET(NO_HELP) ? 1 : (LINES < 5) ? 1 : 3);
+
+	editwinrows = LINES - toprows - bottomrows;
 
-    /* If there is no room to show anything, give up. */
-    if (editwinrows <= 0)
-	die(_("Window size is too small for nano...\n"));
+	/* Set up the normal three subwindows. */
+	topwin = newwin(toprows, COLS, 0, 0);
+	edit = newwin(editwinrows, COLS, toprows, 0);
+	bottomwin = newwin(bottomrows, COLS, toprows + editwinrows, 0);
+    }
 
-    /* Set up the windows. */
-    topwin = newwin(TOP_ROWS, COLS, 0, 0);
-    edit = newwin(editwinrows, COLS, TOP_ROWS, 0);
-    bottomwin = newwin(BOTTOM_ROWS, COLS, TOP_ROWS + editwinrows, 0);
+    /* In case the terminal shrunk, make sure the status line is clear. */
+    blank_statusbar();
+    wnoutrefresh(bottomwin);
 
     /* Turn the keypad on for the windows, if necessary. */
     if (!ISSET(REBIND_KEYPAD)) {
diff --git a/src/winio.c b/src/winio.c
index faf69b34e27400bdc063d854787d073d3faed618..13ae8ca170b608c92c9abb963d854cbdda3bb131 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -1639,7 +1639,7 @@ void blank_statusbar(void)
  * portion of the window. */
 void blank_bottombars(void)
 {
-    if (!ISSET(NO_HELP)) {
+    if (!ISSET(NO_HELP) && LINES > 4) {
 	blank_line(bottomwin, 1, 0, COLS);
 	blank_line(bottomwin, 2, 0, COLS);
     }
@@ -1665,6 +1665,10 @@ void check_statusblank(void)
 	reset_cursor();
 	wnoutrefresh(edit);
     }
+
+    /* If the subwindows overlap, make sure to show the edit window now. */
+    if (LINES == 1)
+	edit_refresh();
 }
 
 /* Convert buf into a string that can be displayed on screen.  The
@@ -1840,6 +1844,10 @@ void titlebar(const char *path)
     char *fragment;
 	/* The tail part of the pathname when dottified. */
 
+    /* If the screen is too small, there is no titlebar. */
+    if (topwin == NULL)
+	return;
+
     assert(path != NULL || openfile->filename != NULL);
 
     wattron(topwin, interface_color_pair[TITLE_BAR]);
@@ -2033,7 +2041,7 @@ void bottombars(int menu)
     /* Set the global variable to the given menu. */
     currmenu = menu;
 
-    if (ISSET(NO_HELP))
+    if (ISSET(NO_HELP) || LINES < 5)
 	return;
 
     if (menu == MMAIN) {