diff --git a/src/buffer.c b/src/buffer.c
index 2b6fe28..9af8d50 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3018,9 +3018,15 @@
 	if (*p_titlestring != NUL)
 	{
 #ifdef FEAT_STL_OPT
+	    int	    use_sandbox = FALSE;
+
+# ifdef FEAT_EVAL
+	    use_sandbox = was_set_insecurely((char_u *)"titlestring");
+# endif
 	    if (stl_syntax & STL_IN_TITLE)
 		build_stl_str_hl(curwin, t_str, sizeof(buf),
-					      p_titlestring, 0, maxlen, NULL);
+					      p_titlestring, use_sandbox,
+					      0, maxlen, NULL);
 	    else
 #endif
 		t_str = p_titlestring;
@@ -3109,9 +3115,15 @@
 	if (*p_iconstring != NUL)
 	{
 #ifdef FEAT_STL_OPT
+	    int	    use_sandbox = FALSE;
+
+# ifdef FEAT_EVAL
+	    use_sandbox = was_set_insecurely((char_u *)"iconstring");
+# endif
 	    if (stl_syntax & STL_IN_ICON)
 		build_stl_str_hl(curwin, i_str, sizeof(buf),
-						    p_iconstring, 0, 0, NULL);
+						    p_iconstring, use_sandbox,
+						    0, 0, NULL);
 	    else
 #endif
 		i_str = p_iconstring;
@@ -3190,9 +3202,12 @@
 
 #if defined(FEAT_STL_OPT) || defined(PROTO)
 /*
- * Build a string from the status line items in fmt.
+ * Build a string from the status line items in "fmt".
  * Return length of string in screen cells.
  *
+ * Normally works for window "wp", except when working for 'tabline' then it
+ * is "curwin".
+ *
  * Items are drawn interspersed with the text that surrounds it
  * Specials: %-<wid>(xxx%) => group, %= => middle marker, %< => truncation
  * Item: %-<minwid>.<maxwid><itemch> All but <itemch> are optional
@@ -3201,11 +3216,12 @@
  * or truncated if too long, fillchar is used for all whitespace.
  */
     int
-build_stl_str_hl(wp, out, outlen, fmt, fillchar, maxwidth, hl)
+build_stl_str_hl(wp, out, outlen, fmt, use_sandbox, fillchar, maxwidth, hl)
     win_T	*wp;
     char_u	*out;		/* buffer to write into */
     size_t	outlen;		/* length of out[] */
     char_u	*fmt;
+    int		use_sandbox;	/* "fmt" was set insecurely, use sandbox */
     int		fillchar;
     int		maxwidth;
     struct stl_hlrec *hl;
@@ -3501,8 +3517,7 @@
 	    curwin = wp;
 	    curbuf = wp->w_buffer;
 
-	    str = eval_to_string_safe(p, &t,
-				  was_set_insecurely((char_u *)"statusline"));
+	    str = eval_to_string_safe(p, &t, use_sandbox);
 
 	    curwin = o_curwin;
 	    curbuf = o_curbuf;
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 1a87886..1eefcd8 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -163,7 +163,6 @@
 # define ex_resize		ex_ni
 # define ex_splitview		ex_ni
 # define ex_stag		ex_ni
-# define ex_tabedit		ex_ni
 # define ex_tab			ex_ni
 # define ex_tabs		ex_ni
 # define ex_tabclose		ex_ni
