diff -ur gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-chooser-widget.c gdm-2.26.0/gui/simple-greeter/gdm-chooser-widget.c
--- gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-chooser-widget.c	2009-04-07 12:18:29.000000000 -0400
+++ gdm-2.26.0/gui/simple-greeter/gdm-chooser-widget.c	2009-04-07 12:22:08.000000000 -0400
@@ -2129,6 +2129,13 @@
 }
 
 gboolean
+gdm_chooser_widget_item_is_present (GdmChooserWidget *widget,  const char *id)
+{
+        GtkTreeIter   iter;
+        return find_item(widget, id, &iter);
+}
+
+gboolean
 gdm_chooser_widget_lookup_item (GdmChooserWidget *widget,
                                 const char       *id,
                                 GdkPixbuf       **image,
diff -ur gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-chooser-widget.h gdm-2.26.0/gui/simple-greeter/gdm-chooser-widget.h
--- gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-chooser-widget.h	2009-02-19 21:45:09.000000000 -0500
+++ gdm-2.26.0/gui/simple-greeter/gdm-chooser-widget.h	2009-04-07 12:22:08.000000000 -0400
@@ -96,6 +96,9 @@
 void          gdm_chooser_widget_remove_item                  (GdmChooserWidget *widget,
                                                                const char       *id);
 
+gboolean      gdm_chooser_widget_item_is_present              (GdmChooserWidget           *widget,
+                                                               const char                 *id);
+
 gboolean      gdm_chooser_widget_lookup_item                  (GdmChooserWidget           *widget,
                                                                const char                 *id,
                                                                GdkPixbuf                 **image,
diff -ur gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-simple-greeter.schemas.in gdm-2.26.0/gui/simple-greeter/gdm-simple-greeter.schemas.in
--- gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-simple-greeter.schemas.in	2009-04-07 12:18:30.000000000 -0400
+++ gdm-2.26.0/gui/simple-greeter/gdm-simple-greeter.schemas.in	2009-04-07 12:22:08.000000000 -0400
@@ -90,6 +90,17 @@
       </locale>
     </schema>
     <schema>
+      <key>/schemas/apps/gdm/simple-greeter/disable_inactive_user_list</key>
+      <applyto>/apps/gdm/simple-greeter/disable_inactive_user_list</applyto>
+      <owner>gdm-simple-greeter</owner>
+      <type>bool</type>
+      <default>FALSE</default>
+      <locale name="C">
+        <short>Show in the login window only already-logged-in users</short>
+        <long>Set to TRUE to disable showing in the login window users who are not currently logged in.</long>
+      </locale>
+    </schema>
+    <schema>
       <key>/schemas/apps/gdm/simple-greeter/recent-languages</key>
       <applyto>/apps/gdm/simple-greeter/recent-languages</applyto>
       <owner>gdm-simple-greeter</owner>
diff -ur gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-user-chooser-widget.c gdm-2.26.0/gui/simple-greeter/gdm-user-chooser-widget.c
--- gdm-2.26.0.firstpatch/gui/simple-greeter/gdm-user-chooser-widget.c	2009-04-07 12:18:30.000000000 -0400
+++ gdm-2.26.0/gui/simple-greeter/gdm-user-chooser-widget.c	2009-04-07 12:25:43.000000000 -0400
@@ -41,6 +41,7 @@
 
 
 #define KEY_DISABLE_USER_LIST "/apps/gdm/simple-greeter/disable_user_list"
+#define KEY_DISABLE_INACTIVE_USER_LIST "/apps/gdm/simple-greeter/disable_inactive_user_list"
 
 enum {
         USER_NO_DISPLAY              = 1 << 0,
@@ -66,6 +67,7 @@
         guint           show_user_guest : 1;
         guint           show_user_auto : 1;
         guint           show_normal_users : 1;
+        guint           show_normal_inactive_users : 1;
 
         guint           real_show_user_other : 1;
 
@@ -152,17 +154,20 @@
 static void
 add_user_other (GdmUserChooserWidget *widget)
 {
+       /* translators: This option prompts the user to type in a username
+        * manually instead of choosing from a list. */
+	char *other_id = C_("user", "Other...");
+	char *other_desc = _("Choose a different account");
+        if (widget->priv->show_normal_users && !widget->priv->show_normal_inactive_users) {
+                other_id = _("Log in as a different user...");
+                other_desc = _("Create a new session using a different account");
+        }
         widget->priv->real_show_user_other = TRUE;
         gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget),
                                      GDM_USER_CHOOSER_USER_OTHER,
                                      NULL,
-                                     /* translators: This option prompts
-                                      * the user to type in a username
-                                      * manually instead of choosing from
-                                      * a list.
-                                      */
-                                     C_("user", "Other..."),
-                                     _("Choose a different account"),
+                                     other_id,
+                                     other_desc,
                                      0,
                                      FALSE,
                                      TRUE);
@@ -361,6 +366,25 @@
         return result;
 }
 
+static gboolean
+is_inactive_user_list_disabled (GdmUserChooserWidget *widget)
+{
+        GConfClient *client;
+        GError      *error;
+        gboolean     result;
+
+        client = gconf_client_get_default ();
+        error = NULL;
+        result = gconf_client_get_bool (client, KEY_DISABLE_INACTIVE_USER_LIST, &error);
+        if (error != NULL) {
+                g_debug ("GdmUserChooserWidget: unable to get disable-inactive-user-list configuration: %s", error->message);
+                g_error_free (error);
+        }
+        g_object_unref (client);
+
+        return result;
+}
+
 static void
 add_user (GdmUserChooserWidget *widget,
           GdmUser              *user)
@@ -374,6 +398,11 @@
                 return;
         }
 
