diff --git a/ChangeLog b/ChangeLog
index 77abf4fe201dbd6ae99fcd50d69de35c659c585b..4ca79f82e7cc3e2ff15e631bc97d0a0c8084f3ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 CVS code -
+- General
+	- Better integration of View mode (-v) and multibuffer.
+	  Fixes to new_file(), do_insertfile_void(), shortcut_init()
+	  (David Lawrence Ramsey).
 - nano.c:
+  die()
+	- Only save files that were modified (David Lawrence Ramsey).
   do_cont()
 	- Run signal_init() after doupdate() so ^Y wont suddenly
 	  start suspending after returning from ^Z suspend in Hurd.
@@ -13,6 +19,8 @@ CVS code -
 	- Typo in file switch string (found by David Lawrence Ramsey).
   main()
 	- Handle Alt prev/next file keys (,.), as well as normal ones (<>).
+	- Handle OS-specific insert keys by jump to do_insertkey (David
+	  Lawrence Ramsey).
 - files.c:
   read_file()
 	- Make conversion message less confusing (suggested by Jordi).
diff --git a/files.c b/files.c
index 6804db64c1e5c4536f089cbc7ba9194d1012a60a..1e2b02930b223f612f53fd33f05a0b7f18266bb3 100644
--- a/files.c
+++ b/files.c
@@ -93,11 +93,19 @@ void new_file(void)
        duplicates; without this, if nano is started without a filename on
        the command line, a new file will be created, but it will be given
        no open_files entry, leading to problems later on */
-    if (!open_files)
+    if (!open_files) {
 	add_open_file(0, 0);
+	/* turn off view mode in this case; this is for consistency
+	   whether multibuffers are compiled in or not */
+	UNSET(VIEW_MODE);
+    }
+#else
+    /* if multibuffers haven't been compiled in, turn off view mode
+       unconditionally; otherwise, don't turn them off (except in the
+       above case), so that we can view multiple files properly */
+    UNSET(VIEW_MODE);
 #endif
 
-    UNSET(VIEW_MODE);
 }
 
 
@@ -440,7 +448,14 @@ int do_insertfile_void(void)
 {
     int result = 0;
 #ifdef ENABLE_MULTIBUFFER
-    result = do_insertfile(ISSET(MULTIBUFFER));
+    if (ISSET(VIEW_MODE)) {
+	if (ISSET(MULTIBUFFER))
+	    result = do_insertfile(1);
+	else
+	    statusbar(_("Key illegal in non-multibuffer mode"));
+    }
+    else
+	result = do_insertfile(ISSET(MULTIBUFFER));
 #else
     result = do_insertfile(0);
 #endif
@@ -523,10 +538,16 @@ int add_open_file(int update, int dup_fix)
     /* save current line number */
     open_files->lineno = current->lineno;
 
-    /* save current filestruct and restore full file position afterward */
-    open_files->file = nmalloc(sizeof(filestruct));
-    open_files->file = copy_filestruct(fileage);
-    do_gotopos(open_files->lineno, open_files->file_current_x, open_files->file_current_y, open_files->file_placewewant);
+    /* if we're in view mode and updating, the file contents won't
+       have changed, so we won't bother resaving the filestruct
+       then; otherwise, we will */
+    if (!(ISSET(VIEW_MODE) && !update)) {
+	/* save current filestruct and restore full file position
+	   afterward */
+	open_files->file = nmalloc(sizeof(filestruct));
+	open_files->file = copy_filestruct(fileage);
+	do_gotopos(open_files->lineno, open_files->file_current_x, open_files->file_current_y, open_files->file_placewewant);
+    }
 
     /* save current modification status */
     open_files->file_modified = ISSET(MODIFIED);
diff --git a/global.c b/global.c
index 6fa089ea02a5bb3e1ce5756424cc17ef12eecd1a..8e7648b0cbc835573a717367e3791b68d0ab9158 100644
--- a/global.c
+++ b/global.c
@@ -324,15 +324,31 @@ void shortcut_init(int unjustify)
 		    nano_justify_msg, 0, NANO_JUSTIFY_FKEY, 0,
 		    NOVIEW, do_justify);
     else