@@ -6305,7 +6304,8 @@
 {
     /* First close all the windows but the current one.  If that worked then
      * close the last window in this tab, that will close it. */
-    close_others(TRUE, forceit);
+    if (lastwin != firstwin)
+	close_others(TRUE, forceit);
     if (lastwin == firstwin)
 	ex_win_close(forceit, curwin, NULL);
 # ifdef FEAT_GUI
@@ -6863,12 +6863,17 @@
  * :new [[+command] file]	split window with no or new file
  * :vnew [[+command] file]	split vertically window with no or new file
  * :sfind [+command] file	split window with file in 'path'
+ *
+ * :tabedit			open new Tab page with empty window
+ * :tabedit [+command] file	open new Tab page and edit "file"
+ * :tabnew [[+command] file]	just like :tabedit
+ * :tabfind [+command] file	open new Tab page and find "file"
  */
     void
 ex_splitview(eap)
     exarg_T	*eap;
 {
-    win_T	*old_curwin;
+    win_T	*old_curwin = curwin;
 # if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
     char_u	*fname = NULL;
 # endif
@@ -6884,7 +6889,6 @@
     }
 # endif
 
-    old_curwin = curwin;
 # ifdef FEAT_GUI
     need_mouse_correct = TRUE;
 # endif
@@ -6904,7 +6908,7 @@
 # endif
 
 # ifdef FEAT_SEARCHPATH
-    if (eap->cmdidx == CMD_sfind)
+    if (eap->cmdidx == CMD_sfind || eap->cmdidx == CMD_tabfind)
     {
 	fname = find_file_in_path(eap->arg, (int)STRLEN(eap->arg),
 					  FNAME_MESS, TRUE, curbuf->b_ffname);
@@ -6946,7 +6950,26 @@
     cmdmod.browse = FALSE;	/* Don't browse again in do_ecmd(). */
 # endif
 
-    if (win_split(eap->addr_count > 0 ? (int)eap->line2 : 0,
+    /*
+     * Either open new tab page or split the window.
+     */
+    if (eap->cmdidx == CMD_tabedit
+	    || eap->cmdidx == CMD_tabfind
+	    || eap->cmdidx == CMD_tabnew)
+    {
+	if (win_new_tabpage() != FAIL)
+	{
+	    do_exedit(eap, NULL);
+
+	    /* set the alternate buffer for the window we came from */
+	    if (curwin != old_curwin
+		    && win_valid(old_curwin)
+		    && old_curwin->w_buffer != curbuf
+		    && !cmdmod.keepalt)
+		old_curwin->w_alt_fnum = curbuf->b_fnum;
+	}
+    }
+    else if (win_split(eap->addr_count > 0 ? (int)eap->line2 : 0,
 				     *eap->cmd == 'v' ? WSP_VERT : 0) != FAIL)
     {
 # ifdef FEAT_SCROLLBIND
@@ -6975,85 +6998,6 @@
 }
 
 /*
- * :tabedit			open new Tab page with empty window
- * :tabedit [+command] file	open new Tab page and edit "file"
- * :tabnew [[+command] file]	just like :tabedit
- * :tabfind [+command] file	open new Tab page and find "file"
- */
-    void
-ex_tabedit(eap)
-    exarg_T	*eap;
-{
-# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
-    char_u	*fname = NULL;
-# endif
-# ifdef FEAT_BROWSE
-    int		browse_flag = cmdmod.browse;
-# endif
-
-# ifdef FEAT_GUI
-    need_mouse_correct = TRUE;
-# endif
-
-# ifdef FEAT_SEARCHPATH
-    if (eap->cmdidx == CMD_tabfind)
-    {
-	fname = find_file_in_path(eap->arg, (int)STRLEN(eap->arg),
-					  FNAME_MESS, TRUE, curbuf->b_ffname);
-	if (fname == NULL)
-	    goto theend;
-	eap->arg = fname;
-    }
-#  ifdef FEAT_BROWSE
-    else
-#  endif
-# endif
-# ifdef FEAT_BROWSE
-    if (cmdmod.browse)
-    {
-	if (
-#  ifdef FEAT_GUI
-	    !gui.in_use &&
-#  endif
-		au_has_group((char_u *)"FileExplorer"))
-	{
-	    /* No browsing supported but we do have the file explorer:
-	     * Edit the directory. */
-	    if (*eap->arg == NUL || !mch_isdir(eap->arg))
-		eap->arg = (char_u *)".";
-	}
-	else
-	{
-	    fname = do_browse(0, (char_u *)_("Edit File in new tab page"),
-					  eap->arg, NULL, NULL, NULL, curbuf);
-	    if (fname == NULL)
-		goto theend;
-	    eap->arg = fname;
-	}
-    }
-    cmdmod.browse = FALSE;	/* Don't browse again in do_ecmd(). */
-# endif
-
-    if (win_new_tabpage() != FAIL)
-    {
-# ifdef FEAT_SCROLLBIND
-	curwin->w_p_scb = FALSE;
-# endif
-	if (*eap->arg != NUL)
-	    do_exedit(eap, NULL);
-    }
-
-# ifdef FEAT_BROWSE
-    cmdmod.browse = browse_flag;
-# endif
-
-# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
-theend:
-    vim_free(fname);
-# endif
-}
-
-/*
  * :tab command
  */
     void
@@ -7316,12 +7260,14 @@
     }
 
     if ((eap->cmdidx == CMD_new
+		|| eap->cmdidx == CMD_tabnew
+		|| eap->cmdidx == CMD_tabedit
 #ifdef FEAT_VERTSPLIT
 		|| eap->cmdidx == CMD_vnew
 #endif
 		) && *eap->arg == NUL)
     {
-	/* ":new" without argument: edit an new empty buffer */
+	/* ":new" or ":tabnew" without argument: edit an new empty buffer */
 	setpcmark();
 	(void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE,
 			       ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0));
diff --git a/src/os_mac.h b/src/os_mac.h
index 5e28659..82d91a8 100644
--- a/src/os_mac.h
+++ b/src/os_mac.h
@@ -93,12 +93,12 @@
  */
 
 /* Got problem trying to use shared library in 68k */
-#if !defined(__POWERPC__) && defined(FEAT_PYTHON)
+#if !defined(__POWERPC__) && !defined(__i386__) && defined(FEAT_PYTHON)
 # undef FEAT_PYTHON
 # warning Auto-disabling Python. Not yet supported in 68k.
 #endif
 
-#if !defined(__POWERPC__) && !defined(__ppc__)
+#if !defined(__POWERPC__) && !defined(__ppc__) && !defined(__i386__)
 # if !__option(enumsalwaysint)
 #  error "You must compile with enums always int!"
 # endif
diff --git a/src/proto/buffer.pro b/src/proto/buffer.pro
index 1061e36..07ec64c 100644
--- a/src/proto/buffer.pro
+++ b/src/proto/buffer.pro
@@ -40,7 +40,7 @@
 void maketitle __ARGS((void));
 void resettitle __ARGS((void));
 void free_titles __ARGS((void));
-int build_stl_str_hl __ARGS((win_T *wp, char_u *out, size_t outlen, char_u *fmt, int fillchar, int maxwidth, struct stl_hlrec *hl));
+int build_stl_str_hl __ARGS((win_T *wp, char_u *out, size_t outlen, char_u *fmt, int insecure, int fillchar, int maxwidth, struct stl_hlrec *hl));
 void get_rel_pos __ARGS((win_T *wp, char_u *str));
 int append_arg_number __ARGS((win_T *wp, char_u *buf, int add_file, int maxlen));
 char_u *fix_fname __ARGS((char_u *fname));
diff --git a/src/vim.h b/src/vim.h
index ef86e81..e4e26df 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -138,7 +138,7 @@
 # endif
 #endif
 #ifdef MACOS
-# if defined(__POWERPC__) || defined(__fourbyteints__) \
+# if defined(__POWERPC__) || defined(MACOS_X) || defined(__fourbyteints__) \
   || defined(__MRC__) || defined(__SC__) || defined(__APPLE_CC__)/* MPW Compilers */
 #  define SIZEOF_INT 4
 # else
@@ -1109,8 +1109,8 @@
     EVENT_SPELLFILEMISSING,	/* spell file missing */
     EVENT_CURSORMOVED,		/* cursor was moved */
     EVENT_CURSORMOVEDI,		/* cursor was moved in Insert mode */
-    EVENT_TABLEAVEPRE,		/* before leaving a tab page */
-    EVENT_TABENTERPOST,		/* after entering a tab page */
+    EVENT_TABLEAVE,		/* before leaving a tab page */
+    EVENT_TABENTER,		/* after entering a tab page */
     NUM_EVENTS			/* MUST be the last one */
 };
 
diff --git a/src/window.c b/src/window.c
index b117fe3..3419a01 100644
--- a/src/window.c
+++ b/src/window.c
@@ -16,6 +16,7 @@
 static int path_is_url __ARGS((char_u *p));
 #if defined(FEAT_WINDOWS) || defined(PROTO)
 static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
+static void win_init __ARGS((win_T *newp, win_T *oldp));
 static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col));
 static void frame_setheight __ARGS((frame_T *curfrp, int height));
 #ifdef FEAT_VERTSPLIT
