updated for version 7.0050
diff --git a/src/buffer.c b/src/buffer.c
index 6a6ffc6..a634062 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3008,7 +3008,7 @@
 	    /* format: "fname + (path) (1 of 2) - VIM" */
 
 	    if (curbuf->b_fname == NULL)
-		STRCPY(buf, _("[No file]"));
+		STRCPY(buf, _("[No Name]"));
 	    else
 	    {
 		p = transstr(gettail(curbuf->b_fname));
diff --git a/src/edit.c b/src/edit.c
index a889736..ae00c2a 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -6270,6 +6270,10 @@
 
 	if (--*count > 0)	/* repeat what was typed */
 	{
+	    /* Vi repeats the insert without replacing characters. */
+	    if (vim_strchr(p_cpo, CPO_REPLCNT) != NULL)
+		State &= ~REPLACE_FLAG;
+
 	    (void)start_redo_ins();
 	    if (cmdchar == 'r' || cmdchar == 'v')
 		stuffReadbuff(ESC_STR);	/* no ESC in redo buffer */
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 899e4c8..d2e933a 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -6457,6 +6457,7 @@
 ex_preserve(eap)
     exarg_T	*eap;
 {
+    curbuf->b_flags |= BF_PRESERVED;
     ml_preserve(curbuf, TRUE);
 }
 
diff --git a/src/ex_getln.c b/src/ex_getln.c
index a7dfd9a..05c85b4 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -205,13 +205,25 @@
      * set some variables for redrawcmd()
      */
     ccline.cmdfirstc = (firstc == '@' ? 0 : firstc);
-    ccline.cmdindent = indent;
-    alloc_cmdbuff(exmode_active ? 250 : 0); /* alloc initial ccline.cmdbuff */
+    ccline.cmdindent = (firstc > 0 ? indent : 0);
+
+    /* alloc initial ccline.cmdbuff */
+    alloc_cmdbuff(exmode_active ? 250 : indent + 1);
     if (ccline.cmdbuff == NULL)
 	return NULL;			    /* out of memory */
     ccline.cmdlen = ccline.cmdpos = 0;
     ccline.cmdbuff[0] = NUL;
 
+    /* autoindent for :insert and :append */
+    if (firstc <= 0)
+    {
+	copy_spaces(ccline.cmdbuff, indent);
+	ccline.cmdbuff[indent] = NUL;
+	ccline.cmdpos = indent;
+	ccline.cmdspos = indent;
+	ccline.cmdlen = indent;
+    }
+
     ExpandInit(&xpc);
 
 #ifdef FEAT_RIGHTLEFT
@@ -1878,7 +1890,7 @@
     garray_T		line_ga;
     int			len;
     int			off = 0;
-    char_u		*p;
+    char_u		*pend;
     int			finished = FALSE;
 #if defined(FEAT_GUI) || defined(NO_COOKED_INPUT)
     int			startcol = 0;
@@ -1897,6 +1909,7 @@
 	msg_putchar('\n');
     if (c == ':')
     {
+	/* indent that is only displayed, not in the line itself */
 	msg_putchar(':');
 	while (indent-- > 0)
 	    msg_putchar(' ');
@@ -1907,6 +1920,25 @@
 
     ga_init2(&line_ga, 1, 30);
 
+    /* autoindent for :insert and :append is in the line itself */
+    if (c <= 0)
+    {
+#if defined(FEAT_GUI) || defined(NO_COOKED_INPUT)
+	vcol = indent;
+#endif
+	while (indent >= 8)
+	{
+	    ga_append(&line_ga, TAB);
+	    msg_puts((char_u *)"        ");
+	    indent -= 8;
+	}
+	while (indent-- > 0)
+	{
+	    ga_append(&line_ga, ' ');
+	    msg_putchar(' ');
+	}
+    }
+
     /*
      * Get the line, one character at a time.
      */
@@ -1915,14 +1947,14 @@
     {
 	if (ga_grow(&line_ga, 40) == FAIL)
 	    break;
-	p = (char_u *)line_ga.ga_data + line_ga.ga_len;
+	pend = (char_u *)line_ga.ga_data + line_ga.ga_len;
 
 	/* Get one character (inchar gets a third of maxlen characters!) */
-	len = inchar(p + off, 3, -1L, 0);
+	len = inchar(pend + off, 3, -1L, 0);
 	if (len < 0)
 	    continue;	    /* end of input script reached */
 	/* for a special character, we need at least three characters */
-	if ((*p == K_SPECIAL || *p == CSI) && off + len < 3)
+	if ((*pend == K_SPECIAL || *pend == CSI) && off + len < 3)
 	{
 	    off += len;
 	    continue;
@@ -1947,7 +1979,7 @@
 
 	    while (len > 0)
 	    {
-		c1 = *p++;
+		c1 = *pend++;
 		--len;
 		if ((c1 == K_SPECIAL
 #  if !defined(NO_COOKED_INPUT) || defined(FEAT_GUI)
@@ -1955,8 +1987,8 @@
 #  endif
 		    ) && len >= 2)
 		{
-		    c1 = TO_SPECIAL(p[0], p[1]);
-		    p += 2;
+		    c1 = TO_SPECIAL(pend[0], pend[1]);
+		    pend += 2;
 		    len -= 2;
 		}
 
@@ -2006,6 +2038,46 @@
 			continue;
 		    }
 
+		    if (c1 == Ctrl_T)
+			c1 = TAB;	/* very simplistic... */
+
+		    if (c1 == Ctrl_D)
+		    {
+			char_u	*p;
+
+			/* Delete one shiftwidth. */
+			p = (char_u *)line_ga.ga_data;
+			p[line_ga.ga_len] = NUL;
+			indent = get_indent_str(p, 8);
+			--indent;
+			indent -= indent % 8;
+			while (get_indent_str(p, 8) > indent)
+			{
+			    char_u *s = skipwhite(p);
+
+			    mch_memmove(s - 1, s, line_ga.ga_len - (s - p) + 1);
+			    --line_ga.ga_len;
+			}
+			msg_col = startcol;
+			for (vcol = 0; *p != NUL; ++p)
+			{
+			    if (*p == TAB)
+			    {
+				do
+				{
+				    msg_putchar(' ');
+				} while (++vcol % 8);
+			    }
+			    else
+			    {
+				msg_outtrans_len(p, 1);
+				vcol += char2cells(*p);
+			    }
+			}
+			msg_clr_eos();
+			continue;
+		    }
+
 		    if (c1 == Ctrl_V)
 		    {
 			escaped = TRUE;
@@ -2046,13 +2118,13 @@
 	    line_ga.ga_len += len;
 	}
 #endif
-	p = (char_u *)(line_ga.ga_data) + line_ga.ga_len;
-	if (line_ga.ga_len && p[-1] == '\n')
+	pend = (char_u *)(line_ga.ga_data) + line_ga.ga_len;
+	if (line_ga.ga_len && pend[-1] == '\n')
 	{
 	    finished = TRUE;
 	    --line_ga.ga_len;
-	    --p;
-	    *p = NUL;
+	    --pend;
+	    *pend = NUL;
 	}
     }
 
diff --git a/src/fileio.c b/src/fileio.c
index ea7c924..9dd1d49 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -433,7 +433,7 @@
      * Only set/reset b_p_ro when BF_CHECK_RO is set.
      */
     check_readonly = (newfile && (curbuf->b_flags & BF_CHECK_RO));
-    if (check_readonly && !readonlymode)    /* default: set file not readonly */
+    if (check_readonly && !readonlymode)
 	curbuf->b_p_ro = FALSE;
 
     if (newfile && !read_stdin && !read_buffer)
@@ -3499,8 +3499,8 @@
 #endif
 
     /* When using ":w!" and writing to the current file, readonly makes no
-     * sense, reset it */
-    if (forceit && overwriting)
+     * sense, reset it, unless 'Z' appears in 'cpoptions'.  */
+    if (forceit && overwriting && vim_strchr(p_cpo, CPO_KEEPRO) == NULL)
     {
 	buf->b_p_ro = FALSE;
 #ifdef FEAT_TITLE
diff --git a/src/main.aap b/src/main.aap
index 9356dd9..ddaa5c8 100644
--- a/src/main.aap
+++ b/src/main.aap
@@ -114,6 +114,7 @@
 
     MOTIF
 	GUI_SRC		= gui.c gui_motif.c gui_x11.c pty.c gui_beval.c
+		  	  gui_xmdlg.c gui_xmebw.c
 	GUI_OBJ		=
 	GUI_DEFS	= -DFEAT_GUI_MOTIF $NARROW_PROTO
 	GUI_IPATH	= $GUI_INC_LOC
diff --git a/src/main.c b/src/main.c
index 3b888f2..351225c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -826,8 +826,9 @@
 				/* "-w {scriptout}"	write to script */
 		if (vim_isdigit(((char_u *)argv[0])[argv_idx]))
 		{
-		    argv_idx = -1;
-		    break;			/* not implemented, ignored */
+		    i = get_number_arg((char_u *)argv[0], &argv_idx, 10);
+		    set_option_value((char_u *)"window", (long)i, NULL, 0);
+		    break;
 		}
 		want_argument = TRUE;
 		break;
@@ -848,7 +849,17 @@
 		restricted = TRUE;
 		break;
 
-	    case 'c':		/* "-c {command}" execute command */
+	    case 'c':		/* "-c{command}" or "-c {command}" execute
+				   command */
+		if (argv[0][argv_idx] != NUL)
+		{
+		    if (n_commands >= MAX_ARG_CMDS)
+			mainerr(ME_EXTRA_CMD, NULL);
+		    commands[n_commands++] = (char_u *)argv[0] + argv_idx;
+		    argv_idx = -1;
+		    break;
+		}
+		/*FALLTRHOUGH*/
 	    case 'S':		/* "-S {file}" execute Vim script */
 	    case 'i':		/* "-i {viminfo}" use for viminfo */
 #ifndef FEAT_DIFF
@@ -990,7 +1001,17 @@
 #endif
 		    break;
 
-		case 'w':	/* "-w {scriptout}" append to script file */
+		case 'w':	/* "-w {nr}" 'window' value */
+				/* "-w {scriptout}" append to script file */
+		    if (vim_isdigit(*((char_u *)argv[0])))
+		    {
+			argv_idx = 0;
+			i = get_number_arg((char_u *)argv[0], &argv_idx, 10);
+			set_option_value((char_u *)"window", (long)i, NULL, 0);
+			argv_idx = -1;
+			break;
+		    }
+		    /*FALLTRHOUGH*/
 		case 'W':	/* "-W {scriptout}" overwrite script file */
 		    if (scriptout != NULL)
 			goto scripterror;
diff --git a/src/misc1.c b/src/misc1.c
index 4d7cf60..658c30e 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -23,7 +23,6 @@
 #if defined(USE_EXE_NAME) && defined(MACOS_X)
 static char_u *remove_tail_with_ext __ARGS((char_u *p, char_u *pend, char_u *ext));
 #endif
-static int get_indent_str __ARGS((char_u *ptr, int ts));
 static int copy_indent __ARGS((int size, char_u	*src));
 
 /*
@@ -63,7 +62,7 @@
  * count the size (in window cells) of the indent in line "ptr", with
  * 'tabstop' at "ts"
  */
-    static int
+    int
 get_indent_str(ptr, ts)
     char_u	*ptr;
     int		ts;
@@ -79,7 +78,7 @@
 	else
 	    break;
     }
-    return (count);
+    return count;
 }
 
 /*
diff --git a/src/move.c b/src/move.c
index f3d7825..ac59320 100644
--- a/src/move.c
+++ b/src/move.c
@@ -2332,9 +2332,20 @@
 #endif
 	if (dir == FORWARD)
 	{
-					/* at end of file */
-	    if (curwin->w_botline > curbuf->b_ml.ml_line_count)
+	    if (firstwin == lastwin && p_window > 0 && p_window < Rows - 1)
 	    {
+		/* Vi compatible scrolling */
+		if (p_window <= 2)
+		    ++curwin->w_topline;
+		else
+		    curwin->w_topline += p_window - 2;
+		if (curwin->w_topline > curbuf->b_ml.ml_line_count)
+		    curwin->w_topline = curbuf->b_ml.ml_line_count;
+		curwin->w_cursor.lnum = curwin->w_topline;
+	    }
+	    else if (curwin->w_botline > curbuf->b_ml.ml_line_count)
+	    {
+		/* at end of file */
 		curwin->w_topline = curbuf->b_ml.ml_line_count;
 #ifdef FEAT_DIFF
 		curwin->w_topfill = 0;
@@ -2371,6 +2382,21 @@
 		continue;
 	    }
 #endif
+	    if (firstwin == lastwin && p_window > 0 && p_window < Rows - 1)
+	    {
+		/* Vi compatible scrolling (sort of) */
+		if (p_window <= 2)
+		    --curwin->w_topline;
+		else
+		    curwin->w_topline -= p_window - 2;
+		if (curwin->w_topline < 1)
+		    curwin->w_topline = 1;
+		curwin->w_cursor.lnum = curwin->w_topline + p_window - 1;
+		if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
+		    curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
+		continue;
+	    }
+
 	    /* Find the line at the top of the window that is going to be the
 	     * line at the bottom of the window.  Make sure this results in
 	     * the same line as before doing CTRL-F. */
diff --git a/src/normal.c b/src/normal.c
index 16f65be..f13b45e 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -1379,6 +1379,7 @@
 #ifdef FEAT_VISUAL
 		&& (!VIsual_active || oap->motion_force)
 #endif
+		&& cap->cmdchar != 'D'
 #ifdef FEAT_FOLDING
 		&& oap->op_type != OP_FOLD
 		&& oap->op_type != OP_FOLDOPEN
@@ -6701,9 +6702,24 @@
 
     if (!checkclearopq(cap->oap))
     {
-	if (cap->count0)
-	    stuffnumReadbuff(cap->count0);
-	stuffReadbuff(ar[(int)(vim_strchr(str, cap->cmdchar) - str)]);
+	/* In Vi "2D" doesn't delete the next line.  Can't translate it
+	 * either, because "2." should also not use the count. */
+	if (cap->cmdchar == 'D' && vim_strchr(p_cpo, CPO_HASH) != NULL)
+	{
+	    cap->oap->start = curwin->w_cursor;
+	    cap->oap->op_type = OP_DELETE;
+	    cap->count1 = 1;
+	    nv_dollar(cap);
+	    finish_op = TRUE;
+	    ResetRedobuff();
+	    AppendCharToRedobuff('D');
+	}
+	else
+	{
+	    if (cap->count0)
+		stuffnumReadbuff(cap->count0);
+	    stuffReadbuff(ar[(int)(vim_strchr(str, cap->cmdchar) - str)]);
+	}
     }
     cap->opcount = 0;
 }
@@ -7599,6 +7615,9 @@
 #endif
 		    0, 0))
 	{
+	    /* When '#' is in 'cpoptions' ignore the count. */
+	    if (vim_strchr(p_cpo, CPO_HASH) != NULL)
+		cap->count1 = 1;
 	    invoke_edit(cap, FALSE, cap->cmdchar, TRUE);
 	}
     }
