diff --git a/7.1.285 b/7.1.285
new file mode 100644
index 0000000..f4be10f
--- /dev/null
+++ b/7.1.285
@@ -0,0 +1,209 @@
+To: vim-dev@vim.org
+Subject: Patch 7.1.285 (extra)
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.285 (extra)
+Problem:    Mac: dialog hotkeys don't work.
+Solution:   Add hotkey support. (Dan Sandler)
+Files:	    src/gui_mac.c
+
+
+*** ../vim-7.1.284/src/gui_mac.c	Wed Mar 12 21:47:31 2008
+--- src/gui_mac.c	Sun Mar 16 15:25:13 2008
+***************
+*** 153,158 ****
+--- 153,161 ----
+  /* Keeping track of which scrollbar is being dragged */
+  static ControlHandle dragged_sb = NULL;
+  
++ /* Vector of char_u --> control index for hotkeys in dialogs */
++ static short *gDialogHotKeys;
++ 
+  static struct
+  {
+      FMFontFamily family;
+***************
+*** 5519,5524 ****
+--- 5522,5570 ----
+  	SetDialogItemText(itemHandle, itemName);
+  }
+  
++ 
++ /* ModalDialog() handler for message dialogs that have hotkey accelerators.
++  * Expects a mapping of hotkey char to control index in gDialogHotKeys;
++  * setting gDialogHotKeys to NULL disables any hotkey handling.
++  */
++     static pascal Boolean
++ DialogHotkeyFilterProc (
++     DialogRef	    theDialog,
++     EventRecord	    *event,
++     DialogItemIndex *itemHit)
++ {
++     char_u keyHit;
++ 
++     if (event->what == keyDown || event->what == autoKey)
++     {
++ 	keyHit = (event->message & charCodeMask);
++ 
++ 	if (gDialogHotKeys && gDialogHotKeys[keyHit])
++ 	{
++ #ifdef DEBUG_MAC_DIALOG_HOTKEYS
++ 	    printf("user pressed hotkey '%c' --> item %d\n", keyHit, gDialogHotKeys[keyHit]);
++ #endif
++ 	    *itemHit = gDialogHotKeys[keyHit];
++ 
++ 	    /* When handing off to StdFilterProc, pretend that the user
++ 	     * clicked the control manually. Note that this is also supposed
++ 	     * to cause the button to hilite briefly (to give some user
++ 	     * feedback), but this seems not to actually work (or it's too
++ 	     * fast to be seen).
++ 	     */
++ 	    event->what = kEventControlSimulateHit;
++ 
++ 	    return true; /* we took care of it */
++ 	}
++ 
++ 	/* Defer to the OS's standard behavior for this event.
++ 	 * This ensures that Enter will still activate the default button. */
++ 	return StdFilterProc(theDialog, event, itemHit);
++     }
++     return false;      /* Let ModalDialog deal with it */
++ }
++ 
++ 
+  /* TODO: There have been some crashes with dialogs, check your inbox
+   * (Jussi)
+   */
+***************
+*** 5544,5549 ****
+--- 5590,5597 ----
+      GrafPtr	oldPort;
+      short	itemHit;
+      char_u	*buttonChar;
++     short	hotKeys[256];		/* map of hotkey -> control ID */
++     char_u	aHotKey;
+      Rect	box;
+      short	button;
+      short	lastButton;
+***************
+*** 5571,5576 ****
+--- 5619,5626 ----
+  
+      WindowRef	theWindow;
+  
++     ModalFilterUPP dialogUPP;
++ 
+      /* Check 'v' flag in 'guioptions': vertical button placement. */
+      vertical = (vim_strchr(p_go, GO_VERTICAL) != NULL);
+  
+***************
+*** 5610,5615 ****
+--- 5660,5668 ----
+      buttonChar = buttons;
+      button = 0;
+  
++     /* initialize the hotkey mapping */
++     memset(hotKeys, 0, sizeof(hotKeys));
++ 
+      for (;*buttonChar != 0;)
+      {
+  	/* Get the name of the button */
+***************
+*** 5619,5625 ****
+--- 5672,5689 ----
+  	{
+  	    if (*buttonChar != DLG_HOTKEY_CHAR)
+  		name[++len] = *buttonChar;
++ 	    else
++ 	    {
++ 		aHotKey = (char_u)*(buttonChar+1);
++ 		if (aHotKey >= 'A' && aHotKey <= 'Z')
++ 		    aHotKey = (char_u)((int)aHotKey + (int)'a' - (int)'A');
++ 		hotKeys[aHotKey] = button;
++ #ifdef DEBUG_MAC_DIALOG_HOTKEYS
++ 		printf("### hotKey for button %d is '%c'\n", button, aHotKey);
++ #endif
++ 	    }
+  	}
++ 
+  	if (*buttonChar != 0)
+  	  buttonChar++;
+  	name[0] = len;
+***************
+*** 5688,5694 ****
+--- 5752,5764 ----
+  	(void) C2PascalString(textfield, &name);
+  	SetDialogItemText(itemHandle, name);
+  	inputItm.width = StringWidth(name);
++ 
++ 	/* Hotkeys don't make sense if there's a text field */
++ 	gDialogHotKeys = NULL;
+      }
++     else
++ 	/* Install hotkey table */
++ 	gDialogHotKeys = (short *)&hotKeys;
+  
+      /* Set the <ENTER> and <ESC> button. */
+      SetDialogDefaultItem(theDialog, dfltbutton);
+***************
+*** 5777,5786 ****
+      dialog_busy = TRUE;
+  #endif
+  
+      /* Hang until one of the button is hit */
+      do
+      {
+! 	ModalDialog(nil, &itemHit);
+      } while ((itemHit < 1) || (itemHit > lastButton));
+  
+  #ifdef USE_CARBONKEYHANDLER
+--- 5847,5859 ----
+      dialog_busy = TRUE;
+  #endif
+  
++     /* Prepare the shortcut-handling filterProc for handing to the dialog */
++     dialogUPP = NewModalFilterUPP(DialogHotkeyFilterProc);
++ 
+      /* Hang until one of the button is hit */
+      do
+      {
+! 	ModalDialog(dialogUPP, &itemHit);
+      } while ((itemHit < 1) || (itemHit > lastButton));
+  
+  #ifdef USE_CARBONKEYHANDLER
+***************
+*** 5803,5808 ****
+--- 5876,5884 ----
+      /* Restore the original graphical port */
+      SetPort(oldPort);
+  
++     /* Free the modal filterProc */
++     DisposeRoutineDescriptor(dialogUPP);
++ 
+      /* Get ride of th edialog (free memory) */
+      DisposeDialog(theDialog);
+  
+*** ../vim-7.1.284/src/version.c	Thu Mar 20 13:22:47 2008
+--- src/version.c	Thu Mar 20 14:38:06 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+  {   /* Add new patch number below this line */
++ /**/
++     285,
+  /**/
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+163. You go outside for the fresh air (at -30 degrees) but open the
+     window first to hear new mail arrive.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\        download, build and distribute -- http://www.A-A-P.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///