@@ -42,7 +43,7 @@
 static void frame_fix_width __ARGS((win_T *wp));
 #endif
 #endif
-static int win_alloc_firstwin __ARGS((void));
+static int win_alloc_firstwin __ARGS((win_T *oldwin));
 #if defined(FEAT_WINDOWS) || defined(PROTO)
 static tabpage_T *alloc_tabpage __ARGS((void));
 static void free_tabpage __ARGS((tabpage_T *tp));
@@ -67,7 +68,7 @@
 
 static void make_snapshot __ARGS((void));
 static void make_snapshot_rec __ARGS((frame_T *fr, frame_T **frp));
-static void clear_snapshot __ARGS((void));
+static void clear_snapshot __ARGS((tabpage_T *tp));
 static void clear_snapshot_rec __ARGS((frame_T *fr));
 static void restore_snapshot __ARGS((int close_curwin));
 static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
@@ -627,13 +628,13 @@
     if (flags & WSP_HELP)
 	make_snapshot();
     else
-	clear_snapshot();
+	clear_snapshot(curtab);
 
     return win_split_ins(size, flags, NULL, 0);
 }
 
 /*
- * When "newwin" is NULL: split a window in two.
+ * When "newwin" is NULL: split the current window in two.
  * When "newwin" is not NULL: insert this window at the far
  * top/left/right/bottom.
  * return FAIL for failure, OK otherwise
@@ -807,55 +808,8 @@
 	if (wp == NULL)
 	    return FAIL;
 
-	/*
-	 * make the contents of the new window the same as the current one
-	 */
-	wp->w_buffer = curbuf;
-	curbuf->b_nwindows++;
-	wp->w_cursor = curwin->w_cursor;
-	wp->w_valid = 0;
-	wp->w_curswant = curwin->w_curswant;
-	wp->w_set_curswant = curwin->w_set_curswant;
-	wp->w_topline = curwin->w_topline;
-#ifdef FEAT_DIFF
-	wp->w_topfill = curwin->w_topfill;
-#endif
-	wp->w_leftcol = curwin->w_leftcol;
-	wp->w_pcmark = curwin->w_pcmark;
-	wp->w_prev_pcmark = curwin->w_prev_pcmark;
-	wp->w_alt_fnum = curwin->w_alt_fnum;
-	wp->w_fraction = curwin->w_fraction;
-	wp->w_prev_fraction_row = curwin->w_prev_fraction_row;
-#ifdef FEAT_JUMPLIST
-	copy_jumplist(curwin, wp);
-#endif
-#ifdef FEAT_QUICKFIX
-	copy_loclist(curwin, wp);
-#endif
-	if (curwin->w_localdir != NULL)
-	    wp->w_localdir = vim_strsave(curwin->w_localdir);
-
-	/* Use the same argument list. */
-	wp->w_alist = curwin->w_alist;
-	++wp->w_alist->al_refcount;
-	wp->w_arg_idx = curwin->w_arg_idx;
-
-	/*
-	 * copy tagstack and options from existing window
-	 */
-	for (i = 0; i < curwin->w_tagstacklen; i++)
-	{
-	    wp->w_tagstack[i] = curwin->w_tagstack[i];
-	    if (wp->w_tagstack[i].tagname != NULL)
-		wp->w_tagstack[i].tagname =
-				       vim_strsave(wp->w_tagstack[i].tagname);
-	}
-	wp->w_tagstackidx = curwin->w_tagstackidx;
-	wp->w_tagstacklen = curwin->w_tagstacklen;
-	win_copy_options(curwin, wp);
-#ifdef FEAT_FOLDING
-	copyFoldingState(curwin, wp);
-#endif
+	/* make the contents of the new window the same as the current one */
+	win_init(wp, curwin);
     }
 
     /*
@@ -1099,6 +1053,66 @@
     return OK;
 }
 
+/*
+ * Initialize window "newp" from window "oldp".
+ * Used when splitting a window and when creating a new tab page.
+ * The windows will both edit the same buffer.
+ */
+    static void
+win_init(newp, oldp)
+    win_T	*newp;
+    win_T	*oldp;
+{
+    int		i;
+
+    newp->w_buffer = oldp->w_buffer;
+    oldp->w_buffer->b_nwindows++;
+    newp->w_cursor = oldp->w_cursor;
+    newp->w_valid = 0;
+    newp->w_curswant = oldp->w_curswant;
+    newp->w_set_curswant = oldp->w_set_curswant;
+    newp->w_topline = oldp->w_topline;
+#ifdef FEAT_DIFF
+    newp->w_topfill = oldp->w_topfill;
+#endif
+    newp->w_leftcol = oldp->w_leftcol;
+    newp->w_pcmark = oldp->w_pcmark;
+    newp->w_prev_pcmark = oldp->w_prev_pcmark;
+    newp->w_alt_fnum = oldp->w_alt_fnum;
+    newp->w_fraction = oldp->w_fraction;
+    newp->w_prev_fraction_row = oldp->w_prev_fraction_row;
+#ifdef FEAT_JUMPLIST
+    copy_jumplist(oldp, newp);
+#endif
+#ifdef FEAT_QUICKFIX
+    copy_loclist(oldp, newp);
+#endif
+    if (oldp->w_localdir != NULL)
+	newp->w_localdir = vim_strsave(oldp->w_localdir);
+
+    /* Use the same argument list. */
+    newp->w_alist = oldp->w_alist;
+    ++newp->w_alist->al_refcount;
+    newp->w_arg_idx = oldp->w_arg_idx;
+
+    /*
+     * copy tagstack and options from existing window
+     */
+    for (i = 0; i < oldp->w_tagstacklen; i++)
+    {
+	newp->w_tagstack[i] = oldp->w_tagstack[i];
+	if (newp->w_tagstack[i].tagname != NULL)
+	    newp->w_tagstack[i].tagname =
+				   vim_strsave(newp->w_tagstack[i].tagname);
+    }
+    newp->w_tagstackidx = oldp->w_tagstackidx;
+    newp->w_tagstacklen = oldp->w_tagstacklen;
+    win_copy_options(oldp, newp);
+# ifdef FEAT_FOLDING
+    copyFoldingState(oldp, newp);
+# endif
+}
+
 #endif /* FEAT_WINDOWS */
 
 #if defined(FEAT_WINDOWS) || defined(PROTO)
