diff --git a/libnautilus-private/apps_nautilus_preferences.schemas.in b/libnautilus-private/apps_nautilus_preferences.schemas.in
index 3d29742..647f320 100644
--- a/libnautilus-private/apps_nautilus_preferences.schemas.in
+++ b/libnautilus-private/apps_nautilus_preferences.schemas.in
@@ -1115,6 +1115,21 @@ most cases, this should be left alone. -->Sans 10</default>
     </schema>
 
     <schema>
+      <key>/schemas/apps/nautilus/desktop/susedocs_icon_visible</key>
+      <applyto>/apps/nautilus/desktop/susedocs_icon_visible</applyto>
+      <owner>nautilus</owner>
+      <type>bool</type>
+      <default>true</default>
+      <locale name="C">
+      	<short>SUSE documentation icon visible on the desktop</short>
+	<long>
+	  If this is set to true, an icon linking to the SUSE documentation
+	  will be put on the desktop.
+	</long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/nautilus/desktop/computer_icon_name</key>
       <applyto>/apps/nautilus/desktop/computer_icon_name</applyto>
       <owner>nautilus</owner>
@@ -1171,6 +1186,20 @@ most cases, this should be left alone. -->Sans 10</default>
     </schema>
 
     <schema>
+      <key>/schemas/apps/nautilus/desktop/susedocs_icon_name</key>
+      <applyto>/apps/nautilus/desktop/susedocs_icon_name</applyto>
+      <owner>nautilus</owner>
+      <type>string</type>
+      <locale name="C">
+         <short>SUSE documentation icon name</short>
+         <long>
+          This name can be set if you want a custom name
+	  for the SUSE documentation icon on the desktop.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/nautilus/desktop/text_ellipsis_limit</key>
       <applyto>/apps/nautilus/desktop/text_ellipsis_limit</applyto>
       <type>int</type>
diff --git a/libnautilus-private/nautilus-desktop-link-monitor.c b/libnautilus-private/nautilus-desktop-link-monitor.c
index 8fff897..eda294e 100644
--- a/libnautilus-private/nautilus-desktop-link-monitor.c
+++ b/libnautilus-private/nautilus-desktop-link-monitor.c
@@ -50,6 +50,7 @@ struct NautilusDesktopLinkMonitorDetails {
 	NautilusDesktopLink *computer_link;
 	NautilusDesktopLink *trash_link;
 	NautilusDesktopLink *network_link;
+	NautilusDesktopLink *susedocs_link;
 
 	gulong mount_id;
 	gulong unmount_id;
@@ -138,6 +139,7 @@ nautilus_desktop_link_monitor_delete_link (NautilusDesktopLinkMonitor *monitor,
 	case NAUTILUS_DESKTOP_LINK_COMPUTER:
 	case NAUTILUS_DESKTOP_LINK_TRASH:
 	case NAUTILUS_DESKTOP_LINK_NETWORK:
+	case NAUTILUS_DESKTOP_LINK_SUSEDOCS:
 		/* just ignore. We don't allow you to delete these */
 		break;
 	default:
@@ -449,6 +451,19 @@ desktop_network_visible_changed (gpointer callback_data)
 }
 
 static void
+desktop_susedocs_visible_changed (gpointer callback_data)
+{
+	NautilusDesktopLinkMonitor *monitor;
+
+	monitor = NAUTILUS_DESKTOP_LINK_MONITOR (callback_data);
+
+	update_link_visibility (NAUTILUS_DESKTOP_LINK_MONITOR (callback_data),
+				&monitor->details->susedocs_link,
+				NAUTILUS_DESKTOP_LINK_SUSEDOCS,
+				NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_VISIBLE);
+}
+
+static void
 desktop_volumes_visible_changed (gpointer callback_data)
 {
 	NautilusDesktopLinkMonitor *monitor;
@@ -538,6 +553,12 @@ nautilus_desktop_link_monitor_init (gpointer object, gpointer klass)
 					desktop_network_visible_changed,
 					monitor);
 
+	create_link_and_add_preference (&monitor->details->susedocs_link,
+					NAUTILUS_DESKTOP_LINK_SUSEDOCS,
+					NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_VISIBLE,
+					desktop_susedocs_visible_changed,
+					monitor);
+
         /* Fake mount */
 	client = gconf_client_get_default ();
 	dirs = gconf_client_all_dirs (client, NAUTILUS_DESKTOP_METADATA_GCONF_PATH, NULL);
@@ -631,6 +652,11 @@ desktop_link_monitor_finalize (GObject *object)
 				    desktop_network_visible_changed,
 				    monitor);
 
+	remove_link_and_preference (&monitor->details->susedocs_link,
+				    NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_VISIBLE,
+				    desktop_susedocs_visible_changed,
+				    monitor);
+
 	/* Mounts */
 
 	g_list_foreach (monitor->details->mount_links, (GFunc)g_object_unref, NULL);
