diff --git a/ChangeLog b/ChangeLog
index 6e4828ccca0caf7092a04991db9c71ae8b6f2e0f..7ba928b6296c529dd0fd83f6e1ef73149016bdab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,11 +3,88 @@ CVS Code -
 	- Translation updates (see po/ChangeLog for details).
 	- Upgraded to gettext 0.11.2 (Jordi).
 	  Removed intl/ entirely, and a few more tweaks by gettextize.
+	- i18nized a few strings used in DEBUG mode. (DLR)
+	- Some chars being assigned 0 are now assigned '\0'. (DLR)
+	- Put header files in a more consistent order. (DLR)
+	- Remove some unneeded blank lines and spaces, and make some
+	  spacing more consistent. (DLR)
+	- When possible, use iscntrl() to determine whether a character
+	  is a control character or not. (DLR)
+	- Miscellaneous typo fixes. (DLR)
+- files.c:
+  read_file(), read_line():
+	- Rework to properly handle nulls in the input file, fix
+	  detection of binary files to properly mark a file as binary if
+	  the only binary characters it contains are ASCII 127's, and
+	  after reading the last line of a file that doesn't end in a
+	  newline, increment totsize.  Remove previous kludge to set
+	  totsize properly. (DLR)
+  write_file():
+	- Rework to properly handle nulls in the input file.  When
+	  appending/prepending, don't change the current file's name to
+	  the name of the file it's being appended/prepended to.  When
+	  writing a marked selection to a file, save and restore totsize
+	  so it isn't decreased by the size of the selection afterward.
+	  (DLR)
+  append_slash_if_dir(), input_tab():
+	- Changed a variable name: lastWasTab -> lastwastab. (DLR)
 - global.c:
   shortcut_init()
 	- Rework IFHELP macro (David Benbennick).
+- move.c:
+  page_down(), page_up():
+	- Put sanity checks for current_x back in, to avoid rare
+	  segfaults (oops). Now, however, they are only called when
+	  placewewant is zero instead of being called unconditionally;
+	  see changes to winio.c:actual_x_from_start() below. (DLR)
 - nanorc.sample:
 	- Put in much less crappy example regex rules for c-file.
+- nano.c:
+  clear_filename():
+	- Remove this function, as it has unneeded functionality, is
+	  short enough to be inlined, and is only called in two spots
+	  anyway. (DLR)
+  do_int_spell(), do_alt_spell():
+	- Rework to save the marked selection before doing spell checking
+	  and restore it afterward. (DLR)
+  main():
+	- Rework to blank out filename manually before doing anything
+	  with it, instead of calling clear_filename() in two places.
+	  Make startline an int instead of a long, since it's supposed to
+	  hold a line number. (DLR)
+- search.c:
+  findnextstr():
+	- Update the current line at current_x if we don't find a match.
+	  (DLR)
+  do_gotopos():
+	- Simplify the sanity check to only put x within the range of the
+	  current line; don't call actual_x() anymore. (DLR)
+- utils.c:
+	- Add sunder() and unsunder().  These functions convert nulls
+	  other than the terminating null in strings to newlines and
+	  back; they're used to handle null characters in files properly.
+	  (DLR)
+- winio.c:
+  actual_x_from_start():
+	- Overhaul to make cursor placement more like that of Pico: add
+	  sanity check for i, and then place i as close to the value of
+	  xplus column as possible.  This change is most noticeable when
+	  moving down through binary files. (DLR)
+  nanogetstr():
+	- After the user presses Enter at the prompt, refresh the edit
+	  window in case there's a list of possible filename matches
+	  (left over from attempted tab completion) on it. (DLR)
+  update_line():
+	- When marking control characters, make sure the mark moves
+	  forward by two characters inctead of one.  Rework control
+	  character display routine to display newlines within the line
+	  (which should never occur under normal circumstances; they will
+	  only be there if the line had nulls in it and was unsunder()ed
+	  beforehand) as ^@'s. (DLR)
+  do_help():
+	- Add support for the handled keyboard escape sequences in the
+	  help menu, as they are needed with some terminals (e.g. xterm
+	  with TERM=ansi). (DLR)
 - THANKS:
 	- Completed a bit (Jordi).
 GNU nano 1.1.9 - 05/12/2002
@@ -88,7 +165,7 @@ GNU nano 1.1.9 - 05/12/2002
 	  (David Lawrence Ramsey).
 - winio.c:
   edit_add()
-	- Changed some syntax hilight computations for the sake of COLS.
+	- Changed some syntax highlight computations for the sake of COLS.
 	- Add in the necessary regfree() calls to stop nano from leaking
 	  memory like a sieve when using color syntax highlighting :-)
   botombars(), onekey()
diff --git a/TODO b/TODO
index a05cf5cb00f808fdb9c5097d3acacec36a9c86de..204be3987856ce359b114368a1c3370dbfd3fb73 100644
--- a/TODO
+++ b/TODO
@@ -19,7 +19,6 @@ For version 1.4:
 - UTF-8 support.
 - Undo/Redo key?
 
-
 Old requests:
 
 For version 1.0:
diff --git a/acconfig.h b/acconfig.h
index 32dba2f37b18945d109c0a4e0ec09c3964f6e69d..ee7cc78d2b81b1edb194633c77e1b67c86a78b88 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -66,7 +66,7 @@
 /* Define this if your curses library has the use_default_colors command */
 #undef HAVE_USE_DEFAULT_COLORS
 
-/* Define this to have syntax hilighting, requires ENABLE_NANORC too! */
+/* Define this to have syntax highlighting, requires ENABLE_NANORC too! */
 #undef ENABLE_COLOR
 
 /* Define this to enable undoing....something */
