diff --git a/src/GvimExt/Makefile b/src/GvimExt/Makefile
index 361c229..798efd2 100644
--- a/src/GvimExt/Makefile
+++ b/src/GvimExt/Makefile
@@ -3,7 +3,7 @@
 #   DEBUG=yes		Build debug version (for VC7 and maybe later)
 #
 
-TARGETOS=BOTH
+TARGETOS=WINNT
 !ifndef APPVER
 APPVER=5.0
 !endif
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 91ae25a..435f56d 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -1,7 +1,7 @@
-# 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), VC8 (VS2005),
-# VC9 (VS2008), VC10 (VS2010) and VC11 (VS2012)
+# Makefile for Vim on Win32 (Windows XP/2003/Vista/7/8/10) and Win64,
+# using the Microsoft Visual C++ compilers. Known to work with VC5, VC6 (VS98),
+# VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005), VC9 (VS2008), VC10 (VS2010),
+# VC11 (VS2012), VC12 (VS2013) and VC14 (VS2015)
 #
 # To build using other Windows compilers, see INSTALLpc.txt
 #
@@ -119,7 +119,7 @@
 #	  yes:   Write a normal mapfile.
 #	  lines: Write a mapfile with line numbers (only for VC6 and later)
 #
-#	Static Code Analysis: ANALYZE=yes (works with VS2012 only)
+#	Static Code Analysis: ANALYZE=yes (works with VS2012 or later)
 #
 # You can combine any of these interfaces
 #
@@ -162,9 +162,9 @@
 # you can set DEFINES on the command line, e.g.,
 #	nmake -f Make_mvc.mvc "DEFINES=-DEMACS_TAGS"
 
-# Build on both Windows NT/XP and Windows 9x
+# Build on Windows NT/XP
 
-TARGETOS = BOTH
+TARGETOS = WINNT
 
 # Select one of eight object code directories, depends on GUI, OLE, DEBUG and
 # interfaces.
@@ -436,13 +436,7 @@
 #>>>>> end of choices
 ###########################################################################
 
-!ifdef OS
-OS_TYPE	= winnt
 DEL_TREE = rmdir /s /q
-!else
-OS_TYPE	= win95
-DEL_TREE = deltree /y
-!endif
 
 INTDIR=$(OBJDIR)
 OUTDIR=$(OBJDIR)
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 84eaa8c..9fa8f1c 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6017,7 +6017,7 @@
 #endif
 #if defined(WIN3264)
 	else if (STRICMP(name, "win95") == 0)
-	    n = mch_windows95();
+	    n = FALSE;		/* Win9x is no more supported. */
 #endif
 #ifdef FEAT_NETBEANS_INTG
 	else if (STRICMP(name, "netbeans_enabled") == 0)
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 6535de1..5b6a44a 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1175,14 +1175,6 @@
     if (*cmd == NUL)	    /* no filter command */
 	return;
 
-#ifdef WIN3264
-    /*
-     * Check if external commands are allowed now.
-     */
-    if (can_end_termcap_mode(TRUE) == FALSE)
-	return;
-#endif
-
     cursor_save = curwin->w_cursor;
     linecount = line2 - line1 + 1;
     curwin->w_cursor.lnum = line1;
@@ -1460,12 +1452,6 @@
 
 #ifdef MSWIN
     /*
-     * Check if external commands are allowed now.
-     */
-    if (can_end_termcap_mode(TRUE) == FALSE)
-	return;
-
-    /*
      * Check if ":!start" is used.
      */
     if (cmd != NULL)
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 09b9019..ac7beb7 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -7611,14 +7611,7 @@
     /*
      * Disallow suspending for "rvim".
      */
-    if (!check_restricted()
-#ifdef WIN3264
-	/*
-	 * Check if external commands are allowed now.
-	 */
-	&& can_end_termcap_mode(TRUE)
-#endif
-					)
+    if (!check_restricted())
     {
 	if (!eap->forceit)
 	    autowrite_all();
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 75d600f..be2158d 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -319,7 +319,7 @@
 #ifdef MSWIN_FIND_REPLACE
 static UINT		s_findrep_msg = 0;	/* set in gui_w[16/32].c */
 static FINDREPLACE	s_findrep_struct;
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 static FINDREPLACEW	s_findrep_struct_w;
 # endif
 static HWND		s_findrep_hwnd = NULL;
@@ -369,7 +369,7 @@
 # define MyTranslateMessage(x) TranslateMessage(x)
 #endif
 
-#if (defined(WIN3264) && defined(FEAT_MBYTE)) || defined(GLOBAL_IME)
+#if defined(FEAT_MBYTE) || defined(GLOBAL_IME)
   /* use of WindowProc depends on wide_WindowProc */
 # define MyWindowProc vim_WindowProc
 #else
@@ -473,10 +473,6 @@
 static int	s_timed_out = FALSE;
 static int	dead_key = 0;	/* 0: no dead key, 1: dead key pressed */
 
-#ifdef WIN3264
-static OSVERSIONINFO os_version;    /* like it says.  Init in gui_mch_init() */
-#endif
-
 #ifdef FEAT_BEVAL
 /* balloon-eval WM_NOTIFY_HANDLER */
 static void Handle_WM_Notify(HWND hwnd, LPNMHDR pnmh);
@@ -695,61 +691,41 @@
     WCHAR	wstring[2];
     char_u	*ws = NULL;
 
-    if (os_version.dwPlatformId != VER_PLATFORM_WIN32_NT)
+    wstring[0] = ch;
+    len = 1;
+
+    /* "ch" is a UTF-16 character.  Convert it to a string of bytes.  When
+     * "enc_codepage" is non-zero use the standard Win32 function,
+     * otherwise use our own conversion function (e.g., for UTF-8). */
+    if (enc_codepage > 0)
     {
-	/* On Windows 95/98 we apparently get the character in the active
-	 * codepage, not in UCS-2.  If conversion is needed convert it to
-	 * UCS-2 first. */
-	if ((int)GetACP() == enc_codepage)
-	    len = 0;	    /* no conversion required */
-	else
+	len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
+		(LPSTR)string, slen, 0, NULL);
+	/* If we had included the ALT key into the character but now the
+	 * upper bit is no longer set, that probably means the conversion
+	 * failed.  Convert the original character and set the upper bit
+	 * afterwards. */
+	if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80)
 	{
-	    string[0] = ch;
-	    len = MultiByteToWideChar(GetACP(), 0, (LPCSTR)string,
-		    1, wstring, 2);
+	    wstring[0] = ch & 0x7f;
+	    len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
+		    (LPSTR)string, slen, 0, NULL);
+	    if (len == 1) /* safety check */
+		string[0] |= 0x80;
 	}
     }
     else
     {
-	wstring[0] = ch;
 	len = 1;
-    }
-
-    if (len > 0)
-    {
-	/* "ch" is a UTF-16 character.  Convert it to a string of bytes.  When
-	 * "enc_codepage" is non-zero use the standard Win32 function,
-	 * otherwise use our own conversion function (e.g., for UTF-8). */
-	if (enc_codepage > 0)
-	{
-	    len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
-					       (LPSTR)string, slen, 0, NULL);
-	    /* If we had included the ALT key into the character but now the
-	     * upper bit is no longer set, that probably means the conversion
-	     * failed.  Convert the original character and set the upper bit
-	     * afterwards. */
-	    if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80)
-	    {
-		wstring[0] = ch & 0x7f;
-		len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
-					       (LPSTR)string, slen, 0, NULL);
-		if (len == 1) /* safety check */
-		    string[0] |= 0x80;
-	    }
-	}
+	ws = utf16_to_enc(wstring, &len);
+	if (ws == NULL)
+	    len = 0;
 	else
 	{
-	    len = 1;
-	    ws = utf16_to_enc(wstring, &len);
-	    if (ws == NULL)
-		len = 0;
-	    else
-	    {
-		if (len > slen)	/* just in case */
-		    len = slen;
-		mch_memmove(string, ws, len);
-		vim_free(ws);
-	    }
+	    if (len > slen)	/* just in case */
+		len = slen;
+	    mch_memmove(string, ws, len);
+	    vim_free(ws);
 	}
     }
 
@@ -1079,7 +1055,7 @@
 #endif
 
 #ifdef MSWIN_FIND_REPLACE
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 /*
  * copy useful data from structure LPFINDREPLACE to structure LPFINDREPLACEW
  */
@@ -1127,11 +1103,10 @@
     int	    flags = 0;
     int	    down;
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
     /* If the OS is Windows NT, and 'encoding' differs from active codepage:
      * convert text from wide string. */
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-			&& enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 	findrep_wtoa(&s_findrep_struct, &s_findrep_struct_w);
     }
@@ -1279,7 +1254,7 @@
     }
 }
 
-#if (defined(WIN3264) && defined(FEAT_MBYTE)) \
+#if defined(FEAT_MBYTE) \
 	|| defined(GLOBAL_IME) \
 	|| defined(PROTO)
 # ifdef PROTO
@@ -1586,10 +1561,9 @@
 
     static SysColorTable sys_table[] =
     {
-#ifdef WIN3264
 	{"SYS_3DDKSHADOW", COLOR_3DDKSHADOW},
 	{"SYS_3DHILIGHT", COLOR_3DHILIGHT},
-#ifndef __MINGW32__
+#ifdef COLOR_3DHIGHLIGHT
 	{"SYS_3DHIGHLIGHT", COLOR_3DHIGHLIGHT},
 #endif
 	{"SYS_BTNHILIGHT", COLOR_BTNHILIGHT},
@@ -1600,7 +1574,6 @@
 	{"SYS_INFOBK", COLOR_INFOBK},
 	{"SYS_INFOTEXT", COLOR_INFOTEXT},
 	{"SYS_3DFACE", COLOR_3DFACE},
-#endif
 	{"SYS_BTNFACE", COLOR_BTNFACE},
 	{"SYS_BTNSHADOW", COLOR_BTNSHADOW},
 	{"SYS_ACTIVEBORDER", COLOR_ACTIVEBORDER},
@@ -2094,11 +2067,7 @@
 
 	if (s_need_activate)
 	{
-#ifdef WIN32
 	    (void)SetForegroundWindow(s_hwnd);
-#else
-	    (void)SetActiveWindow(s_hwnd);
-#endif
 	    s_need_activate = FALSE;
 	}
 
@@ -2421,7 +2390,6 @@
 {
 #ifdef FEAT_MBYTE
     WCHAR	*wn = NULL;
-    int		n;
 
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
@@ -2438,11 +2406,8 @@
 	    infow.fType = MFT_STRING;
 	    infow.dwTypeData = wn;
 	    infow.cch = (UINT)wcslen(wn);
-	    n = InsertMenuItemW(pmenu, item_id, FALSE, &infow);
+	    InsertMenuItemW(pmenu, item_id, FALSE, &infow);
 	    vim_free(wn);
-	    if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-		/* Failed, try using non-wide function. */
-		wn = NULL;
 	}
     }
 
@@ -2563,7 +2528,7 @@
     if (s_tabhwnd == NULL)
 	return;
 
-#if defined(FEAT_MBYTE)
+#ifdef FEAT_MBYTE
 # ifndef CCM_SETUNICODEFORMAT
     /* For older compilers.  We assume this never changes. */
 #  define CCM_SETUNICODEFORMAT 0x2005