@@ -8156,7 +8175,10 @@
 		break;
 
 	    case 'I':	/* "I"nsert before the first non-blank */
-		beginline(BL_WHITE);
+		if (vim_strchr(p_cpo, CPO_INSEND) == NULL)
+		    beginline(BL_WHITE);
+		else
+		    beginline(BL_WHITE|BL_FIX);
 		break;
 
 	    case 'a':	/* "a"ppend is like "i"nsert on the next character. */
diff --git a/src/ops.c b/src/ops.c
index 8541c31..7c426d1 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -2838,9 +2838,9 @@
 	if (yanktype == MLINE)	/* MLINE overrides MCHAR and MBLOCK */
 	    curr->y_type = MLINE;
 
-	/* concatenate the last line of the old block with the first line of
-	 * the new block */
-	if (curr->y_type == MCHAR)
+	/* Concatenate the last line of the old block with the first line of
+	 * the new block, unless being Vi compatible. */
+	if (curr->y_type == MCHAR && vim_strchr(p_cpo, CPO_REGAPPEND) == NULL)
 	{
 	    pnew = lalloc((long_u)(STRLEN(curr->y_array[curr->y_size - 1])
 			      + STRLEN(y_current->y_array[0]) + 1), TRUE);
@@ -3897,6 +3897,8 @@
     long    count;
     int	    insert_space;
 {
+    colnr_T	col = MAXCOL;
+
     if (u_save((linenr_T)(curwin->w_cursor.lnum - 1),
 		    (linenr_T)(curwin->w_cursor.lnum + count)) == FAIL)
 	return;
@@ -3909,8 +3911,14 @@
 	    beep_flush();
 	    break;
 	}
+	if (col == MAXCOL && vim_strchr(p_cpo, CPO_JOINCOL) != NULL)
+	    col = curwin->w_cursor.col;
     }
 