diff --git a/color.c b/color.c
index 6edcb5570f0c88e8abc4e4386d5cc2a6a3929811..7471f491fcf3269d877fd633ccbde90dff41bb1a 100644
--- a/color.c
+++ b/color.c
@@ -43,7 +43,7 @@
 void color_on(WINDOW *win, int whatever)
 {
     /* Temporary fallback, if the color value hasn't been set, 
-	turn on hilighting */
+       turn on highlighting */
     if (!colors[whatever - FIRST_COLORNUM].set) {
 	wattron(win, A_REVERSE);
 	return;
@@ -78,7 +78,6 @@ void color_off(WINDOW *win, int whatever)
         wattroff(win, A_BOLD);
 }
 
-
 void colorinit_one(int colortoset, short fg, short bg, int bold)
 {
     colors[colortoset - FIRST_COLORNUM].fg = fg;
@@ -135,7 +134,7 @@ int do_colorinit(void)
 		init_pair(i, tmpcolor->fg, tmpcolor->bg);
 
 #ifdef DEBUG
-	    fprintf(stderr, "Running init_pair with fg = %d and bg = %d\n", tmpcolor->fg, tmpcolor->bg);
+	    fprintf(stderr, _("Running init_pair with fg = %d and bg = %d\n"), tmpcolor->fg, tmpcolor->bg);
 #endif
 
 	    tmpcolor->pairnum = i;
@@ -209,4 +208,3 @@ void update_color(void)
 }
 
 #endif /* ENABLE_COLOR */
-
diff --git a/cut.c b/cut.c
index 2250776e6f105acb20efd8573900928274684d7a..a8161a05329db7bbe177ffd6feec98be84e5da51 100644
--- a/cut.c
+++ b/cut.c
@@ -94,7 +94,7 @@ void cut_marked_segment(filestruct * top, int top_x, filestruct * bot,
 	    current_x = top_x;
 	    update_cursor();
 	}
-	tmpstr[newsize - 1] = 0;
+	tmpstr[newsize - 1] = '\0';
 	tmp->data = tmpstr;
 	add_to_cutbuffer(tmp);
 	dump_buffer(cutbuffer);
@@ -233,7 +233,7 @@ int do_cut_text(void)
 		junk = NULL;
 		junk = make_new_node(current);
 	        junk->data = charalloc(1);
-		junk->data[0] = 0;
+		junk->data[0] = '\0';
 
 		add_to_cutbuffer(junk);
 		dump_buffer(cutbuffer);
diff --git a/faq.html b/faq.html
index 1732376ef51c5dbb7adcb772438e688e9be6b7ce..8767c28011c46c88e002f143fb87eb4e0862d4c2 100644
--- a/faq.html
+++ b/faq.html
@@ -342,7 +342,7 @@ install</b>.</font></blockquote>
 'gettext' and/or 'gettextdomain'.&nbsp; What can I do about it?</font></h2>
 
 <blockquote><font color="#330000">Try doing a <b>./configure --with-included-gettext</b>
-and see if that solves your problem.&nbsp; You make need to do a <b>make
+and see if that solves your problem.&nbsp; You may need to do a <b>make
 clean ; make</b> to get it to work fully.</font></blockquote>
 
 <h2>
@@ -694,6 +694,7 @@ and you should know the answer.</font></blockquote>
 <a NAME="8"></a><font color="#330000">8. ChangeLog</font>
 </h2>
 
+<blockquote>2002/05/15 - Typo fix (DLR).</blockquote>
 <blockquote>2001/12/26 - Misc. fixes (Aaron S. Hawley, DLR).</blockquote>
 <blockquote>2001/10/02 - Update for Free Translation Project.</blockquote>
 <blockquote>2001/10/02 - Assorted fixes, Debian additions.</blockquote>
diff --git a/files.c b/files.c
index d9599b04043d77dd363a896bb01bb5d6a522cf99..3ec476d85bfdfe3ecc537cd84904670e97351a2d 100644
--- a/files.c
+++ b/files.c
@@ -33,7 +33,6 @@
 #include <ctype.h>
 #include <dirent.h>
 #include <pwd.h>
-
 #include "proto.h"
 #include "nano.h"
 
@@ -108,11 +107,15 @@ void new_file(void)
 
 }
 