@@ -2708,18 +2673,15 @@
     if (title != NULL && enc_codepage >= 0 && enc_codepage != (int)GetACP())
     {
 	WCHAR	*wbuf;
-	int	n;
 
 	/* Convert the title from 'encoding' to UTF-16. */
 	wbuf = (WCHAR *)enc_to_utf16((char_u *)title, NULL);
 	if (wbuf != NULL)
 	{
-	    n = SetWindowTextW(hwnd, wbuf);
+	    SetWindowTextW(hwnd, wbuf);
 	    vim_free(wbuf);
-	    if (n != 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return;
-	    /* Retry with non-wide function (for Windows 98). */
 	}
+	return;
     }
 #endif
     (void)SetWindowText(hwnd, (LPCSTR)title);
@@ -2737,11 +2699,10 @@
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 	    /* If the OS is Windows NT, and 'encoding' differs from active
 	     * codepage: convert text and use wide function. */
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
 		s_findrep_hwnd = FindTextW(
@@ -2774,9 +2735,8 @@
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-# if defined(FEAT_MBYTE) && defined(WIN3264)
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+# ifdef FEAT_MBYTE
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
 		s_findrep_hwnd = ReplaceTextW(
@@ -3466,11 +3426,7 @@
     IDC_SIZEWE,			/* leftright */
     IDC_SIZEWE,			/* lrsizing */
     IDC_WAIT,			/* busy */
-#ifdef WIN3264
     IDC_NO,			/* no */
-#else
-    IDC_ICON,			/* no */
-#endif
     IDC_ARROW,			/* crosshair */
     IDC_ARROW,			/* hand1 */
     IDC_ARROW,			/* hand2 */
@@ -3497,11 +3453,7 @@
 #ifdef SetClassLongPtr
 	SetClassLongPtr(s_textArea, GCLP_HCURSOR, (__int3264)(LONG_PTR)LoadCursor(NULL, idc));
 #else
-# ifdef WIN32
 	SetClassLong(s_textArea, GCL_HCURSOR, (long_u)LoadCursor(NULL, idc));
-# else /* Win16 */
-	SetClassWord(s_textArea, GCW_HCURSOR, (WORD)LoadCursor(NULL, idc));
-# endif
 #endif
 	if (!p_mh)
 	{
@@ -3523,7 +3475,7 @@
  * Windows NT/2000/XP the "W" functions are used.
  */
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 /*
  * Wide version of convert_filter().
  */
@@ -3728,17 +3680,15 @@
 	char_u *initdir,
 	char_u *filter)
 {
+# ifdef FEAT_MBYTE
+    return gui_mch_browseW(saving, title, dflt, ext, initdir, filter);
+# else
     OPENFILENAME	fileStruct;
     char_u		fileBuf[MAXPATHL];
     char_u		*initdirp = NULL;
     char_u		*filterp;
     char_u		*p;
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
-	return gui_mch_browseW(saving, title, dflt, ext, initdir, filter);
-# endif
-
     if (dflt == NULL)
 	fileBuf[0] = NUL;
     else
@@ -3748,12 +3698,12 @@
     filterp = convert_filter(filter);
 
     vim_memset(&fileStruct, 0, sizeof(OPENFILENAME));
-#ifdef OPENFILENAME_SIZE_VERSION_400
+#  ifdef OPENFILENAME_SIZE_VERSION_400
     /* be compatible with Windows NT 4.0 */
     fileStruct.lStructSize = OPENFILENAME_SIZE_VERSION_400;
-#else
+#  else
     fileStruct.lStructSize = sizeof(fileStruct);
-#endif
+#  endif
 
     fileStruct.lpstrTitle = (LPSTR)title;
     fileStruct.lpstrDefExt = (LPSTR)ext;
@@ -3783,10 +3733,10 @@
      * Don't use OFN_OVERWRITEPROMPT, Vim has its own ":confirm" dialog.
      */
     fileStruct.Flags = (OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY);
-#ifdef FEAT_SHORTCUT
+#  ifdef FEAT_SHORTCUT
     if (curbuf->b_p_bin)
 	fileStruct.Flags |= OFN_NODEREFERENCELINKS;
-#endif
+#  endif
     if (saving)
     {
 	if (!GetSaveFileName(&fileStruct))
@@ -3806,6 +3756,7 @@
 
     /* Shorten the file name if possible */
     return vim_strsave(shorten_fname1((char_u *)fileBuf));
+# endif
 }
 #endif /* FEAT_BROWSE */
 
@@ -3816,16 +3767,11 @@
     HDROP hDrop)
 {
 #ifdef FEAT_WINDOWS
-#ifdef WIN3264
 # define BUFPATHLEN _MAX_PATH
 # define DRAGQVAL 0xFFFFFFFF
-#else
-# define BUFPATHLEN MAXPATHL
-# define DRAGQVAL 0xFFFF
-#endif
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
     WCHAR   wszFile[BUFPATHLEN];
-#endif
+# endif
     char    szFile[BUFPATHLEN];
     UINT    cFiles = DragQueryFile(hDrop, DRAGQVAL, NULL, 0);
     UINT    i;
@@ -3846,11 +3792,11 @@
     if (fnames != NULL)
 	for (i = 0; i < cFiles; ++i)
 	{
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
 	    if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0)
 		fnames[i] = utf16_to_enc(wszFile, NULL);
 	    else
-#endif
+# endif
 	    {
 		DragQueryFile(hDrop, i, szFile, BUFPATHLEN);
 		fnames[i] = vim_strsave((char_u *)szFile);
@@ -3888,14 +3834,10 @@
     long	val;
     int		dragging = FALSE;
     int		dont_scroll_save = dont_scroll;
-#ifndef WIN3264
-    int		nPos;
-#else
     SCROLLINFO	si;
 
     si.cbSize = sizeof(si);
     si.fMask = SIF_POS;
-#endif
 
     sb = gui_mswin_find_scrollbar(hwndCtl);
     if (sb == NULL)
@@ -3960,13 +3902,8 @@
     }
     prev_code = code;
 
-#ifdef WIN3264
     si.nPos = (sb->scroll_shift > 0) ? val >> sb->scroll_shift : val;
     SetScrollInfo(hwndCtl, SB_CTL, &si, TRUE);
-#else
-    nPos = (sb->scroll_shift > 0) ? val >> sb->scroll_shift : val;
-    SetScrollPos(hwndCtl, SB_CTL, nPos, TRUE);
-#endif
 
     /*
      * When moving a vertical scrollbar, move the other vertical scrollbar too.
@@ -3976,11 +3913,7 @@
 	scrollbar_T *sba = sb->wp->w_scrollbars;
 	HWND    id = sba[ (sb == sba + SBAR_LEFT) ? SBAR_RIGHT : SBAR_LEFT].id;
 
-#ifdef WIN3264
 	SetScrollInfo(id, SB_CTL, &si, TRUE);
-#else
-	SetScrollPos(id, SB_CTL, nPos, TRUE);
-#endif
     }
 
     /* Don't let us be interrupted here by another message. */
@@ -4448,7 +4381,6 @@
 
 /* Intellimouse support */
 static int mouse_scroll_lines = 0;
-static UINT msh_msgmousewheel = 0;
 
 static int	s_usenewlook;	    /* emulate W95/NT4 non-bold dialogs */
 #ifdef FEAT_TOOLBAR
@@ -4505,34 +4437,6 @@
 # define pImmSetConversionStatus  ImmSetConversionStatus
 #endif
 
-/* multi monitor support */
-typedef struct _MONITORINFOstruct
-{
-    DWORD cbSize;
-    RECT rcMonitor;
-    RECT rcWork;
-    DWORD dwFlags;
-} _MONITORINFO;
-
-typedef HANDLE _HMONITOR;
-typedef _HMONITOR (WINAPI *TMonitorFromWindow)(HWND, DWORD);
-typedef BOOL (WINAPI *TGetMonitorInfo)(_HMONITOR, _MONITORINFO *);
-
-static TMonitorFromWindow   pMonitorFromWindow = NULL;
-static TGetMonitorInfo	    pGetMonitorInfo = NULL;
-static HANDLE		    user32_lib = NULL;
-/*
- * Return TRUE when running under Windows NT 3.x or Win32s, both of which have
- * less fancy GUI APIs.
- */
-    static int
-is_winnt_3(void)
-{
-    return ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion == 3)
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32s));
-}
-
 #ifdef FEAT_MENU
 /*
  * Figure out how high the menu bar is at the moment.
@@ -4564,45 +4468,20 @@
     }
     else
     {
-	if (is_winnt_3())	/* for NT 3.xx */
+	/*
+	 * In case 'lines' is set in _vimrc/_gvimrc window width doesn't
+	 * seem to have been set yet, so menu wraps in default window
+	 * width which is very narrow.  Instead just return height of a
+	 * single menu item.  Will still be wrong when the menu really
+	 * should wrap over more than one line.
+	 */
+	GetMenuItemRect(s_hwnd, s_menuBar, 0, &rc1);
+	if (gui.starting)
+	    menu_height = rc1.bottom - rc1.top + 1;
+	else
 	{
-	    if (gui.starting)
-		menu_height = GetSystemMetrics(SM_CYMENU);
-	    else
-	    {
-		RECT r1, r2;
-		int frameht = GetSystemMetrics(SM_CYFRAME);
-		int capht = GetSystemMetrics(SM_CYCAPTION);
-
-		/* get window rect of s_hwnd
-		 * get client rect of s_hwnd
-		 * get cap height
-		 * subtract from window rect, the sum of client height,
-		 * (if not maximized)frame thickness, and caption height.
-		 */
-		GetWindowRect(s_hwnd, &r1);
-		GetClientRect(s_hwnd, &r2);
-		menu_height = r1.bottom - r1.top - (r2.bottom - r2.top
-				 + 2 * frameht * (!IsZoomed(s_hwnd)) + capht);
-	    }
-	}
-	else			/* win95 and variants (NT 4.0, I guess) */
-	{
-	    /*
-	     * In case 'lines' is set in _vimrc/_gvimrc window width doesn't
-	     * seem to have been set yet, so menu wraps in default window
-	     * width which is very narrow.  Instead just return height of a
-	     * single menu item.  Will still be wrong when the menu really
-	     * should wrap over more than one line.
-	     */
-	    GetMenuItemRect(s_hwnd, s_menuBar, 0, &rc1);
-	    if (gui.starting)
-		menu_height = rc1.bottom - rc1.top + 1;
-	    else
-	    {
-		GetMenuItemRect(s_hwnd, s_menuBar, num - 1, &rc2);
-		menu_height = rc2.bottom - rc1.top + 1;
-	    }
+	    GetMenuItemRect(s_hwnd, s_menuBar, num - 1, &rc2);
+	    menu_height = rc2.bottom - rc1.top + 1;
 	}
     }
 
@@ -4636,42 +4515,11 @@
 #define VMSH_MOUSEWHEEL    "MSWHEEL_ROLLMSG"
 #define VMSH_SCROLL_LINES  "MSH_SCROLL_LINES_MSG"
 
-    HWND hdl_mswheel;
-    UINT msh_msgscrolllines;
-
-    msh_msgmousewheel = 0;
     mouse_scroll_lines = 3;	/* reasonable default */
 
-    if ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion >= 4)
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-		&& ((os_version.dwMajorVersion == 4
-			&& os_version.dwMinorVersion >= 10)
-		    || os_version.dwMajorVersion >= 5)))
-    {
-	/* if NT 4.0+ (or Win98) get scroll lines directly from system */
-	SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
-		&mouse_scroll_lines, 0);
-    }
-    else if (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion < 4))
-    {	/*
-	 * If Win95 or NT 3.51,
-	 * try to find the hidden point32 window.
-	 */
-	hdl_mswheel = FindWindow(VMOUSEZ_CLASSNAME, VMOUSEZ_TITLE);
-	if (hdl_mswheel)
-	{
-	    msh_msgscrolllines = RegisterWindowMessage(VMSH_SCROLL_LINES);
-	    if (msh_msgscrolllines)
-	    {
-		mouse_scroll_lines = (int)SendMessage(hdl_mswheel,
-			msh_msgscrolllines, 0, 0);
-		msh_msgmousewheel  = RegisterWindowMessage(VMSH_MOUSEWHEEL);
-	    }
-	}
-    }
+    /* if NT 4.0+ (or Win98) get scroll lines directly from system */
+    SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
+	    &mouse_scroll_lines, 0);
 }
 
 
@@ -5210,13 +5058,8 @@
 #endif
 
     default:
-	if (uMsg == msh_msgmousewheel && msh_msgmousewheel != 0)
-	{   /* handle MSH_MOUSEWHEEL messages for Intellimouse */
-	    _OnMouseWheel(hwnd, HIWORD(wParam));
-	    return 0L;
-	}
 #ifdef MSWIN_FIND_REPLACE
