diff --git a/libnautilus-private/nautilus-desktop-icon-file.c b/libnautilus-private/nautilus-desktop-icon-file.c
index 512eb67..a4cf2f5 100644
--- a/libnautilus-private/nautilus-desktop-icon-file.c
+++ b/libnautilus-private/nautilus-desktop-icon-file.c
@@ -183,7 +183,10 @@ update_info_from_link (NautilusDesktopIconFile *icon_file)
 	file->details->can_write = TRUE;
 
 	file->details->can_mount = FALSE;
-	file->details->can_unmount = FALSE;
+	if (nautilus_desktop_link_get_link_type (link) == NAUTILUS_DESKTOP_LINK_MOUNT)
+		file->details->can_unmount = TRUE;
+	else
+		file->details->can_unmount = FALSE;
 	file->details->can_eject = FALSE;
 	if (file->details->mount) {
 		g_object_unref (file->details->mount);
@@ -317,12 +320,16 @@ nautilus_desktop_icon_file_unmount (NautilusFile                   *file,
 	
 	desktop_file = NAUTILUS_DESKTOP_ICON_FILE (file);
 	if (desktop_file) {
-		mount = nautilus_desktop_link_get_mount (desktop_file->details->link);
-		if (mount != NULL) {
-			nautilus_file_operations_unmount_mount (NULL, mount, FALSE, TRUE);
+		if (nautilus_desktop_link_is_fake (desktop_file->details->link)) {
+			nautilus_desktop_link_unstick (desktop_file->details->link);
+		} else {
+			mount = nautilus_desktop_link_get_mount (desktop_file->details->link);
+			if (mount != NULL) {
+				nautilus_file_operations_unmount_mount (NULL, mount, FALSE, TRUE);
+			}
 		}
 	}
-	
+
 }
 
 static void
diff --git a/libnautilus-private/nautilus-desktop-link-monitor.c b/libnautilus-private/nautilus-desktop-link-monitor.c
index 43f713e..8fff897 100644
--- a/libnautilus-private/nautilus-desktop-link-monitor.c
+++ b/libnautilus-private/nautilus-desktop-link-monitor.c
@@ -29,6 +29,7 @@
 #include "nautilus-directory.h"
 #include "nautilus-desktop-directory.h"
 #include "nautilus-global-preferences.h"
+#include "nautilus-metadata.h"
 
 #include <eel/eel-debug.h>
 #include <eel/eel-gtk-macros.h>
@@ -199,25 +200,126 @@ has_mount (NautilusDesktopLinkMonitor *monitor,
 			ret = TRUE;
 			break;
 		}
-		g_object_unref (other_mount);
+		if (other_mount)
+			g_object_unref (other_mount);
 	}
 
 	return ret;
 }
 
 static void
