updated for version 7.0e06
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index f9d211d..a78f756 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -1,9 +1,8 @@
-# Makefile for Vim on Win32 (Windows NT and Windows 95), using the
-# Microsoft Visual C++ 2.x and MSVC 4.x compilers (or newer).
-# It builds on Windows 95 and all four NT platforms: i386, Alpha, MIPS, and
-# PowerPC.  The NT/i386 binary and the Windows 95 binary are identical.
+# Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me)
+# and Win64, using the Microsoft Visual C++ compilers. Known to work with
+# VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), and VC8 (VS2005).
 #
-# To build using Borland C++, use Make_bc3.mak or Make_bc5.mak.
+# To build using other Windows compilers, see INSTALLpc.txt
 #
 # This makefile can build the console, GUI, OLE-enable, Perl-enabled and
 # Python-enabled versions of vim for Win32 platforms.
@@ -172,8 +171,11 @@
 
 !ifdef PROCESSOR_ARCHITECTURE
 # We're on Windows NT or using VC 6+
-! ifndef CPU
+! ifdef CPU
+ASSEMBLY_ARCHITECTURE=$(CPU)
+! else
 CPU = $(PROCESSOR_ARCHITECTURE)
+ASSEMBLY_ARCHITECTURE = $(PROCESSOR_ARCHITECTURE)
 !  if ("$(CPU)" == "x86") || ("$(CPU)" == "X86")
 CPU = i386
 !  endif
@@ -183,6 +185,9 @@
 CPU = i386
 !endif # !PROCESSOR_ARCHITECTURE
 
+!if ("$(CPU)" == "AMD64") || ("$(CPU)" == "IA64")
+DEFINES=$(DEFINES) /Wp64
+!endif
 
 # Build a retail version by default
 
@@ -752,6 +757,7 @@
 	- if exist $(VIM).pdb del $(VIM).pdb
 	- if exist $(VIM).map del $(VIM).map
 	- if exist $(VIM).ncb del $(VIM).ncb
+	- if exist gvim.exe.mnf del gvim.exe.mnf
 	- if exist vimrun.exe del vimrun.exe
 	- if exist install.exe del install.exe
 	- if exist uninstal.exe del uninstal.exe
@@ -933,7 +939,7 @@
 $(OUTDIR)/xpm_w32.obj: $(OUTDIR) xpm_w32.c
 	$(CC) $(CFLAGS) $(XPM_INC) xpm_w32.c
 
-$(OUTDIR)/vim.res:	$(OUTDIR) vim.rc version.h tools.bmp tearoff.bmp \
+$(OUTDIR)/vim.res:	$(OUTDIR) gvim.exe.mnf vim.rc version.h tools.bmp tearoff.bmp \
 		vim.ico vim_error.ico vim_alert.ico vim_info.ico vim_quest.ico
 	$(RC) /l 0x409 /Fo$(OUTDIR)/vim.res $(RCFLAGS) vim.rc
 
@@ -963,6 +969,30 @@
 	@echo char_u *compiled_user = (char_u *)"$(USERNAME)"; >> $(PATHDEF_SRC)
 	@echo char_u *compiled_sys = (char_u *)"$(USERDOMAIN)"; >> $(PATHDEF_SRC)
 
+gvim.exe.mnf: auto
+	@echo ^<?xml version="1.0" encoding="UTF-8" standalone="yes"?^> >$@
+	@echo ^<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"^> >>$@
+	@echo   ^<assemblyIdentity >>$@
+	@echo     processorArchitecture="$(ASSEMBLY_ARCHITECTURE)" >>$@
+	@echo     version="7.0.0.0" >>$@
+	@echo     type="win32" >>$@
+	@echo     name="Vim" >>$@
+	@echo   /^> >>$@
+	@echo   ^<description^>Vi Improved - A Text Editor^</description^> >>$@
+	@echo   ^<dependency^> >>$@
+	@echo     ^<dependentAssembly^> >>$@
+	@echo       ^<assemblyIdentity >>$@
+	@echo         type="win32" >>$@
+	@echo         name="Microsoft.Windows.Common-Controls" >>$@
+	@echo         version="6.0.0.0" >>$@
+	@echo         publicKeyToken="6595b64144ccf1df" >>$@
+	@echo         language="*" >>$@
+	@echo         processorArchitecture="$(ASSEMBLY_ARCHITECTURE)" >>$@
+	@echo       /^> >>$@
+	@echo     ^</dependentAssembly^> >>$@
+	@echo   ^</dependency^> >>$@
+	@echo ^</assembly^> >>$@
+
 auto:
 	if not exist auto/nul mkdir auto
 
diff --git a/src/diff.c b/src/diff.c
index 5f8a84a..22cf5af 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1330,7 +1330,7 @@
 	    /* Allocate a new diffblock. */
 	    dp = diff_alloc_new(curtab, dprev, dp);
 	    if (dp == NULL)
-		return;
+		goto done;
 
 	    dp->df_lnum[idx_orig] = lnum_orig;
 	    dp->df_count[idx_orig] = count_orig;
@@ -1357,6 +1357,7 @@
 	notset = TRUE;
     }
 
+done:
     fclose(fd);
 }
 
diff --git a/src/edit.c b/src/edit.c
index ed416f3..2c97119 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -178,7 +178,9 @@
 #endif
 static void stop_insert __ARGS((pos_T *end_insert_pos, int esc));
 static int  echeck_abbr __ARGS((int));
+#if 0
 static void replace_push_off __ARGS((int c));
+#endif
 static int  replace_pop __ARGS((void));
 static void replace_join __ARGS((int off));
 static void replace_pop_ins __ARGS((void));
@@ -5823,7 +5825,7 @@
  */
     static void
 start_arrow(end_insert_pos)
-    pos_T    *end_insert_pos;
+    pos_T    *end_insert_pos;	    /* can be NULL */
 {
     if (!arrow_used)	    /* something has been inserted */
     {
@@ -5912,11 +5914,13 @@
 }
 
 /*
- * do a few things to stop inserting
+ * Do a few things to stop inserting.
+ * "end_insert_pos" is where insert ended.  It is NULL when we already jumped
+ * to another window/buffer.
  */
     static void
 stop_insert(end_insert_pos, esc)
-    pos_T	*end_insert_pos;	/* where insert ended */
+    pos_T	*end_insert_pos;
     int		esc;			/* called by ins_esc() */
 {
     int		cc;
@@ -5941,7 +5945,7 @@
     else
 	vim_free(ptr);
 
-    if (!arrow_used)
+    if (!arrow_used && end_insert_pos != NULL)
     {
 	/* Auto-format now.  It may seem strange to do this when stopping an
 	 * insertion (or moving the cursor), but it's required when appending
@@ -5987,7 +5991,7 @@
 	 * of the line, and put the cursor back.
 	 * Do this when ESC was used or moving the cursor up/down. */
 	if (did_ai && (esc || (vim_strchr(p_cpo, CPO_INDENT) == NULL
-			   && curwin->w_cursor.lnum != end_insert_pos->lnum)))
+			&& curwin->w_cursor.lnum != end_insert_pos->lnum)))
 	{
 	    pos_T	tpos = curwin->w_cursor;
 
@@ -6030,9 +6034,13 @@
     can_si_back = FALSE;
 #endif
 
-    /* set '[ and '] to the inserted text */
-    curbuf->b_op_start = Insstart;
-    curbuf->b_op_end = *end_insert_pos;
+    /* Set '[ and '] to the inserted text.  When end_insert_pos is NULL we are
+     * now in a different buffer. */
+    if (end_insert_pos != NULL)
+    {
+	curbuf->b_op_start = Insstart;
+	curbuf->b_op_end = *end_insert_pos;
+    }
 }
 
 /*
@@ -6563,6 +6571,7 @@
     ++replace_stack_nr;
 }
 
+#if 0
 /*
  * call replace_push(c) with replace_offset set to the first NUL.
  */