+    /* Vi compatible: use the column of the first join */
+    if (col != MAXCOL && vim_strchr(p_cpo, CPO_JOINCOL) != NULL)
+	curwin->w_cursor.col = col;
+
 #if 0
     /*
      * Need to update the screen if the line where the cursor is became too
diff --git a/src/option.c b/src/option.c
index ffeaf86..205b21c 100644
--- a/src/option.c
+++ b/src/option.c
@@ -665,7 +665,7 @@
 			    {(char_u *)FALSE, (char_u *)0L}},
     {"cpoptions",   "cpo",  P_STRING|P_VIM|P_RALL|P_FLAGLIST,
 			    (char_u *)&p_cpo, PV_NONE,
-			    {(char_u *)CPO_ALL, (char_u *)CPO_DEFAULT}},
+			    {(char_u *)CPO_VI, (char_u *)CPO_VIM}},
     {"cscopepathcomp", "cspc", P_NUM|P_VI_DEF|P_VIM,
 #ifdef FEAT_CSCOPE
 			    (char_u *)&p_cspc, PV_NONE,
@@ -2340,7 +2340,7 @@
 #endif
 			    },
     {"window",	    "wi",   P_NUM|P_VI_DEF,
-			    (char_u *)NULL, PV_NONE,
+			    (char_u *)&p_window, PV_NONE,
 			    {(char_u *)0L, (char_u *)0L}},
     {"winheight",   "wh",   P_NUM|P_VI_DEF,
 #ifdef FEAT_WINDOWS
@@ -2591,6 +2591,10 @@
     /* Be Vi compatible by default */
     p_cp = TRUE;
 
