diff -ur daemon.orig/gdm-server.c daemon/gdm-server.c
--- daemon.orig/gdm-server.c	2015-04-02 06:52:39.000000000 -0700
+++ daemon/gdm-server.c	2015-05-04 12:11:56.000000000 -0700
@@ -94,6 +94,7 @@
         char    *auth_file;
 
         guint    child_watch_id;
+        guint    sigusr1_id;
 
         gboolean is_initial;
 };
@@ -179,83 +180,15 @@
         return g_strdup (server->priv->display_device);
 }
 
-static void
-gdm_server_ready (GdmServer *server)
-{
-        g_debug ("GdmServer: Got USR1 from X server - emitting READY");
-
-        gdm_run_script (GDMCONFDIR "/Init", GDM_USERNAME,
-                        server->priv->display_name,
-                        NULL, /* hostname */
-                        server->priv->auth_file);
-
-        g_signal_emit (server, signals[READY], 0);
-}
-
-static GSList *active_servers;
-static gboolean sigusr1_thread_running;
-static GCond sigusr1_thread_cond;
-static GMutex sigusr1_thread_mutex;
-
 static gboolean
-got_sigusr1 (gpointer user_data)
+on_sigusr1(gpointer user_data)
 {
-        GPid pid = GPOINTER_TO_UINT (user_data);
-        GSList *l;
-
-        g_debug ("GdmServer: got SIGUSR1 from PID %d", pid);
-
-        for (l = active_servers; l; l = l->next) {
-                GdmServer *server = l->data;
-
-                if (server->priv->pid == pid)
-                        gdm_server_ready (server);
-        }
-
-        return G_SOURCE_REMOVE;
-}
-
-static gpointer
-sigusr1_thread_main (gpointer user_data)
-{
-        sigset_t sigusr1_mask;
-
-        /* Handle only SIGUSR1 */
-        sigemptyset (&sigusr1_mask);
-        sigaddset (&sigusr1_mask, SIGUSR1);
-        sigprocmask (SIG_SETMASK, &sigusr1_mask, NULL);
-
-        g_mutex_lock (&sigusr1_thread_mutex);
-        sigusr1_thread_running = TRUE;
-        g_cond_signal (&sigusr1_thread_cond);
-        g_mutex_unlock (&sigusr1_thread_mutex);
-
-        /* Spin waiting for a SIGUSR1 */
-        while (TRUE) {
-                siginfo_t info;
-
-                if (sigwaitinfo (&sigusr1_mask, &info) == -1)
-                        continue;
+        GdmServer *server = user_data;
 
-                g_idle_add (got_sigusr1, GUINT_TO_POINTER (info.si_pid));
-        }
-
-        return NULL;
-}
-
-static void
-gdm_server_launch_sigusr1_thread_if_needed (void)
-{
-        static GThread *sigusr1_thread;
-
-        if (sigusr1_thread == NULL) {
-                sigusr1_thread = g_thread_new ("gdm SIGUSR1 catcher", sigusr1_thread_main, NULL);
+        g_debug ("GdmServer: Got USR1 from X server - emitting READY");
 
-                g_mutex_lock (&sigusr1_thread_mutex);
-                while (!sigusr1_thread_running)
-                        g_cond_wait (&sigusr1_thread_cond, &sigusr1_thread_mutex);
-                g_mutex_unlock (&sigusr1_thread_mutex);
-        }
+        g_signal_emit (server, signals[READY], 0);
+        return FALSE;
 }
 
 static void
@@ -709,12 +642,6 @@
         g_object_unref (server);
 }
 
-static void
-prune_active_servers_list (GdmServer *server)
-{
-        active_servers = g_slist_remove (active_servers, server);
-}
-
 static gboolean
 gdm_server_spawn (GdmServer    *server,
                   const char   *vtarg,
@@ -752,15 +679,6 @@
         g_debug ("GdmServer: Starting X server process: %s", freeme);
         g_free (freeme);
 
-        active_servers = g_slist_append (active_servers, server);
-
-        g_object_weak_ref (G_OBJECT (server),
-                           (GWeakNotify)
-                           prune_active_servers_list,
-                           server);
-
-        gdm_server_launch_sigusr1_thread_if_needed ();
-
         if (!g_spawn_async_with_pipes (NULL,
                                        argv,
                                        (char **)env->pdata,
@@ -1096,11 +1014,16 @@
 static void
 gdm_server_init (GdmServer *server)
 {
+
         server->priv = GDM_SERVER_GET_PRIVATE (server);
 
         server->priv->pid = -1;
 
         server->priv->log_dir = g_strdup (LOGDIR);
+
+        server->priv->sigusr1_id = g_unix_signal_add (SIGUSR1,
+                                                      on_sigusr1,
+                                                      server);
 }
 
 static void
@@ -1115,6 +1038,9 @@
 
         g_return_if_fail (server->priv != NULL);
 
+        if (server->priv->sigusr1_id > 0)
+                g_source_remove (server->priv->sigusr1_id);
+
         gdm_server_stop (server);
 
         g_free (server->priv->command);
Only in daemon: gdm-server.c.orig
Only in daemon: gdm-server.c.rej
diff -ur daemon.orig/main.c daemon/main.c
--- daemon.orig/main.c	2015-04-02 06:52:42.000000000 -0700
+++ daemon/main.c	2015-05-04 11:58:58.000000000 -0700
@@ -289,19 +289,6 @@
         return debug;
 }
 
-/* SIGUSR1 is used by the X server to tell us that we're ready, so
- * block it. We'll unblock it in the worker thread in gdm-server.c
- */
-static void
-block_sigusr1 (void)
-{
-        sigset_t mask;
-
-        sigemptyset (&mask);
-        sigaddset (&mask, SIGUSR1);
-        sigprocmask (SIG_BLOCK, &mask, NULL);
-}
-
 int
 main (int    argc,
       char **argv)
@@ -322,8 +309,6 @@
                 { NULL }
         };
 
-        block_sigusr1 ();
-
         bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
         textdomain (GETTEXT_PACKAGE);
         setlocale (LC_ALL, "");
Only in daemon: main.c.orig