+save_mount_metadata (NautilusDesktopLink *link,
+		     GMount *mount)
+{
+	NautilusFile *file;
+	gchar *str;
+	GFile *root;
+	GIcon *icon;
+
+	file = nautilus_desktop_link_get_icon_file (link);
+
+	root = g_mount_get_root (mount);
+	str = g_file_get_uri (root);
+	nautilus_file_set_metadata (file, "uri", str, NULL);
+	g_free (str);
+	g_object_unref (root);
+
+	str = nautilus_file_get_display_name (file);
+	nautilus_file_set_metadata (file, "display_name", str, NULL);
+	g_free (str);
+
+	icon = nautilus_desktop_link_get_icon (link);
+	str = g_icon_to_string (icon);
+	nautilus_file_set_metadata (file, "icon_string", str, NULL);
+	g_free (str);
+	g_object_unref (icon);
+
+	str = nautilus_desktop_link_get_file_name (link);
+	nautilus_file_set_metadata (file, "filename", str, NULL);
+	g_free (str);
+
+	nautilus_file_set_metadata (file, "stick", "TRUE", NULL);
+}
+
+void
+nautilus_desktop_link_monitor_unstick_link (NautilusDesktopLinkMonitor *monitor,
+                                            NautilusDesktopLink        *link)
+{
+	monitor->details->mount_links = g_list_remove (monitor->details->mount_links, link);
+	g_object_unref (link);
+}
+
+static NautilusDesktopLink*
+uri_in_mount_links_exist (NautilusDesktopLinkMonitor *monitor,
+                          gchar *name)
+{
+	GList *l;
+	char *other_name;
+	gboolean same;
+
+	for (l = monitor->details->mount_links; l != NULL; l = l->next) {
+		if (!nautilus_desktop_link_is_fake (l->data))
+			continue;
+		other_name = nautilus_desktop_link_get_uri (l->data);
+		same = strcmp (name, other_name) == 0;
+		g_free (other_name);
+
+		if (same) {
+			return l->data;
+		}
+	}
+
+	return NULL;
+}
+
+gboolean
+file_is_locale (GFile *file)
+{
+	char  *scheme;
+        gboolean ret = TRUE;
+
+        scheme = g_file_get_uri_scheme (file);
+        if (!strcmp (scheme, "ftp") ||
+            !strcmp (scheme, "http") ||
+            !strcmp (scheme, "network") ||
+            !strcmp (scheme, "nvvfs") ||
+            !strcmp (scheme, "sftp") ||
+            !strcmp (scheme, "smb")) {
+            ret = FALSE;
+        }
+
+        g_free (scheme);
+        return ret;
+}
+
+static void
 create_mount_link (NautilusDesktopLinkMonitor *monitor,
 		   GMount *mount)
 {
 	NautilusDesktopLink *link;
+	NautilusDesktopLink *fake;
+	GFile *file;
+	char  *uri;
+	GFile *root;
 
 	if (has_mount (monitor, mount))
 		return;
 
 	if ((!g_mount_is_shadowed (mount)) &&
-	    eel_preferences_get_boolean (NAUTILUS_PREFERENCES_DESKTOP_VOLUMES_VISIBLE)) {
-		link = nautilus_desktop_link_new_from_mount (mount);
-		monitor->details->mount_links = g_list_prepend (monitor->details->mount_links, link);
+	      eel_preferences_get_boolean (NAUTILUS_PREFERENCES_DESKTOP_VOLUMES_VISIBLE)) {
+		root = g_mount_get_root (mount);
+		uri = g_file_get_uri (root);
+
+		if ((fake = uri_in_mount_links_exist (monitor, uri)) != NULL) {
+			nautilus_desktop_link_fake_to_real (fake, mount);
+		} else {
+			link = nautilus_desktop_link_new_from_mount (mount);
+			monitor->details->mount_links = g_list_prepend (monitor->details->mount_links, link);
+                        if (!file_is_locale (root))
+			    save_mount_metadata (link, mount);
+		}
+		g_free (uri);
+		g_object_unref (root);
 	}
 }
 
@@ -241,8 +343,7 @@ remove_mount_link (NautilusDesktopLinkMonitor *monitor,
 	}
 
 	if (link) {
-		monitor->details->mount_links = g_list_remove (monitor->details->mount_links, link);
-		g_object_unref (link);
+		nautilus_desktop_link_unstick (link);
 	}
 }
 
@@ -384,13 +485,21 @@ create_link_and_add_preference (NautilusDesktopLink   **link_ref,
 
 	eel_preferences_add_callback (preference_key, callback, callback_data);
 }
-	     
+
 static void
 nautilus_desktop_link_monitor_init (gpointer object, gpointer klass)
 {
 	NautilusDesktopLinkMonitor *monitor;
 	GList *l, *mounts;
 	GMount *mount;
+	GConfClient *client;
+	GSList *dirs, *sl;
+	const char *key;
+	gchar *value;
+	gchar *dir;
+	gchar *path;
+	NautilusDesktopLink *link;
+	gchar *filename;
 
 	monitor = NAUTILUS_DESKTOP_LINK_MONITOR (object);
 
@@ -429,6 +538,29 @@ nautilus_desktop_link_monitor_init (gpointer object, gpointer klass)
 					desktop_network_visible_changed,
 					monitor);
 