-filestruct *read_line(char *buf, filestruct *prev, int *line1ins)
+filestruct *read_line(char *buf, filestruct *prev, int *line1ins, int len)
 {
     filestruct *fileptr;
 
     fileptr = nmalloc(sizeof(filestruct));
+
+    /* nulls to newlines; len is the string's real length here */
+    unsunder(buf, len);
+
     fileptr->data = charalloc(strlen(buf) + 2);
     strcpy(fileptr->data, buf);
 
@@ -120,7 +123,7 @@ filestruct *read_line(char *buf, filestruct *prev, int *line1ins)
     /* If it's a DOS file (CRLF), and file conversion isn't disabled,
        strip out the CR part */
     if (!ISSET(NO_CONVERT) && buf[strlen(buf) - 1] == '\r') {
-	fileptr->data[strlen(buf) - 1] = 0;
+	fileptr->data[strlen(buf) - 1] = '\0';
 	totsize--;
 
 	if (!fileformat)
@@ -158,8 +161,8 @@ filestruct *read_line(char *buf, filestruct *prev, int *line1ins)
 
 int read_file(FILE *f, const char *filename, int quiet)
 {
-    int num_lines = 0;
-    signed char input;		/* current input character */
+    int num_lines = 0, len = 0;
+    char input;		/* current input character */
     char *buf;
     long i = 0, bufx = 128;
     filestruct *fileptr = current, *tmp = NULL;
@@ -181,28 +184,51 @@ int read_file(FILE *f, const char *filename, int quiet)
     while ((input_int = getc(f)) != EOF) {
         input = (char) input_int;
 #ifndef NANO_SMALL
-	if (!ISSET(NO_CONVERT) && input >= 0 && input <= 31
-		&& input != 127 && input != '\t' && input != '\r'
-		&& input != '\n')
-	/* If the file has binary chars in it, don't stupidly
-	   assume it's a DOS or Mac formatted file! */
-	SET(NO_CONVERT);
+	if (!ISSET(NO_CONVERT) && iscntrl((int) input) && input != '\t'
+		&& input != '\r' && input != '\n') {
+	    /* If the file has binary chars in it, don't stupidly
+	       assume it's a DOS or Mac formatted file! */
+	    SET(NO_CONVERT);
+	}
 #endif
 
+	/* calculate the total length of the line; it might have nulls in
+	   it, so we can't just use strlen() */
+	len++;
+
 	if (input == '\n') {
-	    fileptr = read_line(buf, fileptr, &line1ins);
+
+	    /* don't count the newline in the line length */
+	    len--;
+
+	    /* read in the line properly */
+	    fileptr = read_line(buf, fileptr, &line1ins, len);
+
+	    /* reset the line length, in preparation for the next line */
+	    len = 0;
+
 	    num_lines++;
-	    buf[0] = 0;
+	    buf[0] = '\0';
 	    i = 0;
 #ifndef NANO_SMALL
 	/* If it's a Mac file (no LF just a CR), and file conversion
 	   isn't disabled, handle it! */
-	} else if (!ISSET(NO_CONVERT) && i > 0 && buf[i-1] == '\r') {
+	} else if (!ISSET(NO_CONVERT) && i > 0 && buf[i - 1] == '\r') {
 	    fileformat = 2;
-	    fileptr = read_line(buf, fileptr, &line1ins);
+
+	    /* don't count the newline in the line length */
+	    len--;
+
+	    /* read in the line properly */
+	    fileptr = read_line(buf, fileptr, &line1ins, len);
+
+	    /* reset the line length, in preparation for the next line */
+	    len = 0;
+
 	    num_lines++;
+	    totsize++;
 	    buf[0] = input;
-	    buf[1] = 0;
+	    buf[1] = '\0';
 	    i = 1;
 #endif
 	} else {
@@ -216,7 +242,7 @@ int read_file(FILE *f, const char *filename, int quiet)
 		bufx += 128;
 	    }
 	    buf[i] = input;
-	    buf[i + 1] = 0;
+	    buf[i + 1] = '\0';
 	    i++;
 	}
 	totsize++;
@@ -229,10 +255,14 @@ int read_file(FILE *f, const char *filename, int quiet)
     }
 
     /* Did we not get a newline but still have stuff to do? */
-    if (buf[0]) {
-	fileptr = read_line(buf, fileptr, &line1ins);
+    if (len > 0) {
+
+	/* read in the LAST line properly */
+	fileptr = read_line(buf, fileptr, &line1ins, len);
+
 	num_lines++;
-	buf[0] = 0;
+	totsize++;
+	buf[0] = '\0';
     }
 
     /* Did we even GET a file if we don't already have one? */
@@ -450,13 +480,6 @@ int do_insertfile(int loading_file)
 	}
 #endif
 
-	/* Here is a kludge.  If the current file is blank (including
-	 * after new_file()), then totlines==1 and totsize==0.  Thus
-	 * after open_pipe() or open_file() below, the totsize is short
-	 * by one. */
-	if (totlines==1 && totsize==0)
-	    totsize++;
-
 #ifndef NANO_SMALL
 	if (i == NANO_EXTCMD_KEY) {
 	    i = open_pipe(answer);
@@ -1212,7 +1235,7 @@ int check_operating_dir(char *currpath, int allow_tabcomp)
  * append == 2 means we are prepending instead of overwriting.
  *
  * nonamechange means don't change the current filename, it is ignored
- * if tmp == 1.
+ * if tmp == 1 or if we're appending/prepending.
  */
 int write_file(char *name, int tmp, int append, int nonamechange)
 {
@@ -1312,7 +1335,7 @@ int write_file(char *name, int tmp, int append, int nonamechange)
 
     dump_buffer(fileage);
 
-    f = fdopen(fd, append==1 ? "ab" : "wb");
+    f = fdopen(fd, append == 1 ? "ab" : "wb");
     if (!f) {
         statusbar(_("Could not open file for writing: %s"),
                   strerror(errno));
@@ -1326,7 +1349,15 @@ int write_file(char *name, int tmp, int append, int nonamechange)
 	    break;
 
 	data_len = strlen(fileptr->data);
+
+	/* newlines to nulls, just before we write to disk */
+	sunder(fileptr->data);
+
 	size = fwrite(fileptr->data, 1, data_len, f);
+
+	/* nulls to newlines; data_len is the string's real length here */
+	unsunder(fileptr->data, data_len);
+
 	if (size < data_len) {
 	    statusbar(_("Could not open file for writing: %s"),
 		      strerror(errno));
@@ -1354,7 +1385,15 @@ int write_file(char *name, int tmp, int append, int nonamechange)
 	int data_len;
 
 	data_len = strlen(fileptr->data);
+
+	/* newlines to nulls, just before we write to disk */
+	sunder(fileptr->data);
+
 	size = fwrite(fileptr->data, 1, data_len, f);
+
+	/* nulls to newlines; data_len is the string's real length here */
+	unsunder(fileptr->data, data_len);
+
 	if (size < data_len) {
 	    statusbar(_("Could not open file for writing: %s"),
 		      strerror(errno));
@@ -1486,7 +1525,7 @@ int write_file(char *name, int tmp, int append, int nonamechange)
 	statusbar(_("Could not set permissions %o on %s: %s"),
 		  mask, realname, strerror(errno));
 
-    if (!tmp) {
+    if (!tmp && !append) {
 	if (!nonamechange)
 	    filename = mallocstrcpy(filename, realname);
 
@@ -1589,9 +1628,9 @@ int do_writeout(char *path, int exiting, int append)
 	    TOGGLE(MAC_FILE);
 	    return(do_writeout(answer, exiting, append));
 	} else if (i == NANO_PREPEND_KEY)
-	    return(do_writeout(answer, exiting, append==2 ? 0 : 2));
+	    return(do_writeout(answer, exiting, append == 2 ? 0 : 2));
 	else if (i == NANO_APPEND_KEY)
-	    return(do_writeout(answer, exiting, append==1 ? 0 : 1));
+	    return(do_writeout(answer, exiting, append == 1 ? 0 : 1));
 
 #ifdef DEBUG
 	    fprintf(stderr, _("filename is %s"), answer);
@@ -1622,6 +1661,7 @@ int do_writeout(char *path, int exiting, int append)
 	    filestruct *fileagebak = fileage;	
 	    filestruct *filebotbak = filebot;
 	    filestruct *cutback = cutbuffer;
+	    long totsizebak = totsize;
 	    int oldmod = 0;
 	    cutbuffer = NULL;
 
@@ -1648,6 +1688,7 @@ int do_writeout(char *path, int exiting, int append)
 	    fileage = fileagebak;
 	    filebot = filebotbak;
 	    cutbuffer = cutback;
+	    totsize = totsizebak;
 	    if (oldmod)
 		set_modified();
 	} else
@@ -1708,7 +1749,7 @@ char *real_dir_from_tilde(char *buf)
 		;
 
 	    find_user = mallocstrcpy(find_user, &buf[1]);
-	    find_user[i - 1] = 0;
+	    find_user[i - 1] = '\0';
 
 	    for (userdata = getpwent(); userdata != NULL && 
 		  strcmp(userdata->pw_name, find_user); 
@@ -1732,7 +1773,7 @@ char *real_dir_from_tilde(char *buf)
 }
 
 /* Tack a slash onto the string we're completing if it's a directory */
-int append_slash_if_dir(char *buf, int *lastWasTab, int *place)
+int append_slash_if_dir(char *buf, int *lastwastab, int *place)
 {
     char *dirptr;
     struct stat fileinfo;
@@ -1746,7 +1787,7 @@ int append_slash_if_dir(char *buf, int *lastWasTab, int *place)
 	strncat(buf, "/", 1);
 	*place += 1;
 	/* now we start over again with # of tabs so far */
-	*lastWasTab = 0;
+	*lastwastab = 0;
 	ret = 1;
     }
 
@@ -1844,7 +1885,7 @@ char **cwd_tab_completion(char *buf, int *num_matches)
 	tmp++;
 
 	strncpy(dirName, buf, tmp - buf + 1);
-	dirName[tmp - buf] = 0;
+	dirName[tmp - buf] = '\0';
 
     } else {
 
@@ -1933,7 +1974,7 @@ char **cwd_tab_completion(char *buf, int *num_matches)
 /* This function now has an arg which refers to how much the 
  * statusbar (place) should be advanced, i.e. the new cursor pos.
  */
-char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
+char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list)
 {
     /* Do TAB completion */
     static int num_matches = 0, match_matches = 0;
@@ -1944,10 +1985,10 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
 
     *list = 0;
 
-    if (*lastWasTab == FALSE) {
+    if (*lastwastab == FALSE) {
 	char *tmp, *copyto, *matchBuf;
 
-	*lastWasTab = 1;
+	*lastwastab = 1;
 
 	/* Make a local copy of the string -- up to the position of the
 	   cursor */
@@ -2006,7 +2047,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
 		tmp = buf;
 
 	    if (!strcmp(tmp, matches[0]))
-		is_dir = append_slash_if_dir(buf, lastWasTab, newplace);
+		is_dir = append_slash_if_dir(buf, lastwastab, newplace);
 
 	    if (is_dir)
 		break;
@@ -2028,7 +2069,7 @@ char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list)
 		*newplace = 0;
 
 	    /* Is it a directory? */
-	    append_slash_if_dir(buf, lastWasTab, newplace);
+	    append_slash_if_dir(buf, lastwastab, newplace);
 
 	    break;
 	default:
diff --git a/global.c b/global.c
index 779eb336771e745a282b8ed5a3d8f25da30648b6..1a4157e5d1ccdc47e1122acb46d65a88a7d90120 100644
--- a/global.c
+++ b/global.c
@@ -23,8 +23,8 @@
 
 #include <assert.h>
 #include <sys/stat.h>
-#include "nano.h"
 #include "proto.h"
+#include "nano.h"
 
 #ifdef ENABLE_NLS
 #include <libintl.h>
@@ -38,7 +38,7 @@
  */
 
 int flags = 0;			/* Our new flag containing many options */
-WINDOW *edit;			/* The file portion of the editor  */
+WINDOW *edit;			/* The file portion of the editor */
 WINDOW *topwin;			/* Top line of screen */
 WINDOW *bottomwin;		/* Bottom buffer */
 char *filename = NULL;		/* Name of the file */
diff --git a/move.c b/move.c
index 73a2691b280f4bf74e5cd0c460778bd2f737a368..78766953331704040774db04049ad54231dc7d16 100644
--- a/move.c
+++ b/move.c
@@ -112,9 +112,10 @@ int do_down(void)
 {
     wrap_reset();
     if (current->next != NULL) {
-	update_line(current->prev, 0);
 	if (placewewant > 0)
 	    current_x = actual_x(current->next, placewewant);
+	else if (current_x > strlen(current->next->data))
+	    current_x = strlen(current->next->data);
     } else {
 	UNSET(KEEP_CUTBUFFER);
 	check_statblank();
@@ -155,12 +156,11 @@ void page_up(void)
 	current_y = 0;
 
     update_cursor();
-
 }
 
 int do_page_up(void)
 {
-   int i;
+    int i;
 
     wrap_reset();
     current_x = 0;
@@ -182,13 +182,14 @@ int do_page_up(void)
     return 1;
 }
 
-
 int do_up(void)
 {
     wrap_reset();
     if (current->prev != NULL) {
 	if (placewewant > 0)
 	    current_x = actual_x(current->prev, placewewant);
+	else if (current_x > strlen(current->prev->data))
+	    current_x = strlen(current->prev->data);
     }
     if (current_y > 0)
 	current_y--;
diff --git a/nano.1 b/nano.1
index 618fc38a551a31b7e373352dea3fa7d6f4685140..79f01933d8280e67ea1878a75024fa8019b2c9a4 100644
--- a/nano.1
+++ b/nano.1
@@ -66,7 +66,7 @@ Set the size (width) of a tab.
 Show the current version number and author.
 .TP
 .B \-Y (\-\-syntax=[str])
-Specify a specific syntax hilighting from the .nanorc to use (if available).
+Specify a specific syntax highlighting from the .nanorc to use (if available).
 .TP
 .B \-c (\-\-const)
 Constantly show the cursor position.
diff --git a/nano.1.html b/nano.1.html
index 0cf2be418a64d591deef2ee7f42d7319dac85e1b..2d15d6496a52c6a333eaaca97a404fbc6d1eecbe 100644
--- a/nano.1.html
+++ b/nano.1.html
@@ -91,7 +91,7 @@ Show the current version number and author.
 <DT><B>-Y (--syntax=[str])</B>
 
 <DD>
-Specify a specific syntax hilighting from the .nanorc to use (if available).
+Specify a specific syntax highlighting from the .nanorc to use (if available).
 <DT><B>-c (--const)</B>
 
 <DD>
diff --git a/nano.c b/nano.c
index 7b915d34ff6a52cd6655e011fe57ccbae3bf3508..5a2d18bf9cebdc6745186cceecbdf33552076c60 100644
--- a/nano.c
+++ b/nano.c
@@ -39,7 +39,6 @@
 #include <locale.h>
 #include <limits.h>
 #include <assert.h>
-
 #include "proto.h"
 #include "nano.h"
 
@@ -213,14 +212,6 @@ void print_view_warning(void)
     statusbar(_("Key illegal in VIEW mode"));
 }
 
-void clear_filename(void)
-{
-    if (filename != NULL)
-	free(filename);
-    filename = charalloc(1);
-    filename[0] = 0;
-}
-
 /* Initialize global variables - no better way for now.  If
    save_cutbuffer is nonzero, don't set cutbuffer to NULL. */
 void global_init(int save_cutbuffer)
@@ -253,7 +244,7 @@ void global_init(int save_cutbuffer)
 
     hblank = charalloc(COLS + 1);
     memset(hblank, ' ', COLS);
-    hblank[COLS] = 0;
+    hblank[COLS] = '\0';
 
 }
 
@@ -468,7 +459,7 @@ void null_at(char **data, int index)
 {
 
     /* Ahh!  Damn dereferencing */
-    (*data)[index] = 0;
+    (*data)[index] = '\0';
     align(data);
 }
 
@@ -1367,6 +1358,9 @@ int do_int_spell_fix(char *word)
     char *prevanswer = NULL, *save_search = NULL, *save_replace = NULL;
     filestruct *begin;
     int i = 0, j = 0, beginx, beginx_top, reverse_search_set;
+#ifndef NANO_SMALL
+    int mark_set;
+#endif
 
     /* save where we are */
     begin = current;
@@ -1376,6 +1370,12 @@ int do_int_spell_fix(char *word)
     reverse_search_set = ISSET(REVERSE_SEARCH);
     UNSET(REVERSE_SEARCH);
 
+#ifndef NANO_SMALL
+    /* Make sure the marking highlight is off during Spell Check */
+    mark_set = ISSET(MARK_ISSET);
+    UNSET(MARK_ISSET);
+#endif
+
     /* save the current search/replace strings */
     search_init_globals();
     save_search = mallocstrcpy(save_search, last_search);
@@ -1438,6 +1438,12 @@ int do_int_spell_fix(char *word)
     if (reverse_search_set)
 	SET(REVERSE_SEARCH);
 
+#ifndef NANO_SMALL
+    /* restore marking highlight */
+    if (mark_set)
+	SET(MARK_ISSET);
+#endif
+
     edit_update(current, CENTER);
 
     if (i == -1)
@@ -1451,8 +1457,7 @@ int do_int_speller(char *tempfile_name)
 {
     char *read_buff, *read_buff_ptr, *read_buff_word;
     size_t pipe_buff_size, read_buff_size, read_buff_read, bytesread;
-    int in_fd[2], tempfile_fd;
-    int spell_status;
+    int in_fd[2], tempfile_fd, spell_status;
     pid_t pid_spell;
 
     /* Create a pipe to spell program */
@@ -1583,12 +1588,25 @@ int do_alt_speller(char *file_name)
 {
     int alt_spell_status, lineno_cur = current->lineno;
     int x_cur = current_x, y_cur = current_y, pww_cur = placewewant;
+#ifndef NANO_SMALL
+    int mark_set = 0, mbb_lineno_cur, mbx_cur;
+#endif
 
     pid_t pid_spell;
     char *ptr;
     static int arglen = 3;
     static char **spellargs = (char **) NULL;
 
+#ifndef NANO_SMALL
+    mark_set = ISSET(MARK_ISSET);
+    if (mark_set) {
+	/* Save the marking position */
+	mbb_lineno_cur = mark_beginbuf->lineno;
+	mbx_cur = mark_beginx;
+	UNSET(MARK_ISSET);
+    }
+#endif
+
     endwin();
 
     /* Set up an argument list to pass the execvp function */
@@ -1635,6 +1653,15 @@ int do_alt_speller(char *file_name)
     global_init(1);
     open_file(file_name, 0, 1);
 
+#ifndef NANO_SMALL
+    if (mark_set) {
+	/* Restore the marking position */
+	do_gotopos(mbb_lineno_cur, mbx_cur, y_cur, 0);
+	mark_beginbuf = current;
+	SET(MARK_ISSET);
+    }
+#endif
+
     /* go back to the old position, mark the file as modified, and make
        sure that the titlebar is refreshed */
     do_gotopos(lineno_cur, x_cur, y_cur, pww_cur);
@@ -2043,7 +2070,7 @@ void handle_sigwinch(int s)
 
     hblank = nrealloc(hblank, COLS + 1);
     memset(hblank, ' ', COLS);
-    hblank[COLS] = 0;
+    hblank[COLS] = '\0';
 
 #ifdef HAVE_RESIZETERM
     resizeterm(LINES, COLS);
@@ -2788,7 +2815,7 @@ int main(int argc, char *argv[])
 {
     int optchr;
     int kbinput;		/* Input from keyboard */
-    long startline = 0;		/* Line to try and start at */
+    int startline = 0;		/* Line to try and start at */
     int keyhandled;		/* Have we handled the keystroke yet? */
     int modify_control_seq;
     char *argv0;
@@ -3022,6 +3049,11 @@ int main(int argc, char *argv[])
 
     }
 
+    /* Clear the filename we'll be using */
+    filename = charalloc(1);
+    filename[0] = '\0';
+
+    /* See if we were invoked with the name "pico" */
     argv0 = strrchr(argv[0], '/');
     if ((argv0 && strstr(argv0, "pico"))
 	|| (!argv0 && strstr(argv[0], "pico")))
@@ -3029,23 +3061,17 @@ int main(int argc, char *argv[])
 
     /* See if there's a non-option in argv (first non-option is the
        filename, if +LINE is not given) */
-    if (argc == 1 || argc <= optind)
-	clear_filename();
-    else {
+    if (argc > 1 && argc > optind) {
 	/* Look for the +line flag... */
 	if (argv[optind][0] == '+') {
 	    startline = atoi(&argv[optind][1]);
 	    optind++;
-	    if (argc == 1 || argc <= optind)
-		clear_filename();
-	    else
+	    if (argc > 1 && argc > optind)
 		filename = mallocstrcpy(filename, argv[optind]);
-
 	} else
 	    filename = mallocstrcpy(filename, argv[optind]);
     }
 
-
     /* First back up the old settings so they can be restored, duh */
     tcgetattr(0, &oldterm);
 
@@ -3138,7 +3164,7 @@ int main(int argc, char *argv[])
 
 	kbinput = wgetch(edit);
 #ifdef DEBUG
-	fprintf(stderr, "AHA!  %c (%d)\n", kbinput, kbinput);
+	fprintf(stderr, _("AHA!  %c (%d)\n"), kbinput, kbinput);
 #endif
 
 	if (kbinput == 27) {	/* Grab Alt-key stuff first */
@@ -3421,7 +3447,7 @@ int main(int argc, char *argv[])
 		break;
 	    default:
 #ifdef DEBUG
-		fprintf(stderr, "I got %c (%d)!\n", kbinput, kbinput);
+		fprintf(stderr, _("I got %c (%d)!\n"), kbinput, kbinput);
 #endif
 		/* We no longer stop unhandled sequences so that people with
 		   odd character sets can type... */
diff --git a/nanorc.sample b/nanorc.sample
index 677ff3e24ee8d58ec7ae8a4662c775c731ba22eb..bc23026236e6288860e807e70546d539c2918e21 100644
--- a/nanorc.sample
+++ b/nanorc.sample
@@ -105,4 +105,3 @@
 #
 # syntax "mutt"
 # color green "^>.*"
-
diff --git a/proto.h b/proto.h
index df052d1b852b03b54e3fba345ce069ae385ae2f6..f13a64bc1697f30e3c78a720422e8dedfea98223 100644
--- a/proto.h
+++ b/proto.h
@@ -171,10 +171,12 @@ int do_left(void);
 int do_right(void);
 int check_wildcard_match(const char *text, const char *pattern);
 
-char *input_tab(char *buf, int place, int *lastWasTab, int *newplace, int *list);
+char *input_tab(char *buf, int place, int *lastwastab, int *newplace, int *list);
 char *real_dir_from_tilde(char *buf);
 
 void signal_init(void);
+void unsunder(char *str, int true_len);
+void sunder(char *str);
 void lowercase(char *src);
 void blank_bottombars(void);
 void check_wrap(filestruct * inptr);
diff --git a/rcfile.c b/rcfile.c
index f698fe227457e6c4d12601df4f77d5ae38899337..c02784102af69dd8abc88f6f6aadd386ce5671eb 100644
--- a/rcfile.c
+++ b/rcfile.c
@@ -221,7 +221,7 @@ void parse_syntax(FILE * rcstream, char *buf, char *ptr)
 	    tmpsyntax = syntaxes;
 #ifdef DEBUG
 	    fprintf(stderr,
-		    "Starting a new syntax type\n");
+		    _("Starting a new syntax type\n"));
 	    fprintf(stderr, "string val=%s\n", nameptr);
 #endif
 
@@ -229,7 +229,7 @@ void parse_syntax(FILE * rcstream, char *buf, char *ptr)
 	    for (tmpsyntax = syntaxes;
 		 tmpsyntax->next != NULL; tmpsyntax = tmpsyntax->next);
 #ifdef DEBUG
-	    fprintf(stderr, "Adding new syntax after 1st\n");
+	    fprintf(stderr, _("Adding new syntax after 1st\n"));
 #endif
 
 	    tmpsyntax->next = nmalloc(sizeof(syntaxtype));
@@ -345,17 +345,17 @@ void parse_colors(FILE * rcstream, char *buf, char *ptr)
 	    tmpcolor = tmpsyntax->color;
 #ifdef DEBUG
 	    fprintf(stderr,
-		    "Starting a new colorstring for fg %d bg %d\n",
+		    _("Starting a new colorstring for fg %d bg %d\n"),
 		    fg, bg);
-	    fprintf(stderr, "string val=%s\n", tmp);
+	    fprintf(stderr, _("string val=%s\n"), tmp);
 #endif
 
 	} else {
 	    for (tmpcolor = tmpsyntax->color;
 		 tmpcolor->next != NULL; tmpcolor = tmpcolor->next);
 #ifdef DEBUG
-	    fprintf(stderr, "Adding new entry for fg %d bg %d\n", fg, bg);
-	    fprintf(stderr, "string val=%s\n", tmp);
+	    fprintf(stderr, _("Adding new entry for fg %d bg %d\n"), fg, bg);
+	    fprintf(stderr, _("string val=%s\n"), tmp);
 #endif
 
 	    tmpcolor->next = nmalloc(sizeof(colortype));
@@ -387,7 +387,7 @@ void parse_colors(FILE * rcstream, char *buf, char *ptr)
 	    beginning = ptr;
 	    ptr = parse_next_regex(ptr);
 #ifdef DEBUG
-	    fprintf(stderr, "For end part, beginning = \"%s\"\n",
+	    fprintf(stderr, _("For end part, beginning = \"%s\"\n"),
 		    beginning);
 #endif
 	    tmp = NULL;
diff --git a/search.c b/search.c
index 3ec2abcf2231bf430367c7d3f26c79fea681f4a5..2862a6a399c9fc175fdcce3ef13dd798d32da0de 100644
--- a/search.c
+++ b/search.c
@@ -221,7 +221,7 @@ void not_found_msg(char *str)
 	char *foo = NULL;
 
 	foo = mallocstrcpy(foo, str);
-	foo[COLS / 2] = 0;
+	foo[COLS / 2] = '\0';
 	statusbar(_("\"%s...\" not found"), foo);
 
 	free(foo);
@@ -274,6 +274,7 @@ filestruct *findnextstr(int quiet, int bracket_mode, filestruct * begin, int beg
 	    if (search_last_line) {
 		if (!quiet)
 		    not_found_msg(needle);
+		update_line(fileptr, current_x);
 	        return NULL;
 	    }
 
@@ -571,7 +572,7 @@ char *replace_line(void)
 
     /* Head of Original Line */
     strncpy(copy, current->data, current_x);
-    copy[current_x] = 0;
+    copy[current_x] = '\0';
 
     /* Replacement Text */
     if (!ISSET(USE_REGEXP))
@@ -863,11 +864,9 @@ void do_gotopos(int line, int pos_x, int pos_y, int pos_placewewant)
     current_y = pos_y;
     do_gotoline(line, 1);
 
-    /* recalculate the x-coordinate and place we want, just in case their
-       values are insane; if they aren't, they won't be changed by this */
-    current_x = pos_x;
-    pos_placewewant = xplustabs();
-    pos_x = actual_x(current, pos_placewewant);
+    /* make sure that the x-coordinate is sane here */
+    if (pos_x > strlen(current->data))
+	pos_x = strlen(current->data);
 
     /* set the rest of the coordinates up */
     current_x = pos_x;
diff --git a/utils.c b/utils.c
index a46a354d4e151dc941795b9fe8d7897eccd09c56..207a9f79c423f3fdff6c7ef6cf44d53d829eb1bd 100644
--- a/utils.c
+++ b/utils.c
@@ -19,16 +19,14 @@
  *                                                                        *
  **************************************************************************/
 
-#include "config.h"
-
 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
-
-#include "nano.h"
+#include "config.h"
 #include "proto.h"
+#include "nano.h"
 
 #ifdef ENABLE_NLS
 #include <libintl.h>
@@ -52,6 +50,32 @@ int num_of_digits(int n)
     return i;
 }
 
+/* For non-null-terminated lines.  A line, by definition, shouldn't
+   normally have newlines in it, so encode its nulls as newlines. */
+void unsunder(char *str, int true_len)
+{
+    int i;
+    if (strlen(str) < true_len) {
+	for (i = 0; i < true_len; i++) {
+	    if (str[i] == '\0')
+		str[i] = '\n';
+	}
+    }
+}
+
+/* For non-null-terminated lines.  A line, by definition, shouldn't
+   normally have newlines in it, so decode its newlines into nulls. */
+void sunder(char *str)
+{
+    int i, true_len = strlen(str);
+    if (strchr(str, '\n')) {
+	for (i = 0; i < true_len; i++) {
+	    if (str[i] == '\n')
+		str[i] = '\0';
+	}
+    }
+}
+
 /* Lower case a string - must be null terminated */
 void lowercase(char *src)
 {
diff --git a/winio.c b/winio.c
index 5eadd6a1f882bac99339cff3c2725fe4b93de826..525dd428c1bb5850da000665f25891989339cb05 100644
--- a/winio.c
+++ b/winio.c
@@ -19,13 +19,13 @@
  *                                                                        *
  **************************************************************************/
 
-#include "config.h"
-
 #include <stdarg.h>
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <ctype.h>
 #include <assert.h>
+#include "config.h"
 #include "proto.h"
 #include "nano.h"
 
@@ -85,7 +85,7 @@ int xpt(filestruct * fileptr, int index)
 	} else if (fileptr->data[i] & 0x80)
 	    /* Make 8 bit chars only 1 column! */
 	    ;
-	else if (fileptr->data[i] < 32 || fileptr->data[i] == 127)
+	else if (iscntrl((int) fileptr->data[i]))
 	    tabs++;
     }
 
@@ -114,11 +114,25 @@ int actual_x_from_start(filestruct * fileptr, int xplus, int start)
 		tot += tabsize - (tot % tabsize);
 	} else if (fileptr->data[i] & 0x80)
 	    tot++;		/* Make 8 bit chars only 1 column (again) */
-	else if (fileptr->data[i] < 32 || fileptr->data[i] == 127) {
+	else if (iscntrl((int) fileptr->data[i])) {
 	    i++;
 	    tot += 2;
 	}
 
+	if (i > strlen(fileptr->data))
+	    i = strlen(fileptr->data);
+
+	/* see if we're in the x-plus-tabs column of xplus; if not, look
+	   for the closest column to it */
+	if (xpt(fileptr, i) < xplus) {
+	    while (xpt(fileptr, i) < xplus && i < strlen(fileptr->data))
+	        i++;
+	}
+	else if (xpt(fileptr, i) > xplus) {
+	    while (xpt(fileptr, i) > xplus && i > start)
+	        i--;
+	}
+
 #ifdef DEBUG
     fprintf(stderr, _("actual_x_from_start for xplus=%d returned %d\n"),
 	    xplus, i);
@@ -151,7 +165,7 @@ int strnlenpt(char *buf, int size)
 	} else if (buf[i] & 0x80)
 	    /* Make 8 bit chars only 1 column! */
 	    ;
-	else if (buf[i] < 32 || buf[i] == 127)
+	else if (iscntrl((int) buf[i]))
 	    tabs++;
     }
 
@@ -192,7 +206,6 @@ void blank_bottombars(void)
 
     for (; i <= 2; i++)
 	mvwaddstr(bottomwin, i, 0, hblank);
-
 }
 
 void blank_edit(void)
@@ -275,7 +288,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
 
     slen = length_of_list(s);
     inputbuf = charalloc(strlen(def) + 1);
-    inputbuf[0] = 0;
+    inputbuf[0] = '\0';
 
     x_left = strlen(buf);
     x = strlen(def) + x_left;
@@ -363,7 +376,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
 		memmove(inputbuf + (x - x_left),
 			inputbuf + (x - x_left) + 1,
 			strlen(inputbuf) - (x - x_left) - 1);
-		inputbuf[strlen(inputbuf) - 1] = 0;
+		inputbuf[strlen(inputbuf) - 1] = '\0';
 	    }
 	    break;
 	case NANO_CONTROL_K:
@@ -376,12 +389,12 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
 	case NANO_CONTROL_H:
 	    if (strlen(inputbuf) > 0) {
 		if (x == (x_left + strlen(inputbuf)))
-		    inputbuf[strlen(inputbuf) - 1] = 0;
+		    inputbuf[strlen(inputbuf) - 1] = '\0';
 		else if (x - x_left) {
 		    memmove(inputbuf + (x - x_left) - 1,
 			    inputbuf + (x - x_left),
 			    strlen(inputbuf) - (x - x_left));
-		    inputbuf[strlen(inputbuf) - 1] = 0;
+		    inputbuf[strlen(inputbuf) - 1] = '\0';
 		}
 	    }
 	    if (x > strlen(buf))
@@ -447,7 +460,7 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
 			memmove(inputbuf + (x - x_left),
 				inputbuf + (x - x_left) + 1,
 				strlen(inputbuf) - (x - x_left) - 1);
-			inputbuf[strlen(inputbuf) - 1] = 0;
+			inputbuf[strlen(inputbuf) - 1] = '\0';
 		    }
 		    goto skip_tilde;
 		case '4':
@@ -504,6 +517,13 @@ int nanogetstr(int allowtabs, char *buf, char *def, shortcut *s,
 	nanoget_repaint(buf, inputbuf, x);
 	wrefresh(bottomwin);
     }
+#ifndef DISABLE_TABCOMP
+    /* if we've done tab completion, there might be a list of filename
+       matches on the edit window at this point; make sure they're
+       cleared off */
+    if (list)
+	edit_refresh();
+#endif
 
     answer = mallocstrcpy(answer, inputbuf);
     free(inputbuf);
@@ -817,7 +837,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
 			break;
 		    }
 #ifdef DEBUG
-		    fprintf(stderr, "Match! (%d chars) \"%s\"\n",
+		    fprintf(stderr, _("Match! (%d chars) \"%s\"\n"),
 			    colormatches[0].rm_eo - colormatches[0].rm_so,
 			    &fileptr->data[k + colormatches[0].rm_so]);
 #endif
@@ -830,7 +850,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
 			    paintlen =
 				colormatches[0].rm_eo - colormatches[0].rm_so;
 #ifdef DEBUG
-			    fprintf(stderr, "paintlen (%d) = eo (%d) - so (%d)\n", 
+			    fprintf(stderr, _("paintlen (%d) = eo (%d) - so (%d)\n"), 
 				paintlen, colormatches[0].rm_eo, colormatches[0].rm_so);
 #endif
 
@@ -838,7 +858,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
 			else {
 			    paintlen = COLS - k - colormatches[0].rm_so - 1;
 #ifdef DEBUG
-			    fprintf(stderr, "paintlen (%d) = COLS (%d) - k (%d), - rm.so (%d) - 1\n", 
+			    fprintf(stderr, _("paintlen (%d) = COLS (%d) - k (%d), - rm.so (%d) - 1\n"), 
 					paintlen, COLS, k, colormatches[0].rm_so);
 #endif
 			}
@@ -941,7 +961,7 @@ void edit_add(filestruct * fileptr, int yval, int start, int virt_cur_x,
 					&fileptr->data[start + smatch],
 					ematch - smatch);
 #ifdef DEBUG
-			fprintf(stderr, "start = %d, smatch = %d, ematch = %d\n", start,
+			fprintf(stderr, _("start = %d, smatch = %d, ematch = %d\n"), start,
 				smatch, ematch);
 #endif
 
@@ -1181,12 +1201,31 @@ void update_line(filestruct * fileptr, int index)
 	    if (i < mark_beginx)
 		virt_mark_beginx--;
 	} else if (realdata[i] == 127) {
-	    /* Treat control characters as ^symbol (ASCII 1 - 31, 127) */
+	    /* Treat control characters as ^symbol (ASCII 1 - 31 omitting
+	       10, 127) */
 	    fileptr->data[pos++] = '^';
 	    fileptr->data[pos++] = '?';
-	} else if (realdata[i] >= 1 && realdata[i] <= 31) {
+	    if (i < current_x)
+		virt_cur_x++;
+	    if (i < mark_beginx)
+		virt_mark_beginx++;
+	} else if (realdata[i] >= 1 && realdata[i] <= 31 && realdata[i] != 10) {
 	    fileptr->data[pos++] = '^';
 	    fileptr->data[pos++] = realdata[i] + 64;
+	    if (i < current_x)
+		virt_cur_x++;
+	    if (i < mark_beginx)
+		virt_mark_beginx++;
+	} else if (realdata[i] == 10) {
+	    /* Treat newlines (ASCII 10's) embedded in a line as encoded
+	       nulls (ASCII 0's); the line in question should be run
+	       through unsunder() before reaching here */
+	    fileptr->data[pos++] = '^';
+	    fileptr->data[pos++] = '@';
+	    if (i < current_x)
+		virt_cur_x++;
+	    if (i < mark_beginx)
+		virt_mark_beginx++;
 	} else {
 	    fileptr->data[pos++] = realdata[i];
 	}
@@ -1741,9 +1780,36 @@ int do_help(void)
 	    break;
 #endif
 #endif
+	case 27:
+	    kbinput = wgetch(edit);
+	    switch(kbinput) {
+	    case '[':
+		kbinput = wgetch(edit);
+		switch(kbinput) {
+		    case '5':	/* Alt-[-5 = Page Up */
+			wgetch(edit);
+			goto do_pageupkey;
+			break;
+		    case 'V':	/* Alt-[-V = Page Up in Hurd Console */
+		    case 'I':	/* Alt-[-I = Page Up - FreeBSD Console */
+			goto do_pageupkey;
+			break;
+		    case '6':	/* Alt-[-6 = Page Down */
+			wgetch(edit);
+			goto do_pagedownkey;
+			break;
+		    case 'U':	/* Alt-[-U = Page Down in Hurd Console */
+		    case 'G':	/* Alt-[-G = Page Down - FreeBSD Console */
+			goto do_pagedownkey;
+			break;
+		}
+		break;
+	    }
+	    break;
 	case NANO_NEXTPAGE_KEY:
 	case NANO_NEXTPAGE_FKEY:
 	case KEY_NPAGE:
+	  do_pagedownkey:
 	    if (!no_more) {
 		blank_edit();
 		page++;
@@ -1752,6 +1818,7 @@ int do_help(void)
 	case NANO_PREVPAGE_KEY:
 	case NANO_PREVPAGE_FKEY:
 	case KEY_PPAGE:
+	  do_pageupkey:
 	    if (page > 1) {
 		no_more = 0;
 		blank_edit();