diff --git a/7.4.119 b/7.4.119
new file mode 100644
index 0000000..061b81a
--- /dev/null
+++ b/7.4.119
@@ -0,0 +1,245 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 7.4.119
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.4.119
+Problem:    Vim doesn't work well on OpenVMS.
+Solution:   Fix various problems. (Samuel Ferencik)
+Files:	    src/os_unix.c, src/os_unix.h, src/os_vms.c
+
+
+*** ../vim-7.4.118/src/os_unix.c	2013-12-11 13:21:44.000000000 +0100
+--- src/os_unix.c	2013-12-11 16:16:03.000000000 +0100
+***************
+*** 168,174 ****
+  static pid_t wait4pid __ARGS((pid_t, waitstatus *));
+  
+  static int  WaitForChar __ARGS((long));
+! #if defined(__BEOS__)
+  int  RealWaitForChar __ARGS((int, long, int *));
+  #else
+  static int  RealWaitForChar __ARGS((int, long, int *));
+--- 168,174 ----
+  static pid_t wait4pid __ARGS((pid_t, waitstatus *));
+  
+  static int  WaitForChar __ARGS((long));
+! #if defined(__BEOS__) || defined(VMS)
+  int  RealWaitForChar __ARGS((int, long, int *));
+  #else
+  static int  RealWaitForChar __ARGS((int, long, int *));
+***************
+*** 435,441 ****
+  	/* Process the queued netbeans messages. */
+  	netbeans_parse_messages();
+  #endif
+- #ifndef VMS  /* VMS: must try reading, WaitForChar() does nothing. */
+  	/*
+  	 * We want to be interrupted by the winch signal
+  	 * or by an event on the monitored file descriptors.
+--- 435,440 ----
+***************
+*** 446,452 ****
+  		handle_resize();
+  	    return 0;
+  	}
+- #endif
+  
+  	/* If input was put directly in typeahead buffer bail out here. */
+  	if (typebuf_changed(tb_change_cnt))
+--- 445,450 ----
+***************
+*** 5039,5044 ****
+--- 5037,5043 ----
+      return avail;
+  }
+  
++ #ifndef VMS
+  /*
+   * Wait "msec" msec until a character is available from file descriptor "fd".
+   * "msec" == 0 will check for characters once.
+***************
+*** 5338,5350 ****
+  	}
+  # endif
+  
+- # ifdef OLD_VMS
+- 	/* Old VMS as v6.2 and older have broken select(). It waits more than
+- 	 * required. Should not be used */
+- 	ret = 0;
+- # else
+  	ret = select(maxfd + 1, &rfds, NULL, &efds, tvp);
+- # endif
+  # ifdef EINTR
+  	if (ret == -1 && errno == EINTR)
+  	{
+--- 5337,5343 ----
+***************
+*** 5466,5473 ****
+      return (ret > 0);
+  }
+  
+- #ifndef VMS
+- 
+  #ifndef NO_EXPANDPATH
+  /*
+   * Expand a path into all matching files and/or directories.  Handles "*",
+--- 5459,5464 ----
+*** ../vim-7.4.118/src/os_unix.h	2013-06-12 20:09:44.000000000 +0200
+--- src/os_unix.h	2013-12-11 16:16:03.000000000 +0100
+***************
+*** 225,230 ****
+--- 225,232 ----
+  # include <starlet.h>
+  # include <socket.h>
+  # include <lib$routines.h>
++ # include <libdef.h>
++ # include <libdtdef.h>
+  
+  # ifdef FEAT_GUI_GTK
+  #  include "gui_gtk_vms.h"
+*** ../vim-7.4.118/src/os_vms.c	2010-06-26 06:03:31.000000000 +0200
+--- src/os_vms.c	2013-12-11 17:10:24.000000000 +0100
+***************
+*** 11,16 ****
+--- 11,33 ----
+  
+  #include	"vim.h"
+  
++ /* define _generic_64 for use in time functions */
++ #ifndef VAX
++ #   include <gen64def.h>
++ #else
++ /* based on Alpha's gen64def.h; the file is absent on VAX */
++ typedef struct _generic_64 {
++ #   pragma __nomember_alignment
++     __union  {                          /* You can treat me as...  */
++ 	/* long long is not available on VAXen */
++ 	/* unsigned __int64 gen64$q_quadword; ...a single 64-bit value, or */
++ 
++ 	unsigned int gen64$l_longword [2]; /* ...two 32-bit values, or */
++ 	unsigned short int gen64$w_word [4]; /* ...four 16-bit values */
++     } gen64$r_quad_overlay;
++ } GENERIC_64;
++ #endif
++ 
+  typedef struct
+  {
+      char	class;
+***************
+*** 669,671 ****
+--- 686,777 ----
+      }
+      return ;
+  }
++ 
++ struct typeahead_st {
++     unsigned short numchars;
++     unsigned char  firstchar;
++     unsigned char  reserved0;
++     unsigned long  reserved1;
++ } typeahead;
++ 
++ /*
++  * Wait "msec" msec until a character is available from file descriptor "fd".
++  * "msec" == 0 will check for characters once.
++  * "msec" == -1 will block until a character is available.
++  */
++     int
++ RealWaitForChar(fd, msec, check_for_gpm)
++     int		fd UNUSED; /* always read from iochan */
++     long	msec;
++     int		*check_for_gpm UNUSED;
++ {
++     int status;
++     struct _generic_64 time_curr;
++     struct _generic_64 time_diff;
++     struct _generic_64 time_out;
++     unsigned int convert_operation = LIB$K_DELTA_SECONDS_F;
++     float sec = (float) msec / 1000;
++ 
++     /* make sure the iochan is set */
++     if (!iochan)
++ 	get_tty();
++ 
++     if (msec > 0) {
++         /* time-out specified; convert it to absolute time */
++ 
++         /* get current time (number of 100ns ticks since the VMS Epoch) */
++         status = sys$gettim(&time_curr);
++         if (status != SS$_NORMAL)
++             return 0; /* error */
++ 
++         /* construct the delta time */
++         status = lib$cvtf_to_internal_time(
++                 &convert_operation, &sec, &time_diff);
++         if (status != LIB$_NORMAL)
++             return 0; /* error */
++ 
++         /* add them up */
++         status = lib$add_times(
++                 &time_curr,
++                 &time_diff,
++                 &time_out);
++         if (status != LIB$_NORMAL)
++             return 0; /* error */
++     }
++ 
++     while (TRUE) {
++         /* select() */
++         status = sys$qiow(0, iochan, IO$_SENSEMODE | IO$M_TYPEAHDCNT, iosb,
++                 0, 0, &typeahead, 8, 0, 0, 0, 0);
++ 	if (status != SS$_NORMAL || (iosb[0] & 0xFFFF) != SS$_NORMAL)
++             return 0; /* error */
++ 
++         if (typeahead.numchars)
++             return 1; /* ready to read */
++ 
++         /* there's nothing to read; what now? */
++         if (msec == 0) {
++             /* immediate time-out; return impatiently */
++             return 0;
++         }
++         else if (msec < 0) {
++             /* no time-out; wait on indefinitely */
++             continue;
++         }
++         else {
++             /* time-out needs to be checked */
++             status = sys$gettim(&time_curr);
++             if (status != SS$_NORMAL)
++                 return 0; /* error */
++ 
++             status = lib$sub_times(
++                     &time_out,
++                     &time_curr,
++                     &time_diff);
++             if (status != LIB$_NORMAL)
++                 return 0; /* error, incl. time_diff < 0 (i.e. time-out) */
++ 
++             /* otherwise wait some more */
++         }
++     }
++ }
+*** ../vim-7.4.118/src/version.c	2013-12-11 15:51:54.000000000 +0100
+--- src/version.c	2013-12-11 16:09:16.000000000 +0100
+***************
+*** 740,741 ****
+--- 740,743 ----
+  {   /* Add new patch number below this line */
++ /**/
++     119,
+  /**/
+
+-- 
+It is hard to understand how a cemetery raised its burial
+cost and blamed it on the cost of living.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\  an exciting new programming language -- http://www.Zimbu.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///