diff -ruN gdm-2.29.1.orig/common/gdm-settings-keys.h gdm-2.29.1/common/gdm-settings-keys.h
--- gdm-2.29.1.orig/common/gdm-settings-keys.h	2009-11-16 18:44:25.000000000 -0500
+++ gdm-2.29.1/common/gdm-settings-keys.h	2009-12-08 16:33:00.807876713 -0500
@@ -29,6 +29,7 @@
 #define GDM_KEY_GROUP "daemon/Group"
 #define GDM_KEY_AUTO_LOGIN_ENABLE "daemon/AutomaticLoginEnable"
 #define GDM_KEY_AUTO_LOGIN_USER "daemon/AutomaticLogin"
+#define GDM_KEY_AUTO_LOGIN_GUI "daemon/AutomaticLoginShowGUI"
 #define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable"
 #define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin"
 #define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay"
diff -ruN gdm-2.29.1.orig/daemon/gdm-display.c gdm-2.29.1/daemon/gdm-display.c
--- gdm-2.29.1.orig/daemon/gdm-display.c	2009-11-16 17:37:43.000000000 -0500
+++ gdm-2.29.1/daemon/gdm-display.c	2009-12-08 16:33:00.808556299 -0500
@@ -310,10 +310,12 @@
 {
         gboolean res;
         gboolean enabled;
+        gboolean autogui_enabled;
         int      delay;
         char    *username;
 
         enabled = FALSE;
+        autogui_enabled = FALSE;
         username = NULL;
         delay = 0;
 
@@ -323,6 +325,10 @@
         }
 
         if (enabled && username != NULL && username[0] != '\0') {
+		res = gdm_settings_direct_get_boolean (GDM_KEY_AUTO_LOGIN_GUI, &autogui_enabled);
+                if (autogui_enabled)
+			delay = -1;
+
                 goto out;
         }
 
diff -ruN gdm-2.29.1.orig/daemon/gdm-greeter-server.c gdm-2.29.1/daemon/gdm-greeter-server.c
--- gdm-2.29.1.orig/daemon/gdm-greeter-server.c	2009-11-16 17:37:43.000000000 -0500
+++ gdm-2.29.1/daemon/gdm-greeter-server.c	2009-12-08 16:33:00.809374826 -0500
@@ -253,6 +253,18 @@
 }
 
 void
+gdm_greeter_server_layout_popup_requested (GdmGreeterServer *greeter_server)
+{
+        send_dbus_void_signal (greeter_server, "LayoutPopupRequested");
+}
+
+void
+gdm_greeter_server_language_popup_requested (GdmGreeterServer *greeter_server)
+{
+        send_dbus_void_signal (greeter_server, "LanguagePopupRequested");
+}
+
+void
 gdm_greeter_server_selected_user_changed (GdmGreeterServer *greeter_server,
                                           const char       *username)
 {
@@ -739,6 +751,12 @@
                                "    <signal name=\"InfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </signal>\n"
+                               "    <signal name=\"LayoutPopupRequested\">\n"
+                               "      <arg name=\"text\" type=\"s\"/>\n"
+                               "    </signal>\n"
+                               "    <signal name=\"LanguagePopupRequested\">\n"
+                               "      <arg name=\"text\" type=\"s\"/>\n"
+                               "    </signal>\n"
                                "    <signal name=\"SecretInfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </signal>\n"
diff -ruN gdm-2.29.1.orig/daemon/gdm-greeter-server.h gdm-2.29.1/daemon/gdm-greeter-server.h
--- gdm-2.29.1.orig/daemon/gdm-greeter-server.h	2009-11-16 17:37:43.000000000 -0500
+++ gdm-2.29.1/daemon/gdm-greeter-server.h	2009-12-08 18:25:31.258380196 -0500
@@ -86,6 +86,8 @@
                                                               const char       *text);
 gboolean            gdm_greeter_server_reset                 (GdmGreeterServer *greeter_server);
 gboolean            gdm_greeter_server_ready                 (GdmGreeterServer *greeter_server);