-	else if (uMsg == s_findrep_msg && s_findrep_msg != 0)
+	if (uMsg == s_findrep_msg && s_findrep_msg != 0)
 	{
 	    _OnFindRepl();
 	}
@@ -5376,42 +5219,6 @@
 	    }
     }
 #endif
-
-    /* get the OS version info */
-    os_version.dwOSVersionInfoSize = sizeof(os_version);
-    GetVersionEx(&os_version); /* this call works on Win32s, Win95 and WinNT */
-
-    /* try and load the user32.dll library and get the entry points for
-     * multi-monitor-support. */
-    if ((user32_lib = vimLoadLib("User32.dll")) != NULL)
-    {
-	pMonitorFromWindow = (TMonitorFromWindow)GetProcAddress(user32_lib,
-							 "MonitorFromWindow");
-
-	/* there are ...A and ...W version of GetMonitorInfo - looking at
-	 * winuser.h, they have exactly the same declaration. */
-	pGetMonitorInfo = (TGetMonitorInfo)GetProcAddress(user32_lib,
-							  "GetMonitorInfoA");
-    }
-
-#ifdef FEAT_MBYTE
-    /* If the OS is Windows NT, use wide functions;
-     * this enables common dialogs input unicode from IME. */
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
-    {
-	pDispatchMessage = DispatchMessageW;
-	pGetMessage = GetMessageW;
-	pIsDialogMessage = IsDialogMessageW;
-	pPeekMessage = PeekMessageW;
-    }
-    else
-    {
-	pDispatchMessage = DispatchMessageA;
-	pGetMessage = GetMessageA;
-	pIsDialogMessage = IsDialogMessageA;
-	pPeekMessage = PeekMessageA;
-    }
-#endif
 }
 
 /*
@@ -5475,12 +5282,7 @@
 		    atom =
 #endif
 		    RegisterClassW(&wndclassw)) == 0)
-	{
-	    if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return FAIL;
-
-	    /* Must be Windows 98, fall back to non-wide function. */
-	}
+	    return FAIL;
 	else
 	    wide_WindowProc = TRUE;
     }
@@ -5710,7 +5512,7 @@
     s_findrep_struct.lpstrReplaceWith[0] = NUL;
     s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE;
     s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE;
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
     s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w);
     s_findrep_struct_w.lpstrFindWhat =
 			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
@@ -5753,22 +5555,18 @@
     static void
 get_work_area(RECT *spi_rect)
 {
-    _HMONITOR	    mon;
-    _MONITORINFO    moninfo;
+    HMONITOR	    mon;
+    MONITORINFO	    moninfo;
 
-    /* use these functions only if available */
-    if (pMonitorFromWindow != NULL && pGetMonitorInfo != NULL)
+    /* work out which monitor the window is on, and get *it's* work area */
+    mon = MonitorFromWindow(s_hwnd, 1 /*MONITOR_DEFAULTTOPRIMARY*/);
+    if (mon != NULL)
     {
-	/* work out which monitor the window is on, and get *it's* work area */
-	mon = pMonitorFromWindow(s_hwnd, 1 /*MONITOR_DEFAULTTOPRIMARY*/);
-	if (mon != NULL)
+	moninfo.cbSize = sizeof(MONITORINFO);
+	if (GetMonitorInfo(mon, &moninfo))
 	{
-	    moninfo.cbSize = sizeof(_MONITORINFO);
-	    if (pGetMonitorInfo(mon, &moninfo))
-	    {
-		*spi_rect = moninfo.rcWork;
-		return;
-	    }
+	    *spi_rect = moninfo.rcWork;
+	    return;
 	}
     }
     /* this is the old method... */
@@ -6307,29 +6105,10 @@
 	CONST INT *padding)
 {
     int		ix;
-    static int	special = -1;
 
-    if (special == -1)
-    {
-	/* Check windows version: special treatment is needed if it is NT 5 or
-	 * Win98 or higher. */
-	if  ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && os_version.dwMajorVersion >= 5)
-		|| (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-		    && (os_version.dwMajorVersion > 4
-			|| (os_version.dwMajorVersion == 4
-			    && os_version.dwMinorVersion > 0))))
-	    special = 1;
-	else
-	    special = 0;
-    }
-
-    if (special)
-	for (ix = 0; ix < (int)len; ++ix)
-	    ExtTextOut(s_hdc, col + TEXT_X(ix), row, foptions,
-					    pcliprect, text + ix, 1, padding);
-    else
-	ExtTextOut(s_hdc, col, row, foptions, pcliprect, text, len, padding);
+    for (ix = 0; ix < (int)len; ++ix)
+	ExtTextOut(s_hdc, col + TEXT_X(ix), row, foptions,
+					pcliprect, text + ix, 1, padding);
 }
 #endif
 