@@ -1886,7 +1900,7 @@
     if (win->w_buffer->b_help)
 	help_window = TRUE;
     else
-	clear_snapshot();
+	clear_snapshot(curtab);
 
 #ifdef FEAT_AUTOCMD
     if (win == curwin)
@@ -2813,35 +2827,33 @@
 #endif /* FEAT_WINDOWS */
 
 /*
- * init the cursor in the window
- *
- * called when a new file is being edited
+ * Init the current window "curwin".
+ * Called when a new file is being edited.
  */
     void
-win_init(wp)
-    win_T	*wp;
+curwin_init()
 {
-    redraw_win_later(wp, NOT_VALID);
-    wp->w_lines_valid = 0;
-    wp->w_cursor.lnum = 1;
-    wp->w_curswant = wp->w_cursor.col = 0;
+    redraw_win_later(curwin, NOT_VALID);
+    curwin->w_lines_valid = 0;
+    curwin->w_cursor.lnum = 1;
+    curwin->w_curswant = curwin->w_cursor.col = 0;
 #ifdef FEAT_VIRTUALEDIT
-    wp->w_cursor.coladd = 0;
+    curwin->w_cursor.coladd = 0;
 #endif
-    wp->w_pcmark.lnum = 1;	/* pcmark not cleared but set to line 1 */
-    wp->w_pcmark.col = 0;
-    wp->w_prev_pcmark.lnum = 0;
-    wp->w_prev_pcmark.col = 0;
-    wp->w_topline = 1;
+    curwin->w_pcmark.lnum = 1;	/* pcmark not cleared but set to line 1 */
+    curwin->w_pcmark.col = 0;
+    curwin->w_prev_pcmark.lnum = 0;
+    curwin->w_prev_pcmark.col = 0;
+    curwin->w_topline = 1;
 #ifdef FEAT_DIFF
-    wp->w_topfill = 0;
+    curwin->w_topfill = 0;
 #endif
-    wp->w_botline = 2;
+    curwin->w_botline = 2;
 #ifdef FEAT_FKMAP
     if (curwin->w_p_rl)
-	wp->w_farsi = W_CONV + W_R_L;
+	curwin->w_farsi = W_CONV + W_R_L;
     else
-	wp->w_farsi = W_CONV;
+	curwin->w_farsi = W_CONV;
 #endif
 }
 
