diff -Npur nautilus-old/cut-n-paste-code/libegg/eggsmclient.c nautilus-new/cut-n-paste-code/libegg/eggsmclient.c
--- nautilus-old/cut-n-paste-code/libegg/eggsmclient.c	2010-04-15 16:51:11.000000000 +0800
+++ nautilus-new/cut-n-paste-code/libegg/eggsmclient.c	2010-04-15 17:38:52.000000000 +0800
@@ -175,6 +175,7 @@ egg_sm_client_class_init (EggSMClientCla
                   0);
 }
 
+static gboolean sm_client_connect = FALSE;
 static gboolean sm_client_disable = FALSE;
 static char *sm_client_state_file = NULL;
 static char *sm_client_id = NULL;
@@ -202,8 +203,10 @@ sm_client_post_parse_func (GOptionContex
    * use the same client id. */
   g_unsetenv ("DESKTOP_AUTOSTART_ID");
 
-  if (EGG_SM_CLIENT_GET_CLASS (client)->startup)
-    EGG_SM_CLIENT_GET_CLASS (client)->startup (client, sm_client_id);
+  if (sm_client_connect) {
+    if (EGG_SM_CLIENT_GET_CLASS (client)->startup)
+      EGG_SM_CLIENT_GET_CLASS (client)->startup (client, sm_client_id);
+  }
   return TRUE;
 }
 
@@ -240,6 +243,14 @@ egg_sm_client_get_option_group (void)
     { "sm-config-prefix", 0, G_OPTION_FLAG_HIDDEN,
       G_OPTION_ARG_STRING, &sm_config_prefix,
       NULL, NULL },
+    /* Normally the client is connected to the session manager
+     * automatically, when calling 'egg_sm_client_get_option_group'.
+     * One can disable this automatic connect by calling this function.
+     * Using this function should definitely be an exception. 
+     */
+    { "sm-connect", 0, 0,
+      G_OPTION_ARG_NONE, &sm_client_connect,
+      NULL, NULL }, 
     { NULL }
   };
   GOptionGroup *group;
@@ -472,6 +483,15 @@ egg_sm_client_will_quit (EggSMClient *cl
     EGG_SM_CLIENT_GET_CLASS (client)->will_quit (client, will_quit);
 }
 
+void
+egg_sm_client_startup (EggSMClient *client)
+{
+  g_return_if_fail (EGG_IS_SM_CLIENT (client));
+
+  if (EGG_SM_CLIENT_GET_CLASS (client)->startup)
+    EGG_SM_CLIENT_GET_CLASS (client)->startup (client, sm_client_id);
+}
+
 /**
  * egg_sm_client_end_session:
  * @style: a hint at how to end the session
diff -Npur nautilus-old/cut-n-paste-code/libegg/eggsmclient.h nautilus-new/cut-n-paste-code/libegg/eggsmclient.h
--- nautilus-old/cut-n-paste-code/libegg/eggsmclient.h	2010-04-15 16:51:11.000000000 +0800
+++ nautilus-new/cut-n-paste-code/libegg/eggsmclient.h	2010-04-15 17:37:26.000000000 +0800
@@ -107,6 +107,9 @@ void             egg_sm_client_set_resta
 void             egg_sm_client_will_quit           (EggSMClient *client,
 						    gboolean     will_quit);
 
+/* startup the client (connect to sm) */
+void             egg_sm_client_startup             (EggSMClient *client);
+
 /* Initiate a logout/reboot/shutdown */
 gboolean         egg_sm_client_end_session         (EggSMClientEndStyle  style,
 						    gboolean             request_confirmation);
diff -Npur nautilus-old/cut-n-paste-code/libegg/eggsmclient-xsmp.c nautilus-new/cut-n-paste-code/libegg/eggsmclient-xsmp.c
--- nautilus-old/cut-n-paste-code/libegg/eggsmclient-xsmp.c	2010-04-15 16:51:11.000000000 +0800
+++ nautilus-new/cut-n-paste-code/libegg/eggsmclient-xsmp.c	2010-04-15 17:40:10.000000000 +0800
@@ -317,6 +317,9 @@ sm_client_xsmp_startup (EggSMClient *cli
   char *ret_client_id;
   char error_string_ret[256];
 
+  if (xsmp->connection)
+    return;
+
   xsmp->client_id = g_strdup (client_id);
 
   ice_init ();
diff -Npur nautilus-old/src/file-manager/fm-desktop-icon-view.c nautilus-new/src/file-manager/fm-desktop-icon-view.c
--- nautilus-old/src/file-manager/fm-desktop-icon-view.c	2010-04-16 16:56:56.000000000 +0800
+++ nautilus-new/src/file-manager/fm-desktop-icon-view.c	2010-04-16 16:55:59.000000000 +0800
@@ -303,6 +303,39 @@ fm_desktop_icon_view_finalize (GObject *
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
+/*
+ * Create and remove a magic file that sreadahead is
+ * looking for to trigger it's exit; it turns out that
+ * sending signals to a privileged process is not as
+ * fun as all that. 
+ */
+static gboolean
+sreadahead_finish (gpointer data)
+{
+	char *path;
+	FILE *file;
+
+	path = g_build_filename (g_get_home_dir(), ".sreadahead.complete.token", NULL);
+	file = fopen (path, "w+");
+	fprintf (file, "foo\n");
+	fclose (file);
+	g_unlink (path);
+	g_free (path);
+
+	return FALSE;
+}
+
+static gboolean
+first_expose_event_callback (GtkWidget *widget,
+		   GdkEventExpose *event,
+		   gpointer user_data)
+{
+	g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (first_expose_event_callback), NULL);
+	g_timeout_add (500, sreadahead_finish, NULL);
+
+	return FALSE;
+}
+
 static void
 fm_desktop_icon_view_class_init (FMDesktopIconViewClass *class)
 {
@@ -588,7 +621,10 @@ fm_desktop_icon_view_init (FMDesktopIcon
 				 G_CALLBACK (realized_callback), desktop_icon_view, 0);
 	g_signal_connect_object (desktop_icon_view, "unrealize",
 				 G_CALLBACK (unrealized_callback), desktop_icon_view, 0);
-	
+
+	g_signal_connect        (icon_container, "expose_event",
+				 G_CALLBACK (first_expose_event_callback), NULL);
+
 	eel_preferences_add_callback (NAUTILUS_PREFERENCES_ICON_VIEW_DEFAULT_ZOOM_LEVEL,
 				      default_zoom_level_changed,
 				      desktop_icon_view);
diff -Npur nautilus-old/src/nautilus-main.c nautilus-new/src/nautilus-main.c
--- nautilus-old/src/nautilus-main.c	2010-04-16 17:01:14.000000000 +0800
+++ nautilus-new/src/nautilus-main.c	2010-04-16 17:01:02.000000000 +0800
@@ -315,6 +315,13 @@ setup_debug_log (void)
 	setup_debug_log_glog ();
 }
 
+static gboolean
+startup_done_cb (EggSMClient *client)
+{
+	egg_sm_client_startup  (client);
+	return FALSE;
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -541,6 +548,11 @@ main (int argc, char *argv[])
 		}
 
 		if (is_event_loop_needed ()) {
+			/* Register with the session manager when we're done bringing up the
+			 * desktop. This means we don't have to compete for resources with the
+			 * application startup phase, so the desktop comes up sooner. */
+			g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc) startup_done_cb, application->smclient, NULL);
+
 			gtk_main ();
 		}
 	}