+void            gdm_greeter_server_layout_popup_requested (GdmGreeterServer *greeter_server);
+void            gdm_greeter_server_language_popup_requested (GdmGreeterServer *greeter_server);
 void                gdm_greeter_server_selected_user_changed (GdmGreeterServer *greeter_server,
                                                               const char       *text);
 void                gdm_greeter_server_default_language_name_changed (GdmGreeterServer *greeter_server,
diff -ruN gdm-2.29.1.orig/daemon/gdm-simple-slave.c gdm-2.29.1/daemon/gdm-simple-slave.c
--- gdm-2.29.1.orig/daemon/gdm-simple-slave.c	2009-11-24 02:26:07.000000000 -0500
+++ gdm-2.29.1/daemon/gdm-simple-slave.c	2009-12-08 16:33:00.810263515 -0500
@@ -297,8 +297,21 @@
                        GdmSimpleSlave *slave)
 {
         if (slave->priv->greeter_server != NULL) {
+                gboolean res;
+                gboolean enabled;
+                char    *username;
+                int      delay;
+
+                enabled = FALSE;
                 gdm_greeter_server_user_authorized (slave->priv->greeter_server);
                 gdm_simple_slave_accredit_when_ready (slave);
+
+                gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, &username, &delay);
+               if (enabled && username != NULL && username[0] != '\0' && delay == -1) {
+		        gdm_greeter_server_layout_popup_requested (slave->priv->greeter_server);
+		        gdm_greeter_server_language_popup_requested (slave->priv->greeter_server);
+		}
+		g_free (username);
         } else {
                 slave->priv->start_session_when_ready = TRUE;
                 gdm_simple_slave_accredit_when_ready (slave);
@@ -1023,7 +1036,7 @@
                 delay = 0;
                 enabled = FALSE;
                 gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, &delay);
-                if (! enabled || delay > 0) {
+                if (! enabled || delay != 0) {
                         start_greeter (slave);
                         create_new_session (slave);
                 } else {
diff -ruN gdm-2.29.1.orig/data/gdm.schemas gdm-2.29.1/data/gdm.schemas
--- gdm-2.29.1.orig/data/gdm.schemas	2009-11-30 17:28:24.000000000 -0500
+++ gdm-2.29.1/data/gdm.schemas	2009-12-08 16:33:00.810468140 -0500
@@ -33,6 +33,11 @@
       <default></default>
     </schema>
     <schema>
+      <key>daemon/AutomaticLoginShowGUI</key>
+      <signature>b</signature>
+      <default>false</default>
+    </schema>
+    <schema>
       <key>daemon/TimedLoginEnable</key>
       <signature>b</signature>
       <default>false</default>
diff -ruN gdm-2.29.1.orig/data/gdm.schemas.in gdm-2.29.1/data/gdm.schemas.in
--- gdm-2.29.1.orig/data/gdm.schemas.in	2009-11-16 19:29:42.000000000 -0500
+++ gdm-2.29.1/data/gdm.schemas.in	2009-12-08 16:33:00.810623445 -0500
@@ -33,6 +33,11 @@
       <default></default>
     </schema>
     <schema>
+      <key>daemon/AutomaticLoginShowGUI</key>
+      <signature>b</signature>
+      <default>false</default>
+    </schema>
+    <schema>
       <key>daemon/TimedLoginEnable</key>
       <signature>b</signature>
       <default>false</default>
diff -ruN gdm-2.29.1.orig/data/gdm.schemas.in.in gdm-2.29.1/data/gdm.schemas.in.in
--- gdm-2.29.1.orig/data/gdm.schemas.in.in	2009-11-16 19:26:45.000000000 -0500
+++ gdm-2.29.1/data/gdm.schemas.in.in	2009-12-08 16:33:00.810777913 -0500
@@ -33,6 +33,11 @@
       <default></default>
     </schema>
     <schema>
+      <key>daemon/AutomaticLoginShowGUI</key>
+      <signature>b</signature>
+      <default>false</default>
+    </schema>
+    <schema>
       <key>daemon/TimedLoginEnable</key>
       <signature>b</signature>
       <default>false</default>
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.c	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.c	2009-12-08 16:33:00.811345856 -0500
@@ -71,6 +71,8 @@
         DEFAULT_SESSION_NAME_CHANGED,
         TIMED_LOGIN_REQUESTED,
         USER_AUTHORIZED,
+        LANGUAGE_POPUP_REQUESTED,
+        LAYOUT_POPUP_REQUESTED,
         LAST_SIGNAL
 };
 
@@ -206,6 +208,24 @@
 }
 
 static void