+        /* Fake mount */
+	client = gconf_client_get_default ();
+	dirs = gconf_client_all_dirs (client, NAUTILUS_DESKTOP_METADATA_GCONF_PATH, NULL);
+	for (sl = dirs; sl != NULL; sl = sl->next) {
+		dir = sl->data;
+
+		path = g_build_filename (dir, "stick", NULL);
+		value = gconf_client_get_string (client, path, NULL);
+		g_free (path);
+
+		if (value == NULL )
+			continue;
+
+		if (g_strcmp0 (value, "TRUE")) {
+			g_free (value);
+			continue;
+		}
+		g_free (value);
+
+		link = nautilus_desktop_link_new_fake_mount (dir);
+		monitor->details->mount_links = g_list_prepend (monitor->details->mount_links, link);
+	}
+
 	/* Mount links */
 
 	mounts = g_volume_monitor_get_mounts (monitor->details->volume_monitor);
@@ -452,7 +584,6 @@ nautilus_desktop_link_monitor_init (gpointer object, gpointer klass)
 	monitor->details->changed_id =
 		g_signal_connect_object (monitor->details->volume_monitor, "mount_changed",
 					 G_CALLBACK (mount_changed_callback), monitor, 0);
-
 }
 
 static void
diff --git a/libnautilus-private/nautilus-desktop-link-monitor.h b/libnautilus-private/nautilus-desktop-link-monitor.h
index c9865cd..44caa45 100644
--- a/libnautilus-private/nautilus-desktop-link-monitor.h
+++ b/libnautilus-private/nautilus-desktop-link-monitor.h
@@ -62,4 +62,6 @@ void nautilus_desktop_link_monitor_delete_link (NautilusDesktopLinkMonitor *moni
 char * nautilus_desktop_link_monitor_make_filename_unique (NautilusDesktopLinkMonitor *monitor,
 							   const char *filename);
 
+void nautilus_desktop_link_monitor_unstick_link (NautilusDesktopLinkMonitor *monitor,
+						 NautilusDesktopLink        *link);
 #endif /* NAUTILUS_DESKTOP_LINK_MONITOR_H */
diff --git a/libnautilus-private/nautilus-desktop-link.c b/libnautilus-private/nautilus-desktop-link.c
index a58f4ce..6c23344 100644
--- a/libnautilus-private/nautilus-desktop-link.c
+++ b/libnautilus-private/nautilus-desktop-link.c
@@ -50,6 +50,10 @@ struct NautilusDesktopLinkDetails {
 
 	/* Just for mount icons: */
 	GMount *mount;
+	gchar *uri;
+	gchar *icon_string;
+	gboolean is_fake;
+	gchar *gconf_dir;
 };
 
 G_DEFINE_TYPE(NautilusDesktopLink, nautilus_desktop_link, G_TYPE_OBJECT)
@@ -228,6 +232,93 @@ nautilus_desktop_link_new (NautilusDesktopLinkType type)
 	return link;
 }
 
+gboolean
+nautilus_desktop_link_is_fake (NautilusDesktopLink *link)
+{
+	return link->details->is_fake;
+}
+
+char *
+nautilus_desktop_link_get_uri (NautilusDesktopLink *link)
+{
+	return g_strdup (link->details->uri);
+}
+
+
+void
+nautilus_desktop_link_fake_to_real (NautilusDesktopLink *link, GMount *mount)
+{
+	if (link->details->type != NAUTILUS_DESKTOP_LINK_MOUNT ||
+	    link->details->is_fake == FALSE)
+		return;
+
+	link->details->mount = g_object_ref (mount);
+
+	link->details->signal_handler_obj = G_OBJECT (mount);
+	link->details->signal_handler =
+		g_signal_connect (mount, "changed",
+				G_CALLBACK (mount_changed_callback), link);
+
+	nautilus_desktop_icon_file_update (link->details->icon_file);
+	link->details->is_fake = FALSE;
+}
+
+void
+nautilus_desktop_link_unstick (NautilusDesktopLink *link)
+{
+	GConfClient *client;
+	NautilusFile *file;
+	NautilusDesktopLinkMonitor *monitor;
+
+	if (link->details->type != NAUTILUS_DESKTOP_LINK_MOUNT)
+		return;
+
+	file = nautilus_desktop_link_get_icon_file (link);
+	nautilus_file_set_metadata (file, "stick", "FALSE", NULL);
+
+	monitor = nautilus_desktop_link_monitor_get ();
+	nautilus_desktop_link_monitor_unstick_link (monitor, link);
+}
+
+NautilusDesktopLink *
+nautilus_desktop_link_new_fake_mount (gchar *gconf_dir)
+{
+	NautilusDesktopLink *link;
+	GConfClient *client;
+	gchar *gconf_path;
+	gchar *url;
+
+	link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL));
+	link->details->type = NAUTILUS_DESKTOP_LINK_MOUNT;
+	link->details->is_fake = TRUE;
+
+	client = gconf_client_get_default ();
+	link->details->gconf_dir = g_strdup (gconf_dir);
+
+	gconf_path = g_build_filename (gconf_dir, "uri", NULL);
+	link->details->uri = gconf_client_get_string (client, gconf_path, NULL);
+	g_free (gconf_path);
+
+	gconf_path = g_build_filename (gconf_dir, "display_name", NULL);
+	link->details->display_name = gconf_client_get_string (client, gconf_path, NULL);
+	g_free (gconf_path);
+
+	gconf_path = g_build_filename (gconf_dir, "icon_string", NULL);
+	link->details->icon_string = gconf_client_get_string (client, gconf_path, NULL);
+	g_free (gconf_path);
+
+	gconf_path = g_build_filename (gconf_dir, "filename", NULL);
+	link->details->filename = gconf_client_get_string (client, gconf_path, NULL);
+	g_free (gconf_path);
+
+	link->details->icon = g_icon_new_for_string (link->details->icon_string, NULL);
+	link->details->activation_location = g_file_new_for_uri (link->details->uri);
+
+	create_icon_file (link);
+	return link;
+}
+
+
 NautilusDesktopLink *
 nautilus_desktop_link_new_from_mount (GMount *mount)
 {
@@ -238,6 +329,7 @@ nautilus_desktop_link_new_from_mount (GMount *mount)
 	link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL));
 	
 	link->details->type = NAUTILUS_DESKTOP_LINK_MOUNT;
