Index: src/nautilus-application.c
===================================================================
--- src/nautilus-application.c	(Revision 12681)
+++ src/nautilus-application.c	(Arbeitskopie)
@@ -183,6 +183,8 @@ nautilus_application_instance_init (Naut
 	/* Watch for volume unmounts so we can close open windows */
 	g_signal_connect_object (gnome_vfs_get_volume_monitor (), "volume_unmounted",
 				 G_CALLBACK (volume_unmounted_callback), application, 0);
+	g_signal_connect_object (gnome_vfs_get_volume_monitor (), "volume_changed",
+				 G_CALLBACK (volume_mounted_callback), application, 0);
 	g_signal_connect_object (gnome_vfs_get_volume_monitor (), "volume_pre_unmount",
 				 G_CALLBACK (volume_unmounted_callback), application, 0);
 	g_signal_connect_object (gnome_vfs_get_volume_monitor (), "volume_mounted",
Index: src/nautilus-places-sidebar.c
===================================================================
--- src/nautilus-places-sidebar.c	(Revision 12681)
+++ src/nautilus-places-sidebar.c	(Arbeitskopie)
@@ -175,6 +175,10 @@ G_DEFINE_TYPE_WITH_CODE (NautilusPlacesS
 						sidebar_provider_iface_init));
 
 
+static void select_place_matching_location (NautilusPlacesSidebar *sidebar,
+					    const char            *location);
+
+
 static GtkTreeIter
 add_place (NautilusPlacesSidebar *sidebar,
 	   PlaceType place_type,
@@ -239,9 +243,6 @@ update_places (NautilusPlacesSidebar *si
 				       display_name, "gnome-fs-home",
 				       mount_uri, NULL, NULL, 0);
 		g_free (display_name);
-		if (strcmp (location, mount_uri) == 0) {
-			gtk_tree_selection_select_iter (selection, &last_iter);
-		}	
 		g_free (mount_uri);
 	}
 
@@ -249,9 +250,6 @@ update_places (NautilusPlacesSidebar *si
 	last_iter = add_place (sidebar, PLACES_BUILT_IN,
 			       _("Desktop"), "gnome-fs-desktop",
 			       mount_uri, NULL, NULL, 0);
-	if (strcmp (location, mount_uri) == 0) {
-		gtk_tree_selection_select_iter (selection, &last_iter);
-	}	
 	g_free (mount_uri);
 	g_free (desktop_path);
 	
@@ -259,9 +257,6 @@ update_places (NautilusPlacesSidebar *si
 	last_iter = add_place (sidebar, PLACES_BUILT_IN,
 			       _("File System"), "gnome-dev-harddisk",
 			       mount_uri, NULL, NULL, 0);
-	if (strcmp (location, mount_uri) == 0) {
-		gtk_tree_selection_select_iter (selection, &last_iter);
-	}
 
 	/* for all drives add all its volumes */
 
@@ -290,9 +285,6 @@ update_places (NautilusPlacesSidebar *si
 				last_iter = add_place (sidebar, PLACES_MOUNTED_VOLUME,
 						       name, icon, mount_uri,
 						       drive, volume, 0);
-				if (strcmp (location, mount_uri) == 0) {
-					gtk_tree_selection_select_iter (selection, &last_iter);
-				}
 				gnome_vfs_volume_unref (volume);
 				g_free (icon);
 				g_free (name);
@@ -333,9 +325,6 @@ update_places (NautilusPlacesSidebar *si
 		last_iter = add_place (sidebar, PLACES_MOUNTED_VOLUME,
 				       name, icon, mount_uri,
 				       NULL, volume, 0);
-		if (strcmp (location, mount_uri) == 0) {
-			gtk_tree_selection_select_iter (selection, &last_iter);
-		}
 		gnome_vfs_volume_unref (volume);
 		g_free (icon);
 		g_free (name);
@@ -366,13 +355,12 @@ update_places (NautilusPlacesSidebar *si
 		last_iter = add_place (sidebar, PLACES_BOOKMARK,
 				       name, icon, mount_uri,
 				       NULL, NULL, index);
-		if (strcmp (location, mount_uri) == 0) {
-			gtk_tree_selection_select_iter (selection, &last_iter);
-		}
 		g_free (name);
 		g_free (icon);
 		g_free (mount_uri);
 	}
+
+	select_place_matching_location (sidebar, location);
 	g_free (location);
 }
 
@@ -409,6 +397,14 @@ volume_mounted_callback (GnomeVFSVolumeM
 }
 
 static void
+volume_changed_callback (GnomeVFSVolumeMonitor *volume_monitor,
+			 GnomeVFSVolume *volume,
+			 NautilusPlacesSidebar *sidebar)
+{
+	update_places (sidebar);
+}
+
+static void
 volume_unmounted_callback (GnomeVFSVolumeMonitor *volume_monitor,
 			   GnomeVFSVolume *volume,
 			   NautilusPlacesSidebar *sidebar)
@@ -534,38 +530,45 @@ desktop_location_changed_callback (gpoin
 }
 
 static void
-loading_uri_callback (NautilusWindowInfo *window,
-		      char *location,
-		      NautilusPlacesSidebar *sidebar)
+select_place_matching_location (NautilusPlacesSidebar *sidebar,
+				const char            *location)
 {
 	GtkTreeSelection *selection;
 	GtkTreeIter 	 iter;
 	gboolean 	 valid;
 	char  		 *uri;
 
-        if (strcmp (sidebar->uri, location) != 0) {
-		g_free (sidebar->uri);
-                sidebar->uri = g_strdup (location);
-  
-		/* set selection if any place matches location */
-		selection = gtk_tree_view_get_selection (sidebar->tree_view);
-		gtk_tree_selection_unselect_all (selection);
-  		valid = gtk_tree_model_get_iter_first (sidebar->filter_model, &iter);
-
-		while (valid) {
-			gtk_tree_model_get (sidebar->filter_model, &iter, 
-		 		       	    PLACES_SIDEBAR_COLUMN_URI, &uri,
-					    -1);
-			if (uri != NULL) {
-				if (strcmp (uri, location) == 0) {
-					g_free (uri);
-					gtk_tree_selection_select_iter (selection, &iter);
-					break;
-				}
+	/* set selection if any place matches location */
+	selection = gtk_tree_view_get_selection (sidebar->tree_view);
+	gtk_tree_selection_unselect_all (selection);
+	valid = gtk_tree_model_get_iter_first (sidebar->filter_model, &iter);
+
+	while (valid) {
+		gtk_tree_model_get (sidebar->filter_model, &iter, 
+				    PLACES_SIDEBAR_COLUMN_URI, &uri,
+				    -1);
+		if (uri != NULL) {
+			if (strcmp (uri, location) == 0) {
 				g_free (uri);
+				gtk_tree_selection_select_iter (selection, &iter);
+				break;
 			}
-        	 	valid = gtk_tree_model_iter_next (sidebar->filter_model, &iter);
+			g_free (uri);
 		}
+		valid = gtk_tree_model_iter_next (sidebar->filter_model, &iter);
+	}
+}
+
+static void
+loading_uri_callback (NautilusWindowInfo *window,
+		      char *location,
+		      NautilusPlacesSidebar *sidebar)
+{
+	if (strcmp (sidebar->uri, location) != 0) {
+		g_free (sidebar->uri);
+		sidebar->uri = g_strdup (location);
+
+		select_place_matching_location (sidebar, location);
     	}
 }
 
@@ -885,6 +888,41 @@ get_selected_iter (NautilusPlacesSidebar
 	return TRUE;
 }
 
+static gboolean
+can_rename_iter (NautilusPlacesSidebar *sidebar,
+		 GtkTreeIter           *iter)
+{
+	GnomeVFSVolume *volume;
+	PlaceType type;
+
+	gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), iter,
+			    PLACES_SIDEBAR_COLUMN_VOLUME, &volume,
+			    PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
+			    -1);
+
+	if (type == PLACES_BOOKMARK ||
+	    (type == PLACES_MOUNTED_VOLUME &&
+	     volume != NULL && (gnome_vfs_volume_get_volume_type (volume) ==
+				GNOME_VFS_VOLUME_TYPE_CONNECTED_SERVER))) {
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static gboolean
+can_remove_iter (NautilusPlacesSidebar *sidebar,
+		 GtkTreeIter           *iter)
+{
+	PlaceType type;
+
+	gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), iter,
+			    PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
+			    -1);
+
+	return (type == PLACES_BOOKMARK);
+}
+
 /* Reorders the selected bookmark to the specified position */
 static void
 reorder_bookmarks (NautilusPlacesSidebar *sidebar,
@@ -1130,6 +1168,7 @@ bookmarks_check_popup_sensitivity (Nauti
 	gboolean show_unmount;
 	gboolean show_eject;
 	gboolean show_format;
+	gboolean got_iter;
 	
 	type = PLACES_BUILT_IN;
 
@@ -1137,7 +1176,11 @@ bookmarks_check_popup_sensitivity (Nauti
 		return;
 	}
 
+	got_iter = FALSE;
+
 	if (get_selected_iter (sidebar, &iter)) {
+		got_iter = TRUE;
+
 		gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter,
 				    PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
 				    PLACES_SIDEBAR_COLUMN_DRIVE, &drive,
@@ -1145,8 +1188,8 @@ bookmarks_check_popup_sensitivity (Nauti
 				    -1);
 	}
 
-	gtk_widget_set_sensitive (sidebar->popup_menu_remove_item, (type == PLACES_BOOKMARK));
-	gtk_widget_set_sensitive (sidebar->popup_menu_rename_item, (type == PLACES_BOOKMARK));
+	gtk_widget_set_sensitive (sidebar->popup_menu_remove_item, got_iter && can_remove_iter (sidebar, &iter));
+	gtk_widget_set_sensitive (sidebar->popup_menu_rename_item, got_iter && can_rename_iter (sidebar, &iter));
 
  	check_visibility (volume, drive,
  			  &show_mount, &show_unmount, &show_eject, &show_format);	
@@ -1184,6 +1227,8 @@ rename_selected_bookmark (NautilusPlaces
 	GList *renderers;
 	
 	if (get_selected_iter (sidebar, &iter)) {
+		g_assert (can_rename_iter (sidebar, &iter));
+
 		path = gtk_tree_model_get_path (GTK_TREE_MODEL (sidebar->store), &iter);
 		column = gtk_tree_view_get_column (GTK_TREE_VIEW (sidebar->tree_view), 0);
 		renderers = gtk_tree_view_column_get_cell_renderers (column);
@@ -1323,6 +1368,7 @@ bookmarks_key_press_event_cb (GtkWidget 
 			      GdkEventKey           *event,
 			      NautilusPlacesSidebar *sidebar)
 {
+  GtkTreeIter iter;
   guint modifiers;
 
   modifiers = gtk_accelerator_get_default_mod_mask ();
@@ -1330,13 +1376,17 @@ bookmarks_key_press_event_cb (GtkWidget 
   if ((event->keyval == GDK_BackSpace
       || event->keyval == GDK_Delete
       || event->keyval == GDK_KP_Delete)
-      && (event->state & modifiers) == 0) {
+      && (event->state & modifiers) == 0
+      && get_selected_iter (sidebar, &iter)
+      && can_remove_iter (sidebar, &iter)) {
       remove_selected_bookmarks (sidebar);
       return TRUE;
   }
 
   if ((event->keyval == GDK_F2)
-      && (event->state & modifiers) == 0) {
+      && (event->state & modifiers) == 0
+      && get_selected_iter (sidebar, &iter)
+      && can_rename_iter (sidebar, &iter)) {
       rename_selected_bookmark (sidebar);
       return TRUE;
   }
@@ -1461,6 +1511,8 @@ bookmarks_edited (GtkCellRenderer       
 	GtkTreePath *path;
 	GtkTreeIter iter;
 	NautilusBookmark *bookmark;
+	GnomeVFSVolume *volume;
+	PlaceType type;
 	int index;
 
 	g_object_set (cell, "editable", FALSE, NULL);
@@ -1469,13 +1521,19 @@ bookmarks_edited (GtkCellRenderer       
 	gtk_tree_model_get_iter (GTK_TREE_MODEL (sidebar->store), &iter, path);
 	gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter,
 		            PLACES_SIDEBAR_COLUMN_INDEX, &index,
+		            PLACES_SIDEBAR_COLUMN_VOLUME, &volume,
+		            PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
 		            -1);
 	gtk_tree_path_free (path);
-	bookmark = nautilus_bookmark_list_item_at (sidebar->bookmarks, index);
 
-	if (bookmark != NULL) {
+	if (type == PLACES_BOOKMARK) {
+		bookmark = nautilus_bookmark_list_item_at (sidebar->bookmarks, index);
 		nautilus_bookmark_set_has_custom_name (bookmark, TRUE);
 		nautilus_bookmark_set_name (bookmark, new_text);
+	} else if (type == PLACES_MOUNTED_VOLUME && volume != NULL &&
+		   (gnome_vfs_volume_get_volume_type (volume) ==
+		    GNOME_VFS_VOLUME_TYPE_CONNECTED_SERVER)) {
+		gnome_vfs_volume_connected_server_set_display_name (volume, new_text);
 	}
 }
 
@@ -1694,6 +1752,8 @@ nautilus_places_sidebar_set_parent_windo
 	
 	g_signal_connect_object (volume_monitor, "volume_mounted",
 				 G_CALLBACK (volume_mounted_callback), sidebar, 0);
+	g_signal_connect_object (volume_monitor, "volume_changed",
+				 G_CALLBACK (volume_changed_callback), sidebar, 0);
 	g_signal_connect_object (volume_monitor, "volume_unmounted",
 				 G_CALLBACK (volume_unmounted_callback), sidebar, 0);
 	g_signal_connect_object (volume_monitor, "drive_disconnected",
Index: libnautilus-private/nautilus-trash-directory.c
===================================================================
--- libnautilus-private/nautilus-trash-directory.c	(Revision 12681)
+++ libnautilus-private/nautilus-trash-directory.c	(Arbeitskopie)
@@ -44,6 +44,7 @@ struct NautilusTrashDirectoryDetails {
 typedef struct {
 	NautilusTrashDirectory *trash;
 	GnomeVFSVolume *volume;
+	GnomeVFSURI *volume_mount_uri;
 
 	GnomeVFSAsyncHandle *handle;
 	NautilusDirectory *real_directory;
@@ -129,6 +130,15 @@ get_trash_volume (NautilusTrashDirectory
 		(*trash_volume)->volume = gnome_vfs_volume_ref (volume);
 		g_hash_table_insert (trash->details->volumes, volume, *trash_volume);
 	}
+
+	if ((*trash_volume)->volume_mount_uri != NULL) {
+		gnome_vfs_uri_unref ((*trash_volume)->volume_mount_uri);
+		(*trash_volume)->volume_mount_uri = NULL;
+	}
+
+	if (*volume_mount_uri != NULL) {
+		(*trash_volume)->volume_mount_uri = gnome_vfs_uri_dup (*volume_mount_uri);
+	}
 	
 	return TRUE;
 }
@@ -224,6 +234,9 @@ remove_trash_volume (TrashVolume *trash_
 		nautilus_directory_unref (trash_volume->real_directory);
 	}
 	gnome_vfs_volume_unref (trash_volume->volume);
+	if (trash_volume->volume_mount_uri != NULL) {
+		gnome_vfs_uri_unref (trash_volume->volume_mount_uri);
+	}
 	g_free (trash_volume);
 }
 
@@ -265,6 +278,41 @@ volume_mounted_callback (GnomeVFSVolumeM
 }
 
 static void
+volume_changed_callback (GnomeVFSVolumeMonitor *monitor,
+			 GnomeVFSVolume *volume,
+			 NautilusTrashDirectory *trash)
+{
+	GnomeVFSURI *volume_mount_uri;
+	TrashVolume *trash_volume;
+	char *uri_str;
+
+	uri_str = gnome_vfs_volume_get_activation_uri (volume);
+	volume_mount_uri = gnome_vfs_uri_new (uri_str);
+	g_free (uri_str);
+
+	/* Quick out if we already know about this volume. */
+	trash_volume = g_hash_table_lookup (trash->details->volumes, volume);
+
+	if (trash_volume == NULL) {
+		/* just add the new location. */
+		add_volume (trash, volume);
+	} else {
+		/* remove and re-add the volume, except if the URI definitly remained
+ 		 * the same. */
+		if (volume_mount_uri == NULL || trash_volume->volume_mount_uri == NULL ||
+	            !gnome_vfs_uri_equal (volume_mount_uri, trash_volume->volume_mount_uri)) {
+			remove_volume (trash, volume);
+			add_volume (trash, volume);
+		}
+	}
+
+	if (volume_mount_uri != NULL) {
+		gnome_vfs_uri_unref (volume_mount_uri);
+	}
+
+}
+
+static void
 volume_unmounted_callback (GnomeVFSVolumeMonitor *monitor,
 			   GnomeVFSVolume *volume,
 			   NautilusTrashDirectory *trash)
@@ -284,6 +332,8 @@ nautilus_trash_directory_instance_init (
 
 	g_signal_connect_object (volume_monitor, "volume_mounted",
 				 G_CALLBACK (volume_mounted_callback), trash, 0);
+	g_signal_connect_object (volume_monitor, "volume_changed",
+				 G_CALLBACK (volume_changed_callback), trash, 0);
 	g_signal_connect_object (volume_monitor, "volume_pre_unmount",
 				 G_CALLBACK (volume_unmount_started_callback), trash, 0);
 	g_signal_connect_object (volume_monitor, "volume_unmounted",
Index: libnautilus-private/nautilus-desktop-link.c
===================================================================
--- libnautilus-private/nautilus-desktop-link.c	(Revision 12681)
+++ libnautilus-private/nautilus-desktop-link.c	(Arbeitskopie)
@@ -28,6 +28,7 @@
 #include "nautilus-desktop-icon-file.h"
 #include "nautilus-directory-private.h"
 #include "nautilus-desktop-directory.h"
+#include "nautilus-file-private.h"
 
 #include <eel/eel-gtk-macros.h>
 #include <eel/eel-vfs-extensions.h>
@@ -191,18 +192,11 @@ nautilus_desktop_link_new (NautilusDeskt
 	return link;
 }
 
-NautilusDesktopLink *
-nautilus_desktop_link_new_from_volume (GnomeVFSVolume *volume)
+static char *
+get_filename_from_volume (GnomeVFSVolume *volume)
 {
-	NautilusDesktopLink *link;
 	GnomeVFSDrive *drive;
-	char *name, *filename;
-
-	link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL));
-	
-	link->details->type = NAUTILUS_DESKTOP_LINK_VOLUME;
-
-	link->details->volume = gnome_vfs_volume_ref (volume);
+	char *name;
 
 	/* We try to use the drive name to get somewhat stable filenames
 	   for metadata */
@@ -214,10 +208,30 @@ nautilus_desktop_link_new_from_volume (G
 	}
 	gnome_vfs_drive_unref (drive);
 
+	return name;
+}
+
+NautilusDesktopLink *
+nautilus_desktop_link_new_from_volume (GnomeVFSVolume *volume)
+{
+	NautilusDesktopLink *link;
+	char *name, *filename;
+
+	link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL));
+	
+	link->details->type = NAUTILUS_DESKTOP_LINK_VOLUME;
+
+	link->details->volume = gnome_vfs_volume_ref (volume);
+
+	/* nautilus_desktop_link_monitor_make_filename_unique will query the current filename */
+	link->details->filename = NULL;
+
+	name = get_filename_from_volume (volume);
+
 	filename = g_strconcat (name, ".volume", NULL);
 	link->details->filename =
 		nautilus_desktop_link_monitor_make_filename_unique (nautilus_desktop_link_monitor_get (),
-								    filename);
+								    filename, link);
 	g_free (filename);
 	g_free (name);
 	
@@ -231,10 +245,53 @@ nautilus_desktop_link_new_from_volume (G
 	return link;
 }
 
+void
+nautilus_desktop_link_update_from_volume (NautilusDesktopLink *link)
+{
+	char *filename;
+	char *old_filename;
+	char *name;
+	gboolean filename_changed;
+
+	g_assert (link->details->type == NAUTILUS_DESKTOP_LINK_VOLUME);
+
+	old_filename = link->details->filename;
+
+	name = get_filename_from_volume (link->details->volume);
+
+	filename = g_strconcat (name, ".volume", NULL);
+	link->details->filename =
+		nautilus_desktop_link_monitor_make_filename_unique (nautilus_desktop_link_monitor_get (),
+								    filename, link);
+	filename_changed = strcmp (old_filename, link->details->filename);
+
+	g_free (filename);
+	g_free (name);
+	g_free (old_filename);
+
+	g_free (link->details->display_name);
+	link->details->display_name = gnome_vfs_volume_get_display_name (link->details->volume);
+
+	g_free (link->details->activation_uri);
+	link->details->activation_uri = gnome_vfs_volume_get_activation_uri (link->details->volume);
+
+	g_free (link->details->icon);
+	link->details->icon = gnome_vfs_volume_get_icon (link->details->volume);
+
+	if (link->details->icon_file != NULL && filename_changed) {
+		nautilus_file_update_name (NAUTILUS_FILE (link->details->icon_file), link->details->filename);
+	}
+	nautilus_desktop_link_changed (link);
+}
+
 GnomeVFSVolume *
 nautilus_desktop_link_get_volume (NautilusDesktopLink *link)
 {
-	return gnome_vfs_volume_ref (link->details->volume);
+	if (link->details->type == NAUTILUS_DESKTOP_LINK_VOLUME) {
+		return gnome_vfs_volume_ref (link->details->volume);
+	} else {
+		return NULL;
+	}
 }
 
 
@@ -308,9 +365,33 @@ trash_state_changed_callback (NautilusTr
 gboolean
 nautilus_desktop_link_can_rename (NautilusDesktopLink     *link)
 {
-	return (link->details->type == NAUTILUS_DESKTOP_LINK_HOME ||
-		link->details->type == NAUTILUS_DESKTOP_LINK_TRASH ||
-		link->details->type == NAUTILUS_DESKTOP_LINK_COMPUTER);
+	gboolean can_rename;
+
+	switch (link->details->type) {
+	case NAUTILUS_DESKTOP_LINK_HOME:
+	case NAUTILUS_DESKTOP_LINK_TRASH:
+	case NAUTILUS_DESKTOP_LINK_COMPUTER:
+		can_rename = TRUE;
+		break;
+
+	case NAUTILUS_DESKTOP_LINK_VOLUME: {
+		GnomeVFSVolume *volume;
+
+		volume = nautilus_desktop_link_get_volume (link);
+		can_rename = gnome_vfs_volume_get_volume_type (volume) ==
+			     GNOME_VFS_VOLUME_TYPE_CONNECTED_SERVER;
+		gnome_vfs_volume_unref (volume);
+
+		break;
+	}
+
+	case NAUTILUS_DESKTOP_LINK_NETWORK:
+	default:
+		can_rename = FALSE;
+		break;
+	}
+
+	return can_rename;
 }
 
 gboolean
@@ -330,13 +411,22 @@ nautilus_desktop_link_rename (NautilusDe
 		eel_preferences_set (NAUTILUS_PREFERENCES_DESKTOP_TRASH_NAME,
 				     name);
 		break;
+	case NAUTILUS_DESKTOP_LINK_VOLUME: {
+		GnomeVFSVolume *volume;
+
+		volume = nautilus_desktop_link_get_volume (link);
+		gnome_vfs_volume_connected_server_set_display_name (volume, name);
+		gnome_vfs_volume_unref (volume);
+
+		break;
+	}
+
+	
 	default:
 		g_assert_not_reached ();
-		/* FIXME: Do we want volume renaming?
-		 * We didn't support that before. */
 		break;
 	}
-	
+
 	return TRUE;
 }
 
Index: libnautilus-private/nautilus-desktop-link.h
===================================================================
--- libnautilus-private/nautilus-desktop-link.h	(Revision 12681)
+++ libnautilus-private/nautilus-desktop-link.h	(Arbeitskopie)
@@ -62,6 +62,7 @@ GType   nautilus_desktop_link_get_type (
 
 NautilusDesktopLink *   nautilus_desktop_link_new                (NautilusDesktopLinkType  type);
 NautilusDesktopLink *   nautilus_desktop_link_new_from_volume    (GnomeVFSVolume          *volume);
+void                    nautilus_desktop_link_update_from_volume (NautilusDesktopLink     *link);
 NautilusDesktopLinkType nautilus_desktop_link_get_link_type      (NautilusDesktopLink     *link);
 char *                  nautilus_desktop_link_get_file_name      (NautilusDesktopLink     *link);
 char *                  nautilus_desktop_link_get_display_name   (NautilusDesktopLink     *link);
Index: libnautilus-private/nautilus-desktop-link-monitor.c
===================================================================
--- libnautilus-private/nautilus-desktop-link-monitor.c	(Revision 12681)
+++ libnautilus-private/nautilus-desktop-link-monitor.c	(Arbeitskopie)
@@ -53,6 +53,7 @@ struct NautilusDesktopLinkMonitorDetails
 	NautilusDesktopLink *network_link;
 
 	gulong mount_id;
+	gulong changed_id;
 	gulong unmount_id;
 	
 	GList *volume_links;
@@ -159,9 +160,9 @@ nautilus_desktop_link_monitor_delete_lin
 	}
 }
 
-static gboolean
-volume_file_name_used (NautilusDesktopLinkMonitor *monitor,
-		       const char *name)
+static NautilusDesktopLink *
+get_link_with_name (NautilusDesktopLinkMonitor *monitor,
+		    const char *name)
 {
 	GList *l;
 	char *other_name;
@@ -169,27 +170,39 @@ volume_file_name_used (NautilusDesktopLi
 
 	for (l = monitor->details->volume_links; l != NULL; l = l->next) {
 		other_name = nautilus_desktop_link_get_file_name (l->data);
+		if (other_name == NULL) {
+			/* maybe it hasn't been initalized yet */
+			continue;
+		}
+
 		same = strcmp (name, other_name) == 0;
 		g_free (other_name);
 
 		if (same) {
-			return TRUE;
+			return l->data;
 		}
 	}
 
-	return FALSE;
+	return NULL;
 }
 
 char *
 nautilus_desktop_link_monitor_make_filename_unique (NautilusDesktopLinkMonitor *monitor,
-						    const char *filename)
+						    const char *filename,
+						    NautilusDesktopLink *link)
 {
+	NautilusDesktopLink *one_link;
 	char *unique_name;
 	int i;
 	
 	i = 2;
 	unique_name = g_strdup (filename);
-	while (volume_file_name_used (monitor, unique_name)) {
+	while ((one_link = get_link_with_name (monitor, unique_name)) != NULL) {
+		if (one_link == link) {
+			/* the filename is already used for this desktop link, reuse it. */
+			return unique_name;
+		}
+
 		g_free (unique_name);
 		unique_name = g_strdup_printf ("%s.%d", filename, i++);
 	}
@@ -224,11 +237,9 @@ volume_mounted_callback (GnomeVFSVolumeM
 	create_volume_link (monitor, volume);
 }
 
-
-static void
-volume_unmounted_callback (GnomeVFSVolumeMonitor *volume_monitor,
-			   GnomeVFSVolume *volume, 
-			   NautilusDesktopLinkMonitor *monitor)
+static NautilusDesktopLink *
+lookup_volume_link (NautilusDesktopLinkMonitor *monitor,
+		    GnomeVFSVolume *volume)
 {
 	GList *l;
 	NautilusDesktopLink *link;
@@ -245,6 +256,31 @@ volume_unmounted_callback (GnomeVFSVolum
 		gnome_vfs_volume_unref (other_volume);
 	}
 
+	return link;
+}
+
+static void
+volume_changed_callback (GnomeVFSVolumeMonitor *volume_monitor,
+			 GnomeVFSVolume *volume, 
+			 NautilusDesktopLinkMonitor *monitor)
+{
+	NautilusDesktopLink *link;
+
+	link = lookup_volume_link (monitor, volume);
+	if (link != NULL) {
+		nautilus_desktop_link_update_from_volume (link);
+	}
+}
+
+
+static void
+volume_unmounted_callback (GnomeVFSVolumeMonitor *volume_monitor,
+			   GnomeVFSVolume *volume, 
+			   NautilusDesktopLinkMonitor *monitor)
+{
+	NautilusDesktopLink *link;
+
+	link = lookup_volume_link (monitor, volume);
 	if (link) {
 		monitor->details->volume_links = g_list_remove (monitor->details->volume_links, link);
 		g_object_unref (link);
@@ -422,6 +458,8 @@ nautilus_desktop_link_monitor_init (gpoi
 
 	monitor->details->mount_id = g_signal_connect_object (volume_monitor, "volume_mounted",
 							      G_CALLBACK (volume_mounted_callback), monitor, 0);
+	monitor->details->changed_id = g_signal_connect_object (volume_monitor, "volume_changed",
+							        G_CALLBACK (volume_changed_callback), monitor, 0);
 	monitor->details->unmount_id = g_signal_connect_object (volume_monitor, "volume_unmounted",
 								G_CALLBACK (volume_unmounted_callback), monitor, 0);
 
@@ -486,6 +524,9 @@ desktop_link_monitor_finalize (GObject *
 	if (monitor->details->mount_id != 0) {
 		g_source_remove (monitor->details->mount_id);
 	}
+	if (monitor->details->changed_id != 0) {
+		g_source_remove (monitor->details->changed_id);
+	}
 	if (monitor->details->unmount_id != 0) {
 		g_source_remove (monitor->details->unmount_id);
 	}
Index: libnautilus-private/nautilus-desktop-link-monitor.h
===================================================================
--- libnautilus-private/nautilus-desktop-link-monitor.h	(Revision 12681)
+++ libnautilus-private/nautilus-desktop-link-monitor.h	(Arbeitskopie)
@@ -59,6 +59,7 @@ void nautilus_desktop_link_monitor_delet
 
 /* Used by nautilus-desktop-link.c */
 char * nautilus_desktop_link_monitor_make_filename_unique (NautilusDesktopLinkMonitor *monitor,
-							   const char *filename);
+							   const char *filename,
+							   NautilusDesktopLink *link);
 
 #endif /* NAUTILUS_DESKTOP_LINK_MONITOR_H */
