diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c
index bc6b2ee..109e0f7 100644
--- a/gtk/gtkfilechooserdefault.c
+++ b/gtk/gtkfilechooserdefault.c
@@ -5275,6 +5275,8 @@ set_local_only (GtkFileChooserDefault *impl,
   if (local_only != impl->local_only)
     {
       impl->local_only = local_only;
+      _gtk_file_chooser_entry_set_local_only (GTK_FILE_CHOOSER_ENTRY (impl->location_entry),
+                                              local_only);
 
       if (impl->shortcuts_model && impl->file_system)
 	{
@@ -6805,6 +6807,33 @@ struct UpdateCurrentFolderData
 };
 
 static void
+update_current_folder_mount_enclosing_volume_cb (GCancellable        *cancellable,
+                                                 GtkFileSystemVolume *volume,
+                                                 const GError        *error,
+                                                 gpointer             user_data)
+{
+  gboolean cancelled = g_cancellable_is_cancelled (cancellable);
+  struct UpdateCurrentFolderData *data = user_data;
+  GtkFileChooserDefault *impl = data->impl;
+
+  if (cancellable != impl->update_current_folder_cancellable)
+    goto out;
+
+  impl->update_current_folder_cancellable = NULL;
+
+  if (cancelled)
+    goto out;
+
+  change_folder_and_display_error (impl, data->file, data->clear_entry);
+
+out:
+  g_object_unref (data->file);
+  g_free (data);
+
+  g_object_unref (cancellable);
+}
+
+static void
 update_current_folder_get_info_cb (GCancellable *cancellable,
 				   GFileInfo    *info,
 				   const GError *error,
@@ -6829,6 +6858,26 @@ update_current_folder_get_info_cb (GCancellable *cancellable,
     {
       GFile *parent_file;
 
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED))
+        {
+          GMountOperation *mount_operation;
+          GtkWidget *toplevel;
+
+          g_object_unref (cancellable);
+          toplevel = gtk_widget_get_toplevel (GTK_WIDGET (impl));
+
+          mount_operation = gtk_mount_operation_new (GTK_WINDOW (toplevel));
+
+          impl->update_current_folder_cancellable =
+            _gtk_file_system_mount_enclosing_volume (impl->file_system, data->file,
+                                                     mount_operation,
+                                                     update_current_folder_mount_enclosing_volume_cb,
+                                                     data);
+          set_busy_cursor (impl, TRUE);
+
+          return;
+        }
+
       if (!data->original_file)
         {
 	  data->original_file = g_object_ref (data->file);
diff --git a/gtk/gtkfilechooserentry.c b/gtk/gtkfilechooserentry.c
index 2914934..101537c 100644
--- a/gtk/gtkfilechooserentry.c
+++ b/gtk/gtkfilechooserentry.c
@@ -28,6 +28,7 @@
 #include "gtkfilechooserentry.h"
 #include "gtklabel.h"
 #include "gtkmain.h"
+#include "gtkmountoperation.h"
 #include "gtkwindow.h"
 #include "gtkintl.h"
 #include "gtkalias.h"
@@ -79,6 +80,7 @@ struct _GtkFileChooserEntry
   guint has_completion : 1;
   guint in_change      : 1;
   guint eat_tabs       : 1;
+  guint local_only     : 1;
 };
 
 enum
@@ -145,8 +147,8 @@ typedef enum {
 
 static void refresh_current_folder_and_file_part (GtkFileChooserEntry *chooser_entry,
 						  RefreshMode refresh_mode);
-static void finished_loading_cb (GFile         *file,
-				 gpointer       data);
+static void finished_loading_cb (GtkFolder *folder,
+				 gpointer   data);
 static void autocomplete (GtkFileChooserEntry *chooser_entry);
 static void install_start_autocompletion_idle (GtkFileChooserEntry *chooser_entry);
 static void remove_completion_feedback (GtkFileChooserEntry *chooser_entry);
@@ -194,6 +196,8 @@ _gtk_file_chooser_entry_init (GtkFileChooserEntry *chooser_entry)
   GtkEntryCompletion *comp;
   GtkCellRenderer *cell;
 
+  chooser_entry->local_only = TRUE;
+
   g_object_set (chooser_entry, "truncate-multiline", TRUE, NULL);
 
   comp = gtk_entry_completion_new ();
@@ -1308,8 +1312,8 @@ finish_folder_load (GtkFileChooserEntry *chooser_entry)
 
 /* Callback when the current folder finishes loading */
 static void
-finished_loading_cb (GFile    *file,
-		     gpointer  data)
+finished_loading_cb (GtkFolder *folder,
+		     gpointer   data)
 {
   GtkFileChooserEntry *chooser_entry = GTK_FILE_CHOOSER_ENTRY (data);
 
@@ -1337,6 +1341,7 @@ load_directory_get_folder_callback (GCancellable  *cancellable,
 
       old_load_complete_action = chooser_entry->load_complete_action;
 
+      discard_completion_store (chooser_entry);
       clear_completions (chooser_entry);
 
       if (old_load_complete_action == LOAD_COMPLETE_EXPLICIT_COMPLETION)
@@ -1349,6 +1354,8 @@ load_directory_get_folder_callback (GCancellable  *cancellable,
 
       if (chooser_entry->current_folder)
 	{
+	  g_signal_handlers_disconnect_by_func (chooser_entry->current_folder,
+						finished_loading_cb, chooser_entry);
 	  g_object_unref (chooser_entry->current_folder);
 	  chooser_entry->current_folder = NULL;
 	}
@@ -1380,6 +1387,10 @@ start_loading_current_folder (GtkFileChooserEntry *chooser_entry)
       chooser_entry->file_system == NULL)
     return;
 
+  if (chooser_entry->local_only &&
+      !g_file_is_native (chooser_entry->current_folder_file))
+    return;
+
   g_assert (chooser_entry->current_folder == NULL);
   g_assert (chooser_entry->load_folder_cancellable == NULL);
 
@@ -1408,14 +1419,16 @@ reload_current_folder (GtkFileChooserEntry *chooser_entry,
 	  /* We changed our current directory.  We need to clear out the old
 	   * directory information.
 	   */
+          if (chooser_entry->load_folder_cancellable)
+            {
+              g_cancellable_cancel (chooser_entry->load_folder_cancellable);
+              chooser_entry->load_folder_cancellable = NULL;
+            }
+
 	  if (chooser_entry->current_folder)
 	    {
-	      if (chooser_entry->load_folder_cancellable)
-		{
-		  g_cancellable_cancel (chooser_entry->load_folder_cancellable);
-		  chooser_entry->load_folder_cancellable = NULL;
-		}
-
+              g_signal_handlers_disconnect_by_func (chooser_entry->current_folder,
+                                                    finished_loading_cb, chooser_entry);
 	      g_object_unref (chooser_entry->current_folder);
 	      chooser_entry->current_folder = NULL;
 	    }
@@ -1845,3 +1858,16 @@ _gtk_file_chooser_entry_select_filename (GtkFileChooserEntry *chooser_entry)
   gtk_editable_select_region (GTK_EDITABLE (chooser_entry), 0, (gint) len);
 }
 
+void
+_gtk_file_chooser_entry_set_local_only (GtkFileChooserEntry *chooser_entry,
+                                        gboolean             local_only)
+{
+  chooser_entry->local_only = local_only;
+  clear_completions (chooser_entry);
+}
+
+gboolean
+_gtk_file_chooser_entry_get_local_only (GtkFileChooserEntry *chooser_entry)
+{
+  return chooser_entry->local_only;
+}
diff --git a/gtk/gtkfilechooserentry.h b/gtk/gtkfilechooserentry.h
index 2818fd9..25b9a2c 100644
--- a/gtk/gtkfilechooserentry.h
+++ b/gtk/gtkfilechooserentry.h
@@ -49,6 +49,11 @@ gboolean           _gtk_file_chooser_entry_get_is_folder      (GtkFileChooserEnt
 							       GFile               *file);
 void               _gtk_file_chooser_entry_select_filename    (GtkFileChooserEntry *chooser_entry);
 
+void               _gtk_file_chooser_entry_set_local_only     (GtkFileChooserEntry *chooser_entry,
+                                                               gboolean             local_only);
+gboolean           _gtk_file_chooser_entry_get_local_only     (GtkFileChooserEntry *chooser_entry);
+
+
 G_END_DECLS
 
 #endif /* __GTK_FILE_CHOOSER_ENTRY_H__ */
diff --git a/gtk/gtkfilesystem.c b/gtk/gtkfilesystem.c
index c462b3f..00ecd46 100644
--- a/gtk/gtkfilesystem.c
+++ b/gtk/gtkfilesystem.c
@@ -613,7 +613,7 @@ _gtk_file_system_parse (GtkFileSystem     *file_system,
 
   last_slash = strrchr (str, G_DIR_SEPARATOR);
 
-  if (str[0] == '~')
+  if (str[0] == '~' || str[0] == G_DIR_SEPARATOR || strstr (str, "://") != NULL)
     file = g_file_parse_name (str);
   else
     file = g_file_resolve_relative_path (base_file, str);