@@ -6580,6 +6589,7 @@
     replace_push(c);
     replace_offset = 0;
 }
+#endif
 
 /*
  * Pop one item from the replace stack.
@@ -8023,7 +8033,9 @@
 	    int		ts;
 	    colnr_T	vcol;
 	    colnr_T	want_vcol;
+#if 0
 	    int		extra = 0;
+#endif
 
 	    *inserted_space_p = FALSE;
 	    if (p_sta && in_indent)
@@ -8082,15 +8094,19 @@
 #endif
 		{
 		    ins_str((char_u *)" ");
-		    if ((State & REPLACE_FLAG) && extra <= 1)
+		    if ((State & REPLACE_FLAG) /* && extra <= 1 */)
 		    {
+#if 0
 			if (extra)
 			    replace_push_off(NUL);
 			else
+#endif
 			    replace_push(NUL);
 		    }
+#if 0
 		    if (extra == 2)
 			extra = 1;
+#endif
 		}
 		getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL);
 	    }
@@ -8205,6 +8221,7 @@
     int	    c;
 {
     pos_T	tpos;
+    win_T	*old_curwin = curwin;
 
 # ifdef FEAT_GUI
     /* When GUI is active, also move/paste when 'mouse' is empty */
@@ -8217,7 +8234,25 @@
     tpos = curwin->w_cursor;
     if (do_mouse(NULL, c, BACKWARD, 1L, 0))
     {
-	start_arrow(&tpos);
+#ifdef FEAT_WINDOWS
+	win_T	*new_curwin = curwin;
+
+	if (curwin != old_curwin && win_valid(old_curwin))
+	{
+	    /* Mouse took us to another window.  We need to go back to the
+	     * previous one to stop insert there properly. */
+	    curwin = old_curwin;
+	    curbuf = curwin->w_buffer;
+	}
+#endif
+	start_arrow(curwin == old_curwin ? &tpos : NULL);
+#ifdef FEAT_WINDOWS
+	if (curwin != new_curwin && win_valid(new_curwin))
+	{
+	    curwin = new_curwin;
+	    curbuf = curwin->w_buffer;
+	}
+#endif
 # ifdef FEAT_CINDENT
 	can_cindent = TRUE;
 # endif
diff --git a/src/eval.c b/src/eval.c
index 1e75a31..14460a0 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1413,7 +1413,7 @@
     void	*save_funccalp = NULL;
     int		ret;
 
-    argvars = (typval_T *)alloc((unsigned)(argc * sizeof(typval_T)));
+    argvars = (typval_T *)alloc((unsigned)((argc + 1) * sizeof(typval_T)));
     if (argvars == NULL)
 	return FAIL;
 
@@ -7318,7 +7318,7 @@
 {
     char_u	*argp;
     int		ret = OK;
-    typval_T	argvars[MAX_FUNC_ARGS];	/* vars for arguments */
+    typval_T	argvars[MAX_FUNC_ARGS + 1];	/* vars for arguments */
     int		argcount = 0;		/* number of arguments found */
 
     /*
@@ -7375,7 +7375,8 @@
     int		len;		/* length of "name" */
     typval_T	*rettv;		/* return value goes here */
     int		argcount;	/* number of "argvars" */
-    typval_T	*argvars;	/* vars for arguments */
+    typval_T	*argvars;	/* vars for arguments, must have "argcount"
+				   PLUS ONE elements! */
     linenr_T	firstline;	/* first line of range */
     linenr_T	lastline;	/* last line of range */
     int		*doesrange;	/* return: function handled range */
@@ -8064,7 +8065,7 @@
     typval_T	*rettv;
 {
     char_u	*func;
-    typval_T	argv[MAX_FUNC_ARGS];
+    typval_T	argv[MAX_FUNC_ARGS + 1];
     int		argc = 0;
     listitem_T	*item;
     int		dummy;
@@ -8943,7 +8944,7 @@
 			break;
 		if (i == 3)
 		{
-		    EMSGN(_(e_invarg2), action);
+		    EMSG2(_(e_invarg2), action);
 		    return;
 		}
 	    }
@@ -12997,7 +12998,7 @@
 	char_u		str[30];
 	char_u		*idvar;
 
-	sprintf((char *)str, "0x%x", (unsigned int)w);
+	sprintf((char *)str, PRINTF_HEX_LONG_U, (long_u)w);
 	v.di_tv.v_type = VAR_STRING;
 	v.di_tv.vval.v_string = vim_strsave(str);
 	idvar = get_tv_string_chk(&argvars[2]);
@@ -13064,7 +13065,7 @@
     dictitem_T	v;
     char_u	*s = NULL;
 # ifdef WIN32
-    int		n = 0;
+    long_u	n = 0;
 # endif
     char_u	*serverid;
 
@@ -13080,7 +13081,7 @@
 	return;		/* type error; errmsg already given */
     }
 # ifdef WIN32
-    sscanf(serverid, "%x", &n);
+    sscanf(serverid, SCANF_HEX_LONG_U, &n);
     if (n == 0)
 	rettv->vval.v_number = -1;
     else
@@ -13128,9 +13129,9 @@
     {
 # ifdef WIN32
 	/* The server's HWND is encoded in the 'id' parameter */
-	int		n = 0;
+	long_u		n = 0;
 
-	sscanf(serverid, "%x", &n);
+	sscanf(serverid, SCANF_HEX_LONG_U, &n);
 	if (n != 0)
 	    r = serverGetReply((HWND)n, FALSE, TRUE, TRUE);
 	if (r == NULL)
@@ -14585,7 +14586,7 @@
 {
     int		res;
     typval_T	rettv;
-    typval_T	argv[2];
+    typval_T	argv[3];
     int		dummy;
 
     /* shortcut after failure in previous call; compare all items equal */
@@ -15133,11 +15134,12 @@
 
     needle = get_tv_string_chk(&argvars[1]);
     haystack = get_tv_string_buf_chk(&argvars[0], buf);
-    haystack_len = (int)STRLEN(haystack);
 
     rettv->vval.v_number = -1;
     if (needle == NULL || haystack == NULL)
 	return;		/* type error; errmsg already given */
+
+    haystack_len = (int)STRLEN(haystack);
     if (argvars[2].v_type != VAR_UNKNOWN)
     {
 	/* Third argument: upper limit for index */
@@ -15398,7 +15400,10 @@
 	}
 	p = get_tv_string_buf_chk(&argvars[1], buf);
 	if (p == NULL)
+	{
+	    fclose(fd);
 	    goto done;		/* type error; errmsg already given */
+	}
 	if (fwrite(p, STRLEN(p), 1, fd) != 1)
 	    err = TRUE;
 	if (fclose(fd) != 0)
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index aafe31c..b5920c8 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1778,6 +1778,7 @@
 	    tt = msg_didany;
 	    EMSG2(_("E137: Viminfo file is not writable: %s"), fname);
 	    msg_didany = tt;
+	    fclose(fp_in);
 	    goto end;
 	}
 #endif
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 4943bfc..3e4c963 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -9438,7 +9438,8 @@
 		break;
 #if defined(FEAT_CLIENTSERVER)
 	case SPEC_CLIENT:	/* Source of last submitted input */
-		sprintf((char *)strbuf, "0x%x", (unsigned int)clientWindow);
+		sprintf((char *)strbuf, PRINTF_HEX_LONG_U,
+							(long_u)clientWindow);
 		result = strbuf;
 		break;
 #endif
diff --git a/src/ex_eval.c b/src/ex_eval.c
index c89cb2b..8714958 100644
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -1136,7 +1136,7 @@
 	 * next).  Therefor, inactivate all conditionals except the ":while"
 	 * itself (if reached). */
 	idx = cleanup_conditionals(cstack, CSF_WHILE | CSF_FOR, FALSE);
-	if ((cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
+	if (idx >= 0 && (cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
 	{
 	    rewind_conditionals(cstack, idx, CSF_TRY, &cstack->cs_trylevel);
 
@@ -1175,7 +1175,7 @@
 	 * executed next) is found.  In the latter case, make the ":break"
 	 * pending for execution at the ":endtry". */
 	idx = cleanup_conditionals(cstack, CSF_WHILE | CSF_FOR, TRUE);
-	if (!(cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
+	if (idx >= 0 && !(cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
 	{
 	    cstack->cs_pending[idx] = CSTP_BREAK;
 	    report_make_pending(CSTP_BREAK, NULL);
@@ -1861,7 +1861,7 @@
 	 * after errors except when this ":endtry" is not within a ":try".
 	 * Restore "emsg_silent" if it has been reset by this try conditional.
 	 */
-	cleanup_conditionals(cstack, CSF_TRY | CSF_SILENT, TRUE);
+	(void)cleanup_conditionals(cstack, CSF_TRY | CSF_SILENT, TRUE);
 
 	--cstack->cs_idx;
 	--cstack->cs_trylevel;
diff --git a/src/fold.c b/src/fold.c
index 8cd51a9..bb7b8b7 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -2594,8 +2594,9 @@
 
 	/*
 	 * The fold includes the line "flp->lnum" and "flp->lnum_save".
+	 * Check "fp" for safety.
 	 */
-	if (lvl > level)
+	if (lvl > level && fp != NULL)
 	{
 	    /*
 	     * There is a nested fold, handle it recursively.
diff --git a/src/getchar.c b/src/getchar.c
index 88381b1..782bdbe 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -4053,14 +4053,19 @@
 	}
     } /* for (round) */
 
-    /* Sort the matches */
-    sort_strings(*file, count);
-
-    /* Remove multiple entries */
+    if (count > 1)
     {
-	char_u	**ptr1 = *file;
-	char_u	**ptr2 = ptr1 + 1;
-	char_u	**ptr3 = ptr1 + count;
+	char_u	**ptr1;
+	char_u	**ptr2;
+	char_u	**ptr3;
+
+	/* Sort the matches */
+	sort_strings(*file, count);
+
+	/* Remove multiple entries */
+	ptr1 = *file;
+	ptr2 = ptr1 + 1;
+	ptr3 = ptr1 + count;
 
 	while (ptr2 < ptr3)
 	{
diff --git a/src/gui_gtk.c b/src/gui_gtk.c
index d9477d5..6c86948 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -787,12 +787,12 @@
 # endif /* FEAT_TOOLBAR */
     {
 	/* No parent, must be a non-menubar menu */
-	if (parent->submenu_id == NULL)
+	if (parent == NULL || parent->submenu_id == NULL)
 	    return;
 
 	/* Make place for the possible tearoff handle item.  Not in the popup
 	 * menu, it doesn't have a tearoff item. */
-	if (parent != NULL && !menu_is_popup(parent->name))
+	if (!menu_is_popup(parent->name))
 	    ++idx;
 
 	if (menu_is_separator(menu->name))
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 79557a8..3bec1f5 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -2024,6 +2024,8 @@
 
 	gui_handle_drop(x, y, modifiers, fnames, nfiles);
     }
+    else
+	vim_free(fnames);
 }
 
     static void
@@ -4707,7 +4709,7 @@
 	     * that, because in 'guifont' it separates names. */
 	    p = vim_strsave_escaped((char_u *)name, (char_u *)",");
 	    g_free(name);
-	    if (input_conv.vc_type != CONV_NONE)
+	    if (p != NULL && input_conv.vc_type != CONV_NONE)
 	    {
 		fontname = string_convert(&input_conv, p, NULL);
 		vim_free(p);
@@ -6870,7 +6872,7 @@
 	    else
 		id &= ~1;	/* they are always even (why?) */
 	}
-	else
+	else if (shape < sizeof(mshape_ids) / sizeof(int))
 	    id = mshape_ids[shape];
 # ifdef HAVE_GTK_MULTIHEAD
 	c = gdk_cursor_new_for_display(
diff --git a/src/gui_w32.c b/src/gui_w32.c
index ac05ee9..a700ac0 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -181,13 +181,14 @@
 # define ID_BEVAL_TOOLTIP   200
 # define BEVAL_TEXT_LEN	    MAXPATHL
 
-static void make_tooltip __ARGS((BalloonEval *beval, char *text, POINT pt));
-static void delete_tooltip __ARGS((BalloonEval *beval));
-static VOID CALLBACK BevalTimerProc __ARGS((HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime));
-
 #ifndef UINT_PTR
 # define UINT_PTR UINT
 #endif
+
+static void make_tooltip __ARGS((BalloonEval *beval, char *text, POINT pt));
+static void delete_tooltip __ARGS((BalloonEval *beval));
+static VOID CALLBACK BevalTimerProc __ARGS((HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime));
+
 static BalloonEval  *cur_beval = NULL;
 static UINT_PTR	    BevalTimerId = 0;
 static DWORD	    LastActivity = 0;
@@ -811,9 +812,102 @@
     case WM_NOTIFY:
 	switch (((LPNMHDR) lParam)->code)
 	{
-# ifdef FEAT_TOOLBAR
+# ifdef FEAT_MBYTE
+	    case TTN_GETDISPINFOW:
+# endif
 	    case TTN_NEEDTEXT:
+# ifdef FEAT_GUI_TABLINE
+		if (gui_mch_showing_tabline()
+			&& ((LPNMHDR)lParam)->hwndFrom ==
+					       TabCtrl_GetToolTips(s_tabhwnd))
 		{
+		    LPNMTTDISPINFO	lpdi;
+		    POINT		pt;
+		    static char         *tt_text = NULL;
+		    static int          tt_text_len = 0;
+
+		    /*
+		     * Mouse is over the GUI tabline. Display the tooltip
+		     * for the tab under the cursor
+		     */
+		    lpdi = (LPNMTTDISPINFO)lParam;
+		    lpdi->hinst = NULL;
+		    lpdi->szText[0] = '\0';
+
+		    /*
+		     * Get the cursor position within the tab control
+		     */
+		    GetCursorPos(&pt);
+		    if (ScreenToClient(s_tabhwnd, &pt) != 0)
+		    {
+			TCHITTESTINFO htinfo;
+			int idx;
+
+			/*
+			 * Get the tab under the cursor
+			 */
+			htinfo.pt.x = pt.x;
+			htinfo.pt.y = pt.y;
+			idx = TabCtrl_HitTest(s_tabhwnd, &htinfo);
+			if (idx != -1)
+			{
+			    tabpage_T *tp;
+
+			    tp = find_tabpage(idx + 1);
+			    if (tp != NULL)
+			    {
+#  ifdef FEAT_MBYTE
+				WCHAR	*wstr = NULL;
+#  endif
+				get_tabline_label(tp, TRUE);
+#  ifdef FEAT_MBYTE
+				if (enc_codepage >= 0
+					     && (int)GetACP() != enc_codepage)
+				{
+				    wstr = enc_to_ucs2(NameBuff, NULL);
+				    if (wstr != NULL)
+				    {
+					int wlen;
+
+					wlen = (wcslen(wstr) + 1)
+							      * sizeof(WCHAR);
+					if (tt_text_len < wlen)
+					{
+					    tt_text = vim_realloc(tt_text,
+									wlen);
+					    if (tt_text != NULL)
+						tt_text_len = wlen;
+					}
+					if (tt_text != NULL)
+					    wcscpy((WCHAR *)tt_text, wstr);
+					lpdi->lpszText = tt_text;
+					vim_free(wstr);
+				    }
+				}
+				if (wstr == NULL)
+#  endif
+				{
+				    int len;
+
+				    len = STRLEN(NameBuff) + 1;
+				    if (tt_text_len < len)
+				    {
+					tt_text = vim_realloc(tt_text, len);
+					if (tt_text != NULL)
+					    tt_text_len = len;
+				    }
+				    if (tt_text != NULL)
+					STRCPY(tt_text, NameBuff);
+				    lpdi->lpszText = tt_text;
+				}
+			    }
+			}
+		    }
+		}
+		else
+# endif
+		{
+# ifdef FEAT_TOOLBAR
 		    LPTOOLTIPTEXT	lpttt;
 		    UINT		idButton;
 		    int			idx;
@@ -831,9 +925,9 @@
 			    lpttt->lpszText = pMenu->strings[idx];
 			}
 		    }
+# endif
 		}
 		break;
-# endif
 # ifdef FEAT_GUI_TABLINE
 	    case TCN_SELCHANGE:
 		if (gui_mch_showing_tabline()
@@ -2341,7 +2435,7 @@
 	{
 	    InsertMenu((parent == NULL) ? s_menuBar : parent->submenu_id,
 		    (UINT)pos, MF_POPUP | MF_STRING | MF_BYPOSITION,
-		    (UINT)menu->submenu_id, (LPCTSTR) menu->name);
+		    (long_u)menu->submenu_id, (LPCTSTR) menu->name);
 	}
 	else
 	{
@@ -2361,7 +2455,7 @@
 		    infow.cbSize = sizeof(infow);
 		    infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
 							       | MIIM_SUBMENU;
-		    infow.dwItemData = (DWORD)menu;
+		    infow.dwItemData = (long_u)menu;
 		    infow.wID = menu->id;
 		    infow.fType = MFT_STRING;
 		    infow.dwTypeData = wn;
@@ -2384,7 +2478,7 @@
 
 		info.cbSize = sizeof(info);
 		info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
-		info.dwItemData = (DWORD)menu;
+		info.dwItemData = (long_u)menu;
 		info.wID = menu->id;
 		info.fType = MFT_STRING;
 		info.dwTypeData = (LPTSTR)menu->name;
@@ -2661,7 +2755,7 @@
 	if (menu->children == NULL)
 	    menuID = (WORD)(menu->id);
 	else
-	    menuID = (WORD)((DWORD)(menu->submenu_id) | (DWORD)0x8000);
+	    menuID = (WORD)((long_u)(menu->submenu_id) | (DWORD)0x8000);
 	menuHandle = GetDlgItem(menu->parent->tearoff_handle, menuID);
 	if (menuHandle)
 	    EnableWindow(menuHandle, !grey);
@@ -2860,7 +2954,7 @@
     /* allocate some memory for dialog template */
     /* TODO should compute this really */
     pdlgtemplate = p = (PWORD)LocalAlloc(LPTR,
-					    DLG_ALLOC_SIZE + STRLEN(message));
+					DLG_ALLOC_SIZE + STRLEN(message) * 2);
 
     if (p == NULL)
 	return -1;
@@ -3281,6 +3375,7 @@
 }
 
 #endif /* FEAT_GUI_DIALOG */
+
 /*
  * Put a simple element (basic class) onto a dialog template in memory.
  * return a pointer to where the next item should be added.
@@ -3344,9 +3439,9 @@
 lpwAlign(
     LPWORD lpIn)
 {
-    ULONG ul;
+    long_u ul;
 
-    ul = (ULONG)lpIn;
+    ul = (long_u)lpIn;
     ul += 3;
     ul >>= 2;
     ul <<= 2;
@@ -3435,7 +3530,7 @@
 	    if (GetCursorPos(&mp) && GetWindowRect(hwnd, &rect))
 	    {
 		(void)TrackPopupMenu(
-			 (HMENU)(LOWORD(wParam) ^ 0x8000),
+			 (HMENU)(long_u)(LOWORD(wParam) ^ 0x8000),
 			 TPM_LEFTALIGN | TPM_LEFTBUTTON,
 			 (int)rect.right - 8,
 			 (int)mp.y,
@@ -3794,7 +3889,7 @@
 	else
 	{
 	    len += (int)STRLEN(TEAROFF_SUBMENU_LABEL);
-	    menuID = (WORD)((DWORD)(menu->submenu_id) | (DWORD)0x8000);
+	    menuID = (WORD)((long_u)(menu->submenu_id) | (DWORD)0x8000);
 	}
 
 	/* Allocate menu label and fill it in */
@@ -3953,7 +4048,7 @@
 	    TBADDBITMAP tbAddBitmap;
 
 	    tbAddBitmap.hInst = NULL;
-	    tbAddBitmap.nID = (UINT)hbitmap;
+	    tbAddBitmap.nID = (long_u)hbitmap;
 
 	    i = (int)SendMessage(s_toolbarhwnd, TB_ADDBITMAP,
 			    (WPARAM)1, (LPARAM)&tbAddBitmap);
@@ -3978,7 +4073,7 @@
     InitCommonControls();
 
     s_tabhwnd = CreateWindow(WC_TABCONTROL, "Vim tabline",
-	    WS_CHILD|TCS_FOCUSNEVER,
+	    WS_CHILD|TCS_FOCUSNEVER|TCS_TOOLTIPS,
 	    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
 	    CW_USEDEFAULT, s_hwnd, NULL, s_hinst, NULL);
 
@@ -4404,7 +4499,7 @@
 BevalTimerProc(hwnd, uMsg, idEvent, dwTime)
     HWND    hwnd;
     UINT    uMsg;
-    UINT    idEvent;
+    UINT_PTR    idEvent;
     DWORD   dwTime;
 {
     POINT	pt;
diff --git a/src/hardcopy.c b/src/hardcopy.c
index 62567a3..bc5a219 100644
--- a/src/hardcopy.c
+++ b/src/hardcopy.c
@@ -2538,12 +2538,11 @@
         /* Build CMap name - will be same for all multi-byte fonts used */
         prt_cmap[0] = NUL;
 
-        prt_custom_cmap = prt_out_mbyte && p_mbchar == NULL;
-
+        prt_custom_cmap = (p_mbchar == NULL);
         if (!prt_custom_cmap)
         {
             /* Check encoding and character set are compatible */
-            if ((p_mbenc->needs_charset&p_mbchar->has_charset) == 0)
+            if ((p_mbenc->needs_charset & p_mbchar->has_charset) == 0)
             {
                 EMSG(_("E673: Incompatible multi-byte encoding and character set."));
                 return FALSE;
@@ -2862,6 +2861,7 @@
     struct prt_ps_resource_S res_encoding;
     char	buffer[256];
     char_u      *p_encoding;
+    char_u	*p;
 #ifdef FEAT_MBYTE
     struct prt_ps_resource_S res_cidfont;
     struct prt_ps_resource_S res_cmap;
@@ -2880,7 +2880,9 @@
     now = time(NULL);
     p_time = ctime(&now);
     /* Note: ctime() adds a \n so we have to remove it :-( */
-    *(vim_strchr((char_u *)p_time, '\n')) = '\0';
+    p = vim_strchr((char_u *)p_time, '\n');
+    if (p != NULL)
+	*p = NUL;
     prt_dsc_textline("CreationDate", p_time);
     prt_dsc_textline("DocumentData", "Clean8Bit");
     prt_dsc_textline("Orientation", "Portrait");
diff --git a/src/mbyte.c b/src/mbyte.c
index 98d4e00..2114654 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -3100,7 +3100,7 @@
 	else
 	    s = p + 1;
     }
-    for (i = 0; s[i] != NUL && i < sizeof(buf) - 1; ++i)
+    for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i)
     {
 	if (s[i] == '_' || s[i] == '-')
 	    buf[i] = '-';
diff --git a/src/menu.c b/src/menu.c
index 55fba1f..8b45395 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -59,7 +59,7 @@
 #endif
 
 /* The character for each menu mode */
-static char_u	menu_mode_chars[] = {'n', 'v', 'o', 'i', 'c', 't'};
+static char_u	menu_mode_chars[] = {'n', 'v', 's', 'o', 'i', 'c', 't'};
 
 static char_u e_notsubmenu[] = N_("E327: Part of menu-item path is not sub-menu");
 static char_u e_othermode[] = N_("E328: Menu only exists in another mode");
@@ -1293,6 +1293,7 @@
 	    name = p;
 	    menu = menu->children;
 	}
+	vim_free(path_name);
 
 	xp->xp_context = expand_menus ? EXPAND_MENUNAMES : EXPAND_MENUS;
 	xp->xp_pattern = after_dot;
diff --git a/src/message.c b/src/message.c
index c0146c9..08810ad 100644
--- a/src/message.c
+++ b/src/message.c
@@ -529,6 +529,25 @@
 }
 
 /*
+ * Return TRUE if not giving error messages right now:
+ * If "emsg_off" is set: no error messages at the moment.
+ * If "msg" is in 'debug': do error message but without side effects.
+ * If "emsg_skip" is set: never do error messages.
+ */
+    int
+emsg_not_now()
+{
+    if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
+					  && vim_strchr(p_debug, 't') == NULL)
+#ifdef FEAT_EVAL
+	    || emsg_skip > 0
+#endif
+	    )
+	return TRUE;
+    return FALSE;
+}
+
+/*
  * emsg() - display an error message
  *
  * Rings the bell, if appropriate, and calls message() to do the real work
@@ -559,17 +578,8 @@
     emsg_severe = FALSE;
 #endif
 
-    /*
-     * If "emsg_off" is set: no error messages at the moment.
-     * If "msg" is in 'debug': do error message but without side effects.
-     * If "emsg_skip" is set: never do error messages.
-     */
-    if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
-					  && vim_strchr(p_debug, 't') == NULL)
-#ifdef FEAT_EVAL
-	    || emsg_skip > 0
-#endif
-	    )
+    /* Skip this if not giving error messages at the moment. */
+    if (emsg_not_now())
 	return TRUE;
 
     if (!emsg_off || vim_strchr(p_debug, 't') != NULL)
diff --git a/src/misc1.c b/src/misc1.c
index 67a2fc0..4f0ef02 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -321,7 +321,7 @@
 		++ind_done;
 	    }
 	    ++ind_len;
-	    if (round == 2)
+	    if (p != NULL)
 		*p++ = *s;
 	    ++s;
 	}
@@ -332,7 +332,7 @@
 	{
 	    todo -= tab_pad;
 	    ++ind_len;
-	    if (round == 2)
+	    if (p != NULL)
 		*p++ = TAB;
 	}
 
@@ -341,7 +341,7 @@
 	{
 	    todo -= (int)curbuf->b_p_ts;
 	    ++ind_len;
-	    if (round == 2)
+	    if (p != NULL)
 		*p++ = TAB;
 	}
 
@@ -350,11 +350,11 @@
 	{
 	    --todo;
 	    ++ind_len;
-	    if (round == 2)
+	    if (p != NULL)
 		*p++ = ' ';
 	}
 
-	if (round == 1)
+	if (p == NULL)
 	{
 	    /* Allocate memory for the result: the copied indent, new indent
 	     * and the rest of the line. */
diff --git a/src/misc2.c b/src/misc2.c
index 4667a56..a9f8fef 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -270,14 +270,15 @@
 		/* Break a tab */
 		int	linelen = (int)STRLEN(line);
 		int	correct = wcol - col - csize + 1; /* negative!! */
-		char_u	*newline = alloc(linelen + csize);
+		char_u	*newline;
 		int	t, s = 0;
 		int	v;
 
-		/*
-		 * break a tab
-		 */
-		if (newline == NULL || -correct > csize)
+		if (-correct > csize)
+		    return FAIL;
+
+		newline = alloc(linelen + csize);
+		if (newline == NULL)
 		    return FAIL;
 
 		for (t = 0; t < linelen; t++)
@@ -5816,14 +5817,9 @@
 emsg3(s, a1, a2)
     char_u *s, *a1, *a2;
 {
-    if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
-					  && vim_strchr(p_debug, 't') == NULL)
-#ifdef FEAT_EVAL
-	    || emsg_skip > 0
-#endif
-	    )
+    if (emsg_not_now())
 	return TRUE;		/* no error messages at the moment */
-    vim_snprintf((char *)IObuff, IOSIZE, (char *)s, (long)a1, (long)a2);
+    vim_snprintf((char *)IObuff, IOSIZE, (char *)s, (long_u)a1, (long_u)a2);
     return emsg(IObuff);
 }
 
@@ -5836,14 +5832,8 @@
     char_u	*s;
     long	n;
 {
-    if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
-					  && vim_strchr(p_debug, 't') == NULL)
-#ifdef FEAT_EVAL
-	    || emsg_skip > 0
-#endif
-	    )
+    if (emsg_not_now())
 	return TRUE;		/* no error messages at the moment */
     vim_snprintf((char *)IObuff, IOSIZE, (char *)s, n);
     return emsg(IObuff);
 }
-
diff --git a/src/netbeans.c b/src/netbeans.c
index 731b98b..e2f3a9d 100644
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -1641,17 +1641,30 @@
 	}
 	else if (streq((char *)cmd, "insertDone"))
 	{
-	    buf->bufp->b_start_eol = *args == 'T';
-	    buf->insertDone = TRUE;
-	    args += 2;
-	    buf->bufp->b_p_ro = *args == 'T';
-	    print_read_msg(buf);
+	    if (buf == NULL || buf->bufp == NULL)
+	    {
+		nbdebug(("    null bufp in insertDone"));
+	    }
+	    else
+	    {
+		buf->bufp->b_start_eol = *args == 'T';
+		buf->insertDone = TRUE;
+		args += 2;
+		buf->bufp->b_p_ro = *args == 'T';
+		print_read_msg(buf);
+	    }
 /* =====================================================================*/
 	}
 	else if (streq((char *)cmd, "saveDone"))
 	{
-	    long savedChars = atol((char *) args);
-	    print_save_msg(buf, savedChars);
+	    long savedChars = atol((char *)args);
+
+	    if (buf == NULL || buf->bufp == NULL)
+	    {
+		nbdebug(("    null bufp in saveDone"));
+	    }
+	    else
+		print_save_msg(buf, savedChars);
 /* =====================================================================*/
 	}
 	else if (streq((char *)cmd, "startDocumentListen"))
@@ -1856,12 +1869,17 @@
 	}
 	else if (streq((char *)cmd, "setModtime"))
 	{
-	    buf->bufp->b_mtime = atoi((char *) args);
+	    if (buf == NULL || buf->bufp == NULL)
+		nbdebug(("    null bufp in setModtime"));
+	    else
+		buf->bufp->b_mtime = atoi((char *)args);
 /* =====================================================================*/
 	}
 	else if (streq((char *)cmd, "setReadOnly"))
 	{
-	    if (streq((char *)args, "T"))
+	    if (buf == NULL || buf->bufp == NULL)
+		nbdebug(("    null bufp in setReadOnly"));
+	    else if (streq((char *)args, "T"))
 		buf->bufp->b_p_ro = TRUE;
 	    else
 		buf->bufp->b_p_ro = FALSE;
@@ -2637,7 +2655,7 @@
 	return;
 
     q = nb_quote(bufp->b_ffname);
-    if (q == NULL || bp == NULL || bufp == NULL)
+    if (q == NULL || bp == NULL)
 	return;
 
     vim_snprintf(buffer, sizeof(buffer),  "%d:fileOpened=%d \"%s\" %s %s\n",
diff --git a/src/normal.c b/src/normal.c
index 189b21c..6512574 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -831,6 +831,12 @@
 	    {
 		unshift_special(&ca);
 		idx = find_command(ca.cmdchar);
+		if (idx < 0)
+		{
+		    /* Just in case */
+		    clearopbeep(oap);
+		    goto normal_end;
+		}
 	    }
 	    else if ((nv_cmds[idx].cmd_flags & NV_SSS)
 					       && (mod_mask & MOD_MASK_SHIFT))
diff --git a/src/ops.c b/src/ops.c
index 5122b87..00780ac 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -3723,11 +3723,10 @@
 
 end:
     if (allocated)
-    {
 	vim_free(insert_string);
-	if (regname == '=')
-	    vim_free(y_array);
-    }
+    if (regname == '=')
+	vim_free(y_array);
+
     /* If the cursor is past the end of the line put it at the end. */
     if (gchar_cursor() == NUL
 	    && curwin->w_cursor.col > 0
@@ -4967,10 +4966,6 @@
 	    --col;
     }
 
-    /* truncate to max length of a number */
-    if (length >= NUMBUFLEN - 1)
-	length = NUMBUFLEN - 2;
-
     /*
      * If a number was found, and saving for undo works, replace the number.
      */
diff --git a/src/option.c b/src/option.c
index c1fc7dc..59b84fd 100644
--- a/src/option.c
+++ b/src/option.c
@@ -3396,7 +3396,7 @@
 		win_comp_scroll(curwin);
 	    else
 	    {
-		*(long *)varp = (long)options[opt_idx].def_val[dvi];
+		*(long *)varp = (long)(long_i)options[opt_idx].def_val[dvi];
 		/* May also set global value for local option. */
 		if (both)
 		    *(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) =
@@ -3405,8 +3405,9 @@
 	}
 	else	/* P_BOOL */
 	{
-	    /* the cast to long is required for Manx C */
-	    *(int *)varp = (int)(long)options[opt_idx].def_val[dvi];
+	    /* the cast to long is required for Manx C, long_i is needed for
+	     * MSVC */
+	    *(int *)varp = (int)(long)(long_i)options[opt_idx].def_val[dvi];
 	    /* May also set global value for local option. */
 	    if (both)
 		*(int *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) =
@@ -3488,7 +3489,7 @@
 
     opt_idx = findoption((char_u *)name);
     if (opt_idx >= 0)
-	options[opt_idx].def_val[VI_DEFAULT] = (char_u *)val;
+	options[opt_idx].def_val[VI_DEFAULT] = (char_u *)(long_i)val;
 }
 
 #if defined(EXITFREE) || defined(PROTO)
@@ -3858,7 +3859,7 @@
 	else
 #endif
 	    val = mch_can_restore_title();
-	options[idx1].def_val[VI_DEFAULT] = (char_u *)val;
+	options[idx1].def_val[VI_DEFAULT] = (char_u *)(long_i)val;
 	p_title = val;
     }
     idx1 = findoption((char_u *)"icon");
@@ -3870,7 +3871,7 @@
 	else
 #endif
 	    val = mch_can_restore_icon();
-	options[idx1].def_val[VI_DEFAULT] = (char_u *)val;
+	options[idx1].def_val[VI_DEFAULT] = (char_u *)(long_i)val;
 	p_icon = val;
     }
 }