@@ -6718,63 +6497,50 @@
 
     if (menu_is_menubar(menu->name))
     {
-	if (is_winnt_3())
-	{
-	    InsertMenu((parent == NULL) ? s_menuBar : parent->submenu_id,
-		    (UINT)pos, MF_POPUP | MF_STRING | MF_BYPOSITION,
-		    (long_u)menu->submenu_id, (LPCTSTR) menu->name);
-	}
-	else
-	{
 #ifdef FEAT_MBYTE
-	    WCHAR	*wn = NULL;
-	    int		n;
+	WCHAR	*wn = NULL;
 
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	{
+	    /* 'encoding' differs from active codepage: convert menu name
+	     * and use wide function */
+	    wn = enc_to_utf16(menu->name, NULL);
+	    if (wn != NULL)
 	    {
-		/* 'encoding' differs from active codepage: convert menu name
-		 * and use wide function */
-		wn = enc_to_utf16(menu->name, NULL);
-		if (wn != NULL)
-		{
-		    MENUITEMINFOW	infow;
+		MENUITEMINFOW	infow;
 
-		    infow.cbSize = sizeof(infow);
-		    infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
-							       | MIIM_SUBMENU;
-		    infow.dwItemData = (long_u)menu;
-		    infow.wID = menu->id;
-		    infow.fType = MFT_STRING;
-		    infow.dwTypeData = wn;
-		    infow.cch = (UINT)wcslen(wn);
-		    infow.hSubMenu = menu->submenu_id;
-		    n = InsertMenuItemW((parent == NULL)
-					    ? s_menuBar : parent->submenu_id,
-					    (UINT)pos, TRUE, &infow);
-		    vim_free(wn);
-		    if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-			/* Failed, try using non-wide function. */
-			wn = NULL;
-		}
+		infow.cbSize = sizeof(infow);
+		infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
+		    | MIIM_SUBMENU;
+		infow.dwItemData = (long_u)menu;
+		infow.wID = menu->id;
+		infow.fType = MFT_STRING;
+		infow.dwTypeData = wn;
+		infow.cch = (UINT)wcslen(wn);
+		infow.hSubMenu = menu->submenu_id;
+		InsertMenuItemW((parent == NULL)
+			? s_menuBar : parent->submenu_id,
+			(UINT)pos, TRUE, &infow);
+		vim_free(wn);
 	    }
+	}
 
-	    if (wn == NULL)
+	if (wn == NULL)
 #endif
-	    {
-		MENUITEMINFO	info;
+	{
+	    MENUITEMINFO	info;
 
-		info.cbSize = sizeof(info);
-		info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
-		info.dwItemData = (long_u)menu;
-		info.wID = menu->id;
-		info.fType = MFT_STRING;
-		info.dwTypeData = (LPTSTR)menu->name;
-		info.cch = (UINT)STRLEN(menu->name);
-		info.hSubMenu = menu->submenu_id;
-		InsertMenuItem((parent == NULL)
-					? s_menuBar : parent->submenu_id,
-					(UINT)pos, TRUE, &info);
-	    }
+	    info.cbSize = sizeof(info);
+	    info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
+	    info.dwItemData = (long_u)menu;
+	    info.wID = menu->id;
+	    info.fType = MFT_STRING;
+	    info.dwTypeData = (LPTSTR)menu->name;
+	    info.cch = (UINT)STRLEN(menu->name);
+	    info.hSubMenu = menu->submenu_id;
+	    InsertMenuItem((parent == NULL)
+		    ? s_menuBar : parent->submenu_id,
+		    (UINT)pos, TRUE, &info);
 	}
     }
 
@@ -6890,7 +6656,6 @@
     {
 #ifdef FEAT_MBYTE
 	WCHAR	*wn = NULL;
-	int	n;
 
 	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	{
@@ -6899,14 +6664,11 @@
 	    wn = enc_to_utf16(menu->name, NULL);
 	    if (wn != NULL)
 	    {
-		n = InsertMenuW(parent->submenu_id, (UINT)idx,
+		InsertMenuW(parent->submenu_id, (UINT)idx,
 			(menu_is_separator(menu->name)
 				 ? MF_SEPARATOR : MF_STRING) | MF_BYPOSITION,
 			(UINT)menu->id, wn);
 		vim_free(wn);
-		if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-		    /* Failed, try using non-wide function. */
-		    wn = NULL;
 	    }
 	}
 	if (wn == NULL)
@@ -7105,11 +6867,10 @@
 	/* If the edit box exists, copy the string. */
 	if (s_textfield != NULL)
 	{
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 	    /* If the OS is Windows NT, and 'encoding' differs from active
 	     * codepage: use wide function and convert text. */
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 	       WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
 	       char_u *p;
@@ -7866,38 +7627,31 @@
 
     s_usenewlook = FALSE;
 
-    /*
-     * For NT3.51 and Win32s, we stick with the old look
-     * because it matches everything else.
-     */
-    if (!is_winnt_3())
-    {
 #ifdef USE_SYSMENU_FONT
-	if (gui_w32_get_menu_font(&lfSysmenu) == OK)
-	    hfontTools = CreateFontIndirect(&lfSysmenu);
-	else
+    if (gui_w32_get_menu_font(&lfSysmenu) == OK)
+	hfontTools = CreateFontIndirect(&lfSysmenu);
+    else
 #endif
 	hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, VARIABLE_PITCH , DLG_FONT_NAME);
 
-	if (hfontTools)
-	{
-	    hdc = GetDC(s_hwnd);
-	    SelectObject(hdc, hfontTools);
-	    /*
-	     * GetTextMetrics() doesn't return the right value in
-	     * tmAveCharWidth, so we have to figure out the dialog base units
-	     * ourselves.
-	     */
-	    GetTextExtentPoint(hdc,
-		    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
-		    52, &size);
-	    ReleaseDC(s_hwnd, hdc);
+    if (hfontTools)
+    {
+	hdc = GetDC(s_hwnd);
+	SelectObject(hdc, hfontTools);
+	/*
+	 * GetTextMetrics() doesn't return the right value in
+	 * tmAveCharWidth, so we have to figure out the dialog base units
+	 * ourselves.
+	 */
+	GetTextExtentPoint(hdc,
+		"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+		52, &size);
+	ReleaseDC(s_hwnd, hdc);
 
-	    s_dlgfntwidth = (WORD)((size.cx / 26 + 1) / 2);
-	    s_dlgfntheight = (WORD)size.cy;
-	    s_usenewlook = TRUE;
-	}
+	s_dlgfntwidth = (WORD)((size.cx / 26 + 1) / 2);
+	s_dlgfntheight = (WORD)size.cy;
+	s_usenewlook = TRUE;
     }
 
     if (!s_usenewlook)
@@ -8044,10 +7798,6 @@
 	dlgwidth = textWidth;
     dlgwidth += 2 * TEAROFF_PADDING_X + TEAROFF_BUTTON_PAD_X;
 
-    /* W95 can't do thin dialogs, they look v. weird! */
-    if (mch_windows95() && dlgwidth < TEAROFF_MIN_WIDTH)
-	dlgwidth = TEAROFF_MIN_WIDTH;
-
     /* start to fill in the dlgtemplate information.  addressing by WORDs */
     if (s_usenewlook)
 	lStyle = DS_MODALFRAME | WS_CAPTION| WS_SYSMENU |DS_SETFONT| WS_VISIBLE;
@@ -8299,7 +8049,7 @@
     /*
      * Check user bitmaps first, unless builtin is specified.
      */
-    if (!is_winnt_3() && !menu->icon_builtin)
+    if (!menu->icon_builtin)
     {
 	char_u fname[MAXPATHL];
 	HANDLE hbitmap = NULL;
@@ -8556,12 +8306,6 @@
     signicon_t	sign, *psign;
     char_u	*ext;
 
-    if (is_winnt_3())
-    {
-	EMSG(_(e_signdata));
-	return NULL;
-    }
-
     sign.hImage = NULL;
     ext = signfile + STRLEN(signfile) - 4; /* get extension */
     if (ext > signfile)
diff --git a/src/if_cscope.c b/src/if_cscope.c
index cf308bc..086c829 100644
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -839,14 +839,10 @@
     HANDLE	stdin_rd, stdout_rd;
     HANDLE	stdout_wr, stdin_wr;
     BOOL	created;
-# ifdef __BORLANDC__
-#  define OPEN_OH_ARGTYPE long
+# if (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)
+#  define OPEN_OH_ARGTYPE intptr_t
 # else
-#  if (_MSC_VER >= 1300) || defined(__MINGW32__)
-#   define OPEN_OH_ARGTYPE intptr_t
-#  else
-#   define OPEN_OH_ARGTYPE long
-#  endif
+#  define OPEN_OH_ARGTYPE long
 # endif
 #endif
 
@@ -1427,11 +1423,8 @@
 #ifndef UNIX
     BY_HANDLE_FILE_INFORMATION bhfi;
 
-    /* On windows 9x GetFileInformationByHandle doesn't work, so skip it */
-    if (!mch_windows95())
+    switch (win32_fileinfo((char_u *)fname, &bhfi))
     {
-	switch (win32_fileinfo((char_u *)fname, &bhfi))
-	{
 	case FILEINFO_ENC_FAIL:		/* enc_to_utf16() failed */
 	case FILEINFO_READ_FAIL:	/* CreateFile() failed */
 	    if (p_csverbose)
@@ -1454,7 +1447,6 @@
 	    if (p_csverbose)
 		(void)EMSG(_("E626: cannot get cscope database information"));
 	    return -1;
-	}
     }
 #endif
 
@@ -1468,9 +1460,8 @@
 	    /* compare pathnames first */
 	    && ((fullpathcmp((char_u *)csinfo[j].fname,
 			(char_u *)fname, FALSE) & FPC_SAME)
-		/* if not Windows 9x, test index file attributes too */
-		|| (!mch_windows95()
-		    && csinfo[j].nVolume == bhfi.dwVolumeSerialNumber
+		/* test index file attributes too */
+		|| (csinfo[j].nVolume == bhfi.dwVolumeSerialNumber
 		    && csinfo[j].nIndexHigh == bhfi.nFileIndexHigh
 		    && csinfo[j].nIndexLow == bhfi.nFileIndexLow))
 #endif
diff --git a/src/misc1.c b/src/misc1.c
index 79014cf..6bf7d75 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -9450,10 +9450,7 @@
 	 * screen (if there are two screens).
 	 */
 	settmode(TMODE_COOK);
-#ifdef WIN3264
-	if (can_end_termcap_mode(FALSE) == TRUE)
-#endif
-	    stoptermcap();
+	stoptermcap();
 	out_flush();
     }
 }
diff --git a/src/misc2.c b/src/misc2.c
index 4d914d2..030cff3 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1420,7 +1420,7 @@
     length = (unsigned)STRLEN(string) + 3;  /* two quotes and a trailing NUL */
     for (p = string; *p != NUL; mb_ptr_adv(p))
     {
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	if (!p_ssl)
 	{
 	    if (*p == '"')
@@ -1451,7 +1451,7 @@
 	d = escaped_string;
 
 	/* add opening quote */
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	if (!p_ssl)
 	    *d++ = '"';
 	else
@@ -1460,7 +1460,7 @@
 
 	for (p = string; *p != NUL; )
 	{
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	    if (!p_ssl)
 	    {
 		if (*p == '"')
@@ -1503,7 +1503,7 @@
 	}
 
 	/* add terminating quote and finish with a NUL */
-# if defined(WIN32) || defined(DOS)
+# ifdef WIN32
 	if (!p_ssl)
 	    *d++ = '"';
 	else
diff --git a/src/option.c b/src/option.c
index 2d5f3b8..ecac175 100644
--- a/src/option.c
+++ b/src/option.c
@@ -22,7 +22,7 @@
  * - If it's a list of flags, add some code in do_set(), search for WW_ALL.
  * - When adding an option with expansion (P_EXPAND), but with a different
  *   default for Vi and Vim (no P_VI_DEF), add some code at VIMEXP.
- * - Add documentation!  One line in doc/help.txt, full description in
+ * - Add documentation!  One line in doc/quickref.txt, full description in
  *   options.txt, and any other related places.
  * - Add an entry in runtime/optwin.vim.
  * When making changes:
@@ -9944,13 +9944,7 @@
     if (gui.starting)
 	clear_xterm_clip();
 #endif
-#ifdef WIN3264
-    /*
-     * Check if this is allowed now.
-     */
-    if (can_end_termcap_mode(FALSE) == TRUE)
-#endif
-	stoptermcap();			/* stop termcap mode */
+    stoptermcap();			/* stop termcap mode */
 
     free_termoptions();
 }
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 586f874..625fdcc 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -38,11 +38,7 @@
 
 # if defined(FEAT_PRINTER) && !defined(FEAT_POSTSCRIPT)
 #  include <dlgs.h>
-#  ifdef WIN3264
-#   include <winspool.h>
-#  else
-#   include <print.h>
-#  endif
+#  include <winspool.h>
 #  include <commdlg.h>
 #endif
 
@@ -130,10 +126,6 @@
 FILE* fdDump = NULL;
 #endif
 
-#ifdef WIN3264
-extern DWORD g_PlatformId;
-#endif
-
 #ifndef FEAT_GUI_MSWIN
 extern char g_szOrigTitle[];
 #endif
@@ -248,20 +240,13 @@
 {
     int		i;
 
-#ifdef WIN3264
     PlatformId();
-#endif
 
     /* Init the tables for toupper() and tolower() */
     for (i = 0; i < 256; ++i)
 	toupper_tab[i] = tolower_tab[i] = i;
-#ifdef WIN3264
     CharUpperBuff((LPSTR)toupper_tab, 256);
     CharLowerBuff((LPSTR)tolower_tab, 256);
-#else
-    AnsiUpperBuff((LPSTR)toupper_tab, 256);
-    AnsiLowerBuff((LPSTR)tolower_tab, 256);
-#endif
 }
 
 
@@ -299,14 +284,12 @@
 	{
 	    /* Convert the title from 'encoding' to the active codepage. */
 	    WCHAR	*wp = enc_to_utf16(title, NULL);
-	    int	n;
 
 	    if (wp != NULL)
 	    {
-		n = SetConsoleTitleW(wp);
+		SetConsoleTitleW(wp);
 		vim_free(wp);
-		if (n != 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		    return;
+		return;
 	    }
 	}
 #  endif
@@ -379,12 +362,7 @@
 #endif
     {
 #ifdef FEAT_MBYTE
-	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage
-# ifdef __BORLANDC__
-		/* Wide functions of Borland C 5.5 do not work on Windows 98. */
-		&& g_PlatformId == VER_PLATFORM_WIN32_NT
-# endif
-	   )
+	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	{
 	    WCHAR	*wname;
 	    WCHAR	wbuf[MAX_PATH];
@@ -641,12 +619,7 @@
 	}
     }
 #ifdef FEAT_MBYTE
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage
-# ifdef __BORLANDC__
-	    /* Wide functions of Borland C 5.5 do not work on Windows 98. */
-	    && g_PlatformId == VER_PLATFORM_WIN32_NT
-# endif
-       )
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 	WCHAR	*wp = enc_to_utf16(buf, NULL);
 	int	n;
@@ -655,11 +628,7 @@
 	{
 	    n = wstat_symlink_aware(wp, stp);
 	    vim_free(wp);
-	    if (n >= 0 || g_PlatformId == VER_PLATFORM_WIN32_NT)
-		return n;
-	    /* Retry with non-wide function (for Windows 98). Can't use
-	     * GetLastError() here and it's unclear what errno gets set to if
-	     * the _wstat() fails for missing wide functions. */
+	    return n;
 	}
     }
 #endif
@@ -823,9 +792,7 @@
 	{
 	    n = _wchdir(p);
 	    vim_free(p);
-	    if (n == 0 || g_PlatformId == VER_PLATFORM_WIN32_NT)
-		return n;
-	    /* Retry with non-wide function (for Windows 98). */
+	    return n;
 	}
     }
 #endif
@@ -834,27 +801,6 @@
 }
 
 
-/*
- * Switching off termcap mode is only allowed when Columns is 80, otherwise a
- * crash may result.  It's always allowed on NT or when running the GUI.
- */
-/*ARGSUSED*/
-    int
-can_end_termcap_mode(
-    int give_msg)
-{
-#ifdef FEAT_GUI_MSWIN
-    return TRUE;	/* GUI starts a new console anyway */
-#else
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT || Columns == 80)
-	return TRUE;
-    if (give_msg)
-	msg((char_u *)
-		_("'columns' is not 80, cannot execute external commands"));
-    return FALSE;
-#endif
-}
-
 #ifdef FEAT_GUI_MSWIN
 /*
  * return non-zero if a character is available
@@ -887,17 +833,10 @@
  * and returns an allocated string.
  * Return OK if it worked, FAIL if not.
  */
-# ifdef WIN3264
 typedef LPTSTR (*MYSTRPROCSTR)(LPTSTR);
 typedef LPTSTR (*MYINTPROCSTR)(int);
 typedef int (*MYSTRPROCINT)(LPTSTR);
 typedef int (*MYINTPROCINT)(int);
-# else
-typedef LPSTR (*MYSTRPROCSTR)(LPSTR);
-typedef LPSTR (*MYINTPROCSTR)(int);
-typedef int (*MYSTRPROCINT)(LPSTR);
-typedef int (*MYINTPROCINT)(int);
-# endif
 
 /*
  * Check if a pointer points to a valid NUL terminated string.
@@ -1093,7 +1032,7 @@
 #endif //_DEBUG
 
 #if !defined(FEAT_GUI) || defined(PROTO)
-# if defined(FEAT_TITLE) && defined(WIN3264)
+# ifdef FEAT_TITLE
 extern HWND g_hWnd;	/* This is in os_win32.c. */
 # endif
 
@@ -1114,7 +1053,7 @@
     if (s_hwnd != 0)
 	return;
 
-# if defined(FEAT_TITLE) && defined(WIN3264)
+# ifdef FEAT_TITLE
     /* Window handle may have been found by init code (Windows NT only) */
     if (g_hWnd != 0)
     {
@@ -1539,7 +1478,6 @@
 	    )
     {
 	prt_dlg.Flags |= PD_RETURNDEFAULT;
-#ifdef WIN3264
 	/*
 	 * MSDN suggests setting the first parameter to WINSPOOL for
 	 * NT, but NULL appears to work just as well.
@@ -1547,7 +1485,6 @@
 	if (*p_pdev != NUL)
 	    prt_dlg.hDC = CreateDC(NULL, (LPCSTR)p_pdev, NULL, NULL);
 	else
-#endif
 	{
 	    prt_dlg.Flags |= PD_RETURNDEFAULT;
 	    if (PrintDlg(&prt_dlg) == 0)
@@ -1593,10 +1530,8 @@
     mem = (DEVMODE *)GlobalLock(prt_dlg.hDevMode);
     if (mem != NULL)
     {
-#ifdef WIN3264
 	if (mem->dmCopies != 1)
 	    stored_nCopies = mem->dmCopies;
-#endif
 	if ((mem->dmFields & DM_DUPLEX) && (mem->dmDuplex & ~DMDUP_SIMPLEX))
 	    psettings->duplex = TRUE;
 	if ((mem->dmFields & DM_COLOR) && (mem->dmColor & DMCOLOR_COLOR))
@@ -1953,7 +1888,7 @@
 		goto shortcut_end;
 	    }
 	}
-	/* Retry with non-wide function (for Windows 98). */
+	goto shortcut_end;
     }
 # endif
     // create a link manager object and request its interface
@@ -2681,7 +2616,6 @@
     {"OEM",		OEM_CHARSET},
     {"SHIFTJIS",	SHIFTJIS_CHARSET},
     {"SYMBOL",		SYMBOL_CHARSET},
-#ifdef WIN3264
     {"ARABIC",		ARABIC_CHARSET},
     {"BALTIC",		BALTIC_CHARSET},
     {"EASTEUROPE",	EASTEUROPE_CHARSET},
@@ -2693,10 +2627,8 @@
     {"RUSSIAN",		RUSSIAN_CHARSET},
     {"THAI",		THAI_CHARSET},
     {"TURKISH",		TURKISH_CHARSET},
-# if (!defined(_MSC_VER) || (_MSC_VER > 1010)) \
-	&& (!defined(__BORLANDC__) || (__BORLANDC__ > 0x0500))
+#ifdef VIETNAMESE_CHARSET
     {"VIETNAMESE",	VIETNAMESE_CHARSET},
-# endif
 #endif
     {NULL,		0}
 };
diff --git a/src/os_win32.c b/src/os_win32.c
index 5eacce6..9ff2f7e 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -141,43 +141,11 @@
 # define __stdcall /* empty */
 #endif
 
-#ifndef FEAT_GUI_W32
-/* Undocumented API in kernel32.dll needed to work around dead key bug in
- * console-mode applications in NT 4.0.  If you switch keyboard layouts
- * in a console app to a layout that includes dead keys and then hit a
- * dead key, a call to ToAscii will trash the stack.  My thanks to Ian James
- * and Michael Dietrich for helping me figure out this workaround.
- */
-
-/* WINAPI BOOL WINAPI GetConsoleKeyboardLayoutNameA(LPSTR); */
-#ifndef WINAPI
-# define WINAPI __stdcall
-#endif
-#if defined(__BORLANDC__)
-typedef BOOL (__stdcall *PFNGCKLN)(LPSTR);
-#else
-typedef BOOL (WINAPI *PFNGCKLN)(LPSTR);
-#endif
-static PFNGCKLN    s_pfnGetConsoleKeyboardLayoutName = NULL;
-#endif
-
 #if defined(__BORLANDC__)
 /* Strangely Borland uses a non-standard name. */
 # define wcsicmp(a, b) wcscmpi((a), (b))
 #endif
 
-#ifndef PROTO
-
-/* Enable common dialogs input unicode from IME if possible. */
-#ifdef FEAT_MBYTE
-LRESULT (WINAPI *pDispatchMessage)(CONST MSG *) = DispatchMessage;
-BOOL (WINAPI *pGetMessage)(LPMSG, HWND, UINT, UINT) = GetMessage;
-BOOL (WINAPI *pIsDialogMessage)(HWND, LPMSG) = IsDialogMessage;
-BOOL (WINAPI *pPeekMessage)(LPMSG, HWND, UINT, UINT, UINT) = PeekMessage;
-#endif
-
-#endif /* PROTO */
-
 #ifndef FEAT_GUI_W32
 /* Win32 Console handles for input and output */
 static HANDLE g_hConIn  = INVALID_HANDLE_VALUE;
@@ -430,7 +398,6 @@
 vimLoadLib(char *name)
 {
     HINSTANCE	dll = NULL;
-    char	old_dir[MAXPATHL];
 
     /* NOTE: Do not use mch_dirname() and mch_chdir() here, they may call
      * vimLoadLib() recursively, which causes a stack overflow. */
@@ -438,7 +405,6 @@
 	get_exe_name();
     if (exe_path != NULL)
     {
-#ifdef FEAT_MBYTE
 	WCHAR old_dirw[MAXPATHL];
 
 	if (GetCurrentDirectoryW(MAXPATHL, old_dirw) != 0)
@@ -451,18 +417,6 @@
 	    SetCurrentDirectoryW(old_dirw);
 	    return dll;
 	}
-	/* Retry with non-wide function (for Windows 98). */
-	if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-#endif
-	    if (GetCurrentDirectory(MAXPATHL, old_dir) != 0)
-	    {
-		/* Change directory to where the executable is, both to make
-		 * sure we find a .dll there and to avoid looking for a .dll
-		 * in the current directory. */
-		SetCurrentDirectory((LPCSTR)exe_path);
-		dll = LoadLibrary(name);
-		SetCurrentDirectory(old_dir);
-	    }
     }
     return dll;
 }