+    /* Use POSIX compatibility when $VIM_POSIX is set. */
+    if (mch_getenv((char_u *)"VIM_POSIX") != NULL)
+	set_string_default("cpo", (char_u *)CPO_ALL);
+
     /*
      * Find default value for 'shell' option.
      * Don't use it if it is empty.
@@ -3082,31 +3086,39 @@
     void
 set_init_2()
 {
+    int		idx;
+
     /*
      * 'scroll' defaults to half the window height. Note that this default is
      * wrong when the window height changes.
      */
-    options[findoption((char_u *)"scroll")].def_val[VI_DEFAULT]
-					      = (char_u *)((long_u)Rows >> 1);
+    set_number_default("scroll", (long_u)Rows >> 1);
     comp_col();
 
+    /*
+     * 'window' is only for backwards compatibility with Vi.
+     * Default is Rows - 1.
+     */
+    idx = findoption((char_u *)"wi");
+    if (!(options[idx].flags & P_WAS_SET))
+	p_window = Rows - 1;
+    set_number_default("window", Rows - 1);
+
 #if !((defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI))
     {
-	int	idx4;
-
 	/*
 	 * If 'background' wasn't set by the user, try guessing the value,
 	 * depending on the terminal name.  Only need to check for terminals
 	 * with a dark background, that can handle color.  Only "linux"
 	 * console at the moment.
 	 */
-	idx4 = findoption((char_u *)"bg");
-	if (!(options[idx4].flags & P_WAS_SET) && STRCMP(T_NAME, "linux") == 0)
+	idx = findoption((char_u *)"bg");
+	if (!(options[idx].flags & P_WAS_SET) && STRCMP(T_NAME, "linux") == 0)
 	{
-	    set_string_option_direct(NULL, idx4, (char_u *)"dark", OPT_FREE);
+	    set_string_option_direct(NULL, idx, (char_u *)"dark", OPT_FREE);
 	    /* don't mark it as set, when starting the GUI it may be changed
 	     * again */
-	    options[idx4].flags &= ~P_WAS_SET;
+	    options[idx].flags &= ~P_WAS_SET;
 	}
     }
 #endif