@@ -2853,7 +2865,7 @@
     int
 win_alloc_first()
 {
-    if (win_alloc_firstwin() == FAIL)
+    if (win_alloc_firstwin(NULL) == FAIL)
 	return FAIL;
 
 #ifdef FEAT_WINDOWS
@@ -2867,23 +2879,43 @@
 }
 
 /*
- * Allocate one window and put an empty buffer in it.
- * Called to create the first window in a new tab page.
+ * Allocate the first window or the first window in a new tab page.
+ * When "oldwin" is NULL create an empty buffer for it.
+ * When "oldwin" is not NULL copy info from it to the new window (only with
+ * FEAT_WINDOWS).
  * Return FAIL when something goes wrong (out of memory).
  */
     static int
-win_alloc_firstwin()
+win_alloc_firstwin(oldwin)
+    win_T	*oldwin;
 {
     curwin = win_alloc(NULL);
-    curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
-    if (curwin == NULL || curbuf == NULL)
-	return FAIL;
-    curwin->w_buffer = curbuf;
-    curbuf->b_nwindows = 1;	/* there is one window */
+    if (oldwin == NULL)
+    {
+	/* Very first window, need to create an empty buffer for it and
+	 * initialize from scratch. */
+	curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
+	if (curwin == NULL || curbuf == NULL)
+	    return FAIL;
+	curwin->w_buffer = curbuf;
+	curbuf->b_nwindows = 1;	/* there is one window */
 #ifdef FEAT_WINDOWS
-    curwin->w_alist = &global_alist;
+	curwin->w_alist = &global_alist;
 #endif
-    win_init(curwin);		/* init current window */
+	curwin_init();		/* init current window */
+    }
+#ifdef FEAT_WINDOWS
+    else
+    {
+	/* First window in new tab page, initialize it from "oldwin". */
+	win_init(curwin, oldwin);
+
+# ifdef FEAT_SCROLLBIND
+	/* We don't want scroll-binding in the first window. */
+	curwin->w_p_scb = FALSE;
+# endif
+    }
+#endif
 
     topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
     if (topframe == NULL)
@@ -2944,11 +2976,13 @@
 # ifdef FEAT_DIFF
     diff_clear(tp);
 # endif
+    clear_snapshot(tp);
     vim_free(tp);
 }
 
 /*
- * Create a new Tab page with one empty window.
+ * Create a new Tab page with one window.
+ * It will edit the current buffer, like after ":split".
  * Put it just after the current Tab page.
  * Return FAIL or OK.
  */