@@ -621,38 +575,8 @@
 # ifndef PROTECTED_DACL_SECURITY_INFORMATION
 #  define PROTECTED_DACL_SECURITY_INFORMATION	0x80000000L
 # endif
-
-/*
- * These are needed to dynamically load the ADVAPI DLL, which is not
- * implemented under Windows 95 (and causes VIM to crash)
- */
-typedef DWORD (WINAPI *PSNSECINFO) (LPSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID, PSID, PACL, PACL);
-typedef DWORD (WINAPI *PGNSECINFO) (LPSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *,
-	PSECURITY_DESCRIPTOR *);
-# ifdef FEAT_MBYTE
-typedef DWORD (WINAPI *PSNSECINFOW) (LPWSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID, PSID, PACL, PACL);
-typedef DWORD (WINAPI *PGNSECINFOW) (LPWSTR, SE_OBJECT_TYPE,
-	SECURITY_INFORMATION, PSID *, PSID *, PACL *, PACL *,
-	PSECURITY_DESCRIPTOR *);
-# endif
-
-static HANDLE advapi_lib = NULL;	/* Handle for ADVAPI library */
-static PSNSECINFO pSetNamedSecurityInfo;
-static PGNSECINFO pGetNamedSecurityInfo;
-# ifdef FEAT_MBYTE
-static PSNSECINFOW pSetNamedSecurityInfoW;
-static PGNSECINFOW pGetNamedSecurityInfoW;
-# endif
 #endif
 
-typedef BOOL (WINAPI *PSETHANDLEINFORMATION)(HANDLE, DWORD, DWORD);
-
-static BOOL allowPiping = FALSE;
-static PSETHANDLEINFORMATION pSetHandleInformation;
-
 #ifdef HAVE_ACL
 /*
  * Enables or disables the specified privilege.
@@ -712,93 +636,13 @@
 	    win8_or_later = TRUE;
 
 #ifdef HAVE_ACL
-	/*
-	 * Load the ADVAPI runtime if we are on anything
-	 * other than Windows 95
-	 */
-	if (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	{
-	    /*
-	     * do this load.  Problems: Doesn't unload at end of run (this is
-	     * theoretically okay, since Windows should unload it when VIM
-	     * terminates).  Should we be using the 'mch_libcall' routines?
-	     * Seems like a lot of overhead to load/unload ADVAPI32.DLL each
-	     * time we verify security...
-	     */
-	    advapi_lib = vimLoadLib("ADVAPI32.DLL");
-	    if (advapi_lib != NULL)
-	    {
-		pSetNamedSecurityInfo = (PSNSECINFO)GetProcAddress(advapi_lib,
-						      "SetNamedSecurityInfoA");
-		pGetNamedSecurityInfo = (PGNSECINFO)GetProcAddress(advapi_lib,
-						      "GetNamedSecurityInfoA");
-# ifdef FEAT_MBYTE
-		pSetNamedSecurityInfoW = (PSNSECINFOW)GetProcAddress(advapi_lib,
-						      "SetNamedSecurityInfoW");
-		pGetNamedSecurityInfoW = (PGNSECINFOW)GetProcAddress(advapi_lib,
-						      "GetNamedSecurityInfoW");
-# endif
-		if (pSetNamedSecurityInfo == NULL
-			|| pGetNamedSecurityInfo == NULL
-# ifdef FEAT_MBYTE
-			|| pSetNamedSecurityInfoW == NULL
-			|| pGetNamedSecurityInfoW == NULL
-# endif
-			)
-		{
-		    /* If we can't get the function addresses, set advapi_lib
-		     * to NULL so that we don't use them. */
-		    FreeLibrary(advapi_lib);
-		    advapi_lib = NULL;
-		}
-		/* Enable privilege for getting or setting SACLs. */
-		win32_enable_privilege(SE_SECURITY_NAME, TRUE);
-	    }
-	}
+	/* Enable privilege for getting or setting SACLs. */
+	win32_enable_privilege(SE_SECURITY_NAME, TRUE);
 #endif
-	/*
-	 * If we are on windows NT, try to load the pipe functions, only
-	 * available from Win2K.
-	 */
-	if (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	{
-	    HANDLE kernel32 = GetModuleHandle("kernel32");
-	    pSetHandleInformation = (PSETHANDLEINFORMATION)GetProcAddress(
-					    kernel32, "SetHandleInformation");
-
-	    allowPiping = pSetHandleInformation != NULL;
-	}
 	done = TRUE;
     }
 }
 
-/*
- * Return TRUE when running on Windows 95 (or 98 or ME).
- * Only to be used after mch_init().
- */
-    int
-mch_windows95(void)
-{
-    return g_PlatformId == VER_PLATFORM_WIN32_WINDOWS;
-}
-
-#ifdef FEAT_GUI_W32
-/*
- * Used to work around the "can't do synchronous spawn"
- * problem on Win32s, without resorting to Universal Thunk.
- */
-static int old_num_windows;
-static int num_windows;
-
-/*ARGSUSED*/
-    static BOOL CALLBACK
-win32ssynch_cb(HWND hwnd, LPARAM lparam)
-{
-    num_windows++;
-    return TRUE;
-}
-#endif
-
 #ifndef FEAT_GUI_W32
 
 #define SHIFT  (SHIFT_PRESSED)
@@ -926,15 +770,6 @@
 
     vim_memset(abKeystate, 0, sizeof (abKeystate));
 
-    // Should only be non-NULL on NT 4.0
-    if (s_pfnGetConsoleKeyboardLayoutName != NULL)
-    {
-	CHAR szKLID[KL_NAMELENGTH];
-
-	if ((*s_pfnGetConsoleKeyboardLayoutName)(szKLID))
-	    (void)LoadKeyboardLayout(szKLID, KLF_ACTIVATE);
-    }
-
     /* Clear any pending dead keys */
     ToUnicode(VK_SPACE, MapVirtualKey(VK_SPACE, 0), abKeystate, awAnsiCode, 2, 0);
 
@@ -1977,17 +1812,13 @@
 	    n = (long)SearchPathW(wnewpath, p, NULL, _MAX_PATH, fnamew, &dumw);
 	    vim_free(wnewpath);
 	    vim_free(p);
-	    if (n > 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    {
-		if (n == 0)
-		    return FALSE;
-		if (GetFileAttributesW(fnamew) & FILE_ATTRIBUTE_DIRECTORY)
-		    return FALSE;
-		if (path != NULL)
-		    *path = utf16_to_enc(fnamew, NULL);
-		return TRUE;
-	    }
-	    /* Retry with non-wide function (for Windows 98). */
+	    if (n == 0)
+		return FALSE;
+	    if (GetFileAttributesW(fnamew) & FILE_ATTRIBUTE_DIRECTORY)
+		return FALSE;
+	    if (path != NULL)
+		*path = utf16_to_enc(fnamew, NULL);
+	    return TRUE;
 	}
     }
 #endif