@@ -4206,7 +4207,7 @@
 		    if (nextchar == '!')
 			value = *(int *)(varp) ^ 1;
 		    else if (nextchar == '&')
-			value = (int)(long)options[opt_idx].def_val[
+			value = (int)(long)(long_i)options[opt_idx].def_val[
 						((flags & P_VI_DEF) || cp_val)
 						 ?  VI_DEFAULT : VIM_DEFAULT];
 		    else if (nextchar == '<')
@@ -4261,7 +4262,7 @@
 			 */
 			++arg;
 			if (nextchar == '&')
-			    value = (long)options[opt_idx].def_val[
+			    value = (long)(long_i)options[opt_idx].def_val[
 						((flags & P_VI_DEF) || cp_val)
 						 ?  VI_DEFAULT : VIM_DEFAULT];
 			else if (nextchar == '<')
@@ -8401,10 +8402,11 @@
 	return TRUE;	    /* hidden option is always at default */
     dvi = ((p->flags & P_VI_DEF) || p_cp) ? VI_DEFAULT : VIM_DEFAULT;
     if (p->flags & P_NUM)
-	return (*(long *)varp == (long)p->def_val[dvi]);
+	return (*(long *)varp == (long)(long_i)p->def_val[dvi]);
     if (p->flags & P_BOOL)
-			/* the cast to long is required for Manx C */
-	return (*(int *)varp == (int)(long)p->def_val[dvi]);
+			/* the cast to long is required for Manx C, long_i is
+			 * needed for MSVC */
+	return (*(int *)varp == (int)(long)(long_i)p->def_val[dvi]);
     /* P_STRING */
     return (STRCMP(*(char_u **)varp, p->def_val[dvi]) == 0);
 }
@@ -9993,7 +9995,7 @@
 	    NameBuff[0] = NUL;
 #ifdef FEAT_CRYPT
 	/* don't show the actual value of 'key', only that it's set */
-	if (opp->var == (char_u *)&p_key && *varp)
+	else if (opp->var == (char_u *)&p_key && *varp)
 	    STRCPY(NameBuff, "*****");
 #endif
 	else if (opp->flags & P_EXPAND)
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 642dc43..9e8b64d 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -770,14 +770,14 @@
     if (VirtualQuery(str, &mbi, sizeof(mbi)))
     {
 	/* pre cast these (typing savers) */
-	DWORD dwStr = (DWORD)str;
-	DWORD dwBaseAddress = (DWORD)mbi.BaseAddress;
+	long_u dwStr = (long_u)str;
+	long_u dwBaseAddress = (long_u)mbi.BaseAddress;
 
 	/* get start address of page that str is on */
-	DWORD strPage = dwStr - (dwStr - dwBaseAddress) % si.dwPageSize;
+	long_u strPage = dwStr - (dwStr - dwBaseAddress) % si.dwPageSize;
 
 	/* get length from str to end of page */
-	DWORD pageLength = si.dwPageSize - (dwStr - strPage);
+	long_u pageLength = si.dwPageSize - (dwStr - strPage);
 
 	for (p = str; !IsBadReadPtr(p, pageLength);
 				  p += pageLength, pageLength = si.dwPageSize)
@@ -2625,7 +2625,7 @@
 #ifdef FEAT_AUTOCMD
 		else if (data->dwData == COPYDATA_REPLY)
 		{
-		    sprintf((char *)winstr, "0x%x", (unsigned)sender);
+		    sprintf((char *)winstr, PRINTF_HEX_LONG_U, (long_u)sender);
 		    apply_autocmds(EVENT_REMOTEREPLY, winstr, str,
 								TRUE, curbuf);
 		}
@@ -2834,13 +2834,13 @@
 {
     HWND	target;
     COPYDATASTRUCT data;
-    int		n = 0;
+    long_u	n = 0;
 
     /* The "name" argument is a magic cookie obtained from expand("<client>").
      * It should be of the form 0xXXXXX - i.e. a C hex literal, which is the
      * value of the client's message window HWND.
      */
-    sscanf((char *)name, "%x", &n);
+    sscanf((char *)name, SCANF_HEX_LONG_U, &n);
     if (n == 0)
 	return -1;
 
@@ -3130,7 +3130,7 @@
  * calculation is for a vertical (height) size or a horizontal (width) one.
  */
     static int
-points_to_pixels(char_u *str, char_u **end, int vertical, int pprinter_dc)
+points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc)
 {
     int		pixels;
     int		points = 0;
@@ -3338,10 +3338,10 @@
 	switch (*p++)
 	{
 	    case 'h':
-		lf->lfHeight = - points_to_pixels(p, &p, TRUE, (int)printer_dc);
+		lf->lfHeight = - points_to_pixels(p, &p, TRUE, (long_i)printer_dc);
 		break;
 	    case 'w':
-		lf->lfWidth = points_to_pixels(p, &p, FALSE, (int)printer_dc);
+		lf->lfWidth = points_to_pixels(p, &p, FALSE, (long_i)printer_dc);
 		break;
 	    case 'b':
 #ifndef MSWIN16_FASTTEXT
diff --git a/src/os_unix.c b/src/os_unix.c
index 9012974..5d52a7f 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -3602,7 +3602,7 @@
 		*p++ = NUL;
 	    p = skipwhite(p);
 	}
-	if (i == 0)
+	if (argv == NULL)
 	{
 	    argv = (char **)alloc((unsigned)((argc + 4) * sizeof(char *)));
 	    if (argv == NULL)	    /* out of memory */
diff --git a/src/os_win32.c b/src/os_win32.c
index 630df5a..af65906 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1288,7 +1288,7 @@
     g_hConIn =	CreateFile("CONIN$", GENERIC_READ|GENERIC_WRITE,
 			FILE_SHARE_READ|FILE_SHARE_WRITE,
 			(LPSECURITY_ATTRIBUTES) NULL,
-			OPEN_EXISTING, (DWORD)NULL, (HANDLE)NULL);
+			OPEN_EXISTING, 0, (HANDLE)NULL);
     did_create_conin = TRUE;
 }
 
diff --git a/src/proto/message.pro b/src/proto/message.pro
index 9161b05..cff7d6b 100644
--- a/src/proto/message.pro
+++ b/src/proto/message.pro
@@ -1,70 +1,71 @@
 /* message.c */
-extern int msg __ARGS((char_u *s));
-extern int verb_msg __ARGS((char_u *s));
-extern int msg_attr __ARGS((char_u *s, int attr));
-extern int msg_attr_keep __ARGS((char_u *s, int attr, int keep));
-extern char_u *msg_strtrunc __ARGS((char_u *s, int force));
-extern void trunc_string __ARGS((char_u *s, char_u *buf, int room));
-extern void reset_last_sourcing __ARGS((void));
-extern void msg_source __ARGS((int attr));
-extern int emsg __ARGS((char_u *s));
-extern int emsg2 __ARGS((char_u *s, char_u *a1));
-extern void emsg_invreg __ARGS((int name));
-extern char_u *msg_trunc_attr __ARGS((char_u *s, int force, int attr));
-extern char_u *msg_may_trunc __ARGS((int force, char_u *s));
-extern int delete_first_msg __ARGS((void));
-extern void ex_messages __ARGS((exarg_T *eap));
-extern void msg_end_prompt __ARGS((void));
-extern void wait_return __ARGS((int redraw));
-extern void set_keep_msg __ARGS((char_u *s, int attr));
-extern void set_keep_msg_from_hist __ARGS((void));
-extern void msg_start __ARGS((void));
-extern void msg_starthere __ARGS((void));
-extern void msg_putchar __ARGS((int c));
-extern void msg_putchar_attr __ARGS((int c, int attr));
-extern void msg_outnum __ARGS((long n));
-extern void msg_home_replace __ARGS((char_u *fname));
-extern void msg_home_replace_hl __ARGS((char_u *fname));
-extern int msg_outtrans __ARGS((char_u *str));
-extern int msg_outtrans_attr __ARGS((char_u *str, int attr));
-extern int msg_outtrans_len __ARGS((char_u *str, int len));
-extern char_u *msg_outtrans_one __ARGS((char_u *p, int attr));
-extern int msg_outtrans_len_attr __ARGS((char_u *msgstr, int len, int attr));
-extern void msg_make __ARGS((char_u *arg));
-extern int msg_outtrans_special __ARGS((char_u *strstart, int from));
-extern char_u *str2special __ARGS((char_u **sp, int from));
-extern void str2specialbuf __ARGS((char_u *sp, char_u *buf, int len));
-extern void msg_prt_line __ARGS((char_u *s, int list));
-extern void msg_puts __ARGS((char_u *s));
-extern void msg_puts_title __ARGS((char_u *s));
-extern void msg_puts_long_attr __ARGS((char_u *longstr, int attr));
-extern void msg_puts_long_len_attr __ARGS((char_u *longstr, int len, int attr));
-extern void msg_puts_attr __ARGS((char_u *s, int attr));
-extern void may_clear_sb_text __ARGS((void));
-extern void clear_sb_text __ARGS((void));
-extern void show_sb_text __ARGS((void));
-extern int msg_use_printf __ARGS((void));
-extern void mch_errmsg __ARGS((char *str));
-extern void mch_msg __ARGS((char *str));
-extern void msg_moremsg __ARGS((int full));
-extern void repeat_message __ARGS((void));
-extern void msg_clr_eos __ARGS((void));
-extern void msg_clr_eos_force __ARGS((void));
-extern void msg_clr_cmdline __ARGS((void));
-extern int msg_end __ARGS((void));
-extern void msg_check __ARGS((void));
-extern void verbose_enter __ARGS((void));
-extern void verbose_leave __ARGS((void));
-extern void verbose_enter_scroll __ARGS((void));
-extern void verbose_leave_scroll __ARGS((void));
-extern void verbose_stop __ARGS((void));
-extern int verbose_open __ARGS((void));
-extern void give_warning __ARGS((char_u *message, int hl));
-extern void msg_advance __ARGS((int col));
-extern int do_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int dfltbutton, char_u *textfield));
-extern void display_confirm_msg __ARGS((void));
-extern int vim_dialog_yesno __ARGS((int type, char_u *title, char_u *message, int dflt));
-extern int vim_dialog_yesnocancel __ARGS((int type, char_u *title, char_u *message, int dflt));
-extern int vim_dialog_yesnoallcancel __ARGS((int type, char_u *title, char_u *message, int dflt));
-extern char_u *do_browse __ARGS((int flags, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter, buf_T *buf));
+int msg __ARGS((char_u *s));
+int verb_msg __ARGS((char_u *s));
+int msg_attr __ARGS((char_u *s, int attr));
+int msg_attr_keep __ARGS((char_u *s, int attr, int keep));
+char_u *msg_strtrunc __ARGS((char_u *s, int force));
+void trunc_string __ARGS((char_u *s, char_u *buf, int room));
+void reset_last_sourcing __ARGS((void));
+void msg_source __ARGS((int attr));
+int emsg_not_now __ARGS((void));
+int emsg __ARGS((char_u *s));
+int emsg2 __ARGS((char_u *s, char_u *a1));
+void emsg_invreg __ARGS((int name));
+char_u *msg_trunc_attr __ARGS((char_u *s, int force, int attr));
+char_u *msg_may_trunc __ARGS((int force, char_u *s));
+int delete_first_msg __ARGS((void));
+void ex_messages __ARGS((exarg_T *eap));
+void msg_end_prompt __ARGS((void));
+void wait_return __ARGS((int redraw));
+void set_keep_msg __ARGS((char_u *s, int attr));
+void set_keep_msg_from_hist __ARGS((void));
+void msg_start __ARGS((void));
+void msg_starthere __ARGS((void));
+void msg_putchar __ARGS((int c));
+void msg_putchar_attr __ARGS((int c, int attr));
+void msg_outnum __ARGS((long n));
+void msg_home_replace __ARGS((char_u *fname));
+void msg_home_replace_hl __ARGS((char_u *fname));
+int msg_outtrans __ARGS((char_u *str));
+int msg_outtrans_attr __ARGS((char_u *str, int attr));
+int msg_outtrans_len __ARGS((char_u *str, int len));
+char_u *msg_outtrans_one __ARGS((char_u *p, int attr));
+int msg_outtrans_len_attr __ARGS((char_u *msgstr, int len, int attr));
+void msg_make __ARGS((char_u *arg));
+int msg_outtrans_special __ARGS((char_u *strstart, int from));
+char_u *str2special __ARGS((char_u **sp, int from));
+void str2specialbuf __ARGS((char_u *sp, char_u *buf, int len));
+void msg_prt_line __ARGS((char_u *s, int list));
+void msg_puts __ARGS((char_u *s));
+void msg_puts_title __ARGS((char_u *s));
+void msg_puts_long_attr __ARGS((char_u *longstr, int attr));
+void msg_puts_long_len_attr __ARGS((char_u *longstr, int len, int attr));
+void msg_puts_attr __ARGS((char_u *s, int attr));
+void may_clear_sb_text __ARGS((void));
+void clear_sb_text __ARGS((void));
+void show_sb_text __ARGS((void));
+int msg_use_printf __ARGS((void));
+void mch_errmsg __ARGS((char *str));
+void mch_msg __ARGS((char *str));
+void msg_moremsg __ARGS((int full));
+void repeat_message __ARGS((void));
+void msg_clr_eos __ARGS((void));
+void msg_clr_eos_force __ARGS((void));
+void msg_clr_cmdline __ARGS((void));
+int msg_end __ARGS((void));
+void msg_check __ARGS((void));
+void verbose_enter __ARGS((void));
+void verbose_leave __ARGS((void));
+void verbose_enter_scroll __ARGS((void));
+void verbose_leave_scroll __ARGS((void));
+void verbose_stop __ARGS((void));
+int verbose_open __ARGS((void));
+void give_warning __ARGS((char_u *message, int hl));
+void msg_advance __ARGS((int col));
+int do_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int dfltbutton, char_u *textfield));
+void display_confirm_msg __ARGS((void));
+int vim_dialog_yesno __ARGS((int type, char_u *title, char_u *message, int dflt));
+int vim_dialog_yesnocancel __ARGS((int type, char_u *title, char_u *message, int dflt));
+int vim_dialog_yesnoallcancel __ARGS((int type, char_u *title, char_u *message, int dflt));
+char_u *do_browse __ARGS((int flags, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter, buf_T *buf));
 /* vim: set ft=c : */