@@ -2963,7 +2997,7 @@
 	return FAIL;
 
     /* Remember the current windows in this Tab page. */
-    if (leave_tabpage(NULL) == FAIL)
+    if (leave_tabpage(curbuf) == FAIL)
     {
 	vim_free(newtp);
 	return FAIL;
@@ -2971,11 +3005,8 @@
     curtab = newtp;
 
     /* Create a new empty window. */
-    if (win_alloc_firstwin() == OK)
+    if (win_alloc_firstwin(tp->tp_curwin) == OK)
     {
-	/* copy options from previous to new curwin */
-	win_copy_options(tp->tp_curwin, curwin);
-
 	/* Make the new Tab page the new topframe. */
 	newtp->tp_next = tp->tp_next;
 	tp->tp_next = newtp;
@@ -2985,6 +3016,10 @@
 	newtp->tp_topframe = topframe;
 	last_status(FALSE);
 	redraw_all_later(CLEAR);
+#ifdef FEAT_AUTOCMD
+	apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
+	apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
+#endif
 	return OK;
     }
 
@@ -3082,7 +3117,7 @@
     apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf);
     if (curtab != tp)
 	return FAIL;
-    apply_autocmds(EVENT_TABLEAVEPRE, NULL, NULL, FALSE, curbuf);
+    apply_autocmds(EVENT_TABLEAVE, NULL, NULL, FALSE, curbuf);
     if (curtab != tp)
 	return FAIL;
 #endif