@@ -2462,8 +2293,6 @@
     static void
 SaveConsoleTitleAndIcon(void)
 {
-    GETCONSOLEWINDOWPROC GetConsoleWindowProc;
-
     /* Save the original title. */
     if (!GetConsoleTitle(g_szOrigTitle, sizeof(g_szOrigTitle)))
 	return;
@@ -2475,12 +2304,7 @@
      * 2000.  On older operating systems, we can't change the window icon
      * anyway.
      */
-    if ((GetConsoleWindowProc = (GETCONSOLEWINDOWPROC)
-	    GetProcAddress(GetModuleHandle("KERNEL32.DLL"),
-		    "GetConsoleWindow")) != NULL)
-    {
-	g_hWnd = (*GetConsoleWindowProc)();
-    }
+    g_hWnd = GetConsoleWindow();
     if (g_hWnd == NULL)
 	return;
 
@@ -2589,11 +2413,6 @@
 #ifdef FEAT_CLIPBOARD
     win_clip_init();
 #endif
-
-    /* This will be NULL on anything but NT 4.0 */
-    s_pfnGetConsoleKeyboardLayoutName =
-	(PFNGCKLN) GetProcAddress(GetModuleHandle("kernel32.dll"),
-				  "GetConsoleKeyboardLayoutNameA");
 }
 
 /*
@@ -2775,9 +2594,6 @@
 	    *porig = c;
 	    ptrue = ptruePrev + wcslen(ptruePrev);
 	}
-	else if (hFind == INVALID_HANDLE_VALUE
-		&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	    return FAIL;
     }
 
     wcscpy(name, szTrueName);
@@ -2836,7 +2652,7 @@
 		}
 	    }
 	}
-	/* Retry with non-wide function (for Windows 98). */
+	return;
     }
 #endif
 
@@ -2966,9 +2782,6 @@
 		return OK;
 	    }
 	}
-	else if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return FAIL;
-	/* Retry with non-wide function (for Windows 98). */
     }
 #endif
     if (GetUserName(szUserName, &cch))
@@ -3008,9 +2821,6 @@
 		return;
 	    }
 	}
-	else if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return;
-	/* Retry with non-wide function (for Windows 98). */
     }
 #endif
     if (!GetComputerName((LPSTR)s, &cch))
@@ -3059,9 +2869,7 @@
 		return OK;
 	    }
 	}
-	else if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return FAIL;
-	/* Retry with non-wide function (for Windows 98). */
+	return FAIL;
     }
 #endif
     return (GetCurrentDirectory(len, (LPSTR)buf) != 0 ? OK : FAIL);
@@ -3101,9 +2909,8 @@
 	{
 	    n = _wchmod(p, perm);
 	    vim_free(p);
-	    if (n == -1 && g_PlatformId == VER_PLATFORM_WIN32_NT)
+	    if (n == -1)
 		return FAIL;
-	    /* Retry with non-wide function (for Windows 98). */
 	}
     }
     if (n == -1)
@@ -3251,18 +3058,7 @@
     {
 	hFind = FindFirstFileW(wn, &findDataW);
 	vim_free(wn);
-	if (hFind == INVALID_HANDLE_VALUE
-		&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    hFind = FindFirstFile((LPCSTR)name, &findDataA);
-	    if (hFind != INVALID_HANDLE_VALUE)
-	    {
-		fileFlags = findDataA.dwFileAttributes;
-		reparseTag = findDataA.dwReserved0;
-	    }
-	}
-	else
+	if (hFind != INVALID_HANDLE_VALUE)
 	{
 	    fileFlags = findDataW.dwFileAttributes;
 	    reparseTag = findDataW.dwReserved0;
@@ -3321,7 +3117,7 @@
     {
 	wn = enc_to_utf16(fname, NULL);
 	if (wn == NULL)
-	    res = FILEINFO_ENC_FAIL;
+	    return FILEINFO_ENC_FAIL;
     }
     if (wn != NULL)
     {
@@ -3332,15 +3128,9 @@
 		    OPEN_EXISTING,	/* creation disposition */
 		    FILE_FLAG_BACKUP_SEMANTICS,	/* file attributes */
 		    NULL);		/* handle to template file */
-	if (hFile == INVALID_HANDLE_VALUE
-			      && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    vim_free(wn);
-	    wn = NULL;
-	}
+	vim_free(wn);
     }
-    if (wn == NULL)
+    else
 #endif
 	hFile = CreateFile((LPCSTR)fname,    /* file name */
 		    GENERIC_READ,	    /* access mode */
@@ -3359,9 +3149,6 @@
 	CloseHandle(hFile);
     }
 
-#ifdef FEAT_MBYTE
-    vim_free(wn);
-#endif
     return res;
 }
 
@@ -3383,19 +3170,12 @@
     if (p != NULL)
     {
 	attr = GetFileAttributesW(p);
-	if (attr < 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    vim_free(p);
-	    p = NULL;
-	}
+	vim_free(p);
     }
-    if (p == NULL)
+    else
 #endif
 	attr = GetFileAttributes((char *)name);
-#ifdef FEAT_MBYTE
-    vim_free(p);
-#endif
+
     return attr;
 }
 
@@ -3418,20 +3198,12 @@
     if (p != NULL)
     {
 	res = SetFileAttributesW(p, attrs);
-	if (res == FALSE
-	    && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	{
-	    /* Retry with non-wide function (for Windows 98). */
-	    vim_free(p);
-	    p = NULL;
-	}
+	vim_free(p);
     }
-    if (p == NULL)
+    else
 #endif
 	res = SetFileAttributes((char *)name, attrs);
-#ifdef FEAT_MBYTE
-    vim_free(p);
-#endif
+
     return res ? 0 : -1;
 }
 
@@ -3539,27 +3311,20 @@
 
 #ifdef FEAT_MBYTE
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-    {
 	wn = enc_to_utf16(name, NULL);
-	if (wn != NULL)
-	{
-	    hFile = CreateFileW(wn,	/* file name */
-			GENERIC_WRITE,	/* access mode */
-			0,		/* share mode */
-			NULL,		/* security descriptor */
-			OPEN_EXISTING,	/* creation disposition */
-			0,		/* file attributes */
-			NULL);		/* handle to template file */
-	    if (hFile == INVALID_HANDLE_VALUE
-			      && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	    {
-		/* Retry with non-wide function (for Windows 98). */
-		vim_free(wn);
-		wn = NULL;
-	    }
-	}
+
+    if (wn != NULL)
+    {
+	hFile = CreateFileW(wn,		    /* file name */
+		    GENERIC_WRITE,	    /* access mode */
+		    0,			    /* share mode */
+		    NULL,		    /* security descriptor */
+		    OPEN_EXISTING,	    /* creation disposition */
+		    0,			    /* file attributes */
+		    NULL);		    /* handle to template file */
+	vim_free(wn);
     }
-    if (wn == NULL)
+    else
 #endif
 	hFile = CreateFile((LPCSTR)name,    /* file name */
 		    GENERIC_WRITE,	    /* access mode */
@@ -3569,9 +3334,6 @@
 		    0,			    /* file attributes */
 		    NULL);		    /* handle to template file */
 
-#ifdef FEAT_MBYTE
-    vim_free(wn);
-#endif
     if (hFile == INVALID_HANDLE_VALUE)
 	return NODE_NORMAL;
 
@@ -3608,88 +3370,84 @@
     struct my_acl   *p = NULL;
     DWORD   err;
 
-    /* This only works on Windows NT and 2000. */
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT && advapi_lib != NULL)
+    p = (struct my_acl *)alloc_clear((unsigned)sizeof(struct my_acl));
+    if (p != NULL)
     {
-	p = (struct my_acl *)alloc_clear((unsigned)sizeof(struct my_acl));
-	if (p != NULL)
-	{
 # ifdef FEAT_MBYTE
-	    WCHAR	*wn = NULL;
+	WCHAR	*wn = NULL;
 
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
-		wn = enc_to_utf16(fname, NULL);
-	    if (wn != NULL)
+	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    wn = enc_to_utf16(fname, NULL);
+	if (wn != NULL)
+	{
+	    /* Try to retrieve the entire security descriptor. */
+	    err = GetNamedSecurityInfoW(
+		    wn,			// Abstract filename
+		    SE_FILE_OBJECT,	// File Object
+		    OWNER_SECURITY_INFORMATION |
+		    GROUP_SECURITY_INFORMATION |
+		    DACL_SECURITY_INFORMATION |
+		    SACL_SECURITY_INFORMATION,
+		    &p->pSidOwner,	// Ownership information.
+		    &p->pSidGroup,	// Group membership.
+		    &p->pDacl,		// Discretionary information.
+		    &p->pSacl,		// For auditing purposes.
+		    &p->pSecurityDescriptor);
+	    if (err == ERROR_ACCESS_DENIED ||
+		    err == ERROR_PRIVILEGE_NOT_HELD)
 	    {
-		/* Try to retrieve the entire security descriptor. */
-		err = pGetNamedSecurityInfoW(
-			    wn,			// Abstract filename
-			    SE_FILE_OBJECT,	// File Object
-			    OWNER_SECURITY_INFORMATION |
-			    GROUP_SECURITY_INFORMATION |
-			    DACL_SECURITY_INFORMATION |
-			    SACL_SECURITY_INFORMATION,
-			    &p->pSidOwner,	// Ownership information.
-			    &p->pSidGroup,	// Group membership.
-			    &p->pDacl,		// Discretionary information.
-			    &p->pSacl,		// For auditing purposes.
-			    &p->pSecurityDescriptor);
-		if (err == ERROR_ACCESS_DENIED ||
-			err == ERROR_PRIVILEGE_NOT_HELD)
-		{
-		    /* Retrieve only DACL. */
-		    (void)pGetNamedSecurityInfoW(
-			    wn,
-			    SE_FILE_OBJECT,
-			    DACL_SECURITY_INFORMATION,
-			    NULL,
-			    NULL,
-			    &p->pDacl,
-			    NULL,
-			    &p->pSecurityDescriptor);
-		}
-		if (p->pSecurityDescriptor == NULL)
-		{
-		    mch_free_acl((vim_acl_T)p);
-		    p = NULL;
-		}
-		vim_free(wn);
+		/* Retrieve only DACL. */
+		(void)GetNamedSecurityInfoW(
+			wn,
+			SE_FILE_OBJECT,
+			DACL_SECURITY_INFORMATION,
+			NULL,
+			NULL,
+			&p->pDacl,
+			NULL,
+			&p->pSecurityDescriptor);
 	    }
-	    else
-# endif
+	    if (p->pSecurityDescriptor == NULL)
 	    {
-		/* Try to retrieve the entire security descriptor. */
-		err = pGetNamedSecurityInfo(
-			    (LPSTR)fname,	// Abstract filename
-			    SE_FILE_OBJECT,	// File Object
-			    OWNER_SECURITY_INFORMATION |
-			    GROUP_SECURITY_INFORMATION |
-			    DACL_SECURITY_INFORMATION |
-			    SACL_SECURITY_INFORMATION,
-			    &p->pSidOwner,	// Ownership information.
-			    &p->pSidGroup,	// Group membership.
-			    &p->pDacl,		// Discretionary information.
-			    &p->pSacl,		// For auditing purposes.
-			    &p->pSecurityDescriptor);
-		if (err == ERROR_ACCESS_DENIED ||
-			err == ERROR_PRIVILEGE_NOT_HELD)
-		{
-		    /* Retrieve only DACL. */
-		    (void)pGetNamedSecurityInfo(
-			    (LPSTR)fname,
-			    SE_FILE_OBJECT,
-			    DACL_SECURITY_INFORMATION,
-			    NULL,
-			    NULL,
-			    &p->pDacl,
-			    NULL,
-			    &p->pSecurityDescriptor);
-		}
-		if (p->pSecurityDescriptor == NULL)
-		{
-		    mch_free_acl((vim_acl_T)p);
-		    p = NULL;
-		}
+		mch_free_acl((vim_acl_T)p);
+		p = NULL;
+	    }
+	    vim_free(wn);
+	}
+	else
+# endif
+	{
+	    /* Try to retrieve the entire security descriptor. */
+	    err = GetNamedSecurityInfo(
+		    (LPSTR)fname,	// Abstract filename
+		    SE_FILE_OBJECT,	// File Object
+		    OWNER_SECURITY_INFORMATION |
+		    GROUP_SECURITY_INFORMATION |
+		    DACL_SECURITY_INFORMATION |
+		    SACL_SECURITY_INFORMATION,
+		    &p->pSidOwner,	// Ownership information.
+		    &p->pSidGroup,	// Group membership.
+		    &p->pDacl,		// Discretionary information.
+		    &p->pSacl,		// For auditing purposes.
+		    &p->pSecurityDescriptor);
+	    if (err == ERROR_ACCESS_DENIED ||
+		    err == ERROR_PRIVILEGE_NOT_HELD)
+	    {
+		/* Retrieve only DACL. */
+		(void)GetNamedSecurityInfo(
+			(LPSTR)fname,
+			SE_FILE_OBJECT,
+			DACL_SECURITY_INFORMATION,
+			NULL,
+			NULL,
+			&p->pDacl,
+			NULL,
+			&p->pSecurityDescriptor);
+	    }
+	    if (p->pSecurityDescriptor == NULL)
+	    {
+		mch_free_acl((vim_acl_T)p);
+		p = NULL;
 	    }
 	}
     }
@@ -3733,7 +3491,7 @@
     struct my_acl   *p = (struct my_acl *)acl;
     SECURITY_INFORMATION    sec_info = 0;
 
-    if (p != NULL && advapi_lib != NULL)
+    if (p != NULL)
     {
 # ifdef FEAT_MBYTE
 	WCHAR	*wn = NULL;
@@ -3761,7 +3519,7 @@
 	    wn = enc_to_utf16(fname, NULL);
 	if (wn != NULL)
 	{
-	    (void)pSetNamedSecurityInfoW(
+	    (void)SetNamedSecurityInfoW(
 			wn,			// Abstract filename
 			SE_FILE_OBJECT,		// File Object
 			sec_info,
@@ -3775,7 +3533,7 @@
 	else
 # endif
 	{
-	    (void)pSetNamedSecurityInfo(
+	    (void)SetNamedSecurityInfo(
 			(LPSTR)fname,		// Abstract filename
 			SE_FILE_OBJECT,		// File Object
 			sec_info,
@@ -4076,7 +3834,7 @@
     STARTUPINFO		*si,
     PROCESS_INFORMATION *pi)
 {
-#  ifdef FEAT_MBYTE
+#ifdef FEAT_MBYTE
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 	WCHAR	*wcmd = enc_to_utf16((char_u *)cmd, NULL);
@@ -4138,31 +3896,21 @@
     si.lpTitle = NULL;
     si.dwFlags = STARTF_USESHOWWINDOW;
     /*
-     * It's nicer to run a filter command in a minimized window, but in
-     * Windows 95 this makes the command MUCH slower.  We can't do it under
-     * Win32s either as it stops the synchronous spawn workaround working.
+     * It's nicer to run a filter command in a minimized window.
      * Don't activate the window to keep focus on Vim.
      */
-    if ((options & SHELL_DOOUT) && !mch_windows95())
+    if (options & SHELL_DOOUT)
 	si.wShowWindow = SW_SHOWMINNOACTIVE;
     else
 	si.wShowWindow = SW_SHOWNORMAL;
     si.cbReserved2 = 0;
     si.lpReserved2 = NULL;
 
-    /* There is a strange error on Windows 95 when using "c:\command.com".
-     * When the "c:\\" is left out it works OK...? */
-    if (mch_windows95()
-	    && (STRNICMP(cmd, "c:/command.com", 14) == 0
-		|| STRNICMP(cmd, "c:\\command.com", 14) == 0))
-	cmd += 3;
-
     /* Now, run the command */
     vim_create_process(cmd, FALSE,
 	    CREATE_DEFAULT_ERROR_MODE |	CREATE_NEW_CONSOLE, &si, &pi);
 
     /* Wait for the command to terminate before continuing */
-    if (g_PlatformId != VER_PLATFORM_WIN32s)
     {
 #ifdef FEAT_GUI
 	int	    delay = 1;
@@ -4195,23 +3943,6 @@
 	/* Get the command exit code */
 	GetExitCodeProcess(pi.hProcess, &ret);
     }
-    else
-    {
-	/*
-	 * This ugly code is the only quick way of performing
-	 * a synchronous spawn under Win32s. Yuk.
-	 */
-	num_windows = 0;
-	EnumWindows(win32ssynch_cb, 0);
-	old_num_windows = num_windows;
-	do
-	{
-	    Sleep(1000);
-	    num_windows = 0;
-	    EnumWindows(win32ssynch_cb, 0);
-	} while (num_windows == old_num_windows);
-	ret = 0;
-    }
 
     /* Close the handles to the subprocess, so that it goes away */
     CloseHandle(pi.hThread);
@@ -4453,11 +4184,11 @@
 
     if ( ! CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0)
 	/* Ensure the read handle to the pipe for STDOUT is not inherited. */
-       || ! pSetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0)
+       || ! SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0)
 	/* Create a pipe for the child process's STDIN. */
        || ! CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0)
 	/* Ensure the write handle to the pipe for STDIN is not inherited. */
-       || ! pSetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) )
+       || ! SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) )
     {
 	CloseHandle(g_hChildStd_IN_Rd);
 	CloseHandle(g_hChildStd_IN_Wr);
@@ -4707,7 +4438,7 @@
 mch_system(char *cmd, int options)
 {
     /* if we can pipe and the shelltemp option is off */
-    if (allowPiping && !p_stmp)
+    if (!p_stmp)
 	return mch_system_piped(cmd, options);
     else
 	return mch_system_classic(cmd, options);
@@ -4960,7 +4691,7 @@
 	{
 	    cmdlen = (
 #ifdef FEAT_GUI_W32
-		(allowPiping && !p_stmp ? 0 : STRLEN(vimrun_path)) +
+		(!p_stmp ? 0 : STRLEN(vimrun_path)) +
 #endif
 		STRLEN(p_sh) + STRLEN(p_shcf) + STRLEN(cmd) + 10);
 
@@ -4978,7 +4709,7 @@
 			    MB_ICONWARNING);
 		    need_vimrun_warning = FALSE;
 		}
-		if (!s_dont_use_vimrun && (!allowPiping || p_stmp))
+		if (!s_dont_use_vimrun && p_stmp)
 		    /* Use vimrun to execute the command.  It opens a console
 		     * window, which can be closed without killing Vim. */
 		    vim_snprintf((char *)newcmd, cmdlen, "%s%s%s %s %s",
@@ -5002,8 +4733,7 @@
     /* Print the return value, unless "vimrun" was used. */
     if (x != 0 && !(options & SHELL_SILENT) && !emsg_silent
 #if defined(FEAT_GUI_W32)
-		&& ((options & SHELL_DOOUT) || s_dont_use_vimrun
-						  || (allowPiping && !p_stmp))
+		&& ((options & SHELL_DOOUT) || s_dont_use_vimrun || !p_stmp)
 #endif
 	    )
     {
@@ -5051,14 +4781,10 @@
                      lpSecurityAttributes, dwCreationDisposition,
                      dwFlagsAndAttributes, NULL);
             vim_free(wn);
-            if (h == INVALID_HANDLE_VALUE
-                          && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-                wn = NULL;
         }
     }
     if (wn == NULL)
 # endif
-
         h = CreateFile((LPCSTR)fname, dwDesiredAccess, dwShareMode,
                      lpSecurityAttributes, dwCreationDisposition,
                      dwFlagsAndAttributes, NULL);
@@ -5127,7 +4853,7 @@
     }
     else if (!use_null_for_in &&
 	    (!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0)
-	    || !pSetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)))
+	    || !SetHandleInformation(ifd[1], HANDLE_FLAG_INHERIT, 0)))
 	goto failed;
 
     if (use_file_for_out)
