Index: Source/NSDocumentController.m
===================================================================
--- Source/NSDocumentController.m	(revision 26980)
+++ Source/NSDocumentController.m	(working copy)
@@ -60,7 +60,6 @@
 static NSString *CFBundleTypeRole       = @"CFBundleTypeRole";
 
 static NSString *NSRecentDocuments      = @"NSRecentDocuments";
-static NSString *NSDefaultOpenDirectory = @"NSDefaultOpenDirectory";
 
 static NSDocumentController *sharedController = nil;
 
@@ -728,10 +727,6 @@
   NSString *cancelString = (cancellable)? ((NSString *)_(@"Cancel")) : ((NSString *)nil);
   int      result;
   
-  /* Probably as good a place as any to do this */
-  [[NSUserDefaults standardUserDefaults] 
-    setObject: [self currentDirectory] forKey: NSDefaultOpenDirectory];
-
   if (![self hasEditedDocuments]) 
     {
       return YES;
@@ -850,17 +845,23 @@
 {
   NSFileManager *manager = [NSFileManager defaultManager];
   NSDocument *document = [self currentDocument];
-  NSString *directory;
+  NSString *directory = nil;
   BOOL isDir = NO;
 
   if (document)
-    directory = [[document fileName] stringByDeletingLastPathComponent];
-  else
-    directory = [[NSOpenPanel openPanel] directory];
+    {
+      directory = [[document fileName] stringByDeletingLastPathComponent];
+    }
   if (directory == nil || [directory isEqual: @""]
       || [manager fileExistsAtPath: directory  isDirectory: &isDir] == NO
       || isDir == NO)
     {
+      directory = [[NSOpenPanel openPanel] directory];
+    }
+  if (directory == nil || [directory isEqual: @""]
+      || [manager fileExistsAtPath: directory  isDirectory: &isDir] == NO
+      || isDir == NO)
+    {
       directory = NSHomeDirectory ();
     }
   return directory;
Index: Source/NSOpenPanel.m
===================================================================
--- Source/NSOpenPanel.m	(revision 26980)
+++ Source/NSOpenPanel.m	(working copy)
@@ -73,6 +73,7 @@
 // Pacify the compiler
 @interface NSSavePanel (GSPrivateMethods)
 - (void) _resetDefaults;
+- (void) _updateDefaultDirectory;
 - (void) _selectCellName: (NSString *)title;
 - (void) _selectTextInColumn: (int)column;
 - (void) _setupForDirectory: (NSString *)path file: (NSString *)filename;
@@ -579,6 +580,7 @@
 	}
     }
 
+  [self _updateDefaultDirectory];
   [NSApp stopModalWithCode: NSOKButton];
   [_okButton setEnabled: NO];
   [self close];
Index: Source/NSSavePanel.m
===================================================================
--- Source/NSSavePanel.m	(revision 26980)
+++ Source/NSSavePanel.m	(working copy)
@@ -108,6 +108,7 @@
 - (id) _initWithoutGModel;
 - (void) _getOriginalSize;
 - (void) _setDefaultDirectory;
+- (void) _updateDefaultDirectory;
 - (void) _resetDefaults;
 // Methods invoked by buttons
 - (void) _setHomeDirectory;
@@ -249,7 +250,6 @@
 
   r = NSMakeRect (43, 6, 27, 27);
   button = [[NSButton alloc] initWithFrame: r];
-  [button setRefusesFirstResponder: YES];
   [button setBordered: YES];
   image = [NSImage imageNamed: @"common_Home"];
   [button setImage: image];
@@ -265,7 +265,6 @@
   
   r = NSMakeRect (78, 6, 27, 27);
   button = [[NSButton alloc] initWithFrame: r];
-  [button setRefusesFirstResponder: YES];
   [button setBordered: YES];
   image = [NSImage imageNamed: @"common_Mount"]; 
   [button setImage: image]; 
@@ -281,7 +280,6 @@
 
   r = NSMakeRect (112, 6, 27, 27);
   button = [[NSButton alloc] initWithFrame: r];
-  [button setRefusesFirstResponder: YES];
   [button setBordered: YES];
   image = [NSImage imageNamed: @"common_Unmount"]; 
   [button setImage: image];
@@ -297,7 +295,6 @@
   
   r = NSMakeRect (148, 6, 71, 27);
   button = [[NSButton alloc] initWithFrame: r]; 
-  [button setRefusesFirstResponder: YES];
   [button setBordered: YES];
   [button setTitle:  @"Cancel"];
   [button setImagePosition: NSNoImage]; 
@@ -305,6 +302,7 @@
   [button setAction: @selector(cancel:)];
   [button setAutoresizingMask: NSViewMinXMargin];
   [button setTag: NSFileHandlingPanelCancelButton];
+  [button setKeyEquivalent: @"\e"];
   [_bottomView addSubview: button];
   [lastKeyView setNextKeyView: button];
   lastKeyView = button;
@@ -312,7 +310,6 @@
   
   r = NSMakeRect (228, 6, 71, 27);
   _okButton = [[NSButton alloc] initWithFrame: r]; 
-  [button setRefusesFirstResponder: YES];
   [_okButton setBordered: YES];
   [_okButton setTitle:  @"OK"];
   [_okButton setImagePosition: NSImageRight]; 
@@ -405,6 +402,13 @@
     }
 }
 
+- (void) _updateDefaultDirectory
+{
+  [[NSUserDefaults standardUserDefaults]
+      setObject: _directory
+      forKey: @"NSDefaultOpenDirectory"];
+}
+
 - (void) _resetDefaults
 {
   [self _setDefaultDirectory];
@@ -567,6 +571,8 @@
   setPath(_browser, _fullFileName);
 
   [self _selectCellName: filename];
+  [_form abortEditing]; // FIXME This should not be necessary here; instead,
+                        // editing should stop when the panel is dismissed.
   [[_form cellAtIndex: 0] setStringValue: filename];
   [_form selectTextAtIndex: 0];
   [_form setNeedsDisplay: YES];
@@ -1094,6 +1100,7 @@
 - (void) cancel: (id)sender
 {
   ASSIGN(_directory, pathToColumn(_browser, [_browser lastColumn]));
+  [self _updateDefaultDirectory];
   [NSApp stopModalWithCode: NSCancelButton];
   [_okButton setEnabled: NO];
   [self close];
@@ -1203,6 +1210,7 @@
     if (![_delegate panel: self isValidFilename: [self filename]])
       return;
 
+  [self _updateDefaultDirectory];
   [NSApp stopModalWithCode: NSOKButton];
   [_okButton setEnabled: NO];
   [self close];
