diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 3cb064e9c289e459b361971cf29fe737d638f734..d53c51eb8774fc5763721feb58de671b92ce0cd7 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -375,6 +375,7 @@ static int	makeopens __ARGS((FILE *fd, char_u *dirnow));
 static int	put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp));
 static void	ex_loadview __ARGS((exarg_T *eap));
 static char_u	*get_view_file __ARGS((int c));
+static int	did_lcd;	/* whether ":lcd" was produced for a session */
 #else
 # define ex_loadview		ex_ni
 #endif
@@ -8573,6 +8574,8 @@ ex_mkrc(eap)
     }
 
 #ifdef FEAT_SESSION
+    did_lcd = FALSE;
+
     /* ":mkview" or ":mkview 9": generate file name with 'viewdir' */
     if (eap->cmdidx == CMD_mkview
 	    && (*eap->arg == NUL
@@ -10327,6 +10330,7 @@ put_view(fd, wp, add_edit, flagp)
 		|| ses_put_fname(fd, wp->w_localdir, flagp) == FAIL
 		|| put_eol(fd) == FAIL)
 	    return FAIL;
+	did_lcd = TRUE;
     }
 
     return OK;
@@ -10384,11 +10388,14 @@ ses_fname(fd, buf, flagp)
     char_u	*name;
 
     /* Use the short file name if the current directory is known at the time
-     * the session file will be sourced.  Don't do this for ":mkview", we
-     * don't know the current directory. */
+     * the session file will be sourced.
+     * Don't do this for ":mkview", we don't know the current directory.
+     * Don't do this after ":lcd", we don't keep track of what the current
+     * directory is. */
     if (buf->b_sfname != NULL
 	    && flagp == &ssop_flags
-	    && (ssop_flags & (SSOP_CURDIR | SSOP_SESDIR)))
+	    && (ssop_flags & (SSOP_CURDIR | SSOP_SESDIR))
+	    && !did_lcd)
 	name = buf->b_sfname;
     else
 	name = buf->b_ffname;
diff --git a/src/fileio.c b/src/fileio.c
index 20406bb495b4bb6578537a3801dda35e0daaec9f..a612c5961f1a28ed7e797c068d06ad5d0ccf8f71 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -8086,7 +8086,10 @@ ex_doautoall(eap)
 
 	    /* execute the autocommands for this buffer */
 	    retval = do_doautocmd(eap->arg, FALSE);
-	    do_modelines(0);
+
+	    /* Execute the modeline settings, but don't set window-local
+	     * options if we are using the current window for another buffer. */
+	    do_modelines(aco.save_curwin == NULL ? OPT_NOWIN : 0);
 
 	    /* restore the current window */
 	    aucmd_restbuf(&aco);
diff --git a/src/version.c b/src/version.c
index d61acc7a983c89be94d7ef2bf12042e2e5ba4ebb..358d4b5a56dcef0ad5a25f0b14fab24974492c7f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -666,6 +666,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    239,
 /**/
     238,
 /**/