+on_layout_popup_requested (GdmGreeterClient *client,
+                          DBusMessage      *message)
+{
+        g_signal_emit (client,
+                       gdm_greeter_client_signals[LAYOUT_POPUP_REQUESTED],
+                       0);
+}
+
+static void
+on_language_popup_requested (GdmGreeterClient *client,
+                          DBusMessage      *message)
+{
+        g_signal_emit (client,
+                       gdm_greeter_client_signals[LANGUAGE_POPUP_REQUESTED],
+                       0);
+}
+
+static void
 on_info_query (GdmGreeterClient *client,
                DBusMessage      *message)
 {
@@ -657,6 +677,10 @@
                 on_timed_login_requested (client, message);
         } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "UserAuthorized")) {
                 on_user_authorized (client, message);
+        } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "LayoutPopupRequested")) {
+                on_layout_popup_requested (client, message);
+        } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "LanguagePopupRequested")) {
+                on_language_popup_requested (client, message);
         } else {
                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
         }
@@ -954,6 +978,26 @@
                               NULL,
                               g_cclosure_marshal_VOID__VOID,
                               G_TYPE_NONE, 0);
+
+        gdm_greeter_client_signals[LANGUAGE_POPUP_REQUESTED] =
+                g_signal_new ("language-popup-requested",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmGreeterClientClass, language_popup_requested),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE, 0);
+
+        gdm_greeter_client_signals[LAYOUT_POPUP_REQUESTED] =
+                g_signal_new ("layout-popup-requested",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmGreeterClientClass, layout_popup_requested),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE, 0);
 }
 
 static void
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.h gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.h	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.h	2009-12-08 16:33:00.811541597 -0500
@@ -70,6 +70,8 @@
                                           const char        *username,
                                           int                delay);
         void (* user_authorized)         (GdmGreeterClient  *client);
