diff --git a/src/fileio.c b/src/fileio.c
index 5b27b6243abad5da6fa6f5cd8b678a5f50c95435..e239b5cd88e7b312e01f9601967f0070e5fd7e1b 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -6156,154 +6156,165 @@ buf_check_timestamp(buf, focus)
     }
 
     if (reload)
-    {
-	exarg_T		ea;
-	pos_T		old_cursor;
-	linenr_T	old_topline;
-	int		old_ro = buf->b_p_ro;
-	buf_T		*savebuf;
-	int		saved = OK;
+	/* Reload the buffer. */
+	buf_reload(buf);
+
+#ifdef FEAT_GUI
+    /* restore this in case an autocommand has set it; it would break
+     * 'mousefocus' */
+    need_mouse_correct = save_mouse_correct;
+#endif
+
+    return retval;
+}
+
+/*
+ * Reload a buffer that is already loaded.
+ * Used when the file was changed outside of Vim.
+ */
+    void
+buf_reload(buf)
+    buf_T	*buf;
+{
+    exarg_T	ea;
+    pos_T	old_cursor;
+    linenr_T	old_topline;
+    int		old_ro = buf->b_p_ro;
+    int		orig_mode = buf->b_orig_mode;
+    buf_T	*savebuf;
+    int		saved = OK;
 #ifdef FEAT_AUTOCMD
-	aco_save_T	aco;
+    aco_save_T	aco;
 
-	/* set curwin/curbuf for "buf" and save some things */
-	aucmd_prepbuf(&aco, buf);
+    /* set curwin/curbuf for "buf" and save some things */
+    aucmd_prepbuf(&aco, buf);
 #else
-	buf_T	*save_curbuf = curbuf;
+    buf_T	*save_curbuf = curbuf;
 
-	curbuf = buf;
-	curwin->w_buffer = buf;
+    curbuf = buf;
+    curwin->w_buffer = buf;
 #endif
 
-	/* We only want to read the text from the file, not reset the syntax
-	 * highlighting, clear marks, diff status, etc.  Force the fileformat
-	 * and encoding to be the same. */
-	if (prep_exarg(&ea, buf) == OK)
-	{
-	    old_cursor = curwin->w_cursor;
-	    old_topline = curwin->w_topline;
+    /* We only want to read the text from the file, not reset the syntax
+     * highlighting, clear marks, diff status, etc.  Force the fileformat
+     * and encoding to be the same. */
+    if (prep_exarg(&ea, buf) == OK)
+    {
+	old_cursor = curwin->w_cursor;
+	old_topline = curwin->w_topline;
 
-	    /*
-	     * To behave like when a new file is edited (matters for
-	     * BufReadPost autocommands) we first need to delete the current
-	     * buffer contents.  But if reading the file fails we should keep
-	     * the old contents.  Can't use memory only, the file might be
-	     * too big.  Use a hidden buffer to move the buffer contents to.
-	     */
-	    if (bufempty())
-		savebuf = NULL;
-	    else
+	/*
+	 * To behave like when a new file is edited (matters for
+	 * BufReadPost autocommands) we first need to delete the current
+	 * buffer contents.  But if reading the file fails we should keep
+	 * the old contents.  Can't use memory only, the file might be
+	 * too big.  Use a hidden buffer to move the buffer contents to.
+	 */
+	if (bufempty())
+	    savebuf = NULL;
+	else
+	{
+	    /* Allocate a buffer without putting it in the buffer list. */
+	    savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
+	    if (savebuf != NULL)
 	    {
-		/* Allocate a buffer without putting it in the buffer list. */
-		savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
-		if (savebuf != NULL)
-		{
-		    /* Open the memline. */
-		    curbuf = savebuf;
-		    curwin->w_buffer = savebuf;
-		    saved = ml_open();
-		    curbuf = buf;
-		    curwin->w_buffer = buf;
-		}
-		if (savebuf == NULL || saved == FAIL
-					  || move_lines(buf, savebuf) == FAIL)
-		{
-		    EMSG2(_("E462: Could not prepare for reloading \"%s\""),
-								buf->b_fname);
-		    saved = FAIL;
-		}
+		/* Open the memline. */
+		curbuf = savebuf;
+		curwin->w_buffer = savebuf;
+		saved = ml_open();
+		curbuf = buf;
+		curwin->w_buffer = buf;
 	    }
-
-	    if (saved == OK)
+	    if (savebuf == NULL || saved == FAIL
+				      || move_lines(buf, savebuf) == FAIL)
 	    {
-		curbuf->b_flags |= BF_CHECK_RO;	/* check for RO again */
+		EMSG2(_("E462: Could not prepare for reloading \"%s\""),
+							    buf->b_fname);
+		saved = FAIL;
+	    }
+	}
+
+	if (saved == OK)
+	{
+	    curbuf->b_flags |= BF_CHECK_RO;	/* check for RO again */
 #ifdef FEAT_AUTOCMD
-		keep_filetype = TRUE;		/* don't detect 'filetype' */
+	    keep_filetype = TRUE;		/* don't detect 'filetype' */
 #endif
-		if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
-			    (linenr_T)0,
-			    (linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
-		{
+	    if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
+			(linenr_T)0,
+			(linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
+	    {
 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
-		    if (!aborting())
+		if (!aborting())
 #endif
-			EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
-		    if (savebuf != NULL)
-		    {
-			/* Put the text back from the save buffer.  First
-			 * delete any lines that readfile() added. */
-			while (!bufempty())
-			    if (ml_delete(curbuf->b_ml.ml_line_count, FALSE)
-								      == FAIL)
-				break;
-			(void)move_lines(savebuf, buf);
-		    }
-		}
-		else
+		    EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
+		if (savebuf != NULL)
 		{
-		    /* Mark the buffer as unmodified and free undo info. */
-		    unchanged(buf, TRUE);
-		    u_blockfree(buf);
-		    u_clearall(buf);
+		    /* Put the text back from the save buffer.  First
+		     * delete any lines that readfile() added. */
+		    while (!bufempty())
+			if (ml_delete(curbuf->b_ml.ml_line_count, FALSE)
+								  == FAIL)
+			    break;
+		    (void)move_lines(savebuf, buf);
 		}
 	    }
-	    vim_free(ea.cmd);
+	    else
+	    {
+		/* Mark the buffer as unmodified and free undo info. */
+		unchanged(buf, TRUE);
+		u_blockfree(buf);
+		u_clearall(buf);
+	    }
+	}
+	vim_free(ea.cmd);
 
-	    if (savebuf != NULL)
-		wipe_buffer(savebuf, FALSE);
+	if (savebuf != NULL)
+	    wipe_buffer(savebuf, FALSE);
 
 #ifdef FEAT_DIFF
-	    /* Invalidate diff info if necessary. */
-	    diff_invalidate();
+	/* Invalidate diff info if necessary. */
+	diff_invalidate();
 #endif
 
-	    /* Restore the topline and cursor position and check it (lines may
-	     * have been removed). */
-	    if (old_topline > curbuf->b_ml.ml_line_count)
-		curwin->w_topline = curbuf->b_ml.ml_line_count;
-	    else
-		curwin->w_topline = old_topline;
-	    curwin->w_cursor = old_cursor;
-	    check_cursor();
-	    update_topline();
+	/* Restore the topline and cursor position and check it (lines may
+	 * have been removed). */
+	if (old_topline > curbuf->b_ml.ml_line_count)
+	    curwin->w_topline = curbuf->b_ml.ml_line_count;
+	else
+	    curwin->w_topline = old_topline;
+	curwin->w_cursor = old_cursor;
+	check_cursor();
+	update_topline();
 #ifdef FEAT_AUTOCMD
-	    keep_filetype = FALSE;
+	keep_filetype = FALSE;
 #endif
 #ifdef FEAT_FOLDING
-	    {
-		win_T *wp;
+	{
+	    win_T *wp;
 
-		/* Update folds unless they are defined manually. */
-		FOR_ALL_WINDOWS(wp)
-		    if (wp->w_buffer == curwin->w_buffer
-			    && !foldmethodIsManual(wp))
-			foldUpdateAll(wp);
-	    }
-#endif
-	    /* If the mode didn't change and 'readonly' was set, keep the old
-	     * value; the user probably used the ":view" command.  But don't
-	     * reset it, might have had a read error. */
-	    if (orig_mode == curbuf->b_orig_mode)
-		curbuf->b_p_ro |= old_ro;
+	    /* Update folds unless they are defined manually. */
+	    FOR_ALL_WINDOWS(wp)
+		if (wp->w_buffer == curwin->w_buffer
+			&& !foldmethodIsManual(wp))
+		    foldUpdateAll(wp);
 	}
-
-#ifdef FEAT_AUTOCMD
-	/* restore curwin/curbuf and a few other things */
-	aucmd_restbuf(&aco);
-	/* Careful: autocommands may have made "buf" invalid! */
-#else
-	curwin->w_buffer = save_curbuf;
-	curbuf = save_curbuf;
 #endif
+	/* If the mode didn't change and 'readonly' was set, keep the old
+	 * value; the user probably used the ":view" command.  But don't
+	 * reset it, might have had a read error. */
+	if (orig_mode == curbuf->b_orig_mode)
+	    curbuf->b_p_ro |= old_ro;
     }
 
-#ifdef FEAT_GUI
-    /* restore this in case an autocommand has set it; it would break
-     * 'mousefocus' */
-    need_mouse_correct = save_mouse_correct;
+#ifdef FEAT_AUTOCMD
+    /* restore curwin/curbuf and a few other things */
+    aucmd_restbuf(&aco);
+    /* Careful: autocommands may have made "buf" invalid! */
+#else
+    curwin->w_buffer = save_curbuf;
+    curbuf = save_curbuf;
 #endif
-
-    return retval;
 }
 
 /*ARGSUSED*/