@@ -3104,6 +3139,7 @@
 
 /*
  * Start using tab page "tp".
+ * Only to be used after leave_tabpage() or freeing the current tab page.
  */
 /*ARGSUSED*/
     static void
@@ -3117,12 +3153,14 @@
     firstwin = tp->tp_firstwin;
     lastwin = tp->tp_lastwin;
     topframe = tp->tp_topframe;
+#ifdef FEAT_AUTOCMD
+    apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
+#endif
+
     win_enter_ext(tp->tp_curwin, FALSE, TRUE);
     prevwin = tp->tp_prevwin;
 
 #ifdef FEAT_AUTOCMD
-    apply_autocmds(EVENT_TABENTERPOST, NULL, NULL, FALSE, curbuf);
-    apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
     if (old_curbuf != curbuf)
 	apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
 #endif
@@ -3169,6 +3207,14 @@
     tabpage_T	*tp;
     int		i;
 
+    /* If there is only one it can't work. */
+    if (first_tabpage->tp_next == NULL)
+    {
+	if (n > 1)
+	    beep_flush();
+	return;
+    }
+
     if (n == 0)
     {
 	/* No count, go to next tab page, wrap around end. */
@@ -5018,7 +5064,7 @@
     int
 tabpageline_height()
 {
-    switch (p_tal)
+    switch (p_stal)
     {
 	case 0: return 0;
 	case 1: return (first_tabpage->tp_next == NULL) ? 0 : 1;
@@ -5419,7 +5465,6 @@
  * fr_child
  * fr_win (only valid for the old curwin, NULL otherwise)
  */
-static frame_T *snapshot = NULL;
 
 /*
  * Create a snapshot of the current frame sizes.
@@ -5427,8 +5472,8 @@
     static void
 make_snapshot()
 {
-    clear_snapshot();
-    make_snapshot_rec(topframe, &snapshot);
+    clear_snapshot(curtab);
+    make_snapshot_rec(topframe, &curtab->tp_snapshot);
 }
 
     static void
@@ -5456,10 +5501,11 @@
  * Remove any existing snapshot.
  */
     static void
-clear_snapshot()
+clear_snapshot(tp)
+    tabpage_T	*tp;
 {
-    clear_snapshot_rec(snapshot);
-    snapshot = NULL;
+    clear_snapshot_rec(tp->tp_snapshot);
+    tp->tp_snapshot = NULL;
 }
 
     static void
@@ -5485,20 +5531,20 @@
 {
     win_T	*wp;
 
-    if (snapshot != NULL
+    if (curtab->tp_snapshot != NULL
 # ifdef FEAT_VERTSPLIT
-	    && snapshot->fr_width == topframe->fr_width
+	    && curtab->tp_snapshot->fr_width == topframe->fr_width
 # endif
-	    && snapshot->fr_height == topframe->fr_height
-	    && check_snapshot_rec(snapshot, topframe) == OK)
+	    && curtab->tp_snapshot->fr_height == topframe->fr_height
+	    && check_snapshot_rec(curtab->tp_snapshot, topframe) == OK)
     {
-	wp = restore_snapshot_rec(snapshot, topframe);
+	wp = restore_snapshot_rec(curtab->tp_snapshot, topframe);
 	win_comp_pos();
 	if (wp != NULL && close_curwin)
 	    win_goto(wp);
 	redraw_all_later(CLEAR);
     }
-    clear_snapshot();
+    clear_snapshot(curtab);
 }
 
 /*
