Index: gdm-3.0.0/daemon/gdm-simple-slave.c
===================================================================
--- gdm-3.0.0.orig/daemon/gdm-simple-slave.c	2011-04-28 20:35:33.037192030 +0200
+++ gdm-3.0.0/daemon/gdm-simple-slave.c	2011-04-28 20:40:41.430699692 +0200
@@ -299,6 +299,23 @@ queue_auth_failed_reset (GdmSimpleSlave
         slave->priv->greeter_reset_id = g_idle_add ((GSourceFunc)auth_failed_reset_timeout, slave);
 }
 
+static gboolean
+greeter_stop_timeout (GdmSimpleSlave *slave)
+{
+        gdm_slave_stopped (GDM_SLAVE (slave));
+        return FALSE;
+}
+
+static void
+queue_greeter_stop (GdmSimpleSlave *slave)
+{
+        if (slave->priv->greeter_reset_id > 0) {
+                return;
+        }
+
+        slave->priv->greeter_reset_id = g_timeout_add_seconds (2, (GSourceFunc)greeter_stop_timeout, slave);
+}
+
 static void
 on_session_setup_complete (GdmSession     *session,
                            GdmSimpleSlave *slave)
@@ -475,7 +492,7 @@ start_session_timeout (GdmSimpleSlave *s
                    when Xorg exits it switches to the VT it was
                    started from.  That interferes with fast
                    user switching. */
-                queue_greeter_reset (slave);
+                queue_greeter_stop (slave);
 
                 goto out;
         }
@@ -548,7 +565,7 @@ on_session_accreditation_failed (GdmSess
            user switching. */
         destroy_session (slave);
 
-        queue_greeter_reset (slave);
+        queue_greeter_stop (slave);
 }
 
 static void
Index: gdm-3.0.0/daemon/gdm-server.c
===================================================================
--- gdm-3.0.0.orig/daemon/gdm-server.c	2011-04-28 21:05:31.161982611 +0200
+++ gdm-3.0.0/daemon/gdm-server.c	2011-04-28 21:07:21.482521945 +0200
@@ -1143,7 +1143,12 @@ gdm_server_init (GdmServer *server)
         server->priv = GDM_SERVER_GET_PRIVATE (server);
 
         server->priv->pid = -1;
+#ifdef __linux__
+        /* -novtswitch is Linux-only in Xorg */
+        server->priv->command = g_strdup (X_SERVER " -br -verbose -novtswitch");
+#else
         server->priv->command = g_strdup (X_SERVER " -br -verbose");
+#endif
         server->priv->log_dir = g_strdup (LOGDIR);
 
         add_ready_handler (server);