@@ -6872,6 +6884,14 @@
 #endif
     }
 
+    else if (pp == &p_window)
+    {
+	if (p_window < 1)
+	    p_window = 1;
+	else if (p_window >= Rows)
+	    p_window = Rows - 1;
+    }
+
     else if (pp == &curbuf->b_p_imsearch)
     {
 	if (curbuf->b_p_imsearch < -1 || curbuf->b_p_imsearch > B_IMODE_LAST)
@@ -7011,6 +7031,8 @@
 	    if (cmdline_row > Rows - p_ch && Rows > p_ch)
 		cmdline_row = Rows - p_ch;
 	}
+	if (p_window >= Rows)
+	    p_window = Rows - 1;
     }
 
     if (curbuf->b_p_sts < 0)
diff --git a/src/option.h b/src/option.h
index 9be2c49..674eb4e 100644
--- a/src/option.h
+++ b/src/option.h
@@ -132,6 +132,7 @@
 #define CPO_FNAMER	'f'	/* set file name for ":r file" */
 #define CPO_FNAMEW	'F'	/* set file name for ":w file" */
 #define CPO_GOTO1	'g'	/* goto line 1 for ":edit" */
+#define CPO_INSEND	'H'	/* "I" inserts before last blank in line */
 #define CPO_INTMOD	'i'	/* interrupt a read makes buffer modified */
 #define CPO_INDENT	'I'	/* remove auto-indent more often */
 #define CPO_JOINSP	'j'	/* only use two spaces for join after '.' */