diff --git a/src/regexp.c b/src/regexp.c
index e0bfb03..2cd3120 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -7054,7 +7054,7 @@
     int		round;
     linenr_T	lnum;
 
-    if (!can_f_submatch)
+    if (!can_f_submatch || no < 0)
 	return NULL;
 
     if (submatch_match == NULL)
@@ -7112,10 +7112,10 @@
 		++len;
 	    }
 
-	    if (round == 1)
+	    if (retval == NULL)
 	    {
 		retval = lalloc((long_u)len, TRUE);
-		if (s == NULL)
+		if (retval == NULL)
 		    return NULL;
 	    }
 	}
diff --git a/src/spell.c b/src/spell.c
index 3ae44d4..5db914e 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -5102,7 +5102,10 @@
      */
     aff = (afffile_T *)getroom(spin, sizeof(afffile_T), TRUE);
     if (aff == NULL)
+    {
+	fclose(fd);
 	return NULL;
+    }
     hash_init(&aff->af_pref);
     hash_init(&aff->af_suff);
     hash_init(&aff->af_comp);
@@ -7361,7 +7364,8 @@
 
 		/* Link the new node in the list, there will be one ref. */
 		np->wn_refs = 1;
-		*copyprev = np;
+		if (copyprev != NULL)
+		    *copyprev = np;
 		copyprev = &np->wn_sibling;
 
 		/* Let "node" point to the head of the copied list. */