@@ -5145,7 +4871,7 @@
     }
     else if (!use_null_for_out &&
 	    (!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0)
-	    || !pSetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)))
+	    || !SetHandleInformation(ofd[0], HANDLE_FLAG_INHERIT, 0)))
 	goto failed;
 
     if (use_file_for_err)
@@ -5163,7 +4889,7 @@
     }
     else if (!use_out_for_err && !use_null_for_err &&
 	    (!CreatePipe(&efd[0], &efd[1], &saAttr, 0)
-	    || !pSetHandleInformation(efd[0], HANDLE_FLAG_INHERIT, 0)))
+	    || !SetHandleInformation(efd[0], HANDLE_FLAG_INHERIT, 0)))
 	goto failed;
 
     si.dwFlags |= STARTF_USESTDHANDLES;
@@ -6176,9 +5902,7 @@
 	{
 	    n = DeleteFileW(wn) ? 0 : -1;
 	    vim_free(wn);
-	    if (n == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return n;
-	    /* Retry with non-wide function (for Windows 98). */
+	    return n;
 	}
     }
 #endif
@@ -6203,7 +5927,6 @@
 
 /* physical RAM to leave for the OS */
 #define WINNT_RESERVE_BYTES     (256*1024*1024)
-#define WIN95_RESERVE_BYTES       (8*1024*1024)
 
 /*
  * How much main memory in KiB that can be used by VIM.
@@ -6212,54 +5935,25 @@
     long_u
 mch_total_mem(int special)
 {
+    MEMORYSTATUSEX  ms;
+
     PlatformId();
-#if (defined(_MSC_VER) && (WINVER > 0x0400)) || defined(MEMORYSTATUSEX)
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT)
+    /* Need to use GlobalMemoryStatusEx() when there is more memory than
+     * what fits in 32 bits. But it's not always available. */
+    ms.dwLength = sizeof(MEMORYSTATUSEX);
+    GlobalMemoryStatusEx(&ms);
+    if (ms.ullAvailVirtual < ms.ullTotalPhys)
     {
-	MEMORYSTATUSEX  ms;
-
-	/* Need to use GlobalMemoryStatusEx() when there is more memory than
-	 * what fits in 32 bits. But it's not always available. */
-	ms.dwLength = sizeof(MEMORYSTATUSEX);
-	GlobalMemoryStatusEx(&ms);
-	if (ms.ullAvailVirtual < ms.ullTotalPhys)
-	{
-	    /* Process address space fits in physical RAM, use all of it. */
-	    return (long_u)(ms.ullAvailVirtual / 1024);
-	}
-	if (ms.ullTotalPhys <= WINNT_RESERVE_BYTES)
-	{
-	    /* Catch old NT box or perverse hardware setup. */
-	    return (long_u)((ms.ullTotalPhys / 2) / 1024);
-	}
-	/* Use physical RAM less reserve for OS + data. */
-	return (long_u)((ms.ullTotalPhys - WINNT_RESERVE_BYTES) / 1024);
+	/* Process address space fits in physical RAM, use all of it. */
+	return (long_u)(ms.ullAvailVirtual / 1024);
     }
-    else
-#endif
+    if (ms.ullTotalPhys <= WINNT_RESERVE_BYTES)
     {
-	/* Pre-XP or 95 OS handling. */
-	MEMORYSTATUS    ms;
-	long_u		os_reserve_bytes;
-
-	ms.dwLength = sizeof(MEMORYSTATUS);
-	GlobalMemoryStatus(&ms);
-	if (ms.dwAvailVirtual < ms.dwTotalPhys)
-	{
-	    /* Process address space fits in physical RAM, use all of it. */
-	    return (long_u)(ms.dwAvailVirtual / 1024);
-	}
-	os_reserve_bytes = (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	    ? WINNT_RESERVE_BYTES
-	    : WIN95_RESERVE_BYTES;
-	if (ms.dwTotalPhys <= os_reserve_bytes)
-	{
-	    /* Catch old boxes or perverse hardware setup. */
-	    return (long_u)((ms.dwTotalPhys / 2) / 1024);
-	}
-	/* Use physical RAM less reserve for OS + data. */
-	return (long_u)((ms.dwTotalPhys - os_reserve_bytes) / 1024);
+	/* Catch old NT box or perverse hardware setup. */
+	return (long_u)((ms.ullTotalPhys / 2) / 1024);
     }
+    /* Use physical RAM less reserve for OS + data. */
+    return (long_u)((ms.ullTotalPhys - WINNT_RESERVE_BYTES) / 1024);
 }
 
 #ifdef FEAT_MBYTE
@@ -6276,16 +5970,13 @@
     WCHAR	szNewPath[_MAX_PATH + 1];
     HANDLE	hf;
 