@@ -146,6 +147,7 @@
 #define CPO_LINEOFF	'o'
 #define CPO_OVERNEW	'O'	/* silently overwrite new file */
 #define CPO_LISP	'p'	/* 'lisp' indenting */
+#define CPO_JOINCOL	'q'	/* with "3J" use column after first join */
 #define CPO_REDO	'r'
 #define CPO_REMMARK	'R'	/* remove marks when filtering */
 #define CPO_BUFOPT	's'
@@ -156,7 +158,9 @@
 #define CPO_CW		'w'	/* "cw" only changes one blank */
 #define CPO_FWRITE	'W'	/* "w!" doesn't overwrite readonly files */
 #define CPO_ESC		'x'
+#define CPO_REPLCNT	'X'	/* "R" with a count only delets chars once */
 #define CPO_YANK	'y'
+#define CPO_KEEPRO	'Z'	/* don't reset 'readonly' on ":w!" */
 #define CPO_DOLLAR	'$'
 #define CPO_FILTER	'!'
 #define CPO_MATCH	'%'
@@ -164,8 +168,16 @@
 #define CPO_PLUS	'+'	/* ":write file" resets 'modified' */
 #define CPO_MINUS	'-'	/* "9-" fails at and before line 9 */
 #define CPO_SPECI	'<'	/* don't recognize <> in mappings */
-#define CPO_DEFAULT	"aABceFs"
-#define CPO_ALL		"aAbBcCdDeEfFgiIjJkKlLmMnoOprRsStuvwWxy$!%*-+<"
+#define CPO_REGAPPEND	'>'	/* insert NL when appending to a register */
+/* POSIX flags */
+#define CPO_HASH	'#'	/* "D", "o" and "O" do not use a count */
+#define CPO_PARA	'{'	/* "{" is also a paragraph boundary */
+#define CPO_TSIZE	'|'	/* $LINES and $COLUMNS overrule term size */
+#define CPO_PRESERVE	'&'	/* keep swap file after :preserve */
+/* default values for Vim, Vi and POSIX */
+#define CPO_VIM		"aABceFs"
+#define CPO_VI		"aAbBcCdDeEfFgHiIjJkKlLmMnoOpqrRsStuvwWxXyZ$!%*-+<>"
+#define CPO_ALL		"aAbBcCdDeEfFgHiIjJkKlLmMnoOpqrRsStuvwWxXyZ$!%*-+<>#{|&"
 
 /* characters for p_ww option: */
 #define WW_ALL		"bshl<>[],~"
@@ -789,6 +801,7 @@
 #ifdef FEAT_CMDL_COMPL
 EXTERN char_u	*p_wop;		/* 'wildoptions' */
 #endif
+EXTERN long	p_window;	/* 'window' */
 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(LINT) \
 	|| defined (FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_KDE)
 #define FEAT_WAK
diff --git a/src/os_unix.c b/src/os_unix.c
index c09638f..d89636d 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -3222,9 +3222,10 @@
 
     /*
      * 2. get size from environment
-     *    When being POSIX compliant this overrules the ioctl() values!
+     *    When being POSIX compliant ('|' flag in 'cpoptions') this overrules
+     *    the ioctl() values!
      */