@@ -15464,7 +15468,7 @@
 	if (pat != NULL && slang->sl_pbyts == NULL)
 	    patlen = (int)STRLEN(pat);
 	else
-	    patlen = 0;
+	    patlen = -1;
 
 	/* round 1: case-folded tree
 	 * round 2: keep-case tree */
diff --git a/src/syntax.c b/src/syntax.c
index 714de44..5308f90 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -1371,7 +1371,8 @@
 		for (p = syn_buf->b_sst_first; p != NULL; p = p->sst_next)
 		    if (p->sst_next == sp)
 			break;
-		p->sst_next = sp->sst_next;
+		if (p != NULL)	/* just in case */
+		    p->sst_next = sp->sst_next;
 	    }
 	    syn_stack_free_entry(syn_buf, sp);
 	    sp = NULL;
diff --git a/src/testdir/test61.in b/src/testdir/test61.in
index 749d8ad..7ce72e6 100644
--- a/src/testdir/test61.in
+++ b/src/testdir/test61.in
@@ -43,6 +43,13 @@
 :.w >>test.out
 :later 1h
 :.w >>test.out
+:"
+:" test undojoin
+Goaaaa:set ul=100
+obbbbu:.w >>test.out
+obbbb:set ul=100
+:undojoin
+occccu:.w >>test.out
 :qa!
 ENDTEST
 
