diff --git a/ChangeLog b/ChangeLog
index dddd7f88f4cfa45166eadcf9e22b76d903e68c05..99205561914bbe4ee9134830668a5cefef11c0e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -35,6 +35,8 @@ CVS Code -
   do_browser()
 	- Fix incorrect path check for check_operating_dir() 
 	  (David Benbennick).
+	- Fix goto directory operating dir check and tilde expansion
+	  (David Benbennick).
   open_file()
 	- Fix FD leak with file load error (David Benbennick).
   save_history()
diff --git a/files.c b/files.c
index 7c46929ec317ad22360b7888cd903e7100c4f396..79f5ac678fbc8aab7c1cd79456b8b1f0032780c6 100644
--- a/files.c
+++ b/files.c
@@ -2515,6 +2515,8 @@ char *do_browser(const char *inpath)
     /* Loop invariant: Microsoft sucks. */
     do {
 	DIR *test_dir;
+	char *new_path;
+	    /* Used by the Go To Directory prompt. */
 
 	blank_statusbar_refresh();
 
@@ -2694,37 +2696,36 @@ char *do_browser(const char *inpath)
 	    bottombars(browser_list);
 	    curs_set(0);
 
-#ifndef DISABLE_OPERATINGDIR
-	    if (operating_dir != NULL) {
-		if (check_operating_dir(answer, 0)) {
-		    statusbar(_("Can't go outside of %s in restricted mode"), operating_dir);
-		    break;
-		}
-	    }
-#endif
-
 	    if (j < 0) {
 		statusbar(_("Goto Cancelled"));
 		break;
 	    }
 
-	    if (answer[0] != '/') {
-		char *saveanswer = mallocstrcpy(NULL, answer);
+	    new_path = real_dir_from_tilde(answer);
 
-		answer = nrealloc(answer, strlen(path) + strlen(saveanswer) + 2);
-		sprintf(answer, "%s/%s", path, saveanswer);
-		free(saveanswer);
+	    if (new_path[0] != '/') {
+		new_path = charealloc(new_path, strlen(path) + strlen(answer) + 2);
+		sprintf(new_path, "%s/%s", path, answer);
 	    }
 
-	    if ((test_dir = opendir(answer)) == NULL) {
+#ifndef DISABLE_OPERATINGDIR
+	    if (check_operating_dir(new_path, FALSE)) {
+		statusbar(_("Can't go outside of %s in restricted mode"), operating_dir);
+		free(new_path);
+		break;
+	    }
+#endif
+
+	    if (!readable_dir(new_path)) {
 		/* We can't open this dir for some reason.  Complain */
 		statusbar(_("Can't open \"%s\": %s"), answer, strerror(errno));
+		free(new_path);
 		break;
-	    } 
-	    closedir(test_dir);
+	    }
 
 	    /* Start over again with the new path value */
-	    path = mallocstrcpy(path, answer);
+	    free(path);
+	    path = new_path;
 	    return do_browser(path);
 
 	/* Stuff we want to abort the browser */
diff --git a/nano.h b/nano.h
index 92b462cd3c5ad5e143eafae81bc9df14ec75de4b..c85743e07fc0a6d4bf4b608ed272219cfddebe91 100644
--- a/nano.h
+++ b/nano.h
@@ -34,6 +34,7 @@
 
 /* Define charalloc as a macro rather than duplicating code */
 #define charalloc(howmuch) (char *)nmalloc((howmuch) * sizeof(char))
+#define charealloc(ptr, howmuch) (char *)nrealloc(ptr, (howmuch) * sizeof(char))
 
 #ifndef NANO_SMALL
   /* For the backup file copy ... */