-    if (columns == 0 || rows == 0 || getenv("VIM_POSIX") != NULL)
+    if (columns == 0 || rows == 0 || vim_strchr(p_cpo, CPO_TSIZE) != NULL)
     {
 	if ((p = (char_u *)getenv("LINES")))
 	    rows = atoi((char *)p);
diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro
index 2fb74d3..5a42c13 100644
--- a/src/proto/misc1.pro
+++ b/src/proto/misc1.pro
@@ -2,6 +2,7 @@
 int get_indent __ARGS((void));
 int get_indent_lnum __ARGS((linenr_T lnum));
 int get_indent_buf __ARGS((buf_T *buf, linenr_T lnum));
+int get_indent_str __ARGS((char_u *ptr, int ts));
 int set_indent __ARGS((int size, int flags));
 int get_number_indent __ARGS((linenr_T lnum));
 int open_line __ARGS((int dir, int flags, int old_indent));
diff --git a/src/search.c b/src/search.c
index 2bcdf24..8520282 100644
--- a/src/search.c
+++ b/src/search.c
@@ -2493,11 +2493,12 @@
 }
 
 /*
- * findpar(dir, count, what) - Find the next paragraph in direction 'dir'
+ * Find the next paragraph or section in direction 'dir'.
  * Paragraphs are currently supposed to be separated by empty lines.
- * Return TRUE if the next paragraph was found.
+ * If 'what' is NUL we go to the next paragraph.
  * If 'what' is '{' or '}' we go to the next section.
  * If 'both' is TRUE also stop at '}'.
+ * Return TRUE if the next paragraph or section was found.
  */
     int
 findpar(oap, dir, count, what, both)
@@ -2510,6 +2511,7 @@
     linenr_T	curr;
     int		did_skip;   /* TRUE after separating lines have been skipped */
     int		first;	    /* TRUE on first line */
+    int		posix = (vim_strchr(p_cpo, CPO_PARA) != NULL);
 #ifdef FEAT_FOLDING
     linenr_T	fold_first; /* first line of a closed fold */
     linenr_T	fold_last;  /* last line of a closed fold */
@@ -2537,7 +2539,11 @@
 	    }
 #endif
 
-	    if (!first && did_skip && startPS(curr, what, both))
+	    /* POSIX has it's own ideas of what a paragraph boundary is and it
+	     * doesn't match historical Vi: It also stops at a "{" in the
+	     * first column and at an empty line. */
+	    if (!first && did_skip && (startPS(curr, what, both)
+			   || (posix && what == NUL && *ml_get(curr) == '{')))
 		break;
 
 #ifdef FEAT_FOLDING
diff --git a/src/structs.h b/src/structs.h
index 8a81611..92a8428 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1021,6 +1021,8 @@
     listwatch_T	*lv_watch;	/* first watcher, NULL if none */
     int		lv_idx;		/* cached index of an item */
     listitem_T	*lv_idx_item;	/* when not NULL item at index "lv_idx" */
+    int		lv_copyID;	/* ID used by deepcopy() */
+    list_T	*lv_copylist;	/* copied list used by deepcopy() */
     char	lv_lock;	/* zero, VAR_LOCKED, VAR_FIXED */
 };
 
@@ -1050,6 +1052,8 @@
 {
     int		dv_refcount;	/* reference count */
     hashtab_T	dv_hashtab;	/* hashtab that refers to the items */
+    int		dv_copyID;	/* ID used by deepcopy() */
+    dict_T	*dv_copydict;	/* copied dict used by deepcopy() */
     char	dv_lock;	/* zero, VAR_LOCKED, VAR_FIXED */
 };
 
diff --git a/src/term.c b/src/term.c
index a471c1e..386b05c 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2991,6 +2991,9 @@
 	ui_new_shellsize();
     if (old_Rows != Rows)
     {
+	/* if 'window' uses the whole screen, keep it using that */
+	if (p_window == old_Rows - 1)
+	    p_window = Rows - 1;
 	old_Rows = Rows;
 	shell_new_rows();	/* update window sizes */
     }
@@ -3234,6 +3237,8 @@
  * echoed.
  * Only do this after termcap mode has been started, otherwise the codes for
  * the cursor keys may be wrong.
+ * On Unix only do it when both output and input are a tty (avoid writing
+ * request to terminal while reading from a file).
  * The result is caught in check_termcode().
  */
     static void