diff --git a/libnautilus-private/nautilus-desktop-link.c b/libnautilus-private/nautilus-desktop-link.c
index 6c23344..d811a89 100644
--- a/libnautilus-private/nautilus-desktop-link.c
+++ b/libnautilus-private/nautilus-desktop-link.c
@@ -162,10 +162,89 @@ network_name_changed (gpointer callback_data)
 	nautilus_desktop_link_changed (link);
 }
 
+static void
+susedocs_name_changed (gpointer callback_data)
+{
+	NautilusDesktopLink *link;
+
+	link = NAUTILUS_DESKTOP_LINK (callback_data);
+	g_assert (link->details->type == NAUTILUS_DESKTOP_LINK_SUSEDOCS);
+
+	g_free (link->details->display_name);
+	link->details->display_name = eel_preferences_get (NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_NAME);
+	nautilus_desktop_link_changed (link);
+}
+
+#define SUSEDOCS_DIR "/usr/share/doc/manual"
+
+static gchar *susedocs_path = NULL;
+
+static const gchar *
+get_susedocs_path (void)
+{
+	const gchar * const *langs;
+	const gchar *name;
+	gchar *best_name = NULL;
+	gint best_lang_index = G_MAXINT;
+	GDir *dir;
+
+	if (susedocs_path)
+		return susedocs_path;
+
+	langs = g_get_language_names ();
+
+	dir = g_dir_open (SUSEDOCS_DIR, 0, NULL);
+	if (!dir)
+		goto out;
+
+	while ((name = g_dir_read_name (dir))) {
+		gint i;
+
+		for (i = 0; i < best_lang_index && langs [i]; i++) {
+			gchar *lang_suffix = g_strdup_printf ("manuals_%s", langs [i]);
+			gboolean has_suffix = g_str_has_suffix (name, lang_suffix);
+			g_free (lang_suffix);
+
+			if (has_suffix)
+				break;
+		}
+
+		if (i < best_lang_index ||
+		    (i == best_lang_index &&
+		     (g_str_has_suffix (name, "manuals_en") ||
+		      (best_name && !strstr (best_name, "manuals") && strstr (name, "manuals"))))) {
+			g_free (best_name);
+			best_name = g_strdup (name);
+			best_lang_index = i;
+		}
+	}
+
+	if (best_name) {
+		susedocs_path = g_build_filename (SUSEDOCS_DIR, best_name, "manual", "index.html", NULL);
+
+		if (!g_file_test (susedocs_path, G_FILE_TEST_EXISTS)) {
+			g_free (susedocs_path);
+			susedocs_path = g_build_filename (SUSEDOCS_DIR, best_name, "index.html", NULL);
+		}
+
+		if (!g_file_test (susedocs_path, G_FILE_TEST_EXISTS)) {
+			g_free (susedocs_path);
+			susedocs_path = NULL;
+		}
+	}
+
+out:
+	g_free (best_name);
+	if (dir)
+		g_dir_close (dir);
+	return susedocs_path;
+}
+
 NautilusDesktopLink *
 nautilus_desktop_link_new (NautilusDesktopLinkType type)
 {
 	NautilusDesktopLink *link;
+	const gchar *path;
 
 	link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL));
 
@@ -222,12 +301,30 @@ nautilus_desktop_link_new (NautilusDesktopLinkType type)
 					      link);
 		break;
 
+	case NAUTILUS_DESKTOP_LINK_SUSEDOCS:
+		path = get_susedocs_path ();
+		if (path) {
+			link->details->filename = g_strdup ("susedocs");
+			link->details->display_name = eel_preferences_get (NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_NAME);
+			link->details->activation_location = g_file_new_for_path (path);
+			link->details->icon = g_themed_icon_new (NAUTILUS_ICON_SUSEDOCS);
+
+			eel_preferences_add_callback (NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_NAME,
+						      susedocs_name_changed,
+						      link);
+		} else {
+			g_object_unref (link);
+			link = NULL;
+		}
+		break;
+
 	default:
 	case NAUTILUS_DESKTOP_LINK_MOUNT:
 		g_assert_not_reached();
 	}
 
-	create_icon_file (link);
+	if (link)
+		create_icon_file (link);
 
 	return link;
 }
@@ -435,6 +532,7 @@ 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_NETWORK ||
+		link->details->type == NAUTILUS_DESKTOP_LINK_SUSEDOCS ||
 		link->details->type == NAUTILUS_DESKTOP_LINK_COMPUTER);
 }
 