+        void (* language_popup_requested)         (GdmGreeterClient  *client);
+        void (* layout_popup_requested)         (GdmGreeterClient  *client);
 } GdmGreeterClientClass;
 
 #define GDM_GREETER_CLIENT_ERROR (gdm_greeter_client_error_quark ())
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-login-window.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-login-window.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-login-window.c	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-login-window.c	2009-12-08 16:33:00.812269053 -0500
@@ -298,7 +298,8 @@
 {
         remove_timed_login_timeout (login_window);
 
-        if (login_window->priv->timed_login_enabled) {
+        if (login_window->priv->timed_login_enabled &&
+            login_window->priv->timed_login_delay != UINT_MAX) {
                 g_debug ("GdmGreeterLoginWindow: adding timed login timer");
                 watch_for_user_interaction (login_window);
                 login_window->priv->timed_login_timeout_id = g_timeout_add_seconds (login_window->priv->timed_login_delay,
@@ -645,7 +646,12 @@
                 timed_login_already_enabled = FALSE;
         }
         login_window->priv->timed_login_username = g_strdup (username);
-        login_window->priv->timed_login_delay = delay;
+
+        if (delay == -1) {
+                login_window->priv->timed_login_delay = UINT_MAX;
+        } else {
+                login_window->priv->timed_login_delay = delay;
+        }
 
         if (login_window->priv->dialog_mode != MODE_SELECTION) {
                 reset_dialog (login_window);
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.c	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.c	2009-12-08 16:33:00.812853690 -0500
@@ -1020,6 +1020,18 @@
 }
 
 void
+gdm_greeter_panel_popup_language_dialog (GdmGreeterPanel *panel)
+{
+		gdm_language_option_widget_popup_language_dialog (GDM_LANGUAGE_OPTION_WIDGET(panel->priv->language_option_widget));
+}
+
+void
+gdm_greeter_panel_popup_layout_dialog (GdmGreeterPanel *panel)
+{
+		gdm_layout_option_widget_popup_layout_dialog (GDM_LAYOUT_OPTION_WIDGET(panel->priv->layout_option_widget));
+}
+
+void
 gdm_greeter_panel_show_user_options (GdmGreeterPanel *panel)
 {
         gtk_widget_show (panel->priv->session_option_widget);
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.h gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.h	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.h	2009-12-08 16:33:00.813087127 -0500
@@ -73,6 +73,9 @@
                                                                          const char      *layout_name);
 void                   gdm_greeter_panel_set_default_session_name       (GdmGreeterPanel *panel,
                                                                          const char      *session_name);
+void     gdm_greeter_panel_popup_language_dialog                        (GdmGreeterPanel *panel);
+void     gdm_greeter_panel_popup_layout_dialog                          (GdmGreeterPanel *panel);
+
 G_END_DECLS
 
 #endif /* __GDM_GREETER_PANEL_H */
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-session.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-session.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-session.c	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-session.c	2009-12-08 16:33:00.813520343 -0500
@@ -170,6 +170,23 @@
         gdm_greeter_login_window_user_authorized (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window));
 }
 
+
+static void
+on_language_popup_requested (GdmGreeterClient  *client,
+                    GdmGreeterSession *session)
+{
+        g_debug ("GdmGreeterSession: language dialog requested");
+        gdm_greeter_panel_popup_language_dialog (GDM_GREETER_PANEL (session->priv->panel));
+}
+
+static void
+on_layout_popup_requested (GdmGreeterClient  *client,
+                    GdmGreeterSession *session)
+{
+        g_debug ("GdmGreeterSession: layout dialog requested");
+        gdm_greeter_panel_popup_layout_dialog (GDM_GREETER_PANEL (session->priv->panel));
+}
+
 static void
 on_info_query (GdmGreeterClient  *client,
                const char        *text,
@@ -603,6 +620,14 @@
                           "user-authorized",
                           G_CALLBACK (on_user_authorized),
                           session);
+        g_signal_connect (session->priv->client,
+                          "language-popup-requested",
+                          G_CALLBACK (on_language_popup_requested),
+                          session);
+        g_signal_connect (session->priv->client,
+                          "layout-popup-requested",
+                          G_CALLBACK (on_layout_popup_requested),
+                          session);
 
         /* We want to listen for panel mnemonics even if the
          * login window is focused, so we intercept them here.
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.c gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.c	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.c	2009-12-08 16:33:00.813809954 -0500
@@ -129,6 +129,23 @@
                                                                active_item_id);
 }
 
+void
+gdm_language_option_widget_popup_language_dialog (GdmLanguageOptionWidget *widget)
+{
+        char *active_item_id;
+
+        active_item_id = gdm_option_widget_get_default_item (widget);
+        gdm_language_option_widget_set_current_language_name (GDM_LANGUAGE_OPTION_WIDGET (widget), active_item_id);
+        gdm_language_option_widget_show_dialog (GDM_LANGUAGE_OPTION_WIDGET (widget), active_item_id);
+
+        g_signal_emit (G_OBJECT (widget), signals[LANGUAGE_ACTIVATED], 0);
+
+        g_free (active_item_id);
+
+	gtk_dialog_run (GTK_DIALOG (widget->priv->dialog));
+
+}
+
 static void
 gdm_language_option_widget_activated (GdmOptionWidget *widget)
 {
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.h gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.h	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.h	2009-12-08 16:33:00.813974507 -0500
@@ -57,6 +57,7 @@
 char *                 gdm_language_option_widget_get_current_language_name      (GdmLanguageOptionWidget *widget);
 void                   gdm_language_option_widget_set_current_language_name      (GdmLanguageOptionWidget *widget,
                                                                                   const char              *lang_name);
+void                  gdm_language_option_widget_popup_language_dialog (GdmLanguageOptionWidget *widget);
 
 
 
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.c gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.c	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.c	2009-12-08 16:33:00.814256963 -0500
@@ -304,3 +304,19 @@
         g_debug ("GdmLayoutOptionWidget: Setting active item: '%s'", id);
         gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), id);
 }
+
+void
+gdm_layout_option_widget_popup_layout_dialog (GdmLayoutOptionWidget *widget)
+{
+        char *active_item_id;
+
+        active_item_id = gdm_option_widget_get_default_item (widget);
+        gdm_layout_option_widget_set_current_layout_name (GDM_LAYOUT_OPTION_WIDGET (widget), active_item_id);
+        gdm_layout_option_widget_show_dialog (GDM_LAYOUT_OPTION_WIDGET (widget), active_item_id);
+
+        g_signal_emit (G_OBJECT (widget), signals[LAYOUT_ACTIVATED], 0);
+
+        g_free (active_item_id);
+
+	gtk_dialog_run (GTK_DIALOG (widget->priv->dialog));
+}
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.h gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.h	2009-11-16 17:37:44.000000000 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.h	2009-12-08 16:33:00.814446372 -0500
@@ -57,6 +57,7 @@
 char *                 gdm_layout_option_widget_get_current_layout_name      (GdmLayoutOptionWidget *widget);
 void                   gdm_layout_option_widget_set_current_layout_name      (GdmLayoutOptionWidget *widget,
                                                                                   const char              *name);
+void 		       gdm_layout_option_widget_popup_layout_dialog (GdmLayoutOptionWidget *widget);
 
 
 