diff --git a/src/testdir/test61.ok b/src/testdir/test61.ok
index c23fe22..020dd53 100644
--- a/src/testdir/test61.ok
+++ b/src/testdir/test61.ok
@@ -20,3 +20,5 @@
 123456789
 123456
 123456abc
+aaaa
+aaaa
diff --git a/src/version.h b/src/version.h
index bb77f87..ef0ff31 100644
--- a/src/version.h
+++ b/src/version.h
@@ -35,6 +35,6 @@
  */
 #define VIM_VERSION_NODOT	"vim70e"
 #define VIM_VERSION_SHORT	"7.0e"
-#define VIM_VERSION_MEDIUM	"7.0e05 BETA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0e05 BETA (2006 Apr 21)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0e05 BETA (2006 Apr 21, compiled "
+#define VIM_VERSION_MEDIUM	"7.0e06 BETA"
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0e06 BETA (2006 Apr 22)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0e06 BETA (2006 Apr 22, compiled "
diff --git a/src/vim.h b/src/vim.h
index f24f15d..5f78ac8 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -342,14 +342,19 @@
 typedef unsigned char	char_u;
 typedef unsigned short	short_u;
 typedef unsigned int	int_u;
-/* Make sure long_u is big enough to hold a pointer.  On Win64 longs are 32
- * bit and pointers 64 bit. */
+/* Make sure long_u is big enough to hold a pointer.
+ * On Win64 longs are 32 bit and pointers 64 bit.
+ * For printf() and scanf() we need to take care of long_u specifically. */
 #ifdef _WIN64
 typedef unsigned __int64 long_u;
 typedef		 __int64 long_i;
+# define SCANF_HEX_LONG_U  "%Ix"
+# define PRINTF_HEX_LONG_U "0x%Ix"
 #else
 typedef unsigned long	long_u;
 typedef	         long	long_i;
+# define SCANF_HEX_LONG_U  "%lx"
+# define PRINTF_HEX_LONG_U "0x%lx"
 #endif
 
 /*
@@ -1382,6 +1387,7 @@
 #define EMSG2(s, p)		    emsg2((char_u *)(s), (char_u *)(p))
 #define EMSG3(s, p, q)		    emsg3((char_u *)(s), (char_u *)(p), (char_u *)(q))
 #define EMSGN(s, n)		    emsgn((char_u *)(s), (long)(n))
+#define EMSGU(s, n)		    emsgu((char_u *)(s), (long_u)(n))
 #define OUT_STR(s)		    out_str((char_u *)(s))
 #define OUT_STR_NF(s)		    out_str_nf((char_u *)(s))
 #define MSG_PUTS(s)		    msg_puts((char_u *)(s))
diff --git a/src/window.c b/src/window.c
index d9d5bca..628f9e0 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5077,7 +5077,7 @@
     int		n;
 
     fr = dragwin->w_frame;
-    if (fr == topframe)		/* only one window (cannot happe?) */
+    if (fr == topframe)		/* only one window (cannot happen?) */
 	return;
     curfr = fr;
     fr = fr->fr_parent;