@@ -3244,6 +3249,7 @@
 	    && termcap_active
 #ifdef UNIX
 	    && isatty(1)
+	    && isatty(read_cmd_fd)
 #endif
 	    && *T_CRV != NUL)
     {
diff --git a/src/testdir/test16.in b/src/testdir/test16.in
index 7fc0d50..aa00517 100644
--- a/src/testdir/test16.in
+++ b/src/testdir/test16.in
@@ -1,7 +1,11 @@
 Tests for resetting "secure" flag after GUI has started.
+For KDE set a font, empty 'guifont' may cause a hang.
 
 STARTTEST
 :set exrc secure
+:if has("gui_kde")
+:  set guifont=Courier\ 10\ Pitch/8/-1/5/50/0/0/0/0/0
+:endif
 :gui -f
 :.,$w! test.out
 :qa!
diff --git a/src/testdir/test55.in b/src/testdir/test55.in
index 89fbaae..46a857b 100644
--- a/src/testdir/test55.in
+++ b/src/testdir/test55.in
@@ -149,15 +149,20 @@
 :endfunc
 :$put =d.func(string(remove(d, 'func')))
 :"
-:" Nasty: deepcopy() dict that refers to itself (fails)
+:" Nasty: deepcopy() dict that refers to itself (fails when noref used)
 :let d = {1:1, 2:2}
 :let l = [4, d, 6]
 :let d[3] = l
+:let dc = deepcopy(d)
 :try
-:  let x = deepcopy(d)
+:  let dc = deepcopy(d, 1)
 :catch
 :  $put =v:exception[:14]
 :endtry
+:let l2 = [0, l, l, 3]
+:let l[1] = l2
+:let l3 = deepcopy(l2)
+:$put ='same list: ' . (l3[1] is l3[2])
 :"
 :" Locked variables
 :for depth in range(5)
@@ -253,6 +258,14 @@
 :  $put ='caught ' . v:exception
 :endtry
 :"
+:" reverse() and sort()
+:let l = ['-0', 'A11', 2, 'xaaa', 4, 'foo', 'foo6', [0, 1, 2], 'x8']
+:$put =string(reverse(l))
+:$put =string(reverse(reverse(l)))
+:$put =string(sort(l))
+:$put =string(reverse(sort(l)))
+:$put =string(sort(reverse(sort(l))))
+:"
 :endfun
 :call Test(1, 2, [3, 4], {5: 6})  " This may take a while
 :"
diff --git a/src/testdir/test55.ok b/src/testdir/test55.ok
index 922fdfc..559cafa 100644
--- a/src/testdir/test55.ok
+++ b/src/testdir/test55.ok
@@ -30,6 +30,7 @@
 g:dict.func-4
 a:function('3')
 Vim(let):E698: 
+same list: 1
 depth is 0
 0000-000
 ppppppp
@@ -70,3 +71,8 @@
 caught a:000[2]
 caught a:000[3]
 [1, 2, [3, 9, 5, 6], {'a': 12, '5': 8}]
+['x8', [0, 1, 2], 'foo6', 'foo', 4, 'xaaa', 2, 'A11', '-0']
+['x8', [0, 1, 2], 'foo6', 'foo', 4, 'xaaa', 2, 'A11', '-0']
+['-0', 'A11', 'foo', 'foo6', 'x8', 'xaaa', 2, 4, [0, 1, 2]]
+[[0, 1, 2], 4, 2, 'xaaa', 'x8', 'foo6', 'foo', 'A11', '-0']
+['-0', 'A11', 'foo', 'foo6', 'x8', 'xaaa', 2, 4, [0, 1, 2]]
diff --git a/src/version.h b/src/version.h
index 6dfc7d5..1925a60 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Feb 7)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Feb 7, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Feb 12)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Feb 12, compiled "
diff --git a/src/vim.h b/src/vim.h
index 9ffaf9f..6d2b249 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -604,6 +604,7 @@
 #define BF_NEW_W	0x20	/* Warned for BF_NEW and file created */
 #define BF_READERR	0x40	/* got errors while reading the file */
 #define BF_DUMMY	0x80	/* dummy buffer, only used internally */
+#define BF_PRESERVED	0x100	/* ":preserve" was used */
 
 /* Mask to check for flags that prevent normal writing */
 #define BF_WRITE_MASK	(BF_NOTEDITED + BF_NEW + BF_READERR)