-    if (!mch_windows95())
-    {
-	p = wold;
-	for (i = 0; wold[i] != NUL; ++i)
-	    if ((wold[i] == '/' || wold[i] == '\\' || wold[i] == ':')
-		    && wold[i + 1] != 0)
-		p = wold + i + 1;
-	if ((int)(wold + i - p) < 8 || p[6] != '~')
-	    return (MoveFileW(wold, wnew) == 0);
-    }
+    p = wold;
+    for (i = 0; wold[i] != NUL; ++i)
+	if ((wold[i] == '/' || wold[i] == '\\' || wold[i] == ':')
+		&& wold[i + 1] != 0)
+	    p = wold + i + 1;
+    if ((int)(wold + i - p) < 8 || p[6] != '~')
+	return (MoveFileW(wold, wnew) == 0);
 
     if (GetFullPathNameW(wnew, _MAX_PATH, szNewPath, &p) == 0 || p == NULL)
 	return -1;
@@ -6363,22 +6054,17 @@
 	    retval = mch_wrename(wold, wnew);
 	vim_free(wold);
 	vim_free(wnew);
-	if (retval == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-	    return retval;
-	/* Retry with non-wide function (for Windows 98). */
+	return retval;
     }
 #endif
 
     /*
-     * No need to play tricks if not running Windows 95, unless the file name
-     * contains a "~" as the seventh character.
+     * No need to play tricks unless the file name contains a "~" as the
+     * seventh character.
      */
-    if (!mch_windows95())
-    {
-	pszFilePart = (char *)gettail((char_u *)pszOldFile);
-	if (STRLEN(pszFilePart) < 8 || pszFilePart[6] != '~')
-	    return rename(pszOldFile, pszNewFile);
-    }
+    pszFilePart = (char *)gettail((char_u *)pszOldFile);
+    if (STRLEN(pszFilePart) < 8 || pszFilePart[6] != '~')
+	return rename(pszOldFile, pszNewFile);
 
     /* Get base path of new file name.  Undocumented feature: If pszNewFile is
      * a directory, no error is returned and pszFilePart will be NULL. */
@@ -6441,16 +6127,9 @@
     char *
 default_shell(void)
 {
-    char* psz = NULL;
-
     PlatformId();
 
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT)		/* Windows NT */
-	psz = "cmd.exe";
-    else if (g_PlatformId == VER_PLATFORM_WIN32_WINDOWS) /* Windows 95 */
-	psz = "command.com";
-
-    return psz;
+    return "cmd.exe";
 }
 
 /*
@@ -6496,18 +6175,11 @@
 
 		hFile = FindFirstFileW(TempNameW, &d);
 		if (hFile == INVALID_HANDLE_VALUE)
-		{
-		    if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-			goto getout;
-
-		    /* Retry with non-wide function (for Windows 98). */
-		    vim_free(wn);
-		    wn = NULL;
-		}
+		    goto getout;
 		else
 		    (void)FindClose(hFile);
 	    }
-	    if (wn == NULL)
+	    else
 #endif
 	    {
 		char		    *pch;
@@ -6537,18 +6209,11 @@
 	    if (wn != NULL)
 	    {
 		if (!GetTempFileNameW(wn, L"VIM", 0, TempNameW))
-		{
-		    if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-			goto getout;
-
-		    /* Retry with non-wide function (for Windows 98). */
-		    vim_free(wn);
-		    wn = NULL;
-		}
+		    goto getout;
 		else
 		    DeleteFileW(TempNameW);
 	    }
-	    if (wn == NULL)
+	    else
 #endif
 	    {
 		if (!GetTempFileName(n, "VIM", 0, TempName))
@@ -6565,17 +6230,8 @@
 		| ((p & R_OK) ? GENERIC_READ : 0);
 #ifdef FEAT_MBYTE
 	if (wn != NULL)
-	{
 	    hFile = CreateFileW(wn, am, 0, NULL, OPEN_EXISTING, 0, NULL);
-	    if (hFile == INVALID_HANDLE_VALUE
-			      && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-	    {
-		/* Retry with non-wide function (for Windows 98). */
-		vim_free(wn);
-		wn = NULL;
-	    }
-	}
-	if (wn == NULL)
+	else
 #endif
 	    hFile = CreateFile(n, am, 0, NULL, OPEN_EXISTING, 0, NULL);
 	if (hFile == INVALID_HANDLE_VALUE)
@@ -6610,11 +6266,7 @@
 	{
 	    f = _wopen(wn, flags, mode);
 	    vim_free(wn);
-	    if (f >= 0 || g_PlatformId == VER_PLATFORM_WIN32_NT)
-		return f;
-	    /* Retry with non-wide function (for Windows 98). Can't use
-	     * GetLastError() here and it's unclear what errno gets set to if
-	     * the _wopen() fails for missing wide functions. */
+	    return f;
 	}
     }
 # endif
@@ -6638,12 +6290,7 @@
     WCHAR	*wn, *wm;
     FILE	*f = NULL;
 
-    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage
-# ifdef __BORLANDC__
-	    /* Wide functions of Borland C 5.5 do not work on Windows 98. */
-	    && g_PlatformId == VER_PLATFORM_WIN32_NT
-# endif
-       )
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 # if defined(DEBUG) && _MSC_VER >= 1400
 	/* Work around an annoying assertion in the Microsoft debug CRT
@@ -6667,12 +6314,7 @@
 # if defined(DEBUG) && _MSC_VER >= 1400
 	_set_fmode(oldMode);
 # endif
-
-	if (f != NULL || g_PlatformId == VER_PLATFORM_WIN32_NT)
-	    return f;
-	/* Retry with non-wide function (for Windows 98). Can't use
-	 * GetLastError() here and it's unclear what errno gets set to if
-	 * the _wfopen() fails for missing wide functions. */
+	return f;
     }
 
     /* fopen() can open a file which name is longer than _MAX_PATH bytes
@@ -6843,8 +6485,7 @@
 #ifdef FEAT_MBYTE
     /* File streams only work on Windows NT and later. */
     PlatformId();
-    if (g_PlatformId == VER_PLATFORM_WIN32_NT)
-	copy_infostreams(from, to);
+    copy_infostreams(from, to);
 #endif
     return 0;
 }
@@ -6856,7 +6497,6 @@
  */
 
 /* These magic numbers are from the MS header files */
-#define MIN_STACK_WIN9X 17
 #define MIN_STACK_WINNT 2
 
 /*
@@ -6876,10 +6516,7 @@
     DWORD	nPageSize;
     DWORD	dummy;
 
-    /* This code will not work on win32s. */
     PlatformId();
-    if (g_PlatformId == VER_PLATFORM_WIN32s)
-	return 0;
 
     /* We need to know the system page size. */
     GetSystemInfo(&si);
@@ -6895,29 +6532,12 @@
 
     /* ...and the page thats min_stack_req pages away from stack base; this is
      * the lowest page we could use. */
-    pLowestPossiblePage = pStackBase + ((g_PlatformId == VER_PLATFORM_WIN32_NT)
-			     ? MIN_STACK_WINNT : MIN_STACK_WIN9X) * nPageSize;
+    pLowestPossiblePage = pStackBase + MIN_STACK_WINNT * nPageSize;
 
-    /* On Win95, we want the next page down from the end of the stack. */
-    if (g_PlatformId == VER_PLATFORM_WIN32_WINDOWS)
     {
-	/* Find the page that's only 1 page down from the page that the stack
-	 * ptr is in. */
-	pGuardPage = (BYTE*)((DWORD)nPageSize * (((DWORD)pStackPtr
-						    / (DWORD)nPageSize) - 1));
-	if (pGuardPage < pLowestPossiblePage)
-	    return 0;
-
-	/* Apply the noaccess attribute to the page -- there's no guard
-	 * attribute in win95-type OSes. */
-	if (!VirtualProtect(pGuardPage, nPageSize, PAGE_NOACCESS, &dummy))
-	    return 0;
-    }
-    else
-    {
-	/* On NT, however, we want the first committed page in the stack Start
-	 * at the stack base and move forward through memory until we find a
-	 * committed block. */
+	/* We want the first committed page in the stack Start at the stack
+	 * base and move forward through memory until we find a committed block.
+	 */
 	BYTE *pBlock = pStackBase;
 
 	for (;;)
diff --git a/src/os_win32.h b/src/os_win32.h
index 3c11d4d..f620d74 100644
--- a/src/os_win32.h
+++ b/src/os_win32.h
@@ -210,20 +210,15 @@
 # define vim_mkdir(x, y) mch_mkdir(x)
 #endif
 
-#ifndef PROTO
-
 /* Enable common dialogs input unicode from IME if possible. */
 #ifdef FEAT_MBYTE
-    /* The variables are defined in os_win32.c. */
-extern LRESULT (WINAPI *pDispatchMessage)(CONST MSG *);
-extern BOOL (WINAPI *pGetMessage)(LPMSG, HWND, UINT, UINT);
-extern BOOL (WINAPI *pIsDialogMessage)(HWND, LPMSG);
-extern BOOL (WINAPI *pPeekMessage)(LPMSG, HWND, UINT, UINT, UINT);
+# define pDispatchMessage DispatchMessageW
+# define pGetMessage GetMessageW
+# define pIsDialogMessage IsDialogMessageW
+# define pPeekMessage PeekMessageW
 #else
 # define pDispatchMessage DispatchMessage
 # define pGetMessage GetMessage
 # define pIsDialogMessage IsDialogMessage
 # define pPeekMessage PeekMessage
 #endif
-
-#endif /* PROTO */
diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro
index 5cdb4af..8cfcb43 100644
--- a/src/proto/os_mswin.pro
+++ b/src/proto/os_mswin.pro
@@ -19,7 +19,6 @@
 int mch_has_exp_wildcard(char_u *p);
 int mch_has_wildcard(char_u *p);
 int mch_chdir(char *path);
-int can_end_termcap_mode(int give_msg);
 int mch_screenmode(char_u *arg);
 int mch_icon_load(HANDLE *iconp);
 int mch_libcall(char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result);
diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro
index 4e6af5b..b76e347 100644
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -3,7 +3,6 @@
 int dyn_libintl_init(void);
 void dyn_libintl_end(void);
 void PlatformId(void);
-int mch_windows95(void);
 void mch_setmouse(int on);
 void mch_update_cursor(void);
 int mch_char_avail(void);
diff --git a/src/version.c b/src/version.c
index a6f4c13..b6bad04 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    29,
+/**/
     28,
 /**/
     27,
@@ -962,15 +964,10 @@
     MSG(longVersion);
 #ifdef WIN3264
 # ifdef FEAT_GUI_W32
-#  if defined(_MSC_VER) && (_MSC_VER <= 1010)
-    /* Only MS VC 4.1 and earlier can do Win32s */
-    MSG_PUTS(_("\nMS-Windows 16/32-bit GUI version"));
-#  else
-#   ifdef _WIN64
+#  ifdef _WIN64
     MSG_PUTS(_("\nMS-Windows 64-bit GUI version"));
-#   else
+#  else
     MSG_PUTS(_("\nMS-Windows 32-bit GUI version"));
-#   endif
 #  endif
 # ifdef FEAT_OLE
     MSG_PUTS(_(" with OLE support"));
@@ -1332,10 +1329,6 @@
     blanklines = (int)Rows - ((sizeof(lines) / sizeof(char *)) - 1);
     if (!p_cp)
 	blanklines += 4;  /* add 4 for not showing "Vi compatible" message */
-#if defined(WIN3264) && !defined(FEAT_GUI_W32)
-    if (mch_windows95())
-	blanklines -= 3;  /* subtract 3 for showing "Windows 95" message */
-#endif
 
 #ifdef FEAT_WINDOWS
     /* Don't overwrite a statusline.  Depends on 'cmdheight'. */
@@ -1384,17 +1377,6 @@
 		do_intro_line(row, (char_u *)_(p), i == 2, 0);
 	    ++row;
 	}
-#if defined(WIN3264) && !defined(FEAT_GUI_W32)
-	if (mch_windows95())
-	{
-	    do_intro_line(++row,
-		    (char_u *)_("WARNING: Windows 95/98/ME detected"),
-							FALSE, hl_attr(HLF_E));
-	    do_intro_line(++row,
-		(char_u *)_("type  :help windows95<Enter>  for info on this"),
-								    FALSE, 0);
-	}
-#endif
     }
 
     /* Make the wait-return message appear just below the text. */