@@ -465,6 +563,10 @@ nautilus_desktop_link_rename (NautilusDesktopLink     *link,
 		eel_preferences_set (NAUTILUS_PREFERENCES_DESKTOP_NETWORK_NAME,
 				     name);
 		break;
+	case NAUTILUS_DESKTOP_LINK_SUSEDOCS:
+		eel_preferences_set (NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_NAME,
+				     name);
+		break;
 	default:
 		g_assert_not_reached ();
 		/* FIXME: Do we want volume renaming?
@@ -525,6 +627,12 @@ desktop_link_finalize (GObject *object)
 						 link);
 	}
 
+	if (link->details->type == NAUTILUS_DESKTOP_LINK_SUSEDOCS) {
+		eel_preferences_remove_callback (NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_NAME,
+						 susedocs_name_changed,
+						 link);
+	}
+
 	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 efb8ab8..b8b9c7f 100644
--- a/libnautilus-private/nautilus-desktop-link.h
+++ b/libnautilus-private/nautilus-desktop-link.h
@@ -56,7 +56,8 @@ typedef enum {
 	NAUTILUS_DESKTOP_LINK_COMPUTER,
 	NAUTILUS_DESKTOP_LINK_TRASH,
 	NAUTILUS_DESKTOP_LINK_MOUNT,
-	NAUTILUS_DESKTOP_LINK_NETWORK
+	NAUTILUS_DESKTOP_LINK_NETWORK,
+	NAUTILUS_DESKTOP_LINK_SUSEDOCS
 } NautilusDesktopLinkType;
 
 GType   nautilus_desktop_link_get_type (void);
diff --git a/libnautilus-private/nautilus-global-preferences.c b/libnautilus-private/nautilus-global-preferences.c
index 46bdf70..1d2f047 100644
--- a/libnautilus-private/nautilus-global-preferences.c
+++ b/libnautilus-private/nautilus-global-preferences.c
@@ -53,6 +53,7 @@ static gpointer default_home_link_name                   (void);
 static gpointer default_computer_link_name               (void);
 static gpointer default_trash_link_name                  (void);
 static gpointer default_network_link_name                (void);
+static gpointer default_susedocs_link_name               (void);
 
 
 /* An enumeration used for installing type specific preferences defaults. */
@@ -528,6 +529,17 @@ static const PreferenceDefault preference_defaults[] = {
 	  default_network_link_name, g_free,
 	},
 
+	{ NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_VISIBLE,
+	  PREFERENCE_BOOLEAN,
+	  GINT_TO_POINTER (TRUE)
+	},
+
+	{ NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_NAME,
+	  PREFERENCE_STRING,
+	  NULL,
+	  default_susedocs_link_name, g_free,
+	},
+
 	{ NAUTILUS_PREFERENCES_MEDIA_AUTOMOUNT,
 	  PREFERENCE_BOOLEAN,
 	  GINT_TO_POINTER (TRUE)
@@ -607,6 +619,11 @@ default_network_link_name (void)
 	return g_strdup (_("Network Servers"));
 }
 
+static gpointer
+default_susedocs_link_name (void)
+{
+	return g_strdup (_("SUSE Linux Manual"));
+}
 
 
 /**
diff --git a/libnautilus-private/nautilus-global-preferences.h b/libnautilus-private/nautilus-global-preferences.h
index 513fd53..35c3bd2 100644
--- a/libnautilus-private/nautilus-global-preferences.h
+++ b/libnautilus-private/nautilus-global-preferences.h
@@ -229,6 +229,8 @@ typedef enum
 #define NAUTILUS_PREFERENCES_DESKTOP_VOLUMES_VISIBLE	   "desktop/volumes_visible"
 #define NAUTILUS_PREFERENCES_DESKTOP_NETWORK_VISIBLE       "desktop/network_icon_visible"
 #define NAUTILUS_PREFERENCES_DESKTOP_NETWORK_NAME          "desktop/network_icon_name"
+#define NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_VISIBLE      "desktop/susedocs_icon_visible"
+#define NAUTILUS_PREFERENCES_DESKTOP_SUSEDOCS_NAME         "desktop/susedocs_icon_name"
 
 /* Lockdown */
 #define NAUTILUS_PREFERENCES_LOCKDOWN_COMMAND_LINE         "/desktop/gnome/lockdown/disable_command_line"
diff --git a/libnautilus-private/nautilus-icon-names.h b/libnautilus-private/nautilus-icon-names.h
index 333489b..0ca5e17 100644
--- a/libnautilus-private/nautilus-icon-names.h
+++ b/libnautilus-private/nautilus-icon-names.h
@@ -10,6 +10,7 @@
 #define NAUTILUS_ICON_HOME		"user-home"
 #define NAUTILUS_ICON_NETWORK		"network-workgroup"
 #define NAUTILUS_ICON_NETWORK_SERVER	"network-server"
+#define NAUTILUS_ICON_SUSEDOCS		"help"
 #define NAUTILUS_ICON_SEARCH		"system-search"
 #define NAUTILUS_ICON_TRASH		"user-trash"
 #define NAUTILUS_ICON_TRASH_FULL	"user-trash-full"