+
+#ifdef ENABLE_MULTIBUFFER
+	/* this is so we can view multiple files */
+	sc_init_one(&main_list[3], NANO_INSERTFILE_KEY, _("Read File"),
+		nano_insert_msg,
+		0, NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
+#else
 	sc_init_one(&main_list[3], NANO_INSERTFILE_KEY, _("Read File"),
 		nano_insert_msg,
 		0, NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
-
+#endif
 
     if (ISSET(PICO_MODE))
+
+#ifdef ENABLE_MULTIBUFFER
+	/* this is so we can view multiple files */
+	sc_init_one(&main_list[4], NANO_INSERTFILE_KEY, _("Read File"),
+		nano_insert_msg,
+		0, NANO_INSERTFILE_FKEY, 0, VIEW, do_insertfile_void);
+#else
 	sc_init_one(&main_list[4], NANO_INSERTFILE_KEY, _("Read File"),
 		nano_insert_msg,
 		0, NANO_INSERTFILE_FKEY, 0, NOVIEW, do_insertfile_void);
+#endif
+
     else
 	sc_init_one(&main_list[4], NANO_REPLACE_KEY, _("Replace"),
 		    nano_replace_msg,
diff --git a/nano.c b/nano.c
index 8045bf27e3989b72529c1f1353744d00c4ab98f0..06eb5dfcc9374f94dea26ea2c91d084f4ea8e18d 100644
--- a/nano.c
+++ b/nano.c
@@ -122,12 +122,12 @@ void die(char *msg, ...)
 
     fprintf(stderr, msg);
 
-    /* save the currently loaded file (if modified, its open_files entry
-       isn't up to date) */
-    die_save_file(filename);
+    /* save the currently loaded file if it's been modified */
+    if (ISSET(MODIFIED))
+	die_save_file(filename);
 
 #ifdef ENABLE_MULTIBUFFER
-    /* then save all of the other loaded files, if any */
+    /* then save all of the other modified loaded files, if any */
     if (open_files) {
         filestruct *tmp;
 
@@ -142,7 +142,9 @@ void die(char *msg, ...)
 	       currently loaded file), don't save it again */
 	    if (tmp != open_files) {
 		fileage = open_files->file;
-		die_save_file(open_files->data);
+		/* save the file if it's been modified */
+		if (open_files->file_modified)
+		    die_save_file(open_files->data);
 	    }
 
 	    open_files = open_files->next;
@@ -3101,16 +3103,10 @@ int main(int argc, char *argv[])
 		case '9':	/* Alt-[-9 = Delete in Hurd Console */
 		    kbinput = KEY_DC;
 		    break;
-		case '@':	/* Alt-[-9 = Insert in Hurd Console */
-		case 'L':		/* Insert Key - FreeBSD Console */
-#ifdef ENABLE_MULTIBUFFER
-		    do_insertfile(ISSET(MULTIBUFFER));
-#else
-		    do_insertfile(0);
-#endif
-		    keyhandled = 1;
-		    break;
-		case '[':	/* Alt-[-[-[A-E], F1-F5 in linux console */
+		case '@':	/* Alt-[-@ = Insert in Hurd Console */
+		case 'L':	/* Alt-[-L = Insert - FreeBSD Console */
+		    goto do_insertkey;
+		case '[':	/* Alt-[-[-[A-E], F1-F5 in Linux console */
 		    kbinput = wgetch(edit);
 		    if (kbinput >= 'A' && kbinput <= 'E')
 			kbinput = KEY_F(kbinput - 64);
@@ -3224,9 +3220,12 @@ int main(int argc, char *argv[])
 	  do_insertkey:
 
 #ifdef ENABLE_MULTIBUFFER
-	    do_insertfile(ISSET(MULTIBUFFER));
+	    /* do_insertfile_void() contains the logic needed to
+	       handle view mode with the view mode/multibuffer
+	       exception, so use it here */
+	    do_insertfile_void();
 #else
-	    do_insertfile(0);
+	    print_view_warning();
 #endif
 
 	    keyhandled = 1;