+        is_logged_in = gdm_user_get_num_sessions (user) > 0;
+        if (! is_logged_in && ! widget->priv->show_normal_inactive_users) {
+                return;
+        }
+
         size = get_icon_height_for_widget (widget);
         pixbuf = gdm_user_render_icon (user, size);
         if (pixbuf == NULL && widget->priv->stock_person_pixbuf != NULL) {
@@ -383,8 +412,6 @@
         tooltip = g_strdup_printf (_("Log in as %s"),
                                    gdm_user_get_user_name (user));
 
-        is_logged_in = gdm_user_get_num_sessions (user) > 0;
-
         g_debug ("GdmUserChooserWidget: User added name:%s logged-in:%d pixbuf:%p",
                  gdm_user_get_user_name (user),
                  is_logged_in,
@@ -434,6 +461,13 @@
 
         user_name = gdm_user_get_user_name (user);
 
+/* User might not be on the chooser's list, if user is not logged in
+ * and only logged-in users are being shown. */
+        if (! gdm_chooser_widget_item_is_present(GDM_CHOOSER_WIDGET(widget),
+                                                 user_name)) {
+                return;
+        }
+
         gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget),
                                         user_name);
 
@@ -448,14 +482,35 @@
         const char *user_name;
         gboolean    is_logged_in;
 
+      /* wait for all users to be loaded */
+        if (! widget->priv->loaded) {
+                return;
+        }
+
         g_debug ("GdmUserChooserWidget: User logged in changed: %s", gdm_user_get_user_name (user));
 
         user_name = gdm_user_get_user_name (user);
         is_logged_in = gdm_user_get_num_sessions (user) > 0;
 
-        gdm_chooser_widget_set_item_in_use (GDM_CHOOSER_WIDGET (widget),
-                                            user_name,
-                                            is_logged_in);
+        if (widget->priv->show_normal_inactive_users) {
+                gdm_chooser_widget_set_item_in_use (GDM_CHOOSER_WIDGET (widget),
+                                                    user_name,
+                                                    is_logged_in);
+        } else {
+                if (is_logged_in && ! gdm_chooser_widget_item_is_present
+                                        (GDM_CHOOSER_WIDGET (widget),
+                                         user_name)) {
+                        add_user(widget, user);
+                }
+                if (! is_logged_in && gdm_chooser_widget_item_is_present
+                                        (GDM_CHOOSER_WIDGET (widget),
+                                         user_name)) {
+                        gdm_chooser_widget_remove_item
+                                        (GDM_CHOOSER_WIDGET (widget),
+                                         user_name);
+                }
+                update_other_user_visibility (widget);
+        }
 }
 
 static void
@@ -543,6 +598,7 @@
 
         widget->priv->real_show_user_other = FALSE;
         widget->priv->show_normal_users = !is_user_list_disabled (widget);
+        widget->priv->show_normal_inactive_users = widget->priv->show_normal_users && !is_inactive_user_list_disabled (widget);
 
         widget->priv->load_idle_id = g_idle_add ((GSourceFunc)load_users, widget);
 