+	link->details->is_fake = FALSE;
 
 	link->details->mount = g_object_ref (mount);
 
@@ -346,6 +438,12 @@ nautilus_desktop_link_can_rename (NautilusDesktopLink     *link)
 		link->details->type == NAUTILUS_DESKTOP_LINK_COMPUTER);
 }
 
+NautilusFile *
+nautilus_desktop_link_get_icon_file (NautilusDesktopLink *link)
+{
+	return NAUTILUS_FILE (link->details->icon_file);
+}
+
 gboolean
 nautilus_desktop_link_rename (NautilusDesktopLink     *link,
 			      const char              *name)
@@ -427,7 +525,8 @@ desktop_link_finalize (GObject *object)
 						 link);
 	}
 
-	if (link->details->type == NAUTILUS_DESKTOP_LINK_MOUNT) {
+	if (link->details->type == NAUTILUS_DESKTOP_LINK_MOUNT &&
+	    link->details->mount != NULL) {
 		g_object_unref (link->details->mount);
 	}
 
diff --git a/libnautilus-private/nautilus-desktop-link.h b/libnautilus-private/nautilus-desktop-link.h
index 5327eca..efb8ab8 100644
--- a/libnautilus-private/nautilus-desktop-link.h
+++ b/libnautilus-private/nautilus-desktop-link.h
@@ -63,6 +63,7 @@ GType   nautilus_desktop_link_get_type (void);
 
 NautilusDesktopLink *   nautilus_desktop_link_new                     (NautilusDesktopLinkType  type);
 NautilusDesktopLink *   nautilus_desktop_link_new_from_mount          (GMount                 *mount);
+NautilusDesktopLink *   nautilus_desktop_link_new_fake_mount          (gchar *gconf_name);
 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);
@@ -77,5 +78,12 @@ gboolean                nautilus_desktop_link_can_rename              (NautilusD
 gboolean                nautilus_desktop_link_rename                  (NautilusDesktopLink     *link,
 								       const char              *name);
 
+NautilusFile *          nautilus_desktop_link_get_icon_file           (NautilusDesktopLink     *link);
+gboolean                nautilus_desktop_link_is_fake                 (NautilusDesktopLink     *link);
+void                    nautilus_desktop_link_fake_to_real            (NautilusDesktopLink     *link,
+								       GMount *mount);
+char *                  nautilus_desktop_link_get_uri                 (NautilusDesktopLink     *link);
+void                    nautilus_desktop_link_unstick                 (NautilusDesktopLink     *link);
+
 
 #endif /* NAUTILUS_DESKTOP_LINK_H */
