diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index c1ac7cf..a5de412 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -149,6 +149,9 @@ typedef int (* GdmSessionWorkerPamNewMessagesFunc) (int,
                                                     const struct pam_message **,
                                                     struct pam_response **,
                                                     gpointer);
+static void     on_saved_session_name_read      (GdmSessionWorker *worker);
+static void     on_saved_language_name_read     (GdmSessionWorker *worker);
+static void     on_saved_layout_name_read       (GdmSessionWorker *worker);
 
 G_DEFINE_TYPE (GdmSessionWorker, gdm_session_worker, G_TYPE_OBJECT)
 
@@ -617,6 +620,21 @@ attempt_to_load_user_settings (GdmSessionWorker *worker,
                                    passwd_entry->pw_dir,
                                    NULL);
 
+        /* These singal handlers should be disconnected after the loading,
+         * so that gdm_session_settings_set_* APIs don't cause the emitting
+         * of Saved*NameRead D-Bus signals any more.
+         */
+        g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
+                                              G_CALLBACK (on_saved_session_name_read),
+                                              worker);
+
+        g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
+                                              G_CALLBACK (on_saved_language_name_read),
+                                              worker);
+
+        g_signal_handlers_disconnect_by_func (worker->priv->user_settings,
+                                              G_CALLBACK (on_saved_layout_name_read),
+                                              worker);
         seteuid (old_uid);
         setegid (old_gid);
 }
